Skip to content

Latest commit

 

History

History
11 lines (6 loc) · 1.39 KB

14_代码二级优化问题.md

File metadata and controls

11 lines (6 loc) · 1.39 KB

代码二级优化问题

发现代码二级优化后,线程初始化异常,程序无法正常运行下去。

代码不支持二级优化的问题是由于我先前支持 VFP 时留下的隐患,当我用汇编实现 vfp 的栈初始化函数时,不清楚要遵循 C 语言调用汇编语言的编程规范,使用了 R5 R6 寄存器但是却没有保存并恢复他们的状态,这就导致了调用该函数的上下文被破坏,导致一些赋值异常,进而导致线程初始化异常,线程无法正常运行。出现这种问题的原因是我对汇编相关的编程规范不够熟悉,后续要加强这方面的基础知识。

那么为什么问题只在二级优化的时候出现呢?经过测试发现当使用 O0 优化时,编译器在翻译代码时只只用了 R0-R3 寄存器,没有使用到我实现函数中所用到的 R5 R6,因此这个问题被掩盖了。当编译器开启二级优化时,优化后的汇编代码使用了 R4-R11 等这些寄存器,由于我在函数中改掉了这些寄存器,因此造成了编译器输出的汇编代码运行异常。

结论

这说明,在不同的优化等级下,编译器给出的机器码可能会选择不同的寄存器来完成相同功能的操作,我自己编写的汇编代码对于编译器来说是无法感知的,因此可能会破坏编译器规划的程序流,进而导致程序运行失败。