packages feed

feldspar-compiler-0.5.0.1: Feldspar/Compiler/Backend/C/Plugin/AllocationEliminator.hs

--
-- Copyright (c) 2009-2011, ERICSSON AB
-- All rights reserved.
-- 
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
-- 
--     * Redistributions of source code must retain the above copyright notice, 
--       this list of conditions and the following disclaimer.
--     * Redistributions in binary form must reproduce the above copyright
--       notice, this list of conditions and the following disclaimer in the
--       documentation and/or other materials provided with the distribution.
--     * Neither the name of the ERICSSON AB nor the names of its contributors
--       may be used to endorse or promote products derived from this software
--       without specific prior written permission.
-- 
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
-- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--

module Feldspar.Compiler.Backend.C.Plugin.AllocationEliminator where

import Data.Map (Map)
import qualified Data.Map as Map
import Feldspar.Transformation
import Feldspar.Compiler.Backend.C.Library

data AllocationEliminator = AllocationEliminator

data AllocationEliminatorSemanticInfo

instance Annotation AllocationEliminatorSemanticInfo Module where
    type Label AllocationEliminatorSemanticInfo Module = ()

instance Annotation AllocationEliminatorSemanticInfo Entity where
    type Label AllocationEliminatorSemanticInfo Entity = ()

instance Annotation AllocationEliminatorSemanticInfo Struct where
    type Label AllocationEliminatorSemanticInfo Struct = ()

instance Annotation AllocationEliminatorSemanticInfo ProcDef where
    type Label AllocationEliminatorSemanticInfo ProcDef = AllocationInfo

instance Annotation AllocationEliminatorSemanticInfo ProcDecl where
    type Label AllocationEliminatorSemanticInfo ProcDecl = AllocationInfo

instance Annotation AllocationEliminatorSemanticInfo StructMember where
    type Label AllocationEliminatorSemanticInfo StructMember = ()

instance Annotation AllocationEliminatorSemanticInfo Block where
    type Label AllocationEliminatorSemanticInfo Block = ()

instance Annotation AllocationEliminatorSemanticInfo Program where
    type Label AllocationEliminatorSemanticInfo Program = ()

instance Annotation AllocationEliminatorSemanticInfo Empty where
    type Label AllocationEliminatorSemanticInfo Empty = ()

instance Annotation AllocationEliminatorSemanticInfo Assign where
    type Label AllocationEliminatorSemanticInfo Assign = ()

instance Annotation AllocationEliminatorSemanticInfo ProcedureCall where
    type Label AllocationEliminatorSemanticInfo ProcedureCall = ()

instance Annotation AllocationEliminatorSemanticInfo Sequence where
    type Label AllocationEliminatorSemanticInfo Sequence = ()

instance Annotation AllocationEliminatorSemanticInfo Branch where
    type Label AllocationEliminatorSemanticInfo Branch = ()

instance Annotation AllocationEliminatorSemanticInfo SeqLoop where
    type Label AllocationEliminatorSemanticInfo SeqLoop = ()

instance Annotation AllocationEliminatorSemanticInfo ParLoop where
    type Label AllocationEliminatorSemanticInfo ParLoop = ()

instance Annotation AllocationEliminatorSemanticInfo ActualParameter where
    type Label AllocationEliminatorSemanticInfo ActualParameter = ()

instance Annotation AllocationEliminatorSemanticInfo Declaration where
    type Label AllocationEliminatorSemanticInfo Declaration = ()

instance Annotation AllocationEliminatorSemanticInfo Expression where
    type Label AllocationEliminatorSemanticInfo Expression = ()

instance Annotation AllocationEliminatorSemanticInfo FunctionCall where
    type Label AllocationEliminatorSemanticInfo FunctionCall = ()

instance Annotation AllocationEliminatorSemanticInfo SizeOf where
    type Label AllocationEliminatorSemanticInfo SizeOf = ()

instance Annotation AllocationEliminatorSemanticInfo ArrayElem where
    type Label AllocationEliminatorSemanticInfo ArrayElem = ()

instance Annotation AllocationEliminatorSemanticInfo StructField where
    type Label AllocationEliminatorSemanticInfo StructField = ()

instance Annotation AllocationEliminatorSemanticInfo Constant where
    type Label AllocationEliminatorSemanticInfo Constant = ()

instance Annotation AllocationEliminatorSemanticInfo IntConst where
    type Label AllocationEliminatorSemanticInfo IntConst = ()

instance Annotation AllocationEliminatorSemanticInfo FloatConst where
    type Label AllocationEliminatorSemanticInfo FloatConst = ()

instance Annotation AllocationEliminatorSemanticInfo BoolConst where
    type Label AllocationEliminatorSemanticInfo BoolConst = ()

instance Annotation AllocationEliminatorSemanticInfo ArrayConst where
    type Label AllocationEliminatorSemanticInfo ArrayConst = ()

instance Annotation AllocationEliminatorSemanticInfo ComplexConst where
    type Label AllocationEliminatorSemanticInfo ComplexConst = ()

instance Annotation AllocationEliminatorSemanticInfo Variable where
    type Label AllocationEliminatorSemanticInfo Variable = ()

instance Annotation AllocationEliminatorSemanticInfo Cast where
    type Label AllocationEliminatorSemanticInfo Cast = ()

instance Annotation AllocationEliminatorSemanticInfo Comment where
    type Label AllocationEliminatorSemanticInfo Comment = ()


instance Transformation AllocationEliminator
  where
    type From AllocationEliminator = ()
    type To AllocationEliminator = AllocationEliminatorSemanticInfo
    type Down AllocationEliminator = ()
    type Up AllocationEliminator = ()
    type State AllocationEliminator = (Integer, Map String (Integer, Type))

instance Transformable AllocationEliminator Entity
  where
    transform t s d proc@(ProcDef _ _ _ _ _ _) = Result proc'
        { inParams = mem : ins'
        , procDefLabel = (localsOf s', typesOf ins', typesOf outs')
        }
        (0,Map.empty) u'
      where
        Result proc' s' u' = defaultTransform t s d proc
        mem = Variable
            { varName = "mem"
            , varType = ArrayType UndefinedLen $ ArrayType UndefinedLen VoidType
            , varRole = Pointer
            , varLabel = ()
            }
        ins'  = inParams proc'
        outs' = outParams proc'
        localsOf = map (\(_,(_,t)) -> t) . Map.toList . snd
        typesOf  = map varType

    transform t s d x = defaultTransform t s d x

instance Transformable AllocationEliminator Expression
  where
    transform t s@(idx,m) d e@(VarExpr v lab) = case Map.lookup (varName v) m of
        Nothing -> defaultTransform t s d e
        Just (i,_) -> Result ArrayElem
            { array         = VarExpr
                { var   = Variable
                    { varName = "mem"
                    , varType = ArrayType UndefinedLen $ varType v
                    , varRole = Pointer
                    , varLabel = ()
                    }
                , exprLabel = ()
                }
            , arrayIndex    = ConstExpr
                { constExpr = IntConst
                    { intValue = i
                    , intType = NumType Signed S32
                    , intConstLabel = ()
                    , constLabel = ()
                    }
                , exprLabel = ()
                }
            , arrayLabel = ()
            , exprLabel = ()
            } s ()
    transform t s d e = defaultTransform t s d e

instance Transformable1 AllocationEliminator [] Declaration
  where
    transform1 t s d [] = Result1 [] s ()
    transform1 t s@(idx,m) d (x:xs) = case varType $ declVar x of
        ArrayType _ _   -> transform1 t (idx + 1, Map.insert (varName $ declVar x) (idx, varType $ declVar x) m) d xs
        _               -> Result1 (x':xs') s'' ()
      where
        Result1 xs' s'' () = transform1 t s' d xs
        Result x' s' ()    = transform t s d x

instance Plugin AllocationEliminator
  where
    type ExternalInfo AllocationEliminator = ()
    executePlugin self@AllocationEliminator externalInfo procedure = 
        result $ transform self (0,Map.empty) () procedure