Let the user turn off ifunc support at configure time if they want to. Currently, the logic in gcc/autoconf.ac will override the default logic in gcc/config.gcc.
gcc/ChangeLog: * config.gcc: Default-enable ifunc support for RISC-V on Linux. * autoconf.ac: Honor the default_gnu_indirect_function variable. * autoconf: Regenerate. --- gcc/config.gcc | 2 +- gcc/configure | 72 +++++++++++++++++++++++++----------------------- gcc/configure.ac | 72 +++++++++++++++++++++++++----------------------- 3 files changed, 77 insertions(+), 69 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index bc45615741b..012022399f4 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3687,7 +3687,7 @@ case ${target} in ;; *-*-linux* | *-*-gnu*) case ${target} in - aarch64*-* | arm*-* | i[34567]86-* | powerpc*-* | s390*-* | sparc*-* | x86_64-* | loongarch*-*) + aarch64*-* | arm*-* | i[34567]86-* | powerpc*-* | riscv*-* | s390*-* | sparc*-* | x86_64-* | loongarch*-*) default_gnu_indirect_function=yes ;; esac diff --git a/gcc/configure b/gcc/configure index 4faae0fa5fb..874412dc96b 100755 --- a/gcc/configure +++ b/gcc/configure @@ -25907,42 +25907,46 @@ else fi -case "${target}" in - riscv*-*-linux*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker ifunc IRELATIVE support" >&5 +if test $default_gnu_indirect_function = yes; then + case "${target}" in + riscv*-*-linux*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker ifunc IRELATIVE support" >&5 $as_echo_n "checking linker ifunc IRELATIVE support... " >&6; } - cat > conftest.s <<EOF - .text - .type foo_resolver, @function -foo_resolver: - ret - .size foo_resolver, .-foo_resolver - - .globl foo - .type foo, %gnu_indirect_function - .set foo, foo_resolver - - .globl bar - .type bar, @function -bar: - call foo - ret - .size bar, .-bar -EOF - if test x$gcc_cv_as != x \ - && test x$gcc_cv_ld != x \ - && test x$gcc_cv_readelf != x \ - && $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \ - && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \ - && $gcc_cv_readelf --relocs --wide conftest \ - | grep R_RISCV_IRELATIVE > /dev/null 2>&1; then - enable_gnu_indirect_function=yes - fi - rm -f conftest conftest.o conftest.s - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gnu_indirect_function" >&5 + cat > conftest.s <<EOF + .text + .type foo_resolver, @function + foo_resolver: + ret + .size foo_resolver, .-foo_resolver + + .globl foo + .type foo, %gnu_indirect_function + .set foo, foo_resolver + + .globl bar + .type bar, @function + bar: + call foo + ret + .size bar, .-bar + EOF + if test x$gcc_cv_as != x \ + && test x$gcc_cv_ld != x \ + && test x$gcc_cv_readelf != x \ + && $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \ + && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \ + && $gcc_cv_readelf --relocs --wide conftest \ + | grep R_RISCV_IRELATIVE > /dev/null 2>&1; then + enable_gnu_indirect_function=yes + else + enable_gnu_indirect_function=no + fi + rm -f conftest conftest.o conftest.s + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gnu_indirect_function" >&5 $as_echo "$enable_gnu_indirect_function" >&6; } - ;; -esac + ;; + esac +fi gif=`if test x$enable_gnu_indirect_function = xyes; then echo 1; else echo 0; fi` diff --git a/gcc/configure.ac b/gcc/configure.ac index 3da1eaa7064..4f90a974c6b 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3072,40 +3072,44 @@ Valid choices are 'yes' and 'no'.]) ;; esac], [enable_gnu_indirect_function="$default_gnu_indirect_function"]) -case "${target}" in - riscv*-*-linux*) - AC_MSG_CHECKING(linker ifunc IRELATIVE support) - cat > conftest.s <<EOF - .text - .type foo_resolver, @function -foo_resolver: - ret - .size foo_resolver, .-foo_resolver - - .globl foo - .type foo, %gnu_indirect_function - .set foo, foo_resolver - - .globl bar - .type bar, @function -bar: - call foo - ret - .size bar, .-bar -EOF - if test x$gcc_cv_as != x \ - && test x$gcc_cv_ld != x \ - && test x$gcc_cv_readelf != x \ - && $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \ - && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \ - && $gcc_cv_readelf --relocs --wide conftest \ - | grep R_RISCV_IRELATIVE > /dev/null 2>&1; then - enable_gnu_indirect_function=yes - fi - rm -f conftest conftest.o conftest.s - AC_MSG_RESULT($enable_gnu_indirect_function) - ;; -esac +if test $default_gnu_indirect_function = yes; then + case "${target}" in + riscv*-*-linux*) + AC_MSG_CHECKING(linker ifunc IRELATIVE support) + cat > conftest.s <<EOF + .text + .type foo_resolver, @function + foo_resolver: + ret + .size foo_resolver, .-foo_resolver + + .globl foo + .type foo, %gnu_indirect_function + .set foo, foo_resolver + + .globl bar + .type bar, @function + bar: + call foo + ret + .size bar, .-bar + EOF + if test x$gcc_cv_as != x \ + && test x$gcc_cv_ld != x \ + && test x$gcc_cv_readelf != x \ + && $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \ + && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \ + && $gcc_cv_readelf --relocs --wide conftest \ + | grep R_RISCV_IRELATIVE > /dev/null 2>&1; then + enable_gnu_indirect_function=yes + else + enable_gnu_indirect_function=no + fi + rm -f conftest conftest.o conftest.s + AC_MSG_RESULT($enable_gnu_indirect_function) + ;; + esac +fi gif=`if test x$enable_gnu_indirect_function = xyes; then echo 1; else echo 0; fi` AC_DEFINE_UNQUOTED(HAVE_GNU_INDIRECT_FUNCTION, $gif, -- 2.34.1