4

我在加载值时遇到了一些问题。这是我的编译器为显示问题而生成的 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();

提前致谢。

桑托斯美利奴。

4

0 回答 0