| 1 | // RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,OLD-PATH |
| 2 | // RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s -emit-llvm -new-struct-path-tbaa -o - | FileCheck %s -check-prefixes=CHECK,NEW-PATH |
| 3 | // |
| 4 | // Check that we generate correct TBAA information for reference accesses. |
| 5 | |
| 6 | struct S; |
| 7 | |
| 8 | struct B { |
| 9 | S &s; |
| 10 | B(S &s); |
| 11 | S &get(); |
| 12 | }; |
| 13 | |
| 14 | B::B(S &s) : s(s) { |
| 15 | // CHECK-LABEL: _ZN1BC2ER1S |
| 16 | // Check initialization of the reference parameter. |
| 17 | // CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer:!.*]] |
| 18 | |
| 19 | // Check loading of the reference parameter. |
| 20 | // CHECK: load %struct.S*, %struct.S** {{.*}}, !tbaa [[TAG_pointer]] |
| 21 | |
| 22 | // Check initialization of the reference member. |
| 23 | // CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer]] |
| 24 | } |
| 25 | |
| 26 | S &B::get() { |
| 27 | // CHECK-LABEL: _ZN1B3getEv |
| 28 | // Check that we access the reference as a structure member. |
| 29 | // CHECK: load %struct.S*, %struct.S** {{.*}}, !tbaa [[TAG_B_s:!.*]] |
| 30 | return s; |
| 31 | } |
| 32 | |
| 33 | // OLD-PATH-DAG: [[TAG_pointer]] = !{[[TYPE_pointer:!.*]], [[TYPE_pointer]], i64 0} |
| 34 | // OLD-PATH-DAG: [[TAG_B_s]] = !{[[TYPE_B:!.*]], [[TYPE_pointer]], i64 0} |
| 35 | // |
| 36 | // OLD-PATH-DAG: [[TYPE_B]] = !{!"_ZTS1B", [[TYPE_pointer]], i64 0} |
| 37 | // OLD-PATH-DAG: [[TYPE_pointer]] = !{!"any pointer", [[TYPE_char:!.*]], i64 0} |
| 38 | // OLD-PATH-DAG: [[TYPE_char]] = !{!"omnipotent char", {{!.*}}, i64 0} |
| 39 | |
| 40 | // NEW-PATH-DAG: [[TAG_pointer]] = !{[[TYPE_pointer:!.*]], [[TYPE_pointer]], i64 0, i64 8} |
| 41 | // NEW-PATH-DAG: [[TAG_B_s]] = !{[[TYPE_B:!.*]], [[TYPE_pointer]], i64 0, i64 8} |
| 42 | // |
| 43 | // NEW-PATH-DAG: [[TYPE_B]] = !{[[TYPE_char:!.*]], i64 8, !"_ZTS1B", [[TYPE_pointer]], i64 0, i64 8} |
| 44 | // NEW-PATH-DAG: [[TYPE_pointer]] = !{[[TYPE_char:!.*]], i64 8, !"any pointer"} |
| 45 | // NEW-PATH-DAG: [[TYPE_char]] = !{{{!.*}}, i64 1, !"omnipotent char"} |
| 46 | |