This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RE: [PATCH][4.9] PR 64569 - Backport support for MIPS binutils 2.25
- From: Matthew Fortune <Matthew dot Fortune at imgtec dot com>
- To: "'gcc-patches at gcc dot gnu dot org' (gcc-patches at gcc dot gnu dot org)" <gcc-patches at gcc dot gnu dot org>
- Cc: "Moore, Catherine (Catherine_Moore at mentor dot com)" <Catherine_Moore at mentor dot com>
- Date: Mon, 26 Jan 2015 16:30:13 +0000
- Subject: RE: [PATCH][4.9] PR 64569 - Backport support for MIPS binutils 2.25
- Authentication-results: sourceware.org; auth=none
> This is a minimal backport of features added to GCC 5 to enable use
> of binutils 2.25 with GCC 4.9 for MIPS soft-float builds. Further
> details in the PR:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64569
>
> The commits which are being backported are listed below (the last
> one is posted but not committed yet).
>
> r213870: Fix mips16.S for soft-float
> r213872: Pass -m(soft|hard|single|double)-float via ASM_SPEC
> r217446: Implement o32 FPXX (very minimal backport)
> r217939: Update configure check for HAVE_MIPS_DOT_MODULE
> r??????: Make ASM_SPEC changes conditional on HAVE_MIPS_DOT_MODULE
Updated - The last one in the list is committed as:
r219867: MIPS: Only pass floating-point options to the assembler when necessary
I'm not sure who to CC as RM for GCC 4.9.
Thanks,
Matthew
>
> gcc/
> * config.in [!USED_FOR_TARGET] (HAVE_AS_DOT_MODULE): Undefine.
> * config/mips/mips.h (FP_ASM_SPEC): New macro.
> (ASM_SPEC): Use FP_ASM_SPEC.
> * configure.ac (HAVE_AS_DOT_MODULE): Detect support for .module
> and FPXX extensions.
>
> libgcc/
> * config/mips/mips16.S: Do not build for soft-float.
>
> Once this is done I will do the same backport for GCC 4.8.
>
> Tested to check that soft-float builds work with binutils 2.25 and
> the floating-point options are not passed for binutils 2.24.
>
> Thanks,
> Matthew
>
> ---
> gcc/config.in | 6 ++++++
> gcc/config/mips/mips.h | 19 ++++++++++++++++++-
> gcc/configure | 32 ++++++++++++++++++++++++++++++++
> gcc/configure.ac | 7 +++++++
> libgcc/config/mips/mips16.S | 10 +++++++---
> 5 files changed, 70 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/config.in b/gcc/config.in
> index 1e85325..013a606 100644
> --- a/gcc/config.in
> +++ b/gcc/config.in
> @@ -447,6 +447,12 @@
> #endif
>
>
> +/* Define if the assembler understands .module. */
> +#ifndef USED_FOR_TARGET
> +#undef HAVE_AS_DOT_MODULE
> +#endif
> +
> +
> /* Define if your assembler supports the -no-mul-bug-abort option. */
> #ifndef USED_FOR_TARGET
> #undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION
> diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
> index a786d4c..ff88d98 100644
> --- a/gcc/config/mips/mips.h
> +++ b/gcc/config/mips/mips.h
> @@ -1163,6 +1163,22 @@ struct mips_cpu_info {
> #define SUBTARGET_ASM_SPEC ""
> #endif
>
> +/* FP_ASM_SPEC represents the floating-point options that must be passed
> + to the assembler when FPXX support exists. Prior to that point the
> + assembler could accept the options but were not required for
> + correctness. We only add the options when absolutely necessary
> + because passing -msoft-float to the assembler will cause it to reject
> + all hard-float instructions which may require some user code to be
> + updated. */
> +
> +#ifdef HAVE_AS_DOT_MODULE
> +#define FP_ASM_SPEC "\
> +%{mhard-float} %{msoft-float} \
> +%{msingle-float} %{mdouble-float}"
> +#else
> +#define FP_ASM_SPEC
> +#endif
> +
> #undef ASM_SPEC
> #define ASM_SPEC "\
> %{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} \
> @@ -1188,7 +1204,8 @@ struct mips_cpu_info {
> %{mfp32} %{mfp64} %{mnan=*} \
> %{mshared} %{mno-shared} \
> %{msym32} %{mno-sym32} \
> -%{mtune=*} \
> +%{mtune=*}" \
> +FP_ASM_SPEC "\
> %(subtarget_asm_spec)"
>
> /* Extra switches sometimes passed to the linker. */
> diff --git a/gcc/configure b/gcc/configure
> index 291e463..d5b6879 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -26140,6 +26140,38 @@ $as_echo "#define HAVE_AS_GNU_ATTRIBUTE 1"
> >>confdefs.h
>
> fi
>
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for
> .module support" >&5
> +$as_echo_n "checking assembler for .module support... " >&6; }
> +if test "${gcc_cv_as_mips_dot_module+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> + gcc_cv_as_mips_dot_module=no
> + if test x$gcc_cv_as != x; then
> + $as_echo '.module mips2
> + .module fp=xx' > conftest.s
> + if { ac_try='$gcc_cv_as $gcc_cv_as_flags -32 -o conftest.o conftest.s
> >&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
> + gcc_cv_as_mips_dot_module=yes
> + else
> + echo "configure: failed program was" >&5
> + cat conftest.s >&5
> + fi
> + rm -f conftest.o conftest.s
> + fi
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> $gcc_cv_as_mips_dot_module" >&5
> +$as_echo "$gcc_cv_as_mips_dot_module" >&6; }
> +if test $gcc_cv_as_mips_dot_module = yes; then
> +
> +$as_echo "#define HAVE_AS_DOT_MODULE 1" >>confdefs.h
> +
> +fi
> +
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for
> .micromips support" >&5
> $as_echo_n "checking assembler for .micromips support... " >&6; }
> if test "${gcc_cv_as_micromips_support+set}" = set; then :
> diff --git a/gcc/configure.ac b/gcc/configure.ac
> index b9a3799..ded0c48 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -4251,6 +4251,13 @@ LCF0:
> [AC_DEFINE(HAVE_AS_GNU_ATTRIBUTE, 1,
> [Define if your assembler supports .gnu_attribute.])])
>
> + gcc_GAS_CHECK_FEATURE([.module support],
> + gcc_cv_as_mips_dot_module,,[-32],
> + [.module mips2
> + .module fp=xx],,
> + [AC_DEFINE(HAVE_AS_DOT_MODULE, 1,
> + [Define if your assembler supports .module.])])
> +
> gcc_GAS_CHECK_FEATURE([.micromips support],
> gcc_cv_as_micromips_support,,[--fatal-warnings],
> [.set micromips],,
> diff --git a/libgcc/config/mips/mips16.S b/libgcc/config/mips/mips16.S
> index 6a43a98..dde8939 100644
> --- a/libgcc/config/mips/mips16.S
> +++ b/libgcc/config/mips/mips16.S
> @@ -21,8 +21,12 @@ a copy of the GCC Runtime Library Exception along with
> this program;
> see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef __mips_micromips
> - /* DO NOTHING */
> +#if defined(__mips_micromips) || defined(__mips_soft_float)
> + /* Do nothing because this code is only needed when linking
> + against mips16 hard-float objects. Neither micromips code
> + nor soft-float code can be linked against mips16 hard-float
> + objects so we do not need these routines when building libgcc
> + for those cases. */
> #else
>
> /* This file contains mips16 floating point support functions. These
> @@ -749,4 +753,4 @@ CALL_STUB_RET (__mips16_call_stub_dc_10, 10, DC)
> #endif /* !__mips_single_float */
>
> #endif
> -#endif /* __mips_micromips */
> +#endif /* defined(__mips_micromips) || defined(__mips_soft_float) */
> --
> 2.2.1