Files
clang-p2996/lld/test/ELF/arm-thumb-interwork-shared.s
Peter Smith a8656c62f5 [ELF] Add support for Armv5 and Armv6 compatible Thunks
Older Arm architectures do not support the MOVT and MOVW instructions so we
must use an alternative sequence of instructions to transfer control to the
destination.

Assuming at least Armv5 this patch adds support for Thunks that load or add
to the program counter. Note that there are no Armv5 Thumb Thunks as there
is no Thumb branch instruction in Armv5 that supports Thunks. These thunks
will not work for Armv4t (arm7tdmi) as this architecture cannot change state
from using the LDR or ADD instruction.

Differential Revision: https://reviews.llvm.org/D50077

llvm-svn: 340160
2018-08-20 09:37:50 +00:00

56 lines
2.3 KiB
ArmAsm

// REQUIRES: arm
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
// RUN: ld.lld %t --shared -o %t.so
// RUN: llvm-objdump -d -triple=thumbv7a-none-linux-gnueabi %t.so | FileCheck %s
// RUN: llvm-objdump -d -triple=armv7a-none-linux-gnueabi %t.so | FileCheck %s -check-prefix=PLT
.syntax unified
.global sym1
.global elsewhere
.weak weakref
sym1:
b.w elsewhere
b.w weakref
// Check that we generate a thunk for an undefined symbol called via a plt
// entry.
// CHECK: Disassembly of section .text:
// CHECK-NEXT: sym1:
// CHECK-NEXT: 1000: 00 f0 02 b8 b.w #4 <__ThumbV7PILongThunk_elsewhere>
// CHECK-NEXT: 1004: 00 f0 06 b8 b.w #12 <__ThumbV7PILongThunk_weakref>
// CHECK: __ThumbV7PILongThunk_elsewhere:
// CHECK-NEXT: 1008: 40 f2 2c 0c movw r12, #44
// CHECK-NEXT: 100c: c0 f2 00 0c movt r12, #0
// CHECK-NEXT: 1010: fc 44 add r12, pc
// CHECK-NEXT: 1012: 60 47 bx r12
// CHECK: __ThumbV7PILongThunk_weakref:
// CHECK-NEXT: 1014: 40 f2 30 0c movw r12, #48
// CHECK-NEXT: 1018: c0 f2 00 0c movt r12, #0
// CHECK-NEXT: 101c: fc 44 add r12, pc
// CHECK-NEXT: 101e: 60 47 bx r12
// PLT: Disassembly of section .plt:
// PLT-NEXT: $a:
// PLT-NEXT: 1020: 04 e0 2d e5 str lr, [sp, #-4]!
// PLT-NEXT: 1024: 00 e6 8f e2 add lr, pc, #0, #12
// PLT-NEXT: 1028: 00 ea 8e e2 add lr, lr, #0, #20
// PLT-NEXT: 102c: dc ff be e5 ldr pc, [lr, #4060]!
// PLT: $d:
// PLT-NEXT: 1030: d4 d4 d4 d4 .word 0xd4d4d4d4
// PLT-NEXT: 1034: d4 d4 d4 d4 .word 0xd4d4d4d4
// PLT-NEXT: 1038: d4 d4 d4 d4 .word 0xd4d4d4d4
// PLT-NEXT: 103c: d4 d4 d4 d4 .word 0xd4d4d4d4
// PLT: $a:
// PLT-NEXT: 1040: 00 c6 8f e2 add r12, pc, #0, #12
// PLT-NEXT: 1044: 00 ca 8c e2 add r12, r12, #0, #20
// PLT-NEXT: 1048: c4 ff bc e5 ldr pc, [r12, #4036]!
// PLT: $d:
// PLT-NEXT: 104c: d4 d4 d4 d4 .word 0xd4d4d4d4
// PLT: $a:
// PLT-NEXT: 1050: 00 c6 8f e2 add r12, pc, #0, #12
// PLT-NEXT: 1054: 00 ca 8c e2 add r12, r12, #0, #20
// PLT-NEXT: 1058: b8 ff bc e5 ldr pc, [r12, #4024]!
// PLT: $d:
// PLT-NEXT: 105c: d4 d4 d4 d4 .word 0xd4d4d4d4