]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ELF/gnu-ifunc.s
Vendor import of lld trunk r338150:
[FreeBSD/FreeBSD.git] / test / ELF / gnu-ifunc.s
1 // REQUIRES: x86
2 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
3 // RUN: ld.lld -static %t.o -o %tout
4 // RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DISASM
5 // RUN: llvm-readobj -r -symbols -sections %tout | FileCheck %s
6
7 // CHECK:      Sections [
8 // CHECK:       Section {
9 // CHECK:       Index: 1
10 // CHECK-NEXT:  Name: .rela.plt
11 // CHECK-NEXT:  Type: SHT_RELA
12 // CHECK-NEXT:  Flags [
13 // CHECK-NEXT:    SHF_ALLOC
14 // CHECK-NEXT:  ]
15 // CHECK-NEXT:  Address: [[RELA:.*]]
16 // CHECK-NEXT:  Offset: 0x158
17 // CHECK-NEXT:  Size: 48
18 // CHECK-NEXT:  Link: 0
19 // CHECK-NEXT:  Info: 0
20 // CHECK-NEXT:  AddressAlignment: 8
21 // CHECK-NEXT:  EntrySize: 24
22 // CHECK-NEXT: }
23 // CHECK:      Relocations [
24 // CHECK-NEXT:   Section ({{.*}}) .rela.plt {
25 // CHECK-NEXT:     0x202000 R_X86_64_IRELATIVE
26 // CHECK-NEXT:     0x202008 R_X86_64_IRELATIVE
27 // CHECK-NEXT:   }
28 // CHECK-NEXT: ]
29 // CHECK:      Symbols [
30 // CHECK-NEXT:  Symbol {
31 // CHECK-NEXT:    Name:
32 // CHECK-NEXT:    Value: 0x0
33 // CHECK-NEXT:    Size: 0
34 // CHECK-NEXT:    Binding: Local
35 // CHECK-NEXT:    Type: None
36 // CHECK-NEXT:    Other: 0
37 // CHECK-NEXT:    Section: Undefined
38 // CHECK-NEXT:  }
39 // CHECK-NEXT:  Symbol {
40 // CHECK-NEXT:    Name: __rela_iplt_end
41 // CHECK-NEXT:    Value: 0x200188
42 // CHECK-NEXT:    Size: 0
43 // CHECK-NEXT:    Binding: Local
44 // CHECK-NEXT:    Type: None
45 // CHECK-NEXT:    Other [
46 // CHECK-NEXT:      STV_HIDDEN
47 // CHECK-NEXT:    ]
48 // CHECK-NEXT:    Section: .rela.plt
49 // CHECK-NEXT:  }
50 // CHECK-NEXT:  Symbol {
51 // CHECK-NEXT:    Name: __rela_iplt_start
52 // CHECK-NEXT:    Value: [[RELA]]
53 // CHECK-NEXT:    Size: 0
54 // CHECK-NEXT:    Binding: Local
55 // CHECK-NEXT:    Type: None
56 // CHECK-NEXT:    Other [
57 // CHECK-NEXT:      STV_HIDDEN
58 // CHECK-NEXT:    ]
59 // CHECK-NEXT:    Section: .rela.plt
60 // CHECK-NEXT:  }
61 // CHECK-NEXT:  Symbol {
62 // CHECK-NEXT:    Name: _start
63 // CHECK-NEXT:    Value: 0x201002
64 // CHECK-NEXT:    Size: 0
65 // CHECK-NEXT:    Binding: Global
66 // CHECK-NEXT:    Type: None
67 // CHECK-NEXT:    Other: 0
68 // CHECK-NEXT:    Section: .text
69 // CHECK-NEXT:  }
70 // CHECK-NEXT:  Symbol {
71 // CHECK-NEXT:    Name: bar
72 // CHECK-NEXT:    Value: 0x201001
73 // CHECK-NEXT:    Size: 0
74 // CHECK-NEXT:    Binding: Global
75 // CHECK-NEXT:    Type: GNU_IFunc
76 // CHECK-NEXT:    Other: 0
77 // CHECK-NEXT:    Section: .text
78 // CHECK-NEXT:  }
79 // CHECK-NEXT:  Symbol {
80 // CHECK-NEXT:    Name: foo
81 // CHECK-NEXT:    Value: 0x201000
82 // CHECK-NEXT:    Size: 0
83 // CHECK-NEXT:    Binding: Global
84 // CHECK-NEXT:    Type: GNU_IFunc
85 // CHECK-NEXT:    Other: 0
86 // CHECK-NEXT:    Section: .text
87 // CHECK-NEXT:  }
88 // CHECK-NEXT: ]
89
90 // DISASM: Disassembly of section .text:
91 // DISASM-NEXT: foo:
92 // DISASM-NEXT:  201000: {{.*}} retq
93 // DISASM:      bar:
94 // DISASM-NEXT:  201001: {{.*}} retq
95 // DISASM:      _start:
96 // DISASM-NEXT:  201002: {{.*}} callq 25
97 // DISASM-NEXT:  201007: {{.*}} callq 36
98 // DISASM-NEXT:  20100c: {{.*}} movl $2097496, %edx
99 // DISASM-NEXT:  201011: {{.*}} movl $2097544, %edx
100 // DISASM-NEXT:  201016: {{.*}} movl $2097545, %edx
101 // DISASM-NEXT: Disassembly of section .plt:
102 // DISASM-NEXT: .plt:
103 // DISASM-NEXT:  201020: {{.*}} jmpq *4058(%rip)
104 // DISASM-NEXT:  201026: {{.*}} pushq $0
105 // DISASM-NEXT:  20102b: {{.*}} jmp -32 <_start+0xe>
106 // DISASM-NEXT:  201030: {{.*}} jmpq *4050(%rip)
107 // DISASM-NEXT:  201036: {{.*}} pushq $1
108 // DISASM-NEXT:  20103b: {{.*}} jmp -48 <_start+0xe>
109
110 .text
111 .type foo STT_GNU_IFUNC
112 .globl foo
113 foo:
114  ret
115
116 .type bar STT_GNU_IFUNC
117 .globl bar
118 bar:
119  ret
120
121 .globl _start
122 _start:
123  call foo
124  call bar
125  movl $__rela_iplt_start,%edx
126  movl $__rela_iplt_end,%edx
127  movl $__rela_iplt_end + 1,%edx