1

对于某些背景,我正在使用 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]]

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

4

1 回答 1

3

就像在 C 中一样,LLVM IR要求数组的所有元素都属于同一类型。

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

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

于 2013-09-08T06:28:27.300 回答