LLVM StoreInst and AllocaInst

LLVM StoreInst and AllocaInst

本文关键字:AllocaInst and StoreInst LLVM      更新时间:2023-10-16

我想写一个简单的解释器。

我正在尝试为分配操作生成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

你能帮我解决这个问题吗?

谢谢

您尝试将类型为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);