42llvm::Expected<std::shared_ptr<ScriptedFrame>>
47 if (!thread_sp || !thread_sp->IsValid())
48 return llvm::createStringError(
"invalid thread");
50 ProcessSP process_sp = thread_sp->GetProcess();
51 if (!process_sp || !process_sp->IsValid())
52 return llvm::createStringError(
"invalid process");
55 process_sp->GetTarget().GetDebugger().GetScriptInterpreter();
57 return llvm::createStringError(
"no script interpreter");
60 if (!scripted_frame_interface)
61 return llvm::createStringError(
"failed to create scripted frame interface");
63 llvm::StringRef frame_class_name;
67 if (scripted_thread_interface_sp) {
68 std::optional<std::string> class_name =
69 scripted_thread_interface_sp->GetScriptedFramePluginName();
70 if (!class_name || class_name->empty())
71 return llvm::createStringError(
72 "failed to get scripted frame class name");
73 frame_class_name = *class_name;
75 return llvm::createStringError(
76 "no script object provided and no scripted thread interface");
81 auto obj_or_err = scripted_frame_interface->CreatePluginObject(
82 frame_class_name, exe_ctx, args_sp, script_object);
85 return llvm::createStringError(
86 "failed to create script object: %s",
87 llvm::toString(obj_or_err.takeError()).c_str());
91 if (!owned_script_object_sp->IsValid())
92 return llvm::createStringError(
"created script object is invalid");
104 std::optional<SymbolContext> maybe_sym_ctx =
105 scripted_frame_interface->GetSymbolContext();
115 reg_ctx_sp = *regs_or_err;
117 return std::make_shared<ScriptedFrame>(thread_sp, scripted_frame_interface,
118 frame_id,
pc, sc, reg_ctx_sp,
119 owned_script_object_sp);
142 std::optional<std::string> function_name =
GetInterface()->GetFunctionName();
150 std::optional<std::string> function_name =
177 std::shared_ptr<DynamicRegisterInfo>>(
178 LLVM_PRETTY_FUNCTION,
"failed to get scripted frame registers info",
182 if (!thread_sp || !thread_sp->IsValid())
184 std::shared_ptr<DynamicRegisterInfo>>(
185 LLVM_PRETTY_FUNCTION,
186 "failed to get scripted frame registers info: invalid thread",
error,
189 ProcessSP process_sp = thread_sp->GetProcess();
190 if (!process_sp || !process_sp->IsValid())
192 std::shared_ptr<DynamicRegisterInfo>>(
193 LLVM_PRETTY_FUNCTION,
194 "failed to get scripted frame registers info: invalid process",
error,
198 process_sp->GetTarget().GetArchitecture());
201llvm::Expected<lldb::RegisterContextSP>
207 return llvm::createStringError(
208 "failed to get scripted frame registers info");
210 std::shared_ptr<DynamicRegisterInfo> register_info_sp =
212 *reg_info, thread.GetProcess()->GetTarget().GetArchitecture());
218 return llvm::createStringError(
219 "failed to get scripted frame registers data");
222 std::make_shared<DataBufferHeap>(reg_data->c_str(), reg_data->size()));
224 if (!data_sp->GetByteSize())
225 return llvm::createStringError(
"failed to copy raw registers data");
227 std::shared_ptr<RegisterContextMemory> reg_ctx_memory =
228 std::make_shared<RegisterContextMemory>(
231 reg_ctx_memory->SetAllRegisterData(data_sp);
232 reg_ctx_sp = reg_ctx_memory;
242 LLVM_PRETTY_FUNCTION,
243 "failed to get scripted frame registers context: invalid interface",
249 LLVM_PRETTY_FUNCTION,
250 "failed to get scripted frame registers context: invalid thread",
258 LLVM_PRETTY_FUNCTION,
259 "failed to get scripted frame registers context",
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=nullptr) const
Get the string value as a C string.
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
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.
bool IsArtificial() const override
Query whether this frame is artificial (e.g a synthesized result of inferring missing tail call frame...
const char * GetFunctionName() override
Get the frame's demangled name.
lldb::ScriptedFrameInterfaceSP GetInterface() const
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.
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.
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.
#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.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::ScriptedThreadInterface > ScriptedThreadInterfaceSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::ScriptedFrameInterface > ScriptedFrameInterfaceSP