[PATCH] D34036: [LLD][ELF] Be more precise about Thumb state bit in ARM thunks

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 8 07:18:55 PDT 2017


peter.smith created this revision.
Herald added subscribers: kristof.beyls, javed.absar, emaste, aemerson.

The symbols generated for Thunks have type STT_FUNC, to permit a thunk to be reused via a blx instruction the Thumb bit (0) needs to be set properly.

With the current interworking Thunks we never need to do a bl/blx to a Thunk in a different state so this lack of precision doesn't hurt us. When range extension thunks are used we will need to do this.


https://reviews.llvm.org/D34036

Files:
  ELF/Thunks.cpp
  test/ELF/arm-thumb-thunk-symbols.s


Index: test/ELF/arm-thumb-thunk-symbols.s
===================================================================
--- /dev/null
+++ test/ELF/arm-thumb-thunk-symbols.s
@@ -0,0 +1,42 @@
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t
+// RUN: ld.lld %t -o %t2 2>&1
+// RUN: llvm-readobj --symbols %t2 | FileCheck %s
+// RUN: ld.lld --shared %t -o %t3 2>&1
+// RUN: llvm-readobj --symbols %t3 | FileCheck -check-prefix=CHECK-PI %s
+// REQUIRES: arm
+
+// Check that the symbols generated for Thunks have the correct symbol type
+// of STT_FUNC and the correct value of bit 0 (0 for ARM 1 for Thumb)
+ .syntax unified
+ .section .text.thumb, "ax", %progbits
+ .thumb
+ .balign 0x1000
+ .globl thumb_fn
+ .type thumb_fn, %function
+thumb_fn:
+ b.w arm_fn
+
+ .section .text.arm, "ax", %progbits
+ .arm
+ .balign 0x1000
+ .globl arm_fn
+ .type arm_fn, %function
+arm_fn:
+ b thumb_fn
+
+// CHECK:     Name: __Thumbv7ABSLongThunk_arm_fn
+// CHECK-NEXT:     Value: 0x11005
+// CHECK-NEXT:     Size: 10
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: Function (0x2)
+// CHECK:     Name: __ARMv7ABSLongThunk_thumb_fn
+// CHECK-NEXT:     Value: 0x11010
+// CHECK-NEXT:     Size: 12
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: Function (0x2)
+
+// CHECK-PI:     Name: __ThumbV7PILongThunk_arm_fn
+// CHECK-PI-NEXT:     Value: 0x1005
+// CHECK-PI-NEXT:     Size: 12
+// CHECK-PI-NEXT:    Binding: Local (0x0)
+// CHECK-PI-NEXT:    Type: Function (0x2)
Index: ELF/Thunks.cpp
===================================================================
--- ELF/Thunks.cpp
+++ ELF/Thunks.cpp
@@ -152,7 +152,7 @@
 void ThumbV7ABSLongThunk::addSymbols(ThunkSection &IS) {
   ThunkSym = addSyntheticLocal(
       Saver.save("__Thumbv7ABSLongThunk_" + Destination.getName()), STT_FUNC,
-      Offset, size(), &IS);
+      Offset | 0x1, size(), &IS);
   addSyntheticLocal("$t", STT_NOTYPE, Offset, 0, &IS);
 }
 
@@ -196,16 +196,16 @@
       0x60, 0x47,             //     bx   r12
   };
   uint64_t S = getARMThunkDestVA(Destination);
-  uint64_t P = ThunkSym->getVA();
+  uint64_t P = ThunkSym->getVA() & ~0x1;
   memcpy(Buf, Data, sizeof(Data));
   Target->relocateOne(Buf, R_ARM_THM_MOVW_PREL_NC, S - P - 12);
   Target->relocateOne(Buf + 4, R_ARM_THM_MOVT_PREL, S - P - 8);
 }
 
 void ThumbV7PILongThunk::addSymbols(ThunkSection &IS) {
   ThunkSym = addSyntheticLocal(
       Saver.save("__ThumbV7PILongThunk_" + Destination.getName()), STT_FUNC,
-      Offset, size(), &IS);
+      Offset | 0x1, size(), &IS);
   addSyntheticLocal("$t", STT_NOTYPE, Offset, 0, &IS);
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34036.101915.patch
Type: text/x-patch
Size: 2606 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170608/6b12d1c8/attachment.bin>


More information about the llvm-commits mailing list