We currently use i32 (...)** as the type of the vptr field in the LLVM struct type. LLVM's GlobalOpt prefers any bitcasts to be on the side of the data being stored rather than on the pointer being stored to. Reviewers: majnemer Differential Revision: http://reviews.llvm.org/D5916 llvm-svn: 223267
29 lines
1.1 KiB
C++
29 lines
1.1 KiB
C++
// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s -O1 | FileCheck %s --check-prefix=O1
|
|
// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | FileCheck %s
|
|
// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s -O1 | FileCheck %s --check-prefix=O1
|
|
|
|
// Check that GlobalOpt can eliminate static constructors for simple implicit
|
|
// constructors. This is a targetted integration test to make sure that LLVM's
|
|
// optimizers are able to process Clang's IR. GlobalOpt in particular is
|
|
// sensitive to the casts we emit.
|
|
|
|
// CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }]
|
|
// CHECK: [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_ctor_globalopt.cpp, i8* null }]
|
|
|
|
// CHECK-LABEL: define internal void @_GLOBAL__sub_I_ctor_globalopt.cpp()
|
|
// CHECK: call void @
|
|
// CHECK-NOT: call
|
|
|
|
// O1: @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
|
|
|
|
struct A {
|
|
virtual void f();
|
|
int a;
|
|
};
|
|
struct B : virtual A {
|
|
virtual void g();
|
|
int b;
|
|
};
|
|
B b;
|