在 llvm ir 中表示 void 指针类型

Representing void pointer type in llvm ir

目前我在生成的 IR 中使用 i8* 来表示 void 指针,但这使得区分 void* 和 char* 变得相当困难,例如。有解决这个问题的通用方法吗?我已经搜索了很多但没有运气。

对于其他每一对类型,我可以直接使用 llvm::Type* 来区分类型,因此如果我不能再仅针对 void 的特殊情况这样做,它会增加很多复杂性指针。

一个想法可能是使用包含 i8 作为 void 类型的命名结构(例如, %void = type { i8 } )并取而代之的指针,但是 clang 生成的 IR 在你给它时使用 i8*一个空指针类型,所以我不确定每个的 advantages/disadvantages 是什么。

一般来说,类型属于编译器的前端。幸运的是,LLVM 类型系统可能与您的类似,并且可以从您的下方自由更改(一个示例:opaque pointer types 即将到来)。不需要在 LLVM 级别区分类型——试图在您的类型系统和 LLVM 类型系统之间强制建立 1:1 对应关系可能是错误的。