17#include "llvm/ADT/StringRef.h"
73 std::string GetName() override {
return "libc++ frame recognizer"; }
79 const auto &sc = frame_sp->GetSymbolContext(lldb::eSymbolContextFunction);
85 if (!r.Execute(sc.function->GetNameNoArguments()))
93 thread_sp->GetStackFrameAtIndex(frame_sp->GetFrameIndex() + 1);
96 const auto &parent_sc =
97 parent_frame_sp->GetSymbolContext(lldb::eSymbolContextFunction);
98 if (!parent_sc.function)
100 if (parent_sc.function->GetNameNoArguments().GetStringRef().starts_with(
114 std::make_shared<RegularExpression>(
"^std::__[^:]*::"),
129 return llvm::createStringError(
"C++ does not support object descriptions");
136 return llvm::createStringError(
"C++ does not support object descriptions");
140 return str_ref.contains(
"$_") || str_ref.contains(
"'lambda'");
145 llvm::StringRef first_template_param_sref,
bool has_invoke) {
159 optional_info.
callable_case = lldb_private::CPPLanguageRuntime::
160 LibCppStdFunctionCallableCase::Lambda;
163 optional_info.
callable_case = lldb_private::CPPLanguageRuntime::
164 LibCppStdFunctionCallableCase::CallableObject;
172 return optional_info;
183 return optional_info;
217 ValueObjectSP member_f_(valobj_sp->GetChildMemberWithName(
"__f_"));
220 ValueObjectSP sub_member_f_(member_f_->GetChildMemberWithName(
"__f_"));
223 member_f_ = sub_member_f_;
227 return optional_info;
229 lldb::addr_t member_f_pointer_value = member_f_->GetValueAsUnsigned(0);
233 if (!member_f_pointer_value)
234 return optional_info;
239 if (process ==
nullptr)
240 return optional_info;
251 return optional_info;
257 return optional_info;
259 lldb::addr_t address_after_vtable = member_f_pointer_value + address_size;
266 return optional_info;
271 return optional_info;
273 Address vtable_first_entry_resolved;
276 vtable_first_entry_resolved))
277 return optional_info;
284 return optional_info;
287 vtable_addr_resolved, eSymbolContextEverything, sc);
290 if (symbol ==
nullptr)
291 return optional_info;
294 bool found_expected_start_string =
295 vtable_name.starts_with(
"vtable for std::__1::__function::__func<");
297 if (!found_expected_start_string)
298 return optional_info;
314 size_t first_open_angle_bracket = vtable_name.find(
'<') + 1;
315 size_t first_comma = vtable_name.find(
',');
317 llvm::StringRef first_template_parameter =
318 vtable_name.slice(first_open_angle_bracket, first_comma);
320 Address function_address_resolved;
326 function_address_resolved)) {
328 function_address_resolved, eSymbolContextEverything, sc);
334 (symbol ? symbol->
GetName().GetStringRef().contains(
"__invoke") :
false);
335 auto calculate_symbol_context_helper = [](
auto &t,
338 t->CalculateSymbolContext(&sc);
345 calculate_symbol_context_helper(symbol, scl);
359 return optional_info;
362 std::string func_to_match = first_template_parameter.str();
372 llvm::StringRef name_to_use = func_to_match;
381 return optional_info;
383 if (vtable_cu && !has_invoke) {
386 auto name = f->GetName().GetStringRef();
387 if (name.starts_with(name_to_use) && name.contains(
"operator"))
394 calculate_symbol_context_helper(func_sp, scl);
398 if (symbol ==
nullptr)
399 return optional_info;
404 first_template_parameter, has_invoke);
409 return optional_info;
417 lldb::addr_t curr_pc = thread.GetRegisterContext()->GetPC();
419 TargetSP target_sp(thread.CalculateTarget());
421 if (!target_sp->HasLoadedSections())
428 if (!target_sp->ResolveLoadAddress(curr_pc, pc_addr_resolved))
431 target_sp->GetImages().ResolveSymbolContextForAddress(
432 pc_addr_resolved, eSymbolContextEverything, sc);
435 if (symbol ==
nullptr)
446 bool found_expected_start_string =
447 function_name.starts_with(
"std::__1::function<");
449 if (!found_expected_start_string)
453 sc.
GetAddressRange(eSymbolContextEverything, 0,
false, range_of_curr_func);
464 value_sp->GetValueIsValid()) {
467 ret_plan_sp = std::make_shared<ThreadPlanRunToAddress>(
474 ret_plan_sp = std::make_shared<ThreadPlanStepInRange>(
485 llvm::StringRef mangled_name =
491 return mangled_name.starts_with(
"_ZTh") || mangled_name.starts_with(
"_ZTv") ||
492 mangled_name.starts_with(
"_ZTc");
static ConstString g_promise
static ConstString g_coro_frame
bool contains_lambda_identifier(llvm::StringRef &str_ref)
static ConstString g_this
CPPLanguageRuntime::LibCppStdFunctionCallableInfo line_entry_helper(Target &target, const SymbolContext &sc, Symbol *symbol, llvm::StringRef first_template_param_sref, bool has_invoke)
#define LLDB_SCOPED_TIMER()
A frame recognizer that is installed to hide libc++ implementation details from the backtrace.
lldb::RecognizedStackFrameSP RecognizeFrame(lldb::StackFrameSP frame_sp) override
RecognizedStackFrameSP m_hidden_frame
std::array< RegularExpression, 2 > m_hidden_regex
std::string GetName() override
A section + offset based address range class.
A section + offset based address class.
lldb::addr_t GetCallableLoadAddress(Target *target, bool is_indirect=false) const
Get the load address as a callable code load address.
bool CalculateSymbolContextLineEntry(LineEntry &line_entry) const
CompileUnit * CalculateSymbolContextCompileUnit() const
llvm::Error GetObjectDescription(Stream &str, ValueObject &object) override
bool IsSymbolARuntimeThunk(const Symbol &symbol) override
bool IsAllowedRuntimeValue(ConstString name) override
Identify whether a name is a runtime value that should not be hidden by from the user interface.
LibCppStdFunctionCallableInfo FindLibCppStdFunctionCallableInfo(lldb::ValueObjectSP &valobj_sp)
lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, bool stop_others) override
Obtain a ThreadPlan to get us into C++ constructs such as std::function.
OperatorStringToCallableInfoMap CallableLookupCache
CPPLanguageRuntime(Process *process)
A class that describes a compilation unit.
lldb::FunctionSP FindFunction(llvm::function_ref< bool(const lldb::FunctionSP &)> matching_lambda)
Find a function in the compile unit based on the predicate matching_lambda.
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
Process * GetProcessPtr() const
Returns a pointer to the process object.
LanguageRuntime(Process *process)
@ ePreferDemangledWithoutArguments
ConstString GetMangledName() const
Mangled name get accessor.
uint32_t ResolveSymbolContextForAddress(const Address &so_addr, lldb::SymbolContextItem resolve_scope, SymbolContext &sc) const
Resolve the symbol context for the given address. (const Address&,uint32_t,SymbolContext&)
A plug-in interface definition class for debugging a process.
lldb::addr_t ReadPointerFromMemory(lldb::addr_t vm_addr, Status &error)
uint32_t GetAddressByteSize() const
Target & GetTarget()
Get the target object pointer for this module.
This class provides extra information about a stack frame that was provided by a specific stack frame...
void AddRecognizer(lldb::StackFrameRecognizerSP recognizer, ConstString module, llvm::ArrayRef< ConstString > symbols, Mangled::NamePreference symbol_mangling, bool first_instruction_only=true)
Add a new recognizer that triggers on a given symbol name.
A base class for frame recognizers.
bool Fail() const
Test for error condition.
A stream class that can stream formatted output to a file.
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
Defines a symbol context baton that can be handed other debug core functions.
bool GetAddressRange(uint32_t scope, uint32_t range_idx, bool use_inline_block_range, AddressRange &range) const
Get the address range contained within a symbol context.
Symbol * symbol
The Symbol for a given query.
Address GetFunctionOrSymbolAddress() const
Get the address of the function or symbol represented by this symbol context.
ConstString GetName() const
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, uint32_t stop_id=SectionLoadHistory::eStopIDNow, bool allow_section_end=false)
StackFrameRecognizerManager & GetFrameRecognizerManager()
const ModuleList & GetImages() const
Get accessor for the images for this process.
A class that represents a running process on the host machine.
void RegisterVerboseTrapFrameRecognizer(Process &process)
std::shared_ptr< lldb_private::Function > FunctionSP
std::shared_ptr< lldb_private::ThreadPlan > ThreadPlanSP
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::RecognizedStackFrame > RecognizedStackFrameSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::StackFrameRecognizer > StackFrameRecognizerSP
std::shared_ptr< lldb_private::Target > TargetSP
bool ShouldHide() override
Controls whether this frame should be filtered out when displaying backtraces, for example.
lldb::addr_t member_f_pointer_value
LineEntry callable_line_entry
LibCppStdFunctionCallableCase callable_case
A line table entry class.