15eb27188SAlok Kumar Sharma // This testcase checks emission of debug info for variables
25eb27188SAlok Kumar Sharma // inside shared clause of task construct.
35eb27188SAlok Kumar Sharma 
45eb27188SAlok Kumar Sharma // REQUIRES: x86_64-linux
55eb27188SAlok Kumar Sharma 
6*4821508dSDavid Blaikie // 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*4821508dSDavid Blaikie // 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
8532dc62bSNikita Popov // 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
9532dc62bSNikita Popov // 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
10532dc62bSNikita Popov // 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
115eb27188SAlok Kumar Sharma // expected-no-diagnostics
125eb27188SAlok Kumar Sharma 
135eb27188SAlok Kumar Sharma // CHECK-LABEL: define internal i32 @.omp_task_entry.
145eb27188SAlok Kumar Sharma 
155eb27188SAlok Kumar Sharma // CHECK-DAG:  [[CONTEXT:%[0-9]+]] = load %struct.anon*, %struct.anon** %__context.addr.i, align 8
165eb27188SAlok Kumar Sharma // CHECK-DAG:  call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata [[SHARE2:![0-9]+]], metadata !DIExpression(DW_OP_deref))
175eb27188SAlok Kumar Sharma // 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))
185eb27188SAlok Kumar Sharma // 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))
195eb27188SAlok Kumar Sharma 
205eb27188SAlok Kumar Sharma // CHECK-DAG: [[SHARE2]] = !DILocalVariable(name: "share2"
215eb27188SAlok Kumar Sharma // CHECK-DAG: [[SHARE3]] = !DILocalVariable(name: "share3"
225eb27188SAlok Kumar Sharma // CHECK-DAG: [[SHARE1]] = !DILocalVariable(name: "share1"
235eb27188SAlok Kumar Sharma 
245eb27188SAlok Kumar Sharma // NEG-LABEL: define internal i32 @.omp_task_entry.
255eb27188SAlok Kumar Sharma // NEG:  [[CONTEXT:%[0-9]+]] = load %struct.anon*, %struct.anon** %__context.addr.i, align 8
265eb27188SAlok Kumar Sharma // NEG-NOT: call void @llvm.dbg.declare(metadata %struct.anon* [[CONTEXT]], metadata {{![0-9]+}}, metadata !DIExpression(DW_OP_deref))
275eb27188SAlok Kumar Sharma 
285eb27188SAlok Kumar Sharma extern int printf(const char *, ...);
295eb27188SAlok Kumar Sharma 
foo(int n)305eb27188SAlok Kumar Sharma int foo(int n) {
315eb27188SAlok Kumar Sharma   int share1 = 9, share2 = 11, share3 = 13, priv1, priv2, fpriv;
325eb27188SAlok Kumar Sharma   fpriv = n + 4;
335eb27188SAlok Kumar Sharma 
345eb27188SAlok Kumar Sharma   if (n < 2)
355eb27188SAlok Kumar Sharma     return n;
365eb27188SAlok Kumar Sharma   else {
375eb27188SAlok Kumar Sharma #if SHARED
385eb27188SAlok Kumar Sharma #pragma omp task shared(share1, share2) private(priv1, priv2) firstprivate(fpriv) shared(share3)
395eb27188SAlok Kumar Sharma #else
405eb27188SAlok Kumar Sharma #pragma omp task private(priv1, priv2) firstprivate(fpriv)
415eb27188SAlok Kumar Sharma #endif
425eb27188SAlok Kumar Sharma     {
435eb27188SAlok Kumar Sharma       priv1 = n;
445eb27188SAlok Kumar Sharma       priv2 = n + 2;
455eb27188SAlok Kumar Sharma       share2 += share3;
465eb27188SAlok Kumar Sharma       printf("share1 = %d, share2 = %d, share3 = %d\n", share1, share2, share3);
475eb27188SAlok Kumar Sharma       share1 = priv1 + priv2 + fpriv + foo(n - 1) + share2 + share3;
485eb27188SAlok Kumar Sharma     }
495eb27188SAlok Kumar Sharma #pragma omp taskwait
505eb27188SAlok Kumar Sharma     return share1 + share2 + share3;
515eb27188SAlok Kumar Sharma   }
525eb27188SAlok Kumar Sharma }
535eb27188SAlok Kumar Sharma 
main()545eb27188SAlok Kumar Sharma int main() {
555eb27188SAlok Kumar Sharma   int n = 10;
565eb27188SAlok Kumar Sharma   printf("foo(%d) = %d\n", n, foo(n));
575eb27188SAlok Kumar Sharma   return 0;
585eb27188SAlok Kumar Sharma }
59