79 lines · cpp
1//===-- InstrumentationRuntime.cpp ----------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===---------------------------------------------------------------------===//8 9#include "lldb/Target/InstrumentationRuntime.h"10#include "lldb/Core/Module.h"11#include "lldb/Core/ModuleList.h"12#include "lldb/Core/PluginManager.h"13#include "lldb/Target/Process.h"14#include "lldb/Utility/RegularExpression.h"15#include "lldb/lldb-private.h"16 17using namespace lldb;18using namespace lldb_private;19 20void InstrumentationRuntime::ModulesDidLoad(21 lldb_private::ModuleList &module_list, lldb_private::Process *process,22 InstrumentationRuntimeCollection &runtimes) {23 InstrumentationRuntimeCreateInstance create_callback = nullptr;24 InstrumentationRuntimeGetType get_type_callback;25 for (uint32_t idx = 0;; ++idx) {26 create_callback =27 PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx);28 if (create_callback == nullptr)29 break;30 get_type_callback =31 PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);32 InstrumentationRuntimeType type = get_type_callback();33 34 InstrumentationRuntimeCollection::iterator pos;35 pos = runtimes.find(type);36 if (pos == runtimes.end()) {37 runtimes[type] = create_callback(process->shared_from_this());38 }39 }40}41 42void InstrumentationRuntime::ModulesDidLoad(43 lldb_private::ModuleList &module_list) {44 if (IsActive())45 return;46 47 if (GetRuntimeModuleSP()) {48 Activate();49 return;50 }51 52 module_list.ForEach([this](const lldb::ModuleSP module_sp) {53 const FileSpec &file_spec = module_sp->GetFileSpec();54 if (!file_spec)55 return IterationAction::Continue;56 57 const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary();58 if (MatchAllModules() ||59 runtime_regex.Execute(file_spec.GetFilename().GetCString()) ||60 module_sp->IsExecutable()) {61 if (CheckIfRuntimeIsValid(module_sp)) {62 SetRuntimeModuleSP(module_sp);63 Activate();64 if (!IsActive())65 SetRuntimeModuleSP({}); // Don't cache module if activation failed.66 return IterationAction::Stop;67 }68 }69 70 return IterationAction::Continue;71 });72}73 74lldb::ThreadCollectionSP75InstrumentationRuntime::GetBacktracesFromExtendedStopInfo(76 StructuredData::ObjectSP info) {77 return std::make_shared<ThreadCollection>();78}79