一段时间以来(从2017年的this patch开始),gcc已经能够从-mcpu
中推断出正确的-mfpu
值。但是,我不清楚-mfloat-abi
是否也是自动推断的,或者需要手动设置。
文档中有些隐晦地指出:“默认的[mfloat-abi的值]取决于特定的目标配置。”
具体来说如果我用-mcpu=cortex-m4
编译(默认情况下启用浮点指令),我会自动得到-mfloat-abi=hard
,还是至少得到softfp
?或者我最终会得到次优的soft
?
一段时间以来(从2017年的this patch开始),gcc已经能够从-mcpu
中推断出正确的-mfpu
值。但是,我不清楚-mfloat-abi
是否也是自动推断的,或者需要手动设置。
文档中有些隐晦地指出:“默认的[mfloat-abi的值]取决于特定的目标配置。”
具体来说如果我用-mcpu=cortex-m4
编译(默认情况下启用浮点指令),我会自动得到-mfloat-abi=hard
,还是至少得到softfp
?或者我最终会得到次优的soft
?
1条答案
按热度按时间czq61nw11#
我想答案是“不”
-mfpu
首先,让我们看看
-mfpu
是如何推断出来的。https://github.com/gcc-mirror/gcc/blob/releases/gcc-13.2.0/gcc/config/arm/arm.opt#L164-L166
默认情况下,
TARGET_FPU_auto
是arm_fpu
枚举的定义值:https://github.com/gcc-mirror/gcc/blob/releases/gcc-13.2.0/gcc/config/arm/arm-tables.opt#L473-L474
所以
TARGET_FPU_auto
是一个FPU枚举值,它在arm.cc
中的几个地方被处理。我不会声称完全理解它是如何工作的--它涉及到在不同的地方屏蔽伊萨和FPU位图,例如。
arm_identify_fpu_from_isa
。但我很清楚,当
opts->x_arm_fpu_index == TARGET_FPU_auto
时,会发生一些“自动”选择。-mfloat-abi
让我们将其与
-mfloat-abi
默认值进行比较。https://github.com/gcc-mirror/gcc/blob/releases/gcc-13.2.0/gcc/config/arm/arm.opt#L122-L124
你会注意到,默认值
TARGET_DEFAULT_FLOAT_ABI
是float_abi_type
枚举值之一:相反,它是一个
#define
,由“目标配置”设置,正如您在文档中所指出的那样:因此,如果未在命令行中指定,则不会将其设置为指示应应用“自动”选择的值,而是实际的默认选项。
从
grep
的输出来看(这是推测),如果你的目标是裸机或RTOS(就像Cortex M4一样),你可能会从arm.h
获得默认的ARM_FLOAT_ABI_SOFT
。