18#include "llvm/ADT/StringRef.h"
76 std::string GetName() override {
return "libc++ frame recognizer"; }
82 const auto &sc = frame_sp->GetSymbolContext(lldb::eSymbolContextFunction);
88 if (!r.Execute(sc.function->GetNameNoArguments()))
96 thread_sp->GetStackFrameAtIndex(frame_sp->GetFrameIndex() + 1);
99 const auto &parent_sc =
100 parent_frame_sp->GetSymbolContext(lldb::eSymbolContextFunction);
101 if (!parent_sc.function)
103 if (parent_sc.function->GetNameNoArguments().GetStringRef().starts_with(
117 std::make_shared<RegularExpression>(
"^std::__[^:]*::"),
132 return llvm::createStringError(
"C++ does not support object descriptions");
139 return llvm::createStringError(
"C++ does not support object descriptions");
143 return str_ref.contains(
"$_") || str_ref.contains(
"'lambda'");
148 llvm::StringRef first_template_param_sref,
bool has_invoke) {
162 optional_info.
callable_case = lldb_private::CPPLanguageRuntime::
163 LibCppStdFunctionCallableCase::Lambda;
166 optional_info.
callable_case = lldb_private::CPPLanguageRuntime::
167 LibCppStdFunctionCallableCase::CallableObject;
175 return optional_info;
186 return optional_info;
220 ValueObjectSP member_f_(valobj_sp->GetChildMemberWithName(
"__f_"));
223 ValueObjectSP sub_member_f_(member_f_->GetChildMemberWithName(
"__f_"));
226 member_f_ = sub_member_f_;
230 return optional_info;
232 lldb::addr_t member_f_pointer_value = member_f_->GetValueAsUnsigned(0);
236 if (!member_f_pointer_value)
237 return optional_info;
242 if (process ==
nullptr)
243 return optional_info;
254 return optional_info;
260 return optional_info;
262 lldb::addr_t address_after_vtable = member_f_pointer_value + address_size;
269 return optional_info;
274 return optional_info;
276 Address vtable_first_entry_resolved;
279 vtable_first_entry_resolved))
280 return optional_info;
287 return optional_info;
290 vtable_addr_resolved, eSymbolContextEverything, sc);
293 if (symbol ==
nullptr)
294 return optional_info;
297 bool found_expected_start_string =
298 vtable_name.starts_with(
"vtable for std::__1::__function::__func<");
300 if (!found_expected_start_string)
301 return optional_info;
317 size_t first_open_angle_bracket = vtable_name.find(
'<') + 1;
318 size_t first_comma = vtable_name.find(
',');
320 llvm::StringRef first_template_parameter =
321 vtable_name.slice(first_open_angle_bracket, first_comma);
323 Address function_address_resolved;
329 function_address_resolved)) {
331 function_address_resolved, eSymbolContextEverything, sc);
337 (symbol ? symbol->
GetName().GetStringRef().contains(
"__invoke") :
false);
338 auto calculate_symbol_context_helper = [](
auto &t,
341 t->CalculateSymbolContext(&sc);
348 calculate_symbol_context_helper(symbol, scl);
362 return optional_info;
365 std::string func_to_match = first_template_parameter.str();
375 llvm::StringRef name_to_use = func_to_match;
384 return optional_info;
386 if (vtable_cu && !has_invoke) {
389 auto name = f->GetName().GetStringRef();
390 if (name.starts_with(name_to_use) && name.contains(
"operator"))
397 calculate_symbol_context_helper(func_sp, scl);
401 if (symbol ==
nullptr)
402 return optional_info;
407 first_template_parameter, has_invoke);
412 return optional_info;
420 lldb::addr_t curr_pc = thread.GetRegisterContext()->GetPC();
422 TargetSP target_sp(thread.CalculateTarget());
424 if (!target_sp->HasLoadedSections())
431 if (!target_sp->ResolveLoadAddress(curr_pc, pc_addr_resolved))
434 target_sp->GetImages().ResolveSymbolContextForAddress(
435 pc_addr_resolved, eSymbolContextEverything, sc);
438 if (symbol ==
nullptr)
449 bool found_expected_start_string =
450 function_name.starts_with(
"std::__1::function<");
452 if (!found_expected_start_string)
456 sc.
GetAddressRange(eSymbolContextEverything, 0,
false, range_of_curr_func);
467 value_sp->GetValueIsValid()) {
470 ret_plan_sp = std::make_shared<ThreadPlanRunToAddress>(
477 ret_plan_sp = std::make_shared<ThreadPlanStepInRange>(
488 llvm::StringRef mangled_name =
494 return mangled_name.starts_with(
"_ZTh") || mangled_name.starts_with(
"_ZTv") ||
495 mangled_name.starts_with(
"_ZTc");
499 const bool check_cxx =
true;
500 const bool check_objc =
false;
509 class_type_or_name.
Clear();
516 in_value, use_dynamic, class_type_or_name, dynamic_address, value_type);
526 if (type_and_or_name.
HasType()) {
533 if (static_type_flags.
AllSet(eTypeIsPointer))
535 else if (static_type_flags.
AllSet(eTypeIsReference))
542 if (static_type_flags.
AllSet(eTypeIsPointer))
543 corrected_name.append(
" *");
544 else if (static_type_flags.
AllSet(eTypeIsReference))
545 corrected_name.append(
" &");
548 ret.
SetName(corrected_name.c_str());
577llvm::Expected<LanguageRuntime::VTableInfo>
584 bool catch_bp,
bool throw_bp) {
590 bool catch_bp,
bool throw_bp,
591 bool for_expressions) {
592 std::vector<const char *> exception_names;
594 exception_names, catch_bp, throw_bp, for_expressions);
597 bkpt, exception_names.data(), exception_names.size(),
613 bool catch_bp,
bool throw_bp,
bool for_expressions,
bool is_internal) {
619 const bool hardware =
false;
620 const bool resolve_indirect_functions =
false;
621 return target.
CreateBreakpoint(filter_sp, exception_resolver_sp, is_internal,
622 hardware, resolve_indirect_functions);
629 const bool catch_bp =
false;
630 const bool throw_bp =
true;
631 const bool is_internal =
true;
632 const bool for_expressions =
true;
641 catch_bp, throw_bp, for_expressions, is_internal);
668 uint64_t break_site_id = stop_reason->GetValue();
669 return m_process->GetBreakpointSiteList().StopPointSiteContainsBreakpoint(
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_PLUGIN_DEFINE_ADV(ClassName, PluginName)
#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
"lldb/Breakpoint/BreakpointResolverName.h" This class sets breakpoints on a given function name,...
llvm::Expected< LanguageRuntime::VTableInfo > GetVTableInfo(ValueObject &in_value, bool check_type) override
Get the vtable information for a given value.
TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name, ValueObject &static_value) override
bool CouldHaveDynamicValue(ValueObject &in_value) override
lldb::BreakpointSP CreateExceptionBreakpoint(bool catch_bp, bool throw_bp, bool for_expressions, bool is_internal)
static lldb_private::LanguageRuntime * CreateInstance(Process *process, lldb::LanguageType language)
llvm::Error GetObjectDescription(Stream &str, ValueObject &object) override
lldb::SearchFilterSP CreateExceptionSearchFilter() override
lldb::ValueObjectSP GetExceptionObjectForThread(lldb::ThreadSP thread_sp) 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.
void ClearExceptionBreakpoints() override
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.
lldb::BreakpointResolverSP CreateExceptionResolver(const lldb::BreakpointSP &bkpt, bool catch_bp, bool throw_bp) override
ItaniumABIRuntime m_itanium_runtime
bool ExceptionBreakpointsAreSet() override
OperatorStringToCallableInfoMap CallableLookupCache
CPPLanguageRuntime(Process *process)
void SetExceptionBreakpoints() override
static llvm::StringRef GetPluginNameStatic()
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) override
This call should return true if it could set the name and/or the type Sets address to the address of ...
bool ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason) override
lldb::BreakpointSP m_cxx_exception_bp_sp
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.
Generic representation of a type in a programming language.
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
CompilerType GetLValueReferenceType() const
Return a new CompilerType that is a L value reference to this type if this type is valid and the type...
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
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.
bool AllSet(ValueType mask) const
Test if all bits in mask are 1 in the current flags.
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&)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
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
lldb::SearchFilterSP GetSearchFilterForModuleList(const FileSpecList *containingModuleList)
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, uint32_t stop_id=SectionLoadHistory::eStopIDNow, bool allow_section_end=false)
StackFrameRecognizerManager & GetFrameRecognizerManager()
lldb::BreakpointSP CreateBreakpoint(const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, uint32_t column, lldb::addr_t offset, LazyBool check_inlines, LazyBool skip_prologue, bool internal, bool request_hardware, LazyBool move_to_nearest_code)
const ModuleList & GetImages() const
Get accessor for the images for this process.
Sometimes you can find the name of the type corresponding to an object, but we don't have debug infor...
void SetName(ConstString type_name)
CompilerType GetCompilerType() const
ConstString GetName() const
void SetCompilerType(CompilerType compiler_type)
CompilerType GetCompilerType()
ValueType
Type that describes Value::m_value.
@ Scalar
A raw scalar value.
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::SearchFilter > SearchFilterSP
std::shared_ptr< lldb_private::BreakpointResolver > BreakpointResolverSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeC_plus_plus_14
ISO C++:2014.
@ eLanguageTypeC_plus_plus_03
ISO C++:2003.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeC_plus_plus_11
ISO C++:2011.
@ eLanguageTypeC_plus_plus
ISO C++:1998.
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::StackFrameRecognizer > StackFrameRecognizerSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
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.