diff mbox series

Don't force-enable ifuncs on RISC-V

Message ID CAHXVFW===byiJP=15Jws_a6Vcfj5pFC_mE3_dshBhADExfjdPg@mail.gmail.com
State New
Headers show
Series Don't force-enable ifuncs on RISC-V | expand

Commit Message

Maxim Blinov July 18, 2024, 10:09 a.m. UTC
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(-)

 AC_DEFINE_UNQUOTED(HAVE_GNU_INDIRECT_FUNCTION, $gif,
--
2.34.1

Comments

Andreas Schwab July 18, 2024, 10:37 a.m. UTC | #1
On Jul 18 2024, Maxim Blinov wrote:

> +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

That should actually set default_gnu_indirect_function instead of
enable_gnu_indirect_function, and moved before the check for the
--enable-gnu-indirect-function option.  Otherwise
--disable-gnu-indirect-function still won't work as expected.
Jeff Law July 18, 2024, 6:25 p.m. UTC | #2
On 7/18/24 4:09 AM, Maxim Blinov wrote:
> 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.
Why should risc-v be treated differently than the other ports?

jeff
Jeff Law July 18, 2024, 6:26 p.m. UTC | #3
On 7/18/24 12:25 PM, Jeff Law wrote:
> 
> 
> On 7/18/24 4:09 AM, Maxim Blinov wrote:
>> 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.
> Why should risc-v be treated differently than the other ports?
Nevermind.  I may have read that incorrectly.

jeff
diff mbox series

Patch

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`