[binutils-gdb/binutils-2_36-branch] Arm: Fix forward thumb references [PR gas/25235]

Tamar Christina tnfchris@sourceware.org
Tue May 25 15:09:37 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eaf6d3b360d2d4bd68acaebb80e40d5bb69a734d

commit eaf6d3b360d2d4bd68acaebb80e40d5bb69a734d
Author: Tamar Christina <tamar.christina@arm.com>
Date:   Tue May 25 16:04:04 2021 +0100

    Arm: Fix forward thumb references [PR gas/25235]
    
    When assembling a forward reference the symbol will be unknown and so during
    do_t_adr we cannot set the thumb bit.  The bit it set so early to prevent
    relaxations that are invalid. i.e. relaxing a Thumb2 to Thumb1 insn when the
    symbol is Thumb.
    
    But because it's done so early we miss the case for forward references.
    This patch changes it so that we additionally check the thumb bit during the
    internal relocation processing.
    
    In principle we should be able to only set the bit during reloc processing but
    that would require changes to the other relocations that the instruction could
    be relaxed to.
    
    This approach still allows early relaxations (which means that we have less
    iteration of internal reloc processing) while still fixing the forward reference
    case.
    
    gas/ChangeLog:
    
    2021-05-24  Tamar Christina  <tamar.christina@arm.com>
    
            PR gas/25235
            * config/tc-arm.c (md_convert_frag): Set LSB when Thumb symbol.
            (relax_adr): Thumb symbols 4 bytes.
            * testsuite/gas/arm/pr25235.d: New test.
            * testsuite/gas/arm/pr25235.s: New test.
    
    (cherry picked from commit d3e52e120b68bf19552743fbc078e0a759f48cb7)

Diff:
---
 gas/config/tc-arm.c             | 11 ++++++++++-
 gas/testsuite/gas/arm/pr25235.d | 24 ++++++++++++++++++++++++
 gas/testsuite/gas/arm/pr25235.s | 30 ++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index d59e14930c3..1280921d890 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -26827,6 +26827,14 @@ md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
       pc_rel = (opcode == T_MNEM_ldr_pc2);
       break;
     case T_MNEM_adr:
+      /* Thumb bits should be set in the frag handling so we process them
+	 after all symbols have been seen.  PR gas/25235.  */
+      if (exp.X_op == O_symbol
+	  && exp.X_add_symbol != NULL
+	  && S_IS_DEFINED (exp.X_add_symbol)
+	  && THUMB_IS_FUNC (exp.X_add_symbol))
+	exp.X_add_number |= 1;
+
       if (fragp->fr_var == 4)
 	{
 	  insn = THUMB_OP32 (opcode);
@@ -27024,7 +27032,8 @@ relax_adr (fragS *fragp, asection *sec, long stretch)
   if (fragp->fr_symbol == NULL
       || !S_IS_DEFINED (fragp->fr_symbol)
       || sec != S_GET_SEGMENT (fragp->fr_symbol)
-      || S_IS_WEAK (fragp->fr_symbol))
+      || S_IS_WEAK (fragp->fr_symbol)
+      || THUMB_IS_FUNC (fragp->fr_symbol))
     return 4;
 
   val = relaxed_symbol_addr (fragp, stretch);
diff --git a/gas/testsuite/gas/arm/pr25235.d b/gas/testsuite/gas/arm/pr25235.d
new file mode 100644
index 00000000000..12695038701
--- /dev/null
+++ b/gas/testsuite/gas/arm/pr25235.d
@@ -0,0 +1,24 @@
+#skip: *-*-pe *-*-wince *-*-vxworks
+#objdump: -dr
+#name: PR25235: Thumb forward references error
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+
+00000000 <f1>:
+   0:	46c0      	nop			; \(mov r8, r8\)
+   2:	46c0      	nop			; \(mov r8, r8\)
+
+00000004 <f2>:
+   4:	f2af 0107 	subw	r1, pc, #7
+   8:	f20f 0305 	addw	r3, pc, #5
+   c:	a401      	add	r4, pc, #4	; \(adr r4, 14 <f4>\)
+   e:	46c0      	nop			; \(mov r8, r8\)
+
+00000010 <f3>:
+  10:	46c0      	nop			; \(mov r8, r8\)
+  12:	46c0      	nop			; \(mov r8, r8\)
+
+00000014 <f4>:
+  14:	e1a00000 	nop			; \(mov r0, r0\)
diff --git a/gas/testsuite/gas/arm/pr25235.s b/gas/testsuite/gas/arm/pr25235.s
new file mode 100644
index 00000000000..77637392f1c
--- /dev/null
+++ b/gas/testsuite/gas/arm/pr25235.s
@@ -0,0 +1,30 @@
+    .syntax unified
+    .thumb
+
+    .align 2
+    .type f1, %function
+    .thumb_func
+    f1:
+        nop
+
+    .align 2
+    .type f2, %function
+    .thumb_func
+    f2:
+        adr r1, f1
+        adr r3, f3
+        adr r4, f4
+
+
+    .align 2
+    .type f3, %function
+    .thumb_func
+    f3:
+        nop
+
+    .align 2
+    .type f3, %function
+    .arm
+    f4:
+        nop
+


More information about the Binutils-cvs mailing list