فهرست منبع

[LLD] [COFF] Wrap file location pair<StringRef,int> in Optional<>. NFC.

This makes use of it slightly clearer, and makes it match the
same construct in the lld ELF linker.

Differential Revision: https://reviews.llvm.org/D68935

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@374869 91177308-0d34-0410-b5e6-96231b3b80d8
Martin Storsjo 5 سال پیش
والد
کامیت
bb61331be7
3فایلهای تغییر یافته به همراه26 افزوده شده و 22 حذف شده
  1. 6 6
      COFF/PDB.cpp
  2. 5 4
      COFF/PDB.h
  3. 15 12
      COFF/SymbolTable.cpp

+ 6 - 6
COFF/PDB.cpp

@@ -1791,8 +1791,8 @@ static bool findLineTable(const SectionChunk *c, uint32_t addr,
 // Use CodeView line tables to resolve a file and line number for the given
 // Use CodeView line tables to resolve a file and line number for the given
 // offset into the given chunk and return them, or {"", 0} if a line table was
 // offset into the given chunk and return them, or {"", 0} if a line table was
 // not found.
 // not found.
-std::pair<StringRef, uint32_t> getFileLineCodeView(const SectionChunk *c,
-                                                         uint32_t addr) {
+Optional<std::pair<StringRef, uint32_t>>
+getFileLineCodeView(const SectionChunk *c, uint32_t addr) {
   ExitOnError exitOnErr;
   ExitOnError exitOnErr;
 
 
   DebugStringTableSubsectionRef cVStrTab;
   DebugStringTableSubsectionRef cVStrTab;
@@ -1801,7 +1801,7 @@ std::pair<StringRef, uint32_t> getFileLineCodeView(const SectionChunk *c,
   uint32_t offsetInLinetable;
   uint32_t offsetInLinetable;
 
 
   if (!findLineTable(c, addr, cVStrTab, checksums, lines, offsetInLinetable))
   if (!findLineTable(c, addr, cVStrTab, checksums, lines, offsetInLinetable))
-    return {"", 0};
+    return None;
 
 
   Optional<uint32_t> nameIndex;
   Optional<uint32_t> nameIndex;
   Optional<uint32_t> lineNumber;
   Optional<uint32_t> lineNumber;
@@ -1815,16 +1815,16 @@ std::pair<StringRef, uint32_t> getFileLineCodeView(const SectionChunk *c,
         }
         }
         StringRef filename =
         StringRef filename =
             exitOnErr(getFileName(cVStrTab, checksums, *nameIndex));
             exitOnErr(getFileName(cVStrTab, checksums, *nameIndex));
-        return {filename, *lineNumber};
+        return std::make_pair(filename, *lineNumber);
       }
       }
       nameIndex = entry.NameIndex;
       nameIndex = entry.NameIndex;
       lineNumber = li.getStartLine();
       lineNumber = li.getStartLine();
     }
     }
   }
   }
   if (!nameIndex)
   if (!nameIndex)
-    return {"", 0};
+    return None;
   StringRef filename = exitOnErr(getFileName(cVStrTab, checksums, *nameIndex));
   StringRef filename = exitOnErr(getFileName(cVStrTab, checksums, *nameIndex));
-  return {filename, *lineNumber};
+  return std::make_pair(filename, *lineNumber);
 }
 }
 
 
 } // namespace coff
 } // namespace coff

+ 5 - 4
COFF/PDB.h

@@ -10,6 +10,7 @@
 #define LLD_COFF_PDB_H
 #define LLD_COFF_PDB_H
 
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Optional.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringRef.h"
 
 
 namespace llvm {
 namespace llvm {
@@ -29,9 +30,9 @@ void createPDB(SymbolTable *symtab,
                llvm::ArrayRef<uint8_t> sectionTable,
                llvm::ArrayRef<uint8_t> sectionTable,
                llvm::codeview::DebugInfo *buildId);
                llvm::codeview::DebugInfo *buildId);
 
 
-std::pair<llvm::StringRef, uint32_t> getFileLineCodeView(const SectionChunk *c,
-                                                         uint32_t addr);
-}
-}
+llvm::Optional<std::pair<llvm::StringRef, uint32_t>>
+getFileLineCodeView(const SectionChunk *c, uint32_t addr);
+} // namespace coff
+} // namespace lld
 
 
 #endif
 #endif

+ 15 - 12
COFF/SymbolTable.cpp

@@ -108,26 +108,27 @@ static std::vector<std::string> getSymbolLocations(BitcodeFile *file) {
   return {res};
   return {res};
 }
 }
 
 
-static std::pair<StringRef, uint32_t> getFileLineDwarf(const SectionChunk *c,
-                                                       uint32_t addr) {
+static Optional<std::pair<StringRef, uint32_t>>
+getFileLineDwarf(const SectionChunk *c, uint32_t addr) {
   if (!config->symbolizer)
   if (!config->symbolizer)
     config->symbolizer = make<symbolize::LLVMSymbolizer>();
     config->symbolizer = make<symbolize::LLVMSymbolizer>();
   Expected<DILineInfo> expectedLineInfo = config->symbolizer->symbolizeCode(
   Expected<DILineInfo> expectedLineInfo = config->symbolizer->symbolizeCode(
       *c->file->getCOFFObj(), {addr, c->getSectionNumber() - 1});
       *c->file->getCOFFObj(), {addr, c->getSectionNumber() - 1});
   if (!expectedLineInfo)
   if (!expectedLineInfo)
-    return {"", 0};
+    return None;
   const DILineInfo &lineInfo = *expectedLineInfo;
   const DILineInfo &lineInfo = *expectedLineInfo;
   if (lineInfo.FileName == DILineInfo::BadString)
   if (lineInfo.FileName == DILineInfo::BadString)
-    return {"", 0};
-  return {saver.save(lineInfo.FileName), lineInfo.Line};
+    return None;
+  return std::make_pair(saver.save(lineInfo.FileName), lineInfo.Line);
 }
 }
 
 
-static std::pair<StringRef, uint32_t> getFileLine(const SectionChunk *c,
-                                                  uint32_t addr) {
+static Optional<std::pair<StringRef, uint32_t>>
+getFileLine(const SectionChunk *c, uint32_t addr) {
   // MinGW can optionally use codeview, even if the default is dwarf.
   // MinGW can optionally use codeview, even if the default is dwarf.
-  std::pair<StringRef, uint32_t> fileLine = getFileLineCodeView(c, addr);
+  Optional<std::pair<StringRef, uint32_t>> fileLine =
+      getFileLineCodeView(c, addr);
   // If codeview didn't yield any result, check dwarf in MinGW mode.
   // If codeview didn't yield any result, check dwarf in MinGW mode.
-  if (fileLine.first.empty() && config->mingw)
+  if (!fileLine && config->mingw)
     fileLine = getFileLineDwarf(c, addr);
     fileLine = getFileLineDwarf(c, addr);
   return fileLine;
   return fileLine;
 }
 }
@@ -150,11 +151,13 @@ std::vector<std::string> getSymbolLocations(ObjFile *file, uint32_t symIndex) {
     for (const coff_relocation &r : sc->getRelocs()) {
     for (const coff_relocation &r : sc->getRelocs()) {
       if (r.SymbolTableIndex != symIndex)
       if (r.SymbolTableIndex != symIndex)
         continue;
         continue;
-      std::pair<StringRef, uint32_t> fileLine =
+      Optional<std::pair<StringRef, uint32_t>> fileLine =
           getFileLine(sc, r.VirtualAddress);
           getFileLine(sc, r.VirtualAddress);
       Symbol *sym = getSymbol(sc, r.VirtualAddress);
       Symbol *sym = getSymbol(sc, r.VirtualAddress);
-      if (!fileLine.first.empty() || sym)
-        locations.push_back({sym, fileLine});
+      if (fileLine)
+        locations.push_back({sym, *fileLine});
+      else if (sym)
+        locations.push_back({sym});
     }
     }
   }
   }