1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -no-struct-path-tbaa -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s 2 // RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefixes=PATH,OLD-PATH 3 // RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-passes %s -emit-llvm -new-struct-path-tbaa -o - | FileCheck %s -check-prefixes=PATH,NEW-PATH 4 // Test TBAA metadata generated by front-end. 5 6 typedef unsigned char uint8_t; 7 typedef unsigned short uint16_t; 8 typedef unsigned int uint32_t; 9 typedef unsigned long long uint64_t; 10 class StructA 11 { 12 public: 13 uint16_t f16; 14 uint32_t f32; 15 uint16_t f16_2; 16 uint32_t f32_2; 17 }; 18 class StructB 19 { 20 public: 21 uint16_t f16; 22 StructA a; 23 uint32_t f32; 24 }; 25 class StructC 26 { 27 public: 28 uint16_t f16; 29 StructB b; 30 uint32_t f32; 31 }; 32 class StructD 33 { 34 public: 35 uint16_t f16; 36 StructB b; 37 uint32_t f32; 38 uint8_t f8; 39 }; 40 41 class StructS 42 { 43 public: 44 uint16_t f16; 45 uint32_t f32; 46 }; 47 class StructS2 : public StructS 48 { 49 public: 50 uint16_t f16_2; 51 uint32_t f32_2; 52 }; 53 54 uint32_t g(uint32_t *s, StructA *A, uint64_t count) { 55 // CHECK-LABEL: define i32 @_Z1g 56 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]] 57 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 58 // PATH-LABEL: define i32 @_Z1g 59 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32:!.*]] 60 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32:!.*]] 61 *s = 1; 62 A->f32 = 4; 63 return *s; 64 } 65 66 uint32_t g2(uint32_t *s, StructA *A, uint64_t count) { 67 // CHECK-LABEL: define i32 @_Z2g2 68 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 69 // CHECK: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_i16:!.*]] 70 // PATH-LABEL: define i32 @_Z2g2 71 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 72 // PATH: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_A_f16:!.*]] 73 *s = 1; 74 A->f16 = 4; 75 return *s; 76 } 77 78 uint32_t g3(StructA *A, StructB *B, uint64_t count) { 79 // CHECK-LABEL: define i32 @_Z2g3 80 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 81 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 82 // PATH-LABEL: define i32 @_Z2g3 83 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 84 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32:!.*]] 85 A->f32 = 1; 86 B->a.f32 = 4; 87 return A->f32; 88 } 89 90 uint32_t g4(StructA *A, StructB *B, uint64_t count) { 91 // CHECK-LABEL: define i32 @_Z2g4 92 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 93 // CHECK: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_i16]] 94 // PATH-LABEL: define i32 @_Z2g4 95 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 96 // PATH: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_B_a_f16:!.*]] 97 A->f32 = 1; 98 B->a.f16 = 4; 99 return A->f32; 100 } 101 102 uint32_t g5(StructA *A, StructB *B, uint64_t count) { 103 // CHECK-LABEL: define i32 @_Z2g5 104 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 105 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 106 // PATH-LABEL: define i32 @_Z2g5 107 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 108 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_f32:!.*]] 109 A->f32 = 1; 110 B->f32 = 4; 111 return A->f32; 112 } 113 114 uint32_t g6(StructA *A, StructB *B, uint64_t count) { 115 // CHECK-LABEL: define i32 @_Z2g6 116 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 117 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 118 // PATH-LABEL: define i32 @_Z2g6 119 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 120 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32_2:!.*]] 121 A->f32 = 1; 122 B->a.f32_2 = 4; 123 return A->f32; 124 } 125 126 uint32_t g7(StructA *A, StructS *S, uint64_t count) { 127 // CHECK-LABEL: define i32 @_Z2g7 128 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 129 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 130 // PATH-LABEL: define i32 @_Z2g7 131 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 132 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32:!.*]] 133 A->f32 = 1; 134 S->f32 = 4; 135 return A->f32; 136 } 137 138 uint32_t g8(StructA *A, StructS *S, uint64_t count) { 139 // CHECK-LABEL: define i32 @_Z2g8 140 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 141 // CHECK: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_i16]] 142 // PATH-LABEL: define i32 @_Z2g8 143 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_A_f32]] 144 // PATH: store i16 4, i16* %{{.*}}, align 4, !tbaa [[TAG_S_f16:!.*]] 145 A->f32 = 1; 146 S->f16 = 4; 147 return A->f32; 148 } 149 150 uint32_t g9(StructS *S, StructS2 *S2, uint64_t count) { 151 // CHECK-LABEL: define i32 @_Z2g9 152 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 153 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 154 // PATH-LABEL: define i32 @_Z2g9 155 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]] 156 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32:!.*]] 157 S->f32 = 1; 158 S2->f32 = 4; 159 return S->f32; 160 } 161 162 uint32_t g10(StructS *S, StructS2 *S2, uint64_t count) { 163 // CHECK-LABEL: define i32 @_Z3g10 164 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 165 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 166 // PATH-LABEL: define i32 @_Z3g10 167 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_S_f32]] 168 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_S2_f32_2:!.*]] 169 S->f32 = 1; 170 S2->f32_2 = 4; 171 return S->f32; 172 } 173 174 uint32_t g11(StructC *C, StructD *D, uint64_t count) { 175 // CHECK-LABEL: define i32 @_Z3g11 176 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 177 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 178 // PATH-LABEL: define i32 @_Z3g11 179 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_C_b_a_f32:!.*]] 180 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_D_b_a_f32:!.*]] 181 C->b.a.f32 = 1; 182 D->b.a.f32 = 4; 183 return C->b.a.f32; 184 } 185 186 uint32_t g12(StructC *C, StructD *D, uint64_t count) { 187 // CHECK-LABEL: define i32 @_Z3g12 188 // CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 189 // CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_i32]] 190 // TODO: differentiate the two accesses. 191 // PATH-LABEL: define i32 @_Z3g12 192 // PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]] 193 // PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa [[TAG_B_a_f32]] 194 StructB *b1 = &(C->b); 195 StructB *b2 = &(D->b); 196 // b1, b2 have different context. 197 b1->a.f32 = 1; 198 b2->a.f32 = 4; 199 return b1->a.f32; 200 } 201 202 // CHECK: [[TYPE_char:!.*]] = !{!"omnipotent char", [[TAG_cxx_tbaa:!.*]], 203 // CHECK: [[TAG_cxx_tbaa]] = !{!"Simple C++ TBAA"} 204 // CHECK: [[TAG_i32]] = !{[[TYPE_i32:!.*]], [[TYPE_i32]], i64 0} 205 // CHECK: [[TYPE_i32]] = !{!"int", [[TYPE_char]], 206 // CHECK: [[TAG_i16]] = !{[[TYPE_i16:!.*]], [[TYPE_i16]], i64 0} 207 // CHECK: [[TYPE_i16]] = !{!"short", [[TYPE_char]], 208 209 // OLD-PATH: [[TYPE_CHAR:!.*]] = !{!"omnipotent char", ! 210 // OLD-PATH: [[TAG_i32]] = !{[[TYPE_INT:!.*]], [[TYPE_INT]], i64 0} 211 // OLD-PATH: [[TYPE_INT]] = !{!"int", [[TYPE_CHAR]] 212 // OLD-PATH: [[TAG_A_f32]] = !{[[TYPE_A:!.*]], [[TYPE_INT]], i64 4} 213 // OLD-PATH: [[TYPE_A]] = !{!"_ZTS7StructA", [[TYPE_SHORT:!.*]], i64 0, [[TYPE_INT]], i64 4, [[TYPE_SHORT]], i64 8, [[TYPE_INT]], i64 12} 214 // OLD-PATH: [[TYPE_SHORT:!.*]] = !{!"short", [[TYPE_CHAR]] 215 // OLD-PATH: [[TAG_A_f16]] = !{[[TYPE_A]], [[TYPE_SHORT]], i64 0} 216 // OLD-PATH: [[TAG_B_a_f32]] = !{[[TYPE_B:!.*]], [[TYPE_INT]], i64 8} 217 // OLD-PATH: [[TYPE_B]] = !{!"_ZTS7StructB", [[TYPE_SHORT]], i64 0, [[TYPE_A]], i64 4, [[TYPE_INT]], i64 20} 218 // OLD-PATH: [[TAG_B_a_f16]] = !{[[TYPE_B]], [[TYPE_SHORT]], i64 4} 219 // OLD-PATH: [[TAG_B_f32]] = !{[[TYPE_B]], [[TYPE_INT]], i64 20} 220 // OLD-PATH: [[TAG_B_a_f32_2]] = !{[[TYPE_B]], [[TYPE_INT]], i64 16} 221 // OLD-PATH: [[TAG_S_f32]] = !{[[TYPE_S:!.*]], [[TYPE_INT]], i64 4} 222 // OLD-PATH: [[TYPE_S]] = !{!"_ZTS7StructS", [[TYPE_SHORT]], i64 0, [[TYPE_INT]], i64 4} 223 // OLD-PATH: [[TAG_S_f16]] = !{[[TYPE_S]], [[TYPE_SHORT]], i64 0} 224 // OLD-PATH: [[TAG_S2_f32_2]] = !{[[TYPE_S2:!.*]], [[TYPE_INT]], i64 12} 225 // OLD-PATH: [[TYPE_S2]] = !{!"_ZTS8StructS2", [[TYPE_SHORT]], i64 8, [[TYPE_INT]], i64 12} 226 // OLD-PATH: [[TAG_C_b_a_f32]] = !{[[TYPE_C:!.*]], [[TYPE_INT]], i64 12} 227 // OLD-PATH: [[TYPE_C]] = !{!"_ZTS7StructC", [[TYPE_SHORT]], i64 0, [[TYPE_B]], i64 4, [[TYPE_INT]], i64 28} 228 // OLD-PATH: [[TAG_D_b_a_f32]] = !{[[TYPE_D:!.*]], [[TYPE_INT]], i64 12} 229 // OLD-PATH: [[TYPE_D]] = !{!"_ZTS7StructD", [[TYPE_SHORT]], i64 0, [[TYPE_B]], i64 4, [[TYPE_INT]], i64 28, [[TYPE_CHAR]], i64 32} 230 231 // NEW-PATH: [[TYPE_CHAR:!.*]] = !{!{{.*}}, i64 1, !"omnipotent char"} 232 // NEW-PATH: [[TAG_i32]] = !{[[TYPE_INT:!.*]], [[TYPE_INT]], i64 0, i64 4} 233 // NEW-PATH: [[TYPE_INT]] = !{[[TYPE_CHAR]], i64 4, !"int"} 234 // NEW-PATH: [[TAG_A_f32]] = !{[[TYPE_A:!.*]], [[TYPE_INT]], i64 4, i64 4} 235 // NEW-PATH: [[TYPE_A]] = !{[[TYPE_CHAR]], i64 16, !"_ZTS7StructA", [[TYPE_SHORT:!.*]], i64 0, i64 2, [[TYPE_INT]], i64 4, i64 4, [[TYPE_SHORT]], i64 8, i64 2, [[TYPE_INT]], i64 12, i64 4} 236 // NEW-PATH: [[TYPE_SHORT:!.*]] = !{[[TYPE_CHAR]], i64 2, !"short"} 237 // NEW-PATH: [[TAG_A_f16]] = !{[[TYPE_A]], [[TYPE_SHORT]], i64 0, i64 2} 238 // NEW-PATH: [[TAG_B_a_f32]] = !{[[TYPE_B:!.*]], [[TYPE_INT]], i64 8, i64 4} 239 // NEW-PATH: [[TYPE_B]] = !{[[TYPE_CHAR]], i64 24, !"_ZTS7StructB", [[TYPE_SHORT]], i64 0, i64 2, [[TYPE_A]], i64 4, i64 16, [[TYPE_INT]], i64 20, i64 4} 240 // NEW-PATH: [[TAG_B_a_f16]] = !{[[TYPE_B]], [[TYPE_SHORT]], i64 4, i64 2} 241 // NEW-PATH: [[TAG_B_f32]] = !{[[TYPE_B]], [[TYPE_INT]], i64 20, i64 4} 242 // NEW-PATH: [[TAG_B_a_f32_2]] = !{[[TYPE_B]], [[TYPE_INT]], i64 16, i64 4} 243 // NEW-PATH: [[TAG_S_f32]] = !{[[TYPE_S:!.*]], [[TYPE_INT]], i64 4, i64 4} 244 // NEW-PATH: [[TYPE_S]] = !{[[TYPE_CHAR]], i64 8, !"_ZTS7StructS", [[TYPE_SHORT]], i64 0, i64 2, [[TYPE_INT]], i64 4, i64 4} 245 // NEW-PATH: [[TAG_S_f16]] = !{[[TYPE_S]], [[TYPE_SHORT]], i64 0, i64 2} 246 // NEW-PATH: [[TAG_S2_f32_2]] = !{[[TYPE_S2:!.*]], [[TYPE_INT]], i64 12, i64 4} 247 // NEW-PATH: [[TYPE_S2]] = !{[[TYPE_CHAR]], i64 16, !"_ZTS8StructS2", [[TYPE_SHORT]], i64 8, i64 2, [[TYPE_INT]], i64 12, i64 4} 248 // NEW-PATH: [[TAG_C_b_a_f32]] = !{[[TYPE_C:!.*]], [[TYPE_INT]], i64 12, i64 4} 249 // NEW-PATH: [[TYPE_C]] = !{[[TYPE_CHAR]], i64 32, !"_ZTS7StructC", [[TYPE_SHORT]], i64 0, i64 2, [[TYPE_B]], i64 4, i64 24, [[TYPE_INT]], i64 28, i64 4} 250 // NEW-PATH: [[TAG_D_b_a_f32]] = !{[[TYPE_D:!.*]], [[TYPE_INT]], i64 12, i64 4} 251 // NEW-PATH: [[TYPE_D]] = !{[[TYPE_CHAR]], i64 36, !"_ZTS7StructD", [[TYPE_SHORT]], i64 0, i64 2, [[TYPE_B]], i64 4, i64 24, [[TYPE_INT]], i64 28, i64 4, [[TYPE_CHAR]], i64 32, i64 1} 252