aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2019-10-21 08:01:59 +0000
committerMartin Storsjo <martin@martin.st>2019-10-21 08:01:59 +0000
commit8c742da1fd4f4acc78032a34021de228e3621ea5 (patch)
treefc1cd5fb667511309b0150590119471e50a0b808
parent3a192b4c7952e420f700884089bcd486ece23df5 (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.txt1
-rw-r--r--COFF/Config.h8
-rw-r--r--COFF/InputFiles.cpp13
-rw-r--r--COFF/InputFiles.h4
-rw-r--r--COFF/SymbolTable.cpp10
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);