Я хотел бы сгенерировать LLVM IR для кода C ++, например:
T *arr = (T*) malloc(sizeof(T) * 100);
arr[0] = somevalue;
Вот мой код:
llvm::Type* element_type = /... some T type .../;
llvm::Type* int32type = llvm::Type::getInt32Ty(context);
auto element_size = llvm::ConstantInt::get(int32type, data_layout.getTypeAllocSize(element_type));
auto array_size = llvm::ConstantInt::get(int32type, 100);
// malloc:
auto malloc_inst = llvm::CallInst::CreateMalloc(
ir_builder.GetInsertBlock(),
element_type->getPointerTo(), // T*
element_type, // T
element_size, // sizeof(T)
array_size, // 100
nullptr,
"")
ir_builder.Insert(malloc_inst);
// cast to T*:
auto arr = ir_builder.CreatePointerCast(malloc_inst, element_type->getPointerTo());
// arr[0] = somevalue:
llvm::Value *value = /... some value of type T .../
auto element_ptr = ir_builder.CreateInBoundsGEP(
arr, {
llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), 0),
llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), 0)
});
ir_builder.CreateStore(value, element_ptr)
Однако при запуске сгенерированного IR я получаю:
Assertion failed: (Ty && "Invalid GetElementPtrInst indices for type!"), function checkGEPType, file /usr/local/opt/llvm/include/llvm/IR/Instructions.h, line 847
Я пробовал разные комбинации типов, передаваемых в инструкцию GEP, но очевидно, что мне не хватает чего-то базового.Может кто-нибудь указать мне рабочий пример для этого?