mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-12 22:30:12 +00:00
Extract the method to begin and end a fragment in AsmPrinterHandler in their own method. NFC
Summary: This is extracted from D17555 Reviewers: davidxl, reames, sanjoy, MatzeB, pete Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D17580 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262058 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5cde53b025
commit
dc766bd433
@ -19,11 +19,14 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AsmPrinter;
|
||||
class MachineBasicBlock;
|
||||
class MachineFunction;
|
||||
class MachineInstr;
|
||||
class MCSymbol;
|
||||
|
||||
typedef MCSymbol *ExceptionSymbolProvider(AsmPrinter *Asm);
|
||||
|
||||
/// \brief Collects and handles AsmPrinter objects required to build debug
|
||||
/// or EH information.
|
||||
class AsmPrinterHandler {
|
||||
@ -51,6 +54,10 @@ public:
|
||||
/// beginFunction at all.
|
||||
virtual void endFunction(const MachineFunction *MF) = 0;
|
||||
|
||||
virtual void beginFragment(const MachineBasicBlock *MBB,
|
||||
ExceptionSymbolProvider ESP) {}
|
||||
virtual void endFragment() {}
|
||||
|
||||
/// \brief Emit target-specific EH funclet machinery.
|
||||
virtual void beginFunclet(const MachineBasicBlock &MBB,
|
||||
MCSymbol *Sym = nullptr) {}
|
||||
|
@ -43,8 +43,7 @@ DwarfCFIExceptionBase::DwarfCFIExceptionBase(AsmPrinter *A)
|
||||
: EHStreamer(A), shouldEmitCFI(false) {}
|
||||
|
||||
void DwarfCFIExceptionBase::markFunctionEnd() {
|
||||
if (shouldEmitCFI)
|
||||
Asm->OutStreamer->EmitCFIEndProc();
|
||||
endFragment();
|
||||
|
||||
if (MMI->getLandingPads().empty())
|
||||
return;
|
||||
@ -53,10 +52,15 @@ void DwarfCFIExceptionBase::markFunctionEnd() {
|
||||
MMI->TidyLandingPads();
|
||||
}
|
||||
|
||||
void DwarfCFIExceptionBase::endFragment() {
|
||||
if (shouldEmitCFI)
|
||||
Asm->OutStreamer->EmitCFIEndProc();
|
||||
}
|
||||
|
||||
DwarfCFIException::DwarfCFIException(AsmPrinter *A)
|
||||
: DwarfCFIExceptionBase(A), shouldEmitPersonality(false),
|
||||
shouldEmitLSDA(false), shouldEmitMoves(false),
|
||||
moveTypeModule(AsmPrinter::CFI_M_None) {}
|
||||
shouldEmitLSDA(false), forceEmitPersonality(false),
|
||||
shouldEmitMoves(false), moveTypeModule(AsmPrinter::CFI_M_None) {}
|
||||
|
||||
DwarfCFIException::~DwarfCFIException() {}
|
||||
|
||||
@ -86,6 +90,10 @@ void DwarfCFIException::endModule() {
|
||||
}
|
||||
}
|
||||
|
||||
static MCSymbol *getExceptionSym(AsmPrinter *Asm) {
|
||||
return Asm->getCurExceptionSym();
|
||||
}
|
||||
|
||||
void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
||||
shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;
|
||||
const Function *F = MF->getFunction();
|
||||
@ -109,7 +117,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
||||
Per = dyn_cast<Function>(F->getPersonalityFn()->stripPointerCasts());
|
||||
|
||||
// Emit a personality function even when there are no landing pads
|
||||
bool forceEmitPersonality =
|
||||
forceEmitPersonality =
|
||||
// ...if a personality function is explicitly specified
|
||||
F->hasPersonalityFn() &&
|
||||
// ... and it's not known to be a noop in the absence of invokes
|
||||
@ -127,6 +135,11 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
||||
LSDAEncoding != dwarf::DW_EH_PE_omit;
|
||||
|
||||
shouldEmitCFI = shouldEmitPersonality || shouldEmitMoves;
|
||||
beginFragment(&*MF->begin(), getExceptionSym);
|
||||
}
|
||||
|
||||
void DwarfCFIException::beginFragment(const MachineBasicBlock *MBB,
|
||||
ExceptionSymbolProvider ESP) {
|
||||
if (!shouldEmitCFI)
|
||||
return;
|
||||
|
||||
@ -136,20 +149,24 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
||||
if (!shouldEmitPersonality)
|
||||
return;
|
||||
|
||||
auto *F = MBB->getParent()->getFunction();
|
||||
auto *P = dyn_cast<Function>(F->getPersonalityFn()->stripPointerCasts());
|
||||
assert(P && "Expected personality function");
|
||||
|
||||
// If we are forced to emit this personality, make sure to record
|
||||
// it because it might not appear in any landingpad
|
||||
if (forceEmitPersonality)
|
||||
MMI->addPersonality(Per);
|
||||
MMI->addPersonality(P);
|
||||
|
||||
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
|
||||
unsigned PerEncoding = TLOF.getPersonalityEncoding();
|
||||
const MCSymbol *Sym =
|
||||
TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang, Asm->TM, MMI);
|
||||
TLOF.getCFIPersonalitySymbol(P, *Asm->Mang, Asm->TM, MMI);
|
||||
Asm->OutStreamer->EmitCFIPersonality(Sym, PerEncoding);
|
||||
|
||||
// Provide LSDA information.
|
||||
if (!shouldEmitLSDA)
|
||||
return;
|
||||
|
||||
Asm->OutStreamer->EmitCFILsda(Asm->getCurExceptionSym(), LSDAEncoding);
|
||||
if (shouldEmitLSDA)
|
||||
Asm->OutStreamer->EmitCFILsda(ESP(Asm), TLOF.getLSDAEncoding());
|
||||
}
|
||||
|
||||
/// endFunction - Gather and emit post-function exception information.
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include "EHStreamer.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/MC/MCDwarf.h"
|
||||
|
||||
namespace llvm {
|
||||
class MachineFunction;
|
||||
@ -29,12 +30,16 @@ protected:
|
||||
bool shouldEmitCFI;
|
||||
|
||||
void markFunctionEnd() override;
|
||||
void endFragment() override;
|
||||
};
|
||||
|
||||
class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase {
|
||||
/// Per-function flag to indicate if .cfi_personality should be emitted.
|
||||
bool shouldEmitPersonality;
|
||||
|
||||
/// Per-function flag to indicate if .cfi_personality must be emitted.
|
||||
bool forceEmitPersonality;
|
||||
|
||||
/// Per-function flag to indicate if .cfi_lsda should be emitted.
|
||||
bool shouldEmitLSDA;
|
||||
|
||||
@ -59,6 +64,9 @@ public:
|
||||
|
||||
/// Gather and emit post-function exception information.
|
||||
void endFunction(const MachineFunction *) override;
|
||||
|
||||
void beginFragment(const MachineBasicBlock *MBB,
|
||||
ExceptionSymbolProvider ESP) override;
|
||||
};
|
||||
|
||||
class LLVM_LIBRARY_VISIBILITY ARMException : public DwarfCFIExceptionBase {
|
||||
|
@ -22,7 +22,6 @@ struct LandingPadInfo;
|
||||
class MachineModuleInfo;
|
||||
class MachineInstr;
|
||||
class MachineFunction;
|
||||
class AsmPrinter;
|
||||
class MCSymbol;
|
||||
class MCSymbolRefExpr;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user