kubamracek created this revision.
kubamracek added a project: Sanitizers.
Herald added a subscriber: mgorny.

There is currently a single MemoryHistory plugin, which is for 
AddressSanitizer.  Let's merge the feature into InstrumentationRuntime plugins. 
 I'm thinking of implementing another provider of memory history, which would 
be for ThreadSanitizer -- and it would be weird to implement two separate 
plugins (MemoryHistory and InstrumentationRuntime) to each sanitizer.


https://reviews.llvm.org/D30006

Files:
  include/lldb/Core/PluginManager.h
  include/lldb/Target/InstrumentationRuntime.h
  include/lldb/Target/MemoryHistory.h
  include/lldb/lldb-forward.h
  include/lldb/lldb-private-interfaces.h
  lldb.xcodeproj/project.pbxproj
  source/API/SystemInitializerFull.cpp
  source/Commands/CommandObjectMemory.cpp
  source/Core/PluginManager.cpp
  source/Plugins/CMakeLists.txt
  
source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
  
source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
  source/Plugins/MemoryHistory/CMakeLists.txt
  source/Plugins/MemoryHistory/asan/CMakeLists.txt
  source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
  source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
  source/Target/CMakeLists.txt
  source/Target/InstrumentationRuntime.cpp
  source/Target/MemoryHistory.cpp
  source/Target/Process.cpp

Index: source/Target/Process.cpp
===================================================================
--- source/Target/Process.cpp
+++ source/Target/Process.cpp
@@ -47,7 +47,6 @@
 #include "lldb/Target/JITLoader.h"
 #include "lldb/Target/JITLoaderList.h"
 #include "lldb/Target/LanguageRuntime.h"
-#include "lldb/Target/MemoryHistory.h"
 #include "lldb/Target/MemoryRegionInfo.h"
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/OperatingSystem.h"
@@ -5983,14 +5982,14 @@
 ThreadCollectionSP Process::GetHistoryThreads(lldb::addr_t addr) {
   ThreadCollectionSP threads;
 
-  const MemoryHistorySP &memory_history =
-      MemoryHistory::FindPlugin(shared_from_this());
+  const InstrumentationRuntimeSP &runtime =
+      InstrumentationRuntime::FindMemoryHistoryPlugin(shared_from_this());
 
-  if (!memory_history) {
+  if (!runtime) {
     return threads;
   }
 
-  threads.reset(new ThreadCollection(memory_history->GetHistoryThreads(addr)));
+  threads.reset(new ThreadCollection(runtime->GetHistoryThreads(addr)));
 
   return threads;
 }
Index: source/Target/MemoryHistory.cpp
===================================================================
--- source/Target/MemoryHistory.cpp
+++ source/Target/MemoryHistory.cpp
@@ -1,33 +0,0 @@
-//===-- MemoryHistory.cpp ---------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
-#include "lldb/Target/MemoryHistory.h"
-#include "lldb/Core/PluginManager.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-lldb::MemoryHistorySP MemoryHistory::FindPlugin(const ProcessSP process) {
-  MemoryHistoryCreateInstance create_callback = nullptr;
-
-  for (uint32_t idx = 0;
-       (create_callback = PluginManager::GetMemoryHistoryCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
-    MemoryHistorySP memory_history_sp(create_callback(process));
-    if (memory_history_sp)
-      return memory_history_sp;
-  }
-
-  return MemoryHistorySP();
-}
Index: source/Target/InstrumentationRuntime.cpp
===================================================================
--- source/Target/InstrumentationRuntime.cpp
+++ source/Target/InstrumentationRuntime.cpp
@@ -78,3 +78,19 @@
     StructuredData::ObjectSP info) {
   return ThreadCollectionSP(new ThreadCollection());
 }
+
+lldb::InstrumentationRuntimeSP
+InstrumentationRuntime::FindMemoryHistoryPlugin(const ProcessSP process) {
+  for (uint32_t idx = 0;; ++idx) {
+    InstrumentationRuntimeGetType get_type_callback =
+        PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);
+    if (get_type_callback == nullptr)
+      break;
+    InstrumentationRuntimeType type = get_type_callback();
+    InstrumentationRuntimeSP runtime = process->GetInstrumentationRuntime(type);
+    if (runtime->CanProvideMemoryHistory())
+      return runtime;
+  }
+  
+  return InstrumentationRuntimeSP();
+}
Index: source/Target/CMakeLists.txt
===================================================================
--- source/Target/CMakeLists.txt
+++ source/Target/CMakeLists.txt
@@ -12,7 +12,6 @@
   Language.cpp
   LanguageRuntime.cpp
   Memory.cpp
-  MemoryHistory.cpp
   ModuleCache.cpp
   ObjCLanguageRuntime.cpp
   OperatingSystem.cpp
Index: source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
===================================================================
--- source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
+++ source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
@@ -1,53 +0,0 @@
-//===-- MemoryHistoryASan.h -------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef liblldb_MemoryHistoryASan_h_
-#define liblldb_MemoryHistoryASan_h_
-
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
-#include "lldb/Target/ABI.h"
-#include "lldb/Target/MemoryHistory.h"
-#include "lldb/Target/Process.h"
-#include "lldb/lldb-private.h"
-
-namespace lldb_private {
-
-class MemoryHistoryASan : public lldb_private::MemoryHistory {
-public:
-  ~MemoryHistoryASan() override = default;
-
-  static lldb::MemoryHistorySP
-  CreateInstance(const lldb::ProcessSP &process_sp);
-
-  static void Initialize();
-
-  static void Terminate();
-
-  static lldb_private::ConstString GetPluginNameStatic();
-
-  lldb_private::ConstString GetPluginName() override {
-    return GetPluginNameStatic();
-  }
-
-  uint32_t GetPluginVersion() override { return 1; }
-
-  lldb_private::HistoryThreads GetHistoryThreads(lldb::addr_t address) override;
-
-private:
-  MemoryHistoryASan(const lldb::ProcessSP &process_sp);
-
-  lldb::ProcessWP m_process_wp;
-};
-
-} // namespace lldb_private
-
-#endif // liblldb_MemoryHistoryASan_h_
Index: source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
===================================================================
--- source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
+++ source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
@@ -1,204 +0,0 @@
-//===-- MemoryHistoryASan.cpp -----------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "MemoryHistoryASan.h"
-
-#include "lldb/Target/MemoryHistory.h"
-
-#include "Plugins/Process/Utility/HistoryThread.h"
-#include "lldb/Core/Debugger.h"
-#include "lldb/Core/Module.h"
-#include "lldb/Core/PluginInterface.h"
-#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/ValueObject.h"
-#include "lldb/Expression/UserExpression.h"
-#include "lldb/Target/ExecutionContext.h"
-#include "lldb/Target/Target.h"
-#include "lldb/Target/Thread.h"
-#include "lldb/Target/ThreadList.h"
-#include "lldb/lldb-private.h"
-
-#include <sstream>
-
-using namespace lldb;
-using namespace lldb_private;
-
-MemoryHistorySP MemoryHistoryASan::CreateInstance(const ProcessSP &process_sp) {
-  if (!process_sp.get())
-    return NULL;
-
-  Target &target = process_sp->GetTarget();
-
-  const ModuleList &target_modules = target.GetImages();
-  std::lock_guard<std::recursive_mutex> guard(target_modules.GetMutex());
-  const size_t num_modules = target_modules.GetSize();
-  for (size_t i = 0; i < num_modules; ++i) {
-    Module *module_pointer = target_modules.GetModulePointerAtIndexUnlocked(i);
-
-    const Symbol *symbol = module_pointer->FindFirstSymbolWithNameAndType(
-        ConstString("__asan_get_alloc_stack"), lldb::eSymbolTypeAny);
-
-    if (symbol != nullptr)
-      return MemoryHistorySP(new MemoryHistoryASan(process_sp));
-  }
-
-  return MemoryHistorySP();
-}
-
-void MemoryHistoryASan::Initialize() {
-  PluginManager::RegisterPlugin(
-      GetPluginNameStatic(), "ASan memory history provider.", CreateInstance);
-}
-
-void MemoryHistoryASan::Terminate() {
-  PluginManager::UnregisterPlugin(CreateInstance);
-}
-
-ConstString MemoryHistoryASan::GetPluginNameStatic() {
-  static ConstString g_name("asan");
-  return g_name;
-}
-
-MemoryHistoryASan::MemoryHistoryASan(const ProcessSP &process_sp) {
-  if (process_sp)
-    m_process_wp = process_sp;
-}
-
-const char *memory_history_asan_command_prefix = R"(
-    extern "C"
-    {
-        size_t __asan_get_alloc_stack(void *addr, void **trace, size_t size, int *thread_id);
-        size_t __asan_get_free_stack(void *addr, void **trace, size_t size, int *thread_id);
-    }
-
-    struct data {
-        void *alloc_trace[256];
-        size_t alloc_count;
-        int alloc_tid;
-        
-        void *free_trace[256];
-        size_t free_count;
-        int free_tid;
-    };
-)";
-
-const char *memory_history_asan_command_format =
-    R"(
-    data t;
-
-    t.alloc_count = __asan_get_alloc_stack((void *)0x%)" PRIx64
-    R"(, t.alloc_trace, 256, &t.alloc_tid);
-    t.free_count = __asan_get_free_stack((void *)0x%)" PRIx64
-    R"(, t.free_trace, 256, &t.free_tid);
-
-    t;
-)";
-
-static void CreateHistoryThreadFromValueObject(ProcessSP process_sp,
-                                               ValueObjectSP return_value_sp,
-                                               const char *type,
-                                               const char *thread_name,
-                                               HistoryThreads &result) {
-  std::string count_path = "." + std::string(type) + "_count";
-  std::string tid_path = "." + std::string(type) + "_tid";
-  std::string trace_path = "." + std::string(type) + "_trace";
-
-  ValueObjectSP count_sp =
-      return_value_sp->GetValueForExpressionPath(count_path.c_str());
-  ValueObjectSP tid_sp =
-      return_value_sp->GetValueForExpressionPath(tid_path.c_str());
-
-  if (!count_sp || !tid_sp)
-    return;
-
-  int count = count_sp->GetValueAsUnsigned(0);
-  tid_t tid = tid_sp->GetValueAsUnsigned(0) + 1;
-
-  if (count <= 0)
-    return;
-
-  ValueObjectSP trace_sp =
-      return_value_sp->GetValueForExpressionPath(trace_path.c_str());
-
-  if (!trace_sp)
-    return;
-
-  std::vector<lldb::addr_t> pcs;
-  for (int i = 0; i < count; i++) {
-    addr_t pc = trace_sp->GetChildAtIndex(i, true)->GetValueAsUnsigned(0);
-    if (pc == 0 || pc == 1 || pc == LLDB_INVALID_ADDRESS)
-      continue;
-    pcs.push_back(pc);
-  }
-
-  HistoryThread *history_thread =
-      new HistoryThread(*process_sp, tid, pcs, 0, false);
-  ThreadSP new_thread_sp(history_thread);
-  std::ostringstream thread_name_with_number;
-  thread_name_with_number << thread_name << " Thread " << tid;
-  history_thread->SetThreadName(thread_name_with_number.str().c_str());
-  // Save this in the Process' ExtendedThreadList so a strong pointer retains
-  // the object
-  process_sp->GetExtendedThreadList().AddThread(new_thread_sp);
-  result.push_back(new_thread_sp);
-}
-
-static constexpr std::chrono::seconds g_get_stack_function_timeout(2);
-
-HistoryThreads MemoryHistoryASan::GetHistoryThreads(lldb::addr_t address) {
-  HistoryThreads result;
-
-  ProcessSP process_sp = m_process_wp.lock();
-  if (!process_sp)
-    return result;
-
-  ThreadSP thread_sp =
-      process_sp->GetThreadList().GetExpressionExecutionThread();
-  if (!thread_sp)
-    return result;
-
-  StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
-  if (!frame_sp)
-    return result;
-
-  ExecutionContext exe_ctx(frame_sp);
-  ValueObjectSP return_value_sp;
-  StreamString expr;
-  Error eval_error;
-  expr.Printf(memory_history_asan_command_format, address, address);
-
-  EvaluateExpressionOptions options;
-  options.SetUnwindOnError(true);
-  options.SetTryAllThreads(true);
-  options.SetStopOthers(true);
-  options.SetIgnoreBreakpoints(true);
-  options.SetTimeout(g_get_stack_function_timeout);
-  options.SetPrefix(memory_history_asan_command_prefix);
-  options.SetAutoApplyFixIts(false);
-  options.SetLanguage(eLanguageTypeObjC_plus_plus);
-
-  ExpressionResults expr_result = UserExpression::Evaluate(
-      exe_ctx, options, expr.GetString(), "", return_value_sp, eval_error);
-  if (expr_result != eExpressionCompleted) {
-    process_sp->GetTarget().GetDebugger().GetAsyncOutputStream()->Printf(
-        "Warning: Cannot evaluate AddressSanitizer expression:\n%s\n",
-        eval_error.AsCString());
-    return result;
-  }
-
-  if (!return_value_sp)
-    return result;
-
-  CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "free",
-                                     "Memory deallocated by", result);
-  CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "alloc",
-                                     "Memory allocated by", result);
-
-  return result;
-}
Index: source/Plugins/MemoryHistory/asan/CMakeLists.txt
===================================================================
--- source/Plugins/MemoryHistory/asan/CMakeLists.txt
+++ source/Plugins/MemoryHistory/asan/CMakeLists.txt
@@ -1,9 +0,0 @@
-add_lldb_library(lldbPluginMemoryHistoryASan PLUGIN
-  MemoryHistoryASan.cpp
-
-  LINK_LIBS
-    lldbCore
-    lldbExpression
-    lldbTarget
-    lldbPluginProcessUtility
-  )
Index: source/Plugins/MemoryHistory/CMakeLists.txt
===================================================================
--- source/Plugins/MemoryHistory/CMakeLists.txt
+++ source/Plugins/MemoryHistory/CMakeLists.txt
@@ -1 +0,0 @@
-add_subdirectory(asan)
Index: source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
===================================================================
--- source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
+++ source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
@@ -43,6 +43,10 @@
   virtual lldb::InstrumentationRuntimeType GetType() { return GetTypeStatic(); }
 
   uint32_t GetPluginVersion() override { return 1; }
+  
+  bool CanProvideMemoryHistory() override { return true; }
+  
+  HistoryThreads GetHistoryThreads(lldb::addr_t address) override;
 
 private:
   AddressSanitizerRuntime(const lldb::ProcessSP &process_sp)
Index: source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
===================================================================
--- source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
+++ source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
@@ -25,9 +25,12 @@
 #include "lldb/Target/Thread.h"
 #include "lldb/Utility/RegularExpression.h"
 #include "lldb/Utility/Stream.h"
+#include "Plugins/Process/Utility/HistoryThread.h"
 
 #include "llvm/ADT/StringSwitch.h"
 
+#include <sstream>
+
 using namespace lldb;
 using namespace lldb_private;
 
@@ -328,3 +331,137 @@
   }
   SetActive(false);
 }
+
+
+const char *memory_history_asan_command_prefix = R"(
+extern "C"
+{
+  size_t __asan_get_alloc_stack(void *addr, void **trace, size_t size, int *thread_id);
+  size_t __asan_get_free_stack(void *addr, void **trace, size_t size, int *thread_id);
+}
+
+struct data {
+  void *alloc_trace[256];
+  size_t alloc_count;
+  int alloc_tid;
+  
+  void *free_trace[256];
+  size_t free_count;
+  int free_tid;
+};
+)";
+
+const char *memory_history_asan_command_format =
+R"(
+data t;
+
+t.alloc_count = __asan_get_alloc_stack((void *)0x%)" PRIx64
+R"(, t.alloc_trace, 256, &t.alloc_tid);
+t.free_count = __asan_get_free_stack((void *)0x%)" PRIx64
+R"(, t.free_trace, 256, &t.free_tid);
+
+t;
+)";
+
+static void CreateHistoryThreadFromValueObject(ProcessSP process_sp,
+                                               ValueObjectSP return_value_sp,
+                                               const char *type,
+                                               const char *thread_name,
+                                               HistoryThreads &result) {
+  std::string count_path = "." + std::string(type) + "_count";
+  std::string tid_path = "." + std::string(type) + "_tid";
+  std::string trace_path = "." + std::string(type) + "_trace";
+  
+  ValueObjectSP count_sp =
+  return_value_sp->GetValueForExpressionPath(count_path.c_str());
+  ValueObjectSP tid_sp =
+  return_value_sp->GetValueForExpressionPath(tid_path.c_str());
+  
+  if (!count_sp || !tid_sp)
+    return;
+  
+  int count = count_sp->GetValueAsUnsigned(0);
+  tid_t tid = tid_sp->GetValueAsUnsigned(0) + 1;
+  
+  if (count <= 0)
+    return;
+  
+  ValueObjectSP trace_sp =
+  return_value_sp->GetValueForExpressionPath(trace_path.c_str());
+  
+  if (!trace_sp)
+    return;
+  
+  std::vector<lldb::addr_t> pcs;
+  for (int i = 0; i < count; i++) {
+    addr_t pc = trace_sp->GetChildAtIndex(i, true)->GetValueAsUnsigned(0);
+    if (pc == 0 || pc == 1 || pc == LLDB_INVALID_ADDRESS)
+      continue;
+    pcs.push_back(pc);
+  }
+  
+  HistoryThread *history_thread =
+  new HistoryThread(*process_sp, tid, pcs, 0, false);
+  ThreadSP new_thread_sp(history_thread);
+  std::ostringstream thread_name_with_number;
+  thread_name_with_number << thread_name << " Thread " << tid;
+  history_thread->SetThreadName(thread_name_with_number.str().c_str());
+  // Save this in the Process' ExtendedThreadList so a strong pointer retains
+  // the object
+  process_sp->GetExtendedThreadList().AddThread(new_thread_sp);
+  result.push_back(new_thread_sp);
+}
+
+static constexpr std::chrono::seconds g_get_stack_function_timeout(2);
+
+HistoryThreads AddressSanitizerRuntime::GetHistoryThreads(lldb::addr_t address) {
+  HistoryThreads result;
+  
+  ProcessSP process_sp = GetProcessSP();
+  if (!process_sp)
+    return result;
+  
+  ThreadSP thread_sp =
+  process_sp->GetThreadList().GetExpressionExecutionThread();
+  if (!thread_sp)
+    return result;
+  
+  StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
+  if (!frame_sp)
+    return result;
+  
+  ExecutionContext exe_ctx(frame_sp);
+  ValueObjectSP return_value_sp;
+  StreamString expr;
+  Error eval_error;
+  expr.Printf(memory_history_asan_command_format, address, address);
+  
+  EvaluateExpressionOptions options;
+  options.SetUnwindOnError(true);
+  options.SetTryAllThreads(true);
+  options.SetStopOthers(true);
+  options.SetIgnoreBreakpoints(true);
+  options.SetTimeout(g_get_stack_function_timeout);
+  options.SetPrefix(memory_history_asan_command_prefix);
+  options.SetAutoApplyFixIts(false);
+  options.SetLanguage(eLanguageTypeObjC_plus_plus);
+  
+  ExpressionResults expr_result = UserExpression::Evaluate(
+                                                           exe_ctx, options, expr.GetString(), "", return_value_sp, eval_error);
+  if (expr_result != eExpressionCompleted) {
+    process_sp->GetTarget().GetDebugger().GetAsyncOutputStream()->Printf(
+                                                                         "Warning: Cannot evaluate AddressSanitizer expression:\n%s\n",
+                                                                         eval_error.AsCString());
+    return result;
+  }
+  
+  if (!return_value_sp)
+    return result;
+  
+  CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "free",
+                                     "Memory deallocated by", result);
+  CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "alloc",
+                                     "Memory allocated by", result);
+  
+  return result;
+}
Index: source/Plugins/CMakeLists.txt
===================================================================
--- source/Plugins/CMakeLists.txt
+++ source/Plugins/CMakeLists.txt
@@ -7,7 +7,6 @@
 add_subdirectory(JITLoader)
 add_subdirectory(Language)
 add_subdirectory(LanguageRuntime)
-add_subdirectory(MemoryHistory)
 add_subdirectory(ObjectContainer)
 add_subdirectory(ObjectFile)
 add_subdirectory(OperatingSystem)
Index: source/Core/PluginManager.cpp
===================================================================
--- source/Core/PluginManager.cpp
+++ source/Core/PluginManager.cpp
@@ -1915,86 +1915,6 @@
   return nullptr;
 }
 
-#pragma mark MemoryHistory
-
-struct MemoryHistoryInstance {
-  MemoryHistoryInstance() : name(), description(), create_callback(nullptr) {}
-
-  ConstString name;
-  std::string description;
-  MemoryHistoryCreateInstance create_callback;
-};
-
-typedef std::vector<MemoryHistoryInstance> MemoryHistoryInstances;
-
-static std::recursive_mutex &GetMemoryHistoryMutex() {
-  static std::recursive_mutex g_instances_mutex;
-  return g_instances_mutex;
-}
-
-static MemoryHistoryInstances &GetMemoryHistoryInstances() {
-  static MemoryHistoryInstances g_instances;
-  return g_instances;
-}
-
-bool PluginManager::RegisterPlugin(
-    const ConstString &name, const char *description,
-    MemoryHistoryCreateInstance create_callback) {
-  if (create_callback) {
-    MemoryHistoryInstance instance;
-    assert((bool)name);
-    instance.name = name;
-    if (description && description[0])
-      instance.description = description;
-    instance.create_callback = create_callback;
-    std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
-    GetMemoryHistoryInstances().push_back(instance);
-  }
-  return false;
-}
-
-bool PluginManager::UnregisterPlugin(
-    MemoryHistoryCreateInstance create_callback) {
-  if (create_callback) {
-    std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
-    MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
-
-    MemoryHistoryInstances::iterator pos, end = instances.end();
-    for (pos = instances.begin(); pos != end; ++pos) {
-      if (pos->create_callback == create_callback) {
-        instances.erase(pos);
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-MemoryHistoryCreateInstance
-PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
-  std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
-  MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
-  if (idx < instances.size())
-    return instances[idx].create_callback;
-  return nullptr;
-}
-
-MemoryHistoryCreateInstance
-PluginManager::GetMemoryHistoryCreateCallbackForPluginName(
-    const ConstString &name) {
-  if (name) {
-    std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
-    MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
-
-    MemoryHistoryInstances::iterator pos, end = instances.end();
-    for (pos = instances.begin(); pos != end; ++pos) {
-      if (name == pos->name)
-        return pos->create_callback;
-    }
-  }
-  return nullptr;
-}
-
 #pragma mark InstrumentationRuntime
 
 struct InstrumentationRuntimeInstance {
Index: source/Commands/CommandObjectMemory.cpp
===================================================================
--- source/Commands/CommandObjectMemory.cpp
+++ source/Commands/CommandObjectMemory.cpp
@@ -36,7 +36,6 @@
 #include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Symbol/SymbolFile.h"
 #include "lldb/Symbol/TypeList.h"
-#include "lldb/Target/MemoryHistory.h"
 #include "lldb/Target/MemoryRegionInfo.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/StackFrame.h"
@@ -1645,16 +1644,16 @@
     Stream *output_stream = &result.GetOutputStream();
 
     const ProcessSP &process_sp = m_exe_ctx.GetProcessSP();
-    const MemoryHistorySP &memory_history =
-        MemoryHistory::FindPlugin(process_sp);
+    const InstrumentationRuntimeSP &runtime =
+        InstrumentationRuntime::FindMemoryHistoryPlugin(process_sp);
 
-    if (!memory_history) {
+    if (!runtime) {
       result.AppendError("no available memory history provider");
       result.SetStatus(eReturnStatusFailed);
       return false;
     }
 
-    HistoryThreads thread_list = memory_history->GetHistoryThreads(addr);
+    HistoryThreads thread_list = runtime->GetHistoryThreads(addr);
 
     const bool stop_format = false;
     for (auto thread : thread_list) {
Index: source/API/SystemInitializerFull.cpp
===================================================================
--- source/API/SystemInitializerFull.cpp
+++ source/API/SystemInitializerFull.cpp
@@ -64,7 +64,6 @@
 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h"
 #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h"
 #include "Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.h"
-#include "Plugins/MemoryHistory/asan/MemoryHistoryASan.h"
 #include "Plugins/OperatingSystem/Go/OperatingSystemGo.h"
 #include "Plugins/OperatingSystem/Python/OperatingSystemPython.h"
 #include "Plugins/Platform/Android/PlatformAndroid.h"
@@ -305,7 +304,6 @@
   JITLoaderGDB::Initialize();
   ProcessElfCore::Initialize();
   minidump::ProcessMinidump::Initialize();
-  MemoryHistoryASan::Initialize();
   AddressSanitizerRuntime::Initialize();
   ThreadSanitizerRuntime::Initialize();
 
@@ -428,7 +426,6 @@
   JITLoaderGDB::Terminate();
   ProcessElfCore::Terminate();
   minidump::ProcessMinidump::Terminate();
-  MemoryHistoryASan::Terminate();
   AddressSanitizerRuntime::Terminate();
   ThreadSanitizerRuntime::Terminate();
   SymbolVendorELF::Terminate();
Index: lldb.xcodeproj/project.pbxproj
===================================================================
--- lldb.xcodeproj/project.pbxproj
+++ lldb.xcodeproj/project.pbxproj
@@ -768,8 +768,6 @@
 		6D9AB3DD1BB2B74E003F2289 /* TypeMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */; };
 		6DEC6F391BD66D750091ABA6 /* TaskPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DEC6F381BD66D750091ABA6 /* TaskPool.cpp */; };
 		8C26C4261C3EA5F90031DF7C /* ThreadSanitizerRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C26C4241C3EA4340031DF7C /* ThreadSanitizerRuntime.cpp */; };
-		8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; };
-		8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; };
 		8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; };
 		8CCB018219BA4E270009FD44 /* SBThreadCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCB018119BA4E210009FD44 /* SBThreadCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		8CCB018319BA51BF0009FD44 /* SBThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017F19BA4DD00009FD44 /* SBThreadCollection.cpp */; };
@@ -2615,10 +2613,6 @@
 		6DEC6F3A1BD66D950091ABA6 /* TaskPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TaskPool.h; path = include/lldb/Utility/TaskPool.h; sourceTree = "<group>"; };
 		8C26C4241C3EA4340031DF7C /* ThreadSanitizerRuntime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadSanitizerRuntime.cpp; path = ThreadSanitizer/ThreadSanitizerRuntime.cpp; sourceTree = "<group>"; };
 		8C26C4251C3EA4340031DF7C /* ThreadSanitizerRuntime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ThreadSanitizerRuntime.h; path = ThreadSanitizer/ThreadSanitizerRuntime.h; sourceTree = "<group>"; };
-		8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryHistory.cpp; path = source/Target/MemoryHistory.cpp; sourceTree = "<group>"; };
-		8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = "<group>"; };
-		8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = "<group>"; };
-		8C2D6A5B197A1FDC006989C9 /* MemoryHistoryASan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryHistoryASan.h; sourceTree = "<group>"; };
 		8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadCollection.cpp; path = source/Target/ThreadCollection.cpp; sourceTree = "<group>"; };
 		8CCB017C19BA289B0009FD44 /* ThreadCollection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ThreadCollection.h; path = include/lldb/Target/ThreadCollection.h; sourceTree = "<group>"; };
 		8CCB017F19BA4DD00009FD44 /* SBThreadCollection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SBThreadCollection.cpp; path = source/API/SBThreadCollection.cpp; sourceTree = "<group>"; };
@@ -3549,7 +3543,6 @@
 			isa = PBXGroup;
 			children = (
 				8CF02ADD19DCBEC200B14BE0 /* InstrumentationRuntime */,
-				8C2D6A58197A1FB9006989C9 /* MemoryHistory */,
 				26DB3E051379E7AD0080DC73 /* ABI */,
 				260C897210F57C5600BB2B04 /* Disassembler */,
 				260C897810F57C5600BB2B04 /* DynamicLoader */,
@@ -5206,8 +5199,6 @@
 				4CB4430A12491DDA00C13DC2 /* LanguageRuntime.cpp */,
 				2690B36F1381D5B600ECFBAE /* Memory.h */,
 				2690B3701381D5C300ECFBAE /* Memory.cpp */,
-				8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */,
-				8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */,
 				2360092C193FB21500189DB1 /* MemoryRegionInfo.h */,
 				2654A6811E54D5A200DA1013 /* ModuleCache.h */,
 				2654A67F1E54D59400DA1013 /* ModuleCache.cpp */,
@@ -5929,23 +5920,6 @@
 			name = ThreadSanitizer;
 			sourceTree = "<group>";
 		};
-		8C2D6A58197A1FB9006989C9 /* MemoryHistory */ = {
-			isa = PBXGroup;
-			children = (
-				8C2D6A59197A1FCD006989C9 /* asan */,
-			);
-			path = MemoryHistory;
-			sourceTree = "<group>";
-		};
-		8C2D6A59197A1FCD006989C9 /* asan */ = {
-			isa = PBXGroup;
-			children = (
-				8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */,
-				8C2D6A5B197A1FDC006989C9 /* MemoryHistoryASan.h */,
-			);
-			path = asan;
-			sourceTree = "<group>";
-		};
 		8CF02ADD19DCBEC200B14BE0 /* InstrumentationRuntime */ = {
 			isa = PBXGroup;
 			children = (
@@ -7176,7 +7150,6 @@
 				2689005B13353E0400698AC0 /* ValueObjectRegister.cpp in Sources */,
 				2689005C13353E0400698AC0 /* ValueObjectVariable.cpp in Sources */,
 				264A58EE1A7DBCAD00A6B1B0 /* OptionValueFormatEntity.cpp in Sources */,
-				8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */,
 				6D95DC021B9DC057000E318A /* SymbolFileDWARFDwo.cpp in Sources */,
 				942612F71B95000000EF842E /* LanguageCategory.cpp in Sources */,
 				2689005D13353E0400698AC0 /* VMRange.cpp in Sources */,
@@ -7483,7 +7456,6 @@
 				26DB3E161379E7AD0080DC73 /* ABIMacOSX_arm.cpp in Sources */,
 				26DB3E191379E7AD0080DC73 /* ABIMacOSX_arm64.cpp in Sources */,
 				2374D7531D4BB2FF005C9575 /* GDBRemoteClientBase.cpp in Sources */,
-				8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */,
 				26F006561B4DD86700B872E5 /* DynamicLoaderWindowsDYLD.cpp in Sources */,
 				26DB3E1C1379E7AD0080DC73 /* ABIMacOSX_i386.cpp in Sources */,
 				26DB3E1F1379E7AD0080DC73 /* ABISysV_x86_64.cpp in Sources */,
Index: include/lldb/lldb-private-interfaces.h
===================================================================
--- include/lldb/lldb-private-interfaces.h
+++ include/lldb/lldb-private-interfaces.h
@@ -88,8 +88,6 @@
     ThreadPlan *current_plan, Flags &flags, lldb::FrameComparison operation,
     void *baton);
 typedef UnwindAssembly *(*UnwindAssemblyCreateInstance)(const ArchSpec &arch);
-typedef lldb::MemoryHistorySP (*MemoryHistoryCreateInstance)(
-    const lldb::ProcessSP &process_sp);
 typedef lldb::InstrumentationRuntimeType (*InstrumentationRuntimeGetType)();
 typedef lldb::InstrumentationRuntimeSP (*InstrumentationRuntimeCreateInstance)(
     const lldb::ProcessSP &process_sp);
Index: include/lldb/lldb-forward.h
===================================================================
--- include/lldb/lldb-forward.h
+++ include/lldb/lldb-forward.h
@@ -130,7 +130,6 @@
 class LogChannel;
 class Mangled;
 class Materializer;
-class MemoryHistory;
 class Module;
 class ModuleList;
 class ModuleSpec;
@@ -363,7 +362,6 @@
 typedef std::shared_ptr<lldb_private::Listener> ListenerSP;
 typedef std::weak_ptr<lldb_private::Listener> ListenerWP;
 typedef std::shared_ptr<lldb_private::LogChannel> LogChannelSP;
-typedef std::shared_ptr<lldb_private::MemoryHistory> MemoryHistorySP;
 typedef std::shared_ptr<lldb_private::MemoryRegionInfo> MemoryRegionInfoSP;
 typedef std::unique_ptr<lldb_private::MemoryRegionInfo> MemoryRegionInfoUP;
 typedef std::shared_ptr<lldb_private::Module> ModuleSP;
Index: include/lldb/Target/MemoryHistory.h
===================================================================
--- include/lldb/Target/MemoryHistory.h
+++ include/lldb/Target/MemoryHistory.h
@@ -1,38 +0,0 @@
-//===-- MemoryHistory.h ---------------------------------------------------*-
-//C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef liblldb_MemoryHistory_h_
-#define liblldb_MemoryHistory_h_
-
-// C Includes
-// C++ Includes
-#include <vector>
-
-// Other libraries and framework includes
-// Project includes
-#include "lldb/Core/PluginInterface.h"
-#include "lldb/lldb-private.h"
-#include "lldb/lldb-types.h"
-
-namespace lldb_private {
-
-typedef std::vector<lldb::ThreadSP> HistoryThreads;
-
-class MemoryHistory : public std::enable_shared_from_this<MemoryHistory>,
-                      public PluginInterface {
-public:
-  static lldb::MemoryHistorySP FindPlugin(const lldb::ProcessSP process);
-
-  virtual HistoryThreads GetHistoryThreads(lldb::addr_t address) = 0;
-};
-
-} // namespace lldb_private
-
-#endif // liblldb_MemoryHistory_h_
Index: include/lldb/Target/InstrumentationRuntime.h
===================================================================
--- include/lldb/Target/InstrumentationRuntime.h
+++ include/lldb/Target/InstrumentationRuntime.h
@@ -28,6 +28,8 @@
 typedef std::map<lldb::InstrumentationRuntimeType,
                  lldb::InstrumentationRuntimeSP>
     InstrumentationRuntimeCollection;
+  
+typedef std::vector<lldb::ThreadSP> HistoryThreads;
 
 class InstrumentationRuntime
     : public std::enable_shared_from_this<InstrumentationRuntime>,
@@ -93,6 +95,15 @@
 
   virtual lldb::ThreadCollectionSP
   GetBacktracesFromExtendedStopInfo(StructuredData::ObjectSP info);
+        
+  virtual bool CanProvideMemoryHistory() { return false; }
+  
+  virtual HistoryThreads GetHistoryThreads(lldb::addr_t address) {
+    return HistoryThreads();
+  }
+        
+  static lldb::InstrumentationRuntimeSP
+  FindMemoryHistoryPlugin(const lldb::ProcessSP process);
 };
 
 } // namespace lldb_private
Index: include/lldb/Core/PluginManager.h
===================================================================
--- include/lldb/Core/PluginManager.h
+++ include/lldb/Core/PluginManager.h
@@ -383,20 +383,6 @@
   GetUnwindAssemblyCreateCallbackForPluginName(const ConstString &name);
 
   //------------------------------------------------------------------
-  // MemoryHistory
-  //------------------------------------------------------------------
-  static bool RegisterPlugin(const ConstString &name, const char *description,
-                             MemoryHistoryCreateInstance create_callback);
-
-  static bool UnregisterPlugin(MemoryHistoryCreateInstance create_callback);
-
-  static MemoryHistoryCreateInstance
-  GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx);
-
-  static MemoryHistoryCreateInstance
-  GetMemoryHistoryCreateCallbackForPluginName(const ConstString &name);
-
-  //------------------------------------------------------------------
   // InstrumentationRuntime
   //------------------------------------------------------------------
   static bool
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATC... Kuba (Brecka) Mracek via Phabricator via lldb-commits

Reply via email to