forked from OSchip/llvm-project
124 lines
4.5 KiB
ArmAsm
124 lines
4.5 KiB
ArmAsm
// REQUIRES: arm
|
|
// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
|
|
// RUN: ld.lld %t --shared -o %t.so
|
|
// The output file is large, most of it zeroes. We dissassemble only the
|
|
// parts we need to speed up the test and avoid a large output file
|
|
// RUN: llvm-objdump -d %t.so -start-address=16777220 -stop-address=16777244 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK1 %s
|
|
// RUN: llvm-objdump -d %t.so -start-address=17825800 -stop-address=17825826 -triple=thumbv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK2 %s
|
|
// RUN: llvm-objdump -d %t.so -start-address=17825824 -stop-address=17825892 -triple=armv7a-linux-gnueabihf | FileCheck -check-prefix=CHECK3 %s
|
|
|
|
// A branch to a Thunk that we create on pass N, can drift out of range if
|
|
// other Thunks are added in between. In this case we must create a new Thunk
|
|
// for the branch that is in range. We also need to make sure that if the
|
|
// destination of the Thunk is in the PLT the new Thunk also targets the PLT
|
|
.syntax unified
|
|
.thumb
|
|
|
|
.macro FUNCTION suff
|
|
.section .text.\suff\(), "ax", %progbits
|
|
.thumb
|
|
.balign 0x80000
|
|
.globl tfunc\suff\()
|
|
.type tfunc\suff\(), %function
|
|
tfunc\suff\():
|
|
bx lr
|
|
.endm
|
|
|
|
.globl imported
|
|
.type imported, %function
|
|
.globl imported2
|
|
.type imported2, %function
|
|
.globl imported3
|
|
.type imported3, %function
|
|
.globl imported4
|
|
.type imported4, %function
|
|
FUNCTION 00
|
|
FUNCTION 01
|
|
FUNCTION 02
|
|
FUNCTION 03
|
|
FUNCTION 04
|
|
FUNCTION 05
|
|
FUNCTION 06
|
|
FUNCTION 07
|
|
FUNCTION 08
|
|
FUNCTION 09
|
|
FUNCTION 10
|
|
FUNCTION 11
|
|
FUNCTION 12
|
|
FUNCTION 13
|
|
FUNCTION 14
|
|
FUNCTION 15
|
|
FUNCTION 16
|
|
FUNCTION 17
|
|
FUNCTION 18
|
|
FUNCTION 19
|
|
FUNCTION 20
|
|
FUNCTION 21
|
|
FUNCTION 22
|
|
FUNCTION 23
|
|
FUNCTION 24
|
|
FUNCTION 25
|
|
FUNCTION 26
|
|
FUNCTION 27
|
|
FUNCTION 28
|
|
FUNCTION 29
|
|
FUNCTION 30
|
|
FUNCTION 31
|
|
// Precreated Thunk Pool goes here
|
|
// CHECK1: __ThumbV7PILongThunk_imported:
|
|
// CHECK1-NEXT: 1000004: 40 f2 30 0c movw r12, #48
|
|
// CHECK1-NEXT: 1000008: c0 f2 10 0c movt r12, #16
|
|
// CHECK1-NEXT: 100000c: fc 44 add r12, pc
|
|
// CHECK1-NEXT: 100000e: 60 47 bx r12
|
|
// CHECK1: __ThumbV7PILongThunk_imported2:
|
|
// CHECK1-NEXT: 1000010: 40 f2 34 0c movw r12, #52
|
|
// CHECK1-NEXT: 1000014: c0 f2 10 0c movt r12, #16
|
|
// CHECK1-NEXT: 1000018: fc 44 add r12, pc
|
|
// CHECK1-NEXT: 100001a: 60 47 bx r12
|
|
|
|
.section .text.32, "ax", %progbits
|
|
.space 0x80000
|
|
.section .text.33, "ax", %progbits
|
|
.space 0x80000 - 0x14
|
|
.section .text.34, "ax", %progbits
|
|
// Need a Thunk to the PLT entry, can use precreated ThunkSection
|
|
.globl callers
|
|
.type callers, %function
|
|
callers:
|
|
b.w imported
|
|
beq.w imported
|
|
b.w imported2
|
|
// CHECK2: __ThumbV7PILongThunk_imported:
|
|
// CHECK2-NEXT: 1100008: 40 f2 2c 0c movw r12, #44
|
|
// CHECK2-NEXT: 110000c: c0 f2 00 0c movt r12, #0
|
|
// CHECK2-NEXT: 1100010: fc 44 add r12, pc
|
|
// CHECK2-NEXT: 1100012: 60 47 bx r12
|
|
// CHECK2: callers:
|
|
// CHECK2-NEXT: 1100014: ff f6 f6 bf b.w #-1048596 <__ThumbV7PILongThunk_imported>
|
|
// CHECK2-NEXT: 1100018: 3f f4 f6 af beq.w #-20 <__ThumbV7PILongThunk_imported>
|
|
// CHECK2-NEXT: 110001c: ff f6 f8 bf b.w #-1048592 <__ThumbV7PILongThunk_imported2>
|
|
|
|
// CHECK3: Disassembly of section .plt:
|
|
// CHECK3-NEXT: $a:
|
|
// CHECK3-NEXT: 1100020: 04 e0 2d e5 str lr, [sp, #-4]!
|
|
// CHECK3-NEXT: 1100024: 00 e6 8f e2 add lr, pc, #0, #12
|
|
// CHECK3-NEXT: 1100028: 00 ea 8e e2 add lr, lr, #0, #20
|
|
// CHECK3-NEXT: 110002c: dc ff be e5 ldr pc, [lr, #4060]!
|
|
// CHECK3: $d:
|
|
// CHECK3-NEXT: 1100030: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
// CHECK3-NEXT: 1100034: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
// CHECK3-NEXT: 1100038: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
// CHECK3-NEXT: 110003c: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
// CHECK3: $a:
|
|
// CHECK3-NEXT: 1100040: 00 c6 8f e2 add r12, pc, #0, #12
|
|
// CHECK3-NEXT: 1100044: 00 ca 8c e2 add r12, r12, #0, #20
|
|
// CHECK3-NEXT: 1100048: c4 ff bc e5 ldr pc, [r12, #4036]!
|
|
// CHECK3: $d:
|
|
// CHECK3-NEXT: 110004c: d4 d4 d4 d4 .word 0xd4d4d4d4
|
|
// CHECK3: $a:
|
|
// CHECK3-NEXT: 1100050: 00 c6 8f e2 add r12, pc, #0, #12
|
|
// CHECK3-NEXT: 1100054: 00 ca 8c e2 add r12, r12, #0, #20
|
|
// CHECK3-NEXT: 1100058: b8 ff bc e5 ldr pc, [r12, #4024]!
|
|
// CHECK3: $d:
|
|
// CHECK3-NEXT: 110005c: d4 d4 d4 d4 .word 0xd4d4d4d4
|