Replace a use of GetTempSymbol with createTempSymbol.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 17 Mar 2015 12:54:04 +0000 (12:54 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 17 Mar 2015 12:54:04 +0000 (12:54 +0000)
This is cleaner and avoids a crash in a corner case.

llvm-svn: 232471

llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
llvm/lib/CodeGen/AsmPrinter/EHStreamer.cpp
llvm/lib/CodeGen/AsmPrinter/EHStreamer.h
llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp
llvm/test/CodeGen/X86/exception-label.ll [new file with mode: 0644]

index 3cde13e..034e34a 100644 (file)
@@ -52,9 +52,9 @@ void ARMException::endModule() {
     Asm->OutStreamer.EmitCFISections(false, true);
 }
 
-/// beginFunction - Gather pre-function exception information. Assumes it's
-/// being emitted immediately after the function entry point.
 void ARMException::beginFunction(const MachineFunction *MF) {
+  DwarfCFIExceptionBase::beginFunction(MF);
+
   if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
     getTargetStreamer().emitFnStart();
   // See if we need call frame info.
index 0631592..5263a2a 100644 (file)
@@ -87,9 +87,9 @@ void DwarfCFIException::endModule() {
   }
 }
 
-/// beginFunction - Gather pre-function exception information. Assumes it's
-/// being emitted immediately after the function entry point.
 void DwarfCFIException::beginFunction(const MachineFunction *MF) {
+  DwarfCFIExceptionBase::beginFunction(MF);
+
   shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;
 
   // If any landing pads survive, we need an EH table.
@@ -133,9 +133,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
   if (!shouldEmitLSDA)
     return;
 
-  Asm->OutStreamer.EmitCFILsda(Asm->GetTempSymbol("exception",
-                                                  Asm->getFunctionNumber()),
-                               LSDAEncoding);
+  Asm->OutStreamer.EmitCFILsda(getCurExceptionSym(), LSDAEncoding);
 }
 
 /// endFunction - Gather and emit post-function exception information.
index b428c4e..8a040d9 100644 (file)
 
 using namespace llvm;
 
-EHStreamer::EHStreamer(AsmPrinter *A) : Asm(A), MMI(Asm->MMI) {}
+EHStreamer::EHStreamer(AsmPrinter *A)
+    : CurExceptionSym(nullptr), 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) {
@@ -436,8 +448,7 @@ void EHStreamer::emitExceptionTable() {
     Asm->OutContext.GetOrCreateSymbol(Twine("GCC_except_table")+
                                       Twine(Asm->getFunctionNumber()));
   Asm->OutStreamer.EmitLabel(GCCETSym);
-  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("exception",
-                                                Asm->getFunctionNumber()));
+  Asm->OutStreamer.EmitLabel(getCurExceptionSym());
 
   if (IsSJLJ)
     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("_LSDA_",
index 94d0585..8cb7a31 100644 (file)
@@ -31,6 +31,8 @@ class SmallVectorImpl;
 
 /// Emits exception handling directives.
 class EHStreamer : public AsmPrinterHandler {
+  MCSymbol *CurExceptionSym;
+
 protected:
   /// Target of directive emission.
   AsmPrinter *Asm;
@@ -125,6 +127,9 @@ public:
   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 {}
index 356a351..abf16f7 100644 (file)
@@ -48,9 +48,9 @@ Win64Exception::~Win64Exception() {}
 void Win64Exception::endModule() {
 }
 
-/// beginFunction - Gather pre-function exception information. Assumes it's
-/// being emitted immediately after the function entry point.
 void Win64Exception::beginFunction(const MachineFunction *MF) {
+  EHStreamer::beginFunction(MF);
+
   shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;
 
   // If any landing pads survive, we need an EH table.
diff --git a/llvm/test/CodeGen/X86/exception-label.ll b/llvm/test/CodeGen/X86/exception-label.ll
new file mode 100644 (file)
index 0000000..cafa1e6
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s
+
+; Test that we can handle .Lexception0 being defined. We used to crash.
+
+; CHECK: .cfi_lsda 3, [[LABEL:.*]]
+; CHECK: [[LABEL]]:
+; CHECK-NEXT: .byte   255                     # @LPStart Encoding = omit
+
+declare void @g()
+
+define void @f() {
+bb0:
+  call void asm ".Lexception0:", ""()
+  invoke void @g()
+          to label %bb2 unwind label %bb1
+bb1:
+  landingpad { i8*, i32 } personality i8* bitcast (void ()* @g to i8*)
+          catch i8* null
+  br label %bb2
+
+bb2:
+  ret void
+}