// Test that ELF static initializers with different constructor priorities work
// and are executed in the proper order.
//
// RUN: %clang -c -o %t %s
// RUN: %llvm_jitlink %t | FileCheck %s
// CHECK: constructor 100
// CHECK-NEXT: constructor 200
// CHECK-NEXT: constructor 65535
// CHECK-NEXT: main
// CHECK-NEXT: destructor
.text
.globl destructor
.p2align 2
.type destructor,@function
destructor:
.Ldestructor$local:
adrp x0, .L.str.2
add x0, x0, :lo12:.L.str.2
b puts
.globl main
.p2align 2
.type main,@function
main:
str x30, [sp, #-16]!
adrp x0, .L.str
add x0, x0, :lo12:.L.str
bl puts
mov w0, wzr
ldr x30, [sp], #16
ret
.p2align 2
.type constructor.65535,@function
constructor.65535:
str x30, [sp, #-16]!
adrp x0, .L.str.65535
add x0, x0, :lo12:.L.str.65535
bl puts
adrp x0, .Ldestructor$local
add x0, x0, :lo12:.Ldestructor$local
adrp x2, __dso_handle
add x2, x2, :lo12:__dso_handle
mov x1, xzr
ldr x30, [sp], #16
b __cxa_atexit
.p2align 2
.type constructor.100,@function
constructor.100:
str x30, [sp, #-16]!
adrp x0, .L.str.100
add x0, x0, :lo12:.L.str.100
bl puts
ldr x30, [sp], #16
ret
.p2align 2
.type constructor.200,@function
constructor.200:
str x30, [sp, #-16]!
adrp x0, .L.str.200
add x0, x0, :lo12:.L.str.200
bl puts
ldr x30, [sp], #16
ret
.hidden __dso_handle
.type .L.str,@object
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "main"
.size .L.str, 5
.type .L.str.100,@object
.L.str.100:
.asciz "constructor 100"
.size .L.str.100, 16
.type .L.str.200,@object
.L.str.200:
.asciz "constructor 200"
.size .L.str.200, 16
.type .L.str.65535,@object
.L.str.65535:
.asciz "constructor 65535"
.size .L.str.65535, 18
.type .L.str.2,@object
.L.str.2:
.asciz "destructor"
.size .L.str.2, 11
.section .init_array.100,"aw",@init_array
.p2align 3
.xword constructor.100
.section .init_array.200,"aw",@init_array
.p2align 3
.xword constructor.200
.section .init_array,"aw",@init_array
.p2align 3
.xword constructor.65535