diff --git a/gcc/config.in b/gcc/config.in index 0509ba7e6a799df7cc649dff2d82317e88f99b14..866f9fff10189fe690151d85c69332ea64dc5065 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -386,6 +386,12 @@ #endif +/* Define if your assembler supports conditional branch relaxation. */ +#ifndef USED_FOR_TARGET +#undef HAVE_AS_COND_BRANCH_RELAXATION +#endif + + /* Define if your assembler supports the --debug-prefix-map option. */ #ifndef USED_FOR_TARGET #undef HAVE_AS_DEBUG_PREFIX_MAP @@ -820,6 +826,20 @@ #endif +/* Define to 1 if you have the Mac OS X function + CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ +#ifndef USED_FOR_TARGET +#undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES +#endif + + +/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#ifndef USED_FOR_TARGET +#undef HAVE_CFPREFERENCESCOPYAPPVALUE +#endif + + /* Define to 1 if you have the `clearerr_unlocked' function. */ #ifndef USED_FOR_TARGET #undef HAVE_CLEARERR_UNLOCKED @@ -844,6 +864,13 @@ #endif +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#ifndef USED_FOR_TARGET +#undef HAVE_DCGETTEXT +#endif + + /* Define to 1 if we found a declaration for 'abort', otherwise define to 0. */ #ifndef USED_FOR_TARGET @@ -1516,6 +1543,12 @@ #endif +/* Define if the GNU gettext() function is already present or preinstalled. */ +#ifndef USED_FOR_TARGET +#undef HAVE_GETTEXT +#endif + + /* Define to 1 if you have the `gettimeofday' function. */ #ifndef USED_FOR_TARGET #undef HAVE_GETTIMEOFDAY @@ -1547,7 +1580,7 @@ #endif -/* Define if you have the iconv() function. */ +/* Define if you have the iconv() function and it works. */ #ifndef USED_FOR_TARGET #undef HAVE_ICONV #endif diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in index e1fe0c7086ead8877289cc157e970fb7fd5f8b35..158701d327a7d09e5373e5985153be9a08b5263f 100644 --- a/gcc/config/loongarch/genopts/loongarch.opt.in +++ b/gcc/config/loongarch/genopts/loongarch.opt.in @@ -223,10 +223,14 @@ Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0) Avoid using the GOT to access external symbols. mrelax -Target Var(loongarch_mrelax) Init(HAVE_AS_MRELAX_OPTION) +Target Var(loongarch_mrelax) Init(HAVE_AS_MRELAX_OPTION && HAVE_AS_COND_BRANCH_RELAXATION) Take advantage of linker relaxations to reduce the number of instructions required to materialize symbol addresses. +mpass-mrelax-to-as +Target Var(loongarch_pass_mrelax_to_as) Init(HAVE_AS_MRELAX_OPTION) +Pass -mrelax or -mno-relax option to the assembler. + -param=loongarch-vect-unroll-limit= Target Joined UInteger Var(loongarch_vect_unroll_limit) Init(6) IntegerRange(1, 64) Param Used to limit unroll factor which indicates how much the autovectorizer may diff --git a/gcc/config/loongarch/loongarch-driver.h b/gcc/config/loongarch/loongarch-driver.h index d859afcc9fee737fa23daf10dfcb7c8fe0ef9a4e..20d233cc938bf27711e1290527ec59e6ebf7cefa 100644 --- a/gcc/config/loongarch/loongarch-driver.h +++ b/gcc/config/loongarch/loongarch-driver.h @@ -51,9 +51,23 @@ along with GCC; see the file COPYING3. If not see "%{G*} %{,ada:-gnatea %{mabi=*} -gnatez} " \ "%(subtarget_cc1_spec)" +#if HAVE_AS_MRELAX_OPTION && HAVE_AS_COND_BRANCH_RELAXATION +#define ASM_MRELAX_DEFAULT "%{!mrelax:%{!mno-relax:-mrelax}}" +#else +#define ASM_MRELAX_DEFAULT "%{!mrelax:%{!mno-relax:-mno-relax}}" +#endif + +#if HAVE_AS_MRELAX_OPTION +#define ASM_MRELAX_SPEC \ + "%{!mno-pass-mrelax-to-as:%{mrelax} %{mno-relax} " ASM_MRELAX_DEFAULT "}" +#else +#define ASM_MRELAX_SPEC \ + "%{mpass-mrelax-to-as:%{mrelax} %{mno-relax} " ASM_MRELAX_DEFAULT "}" +#endif + #undef ASM_SPEC #define ASM_SPEC \ - "%{mabi=*} %{mno-relax} %(subtarget_asm_spec)" + "%{mabi=*} " ASM_MRELAX_SPEC " %(subtarget_asm_spec)" extern const char* diff --git a/gcc/config/loongarch/loongarch-opts.h b/gcc/config/loongarch/loongarch-opts.h index f204828015e1bb0912395df6405104dfedf0a4bb..8de41bbc4f782081a397141258f37f8cc46ca85f 100644 --- a/gcc/config/loongarch/loongarch-opts.h +++ b/gcc/config/loongarch/loongarch-opts.h @@ -101,6 +101,10 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target, #define HAVE_AS_MRELAX_OPTION 0 #endif +#ifndef HAVE_AS_COND_BRANCH_RELAXATION +#define HAVE_AS_COND_BRANCH_RELAXATION 0 +#endif + #ifndef HAVE_AS_TLS #define HAVE_AS_TLS 0 #endif diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 0a2db8452a3fb4b2c8023f893da6eb376680848c..2998bf740d4b7f2baa455898dbcb62fb10a1b51b 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -7432,7 +7432,7 @@ loongarch_option_override_internal (struct gcc_options *opts, if (la_opt_explicit_relocs == M_OPT_UNSET) la_opt_explicit_relocs = (HAVE_AS_EXPLICIT_RELOCS - ? (HAVE_AS_MRELAX_OPTION + ? (loongarch_mrelax ? EXPLICIT_RELOCS_AUTO : EXPLICIT_RELOCS_ALWAYS) : EXPLICIT_RELOCS_NONE); diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt index 0294660832747a0c81e3746f3e7a8713f27b0738..a5988411fbb2fdb2c8d0097062b1ff403b00bcab 100644 --- a/gcc/config/loongarch/loongarch.opt +++ b/gcc/config/loongarch/loongarch.opt @@ -230,10 +230,14 @@ Target Var(TARGET_DIRECT_EXTERN_ACCESS) Init(0) Avoid using the GOT to access external symbols. mrelax -Target Var(loongarch_mrelax) Init(HAVE_AS_MRELAX_OPTION) +Target Var(loongarch_mrelax) Init(HAVE_AS_MRELAX_OPTION && HAVE_AS_COND_BRANCH_RELAXATION) Take advantage of linker relaxations to reduce the number of instructions required to materialize symbol addresses. +mpass-mrelax-to-as +Target Var(loongarch_pass_mrelax_to_as) Init(HAVE_AS_MRELAX_OPTION) +Pass -mrelax or -mno-relax option to the assembler. + -param=loongarch-vect-unroll-limit= Target Joined UInteger Var(loongarch_vect_unroll_limit) Init(6) IntegerRange(1, 64) Param Used to limit unroll factor which indicates how much the autovectorizer may diff --git a/gcc/configure b/gcc/configure index c37cae7331a228285ea2fa3dda3670a808918c1e..ee97934ac4f6458c4ec4f84b7ed51ed224b14a4f 100755 --- a/gcc/configure +++ b/gcc/configure @@ -31016,6 +31016,41 @@ if test $gcc_cv_as_loongarch_relax = yes; then $as_echo "#define HAVE_AS_MRELAX_OPTION 1" >>confdefs.h +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for conditional branch relaxation support" >&5 +$as_echo_n "checking assembler for conditional branch relaxation support... " >&6; } +if ${gcc_cv_as_loongarch_cond_branch_relax+:} false; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_loongarch_cond_branch_relax=no + if test x$gcc_cv_as != x; then + $as_echo 'a: + .rept 32769 + nop + .endr + beq $a0,$a1,a' > conftest.s + if { ac_try='$gcc_cv_as $gcc_cv_as_flags -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_loongarch_cond_branch_relax=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_loongarch_cond_branch_relax" >&5 +$as_echo "$gcc_cv_as_loongarch_cond_branch_relax" >&6; } +if test $gcc_cv_as_loongarch_cond_branch_relax = yes; then + +$as_echo "#define HAVE_AS_COND_BRANCH_RELAXATION 1" >>confdefs.h + fi ;; diff --git a/gcc/configure.ac b/gcc/configure.ac index 764a33f0b0446d59ffa7ff7321c9cc9f53c349f7..d0caf820648e791272e91ac3eb14a62d034e8629 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -5453,6 +5453,16 @@ x: [-mrelax], [.text],, [AC_DEFINE(HAVE_AS_MRELAX_OPTION, 1, [Define if your assembler supports -mrelax option.])]) + gcc_GAS_CHECK_FEATURE([conditional branch relaxation support], + gcc_cv_as_loongarch_cond_branch_relax, + [], + [a: + .rept 32769 + nop + .endr + beq $a0,$a1,a],, + [AC_DEFINE(HAVE_AS_COND_BRANCH_RELAXATION, 1, + [Define if your assembler supports conditional branch relaxation.])]) ;; s390*-*-*) gcc_GAS_CHECK_FEATURE([.gnu_attribute support], diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index f1a5722675fa8bc8fdb409e56260476d9b1f7994..2d30a5d47672716ed7cebc0464180f1f6e54ccf3 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -1045,7 +1045,7 @@ Objective-C and Objective-C++ Dialects}. -mmax-inline-memcpy-size=@var{n} -mexplicit-relocs=@var{style} -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mno-direct-extern-access --mcmodel=@var{code-model}} +-mcmodel=@var{code-model} -mrelax -mpass-mrelax-to-as} @emph{M32R/D Options} @gccoptlist{-m32r2 -m32rx -m32r @@ -26356,16 +26356,14 @@ with @option{-mexplicit-relocs=always} the assembler relocation operators are always used, with @option{-mexplicit-relocs=auto} the compiler will use the relocation operators where the linker relaxation is impossible to improve the code quality, and macros elsewhere. The default -value for the option is determined during GCC build-time by detecting -corresponding assembler support: +value for the option is determined with the assembler capability detected +during GCC build-time and the setting of @option{-mrelax}: @option{-mexplicit-relocs=none} if the assembler does not support relocation operators at all, @option{-mexplicit-relocs=always} if the assembler supports relocation -operators but does not support relaxation, -@option{-mexplicit-relocs=auto} if the assembler supports both relocation -operators and relaxation. This option is mostly useful for -debugging, or interoperation with assemblers different from the build-time -one. +operators but @option{-mrelax} is not enabled, +@option{-mexplicit-relocs=auto} if the assembler supports relocation +operators and @option{-mrelax} is enabled. @opindex mexplicit-relocs @item -mexplicit-relocs @@ -26389,6 +26387,28 @@ kernels, executables linked with @option{-static} or @option{-static-pie}. @option{-mdirect-extern-access} is not compatible with @option{-fPIC} or @option{-fpic}. +@item -mrelax +@itemx -mno-relax +Take (do not take) advantage of linker relaxations. If +@option{-mpass-mrelax-to-as} is enabled, this option is also passed to +the assembler. The default is determined during GCC build-time by +detecting corresponding assembler support: +@option{-mrelax} if the assembler supports both the @option{-mrelax} +option and the conditional branch relaxation (it's required or the +@code{.align} directives and conditional branch instructions in the +assembly code outputted by GCC may be rejected by the assembler because +of a relocation overflow), @option{-mno-relax} otherwise. + +@item -mpass-mrelax-to-as +@itemx -mno-pass-mrelax-to-as +Pass (do not pass) the @option{-mrelax} or @option{-mno-relax} option +to the assembler. The default is determined during GCC build-time by +detecting corresponding assembler support: +@option{-mpass-mrelax-to-as} if the assembler supports the +@option{-mrelax} option, @option{-mno-pass-mrelax-to-as} otherwise. +This option is mostly useful for debugging, or interoperation with +assemblers different from the build-time one. + @item loongarch-vect-unroll-limit The vectorizer will use available tuning information to determine whether it would be beneficial to unroll the main vectorized loop and by how much. This