对于某些背景知识,我正在使用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]]
如果数组指针导致不同长度的数组,有没有办法存储数组指针数组?
答案 0 :(得分:2)
与C类似,LLVM IR 要求数组的所有元素属于同一类型。
我想解决这个问题的最简单方法是只存储一些任意指针类型(例如i32*
),并在你想要访问数组时执行bitcast
- 当然这是假设你事先知道每个索引的内部数组的大小。
如果它只在运行时知道,你可以让每个数组元素指向一个{ i32, i32* }
结构,它保存内部数组的大小以及指向它的指针,然后switch
在那个大小上,bitcast
相应地在每个分支目标中 - 或者只是从i32*
指针计算运行时的大小,这很容易,因为它是UTF-8。