diff options
author | Nick Clifton <nickc@redhat.com> | 2021-12-16 16:40:57 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2021-12-16 16:40:57 +0000 |
commit | f3be70df1b1681ad1b9b0490587011bde433d220 (patch) | |
tree | 1d1938d029b210dc78c70ce4fba57a254add490b /gas | |
parent | 61ab1364c7efa3934e0ca62af444e6e6e34f219e (diff) | |
download | binutils-f3be70df1b1681ad1b9b0490587011bde433d220.zip binutils-f3be70df1b1681ad1b9b0490587011bde433d220.tar.gz binutils-f3be70df1b1681ad1b9b0490587011bde433d220.tar.bz2 |
Fix AVR assembler so that it creates relocs that will work with linker relaxation.
PR 28686
gas * config/tc-avr.h (tc_fix_adjustable): Define.
* config/tc-avr.c (avr_fix_adjustable): New function.
* testsuite/gas/all/gas.exp: Skip tests that need adjustable fixups.
* testsuite/gas/elf/elf.exp: Likewise.
* testsuite/gas/avr/diffreloc_withrelax.d: Adjust expected output.
* testsuite/gas/avr/pc-relative-reloc.d: Adjust expected output.
ld * testsuite/ld-avr/avr-prop-7.d: Adjust expected output.
* testsuite/ld-avr/avr-prop-8.d: Likewise.
* testsuite/ld-avr/pr13402.d: Likewise.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 10 | ||||
-rw-r--r-- | gas/config/tc-avr.c | 26 | ||||
-rw-r--r-- | gas/config/tc-avr.h | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/all/gas.exp | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/avr/diffreloc_withrelax.d | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/avr/pc-relative-reloc.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/elf.exp | 2 |
7 files changed, 45 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index c2886ee..7788866 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2021-12-16 Nick Clifton <nickc@redhat.com> + + PR 28686 + * config/tc-avr.h (tc_fix_adjustable): Define. + * config/tc-avr.c (avr_fix_adjustable): New function. + * testsuite/gas/all/gas.exp: Skip tests that need adjustable fixups. + * testsuite/gas/elf/elf.exp: Likewise. + * testsuite/gas/avr/diffreloc_withrelax.d: Adjust expected output. + * testsuite/gas/avr/pc-relative-reloc.d: Adjust expected output. + 2021-11-26 Tom de Vries <tdevries@suse.de> PR 28629 diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index e731ea9..f5fe659 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -2820,3 +2820,29 @@ avr_pre_output_hook (void) if (avr_opt.have_gccisr) bfd_map_over_sections (stdoutput, avr_check_gccisr_done, NULL); } + +/* Return false if the fixup in fixp should be left alone and not + adjusted. */ + +bool +avr_fix_adjustable (struct fix *fixp) +{ + if (! linkrelax || fixp->fx_addsy == NULL) + return true; + + /* Do not adjust relocations involving symbols in code sections, + because it breaks linker relaxations. This could be fixed in the + linker, but this fix is simpler, and it pretty much only affects + object size a little bit. */ + if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE) + return false; + + /* Likewise, do not adjust symbols that won't be merged, or debug + symbols, because they too break relaxation. We do want to adjust + other mergeable symbols, like .rodata, because code relaxations + need section-relative symbols to properly relax them. */ + if (! (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE)) + return false; + + return true; +} diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h index 5862697..cb9e5bb 100644 --- a/gas/config/tc-avr.h +++ b/gas/config/tc-avr.h @@ -247,3 +247,6 @@ extern void avr_frag_init (fragS *); #define tc_line_separator_chars avr_line_separator_chars extern const char *avr_line_separator_chars; + +#define tc_fix_adjustable(FIX) avr_fix_adjustable (FIX) +extern bool avr_fix_adjustable (struct fix *); diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 5eee4f8..5a08027 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -166,11 +166,11 @@ switch -glob $target_triplet { # symbols on relocs. setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*" "rl78-*-*" setup_xfail "riscv*-*-*" "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*" - setup_xfail "loongarch*-*-*" + setup_xfail "loongarch*-*-*" "avr-*-*" run_dump_test redef2 setup_xfail "m68hc1*-*-*" "m6811-*-*" "m6812-*-*" "rl78-*-*" setup_xfail "riscv*-*-*" "rx-*-*" "vax*-*-*" "xgate*-*-*" "z8k-*-*" - setup_xfail "loongarch*-*-*" + setup_xfail "loongarch*-*-*" "avr-*-*" # rs6000-aix disallows redefinition via .comm. if [is_xcoff_format] { setup_xfail *-*-* diff --git a/gas/testsuite/gas/avr/diffreloc_withrelax.d b/gas/testsuite/gas/avr/diffreloc_withrelax.d index 6d5bd2e..9d59e05 100644 --- a/gas/testsuite/gas/avr/diffreloc_withrelax.d +++ b/gas/testsuite/gas/avr/diffreloc_withrelax.d @@ -8,9 +8,9 @@ RELOCATION RECORDS FOR \[.text\]: OFFSET TYPE VALUE -00000000 R_AVR_CALL .text +00000000 R_AVR_CALL L1 RELOCATION RECORDS FOR \[.data\]: OFFSET TYPE VALUE -00000000 R_AVR_DIFF16 .text\+0x00000004 +00000000 R_AVR_DIFF16 L2 diff --git a/gas/testsuite/gas/avr/pc-relative-reloc.d b/gas/testsuite/gas/avr/pc-relative-reloc.d index cc22b0b..30d0df6 100644 --- a/gas/testsuite/gas/avr/pc-relative-reloc.d +++ b/gas/testsuite/gas/avr/pc-relative-reloc.d @@ -12,7 +12,7 @@ RELOCATION RECORDS FOR \[.text.main\]: RELOCATION RECORDS FOR \[.debug_line\]: OFFSET TYPE VALUE -00000000 R_AVR_32_PCREL .debug_line_end-0x00000004 +00000000 R_AVR_32_PCREL .Ldebug_line_end-0x00000004 RELOCATION RECORDS FOR \[.debug_line.text.main\]: diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 08105f8..c172ba3 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -184,7 +184,7 @@ if { [is_elf_format] } then { # against ordinary symbols into relocations against section symbols. # This is usually revealed by the error message: # symbol `sym' required but not present - setup_xfail "m681*-*-*" "m68hc*-*-*" "xgate-*-*" "vax-*-*" + setup_xfail "m681*-*-*" "m68hc*-*-*" "xgate-*-*" "vax-*-*" "avr-*-*" run_dump_test redef run_dump_test equ-reloc } |