MCDwarf: Extract the DWARF line table header handling into its own type
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 13 Mar 2014 21:47:12 +0000 (21:47 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 13 Mar 2014 21:47:12 +0000 (21:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203856 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCDwarf.h
lib/MC/MCDwarf.cpp

index 6dc381d5dc6e14e5d9eb3df62302415437dd9a3b..951cd6bd1fc1d4d8369215e1e6a069de7ade152e 100644 (file)
@@ -23,6 +23,7 @@
 #include <map>
 #include <vector>
 #include <string>
+#include <utility>
 
 namespace llvm {
 class MCAsmBackend;
@@ -174,38 +175,49 @@ public:
   }
 };
 
-class MCDwarfFileTable {
+struct MCDwarfLineTableHeader {
   MCSymbol *Label;
   SmallVector<std::string, 3> MCDwarfDirs;
   SmallVector<MCDwarfFile, 3> MCDwarfFiles;
+  unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
+  std::pair<MCSymbol *, MCSymbol *> Emit(MCStreamer *MCOS) const;
+};
+
+class MCDwarfFileTable {
+  MCDwarfLineTableHeader Header;
   MCLineSection MCLineSections;
 
 public:
-  //
   // This emits the Dwarf file and the line tables for all Compile Units.
-  //
   static const MCSymbol *Emit(MCStreamer *MCOS);
-  //
+
   // This emits the Dwarf file and the line tables for a given Compile Unit.
-  //
   const MCSymbol *EmitCU(MCStreamer *MCOS) const;
 
   unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
 
+  MCSymbol *getLabel() const {
+    return Header.Label;
+  }
+
+  void setLabel(MCSymbol *Label) {
+    Header.Label = Label;
+  }
+
   const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
-    return MCDwarfDirs;
+    return Header.MCDwarfDirs;
   }
 
   SmallVectorImpl<std::string> &getMCDwarfDirs() {
-    return MCDwarfDirs;
+    return Header.MCDwarfDirs;
   }
 
   const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() const {
-    return MCDwarfFiles;
+    return Header.MCDwarfFiles;
   }
 
   SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() {
-    return MCDwarfFiles;
+    return Header.MCDwarfFiles;
   }
 
   const MCLineSection &getMCLineSections() const {
@@ -214,14 +226,6 @@ public:
   MCLineSection &getMCLineSections() {
     return MCLineSections;
   }
-
-  MCSymbol *getLabel() const {
-    return Label;
-  }
-
-  void setLabel(MCSymbol *Label) {
-    this->Label = Label;
-  }
 };
 
 class MCDwarfLineAddr {
index 5b633ebf8d2929bacbf586b5ba5b70d5798adae1..81ba40e9645e5a6f33cfeff5996c6a87e575665d 100644 (file)
@@ -224,11 +224,9 @@ const MCSymbol *MCDwarfFileTable::Emit(MCStreamer *MCOS) {
   return LineStartSym;
 }
 
-const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
+std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) const {
   MCContext &context = MCOS->getContext();
 
-
-
   // Create a symbol at the beginning of the line table.
   MCSymbol *LineStartSym = Label;
   if (!LineStartSym)
@@ -302,6 +300,14 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
   // end of the prologue (that was used in a previous expression).
   MCOS->EmitLabel(ProEndSym);
 
+  return std::make_pair(LineStartSym, LineEndSym);
+}
+
+const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
+  MCSymbol *LineStartSym;
+  MCSymbol *LineEndSym;
+  std::tie(LineStartSym, LineEndSym) = Header.Emit(MCOS);
+
   // Put out the line tables.
   for (const auto &LineSec : MCLineSections.getMCLineEntries())
     EmitDwarfLineTable(MCOS, LineSec.first, LineSec.second);
@@ -326,6 +332,10 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
 }
 
 unsigned MCDwarfFileTable::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
+  return Header.getFile(Directory, FileName, FileNumber);
+}
+
+unsigned MCDwarfLineTableHeader::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
   // Make space for this FileNumber in the MCDwarfFiles vector if needed.
   MCDwarfFiles.resize(FileNumber + 1);