diff options
author | Martin Storsjo <martin@martin.st> | 2019-10-21 08:01:59 +0000 |
---|---|---|
committer | Martin Storsjo <martin@martin.st> | 2019-10-21 08:01:59 +0000 |
commit | 8c742da1fd4f4acc78032a34021de228e3621ea5 (patch) | |
tree | fc1cd5fb667511309b0150590119471e50a0b808 | |
parent | 3a192b4c7952e420f700884089bcd486ece23df5 (diff) |
[LLD] [COFF] Use the local dwarf code instead of Symbolizer for resolving code locations. NFC.
As we now have code that parses the dwarf info for variable locations,
we can use that instead of relying on the higher level Symbolizer library,
reducing the previous two different dwarf codepaths into one.
Differential Revision: https://reviews.llvm.org/D69198
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@375391 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | COFF/CMakeLists.txt | 1 | ||||
-rw-r--r-- | COFF/Config.h | 8 | ||||
-rw-r--r-- | COFF/InputFiles.cpp | 13 | ||||
-rw-r--r-- | COFF/InputFiles.h | 4 | ||||
-rw-r--r-- | COFF/SymbolTable.cpp | 10 |
5 files changed, 21 insertions, 15 deletions
diff --git a/COFF/CMakeLists.txt b/COFF/CMakeLists.txt index a30df7c4f..7c5e8b79b 100644 --- a/COFF/CMakeLists.txt +++ b/COFF/CMakeLists.txt @@ -38,7 +38,6 @@ add_lld_library(lldCOFF Object Option Support - Symbolize WindowsManifest LINK_LIBS diff --git a/COFF/Config.h b/COFF/Config.h index cd597ddca..309e1fbf9 100644 --- a/COFF/Config.h +++ b/COFF/Config.h @@ -18,12 +18,6 @@ #include <set> #include <string> -namespace llvm { -namespace symbolize { -class LLVMSymbolizer; -} -} // namespace llvm - namespace lld { namespace coff { @@ -232,8 +226,6 @@ struct Configuration { bool swaprunNet = false; bool thinLTOEmitImportsFiles; bool thinLTOIndexOnly; - - llvm::symbolize::LLVMSymbolizer *symbolizer = nullptr; }; extern Configuration *config; diff --git a/COFF/InputFiles.cpp b/COFF/InputFiles.cpp index 4097cda59..faec3ba16 100644 --- a/COFF/InputFiles.cpp +++ b/COFF/InputFiles.cpp @@ -807,6 +807,19 @@ ObjFile::getVariableLocation(StringRef var) { return std::make_pair(saver.save(ret->first), ret->second); } +// Used only for DWARF debug info, which is not common (except in MinGW +// environments). +Optional<DILineInfo> ObjFile::getDILineInfo(uint32_t offset, + uint32_t sectionIndex) { + if (!dwarf) { + dwarf = make<DWARFCache>(DWARFContext::create(*getCOFFObj())); + if (!dwarf) + return None; + } + + return dwarf->getDILineInfo(offset, sectionIndex); +} + StringRef ltrim1(StringRef s, const char *chars) { if (!s.empty() && strchr(chars, s[0])) return s.substr(1); diff --git a/COFF/InputFiles.h b/COFF/InputFiles.h index 66249715e..1004432c6 100644 --- a/COFF/InputFiles.h +++ b/COFF/InputFiles.h @@ -26,6 +26,7 @@ #include <vector> namespace llvm { +struct DILineInfo; namespace pdb { class DbiModuleDescriptorBuilder; } @@ -206,6 +207,9 @@ public: llvm::Optional<std::pair<StringRef, uint32_t>> getVariableLocation(StringRef var); + llvm::Optional<llvm::DILineInfo> getDILineInfo(uint32_t offset, + uint32_t sectionIndex); + private: const coff_section* getSection(uint32_t i); const coff_section *getSection(COFFSymbolRef sym) { diff --git a/COFF/SymbolTable.cpp b/COFF/SymbolTable.cpp index 183761f1c..869dfc7a2 100644 --- a/COFF/SymbolTable.cpp +++ b/COFF/SymbolTable.cpp @@ -110,13 +110,11 @@ static std::vector<std::string> getSymbolLocations(BitcodeFile *file) { 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) + Optional<DILineInfo> optionalLineInfo = + c->file->getDILineInfo(addr, c->getSectionNumber() - 1); + if (!optionalLineInfo) return None; - const DILineInfo &lineInfo = *expectedLineInfo; + const DILineInfo &lineInfo = *optionalLineInfo; if (lineInfo.FileName == DILineInfo::BadString) return None; return std::make_pair(saver.save(lineInfo.FileName), lineInfo.Line); |