如何在LLVM中保存指针数组?

时间:2013-09-08 04:51:24

标签: arrays pointers llvm llvm-py

对于某些背景知识,我正在使用llvmpy库实现编译器,该库是LLVM IR生成的包装器。

我创建了一个代表一个或多个UTF-8代码点的字符类型。这些代码点存储在一个数组中,因此一个字符可以是以下数组之一:

[1 x i32], [2 x i32], ..., [6 x i32]

现在,我想实现一个字符串类型。这将是一个指向数组的指针数组:

[n x [1-6 x i32]*] where n is the string length

然而,(据我所知)似乎LLVM要求我声明内部数组的长度。所以,虽然我可以存储这个:

[[1 x i32], [1 x i32], [1 x i32]]

我无法存储:

[[1 x i32], [2 x i32]]

如果数组指针导致不同长度的数组,有没有办法存储数组指针数组?

1 个答案:

答案 0 :(得分:2)

与C类似,LLVM IR 要求数组的所有元素属于同一类型。

我想解决这个问题的最简单方法是只存储一些任意指针类型(例如i32*),并在你想要访问数组时执行bitcast - 当然这是假设你事先知道每个索引的内部数组的大小。

如果它只在运行时知道,你可以让每个数组元素指向一个{ i32, i32* }结构,它保存内部数组的大小以及指向它的指针,然后switch在那个大小上,bitcast相应地在每个分支目标中 - 或者只是从i32*指针计算运行时的大小,这很容易,因为它是UTF-8。