Haskell 如何通过getElementPtr获取指向结构中数据的指针?(在llvm包中)
我试图通过ghc 7.4.1上的包在llvm中创建一个结构并访问其中的元素,我遇到了一些棘手的类型。下面是一个示例代码,我试图获取结构的第二个元素(即TestStruct中的Haskell 如何通过getElementPtr获取指向结构中数据的指针?(在llvm包中),haskell,llvm,Haskell,Llvm,我试图通过ghc 7.4.1上的包在llvm中创建一个结构并访问其中的元素,我遇到了一些棘手的类型。下面是一个示例代码,我试图获取结构的第二个元素(即TestStruct中的Word32) {-# LANGUAGE TypeOperators #-} import LLVM.Core import Data.Word type TestStruct = Struct (Word16 :& Word32 :& Word64) getTestPtr :: Value (Ptr Te
Word32
)
{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.Word
type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
getTestPtr u = getElementPtr u (0 :: Word32, (1 :: Word32, ()))
但我在ghc 7.4.1中得到以下错误:
Test.hs:8:16:
Overlapping instances for llvm-3.0.0.0:LLVM.Core.Instructions.GetField
(Word32, Word64) i Word32
arising from a use of `getElementPtr'
Matching instances:
instance [overlap ok] (llvm-3.0.0.0:LLVM.Core.Instructions.GetField
as i b,
Succ i i') =>
llvm-3.0.0.0:LLVM.Core.Instructions.GetField (a, as) i' b
-- Defined in `llvm-3.0.0.0:LLVM.Core.Instructions'
instance [overlap ok] llvm-3.0.0.0:LLVM.Core.Instructions.GetField
(a, as) D0 a
-- Defined in `llvm-3.0.0.0:LLVM.Core.Instructions'
(The choice depends on the instantiation of `i'
To pick the first instance above, use -XIncoherentInstances
when compiling the other instance declarations)
In the expression: getElementPtr u (0 :: Word32, (0 :: Word32, ()))
In an equation for `getTestPtr':
getTestPtr u = getElementPtr u (0 :: Word32, (0 :: Word32, ()))
Test.hs:8:16:
No instances for (Data.TypeLevel.Num.Sets.PosI Word32,
Data.TypeLevel.Num.Ops.IsZero Word32 yz,
DivMod10 Word32 yi yl)
arising from a use of `getElementPtr'
Possible fix:
add instance declarations for
(Data.TypeLevel.Num.Sets.PosI Word32,
Data.TypeLevel.Num.Ops.IsZero Word32 yz,
DivMod10 Word32 yi yl)
In the expression: getElementPtr u (0 :: Word32, (0 :: Word32, ()))
In an equation for `getTestPtr':
getTestPtr u = getElementPtr u (0 :: Word32, (0 :: Word32, ()))
在
llvm
包中索引到Struct
需要类型级别的数字,以便可以静态计算字段类型。这就是为什么要使用描述记录字段的嵌套元组的原因。如果使用getElementPtr
第一个索引值需要是一个正则整数(Word32
或其他),或者只需使用getElementPtr0
{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.TypeLevel
import Data.Word
type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
-- getTestPtr u = getElementPtr u ((0 :: Word32) & d1 & ())
getTestPtr u = getElementPtr0 u (d1 & ())
在
llvm
包中索引到Struct
需要类型级别的数字,以便可以静态计算字段类型。这就是为什么要使用描述记录字段的嵌套元组的原因。如果使用getElementPtr
第一个索引值需要是一个正则整数(Word32
或其他),或者只需使用getElementPtr0
{-# LANGUAGE TypeOperators #-}
import LLVM.Core
import Data.TypeLevel
import Data.Word
type TestStruct = Struct (Word16 :& Word32 :& Word64)
getTestPtr :: Value (Ptr TestStruct) -> CodeGenFunction r (Value (Ptr Word32))
-- getTestPtr u = getElementPtr u ((0 :: Word32) & d1 & ())
getTestPtr u = getElementPtr0 u (d1 & ())
谢谢,它可以工作。我注意到GetField typeclass需要一个类型级别号,但我正在尝试
(未定义::D1)
和一些其他错误。我在中没有看到d1
,在Hayoo上也没有看到。@Chetan我猜hackage使用的是旧版/有缺陷的haddock版本。我本地构建的文档在Data.TypeLevel.Num.alias中显示d0
。尽管我认为未定义::d0
也可以工作。谢谢,它工作了。我没有注意到GetField typeclass要求类型级别号,但我正在尝试(未定义::D1)
和一些其他错误。我在中没有看到d1
,在Hayoo上也没有看到。@Chetan我猜hackage使用的是旧版/有缺陷的haddock版本。我本地构建的文档在Data.TypeLevel.Num.alias中显示d0
。尽管我认为未定义::d0
也可以工作。。