0

我正在开发一个 llvm 前端。我的问题是,当我使用“存储”指令将值存储在复杂类型的成员中时,会出现分段错误。例如,假设我在模块中定义了 %mytype = type {i32, ...} 之类的类型,然后我使用以下命令将 3 存储在此类型对象的第一个字段中。这个导致段错误的代码有什么问题?

define void f() {
...
%alloc = alloca %mytype*
%myinstance = load %mytype** %alloc
%firstfield = getelementptr %mytype* %myinstance, i32 0, i32 0
store i32 3, i32* %firstfield
...
)
4

1 回答 1

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
于 2013-01-20T07:54:06.220 回答