Centralize handling of the eh_begin and eh_end labels.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 27 Feb 2015 18:18:39 +0000 (18:18 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 27 Feb 2015 18:18:39 +0000 (18:18 +0000)
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

13 files changed:
include/llvm/CodeGen/AsmPrinter.h
include/llvm/MC/MCContext.h
lib/CodeGen/AsmPrinter/ARMException.cpp
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
lib/CodeGen/AsmPrinter/EHStreamer.cpp
lib/CodeGen/AsmPrinter/Win64Exception.cpp
lib/MC/MCContext.cpp
test/CodeGen/Mips/mips16ex.ll
test/CodeGen/X86/eh-label.ll [new file with mode: 0644]
test/CodeGen/X86/global-sections.ll
test/CodeGen/X86/patchpoint-invoke.ll
test/CodeGen/XCore/exception.ll

index ac224d8fdd27cdc2c1865f03c7957417f056b1da..feebe928733aeaef1034dc0a201f4b0b49dbea24 100644 (file)
@@ -103,6 +103,9 @@ public:
   DenseMap<const MCSymbol *, GOTEquivUsePair> 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,
index cd96dfdc8064c3dbd9f0ecc3052b3a0d1d0f7d58..0a977445925964f830152bceda8404c89f9ed87a 100644 (file)
@@ -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++; }
index 6fe75ad82d26b095bbd8dffb8fcd04cfaa12f729..119aa3a18c400034a7f4893a7c8d91cd5e89e543 100644 (file)
@@ -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()) {
index 988381d745a860a0a7e83aaeec61d4933a07d354..b94278fae071be130c49a5e35bb43f959689000a 100644 (file)
@@ -109,6 +109,8 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> 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());
index f45b24c17f7cb99e46b4a28270c74928a01e28cd..128ec82995b5df383dbc4585867c11c3d8049cf8 100644 (file)
@@ -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();
 
index 4841814afff954b64c4e242831f84374d2c56cb0..e4084db0535ddbc3d88384cb8396c4619d45a4ee 100644 (file)
@@ -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
index 2b03877faecc89298e925a7bafde0140fd9d2ab5..356a35135d13d8c34e3257f67354e31c985ab4af 100644 (file)
@@ -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<CallSiteEntry, 64> 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;
index 721edd451ee659bb78e8dd0a693091c58685a268..b2c6958ab7d709a8a14c3600d6d3047788671fd6 100644 (file)
@@ -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));
index a1a99191595d040b9b44abee9c00bae368889712..3f70c72dbba97179df1b87f633e2f19717252ba6 100644 (file)
@@ -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 (file)
index 0000000..7019b45
--- /dev/null
@@ -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]]-
+}
index 4ee835345c7ea3ddd6830c2e30cc9a3f39e7a863..6369539df2df979eb3f0ec0000299f7bca6c508c 100644 (file)
@@ -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
index 192cacc908ab01bc156f2bd3cc15d167bcda56a1..8123f945f3fb4d512ec6983bf17df7811298ebea 100644 (file)
@@ -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
 
index fec83eb15ea5590a3f4596a560ce065a4d97f548..dcff0d6be8b0e8cd13c562c36f7bbdca5b8ac2ce 100644 (file)
@@ -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: