1 //===-- SBFrame.cpp -------------------------------------------------------===// 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 Target *target = exe_ctx.GetTargetPtr(); 358 Process *process = exe_ctx.GetProcessPtr(); 359 if (target && process) { 360 Process::StopLocker stop_locker; 361 if (stop_locker.TryLock(&process->GetRunLock())) { 362 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 363 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 364 ret_val = reg_ctx_sp->SetPC(new_pc); 365 } 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 Target *target = exe_ctx.GetTargetPtr(); 381 Process *process = exe_ctx.GetProcessPtr(); 382 if (target && process) { 383 Process::StopLocker stop_locker; 384 if (stop_locker.TryLock(&process->GetRunLock())) { 385 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 386 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 387 addr = reg_ctx_sp->GetSP(); 388 } 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 Target *target = exe_ctx.GetTargetPtr(); 404 Process *process = exe_ctx.GetProcessPtr(); 405 if (target && process) { 406 Process::StopLocker stop_locker; 407 if (stop_locker.TryLock(&process->GetRunLock())) { 408 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 409 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 410 addr = reg_ctx_sp->GetFP(); 411 } 412 } 413 } 414 } 415 416 return addr; 417 } 418 419 SBAddress SBFrame::GetPCAddress() const { 420 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 421 422 SBAddress sb_addr; 423 std::unique_lock<std::recursive_mutex> lock; 424 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 425 426 StackFrame *frame = exe_ctx.GetFramePtr(); 427 Target *target = exe_ctx.GetTargetPtr(); 428 Process *process = exe_ctx.GetProcessPtr(); 429 if (target && process) { 430 Process::StopLocker stop_locker; 431 if (stop_locker.TryLock(&process->GetRunLock())) { 432 frame = exe_ctx.GetFramePtr(); 433 if (frame) 434 sb_addr.SetAddress(frame->GetFrameCodeAddress()); 435 } 436 } 437 return LLDB_RECORD_RESULT(sb_addr); 438 } 439 440 void SBFrame::Clear() { 441 LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 442 443 m_opaque_sp->Clear(); 444 } 445 446 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 447 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 448 (const char *), var_path); 449 450 SBValue sb_value; 451 std::unique_lock<std::recursive_mutex> lock; 452 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 453 454 StackFrame *frame = exe_ctx.GetFramePtr(); 455 Target *target = exe_ctx.GetTargetPtr(); 456 if (frame && target) { 457 lldb::DynamicValueType use_dynamic = 458 frame->CalculateTarget()->GetPreferDynamicValue(); 459 sb_value = GetValueForVariablePath(var_path, use_dynamic); 460 } 461 return LLDB_RECORD_RESULT(sb_value); 462 } 463 464 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 465 DynamicValueType use_dynamic) { 466 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 467 (const char *, lldb::DynamicValueType), var_path, 468 use_dynamic); 469 470 SBValue sb_value; 471 if (var_path == nullptr || var_path[0] == '\0') { 472 return LLDB_RECORD_RESULT(sb_value); 473 } 474 475 std::unique_lock<std::recursive_mutex> lock; 476 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 477 478 StackFrame *frame = nullptr; 479 Target *target = exe_ctx.GetTargetPtr(); 480 Process *process = exe_ctx.GetProcessPtr(); 481 if (target && process) { 482 Process::StopLocker stop_locker; 483 if (stop_locker.TryLock(&process->GetRunLock())) { 484 frame = exe_ctx.GetFramePtr(); 485 if (frame) { 486 VariableSP var_sp; 487 Status error; 488 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 489 var_path, eNoDynamicValues, 490 StackFrame::eExpressionPathOptionCheckPtrVsMember | 491 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 492 var_sp, error)); 493 sb_value.SetSP(value_sp, use_dynamic); 494 } 495 } 496 } 497 return LLDB_RECORD_RESULT(sb_value); 498 } 499 500 SBValue SBFrame::FindVariable(const char *name) { 501 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 502 name); 503 504 SBValue value; 505 std::unique_lock<std::recursive_mutex> lock; 506 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 507 508 StackFrame *frame = exe_ctx.GetFramePtr(); 509 Target *target = exe_ctx.GetTargetPtr(); 510 if (frame && target) { 511 lldb::DynamicValueType use_dynamic = 512 frame->CalculateTarget()->GetPreferDynamicValue(); 513 value = FindVariable(name, use_dynamic); 514 } 515 return LLDB_RECORD_RESULT(value); 516 } 517 518 SBValue SBFrame::FindVariable(const char *name, 519 lldb::DynamicValueType use_dynamic) { 520 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 521 (const char *, lldb::DynamicValueType), name, use_dynamic); 522 523 VariableSP var_sp; 524 SBValue sb_value; 525 526 if (name == nullptr || name[0] == '\0') { 527 return LLDB_RECORD_RESULT(sb_value); 528 } 529 530 ValueObjectSP value_sp; 531 std::unique_lock<std::recursive_mutex> lock; 532 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 533 534 StackFrame *frame = nullptr; 535 Target *target = exe_ctx.GetTargetPtr(); 536 Process *process = exe_ctx.GetProcessPtr(); 537 if (target && process) { 538 Process::StopLocker stop_locker; 539 if (stop_locker.TryLock(&process->GetRunLock())) { 540 frame = exe_ctx.GetFramePtr(); 541 if (frame) { 542 value_sp = frame->FindVariable(ConstString(name)); 543 544 if (value_sp) 545 sb_value.SetSP(value_sp, use_dynamic); 546 } 547 } 548 } 549 550 return LLDB_RECORD_RESULT(sb_value); 551 } 552 553 SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 554 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 555 (const char *, lldb::ValueType), name, value_type); 556 557 SBValue value; 558 std::unique_lock<std::recursive_mutex> lock; 559 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 560 561 StackFrame *frame = exe_ctx.GetFramePtr(); 562 Target *target = exe_ctx.GetTargetPtr(); 563 if (frame && target) { 564 lldb::DynamicValueType use_dynamic = 565 frame->CalculateTarget()->GetPreferDynamicValue(); 566 value = FindValue(name, value_type, use_dynamic); 567 } 568 return LLDB_RECORD_RESULT(value); 569 } 570 571 SBValue SBFrame::FindValue(const char *name, ValueType value_type, 572 lldb::DynamicValueType use_dynamic) { 573 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 574 (const char *, lldb::ValueType, lldb::DynamicValueType), 575 name, value_type, use_dynamic); 576 577 SBValue sb_value; 578 579 if (name == nullptr || name[0] == '\0') { 580 return LLDB_RECORD_RESULT(sb_value); 581 } 582 583 ValueObjectSP value_sp; 584 std::unique_lock<std::recursive_mutex> lock; 585 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 586 587 StackFrame *frame = nullptr; 588 Target *target = exe_ctx.GetTargetPtr(); 589 Process *process = exe_ctx.GetProcessPtr(); 590 if (target && process) { 591 Process::StopLocker stop_locker; 592 if (stop_locker.TryLock(&process->GetRunLock())) { 593 frame = exe_ctx.GetFramePtr(); 594 if (frame) { 595 VariableList variable_list; 596 597 switch (value_type) { 598 case eValueTypeVariableGlobal: // global variable 599 case eValueTypeVariableStatic: // static variable 600 case eValueTypeVariableArgument: // function argument variables 601 case eValueTypeVariableLocal: // function local variables 602 case eValueTypeVariableThreadLocal: // thread local variables 603 { 604 SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 605 606 const bool can_create = true; 607 const bool get_parent_variables = true; 608 const bool stop_if_block_is_inlined_function = true; 609 610 if (sc.block) 611 sc.block->AppendVariables( 612 can_create, get_parent_variables, 613 stop_if_block_is_inlined_function, 614 [frame](Variable *v) { return v->IsInScope(frame); }, 615 &variable_list); 616 if (value_type == eValueTypeVariableGlobal) { 617 const bool get_file_globals = true; 618 VariableList *frame_vars = frame->GetVariableList(get_file_globals); 619 if (frame_vars) 620 frame_vars->AppendVariablesIfUnique(variable_list); 621 } 622 ConstString const_name(name); 623 VariableSP variable_sp( 624 variable_list.FindVariable(const_name, value_type)); 625 if (variable_sp) { 626 value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 627 eNoDynamicValues); 628 sb_value.SetSP(value_sp, use_dynamic); 629 } 630 } break; 631 632 case eValueTypeRegister: // stack frame register value 633 { 634 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 635 if (reg_ctx) { 636 const uint32_t num_regs = reg_ctx->GetRegisterCount(); 637 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 638 const RegisterInfo *reg_info = 639 reg_ctx->GetRegisterInfoAtIndex(reg_idx); 640 if (reg_info && 641 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 642 (reg_info->alt_name && 643 strcasecmp(reg_info->alt_name, name) == 0))) { 644 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 645 sb_value.SetSP(value_sp); 646 break; 647 } 648 } 649 } 650 } break; 651 652 case eValueTypeRegisterSet: // A collection of stack frame register 653 // values 654 { 655 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 656 if (reg_ctx) { 657 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 658 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 659 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 660 if (reg_set && 661 ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 662 (reg_set->short_name && 663 strcasecmp(reg_set->short_name, name) == 0))) { 664 value_sp = 665 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 666 sb_value.SetSP(value_sp); 667 break; 668 } 669 } 670 } 671 } break; 672 673 case eValueTypeConstResult: // constant result variables 674 { 675 ConstString const_name(name); 676 ExpressionVariableSP expr_var_sp( 677 target->GetPersistentVariable(const_name)); 678 if (expr_var_sp) { 679 value_sp = expr_var_sp->GetValueObject(); 680 sb_value.SetSP(value_sp, use_dynamic); 681 } 682 } break; 683 684 default: 685 break; 686 } 687 } 688 } 689 } 690 691 return LLDB_RECORD_RESULT(sb_value); 692 } 693 694 bool SBFrame::IsEqual(const SBFrame &that) const { 695 LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 696 that); 697 698 lldb::StackFrameSP this_sp = GetFrameSP(); 699 lldb::StackFrameSP that_sp = that.GetFrameSP(); 700 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 701 } 702 703 bool SBFrame::operator==(const SBFrame &rhs) const { 704 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 705 rhs); 706 707 return IsEqual(rhs); 708 } 709 710 bool SBFrame::operator!=(const SBFrame &rhs) const { 711 LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 712 rhs); 713 714 return !IsEqual(rhs); 715 } 716 717 SBThread SBFrame::GetThread() const { 718 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 719 720 std::unique_lock<std::recursive_mutex> lock; 721 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 722 723 ThreadSP thread_sp(exe_ctx.GetThreadSP()); 724 SBThread sb_thread(thread_sp); 725 726 return LLDB_RECORD_RESULT(sb_thread); 727 } 728 729 const char *SBFrame::Disassemble() const { 730 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 731 732 const char *disassembly = nullptr; 733 std::unique_lock<std::recursive_mutex> lock; 734 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 735 736 StackFrame *frame = nullptr; 737 Target *target = exe_ctx.GetTargetPtr(); 738 Process *process = exe_ctx.GetProcessPtr(); 739 if (target && process) { 740 Process::StopLocker stop_locker; 741 if (stop_locker.TryLock(&process->GetRunLock())) { 742 frame = exe_ctx.GetFramePtr(); 743 if (frame) { 744 disassembly = frame->Disassemble(); 745 } 746 } 747 } 748 749 return disassembly; 750 } 751 752 SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 753 bool in_scope_only) { 754 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 755 (bool, bool, bool, bool), arguments, locals, statics, 756 in_scope_only); 757 758 SBValueList value_list; 759 std::unique_lock<std::recursive_mutex> lock; 760 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 761 762 StackFrame *frame = exe_ctx.GetFramePtr(); 763 Target *target = exe_ctx.GetTargetPtr(); 764 if (frame && target) { 765 lldb::DynamicValueType use_dynamic = 766 frame->CalculateTarget()->GetPreferDynamicValue(); 767 const bool include_runtime_support_values = 768 target ? target->GetDisplayRuntimeSupportValues() : false; 769 770 SBVariablesOptions options; 771 options.SetIncludeArguments(arguments); 772 options.SetIncludeLocals(locals); 773 options.SetIncludeStatics(statics); 774 options.SetInScopeOnly(in_scope_only); 775 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 776 options.SetUseDynamic(use_dynamic); 777 778 value_list = GetVariables(options); 779 } 780 return LLDB_RECORD_RESULT(value_list); 781 } 782 783 lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 784 bool statics, bool in_scope_only, 785 lldb::DynamicValueType use_dynamic) { 786 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 787 (bool, bool, bool, bool, lldb::DynamicValueType), 788 arguments, locals, statics, in_scope_only, use_dynamic); 789 790 std::unique_lock<std::recursive_mutex> lock; 791 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 792 793 Target *target = exe_ctx.GetTargetPtr(); 794 const bool include_runtime_support_values = 795 target ? target->GetDisplayRuntimeSupportValues() : false; 796 SBVariablesOptions options; 797 options.SetIncludeArguments(arguments); 798 options.SetIncludeLocals(locals); 799 options.SetIncludeStatics(statics); 800 options.SetInScopeOnly(in_scope_only); 801 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 802 options.SetUseDynamic(use_dynamic); 803 return LLDB_RECORD_RESULT(GetVariables(options)); 804 } 805 806 SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 807 LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 808 (const lldb::SBVariablesOptions &), options); 809 810 SBValueList value_list; 811 std::unique_lock<std::recursive_mutex> lock; 812 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 813 814 StackFrame *frame = nullptr; 815 Target *target = exe_ctx.GetTargetPtr(); 816 817 const bool statics = options.GetIncludeStatics(); 818 const bool arguments = options.GetIncludeArguments(); 819 const bool recognized_arguments = 820 options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 821 const bool locals = options.GetIncludeLocals(); 822 const bool in_scope_only = options.GetInScopeOnly(); 823 const bool include_runtime_support_values = 824 options.GetIncludeRuntimeSupportValues(); 825 const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 826 827 828 std::set<VariableSP> variable_set; 829 Process *process = exe_ctx.GetProcessPtr(); 830 if (target && process) { 831 Process::StopLocker stop_locker; 832 if (stop_locker.TryLock(&process->GetRunLock())) { 833 frame = exe_ctx.GetFramePtr(); 834 if (frame) { 835 VariableList *variable_list = nullptr; 836 variable_list = frame->GetVariableList(true); 837 if (variable_list) { 838 const size_t num_variables = variable_list->GetSize(); 839 if (num_variables) { 840 for (const VariableSP &variable_sp : *variable_list) { 841 if (variable_sp) { 842 bool add_variable = false; 843 switch (variable_sp->GetScope()) { 844 case eValueTypeVariableGlobal: 845 case eValueTypeVariableStatic: 846 case eValueTypeVariableThreadLocal: 847 add_variable = statics; 848 break; 849 850 case eValueTypeVariableArgument: 851 add_variable = arguments; 852 break; 853 854 case eValueTypeVariableLocal: 855 add_variable = locals; 856 break; 857 858 default: 859 break; 860 } 861 if (add_variable) { 862 // Only add variables once so we don't end up with duplicates 863 if (variable_set.find(variable_sp) == variable_set.end()) 864 variable_set.insert(variable_sp); 865 else 866 continue; 867 868 if (in_scope_only && !variable_sp->IsInScope(frame)) 869 continue; 870 871 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 872 variable_sp, eNoDynamicValues)); 873 874 if (!include_runtime_support_values && valobj_sp != nullptr && 875 valobj_sp->IsRuntimeSupportValue()) 876 continue; 877 878 SBValue value_sb; 879 value_sb.SetSP(valobj_sp, use_dynamic); 880 value_list.Append(value_sb); 881 } 882 } 883 } 884 } 885 } 886 if (recognized_arguments) { 887 auto recognized_frame = frame->GetRecognizedFrame(); 888 if (recognized_frame) { 889 ValueObjectListSP recognized_arg_list = 890 recognized_frame->GetRecognizedArguments(); 891 if (recognized_arg_list) { 892 for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 893 SBValue value_sb; 894 value_sb.SetSP(rec_value_sp, use_dynamic); 895 value_list.Append(value_sb); 896 } 897 } 898 } 899 } 900 } 901 } 902 } 903 904 return LLDB_RECORD_RESULT(value_list); 905 } 906 907 SBValueList SBFrame::GetRegisters() { 908 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 909 910 SBValueList value_list; 911 std::unique_lock<std::recursive_mutex> lock; 912 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 913 914 StackFrame *frame = nullptr; 915 Target *target = exe_ctx.GetTargetPtr(); 916 Process *process = exe_ctx.GetProcessPtr(); 917 if (target && process) { 918 Process::StopLocker stop_locker; 919 if (stop_locker.TryLock(&process->GetRunLock())) { 920 frame = exe_ctx.GetFramePtr(); 921 if (frame) { 922 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 923 if (reg_ctx) { 924 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 925 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 926 value_list.Append( 927 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 928 } 929 } 930 } 931 } 932 } 933 934 return LLDB_RECORD_RESULT(value_list); 935 } 936 937 SBValue SBFrame::FindRegister(const char *name) { 938 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 939 name); 940 941 SBValue result; 942 ValueObjectSP value_sp; 943 std::unique_lock<std::recursive_mutex> lock; 944 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 945 946 StackFrame *frame = nullptr; 947 Target *target = exe_ctx.GetTargetPtr(); 948 Process *process = exe_ctx.GetProcessPtr(); 949 if (target && process) { 950 Process::StopLocker stop_locker; 951 if (stop_locker.TryLock(&process->GetRunLock())) { 952 frame = exe_ctx.GetFramePtr(); 953 if (frame) { 954 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 955 if (reg_ctx) { 956 const uint32_t num_regs = reg_ctx->GetRegisterCount(); 957 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 958 const RegisterInfo *reg_info = 959 reg_ctx->GetRegisterInfoAtIndex(reg_idx); 960 if (reg_info && 961 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 962 (reg_info->alt_name && 963 strcasecmp(reg_info->alt_name, name) == 0))) { 964 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 965 result.SetSP(value_sp); 966 break; 967 } 968 } 969 } 970 } 971 } 972 } 973 974 return LLDB_RECORD_RESULT(result); 975 } 976 977 bool SBFrame::GetDescription(SBStream &description) { 978 LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 979 description); 980 981 Stream &strm = description.ref(); 982 983 std::unique_lock<std::recursive_mutex> lock; 984 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 985 986 StackFrame *frame; 987 Target *target = exe_ctx.GetTargetPtr(); 988 Process *process = exe_ctx.GetProcessPtr(); 989 if (target && process) { 990 Process::StopLocker stop_locker; 991 if (stop_locker.TryLock(&process->GetRunLock())) { 992 frame = exe_ctx.GetFramePtr(); 993 if (frame) { 994 frame->DumpUsingSettingsFormat(&strm); 995 } 996 } 997 998 } else 999 strm.PutCString("No value"); 1000 1001 return true; 1002 } 1003 1004 SBValue SBFrame::EvaluateExpression(const char *expr) { 1005 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1006 expr); 1007 1008 SBValue result; 1009 std::unique_lock<std::recursive_mutex> lock; 1010 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1011 1012 StackFrame *frame = exe_ctx.GetFramePtr(); 1013 Target *target = exe_ctx.GetTargetPtr(); 1014 if (frame && target) { 1015 SBExpressionOptions options; 1016 lldb::DynamicValueType fetch_dynamic_value = 1017 frame->CalculateTarget()->GetPreferDynamicValue(); 1018 options.SetFetchDynamicValue(fetch_dynamic_value); 1019 options.SetUnwindOnError(true); 1020 options.SetIgnoreBreakpoints(true); 1021 if (target->GetLanguage() != eLanguageTypeUnknown) 1022 options.SetLanguage(target->GetLanguage()); 1023 else 1024 options.SetLanguage(frame->GetLanguage()); 1025 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1026 } 1027 return LLDB_RECORD_RESULT(result); 1028 } 1029 1030 SBValue 1031 SBFrame::EvaluateExpression(const char *expr, 1032 lldb::DynamicValueType fetch_dynamic_value) { 1033 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1034 (const char *, lldb::DynamicValueType), expr, 1035 fetch_dynamic_value); 1036 1037 SBExpressionOptions options; 1038 options.SetFetchDynamicValue(fetch_dynamic_value); 1039 options.SetUnwindOnError(true); 1040 options.SetIgnoreBreakpoints(true); 1041 std::unique_lock<std::recursive_mutex> lock; 1042 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1043 1044 StackFrame *frame = exe_ctx.GetFramePtr(); 1045 Target *target = exe_ctx.GetTargetPtr(); 1046 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1047 options.SetLanguage(target->GetLanguage()); 1048 else if (frame) 1049 options.SetLanguage(frame->GetLanguage()); 1050 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1051 } 1052 1053 SBValue SBFrame::EvaluateExpression(const char *expr, 1054 lldb::DynamicValueType fetch_dynamic_value, 1055 bool unwind_on_error) { 1056 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1057 (const char *, lldb::DynamicValueType, bool), expr, 1058 fetch_dynamic_value, unwind_on_error); 1059 1060 SBExpressionOptions options; 1061 std::unique_lock<std::recursive_mutex> lock; 1062 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1063 1064 options.SetFetchDynamicValue(fetch_dynamic_value); 1065 options.SetUnwindOnError(unwind_on_error); 1066 options.SetIgnoreBreakpoints(true); 1067 StackFrame *frame = exe_ctx.GetFramePtr(); 1068 Target *target = exe_ctx.GetTargetPtr(); 1069 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1070 options.SetLanguage(target->GetLanguage()); 1071 else if (frame) 1072 options.SetLanguage(frame->GetLanguage()); 1073 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1074 } 1075 1076 lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1077 const SBExpressionOptions &options) { 1078 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1079 (const char *, const lldb::SBExpressionOptions &), expr, 1080 options); 1081 1082 Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1083 1084 SBValue expr_result; 1085 1086 if (expr == nullptr || expr[0] == '\0') { 1087 return LLDB_RECORD_RESULT(expr_result); 1088 } 1089 1090 ValueObjectSP expr_value_sp; 1091 1092 std::unique_lock<std::recursive_mutex> lock; 1093 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1094 1095 1096 StackFrame *frame = nullptr; 1097 Target *target = exe_ctx.GetTargetPtr(); 1098 Process *process = exe_ctx.GetProcessPtr(); 1099 1100 if (target && process) { 1101 Process::StopLocker stop_locker; 1102 if (stop_locker.TryLock(&process->GetRunLock())) { 1103 frame = exe_ctx.GetFramePtr(); 1104 if (frame) { 1105 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1106 if (target->GetDisplayExpressionsInCrashlogs()) { 1107 StreamString frame_description; 1108 frame->DumpUsingSettingsFormat(&frame_description); 1109 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1110 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1111 "= %u) %s", 1112 expr, options.GetFetchDynamicValue(), 1113 frame_description.GetData()); 1114 } 1115 1116 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1117 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1118 } 1119 } 1120 } 1121 1122 LLDB_LOGF(expr_log, 1123 "** [SBFrame::EvaluateExpression] Expression result is " 1124 "%s, summary %s **", 1125 expr_result.GetValue(), expr_result.GetSummary()); 1126 1127 return LLDB_RECORD_RESULT(expr_result); 1128 } 1129 1130 bool SBFrame::IsInlined() { 1131 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1132 1133 return static_cast<const SBFrame *>(this)->IsInlined(); 1134 } 1135 1136 bool SBFrame::IsInlined() const { 1137 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1138 1139 std::unique_lock<std::recursive_mutex> lock; 1140 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1141 1142 StackFrame *frame = nullptr; 1143 Target *target = exe_ctx.GetTargetPtr(); 1144 Process *process = exe_ctx.GetProcessPtr(); 1145 if (target && process) { 1146 Process::StopLocker stop_locker; 1147 if (stop_locker.TryLock(&process->GetRunLock())) { 1148 frame = exe_ctx.GetFramePtr(); 1149 if (frame) { 1150 1151 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1152 if (block) 1153 return block->GetContainingInlinedBlock() != nullptr; 1154 } 1155 } 1156 } 1157 return false; 1158 } 1159 1160 bool SBFrame::IsArtificial() { 1161 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1162 1163 return static_cast<const SBFrame *>(this)->IsArtificial(); 1164 } 1165 1166 bool SBFrame::IsArtificial() const { 1167 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1168 1169 std::unique_lock<std::recursive_mutex> lock; 1170 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1171 1172 StackFrame *frame = exe_ctx.GetFramePtr(); 1173 if (frame) 1174 return frame->IsArtificial(); 1175 1176 return false; 1177 } 1178 1179 const char *SBFrame::GetFunctionName() { 1180 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1181 1182 return static_cast<const SBFrame *>(this)->GetFunctionName(); 1183 } 1184 1185 lldb::LanguageType SBFrame::GuessLanguage() const { 1186 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1187 1188 std::unique_lock<std::recursive_mutex> lock; 1189 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1190 1191 StackFrame *frame = nullptr; 1192 Target *target = exe_ctx.GetTargetPtr(); 1193 Process *process = exe_ctx.GetProcessPtr(); 1194 if (target && process) { 1195 Process::StopLocker stop_locker; 1196 if (stop_locker.TryLock(&process->GetRunLock())) { 1197 frame = exe_ctx.GetFramePtr(); 1198 if (frame) { 1199 return frame->GuessLanguage(); 1200 } 1201 } 1202 } 1203 return eLanguageTypeUnknown; 1204 } 1205 1206 const char *SBFrame::GetFunctionName() const { 1207 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1208 1209 const char *name = nullptr; 1210 std::unique_lock<std::recursive_mutex> lock; 1211 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1212 1213 StackFrame *frame = nullptr; 1214 Target *target = exe_ctx.GetTargetPtr(); 1215 Process *process = exe_ctx.GetProcessPtr(); 1216 if (target && process) { 1217 Process::StopLocker stop_locker; 1218 if (stop_locker.TryLock(&process->GetRunLock())) { 1219 frame = exe_ctx.GetFramePtr(); 1220 if (frame) { 1221 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1222 eSymbolContextBlock | 1223 eSymbolContextSymbol)); 1224 if (sc.block) { 1225 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1226 if (inlined_block) { 1227 const InlineFunctionInfo *inlined_info = 1228 inlined_block->GetInlinedFunctionInfo(); 1229 name = inlined_info->GetName().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().AsCString(); 1273 } 1274 } 1275 1276 if (name == nullptr) { 1277 if (sc.function) 1278 name = sc.function->GetDisplayName().GetCString(); 1279 } 1280 1281 if (name == nullptr) { 1282 if (sc.symbol) 1283 name = sc.symbol->GetDisplayName().GetCString(); 1284 } 1285 } 1286 } 1287 } 1288 return name; 1289 } 1290 1291 namespace lldb_private { 1292 namespace repro { 1293 1294 template <> 1295 void RegisterMethods<SBFrame>(Registry &R) { 1296 LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1297 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1298 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1299 LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1300 SBFrame, operator=,(const lldb::SBFrame &)); 1301 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1302 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1303 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1304 (uint32_t)); 1305 LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1306 LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1307 ()); 1308 LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1309 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1310 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1311 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1312 LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1313 LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1314 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1315 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1316 LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1317 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1318 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1319 LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1320 LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1321 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1322 (const char *)); 1323 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1324 (const char *, lldb::DynamicValueType)); 1325 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1326 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1327 (const char *, lldb::DynamicValueType)); 1328 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1329 (const char *, lldb::ValueType)); 1330 LLDB_REGISTER_METHOD( 1331 lldb::SBValue, SBFrame, FindValue, 1332 (const char *, lldb::ValueType, lldb::DynamicValueType)); 1333 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1334 LLDB_REGISTER_METHOD_CONST(bool, 1335 SBFrame, operator==,(const lldb::SBFrame &)); 1336 LLDB_REGISTER_METHOD_CONST(bool, 1337 SBFrame, operator!=,(const lldb::SBFrame &)); 1338 LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1339 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1340 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1341 (bool, bool, bool, bool)); 1342 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1343 (bool, bool, bool, bool, lldb::DynamicValueType)); 1344 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1345 (const lldb::SBVariablesOptions &)); 1346 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1347 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1348 LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1349 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1350 (const char *)); 1351 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1352 (const char *, lldb::DynamicValueType)); 1353 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1354 (const char *, lldb::DynamicValueType, bool)); 1355 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1356 (const char *, const lldb::SBExpressionOptions &)); 1357 LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1358 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1359 LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1360 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1361 LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1362 LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1363 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1364 LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1365 } 1366 1367 } 1368 } 1369