1

我是 llvm 的新手,我正在编写一个小的 llvm IR Builder。我使用 IRBuilder 和所有这些 Create* 函数来生成我的 IR。我要做的是创建一个加载指令,该指令创建一个新的 SSA 局部变量,其值为先前分配的llvm::Value

我期望拥有的:

%2 = load i32* %1

使用%2的加载指令结果和%1我之前分配的值 (CreateAlloca)

这是我尝试过的:

// Get Ptr from Val
Value* ptr = ConstantExpr::getIntToPtr((Constant*)loc[n],PointerType::getUnqual(builder->getInt32Ty()));

// Générate load instruction with the new Ptr
builder->CreateLoad(ptr);

这就是我所拥有的:

%2 = load i32* null

loc是一个数组,其中包含我所有的 llvm::Value*

你能告诉我我做错了什么吗?或者,如果我走得不好?谢谢。

4

1 回答 1

1

ConstantExpr::getIntToPtr()创建一个常量表达式。因此,实际上,您尝试生成的内容等同于此 IR:

%2 = load i32* inttoptr (i32 %1 to i32*)

但这是非法的,因为常量表达式,正如其名称所暗示的那样,只支持常量,而 %1 不是常量。ConstantExpr::getIntToPtr()需要 aConstant作为第一个参数来验证它,但是您传递给它一个非常量值,该值被强制转换为常量。

将非常量整数转换为指针的正确方法是使用IRBuilder::createIntToPtr. 但是,由于您说之前的值 ( loc[n]) 是通过 an 创建的,alloca所以它已经是一个指针,您不需要执行任何转换:只需执行builder->CreateLoad(loc[n]).

顺便说一句,在 LLVM 中将 Value 转换为 Constant 的正确方法不是通过 c 样式转换,而是通过cast<>,如下所示cast<Constant>(loc[n])

于 2013-05-22T13:38:28.197 回答