Создание структуры, содержащей указатель на себя в LLVM - PullRequest
1 голос
/ 16 апреля 2020

В настоящее время я использую LLVM для создания JIT. Есть некоторые C structs, которые я хотел бы использовать в своем JIT'd IR. Один из них имеет следующую компоновку:

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

Я действительно не знаю, как действовать здесь. Любые предложения приветствуются.

1 Ответ

1 голос
/ 16 апреля 2020

Я смог ответить на вопрос благодаря комментарию @ arnt. В случае, если у кого-то есть та же цель / проблема. Идея состоит в том, чтобы сначала создать непрозрачный тип, затем выбрать тип указателя для этого непрозрачного типа, а затем установить совокупное тело (которое является ключом решения), используя 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
...