获取指向先前为CreateLoad函数分配的llvm::值的指针

获取指向先前为CreateLoad函数分配的llvm::值的指针,llvm,llvm-ir,Llvm,Llvm Ir,我是llvm新手,正在编写一个小型llvm IR生成器。 我使用IRBuilder和所有这些Create*函数来生成IR。 我试图做的是创建一个load指令,该指令创建一个新的SSA局部变量,其值为以前分配的llvm::value 我所期望的是: %2 = load i32* %1 使用加载指令的%2结果和%1我以前分配的值(CreateAlloca) 以下是我尝试过的: // Get Ptr from Val Value* ptr = ConstantExpr::getIntToPtr((C

我是llvm新手,正在编写一个小型llvm IR生成器。 我使用IRBuilder和所有这些Create*函数来生成IR。 我试图做的是创建一个load指令,该指令创建一个新的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*

你能告诉我我做错了什么吗?或者如果我在一条不好的路上?
谢谢。

ConstantExpr::getIntToPtr()
创建一个。因此,实际上,您试图生成的内容相当于此IR:

%2 = load i32* inttoptr (i32 %1 to i32*)
但这是非法的,因为常量表达式(如其名称所示)只支持,而%1不是常量
ConstantExpr::getIntToPtr()
需要一个
常量
作为验证它的第一个参数,但您传递了一个非常量值,该值被强制转换为常量

将非常量整数转换为指针的正确方法是使用
IRBuilder::createIntToPtr
。但是,既然您说上一个值(
loc[n]
)是通过
alloca
创建的,那么它已经是一个指针了,您不需要执行任何转换:只需执行
builder->CreateLoad(loc[n])


顺便说一句,在LLVM中将值强制转换为常量的正确方法不是通过c样式强制转换,而是通过如下方式:
cast(loc[n])
ConstantExpr::getIntToPtr()
创建一个常量。因此,实际上,您试图生成的内容相当于此IR:

%2 = load i32* inttoptr (i32 %1 to i32*)
但这是非法的,因为常量表达式(如其名称所示)只支持,而%1不是常量
ConstantExpr::getIntToPtr()
需要一个
常量
作为验证它的第一个参数,但您传递了一个非常量值,该值被强制转换为常量

将非常量整数转换为指针的正确方法是使用
IRBuilder::createIntToPtr
。但是,既然您说上一个值(
loc[n]
)是通过
alloca
创建的,那么它已经是一个指针了,您不需要执行任何转换:只需执行
builder->CreateLoad(loc[n])


顺便说一下,在LLVM中将值转换为常量的正确方法不是通过c样式转换,而是通过如下方式:
cast(loc[n])

谢谢您的回答。事实上,我的loc[n]是一个常数。我的数组loc只是作为Value*键入的,但在我的例子中,我确信loc[n]这里是一个常量*所以getIntToPtr应该对我有用?@user2390982我假设
loc
不包含常量,因为您在那里放置了一个用
alloca
创建的值,
alloca
不会返回常量。在任何情况下,如果它是一个常量,那么
ConstantExpr::getIntToPtr
确实应该工作。还要确保您的类型匹配-一个
alloca
返回一个指针,而不是一个数字,所以我不明白为什么您需要
getIntToPtr
。如果我不清楚,很抱歉。问题是我在
loc
数组中只存储Create*函数中使用的常量。例如,对于
CreateAlloca(type,myConst)
loc
包含
myConst
,而不是返回值。这就是为什么我必须对
CreateLoad
指令使用
getIntToPtr
(我说的对吗?),而且它在原始帖子中无法处理代码。@user2390982您能更好地解释一下您想做什么吗?如果您想分配一个i32,然后在那里加载内容(顺便说一句,由于刚刚分配了内容,因此内容未定义),可以使用
CreateAlloca
,然后将结果传递到
CreateLoad
。听起来好像你用一个常量整数作为alloca数组的大小,然后将整数转换成指针——这当然不是你想要的。好吧,我遵循这个场景:一旦我创建了一个常量*我就将它存储在我的loc数组中。例如:
Value*newLocale=Constant::getIntegerValue(t,i);loc[n]=新语言环境;生成器->CreateAlloca(t,loc[n])在执行之后,我想使用前面添加的loc[n]创建一条加载指令:
builder->CreateLoad(loc[n])loc[n]
类型是
Int32Ty
,而不是
int32ptty
。我是否必须存储CreateAlloca的返回值?或者我可以从我当前的loc[n]获得Int32PtrTy吗?(类似于builder->GetInt32PtrTy(loc[n])?)感谢您的回答。事实上,我的loc[n]是一个常数。我的数组loc只是作为Value*键入的,但在我的例子中,我确信loc[n]这里是一个常量*所以getIntToPtr应该对我有用?@user2390982我假设
loc
不包含常量,因为您在那里放置了一个用
alloca
创建的值,
alloca
不会返回常量。在任何情况下,如果它是一个常量,那么
ConstantExpr::getIntToPtr
确实应该工作。还要确保您的类型匹配-一个
alloca
返回一个指针,而不是一个数字,所以我不明白为什么您需要
getIntToPtr
。如果我不清楚,很抱歉。问题是我在
loc
数组中只存储Create*函数中使用的常量。例如,对于
CreateAlloca(type,myConst)
loc
包含
myConst
,而不是返回值。这就是为什么我必须对
CreateLoad
指令使用
getIntToPtr
(我说的对吗?),而且它在原始帖子中无法处理代码。@user2390982您能更好地解释一下您想做什么吗?如果您想分配一个i32,然后在那里加载内容(这将导致