Change the ARM assembler's ADR and ADRl pseudo-ops so that they will only set the...
authorNick Clifton <nickc@redhat.com>
Wed, 20 Jun 2018 11:38:10 +0000 (12:38 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 20 Jun 2018 11:38:10 +0000 (12:38 +0100)
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.

gas/ChangeLog
gas/NEWS
gas/config/tc-arm.c
gas/doc/c-arm.texi
gas/testsuite/gas/arm/adr.d
gas/testsuite/gas/arm/adrl.d
gas/testsuite/gas/arm/pr21458.d

index 33ba540ed2709e8480185edf662e2fc04be9b197..d22dd1f81f64d61d18ef335b88971a84d84dd1b2 100644 (file)
@@ -1,3 +1,17 @@
+2018-06-20  Nick Clifton  <nickc@redhat.com>
+
+       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.
+
 2018-06-20  Sebastian Huber  <sebastian.huber@embedded-brains.de>
 
        PR gas/23305
index 9dfc8450bcf23b9ee7cd63a479df2a0f27d438a7..474ff429c87b3da13e25a4f43aabee740d7262a8 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,9 @@
 -*- text -*-
 
+* The ADR and ADRL pseudo-instructions supported by the ARM assembler
+  now only set the bottom bit of the address of thumb function symbols
+  if the -mthumb-interwork command line option is active.
+
 * Add support for the MIPS Global INValidate (GINV) ASE.
 
 * Add support for the MIPS Cyclic Redudancy Check (CRC) ASE.
index 2529d2a52f07428672cd493e667a8b83b963c7a3..6a9a655bd4d92b3cc393ef148d59ad0953a2f09a 100644 (file)
@@ -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
index cd533ca540be19aa79cde0a460e5cee617ce8cb8..4683b8a4bb70521a2743810c083e5f23a9e9debf 100644 (file)
@@ -318,7 +318,8 @@ instructions; that is, it should behave as though the file starts with a
 @cindex @code{-mthumb-interwork} command line option, ARM
 @item -mthumb-interwork
 This option specifies that the output generated by the assembler should
-be marked as supporting interworking.
+be marked as supporting interworking.  It also affects the behaviour
+of the @code{ADR} and @code{ADRL} pseudo opcodes.
 
 @cindex @code{-mimplicit-it} command line option, ARM
 @item -mimplicit-it=never
@@ -1061,6 +1062,16 @@ out of range, or if it is not defined in the same file (and section) as
 the ADR instruction, then an error will be generated.  This instruction
 will not make use of the literal pool.
 
+If @var{label} is a thumb function symbol, and thumb interworking has
+been enabled via the @option{-mthumb-interwork} option then the bottom
+bit of the value stored into @var{register} will be set.  This allows
+the following sequence to work as expected:
+
+@smallexample
+  adr     r0, thumb_function
+  blx     r0
+@end smallexample
+
 @cindex @code{ADRL reg,<label>} pseudo op, ARM
 @item ADRL
 @smallexample
@@ -1077,6 +1088,10 @@ If the label is out of range, or if it is not defined in the same file
 (and section) as the ADRL instruction, then an error will be generated.
 This instruction will not make use of the literal pool.
 
+If @var{label} is a thumb function symbol, and thumb interworking has
+been enabled via the @option{-mthumb-interwork} option then the bottom
+bit of the value stored into @var{register} will be set.
+
 @end table
 
 For information on the ARM or Thumb instruction sets, see @cite{ARM
index ee74154cb574b5885b6f487f78673d9cbf37bdb7..13722cd9cdd114f76811bf6ba7edf8948c531c33 100644 (file)
@@ -1,3 +1,4 @@
+#as: -mthumb-interwork
 #objdump: -dr --prefix-addresses --show-raw-insn
 #name: ADR
 
index 6276e8d2f313c0352b4e2582ac076d2e54b08e36..b6011f1f89c537e75b27ff4469095401388ae1b1 100644 (file)
@@ -1,3 +1,4 @@
+#as: -mthumb-interwork
 #objdump: -dr --prefix-addresses --show-raw-insn
 #name: ADRL
 
index 5410e7af170b5d49b9a2b39e4bdc0ff382c50856..b567d847ddde851ca8de941cb3d5b3fe3823ac08 100644 (file)
@@ -1,8 +1,9 @@
+#as: -mthumb-interwork
 #objdump: -d --prefix-addresses --show-raw-insn
 #name: ADR(L) for Thumb functions
 #skip: *-*-pe *-wince-* *-*-vxworks
 
-# Test that using ADR(L) on thumb function symbols sets the T bit.
+# Test that using ADR(L) on thumb function symbols sets the T bit when -mthumb-interwork is active.
 
 .*: +file format .*arm.*