21llvm::Expected<std::shared_ptr<ScriptedFrame>>
25 if (!thread.IsValid())
26 return llvm::createStringError(
"Invalid scripted thread.");
28 thread.CheckInterpreterAndScriptObject();
30 auto scripted_frame_interface =
31 thread.GetInterface()->CreateScriptedFrameInterface();
32 if (!scripted_frame_interface)
33 return llvm::createStringError(
"failed to create scripted frame interface");
35 llvm::StringRef frame_class_name;
37 std::optional<std::string> class_name =
38 thread.GetInterface()->GetScriptedFramePluginName();
39 if (!class_name || class_name->empty())
40 return llvm::createStringError(
41 "failed to get scripted thread class name");
42 frame_class_name = *class_name;
46 auto obj_or_err = scripted_frame_interface->CreatePluginObject(
47 frame_class_name, exe_ctx, args_sp, script_object);
50 return llvm::createStringError(
51 "failed to create script object: %s",
52 llvm::toString(obj_or_err.takeError()).c_str());
56 if (!owned_script_object_sp->IsValid())
57 return llvm::createStringError(
"created script object is invalid");
69 std::optional<SymbolContext> maybe_sym_ctx =
70 scripted_frame_interface->GetSymbolContext();
76 scripted_frame_interface->GetRegisterInfo();
79 return llvm::createStringError(
80 "failed to get scripted thread registers info");
82 std::shared_ptr<DynamicRegisterInfo> register_info_sp =
84 *reg_info, thread.GetProcess()->GetTarget().GetArchitecture());
88 std::optional<std::string> reg_data =
89 scripted_frame_interface->GetRegisterContext();
92 std::make_shared<DataBufferHeap>(reg_data->c_str(), reg_data->size()));
94 if (!data_sp->GetByteSize())
95 return llvm::createStringError(
"failed to copy raw registers data");
97 std::shared_ptr<RegisterContextMemory> reg_ctx_memory =
98 std::make_shared<RegisterContextMemory>(
101 return llvm::createStringError(
"failed to create a register context.");
103 reg_ctx_memory->SetAllRegisterData(data_sp);
104 reg_ctx_sp = reg_ctx_memory;
107 return std::make_shared<ScriptedFrame>(
108 thread, scripted_frame_interface, frame_id,
pc, sc, reg_ctx_sp,
109 register_info_sp, owned_script_object_sp);
117 std::shared_ptr<DynamicRegisterInfo> reg_info_sp,
130 std::optional<std::string> function_name =
GetInterface()->GetFunctionName();
138 std::optional<std::string> function_name =
166 std::shared_ptr<DynamicRegisterInfo>>(
167 LLVM_PRETTY_FUNCTION,
"Failed to get scripted frame registers info.",
171 if (!thread_sp || !thread_sp->IsValid())
173 std::shared_ptr<DynamicRegisterInfo>>(
174 LLVM_PRETTY_FUNCTION,
175 "Failed to get scripted frame registers info: invalid thread.",
error,
178 ProcessSP process_sp = thread_sp->GetProcess();
179 if (!process_sp || !process_sp->IsValid())
181 std::shared_ptr<DynamicRegisterInfo>>(
182 LLVM_PRETTY_FUNCTION,
183 "Failed to get scripted frame registers info: invalid process.",
187 *reg_info, process_sp->GetTarget().GetArchitecture());
static llvm::raw_ostream & error(Stream &strm)
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.
~ScriptedFrame() override
std::shared_ptr< DynamicRegisterInfo > m_register_info_sp
ScriptedFrame(ScriptedThread &thread, lldb::ScriptedFrameInterfaceSP interface_sp, lldb::user_id_t frame_idx, lldb::addr_t pc, SymbolContext &sym_ctx, lldb::RegisterContextSP reg_ctx_sp, std::shared_ptr< DynamicRegisterInfo > reg_info_sp, StructuredData::GenericSP script_object_sp=nullptr)
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< std::shared_ptr< ScriptedFrame > > Create(ScriptedThread &thread, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_object=nullptr)
lldb_private::StructuredData::GenericSP m_script_object_sp
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::ThreadWP m_thread_wp
For StackFrame and derived classes only.
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.
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.
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
std::shared_ptr< lldb_private::ScriptedFrameInterface > ScriptedFrameInterfaceSP