mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231995 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -20,8 +20,6 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/TinyPtrVector.h"
|
||||
#include "llvm/Analysis/LibCallSemantics.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
@ -63,12 +61,10 @@ typedef DenseMap<const BasicBlock *, CatchHandler *> CatchHandlerMapTy;
|
||||
typedef DenseMap<const BasicBlock *, CleanupHandler *> CleanupHandlerMapTy;
|
||||
|
||||
class WinEHPrepare : public FunctionPass {
|
||||
std::unique_ptr<FunctionPass> DwarfPrepare;
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid.
|
||||
WinEHPrepare(const TargetMachine *TM = nullptr)
|
||||
: FunctionPass(ID), DwarfPrepare(createDwarfEHPass(TM)) {}
|
||||
: FunctionPass(ID) {}
|
||||
|
||||
bool runOnFunction(Function &Fn) override;
|
||||
|
||||
@ -323,23 +319,13 @@ private:
|
||||
} // end anonymous namespace
|
||||
|
||||
char WinEHPrepare::ID = 0;
|
||||
INITIALIZE_TM_PASS_BEGIN(WinEHPrepare, "winehprepare",
|
||||
"Prepare Windows exceptions", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(DwarfEHPrepare)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
|
||||
INITIALIZE_TM_PASS_END(WinEHPrepare, "winehprepare",
|
||||
"Prepare Windows exceptions", false, false)
|
||||
INITIALIZE_TM_PASS(WinEHPrepare, "winehprepare", "Prepare Windows exceptions",
|
||||
false, false)
|
||||
|
||||
FunctionPass *llvm::createWinEHPass(const TargetMachine *TM) {
|
||||
return new WinEHPrepare(TM);
|
||||
}
|
||||
|
||||
static bool isMSVCPersonality(EHPersonality Pers) {
|
||||
return Pers == EHPersonality::MSVC_Win64SEH ||
|
||||
Pers == EHPersonality::MSVC_CXX;
|
||||
}
|
||||
|
||||
bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
SmallVector<LandingPadInst *, 4> LPads;
|
||||
SmallVector<ResumeInst *, 4> Resumes;
|
||||
@ -357,24 +343,9 @@ bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
// Classify the personality to see what kind of preparation we need.
|
||||
EHPersonality Pers = classifyEHPersonality(LPads.back()->getPersonalityFn());
|
||||
|
||||
// Delegate through to the DWARF pass if this is unrecognized.
|
||||
if (!isMSVCPersonality(Pers)) {
|
||||
if (!DwarfPrepare->getResolver()) {
|
||||
// Build an AnalysisResolver with the analyses needed by DwarfEHPrepare.
|
||||
// It will take ownership of the AnalysisResolver.
|
||||
assert(getResolver());
|
||||
auto *AR = new AnalysisResolver(getResolver()->getPMDataManager());
|
||||
AR->addAnalysisImplsPair(
|
||||
&TargetTransformInfoWrapperPass::ID,
|
||||
getResolver()->findImplPass(&TargetTransformInfoWrapperPass::ID));
|
||||
AR->addAnalysisImplsPair(
|
||||
&DominatorTreeWrapperPass::ID,
|
||||
getResolver()->findImplPass(&DominatorTreeWrapperPass::ID));
|
||||
DwarfPrepare->setResolver(AR);
|
||||
}
|
||||
|
||||
return DwarfPrepare->runOnFunction(Fn);
|
||||
}
|
||||
// Do nothing if this is not an MSVC personality.
|
||||
if (!isMSVCEHPersonality(Pers))
|
||||
return false;
|
||||
|
||||
// FIXME: This only returns true if the C++ EH handlers were outlined.
|
||||
// When that code is complete, it should always return whatever
|
||||
@ -395,12 +366,10 @@ bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
}
|
||||
|
||||
bool WinEHPrepare::doFinalization(Module &M) {
|
||||
return DwarfPrepare->doFinalization(M);
|
||||
return false;
|
||||
}
|
||||
|
||||
void WinEHPrepare::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
DwarfPrepare->getAnalysisUsage(AU);
|
||||
}
|
||||
void WinEHPrepare::getAnalysisUsage(AnalysisUsage &AU) const {}
|
||||
|
||||
bool WinEHPrepare::prepareCPPEHHandlers(
|
||||
Function &F, SmallVectorImpl<LandingPadInst *> &LPads) {
|
||||
|
Reference in New Issue
Block a user