diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-03-12 00:36:20 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-03-12 00:36:20 +0000 |
commit | 47c8e7a0e7fa612363d727aa9db45d6b647b1d49 (patch) | |
tree | 2657f999d4113601de379fb126d819ddb83912c3 /llvm/lib/CodeGen/DwarfEHPrepare.cpp | |
parent | 6e7908ddb7538ff9a6f49aecaa6b603f98cb423e (diff) | |
download | bcm5719-llvm-47c8e7a0e7fa612363d727aa9db45d6b647b1d49.tar.gz bcm5719-llvm-47c8e7a0e7fa612363d727aa9db45d6b647b1d49.zip |
Stop calling DwarfEHPrepare from WinEHPrepare
Instead, run both EH preparation passes, and have them both ignore
functions with unrecognized EH personalities. Pass delegation involved
some hacky code for creating an AnalysisResolver that we don't need now.
llvm-svn: 231995
Diffstat (limited to 'llvm/lib/CodeGen/DwarfEHPrepare.cpp')
-rw-r--r-- | llvm/lib/CodeGen/DwarfEHPrepare.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/DwarfEHPrepare.cpp b/llvm/lib/CodeGen/DwarfEHPrepare.cpp index f58fb59d060..42656fb08db 100644 --- a/llvm/lib/CodeGen/DwarfEHPrepare.cpp +++ b/llvm/lib/CodeGen/DwarfEHPrepare.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/BitVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/CFG.h" +#include "llvm/Analysis/LibCallSemantics.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" @@ -180,12 +181,22 @@ size_t DwarfEHPrepare::pruneUnreachableResumes( bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) { SmallVector<ResumeInst*, 16> Resumes; SmallVector<LandingPadInst*, 16> CleanupLPads; + bool FoundLP = false; for (BasicBlock &BB : Fn) { if (auto *RI = dyn_cast<ResumeInst>(BB.getTerminator())) Resumes.push_back(RI); - if (auto *LP = BB.getLandingPadInst()) + if (auto *LP = BB.getLandingPadInst()) { if (LP->isCleanup()) CleanupLPads.push_back(LP); + // Check the personality on the first landingpad. Don't do anything if + // it's for MSVC. + if (!FoundLP) { + FoundLP = true; + EHPersonality Pers = classifyEHPersonality(LP->getPersonalityFn()); + if (isMSVCEHPersonality(Pers)) + return false; + } + } } if (Resumes.empty()) |