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:
Amaury Sechet 2016-02-26 20:30:37 +00:00
parent 5cde53b025
commit dc766bd433
4 changed files with 43 additions and 12 deletions

View File

@ -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) {}

View File

@ -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.

View File

@ -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 {

View File

@ -22,7 +22,6 @@ struct LandingPadInfo;
class MachineModuleInfo;
class MachineInstr;
class MachineFunction;
class AsmPrinter;
class MCSymbol;
class MCSymbolRefExpr;