ton*_*sdg 16 c floating-point clang arm64 musl
我正在musl-libc为aarch64(ARM 64位)平台上的项目静态构建.我想避免使用任何软浮点库,例如GCC的软浮点库例程.但是,即使我使用它们,它们仍然出现在库档案中-mfloat-abi=hard.我可以说,这是因为ARM 64位平台将a定义long double为128位.
有没有办法改变这种行为?例如,我可以强制long double定义为与double?相同的大小吗?我知道这是C标准所允许的,但我不确定是否有任何方法可以强制Clang(我特意使用Clang)来编译这样的定义.
我最终找到了一个解决方案,尽管我不一定会推荐给所有人。它可能会在其他地方引发错误,但它已经足够满足我的需要了。它还涉及从头开始构建 Clang(感谢@Art 的建议!)。此外,我正在从事的项目使用的是 LLVM/Clang 3.7.1,因此我对其他版本不做任何声明。
据我所知,AArch64 目标的 long double 的定义出现在clang/lib/Basic/Targets.cpp:
...
MaxAtomicInlineWidth = 128;
MaxAtomicPromoteWidth = 128;
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
LongDoubleFormat = &llvm::APFloat::IEEEquad;
// {} in inline assembly are neon specifiers, not assembly variant
// specifiers.
...
Run Code Online (Sandbox Code Playgroud)
通过修改内部 2 行,我删除了对问题中提到的软 FP 例程的任何引用:
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Run Code Online (Sandbox Code Playgroud)
我的测试程序——SNU 版本的 NASA 并行基准——仍然可以正确验证,所以我假设我没有严重破坏任何东西。尽管如此,这仍然是一个不平凡的修改——我不推荐大多数人这样做(它可能会导致其他地方的损坏)。