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
// REQUIRES: arm
// RUN: llvm-mc -filetype=obj -triple=thumbv7-windows %s -o %t.obj
// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe -verbose 2>&1 | FileCheck -check-prefix=VERBOSE %s
// RUN: llvm-objdump -d %t.exe -start-address=0x401000 -stop-address=0x401022 | FileCheck -check-prefix=MAIN %s
// RUN: llvm-objdump -d %t.exe -start-address=0x501022 -stop-address=0x501032 | FileCheck -check-prefix=FUNC1 %s
// RUN: llvm-objdump -d %t.exe -start-address=0x601032 | FileCheck -check-prefix=FUNC2 %s

// VERBOSE: Added 3 thunks with margin {{.*}} in 1 passes

    .syntax unified
    .globl main
    .globl func1
    .text
main:
    bne func1
    bne func2
    // This should reuse the same thunk as func1 above
    bne func1_alias
    bx lr
    .section .text$a, "xr"
    .space 0x100000
    .section .text$b, "xr"
func1:
func1_alias:
    // This shouldn't reuse the func2 thunk from above, since it is out
    // of range.
    bne func2
    bx lr
    .section .text$c, "xr"
    .space 0x100000
    .section .text$d, "xr"
func2:
// Test using string tail merging. This is irrelevant to the thunking itself,
// but running multiple passes of assignAddresses() calls finalizeAddresses()
// multiple times; check that MergeChunk handles this correctly.
    movw r0, :lower16:"??_C@string1"
    movt r0, :upper16:"??_C@string1"
    movw r1, :lower16:"??_C@string2"
    movt r1, :upper16:"??_C@string2"
    bx lr

    .section .rdata,"dr",discard,"??_C@string1"
    .globl "??_C@string1"
"??_C@string1":
    .asciz "foobar"
    .section .rdata,"dr",discard,"??_C@string2"
    .globl "??_C@string2"
"??_C@string2":
    .asciz "bar"

// MAIN:    401000:       40 f0 05 80     bne.w   #10 <.text+0xe>
// MAIN:    401004:       40 f0 08 80     bne.w   #16 <.text+0x18>
// MAIN:    401008:       40 f0 01 80     bne.w   #2 <.text+0xe>
// MAIN:    40100c:       70 47           bx      lr
// func1 thunk
// MAIN:    40100e:       40 f2 08 0c     movw    r12, #8
// MAIN:    401012:       c0 f2 10 0c     movt    r12, #16
// MAIN:    401016:       e7 44           add     pc,  r12
// func2 thunk
// MAIN:    401018:       40 f2 0e 0c     movw    r12, #14
// MAIN:    40101c:       c0 f2 20 0c     movt    r12, #32
// MAIN:    401020:       e7 44           add     pc,  r12

// FUNC1:   501022:       40 f0 01 80     bne.w   #2 <.text+0x100028>
// FUNC1:   501026:       70 47           bx      lr
// func2 thunk
// FUNC1:   501028:       4f f6 fe 7c     movw    r12, #65534
// FUNC1:   50102c:       c0 f2 0f 0c     movt    r12, #15
// FUNC1:   501030:       e7 44           add     pc,  r12

// FUNC2:   601032:       42 f2 00 00     movw    r0, #8192
// FUNC2:   601036:       c0 f2 60 00     movt    r0, #96
// FUNC2:   60103a:       42 f2 03 01     movw    r1, #8195
// FUNC2:   60103e:       c0 f2 60 01     movt    r1, #96
// FUNC2:   601042:       70 47   bx      lr