aboutsummaryrefslogtreecommitdiff
path: root/source/Target/InstrumentationRuntime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Target/InstrumentationRuntime.cpp')
-rw-r--r--source/Target/InstrumentationRuntime.cpp86
1 files changed, 54 insertions, 32 deletions
diff --git a/source/Target/InstrumentationRuntime.cpp b/source/Target/InstrumentationRuntime.cpp
index af7955f9c34b..f3bc145f8b4e 100644
--- a/source/Target/InstrumentationRuntime.cpp
+++ b/source/Target/InstrumentationRuntime.cpp
@@ -11,48 +11,70 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
-#include "lldb/lldb-private.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Core/PluginManager.h"
#include "lldb/Target/InstrumentationRuntime.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleList.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/RegularExpression.h"
+#include "lldb/Target/Process.h"
+#include "lldb/lldb-private.h"
using namespace lldb;
using namespace lldb_private;
-void
-InstrumentationRuntime::ModulesDidLoad(lldb_private::ModuleList &module_list, lldb_private::Process *process, InstrumentationRuntimeCollection &runtimes)
-{
- InstrumentationRuntimeCreateInstance create_callback = nullptr;
- InstrumentationRuntimeGetType get_type_callback;
- for (uint32_t idx = 0; ; ++idx)
- {
- create_callback = PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx);
- if (create_callback == nullptr)
- break;
- get_type_callback = PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);
- InstrumentationRuntimeType type = get_type_callback();
-
- InstrumentationRuntimeCollection::iterator pos;
- pos = runtimes.find (type);
- if (pos == runtimes.end()) {
- runtimes[type] = create_callback(process->shared_from_this());
- }
+void InstrumentationRuntime::ModulesDidLoad(
+ lldb_private::ModuleList &module_list, lldb_private::Process *process,
+ InstrumentationRuntimeCollection &runtimes) {
+ InstrumentationRuntimeCreateInstance create_callback = nullptr;
+ InstrumentationRuntimeGetType get_type_callback;
+ for (uint32_t idx = 0;; ++idx) {
+ create_callback =
+ PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx);
+ if (create_callback == nullptr)
+ break;
+ get_type_callback =
+ PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);
+ InstrumentationRuntimeType type = get_type_callback();
+
+ InstrumentationRuntimeCollection::iterator pos;
+ pos = runtimes.find(type);
+ if (pos == runtimes.end()) {
+ runtimes[type] = create_callback(process->shared_from_this());
}
+ }
}
-void
-InstrumentationRuntime::ModulesDidLoad(lldb_private::ModuleList &module_list)
-{
-}
+void InstrumentationRuntime::ModulesDidLoad(
+ lldb_private::ModuleList &module_list) {
+ if (IsActive())
+ return;
+
+ if (GetRuntimeModuleSP()) {
+ Activate();
+ return;
+ }
+
+ module_list.ForEach([this](const lldb::ModuleSP module_sp) -> bool {
+ const FileSpec &file_spec = module_sp->GetFileSpec();
+ if (!file_spec)
+ return true; // Keep iterating.
+
+ const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary();
+ if (runtime_regex.Execute(file_spec.GetFilename().GetCString()) ||
+ module_sp->IsExecutable()) {
+ if (CheckIfRuntimeIsValid(module_sp)) {
+ SetRuntimeModuleSP(module_sp);
+ Activate();
+ return false; // Stop iterating, we're done.
+ }
+ }
-bool
-InstrumentationRuntime::IsActive()
-{
- return false;
+ return true;
+ });
}
lldb::ThreadCollectionSP
-InstrumentationRuntime::GetBacktracesFromExtendedStopInfo(StructuredData::ObjectSP info)
-{
- return ThreadCollectionSP(new ThreadCollection());
+InstrumentationRuntime::GetBacktracesFromExtendedStopInfo(
+ StructuredData::ObjectSP info) {
+ return ThreadCollectionSP(new ThreadCollection());
}