diff --git a/include/llvm/DebugInfo/Symbolize/Symbolize.h b/include/llvm/DebugInfo/Symbolize/Symbolize.h index c58c51b02395..eaa63348fad4 100644 --- a/include/llvm/DebugInfo/Symbolize/Symbolize.h +++ b/include/llvm/DebugInfo/Symbolize/Symbolize.h @@ -90,8 +90,7 @@ class LLVMSymbolizer { MemoryBuffers.push_back(std::move(MemBuf)); } - // Owns module info objects. - std::map Modules; + std::map> Modules; std::map, ObjectFile *> ObjectFileForArch; std::map, ObjectPair> @@ -103,7 +102,7 @@ class LLVMSymbolizer { class ModuleInfo { public: - ModuleInfo(ObjectFile *Obj, DIContext *DICtx); + ModuleInfo(ObjectFile *Obj, std::unique_ptr DICtx); DILineInfo symbolizeCode(uint64_t ModuleOffset, const LLVMSymbolizer::Options &Opts) const; diff --git a/lib/DebugInfo/Symbolize/Symbolize.cpp b/lib/DebugInfo/Symbolize/Symbolize.cpp index ffe3747db0c4..57e24c948589 100644 --- a/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -61,8 +61,8 @@ getDILineInfoSpecifier(const LLVMSymbolizer::Options &Opts) { Opts.PrintFunctions); } -ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx) - : Module(Obj), DebugInfoContext(DICtx) { +ModuleInfo::ModuleInfo(ObjectFile *Obj, std::unique_ptr DICtx) + : Module(Obj), DebugInfoContext(std::move(DICtx)) { std::unique_ptr OpdExtractor; uint64_t OpdAddress = 0; // Find the .opd (function descriptor) section if any, for big-endian @@ -308,7 +308,7 @@ std::string LLVMSymbolizer::symbolizeData(const std::string &ModuleName, } void LLVMSymbolizer::flush() { - DeleteContainerSeconds(Modules); + Modules.clear(); ObjectPairForPathArch.clear(); ObjectFileForArch.clear(); } @@ -512,7 +512,7 @@ ModuleInfo * LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { const auto &I = Modules.find(ModuleName); if (I != Modules.end()) - return I->second; + return I->second.get(); std::string BinaryName = ModuleName; std::string ArchName = Opts.DefaultArch; size_t ColonPos = ModuleName.find_last_of(':'); @@ -528,10 +528,10 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { if (!Objects.first) { // Failed to find valid object file. - Modules.insert(make_pair(ModuleName, (ModuleInfo *)nullptr)); + Modules.emplace(ModuleName, nullptr); return nullptr; } - DIContext *Context = nullptr; + std::unique_ptr Context; if (auto CoffObject = dyn_cast(Objects.first)) { // If this is a COFF object, assume it contains PDB debug information. If // we don't find any we will fall back to the DWARF case. @@ -539,15 +539,16 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { PDB_ErrorCode Error = loadDataForEXE(PDB_ReaderType::DIA, Objects.first->getFileName(), Session); if (Error == PDB_ErrorCode::Success) { - Context = new PDBContext(*CoffObject, std::move(Session)); + Context.reset(new PDBContext(*CoffObject, std::move(Session))); } } if (!Context) - Context = new DWARFContextInMemory(*Objects.second); + Context.reset(new DWARFContextInMemory(*Objects.second)); assert(Context); - ModuleInfo *Info = new ModuleInfo(Objects.first, Context); - Modules.insert(make_pair(ModuleName, Info)); - return Info; + auto Info = make_unique(Objects.first, std::move(Context)); + ModuleInfo *Res = Info.get(); + Modules.emplace(ModuleName, std::move(Info)); + return Res; } std::string LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,