1// REQUIRES: arm 2// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t 3// RUN: ld.lld %t -o %t2 4// The output file is large, most of it zeroes. We dissassemble only the 5// parts we need to speed up the test and avoid a large output file 6// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x100002 --stop-address=0x10000a | FileCheck --check-prefix=CHECK1 %s 7// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1000004 --stop-address=0x1000026 | FileCheck --check-prefix=CHECK2 %s 8// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1100014 --stop-address=0x1100022 | FileCheck --check-prefix=CHECK3 %s 9// In this test case a branch that is in range and does not need its range 10// extended can be pushed out of range by another Thunk, necessitating another 11// pass 12 13 .macro FUNCTION suff 14 .section .text.\suff\(), "ax", %progbits 15 .thumb 16 .balign 0x100000 17 .globl tfunc\suff\() 18 .type tfunc\suff\(), %function 19tfunc\suff\(): 20 bx lr 21 .endm 22 23 FUNCTION 00 24 .globl _start 25_start: 26 bl target 27 b.w arm_target 28// arm_target is in range but needs an interworking thunk 29// CHECK1: <_start>: 30// CHECK1-NEXT: 100002: f300 d006 bl 0x1000012 <__Thumbv7ABSLongThunk_target> 31// CHECK1-NEXT: 100006: f2ff 97ff b.w 0x1000008 <__Thumbv7ABSLongThunk_arm_target> 32 nop 33 nop 34 nop 35 .globl target2 36 .type target2, %function 37 nop 38 39target2: 40 FUNCTION 01 41 FUNCTION 02 42 FUNCTION 03 43 FUNCTION 04 44 FUNCTION 05 45 FUNCTION 06 46 FUNCTION 07 47 FUNCTION 08 48 FUNCTION 09 49 FUNCTION 10 50 FUNCTION 11 51 FUNCTION 12 52 FUNCTION 13 53 FUNCTION 14 54 FUNCTION 15 55 56 .section .text.16, "ax", %progbits 57 .arm 58 .globl arm_target 59 .type arm_target, %function 60arm_target: 61 bx lr 62// CHECK2: 01000004 <arm_target>: 63// CHECK2: <__Thumbv7ABSLongThunk_arm_target>: 64// CHECK2-NEXT: 1000008: f240 0c04 movw r12, #4 65// CHECK2-NEXT: 100000c: f2c0 1c00 movt r12, #256 66// CHECK2-NEXT: 1000010: 4760 bx r12 67// CHECK2: <__Thumbv7ABSLongThunk_target>: 68// CHECK2-NEXT: 1000012: f0ff bfff b.w 0x1100014 <target> 69// CHECK2: <__Thumbv7ABSLongThunk_target2>: 70// CHECK2-NEXT: 1000016: f4ff 97fc b.w 0x100012 <target2> 71 72 .section .text.17, "ax", %progbits 73// Just enough space so that bl target is in range if no extension thunks are 74// generated. 75 76 .space 0x100000 - 6 77 78 .section .text.18, "ax", %progbits 79 .thumb 80 .globl target 81 .type target, %function 82// target is at maximum ARM branch range away from caller. 83target: 84// Similar case in the backwards direction 85 bl target2 86 nop 87 nop 88 bx lr 89// CHECK3: <target>: 90// CHECK3-NEXT: 1100014: f6ff ffff bl 0x1000016 <__Thumbv7ABSLongThunk_target2> 91// CHECK3-NEXT: 1100018: bf00 nop 92// CHECK3-NEXT: 110001a: bf00 nop 93// CHECK3-NEXT: 110001c: 4770 bx lr 94