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 size_t i; 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 (i = 0; i < num_variables; ++i) { 841 VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 842 if (variable_sp) { 843 bool add_variable = false; 844 switch (variable_sp->GetScope()) { 845 case eValueTypeVariableGlobal: 846 case eValueTypeVariableStatic: 847 case eValueTypeVariableThreadLocal: 848 add_variable = statics; 849 break; 850 851 case eValueTypeVariableArgument: 852 add_variable = arguments; 853 break; 854 855 case eValueTypeVariableLocal: 856 add_variable = locals; 857 break; 858 859 default: 860 break; 861 } 862 if (add_variable) { 863 // Only add variables once so we don't end up with duplicates 864 if (variable_set.find(variable_sp) == variable_set.end()) 865 variable_set.insert(variable_sp); 866 else 867 continue; 868 869 if (in_scope_only && !variable_sp->IsInScope(frame)) 870 continue; 871 872 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 873 variable_sp, eNoDynamicValues)); 874 875 if (!include_runtime_support_values && valobj_sp != nullptr && 876 valobj_sp->IsRuntimeSupportValue()) 877 continue; 878 879 SBValue value_sb; 880 value_sb.SetSP(valobj_sp, use_dynamic); 881 value_list.Append(value_sb); 882 } 883 } 884 } 885 } 886 } 887 if (recognized_arguments) { 888 auto recognized_frame = frame->GetRecognizedFrame(); 889 if (recognized_frame) { 890 ValueObjectListSP recognized_arg_list = 891 recognized_frame->GetRecognizedArguments(); 892 if (recognized_arg_list) { 893 for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 894 SBValue value_sb; 895 value_sb.SetSP(rec_value_sp, use_dynamic); 896 value_list.Append(value_sb); 897 } 898 } 899 } 900 } 901 } 902 } 903 } 904 905 return LLDB_RECORD_RESULT(value_list); 906 } 907 908 SBValueList SBFrame::GetRegisters() { 909 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 910 911 SBValueList value_list; 912 std::unique_lock<std::recursive_mutex> lock; 913 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 914 915 StackFrame *frame = nullptr; 916 Target *target = exe_ctx.GetTargetPtr(); 917 Process *process = exe_ctx.GetProcessPtr(); 918 if (target && process) { 919 Process::StopLocker stop_locker; 920 if (stop_locker.TryLock(&process->GetRunLock())) { 921 frame = exe_ctx.GetFramePtr(); 922 if (frame) { 923 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 924 if (reg_ctx) { 925 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 926 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 927 value_list.Append( 928 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 929 } 930 } 931 } 932 } 933 } 934 935 return LLDB_RECORD_RESULT(value_list); 936 } 937 938 SBValue SBFrame::FindRegister(const char *name) { 939 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 940 name); 941 942 SBValue result; 943 ValueObjectSP value_sp; 944 std::unique_lock<std::recursive_mutex> lock; 945 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 946 947 StackFrame *frame = nullptr; 948 Target *target = exe_ctx.GetTargetPtr(); 949 Process *process = exe_ctx.GetProcessPtr(); 950 if (target && process) { 951 Process::StopLocker stop_locker; 952 if (stop_locker.TryLock(&process->GetRunLock())) { 953 frame = exe_ctx.GetFramePtr(); 954 if (frame) { 955 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 956 if (reg_ctx) { 957 const uint32_t num_regs = reg_ctx->GetRegisterCount(); 958 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 959 const RegisterInfo *reg_info = 960 reg_ctx->GetRegisterInfoAtIndex(reg_idx); 961 if (reg_info && 962 ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 963 (reg_info->alt_name && 964 strcasecmp(reg_info->alt_name, name) == 0))) { 965 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 966 result.SetSP(value_sp); 967 break; 968 } 969 } 970 } 971 } 972 } 973 } 974 975 return LLDB_RECORD_RESULT(result); 976 } 977 978 bool SBFrame::GetDescription(SBStream &description) { 979 LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 980 description); 981 982 Stream &strm = description.ref(); 983 984 std::unique_lock<std::recursive_mutex> lock; 985 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 986 987 StackFrame *frame; 988 Target *target = exe_ctx.GetTargetPtr(); 989 Process *process = exe_ctx.GetProcessPtr(); 990 if (target && process) { 991 Process::StopLocker stop_locker; 992 if (stop_locker.TryLock(&process->GetRunLock())) { 993 frame = exe_ctx.GetFramePtr(); 994 if (frame) { 995 frame->DumpUsingSettingsFormat(&strm); 996 } 997 } 998 999 } else 1000 strm.PutCString("No value"); 1001 1002 return true; 1003 } 1004 1005 SBValue SBFrame::EvaluateExpression(const char *expr) { 1006 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1007 expr); 1008 1009 SBValue result; 1010 std::unique_lock<std::recursive_mutex> lock; 1011 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1012 1013 StackFrame *frame = exe_ctx.GetFramePtr(); 1014 Target *target = exe_ctx.GetTargetPtr(); 1015 if (frame && target) { 1016 SBExpressionOptions options; 1017 lldb::DynamicValueType fetch_dynamic_value = 1018 frame->CalculateTarget()->GetPreferDynamicValue(); 1019 options.SetFetchDynamicValue(fetch_dynamic_value); 1020 options.SetUnwindOnError(true); 1021 options.SetIgnoreBreakpoints(true); 1022 if (target->GetLanguage() != eLanguageTypeUnknown) 1023 options.SetLanguage(target->GetLanguage()); 1024 else 1025 options.SetLanguage(frame->GetLanguage()); 1026 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1027 } 1028 return LLDB_RECORD_RESULT(result); 1029 } 1030 1031 SBValue 1032 SBFrame::EvaluateExpression(const char *expr, 1033 lldb::DynamicValueType fetch_dynamic_value) { 1034 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1035 (const char *, lldb::DynamicValueType), expr, 1036 fetch_dynamic_value); 1037 1038 SBExpressionOptions options; 1039 options.SetFetchDynamicValue(fetch_dynamic_value); 1040 options.SetUnwindOnError(true); 1041 options.SetIgnoreBreakpoints(true); 1042 std::unique_lock<std::recursive_mutex> lock; 1043 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1044 1045 StackFrame *frame = exe_ctx.GetFramePtr(); 1046 Target *target = exe_ctx.GetTargetPtr(); 1047 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1048 options.SetLanguage(target->GetLanguage()); 1049 else if (frame) 1050 options.SetLanguage(frame->GetLanguage()); 1051 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1052 } 1053 1054 SBValue SBFrame::EvaluateExpression(const char *expr, 1055 lldb::DynamicValueType fetch_dynamic_value, 1056 bool unwind_on_error) { 1057 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1058 (const char *, lldb::DynamicValueType, bool), expr, 1059 fetch_dynamic_value, unwind_on_error); 1060 1061 SBExpressionOptions options; 1062 std::unique_lock<std::recursive_mutex> lock; 1063 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1064 1065 options.SetFetchDynamicValue(fetch_dynamic_value); 1066 options.SetUnwindOnError(unwind_on_error); 1067 options.SetIgnoreBreakpoints(true); 1068 StackFrame *frame = exe_ctx.GetFramePtr(); 1069 Target *target = exe_ctx.GetTargetPtr(); 1070 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1071 options.SetLanguage(target->GetLanguage()); 1072 else if (frame) 1073 options.SetLanguage(frame->GetLanguage()); 1074 return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1075 } 1076 1077 lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1078 const SBExpressionOptions &options) { 1079 LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1080 (const char *, const lldb::SBExpressionOptions &), expr, 1081 options); 1082 1083 Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1084 1085 SBValue expr_result; 1086 1087 if (expr == nullptr || expr[0] == '\0') { 1088 return LLDB_RECORD_RESULT(expr_result); 1089 } 1090 1091 ValueObjectSP expr_value_sp; 1092 1093 std::unique_lock<std::recursive_mutex> lock; 1094 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1095 1096 1097 StackFrame *frame = nullptr; 1098 Target *target = exe_ctx.GetTargetPtr(); 1099 Process *process = exe_ctx.GetProcessPtr(); 1100 1101 if (target && process) { 1102 Process::StopLocker stop_locker; 1103 if (stop_locker.TryLock(&process->GetRunLock())) { 1104 frame = exe_ctx.GetFramePtr(); 1105 if (frame) { 1106 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1107 if (target->GetDisplayExpressionsInCrashlogs()) { 1108 StreamString frame_description; 1109 frame->DumpUsingSettingsFormat(&frame_description); 1110 stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1111 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1112 "= %u) %s", 1113 expr, options.GetFetchDynamicValue(), 1114 frame_description.GetData()); 1115 } 1116 1117 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1118 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1119 } 1120 } 1121 } 1122 1123 if (expr_log) 1124 expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1125 "%s, summary %s **", 1126 expr_result.GetValue(), expr_result.GetSummary()); 1127 1128 return LLDB_RECORD_RESULT(expr_result); 1129 } 1130 1131 bool SBFrame::IsInlined() { 1132 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1133 1134 return static_cast<const SBFrame *>(this)->IsInlined(); 1135 } 1136 1137 bool SBFrame::IsInlined() const { 1138 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1139 1140 std::unique_lock<std::recursive_mutex> lock; 1141 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1142 1143 StackFrame *frame = nullptr; 1144 Target *target = exe_ctx.GetTargetPtr(); 1145 Process *process = exe_ctx.GetProcessPtr(); 1146 if (target && process) { 1147 Process::StopLocker stop_locker; 1148 if (stop_locker.TryLock(&process->GetRunLock())) { 1149 frame = exe_ctx.GetFramePtr(); 1150 if (frame) { 1151 1152 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1153 if (block) 1154 return block->GetContainingInlinedBlock() != nullptr; 1155 } 1156 } 1157 } 1158 return false; 1159 } 1160 1161 bool SBFrame::IsArtificial() { 1162 LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1163 1164 return static_cast<const SBFrame *>(this)->IsArtificial(); 1165 } 1166 1167 bool SBFrame::IsArtificial() const { 1168 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1169 1170 std::unique_lock<std::recursive_mutex> lock; 1171 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1172 1173 StackFrame *frame = exe_ctx.GetFramePtr(); 1174 if (frame) 1175 return frame->IsArtificial(); 1176 1177 return false; 1178 } 1179 1180 const char *SBFrame::GetFunctionName() { 1181 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1182 1183 return static_cast<const SBFrame *>(this)->GetFunctionName(); 1184 } 1185 1186 lldb::LanguageType SBFrame::GuessLanguage() const { 1187 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1188 1189 std::unique_lock<std::recursive_mutex> lock; 1190 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1191 1192 StackFrame *frame = nullptr; 1193 Target *target = exe_ctx.GetTargetPtr(); 1194 Process *process = exe_ctx.GetProcessPtr(); 1195 if (target && process) { 1196 Process::StopLocker stop_locker; 1197 if (stop_locker.TryLock(&process->GetRunLock())) { 1198 frame = exe_ctx.GetFramePtr(); 1199 if (frame) { 1200 return frame->GuessLanguage(); 1201 } 1202 } 1203 } 1204 return eLanguageTypeUnknown; 1205 } 1206 1207 const char *SBFrame::GetFunctionName() const { 1208 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1209 1210 const char *name = nullptr; 1211 std::unique_lock<std::recursive_mutex> lock; 1212 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1213 1214 StackFrame *frame = nullptr; 1215 Target *target = exe_ctx.GetTargetPtr(); 1216 Process *process = exe_ctx.GetProcessPtr(); 1217 if (target && process) { 1218 Process::StopLocker stop_locker; 1219 if (stop_locker.TryLock(&process->GetRunLock())) { 1220 frame = exe_ctx.GetFramePtr(); 1221 if (frame) { 1222 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1223 eSymbolContextBlock | 1224 eSymbolContextSymbol)); 1225 if (sc.block) { 1226 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1227 if (inlined_block) { 1228 const InlineFunctionInfo *inlined_info = 1229 inlined_block->GetInlinedFunctionInfo(); 1230 name = 1231 inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1232 } 1233 } 1234 1235 if (name == nullptr) { 1236 if (sc.function) 1237 name = sc.function->GetName().GetCString(); 1238 } 1239 1240 if (name == nullptr) { 1241 if (sc.symbol) 1242 name = sc.symbol->GetName().GetCString(); 1243 } 1244 } 1245 } 1246 } 1247 return name; 1248 } 1249 1250 const char *SBFrame::GetDisplayFunctionName() { 1251 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1252 1253 const char *name = nullptr; 1254 1255 std::unique_lock<std::recursive_mutex> lock; 1256 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1257 1258 StackFrame *frame = nullptr; 1259 Target *target = exe_ctx.GetTargetPtr(); 1260 Process *process = exe_ctx.GetProcessPtr(); 1261 if (target && process) { 1262 Process::StopLocker stop_locker; 1263 if (stop_locker.TryLock(&process->GetRunLock())) { 1264 frame = exe_ctx.GetFramePtr(); 1265 if (frame) { 1266 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1267 eSymbolContextBlock | 1268 eSymbolContextSymbol)); 1269 if (sc.block) { 1270 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1271 if (inlined_block) { 1272 const InlineFunctionInfo *inlined_info = 1273 inlined_block->GetInlinedFunctionInfo(); 1274 name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1275 .AsCString(); 1276 } 1277 } 1278 1279 if (name == nullptr) { 1280 if (sc.function) 1281 name = sc.function->GetDisplayName().GetCString(); 1282 } 1283 1284 if (name == nullptr) { 1285 if (sc.symbol) 1286 name = sc.symbol->GetDisplayName().GetCString(); 1287 } 1288 } 1289 } 1290 } 1291 return name; 1292 } 1293 1294 namespace lldb_private { 1295 namespace repro { 1296 1297 template <> 1298 void RegisterMethods<SBFrame>(Registry &R) { 1299 LLDB_REGISTER_CONSTRUCTOR(SBFrame, ()); 1300 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &)); 1301 LLDB_REGISTER_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &)); 1302 LLDB_REGISTER_METHOD(const lldb::SBFrame &, 1303 SBFrame, operator=,(const lldb::SBFrame &)); 1304 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsValid, ()); 1305 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, operator bool, ()); 1306 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 1307 (uint32_t)); 1308 LLDB_REGISTER_METHOD_CONST(lldb::SBModule, SBFrame, GetModule, ()); 1309 LLDB_REGISTER_METHOD_CONST(lldb::SBCompileUnit, SBFrame, GetCompileUnit, 1310 ()); 1311 LLDB_REGISTER_METHOD_CONST(lldb::SBFunction, SBFrame, GetFunction, ()); 1312 LLDB_REGISTER_METHOD_CONST(lldb::SBSymbol, SBFrame, GetSymbol, ()); 1313 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetBlock, ()); 1314 LLDB_REGISTER_METHOD_CONST(lldb::SBBlock, SBFrame, GetFrameBlock, ()); 1315 LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBFrame, GetLineEntry, ()); 1316 LLDB_REGISTER_METHOD_CONST(uint32_t, SBFrame, GetFrameID, ()); 1317 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetCFA, ()); 1318 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetPC, ()); 1319 LLDB_REGISTER_METHOD(bool, SBFrame, SetPC, (lldb::addr_t)); 1320 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetSP, ()); 1321 LLDB_REGISTER_METHOD_CONST(lldb::addr_t, SBFrame, GetFP, ()); 1322 LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBFrame, GetPCAddress, ()); 1323 LLDB_REGISTER_METHOD(void, SBFrame, Clear, ()); 1324 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1325 (const char *)); 1326 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 1327 (const char *, lldb::DynamicValueType)); 1328 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *)); 1329 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindVariable, 1330 (const char *, lldb::DynamicValueType)); 1331 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindValue, 1332 (const char *, lldb::ValueType)); 1333 LLDB_REGISTER_METHOD( 1334 lldb::SBValue, SBFrame, FindValue, 1335 (const char *, lldb::ValueType, lldb::DynamicValueType)); 1336 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &)); 1337 LLDB_REGISTER_METHOD_CONST(bool, 1338 SBFrame, operator==,(const lldb::SBFrame &)); 1339 LLDB_REGISTER_METHOD_CONST(bool, 1340 SBFrame, operator!=,(const lldb::SBFrame &)); 1341 LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBFrame, GetThread, ()); 1342 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, Disassemble, ()); 1343 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1344 (bool, bool, bool, bool)); 1345 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1346 (bool, bool, bool, bool, lldb::DynamicValueType)); 1347 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1348 (const lldb::SBVariablesOptions &)); 1349 LLDB_REGISTER_METHOD(lldb::SBValueList, SBFrame, GetRegisters, ()); 1350 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *)); 1351 LLDB_REGISTER_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &)); 1352 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1353 (const char *)); 1354 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1355 (const char *, lldb::DynamicValueType)); 1356 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1357 (const char *, lldb::DynamicValueType, bool)); 1358 LLDB_REGISTER_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1359 (const char *, const lldb::SBExpressionOptions &)); 1360 LLDB_REGISTER_METHOD(bool, SBFrame, IsInlined, ()); 1361 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsInlined, ()); 1362 LLDB_REGISTER_METHOD(bool, SBFrame, IsArtificial, ()); 1363 LLDB_REGISTER_METHOD_CONST(bool, SBFrame, IsArtificial, ()); 1364 LLDB_REGISTER_METHOD(const char *, SBFrame, GetFunctionName, ()); 1365 LLDB_REGISTER_METHOD_CONST(lldb::LanguageType, SBFrame, GuessLanguage, ()); 1366 LLDB_REGISTER_METHOD_CONST(const char *, SBFrame, GetFunctionName, ()); 1367 LLDB_REGISTER_METHOD(const char *, SBFrame, GetDisplayFunctionName, ()); 1368 } 1369 1370 } 1371 } 1372