Arm GCC可以从-mcpu推断出-mfloat-abi吗?

f45qwnt8  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(162)

一段时间以来(从2017年的this patch开始),gcc已经能够从-mcpu中推断出正确的-mfpu值。但是,我不清楚-mfloat-abi是否也是自动推断的,或者需要手动设置。
文档中有些隐晦地指出:“默认的[mfloat-abi的值]取决于特定的目标配置。”
具体来说如果我用-mcpu=cortex-m4编译(默认情况下启用浮点指令),我会自动得到-mfloat-abi=hard,还是至少得到softfp?或者我最终会得到次优的soft

czq61nw1

czq61nw11#

我想答案是“不”

-mfpu

首先,让我们看看-mfpu是如何推断出来的。
https://github.com/gcc-mirror/gcc/blob/releases/gcc-13.2.0/gcc/config/arm/arm.opt#L164-L166

mfpu=
Target RejectNegative Joined Enum(arm_fpu) Var(arm_fpu_index) Init(TARGET_FPU_auto) Save
Specify the name of the target floating point hardware/format.

默认情况下,TARGET_FPU_autoarm_fpu枚举的定义值:
https://github.com/gcc-mirror/gcc/blob/releases/gcc-13.2.0/gcc/config/arm/arm-tables.opt#L473-L474

Enum
Name(arm_fpu) Type(enum fpu_type)
Known ARM FPUs (for use with the -mfpu= option):
EnumValue
Enum(arm_fpu) String(auto) Value(TARGET_FPU_auto)

所以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

mfloat-abi=
Target RejectNegative Joined Enum(float_abi_type) Var(arm_float_abi) Init(TARGET_DEFAULT_FLOAT_ABI)
Specify if floating point hardware should be used.

你会注意到,默认值TARGET_DEFAULT_FLOAT_ABIfloat_abi_type枚举值之一:

Enum
Name(float_abi_type) Type(enum float_abi_type)
Known floating-point ABIs (for use with the -mfloat-abi= option):

EnumValue
Enum(float_abi_type) String(soft) Value(ARM_FLOAT_ABI_SOFT)

EnumValue
Enum(float_abi_type) String(softfp) Value(ARM_FLOAT_ABI_SOFTFP)

EnumValue
Enum(float_abi_type) String(hard) Value(ARM_FLOAT_ABI_HARD)

相反,它是一个#define,由“目标配置”设置,正如您在文档中所指出的那样:

$ cd gcc/config/arm
$ git grep TARGET_DEFAULT_FLOAT_ABI
arm.h:414:#ifndef TARGET_DEFAULT_FLOAT_ABI
arm.h:415:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
arm.opt:123:Target RejectNegative Joined Enum(float_abi_type) Var(arm_float_abi) Init(TARGET_DEFAULT_FLOAT_ABI)
freebsd.h:88:#undef TARGET_DEFAULT_FLOAT_ABI
freebsd.h:90:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
freebsd.h:92:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
linux-eabi.h:36:#undef  TARGET_DEFAULT_FLOAT_ABI
linux-eabi.h:37:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
linux-eabi.h:62:   GLIBC_DYNAMIC_LINKER_DEFAULT and TARGET_DEFAULT_FLOAT_ABI.  */
linux-elf.h:30:#undef  TARGET_DEFAULT_FLOAT_ABI
linux-elf.h:31:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
netbsd-eabi.h:31:  (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT      \
semi.h:35:#ifndef TARGET_DEFAULT_FLOAT_ABI
semi.h:36:#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD

因此,如果未在命令行中指定,则不会将其设置为指示应应用“自动”选择的值,而是实际的默认选项。
grep的输出来看(这是推测),如果你的目标是裸机或RTOS(就像Cortex M4一样),你可能会从arm.h获得默认的ARM_FLOAT_ABI_SOFT

相关问题