mirror of
https://git.yoctoproject.org/poky
synced 2026-06-01 13:09:50 +00:00
binutils: 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.
[Yocto 12865] < 2.30 (From OE-Core rev: a1c0135e96bca684db0e3a7c6209c0cb2054f306) Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
79083fcd0d
commit
8cdabe1f6f
@@ -47,6 +47,7 @@ SRC_URI = "\
|
|||||||
file://CVE-2018-10372.patch \
|
file://CVE-2018-10372.patch \
|
||||||
file://CVE-2018-10535.patch \
|
file://CVE-2018-10535.patch \
|
||||||
file://CVE-2018-10534.patch \
|
file://CVE-2018-10534.patch \
|
||||||
|
file://0001-Change-the-ARM-assembler-s-ADR-and-ADRl-pseudo-ops-s.patch \
|
||||||
"
|
"
|
||||||
S = "${WORKDIR}/git"
|
S = "${WORKDIR}/git"
|
||||||
|
|
||||||
|
|||||||
+176
@@ -0,0 +1,176 @@
|
|||||||
|
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.*
|
||||||
|
|
||||||
Reference in New Issue
Block a user