diff options
author | Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> | 2017-04-24 15:17:14 +0530 |
---|---|---|
committer | Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> | 2017-05-04 10:34:29 +0530 |
commit | b660e9eb7a45cfe99e719c5d16af35913a2fdc96 (patch) | |
tree | 3b4b2285e27d3ab355596ce85d0bf138f2c078dc /ld | |
parent | 8293e73636484b403150ae94a93619779bcbae96 (diff) | |
download | gdb-b660e9eb7a45cfe99e719c5d16af35913a2fdc96.zip gdb-b660e9eb7a45cfe99e719c5d16af35913a2fdc96.tar.gz gdb-b660e9eb7a45cfe99e719c5d16af35913a2fdc96.tar.bz2 |
Fix PR21404 - assertion fail when calculating symbol size
Fix a host of problems related to adjustment of
symbol values and sizes when relaxing for avr.
1. Adjust symbol size first before adjusting symbol
value. Otherwise, a symbol whose value just got adjusted to the
relaxed address also ends up getting resized. See pr21404-1.s.
2. Reduce symbol sizes only if their span is below an
alignment boundary. Otherwise, the size gets decremented once when the
actual instruction is relaxed and padding bytes are added, and again
when the padding bytes are deleted (if padding ends up being unnecessary).
pr21404-2.s addresses that, and this bug is really the root cause of PR21404.
3. Adjust all symbol values before an alignment boundary.
Previous code did not adjust symbol values if they fell in the
would-be padded area, resulting in incorrect symbol values in some
cases (see pr21404-3.s).
4. Increase symbol sizes if alignment directives require so.
As pr21404-4.s shows
.global nonzero_sym
L1:
jmp L1
nonzero_sym:
nop
nop
.p2align 2
.size nonzero_sym, .-nonzero_sym
The two nops satisfy the 4 byte alignment at assembly time and
therefore the size of nonzero_sym is 4. Relaxation shortens
the 4 byte jmp to a 2 byte rjmp, and to satisfy 4 byte alignment
the code places 2 extra padding bytes after the nops, increasing
nonzero_sym's size by 2. This wasn't handled before.
If the assembly code does not have any align directives, then the
boundary is the section size, and symbol values and sizes == boundary
should also get adjusted. To handle that case, add a did_pad variable
and use that to determine whether it should use < boundary or <= boundary.
Also get rid of reloc_toaddr, which is now redundant. toaddr is now not
adjusted to handle the above case - the newly added
did_pad variable does the job.
pr21404-{5,6,7,8} are the same testcases written for local symbols, as
the code handles them slightly differently.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 20 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-1.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-1.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-2.d | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-2.s | 25 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-3.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-3.s | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-4.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-4.s | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-5.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-5.s | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-6.d | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-6.s | 19 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-7.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-7.s | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-8.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-avr/pr21404-8.s | 9 |
17 files changed, 217 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 324ab9d..8318173 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,23 @@ +2017-04-28 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> + + PR ld/21404 + * testsuite/ld-avr/pr21404-1.d: New test. + * testsuite/ld-avr/pr21404-1.s: New test. + * testsuite/ld-avr/pr21404-2.d: New test. + * testsuite/ld-avr/pr21404-2.s: New test. + * testsuite/ld-avr/pr21404-3.d: New test. + * testsuite/ld-avr/pr21404-3.s: New test. + * testsuite/ld-avr/pr21404-4.d: New test. + * testsuite/ld-avr/pr21404-4.s: New test. + * testsuite/ld-avr/pr21404-5.d: New test. + * testsuite/ld-avr/pr21404-5.s: New test. + * testsuite/ld-avr/pr21404-6.d: New test. + * testsuite/ld-avr/pr21404-6.s: New test. + * testsuite/ld-avr/pr21404-7.d: New test. + * testsuite/ld-avr/pr21404-7.s: New test. + * testsuite/ld-avr/pr21404-8.d: New test. + * testsuite/ld-avr/pr21404-8.s: New test. + 2017-05-03 Maciej W. Rozycki <macro@imgtec.com> * testsuite/ld-mips-elf/mips16-pcrel-0.d: New test. diff --git a/ld/testsuite/ld-avr/pr21404-1.d b/ld/testsuite/ld-avr/pr21404-1.d new file mode 100644 index 0000000..fc7103f --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-1.d @@ -0,0 +1,12 @@ +#name: AVR symbol size adjustment with non zero symbol value +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-1.s +#nm: -n -S +#target: avr-*-* + +#... +00000000 00000004 T main +#... +00000002 00000002 T nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-1.s b/ld/testsuite/ld-avr/pr21404-1.s new file mode 100644 index 0000000..66ddb7d --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-1.s @@ -0,0 +1,11 @@ + .file "pr21404-1.s" +.section .text,"ax",@progbits +.global nonzero_sym +.global main +main: +L1: + jmp L1 +nonzero_sym: + nop +.size main, .-main +.size nonzero_sym, .-nonzero_sym diff --git a/ld/testsuite/ld-avr/pr21404-2.d b/ld/testsuite/ld-avr/pr21404-2.d new file mode 100644 index 0000000..e85735c --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-2.d @@ -0,0 +1,16 @@ +#name: AVR symbol size adjustment across alignment boundary +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-2.s +#nm: -n -S +#target: avr-*-* + +#... +00000000 00000006 T main +00000000 00000004 T size_after_align +00000000 00000004 T size_before_align +#... +00000002 00000002 T nonzero_sym_after_align +00000002 00000004 T nonzero_sym_after_end +00000002 00000002 T nonzero_sym_before_align +#... diff --git a/ld/testsuite/ld-avr/pr21404-2.s b/ld/testsuite/ld-avr/pr21404-2.s new file mode 100644 index 0000000..e1da1ae --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-2.s @@ -0,0 +1,25 @@ + .file "pr21404.s" +.section .text,"ax",@progbits +.global size_before_align +.global size_after_align +.global main +.global nonzero_sym_before_align +.global nonzero_sym_after_align +.global nonzero_sym_after_end +main: +size_before_align: +size_after_align: +L1: + jmp L1 +nonzero_sym_before_align: +nonzero_sym_after_align: +nonzero_sym_after_end: + jmp L1 +.size size_before_align, .-size_before_align +.size nonzero_sym_before_align, .-nonzero_sym_before_align + .p2align 1 +.size size_after_align, .-size_after_align +.size nonzero_sym_after_align, .-nonzero_sym_after_align +.word L1 +.size main, .-main +.size nonzero_sym_after_end, .-nonzero_sym_after_end diff --git a/ld/testsuite/ld-avr/pr21404-3.d b/ld/testsuite/ld-avr/pr21404-3.d new file mode 100644 index 0000000..145b48f --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-3.d @@ -0,0 +1,10 @@ +#name: AVR symbol value adjustment with non zero symbol value +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-3.s +#nm: -n -S +#target: avr-*-* + +#... +00000006 T nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-3.s b/ld/testsuite/ld-avr/pr21404-3.s new file mode 100644 index 0000000..d62ecd9 --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-3.s @@ -0,0 +1,10 @@ + .file "pr21404-3.s" +.section .text,"ax",@progbits +.global nonzero_sym +L1: + jmp L1 + jmp L1 + jmp L1 + .p2align 1 +nonzero_sym: + jmp L1 diff --git a/ld/testsuite/ld-avr/pr21404-4.d b/ld/testsuite/ld-avr/pr21404-4.d new file mode 100644 index 0000000..b80dfcf --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-4.d @@ -0,0 +1,10 @@ +#name: AVR symbol size increase for alignment +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-4.s +#nm: -n -S +#target: avr-*-* + +#... +00000002 00000006 T nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-4.s b/ld/testsuite/ld-avr/pr21404-4.s new file mode 100644 index 0000000..3e957bb --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-4.s @@ -0,0 +1,10 @@ + .file "pr21404-4.s" +.section .text,"ax",@progbits +.global nonzero_sym +L1: + jmp L1 +nonzero_sym: + nop + nop + .p2align 2 +.size nonzero_sym, .-nonzero_sym diff --git a/ld/testsuite/ld-avr/pr21404-5.d b/ld/testsuite/ld-avr/pr21404-5.d new file mode 100644 index 0000000..519c50f --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-5.d @@ -0,0 +1,11 @@ +#name: AVR local symbol size adjustment with non zero symbol value +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-5.s +#nm: -n -S +#target: avr-*-* + +#... +00000000 00000004 t _main +00000002 00000002 t _nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-5.s b/ld/testsuite/ld-avr/pr21404-5.s new file mode 100644 index 0000000..ccf2394 --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-5.s @@ -0,0 +1,9 @@ + .file "pr21404-1.s" +.section .text,"ax",@progbits +_main: +L1: + jmp L1 +_nonzero_sym: + nop +.size _main, .-_main +.size _nonzero_sym, .-_nonzero_sym diff --git a/ld/testsuite/ld-avr/pr21404-6.d b/ld/testsuite/ld-avr/pr21404-6.d new file mode 100644 index 0000000..784fc7c --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-6.d @@ -0,0 +1,16 @@ +#name: AVR local symbol size adjustment across alignment boundary +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-6.s +#nm: -n -S +#target: avr-*-* + +#... +00000000 00000006 t main +00000000 00000004 t size_after_align +00000000 00000004 t size_before_align +#... +00000002 00000002 t nonzero_sym_after_align +00000002 00000004 t nonzero_sym_after_end +00000002 00000002 t nonzero_sym_before_align +#... diff --git a/ld/testsuite/ld-avr/pr21404-6.s b/ld/testsuite/ld-avr/pr21404-6.s new file mode 100644 index 0000000..36f2301 --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-6.s @@ -0,0 +1,19 @@ + .file "pr21404-6.s" +.section .text,"ax",@progbits +main: +size_before_align: +size_after_align: +L1: + jmp L1 +nonzero_sym_before_align: +nonzero_sym_after_align: +nonzero_sym_after_end: + jmp L1 +.size size_before_align, .-size_before_align +.size nonzero_sym_before_align, .-nonzero_sym_before_align + .p2align 1 +.size size_after_align, .-size_after_align +.size nonzero_sym_after_align, .-nonzero_sym_after_align +.word L1 +.size main, .-main +.size nonzero_sym_after_end, .-nonzero_sym_after_end diff --git a/ld/testsuite/ld-avr/pr21404-7.d b/ld/testsuite/ld-avr/pr21404-7.d new file mode 100644 index 0000000..1360acb --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-7.d @@ -0,0 +1,10 @@ +#name: AVR local symbol value adjustment with non zero symbol value +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-7.s +#nm: -n -S +#target: avr-*-* + +#... +00000006 t nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-7.s b/ld/testsuite/ld-avr/pr21404-7.s new file mode 100644 index 0000000..b7e4e35 --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-7.s @@ -0,0 +1,9 @@ + .file "pr21404-7.s" +.section .text,"ax",@progbits +L1: + jmp L1 + jmp L1 + jmp L1 + .p2align 1 +nonzero_sym: + jmp L1 diff --git a/ld/testsuite/ld-avr/pr21404-8.d b/ld/testsuite/ld-avr/pr21404-8.d new file mode 100644 index 0000000..d70ba8f --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-8.d @@ -0,0 +1,10 @@ +#name: AVR local symbol size increase for alignment +#as: -mmcu=avrxmega2 -mlink-relax +#ld: -mavrxmega2 --relax +#source: pr21404-8.s +#nm: -n -S +#target: avr-*-* + +#... +00000002 00000006 t nonzero_sym +#... diff --git a/ld/testsuite/ld-avr/pr21404-8.s b/ld/testsuite/ld-avr/pr21404-8.s new file mode 100644 index 0000000..6b00df5 --- /dev/null +++ b/ld/testsuite/ld-avr/pr21404-8.s @@ -0,0 +1,9 @@ + .file "pr21404-8.s" +.section .text,"ax",@progbits +L1: + jmp L1 +nonzero_sym: + nop + nop + .p2align 2 +.size nonzero_sym, .-nonzero_sym |