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