MCDwarf: Sink file/directory creation down into MCDwarfFileTable form MCContext
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 13 Mar 2014 19:15:04 +0000 (19:15 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 13 Mar 2014 19:15:04 +0000 (19:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203836 91177308-0d34-0410-b5e6-96231b3b80d8

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

index b6998c590d6b6664e070869e6e93e6cb5da4076d..6dc381d5dc6e14e5d9eb3df62302415437dd9a3b 100644 (file)
@@ -190,6 +190,8 @@ public:
   //
   const MCSymbol *EmitCU(MCStreamer *MCOS) const;
 
+  unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
+
   const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
     return MCDwarfDirs;
   }
index 48cb5aae1fbad89351ebca1769d32a70dafe4155..6ffe25982d330937c0c9feedea41217c2b3dcf5f 100644 (file)
@@ -338,56 +338,7 @@ const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) {
 unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
                                  unsigned FileNumber, unsigned CUID) {
   MCDwarfFileTable &Table = MCDwarfFileTablesCUMap[CUID];
-  SmallVectorImpl<MCDwarfFile>& MCDwarfFiles = Table.getMCDwarfFiles();
-  SmallVectorImpl<std::string>& MCDwarfDirs = Table.getMCDwarfDirs();
-  // Make space for this FileNumber in the MCDwarfFiles vector if needed.
-  if (FileNumber >= MCDwarfFiles.size()) {
-    MCDwarfFiles.resize(FileNumber + 1);
-  }
-
-  // Get the new MCDwarfFile slot for this FileNumber.
-  MCDwarfFile &File = MCDwarfFiles[FileNumber];
-
-  // It is an error to use see the same number more than once.
-  if (!File.Name.empty())
-    return 0;
-
-  if (Directory.empty()) {
-    // Separate the directory part from the basename of the FileName.
-    StringRef tFileName = sys::path::filename(FileName);
-    if (!tFileName.empty()) {
-      Directory = sys::path::parent_path(FileName);
-      if (!Directory.empty())
-        FileName = tFileName;
-    }
-  }
-
-  // Find or make an entry in the MCDwarfDirs vector for this Directory.
-  // Capture directory name.
-  unsigned DirIndex;
-  if (Directory.empty()) {
-    // For FileNames with no directories a DirIndex of 0 is used.
-    DirIndex = 0;
-  } else {
-    DirIndex = 0;
-    for (unsigned End = MCDwarfDirs.size(); DirIndex < End; DirIndex++) {
-      if (Directory == MCDwarfDirs[DirIndex])
-        break;
-    }
-    if (DirIndex >= MCDwarfDirs.size())
-      MCDwarfDirs.push_back(Directory);
-    // The DirIndex is one based, as DirIndex of 0 is used for FileNames with
-    // no directories.  MCDwarfDirs[] is unlike MCDwarfFiles[] in that the
-    // directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames
-    // are stored at MCDwarfFiles[FileNumber].Name .
-    DirIndex++;
-  }
-
-  File.Name = FileName;
-  File.DirIndex = DirIndex;
-
-  // return the allocated FileNumber.
-  return FileNumber;
+  return Table.getFile(Directory, FileName, FileNumber);
 }
 
 /// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
index b0a75d5de20600fcb6218eca9e15e5145a7e2362..5b633ebf8d2929bacbf586b5ba5b70d5798adae1 100644 (file)
@@ -325,6 +325,55 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
   return LineStartSym;
 }
 
+unsigned MCDwarfFileTable::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
+  // Make space for this FileNumber in the MCDwarfFiles vector if needed.
+  MCDwarfFiles.resize(FileNumber + 1);
+
+  // Get the new MCDwarfFile slot for this FileNumber.
+  MCDwarfFile &File = MCDwarfFiles[FileNumber];
+
+  // It is an error to use see the same number more than once.
+  if (!File.Name.empty())
+    return 0;
+
+  if (Directory.empty()) {
+    // Separate the directory part from the basename of the FileName.
+    StringRef tFileName = sys::path::filename(FileName);
+    if (!tFileName.empty()) {
+      Directory = sys::path::parent_path(FileName);
+      if (!Directory.empty())
+        FileName = tFileName;
+    }
+  }
+
+  // Find or make an entry in the MCDwarfDirs vector for this Directory.
+  // Capture directory name.
+  unsigned DirIndex;
+  if (Directory.empty()) {
+    // For FileNames with no directories a DirIndex of 0 is used.
+    DirIndex = 0;
+  } else {
+    DirIndex = 0;
+    for (unsigned End = MCDwarfDirs.size(); DirIndex < End; DirIndex++) {
+      if (Directory == MCDwarfDirs[DirIndex])
+        break;
+    }
+    if (DirIndex >= MCDwarfDirs.size())
+      MCDwarfDirs.push_back(Directory);
+    // The DirIndex is one based, as DirIndex of 0 is used for FileNames with
+    // no directories.  MCDwarfDirs[] is unlike MCDwarfFiles[] in that the
+    // directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames
+    // are stored at MCDwarfFiles[FileNumber].Name .
+    DirIndex++;
+  }
+
+  File.Name = FileName;
+  File.DirIndex = DirIndex;
+
+  // return the allocated FileNumber.
+  return FileNumber;
+}
+
 /// Utility function to emit the encoding to a streamer.
 void MCDwarfLineAddr::Emit(MCStreamer *MCOS, int64_t LineDelta,
                            uint64_t AddrDelta) {