1 | // Test that ELF static initializers with different constructor priorities work |
2 | // and are executed in the proper order. |
3 | // |
4 | // RUN: %clang -c -o %t %s |
5 | // RUN: %llvm_jitlink %t | FileCheck %s |
6 | |
7 | // CHECK: constructor 100 |
8 | // CHECK-NEXT: constructor 200 |
9 | // CHECK-NEXT: constructor 65535 |
10 | // CHECK-NEXT: main |
11 | // CHECK-NEXT: destructor |
12 | |
13 | .text |
14 | .abiversion 2 |
15 | .globl constructor.100 |
16 | .p2align 4 |
17 | .type constructor.100,@function |
18 | constructor.100: |
19 | .Lfunc_begin0: |
20 | .Lfunc_gep0: |
21 | addis 2, 12, .TOC.-.Lfunc_gep0@ha |
22 | addi 2, 2, .TOC.-.Lfunc_gep0@l |
23 | .Lfunc_lep0: |
24 | .localentry constructor.100, .Lfunc_lep0-.Lfunc_gep0 |
25 | mflr 0 |
26 | stdu 1, -32(1) |
27 | std 0, 48(1) |
28 | addis 3, 2, .L.str@toc@ha |
29 | addi 3, 3, .L.str@toc@l |
30 | bl puts |
31 | nop |
32 | addi 1, 1, 32 |
33 | ld 0, 16(1) |
34 | mtlr 0 |
35 | blr |
36 | .long 0 |
37 | .quad 0 |
38 | .Lfunc_end0: |
39 | .size constructor.100, .Lfunc_end0-.Lfunc_begin0 |
40 | |
41 | .globl constructor.200 |
42 | .p2align 4 |
43 | .type constructor.200,@function |
44 | constructor.200: |
45 | .Lfunc_begin1: |
46 | .Lfunc_gep1: |
47 | addis 2, 12, .TOC.-.Lfunc_gep1@ha |
48 | addi 2, 2, .TOC.-.Lfunc_gep1@l |
49 | .Lfunc_lep1: |
50 | .localentry constructor.200, .Lfunc_lep1-.Lfunc_gep1 |
51 | mflr 0 |
52 | stdu 1, -32(1) |
53 | std 0, 48(1) |
54 | addis 3, 2, .L.str.1@toc@ha |
55 | addi 3, 3, .L.str.1@toc@l |
56 | bl puts |
57 | nop |
58 | addi 1, 1, 32 |
59 | ld 0, 16(1) |
60 | mtlr 0 |
61 | blr |
62 | .long 0 |
63 | .quad 0 |
64 | .Lfunc_end1: |
65 | .size constructor.200, .Lfunc_end1-.Lfunc_begin1 |
66 | |
67 | .globl constructor.65535 |
68 | .p2align 4 |
69 | .type constructor.65535,@function |
70 | constructor.65535: |
71 | .Lfunc_begin2: |
72 | .Lfunc_gep2: |
73 | addis 2, 12, .TOC.-.Lfunc_gep2@ha |
74 | addi 2, 2, .TOC.-.Lfunc_gep2@l |
75 | .Lfunc_lep2: |
76 | .localentry constructor.65535, .Lfunc_lep2-.Lfunc_gep2 |
77 | mflr 0 |
78 | stdu 1, -32(1) |
79 | std 0, 48(1) |
80 | addis 3, 2, .L.str.2@toc@ha |
81 | addi 3, 3, .L.str.2@toc@l |
82 | bl puts |
83 | nop |
84 | addis 3, 2, destructor@toc@ha |
85 | addi 3, 3, destructor@toc@l |
86 | addis 5, 2, __dso_handle@toc@ha |
87 | addi 5, 5, __dso_handle@toc@l |
88 | li 4, 0 |
89 | bl __cxa_atexit |
90 | nop |
91 | addi 1, 1, 32 |
92 | ld 0, 16(1) |
93 | mtlr 0 |
94 | blr |
95 | .long 0 |
96 | .quad 0 |
97 | .Lfunc_end2: |
98 | .size constructor.65535, .Lfunc_end2-.Lfunc_begin2 |
99 | |
100 | .globl destructor |
101 | .p2align 4 |
102 | .type destructor,@function |
103 | destructor: |
104 | .Lfunc_begin3: |
105 | .Lfunc_gep3: |
106 | addis 2, 12, .TOC.-.Lfunc_gep3@ha |
107 | addi 2, 2, .TOC.-.Lfunc_gep3@l |
108 | .Lfunc_lep3: |
109 | .localentry destructor, .Lfunc_lep3-.Lfunc_gep3 |
110 | mflr 0 |
111 | stdu 1, -32(1) |
112 | std 0, 48(1) |
113 | addis 3, 2, .L.str.3@toc@ha |
114 | addi 3, 3, .L.str.3@toc@l |
115 | bl puts |
116 | nop |
117 | addi 1, 1, 32 |
118 | ld 0, 16(1) |
119 | mtlr 0 |
120 | blr |
121 | .long 0 |
122 | .quad 0 |
123 | .Lfunc_end3: |
124 | .size destructor, .Lfunc_end3-.Lfunc_begin3 |
125 | |
126 | .globl main |
127 | .p2align 4 |
128 | .type main,@function |
129 | main: |
130 | .Lfunc_begin4: |
131 | .Lfunc_gep4: |
132 | addis 2, 12, .TOC.-.Lfunc_gep4@ha |
133 | addi 2, 2, .TOC.-.Lfunc_gep4@l |
134 | .Lfunc_lep4: |
135 | .localentry main, .Lfunc_lep4-.Lfunc_gep4 |
136 | mflr 0 |
137 | stdu 1, -32(1) |
138 | std 0, 48(1) |
139 | addis 3, 2, .L.str.4@toc@ha |
140 | addi 3, 3, .L.str.4@toc@l |
141 | bl puts |
142 | nop |
143 | li 3, 0 |
144 | addi 1, 1, 32 |
145 | ld 0, 16(1) |
146 | mtlr 0 |
147 | blr |
148 | .long 0 |
149 | .quad 0 |
150 | .Lfunc_end4: |
151 | .size main, .Lfunc_end4-.Lfunc_begin4 |
152 | |
153 | .hidden __dso_handle |
154 | .type .L.str,@object |
155 | .section .rodata.str1.1,"aMS" ,@progbits,1 |
156 | .L.str: |
157 | .asciz "constructor 100" |
158 | .size .L.str, 16 |
159 | |
160 | .type .L.str.1,@object |
161 | .L.str.1: |
162 | .asciz "constructor 200" |
163 | .size .L.str.1, 16 |
164 | |
165 | .type .L.str.2,@object |
166 | .L.str.2: |
167 | .asciz "constructor 65535" |
168 | .size .L.str.2, 18 |
169 | |
170 | .type .L.str.3,@object |
171 | .L.str.3: |
172 | .asciz "destructor" |
173 | .size .L.str.3, 11 |
174 | |
175 | .type .L.str.4,@object |
176 | .L.str.4: |
177 | .asciz "main" |
178 | .size .L.str.4, 5 |
179 | |
180 | .section .init_array.100,"aw" ,@init_array |
181 | .p2align 3 |
182 | .quad constructor.100 |
183 | .section .init_array.200,"aw" ,@init_array |
184 | .p2align 3 |
185 | .quad constructor.200 |
186 | .section .init_array,"aw" ,@init_array |
187 | .p2align 3 |
188 | .quad constructor.65535 |
189 | |