{-# LANGUAGE GADTs #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_HADDOCK hide #-}
module Data.Array.Accelerate.LLVM.CodeGen.Ptr
where
import LLVM.AST.Type.AddrSpace
import LLVM.AST.Type.Constant
import LLVM.AST.Type.Name
import LLVM.AST.Type.Operand
import LLVM.AST.Type.Representation
import Data.Array.Accelerate.Error
asPtr :: AddrSpace -> Operand t -> Operand (Ptr t)
asPtr as x =
let
retype :: Type a -> Type (Ptr a)
retype VoidType = $internalError "asPtr" "unexpected void type"
retype (PrimType t) = PrimType (PtrPrimType t as)
rename :: Name a -> Name (Ptr a)
rename (Name n) = Name n
rename (UnName n) = UnName n
in
case x of
LocalReference t n -> LocalReference (retype t) (rename n)
ConstantOperand (GlobalReference t n) -> ConstantOperand (GlobalReference (retype t) (rename n))
ConstantOperand (UndefConstant t) -> ConstantOperand (UndefConstant (retype t))
ConstantOperand ScalarConstant{} -> $internalError "asPtr" "unexpected scalar constant"
unPtr :: Operand (Ptr t) -> Operand t
unPtr x =
let
retype :: Type (Ptr a) -> Type a
retype (PrimType (PtrPrimType t _)) = PrimType t
retype _ = $internalError "unPtr" "expected pointer type"
rename :: Name (Ptr a) -> Name a
rename (Name n) = Name n
rename (UnName n) = UnName n
in
case x of
LocalReference t n -> LocalReference (retype t) (rename n)
ConstantOperand (GlobalReference t n) -> ConstantOperand (GlobalReference (retype t) (rename n))
ConstantOperand (UndefConstant t) -> ConstantOperand (UndefConstant (retype t))
ConstantOperand ScalarConstant{} -> $internalError "unPtr" "unexpected scalar constant"