diff options
author | Martin Storsjo <martin@martin.st> | 2019-10-15 09:18:18 +0000 |
---|---|---|
committer | Martin Storsjo <martin@martin.st> | 2019-10-15 09:18:18 +0000 |
commit | 9318c94ebbf28beb843852246beb34082c659bae (patch) | |
tree | bc15a6a7ac96be84a2fa7903f47b93e191fb3797 /lld/COFF/SymbolTable.cpp | |
parent | cc2f68ea2dc8132270218ca14ab0e21fb71d3ec8 (diff) | |
download | bcm5719-llvm-9318c94ebbf28beb843852246beb34082c659bae.tar.gz bcm5719-llvm-9318c94ebbf28beb843852246beb34082c659bae.zip |
[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
llvm-svn: 374869
Diffstat (limited to 'lld/COFF/SymbolTable.cpp')
-rw-r--r-- | lld/COFF/SymbolTable.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index a4aa5d39820..61df04e2d21 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -108,26 +108,27 @@ static std::vector<std::string> getSymbolLocations(BitcodeFile *file) { 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) config->symbolizer = make<symbolize::LLVMSymbolizer>(); Expected<DILineInfo> 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<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. - 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 (fileLine.first.empty() && config->mingw) + if (!fileLine && config->mingw) fileLine = getFileLineDwarf(c, addr); return fileLine; } @@ -150,11 +151,13 @@ std::vector<std::string> getSymbolLocations(ObjFile *file, uint32_t symIndex) { for (const coff_relocation &r : sc->getRelocs()) { if (r.SymbolTableIndex != symIndex) continue; - std::pair<StringRef, uint32_t> fileLine = + Optional<std::pair<StringRef, uint32_t>> 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}); } } |