In case of OpenMP programs, thread local variables can be present in any clause pertaining to OpenMP constructs, as we know that compiler generates artificial functions and in some cases values are passed to those artificial functions thru parameters. For an example, if thread local variable is present in copyin clause (testcase attached with the patch), parameter with same name is generated as parameter to artificial function. When user inquires the thread Local variable, its debug info is hidden by the parameter. User never gets the actual TLS variable when inquires it, instead gets the artificial parameter. Current patch suppresses the debug info for such artificial parameter to enable correct debugging of TLS variables. Reviewed By: aprantl Differential Revision: https://reviews.llvm.org/D123787
60 lines
2.2 KiB
C
60 lines
2.2 KiB
C
// This testcase checks emission of debug info for threadprivate variables
|
|
// present in any clause of OpenMP construct.
|
|
|
|
// REQUIRES: x86_64-linux
|
|
|
|
// RUN: %clang_cc1 -debug-info-kind=constructor -x c -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s
|
|
// expected-no-diagnostics
|
|
|
|
// CHECK: define internal void @.omp_outlined._debug__(
|
|
// CHECK: call void @llvm.dbg.declare(metadata ptr %.global_tid..addr,
|
|
// CHECK: call void @llvm.dbg.declare(metadata ptr %.bound_tid..addr,
|
|
// CHECK: call void @llvm.dbg.declare(metadata ptr %nt.addr
|
|
// CHECK: store ptr %gbl_dynamic_int, ptr %gbl_dynamic_int.addr, align 8
|
|
// CHECK-NOT: call void @llvm.dbg.declare(metadata ptr %gbl_dynamic_int.addr
|
|
// CHECK-NOT: call void @llvm.dbg.declare(metadata ptr %gbl_static_int.addr
|
|
|
|
extern int printf(const char *, ...);
|
|
extern void omp_set_num_threads(int);
|
|
extern int omp_get_num_threads(void);
|
|
extern int omp_get_thread_num(void);
|
|
|
|
int gbl_dynamic_int;
|
|
__thread int gbl_static_int;
|
|
|
|
#pragma omp threadprivate(gbl_dynamic_int)
|
|
|
|
int main() {
|
|
int nt = 0;
|
|
int offset = 10;
|
|
gbl_dynamic_int = 55;
|
|
gbl_static_int = 77;
|
|
|
|
omp_set_num_threads(4);
|
|
#pragma omp parallel copyin(gbl_dynamic_int, gbl_static_int)
|
|
{
|
|
int data;
|
|
int tid;
|
|
nt = omp_get_num_threads();
|
|
tid = omp_get_thread_num();
|
|
data = gbl_dynamic_int + gbl_static_int;
|
|
gbl_dynamic_int += 10;
|
|
gbl_static_int += 20;
|
|
#pragma omp barrier
|
|
if (tid == 0)
|
|
printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
|
|
nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
|
|
if (tid == 1)
|
|
printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
|
|
nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
|
|
if (tid == 2)
|
|
printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
|
|
nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
|
|
if (tid == 3)
|
|
printf("In parallel region total threads = %d, thread id = %d data=%d gbl_dyn_addr = %p, gbl_static_addr = %p\n",
|
|
nt, tid, data, &gbl_dynamic_int, &gbl_static_int);
|
|
}
|
|
|
|
return 0;
|
|
}
|