我正在为aarch64
(ARM 64位)平台上的项目静态构建musl-libc
。我想避免使用任何软浮点库,例如GCC's soft float library routines。但是,即使我使用-mfloat-abi=hard
,这些仍会出现在库档案中。我可以说,这是因为ARM 64位平台将long double
定义为128位。
有没有办法改变这种行为?例如,我可以强制将long double
定义为与double
相同的大小吗?我知道这是C标准所允许的,但我不确定是否有任何方法可以强制Clang(我特意使用Clang)来编译这样的定义。
答案 0 :(得分:1)
我最终找到了一个解决方案,尽管我不一定能为所有人推荐。它可能会在其他地方引发错误,但是对于我所需要的来说已经足够了。它还涉及从头开始构建Clang(感谢@Art!的建议)。此外,我正在处理的项目正在使用LLVM / Clang 3.7.1,因此我对其他版本不做任何声明。
据我所知,在clang/lib/Basic/Targets.cpp
中出现了AArch64目标的long double的定义:
...
MaxAtomicInlineWidth = 128;
MaxAtomicPromoteWidth = 128;
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
LongDoubleFormat = &llvm::APFloat::IEEEquad;
// {} in inline assembly are neon specifiers, not assembly variant
// specifiers.
...
通过修改内部的2行,我删除了对我在问题中提到的soft-FP例程的所有引用:
LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
LongDoubleFormat = &llvm::APFloat::IEEEdouble;
我的测试程序(SNU's version of the NASA Parallel Benchmarks)仍然可以正确验证,因此我假设我并没有严重破坏任何东西。但这仍然是不平凡的修改-我不建议大多数人这样做(它可能导致其他地方的损坏)。
答案 1 :(得分:0)
我之前不得不做类似的事情,用类型(特别是long
s)来解决问题。您最好的选择是手动替换类型,因为这是获得您想要的最简单,最直接的方式。您可以尝试使用宏或按摩编译器,但根据我的经验,您只会创建比您解决的更多问题,并且它通常是一个脆弱的解决方案,以后会破坏。
幸运的是,您正在使用的来源看起来维护良好,而您正在寻找的更改是相当全面的。你可以很简单地敲出来。假设您正在运行类Unix系统,则可以从musl的基本目录运行以下命令:
$ grep -Rl 'long double' * | xargs -tn1 sed -i '' -e 's/long double/double/g'
此命令:
long double
,并返回包含该字符串的文件名。xargs
,每个文件名调用sed
命令,随着时间的推移进行打印。sed
时,会就地修改文件,并将long double
替换为double
。当我尝试这个命令时,它只是工作了#34;。我会更仔细地仔细阅读差异,以确保它能够正确地完成任何事情并且不会改变图书馆的行为。