diff options
author | Alexandre Oliva <oliva@adacore.com> | 2020-03-04 17:28:46 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-03-04 17:28:46 +0000 |
commit | 749479c8d3b63c9075d2fabf4b87b1f7109608b6 (patch) | |
tree | ea0bf41a6d7fb0dd11a33e930893a96adb2a9f38 | |
parent | 440cf44eb0f70830b8d8ac35289f84129c7a35c1 (diff) | |
download | gdb-749479c8d3b63c9075d2fabf4b87b1f7109608b6.zip gdb-749479c8d3b63c9075d2fabf4b87b1f7109608b6.tar.gz gdb-749479c8d3b63c9075d2fabf4b87b1f7109608b6.tar.bz2 |
Generate a warning in the ARM assembler if a PC-relative thumb load instruction is detected in a section with insufficient alignment.
* config/tc-arm.c (md_apply_fix): Warn if a PC-relative load is
detected in a section which does not have at least 4 byte
alignment.
* testsuite/gas/arm/armv8-ar-it-bad.s: Add alignment directive.
* testsuite/gas/arm/ldr-t.s: Likewise.
* testsuite/gas/arm/sp-pc-usage-t.s: Likewise.
* testsuite/gas/arm/sp-pc-usage-t.d: Finish test at end of
disassembly, ignoring any NOPs that may have been inserted because
of section alignment.
* testsuite/gas/arm/ldr-t.d: Likewise.
-rw-r--r-- | gas/ChangeLog | 13 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/armv8-ar-it-bad.s | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/ldr-t.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/ldr-t.s | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/sp-pc-usage-t.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/sp-pc-usage-t.s | 3 |
7 files changed, 24 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 7a2dfe1..d5611ee 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2020-03-04 Alexandre Oliva <oliva@adacore.com> + + * config/tc-arm.c (md_apply_fix): Warn if a PC-relative load is + detected in a section which does not have at least 4 byte + alignment. + * testsuite/gas/arm/armv8-ar-it-bad.s: Add alignment directive. + * testsuite/gas/arm/ldr-t.s: Likewise. + * testsuite/gas/arm/sp-pc-usage-t.s: Likewise. + * testsuite/gas/arm/sp-pc-usage-t.d: Finish test at end of + disassembly, ignoring any NOPs that may have been inserted because + of section alignment. + * testsuite/gas/arm/ldr-t.d: Likewise. + 2020-03-04 Jan Beulich <jbeulich@suse.com> * config/tc-i386.c (cpu_arch): Add .sev_es entry. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 59b1f6b..329a2de 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -29290,6 +29290,9 @@ md_apply_fix (fixS * fixP, (((unsigned long) fixP->fx_frag->fr_address + (unsigned long) fixP->fx_where) & ~3) + (unsigned long) value); + else if (get_recorded_alignment (seg) < 2) + as_warn_where (fixP->fx_file, fixP->fx_line, + _("section does not have enough alignment to ensure safe PC-relative loads")); if (value & ~0x3fc) as_bad_where (fixP->fx_file, fixP->fx_line, diff --git a/gas/testsuite/gas/arm/armv8-ar-it-bad.s b/gas/testsuite/gas/arm/armv8-ar-it-bad.s index 9864bf8..3a67e8d 100644 --- a/gas/testsuite/gas/arm/armv8-ar-it-bad.s +++ b/gas/testsuite/gas/arm/armv8-ar-it-bad.s @@ -1,6 +1,6 @@ -.syntax unified - -.thumb + .syntax unified + .thumb + .align 2 @ Wide instruction in IT block is deprecated. it eq ldrdeq r0, [r1] diff --git a/gas/testsuite/gas/arm/ldr-t.d b/gas/testsuite/gas/arm/ldr-t.d index ddcd612..9763739 100644 --- a/gas/testsuite/gas/arm/ldr-t.d +++ b/gas/testsuite/gas/arm/ldr-t.d @@ -34,4 +34,4 @@ Disassembly of section [^>]+: 0+4e <[^>]+> f8c1 100a str.w r1, \[r1, #10\] 0+52 <[^>]+> f842 1f0a str.w r1, \[r2, #10\]! 0+56 <[^>]+> 50d1 str r1, \[r2, r3\] - +#pass diff --git a/gas/testsuite/gas/arm/ldr-t.s b/gas/testsuite/gas/arm/ldr-t.s index 4aaecdf..ba3b1e0 100644 --- a/gas/testsuite/gas/arm/ldr-t.s +++ b/gas/testsuite/gas/arm/ldr-t.s @@ -3,6 +3,7 @@ .thumb .global foo foo: + .align 4 @ldr-immediate @!wback && (n == t) diff --git a/gas/testsuite/gas/arm/sp-pc-usage-t.d b/gas/testsuite/gas/arm/sp-pc-usage-t.d index 6dedc00..c9b0800 100644 --- a/gas/testsuite/gas/arm/sp-pc-usage-t.d +++ b/gas/testsuite/gas/arm/sp-pc-usage-t.d @@ -79,4 +79,4 @@ Disassembly of section .text: 000000f6 <foo\+0xf6> bf00 nop 000000f8 <foo\+0xf8> bf00 nop 000000fa <foo\+0xfa> bf00 nop - +#pass diff --git a/gas/testsuite/gas/arm/sp-pc-usage-t.s b/gas/testsuite/gas/arm/sp-pc-usage-t.s index 6cfebed..70bf0d9 100644 --- a/gas/testsuite/gas/arm/sp-pc-usage-t.s +++ b/gas/testsuite/gas/arm/sp-pc-usage-t.s @@ -3,7 +3,8 @@ .text .thumb .global foo -foo: +foo: + .align 4 @ Section A6.1.3 "Use of 0b1101 as a register specifier". @ R13 as the source or destination register of a mov instruction. |