module Feldspar.Compiler.Backend.C.Plugin.VariableRoleAssigner where import Data.List import Feldspar.Transformation data VariableRoleAssigner = VariableRoleAssigner data Parameters = Parameters { inParametersVRA :: [String] , outParametersVRA :: [String] } instance Transformation VariableRoleAssigner where type From VariableRoleAssigner = () type To VariableRoleAssigner = () type Down VariableRoleAssigner = Parameters type Up VariableRoleAssigner = () type State VariableRoleAssigner = () instance Transformable VariableRoleAssigner Variable where transform t s d v = Result v' () () where v' = v { varRole = if (varName v `elem` outParametersVRA d) || (isStruct v && (varName v `elem` inParametersVRA d)) then Pointer else Value , varLabel = () } instance Transformable VariableRoleAssigner Definition where transform t s d p@(Procedure n i o pr inf1 inf2) = defaultTransform t s d' p where d' = Parameters { inParametersVRA = map varName i , outParametersVRA = map varName o } transform t s d p = defaultTransform t s d p instance Plugin VariableRoleAssigner where type ExternalInfo VariableRoleAssigner = () executePlugin self@VariableRoleAssigner externalInfo procedure = result $ transform self ({-state-}) (Parameters [] []) procedure isStruct :: Variable () -> Bool isStruct v = case varType v of (StructType types) -> True otherwise -> False