在 LLVM 中创建一个包含指向自身的指针的结构
Creating a struct containing a pointer to itself in LLVM
我目前正在使用 LLVM 构建 JIT。我希望能够在我的 JIT IR 中使用一些 C structs
。其中之一具有以下布局:
struct myStruct {
int depth;
myStruct* parent;
}
当使用 clang
编译并使用 -S -emit-llvm
时,我得到以下内容,这似乎是绝对合理的:
type myStruct = { i32, myStruct* }
好的。现在,如果我想使用 LLVM API 做同样的事情,我不太确定我应该怎么做。以下(预计)不起作用:
auto intType = IntegerType::get(context, 32); // 32 bits integer
Type* myStructPtrType = nullptr; // Pointer to myStruct
// The following crashes because myStructPtrType is null:
auto myStructType = StructType::create(context, { intType, myStructPtrType }, "myStruct"); // myStruct
myStructPtrType = PointerType::get(myStructType, 0); // Initialise the pointer type now
我真的不知道如何进行这里。
欢迎提出任何建议。
感谢@arnt 的评论,我能够回答这个问题。万一有人有相同的goal/problem。思路是先创建一个不透明类型,然后获取指向这个不透明类型的指针类型,然后使用 setBody
设置聚合体(这是解决方案的关键)。
这是一些代码:
auto intType = IntegerType::get(context, 32); // 32 bits integer
auto myStructType = StructType::create(context, "myStruct"); // Create opaque type
auto myStructPtrType = PointerType::get(myStructType, 0); // Initialise the pointer type now
myStructType->setBody({ intType, myStructPtrType }, /* packed */ false); // Set the body of the aggregate
我目前正在使用 LLVM 构建 JIT。我希望能够在我的 JIT IR 中使用一些 C structs
。其中之一具有以下布局:
struct myStruct {
int depth;
myStruct* parent;
}
当使用 clang
编译并使用 -S -emit-llvm
时,我得到以下内容,这似乎是绝对合理的:
type myStruct = { i32, myStruct* }
好的。现在,如果我想使用 LLVM API 做同样的事情,我不太确定我应该怎么做。以下(预计)不起作用:
auto intType = IntegerType::get(context, 32); // 32 bits integer
Type* myStructPtrType = nullptr; // Pointer to myStruct
// The following crashes because myStructPtrType is null:
auto myStructType = StructType::create(context, { intType, myStructPtrType }, "myStruct"); // myStruct
myStructPtrType = PointerType::get(myStructType, 0); // Initialise the pointer type now
我真的不知道如何进行这里。 欢迎提出任何建议。
感谢@arnt 的评论,我能够回答这个问题。万一有人有相同的goal/problem。思路是先创建一个不透明类型,然后获取指向这个不透明类型的指针类型,然后使用 setBody
设置聚合体(这是解决方案的关键)。
这是一些代码:
auto intType = IntegerType::get(context, 32); // 32 bits integer
auto myStructType = StructType::create(context, "myStruct"); // Create opaque type
auto myStructPtrType = PointerType::get(myStructType, 0); // Initialise the pointer type now
myStructType->setBody({ intType, myStructPtrType }, /* packed */ false); // Set the body of the aggregate