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 7typedef __INTPTR_TYPE__ intptr_t; 8 9int foo(); 10int global; 11 12// Single statement 13void 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 36void 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 53void 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 66void 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 79void 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