Split Finish into Finish and FinishImpl to have a common place to do end of
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 7 Jan 2012 03:13:18 +0000 (03:13 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 7 Jan 2012 03:13:18 +0000 (03:13 +0000)
file error checking. Use that to error on an unfinished cfi_startproc.

The error is not nice, but is already better than a segmentation fault.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147717 91177308-0d34-0410-b5e6-96231b3b80d8

16 files changed:
include/llvm/MC/MCExpr.h
include/llvm/MC/MCObjectStreamer.h
include/llvm/MC/MCStreamer.h
lib/MC/MCAsmStreamer.cpp
lib/MC/MCELFStreamer.cpp
lib/MC/MCELFStreamer.h
lib/MC/MCLoggingStreamer.cpp
lib/MC/MCMachOStreamer.cpp
lib/MC/MCNullStreamer.cpp
lib/MC/MCObjectStreamer.cpp
lib/MC/MCPureStreamer.cpp
lib/MC/MCStreamer.cpp
lib/MC/WinCOFFStreamer.cpp
lib/Target/PTX/PTXMCAsmStreamer.cpp
test/MC/AsmParser/cfi-unfinished-frame.s [new file with mode: 0644]
tools/lto/LTOModule.cpp

index 195762e64b2f915e710ecabef34619dd1112548e..6f156b284472fe9b0193ea2880f05f696fc917a5 100644 (file)
@@ -204,7 +204,9 @@ private:
   const VariantKind Kind;
 
   explicit MCSymbolRefExpr(const MCSymbol *_Symbol, VariantKind _Kind)
-    : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol), Kind(_Kind) {}
+    : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol), Kind(_Kind) {
+    assert(Symbol);
+  }
 
 public:
   /// @name Construction
index 01d254a49c837a65808c099dbdc34e4d178af390..deed1cafb1118cab2d466ac947c98ea2c4450d5c 100644 (file)
@@ -78,7 +78,7 @@ public:
   virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
                                          const MCSymbol *Label);
   virtual void EmitGPRel32Value(const MCExpr *Value);
-  virtual void Finish();
+  virtual void FinishImpl();
 
   /// @}
 };
index e550dfa3efae2bae4f78efd7e780df1c6d62d0cf..e227c485fb16dbc075d29bb2fb97e1b16800ec06 100644 (file)
@@ -590,8 +590,10 @@ namespace llvm {
     virtual void EmitRegSave(const SmallVectorImpl<unsigned> &RegList,
                              bool isVector);
 
+    /// FinishImpl - Streamer specific finalization.
+    virtual void FinishImpl() = 0;
     /// Finish - Finish emission of machine code.
-    virtual void Finish() = 0;
+    void Finish();
   };
 
   /// createNullStreamer - Create a dummy machine code streamer, which does
index 630a104b1292b163aada91ad4d2ecbbb15ccd0ac..ca2f10ea7c75b823bcd6ac8009cfdd9fd7cc5e74 100644 (file)
@@ -255,7 +255,7 @@ public:
   /// indicated by the hasRawTextSupport() predicate.
   virtual void EmitRawText(StringRef String);
 
-  virtual void Finish();
+  virtual void FinishImpl();
 
   /// @}
 };
@@ -1285,7 +1285,7 @@ void MCAsmStreamer::EmitRawText(StringRef String) {
   EmitEOL();
 }
 
-void MCAsmStreamer::Finish() {
+void MCAsmStreamer::FinishImpl() {
   // Dump out the dwarf file & directory tables and line tables.
   if (getContext().hasDwarfFiles() && !UseLoc)
     MCDwarfFileTable::Emit(this);
index dcc4666a2665869bbb6f4add3014640a1eb706a7..aaae21f68ba8dfe6b7f25d50a4e1dd1ce1463838 100644 (file)
@@ -356,7 +356,7 @@ void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
   DF->getContents().append(Code.begin(), Code.end());
 }
 
-void MCELFStreamer::Finish() {
+void MCELFStreamer::FinishImpl() {
   EmitFrames(true);
 
   for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
@@ -379,7 +379,7 @@ void MCELFStreamer::Finish() {
       SectData.setAlignment(ByteAlignment);
   }
 
-  this->MCObjectStreamer::Finish();
+  this->MCObjectStreamer::FinishImpl();
 }
 
 MCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB,
index 10bf775809984ce199282a329af00af81f9f8321..e28a88461e3444b2a1d464785e3c590ded6e9f5f 100644 (file)
@@ -94,7 +94,7 @@ public:
 
   virtual void EmitFileDirective(StringRef Filename);
 
-  virtual void Finish();
+  virtual void FinishImpl();
 
 private:
   virtual void EmitInstToFragment(const MCInst &Inst);
index d59b6d7acafe87386d90cfb2ec70d3b87b90bf79..18a9a94412a9bfbcd7f02a9f01ab004804536191 100644 (file)
@@ -243,9 +243,9 @@ public:
     return Child->EmitRawText(String);
   }
 
-  virtual void Finish() {
-    LogCall("Finish");
-    return Child->Finish();
+  virtual void FinishImpl() {
+    LogCall("FinishImpl");
+    return Child->FinishImpl();
   }
 
 };
index 50ab1f864433a3b70d070e70eb7f18859046880b..af0f160d464ca2dce98ed179ace70aeda55a71fc 100644 (file)
@@ -89,7 +89,7 @@ public:
     //report_fatal_error("unsupported directive: '.file'");
   }
 
-  virtual void Finish();
+  virtual void FinishImpl();
 
   /// @}
 };
@@ -375,7 +375,7 @@ void MCMachOStreamer::EmitInstToData(const MCInst &Inst) {
   DF->getContents().append(Code.begin(), Code.end());
 }
 
-void MCMachOStreamer::Finish() {
+void MCMachOStreamer::FinishImpl() {
   EmitFrames(true);
 
   // We have to set the fragment atom associations so we can relax properly for
@@ -407,7 +407,7 @@ void MCMachOStreamer::Finish() {
     }
   }
 
-  this->MCObjectStreamer::Finish();
+  this->MCObjectStreamer::FinishImpl();
 }
 
 MCStreamer *llvm::createMachOStreamer(MCContext &Context, MCAsmBackend &MAB,
index ca74663693d63f6f2e8ca4f69c62d212e6a1998a..432974f8d77c32ec87eee5163ef75763a5cf4b22 100644 (file)
@@ -94,7 +94,7 @@ namespace {
                                        StringRef FileName) {}
     virtual void EmitInstruction(const MCInst &Inst) {}
 
-    virtual void Finish() {}
+    virtual void FinishImpl() {}
     
     /// @}
   };
index 663d0ca491171ed4ec05f5037d4b1e36ba515870..76c853c3a8ddde06236572e919a418bfa592ab4b 100644 (file)
@@ -255,7 +255,7 @@ void MCObjectStreamer::EmitGPRel32Value(const MCExpr *Value) {
   DF->getContents().resize(DF->getContents().size() + 4, 0);
 }
 
-void MCObjectStreamer::Finish() {
+void MCObjectStreamer::FinishImpl() {
   // Dump out the dwarf file & directory tables and line tables.
   if (getContext().hasDwarfFiles())
     MCDwarfFileTable::Emit(this);
index 1a2a92e3293b24cb52c96868eeb5f43c8224382e..20a3bdb01440933a1ad8244cdb5ad47841ba306d 100644 (file)
@@ -48,7 +48,7 @@ public:
                                  unsigned MaxBytesToEmit = 0);
   virtual void EmitValueToOffset(const MCExpr *Offset,
                                  unsigned char Value = 0);
-  virtual void Finish();
+  virtual void FinishImpl();
 
 
   virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
@@ -224,10 +224,10 @@ void MCPureStreamer::EmitInstToData(const MCInst &Inst) {
   DF->getContents().append(Code.begin(), Code.end());
 }
 
-void MCPureStreamer::Finish() {
+void MCPureStreamer::FinishImpl() {
   // FIXME: Handle DWARF tables?
 
-  this->MCObjectStreamer::Finish();
+  this->MCObjectStreamer::FinishImpl();
 }
 
 MCStreamer *llvm::createPureStreamer(MCContext &Context, MCAsmBackend &MAB,
index 8567941c45ac353d63e0720f9d3832b0ab844e28..ce9de9d4c5154dffe87bb5e36c1a20401660d710 100644 (file)
@@ -652,3 +652,10 @@ void MCStreamer::EmitW64Tables() {
 
   MCWin64EHUnwindEmitter::Emit(*this);
 }
+
+void MCStreamer::Finish() {
+  if (!FrameInfos.empty() && !FrameInfos.back().End)
+    report_fatal_error("Unfinished frame!");
+
+  FinishImpl();
+}
index f2fecae79c842e9757fd1e01287d0f8c3a41f12f..265f0daef0fd58af6d4a3149dc7a91f26e27242b 100644 (file)
@@ -79,7 +79,7 @@ public:
   virtual void EmitFileDirective(StringRef Filename);
   virtual void EmitInstruction(const MCInst &Instruction);
   virtual void EmitWin64EHHandlerData();
-  virtual void Finish();
+  virtual void FinishImpl();
 
 private:
   virtual void EmitInstToFragment(const MCInst &Inst) {
@@ -401,9 +401,9 @@ void WinCOFFStreamer::EmitWin64EHHandlerData() {
   MCWin64EHUnwindEmitter::EmitUnwindInfo(*this, getCurrentW64UnwindInfo());
 }
 
-void WinCOFFStreamer::Finish() {
+void WinCOFFStreamer::FinishImpl() {
   EmitW64Tables();
-  MCObjectStreamer::Finish();
+  MCObjectStreamer::FinishImpl();
 }
 
 namespace llvm
index bc7aaa3e41de9e7cb3592234c5cb08e6d6eafa31..270ed2d29fd0f7616423522762e9d239d5a5ea3b 100644 (file)
@@ -176,7 +176,7 @@ public:
   /// indicated by the hasRawTextSupport() predicate.
   virtual void EmitRawText(StringRef String);
 
-  virtual void Finish();
+  virtual void FinishImpl();
 
   /// @}
 
@@ -540,7 +540,7 @@ void PTXMCAsmStreamer::EmitRawText(StringRef String) {
   EmitEOL();
 }
 
-void PTXMCAsmStreamer::Finish() {}
+void PTXMCAsmStreamer::FinishImpl() {}
 
 namespace llvm {
   MCStreamer *createPTXAsmStreamer(MCContext &Context,
diff --git a/test/MC/AsmParser/cfi-unfinished-frame.s b/test/MC/AsmParser/cfi-unfinished-frame.s
new file mode 100644 (file)
index 0000000..1182d52
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: not llvm-mc -filetype=asm -triple x86_64-pc-linux-gnu %s -o %t 2>%t.out
+// RUN: FileCheck -input-file=%t.out %s
+
+.cfi_startproc
+// CHECK: Unfinished frame
index 0b737293ae25e180b0e2a2fd02e426ab1acceaed..2b89e6240c99ed814e6c4d1915af962a9a552f80 100644 (file)
@@ -603,7 +603,7 @@ namespace {
         if (Inst.getOperand(i).isExpr())
           AddValueSymbols(Inst.getOperand(i).getExpr());
     }
-    virtual void Finish() {}
+    virtual void FinishImpl() {}
   };
 }