From: Rafael Espindola Date: Fri, 27 Feb 2015 18:18:39 +0000 (+0000) Subject: Centralize handling of the eh_begin and eh_end labels. X-Git-Tag: android-x86-7.1-r4~51142 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=150233c378a7d6d3838f2b2907d5a706da8911ac;p=android-x86%2Fexternal-llvm.git Centralize handling of the eh_begin and eh_end labels. This removes a bit of duplicated code and more importantly, remembers the labels so that they don't need to be looked up by name. This in turn allows for any name to be used and avoids a crash if the name we wanted was already taken. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230772 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index ac224d8fdd2..feebe928733 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -103,6 +103,9 @@ public: DenseMap GlobalGOTEquivs; private: + MCSymbol *CurrentFnBegin; + MCSymbol *CurrentFnEnd; + // The garbage collection metadata printer table. void *GCMetadataPrinters; // Really a DenseMap. @@ -146,6 +149,9 @@ public: /// unsigned getFunctionNumber() const; + MCSymbol *getFunctionBegin() const { return CurrentFnBegin; } + MCSymbol *getFunctionEnd() const { return CurrentFnEnd; } + /// Return information about object file lowering. const TargetLoweringObjectFile &getObjFileLowering() const; @@ -331,6 +337,8 @@ public: /// Return an assembler temporary label with the specified stem. MCSymbol *GetTempSymbol(const Twine &Name) const; + MCSymbol *createTempSymbol(const Twine &Name, unsigned ID) const; + /// Return the MCSymbol for a private symbol with global value name as its /// base, with the specified suffix. MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV, diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index cd96dfdc806..0a977445925 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -215,6 +215,8 @@ namespace llvm { /// with a unique but unspecified name. MCSymbol *CreateTempSymbol(); + MCSymbol *createTempSymbol(const Twine &Name); + /// getUniqueSymbolID() - Return a unique identifier for use in constructing /// symbol names. unsigned getUniqueSymbolID() { return NextUniqueID++; } diff --git a/lib/CodeGen/AsmPrinter/ARMException.cpp b/lib/CodeGen/AsmPrinter/ARMException.cpp index 6fe75ad82d2..119aa3a18c4 100644 --- a/lib/CodeGen/AsmPrinter/ARMException.cpp +++ b/lib/CodeGen/AsmPrinter/ARMException.cpp @@ -58,8 +58,6 @@ void ARMException::endModule() { void ARMException::beginFunction(const MachineFunction *MF) { if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM) getTargetStreamer().emitFnStart(); - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin", - Asm->getFunctionNumber())); // See if we need call frame info. AsmPrinter::CFIMoveType MoveType = Asm->needsCFIMoves(); assert(MoveType != AsmPrinter::CFI_M_EH && @@ -84,8 +82,6 @@ void ARMException::endFunction(const MachineFunction *) { MMI->getLandingPads().empty()) ATS.emitCantUnwind(); else { - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end", - Asm->getFunctionNumber())); if (!MMI->getLandingPads().empty()) { // Emit references to personality. if (const Function *Personality = MMI->getPersonality()) { diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 988381d745a..b94278fae07 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -109,6 +109,8 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr Streamer) LI = nullptr; MF = nullptr; CurrentFnSym = CurrentFnSymForSize = nullptr; + CurrentFnBegin = nullptr; + CurrentFnEnd = nullptr; GCMetadataPrinters = nullptr; VerboseAsm = OutStreamer.isVerboseAsm(); } @@ -554,6 +556,19 @@ void AsmPrinter::EmitFunctionHeader() { OutStreamer.EmitLabel(DeadBlockSyms[i]); } + if (!MMI->getLandingPads().empty()) { + CurrentFnBegin = createTempSymbol("eh_func_begin", getFunctionNumber()); + + if (MAI->useAssignmentForEHBegin()) { + MCSymbol *CurPos = OutContext.CreateTempSymbol(); + OutStreamer.EmitLabel(CurPos); + OutStreamer.EmitAssignment(CurrentFnBegin, + MCSymbolRefExpr::Create(CurPos, OutContext)); + } else { + OutStreamer.EmitLabel(CurrentFnBegin); + } + } + // Emit pre-function debug and/or EH information. for (const HandlerInfo &HI : Handlers) { NamedRegionTimer T(HI.TimerName, HI.TimerGroupName, TimePassesIsEnabled); @@ -867,6 +882,12 @@ void AsmPrinter::EmitFunctionBody() { // Emit target-specific gunk after the function body. EmitFunctionBodyEnd(); + if (!MMI->getLandingPads().empty()) { + // Create a symbol for the end of function. + CurrentFnEnd = createTempSymbol("eh_func_end", getFunctionNumber()); + OutStreamer.EmitLabel(CurrentFnEnd); + } + // If the target wants a .size directive for the size of the function, emit // it. if (MAI->hasDotTypeDotSizeDirective()) { @@ -2273,6 +2294,9 @@ MCSymbol *AsmPrinter::GetTempSymbol(const Twine &Name) const { Name); } +MCSymbol *AsmPrinter::createTempSymbol(const Twine &Name, unsigned ID) const { + return OutContext.createTempSymbol(Name + Twine(ID)); +} MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const { return MMI->getAddrLabelSymbol(BA->getBasicBlock()); diff --git a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp index f45b24c17f7..128ec82995b 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp @@ -113,18 +113,6 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) { TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang, Asm->TM, MMI); Asm->OutStreamer.EmitCFIPersonality(Sym, PerEncoding); - MCSymbol *EHBegin = - Asm->GetTempSymbol("eh_func_begin", Asm->getFunctionNumber()); - if (Asm->MAI->useAssignmentForEHBegin()) { - MCContext &Ctx = Asm->OutContext; - MCSymbol *CurPos = Ctx.CreateTempSymbol(); - Asm->OutStreamer.EmitLabel(CurPos); - Asm->OutStreamer.EmitAssignment(EHBegin, - MCSymbolRefExpr::Create(CurPos, Ctx)); - } else { - Asm->OutStreamer.EmitLabel(EHBegin); - } - // Provide LSDA information. if (!shouldEmitLSDA) return; @@ -145,9 +133,6 @@ void DwarfCFIException::endFunction(const MachineFunction *) { if (!shouldEmitPersonality) return; - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end", - Asm->getFunctionNumber())); - // Map all labels and get rid of any dead landing pads. MMI->TidyLandingPads(); diff --git a/lib/CodeGen/AsmPrinter/EHStreamer.cpp b/lib/CodeGen/AsmPrinter/EHStreamer.cpp index 4841814afff..e4084db0535 100644 --- a/lib/CodeGen/AsmPrinter/EHStreamer.cpp +++ b/lib/CodeGen/AsmPrinter/EHStreamer.cpp @@ -552,16 +552,14 @@ void EHStreamer::emitExceptionTable() { I = CallSites.begin(), E = CallSites.end(); I != E; ++I) { const CallSiteEntry &S = *I; - MCSymbol *EHFuncBeginSym = - Asm->GetTempSymbol("eh_func_begin", Asm->getFunctionNumber()); + MCSymbol *EHFuncBeginSym = Asm->getFunctionBegin(); MCSymbol *BeginLabel = S.BeginLabel; if (!BeginLabel) BeginLabel = EHFuncBeginSym; MCSymbol *EndLabel = S.EndLabel; if (!EndLabel) - EndLabel = Asm->GetTempSymbol("eh_func_end", Asm->getFunctionNumber()); - + EndLabel = Asm->getFunctionEnd(); // Offset of the call site relative to the previous call site, counted in // number of 16-byte bundles. The first call site is counted relative to diff --git a/lib/CodeGen/AsmPrinter/Win64Exception.cpp b/lib/CodeGen/AsmPrinter/Win64Exception.cpp index 2b03877faec..356a35135d1 100644 --- a/lib/CodeGen/AsmPrinter/Win64Exception.cpp +++ b/lib/CodeGen/AsmPrinter/Win64Exception.cpp @@ -80,9 +80,6 @@ void Win64Exception::beginFunction(const MachineFunction *MF) { const MCSymbol *PersHandlerSym = TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang, Asm->TM, MMI); Asm->OutStreamer.EmitWinEHHandler(PersHandlerSym, true, true); - - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin", - Asm->getFunctionNumber())); } /// endFunction - Gather and emit post-function exception information. @@ -91,9 +88,6 @@ void Win64Exception::endFunction(const MachineFunction *) { if (!shouldEmitPersonality && !shouldEmitMoves) return; - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end", - Asm->getFunctionNumber())); - // Map all labels and get rid of any dead landing pads. MMI->TidyLandingPads(); @@ -170,10 +164,8 @@ void Win64Exception::emitCSpecificHandlerTable() { SmallVector CallSites; computeCallSiteTable(CallSites, LandingPads, FirstActions); - MCSymbol *EHFuncBeginSym = - Asm->GetTempSymbol("eh_func_begin", Asm->getFunctionNumber()); - MCSymbol *EHFuncEndSym = - Asm->GetTempSymbol("eh_func_end", Asm->getFunctionNumber()); + MCSymbol *EHFuncBeginSym = Asm->getFunctionBegin(); + MCSymbol *EHFuncEndSym = Asm->getFunctionEnd(); // Emit the number of table entries. unsigned NumEntries = 0; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 721edd451ee..b2c6958ab7d 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -160,6 +160,12 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name) { return Result; } +MCSymbol *MCContext::createTempSymbol(const Twine &Name) { + SmallString<128> NameSV; + raw_svector_ostream(NameSV) << MAI->getPrivateGlobalPrefix() << Name; + return CreateSymbol(NameSV); +} + MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) { SmallString<128> NameSV; return GetOrCreateSymbol(Name.toStringRef(NameSV)); diff --git a/test/CodeGen/Mips/mips16ex.ll b/test/CodeGen/Mips/mips16ex.ll index a1a99191595..3f70c72dbba 100644 --- a/test/CodeGen/Mips/mips16ex.ll +++ b/test/CodeGen/Mips/mips16ex.ll @@ -1,8 +1,10 @@ ; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16 -;16: .cfi_personality +;16: main: ;16-NEXT: [[TMP:.*]]: ;16-NEXT: $eh_func_begin0 = ([[TMP]]) +;16-NEXT: .cfi_startproc +;16-NEXT: .cfi_personality @.str = private unnamed_addr constant [7 x i8] c"hello\0A\00", align 1 @_ZTIi = external constant i8* @.str1 = private unnamed_addr constant [15 x i8] c"exception %i \0A\00", align 1 diff --git a/test/CodeGen/X86/eh-label.ll b/test/CodeGen/X86/eh-label.ll new file mode 100644 index 00000000000..7019b45877a --- /dev/null +++ b/test/CodeGen/X86/eh-label.ll @@ -0,0 +1,24 @@ +; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s +; Test that we don't crashe if the .Leh_func_end0 name is taken. + +declare void @g() + +define void @f() { +bb0: + call void asm ".Leh_func_end0:", ""() +; CHECK: #APP +; CHECK-NEXT: .Leh_func_end0: +; CHECK-NEXT: #NO_APP + + invoke void @g() to label %bb2 unwind label %bb1 +bb1: + landingpad { i8*, i32 } personality i8* bitcast (void ()* @g to i8*) + catch i8* null + call void @g() + ret void +bb2: + ret void + +; CHECK: [[END:.Leh_func_end.*]]: +; CHECK: .long [[END]]- +} diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index 4ee835345c7..6369539df2d 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -84,8 +84,8 @@ bb7: } ; DARWIN64: _F3: -; DARWIN64: .cfi_endproc -; DARWIN64-NEXT: Leh_func_end +; DARWIN64: Leh_func_end +; DARWIN64-NEXT: .cfi_endproc ; DARWIN64-NEXT: .section __TEXT,__gcc_except_tab ; DARWIN64-NOT: .section ; DARWIN64: .section __TEXT,__text,regular,pure_instructions diff --git a/test/CodeGen/X86/patchpoint-invoke.ll b/test/CodeGen/X86/patchpoint-invoke.ll index 192cacc908a..8123f945f3f 100644 --- a/test/CodeGen/X86/patchpoint-invoke.ll +++ b/test/CodeGen/X86/patchpoint-invoke.ll @@ -5,8 +5,8 @@ define i64 @patchpoint_invoke(i64 %p1, i64 %p2) { entry: ; CHECK-LABEL: patchpoint_invoke: +; CHECK-NEXT: [[FUNC_BEGIN:.L.*]]: ; CHECK-NEXT: .cfi_startproc -; CHECK: [[FUNC_BEGIN:.L.*]]: ; CHECK: .cfi_lsda 3, [[EXCEPTION_LABEL:.L[^ ]*]] ; CHECK: pushq %rbp diff --git a/test/CodeGen/XCore/exception.ll b/test/CodeGen/XCore/exception.ll index fec83eb15ea..dcff0d6be8b 100644 --- a/test/CodeGen/XCore/exception.ll +++ b/test/CodeGen/XCore/exception.ll @@ -39,10 +39,10 @@ entry: unreachable } -; CHECK-LABEL: fn_catch +; CHECK-LABEL: fn_catch: +; CHECK-NEXT: [[START:.L[a-zA-Z0-9_]+]] ; CHECK: .cfi_startproc ; CHECK: .cfi_personality 0, __gxx_personality_v0 -; CHECK: [[START:.L[a-zA-Z0-9_]+]] ; CHECK: .cfi_lsda 0, [[LSDA:.L[a-zA-Z0-9_]+]] ; CHECK: entsp 4 ; CHECK: .cfi_def_cfa_offset 16 @@ -91,8 +91,8 @@ lpad: ; CHECK: bf r0, [[RETURN]] ; CHECK: mov r0, r4 ; CHECK: bl _Unwind_Resume -; CHECK: .cfi_endproc ; CHECK: [[END:.L[a-zA-Z0-9_]+]] +; CHECK: .cfi_endproc %6 = icmp eq i32 %5, %2 br i1 %6, label %Resume, label %Exit Resume: