我正在 build musl-libc
静态地用于 aarch64
(ARM 64 位)平台上的项目。我想避免使用任何软浮点库,例如 GCC's soft float library routines .然而,即使我使用 -mfloat-abi=hard
,这些仍然出现在库文件中。据我所知,这是因为 ARM 64 位平台将 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.
...
通过修改内部 2 行,我删除了对我在问题中提到的软 FP 例程的所有引用:
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;
我的测试程序 -- SNU's version of the NASA Parallel Benchmarks - 仍然正确验证,所以我假设我没有破坏任何东西。不过,这是一个重要的修改——我不建议大多数人这样做(它可能会导致其他地方损坏)。
关于c - 强制 64 位长 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888860/