1//===-- InstrumentationRuntime.cpp ------------------------------*- C++ -*-===//
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-exception
6//
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) -> bool {
53    const FileSpec &file_spec = module_sp->GetFileSpec();
54    if (!file_spec)
55      return true; // Keep iterating.
56
57    const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary();
58    if (runtime_regex.Execute(file_spec.GetFilename().GetCString()) ||
59        module_sp->IsExecutable()) {
60      if (CheckIfRuntimeIsValid(module_sp)) {
61        SetRuntimeModuleSP(module_sp);
62        Activate();
63        return false; // Stop iterating, we're done.
64      }
65    }
66
67    return true;
68  });
69}
70
71lldb::ThreadCollectionSP
72InstrumentationRuntime::GetBacktracesFromExtendedStopInfo(
73    StructuredData::ObjectSP info) {
74  return ThreadCollectionSP(new ThreadCollection());
75}
76