// 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
.abiversion 2
.globl constructor.100
.p2align 4
.type constructor.100,@function
constructor.100:
.Lfunc_begin0:
.Lfunc_gep0:
addis 2, 12, .TOC.-.Lfunc_gep0@ha
addi 2, 2, .TOC.-.Lfunc_gep0@l
.Lfunc_lep0:
.localentry constructor.100, .Lfunc_lep0-.Lfunc_gep0
mflr 0
stdu 1, -32(1)
std 0, 48(1)
addis 3, 2, .L.str@toc@ha
addi 3, 3, .L.str@toc@l
bl puts
nop
addi 1, 1, 32
ld 0, 16(1)
mtlr 0
blr
.long 0
.quad 0
.Lfunc_end0:
.size constructor.100, .Lfunc_end0-.Lfunc_begin0
.globl constructor.200
.p2align 4
.type constructor.200,@function
constructor.200:
.Lfunc_begin1:
.Lfunc_gep1:
addis 2, 12, .TOC.-.Lfunc_gep1@ha
addi 2, 2, .TOC.-.Lfunc_gep1@l
.Lfunc_lep1:
.localentry constructor.200, .Lfunc_lep1-.Lfunc_gep1
mflr 0
stdu 1, -32(1)
std 0, 48(1)
addis 3, 2, .L.str.1@toc@ha
addi 3, 3, .L.str.1@toc@l
bl puts
nop
addi 1, 1, 32
ld 0, 16(1)
mtlr 0
blr
.long 0
.quad 0
.Lfunc_end1:
.size constructor.200, .Lfunc_end1-.Lfunc_begin1
.globl constructor.65535
.p2align 4
.type constructor.65535,@function
constructor.65535:
.Lfunc_begin2:
.Lfunc_gep2:
addis 2, 12, .TOC.-.Lfunc_gep2@ha
addi 2, 2, .TOC.-.Lfunc_gep2@l
.Lfunc_lep2:
.localentry constructor.65535, .Lfunc_lep2-.Lfunc_gep2
mflr 0
stdu 1, -32(1)
std 0, 48(1)
addis 3, 2, .L.str.2@toc@ha
addi 3, 3, .L.str.2@toc@l
bl puts
nop
addis 3, 2, destructor@toc@ha
addi 3, 3, destructor@toc@l
addis 5, 2, __dso_handle@toc@ha
addi 5, 5, __dso_handle@toc@l
li 4, 0
bl __cxa_atexit
nop
addi 1, 1, 32
ld 0, 16(1)
mtlr 0
blr
.long 0
.quad 0
.Lfunc_end2:
.size constructor.65535, .Lfunc_end2-.Lfunc_begin2
.globl destructor
.p2align 4
.type destructor,@function
destructor:
.Lfunc_begin3:
.Lfunc_gep3:
addis 2, 12, .TOC.-.Lfunc_gep3@ha
addi 2, 2, .TOC.-.Lfunc_gep3@l
.Lfunc_lep3:
.localentry destructor, .Lfunc_lep3-.Lfunc_gep3
mflr 0
stdu 1, -32(1)
std 0, 48(1)
addis 3, 2, .L.str.3@toc@ha
addi 3, 3, .L.str.3@toc@l
bl puts
nop
addi 1, 1, 32
ld 0, 16(1)
mtlr 0
blr
.long 0
.quad 0
.Lfunc_end3:
.size destructor, .Lfunc_end3-.Lfunc_begin3
.globl main
.p2align 4
.type main,@function
main:
.Lfunc_begin4:
.Lfunc_gep4:
addis 2, 12, .TOC.-.Lfunc_gep4@ha
addi 2, 2, .TOC.-.Lfunc_gep4@l
.Lfunc_lep4:
.localentry main, .Lfunc_lep4-.Lfunc_gep4
mflr 0
stdu 1, -32(1)
std 0, 48(1)
addis 3, 2, .L.str.4@toc@ha
addi 3, 3, .L.str.4@toc@l
bl puts
nop
li 3, 0
addi 1, 1, 32
ld 0, 16(1)
mtlr 0
blr
.long 0
.quad 0
.Lfunc_end4:
.size main, .Lfunc_end4-.Lfunc_begin4
.hidden __dso_handle
.type .L.str,@object
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "constructor 100"
.size .L.str, 16
.type .L.str.1,@object
.L.str.1:
.asciz "constructor 200"
.size .L.str.1, 16
.type .L.str.2,@object
.L.str.2:
.asciz "constructor 65535"
.size .L.str.2, 18
.type .L.str.3,@object
.L.str.3:
.asciz "destructor"
.size .L.str.3, 11
.type .L.str.4,@object
.L.str.4:
.asciz "main"
.size .L.str.4, 5
.section .init_array.100,"aw",@init_array
.p2align 3
.quad constructor.100
.section .init_array.200,"aw",@init_array
.p2align 3
.quad constructor.200
.section .init_array,"aw",@init_array
.p2align 3
.quad constructor.65535