blob: 2623c42c9a3f51a4c8c59a3a725ef3db916282c2 [file] [log] [blame]
Manman Ren5d7a96c2013-04-22 22:50:27 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - -O1 %s | FileCheck %s
Dan Gohmanb22c7dc2012-09-28 21:58:29 +00002//
3// Check that we generate !tbaa.struct metadata for struct copies.
4struct A {
5 short s;
6 int i;
7 char c;
8 int j;
9};
10
11void copy(struct A *a, struct A *b) {
12 *a = *b;
13}
14
Stephen Hines651f13c2014-04-23 16:59:28 -070015// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %{{.*}}, i64 16, i32 4, i1 false), !tbaa.struct [[TS:!.*]]
Manman Renb79f5892013-03-21 00:09:50 +000016
17struct B {
18 char c1;
19 struct A a;
20 int ii;
21};
22
23void copy2(struct B *a, struct B *b) {
24 *a = *b;
25}
26
Stephen Hines651f13c2014-04-23 16:59:28 -070027// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %{{.*}}, i64 24, i32 4, i1 false), !tbaa.struct [[TS2:!.*]]
Manman Renb79f5892013-03-21 00:09:50 +000028
29typedef _Complex int T2;
30typedef _Complex char T5;
31typedef _Complex int T7;
32typedef struct T4 { T5 field0; T7 field1; } T4;
33typedef union T1 { T2 field0; T4 field1; } T1;
34
35void copy3 (T1 *a, T1 *b) {
36 *a = *b;
37}
38
Stephen Hines651f13c2014-04-23 16:59:28 -070039// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %{{.*}}, i64 12, i32 4, i1 false), !tbaa.struct [[TS3:!.*]]
Manman Renb79f5892013-03-21 00:09:50 +000040
Manman Renc7f2bfb2013-04-22 19:50:07 +000041// Make sure that zero-length bitfield works.
42#define ATTR __attribute__ ((ms_struct))
43struct five {
44 char a;
45 int :0; /* ignored; prior field is not a bitfield. */
46 char b;
47 char c;
48} ATTR;
49void copy4(struct five *a, struct five *b) {
50 *a = *b;
51}
Stephen Hines651f13c2014-04-23 16:59:28 -070052// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %{{.*}}, i64 3, i32 1, i1 false), !tbaa.struct [[TS4:!.*]]
Manman Renc7f2bfb2013-04-22 19:50:07 +000053
54struct six {
55 char a;
56 int :0;
57 char b;
58 char c;
59};
60void copy5(struct six *a, struct six *b) {
61 *a = *b;
62}
Stephen Hines651f13c2014-04-23 16:59:28 -070063// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %{{.*}}, i8* %{{.*}}, i64 6, i32 1, i1 false), !tbaa.struct [[TS5:!.*]]
Manman Renc7f2bfb2013-04-22 19:50:07 +000064
Stephen Hines0e2c34f2015-03-23 12:09:02 -070065// CHECK: [[TS]] = !{i64 0, i64 2, !{{.*}}, i64 4, i64 4, !{{.*}}, i64 8, i64 1, !{{.*}}, i64 12, i64 4, !{{.*}}}
66// CHECK: [[CHAR:!.*]] = !{!"omnipotent char", !{{.*}}}
67// CHECK: [[TAG_INT:!.*]] = !{[[INT:!.*]], [[INT]], i64 0}
68// CHECK: [[INT]] = !{!"int", [[CHAR]]
69// CHECK: [[TAG_CHAR:!.*]] = !{[[CHAR]], [[CHAR]], i64 0}
Manman Renb79f5892013-03-21 00:09:50 +000070// (offset, size) = (0,1) char; (4,2) short; (8,4) int; (12,1) char; (16,4) int; (20,4) int
Stephen Hines0e2c34f2015-03-23 12:09:02 -070071// CHECK: [[TS2]] = !{i64 0, i64 1, !{{.*}}, i64 4, i64 2, !{{.*}}, i64 8, i64 4, !{{.*}}, i64 12, i64 1, !{{.*}}, i64 16, i64 4, {{.*}}, i64 20, i64 4, {{.*}}}
Manman Renb79f5892013-03-21 00:09:50 +000072// (offset, size) = (0,8) char; (0,2) char; (4,8) char
Stephen Hines0e2c34f2015-03-23 12:09:02 -070073// CHECK: [[TS3]] = !{i64 0, i64 8, !{{.*}}, i64 0, i64 2, !{{.*}}, i64 4, i64 8, !{{.*}}}
74// CHECK: [[TS4]] = !{i64 0, i64 1, [[TAG_CHAR]], i64 1, i64 4, [[TAG_INT]], i64 1, i64 1, [[TAG_CHAR]], i64 2, i64 1, [[TAG_CHAR]]}
75// CHECK: [[TS5]] = !{i64 0, i64 1, [[TAG_CHAR]], i64 4, i64 4, [[TAG_INT]], i64 4, i64 1, [[TAG_CHAR]], i64 5, i64 1, [[TAG_CHAR]]}