1 // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o %t 2 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-GLOBALS 3 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-1 4 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-2 5 // RUN: FileCheck %s -input-file=%t -check-prefix=CHECK-3 6 7 typedef __INTPTR_TYPE__ intptr_t; 8 9 int foo(); 10 int global; 11 12 // Single statement 13 void test1() { 14 int i = 0; 15 #pragma clang __debug captured 16 { 17 i++; 18 } 19 // CHECK-1: %struct.anon = type { i32* } 20 // 21 // CHECK-1: test1 22 // CHECK-1: alloca %struct.anon 23 // CHECK-1: getelementptr inbounds %struct.anon, %struct.anon* 24 // CHECK-1: store i32* %i 25 // CHECK-1: call void @[[HelperName:__captured_stmt[0-9]+]] 26 } 27 28 // CHECK-1: define internal void @[[HelperName]](%struct.anon 29 // CHECK-1: getelementptr inbounds %struct.anon{{.*}}, i32 0, i32 0 30 // CHECK-1: load i32*, i32** 31 // CHECK-1: load i32, i32* 32 // CHECK-1: add nsw i32 33 // CHECK-1: store i32 34 35 // Compound statement with local variable 36 void test2(int x) { 37 #pragma clang __debug captured 38 { 39 int i; 40 for (i = 0; i < x; i++) 41 foo(); 42 } 43 // CHECK-2: test2 44 // CHECK-2-NOT: %i 45 // CHECK-2: call void @[[HelperName:__captured_stmt[0-9]+]] 46 } 47 48 // CHECK-2: define internal void @[[HelperName]] 49 // CHECK-2-NOT: } 50 // CHECK-2: %i = alloca i32 51 52 // Capture array 53 void test3(int size) { 54 int arr[] = {1, 2, 3, 4, 5}; 55 int vla_arr[size]; 56 #pragma clang __debug captured 57 { 58 arr[2] = vla_arr[size - 1]; 59 } 60 // CHECK-3: test3 61 // CHECK-3: alloca [5 x i32] 62 // CHECK-3: call void @__captured_stmt 63 } 64 65 // Capture VLA array 66 void test4(intptr_t size, intptr_t vla_arr[size]) { 67 #pragma clang __debug captured 68 { 69 vla_arr[0] = 1; 70 } 71 // CHECK-3: test4([[INTPTR_T:i.+]] {{.*}}[[SIZE_ARG:%.+]], [[INTPTR_T]]* 72 // CHECK-3: store [[INTPTR_T]] {{.*}}[[SIZE_ARG]], [[INTPTR_T]]* [[SIZE_ADDR:%.+]], 73 // CHECK-3: [[SIZE:%.+]] = load [[INTPTR_T]], [[INTPTR_T]]* [[SIZE_ADDR]], 74 // CHECK-3: [[REF:%.+]] = getelementptr inbounds 75 // CHECK-3: store [[INTPTR_T]] [[SIZE]], [[INTPTR_T]]* [[REF]] 76 // CHECK-3: call void @__captured_stmt 77 } 78 79 void dont_capture_global() { 80 static int s; 81 extern int e; 82 #pragma clang __debug captured 83 { 84 global++; 85 s++; 86 e++; 87 } 88 89 // CHECK-GLOBALS: %[[Capture:struct\.anon[\.0-9]*]] = type {} 90 // CHECK-GLOBALS: call void @__captured_stmt[[HelperName:[0-9]+]](%[[Capture]] 91 } 92 93 // CHECK-GLOBALS: define internal void @__captured_stmt[[HelperName]] 94 // CHECK-GLOBALS-NOT: ret 95 // CHECK-GLOBALS: load i32, i32* @global 96 // CHECK-GLOBALS: load i32, i32* @ 97 // CHECK-GLOBALS: load i32, i32* @e 98