我最近遇到了第三方库的问题,该库使用以下代码在ARM平台上测试混合端浮点格式:
#if defined(__arm__) && !(__ARM_EABI__)
Run Code Online (Sandbox Code Playgroud)
此检查错误地在Android平台上检测混合端格式,但在iOS平台上正常工作.经过一些研究后,我找到了debian ArmEabiPort文档,其中包含以下GCC预处理器宏中的浮点部分(强调我的):
将代码移植到"armel"时,以下预处理器宏很有趣:
__VFP_FP__表示正在使用的浮点格式是ARM VFP单元的格式,即本机端IEEE-754.
__MAVERICK__表示浮点格式是Cirrus Logic MaverickCrunch的格式,它也是IEEE-754并且始终是小端格式.
__SOFTFP__表示不是浮点指令,而是为浮点数学运算生成库调用,以便代码在没有FPU的处理器上运行.
__VFP_FP__和__MAVERICK__是互斥的.如果两者都未设置,则表示使用的浮点格式是 FPA单元的旧混合端格式45670123.
对于我们的具体情况,更新检查到以下修复了问题:
#if defined(__arm__) && !(__VFP_FP__)
Run Code Online (Sandbox Code Playgroud)
适用于Android和iOS平台.虽然从文档中可以得到更正确的检查:
#if defined(__arm__) && !(__VFP_FP__) && !(__MAVERICK__)
Run Code Online (Sandbox Code Playgroud)
我们想向第三方提交补丁,但考虑到旧的检查确实对提交它的人有效,找到文档有多困难,我觉得我没有足够的信息来证明这一点.
是否有最后一次检查错过的情况?debian文档具体介绍gcc了这些宏的可移植性如何?
更新
根据无艺术噪音的有用评论,问题归结为:
__ARM_EABI__另一个用户将宏检查作为补丁引入,以检查混合端浮点格式.显然有这个宏适用的系统,那些系统是什么?将在__VFP_FP__宏覆盖这些系统还是需要采取宏观考虑以及防止破坏现有的用户,当我提交补丁.
您还需要检查以确保您不在软浮点工具链上,因为软浮点库不存在混合字节序问题:
#if defined(arm) && !defined(__SOFTFP__) && !defined(__VFP_FP__) && !defined(__MAVERICK__)
Run Code Online (Sandbox Code Playgroud)
至于编译器支持——这些应该可以在 clang 中工作,但显然,商业 ARM 编译器将完全做其他事情。