From 491793b5cbcc9f42662a2da8427c0022d7b03f9c Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sun, 4 Jan 2015 00:03:16 +0000 Subject: [PATCH] gas/avr: Prevent incorrect overflow errors for diff fixups. When fixups are converted to a difference type within md_apply_fix, we previously left the contents of VALP (the value that was initially computed within write.c:fixup_segment) unchanged. This is harmless, except that this value is used within write.c:fixup_segment once we return from md_apply_fix to perform an overflow check. In some cases, the value computed in write.c:fixup_segment is so wrong that an overflow error can be triggered. These errors are incorrect. This patch avoids the overflow errors by adjusting the value in write.c:fixup_segment using the VALP pointer in md_apply_fix. A test for this issue is included. gas/ChangeLog: * config/tc-avr.c (md_apply_fix): Update the contents of VALP for diff fixups. gas/testsuite/ChangeLog: * gas/avr/large-debug-line-table.d: New file. * gas/avr/large-debug-line-table.s: New file. --- gas/ChangeLog | 5 +++++ gas/config/tc-avr.c | 1 + gas/testsuite/ChangeLog | 5 +++++ gas/testsuite/gas/avr/large-debug-line-table.d | 15 +++++++++++++++ gas/testsuite/gas/avr/large-debug-line-table.s | 16 ++++++++++++++++ 5 files changed, 42 insertions(+) create mode 100644 gas/testsuite/gas/avr/large-debug-line-table.d create mode 100644 gas/testsuite/gas/avr/large-debug-line-table.s diff --git a/gas/ChangeLog b/gas/ChangeLog index b703835b6ce..97422c1b54b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2015-01-10 Andrew Burgess + + * config/tc-avr.c (md_apply_fix): Update the contents of VALP for + diff fixups. + 2015-01-09 Philipp Tomsich * config/tc-arm.c (arm_cpus): Add support for APM X-Gene 1 and diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 19326a1f25a..5a0b405eee2 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -1344,6 +1344,7 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg) value = S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy); + *valP = value; fixP->fx_subsy = NULL; } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 541c3294c9a..a547a3b716b 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-10 Andrew Burgess + + * gas/avr/large-debug-line-table.d: New file. + * gas/avr/large-debug-line-table.s: New file. + 2015-01-01 Alan Modra Update year range in copyright notice of all files. diff --git a/gas/testsuite/gas/avr/large-debug-line-table.d b/gas/testsuite/gas/avr/large-debug-line-table.d new file mode 100644 index 00000000000..31ca7edd143 --- /dev/null +++ b/gas/testsuite/gas/avr/large-debug-line-table.d @@ -0,0 +1,15 @@ +#name: AVR, large .debug_line table +#as: -mlink-relax -mmcu=avrxmega2 +#objdump: --dwarf=decodedline +#source: large-debug-line-table.s +#target: avr-*-* + +.*: file format elf32-avr + +Decoded dump of debug contents of section \.debug_line: + +CU: large-debug-line-table\.c: +File name Line number Starting address +large-debug-line-table\.c 1 0 + +#... diff --git a/gas/testsuite/gas/avr/large-debug-line-table.s b/gas/testsuite/gas/avr/large-debug-line-table.s new file mode 100644 index 00000000000..8e19ba790e4 --- /dev/null +++ b/gas/testsuite/gas/avr/large-debug-line-table.s @@ -0,0 +1,16 @@ + .file 1 "large-debug-line-table.c" + .text + .global _start +_start: + .rept 4000 + .loc 1 1 + nop + nop + nop + nop + nop + nop + nop + nop + nop + .endr -- 2.30.2