mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
Move the personality function from LandingPadInst to Function
The personality routine currently lives in the LandingPadInst. This isn't desirable because: - All LandingPadInsts in the same function must have the same personality routine. This means that each LandingPadInst beyond the first has an operand which produces no additional information. - There is ongoing work to introduce EH IR constructs other than LandingPadInst. Moving the personality routine off of any one particular Instruction and onto the parent function seems a lot better than have N different places a personality function can sneak onto an exceptional function. Differential Revision: http://reviews.llvm.org/D10429 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239940 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -111,7 +111,7 @@ private:
|
||||
bool outlineHandler(ActionHandler *Action, Function *SrcFn,
|
||||
LandingPadInst *LPad, BasicBlock *StartBB,
|
||||
FrameVarInfoMap &VarInfo);
|
||||
void addStubInvokeToHandlerIfNeeded(Function *Handler, Value *PersonalityFn);
|
||||
void addStubInvokeToHandlerIfNeeded(Function *Handler);
|
||||
|
||||
void mapLandingPadBlocks(LandingPadInst *LPad, LandingPadActions &Actions);
|
||||
CatchHandler *findCatchHandler(BasicBlock *BB, BasicBlock *&NextBB,
|
||||
@ -379,7 +379,7 @@ bool WinEHPrepare::runOnFunction(Function &Fn) {
|
||||
return false;
|
||||
|
||||
// Classify the personality to see what kind of preparation we need.
|
||||
Personality = classifyEHPersonality(LPads.back()->getPersonalityFn());
|
||||
Personality = classifyEHPersonality(Fn.getPersonalityFn());
|
||||
|
||||
// Do nothing if this is not an MSVC personality.
|
||||
if (!isMSVCEHPersonality(Personality))
|
||||
@ -1265,8 +1265,7 @@ static bool isCatchBlock(BasicBlock *BB) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static BasicBlock *createStubLandingPad(Function *Handler,
|
||||
Value *PersonalityFn) {
|
||||
static BasicBlock *createStubLandingPad(Function *Handler) {
|
||||
// FIXME: Finish this!
|
||||
LLVMContext &Context = Handler->getContext();
|
||||
BasicBlock *StubBB = BasicBlock::Create(Context, "stub");
|
||||
@ -1275,7 +1274,7 @@ static BasicBlock *createStubLandingPad(Function *Handler,
|
||||
LandingPadInst *LPad = Builder.CreateLandingPad(
|
||||
llvm::StructType::get(Type::getInt8PtrTy(Context),
|
||||
Type::getInt32Ty(Context), nullptr),
|
||||
PersonalityFn, 0);
|
||||
0);
|
||||
// Insert a call to llvm.eh.actions so that we don't try to outline this lpad.
|
||||
Function *ActionIntrin =
|
||||
Intrinsic::getDeclaration(Handler->getParent(), Intrinsic::eh_actions);
|
||||
@ -1290,8 +1289,7 @@ static BasicBlock *createStubLandingPad(Function *Handler,
|
||||
// landing pad if none is found. The code that generates the .xdata tables for
|
||||
// the handler needs at least one landing pad to identify the parent function's
|
||||
// personality.
|
||||
void WinEHPrepare::addStubInvokeToHandlerIfNeeded(Function *Handler,
|
||||
Value *PersonalityFn) {
|
||||
void WinEHPrepare::addStubInvokeToHandlerIfNeeded(Function *Handler) {
|
||||
ReturnInst *Ret = nullptr;
|
||||
UnreachableInst *Unreached = nullptr;
|
||||
for (BasicBlock &BB : *Handler) {
|
||||
@ -1323,7 +1321,7 @@ void WinEHPrepare::addStubInvokeToHandlerIfNeeded(Function *Handler,
|
||||
// parent block. We want to replace that with an invoke call, so we can
|
||||
// erase it now.
|
||||
OldRetBB->getTerminator()->eraseFromParent();
|
||||
BasicBlock *StubLandingPad = createStubLandingPad(Handler, PersonalityFn);
|
||||
BasicBlock *StubLandingPad = createStubLandingPad(Handler);
|
||||
Function *F =
|
||||
Intrinsic::getDeclaration(Handler->getParent(), Intrinsic::donothing);
|
||||
InvokeInst::Create(F, NewRetBB, StubLandingPad, None, "", OldRetBB);
|
||||
@ -1379,6 +1377,7 @@ bool WinEHPrepare::outlineHandler(ActionHandler *Action, Function *SrcFn,
|
||||
Handler = createHandlerFunc(Type::getVoidTy(Context),
|
||||
SrcFn->getName() + ".cleanup", M, ParentFP);
|
||||
}
|
||||
Handler->setPersonalityFn(SrcFn->getPersonalityFn());
|
||||
HandlerToParentFP[Handler] = ParentFP;
|
||||
Handler->addFnAttr("wineh-parent", SrcFn->getName());
|
||||
BasicBlock *Entry = &Handler->getEntryBlock();
|
||||
@ -1456,7 +1455,7 @@ bool WinEHPrepare::outlineHandler(ActionHandler *Action, Function *SrcFn,
|
||||
ClonedEntryBB->eraseFromParent();
|
||||
|
||||
// Make sure we can identify the handler's personality later.
|
||||
addStubInvokeToHandlerIfNeeded(Handler, LPad->getPersonalityFn());
|
||||
addStubInvokeToHandlerIfNeeded(Handler);
|
||||
|
||||
if (auto *CatchAction = dyn_cast<CatchHandler>(Action)) {
|
||||
WinEHCatchDirector *CatchDirector =
|
||||
|
Reference in New Issue
Block a user