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