packages feed

rail-compiler-editor-0.3.0.0: src/RailCompiler/TypeDefinitions.hs

{- |
Module      :  TpyeDefinitions.hs
Description :  type definitions for intermediate code generation
Maintainer  :  Philipp Borgers, Tilman Blumenbach, Lyudmila Vaseva, Sascha Zinke,
               Maximilian Claus, Michal Ajchman, Nicolas Lehmann, Tudor Soroceanu
License     :  MIT
Stability   :  unstable

All type definitions live here.

-}

module TypeDefinitions where

import LLVM.General.AST
import LLVM.General.AST.AddrSpace

-- |Opaque type definition for the stack_element struct, defined in stack.ll.
stackElementTypeDef :: Definition
stackElementTypeDef = TypeDefinition (Name "stack_element") Nothing

-- |Pointer type for 'i8*' used e.g. as "string" pointer
bytePointerType :: Type
bytePointerType = PointerType {
  pointerReferent = IntegerType 8,
  pointerAddrSpace = AddrSpace 0
}

-- |Pointer type for 'i8**' used as variable pointer
bytePointerTypeVar :: Type
bytePointerTypeVar = PointerType {
  pointerReferent = PointerType {
    pointerReferent = IntegerType 8,
    pointerAddrSpace = AddrSpace 0
  },
  pointerAddrSpace = AddrSpace 0
}

-- |Pointer type: %stack_element* (see stack.ll).
stackElementPointerType :: Type
stackElementPointerType = PointerType {
    pointerReferent = NamedTypeReference $ Name "stack_element",
    pointerAddrSpace = AddrSpace 0
}

-- |Struct declaration for the symbol table
structTable :: Definition
structTable = TypeDefinition (Name "struct.table")
      (Just $ StructureType False
                [ PointerType (IntegerType 8) (AddrSpace 0), 
                  PointerType (NamedTypeReference $ Name "stack_element") (AddrSpace 0), 
                  PointerType (NamedTypeReference $ Name "struct.table") (AddrSpace 0)])

functionReturnLambda :: Type
functionReturnLambda = FunctionType {
      resultType = IntegerType 32,
      argumentTypes = [ PointerType (NamedTypeReference $ Name "struct.table")
         (AddrSpace 0)],
      isVarArg = False
}

lambdaElement :: Definition
lambdaElement = TypeDefinition (Name "lambda_element")
      (Just $ StructureType False
                [ PointerType (PointerType functionReturnLambda (AddrSpace 0)) (AddrSpace 0), 
                  PointerType (NamedTypeReference $ Name "struct.table") (AddrSpace 0)])