ZHCUAQ1F july 2015 – april 2023
如果程序中有任何汇编函数,则在使用 --program_level_compile 选项时,请谨慎操作。编译器只识别 C/C++ 源代码,而不识别任何可能存在的汇编代码。由于编译器无法识别对 C/C++ 函数的汇编代码调用和变量修改,因此 --program_level_compile 选项会优化这些 C/C++ 函数。要保留这些函数,请将 FUNC_EXT_CALLED pragma(请参阅节 7.9.12)放在对要保留的函数的任何声明或引用之前。
在程序中使用汇编函数时可以采用的另一种方法是将 --call_assumptions=n 选项与 --program_level_compile 及 --opt_level=3 选项结合使用。有关--call_assumptions=n 选项的信息,请参阅节 4.4.1。
通常,采用明智的方式将 FUNC_EXT_CALLED pragma 与 --program_level_compile --opt_level=3 及 --call_assumptions=1 或 --call_assumptions=2 结合使用,可以获得最佳结果。
如果您的应用程序出现以下任一情况,请使用建议的解决方案:
解决方案:使用 --program_level_compile --opt_level=3 --call_assumptions=2进行编译,通知编译器:外部函数不会调用 C/C++ 函数,也不会修改 C/C++ 变量。
如果仅使用 --program_level_compile --opt_level=3 选项进行编译,编译器会从默认优化级别 (--call_assumptions=2) 恢复到 --call_assumptions=0。编译器使用 --call_assumptions=0 ,因为编译器假定调用在 C/C++ 中定义的汇编语言函数可能会调用其他 C/C++ 函数或修改 C/C++ 变量。
解决方案:尝试以下两种解决方案,然后选择最适合您的代码的一种解决方案:
解决方案:将 volatile 关键字添加到可能被中断修改的 C/C++ 变量中。然后,可以通过以下方式之一优化代码:
请记住,如果不使用附加选项而使用了 --program_level_compile --opt_level=3,编译器会删除汇编函数调用的 C 函数。请使用 FUNC_EXT_CALLED pragma 保留这些函数。