原有 ABI 兼容性和互操作性
原有的 ABI 兼容性和互操作性。
由于诸如 setjmp (), longjmp (), sigsetjmp (), siglongjmp (), _setjmp (), _longjmp (), getcontext (), setcontext (), makecontext ()和 swapcontext ()之类必须保存和复原非易失性机器状态的接口的性质,在考虑旧 ABI 模块与向量扩展 ABI 模块之间的依赖关系时引入了风险。 为了使问题复杂化, libc 中的 setjmp 系列函数驻留在 libc的静态成员中,这意味着每个现有的 AIX® 二进制文件都具有 setjmp 的静态绑定副本以及与它所链接的 AIX® 版本一起存在的其他副本。 此外,现有 AIX® 二进制文件具有 jmpbufs 和 ucontext 数据结构定义,不足以容纳任何其他非易失性向量寄存器状态。
在任何情况下,如果先前版本的模块和新模块交错调用或回调,并且先前版本的模块可以执行 longjmp () 或 setcontext () 绕过向量扩展模块的正常链接约定,那么会存在损害非易失性 VR 状态的风险。
因此,当 AIX® ABI 定义非易失性 VR 时,在 AIX® 编译器中使用向量 (AltiVec) 时,缺省编译方式将是不使用任何非易失性 VR。 这将生成一个缺省编译环境,该环境安全地允许利用向量 (AltiVec) ,同时不会引入与先前版本二进制文件的互操作性方面的风险。
对于互操作性和模块依赖关系完全已知的应用程序,可以启用额外的编译选项,以允许使用非易失性 VR。 仅当所有从属先前版本模块和行为完全已知且被理解为不依赖于诸如 setjmp (), sigsetjmp (), _setjmp ()或 getcontext ()之类的功能,或者确保通过正常子例程链接约定来执行所有模块转换,并且不使用对上游先前版本模块的回调时,才应使用此方式。
此方法允许以完全安全的方式利用向量 (AltiVec) ,这是缺省方式,同时还允许在已知风险的情况下使用非易失性寄存器进行显式调整和进一步优化。 它还为未来提供了灵活的 ABI 和架构。
缺省 AltiVec 编译环境预定义了 __VEC__,如 AltiVec Programming Interface Manual中所述。
如果启用了使用非易失性 VR 的选项,那么编译环境还必须预定义 __EXTABI__。 当您编译或重新编译将与支持向量的模块 (这些模块能够使用非易失性 VR) 交互的非支持向量的模块时,也应该定义此值。