diff options
author | Jason Molenda <jmolenda@apple.com> | 2013-11-05 03:57:19 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2013-11-05 03:57:19 +0000 |
commit | eef510667b18263f59da78f7614ecf6bc07802a7 (patch) | |
tree | a110d7f9472f59a127cbb71a3019311661243e03 | |
parent | d6b40b51c7e520cb08e86cad64e56d92a645ffc6 (diff) | |
download | bcm5719-llvm-eef510667b18263f59da78f7614ecf6bc07802a7.tar.gz bcm5719-llvm-eef510667b18263f59da78f7614ecf6bc07802a7.zip |
Add a new system runtime plugin type - just the top level
class, not any actual plugin implementation yet.
<rdar://problem/15314068>
llvm-svn: 194044
-rw-r--r-- | lldb/include/lldb/Core/PluginManager.h | 18 | ||||
-rw-r--r-- | lldb/include/lldb/Target/Process.h | 13 | ||||
-rw-r--r-- | lldb/include/lldb/Target/SystemRuntime.h | 121 | ||||
-rw-r--r-- | lldb/include/lldb/lldb-forward.h | 2 | ||||
-rw-r--r-- | lldb/include/lldb/lldb-private-interfaces.h | 1 | ||||
-rw-r--r-- | lldb/lldb.xcodeproj/project.pbxproj | 4 | ||||
-rw-r--r-- | lldb/source/Core/PluginManager.cpp | 105 | ||||
-rw-r--r-- | lldb/source/Target/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 25 | ||||
-rw-r--r-- | lldb/source/Target/SystemRuntime.cpp | 67 | ||||
-rw-r--r-- | lldb/source/Target/Target.cpp | 9 |
11 files changed, 365 insertions, 1 deletions
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 91f8fbb997f..e02f43f4fa8 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -132,6 +132,24 @@ public: //------------------------------------------------------------------ + // SystemRuntime + //------------------------------------------------------------------ + static bool + RegisterPlugin (const ConstString &name, + const char *description, + SystemRuntimeCreateInstance create_callback); + + static bool + UnregisterPlugin (SystemRuntimeCreateInstance create_callback); + + static SystemRuntimeCreateInstance + GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx); + + static SystemRuntimeCreateInstance + GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name); + + + //------------------------------------------------------------------ // ObjectFile //------------------------------------------------------------------ static bool diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 65c732851da..aa7b5edc5af 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1757,7 +1757,7 @@ public: error.SetErrorStringWithFormat("error: %s does not support loading core files.", GetPluginName().GetCString()); return error; } - + //------------------------------------------------------------------ /// Get the dynamic loader plug-in for this process. /// @@ -1771,6 +1771,16 @@ public: GetDynamicLoader (); //------------------------------------------------------------------ + /// Get the system runtime plug-in for this process. + /// + /// @return + /// Returns a pointer to the SystemRuntime plugin for this Process + /// if one is available. Else returns NULL. + //------------------------------------------------------------------ + virtual SystemRuntime * + GetSystemRuntime (); + + //------------------------------------------------------------------ /// Attach to an existing process using the process attach info. /// /// This function is not meant to be overridden by Process @@ -3667,6 +3677,7 @@ protected: std::unique_ptr<DynamicLoader> m_dyld_ap; std::unique_ptr<DynamicCheckerFunctions> m_dynamic_checkers_ap; ///< The functions used by the expression parser to validate data that expressions use. std::unique_ptr<OperatingSystem> m_os_ap; + std::unique_ptr<SystemRuntime> m_system_runtime_ap; UnixSignals m_unix_signals; /// This is the current signal set for this process. lldb::ABISP m_abi_sp; lldb::InputReaderSP m_process_input_reader; diff --git a/lldb/include/lldb/Target/SystemRuntime.h b/lldb/include/lldb/Target/SystemRuntime.h new file mode 100644 index 00000000000..7a7f1a721b1 --- /dev/null +++ b/lldb/include/lldb/Target/SystemRuntime.h @@ -0,0 +1,121 @@ +//===-- SystemRuntime.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_SystemRuntime_h_ +#define liblldb_SystemRuntime_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-public.h" +#include "lldb/Core/ModuleList.h" +#include "lldb/Core/PluginInterface.h" +#include "lldb/lldb-private.h" + + +namespace lldb_private { + +//---------------------------------------------------------------------- +/// @class SystemRuntime SystemRuntime.h "lldb/Target/SystemRuntime.h" +/// @brief A plug-in interface definition class for system runtimes. +/// +/// The system runtime plugins can collect information from the system +/// libraries during a Process' lifetime and provide information about +/// how objects/threads were originated. +/// +/// For instance, a system runtime plugin use a breakpoint when threads +/// are created to record the backtrace of where that thread was created. +/// Later, when backtracing the created thread, it could extend the backtrace +/// to show where it was originally created from. +/// +/// The plugin will insert its own breakpoint when Created and start collecting +/// information. Later when it comes time to augment a Thread, it can be +/// asked to provide that information. +/// +//---------------------------------------------------------------------- + +class SystemRuntime : + public PluginInterface +{ +public: + //------------------------------------------------------------------ + /// Find a system runtime plugin for a given process. + /// + /// Scans the installed SystemRuntime plugins and tries to find + /// an instance that can be used to track image changes in \a + /// process. + /// + /// @param[in] process + /// The process for which to try and locate a system runtime + /// plugin instance. + //------------------------------------------------------------------ + static SystemRuntime* + FindPlugin (Process *process); + + //------------------------------------------------------------------ + /// Construct with a process. + // ----------------------------------------------------------------- + SystemRuntime(lldb_private::Process *process); + + //------------------------------------------------------------------ + /// Destructor. + /// + /// The destructor is virtual since this class is designed to be + /// inherited by the plug-in instance. + //------------------------------------------------------------------ + virtual + ~SystemRuntime(); + + //------------------------------------------------------------------ + /// Called after attaching to a process. + /// + /// Allow the SystemRuntime plugin to execute some code after attaching + /// to a process. + //------------------------------------------------------------------ + virtual void + DidAttach (); + + //------------------------------------------------------------------ + /// Called after launching a process. + /// + /// Allow the SystemRuntime plugin to execute some code after launching + /// a process. + //------------------------------------------------------------------ + virtual void + DidLaunch(); + + //------------------------------------------------------------------ + /// Called when modules have been loaded in the process. + /// + /// Allow the SystemRuntime plugin to enable logging features in the + /// system runtime libraries. + //------------------------------------------------------------------ + virtual void + ModulesDidLoad(lldb_private::ModuleList &module_list); + + //------------------------------------------------------------------ + /// Call this method to print the backtrace of where this thread was + /// enqueued, if at all. Returns the number of frames printed. + //------------------------------------------------------------------ + virtual uint32_t + GetStatus (lldb_private::Stream &strm, lldb_private::ExecutionContext &exe_ctx); + +protected: + //------------------------------------------------------------------ + // Member variables. + //------------------------------------------------------------------ + Process *m_process; +private: + DISALLOW_COPY_AND_ASSIGN (SystemRuntime); +}; + +} // namespace lldb_private + +#endif // liblldb_SystemRuntime_h_ diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index ee59e0e2892..cd8a5c2e813 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -106,6 +106,7 @@ class Instruction; class InstructionList; class IRExecutionUnit; class LanguageRuntime; +class SystemRuntime; class LineTable; class Listener; class Log; @@ -297,6 +298,7 @@ namespace lldb { typedef std::shared_ptr<lldb_private::InputReader> InputReaderSP; typedef std::shared_ptr<lldb_private::Instruction> InstructionSP; typedef std::shared_ptr<lldb_private::LanguageRuntime> LanguageRuntimeSP; + typedef std::shared_ptr<lldb_private::SystemRuntime> SystemRuntimeSP; typedef std::shared_ptr<lldb_private::LineTable> LineTableSP; typedef std::shared_ptr<lldb_private::Listener> ListenerSP; typedef std::shared_ptr<lldb_private::LogChannel> LogChannelSP; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 949cafed98b..5a2da8989f3 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -27,6 +27,7 @@ namespace lldb_private typedef EmulateInstruction * (*EmulateInstructionCreateInstance) (const ArchSpec &arch, InstructionType inst_type); typedef OperatingSystem* (*OperatingSystemCreateInstance) (Process *process, bool force); typedef LanguageRuntime *(*LanguageRuntimeCreateInstance) (Process *process, lldb::LanguageType language); + typedef SystemRuntime *(*SystemRuntimeCreateInstance) (Process *process); typedef Platform* (*PlatformCreateInstance) (bool force, const ArchSpec *arch); typedef lldb::ProcessSP (*ProcessCreateInstance) (Target &target, Listener &listener, const FileSpec *crash_file_path); typedef SymbolFile* (*SymbolFileCreateInstance) (ObjectFile* obj_file); diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 19b374c376e..53bc56c16a9 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -602,6 +602,7 @@ AF254E31170CCC33007AE5C9 /* PlatformDarwinKernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF254E2F170CCC33007AE5C9 /* PlatformDarwinKernel.cpp */; }; AF254E32170CCC33007AE5C9 /* PlatformDarwinKernel.h in Headers */ = {isa = PBXBuildFile; fileRef = AF254E30170CCC33007AE5C9 /* PlatformDarwinKernel.h */; }; AF37E10A17C861F20061E18E /* ProcessRunLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF37E10917C861F20061E18E /* ProcessRunLock.cpp */; }; + AF81DEFA1828A23F0042CF19 /* SystemRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF81DEF91828A23F0042CF19 /* SystemRuntime.cpp */; }; AF90106515AB7D3600FF120D /* lldb.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF90106315AB7C5700FF120D /* lldb.1 */; }; AFF87C87150FF669000E1742 /* com.apple.debugserver.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = AFF87C86150FF669000E1742 /* com.apple.debugserver.plist */; }; AFF87C89150FF672000E1742 /* com.apple.debugserver-secure.plist in CopyFiles */ = {isa = PBXBuildFile; fileRef = AFF87C88150FF672000E1742 /* com.apple.debugserver-secure.plist */; }; @@ -1743,6 +1744,7 @@ AF68D2551255416E002FF25B /* RegisterContextLLDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextLLDB.h; path = Utility/RegisterContextLLDB.h; sourceTree = "<group>"; }; AF68D32F1255A110002FF25B /* UnwindLLDB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = UnwindLLDB.cpp; path = Utility/UnwindLLDB.cpp; sourceTree = "<group>"; }; AF68D3301255A110002FF25B /* UnwindLLDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UnwindLLDB.h; path = Utility/UnwindLLDB.h; sourceTree = "<group>"; }; + AF81DEF91828A23F0042CF19 /* SystemRuntime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SystemRuntime.cpp; path = source/Target/SystemRuntime.cpp; sourceTree = "<group>"; }; AF90106315AB7C5700FF120D /* lldb.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = lldb.1; path = docs/lldb.1; sourceTree = "<group>"; }; AF94005711C03F6500085DB9 /* SymbolVendor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SymbolVendor.cpp; path = source/Symbol/SymbolVendor.cpp; sourceTree = "<group>"; }; AFF87C86150FF669000E1742 /* com.apple.debugserver.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.apple.debugserver.plist; path = tools/debugserver/source/com.apple.debugserver.plist; sourceTree = "<group>"; }; @@ -3110,6 +3112,7 @@ 26BC7F3A10F1B90C00F91463 /* StackID.cpp */, 2615DB841208A9C90021781D /* StopInfo.h */, 2615DB861208A9E40021781D /* StopInfo.cpp */, + AF81DEF91828A23F0042CF19 /* SystemRuntime.cpp */, 26BC7DF810F1B81A00F91463 /* Target.h */, 26BC7F3B10F1B90C00F91463 /* Target.cpp */, 26BC7DF910F1B81A00F91463 /* TargetList.h */, @@ -4266,6 +4269,7 @@ 26ECA04313665FED008D1F18 /* ARM_DWARF_Registers.cpp in Sources */, 267C012B136880DF006E963E /* OptionGroupValueObjectDisplay.cpp in Sources */, 26BCFC521368AE38006DC050 /* OptionGroupFormat.cpp in Sources */, + AF81DEFA1828A23F0042CF19 /* SystemRuntime.cpp in Sources */, 267C01371368C49C006E963E /* OptionGroupOutputFile.cpp in Sources */, 260E07C6136FA69E00CF21D3 /* OptionGroupUUID.cpp in Sources */, 260E07C8136FAB9200CF21D3 /* OptionGroupFile.cpp in Sources */, diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 7a2d3772e6c..813cec22752 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -854,6 +854,111 @@ PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString return NULL; } +#pragma mark SystemRuntime + + +struct SystemRuntimeInstance +{ + SystemRuntimeInstance() : + name(), + description(), + create_callback(NULL) + { + } + + ConstString name; + std::string description; + SystemRuntimeCreateInstance create_callback; +}; + +typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances; + +static Mutex & +GetSystemRuntimeMutex () +{ + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static SystemRuntimeInstances & +GetSystemRuntimeInstances () +{ + static SystemRuntimeInstances g_instances; + return g_instances; +} + +bool +PluginManager::RegisterPlugin +( + const ConstString &name, + const char *description, + SystemRuntimeCreateInstance create_callback +) +{ + if (create_callback) + { + SystemRuntimeInstance instance; + assert ((bool)name); + instance.name = name; + if (description && description[0]) + instance.description = description; + instance.create_callback = create_callback; + Mutex::Locker locker (GetSystemRuntimeMutex ()); + GetSystemRuntimeInstances ().push_back (instance); + } + return false; +} + +bool +PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback) +{ + if (create_callback) + { + Mutex::Locker locker (GetSystemRuntimeMutex ()); + SystemRuntimeInstances &instances = GetSystemRuntimeInstances (); + + SystemRuntimeInstances::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; +} + +SystemRuntimeCreateInstance +PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx) +{ + Mutex::Locker locker (GetSystemRuntimeMutex ()); + SystemRuntimeInstances &instances = GetSystemRuntimeInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; + return NULL; +} + +SystemRuntimeCreateInstance +PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name) +{ + if (name) + { + Mutex::Locker locker (GetSystemRuntimeMutex ()); + SystemRuntimeInstances &instances = GetSystemRuntimeInstances (); + + SystemRuntimeInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (name == pos->name) + return pos->create_callback; + } + } + return NULL; +} + + #pragma mark ObjectFile struct ObjectFileInstance diff --git a/lldb/source/Target/CMakeLists.txt b/lldb/source/Target/CMakeLists.txt index 29f9bcddc42..6e211ff1de4 100644 --- a/lldb/source/Target/CMakeLists.txt +++ b/lldb/source/Target/CMakeLists.txt @@ -19,6 +19,7 @@ add_lldb_library(lldbTarget StackFrameList.cpp StackID.cpp StopInfo.cpp + SystemRuntime.cpp Target.cpp TargetList.cpp Thread.cpp diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index fcab7aff4a9..d5d1456d2a5 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -35,6 +35,7 @@ #include "lldb/Target/Platform.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StopInfo.h" +#include "lldb/Target/SystemRuntime.h" #include "lldb/Target/Target.h" #include "lldb/Target/TargetList.h" #include "lldb/Target/Thread.h" @@ -1143,6 +1144,7 @@ Process::Finalize() m_dynamic_checkers_ap.reset(); m_abi_sp.reset(); m_os_ap.reset(); + m_system_runtime_ap.reset(); m_dyld_ap.reset(); m_thread_list_real.Destroy(); m_thread_list.Destroy(); @@ -2876,6 +2878,7 @@ Process::Launch (const ProcessLaunchInfo &launch_info) Error error; m_abi_sp.reset(); m_dyld_ap.reset(); + m_system_runtime_ap.reset(); m_os_ap.reset(); m_process_input_reader.reset(); @@ -2944,6 +2947,10 @@ Process::Launch (const ProcessLaunchInfo &launch_info) if (dyld) dyld->DidLaunch(); + SystemRuntime *system_runtime = GetSystemRuntime (); + if (system_runtime) + system_runtime->DidLaunch(); + m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); // This delays passing the stopped event to listeners till DidLaunch gets // a chance to complete... @@ -2987,6 +2994,10 @@ Process::LoadCore () if (dyld) dyld->DidAttach(); + SystemRuntime *system_runtime = GetSystemRuntime (); + if (system_runtime) + system_runtime->DidAttach(); + m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); // We successfully loaded a core file, now pretend we stopped so we can // show all of the threads in the core file and explore the crashed @@ -3005,6 +3016,14 @@ Process::GetDynamicLoader () return m_dyld_ap.get(); } +SystemRuntime * +Process::GetSystemRuntime () +{ + if (m_system_runtime_ap.get() == NULL) + m_system_runtime_ap.reset (SystemRuntime::FindPlugin(this)); + return m_system_runtime_ap.get(); +} + Process::NextEventAction::EventActionResult Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) @@ -3067,6 +3086,7 @@ Process::Attach (ProcessAttachInfo &attach_info) m_abi_sp.reset(); m_process_input_reader.reset(); m_dyld_ap.reset(); + m_system_runtime_ap.reset(); m_os_ap.reset(); lldb::pid_t attach_pid = attach_info.GetProcessID(); @@ -3239,6 +3259,10 @@ Process::CompleteAttach () if (dyld) dyld->DidAttach(); + SystemRuntime *system_runtime = GetSystemRuntime (); + if (system_runtime) + system_runtime->DidAttach(); + m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); // Figure out which one is the executable, and set that in our target: const ModuleList &target_modules = m_target.GetImages(); @@ -5614,6 +5638,7 @@ Process::DidExec () target.GetSectionLoadList().Clear(); m_dynamic_checkers_ap.reset(); m_abi_sp.reset(); + m_system_runtime_ap.reset(); m_os_ap.reset(); m_dyld_ap.reset(); m_image_tokens.clear(); diff --git a/lldb/source/Target/SystemRuntime.cpp b/lldb/source/Target/SystemRuntime.cpp new file mode 100644 index 00000000000..ceec6b61168 --- /dev/null +++ b/lldb/source/Target/SystemRuntime.cpp @@ -0,0 +1,67 @@ +//===-- SystemRuntime.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/lldb-private.h" +#include "lldb/Target/SystemRuntime.h" +#include "lldb/Target/Process.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb; +using namespace lldb_private; + +SystemRuntime* +SystemRuntime::FindPlugin (Process *process) +{ + SystemRuntimeCreateInstance create_callback = NULL; + for (uint32_t idx = 0; (create_callback = PluginManager::GetSystemRuntimeCreateCallbackAtIndex(idx)) != NULL; ++idx) + { + std::unique_ptr<SystemRuntime> instance_ap(create_callback(process)); + if (instance_ap.get()) + return instance_ap.release(); + } + return NULL; +} + + +//---------------------------------------------------------------------- +// SystemRuntime constructor +//---------------------------------------------------------------------- +SystemRuntime::SystemRuntime(Process *process) : + m_process (process) +{ +} + +//---------------------------------------------------------------------- +// Destructor +//---------------------------------------------------------------------- +SystemRuntime::~SystemRuntime() +{ +} + +void +SystemRuntime::DidAttach () +{ +} + +void +SystemRuntime::DidLaunch() +{ +} + +void +SystemRuntime::ModulesDidLoad (ModuleList &module_list) +{ +} + +uint32_t +SystemRuntime::GetStatus (Stream &strm, ExecutionContext &exe_ctx) +{ + return 0; +} + diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index f93ae502fd7..c512a05279c 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -43,6 +43,7 @@ #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" +#include "lldb/Target/SystemRuntime.h" #include "lldb/Target/Thread.h" #include "lldb/Target/ThreadSpec.h" @@ -1155,6 +1156,14 @@ Target::ModulesDidLoad (ModuleList &module_list) if (module_list.GetSize()) { m_breakpoint_list.UpdateBreakpoints (module_list, true); + if (m_process_sp) + { + SystemRuntime *sys_runtime = m_process_sp->GetSystemRuntime(); + if (sys_runtime) + { + sys_runtime->ModulesDidLoad (module_list); + } + } // TODO: make event data that packages up the module_list BroadcastEvent (eBroadcastBitModulesLoaded, NULL); } |