reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
// REQUIRES: arm
// RUN: llvm-mc -arm-add-build-attributes -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t
// RUN: echo "SECTIONS { \
// RUN:       .text 0x100000 : { *(.text) } \
// RUN:       .textl : { *(.text_l0*) *(.text_l1*) *(.text_l2*) *(.text_l3*) } \
// RUN:       .texth : { *(.text_h0*) *(.text_h1*) *(.text_h2*) *(.text_h3*) } \
// RUN:       }" > %t.script
// RUN: ld.lld --script %t.script %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 -d %t2 -start-address=1048576 -stop-address=1048594 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK1 %s
// RUN: llvm-objdump -d %t2 -start-address=2097152 -stop-address=2097160 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK2 %s
// RUN: llvm-objdump -d %t2 -start-address=11534340 -stop-address=11534350 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK3 %s
// RUN: llvm-objdump -d %t2 -start-address=34603008 -stop-address=34603034 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK4 %s
// RUN: llvm-objdump -d %t2 -start-address=35651584 -stop-address=35651598 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK5 %s
// RUN: llvm-objdump -d %t2 -start-address=68157440 -stop-address=68157472 -triple=thumbv7a-linux-gnueabihf | FileCheck --check-prefix=CHECK6 %s

// Test the range extensions in a linker script where there are several
// OutputSections requiring range extension Thunks. We should be able to reuse
// Thunks between OutputSections but our placement of new Thunks is done on a
// per OutputSection basis
 .syntax unified

// Define a function that we can match with .text_l* aligned on a megabyte
// boundary
 .macro FUNCTIONL suff
 .section .text_l\suff\(), "ax", %progbits
 .thumb
 .balign 0x100000
 .globl tfuncl\suff\()
 .type  tfuncl\suff\(), %function
tfuncl\suff\():
 bx lr
 .endm

// Define a function that we can match with .text_h* aligned on a megabyte
// boundary
 .macro FUNCTIONH suff
 .section .text_h\suff\(), "ax", %progbits
 .thumb
 .balign 0x100000
 .globl tfunch\suff\()
 .type  tfunch\suff\(), %function
tfunch\suff\():
 bx lr
 .endm

 .section .text, "ax", %progbits
 .thumb
 .globl _start
_start:
 bl tfuncl00
 // Expect a range extension thunk in .text OutputSection
 bl tfunch31
// CHECK1: Disassembly of section .text:
// CHECK1-EMPTY:
// CHECK1-NEXT: _start:
// CHECK1-NEXT:   100000:       ff f0 fe ff     bl      #1048572
// CHECK1-NEXT:   100004:       00 f0 00 f8     bl      #0
// CHECK1: __Thumbv7ABSLongThunk_tfunch31:
// CHECK1-NEXT:   100008:       40 f2 01 0c     movw    r12, #1
// CHECK1-NEXT:   10000c:       c0 f2 10 4c     movt    r12, #1040
// CHECK1-NEXT:   100010:       60 47   bx      r12
 FUNCTIONL 00
 // Create a range extension thunk in .textl
 bl tfuncl24
 // We can reuse existing thunk in .text
 bl tfunch31
// CHECK2: Disassembly of section .textl:
// CHECK2-EMPTY:
// CHECK2-NEXT: tfuncl00:
// CHECK2-NEXT:   200000:	70 47 	bx	lr
// CHECK2-NEXT:   200002:	ff f0 ff df 	bl	#9437182
// CHECK2-NEXT:   200006:	ff f6 ff ff 	bl	#-1048578
 FUNCTIONL 01
 FUNCTIONL 02
 FUNCTIONL 03
 FUNCTIONL 04
 FUNCTIONL 05
 FUNCTIONL 06
 FUNCTIONL 07
 FUNCTIONL 08
 FUNCTIONL 09
// CHECK3: __Thumbv7ABSLongThunk_tfuncl24:
// CHECK3-NEXT:   b00004:      ff f2 fc 97     b.w     #15728632 <tfuncl24>
 FUNCTIONL 10
 FUNCTIONL 11
 FUNCTIONL 12
 FUNCTIONL 13
 FUNCTIONL 14
 FUNCTIONL 15
 FUNCTIONL 16
 FUNCTIONL 17
 FUNCTIONL 18
 FUNCTIONL 19
 FUNCTIONL 20
 FUNCTIONL 21
 FUNCTIONL 22
 FUNCTIONL 23
 FUNCTIONL 24
 FUNCTIONL 25
 FUNCTIONL 26
 FUNCTIONL 27
 FUNCTIONL 28
 FUNCTIONL 29
 FUNCTIONL 30
 FUNCTIONL 31
 // Create range extension thunks in .textl
 bl tfuncl00
 bl tfuncl24
 // Shouldn't need a thunk
 bl tfunch00
// CHECK4:  2100002:    00 f0 05 f8     bl      #10
// CHECK4-NEXT:  2100006:       ff f4 fb f7     bl      #-7340042
// CHECK4-NEXT:  210000a:       ff f0 f9 ff     bl      #1048562
// CHECK4: __Thumbv7ABSLongThunk_tfuncl00:
// CHECK4-NEXT:  2100010:       40 f2 01 0c     movw    r12, #1
// CHECK4-NEXT:  2100014:       c0 f2 20 0c     movt    r12, #32
// CHECK4-NEXT:  2100018:       60 47   bx      r12
 FUNCTIONH 00
 // Can reuse existing thunks in .textl
 bl tfuncl00
 bl tfuncl24
 // Shouldn't need a thunk
        bl tfuncl31
// CHECK5:  Disassembly of section .texth:
// CHECK5-EMPTY:
// CHECK5-NEXT: tfunch00:
// CHECK5-NEXT:  2200000:       70 47   bx      lr
// CHECK5-NEXT:  2200002:       00 f7 05 f8     bl      #-1048566
// CHECK5-NEXT:  2200006:       ff f7 fb df     bl      #-8388618
// CHECK5-NEXT:  220000a:       ff f6 f9 ff     bl      #-1048590
 FUNCTIONH 01
 FUNCTIONH 02
 FUNCTIONH 03
 FUNCTIONH 04
 FUNCTIONH 05
 FUNCTIONH 06
 FUNCTIONH 07
 FUNCTIONH 08
 FUNCTIONH 09
 FUNCTIONH 10
 FUNCTIONH 11
 FUNCTIONH 12
 FUNCTIONH 13
 FUNCTIONH 14
 FUNCTIONH 15
 FUNCTIONH 16
 FUNCTIONH 17
 FUNCTIONH 18
 FUNCTIONH 19
 FUNCTIONH 20
 FUNCTIONH 21
 FUNCTIONH 22
 FUNCTIONH 23
 FUNCTIONH 24
 FUNCTIONH 25
 FUNCTIONH 26
 FUNCTIONH 27
 FUNCTIONH 28
 FUNCTIONH 29
 FUNCTIONH 30
 FUNCTIONH 31
// expect Thunks in .texth
 bl tfuncl00
 bl tfunch00
// CHECK6: tfunch31:
// CHECK6-NEXT:  4100000:       70 47   bx      lr
// CHECK6-NEXT:  4100002:       00 f0 03 f8     bl      #6
// CHECK6-NEXT:  4100006:       00 f0 06 f8     bl      #12
// CHECK6: __Thumbv7ABSLongThunk_tfuncl00:
// CHECK6-NEXT:  410000c:       40 f2 01 0c     movw    r12, #1
// CHECK6-NEXT:  4100010:       c0 f2 20 0c     movt    r12, #32
// CHECK6-NEXT:  4100014:       60 47   bx      r12
// CHECK6: __Thumbv7ABSLongThunk_tfunch00:
// CHECK6-NEXT:  4100016:       40 f2 01 0c     movw    r12, #1
// CHECK6-NEXT:  410001a:       c0 f2 20 2c     movt    r12, #544
// CHECK6-NEXT:  410001e:       60 47   bx      r12