1f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -o - 2>&1 | FileCheck %s
2cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer
3cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer#define strcpy(dest, src) \
4cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer  ((__builtin_object_size(dest, 0) != -1ULL) \
5cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer   ? __builtin___strcpy_chk (dest, src, __builtin_object_size(dest, 1)) \
6cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer   : __inline_strcpy_chk(dest, src))
7cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer
8cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramerstatic char *__inline_strcpy_chk (char *dest, const char *src) {
9cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer  return __builtin___strcpy_chk(dest, src, __builtin_object_size(dest, 1));
10cc179cb24ffc6686c788c6849e59fc1b04ecf03eBenjamin Kramer}
1164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
1264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stumpchar gbuf[63];
1364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stumpchar *gp;
1448c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpint gi, gj;
1564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
1693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test1
1764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stumpvoid test1() {
18a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 4), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 59)
1964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  strcpy(&gbuf[4], "Hi there");
2064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump}
2164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
2293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test2
2364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stumpvoid test2() {
243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 63)
2564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump  strcpy(gbuf, "Hi there");
2664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump}
2764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
2893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test3
2906bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stumpvoid test3() {
303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 1, i64 37), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 0)
3106bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump  strcpy(&gbuf[100], "Hi there");
3206bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump}
3306bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test4
3564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stumpvoid test4() {
36a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i64 0, i64 -1), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 0)
3706bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump  strcpy((char*)(void*)&gbuf[-1], "Hi there");
3806bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump}
3906bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump
4093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test5
4106bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stumpvoid test5() {
423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:     = load i8*, i8** @gp
438dd4baacf584b1fc7b0e2c79a0b8b197a4fb5fabMatt Arsenault  // CHECK-NEXT:= call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
4406bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stump  strcpy(gp, "Hi there");
4564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump}
4664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump
4793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test6
4806bc9bcc705e5fee714d4b00c3c3c9f01715c195Mike Stumpvoid test6() {
49660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  char buf[57];
50660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump
513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 53)
52660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump  strcpy(&buf[4], "Hi there");
53660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump}
5448c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump
5593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test7
5648c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpvoid test7() {
5748c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  int i;
58c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith  // Ensure we only evaluate the side-effect once.
59c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith  // CHECK:     = add
60c6794850a570a91c5f224b6f0293db9f560f4213Richard Smith  // CHECK-NOT: = add
613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:     = call i8* @__strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 63)
6248c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  strcpy((++i, gbuf), "Hi there");
6348c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump}
6448c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump
6593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test8
6648c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpvoid test8() {
6748c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  char *buf[50];
68bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
7048c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  strcpy(buf[++gi], "Hi there");
7148c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump}
7248c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump
7393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test9
7448c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpvoid test9() {
75bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
7748c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  strcpy((char *)((++gi) + gj), "Hi there");
7848c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump}
7948c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump
8093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test10
8148c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpchar **p;
8248c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stumpvoid test10() {
83bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
8548c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump  strcpy(*(++p), "Hi there");
8648c2af821ef9ffb51499f37ac1d332766fc20f1eMike Stump}
872623aa283772f629189620a993e2343f2525d262Mike Stump
8893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test11
892623aa283772f629189620a993e2343f2525d262Mike Stumpvoid test11() {
90bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @gbuf, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
922623aa283772f629189620a993e2343f2525d262Mike Stump  strcpy(gp = gbuf, "Hi there");
932623aa283772f629189620a993e2343f2525d262Mike Stump}
942623aa283772f629189620a993e2343f2525d262Mike Stump
9593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test12
962623aa283772f629189620a993e2343f2525d262Mike Stumpvoid test12() {
97bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
992623aa283772f629189620a993e2343f2525d262Mike Stump  strcpy(++gp, "Hi there");
1002623aa283772f629189620a993e2343f2525d262Mike Stump}
1012623aa283772f629189620a993e2343f2525d262Mike Stump
10293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test13
1032623aa283772f629189620a993e2343f2525d262Mike Stumpvoid test13() {
104bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
1053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
1062623aa283772f629189620a993e2343f2525d262Mike Stump  strcpy(gp++, "Hi there");
1072623aa283772f629189620a993e2343f2525d262Mike Stump}
1082623aa283772f629189620a993e2343f2525d262Mike Stump
10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test14
1102623aa283772f629189620a993e2343f2525d262Mike Stumpvoid test14() {
111bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
1123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
1132623aa283772f629189620a993e2343f2525d262Mike Stump  strcpy(--gp, "Hi there");
1142623aa283772f629189620a993e2343f2525d262Mike Stump}
1152623aa283772f629189620a993e2343f2525d262Mike Stump
11693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test15
1172623aa283772f629189620a993e2343f2525d262Mike Stumpvoid test15() {
118bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
1193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{..*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
1202623aa283772f629189620a993e2343f2525d262Mike Stump  strcpy(gp--, "Hi there");
1212623aa283772f629189620a993e2343f2525d262Mike Stump}
1223f0147e161df4725ff15fbb731f4f727afcc229fMike Stump
12393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test16
1243f0147e161df4725ff15fbb731f4f727afcc229fMike Stumpvoid test16() {
125bc773a0bd20231c405476d15c5e8bfb3eb365293Mike Stump  // CHECK-NOT:   __strcpy_chk
1263ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK:       = call i8* @__inline_strcpy_chk(i8* %{{.*}}, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0))
1273f0147e161df4725ff15fbb731f4f727afcc229fMike Stump  strcpy(gp += 1, "Hi there");
1283f0147e161df4725ff15fbb731f4f727afcc229fMike Stump}
1293f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer
130a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test17
1313f27b384801de26ce7efaa395699b42719372f24Benjamin Kramervoid test17() {
1323f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  // CHECK: store i32 -1
1333f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  gi = __builtin_object_size(gp++, 0);
1343f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  // CHECK: store i32 -1
1353f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  gi = __builtin_object_size(gp++, 1);
1363f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  // CHECK: store i32 0
1373f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  gi = __builtin_object_size(gp++, 2);
1383f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  // CHECK: store i32 0
1393f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer  gi = __builtin_object_size(gp++, 3);
1403f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer}
141f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes
142a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test18
143f195f2cacf149286232d66578fad3370efa5f567Nuno Lopesunsigned test18(int cond) {
144f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes  int a[4], b[4];
145f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes  // CHECK: phi i32*
146f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes  // CHECK: call i64 @llvm.objectsize.i64
147f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes  return __builtin_object_size(cond ? a : b, 0);
148f195f2cacf149286232d66578fad3370efa5f567Nuno Lopes}
149a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
150a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test19
151a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test19() {
152a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct {
153a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    int a, b;
154a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  } foo;
155a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
156a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 8
157a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.a, 0);
158a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
159a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.a, 1);
160a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 8
161a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.a, 2);
162a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
163a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.a, 3);
164a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
165a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
166a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.b, 0);
167a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
168a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.b, 1);
169a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
170a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.b, 2);
171a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
172a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&foo.b, 3);
173a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
174a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
175a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test20
176a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test20() {
177a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { int t[10]; } t[10];
178a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
179a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 380
180a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[0].t[5], 0);
181a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 20
182a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[0].t[5], 1);
183a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 380
184a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[0].t[5], 2);
185a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 20
186a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[0].t[5], 3);
187a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
188a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
189a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test21
190a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test21() {
191a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { int t; } t;
192a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
193a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
194a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t + 1, 0);
195a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
196a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t + 1, 1);
197a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
198a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t + 1, 2);
199a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
200a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t + 1, 3);
201a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
202a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
203a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t.t + 1, 0);
204a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
205a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t.t + 1, 1);
206a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
207a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t.t + 1, 2);
208a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
209a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t.t + 1, 3);
210a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
211a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
212a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test22
213a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test22() {
214a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { int t[10]; } t[10];
215a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
216a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
217a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[10], 0);
218a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
219a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[10], 1);
220a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
221a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[10], 2);
222a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
223a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[10], 3);
224a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
225a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
226a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[9].t[10], 0);
227a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
228a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[9].t[10], 1);
229a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
230a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[9].t[10], 2);
231a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
232a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[9].t[10], 3);
233a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
234a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
235a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[0] + sizeof(t), 0);
236a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
237a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[0] + sizeof(t), 1);
238a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
239a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[0] + sizeof(t), 2);
240a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
241a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[0] + sizeof(t), 3);
242a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
243a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
244a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[9].t[0] + 10*sizeof(t[0].t), 0);
245a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
246a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[9].t[0] + 10*sizeof(t[0].t), 1);
247a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
248a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[9].t[0] + 10*sizeof(t[0].t), 2);
249a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
250a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((char*)&t[9].t[0] + 10*sizeof(t[0].t), 3);
251a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
252a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
253a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct Test23Ty { int a; int t[10]; };
254a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
255a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test23
256a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test23(struct Test23Ty *p) {
257a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
258a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(p, 0);
259a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
260a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(p, 1);
261a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
262a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(p, 2);
263a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
264a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // data to correctly handle type=3
265a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
266a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(p, 3);
267a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
268a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
269a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->a, 0);
270a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
271a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->a, 1);
272a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
273a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->a, 2);
274a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 4
275a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->a, 3);
276a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
277a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
278a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->t[5], 0);
279a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 20
280a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->t[5], 1);
281a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
282a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->t[5], 2);
283a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 20
284a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&p->t[5], 3);
285a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
286a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
287a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// PR24493 -- ICE if __builtin_object_size called with NULL and (Type & 1) != 0
288a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test24
289a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test24() {
290a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
291a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0, 0);
292a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
293a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0, 1);
294a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true)
295a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0, 2);
296a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
297a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Hopefully will be lowered properly in the future.
298a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
299a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0, 3);
300a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
301a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
302a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test25
303a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test25() {
304a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
305a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0x1000, 0);
306a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
307a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0x1000, 1);
308a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true)
309a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0x1000, 2);
310a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
311a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Hopefully will be lowered properly in the future.
312a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
313a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0x1000, 3);
314a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
315a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
316a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0 + 0x1000, 0);
317a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
318a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0 + 0x1000, 1);
319a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true)
320a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0 + 0x1000, 2);
321a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: Currently fixed at zero because LLVM can't handle type=3 correctly.
322a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Hopefully will be lowered properly in the future.
323a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
324a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size((void*)0 + 0x1000, 3);
325a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
326a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
327a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test26
328a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test26() {
329a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { int v[10]; } t[10];
330a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
331a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 316
332a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[1].v[11], 0);
333a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 312
334a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[1].v[12], 1);
335a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 308
336a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[1].v[13], 2);
337a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
338a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&t[1].v[14], 3);
339a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
340a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
341a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct Test27IncompleteTy;
342a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
343a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test27
344a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test27(struct Test27IncompleteTy *t) {
345a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
346a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(t, 0);
347a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
348a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(t, 1);
349a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
350a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(t, 2);
351a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
352a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // data to correctly handle type=3
353a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
354a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(t, 3);
355a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
356a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
357a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&test27, 0);
358a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false)
359a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&test27, 1);
360a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true)
361a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&test27, 2);
362a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Note: this is currently fixed at 0 because LLVM doesn't have sufficient
363a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // data to correctly handle type=3
364a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
365a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&test27, 3);
366a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
367a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
368a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// The intent of this test is to ensure that __builtin_object_size treats `&foo`
369a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// and `(T*)&foo` identically, when used as the pointer argument.
370a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test28
371a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test28() {
372a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { int v[10]; } t[10];
373a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
374a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#define addCasts(s) ((char*)((short*)(s)))
375a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 360
376a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1]), 0);
377a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 360
378a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1]), 1);
379a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 360
380a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1]), 2);
381a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 360
382a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1]), 3);
383a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
384a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 356
385a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1].v[1]), 0);
386a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 36
387a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1].v[1]), 1);
388a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 356
389a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1].v[1]), 2);
390a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 36
391a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(addCasts(&t[1].v[1]), 3);
392a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#undef addCasts
393a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
394a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
395a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct DynStructVar {
396a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char fst[16];
397a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char snd[];
398a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
399a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
400a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct DynStruct0 {
401a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char fst[16];
402a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char snd[0];
403a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
404a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
405a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct DynStruct1 {
406a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char fst[16];
407a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char snd[1];
408a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
409a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
410a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarstruct StaticStruct {
411a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char fst[16];
412a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  char snd[2];
413a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar};
414a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
415a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test29
416a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test29(struct DynStructVar *dv, struct DynStruct0 *d0,
417a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar            struct DynStruct1 *d1, struct StaticStruct *ss) {
418a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
419a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(dv->snd, 0);
420a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
421a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(dv->snd, 1);
422a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
423a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(dv->snd, 2);
424a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
425a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(dv->snd, 3);
426a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
427a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
428a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d0->snd, 0);
429a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
430a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d0->snd, 1);
431a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
432a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d0->snd, 2);
433a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 0
434a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d0->snd, 3);
435a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
436a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
437a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d1->snd, 0);
438a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
439a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d1->snd, 1);
440a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
441a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d1->snd, 2);
442a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
443a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(d1->snd, 3);
444a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
445a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
446a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(ss->snd, 0);
447a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 2
448a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(ss->snd, 1);
449a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
450a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(ss->snd, 2);
451a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 2
452a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(ss->snd, 3);
453a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
454a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
455a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test30
456a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test30() {
457a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct { struct DynStruct1 fst, snd; } *nested;
458a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
459a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
460a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->fst.snd, 0);
461a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
462a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->fst.snd, 1);
463a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
464a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->fst.snd, 2);
465a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
466a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->fst.snd, 3);
467a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
468a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
469a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->snd.snd, 0);
470a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
471a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->snd.snd, 1);
472a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
473a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->snd.snd, 2);
474a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
475a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(nested->snd.snd, 3);
476a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
477a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  union { struct DynStruct1 d1; char c[1]; } *u;
478a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
479a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->c, 0);
480a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
481a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->c, 1);
482a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
483a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->c, 2);
484a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
485a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->c, 3);
486a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
487a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
488a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->d1.snd, 0);
489a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
490a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->d1.snd, 1);
491a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true)
492a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->d1.snd, 2);
493a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: store i32 1
494a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(u->d1.snd, 3);
495a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
496a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
497a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: @test31
498a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarvoid test31() {
499a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // Miscellaneous 'writing off the end' detection tests
500a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct DynStructVar *dsv;
501a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct DynStruct0 *ds0;
502a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct DynStruct1 *ds1;
503a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  struct StaticStruct *ss;
504a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
505a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
506a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(ds1[9].snd, 1);
507a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
508a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECH: store i32 2
509a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&ss[9].snd[0], 1);
510a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
511a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
512a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&ds1[9].snd[0], 1);
513a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
514a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
515a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&ds0[9].snd[0], 1);
516a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
517a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false)
518a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar  gi = __builtin_object_size(&dsv[9].snd[0], 1);
519a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar}
520