blob: b9a68fe0eae19edc15fc1e9b79137facdff48e8a [file] [log] [blame]
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +00001// RUN: %clang_cc1 -emit-llvm -o - -O0 -fthread-sanitizer %s | FileCheck %s
Kostya Serebryany8cb4a072012-03-26 17:03:51 +00002// RUN: %clang_cc1 -emit-llvm -o - -O1 %s | FileCheck %s
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +00003// RUN: %clang_cc1 -emit-llvm -o - -O1 -relaxed-aliasing -fthread-sanitizer %s | FileCheck %s
4//
5// RUN: %clang_cc1 -emit-llvm -o - -O0 %s | FileCheck %s --check-prefix=NOTBAA
6// RUN: %clang_cc1 -emit-llvm -o - -O2 -relaxed-aliasing %s | FileCheck %s --check-prefix=NOTBAA
7//
Kostya Serebryany8cb4a072012-03-26 17:03:51 +00008// Check that we generate TBAA for vtable pointer loads and stores.
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +00009// When -fthread-sanitizer is used TBAA should be generated at all opt levels
10// even if -relaxed-aliasing is present.
Kostya Serebryany8cb4a072012-03-26 17:03:51 +000011struct A {
12 virtual int foo() const ;
13 virtual ~A();
14};
15
16void CreateA() {
17 new A;
18}
19
20void CallFoo(A *a) {
21 a->foo();
22}
23
Daniel Dunbar5432ff22012-03-26 20:18:16 +000024// CHECK: %{{.*}} = load {{.*}} !tbaa !0
Kostya Serebryany8cb4a072012-03-26 17:03:51 +000025// CHECK: store {{.*}} !tbaa !0
Kostya Serebryanyc9fe6052012-04-24 06:57:01 +000026// CHECK: = metadata !{metadata !"vtable pointer", metadata !{{.*}}}
27// NOTBAA-NOT: = metadata !{metadata !"Simple C/C++ TBAA"}