1 // This testcase checks emission of debug info for variables 2 // inside shared clause of task construct. 3 4 // REQUIRES: x86_64-linux 5 6 // RUN: %clang_cc1 -debug-info-kind=constructor -DSHARED -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK 7 // RUN: %clang_cc1 -debug-info-kind=constructor -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=NEG 8 // expected-no-diagnostics 9 10 // CHECK-LABEL: define internal i32 @.omp_task_entry. 11 12 // CHECK-DAG: [[CONTEXT:%[0-9]+]] = load %struct.anon*, %struct.anon** %__context.addr.i, align 8 13 // CHECK-DAG: call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata [[SHARE2:![0-9]+]], metadata !DIExpression(DW_OP_deref)) 14 // CHECK-DAG: call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata [[SHARE3:![0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 8, DW_OP_deref)) 15 // CHECK-DAG: call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata [[SHARE1:![0-9]+]], metadata !DIExpression(DW_OP_plus_uconst, 16, DW_OP_deref)) 16 17 // CHECK-DAG: [[SHARE2]] = !DILocalVariable(name: "share2" 18 // CHECK-DAG: [[SHARE3]] = !DILocalVariable(name: "share3" 19 // CHECK-DAG: [[SHARE1]] = !DILocalVariable(name: "share1" 20 21 // NEG-LABEL: define internal i32 @.omp_task_entry. 22 // NEG: [[CONTEXT:%[0-9]+]] = load %struct.anon*, %struct.anon** %__context.addr.i, align 8 23 // NEG-NOT: call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata {{![0-9]+}}, metadata !DIExpression(DW_OP_deref)) 24 25 extern int printf(const char *, ...); 26 27 int foo(int n) { 28 int share1 = 9, share2 = 11, share3 = 13, priv1, priv2, fpriv; 29 fpriv = n + 4; 30 31 if (n < 2) 32 return n; 33 else { 34 #if SHARED 35 #pragma omp task shared(share1, share2) private(priv1, priv2) firstprivate(fpriv) shared(share3) 36 #else 37 #pragma omp task private(priv1, priv2) firstprivate(fpriv) 38 #endif 39 { 40 priv1 = n; 41 priv2 = n + 2; 42 share2 += share3; 43 printf("share1 = %d, share2 = %d, share3 = %d\n", share1, share2, share3); 44 share1 = priv1 + priv2 + fpriv + foo(n - 1) + share2 + share3; 45 } 46 #pragma omp taskwait 47 return share1 + share2 + share3; 48 } 49 } 50 51 int main() { 52 int n = 10; 53 printf("foo(%d) = %d\n", n, foo(n)); 54 return 0; 55 } 56