ZHCUAQ1F july 2015 – april 2023
可以使用--call_assumptions 选项控制由--program_level_compile --opt_level=3 调用的程序级优化。具体而言,--call_assumptions 选项表示其他模块中的函数是否可以调用模块的外部函数或修改模块的外部变量。--call_assumptions 后面的数字表示您为允许调用或修改的模块而设置的级别。--opt_level=3 选项将此信息与其自身的文件级分析相结合,以决定是否将该模块的外部函数和变量声明视为静态声明。使用表 4-3 选择合适的级别以附加到 --call_assumptions 选项。
如果模块... | 使用此选项 |
---|---|
具有从其他模块调用的函数以及在其他模块中修改的全局变量 | --call_assumptions=0 |
不具有由其他模块调用的函数,但具有在其他模块中修改的全局变量 | --call_assumptions=1 |
不具有由其他模块调用的函数,也不具有在其他模块中修改的全局变量 | --call_assumptions=2 |
具有从其他模块调用的函数,但不具有在其他模块中修改的全局变量 | --call_assumptions=3 |
在某些情况下,编译器恢复到与指定级别不同的 --call_assumptions 级别,或者可能完全禁用程序级优化。表 4-4 列出了 --call_assumptions 级别与导致编译器恢复到其他 --call_assumptions 级别的条件的组合。
如果 --call_assumptions 为... | 在以下条件下... | 则 --call_assumptions 级别... |
---|---|---|
未指定 | 指定了 --opt_level=3 优化级别 | 默认为 --call_assumptions=2 |
未指定 | 编译器在 --opt_level=3 优化级别下发现对外部函数的调用 | 恢复为 --call_assumptions=0 |
未指定 | 未定义 main | 恢复为 --call_assumptions=0 |
--call_assumptions=1 或 --call_assumptions=2 | 没有将 main 定义为入口点的函数,也没有定义中断函数,也 没有由 FUNC_EXT_CALLED pragma 标识的函数 | 恢复为 --call_assumptions=0 |
--call_assumptions=1 或 --call_assumptions=2 | 定义了 main 函数,或 定义了中断函数,或 者用 FUNC_EXT_CALLED pragma 标识了函数 | 保留 --call_assumptions=1 或 --call_assumptions=2 |
--call_assumptions=3 | 任何条件下 | 保留 --call_assumptions=3 |
在某些情况下,使用 --program_level_compile 和 --opt_level=3 时,则必须 使用 --call_assumptions 选项或 FUNC_EXT_CALLED pragma。有关这些情况的信息,请参阅节 4.4.2。