From c39c821c1da3e8a64eff5984a39e104eb798e8b8 Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Fri, 29 May 2020 16:04:50 +0100 Subject: [PATCH] gas: Fix checking for backwards .org with negative offset 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 | 11 +++++++++++ gas/testsuite/gas/aarch64/org-neg.d | 3 +++ gas/testsuite/gas/aarch64/org-neg.l | 2 ++ gas/testsuite/gas/aarch64/org-neg.s | 2 ++ gas/testsuite/gas/arm/org-neg.d | 3 +++ gas/testsuite/gas/arm/org-neg.l | 2 ++ gas/testsuite/gas/arm/org-neg.s | 2 ++ gas/write.c | 4 ++-- 8 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/aarch64/org-neg.d create mode 100644 gas/testsuite/gas/aarch64/org-neg.l create mode 100644 gas/testsuite/gas/aarch64/org-neg.s create mode 100644 gas/testsuite/gas/arm/org-neg.d create mode 100644 gas/testsuite/gas/arm/org-neg.l create mode 100644 gas/testsuite/gas/arm/org-neg.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 07509cc737..b105aa0ab6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2020-06-01 Alex Coplan + + * 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 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 index 0000000000..83e6af6afb --- /dev/null +++ b/gas/testsuite/gas/aarch64/org-neg.d @@ -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 index 0000000000..f8414adc19 --- /dev/null +++ b/gas/testsuite/gas/aarch64/org-neg.l @@ -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 index 0000000000..403e70d5e0 --- /dev/null +++ b/gas/testsuite/gas/aarch64/org-neg.s @@ -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 index 0000000000..83e6af6afb --- /dev/null +++ b/gas/testsuite/gas/arm/org-neg.d @@ -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 index 0000000000..f8414adc19 --- /dev/null +++ b/gas/testsuite/gas/arm/org-neg.l @@ -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 index 0000000000..f60486e2c8 --- /dev/null +++ b/gas/testsuite/gas/arm/org-neg.s @@ -0,0 +1,2 @@ +.=-1 +nop diff --git a/gas/write.c b/gas/write.c index 5825117548..9a50185b15 100644 --- a/gas/write.c +++ b/gas/write.c @@ -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;