目前我使用i8 *来表示生成的IR中的void指针,但这使得很难将void *与char *区分开来。有没有解决这个问题的常用方法?我搜索了很多,没有运气。
对于其他每一种类型,我都可以直接使用llvm :: Type *来区分类型,因此如果我不能再为虚拟指针的特殊情况做到这一点,它会增加很多复杂性。 / p>
一个想法可能是使用包含i8作为void类型的命名结构(例如,%void = type {i8})并改为使用指针,但是当你给它一个空格时,clang生成的IR使用i8 *指针类型,所以我不确定每个的优点/缺点是什么。
答案 0 :(得分:6)
通常,类型属于编译器的前端。幸运的是,LLVM类型系统可能与您的系统类似,并且可以从您的下方自由更改(一个示例:opaque pointer types即将到来)。不需要在LLVM级别区分类型 - 尝试强制类型系统和LLVM类型系统之间的1:1对应可能是错误的。