小编caa*_*515的帖子

如何在LLVM中获取结构成员的值?

所以我用这个创建了一个结构类型:

llvm::StructType* llvm_struct = llvm::StructType::create(llvm_context, struct_name);
std::vector<llvm::Type*> members;

for(size_t j = 0; j != struct_data.members.size(); j++){
    llvm::Type* member_type = /*get member type*/;
    members.push_back(member_type);
}

llvm_struct->setBody(members)
Run Code Online (Sandbox Code Playgroud)

我想知道如何访问结构中的成员。

到目前为止,我已经尝试使用 getelementptr 没有运气:

llvm::Value* member_index = llvm::ConstantInt::get(llvm_context, llvm::APInt(32, /*structure member index*/, true));
llvm::Value* indices[2] = {llvm::ConstantInt::get(member_index->getType(), 0), member_index};
llvm::Value* data = /*expression value*/;

return irbuilder.CreateInBoundsGEP(data, llvm::ArrayRef<llvm::Value*>(indices, 2), "membtmp");
Run Code Online (Sandbox Code Playgroud)

感谢您的任何反馈!

编辑:

好的,所以类型llvm::Value* data是%a_struct从堆栈上的指针加载的 a 。从文档看来,irbuilder.CreateInBoundsGEP(llvm::Value*, llvm::ArrayRef<llvm::Value*>, llvm::Twine)要求第一个参数是指向结构的指针,而不是结构本身的值。

将结构体的值复制到堆栈上的变量中时,会抛出此错误:Expression: getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType(????) && "Ptr must be a pointer to …

c++ llvm llvm-ir

5
推荐指数
1
解决办法
3565
查看次数

标签 统计

c++ ×1

llvm ×1

llvm-ir ×1