diff options
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 c2886ee755..7788866307 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 e731ea9b7d..f5fe659130 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 58626970fa..cb9e5bb3df 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 5eee4f8abf..5a08027d43 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 6d5bd2ee01..9d59e054ec 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 cc22b0bf36..30d0df6202 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 08105f8841..c172ba3d27 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 } |