1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -O1 %s -emit-llvm -o - | FileCheck %s 2 // 3 // Test generating of TBAA metadata for accesses to members of base classes. 4 5 struct A { 6 int x, y, z; 7 }; 8 9 struct B : A { 10 int i; 11 }; 12 13 struct C { 14 int i; 15 B b; 16 int j; 17 }; 18 19 int f1(B *b) { 20 // CHECK-LABEL: _Z2f1P1B 21 // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y:!.*]] 22 return b->y; 23 } 24 25 int f2(C *c) { 26 // CHECK-LABEL: _Z2f2P1C 27 // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]] 28 return (&(c->b))->y; 29 } 30 31 struct D : virtual A 32 {}; 33 34 struct E { 35 D d; 36 }; 37 38 int f3(D *d) { 39 // CHECK-LABEL: _Z2f3P1D 40 // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]] 41 return d->y; 42 } 43 44 int f4(E *e) { 45 // CHECK-LABEL: _Z2f4P1E 46 // CHECK: load i32, {{.*}}, !tbaa [[TAG_A_y]] 47 return (&(e->d))->y; 48 } 49 50 // CHECK-DAG: [[TYPE_char:!.*]] = !{!"omnipotent char", {{.*}}, i64 0} 51 // CHECK-DAG: [[TYPE_int:!.*]] = !{!"int", [[TYPE_char]], i64 0} 52 // CHECK-DAG: [[TYPE_A:!.*]] = !{!"_ZTS1A", [[TYPE_int]], i64 0, [[TYPE_int]], i64 4, [[TYPE_int]], i64 8} 53 // CHECK-DAG: [[TAG_A_y]] = !{[[TYPE_A]], [[TYPE_int]], i64 4} 54