[PATCH] D158233: [SEH] Fix wrong argument passes to the call of OutlinedFinally.

Jennifer Yu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 21 17:12:05 PDT 2023


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGff08c8e57e39: [SEH] Fix wrong argument passes to the call of OutlinedFinally. (authored by jyu2).

Changed prior to commit:
  https://reviews.llvm.org/D158233?vs=552157&id=552170#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D158233/new/

https://reviews.llvm.org/D158233

Files:
  clang/lib/CodeGen/CGCleanup.cpp
  clang/test/CodeGen/exceptions-seh-finally.c
  clang/test/CodeGen/windows-seh-EHa-TryInFinally.cpp


Index: clang/test/CodeGen/windows-seh-EHa-TryInFinally.cpp
===================================================================
--- clang/test/CodeGen/windows-seh-EHa-TryInFinally.cpp
+++ clang/test/CodeGen/windows-seh-EHa-TryInFinally.cpp
@@ -1,5 +1,6 @@
 // RUN: %clang_cc1 -triple x86_64-windows -fasync-exceptions -fcxx-exceptions -fexceptions -fms-extensions -x c++ -Wno-implicit-function-declaration -S -emit-llvm %s -o - | FileCheck %s
 
+// CHECK-LABEL: @main()
 // CHECK: invoke void @llvm.seh.try.begin()
 // CHECK: invoke void @llvm.seh.try.begin()
 // CHECK: %[[src:[0-9-]+]] = load volatile i32, ptr %i
@@ -40,3 +41,29 @@
   }
   return 0;
 }
+
+// CHECK-LABEL:@"?foo@@YAXXZ"()
+// CHECK: invoke.cont:
+// CHECK: invoke void @llvm.seh.try.begin()
+// CHECK: store volatile i32 1, ptr %cleanup.dest.slot
+// CHECK: invoke void @llvm.seh.try.end()
+// CHECK: invoke.cont2:
+// CHECK: %cleanup.dest = load i32, ptr %cleanup.dest.slot
+// CHECK: %1 = icmp ne i32 %cleanup.dest, 0
+// CHECK: %2 = zext i1 %1 to i8
+// CHECK: call void @"?fin$0 at 0@foo@@"(i8 noundef %2, ptr noundef %0)
+// CHECK: ehcleanup:
+// CHECK: call void @"?fin$0 at 0@foo@@"(i8 noundef 1, ptr noundef %4)
+void foo()
+{
+  __try {
+    return;
+  }
+  __finally {
+    if (_abnormal_termination()) {
+      printf("Passed\n");
+    } else {
+      printf("Failed\n");
+    }
+  }
+}
Index: clang/test/CodeGen/exceptions-seh-finally.c
===================================================================
--- clang/test/CodeGen/exceptions-seh-finally.c
+++ clang/test/CodeGen/exceptions-seh-finally.c
@@ -154,8 +154,11 @@
   }
 }
 // CHECK-LABEL: define dso_local i32 @finally_with_return()
+// CHECK: store i32 1, ptr %cleanup.dest.slot
+// CHECK: %cleanup.dest = load i32, ptr %cleanup.dest.slot
+// CHECK: icmp ne i32 %cleanup.dest
 // CHECK: call void @"?fin$0 at 0@finally_with_return@@"({{.*}})
-// CHECK-NEXT: ret i32 42
+// CHECK: ret i32 42
 
 // CHECK: define internal void @"?fin$0 at 0@finally_with_return@@"({{.*}})
 // CHECK-SAME: [[finally_attrs]]
Index: clang/lib/CodeGen/CGCleanup.cpp
===================================================================
--- clang/lib/CodeGen/CGCleanup.cpp
+++ clang/lib/CodeGen/CGCleanup.cpp
@@ -873,8 +873,13 @@
 
       // If there's exactly one branch-after and no other threads,
       // we can route it without a switch.
+      // Skip for SEH, since ExitSwitch is used to generate code to indicate
+      // abnormal termination. (SEH: Except _leave and fall-through at
+      // the end, all other exits in a _try (return/goto/continue/break)
+      // are considered as abnormal terminations, using NormalCleanupDestSlot
+      // to indicate abnormal termination)
       if (!Scope.hasBranchThroughs() && !HasFixups && !HasFallthrough &&
-          Scope.getNumBranchAfters() == 1) {
+          !currentFunctionUsesSEHTry() && Scope.getNumBranchAfters() == 1) {
         assert(!BranchThroughDest || !IsActive);
 
         // Clean up the possibly dead store to the cleanup dest slot.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158233.552170.patch
Type: text/x-patch
Size: 3013 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230822/20b3b80d/attachment.bin>


More information about the cfe-commits mailing list