summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h3
-rw-r--r--llvm/lib/DebugInfo/Symbolize/Symbolize.cpp45
2 files changed, 27 insertions, 21 deletions
diff --git a/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h b/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
index 7871a2653a5..230dc759a97 100644
--- a/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
+++ b/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
@@ -70,6 +70,9 @@ private:
ObjectFile *lookUpDsymFile(const std::string &Path,
const MachOObjectFile *ExeObj,
const std::string &ArchName);
+ ObjectFile *lookUpDebuglinkObject(const std::string &Path,
+ const ObjectFile *Obj,
+ const std::string &ArchName);
/// \brief Returns pair of pointers to object and debug object.
ErrorOr<ObjectPair> getOrCreateObjects(const std::string &Path,
diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index b0e17cfd3ff..ba7d39cbdb3 100644
--- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -244,6 +244,28 @@ ObjectFile *LLVMSymbolizer::lookUpDsymFile(const std::string &ExePath,
return nullptr;
}
+ObjectFile *LLVMSymbolizer::lookUpDebuglinkObject(const std::string &Path,
+ const ObjectFile *Obj,
+ const std::string &ArchName) {
+ std::string DebuglinkName;
+ uint32_t CRCHash;
+ std::string DebugBinaryPath;
+ if (!getGNUDebuglinkContents(Obj, DebuglinkName, CRCHash))
+ return nullptr;
+ if (!findDebugBinary(Path, DebuglinkName, CRCHash, DebugBinaryPath))
+ return nullptr;
+ ErrorOr<OwningBinary<Binary>> DebugBinaryOrErr =
+ createBinary(DebugBinaryPath);
+ if (!DebugBinaryOrErr)
+ return nullptr;
+ OwningBinary<Binary> &DB = DebugBinaryOrErr.get();
+ auto DbgObjOrErr = getObjectFileFromBinary(DB.getBinary(), ArchName);
+ if (!DbgObjOrErr)
+ return nullptr;
+ addOwningBinary(std::move(DB));
+ return DbgObjOrErr.get();
+}
+
ErrorOr<LLVMSymbolizer::ObjectPair>
LLVMSymbolizer::getOrCreateObjects(const std::string &Path,
const std::string &ArchName) {
@@ -273,27 +295,8 @@ LLVMSymbolizer::getOrCreateObjects(const std::string &Path,
if (auto MachObj = dyn_cast<const MachOObjectFile>(Obj))
DbgObj = lookUpDsymFile(Path, MachObj, ArchName);
- // Try to locate the debug binary using .gnu_debuglink section.
- if (!DbgObj) {
- std::string DebuglinkName;
- uint32_t CRCHash;
- std::string DebugBinaryPath;
- if (getGNUDebuglinkContents(Obj, DebuglinkName, CRCHash) &&
- findDebugBinary(Path, DebuglinkName, CRCHash, DebugBinaryPath)) {
- ErrorOr<OwningBinary<Binary>> DebugBinaryOrErr =
- createBinary(DebugBinaryPath);
- if (DebugBinaryOrErr) {
- OwningBinary<Binary> &DB = DebugBinaryOrErr.get();
- auto DbgObjOrErr = getObjectFileFromBinary(DB.getBinary(), ArchName);
- if (DbgObjOrErr) {
- DbgObj = DbgObjOrErr.get();
- assert(DbgObj != nullptr);
- addOwningBinary(std::move(DB));
- }
- }
- }
- }
-
+ if (!DbgObj)
+ DbgObj = lookUpDebuglinkObject(Path, Obj, ArchName);
if (!DbgObj)
DbgObj = Obj;
ObjectPair Res = std::make_pair(Obj, DbgObj);
OpenPOWER on IntegriCloud