如何优化并删除LLVM 7.0.0中未使用的@llvm.global_ctors变量?
解决LLVM 7.0.0中未使用的@llvm.global_ctors变量无法被优化移除的问题
@llvm.global_ctors是LLVM用于存储全局构造函数的特殊变量,默认优化逻辑不会轻易移除它,以下是几种可行的删除方法:
1. 组合使用激进优化选项
-std-link-opts包含的优化强度不足以处理这类特殊全局变量,你可以搭配死代码消除等针对性选项:
opt -O3 -globaldce -strip-dead-prototypes input.ll -o output.ll
-O3:开启最高等级通用优化-globaldce:主动扫描并删除未被任何代码引用的全局变量与函数-strip-dead-prototypes:清理无实际用途的函数原型
2. 手动编辑IR代码直接删除
如果命令行优化无效,直接打开IR文件,找到以下代码行并删除:
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_ac_multiply.cpp, i8* null }]
同时检查关联的@_GLOBAL__sub_I_ac_multiply.cpp函数,如果该函数也无任何引用,可一并删除,避免遗留无用代码。
3. 排查隐含引用后再优化
部分场景下,看似未被使用的全局构造函数可能存在间接引用(比如动态符号导出、函数指针调用),可以用llvm-nm工具检查符号状态:
llvm-nm input.ll
若@_GLOBAL__sub_I_ac_multiply.cpp被标记为全局可见符号(如带T/W标记),需先将其转为内部符号再消除:
opt -internalize -globaldce input.ll -o output.ll
内容的提问来源于stack exchange,提问作者user10144801
相关产品推荐
相关产品推荐

