1 | //===-- InstrumentationRuntime.h --------------------------------*- 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 | #ifndef LLDB_TARGET_INSTRUMENTATIONRUNTIME_H |
10 | #define LLDB_TARGET_INSTRUMENTATIONRUNTIME_H |
11 | |
12 | #include <map> |
13 | #include <vector> |
14 | |
15 | #include "lldb/Core/PluginInterface.h" |
16 | #include "lldb/Utility/StructuredData.h" |
17 | #include "lldb/lldb-forward.h" |
18 | #include "lldb/lldb-private.h" |
19 | #include "lldb/lldb-types.h" |
20 | |
21 | namespace lldb_private { |
22 | |
23 | typedef std::map<lldb::InstrumentationRuntimeType, |
24 | lldb::InstrumentationRuntimeSP> |
25 | InstrumentationRuntimeCollection; |
26 | |
27 | class InstrumentationRuntime |
28 | : public std::enable_shared_from_this<InstrumentationRuntime>, |
29 | public PluginInterface { |
30 | /// The instrumented process. |
31 | lldb::ProcessWP m_process_wp; |
32 | |
33 | /// The module containing the instrumentation runtime. |
34 | lldb::ModuleSP m_runtime_module; |
35 | |
36 | /// The breakpoint in the instrumentation runtime. |
37 | lldb::user_id_t m_breakpoint_id; |
38 | |
39 | /// Indicates whether or not breakpoints have been registered in the |
40 | /// instrumentation runtime. |
41 | bool m_is_active; |
42 | |
43 | protected: |
44 | InstrumentationRuntime(const lldb::ProcessSP &process_sp) |
45 | : m_breakpoint_id(0), m_is_active(false) { |
46 | if (process_sp) |
47 | m_process_wp = process_sp; |
48 | } |
49 | |
50 | lldb::ProcessSP GetProcessSP() { return m_process_wp.lock(); } |
51 | |
52 | lldb::ModuleSP GetRuntimeModuleSP() { return m_runtime_module; } |
53 | |
54 | void SetRuntimeModuleSP(lldb::ModuleSP module_sp) { |
55 | m_runtime_module = std::move(module_sp); |
56 | } |
57 | |
58 | lldb::user_id_t GetBreakpointID() const { return m_breakpoint_id; } |
59 | |
60 | void SetBreakpointID(lldb::user_id_t ID) { m_breakpoint_id = ID; } |
61 | |
62 | void SetActive(bool IsActive) { m_is_active = IsActive; } |
63 | |
64 | /// Return a regular expression which can be used to identify a valid version |
65 | /// of the runtime library. |
66 | virtual const RegularExpression &GetPatternForRuntimeLibrary() = 0; |
67 | |
68 | /// Check whether \p module_sp corresponds to a valid runtime library. |
69 | virtual bool CheckIfRuntimeIsValid(const lldb::ModuleSP module_sp) = 0; |
70 | |
71 | /// Register a breakpoint in the runtime library and perform any other |
72 | /// necessary initialization. The runtime library |
73 | /// is guaranteed to be loaded. |
74 | virtual void Activate() = 0; |
75 | |
76 | public: |
77 | static void ModulesDidLoad(lldb_private::ModuleList &module_list, |
78 | Process *process, |
79 | InstrumentationRuntimeCollection &runtimes); |
80 | |
81 | /// Look for the instrumentation runtime in \p module_list. Register and |
82 | /// activate the runtime if this hasn't already |
83 | /// been done. |
84 | void ModulesDidLoad(lldb_private::ModuleList &module_list); |
85 | |
86 | bool IsActive() const { return m_is_active; } |
87 | |
88 | virtual lldb::ThreadCollectionSP |
89 | GetBacktracesFromExtendedStopInfo(StructuredData::ObjectSP info); |
90 | }; |
91 | |
92 | } // namespace lldb_private |
93 | |
94 | #endif // LLDB_TARGET_INSTRUMENTATIONRUNTIME_H |
95 |