LLVM StoreInst и AllocaInst

Я пытаюсь написать простой переводчик.

Я пытаюсь сгенерировать LLVM IR для операции присваивания. Код для части генерации выглядит следующим образом

llvm::Value* codeGenSymTab(llvm::LLVMContext& context) {
printf("\n CodeGen SymTab \n");
Value *num = ConstantInt::get(Type::getInt64Ty(context), aTable.value, true);
Value *alloc = new AllocaInst(IntegerType::get(context, 32), aTable.variableName,entry);
StoreInst *ptr = new StoreInst(num,alloc,false,entry);
}

Вот определение SymTab:

struct SymTab {
char* variableName;
int value;
llvm::Value* (*codeGen)(llvm::LLVMContext& context);
};

Когда я пытаюсь выполнить выходной файл, я получаю следующую ошибку:

Assertion failed: (getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be a pointer to Val type!"), function AssertOK, file Instructions.cpp, line 1084.
Abort trap: 6

Можете ли вы помочь мне решить это?

Спасибо

0

Решение

Вы пытаетесь сохранить значение типа i64 в адрес типа i32*и они не совпадают.

Вы можете исправить это, используя тот же тип — или предпочтительно, тот же объект:

IntegerType *int_type = Type::getInt64Ty(context);
Value *num = ConstantInt::get(int_type, aTable.value, true);
Value *alloc = new AllocaInst(int_type, aTable.variableName, entry);
StoreInst *ptr = new StoreInst(num,alloc,false,entry);
3

Другие решения


По вопросам рекламы [email protected]