X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FDebugInfo%2FSymbolize%2FSymbolize.cpp;h=3da1963bb791da7424f85078215e871595e5d694;hp=ba7d39cbdb3532407f4245f4b37e4cdbe7cdf39a;hb=9dcc66e06e5d5a2830a93aad80d5fa1e8343927a;hpb=a2d9f5fdfeb2d6810eefbd6339157da2b217de39;ds=sidebyside diff --git a/lib/DebugInfo/Symbolize/Symbolize.cpp b/lib/DebugInfo/Symbolize/Symbolize.cpp index ba7d39cbdb3..3da1963bb79 100644 --- a/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -22,6 +22,7 @@ #include "llvm/DebugInfo/PDB/PDBContext.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/MachO.h" +#include "llvm/Object/MachOUniversal.h" #include "llvm/Support/COFF.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compression.h" @@ -109,9 +110,10 @@ ErrorOr LLVMSymbolizer::symbolizeData(const std::string &ModuleName, } void LLVMSymbolizer::flush() { - Modules.clear(); + ObjectForUBPathAndArch.clear(); + BinaryForPath.clear(); ObjectPairForPathArch.clear(); - ObjectFileForArch.clear(); + Modules.clear(); } // For Path="/path/to/foo" and Basename="foo" assume that debug info is in @@ -223,23 +225,16 @@ ObjectFile *LLVMSymbolizer::lookUpDsymFile(const std::string &ExePath, for (const auto &Path : Opts.DsymHints) { DsymPaths.push_back(getDarwinDWARFResourceForPath(Path, Filename)); } - for (const auto &path : DsymPaths) { - ErrorOr> BinaryOrErr = createBinary(path); - if (!BinaryOrErr) - continue; - OwningBinary &B = BinaryOrErr.get(); - auto DbgObjOrErr = getObjectFileFromBinary(B.getBinary(), ArchName); + for (const auto &Path : DsymPaths) { + auto DbgObjOrErr = getOrCreateObject(Path, ArchName); if (!DbgObjOrErr) continue; ObjectFile *DbgObj = DbgObjOrErr.get(); - const MachOObjectFile *MachDbgObj = - dyn_cast(DbgObj); + const MachOObjectFile *MachDbgObj = dyn_cast(DbgObj); if (!MachDbgObj) continue; - if (darwinDsymMatchesBinary(MachDbgObj, MachExeObj)) { - addOwningBinary(std::move(B)); + if (darwinDsymMatchesBinary(MachDbgObj, MachExeObj)) return DbgObj; - } } return nullptr; } @@ -254,40 +249,25 @@ ObjectFile *LLVMSymbolizer::lookUpDebuglinkObject(const std::string &Path, return nullptr; if (!findDebugBinary(Path, DebuglinkName, CRCHash, DebugBinaryPath)) return nullptr; - ErrorOr> DebugBinaryOrErr = - createBinary(DebugBinaryPath); - if (!DebugBinaryOrErr) - return nullptr; - OwningBinary &DB = DebugBinaryOrErr.get(); - auto DbgObjOrErr = getObjectFileFromBinary(DB.getBinary(), ArchName); + auto DbgObjOrErr = getOrCreateObject(DebugBinaryPath, ArchName); if (!DbgObjOrErr) return nullptr; - addOwningBinary(std::move(DB)); return DbgObjOrErr.get(); } ErrorOr -LLVMSymbolizer::getOrCreateObjects(const std::string &Path, - const std::string &ArchName) { +LLVMSymbolizer::getOrCreateObjectPair(const std::string &Path, + const std::string &ArchName) { const auto &I = ObjectPairForPathArch.find(std::make_pair(Path, ArchName)); if (I != ObjectPairForPathArch.end()) return I->second; - ErrorOr> BinaryOrErr = createBinary(Path); - if (auto EC = BinaryOrErr.getError()) { - ObjectPairForPathArch.insert( - std::make_pair(std::make_pair(Path, ArchName), EC)); - return EC; - } - OwningBinary &B = BinaryOrErr.get(); - - auto ObjOrErr = getObjectFileFromBinary(B.getBinary(), ArchName); + auto ObjOrErr = getOrCreateObject(Path, ArchName); if (auto EC = ObjOrErr.getError()) { ObjectPairForPathArch.insert( std::make_pair(std::make_pair(Path, ArchName), EC)); return EC; } - addOwningBinary(std::move(B)); ObjectFile *Obj = ObjOrErr.get(); assert(Obj != nullptr); @@ -306,24 +286,43 @@ LLVMSymbolizer::getOrCreateObjects(const std::string &Path, } ErrorOr -LLVMSymbolizer::getObjectFileFromBinary(Binary *Bin, - const std::string &ArchName) { +LLVMSymbolizer::getOrCreateObject(const std::string &Path, + const std::string &ArchName) { + const auto &I = BinaryForPath.find(Path); + Binary *Bin = nullptr; + if (I == BinaryForPath.end()) { + ErrorOr> BinOrErr = createBinary(Path); + if (auto EC = BinOrErr.getError()) { + BinaryForPath.insert(std::make_pair(Path, EC)); + return EC; + } + Bin = BinOrErr->getBinary(); + BinaryForPath.insert(std::make_pair(Path, std::move(BinOrErr.get()))); + } else if (auto EC = I->second.getError()) { + return EC; + } else { + Bin = I->second->getBinary(); + } + assert(Bin != nullptr); + if (MachOUniversalBinary *UB = dyn_cast(Bin)) { - const auto &I = ObjectFileForArch.find( - std::make_pair(UB, ArchName)); - if (I != ObjectFileForArch.end()) - return I->second; - ErrorOr> ParsedObj = + const auto &I = ObjectForUBPathAndArch.find(std::make_pair(Path, ArchName)); + if (I != ObjectForUBPathAndArch.end()) { + if (auto EC = I->second.getError()) + return EC; + return I->second->get(); + } + ErrorOr> ObjOrErr = UB->getObjectForArch(ArchName); - if (auto EC = ParsedObj.getError()) { - ObjectFileForArch.insert( - std::make_pair(std::make_pair(UB, ArchName), EC)); + if (auto EC = ObjOrErr.getError()) { + ObjectForUBPathAndArch.insert( + std::make_pair(std::make_pair(Path, ArchName), EC)); return EC; } - ObjectFile *Res = ParsedObj.get().get(); - ParsedBinariesAndObjects.push_back(std::move(ParsedObj.get())); - ObjectFileForArch.insert(std::make_pair(std::make_pair(UB, ArchName), Res)); + ObjectFile *Res = ObjOrErr->get(); + ObjectForUBPathAndArch.insert(std::make_pair(std::make_pair(Path, ArchName), + std::move(ObjOrErr.get()))); return Res; } if (Bin->isObject()) { @@ -352,7 +351,7 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { ArchName = ArchStr; } } - auto ObjectsOrErr = getOrCreateObjects(BinaryName, ArchName); + auto ObjectsOrErr = getOrCreateObjectPair(BinaryName, ArchName); if (auto EC = ObjectsOrErr.getError()) { // Failed to find valid object file. Modules.insert(std::make_pair(ModuleName, EC));