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.
This commit is contained in:
Nick Clifton 2021-12-16 16:40:57 +00:00
parent 61ab1364c7
commit f3be70df1b
11 changed files with 61 additions and 12 deletions

View File

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

View File

@ -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;
}

View File

@ -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 *);

View File

@ -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 *-*-*

View File

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

View File

@ -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\]:

View File

@ -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
}

View File

@ -1,3 +1,10 @@
2021-12-16 Nick Clifton <nickc@redhat.com>
PR 28686
* testsuite/ld-avr/avr-prop-7.d: Adjust expected output.
* testsuite/ld-avr/avr-prop-8.d: Likewise.
* testsuite/ld-avr/pr13402.d: Likewise.
2021-11-30 Nick Clifton <nickc@redhat.com>
* scripttempl/pru.sc (.pru_irq_map): Define output section.

View File

@ -9,7 +9,7 @@
00000000 <__ctors_end>:
0: 04 d0 rcall .+8 ; 0xa <foo>
2: 00 00 nop
4: 00 00 nop
6: 86 e0 ldi r24, 0x06 ; 6
8: f0 f7 brcc .-4 ; 0x6 <__ctors_end\+0x6>
#...
6: 86 e0 ldi r24, 0x06 ; 6
8: f0 f7 brcc .-4 ; 0x6 <.*>
#...

View File

@ -9,5 +9,6 @@
00000000 <__ctors_end>:
0: ff cf rjmp .-2 ; 0x0 <__ctors_end>
2: fe df rcall .-4 ; 0x0 <__ctors_end>
4: f8 f7 brcc .-2 ; 0x4 <__ctors_end\+0x4>
#...
4: f8 f7 brcc .-2 ; 0x4 <.*>
#...

View File

@ -8,9 +8,11 @@
#...
main:
call a
0: 02 d0 rcall .+4 ; 0x6 <_etext>
call b
2: 01 d0 rcall .+2 ; 0x6 <_etext>
0: 02 d0 rcall .+4 ; 0x6 <_etext>
#...
call c
2: 01 d0 rcall .+2 ; 0x6 <_etext>
#...
4: 00 d0 rcall .+0 ; 0x6 <_etext>
#...