1// REQUIRES: arm 2// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv7a-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=0x100000 --stop-address=0x10000c | FileCheck --check-prefix=CHECK1 %s 7// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x200000 --stop-address=0x200002 | FileCheck --check-prefix=CHECK2 %s 8// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x300000 --stop-address=0x300002 | FileCheck --check-prefix=CHECK3 %s 9// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x400000 --stop-address=0x400006 | FileCheck --check-prefix=CHECK4 %s 10// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1000000 --stop-address=0x1000036 | FileCheck --check-prefix=CHECK5 %s 11// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1100000 --stop-address=0x1100010 | FileCheck --check-prefix=CHECK6 %s 12// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1400004 --stop-address=0x140000c | FileCheck --check-prefix=CHECK7 %s 13// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1e00000 --stop-address=0x1e00006 | FileCheck --check-prefix=CHECK8 %s 14// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x2200000 --stop-address=0x220000a | FileCheck --check-prefix=CHECK9 %s 15// RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x2300000 --stop-address=0x230000a | FileCheck --check-prefix=CHECK10 %s 16 17// Test the Range extension Thunks for Thumb when all the code is in a single 18// OutputSection. The Thumb unconditional branch b.w and branch and link bl 19// instructions have a range of 16Mb. We create a series of Functions a 20// megabyte apart. We expect range extension thunks to be created when a 21// branch is out of range. Thunks will be reused whenever they are in range 22 .syntax unified 23 24// Define a function aligned on a megabyte boundary 25 .macro FUNCTION suff 26 .section .text.\suff\(), "ax", %progbits 27 .thumb 28 .balign 0x100000 29 .globl tfunc\suff\() 30 .type tfunc\suff\(), %function 31tfunc\suff\(): 32 bx lr 33 .endm 34 35 .section .text, "ax", %progbits 36 .thumb 37 .globl _start 38_start: 39// tfunc00 and tfunc15 are within 16Mb no Range Thunks expected 40 bl tfunc00 41 bl tfunc15 42// tfunc16 is > 16Mb away, expect a Range Thunk to be generated, to go into 43// the first of the pre-created ThunkSections. 44 bl tfunc16 45// CHECK1: Disassembly of section .text: 46// CHECK1-EMPTY: 47// CHECK1-NEXT: <_start>: 48// CHECK1-NEXT: 100000: f0ff fffe bl 0x200000 <tfunc00> 49// CHECK1-NEXT: 100004: f3ff d7fc bl 0x1100000 <tfunc15> 50// CHECK1-NEXT: 100008: f2ff d7fc bl 0x1000004 <__Thumbv7ABSLongThunk_tfunc16> 51 52 FUNCTION 00 53// CHECK2: <tfunc00>: 54// CHECK2-NEXT: 200000: 4770 bx lr 55 FUNCTION 01 56// CHECK3: <tfunc01>: 57// CHECK3-NEXT: 300000: 4770 bx lr 58 FUNCTION 02 59// tfunc28 is > 16Mb away, expect a Range Thunk to be generated, to go into 60// the first of the pre-created ThunkSections. 61 b.w tfunc28 62// CHECK4: <tfunc02>: 63// CHECK4-NEXT: 400000: 4770 bx lr 64// CHECK4-NEXT: 400002: f000 9001 b.w 0x1000008 <__Thumbv7ABSLongThunk_tfunc28> 65 FUNCTION 03 66 FUNCTION 04 67 FUNCTION 05 68 FUNCTION 06 69 FUNCTION 07 70 FUNCTION 08 71 FUNCTION 09 72 FUNCTION 10 73 FUNCTION 11 74 FUNCTION 12 75 FUNCTION 13 76 FUNCTION 14 77// Expect precreated ThunkSection here 78// CHECK5: <__Thumbv7ABSLongThunk_tfunc16>: 79// CHECK5-NEXT: 1000004: f1ff bffc b.w 0x1200000 <tfunc16> 80// CHECK5: <__Thumbv7ABSLongThunk_tfunc28>: 81// CHECK5-NEXT: 1000008: f1ff 97fa b.w 0x1e00000 <tfunc28> 82// CHECK5: <__Thumbv7ABSLongThunk_tfunc32>: 83// CHECK5-NEXT: 100000c: f240 0c01 movw r12, #1 84// CHECK5-NEXT: 1000010: f2c0 2c20 movt r12, #544 85// CHECK5-NEXT: 1000014: 4760 bx r12 86// CHECK5: <__Thumbv7ABSLongThunk_tfunc33>: 87// CHECK5-NEXT: 1000016: f240 0c01 movw r12, #1 88// CHECK5-NEXT: 100001a: f2c0 2c30 movt r12, #560 89// CHECK5-NEXT: 100001e: 4760 bx r12 90// CHECK5: <__Thumbv7ABSLongThunk_tfunc02>: 91// CHECK5-NEXT: 1000020: f7ff 97ee b.w 0x400000 <tfunc02> 92 FUNCTION 15 93// tfunc00 and tfunc01 are < 16Mb away, expect no range extension thunks 94 bl tfunc00 95 bl tfunc01 96// tfunc32 and tfunc33 are > 16Mb away, expect range extension thunks in the 97// precreated thunk section 98 bl tfunc32 99 bl tfunc33 100// CHECK6: <tfunc15>: 101// CHECK6-NEXT: 1100000: 4770 bx lr 102// CHECK6-NEXT: 1100002: f4ff d7fd bl 0x200000 <tfunc00> 103// CHECK6-NEXT: 1100006: f5ff d7fb bl 0x300000 <tfunc01> 104// CHECK6-NEXT: 110000a: f6ff ffff bl 0x100000c <__Thumbv7ABSLongThunk_tfunc32> 105// CHECK6-NEXT: 110000e: f700 f802 bl 0x1000016 <__Thumbv7ABSLongThunk_tfunc33> 106 FUNCTION 16 107 FUNCTION 17 108 FUNCTION 18 109// Expect another precreated thunk section here 110// CHECK7: <__Thumbv7ABSLongThunk_tfunc15>: 111// CHECK7-NEXT: 1400004: f4ff bffc b.w 0x1100000 <tfunc15> 112// CHECK7: <__Thumbv7ABSLongThunk_tfunc16>: 113// CHECK7-NEXT: 1400008: f5ff bffa b.w 0x1200000 <tfunc16> 114 FUNCTION 19 115 FUNCTION 20 116 FUNCTION 21 117 FUNCTION 22 118 FUNCTION 23 119 FUNCTION 24 120 FUNCTION 25 121 FUNCTION 26 122 FUNCTION 27 123 FUNCTION 28 124// tfunc02 is > 16Mb away, expect range extension thunks in precreated thunk 125// section 126// CHECK8: <tfunc28>: 127// CHECK8-NEXT: 1e00000: 4770 bx lr 128// CHECK8-NEXT: 1e00002: f600 900d b.w 0x1000020 <__Thumbv7ABSLongThunk_tfunc02> 129 130 b.w tfunc02 131 FUNCTION 29 132 FUNCTION 30 133 FUNCTION 31 134 FUNCTION 32 135 // tfunc15 and tfunc16 are > 16 Mb away expect Thunks in the nearest 136 // precreated thunk section. 137 bl tfunc15 138 bl tfunc16 139// CHECK9: <tfunc32>: 140// CHECK9: 2200000: 4770 bx lr 141// CHECK9-NEXT: 2200002: f5ff d7ff bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15> 142// CHECK9-NEXT: 2200006: f5ff d7ff bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16> 143 144 FUNCTION 33 145 bl tfunc15 146 bl tfunc16 147// CHECK10: <tfunc33>: 148// CHECK10: 2300000: 4770 bx lr 149// CHECK10-NEXT: 2300002: f4ff d7ff bl 0x1400004 <__Thumbv7ABSLongThunk_tfunc15> 150// CHECK10-NEXT: 2300006: f4ff d7ff bl 0x1400008 <__Thumbv7ABSLongThunk_tfunc16> 151