我正在开发一个llvm前端。我的问题是,当我使用'store'指令将值存储在复杂类型的成员中时,我得到了分段错误。例如,假设我在模块中定义了类似%mytype = type {i32,...}的类型,然后使用以下命令将3存储在此类型的对象的第一个字段中。导致seg错误的代码有什么问题?
define void f() {
...
%alloc = alloca %mytype*
%myinstance = load %mytype** %alloc
%firstfield = getelementptr %mytype* %myinstance, i32 0, i32 0
store i32 3, i32* %firstfield
...
)
答案 0 :(得分:1)
问题是你已经分配了一个指针而没有分配它所指向的内容,所以当你试图取消引用那个指针时,难怪你会遇到分段错误。
您需要做的是
%alloc = alloca %mytype
%firstfield = getelementptr %mytype* %alloc, i32 0, i32 0
store i32 3, i32* %firstfield
如果由于某种原因你仍然需要分配一个指针 - 换句话说,你想要一个值%mytype**
指向一个指向分配内存的指针的内存位置 - 那么你也可以添加到以上:
%ptrptr = alloca %mytype*
store %mytype* %alloc, %mytype** %ptrptr