Message ID | 20230127020631.77580-1-cooper.qu@linux.alibaba.com |
---|---|
State | New |
Headers | show |
Series | [v2] C-SKY: Strip hard float abi from hard float feature. | expand |
On 26/01/23 23:06, Xianmiao Qu via Libc-alpha wrote: > The hard float abi and hard float are different, > Hard float abi: Use float register to pass float type arguments. > Hard float: Enable the hard float ISA feature.> So the with_fp_cond cannot represent these two features. When > -mfloat-abi=softfp, the float abi is soft and hard float is enabled. > So add 'with_hard_float_abi' in preconfigure and define 'CSKY_HARD_FLOAT_ABI' > if float abi is hard, and use 'CSKY_HARD_FLOAT_ABI' to determine > dynamic linker because it is what determines compatibility. > And with_fp_cond is still needed to tell glibc whether to enable > hard floating feature. > In addition, use AC_TRY_COMMAND to test gcc to ensure compatibility > between different versions of gcc. The original way has a problem > that __CSKY_HARD_FLOAT_FPU_SF__ means the target only has single > hard float-points ISA, so it's not defined in CPUs like ck810f. > --- > config.h.in | 5 ++- > sysdeps/csky/preconfigure | 47 ++++++++++++--------- > sysdeps/csky/preconfigure.ac | 39 +++++++++-------- > sysdeps/unix/sysv/linux/csky/shlib-versions | 4 +- > 4 files changed, 52 insertions(+), 43 deletions(-) > mode change 100644 => 100755 sysdeps/csky/preconfigure > > diff --git a/config.h.in b/config.h.in > index 43d32518ab..09730d9d52 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -123,9 +123,12 @@ > /* C-SKY ABI version. */ > #undef CSKYABI > > -/* C-SKY floating-point ABI. */ > +/* C-SKY floating-point instructions. */ > #undef CSKY_HARD_FLOAT > > +/* C-SKY floating-point ABI. */ > +#undef CSKY_HARD_FLOAT_ABI > + > /* RISC-V integer ABI for ld.so. */ > #undef RISCV_ABI_XLEN > > diff --git a/sysdeps/csky/preconfigure b/sysdeps/csky/preconfigure > old mode 100644 > new mode 100755 > index 8a6136dd8d..6ba4871d18 > --- a/sysdeps/csky/preconfigure > +++ b/sysdeps/csky/preconfigure > @@ -5,10 +5,8 @@ case "$machine" in > csky*) > abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > sed -n 's/^#define __CSKYABI__ \(.*\)/\1/p'` > - hard_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > - sed -n 's/^#define __CSKY_HARD_FLOAT__ \(.*\)/\1/p'` > - hard_float_sf=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > - sed -n 's/^#define __CSKY_HARD_FLOAT_FPU_SF__ \(.*\)/\1/p'` > + soft_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > + sed -n 's/^#define __CSKY_SOFT_FLOAT__ \(.*\)/\1/p'` > hard_float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > sed -n 's/^#define __CSKY_HARD_FLOAT_ABI__ \(.*\)/\1/p'` > > @@ -24,26 +22,31 @@ csky*) > ;; > esac > > - # __CSKY_HARD_FLOAT_ABI__ was added on gcc 11 to specify whether > - # -mfloat-abi=hard is set. On older gcc, the float ABI is defined solely > - # with __CSKY_HARD_FLOAT__. If __CSKY_HARD_FLOAT__ is set, it can be > - # either a hard-float ABI (gcc older than 11, or gcc11 -mfloat-abi=hard > - # (__CSKY_HARD_FLOAT_ABI__ is set) or -mfloat-abi=softfp > - # (__CSKY_HARD_FLOAT_ABI__ is not set). To be compatible with older gcc, > - # use __CSKY_HARD_FLOAT_FPU_SF__ identify if -mfloat-abi is supported, > - # because it is added to gcc at the same time as -mfloat-abi. > - if test -n "$hard_float"; then > - if test -z "$hard_float_sf"; then > - with_fp_cond=1 > - else > + if { ac_try='${CC-cc} -S -mfloat-abi=softfp /dev/null 1>&5' > + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 > + (eval $ac_try) 2>&5 > + ac_status=$? > + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 > + test $ac_status = 0; }; }; then > + soft_float_abi_support=1 > + else > + soft_float_abi_support=0 > + fi > + > + if test -n "$soft_float"; then > + with_fp_cond=0 > + with_hard_float_abi=0 > + else > + with_fp_cond=1 > + if test -n "$soft_float_abi_support"; then > if test -n "$hard_float_abi"; then > - with_fp_cond=1 > + with_hard_float_abi=1 > else > - with_fp_cond=0 > + with_hard_float_abi=0 > fi > + else > + with_hard_float_abi=1 > fi > - else > - with_fp_cond=0 > fi > > base_machine=csky > @@ -55,6 +58,10 @@ _ACEOF > > cat >>confdefs.h <<_ACEOF > #define CSKY_HARD_FLOAT $with_fp_cond > +_ACEOF > + > + cat >>confdefs.h <<_ACEOF > +#define CSKY_HARD_FLOAT_ABI $with_hard_float_abi > _ACEOF > > ;; > diff --git a/sysdeps/csky/preconfigure.ac b/sysdeps/csky/preconfigure.ac > index 332c0f1cab..7412bcef92 100644 > --- a/sysdeps/csky/preconfigure.ac > +++ b/sysdeps/csky/preconfigure.ac > @@ -5,10 +5,8 @@ case "$machine" in > csky*) > abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > sed -n 's/^#define __CSKYABI__ \(.*\)/\1/p'` > - hard_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > - sed -n 's/^#define __CSKY_HARD_FLOAT__ \(.*\)/\1/p'` > - hard_float_sf=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > - sed -n 's/^#define __CSKY_HARD_FLOAT_FPU_SF__ \(.*\)/\1/p'` > + soft_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > + sed -n 's/^#define __CSKY_SOFT_FLOAT__ \(.*\)/\1/p'` > hard_float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | > sed -n 's/^#define __CSKY_HARD_FLOAT_ABI__ \(.*\)/\1/p'` > > @@ -24,26 +22,26 @@ csky*) > ;; > esac > > - # __CSKY_HARD_FLOAT_ABI__ was added on gcc 11 to specify whether > - # -mfloat-abi=hard is set. On older gcc, the float ABI is defined solely > - # with __CSKY_HARD_FLOAT__. If __CSKY_HARD_FLOAT__ is set, it can be > - # either a hard-float ABI (gcc older than 11, or gcc11 -mfloat-abi=hard > - # (__CSKY_HARD_FLOAT_ABI__ is set) or -mfloat-abi=softfp > - # (__CSKY_HARD_FLOAT_ABI__ is not set). To be compatible with older gcc, > - # use __CSKY_HARD_FLOAT_FPU_SF__ identify if -mfloat-abi is supported, > - # because it is added to gcc at the same time as -mfloat-abi. > - if test -n "$hard_float"; then > - if test -z "$hard_float_sf"; then > - with_fp_cond=1 > - else > + if AC_TRY_COMMAND(${CC-cc} -S -mfloat-abi=softfp /dev/null 1>&AS_MESSAGE_LOG_FD); then > + soft_float_abi_support=1 > + else > + soft_float_abi_support=0 > + fi It is not clear to me why you need to use '-mfloat-abi=softfp' to check for soft-float ABI, since it *won't* be used to actually build glibc (meaning that the compiler build invocation not necessary will use the same ABI as the test is doing). > + > + if test -n "$soft_float"; then > + with_fp_cond=0 > + with_hard_float_abi=0 > + else > + with_fp_cond=1 > + if test -n "$soft_float_abi_support"; then > if test -n "$hard_float_abi"; then > - with_fp_cond=1 > + with_hard_float_abi=1 > else > - with_fp_cond=0 > + with_hard_float_abi=0 > fi > + else > + with_hard_float_abi=1 > fi > - else > - with_fp_cond=0 > fi > > base_machine=csky > @@ -51,5 +49,6 @@ csky*) > > AC_DEFINE_UNQUOTED([CSKYABI], [$abi]) > AC_DEFINE_UNQUOTED([CSKY_HARD_FLOAT], [$with_fp_cond]) > + AC_DEFINE_UNQUOTED([CSKY_HARD_FLOAT_ABI], [$with_hard_float_abi]) > ;; > esac > diff --git a/sysdeps/unix/sysv/linux/csky/shlib-versions b/sysdeps/unix/sysv/linux/csky/shlib-versions > index 8c026356ef..4ab7d6b83e 100644 > --- a/sysdeps/unix/sysv/linux/csky/shlib-versions > +++ b/sysdeps/unix/sysv/linux/csky/shlib-versions > @@ -1,8 +1,8 @@ > DEFAULT GLIBC_2.29 > > -%if CSKYABI == 2 && CSKY_HARD_FLOAT == 1 > +%if CSKYABI == 2 && CSKY_HARD_FLOAT_ABI == 1 > ld=ld-linux-cskyv2-hf.so.1 > -%elif CSKYABI == 2 && CSKY_HARD_FLOAT == 0 > +%elif CSKYABI == 2 && CSKY_HARD_FLOAT_ABI == 0 > ld=ld-linux-cskyv2.so.1 > %else > %error cannot determine ABI
On Fri, Jan 27, 2023 at 04:24:32PM -0300, Adhemerval Zanella Netto wrote: > > > It is not clear to me why you need to use '-mfloat-abi=softfp' to check > for soft-float ABI, since it *won't* be used to actually build glibc > (meaning that the compiler build invocation not necessary will use the > same ABI as the test is doing). > This is for compatibility with versions prior to GCC 11. The older versions of C-SKY GCC don't support -mfloat-abi=softfp, so the '__CSKY_HARD_FLOAT_ABI__' is always not defined, and the expression 'defined(__CSKY_HARD_FLOAT__) && !defined(__CSKY_HARD_FLOAT_ABI__)' which is correct for newer versions of GCC does not work for older versions. And there doesn't seem to be an expression compitable with all versions of GCC, so I add the check for the '-mfloat-abi=softfp' option.
On 27/01/23 22:48, Xianmiao Qu wrote: > On Fri, Jan 27, 2023 at 04:24:32PM -0300, Adhemerval Zanella Netto wrote: >> >> >> It is not clear to me why you need to use '-mfloat-abi=softfp' to check >> for soft-float ABI, since it *won't* be used to actually build glibc >> (meaning that the compiler build invocation not necessary will use the >> same ABI as the test is doing). >> > > This is for compatibility with versions prior to GCC 11. The older versions > of C-SKY GCC don't support -mfloat-abi=softfp, so the '__CSKY_HARD_FLOAT_ABI__' > is always not defined, and the expression 'defined(__CSKY_HARD_FLOAT__) && !defined(__CSKY_HARD_FLOAT_ABI__)' > which is correct for newer versions of GCC does not work for older versions. > And there doesn't seem to be an expression compitable with all versions of GCC, > so I add the check for the '-mfloat-abi=softfp' option. Right, so please add a comment that the -mfloat-abi=softfp is to check for older gcc version on the configure.ac (similar to the current one).
diff --git a/config.h.in b/config.h.in index 43d32518ab..09730d9d52 100644 --- a/config.h.in +++ b/config.h.in @@ -123,9 +123,12 @@ /* C-SKY ABI version. */ #undef CSKYABI -/* C-SKY floating-point ABI. */ +/* C-SKY floating-point instructions. */ #undef CSKY_HARD_FLOAT +/* C-SKY floating-point ABI. */ +#undef CSKY_HARD_FLOAT_ABI + /* RISC-V integer ABI for ld.so. */ #undef RISCV_ABI_XLEN diff --git a/sysdeps/csky/preconfigure b/sysdeps/csky/preconfigure old mode 100644 new mode 100755 index 8a6136dd8d..6ba4871d18 --- a/sysdeps/csky/preconfigure +++ b/sysdeps/csky/preconfigure @@ -5,10 +5,8 @@ case "$machine" in csky*) abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __CSKYABI__ \(.*\)/\1/p'` - hard_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | - sed -n 's/^#define __CSKY_HARD_FLOAT__ \(.*\)/\1/p'` - hard_float_sf=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | - sed -n 's/^#define __CSKY_HARD_FLOAT_FPU_SF__ \(.*\)/\1/p'` + soft_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | + sed -n 's/^#define __CSKY_SOFT_FLOAT__ \(.*\)/\1/p'` hard_float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __CSKY_HARD_FLOAT_ABI__ \(.*\)/\1/p'` @@ -24,26 +22,31 @@ csky*) ;; esac - # __CSKY_HARD_FLOAT_ABI__ was added on gcc 11 to specify whether - # -mfloat-abi=hard is set. On older gcc, the float ABI is defined solely - # with __CSKY_HARD_FLOAT__. If __CSKY_HARD_FLOAT__ is set, it can be - # either a hard-float ABI (gcc older than 11, or gcc11 -mfloat-abi=hard - # (__CSKY_HARD_FLOAT_ABI__ is set) or -mfloat-abi=softfp - # (__CSKY_HARD_FLOAT_ABI__ is not set). To be compatible with older gcc, - # use __CSKY_HARD_FLOAT_FPU_SF__ identify if -mfloat-abi is supported, - # because it is added to gcc at the same time as -mfloat-abi. - if test -n "$hard_float"; then - if test -z "$hard_float_sf"; then - with_fp_cond=1 - else + if { ac_try='${CC-cc} -S -mfloat-abi=softfp /dev/null 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + soft_float_abi_support=1 + else + soft_float_abi_support=0 + fi + + if test -n "$soft_float"; then + with_fp_cond=0 + with_hard_float_abi=0 + else + with_fp_cond=1 + if test -n "$soft_float_abi_support"; then if test -n "$hard_float_abi"; then - with_fp_cond=1 + with_hard_float_abi=1 else - with_fp_cond=0 + with_hard_float_abi=0 fi + else + with_hard_float_abi=1 fi - else - with_fp_cond=0 fi base_machine=csky @@ -55,6 +58,10 @@ _ACEOF cat >>confdefs.h <<_ACEOF #define CSKY_HARD_FLOAT $with_fp_cond +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define CSKY_HARD_FLOAT_ABI $with_hard_float_abi _ACEOF ;; diff --git a/sysdeps/csky/preconfigure.ac b/sysdeps/csky/preconfigure.ac index 332c0f1cab..7412bcef92 100644 --- a/sysdeps/csky/preconfigure.ac +++ b/sysdeps/csky/preconfigure.ac @@ -5,10 +5,8 @@ case "$machine" in csky*) abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __CSKYABI__ \(.*\)/\1/p'` - hard_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | - sed -n 's/^#define __CSKY_HARD_FLOAT__ \(.*\)/\1/p'` - hard_float_sf=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | - sed -n 's/^#define __CSKY_HARD_FLOAT_FPU_SF__ \(.*\)/\1/p'` + soft_float=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | + sed -n 's/^#define __CSKY_SOFT_FLOAT__ \(.*\)/\1/p'` hard_float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __CSKY_HARD_FLOAT_ABI__ \(.*\)/\1/p'` @@ -24,26 +22,26 @@ csky*) ;; esac - # __CSKY_HARD_FLOAT_ABI__ was added on gcc 11 to specify whether - # -mfloat-abi=hard is set. On older gcc, the float ABI is defined solely - # with __CSKY_HARD_FLOAT__. If __CSKY_HARD_FLOAT__ is set, it can be - # either a hard-float ABI (gcc older than 11, or gcc11 -mfloat-abi=hard - # (__CSKY_HARD_FLOAT_ABI__ is set) or -mfloat-abi=softfp - # (__CSKY_HARD_FLOAT_ABI__ is not set). To be compatible with older gcc, - # use __CSKY_HARD_FLOAT_FPU_SF__ identify if -mfloat-abi is supported, - # because it is added to gcc at the same time as -mfloat-abi. - if test -n "$hard_float"; then - if test -z "$hard_float_sf"; then - with_fp_cond=1 - else + if AC_TRY_COMMAND(${CC-cc} -S -mfloat-abi=softfp /dev/null 1>&AS_MESSAGE_LOG_FD); then + soft_float_abi_support=1 + else + soft_float_abi_support=0 + fi + + if test -n "$soft_float"; then + with_fp_cond=0 + with_hard_float_abi=0 + else + with_fp_cond=1 + if test -n "$soft_float_abi_support"; then if test -n "$hard_float_abi"; then - with_fp_cond=1 + with_hard_float_abi=1 else - with_fp_cond=0 + with_hard_float_abi=0 fi + else + with_hard_float_abi=1 fi - else - with_fp_cond=0 fi base_machine=csky @@ -51,5 +49,6 @@ csky*) AC_DEFINE_UNQUOTED([CSKYABI], [$abi]) AC_DEFINE_UNQUOTED([CSKY_HARD_FLOAT], [$with_fp_cond]) + AC_DEFINE_UNQUOTED([CSKY_HARD_FLOAT_ABI], [$with_hard_float_abi]) ;; esac diff --git a/sysdeps/unix/sysv/linux/csky/shlib-versions b/sysdeps/unix/sysv/linux/csky/shlib-versions index 8c026356ef..4ab7d6b83e 100644 --- a/sysdeps/unix/sysv/linux/csky/shlib-versions +++ b/sysdeps/unix/sysv/linux/csky/shlib-versions @@ -1,8 +1,8 @@ DEFAULT GLIBC_2.29 -%if CSKYABI == 2 && CSKY_HARD_FLOAT == 1 +%if CSKYABI == 2 && CSKY_HARD_FLOAT_ABI == 1 ld=ld-linux-cskyv2-hf.so.1 -%elif CSKYABI == 2 && CSKY_HARD_FLOAT == 0 +%elif CSKYABI == 2 && CSKY_HARD_FLOAT_ABI == 0 ld=ld-linux-cskyv2.so.1 %else %error cannot determine ABI