我在加载值时遇到了一些问题。这是我的编译器为显示问题而生成的 IR 的一个简单示例:
define i32 @main() {
entry:
%a = alloca i32 ; <i32*> [#uses=2]
store i32 1, i32* %a
%r = load i32* %a ; <i32> [#uses=1]
br label %Return
Return: ; preds = %entry
ret i32 %r
}
但不是返回 1,而是返回 16777216。我已经用不同的值测试了程序,这似乎是整数值的内部二进制表示问题。
已编辑:我向您展示了我的编译器为生成上述代码而对 llvm 的调用跟踪。bloques.back().last 是 Value* 类型,而 bloques.back().bl 是 BasicBlock* (当前块)
bloques.back().last = dyn_cast<Value>(ConstantInt::get(
Type::getInt32Ty(getGlobalContext()), $1, true)); // $1 is an int
AllocaInst *alloc = new AllocaInst(
Type::getInt32Ty(getGlobalContext()), izq.c_str(), bloques.back().bl);
Value *derecha = bloques.back().last;
StoreInst *s = new StoreInst(derecha, alloc, false, bloques.back().bl);
bloques.back().last = alloc;
LoadInst* v1 = new LoadInst(bloques.back().last, "r", false, bloques.back().bl);
bloques.back().last = v1;
BasicBlock* blockReturn = BasicBlock::Create(getGlobalContext(), "Return", Main);
Value* last = bloques.back().last;
BranchInst::Create(blockReturn, bloques.back().bl);
ReturnInst::Create(getGlobalContext(), last, blockReturn);
对应于 IR 表示的源代码将是:
a = 1
return a
Edit2:在生成代码之后和通过 JIT 开始执行之前,在我的 main 函数中,我这样做:
ExecutionEngine *EE = EngineBuilder(M).create();
string str = EE->getTargetData()->getStringRepresentation();
str[0] = 'e';
M->setDataLayout(str);
if (verifyModule(*M)) {
errs() << argv[0] << ": Error building the function!\n";
return 1;
}
vector<GenericValue> noargs;
GenericValue GV = EE->runFunction(Main, noargs);
outs() << "Result: " << GV.IntVal << "\n";
return 0;
已解决:终于我找到了解决方案。为了改变字节顺序,我做了以下事情(有点意大利面,但它有效):
Module *M = new Module("pythoncode", getGlobalContext());
ExecutionEngine *EE2 = EngineBuilder(M).create();
string str = EE2->getTargetData()->getStringRepresentation();
str[0] = 'e';
cout << str << endl;
M->setDataLayout(str);
ExecutionEngine *EE = EngineBuilder(M).create();
提前致谢。
桑托斯美利奴。