Index: lld/COFF/PDB.h =================================================================== --- lld/COFF/PDB.h +++ lld/COFF/PDB.h @@ -10,6 +10,7 @@ #define LLD_COFF_PDB_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" namespace llvm { @@ -29,9 +30,9 @@ llvm::ArrayRef sectionTable, llvm::codeview::DebugInfo *buildId); -std::pair getFileLineCodeView(const SectionChunk *c, - uint32_t addr); -} -} +llvm::Optional> +getFileLineCodeView(const SectionChunk *c, uint32_t addr); +} // namespace coff +} // namespace lld #endif Index: lld/COFF/PDB.cpp =================================================================== --- lld/COFF/PDB.cpp +++ lld/COFF/PDB.cpp @@ -1791,8 +1791,8 @@ // 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 // not found. -std::pair getFileLineCodeView(const SectionChunk *c, - uint32_t addr) { +Optional> +getFileLineCodeView(const SectionChunk *c, uint32_t addr) { ExitOnError exitOnErr; DebugStringTableSubsectionRef cVStrTab; @@ -1801,7 +1801,7 @@ uint32_t offsetInLinetable; if (!findLineTable(c, addr, cVStrTab, checksums, lines, offsetInLinetable)) - return {"", 0}; + return None; Optional nameIndex; Optional lineNumber; @@ -1815,16 +1815,16 @@ } StringRef filename = exitOnErr(getFileName(cVStrTab, checksums, *nameIndex)); - return {filename, *lineNumber}; + return std::make_pair(filename, *lineNumber); } nameIndex = entry.NameIndex; lineNumber = li.getStartLine(); } } if (!nameIndex) - return {"", 0}; + return None; StringRef filename = exitOnErr(getFileName(cVStrTab, checksums, *nameIndex)); - return {filename, *lineNumber}; + return std::make_pair(filename, *lineNumber); } } // namespace coff Index: lld/COFF/SymbolTable.cpp =================================================================== --- lld/COFF/SymbolTable.cpp +++ lld/COFF/SymbolTable.cpp @@ -108,26 +108,27 @@ return {res}; } -static std::pair getFileLineDwarf(const SectionChunk *c, - uint32_t addr) { +static Optional> +getFileLineDwarf(const SectionChunk *c, uint32_t addr) { if (!config->symbolizer) config->symbolizer = make(); Expected expectedLineInfo = config->symbolizer->symbolizeCode( *c->file->getCOFFObj(), {addr, c->getSectionNumber() - 1}); if (!expectedLineInfo) - return {"", 0}; + return None; const DILineInfo &lineInfo = *expectedLineInfo; 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 getFileLine(const SectionChunk *c, - uint32_t addr) { +static Optional> +getFileLine(const SectionChunk *c, uint32_t addr) { // MinGW can optionally use codeview, even if the default is dwarf. - std::pair fileLine = getFileLineCodeView(c, addr); + Optional> fileLine = + getFileLineCodeView(c, addr); // 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); return fileLine; } @@ -150,11 +151,13 @@ for (const coff_relocation &r : sc->getRelocs()) { if (r.SymbolTableIndex != symIndex) continue; - std::pair fileLine = + Optional> fileLine = getFileLine(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}); } }