mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 10:46:07 +00:00

For all threadprivate variables which have constructor/destructor emit call to void __kmpc_threadprivate_register(ident_t * <Current Location>, void *<Original Global Addr>, kmpc_ctor <Constructor>, kmpc_cctor NULL, kmpc_dtor <Destructor>); In expressions all references to such variables are replaced by calls to void *__kmpc_threadprivate_cached(ident_t *<Current Location>, kmp_int32 <Current Thread Id>, void *<Original Global Addr>, size_t <Size of Data>, void ***<Pointer to autogenerated cache – array of private copies of threadprivate variable>); Test test/OpenMP/threadprivate_codegen.cpp checks that codegen is correct. Also it checks that codegen is correct after serialization/deserialization and one of passes verifies debug info. Differential Revision: http://reviews.llvm.org/D4002 llvm-svn: 221663
27 lines
604 B
C++
27 lines
604 B
C++
// no PCH
|
|
// RUN: %clang_cc1 -fopenmp=libiomp5 -emit-llvm -include %s -include %s %s -o - | FileCheck %s
|
|
// with PCH
|
|
// RUN: %clang_cc1 -fopenmp=libiomp5 -emit-llvm -chain-include %s -chain-include %s %s -o - | FileCheck %s
|
|
#if !defined(PASS1)
|
|
#define PASS1
|
|
|
|
extern "C" int* malloc (int size);
|
|
int *a = malloc(20);
|
|
|
|
#elif !defined(PASS2)
|
|
#define PASS2
|
|
|
|
#pragma omp threadprivate(a)
|
|
|
|
#else
|
|
|
|
// CHECK: call {{.*}} @__kmpc_threadprivate_register(
|
|
|
|
// CHECK-LABEL: foo
|
|
int foo() {
|
|
return *a;
|
|
// CHECK: call {{.*}} @__kmpc_global_thread_num(
|
|
// CHECK: call {{.*}} @__kmpc_threadprivate_cached(
|
|
}
|
|
#endif
|