[PATCH] D77936: [Windows SEH] Fix abnormal-exits in _try
Reid Kleckner via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 13 12:26:47 PDT 2020
rnk added a comment.
I like the implementation strategy, but I have one corner case, which is probably worth a test.
================
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
----------------
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
```
================
Comment at: clang/lib/CodeGen/CGCleanup.cpp:863-864
+ // pass the abnormal exit flag to Fn (SEH cleanup)
+ cleanupFlags.setHasSehAbnormalExits();
+
----------------
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?
================
Comment at: clang/lib/CodeGen/EHScopeStack.h:184
+ bool hasSehAbnormalExits() const { return flags & F_HasSehAbnormalExits; }
+ void setHasSehAbnormalExits() { flags |= F_HasSehAbnormalExits; }
----------------
Please add a comment describing the accessor.
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