Clang禁用特定函数优化失效及未知pragma警告问题求助
问题根源:你的Clang版本不支持所用的优化禁用方式
为什么#pragma clang optimize off无效且报警告?
你使用的Apple LLVM version 6.0 (clang-600.0.57)是基于LLVM 3.5的老版本,而#pragma clang optimize off/on这个编译指示是在Clang 3.8及以后版本才引入的。你的版本根本不认识这个pragma,所以会输出unknown pragma ignored的警告,自然无法起到关闭优化的作用。
为什么__attribute__(optnone)也无效?
__attribute__((optnone))在LLVM 3.5/Clang 6.0中的支持并不完善,而且全局优化级别(比如你用的-O3)可能会覆盖单个函数的optnone属性。另外,即使写法正确(属性需直接放在函数定义前),老版本的Clang在全局-O3下也可能忽略这个属性。正确的写法示例:
__attribute__((optnone)) int main() { int x = 777; x = 555; x = 888; x = 999; printf("%d\n", x); return 0; }
可行的解决方案
方案1:升级Clang版本
如果条件允许,升级到Clang 3.8或更高版本,这样#pragma clang optimize off/on就能正常工作,optnone属性的支持也更稳定。
方案2:单独编译目标函数所在文件
把需要禁用优化的函数单独放在一个源文件中,用-O0编译这个文件,其他文件仍然用-O3编译,最后链接在一起:
# 编译其他需要优化的文件 clang -c -O3 other_source.c # 编译需要禁用优化的主文件 clang -c -O0 opt.c # 链接生成可执行文件 clang -o program opt.o other_source.o
方案3:使用__attribute__((optimize("O0")))
在老版本Clang中,试试用optimize属性直接指定函数的优化级别为O0,写法如下:
__attribute__((optimize("O0"))) int main() { int x = 777; x = 555; x = 888; x = 999; printf("%d\n", x); return 0; }
然后用clang -S -O3 opt.c编译,应该能保留冗余赋值。
内容的提问来源于stack exchange,提问作者A. Mikhaylishin
相关产品推荐
相关产品推荐

