LLVM构造IR时函数参数指针类型未按预期显示问题
原因说明
这个现象是你使用的LLVM版本默认启用**不透明指针(opaque pointer)**机制导致的,和你构造指针类型的代码逻辑无关。
- LLVM 15开始正式将不透明指针设为默认模式:该模式下所有指针在IR文本层统一表示为
ptr,不再携带指向目标的类型信息,无论指针实际指向i32、固定长度向量还是结构体,打印时都不会出现旧版本中<2 x i32>*、i32*这类带指向类型的指针写法。 - 你通过
t_2xi32->getPointerTo(0)构造的指针,在LLVM内部数据结构中确实保留了指向<2 x i32>类型的关联信息,只是IR打印阶段默认不输出这部分内容。不透明指针模式下GEP指令的基址指针统一显示为ptr,偏移计算的类型依据完全由GEP的第一个源操作数类型决定,也就是你代码里传入的TheBuilder.getInt32Ty()。
复现旧版输出的方法
如果你需要看到旧版带类型指针的IR输出,可以在初始化LLVM上下文时关闭不透明指针开关:
TheContext.setOpaquePointers(false);
添加该配置后重新运行代码,输出的IR就会显示你预期的<2 x i32>*指针格式。
提示:带类型指针的兼容模式已经在LLVM 17版本被完全移除,不透明指针是LLVM后续版本的唯一支持方案,新项目建议直接适配
ptr的写法,不要长期依赖关闭不透明指针的兼容逻辑。
另外你贴出的运行结果里多了一条%2 = getelementptr i32, ptr %0, i32 1指令,和你贴的构造代码不匹配,应该是实际运行的代码中多调用了一次CreateGEP,和指针类型显示的问题没有关联。
内容的提问来源于stack exchange,提问作者illuminate
相关产品推荐
相关产品推荐

