[LLVMSymbolize] Use std::unique_ptr more extensively to clarify ownership.
authorAlexey Samsonov <vonosmas@gmail.com>
Mon, 26 Oct 2015 19:41:23 +0000 (19:41 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Mon, 26 Oct 2015 19:41:23 +0000 (19:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251336 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/Symbolize/Symbolize.h
lib/DebugInfo/Symbolize/Symbolize.cpp

index c58c51b..eaa6334 100644 (file)
@@ -90,8 +90,7 @@ private:
     MemoryBuffers.push_back(std::move(MemBuf));
   }
 
-  // Owns module info objects.
-  std::map<std::string, ModuleInfo *> Modules;
+  std::map<std::string, std::unique_ptr<ModuleInfo>> Modules;
   std::map<std::pair<MachOUniversalBinary *, std::string>, ObjectFile *>
       ObjectFileForArch;
   std::map<std::pair<std::string, std::string>, ObjectPair>
@@ -103,7 +102,7 @@ private:
 
 class ModuleInfo {
 public:
-  ModuleInfo(ObjectFile *Obj, DIContext *DICtx);
+  ModuleInfo(ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
 
   DILineInfo symbolizeCode(uint64_t ModuleOffset,
                            const LLVMSymbolizer::Options &Opts) const;
index ffe3747..57e24c9 100644 (file)
@@ -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<DIContext> DICtx)
+    : Module(Obj), DebugInfoContext(std::move(DICtx)) {
   std::unique_ptr<DataExtractor> 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<DIContext> Context;
   if (auto CoffObject = dyn_cast<COFFObjectFile>(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<ModuleInfo>(Objects.first, std::move(Context));
+  ModuleInfo *Res = Info.get();
+  Modules.emplace(ModuleName, std::move(Info));
+  return Res;
 }
 
 std::string LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo,