use*_*561 2 c++ llvm llvm-ir llvm-c++-api
我正在尝试编写一个简单的解释器。
我正在尝试生成 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);
}
Run Code Online (Sandbox Code Playgroud)
SymTab 定义如下:
struct SymTab {
char* variableName;
int value;
llvm::Value* (*codeGen)(llvm::LLVMContext& context);
};
Run Code Online (Sandbox Code Playgroud)
当我尝试执行输出文件时,出现以下错误:
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
Run Code Online (Sandbox Code Playgroud)
你能帮我解决吗?
谢谢
您尝试将 type 的值存储i64
到 type 的地址中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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4060 次 |
最近记录: |