summaryrefslogtreecommitdiffstats
path: root/lld/COFF/SymbolTable.cpp
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2019-10-15 09:18:18 +0000
committerMartin Storsjo <martin@martin.st>2019-10-15 09:18:18 +0000
commit9318c94ebbf28beb843852246beb34082c659bae (patch)
treebc15a6a7ac96be84a2fa7903f47b93e191fb3797 /lld/COFF/SymbolTable.cpp
parentcc2f68ea2dc8132270218ca14ab0e21fb71d3ec8 (diff)
downloadbcm5719-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.cpp27
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});
}
}
OpenPOWER on IntegriCloud