38#include "llvm/Support/ErrorHandling.h"
52llvm::Expected<std::shared_ptr<ScriptedFrame>>
57 if (!thread_sp || !thread_sp->IsValid())
58 return llvm::createStringError(
"invalid thread");
60 ProcessSP process_sp = thread_sp->GetProcess();
61 if (!process_sp || !process_sp->IsValid())
62 return llvm::createStringError(
"invalid process");
65 process_sp->GetTarget().GetDebugger().GetScriptInterpreter();
67 return llvm::createStringError(
"no script interpreter");
70 if (!scripted_frame_interface)
71 return llvm::createStringError(
"failed to create scripted frame interface");
73 llvm::StringRef frame_class_name;
77 if (scripted_thread_interface_sp) {
78 std::optional<std::string> class_name =
79 scripted_thread_interface_sp->GetScriptedFramePluginName();
80 if (!class_name || class_name->empty())
81 return llvm::createStringError(
82 "failed to get scripted frame class name");
83 frame_class_name = *class_name;
85 return llvm::createStringError(
86 "no script object provided and no scripted thread interface");
91 auto obj_or_err = scripted_frame_interface->CreatePluginObject(
92 frame_class_name, exe_ctx, args_sp, script_object);
95 return llvm::createStringError(
96 "failed to create script object: %s",
97 llvm::toString(obj_or_err.takeError()).c_str());
101 if (!owned_script_object_sp->IsValid())
102 return llvm::createStringError(
"created script object is invalid");
114 std::optional<SymbolContext> maybe_sym_ctx =
115 scripted_frame_interface->GetSymbolContext();
125 reg_ctx_sp = *regs_or_err;
127 return std::make_shared<ScriptedFrame>(thread_sp, scripted_frame_interface,
128 frame_id,
pc, sc, reg_ctx_sp,
129 owned_script_object_sp);
152 std::optional<std::string> function_name =
GetInterface()->GetFunctionName();
160 std::optional<std::string> function_name =
187 std::shared_ptr<DynamicRegisterInfo>>(
188 LLVM_PRETTY_FUNCTION,
"failed to get scripted frame registers info",
192 if (!thread_sp || !thread_sp->IsValid())
194 std::shared_ptr<DynamicRegisterInfo>>(
195 LLVM_PRETTY_FUNCTION,
196 "failed to get scripted frame registers info: invalid thread",
error,
199 ProcessSP process_sp = thread_sp->GetProcess();
200 if (!process_sp || !process_sp->IsValid())
202 std::shared_ptr<DynamicRegisterInfo>>(
203 LLVM_PRETTY_FUNCTION,
204 "failed to get scripted frame registers info: invalid process",
error,
208 process_sp->GetTarget().GetArchitecture());
211llvm::Expected<lldb::RegisterContextSP>
217 return llvm::createStringError(
218 "failed to get scripted frame registers info");
220 std::shared_ptr<DynamicRegisterInfo> register_info_sp =
222 *reg_info, thread.GetProcess()->GetTarget().GetArchitecture());
228 return llvm::createStringError(
229 "failed to get scripted frame registers data");
232 std::make_shared<DataBufferHeap>(reg_data->c_str(), reg_data->size()));
234 if (!data_sp->GetByteSize())
235 return llvm::createStringError(
"failed to copy raw registers data");
237 std::shared_ptr<RegisterContextMemory> reg_ctx_memory =
238 std::make_shared<RegisterContextMemory>(
241 reg_ctx_memory->SetAllRegisterData(data_sp);
242 reg_ctx_sp = reg_ctx_memory;
252 LLVM_PRETTY_FUNCTION,
253 "failed to get scripted frame registers context: invalid interface",
259 LLVM_PRETTY_FUNCTION,
260 "failed to get scripted frame registers context: invalid thread",
268 LLVM_PRETTY_FUNCTION,
269 "failed to get scripted frame registers context",
error,
280 bool include_synthetic_vars,
288 bool include_synthetic_vars,
289 bool must_have_valid_location) {
295 bool include_synthetic_vars) {
303 for (uint32_t i = 0, e = value_list_sp->GetSize(); i < e; ++i) {
309 if (!var && include_synthetic_vars) {
319 var = std::make_shared<lldb_private::Variable>(
321 v->GetName().GetCString(), v->GetName().GetCString(),
nullptr, vt,
341 return values->FindValueObjectByValueName(
342 variable_sp->GetName().AsCString(
nullptr));
351 return values->FindValueObjectByValueName(name.
AsCString(
nullptr));
368 var_expr, options,
error);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG_ERROR(log, error,...)
A section + offset based address class.
bool SetLoadAddress(lldb::addr_t load_addr, Target *target, bool allow_section_end=false)
Set the address to represent load_addr.
uint32_t CalculateSymbolContext(SymbolContext *sc, lldb::SymbolContextItem resolve_scope=lldb::eSymbolContextEverything) const
Reconstruct a symbol context from an address.
A uniqued constant string class.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
static std::unique_ptr< DynamicRegisterInfo > Create(const StructuredData::Dictionary &dict, const ArchSpec &arch)
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
virtual lldb::ScriptedFrameInterfaceSP CreateScriptedFrameInterface()
virtual StructuredData::DictionarySP GetRegisterInfo()
virtual std::optional< std::string > GetRegisterContext()
~ScriptedFrame() override
lldb::VariableListSP m_variable_list_sp
static llvm::Expected< std::shared_ptr< ScriptedFrame > > Create(lldb::ThreadSP thread_sp, lldb::ScriptedThreadInterfaceSP scripted_thread_interface_sp, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_object=nullptr)
Create a ScriptedFrame from a object instanciated in the script interpreter.
lldb::ValueObjectSP FindVariable(ConstString name) override
Attempt to reconstruct the ValueObject for a variable with a given name from within the current Stack...
bool IsArtificial() const override
Query whether this frame is artificial (e.g a synthesized result of inferring missing tail call frame...
lldb::ValueObjectSP GetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error, lldb::DILMode mode=lldb::eDILModeFull) override
Create a ValueObject for a variable name / pathname, possibly including simple dereference/child sele...
const char * GetFunctionName() override
Get the frame's demangled name.
lldb::ScriptedFrameInterfaceSP GetInterface() const
void PopulateVariableListFromInterface(bool include_synthetic_vars=true)
void CheckInterpreterAndScriptObject() const
lldb::ScriptedFrameInterfaceSP m_scripted_frame_interface_sp
static llvm::Expected< lldb::RegisterContextSP > CreateRegisterContext(ScriptedFrameInterface &interface, Thread &thread, lldb::user_id_t frame_id)
ScriptedFrame(lldb::ThreadSP thread_sp, lldb::ScriptedFrameInterfaceSP interface_sp, lldb::user_id_t frame_idx, lldb::addr_t pc, SymbolContext &sym_ctx, lldb::RegisterContextSP reg_ctx_sp, StructuredData::GenericSP script_object_sp=nullptr)
lldb_private::StructuredData::GenericSP m_script_object_sp
lldb::RegisterContextSP GetRegisterContext() override
Get the RegisterContext for this frame, if possible.
bool IsHidden() override
Query whether this frame should be hidden from backtraces.
lldb::VariableListSP GetInScopeVariableList(bool get_file_globals, bool include_synthetic_vars, bool must_have_valid_location=false) override
Retrieve the list of variables that are in scope at this StackFrame's pc.
VariableList * GetVariableList(bool get_file_globals, bool include_synthetic_vars, lldb_private::Status *error_ptr) override
Retrieve the list of variables whose scope either:
bool IsInlined() override
Query whether this frame is a concrete frame on the call stack, or if it is an inlined frame derived ...
const char * GetDisplayFunctionName() override
Get the frame's demangled display name.
lldb::ValueObjectSP GetValueObjectForFrameVariable(const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic) override
Create a ValueObject for a given Variable in this StackFrame.
std::shared_ptr< DynamicRegisterInfo > GetDynamicRegisterInfo()
static Ret ErrorWithMessage(llvm::StringRef caller_name, llvm::StringRef error_msg, Status &error, LLDBLog log_category=LLDBLog::Process)
lldb::ThreadSP GetThread() const
virtual const char * GetFunctionName()
Get the frame's demangled name.
lldb::ThreadWP m_thread_wp
For StackFrame and derived classes only.
lldb::RegisterContextSP m_reg_context_sp
@ Synthetic
An synthetic stack frame (e.g.
virtual const char * GetDisplayFunctionName()
Get the frame's demangled display name.
virtual uint32_t GetFrameIndex() const
Query this frame to find what frame it is in this Thread's StackFrameList.
StackFrame(const lldb::ThreadSP &thread_sp, lldb::user_id_t frame_idx, lldb::user_id_t concrete_frame_idx, lldb::addr_t cfa, bool cfa_is_valid, lldb::addr_t pc, Kind frame_kind, bool artificial, bool behaves_like_zeroth_frame, const SymbolContext *sc_ptr)
Construct a StackFrame object without supplying a RegisterContextSP.
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
Defines a symbol context baton that can be handed other debug core functions.
RangeVector< lldb::addr_t, lldb::addr_t > RangeList
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
constexpr lldb::ValueType GetSyntheticValueType(lldb::ValueType base)
Given a base value type, return a version that carries the synthetic bit.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::ScriptedThreadInterface > ScriptedThreadInterfaceSP
std::shared_ptr< lldb_private::ValueObjectList > ValueObjectListSP
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
DILMode
Data Inspection Language (DIL) evaluation modes.
std::shared_ptr< lldb_private::ScriptedFrameInterface > ScriptedFrameInterfaceSP