310 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -no-struct-path-tbaa -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s3// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefixes=PATH,OLD-PATH4// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -new-struct-path-tbaa -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefixes=PATH,NEW-PATH5// RUN: %clang_cc1 -triple x86_64-apple-darwin -O0 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefix=NO-TBAA6// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -relaxed-aliasing -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s -check-prefix=NO-TBAA7// Test TBAA metadata generated by front-end.8//9// NO-TBAA-NOT: !tbaa10 11typedef unsigned char uint8_t;12typedef unsigned short uint16_t;13typedef unsigned int uint32_t;14typedef unsigned long long uint64_t;15typedef struct16{17 uint16_t f16;18 uint32_t f32;19 uint16_t f16_2;20 uint32_t f32_2;21} StructA;22typedef struct23{24 uint16_t f16;25 StructA a;26 uint32_t f32;27} StructB;28typedef struct29{30 uint16_t f16;31 StructB b;32 uint32_t f32;33} StructC;34typedef struct35{36 uint16_t f16;37 StructB b;38 uint32_t f32;39 uint8_t f8;40} StructD;41 42typedef struct43{44 uint16_t f16;45 uint32_t f32;46} StructS;47typedef struct48{49 uint16_t f16;50 uint32_t f32;51} StructS2;52 53uint32_t g(uint32_t *s, StructA *A, uint64_t count) {54// CHECK-LABEL: define{{.*}} i32 @_Z1g55// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2:![0-9]+]]56// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]57// PATH-LABEL: define{{.*}} i32 @_Z1g58// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2:![0-9]+]]59// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA12:![0-9]+]]60 *s = 1;61 A->f32 = 4;62 return *s;63}64 65uint32_t g2(uint32_t *s, StructA *A, uint64_t count) {66// CHECK-LABEL: define{{.*}} i32 @_Z2g267// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]68// CHECK: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA12:![0-9]+]]69// PATH-LABEL: define{{.*}} i32 @_Z2g270// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]71// PATH: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA15:![0-9]+]]72 *s = 1;73 A->f16 = 4;74 return *s;75}76 77uint32_t g3(StructA *A, StructB *B, uint64_t count) {78// CHECK-LABEL: define{{.*}} i32 @_Z2g379// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]80// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]81// PATH-LABEL: define{{.*}} i32 @_Z2g382// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]83// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA16:![0-9]+]]84 A->f32 = 1;85 B->a.f32 = 4;86 return A->f32;87}88 89uint32_t g4(StructA *A, StructB *B, uint64_t count) {90// CHECK-LABEL: define{{.*}} i32 @_Z2g491// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]92// CHECK: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]93// PATH-LABEL: define{{.*}} i32 @_Z2g494// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]95// PATH: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA18:![0-9]+]]96 A->f32 = 1;97 B->a.f16 = 4;98 return A->f32;99}100 101uint32_t g5(StructA *A, StructB *B, uint64_t count) {102// CHECK-LABEL: define{{.*}} i32 @_Z2g5103// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]104// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]105// PATH-LABEL: define{{.*}} i32 @_Z2g5106// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]107// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA19:![0-9]+]]108 A->f32 = 1;109 B->f32 = 4;110 return A->f32;111}112 113uint32_t g6(StructA *A, StructB *B, uint64_t count) {114// CHECK-LABEL: define{{.*}} i32 @_Z2g6115// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]116// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]117// PATH-LABEL: define{{.*}} i32 @_Z2g6118// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]119// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA20:![0-9]+]]120 A->f32 = 1;121 B->a.f32_2 = 4;122 return A->f32;123}124 125uint32_t g7(StructA *A, StructS *S, uint64_t count) {126// CHECK-LABEL: define{{.*}} i32 @_Z2g7127// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]128// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]129// PATH-LABEL: define{{.*}} i32 @_Z2g7130// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]131// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA21:![0-9]+]]132 A->f32 = 1;133 S->f32 = 4;134 return A->f32;135}136 137uint32_t g8(StructA *A, StructS *S, uint64_t count) {138// CHECK-LABEL: define{{.*}} i32 @_Z2g8139// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]140// CHECK: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]141// PATH-LABEL: define{{.*}} i32 @_Z2g8142// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]143// PATH: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA23:![0-9]+]]144 A->f32 = 1;145 S->f16 = 4;146 return A->f32;147}148 149uint32_t g9(StructS *S, StructS2 *S2, uint64_t count) {150// CHECK-LABEL: define{{.*}} i32 @_Z2g9151// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]152// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]153// PATH-LABEL: define{{.*}} i32 @_Z2g9154// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA21]]155// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA24:![0-9]+]]156 S->f32 = 1;157 S2->f32 = 4;158 return S->f32;159}160 161uint32_t g10(StructS *S, StructS2 *S2, uint64_t count) {162// CHECK-LABEL: define{{.*}} i32 @_Z3g10163// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]164// CHECK: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA12]]165// PATH-LABEL: define{{.*}} i32 @_Z3g10166// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA21]]167// PATH: store i16 4, ptr %{{.*}}, align 4, !tbaa [[TBAA26:![0-9]+]]168 S->f32 = 1;169 S2->f16 = 4;170 return S->f32;171}172 173uint32_t g11(StructC *C, StructD *D, uint64_t count) {174// CHECK-LABEL: define{{.*}} i32 @_Z3g11175// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]176// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]177// PATH-LABEL: define{{.*}} i32 @_Z3g11178// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA27:![0-9]+]]179// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA29:![0-9]+]]180 C->b.a.f32 = 1;181 D->b.a.f32 = 4;182 return C->b.a.f32;183}184 185uint32_t g12(StructC *C, StructD *D, uint64_t count) {186// CHECK-LABEL: define{{.*}} i32 @_Z3g12187// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]188// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]189// TODO: differentiate the two accesses.190// PATH-LABEL: define{{.*}} i32 @_Z3g12191// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA16]]192// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA16]]193 StructB *b1 = &(C->b);194 StructB *b2 = &(D->b);195 // b1, b2 have different context.196 b1->a.f32 = 1;197 b2->a.f32 = 4;198 return b1->a.f32;199}200 201// Make sure that zero-length bitfield works.202#define ATTR __attribute__ ((ms_struct))203struct five {204 char a;205 int :0; /* ignored; prior field is not a bitfield. */206 char b;207 char c;208} ATTR;209char g13(struct five *a, struct five *b) {210 return a->b;211// CHECK-LABEL: define{{.*}} signext i8 @_Z3g13212// CHECK: load i8, ptr %{{.*}}, align 1, !tbaa [[TBAA16:![0-9]+]]213// PATH-LABEL: define{{.*}} signext i8 @_Z3g13214// PATH: load i8, ptr %{{.*}}, align 1, !tbaa [[TBAA33:![0-9]+]]215}216 217struct six {218 char a;219 int :0;220 char b;221 char c;222};223char g14(struct six *a, struct six *b) {224// CHECK-LABEL: define{{.*}} signext i8 @_Z3g14225// CHECK: load i8, ptr %{{.*}}, align 1, !tbaa [[TBAA16]]226// PATH-LABEL: define{{.*}} signext i8 @_Z3g14227// PATH: load i8, ptr %{{.*}}, align 1, !tbaa [[TBAA37:![0-9]+]]228 return a->b;229}230 231// Types that differ only by name may alias.232typedef StructS StructS3;233uint32_t g15(StructS *S, StructS3 *S3, uint64_t count) {234// CHECK-LABEL: define{{.*}} i32 @_Z3g15235// CHECK: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]236// CHECK: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA2]]237// PATH-LABEL: define{{.*}} i32 @_Z3g15238// PATH: store i32 1, ptr %{{.*}}, align 4, !tbaa [[TBAA21]]239// PATH: store i32 4, ptr %{{.*}}, align 4, !tbaa [[TBAA21]]240 S->f32 = 1;241 S3->f32 = 4;242 return S->f32;243}244 245//.246// CHECK: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}247// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}248// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}249// CHECK: [[META5]] = !{!"Simple C++ TBAA"}250// CHECK: [[TBAA12]] = !{[[META13:![0-9]+]], [[META13]], i64 0}251// CHECK: [[META13]] = !{!"short", [[META4]], i64 0}252// CHECK: [[TBAA16]] = !{[[META4]], [[META4]], i64 0}253//.254// OLD-PATH: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}255// OLD-PATH: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}256// OLD-PATH: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}257// OLD-PATH: [[META5]] = !{!"Simple C++ TBAA"}258// OLD-PATH: [[TBAA12]] = !{[[META13:![0-9]+]], [[META3]], i64 4}259// OLD-PATH: [[META13]] = !{!"_ZTS7StructA", [[META14:![0-9]+]], i64 0, [[META3]], i64 4, [[META14]], i64 8, [[META3]], i64 12}260// OLD-PATH: [[META14]] = !{!"short", [[META4]], i64 0}261// OLD-PATH: [[TBAA15]] = !{[[META13]], [[META14]], i64 0}262// OLD-PATH: [[TBAA16]] = !{[[META17:![0-9]+]], [[META3]], i64 8}263// OLD-PATH: [[META17]] = !{!"_ZTS7StructB", [[META14]], i64 0, [[META13]], i64 4, [[META3]], i64 20}264// OLD-PATH: [[TBAA18]] = !{[[META17]], [[META14]], i64 4}265// OLD-PATH: [[TBAA19]] = !{[[META17]], [[META3]], i64 20}266// OLD-PATH: [[TBAA20]] = !{[[META17]], [[META3]], i64 16}267// OLD-PATH: [[TBAA21]] = !{[[META22:![0-9]+]], [[META3]], i64 4}268// OLD-PATH: [[META22]] = !{!"_ZTS7StructS", [[META14]], i64 0, [[META3]], i64 4}269// OLD-PATH: [[TBAA23]] = !{[[META22]], [[META14]], i64 0}270// OLD-PATH: [[TBAA24]] = !{[[META25:![0-9]+]], [[META3]], i64 4}271// OLD-PATH: [[META25]] = !{!"_ZTS8StructS2", [[META14]], i64 0, [[META3]], i64 4}272// OLD-PATH: [[TBAA26]] = !{[[META25]], [[META14]], i64 0}273// OLD-PATH: [[TBAA27]] = !{[[META28:![0-9]+]], [[META3]], i64 12}274// OLD-PATH: [[META28]] = !{!"_ZTS7StructC", [[META14]], i64 0, [[META17]], i64 4, [[META3]], i64 28}275// OLD-PATH: [[TBAA29]] = !{[[META30:![0-9]+]], [[META3]], i64 12}276// OLD-PATH: [[META30]] = !{!"_ZTS7StructD", [[META14]], i64 0, [[META17]], i64 4, [[META3]], i64 28, [[META4]], i64 32}277// OLD-PATH: [[TBAA33]] = !{[[META34:![0-9]+]], [[META4]], i64 1}278// OLD-PATH: [[META34]] = !{!"_ZTS4five", [[META4]], i64 0, [[META4]], i64 1, [[META4]], i64 2}279// OLD-PATH: [[TBAA37]] = !{[[META38:![0-9]+]], [[META4]], i64 4}280// OLD-PATH: [[META38]] = !{!"_ZTS3six", [[META4]], i64 0, [[META4]], i64 4, [[META4]], i64 5}281//.282// NEW-PATH: [[TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0, i64 4}283// NEW-PATH: [[META3]] = !{[[META4:![0-9]+]], i64 4, !"int"}284// NEW-PATH: [[META4]] = !{[[META5:![0-9]+]], i64 1, !"omnipotent char"}285// NEW-PATH: [[META5]] = !{!"Simple C++ TBAA"}286// NEW-PATH: [[TBAA12]] = !{[[META13:![0-9]+]], [[META3]], i64 4, i64 4}287// NEW-PATH: [[META13]] = !{[[META4]], i64 16, !"_ZTS7StructA", [[META14:![0-9]+]], i64 0, i64 2, [[META3]], i64 4, i64 4, [[META14]], i64 8, i64 2, [[META3]], i64 12, i64 4}288// NEW-PATH: [[META14]] = !{[[META4]], i64 2, !"short"}289// NEW-PATH: [[TBAA15]] = !{[[META13]], [[META14]], i64 0, i64 2}290// NEW-PATH: [[TBAA16]] = !{[[META17:![0-9]+]], [[META3]], i64 8, i64 4}291// NEW-PATH: [[META17]] = !{[[META4]], i64 24, !"_ZTS7StructB", [[META14]], i64 0, i64 2, [[META13]], i64 4, i64 16, [[META3]], i64 20, i64 4}292// NEW-PATH: [[TBAA18]] = !{[[META17]], [[META14]], i64 4, i64 2}293// NEW-PATH: [[TBAA19]] = !{[[META17]], [[META3]], i64 20, i64 4}294// NEW-PATH: [[TBAA20]] = !{[[META17]], [[META3]], i64 16, i64 4}295// NEW-PATH: [[TBAA21]] = !{[[META22:![0-9]+]], [[META3]], i64 4, i64 4}296// NEW-PATH: [[META22]] = !{[[META4]], i64 8, !"_ZTS7StructS", [[META14]], i64 0, i64 2, [[META3]], i64 4, i64 4}297// NEW-PATH: [[TBAA23]] = !{[[META22]], [[META14]], i64 0, i64 2}298// NEW-PATH: [[TBAA24]] = !{[[META25:![0-9]+]], [[META3]], i64 4, i64 4}299// NEW-PATH: [[META25]] = !{[[META4]], i64 8, !"_ZTS8StructS2", [[META14]], i64 0, i64 2, [[META3]], i64 4, i64 4}300// NEW-PATH: [[TBAA26]] = !{[[META25]], [[META14]], i64 0, i64 2}301// NEW-PATH: [[TBAA27]] = !{[[META28:![0-9]+]], [[META3]], i64 12, i64 4}302// NEW-PATH: [[META28]] = !{[[META4]], i64 32, !"_ZTS7StructC", [[META14]], i64 0, i64 2, [[META17]], i64 4, i64 24, [[META3]], i64 28, i64 4}303// NEW-PATH: [[TBAA29]] = !{[[META30:![0-9]+]], [[META3]], i64 12, i64 4}304// NEW-PATH: [[META30]] = !{[[META4]], i64 36, !"_ZTS7StructD", [[META14]], i64 0, i64 2, [[META17]], i64 4, i64 24, [[META3]], i64 28, i64 4, [[META4]], i64 32, i64 1}305// NEW-PATH: [[TBAA33]] = !{[[META34:![0-9]+]], [[META4]], i64 1, i64 1}306// NEW-PATH: [[META34]] = !{[[META4]], i64 3, !"_ZTS4five", [[META4]], i64 0, i64 1, [[META4]], i64 1, i64 1, [[META4]], i64 2, i64 1}307// NEW-PATH: [[TBAA37]] = !{[[META38:![0-9]+]], [[META4]], i64 4, i64 1}308// NEW-PATH: [[META38]] = !{[[META4]], i64 6, !"_ZTS3six", [[META4]], i64 0, i64 1, [[META4]], i64 4, i64 1, [[META4]], i64 5, i64 1}309//.310