brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · d9800a8 Raw
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