[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