diff options
author | Nick Clifton <nickc@redhat.com> | 2018-06-20 12:38:10 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-06-20 12:38:10 +0100 |
commit | fc6141f097056f830a412afebed8d81a9d72b696 (patch) | |
tree | 8d7eef3f3b251778800761a2d43124a3237a7686 /gas/config/tc-arm.c | |
parent | c6643fcc058d6b4aebca75818fbbb705837a9fa3 (diff) | |
download | gdb-fc6141f097056f830a412afebed8d81a9d72b696.zip gdb-fc6141f097056f830a412afebed8d81a9d72b696.tar.gz gdb-fc6141f097056f830a412afebed8d81a9d72b696.tar.bz2 |
Change the ARM assembler's ADR and ADRl pseudo-ops so that they will only set the bottom bit of imported thumb function symbols if the -mthumb-interwork option is active.
For more information see the email thread starting here:
https://www.sourceware.org/ml/binutils/2018-05/msg00348.html
PR 21458
* tc-arm.c (do_adr): Only set the bottom bit of an imported thumb
function symbol address if -mthumb-interwork is active.
(do_adrl): Likewise.
* doc/c-arm.texi: Update descriptions of the -mthumb-interwork
option and the ADR and ADRL pseudo-ops.
* NEWS: Mention the new behaviour of the ADR and ADRL pseudo-ops.
* testsuite/gas/arm/pr21458.d: Add -mthumb-interwork option to
assembler command line.
* testsuite/gas/arm/adr.d: Likewise.
* testsuite/gas/arm/adrl.d: Likewise.
Diffstat (limited to 'gas/config/tc-arm.c')
-rw-r--r-- | gas/config/tc-arm.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 2529d2a..6a9a655 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -8419,11 +8419,12 @@ do_adr (void) inst.reloc.pc_rel = 1; inst.reloc.exp.X_add_number -= 8; - if (inst.reloc.exp.X_op == O_symbol + if (support_interwork + && inst.reloc.exp.X_op == O_symbol && inst.reloc.exp.X_add_symbol != NULL && S_IS_DEFINED (inst.reloc.exp.X_add_symbol) && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol)) - inst.reloc.exp.X_add_number += 1; + inst.reloc.exp.X_add_number |= 1; } /* This is a pseudo-op of the form "adrl rd, label" to be converted @@ -8443,11 +8444,12 @@ do_adrl (void) inst.size = INSN_SIZE * 2; inst.reloc.exp.X_add_number -= 8; - if (inst.reloc.exp.X_op == O_symbol + if (support_interwork + && inst.reloc.exp.X_op == O_symbol && inst.reloc.exp.X_add_symbol != NULL && S_IS_DEFINED (inst.reloc.exp.X_add_symbol) && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol)) - inst.reloc.exp.X_add_number += 1; + inst.reloc.exp.X_add_number |= 1; } static void |