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