diff options
Diffstat (limited to 'lldb/source/Target/InstrumentationRuntime.cpp')
| -rw-r--r-- | lldb/source/Target/InstrumentationRuntime.cpp | 75 | 
1 files changed, 75 insertions, 0 deletions
diff --git a/lldb/source/Target/InstrumentationRuntime.cpp b/lldb/source/Target/InstrumentationRuntime.cpp new file mode 100644 index 0000000000000..4c2eb064fbb05 --- /dev/null +++ b/lldb/source/Target/InstrumentationRuntime.cpp @@ -0,0 +1,75 @@ +//===-- InstrumentationRuntime.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#include "lldb/Target/InstrumentationRuntime.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleList.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Target/Process.h" +#include "lldb/Utility/RegularExpression.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) { +  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. +      } +    } + +    return true; +  }); +} + +lldb::ThreadCollectionSP +InstrumentationRuntime::GetBacktracesFromExtendedStopInfo( +    StructuredData::ObjectSP info) { +  return ThreadCollectionSP(new ThreadCollection()); +}  | 
