mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-12 21:28:48 +00:00
[OPENMP] Fix PR35156: Get correct thread id with windows exceptions.
If the thread id is requested in windows mode within funclets, we may generate incorrect function call that could lead to broken codegen. llvm-svn: 317208
This commit is contained in:
parent
96087f3825
commit
0e1b45897e
@ -1451,7 +1451,8 @@ llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF,
|
||||
return ThreadID;
|
||||
}
|
||||
// If exceptions are enabled, do not use parameter to avoid possible crash.
|
||||
if (!CGF.getInvokeDest()) {
|
||||
if (!CGF.getInvokeDest() ||
|
||||
CGF.Builder.GetInsertBlock() == CGF.AllocaInsertPt->getParent()) {
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (OMPRegionInfo->getThreadIDVariable()) {
|
||||
@ -1475,12 +1476,13 @@ llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF,
|
||||
// function.
|
||||
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
|
||||
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
|
||||
ThreadID =
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_global_thread_num),
|
||||
emitUpdateLocation(CGF, Loc));
|
||||
auto *Call = CGF.Builder.CreateCall(
|
||||
createRuntimeFunction(OMPRTL__kmpc_global_thread_num),
|
||||
emitUpdateLocation(CGF, Loc));
|
||||
Call->setCallingConv(CGF.getRuntimeCC());
|
||||
auto &Elem = OpenMPLocThreadIDMap.FindAndConstruct(CGF.CurFn);
|
||||
Elem.second.ThreadID = ThreadID;
|
||||
return ThreadID;
|
||||
Elem.second.ThreadID = Call;
|
||||
return Call;
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::functionFinished(CodeGenFunction &CGF) {
|
||||
|
@ -78,7 +78,7 @@ void critical_ref(S &s) {
|
||||
void parallel_critical() {
|
||||
#pragma omp parallel
|
||||
#pragma omp critical
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_critical({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
@ -355,7 +355,7 @@ int foo() {return 0;};
|
||||
void parallel_for(float *a) {
|
||||
#pragma omp parallel
|
||||
#pragma omp for schedule(static, 5)
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_for_static_init_4u({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke i32 {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
@ -673,7 +673,7 @@ int bar() {return 0;};
|
||||
void parallel_simd(float *a) {
|
||||
#pragma omp parallel
|
||||
#pragma omp for simd
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: invoke i32 {{.*}}bar{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
|
@ -49,7 +49,7 @@ int main() {
|
||||
void parallel_master() {
|
||||
#pragma omp parallel
|
||||
#pragma omp master
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call i32 @__kmpc_master({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
38
clang/test/OpenMP/openmp_win_codegen.cpp
Normal file
38
clang/test/OpenMP/openmp_win_codegen.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-pc-windows-msvc18.0.0 -std=c++11 -fms-compatibility-version=18 -fms-extensions -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
|
||||
// REQUIRES: x86-registered-target
|
||||
// expected-no-diagnostics
|
||||
|
||||
void foo();
|
||||
void bar();
|
||||
|
||||
// CHECK-LABEL: @main
|
||||
int main() {
|
||||
// CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%ident_t* @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*))
|
||||
#pragma omp parallel
|
||||
{
|
||||
try {
|
||||
foo();
|
||||
} catch (int t) {
|
||||
#pragma omp critical
|
||||
{
|
||||
bar();
|
||||
};
|
||||
}
|
||||
};
|
||||
// CHECK: ret i32 0
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK: define internal void [[OUTLINED]](
|
||||
// CHECK: [[GID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* @0)
|
||||
// CHECK: invoke void @{{.+}}foo
|
||||
// CHECK: catchswitch within
|
||||
// CHECK: catchpad within
|
||||
// CHECK: call void @__kmpc_critical(%ident_t* @0, i32 [[GID]],
|
||||
// CHECK: invoke void @{{.+}}bar
|
||||
// CHECK: call void @__kmpc_end_critical(%ident_t* @0, i32 [[GID]],
|
||||
// CHECK: catchret from
|
||||
// CHECK: cleanuppad within
|
||||
// CHECK: call void @__kmpc_end_critical(%ident_t* @0, i32 [[GID]],
|
||||
// CHECK: cleanupret from
|
||||
|
@ -348,7 +348,7 @@ int foo() {return 0;};
|
||||
void parallel_for(float *a, int n) {
|
||||
float arr[n];
|
||||
#pragma omp parallel for schedule(static, 5) private(arr)
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_for_static_init_4u({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke i32 {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
@ -668,7 +668,7 @@ int bar() {return 0;};
|
||||
// TERM_DEBUG-LABEL: parallel_simd
|
||||
void parallel_simd(float *a) {
|
||||
#pragma omp parallel for simd
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: invoke i32 {{.*}}bar{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
|
@ -74,7 +74,7 @@ int main() {
|
||||
|
||||
// CHECK-LABEL: tmain
|
||||
// CHECK: call void {{.*}} @__kmpc_fork_call(
|
||||
// CHECK: __kmpc_global_thread_num
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK-NEXT: unwind label %[[TERM_LPAD:.+]]
|
||||
|
@ -84,7 +84,7 @@ int main() {
|
||||
|
||||
// CHECK-LABEL: tmain
|
||||
// CHECK: call void {{.*}} @__kmpc_fork_call(
|
||||
// CHECK: __kmpc_global_thread_num
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK-NEXT: unwind label %[[TERM_LPAD:.+]]
|
||||
|
@ -190,7 +190,7 @@ int main() {
|
||||
void parallel_single() {
|
||||
#pragma omp parallel
|
||||
#pragma omp single
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call i32 @__kmpc_single({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
@ -40,7 +40,7 @@ int main() {
|
||||
void parallel_taskgroup() {
|
||||
#pragma omp parallel
|
||||
#pragma omp taskgroup
|
||||
// TERM_DEBUG: __kmpc_global_thread_num
|
||||
// TERM_DEBUG-NOT: __kmpc_global_thread_num
|
||||
// TERM_DEBUG: call void @__kmpc_taskgroup({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
|
||||
// TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
|
||||
// TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
|
||||
|
Loading…
x
Reference in New Issue
Block a user