15 #include "llvm/ADT/StringRef.h"
40 CPPLanguageRuntime::CPPLanguageRuntime(
Process *process)
60 return str_ref.contains(
"$_") || str_ref.contains(
"'lambda'");
65 llvm::StringRef first_template_param_sref,
101 lldb::ValueObjectSP &valobj_sp) {
107 return optional_info;
141 ValueObjectSP member_f_(
142 valobj_sp->GetChildMemberWithName(
ConstString(
"__f_"),
true));
145 ValueObjectSP sub_member_f_(
146 member_f_->GetChildMemberWithName(
ConstString(
"__f_"),
true));
149 member_f_ = sub_member_f_;
153 return optional_info;
155 lldb::addr_t member_f_pointer_value = member_f_->GetValueAsUnsigned(0);
159 if (!member_f_pointer_value)
160 return optional_info;
165 if (process ==
nullptr)
166 return optional_info;
177 return optional_info;
183 return optional_info;
185 lldb::addr_t address_after_vtable = member_f_pointer_value + address_size;
192 return optional_info;
197 return optional_info;
199 Address vtable_first_entry_resolved;
202 vtable_address_first_entry, vtable_first_entry_resolved))
203 return optional_info;
210 vtable_addr_resolved))
211 return optional_info;
214 vtable_addr_resolved, eSymbolContextEverything, sc);
217 if (symbol ==
nullptr)
218 return optional_info;
221 bool found_expected_start_string =
222 vtable_name.startswith(
"vtable for std::__1::__function::__func<");
224 if (!found_expected_start_string)
225 return optional_info;
241 size_t first_open_angle_bracket = vtable_name.find(
'<') + 1;
242 size_t first_comma = vtable_name.find(
',');
244 llvm::StringRef first_template_parameter =
245 vtable_name.slice(first_open_angle_bracket, first_comma);
247 Address function_address_resolved;
253 possible_function_address, function_address_resolved)) {
255 function_address_resolved, eSymbolContextEverything, sc);
262 auto calculate_symbol_context_helper = [](
auto &t,
265 t->CalculateSymbolContext(&sc);
272 calculate_symbol_context_helper(symbol, scl);
286 return optional_info;
289 std::string func_to_match = first_template_parameter.str();
299 llvm::StringRef name_to_use = func_to_match;
308 return optional_info;
310 if (vtable_cu && !has_invoke) {
311 lldb::FunctionSP func_sp =
312 vtable_cu->
FindFunction([name_to_use](
const FunctionSP &f) {
313 auto name = f->GetName().GetStringRef();
314 if (name.startswith(name_to_use) && name.contains(
"operator"))
321 calculate_symbol_context_helper(func_sp, scl);
325 if (symbol ==
nullptr)
326 return optional_info;
331 first_template_parameter, has_invoke);
336 return optional_info;
342 ThreadPlanSP ret_plan_sp;
348 if (target_sp->GetSectionLoadList().IsEmpty())
355 if (!target_sp->GetSectionLoadList().ResolveLoadAddress(curr_pc,
359 target_sp->GetImages().ResolveSymbolContextForAddress(
360 pc_addr_resolved, eSymbolContextEverything, sc);
363 if (symbol ==
nullptr)
374 bool found_expected_start_string =
375 function_name.startswith(
"std::__1::function<");
377 if (!found_expected_start_string)
381 sc.
GetAddressRange(eSymbolContextEverything, 0,
false, range_of_curr_func);
386 ValueObjectSP value_sp = frame->FindVariable(
g_this);
392 value_sp->GetValueIsValid()) {
395 ret_plan_sp = std::make_shared<ThreadPlanRunToAddress>(
402 ret_plan_sp = std::make_shared<ThreadPlanStepInRange>(