GCC 9/10/11使用覆盖率编译时出现ICE,GCC 6.3.0版本可正常编译
during IPA pass: profile <file_name>.m4: In function 'void <function_name>(int)': <file_name>.m4:4232:1: internal compiler error: in coverage_begin_function, at coverage.c:656 0x59a1fa coverage_begin_function(unsigned int, unsigned int) /tmp/gcc-v9.3.0p3/gcc.source/gcc/coverage.c:458 0xad549a branch_prob(bool) /tmp/gcc-v9.3.0p3/gcc.source/gcc/profile.c:1233 0xc10212 tree_profiling /tmp/gcc-v9.3.0p3/gcc.source/gcc/tree-profile.c:793 0xc10212 execute /tmp/gcc-v9.3.0p3/gcc.source/gcc/tree-profile.c:898 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
解决思路
- 最小复现确认:先抽离EDG生成的对应源文件,剥离无关依赖,确认仅添加
-fprofile-arcs -ftest-coverage(覆盖率编译参数)即可触发崩溃,排除其他编译选项、链接选项的干扰。 - 临时功能规避:对触发崩溃的源文件单独关闭覆盖率编译,在构建规则中为该文件添加排除规则,移除覆盖率相关编译标记,其余文件保持覆盖率开启,不影响整体业务的覆盖率收集需求。
- 代码逻辑适配:该问题通常是EDG生成的代码存在GCC 9+覆盖率插桩逻辑不兼容的特征,常见为超大函数、过深的分支嵌套、特殊的异常处理块结构。可以调整EDG的代码生成规则,拆分长度过大的函数、简化异常块嵌套、提前清理无可达路径的无效代码,适配高版本GCC的插桩逻辑。
- 编译参数规避:添加编译参数
-fno-tree-profile关闭触发崩溃的tree profile阶段插桩,或者升级到对应大版本的最新小版本(GCC 9.5、10.4、11.3及以上),这类内部编译器错误通常会在后续小版本迭代中得到修复。 - 工具链混用方案:如果必须收集该文件的覆盖率数据,可以保留GCC 6.3.0版本单独编译该目标文件,和其余用高版本GCC编译的目标文件做链接,只要保证ABI兼容即可正常运行和收集覆盖率。
- 官方修复提交:可以导出预处理后的完整源文件,附带复现步骤、编译参数、崩溃栈提交给GCC开发团队做官方修复。
内容的提问来源于stack exchange,提问作者Rogerio Souza
相关产品推荐
相关产品推荐

