在LLVM IR中表示void指针类型

13

目前,我在生成的IR中使用 i8* 来表示 void 指针,但这使得很难区分 void* 和 char*。有没有常见的解决方法?我已经搜索了很多,但没有找到。

对于其他类型对,我能够直接使用 llvm::Type* 来区分类型,所以如果不能再为 void 指针特例这样做,它将增加很多复杂性。

一种想法可能是使用包含 i8 的命名结构作为 void 类型(例如,%void = type { i8 } ),并取代指向那个的指针,但是当你给它一个 void 指针类型时,clang 生成的 IR 使用 i8* ,因此我不确定每种方法的优缺点。


1
通常类型属于编译器的前端。LLVM类型系统可能与您的类似,但这只是巧合,并且可以在您的控制之外进行更改(例如:不透明指针类型即将到来)。在LLVM级别上不应该需要区分类型。 - Ismail Badawi
如果您从源代码开始并启用了调试信息,您可以解析它们以了解指针的真正含义(uint,void等)。 如果您编写(或生成)自己的llvmIR,我不明白为什么您需要那个... - Regis Portalez
@IsmailBadawi,这一切都很有道理。谢谢。看来是时候为我的编译器编写一个更完整的类型系统了。顺便说一句,如果你把这个作为答案,我会接受的。 - Lane
1个回答

11
一般来说,类型属于编译器前端。LLVM类型系统可能与您的类型系统相似,但它可以自由更改(例如:不透明指针类型即将到来)。在LLVM级别上没有区分类型的必要 -试图强制将您的类型系统与LLVM类型系统之间建立一对一的对应关系可能是错误的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接