blob: 2ba42118dddbc4db963969f56e6b7a985d4ad0a7 [file] [log] [blame] [edit]
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -mmlir --mlir-print-ir-before=cir-lowering-prepare %s -o %t.cir 2>&1 | FileCheck %s -check-prefix=BEFORE
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -mmlir --mlir-print-ir-after=cir-lowering-prepare %s -o %t.cir 2>&1 | FileCheck %s -check-prefix=AFTER
// RUN: cir-opt %t.cir -o - | FileCheck %s -check-prefix=AFTER
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o - | FileCheck %s -check-prefix=LLVM
class Init {
public:
Init(bool a) ;
~Init();
private:
static bool _S_synced_with_stdio;
};
static Init __ioinit(true);
static Init __ioinit2(false);
// BEFORE: module {{.*}} {
// BEFORE-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_Init>, !cir.bool)
// BEFORE-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_Init>)
// BEFORE-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = ctor : !ty_Init {
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
// BEFORE-NEXT: %1 = cir.const #true
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
// BEFORE-NEXT: } dtor {
// BEFORE-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
// BEFORE-NEXT: cir.call @_ZN4InitD1Ev(%0) : (!cir.ptr<!ty_Init>) -> ()
// BEFORE-NEXT: } {alignment = 1 : i64, ast = #cir.var.decl.ast}
// BEFORE: cir.global "private" internal dsolocal @_ZL9__ioinit2 = ctor : !ty_Init {
// BEFORE-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
// BEFORE-NEXT: %1 = cir.const #false
// BEFORE-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
// BEFORE-NEXT: } dtor {
// BEFORE-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
// BEFORE-NEXT: cir.call @_ZN4InitD1Ev(%0) : (!cir.ptr<!ty_Init>) -> ()
// BEFORE-NEXT: } {alignment = 1 : i64, ast = #cir.var.decl.ast}
// BEFORE-NEXT: }
// AFTER: module {{.*}} attributes {{.*}}cir.global_ctors = [#cir.global_ctor<"__cxx_global_var_init", 65536>, #cir.global_ctor<"__cxx_global_var_init.1", 65536>]
// AFTER-NEXT: cir.global "private" external @__dso_handle : i8
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_Init>, !cir.bool)
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_Init>)
// AFTER-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = #cir.zero : !ty_Init {alignment = 1 : i64, ast = #cir.var.decl.ast}
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init()
// AFTER-NEXT: %0 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
// AFTER-NEXT: %1 = cir.const #true
// AFTER-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
// AFTER-NEXT: %2 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>
// AFTER-NEXT: %5 = cir.cast(bitcast, %2 : !cir.ptr<!ty_Init>), !cir.ptr<!void>
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
// AFTER-NEXT: cir.return
// AFTER: cir.global "private" internal dsolocal @_ZL9__ioinit2 = #cir.zero : !ty_Init {alignment = 1 : i64, ast = #cir.var.decl.ast}
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init.1()
// AFTER-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
// AFTER-NEXT: %1 = cir.const #false
// AFTER-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
// AFTER-NEXT: %2 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>
// AFTER-NEXT: %5 = cir.cast(bitcast, %2 : !cir.ptr<!ty_Init>), !cir.ptr<!void>
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
// AFTER-NEXT: cir.return
// AFTER: cir.func private @_GLOBAL__sub_I_static.cpp()
// AFTER-NEXT: cir.call @__cxx_global_var_init() : () -> ()
// AFTER-NEXT: cir.call @__cxx_global_var_init.1() : () -> ()
// AFTER-NEXT: cir.return
// LLVM: @__dso_handle = external global i8
// LLVM: @_ZL8__ioinit = internal global %class.Init zeroinitializer
// LLVM: @_ZL9__ioinit2 = internal global %class.Init zeroinitializer
// LLVM: @llvm.global_ctors = appending constant [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65536, ptr @__cxx_global_var_init, ptr null }, { i32, ptr, ptr } { i32 65536, ptr @__cxx_global_var_init.1, ptr null }]
// LLVM: define internal void @__cxx_global_var_init()
// LLVM-NEXT: call void @_ZN4InitC1Eb(ptr @_ZL8__ioinit, i8 1)
// LLVM-NEXT: call void @__cxa_atexit(ptr @_ZN4InitD1Ev, ptr @_ZL8__ioinit, ptr @__dso_handle)
// LLVM-NEXT: ret void
// LLVM: define internal void @__cxx_global_var_init.1()
// LLVM-NEXT: call void @_ZN4InitC1Eb(ptr @_ZL9__ioinit2, i8 0)
// LLVM-NEXT: call void @__cxa_atexit(ptr @_ZN4InitD1Ev, ptr @_ZL9__ioinit2, ptr @__dso_handle)
// LLVM-NEXT: ret void
// LLVM: define void @_GLOBAL__sub_I_static.cpp()
// LLVM-NEXT: call void @__cxx_global_var_init()
// LLVM-NEXT: call void @__cxx_global_var_init.1()
// LLVM-NEXT: ret void