gas/avr: Prevent incorrect overflow errors for diff fixups.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Sun, 4 Jan 2015 00:03:16 +0000 (00:03 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Sat, 10 Jan 2015 00:04:35 +0000 (00:04 +0000)
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
gas/config/tc-avr.c
gas/testsuite/ChangeLog
gas/testsuite/gas/avr/large-debug-line-table.d [new file with mode: 0644]
gas/testsuite/gas/avr/large-debug-line-table.s [new file with mode: 0644]

index b703835b6ce2138516072efaaf9a8ce01540a698..97422c1b54b1e754a2c9fecaa249bddd521a466c 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * config/tc-avr.c (md_apply_fix): Update the contents of VALP for
+       diff fixups.
+
 2015-01-09  Philipp Tomsich  <philipp.tomsich@theobroma-systems.com>
 
        * config/tc-arm.c (arm_cpus): Add support for APM X-Gene 1 and
index 19326a1f25a15b5f0fdb5eddc219a1f317d5b61a..5a0b405eee2150f81d638fca962dbed8764a0e56 100644 (file)
@@ -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;
   }
index 541c3294c9a23f9e04cc7f844413165b5b793938..a547a3b716b639026db132c21cab205b5ab2d42c 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gas/avr/large-debug-line-table.d: New file.
+       * gas/avr/large-debug-line-table.s: New file.
+
 2015-01-01  Alan Modra  <amodra@gmail.com>
 
        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 (file)
index 0000000..31ca7ed
--- /dev/null
@@ -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 (file)
index 0000000..8e19ba7
--- /dev/null
@@ -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