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 | |