我有一个定义为%Colour = type { { i32, i32, i32 }, %RED*, %GREEN*, %BLUE*, %RGB* }
的类型,我使用第一个字段存储RTTI,我在Colour*.0.0.2
加载字段并将其放在变量" arity"但是当我尝试再次对该对象执行GEP以获取RGB*
builder.CreateInBoundsGEP(valType, val, {builder.getInt32(0), arity})
时,我得到了#34;无效的GetElementPtrInst类型索引!"。正如我所料,倾向于我得到i32的arity,我做错了什么?
我不能在GEP中使用运行时值吗?我问,因为在我遇到此问题之后,我尝试将其更改为builder.CreateInBoundsGEP(valType, val, {builder.getInt32(0), builder.getInt32(4)})
,这会产生%2 = getelementptr inbounds %Colour, %Colour* %0, i32 0, i32 4
的预期结果,以便我可以加载%3 = load %RGB*, %RGB** %2
答案 0 :(得分:3)
我不能在GEP中使用运行时值吗?
在索引到类型的struct组件时,必须使用常量索引。否则,无法静态地知道GEP指令的类型。
换句话说,由于getelementptr inbounds %Colour, %Colour* %0, i32 0, i32 4
为%RGB**
且%y = getelementptr inbounds %Colour, %Colour* %0, i32 0, i32 3
为%BLUE**
,并且必须静态知道GEP的类型,因此最后一个索引必须是常量。
GEP索引到数组中不必是常量。
全是written explicitly in the langref:
每个索引参数的类型取决于它索引的类型。 当索引到(可选的打包)结构时,只允许i32整数常量(当使用索引向量时,它们必须都是相同的i32整数常量)。索引到数组,指针或向量时,允许任何宽度的整数,并且它们不需要是常量。这些整数在相关时被视为有符号值。
(强调我的)