mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
[SEH] Reimplement x64 SEH using WinEHPrepare
This now emits simple, unoptimized xdata tables for __C_specific_handler based on the handlers listed in @llvm.eh.actions calls produced by WinEHPrepare. This adds support for running __finally blocks when exceptions are thrown, and removes the old landingpad fan-in codepath. I ran some manual execution tests on small basic test cases with and without optimization, as well as on Chrome base_unittests, which uses a small amount of SEH. I'm sure there are bugs, and we may need to revert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235154 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -306,11 +306,6 @@ FunctionPass *llvm::createWinEHPass(const TargetMachine *TM) {
|
||||
return new WinEHPrepare(TM);
|
||||
}
|
||||
|
||||
// FIXME: Remove this once the backend can handle the prepared IR.
|
||||
static cl::opt<bool>
|
||||
SEHPrepare("sehprepare", cl::Hidden,
|
||||
cl::desc("Prepare functions with SEH personalities"));
|
||||
|
||||
bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
SmallVector<LandingPadInst *, 4> LPads;
|
||||
SmallVector<ResumeInst *, 4> Resumes;
|
||||
@@ -334,16 +329,6 @@ bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
|
||||
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
|
||||
if (isAsynchronousEHPersonality(Personality) && !SEHPrepare) {
|
||||
// Replace all resume instructions with unreachable.
|
||||
// FIXME: Remove this once the backend can handle the prepared IR.
|
||||
for (ResumeInst *Resume : Resumes) {
|
||||
IRBuilder<>(Resume).CreateUnreachable();
|
||||
Resume->eraseFromParent();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// If there were any landing pads, prepareExceptionHandlers will make changes.
|
||||
prepareExceptionHandlers(Fn, LPads);
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user