具有运行时值的LLVM GEP

时间:2016-02-24 14:03:38

标签: llvm llvm-ir llvm-c++-api

我有一个定义为%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

1 个答案:

答案 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整数常量)。索引到数组,指针或向量时,允许任何宽度的整数,并且它们不需要是常量。这些整数在相关时被视为有符号值。

(强调我的)