Skip to content

Commit

Permalink
Extract the method to begin and end a fragment in AsmPrinterHandler i…
Browse files Browse the repository at this point in the history
…n 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

llvm-svn: 262058
  • Loading branch information
deadalnix committed Feb 26, 2016
1 parent 87e23e5 commit 7067ad3
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 12 deletions.
7 changes: 7 additions & 0 deletions llvm/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -51,6 +54,10 @@ class AsmPrinterHandler {
/// 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) {}
Expand Down
39 changes: 28 additions & 11 deletions llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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() {}

Expand Down Expand Up @@ -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();
Expand All @@ -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
Expand All @@ -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;

Expand All @@ -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.
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/CodeGen/AsmPrinter/DwarfException.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "EHStreamer.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/MC/MCDwarf.h"

namespace llvm {
class MachineFunction;
Expand All @@ -29,12 +30,16 @@ class LLVM_LIBRARY_VISIBILITY DwarfCFIExceptionBase : public EHStreamer {
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;

Expand All @@ -59,6 +64,9 @@ class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public DwarfCFIExceptionBase {

/// 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 {
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/CodeGen/AsmPrinter/EHStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ struct LandingPadInfo;
class MachineModuleInfo;
class MachineInstr;
class MachineFunction;
class AsmPrinter;
class MCSymbol;
class MCSymbolRefExpr;

Expand Down

0 comments on commit 7067ad3

Please sign in to comment.