1 | // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s |
2 | // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s -O2 | opt - -S -globalopt -o - | FileCheck %s --check-prefix=O1 |
3 | // RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | FileCheck %s |
4 | // RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s -O2 | opt - -S -globalopt -o - | FileCheck %s --check-prefix=O1 |
5 | |
6 | // Check that GlobalOpt can eliminate static constructors for simple implicit |
7 | // constructors. This is a targeted integration test to make sure that LLVM's |
8 | // optimizers are able to process Clang's IR. GlobalOpt in particular is |
9 | // sensitive to the casts we emit. |
10 | |
11 | // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] |
12 | // CHECK: [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_ctor_globalopt.cpp, i8* null }] |
13 | |
14 | // CHECK-LABEL: define internal {{.*}}void @_GLOBAL__sub_I_ctor_globalopt.cpp() |
15 | // CHECK: call {{.*}}void @ |
16 | // CHECK-NOT: call{{ }} |
17 | |
18 | // O1: @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer |
19 | |
20 | struct A { |
21 | virtual void f(); |
22 | int a; |
23 | }; |
24 | struct B : virtual A { |
25 | virtual void g(); |
26 | int b; |
27 | }; |
28 | B b; |
29 | |