1 //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include <algorithm> 10 #include <set> 11 #include <string> 12 13 #include "lldb/API/SBFrame.h" 14 15 #include "lldb/lldb-types.h" 16 17 #include "SBReproducerPrivate.h" 18 #include "Utils.h" 19 #include "lldb/Core/Address.h" 20 #include "lldb/Core/StreamFile.h" 21 #include "lldb/Core/ValueObjectRegister.h" 22 #include "lldb/Core/ValueObjectVariable.h" 23 #include "lldb/Expression/ExpressionVariable.h" 24 #include "lldb/Expression/UserExpression.h" 25 #include "lldb/Host/Host.h" 26 #include "lldb/Symbol/Block.h" 27 #include "lldb/Symbol/Function.h" 28 #include "lldb/Symbol/Symbol.h" 29 #include "lldb/Symbol/SymbolContext.h" 30 #include "lldb/Symbol/Variable.h" 31 #include "lldb/Symbol/VariableList.h" 32 #include "lldb/Target/ExecutionContext.h" 33 #include "lldb/Target/Process.h" 34 #include "lldb/Target/RegisterContext.h" 35 #include "lldb/Target/StackFrame.h" 36 #include "lldb/Target/StackFrameRecognizer.h" 37 #include "lldb/Target/StackID.h" 38 #include "lldb/Target/Target.h" 39 #include "lldb/Target/Thread.h" 40 #include "lldb/Utility/ConstString.h" 41 #include "lldb/Utility/Stream.h" 42 43 #include "lldb/API/SBAddress.h" 44 #include "lldb/API/SBDebugger.h" 45 #include "lldb/API/SBExpressionOptions.h" 46 #include "lldb/API/SBStream.h" 47 #include "lldb/API/SBSymbolContext.h" 48 #include "lldb/API/SBThread.h" 49 #include "lldb/API/SBValue.h" 50 #include "lldb/API/SBVariablesOptions.h" 51 52 #include "llvm/Support/PrettyStackTrace.h" 53 54 using namespace lldb; 55 using namespace lldb_private; 56 57 SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) { 58 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame); 59 } 60 61 SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 62 : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 63 LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &), 64 lldb_object_sp); 65 } 66 67 SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() { 68 LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs); 69 70 m_opaque_sp = clone(rhs.m_opaque_sp); 71 } 72 73 SBFrame::~SBFrame() = default; 74 75 const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 76 LLDB_RECORD_METHOD(const lldb::SBFrame &, 77 SBFrame, operator=,(const lldb::SBFrame &), rhs); 78 79 if (this != &rhs) 80 m_opaque_sp = clone(rhs.m_opaque_sp); 81 return LLDB_RECORD_RESULT(*this); 82 } 83 84 StackFrameSP SBFrame::GetFrameSP() const { 85 return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 86 } 87 88 void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 89 return m_opaque_sp->SetFrameSP(lldb_object_sp); 90 } 91 92 bool SBFrame::IsValid() const { 93 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid); 94 return this->operator bool(); 95 } 96 SBFrame::operator bool() const { 97 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, operator bool); 98 99 std::unique_lock<std::recursive_mutex> lock; 100 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 101 102 Target *target = exe_ctx.GetTargetPtr(); 103 Process *process = exe_ctx.GetProcessPtr(); 104 if (target && process) { 105 Process::StopLocker stop_locker; 106 if (stop_locker.TryLock(&process->GetRunLock())) 107 return GetFrameSP().get() != nullptr; 108 } 109 110 // Without a target & process we can't have a valid stack frame. 111 return false; 112 } 113 114 SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 115 LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 116 (uint32_t), resolve_scope); 117 118 SBSymbolContext sb_sym_ctx; 119 std::unique_lock<std::recursive_mutex> lock; 120 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 121 SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 122 StackFrame *frame = nullptr; 123 Target *target = exe_ctx.GetTargetPtr(); 124 Process *process = exe_ctx.GetProcessPtr(); 125 if (target && process) { 126 Process::StopLocker stop_locker; 127 if (stop_locker.TryLock(&process->GetRunLock())) { 128 frame = exe_ctx.GetFramePtr(); 129 if (frame) 130 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 131 } 132 } 133 134 return LLDB_RECORD_RESULT(sb_sym_ctx); 135 } 136 137 SBModule SBFrame::GetModule() const { 138 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule); 139 140 SBModule sb_module; 141 ModuleSP module_sp; 142 std::unique_lock<std::recursive_mutex> lock; 143 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 144 145 StackFrame *frame = nullptr; 146 Target *target = exe_ctx.GetTargetPtr(); 147 Process *process = exe_ctx.GetProcessPtr(); 148 if (target && process) { 149 Process::StopLocker stop_locker; 150 if (stop_locker.TryLock(&process->GetRunLock())) { 151 frame = exe_ctx.GetFramePtr(); 152 if (frame) { 153 module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 154 sb_module.SetSP(module_sp); 155 } 156 } 157 } 158 159 return LLDB_RECORD_RESULT(sb_module); 160 } 161 162 SBCompileUnit SBFrame::GetCompileUnit() const { 163 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame, 164 GetCompileUnit); 165 166 SBCompileUnit sb_comp_unit; 167 std::unique_lock<std::recursive_mutex> lock; 168 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 169 170 StackFrame *frame = nullptr; 171 Target *target = exe_ctx.GetTargetPtr(); 172 Process *process = exe_ctx.GetProcessPtr(); 173 if (target && process) { 174 Process::StopLocker stop_locker; 175 if (stop_locker.TryLock(&process->GetRunLock())) { 176 frame = exe_ctx.GetFramePtr(); 177 if (frame) { 178 sb_comp_unit.reset( 179 frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 180 } 181 } 182 } 183 184 return LLDB_RECORD_RESULT(sb_comp_unit); 185 } 186 187 SBFunction SBFrame::GetFunction() const { 188 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction); 189 190 SBFunction sb_function; 191 std::unique_lock<std::recursive_mutex> lock; 192 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 193 194 StackFrame *frame = nullptr; 195 Target *target = exe_ctx.GetTargetPtr(); 196 Process *process = exe_ctx.GetProcessPtr(); 197 if (target && process) { 198 Process::StopLocker stop_locker; 199 if (stop_locker.TryLock(&process->GetRunLock())) { 200 frame = exe_ctx.GetFramePtr(); 201 if (frame) { 202 sb_function.reset( 203 frame->GetSymbolContext(eSymbolContextFunction).function); 204 } 205 } 206 } 207 208 return LLDB_RECORD_RESULT(sb_function); 209 } 210 211 SBSymbol SBFrame::GetSymbol() const { 212 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol); 213 214 SBSymbol sb_symbol; 215 std::unique_lock<std::recursive_mutex> lock; 216 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 217 218 StackFrame *frame = nullptr; 219 Target *target = exe_ctx.GetTargetPtr(); 220 Process *process = exe_ctx.GetProcessPtr(); 221 if (target && process) { 222 Process::StopLocker stop_locker; 223 if (stop_locker.TryLock(&process->GetRunLock())) { 224 frame = exe_ctx.GetFramePtr(); 225 if (frame) { 226 sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 227 } 228 } 229 } 230 231 return LLDB_RECORD_RESULT(sb_symbol); 232 } 233 234 SBBlock SBFrame::GetBlock() const { 235 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock); 236 237 SBBlock sb_block; 238 std::unique_lock<std::recursive_mutex> lock; 239 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 240 241 StackFrame *frame = nullptr; 242 Target *target = exe_ctx.GetTargetPtr(); 243 Process *process = exe_ctx.GetProcessPtr(); 244 if (target && process) { 245 Process::StopLocker stop_locker; 246 if (stop_locker.TryLock(&process->GetRunLock())) { 247 frame = exe_ctx.GetFramePtr(); 248 if (frame) 249 sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 250 } 251 } 252 return LLDB_RECORD_RESULT(sb_block); 253 } 254 255 SBBlock SBFrame::GetFrameBlock() const { 256 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock); 257 258 SBBlock sb_block; 259 std::unique_lock<std::recursive_mutex> lock; 260 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 261 262 StackFrame *frame = nullptr; 263 Target *target = exe_ctx.GetTargetPtr(); 264 Process *process = exe_ctx.GetProcessPtr(); 265 if (target && process) { 266 Process::StopLocker stop_locker; 267 if (stop_locker.TryLock(&process->GetRunLock())) { 268 frame = exe_ctx.GetFramePtr(); 269 if (frame) 270 sb_block.SetPtr(frame->GetFrameBlock()); 271 } 272 } 273 return LLDB_RECORD_RESULT(sb_block); 274 } 275 276 SBLineEntry SBFrame::GetLineEntry() const { 277 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry); 278 279 SBLineEntry sb_line_entry; 280 std::unique_lock<std::recursive_mutex> lock; 281 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 282 283 StackFrame *frame = nullptr; 284 Target *target = exe_ctx.GetTargetPtr(); 285 Process *process = exe_ctx.GetProcessPtr(); 286 if (target && process) { 287 Process::StopLocker stop_locker; 288 if (stop_locker.TryLock(&process->GetRunLock())) { 289 frame = exe_ctx.GetFramePtr(); 290 if (frame) { 291 sb_line_entry.SetLineEntry( 292 frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 293 } 294 } 295 } 296 return LLDB_RECORD_RESULT(sb_line_entry); 297 } 298 299 uint32_t SBFrame::GetFrameID() const { 300 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID); 301 302 uint32_t frame_idx = UINT32_MAX; 303 304 std::unique_lock<std::recursive_mutex> lock; 305 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 306 307 StackFrame *frame = exe_ctx.GetFramePtr(); 308 if (frame) 309 frame_idx = frame->GetFrameIndex(); 310 311 return frame_idx; 312 } 313 314 lldb::addr_t SBFrame::GetCFA() const { 315 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA); 316 317 std::unique_lock<std::recursive_mutex> lock; 318 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 319 320 StackFrame *frame = exe_ctx.GetFramePtr(); 321 if (frame) 322 return frame->GetStackID().GetCallFrameAddress(); 323 return LLDB_INVALID_ADDRESS; 324 } 325 326 addr_t SBFrame::GetPC() const { 327 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC); 328 329 addr_t addr = LLDB_INVALID_ADDRESS; 330 std::unique_lock<std::recursive_mutex> lock; 331 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 332 333 StackFrame *frame = nullptr; 334 Target *target = exe_ctx.GetTargetPtr(); 335 Process *process = exe_ctx.GetProcessPtr(); 336 if (target && process) { 337 Process::StopLocker stop_locker; 338 if (stop_locker.TryLock(&process->GetRunLock())) { 339 frame = exe_ctx.GetFramePtr(); 340 if (frame) { 341 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 342 target, AddressClass::eCode); 343 } 344 } 345 } 346 347 return addr; 348 } 349 350 bool SBFrame::SetPC(addr_t new_pc) { 351 LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc); 352 353 bool ret_val = false; 354 std::unique_lock<std::recursive_mutex> lock; 355 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 356 357 StackFrame *frame = nullptr; 358 Target *target = exe_ctx.GetTargetPtr(); 359 Process *process = exe_ctx.GetProcessPtr(); 360 if (target && process) { 361 Process::StopLocker stop_locker; 362 if (stop_locker.TryLock(&process->GetRunLock())) { 363 frame = exe_ctx.GetFramePtr(); 364 if (frame) { 365 ret_val = frame->GetRegisterContext()->SetPC(new_pc); 366 } 367 } 368 } 369 370 return ret_val; 371 } 372 373 addr_t SBFrame::GetSP() const { 374 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP); 375 376 addr_t addr = LLDB_INVALID_ADDRESS; 377 std::unique_lock<std::recursive_mutex> lock; 378 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 379 380 StackFrame *frame = nullptr; 381 Target *target = exe_ctx.GetTargetPtr(); 382 Process *process = exe_ctx.GetProcessPtr(); 383 if (target && process) { 384 Process::StopLocker stop_locker; 385 if (stop_locker.TryLock(&process->GetRunLock())) { 386 frame = exe_ctx.GetFramePtr(); 387 if (frame) { 388 addr = frame->GetRegisterContext()->GetSP(); 389 } 390 } 391 } 392 393 return addr; 394 } 395 396 addr_t SBFrame::GetFP() const { 397 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP); 398 399 addr_t addr = LLDB_INVALID_ADDRESS; 400 std::unique_lock<std::recursive_mutex> lock; 401 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 402 403 StackFrame *frame = nullptr; 404 Target *target = exe_ctx.GetTargetPtr(); 405 Process *process = exe_ctx.GetProcessPtr(); 406 if (target && process) { 407 Process::StopLocker stop_locker; 408 if (stop_locker.TryLock(&process->GetRunLock())) { 409 frame = exe_ctx.GetFramePtr(); 410 if (frame) 411 addr = frame->GetRegisterContext()->GetFP(); 412 } 413 } 414 415 return addr; 416 } 417 418 SBAddress SBFrame::GetPCAddress() const { 419 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 420 421 SBAddress sb_addr; 422 std::unique_lock<std::recursive_mutex> lock; 423 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 424 425 StackFrame *frame = exe_ctx.GetFramePtr(); 426 Target *target = exe_ctx.GetTargetPtr(); 427 Process *process = exe_ctx.GetProcessPtr(); 428 if (target && process) { 429 Process::StopLocker stop_locker; 430 if (stop_locker.TryLock(&process->GetRunLock())) { 431 frame = exe_ctx.GetFramePtr(); 432 if (frame) 433 sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 434 } 435 } 436 return LLDB_RECORD_RESULT(sb_addr); 437 } 438 439 void SBFrame::Clear() { 440 LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 441 442 m_opaque_sp->Clear(); 443 } 444 445 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 446 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 447 (const char *), var_path); 448 449 SBValue sb_value; 450 std::unique_lock<std::recursive_mutex> lock; 451 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 452 453 StackFrame *frame = exe_ctx.GetFramePtr(); 454 Target *target = exe_ctx.GetTargetPtr(); 455 if (frame && target) { 456 lldb::DynamicValueType use_dynamic = 457 frame->CalculateTarget()->GetPreferDynamicValue(); 458 sb_value = GetValueForVariablePath(var_path, use_dynamic); 459 } 460 return LLDB_RECORD_RESULT(sb_value); 461 } 462 463 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 464 DynamicValueType use_dynamic) { 465 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 466 (const char *, lldb::DynamicValueType), var_path, 467 use_dynamic); 468 469 SBValue sb_value; 470 if (var_path == nullptr || var_path[0] == '\0') { 471 return LLDB_RECORD_RESULT(sb_value); 472 } 473 474 std::unique_lock<std::recursive_mutex> lock; 475 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 476 477 StackFrame *frame = nullptr; 478 Target *target = exe_ctx.GetTargetPtr(); 479 Process *process = exe_ctx.GetProcessPtr(); 480 if (target && process) { 481 Process::StopLocker stop_locker; 482 if (stop_locker.TryLock(&process->GetRunLock())) { 483 frame = exe_ctx.GetFramePtr(); 484 if (frame) { 485 VariableSP var_sp; 486 Status error; 487 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 488 var_path, eNoDynamicValues, 489 StackFrame::eExpressionPathOptionCheckPtrVsMember | 490 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 491 var_sp, error)); 492 sb_value.SetSP(value_sp, use_dynamic); 493 } 494 } 495 } 496 return LLDB_RECORD_RESULT(sb_value); 497 } 498 499 SBValue SBFrame::FindVariable(const char *name) { 500 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 501 name); 502 503 SBValue value; 504 std::unique_lock<std::recursive_mutex> lock; 505 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 506 507 StackFrame *frame = exe_ctx.GetFramePtr(); 508 Target *target = exe_ctx.GetTargetPtr(); 509 if (frame && target) { 510 lldb::DynamicValueType use_dynamic = 511 frame->CalculateTarget()->GetPreferDynamicValue(); 512 value = FindVariable(name, use_dynamic); 513 } 514 return LLDB_RECORD_RESULT(value); 515 } 516 517 SBValue SBFrame::FindVariable(const char *name, 518 lldb::DynamicValueType use_dynamic) { 519 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 520 (const char *, lldb::DynamicValueType), name, use_dynamic); 521 522 VariableSP var_sp; 523 SBValue sb_value; 524 525 if (name == nullptr || name[0] == '\0') { 526 return LLDB_RECORD_RESULT(sb_value); 527 } 528 529 ValueObjectSP value_sp; 530 std::unique_lock<std::recursive_mutex> lock; 531 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 532 533 StackFrame *frame = nullptr; 534 Target *target = exe_ctx.GetTargetPtr(); 535 Process *process = exe_ctx.GetProcessPtr(); 536 if (target && process) { 537 Process::StopLocker stop_locker; 538 if (stop_locker.TryLock(&process->GetRunLock())) { 539 frame = exe_ctx.GetFramePtr(); 540 if (frame) { 541 value_sp = frame->FindVariable(ConstString(name)); 542 543 if (value_sp) 544 sb_value.SetSP(value_sp, use_dynamic); 545 } 546 } 547 } 548 549 return LLDB_RECORD_RESULT(sb_value); 550 } 551 552 SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 553 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 554 (const char *, lldb::ValueType), name, value_type); 555 556 SBValue value; 557 std::unique_lock<std::recursive_mutex> lock; 558 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 559 560 StackFrame *frame = exe_ctx.GetFramePtr(); 561 Target *target = exe_ctx.GetTargetPtr(); 562 if (frame && target) { 563 lldb::DynamicValueType use_dynamic = 564 frame->CalculateTarget()->GetPreferDynamicValue(); 565 value = FindValue(name, value_type, use_dynamic); 566 } 567 return LLDB_RECORD_RESULT(value); 568 } 569 570 SBValue SBFrame::FindValue(const char *name, ValueType value_type, 571 lldb::DynamicValueType use_dynamic) { 572 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 573 (const char *, lldb::ValueType, lldb::DynamicValueType), 574 name, value_type, use_dynamic); 575 576 SBValue sb_value; 577 578 if (name == nullptr || name[0] == '\0') { 579 return LLDB_RECORD_RESULT(sb_value); 580 } 581 582 ValueObjectSP value_sp; 583 std::unique_lock<std::recursive_mutex> lock; 584 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 585 586 StackFrame *frame = nullptr; 587 Target *target = exe_ctx.GetTargetPtr(); 588 Process *process = exe_ctx.GetProcessPtr(); 589 if (target && process) { 590 Process::StopLocker stop_locker; 591 if (stop_locker.TryLock(&process->GetRunLock())) { 592 frame = exe_ctx.GetFramePtr(); 593 if (frame) { 594 VariableList variable_list; 595 596 switch (value_type) { 597 case eValueTypeVariableGlobal: // global variable 598 case eValueTypeVariableStatic: // static variable 599 case eValueTypeVariableArgument: // function argument variables 600 case eValueTypeVariableLocal: // function local variables 601 case eValueTypeVariableThreadLocal: // thread local variables 602 { 603 SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 604 605 const bool can_create = true; 606 const bool get_parent_variables = true; 607 const bool stop_if_block_is_inlined_function = true; 608 609 if (sc.block) 610 sc.block->AppendVariables( 611 can_create, get_parent_variables, 612 stop_if_block_is_inlined_function, 613 [frame](Variable *v) { return v->IsInScope(frame); }, 614 &variable_list); 615 if (value_type == eValueTypeVariableGlobal) { 616 const bool get_file_globals = true; 617 VariableList *frame_vars = frame->GetVariableList(get_file_globals); 618 if (frame_vars) 619 frame_vars->AppendVariablesIfUnique(variable_list); 620 } 621 ConstString const_name(name); 622 VariableSP variable_sp( 623 variable_list.FindVariable(const_name, value_type)); 624 if (variable_sp) { 625 value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 626 eNoDynamicValues); 627 sb_value.SetSP(value_sp, use_dynamic); 628 } 629 } break; 630 631 case eValueTypeRegister: // stack frame register value 632 { 633 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 634 if (reg_ctx) { 635 const uint32_t num_regs = reg_ctx->GetRegisterCount(); 636 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 637 const RegisterInfo *reg_info = 638 reg_ctx->GetRegisterInfoAtIndex(reg_idx); 639 if (reg_info && 640 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 641 (reg_info->alt_name && 642 strcasecmp(reg_info->alt_name, name) == 0))) { 643 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 644 sb_value.SetSP(value_sp); 645 break; 646 } 647 } 648 } 649 } break; 650 651 case eValueTypeRegisterSet: // A collection of stack frame register 652 // values 653 { 654 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 655 if (reg_ctx) { 656 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 657 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 658 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 659 if (reg_set && 660 ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 661 (reg_set->short_name && 662 strcasecmp(reg_set->short_name, name) == 0))) { 663 value_sp = 664 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 665 sb_value.SetSP(value_sp); 666 break; 667 } 668 } 669 } 670 } break; 671 672 case eValueTypeConstResult: // constant result variables 673 { 674 ConstString const_name(name); 675 ExpressionVariableSP expr_var_sp( 676 target->GetPersistentVariable(const_name)); 677 if (expr_var_sp) { 678 value_sp = expr_var_sp->GetValueObject(); 679 sb_value.SetSP(value_sp, use_dynamic); 680 } 681 } break; 682 683 default: 684 break; 685 } 686 } 687 } 688 } 689 690 return LLDB_RECORD_RESULT(sb_value); 691 } 692 693 bool SBFrame::IsEqual(const SBFrame &that) const { 694 LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 695 that); 696 697 lldb::StackFrameSP this_sp = GetFrameSP(); 698 lldb::StackFrameSP that_sp = that.GetFrameSP(); 699 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 700 } 701 702 bool SBFrame::operator==(const SBFrame &rhs) const { 703 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 704 rhs); 705 706 return IsEqual(rhs); 707 } 708 709 bool SBFrame::operator!=(const SBFrame &rhs) const { 710 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 711 rhs); 712 713 return !IsEqual(rhs); 714 } 715 716 SBThread SBFrame::GetThread() const { 717 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 718 719 std::unique_lock<std::recursive_mutex> lock; 720 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 721 722 ThreadSP thread_sp(exe_ctx.GetThreadSP()); 723 SBThread sb_thread(thread_sp); 724 725 return LLDB_RECORD_RESULT(sb_thread); 726 } 727 728 const char *SBFrame::Disassemble() const { 729 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 730 731 const char *disassembly = nullptr; 732 std::unique_lock<std::recursive_mutex> lock; 733 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 734 735 StackFrame *frame = nullptr; 736 Target *target = exe_ctx.GetTargetPtr(); 737 Process *process = exe_ctx.GetProcessPtr(); 738 if (target && process) { 739 Process::StopLocker stop_locker; 740 if (stop_locker.TryLock(&process->GetRunLock())) { 741 frame = exe_ctx.GetFramePtr(); 742 if (frame) { 743 disassembly = frame->Disassemble(); 744 } 745 } 746 } 747 748 return disassembly; 749 } 750 751 SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 752 bool in_scope_only) { 753 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 754 (bool, bool, bool, bool), arguments, locals, statics, 755 in_scope_only); 756 757 SBValueList value_list; 758 std::unique_lock<std::recursive_mutex> lock; 759 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 760 761 StackFrame *frame = exe_ctx.GetFramePtr(); 762 Target *target = exe_ctx.GetTargetPtr(); 763 if (frame && target) { 764 lldb::DynamicValueType use_dynamic = 765 frame->CalculateTarget()->GetPreferDynamicValue(); 766 const bool include_runtime_support_values = 767 target ? target->GetDisplayRuntimeSupportValues() : false; 768 769 SBVariablesOptions options; 770 options.SetIncludeArguments(arguments); 771 options.SetIncludeLocals(locals); 772 options.SetIncludeStatics(statics); 773 options.SetInScopeOnly(in_scope_only); 774 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 775 options.SetUseDynamic(use_dynamic); 776 777 value_list = GetVariables(options); 778 } 779 return LLDB_RECORD_RESULT(value_list); 780 } 781 782 lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 783 bool statics, bool in_scope_only, 784 lldb::DynamicValueType use_dynamic) { 785 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 786 (bool, bool, bool, bool, lldb::DynamicValueType), 787 arguments, locals, statics, in_scope_only, use_dynamic); 788 789 std::unique_lock<std::recursive_mutex> lock; 790 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 791 792 Target *target = exe_ctx.GetTargetPtr(); 793 const bool include_runtime_support_values = 794 target ? target->GetDisplayRuntimeSupportValues() : false; 795 SBVariablesOptions options; 796 options.SetIncludeArguments(arguments); 797 options.SetIncludeLocals(locals); 798 options.SetIncludeStatics(statics); 799 options.SetInScopeOnly(in_scope_only); 800 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 801 options.SetUseDynamic(use_dynamic); 802 return LLDB_RECORD_RESULT(GetVariables(options)); 803 } 804 805 SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 806 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 807 (const lldb::SBVariablesOptions &), options); 808 809 SBValueList value_list; 810 std::unique_lock<std::recursive_mutex> lock; 811 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 812 813 StackFrame *frame = nullptr; 814 Target *target = exe_ctx.GetTargetPtr(); 815 816 const bool statics = options.GetIncludeStatics(); 817 const bool arguments = options.GetIncludeArguments(); 818 const bool recognized_arguments = 819 options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 820 const bool locals = options.GetIncludeLocals(); 821 const bool in_scope_only = options.GetInScopeOnly(); 822 const bool include_runtime_support_values = 823 options.GetIncludeRuntimeSupportValues(); 824 const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 825 826 827 std::set<VariableSP> variable_set; 828 Process *process = exe_ctx.GetProcessPtr(); 829 if (target && process) { 830 Process::StopLocker stop_locker; 831 if (stop_locker.TryLock(&process->GetRunLock())) { 832 frame = exe_ctx.GetFramePtr(); 833 if (frame) { 834 VariableList *variable_list = nullptr; 835 variable_list = frame->GetVariableList(true); 836 if (variable_list) { 837 const size_t num_variables = variable_list->GetSize(); 838 if (num_variables) { 839 for (const VariableSP &variable_sp : *variable_list) { 840 if (variable_sp) { 841 bool add_variable = false; 842 switch (variable_sp->GetScope()) { 843 case eValueTypeVariableGlobal: 844 case eValueTypeVariableStatic: 845 case eValueTypeVariableThreadLocal: 846 add_variable = statics; 847 break; 848 849 case eValueTypeVariableArgument: 850 add_variable = arguments; 851 break; 852 853 case eValueTypeVariableLocal: 854 add_variable = locals; 855 break; 856 857 default: 858 break; 859 } 860 if (add_variable) { 861 // Only add variables once so we don't end up with duplicates 862 if (variable_set.find(variable_sp) == variable_set.end()) 863 variable_set.insert(variable_sp); 864 else 865 continue; 866 867 if (in_scope_only && !variable_sp->IsInScope(frame)) 868 continue; 869 870 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 871 variable_sp, eNoDynamicValues)); 872 873 if (!include_runtime_support_values && valobj_sp != nullptr && 874 valobj_sp->IsRuntimeSupportValue()) 875 continue; 876 877 SBValue value_sb; 878 value_sb.SetSP(valobj_sp, use_dynamic); 879 value_list.Append(value_sb); 880 } 881 } 882 } 883 } 884 } 885 if (recognized_arguments) { 886 auto recognized_frame = frame->GetRecognizedFrame(); 887 if (recognized_frame) { 888 ValueObjectListSP recognized_arg_list = 889 recognized_frame->GetRecognizedArguments(); 890 if (recognized_arg_list) { 891 for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 892 SBValue value_sb; 893 value_sb.SetSP(rec_value_sp, use_dynamic); 894 value_list.Append(value_sb); 895 } 896 } 897 } 898 } 899 } 900 } 901 } 902 903 return LLDB_RECORD_RESULT(value_list); 904 } 905 906 SBValueList SBFrame::GetRegisters() { 907 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 908 909 SBValueList value_list; 910 std::unique_lock<std::recursive_mutex> lock; 911 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 912 913 StackFrame *frame = nullptr; 914 Target *target = exe_ctx.GetTargetPtr(); 915 Process *process = exe_ctx.GetProcessPtr(); 916 if (target && process) { 917 Process::StopLocker stop_locker; 918 if (stop_locker.TryLock(&process->GetRunLock())) { 919 frame = exe_ctx.GetFramePtr(); 920 if (frame) { 921 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 922 if (reg_ctx) { 923 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 924 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 925 value_list.Append( 926 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 927 } 928 } 929 } 930 } 931 } 932 933 return LLDB_RECORD_RESULT(value_list); 934 } 935 936 SBValue SBFrame::FindRegister(const char *name) { 937 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 938 name); 939 940 SBValue result; 941 ValueObjectSP value_sp; 942 std::unique_lock<std::recursive_mutex> lock; 943 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 944 945 StackFrame *frame = nullptr; 946 Target *target = exe_ctx.GetTargetPtr(); 947 Process *process = exe_ctx.GetProcessPtr(); 948 if (target && process) { 949 Process::StopLocker stop_locker; 950 if (stop_locker.TryLock(&process->GetRunLock())) { 951 frame = exe_ctx.GetFramePtr(); 952 if (frame) { 953 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 954 if (reg_ctx) { 955 const uint32_t num_regs = reg_ctx->GetRegisterCount(); 956 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 957 const RegisterInfo *reg_info = 958 reg_ctx->GetRegisterInfoAtIndex(reg_idx); 959 if (reg_info && 960 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 961 (reg_info->alt_name && 962 strcasecmp(reg_info->alt_name, name) == 0))) { 963 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 964 result.SetSP(value_sp); 965 break; 966 } 967 } 968 } 969 } 970 } 971 } 972 973 return LLDB_RECORD_RESULT(result); 974 } 975 976 bool SBFrame::GetDescription(SBStream &description) { 977 LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 978 description); 979 980 Stream &strm = description.ref(); 981 982 std::unique_lock<std::recursive_mutex> lock; 983 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 984 985 StackFrame *frame; 986 Target *target = exe_ctx.GetTargetPtr(); 987 Process *process = exe_ctx.GetProcessPtr(); 988 if (target && process) { 989 Process::StopLocker stop_locker; 990 if (stop_locker.TryLock(&process->GetRunLock())) { 991 frame = exe_ctx.GetFramePtr(); 992 if (frame) { 993 frame->DumpUsingSettingsFormat(&strm); 994 } 995 } 996 997 } else 998 strm.PutCString("No value"); 999 1000 return true; 1001 } 1002 1003 SBValue SBFrame::EvaluateExpression(const char *expr) { 1004 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1005 expr); 1006 1007 SBValue result; 1008 std::unique_lock<std::recursive_mutex> lock; 1009 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1010 1011 StackFrame *frame = exe_ctx.GetFramePtr(); 1012 Target *target = exe_ctx.GetTargetPtr(); 1013 if (frame && target) { 1014 SBExpressionOptions options; 1015 lldb::DynamicValueType fetch_dynamic_value = 1016 frame->CalculateTarget()->GetPreferDynamicValue(); 1017 options.SetFetchDynamicValue(fetch_dynamic_value); 1018 options.SetUnwindOnError(true); 1019 options.SetIgnoreBreakpoints(true); 1020 if (target->GetLanguage() != eLanguageTypeUnknown) 1021 options.SetLanguage(target->GetLanguage()); 1022 else 1023 options.SetLanguage(frame->GetLanguage()); 1024 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1025 } 1026 return LLDB_RECORD_RESULT(result); 1027 } 1028 1029 SBValue 1030 SBFrame::EvaluateExpression(const char *expr, 1031 lldb::DynamicValueType fetch_dynamic_value) { 1032 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1033 (const char *, lldb::DynamicValueType), expr, 1034 fetch_dynamic_value); 1035 1036 SBExpressionOptions options; 1037 options.SetFetchDynamicValue(fetch_dynamic_value); 1038 options.SetUnwindOnError(true); 1039 options.SetIgnoreBreakpoints(true); 1040 std::unique_lock<std::recursive_mutex> lock; 1041 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1042 1043 StackFrame *frame = exe_ctx.GetFramePtr(); 1044 Target *target = exe_ctx.GetTargetPtr(); 1045 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1046 options.SetLanguage(target->GetLanguage()); 1047 else if (frame) 1048 options.SetLanguage(frame->GetLanguage()); 1049 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1050 } 1051 1052 SBValue SBFrame::EvaluateExpression(const char *expr, 1053 lldb::DynamicValueType fetch_dynamic_value, 1054 bool unwind_on_error) { 1055 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1056 (const char *, lldb::DynamicValueType, bool), expr, 1057 fetch_dynamic_value, unwind_on_error); 1058 1059 SBExpressionOptions options; 1060 std::unique_lock<std::recursive_mutex> lock; 1061 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1062 1063 options.SetFetchDynamicValue(fetch_dynamic_value); 1064 options.SetUnwindOnError(unwind_on_error); 1065 options.SetIgnoreBreakpoints(true); 1066 StackFrame *frame = exe_ctx.GetFramePtr(); 1067 Target *target = exe_ctx.GetTargetPtr(); 1068 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1069 options.SetLanguage(target->GetLanguage()); 1070 else if (frame) 1071 options.SetLanguage(frame->GetLanguage()); 1072 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1073 } 1074 1075 lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1076 const SBExpressionOptions &options) { 1077 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1078 (const char *, const lldb::SBExpressionOptions &), expr, 1079 options); 1080 1081 Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1082 1083 SBValue expr_result; 1084 1085 if (expr == nullptr || expr[0] == '\0') { 1086 return LLDB_RECORD_RESULT(expr_result); 1087 } 1088 1089 ValueObjectSP expr_value_sp; 1090 1091 std::unique_lock<std::recursive_mutex> lock; 1092 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1093 1094 1095 StackFrame *frame = nullptr; 1096 Target *target = exe_ctx.GetTargetPtr(); 1097 Process *process = exe_ctx.GetProcessPtr(); 1098 1099 if (target && process) { 1100 Process::StopLocker stop_locker; 1101 if (stop_locker.TryLock(&process->GetRunLock())) { 1102 frame = exe_ctx.GetFramePtr(); 1103 if (frame) { 1104 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1105 if (target->GetDisplayExpressionsInCrashlogs()) { 1106 StreamString frame_description; 1107 frame->DumpUsingSettingsFormat(&frame_description); 1108 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1109 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1110 "= %u) %s", 1111 expr, options.GetFetchDynamicValue(), 1112 frame_description.GetData()); 1113 } 1114 1115 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1116 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1117 } 1118 } 1119 } 1120 1121 LLDB_LOGF(expr_log, 1122 "** [SBFrame::EvaluateExpression] Expression result is " 1123 "%s, summary %s **", 1124 expr_result.GetValue(), expr_result.GetSummary()); 1125 1126 return LLDB_RECORD_RESULT(expr_result); 1127 } 1128 1129 bool SBFrame::IsInlined() { 1130 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1131 1132 return static_cast<const SBFrame *>(this)->IsInlined(); 1133 } 1134 1135 bool SBFrame::IsInlined() const { 1136 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1137 1138 std::unique_lock<std::recursive_mutex> lock; 1139 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1140 1141 StackFrame *frame = nullptr; 1142 Target *target = exe_ctx.GetTargetPtr(); 1143 Process *process = exe_ctx.GetProcessPtr(); 1144 if (target && process) { 1145 Process::StopLocker stop_locker; 1146 if (stop_locker.TryLock(&process->GetRunLock())) { 1147 frame = exe_ctx.GetFramePtr(); 1148 if (frame) { 1149 1150 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1151 if (block) 1152 return block->GetContainingInlinedBlock() != nullptr; 1153 } 1154 } 1155 } 1156 return false; 1157 } 1158 1159 bool SBFrame::IsArtificial() { 1160 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1161 1162 return static_cast<const SBFrame *>(this)->IsArtificial(); 1163 } 1164 1165 bool SBFrame::IsArtificial() const { 1166 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1167 1168 std::unique_lock<std::recursive_mutex> lock; 1169 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1170 1171 StackFrame *frame = exe_ctx.GetFramePtr(); 1172 if (frame) 1173 return frame->IsArtificial(); 1174 1175 return false; 1176 } 1177 1178 const char *SBFrame::GetFunctionName() { 1179 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1180 1181 return static_cast<const SBFrame *>(this)->GetFunctionName(); 1182 } 1183 1184 lldb::LanguageType SBFrame::GuessLanguage() const { 1185 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1186 1187 std::unique_lock<std::recursive_mutex> lock; 1188 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1189 1190 StackFrame *frame = nullptr; 1191 Target *target = exe_ctx.GetTargetPtr(); 1192 Process *process = exe_ctx.GetProcessPtr(); 1193 if (target && process) { 1194 Process::StopLocker stop_locker; 1195 if (stop_locker.TryLock(&process->GetRunLock())) { 1196 frame = exe_ctx.GetFramePtr(); 1197 if (frame) { 1198 return frame->GuessLanguage(); 1199 } 1200 } 1201 } 1202 return eLanguageTypeUnknown; 1203 } 1204 1205 const char *SBFrame::GetFunctionName() const { 1206 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1207 1208 const char *name = nullptr; 1209 std::unique_lock<std::recursive_mutex> lock; 1210 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1211 1212 StackFrame *frame = nullptr; 1213 Target *target = exe_ctx.GetTargetPtr(); 1214 Process *process = exe_ctx.GetProcessPtr(); 1215 if (target && process) { 1216 Process::StopLocker stop_locker; 1217 if (stop_locker.TryLock(&process->GetRunLock())) { 1218 frame = exe_ctx.GetFramePtr(); 1219 if (frame) { 1220 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1221 eSymbolContextBlock | 1222 eSymbolContextSymbol)); 1223 if (sc.block) { 1224 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1225 if (inlined_block) { 1226 const InlineFunctionInfo *inlined_info = 1227 inlined_block->GetInlinedFunctionInfo(); 1228 name = 1229 inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1230 } 1231 } 1232 1233 if (name == nullptr) { 1234 if (sc.function) 1235 name = sc.function->GetName().GetCString(); 1236 } 1237 1238 if (name == nullptr) { 1239 if (sc.symbol) 1240 name = sc.symbol->GetName().GetCString(); 1241 } 1242 } 1243 } 1244 } 1245 return name; 1246 } 1247 1248 const char *SBFrame::GetDisplayFunctionName() { 1249 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1250 1251 const char *name = nullptr; 1252 1253 std::unique_lock<std::recursive_mutex> lock; 1254 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1255 1256 StackFrame *frame = nullptr; 1257 Target *target = exe_ctx.GetTargetPtr(); 1258 Process *process = exe_ctx.GetProcessPtr(); 1259 if (target && process) { 1260 Process::StopLocker stop_locker; 1261 if (stop_locker.TryLock(&process->GetRunLock())) { 1262 frame = exe_ctx.GetFramePtr(); 1263 if (frame) { 1264 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1265 eSymbolContextBlock | 1266 eSymbolContextSymbol)); 1267 if (sc.block) { 1268 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1269 if (inlined_block) { 1270 const InlineFunctionInfo *inlined_info = 1271 inlined_block->GetInlinedFunctionInfo(); 1272 name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1273 .AsCString(); 1274 } 1275 } 1276 1277 if (name == nullptr) { 1278 if (sc.function) 1279 name = sc.function->GetDisplayName().GetCString(); 1280 } 1281 1282 if (name == nullptr) { 1283 if (sc.symbol) 1284 name = sc.symbol->GetDisplayName().GetCString(); 1285 } 1286 } 1287 } 1288 } 1289 return name; 1290 } 1291 1292 namespace lldb_private { 1293 namespace repro { 1294 1295 template <> 1296 void RegisterMethods<SBFrame>(Registry &R) { 1297 LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1298 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1299 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1300 LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1301 SBFrame, operator=,(const lldb::SBFrame &)); 1302 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1303 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1304 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1305 (uint32_t)); 1306 LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1307 LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1308 ()); 1309 LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1310 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1311 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1312 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1313 LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1314 LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1315 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1316 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1317 LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1318 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1319 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1320 LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1321 LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1322 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1323 (const char *)); 1324 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1325 (const char *, lldb::DynamicValueType)); 1326 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1327 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1328 (const char *, lldb::DynamicValueType)); 1329 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1330 (const char *, lldb::ValueType)); 1331 LLDB_REGISTER_METHOD( 1332 lldb::SBValue, SBFrame, FindValue, 1333 (const char *, lldb::ValueType, lldb::DynamicValueType)); 1334 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1335 LLDB_REGISTER_METHOD_CONST(bool, 1336 SBFrame, operator==,(const lldb::SBFrame &)); 1337 LLDB_REGISTER_METHOD_CONST(bool, 1338 SBFrame, operator!=,(const lldb::SBFrame &)); 1339 LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1340 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1341 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1342 (bool, bool, bool, bool)); 1343 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1344 (bool, bool, bool, bool, lldb::DynamicValueType)); 1345 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1346 (const lldb::SBVariablesOptions &)); 1347 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1348 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1349 LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1350 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1351 (const char *)); 1352 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1353 (const char *, lldb::DynamicValueType)); 1354 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1355 (const char *, lldb::DynamicValueType, bool)); 1356 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1357 (const char *, const lldb::SBExpressionOptions &)); 1358 LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1359 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1360 LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1361 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1362 LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1363 LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1364 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1365 LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1366 } 1367 1368 } 1369 } 1370