LLDB mainline
LanguageRuntime.h
Go to the documentation of this file.
1//===-- LanguageRuntime.h ---------------------------------------------------*-
2// C++ -*-===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLDB_TARGET_LANGUAGERUNTIME_H
11#define LLDB_TARGET_LANGUAGERUNTIME_H
12
16#include "lldb/Core/Value.h"
20#include "lldb/Target/Runtime.h"
22#include "lldb/lldb-private.h"
23#include "lldb/lldb-public.h"
24#include <optional>
25
26namespace lldb_private {
27
29public:
31 lldb::LanguageType language,
32 bool update_module_list = true);
33
34 ~ExceptionSearchFilter() override = default;
35
36 bool ModulePasses(const lldb::ModuleSP &module_sp) override;
37
38 bool ModulePasses(const FileSpec &spec) override;
39
40 void Search(Searcher &searcher) override;
41
42 void GetDescription(Stream *s) override;
43
44 static SearchFilter *
46 const StructuredData::Dictionary &data_dict,
47 Status &error);
48
50
51protected:
55
57
59};
60
61class LanguageRuntime : public Runtime, public PluginInterface {
62public:
63 static LanguageRuntime *FindPlugin(Process *process,
64 lldb::LanguageType language);
65
66 static void InitializeCommands(CommandObject *parent);
67
69
70 /// Return the preferred language runtime instance, which in most cases will
71 /// be the current instance.
73 return nullptr;
74 }
75
76 virtual llvm::Error GetObjectDescription(Stream &str,
77 ValueObject &object) = 0;
78
79 virtual llvm::Error
81 ExecutionContextScope *exe_scope) = 0;
82
83 struct VTableInfo {
84 Address addr; /// Address of the vtable's virtual function table
85 Symbol *symbol; /// The vtable symbol from the symbol table
86 };
87 /// Get the vtable information for a given value.
88 ///
89 /// \param[in] in_value
90 /// The value object to try and extract the VTableInfo from.
91 ///
92 /// \param[in] check_type
93 /// If true, the compiler type of \a in_value will be checked to see if
94 /// it is an instance to, or pointer or reference to a class or struct
95 /// that has a vtable. If the type doesn't meet the requirements, an
96 /// error will be returned explaining why the type isn't suitable.
97 ///
98 /// \return
99 /// An error if anything goes wrong while trying to extract the vtable
100 /// or if \a check_type is true and the type doesn't have a vtable.
101 virtual llvm::Expected<VTableInfo> GetVTableInfo(ValueObject &in_value,
102 bool check_type) {
103 return llvm::createStringError(
104 std::errc::invalid_argument,
105 "language doesn't support getting vtable information");
106 }
107
108 /// This call should return true if it could set the name and/or the type
109 /// Sets address to the address of the dynamic type if value_type is set to
110 /// a file or load address. Sets local_buffer to a buffer containing the data
111 /// of the dynamic type if value_type is set to a host address. Callers should
112 /// copy local_buffer over into their own buffer if they want to keep the data
113 /// alive.
115 ValueObject &in_value, lldb::DynamicValueType use_dynamic,
116 TypeAndOrName &class_type_or_name, Address &address,
117 Value::ValueType &value_type, llvm::ArrayRef<uint8_t> &local_buffer) = 0;
118
119 // This call should return a CompilerType given a generic type name and an
120 // ExecutionContextScope in which one can actually fetch any specialization
121 // information required.
123 ConstString abstract_type_name) {
124 return CompilerType();
125 }
126
127 // This should be a fast test to determine whether it is likely that this
128 // value would have a dynamic type.
129 virtual bool CouldHaveDynamicValue(ValueObject &in_value) = 0;
130
131 // The contract for GetDynamicTypeAndAddress() is to return a "bare-bones"
132 // dynamic type For instance, given a Base* pointer,
133 // GetDynamicTypeAndAddress() will return the type of Derived, not Derived*.
134 // The job of this API is to correct this misalignment between the static
135 // type and the discovered dynamic type
136 virtual TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name,
137 ValueObject &static_value) = 0;
138
139 virtual void SetExceptionBreakpoints() {}
140
142
143 virtual bool ExceptionBreakpointsAreSet() { return false; }
144
146 return false;
147 }
148
149 static lldb::BreakpointSP
151 bool catch_bp, bool throw_bp,
152 bool is_internal = false);
153
155 GetExceptionPrecondition(lldb::LanguageType language, bool throw_bp);
156
161
166
167 virtual DeclVendor *GetDeclVendor() { return nullptr; }
168
171 bool catch_bp, bool throw_bp) = 0;
172
174 return m_process->GetTarget().GetSearchFilterForModule(nullptr);
175 }
176
177 virtual std::optional<uint64_t>
178 GetTypeBitSize(const CompilerType &compiler_type) {
179 return {};
180 }
181
182 virtual void SymbolsDidLoad(const ModuleList &module_list) {}
183
185 bool stop_others) = 0;
186
187 /// Identify whether a name is a runtime value that should not be hidden by
188 /// from the user interface.
189 virtual bool IsAllowedRuntimeValue(ConstString name) { return false; }
190
191 virtual std::optional<CompilerType> GetRuntimeType(CompilerType base_type) {
192 return std::nullopt;
193 }
194
195 void ModulesDidLoad(const ModuleList &module_list) override {}
196
197 // Called by ClangExpressionParser::PrepareForExecution to query for any
198 // custom LLVM IR passes that need to be run before an expression is
199 // assembled and run.
200 virtual bool GetIRPasses(LLVMUserExpression::IRPasses &custom_passes) {
201 return false;
202 }
203
204 virtual bool IsSymbolARuntimeThunk(const Symbol &symbol) { return false; }
205
206 // Given the name of a runtime symbol (e.g. in Objective-C, an ivar offset
207 // symbol), try to determine from the runtime what the value of that symbol
208 // would be. Useful when the underlying binary is stripped.
212
213 virtual bool isA(const void *ClassID) const { return ClassID == &ID; }
214 static char ID;
215
216 /// A language runtime may be able to provide a special UnwindPlan for
217 /// the frame represented by the register contents \a regctx when that
218 /// frame is not following the normal ABI conventions.
219 /// Instead of using the normal UnwindPlan for the function, we will use
220 /// this special UnwindPlan for this one backtrace.
221 /// One example of this would be a language that has asynchronous functions,
222 /// functions that may not be currently-executing, while waiting on other
223 /// asynchronous calls they made, but are part of a logical backtrace that
224 /// we want to show the developer because that's how they think of the
225 /// program flow.
226 ///
227 /// \param[in] thread
228 /// The thread that the unwind is happening on.
229 ///
230 /// \param[in] regctx
231 /// The RegisterContext for the frame we need to create an UnwindPlan.
232 /// We don't yet have a StackFrame when we're selecting the UnwindPlan.
233 ///
234 /// \param[out] behaves_like_zeroth_frame
235 /// With normal ABI calls, all stack frames except the zeroth frame need
236 /// to have the return-pc value backed up by 1 for symbolication purposes.
237 /// For these LanguageRuntime unwind plans, they may not follow normal ABI
238 /// calling conventions and the return pc may need to be symbolicated
239 /// as-is.
240 ///
241 /// \return
242 /// Returns an UnwindPlan to find the caller frame if it should be used,
243 /// instead of the UnwindPlan that would normally be used for this
244 /// function.
245 static lldb::UnwindPlanSP
248 bool &behaves_like_zeroth_frame);
249
250 /// Language runtime plugins can use this API to report
251 /// language-specific runtime information about this compile unit,
252 /// such as additional language version details or feature flags.
254
255protected:
256 // The static GetRuntimeUnwindPlan method above is only implemented in the
257 // base class; subclasses may override this protected member if they can
258 // provide one of these UnwindPlans.
259 virtual lldb::UnwindPlanSP
262 bool &behaves_like_zeroth_frame) {
263 return lldb::UnwindPlanSP();
264 }
265
266 LanguageRuntime(Process *process);
267};
268
269} // namespace lldb_private
270
271#endif // LLDB_TARGET_LANGUAGERUNTIME_H
static llvm::raw_ostream & error(Stream &strm)
A section + offset based address class.
Definition Address.h:62
Generic representation of a type in a programming language.
A uniqued constant string class.
Definition ConstString.h:40
static SearchFilter * CreateFromStructuredData(Target &target, const StructuredData::Dictionary &data_dict, Status &error)
bool ModulePasses(const lldb::ModuleSP &module_sp) override
Call this method with a Module to see if that module passes the filter.
lldb::SearchFilterSP DoCreateCopy() override
ExceptionSearchFilter(const lldb::TargetSP &target_sp, lldb::LanguageType language, bool update_module_list=true)
void Search(Searcher &searcher) override
Call this method to do the search using the Searcher.
~ExceptionSearchFilter() override=default
StructuredData::ObjectSP SerializeToStructuredData() override
void GetDescription(Stream *s) override
Prints a canonical description for the search filter to the stream s.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
A file utility class.
Definition FileSpec.h:57
virtual bool IsAllowedRuntimeValue(ConstString name)
Identify whether a name is a runtime value that should not be hidden by from the user interface.
virtual StructuredData::ObjectSP GetLanguageSpecificData(SymbolContext sc)
Language runtime plugins can use this API to report language-specific runtime information about this ...
virtual bool IsSymbolARuntimeThunk(const Symbol &symbol)
virtual std::optional< CompilerType > GetRuntimeType(CompilerType base_type)
virtual lldb::LanguageType GetLanguageType() const =0
virtual CompilerType GetConcreteType(ExecutionContextScope *exe_scope, ConstString abstract_type_name)
virtual TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name, ValueObject &static_value)=0
virtual lldb::ThreadSP GetBacktraceThreadFromException(lldb::ValueObjectSP thread_sp)
virtual bool GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, TypeAndOrName &class_type_or_name, Address &address, Value::ValueType &value_type, llvm::ArrayRef< uint8_t > &local_buffer)=0
This call should return true if it could set the name and/or the type Sets address to the address of ...
virtual lldb::UnwindPlanSP GetRuntimeUnwindPlan(lldb::ProcessSP process_sp, lldb_private::RegisterContext *regctx, bool &behaves_like_zeroth_frame)
virtual lldb::ValueObjectSP GetExceptionObjectForThread(lldb::ThreadSP thread_sp)
static LanguageRuntime * FindPlugin(Process *process, lldb::LanguageType language)
virtual bool ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason)
virtual LanguageRuntime * GetPreferredLanguageRuntime(ValueObject &in_value)
Return the preferred language runtime instance, which in most cases will be the current instance.
virtual lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, bool stop_others)=0
virtual bool isA(const void *ClassID) const
virtual lldb::addr_t LookupRuntimeSymbol(ConstString name)
virtual bool ExceptionBreakpointsAreSet()
static lldb::UnwindPlanSP GetRuntimeUnwindPlan(lldb_private::Thread &thread, lldb_private::RegisterContext *regctx, bool &behaves_like_zeroth_frame)
A language runtime may be able to provide a special UnwindPlan for the frame represented by the regis...
virtual llvm::Expected< VTableInfo > GetVTableInfo(ValueObject &in_value, bool check_type)
Get the vtable information for a given value.
void ModulesDidLoad(const ModuleList &module_list) override
Called when modules have been loaded in the process.
virtual DeclVendor * GetDeclVendor()
virtual void SymbolsDidLoad(const ModuleList &module_list)
virtual std::optional< uint64_t > GetTypeBitSize(const CompilerType &compiler_type)
static lldb::BreakpointSP CreateExceptionBreakpoint(Target &target, lldb::LanguageType language, bool catch_bp, bool throw_bp, bool is_internal=false)
virtual bool GetIRPasses(LLVMUserExpression::IRPasses &custom_passes)
static void InitializeCommands(CommandObject *parent)
virtual bool CouldHaveDynamicValue(ValueObject &in_value)=0
virtual llvm::Error GetObjectDescription(Stream &str, Value &value, ExecutionContextScope *exe_scope)=0
virtual llvm::Error GetObjectDescription(Stream &str, ValueObject &object)=0
virtual lldb::SearchFilterSP CreateExceptionSearchFilter()
virtual lldb::BreakpointResolverSP CreateExceptionResolver(const lldb::BreakpointSP &bkpt, bool catch_bp, bool throw_bp)=0
static lldb::BreakpointPreconditionSP GetExceptionPrecondition(lldb::LanguageType language, bool throw_bp)
A collection class for Module objects.
Definition ModuleList.h:104
A plug-in interface definition class for debugging a process.
Definition Process.h:357
Process * m_process
Definition Runtime.h:29
Runtime(Process *process)
Definition Runtime.h:17
SearchFilter(const lldb::TargetSP &target_sp)
The basic constructor takes a Target, which gives the space to search.
General Outline: Provides the callback and search depth for the SearchFilter search.
An error handling class.
Definition Status.h:118
A stream class that can stream formatted output to a file.
Definition Stream.h:28
std::shared_ptr< Object > ObjectSP
Defines a symbol context baton that can be handed other debug core functions.
Sometimes you can find the name of the type corresponding to an object, but we don't have debug infor...
Definition Type.h:779
ValueType
Type that describes Value::m_value.
Definition Value.h:41
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::ThreadPlan > ThreadPlanSP
std::shared_ptr< lldb_private::SearchFilter > SearchFilterSP
std::shared_ptr< lldb_private::BreakpointResolver > BreakpointResolverSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::BreakpointPrecondition > BreakpointPreconditionSP
std::shared_ptr< lldb_private::UnwindPlan > UnwindPlanSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
uint64_t addr_t
Definition lldb-types.h:80
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
Symbol * symbol
Address of the vtable's virtual function table.