Skip to content

Commit

Permalink
Move the EH symbol to the asm printer and use it for the SJLJ case too.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232475 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Mar 17, 2015
1 parent f28b151 commit a480f88
Show file tree
Hide file tree
Showing 9 changed files with 18 additions and 37 deletions.
2 changes: 2 additions & 0 deletions include/llvm/CodeGen/AsmPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class AsmPrinter : public MachineFunctionPass {
private:
MCSymbol *CurrentFnBegin;
MCSymbol *CurrentFnEnd;
MCSymbol *CurExceptionSym;

// The garbage collection metadata printer table.
void *GCMetadataPrinters; // Really a DenseMap.
Expand Down Expand Up @@ -154,6 +155,7 @@ class AsmPrinter : public MachineFunctionPass {

MCSymbol *getFunctionBegin() const { return CurrentFnBegin; }
MCSymbol *getFunctionEnd() const { return CurrentFnEnd; }
MCSymbol *getCurExceptionSym();

/// Return information about object file lowering.
const TargetLoweringObjectFile &getObjFileLowering() const;
Expand Down
2 changes: 0 additions & 2 deletions lib/CodeGen/AsmPrinter/ARMException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ void ARMException::endModule() {
}

void ARMException::beginFunction(const MachineFunction *MF) {
DwarfCFIExceptionBase::beginFunction(MF);

if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
getTargetStreamer().emitFnStart();
// See if we need call frame info.
Expand Down
9 changes: 8 additions & 1 deletion lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
MMI = nullptr;
LI = nullptr;
MF = nullptr;
CurrentFnSym = CurrentFnSymForSize = nullptr;
CurExceptionSym = CurrentFnSym = CurrentFnSymForSize = nullptr;
CurrentFnBegin = nullptr;
CurrentFnEnd = nullptr;
GCMetadataPrinters = nullptr;
Expand Down Expand Up @@ -1129,12 +1129,19 @@ bool AsmPrinter::doFinalization(Module &M) {
return false;
}

MCSymbol *AsmPrinter::getCurExceptionSym() {
if (!CurExceptionSym)
CurExceptionSym = createTempSymbol("exception", getFunctionNumber());
return CurExceptionSym;
}

void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
this->MF = &MF;
// Get the function symbol.
CurrentFnSym = getSymbol(MF.getFunction());
CurrentFnSymForSize = CurrentFnSym;
CurrentFnBegin = nullptr;
CurExceptionSym = nullptr;
bool NeedsLocalForSize = MAI->needsLocalForSize();
if (!MMI->getLandingPads().empty() || MMI->hasDebugInfo() ||
NeedsLocalForSize) {
Expand Down
4 changes: 1 addition & 3 deletions lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,6 @@ void DwarfCFIException::endModule() {
}

void DwarfCFIException::beginFunction(const MachineFunction *MF) {
DwarfCFIExceptionBase::beginFunction(MF);

shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;

// If any landing pads survive, we need an EH table.
Expand Down Expand Up @@ -133,7 +131,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
if (!shouldEmitLSDA)
return;

Asm->OutStreamer.EmitCFILsda(getCurExceptionSym(), LSDAEncoding);
Asm->OutStreamer.EmitCFILsda(Asm->getCurExceptionSym(), LSDAEncoding);
}

/// endFunction - Gather and emit post-function exception information.
Expand Down
20 changes: 2 additions & 18 deletions lib/CodeGen/AsmPrinter/EHStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,10 @@

using namespace llvm;

EHStreamer::EHStreamer(AsmPrinter *A)
: CurExceptionSym(nullptr), Asm(A), MMI(Asm->MMI) {}
EHStreamer::EHStreamer(AsmPrinter *A) : Asm(A), MMI(Asm->MMI) {}

EHStreamer::~EHStreamer() {}

MCSymbol *EHStreamer::getCurExceptionSym() {
if (!CurExceptionSym)
CurExceptionSym = Asm->OutContext.createTempSymbol(
"exception" + Twine(Asm->getFunctionNumber()));
return CurExceptionSym;
}

void EHStreamer::beginFunction(const MachineFunction *MF) {
CurExceptionSym = nullptr;
}

/// How many leading type ids two landing pads have in common.
unsigned EHStreamer::sharedTypeIDs(const LandingPadInfo *L,
const LandingPadInfo *R) {
Expand Down Expand Up @@ -448,11 +436,7 @@ void EHStreamer::emitExceptionTable() {
Asm->OutContext.GetOrCreateSymbol(Twine("GCC_except_table")+
Twine(Asm->getFunctionNumber()));
Asm->OutStreamer.EmitLabel(GCCETSym);
Asm->OutStreamer.EmitLabel(getCurExceptionSym());

if (IsSJLJ)
Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("_LSDA_",
Asm->getFunctionNumber()));
Asm->OutStreamer.EmitLabel(Asm->getCurExceptionSym());

// Emit the LSDA header.
Asm->EmitEncodingByte(dwarf::DW_EH_PE_omit, "@LPStart");
Expand Down
5 changes: 0 additions & 5 deletions lib/CodeGen/AsmPrinter/EHStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ class SmallVectorImpl;

/// Emits exception handling directives.
class EHStreamer : public AsmPrinterHandler {
MCSymbol *CurExceptionSym;

protected:
/// Target of directive emission.
AsmPrinter *Asm;
Expand Down Expand Up @@ -127,9 +125,6 @@ class EHStreamer : public AsmPrinterHandler {
EHStreamer(AsmPrinter *A);
virtual ~EHStreamer();

MCSymbol *getCurExceptionSym();
void beginFunction(const MachineFunction *MF) override;

// Unused.
void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {}
void beginInstruction(const MachineInstr *MI) override {}
Expand Down
2 changes: 0 additions & 2 deletions lib/CodeGen/AsmPrinter/Win64Exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ void Win64Exception::endModule() {
}

void Win64Exception::beginFunction(const MachineFunction *MF) {
EHStreamer::beginFunction(MF);

shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;

// If any landing pads survive, we need an EH table.
Expand Down
5 changes: 1 addition & 4 deletions lib/Target/ARM/ARMAsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -960,10 +960,7 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {

MCSymbol *MCSym;
if (ACPV->isLSDA()) {
SmallString<128> Str;
raw_svector_ostream OS(Str);
OS << DL->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
MCSym = OutContext.GetOrCreateSymbol(OS.str());
MCSym = getCurExceptionSym();
} else if (ACPV->isBlockAddress()) {
const BlockAddress *BA =
cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
Expand Down
6 changes: 4 additions & 2 deletions test/CodeGen/ARM/2009-08-31-LSDA-Name.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
; RUN: llc < %s -mtriple=arm-apple-darwin9 -march=arm | FileCheck %s

; CHECK: L_LSDA_0:

; CHECK: .cfi_lsda 16, [[LABEL:.*]]
; CHECK: .long [[LABEL]]-
; CHECK: [[LABEL]]:
; CHECK: .byte 255 @ @LPStart Encoding = omit

%struct.A = type { i32* }

Expand Down

0 comments on commit a480f88

Please sign in to comment.