gas: Fix checking for backwards .org with negative offset
authorAlex Coplan <alex.coplan@arm.com>
Fri, 29 May 2020 15:04:50 +0000 (16:04 +0100)
committerAlan Modra <amodra@gmail.com>
Mon, 1 Jun 2020 14:40:40 +0000 (00:10 +0930)
This patch fixes internal errors in (at least) arm and aarch64 GAS
when assembling code that attempts a negative .org.  The bug appears
to be a regression introduced in binutils-2.29 by commit 9875b36538d.

* write.c (relax_segment): Fix handling of negative offset when
relaxing an rs_org frag.
* testsuite/gas/aarch64/org-neg.d: New test.
* testsuite/gas/aarch64/org-neg.l: Error output for test.
* testsuite/gas/aarch64/org-neg.s: Input for test.
* testsuite/gas/arm/org-neg.d: New test.
* testsuite/gas/arm/org-neg.l: Error output for test.
* testsuite/gas/arm/org-neg.s: Input for test.

gas/ChangeLog
gas/testsuite/gas/aarch64/org-neg.d [new file with mode: 0644]
gas/testsuite/gas/aarch64/org-neg.l [new file with mode: 0644]
gas/testsuite/gas/aarch64/org-neg.s [new file with mode: 0644]
gas/testsuite/gas/arm/org-neg.d [new file with mode: 0644]
gas/testsuite/gas/arm/org-neg.l [new file with mode: 0644]
gas/testsuite/gas/arm/org-neg.s [new file with mode: 0644]
gas/write.c

index 07509cc7379c0ee4402964038a06a45540c29d18..b105aa0ab6015cd73ce1e486100f63bafa60a229 100644 (file)
@@ -1,3 +1,14 @@
+2020-06-01  Alex Coplan  <alex.coplan@arm.com>
+
+       * write.c (relax_segment): Fix handling of negative offset when
+       relaxing an rs_org frag.
+       * testsuite/gas/aarch64/org-neg.d: New test.
+       * testsuite/gas/aarch64/org-neg.l: Error output for test.
+       * testsuite/gas/aarch64/org-neg.s: Input for test.
+       * testsuite/gas/arm/org-neg.d: New test.
+       * testsuite/gas/arm/org-neg.l: Error output for test.
+       * testsuite/gas/arm/org-neg.s: Input for test.
+
 2020-05-28  Stephen Casner  <casner@acm.org>
 
        Fix unexpected failures in gas testsuite for pdp11-aout target.
diff --git a/gas/testsuite/gas/aarch64/org-neg.d b/gas/testsuite/gas/aarch64/org-neg.d
new file mode 100644 (file)
index 0000000..83e6af6
--- /dev/null
@@ -0,0 +1,3 @@
+#name: negative org should not cause internal error
+#source: org-neg.s
+#error_output: org-neg.l
diff --git a/gas/testsuite/gas/aarch64/org-neg.l b/gas/testsuite/gas/aarch64/org-neg.l
new file mode 100644 (file)
index 0000000..f8414ad
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+.*: Error: attempt to move .org backwards
diff --git a/gas/testsuite/gas/aarch64/org-neg.s b/gas/testsuite/gas/aarch64/org-neg.s
new file mode 100644 (file)
index 0000000..403e70d
--- /dev/null
@@ -0,0 +1,2 @@
+.=-1
+ret
diff --git a/gas/testsuite/gas/arm/org-neg.d b/gas/testsuite/gas/arm/org-neg.d
new file mode 100644 (file)
index 0000000..83e6af6
--- /dev/null
@@ -0,0 +1,3 @@
+#name: negative org should not cause internal error
+#source: org-neg.s
+#error_output: org-neg.l
diff --git a/gas/testsuite/gas/arm/org-neg.l b/gas/testsuite/gas/arm/org-neg.l
new file mode 100644 (file)
index 0000000..f8414ad
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+.*: Error: attempt to move .org backwards
diff --git a/gas/testsuite/gas/arm/org-neg.s b/gas/testsuite/gas/arm/org-neg.s
new file mode 100644 (file)
index 0000000..f60486e
--- /dev/null
@@ -0,0 +1,2 @@
+.=-1
+nop
index 5825117548c7687c326646056ab4745f0c9824c3..9a50185b157b3a11998a1df2eda747f9d5f72fe8 100644 (file)
@@ -2940,7 +2940,7 @@ relax_segment (struct frag *segment_frag_root, segT segment, int pass)
 
              case rs_org:
                {
-                 addressT target = offset;
+                 offsetT target = offset;
                  addressT after;
 
                  if (symbolP)
@@ -2960,7 +2960,7 @@ relax_segment (struct frag *segment_frag_root, segT segment, int pass)
                  /* Growth may be negative, but variable part of frag
                     cannot have fewer than 0 chars.  That is, we can't
                     .org backwards.  */
-                 if (address + fragP->fr_fix > target)
+                 if ((offsetT) (address + fragP->fr_fix) > target)
                    {
                      growth = 0;