| From fc6141f097056f830a412afebed8d81a9d72b696 Mon Sep 17 00:00:00 2001 |
| From: Nick Clifton <nickc@redhat.com> |
| Date: Wed, 20 Jun 2018 12:38:10 +0100 |
| Subject: [PATCH] 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. |
| --- |
| gas/ChangeLog | 14 ++++++++++++++ |
| gas/NEWS | 4 ++++ |
| gas/config/tc-arm.c | 10 ++++++---- |
| gas/doc/c-arm.texi | 17 ++++++++++++++++- |
| gas/testsuite/gas/arm/adr.d | 1 + |
| gas/testsuite/gas/arm/adrl.d | 1 + |
| gas/testsuite/gas/arm/pr21458.d | 3 ++- |
| 7 files changed, 44 insertions(+), 6 deletions(-) |
| |
| Index: git/gas/config/tc-arm.c |
| =================================================================== |
| --- git.orig/gas/config/tc-arm.c |
| +++ git/gas/config/tc-arm.c |
| @@ -8410,11 +8410,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 |
| @@ -8434,11 +8435,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: git/gas/doc/c-arm.texi |
| =================================================================== |
| --- git.orig/gas/doc/c-arm.texi |
| +++ git/gas/doc/c-arm.texi |
| @@ -317,7 +317,8 @@ instructions; that is, it should behave |
| @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 |
| @@ -1060,6 +1061,16 @@ out of range, or if it is not defined in |
| 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 |
| @@ -1076,6 +1087,10 @@ If the label is out of range, or if it i |
| (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: git/gas/testsuite/gas/arm/adr.d |
| =================================================================== |
| --- git.orig/gas/testsuite/gas/arm/adr.d |
| +++ git/gas/testsuite/gas/arm/adr.d |
| @@ -1,3 +1,4 @@ |
| +#as: -mthumb-interwork |
| #objdump: -dr --prefix-addresses --show-raw-insn |
| #name: ADR |
| |
| Index: git/gas/testsuite/gas/arm/adrl.d |
| =================================================================== |
| --- git.orig/gas/testsuite/gas/arm/adrl.d |
| +++ git/gas/testsuite/gas/arm/adrl.d |
| @@ -1,3 +1,4 @@ |
| +#as: -mthumb-interwork |
| #objdump: -dr --prefix-addresses --show-raw-insn |
| #name: ADRL |
| |
| Index: git/gas/ChangeLog |
| =================================================================== |
| --- git.orig/gas/ChangeLog |
| +++ git/gas/ChangeLog |
| @@ -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-02-05 Nick Clifton <nickc@redhat.com> |
| |
| * po/ru.po: Updated Russian translation. |
| Index: git/gas/NEWS |
| =================================================================== |
| --- git.orig/gas/NEWS |
| +++ git/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. |
| + |
| Changes in 2.30: |
| |
| * Add support for loaction views in DWARF debug line information. |
| Index: git/gas/testsuite/gas/arm/pr21458.d |
| =================================================================== |
| --- git.orig/gas/testsuite/gas/arm/pr21458.d |
| +++ git/gas/testsuite/gas/arm/pr21458.d |
| @@ -1,8 +1,9 @@ |
| +#as: -mthumb-interwork |
| #objdump: -d --prefix-addresses --show-raw-insn |
| #name: ADR(L) for Thumb functions |
| #skip: *-*-pe *-wince-* *-*-coff *-*-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.* |
| |