[PATCH] D77936: [Windows SEH] Fix abnormal-exits in _try
Ten Tzen via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 13 16:20:05 PDT 2020
tentzen marked 2 inline comments as done.
tentzen added inline comments.
================
Comment at: clang/lib/CodeGen/CGCleanup.cpp:848
// Build a switch-out if we need it:
// - if there are branch-afters threaded through the scope
----------------
rnk wrote:
> Are we sure this is the right set of predicates? It seems like we'll get the wrong flag in cases like:
> ```
> __try {
> mayThrow();
> goto out; // AbnormalTermination should be 1
> } __finally {
> tearDown();
> }
> out:
> return 0;
> ```
>
> I think these conditions are designed to avoid the switch when there is no normal fallthrough destination (!HasFallthrough). I see clang emits no switch for this C++ input:
>
> ```
> $ cat t.cpp
> void mayThrow();
> struct Dtor {
> ~Dtor();
> };
> int f() {
> do {
> Dtor o;
> mayThrow();
> break;
> } while (0);
> return 0;
> }
>
> $ clang t.cpp -S -emit-llvm -fno-exceptions -o - | grep switch
> # empty
> ```
Yes, this test passed.
```
store i32 3, i32* %cleanup.dest.slot, align 4
%0 = call i8* @llvm.localaddress()
%cleanup.dest = load i32, i32* %cleanup.dest.slot, align 4
%1 = icmp ne i32 %cleanup.dest, 0
%2 = zext i1 %1 to i8
call void @"?fin$0 at 0@Test84@@"(i8 %2, i8* %0)
%cleanup.dest1 = load i32, i32* %cleanup.dest.slot, align 4
switch i32 %cleanup.dest1, label %unreachable [
i32 3, label %out
]
```
================
Comment at: clang/lib/CodeGen/CGCleanup.cpp:863-864
+ // pass the abnormal exit flag to Fn (SEH cleanup)
+ cleanupFlags.setHasSehAbnormalExits();
+
----------------
rnk wrote:
> This flag is set for any cleanup that needs to switch-out to multiple normal destinations. You have named this an "seh abnormal exit", an exit that is abnormal for the purposes of SEH, but I think it would be clearer to give the flag a more general name.
>
> Based on the existing terminology, maybe (F_)HasBranchAfter would be the closest to what we are looking for?
my original implementation in https://github.com/tentzen/llvm-project is still using (F_)HasBranchAfters. it's renamed because I'm afraid it may mis-imply it to Scope.getNumBranchAfters().
Yes, Agree, it should not be SEH specific.
how about F_HasExitSwitch?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77936/new/
https://reviews.llvm.org/D77936
More information about the cfe-commits
mailing list