| // REQUIRES: arm | 
 | // RUN: llvm-mc  -arm-add-build-attributes -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t | 
 | // RUN: ld.lld %t -o %t2 | 
 | // 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 --no-print-imm-hex -d %t2 --start-address=0x100000 --stop-address=0x10000c | FileCheck --check-prefix=CHECK1 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x200000 --stop-address=0x200002 | FileCheck --check-prefix=CHECK2 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x300000 --stop-address=0x300002 | FileCheck --check-prefix=CHECK3 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x400000 --stop-address=0x400006 | FileCheck --check-prefix=CHECK4 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1000000 --stop-address=0x1000036 | FileCheck --check-prefix=CHECK5 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1100000 --stop-address=0x1100010 | FileCheck --check-prefix=CHECK6 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1400004 --stop-address=0x140000c | FileCheck --check-prefix=CHECK7 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x1e00000 --stop-address=0x1e00006 | FileCheck --check-prefix=CHECK8 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x2200000 --stop-address=0x220000a | FileCheck --check-prefix=CHECK9 %s | 
 | // RUN: llvm-objdump --no-print-imm-hex -d %t2 --start-address=0x2300000 --stop-address=0x230000a | FileCheck --check-prefix=CHECK10 %s | 
 |  | 
 | // Test the Range extension Thunks for Thumb when all the code is in a single | 
 | // OutputSection. The Thumb unconditional branch b.w and branch and link bl | 
 | // instructions have a range of 16Mb. We create a series of Functions a | 
 | // megabyte apart. We expect range extension thunks to be created when a | 
 | // branch is out of range. Thunks will be reused whenever they are in range | 
 |  .syntax unified | 
 |  | 
 | // Define a function aligned on a megabyte boundary | 
 |  .macro FUNCTION suff | 
 |  .section .text.\suff\(), "ax", %progbits | 
 |  .thumb | 
 |  .balign 0x100000 | 
 |  .globl tfunc\suff\() | 
 |  .type  tfunc\suff\(), %function | 
 | tfunc\suff\(): | 
 |  bx lr | 
 |  .endm | 
 |  | 
 |  .section .text, "ax", %progbits | 
 |  .thumb | 
 |  .globl _start | 
 | _start: | 
 | // tfunc00 and tfunc15 are within 16Mb no Range Thunks expected | 
 |  bl tfunc00 | 
 |  bl tfunc15 | 
 | // tfunc16 is > 16Mb away, expect a Range Thunk to be generated, to go into | 
 | // the first of the pre-created ThunkSections. | 
 |  bl tfunc16 | 
 | // CHECK1: Disassembly of section .text: | 
 | // CHECK1-EMPTY: | 
 | // CHECK1-NEXT: <_start>: | 
 | // CHECK1-NEXT:   100000:       f0ff fffe       bl      0x200000 <tfunc00> | 
 | // CHECK1-NEXT:   100004:       f3ff d7fc       bl      0x1100000 <tfunc15> | 
 | // CHECK1-NEXT:   100008:       f2ff d7fc       bl      0x1000004 <__Thumbv7ABSLongThunk_tfunc16> | 
 |  | 
 |  FUNCTION 00 | 
 | // CHECK2:  <tfunc00>: | 
 | // CHECK2-NEXT:   200000:       4770    bx      lr | 
 |         FUNCTION 01 | 
 | // CHECK3: <tfunc01>: | 
 | // CHECK3-NEXT:   300000:       4770    bx      lr | 
 |  FUNCTION 02 | 
 | // tfunc28 is > 16Mb away, expect a Range Thunk to be generated, to go into | 
 | // the first of the pre-created ThunkSections. | 
 |         b.w tfunc28 | 
 | // CHECK4: <tfunc02>: | 
 | // CHECK4-NEXT:   400000:       4770    bx      lr | 
 | // CHECK4-NEXT:   400002:       f000 9001       b.w     0x1000008 <__Thumbv7ABSLongThunk_tfunc28> | 
 |  FUNCTION 03 | 
 |  FUNCTION 04 | 
 |  FUNCTION 05 | 
 |  FUNCTION 06 | 
 |  FUNCTION 07 | 
 |  FUNCTION 08 | 
 |  FUNCTION 09 | 
 |  FUNCTION 10 | 
 |  FUNCTION 11 | 
 |  FUNCTION 12 | 
 |  FUNCTION 13 | 
 |  FUNCTION 14 | 
 | // Expect precreated ThunkSection here | 
 | // CHECK5: <__Thumbv7ABSLongThunk_tfunc16>: | 
 | // CHECK5-NEXT:  1000004:       f1ff bffc       b.w     0x1200000 <tfunc16> | 
 | // CHECK5: <__Thumbv7ABSLongThunk_tfunc28>: | 
 | // CHECK5-NEXT:  1000008:       f1ff 97fa       b.w     0x1e00000 <tfunc28> | 
 | // CHECK5: <__Thumbv7ABSLongThunk_tfunc32>: | 
 | // CHECK5-NEXT:  100000c:       f240 0c01       movw    r12, #1 | 
 | // CHECK5-NEXT:  1000010:       f2c0 2c20       movt    r12, #544 | 
 | // CHECK5-NEXT:  1000014:       4760    bx      r12 | 
 | // CHECK5: <__Thumbv7ABSLongThunk_tfunc33>: | 
 | // CHECK5-NEXT:  1000016:       f240 0c01       movw    r12, #1 | 
 | // CHECK5-NEXT:  100001a:       f2c0 2c30       movt    r12, #560 | 
 | // CHECK5-NEXT:  100001e:       4760    bx      r12 | 
 | // CHECK5: <__Thumbv7ABSLongThunk_tfunc02>: | 
 | // CHECK5-NEXT:  1000020:       f7ff 97ee       b.w     0x400000 <tfunc02> | 
 |  FUNCTION 15 | 
 | // tfunc00 and tfunc01 are < 16Mb away, expect no range extension thunks | 
 |  bl tfunc00 | 
 |  bl tfunc01 | 
 | // tfunc32 and tfunc33 are > 16Mb away, expect range extension thunks in the | 
 | // precreated thunk section | 
 |  bl tfunc32 | 
 |  bl tfunc33 | 
 | // CHECK6:  <tfunc15>: | 
 | // CHECK6-NEXT:  1100000:       4770    bx      lr | 
 | // CHECK6-NEXT:  1100002:       f4ff d7fd       bl      0x200000 <tfunc00> | 
 | // CHECK6-NEXT:  1100006:       f5ff d7fb       bl      0x300000 <tfunc01> | 
 | // CHECK6-NEXT:  110000a:       f6ff ffff       bl      0x100000c <__Thumbv7ABSLongThunk_tfunc32> | 
 | // CHECK6-NEXT:  110000e:       f700 f802       bl      0x1000016 <__Thumbv7ABSLongThunk_tfunc33> | 
 |  FUNCTION 16 | 
 |  FUNCTION 17 | 
 |  FUNCTION 18 | 
 | // Expect another precreated thunk section here | 
 | // CHECK7: <__Thumbv7ABSLongThunk_tfunc15>: | 
 | // CHECK7-NEXT:  1400004:       f4ff bffc       b.w     0x1100000 <tfunc15> | 
 | // CHECK7: <__Thumbv7ABSLongThunk_tfunc16>: | 
 | // CHECK7-NEXT:  1400008:       f5ff bffa       b.w     0x1200000 <tfunc16> | 
 |  FUNCTION 19 | 
 |  FUNCTION 20 | 
 |  FUNCTION 21 | 
 |  FUNCTION 22 | 
 |  FUNCTION 23 | 
 |  FUNCTION 24 | 
 |  FUNCTION 25 | 
 |  FUNCTION 26 | 
 |  FUNCTION 27 | 
 |  FUNCTION 28 | 
 | // tfunc02 is > 16Mb away, expect range extension thunks in precreated thunk | 
 | // section | 
 | // CHECK8:  <tfunc28>: | 
 | // CHECK8-NEXT:  1e00000:       4770    bx      lr | 
 | // CHECK8-NEXT:  1e00002:       f600 900d       b.w     0x1000020 <__Thumbv7ABSLongThunk_tfunc02> | 
 |  | 
 |  b.w tfunc02 | 
 |  FUNCTION 29 | 
 |  FUNCTION 30 | 
 |  FUNCTION 31 | 
 |  FUNCTION 32 | 
 |  // tfunc15 and tfunc16 are > 16 Mb away expect Thunks in the nearest | 
 |  // precreated thunk section. | 
 |  bl tfunc15 | 
 |  bl tfunc16 | 
 | // CHECK9: <tfunc32>: | 
 | // CHECK9:  2200000:    4770    bx      lr | 
 | // CHECK9-NEXT:  2200002:       f5ff d7ff       bl      0x1400004 <__Thumbv7ABSLongThunk_tfunc15> | 
 | // CHECK9-NEXT:  2200006:       f5ff d7ff       bl      0x1400008 <__Thumbv7ABSLongThunk_tfunc16> | 
 |  | 
 |  FUNCTION 33 | 
 |  bl tfunc15 | 
 |  bl tfunc16 | 
 | // CHECK10: <tfunc33>: | 
 | // CHECK10:  2300000:   4770    bx      lr | 
 | // CHECK10-NEXT:  2300002:      f4ff d7ff       bl      0x1400004 <__Thumbv7ABSLongThunk_tfunc15> | 
 | // CHECK10-NEXT:  2300006:      f4ff d7ff       bl      0x1400008 <__Thumbv7ABSLongThunk_tfunc16> |