diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config.in | 6 | ||||
-rw-r--r-- | gcc/config/nios2/nios2.h | 40 | ||||
-rwxr-xr-x | gcc/configure | 37 | ||||
-rw-r--r-- | gcc/configure.ac | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/nios2/hello-pie.C | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/nios2/nios2.exp | 34 |
8 files changed, 153 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d1488c..b2031ee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2020-01-31 Sandra Loosemore <sandra@codesourcery.com> + + nios2: Support for GOT-relative DW_EH_PE_datarel encoding. + + * configure.ac [nios2-*-*]: Check HAVE_AS_NIOS2_GOTOFF_RELOCATION. + * config.in: Regenerated. + * configure: Regenerated. + * config/nios2/nios2.h (ASM_PREFERRED_EH_DATA_FORMAT): Fix handling + for PIC when HAVE_AS_NIOS2_GOTOFF_RELOCATION. + (ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX): New. + 2020-02-01 Andrew Burgess <andrew.burgess@embecosm.com> * configure: Regenerate. diff --git a/gcc/config.in b/gcc/config.in index 1110492..4829286 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -571,6 +571,12 @@ #endif +/* Define if your assembler supports %gotoff relocation syntax. */ +#ifndef USED_FOR_TARGET +#undef HAVE_AS_NIOS2_GOTOFF_RELOCATION +#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/nios2/nios2.h b/gcc/config/nios2/nios2.h index 78b538b..e81b928 100644 --- a/gcc/config/nios2/nios2.h +++ b/gcc/config/nios2/nios2.h @@ -494,14 +494,40 @@ do { \ #define EH_RETURN_DATA_REGNO(N) ((N) <= (LAST_ARG_REGNO - FIRST_ARG_REGNO) \ ? (N) + FIRST_ARG_REGNO : INVALID_REGNUM) -/* Nios II has no appropriate relocations for a 32-bit PC-relative or - section-relative pointer encoding. This therefore always chooses an - absolute representation for pointers. An unfortunate consequence of - this is that ld complains about the absolute fde encoding when linking - with -shared or -fpie, but the warning is harmless and there seems to - be no good way to suppress it. */ +/* For PIC, use indirect for global references; it'll end up using a dynamic + relocation, which we want to keep out of read-only EH sections. + For local references, we want to use GOT-relative offsets provided + the assembler supports them. For non-PIC, use an absolute encoding. */ +#ifdef HAVE_AS_NIOS2_GOTOFF_RELOCATION #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ - (flag_pic ? DW_EH_PE_aligned : DW_EH_PE_sdata4) + (flag_pic \ + ? ((GLOBAL) \ + ? DW_EH_PE_indirect | DW_EH_PE_absptr \ + : DW_EH_PE_datarel | DW_EH_PE_sdata4) \ + : DW_EH_PE_absptr) + +#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ + do { \ + if (((ENCODING) & 0xf0) == DW_EH_PE_datarel) \ + { \ + fputs ("\t.4byte %gotoff(", FILE); \ + output_addr_const (FILE, ADDR); \ + fputs (")", FILE); \ + goto DONE; \ + } \ + } while (0) + +#else +/* We don't have %gotoff support in the assembler. Fall back to the encoding + it used to use instead before the assembler was fixed. This has known + bugs but mostly works. */ +#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ + (flag_pic \ + ? ((GLOBAL) \ + ? DW_EH_PE_indirect | DW_EH_PE_absptr \ + : DW_EH_PE_aligned) \ + : DW_EH_PE_absptr) +#endif /* Misc. parameters. */ diff --git a/gcc/configure b/gcc/configure index 4c2c599..5fa565a 100755 --- a/gcc/configure +++ b/gcc/configure @@ -27973,6 +27973,43 @@ $as_echo "#define HAVE_NEWLIB_NANO_FORMATTED_IO 1" >>confdefs.h fi ;; + nios2-*-*) + # Versions 2.33 and earlier lacked support for the %gotoff relocation + # syntax that is documented in the ABI specification. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for support for %gotoff relocations in constant data" >&5 +$as_echo_n "checking assembler for support for %gotoff relocations in constant data... " >&6; } +if ${gcc_cv_as_nios2_gotoff_relocation+:} false; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_nios2_gotoff_relocation=no + if test x$gcc_cv_as != x; then + $as_echo ' .extern foo + .data + .long %gotoff(foo)' > 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_nios2_gotoff_relocation=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_nios2_gotoff_relocation" >&5 +$as_echo "$gcc_cv_as_nios2_gotoff_relocation" >&6; } +if test $gcc_cv_as_nios2_gotoff_relocation = yes; then + +$as_echo "#define HAVE_AS_NIOS2_GOTOFF_RELOCATION 1" >>confdefs.h + +fi + + ;; riscv*-*-*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for .attribute support" >&5 $as_echo_n "checking assembler for .attribute support... " >&6; } diff --git a/gcc/configure.ac b/gcc/configure.ac index a7521ee..671b9a6 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -5032,6 +5032,17 @@ pointers into PC-relative form.]) configured with --enable-newlib-nano-formatted-io.]) fi ;; + nios2-*-*) + # Versions 2.33 and earlier lacked support for the %gotoff relocation + # syntax that is documented in the ABI specification. + gcc_GAS_CHECK_FEATURE([support for %gotoff relocations in constant data], + gcc_cv_as_nios2_gotoff_relocation,,, +[ .extern foo + .data + .long %gotoff(foo)],, + [AC_DEFINE(HAVE_AS_NIOS2_GOTOFF_RELOCATION, 1, + [Define if your assembler supports %gotoff relocation syntax.])]) + ;; riscv*-*-*) gcc_GAS_CHECK_FEATURE([.attribute support], gcc_cv_as_riscv_attribute, [2,32,0],, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4213d1..5902ab6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-01-31 Sandra Loosemore <sandra@codesourcery.com> + + nios2: Support for GOT-relative DW_EH_PE_datarel encoding. + + * g++.target/nios2/hello-pie.C: New. + * g++.target/nios2/nios2.exp: New. + 2020-01-31 David Malcolm <dmalcolm@redhat.com> PR analyzer/93457 diff --git a/gcc/testsuite/g++.target/nios2/hello-pie.C b/gcc/testsuite/g++.target/nios2/hello-pie.C new file mode 100644 index 0000000..ed016f3 --- /dev/null +++ b/gcc/testsuite/g++.target/nios2/hello-pie.C @@ -0,0 +1,14 @@ +// { dg-do run { target *-*-linux* } } +// { dg-options "-pie -fpie" } +// { dg-output "Hello, pie World" } + +// This test used to give an "FDE encoding" error from the linker due to +// the ABI not having appropriate relocations for PIE. + +#include <iostream> + +int +main () +{ + std::cout << "Hello, pie World" << std::endl; +} diff --git a/gcc/testsuite/g++.target/nios2/nios2.exp b/gcc/testsuite/g++.target/nios2/nios2.exp new file mode 100644 index 0000000..a4ff7d0 --- /dev/null +++ b/gcc/testsuite/g++.target/nios2/nios2.exp @@ -0,0 +1,34 @@ +# Copyright (C) 2019 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `dg.exp' driver. + +# Exit immediately if this isn't a nios2 target. +if ![istarget nios2*-*-*] then { + return +} + +# Load support procs. +load_lib g++-dg.exp + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" "" + +# All done. +dg-finish |