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 15 .globl destructor 16 .p2align 4, 0x90 17 .type destructor,@function 18destructor: 19.Ldestructor$local: 20 21 leaq .L.str.d(%rip), %rdi 22 jmp puts@PLT 23 24 .globl main 25 .p2align 4, 0x90 26 .type main,@function 27main: 28.Lmain$local: 29 30 pushq %rax 31 leaq .L.str(%rip), %rdi 32 callq puts@PLT 33 xorl %eax, %eax 34 popq %rcx 35 retq 36 37 .p2align 4, 0x90 38 .type constructor.65535,@function 39constructor.65535: 40 41 pushq %rax 42 leaq .L.str.65535(%rip), %rdi 43 callq puts@PLT 44 leaq .Ldestructor$local(%rip), %rdi 45 leaq __dso_handle(%rip), %rdx 46 xorl %esi, %esi 47 popq %rax 48 jmp __cxa_atexit@PLT 49 50 .p2align 4, 0x90 51 .type constructor.200,@function 52constructor.200: 53 54 leaq .L.str.200(%rip), %rdi 55 jmp puts@PLT 56 57 .p2align 4, 0x90 58 .type constructor.100,@function 59constructor.100: 60 61 leaq .L.str.100(%rip), %rdi 62 jmp puts@PLT 63 64 .hidden __dso_handle 65 .type .L.str,@object 66 .section .rodata.str1.1,"aMS",@progbits,1 67.L.str: 68 .asciz "main" 69 .size .L.str, 5 70 71 .type .L.str.100,@object 72.L.str.100: 73 .asciz "constructor 100" 74 .size .L.str.100, 16 75 76 .type .L.str.200,@object 77.L.str.200: 78 .asciz "constructor 200" 79 .size .L.str.200, 16 80 81 .type .L.str.65535,@object 82.L.str.65535: 83 .asciz "constructor 65535" 84 .size .L.str.65535, 18 85 86 .type .L.str.d,@object 87.L.str.d: 88 .asciz "destructor" 89 .size .L.str.d, 11 90 91 .section .init_array.100,"aw",@init_array 92 .p2align 3 93 .quad constructor.100 94 .section .init_array.200,"aw",@init_array 95 .p2align 3 96 .quad constructor.200 97 .section .init_array,"aw",@init_array 98 .p2align 3 99 .quad constructor.65535 100