]> granicus.if.org Git - clang/commitdiff
[OPENMP] Fix PR35152: Do not use getInvokeDest() function for EH checks.
authorAlexey Bataev <a.bataev@hotmail.com>
Thu, 2 Nov 2017 18:55:05 +0000 (18:55 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Thu, 2 Nov 2017 18:55:05 +0000 (18:55 +0000)
The compiler may crash under some conditions if the getInvokeDest() is
used, but later it is not used. Fixed this problem in OpenMP.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@317227 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGOpenMPRuntime.cpp
test/OpenMP/openmp_win_codegen.cpp

index 779617adc21adc8636c81b511520e2e52a7177ac..ce7fe9364b99ca068f117cb0c64371cc35ce6ccb 100644 (file)
@@ -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.EHStack.requiresLandingPad() || !CGF.getLangOpts().Exceptions ||
+      !CGF.getLangOpts().CXXExceptions ||
       CGF.Builder.GetInsertBlock() == CGF.AllocaInsertPt->getParent()) {
     if (auto *OMPRegionInfo =
             dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
index cdad7e29ccb6a7d1e819a8dcd1d70a8aa6bde3bd..45b2c185cb8fd280c160af7537ac90eedc0c2400 100644 (file)
@@ -1,13 +1,36 @@
-// 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
+// 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 - -O1 | FileCheck %s
 // REQUIRES: x86-registered-target
 // expected-no-diagnostics
 
 void foo();
 void bar();
 
+struct Test {
+  static void main() {
+    int failed = 0;
+    int j = 2;
+
+#pragma omp parallel
+    {
+      int local_j = 3;
+#pragma omp single copyprivate(local_j)
+      {
+        local_j = 4;
+      }
+
+      // Assure reports a data race, but value written to "j"
+      // should always be the same.
+      j = local_j;
+    }
+
+  }
+};
+
 // 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*, ...)*))
+  // CHECK: call void @{{.+}}main
+  Test::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 {
@@ -24,15 +47,15 @@ int main() {
 }
 
 // CHECK: define internal void [[OUTLINED]](
-// CHECK: [[GID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* @0)
+// 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: 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: 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: call void @__kmpc_end_critical(%ident_t* {{.*}}@0, i32 [[GID]],
 // CHECK: cleanupret from