1 //===-- SBTarget.cpp --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/API/SBTarget.h" 11 12 #include "lldb/lldb-public.h" 13 14 #include "lldb/API/SBBreakpoint.h" 15 #include "lldb/API/SBDebugger.h" 16 #include "lldb/API/SBEvent.h" 17 #include "lldb/API/SBExpressionOptions.h" 18 #include "lldb/API/SBFileSpec.h" 19 #include "lldb/API/SBListener.h" 20 #include "lldb/API/SBModule.h" 21 #include "lldb/API/SBModuleSpec.h" 22 #include "lldb/API/SBProcess.h" 23 #include "lldb/API/SBSourceManager.h" 24 #include "lldb/API/SBStream.h" 25 #include "lldb/API/SBStringList.h" 26 #include "lldb/API/SBStructuredData.h" 27 #include "lldb/API/SBSymbolContextList.h" 28 #include "lldb/Breakpoint/BreakpointID.h" 29 #include "lldb/Breakpoint/BreakpointIDList.h" 30 #include "lldb/Breakpoint/BreakpointList.h" 31 #include "lldb/Breakpoint/BreakpointLocation.h" 32 #include "lldb/Core/Address.h" 33 #include "lldb/Core/AddressResolver.h" 34 #include "lldb/Core/AddressResolverName.h" 35 #include "lldb/Core/Debugger.h" 36 #include "lldb/Core/Disassembler.h" 37 #include "lldb/Core/Module.h" 38 #include "lldb/Core/ModuleSpec.h" 39 #include "lldb/Core/STLUtils.h" 40 #include "lldb/Core/SearchFilter.h" 41 #include "lldb/Core/Section.h" 42 #include "lldb/Core/StructuredDataImpl.h" 43 #include "lldb/Core/ValueObjectConstResult.h" 44 #include "lldb/Core/ValueObjectList.h" 45 #include "lldb/Core/ValueObjectVariable.h" 46 #include "lldb/Host/Host.h" 47 #include "lldb/Symbol/ClangASTContext.h" 48 #include "lldb/Symbol/DeclVendor.h" 49 #include "lldb/Symbol/ObjectFile.h" 50 #include "lldb/Symbol/SymbolFile.h" 51 #include "lldb/Symbol/SymbolVendor.h" 52 #include "lldb/Symbol/VariableList.h" 53 #include "lldb/Target/ABI.h" 54 #include "lldb/Target/Language.h" 55 #include "lldb/Target/LanguageRuntime.h" 56 #include "lldb/Target/ObjCLanguageRuntime.h" 57 #include "lldb/Target/Process.h" 58 #include "lldb/Target/StackFrame.h" 59 #include "lldb/Target/Target.h" 60 #include "lldb/Target/TargetList.h" 61 #include "lldb/Utility/ArchSpec.h" 62 #include "lldb/Utility/Args.h" 63 #include "lldb/Utility/FileSpec.h" 64 #include "lldb/Utility/Log.h" 65 #include "lldb/Utility/RegularExpression.h" 66 67 #include "Commands/CommandObjectBreakpoint.h" 68 #include "lldb/Interpreter/CommandReturnObject.h" 69 #include "llvm/Support/PrettyStackTrace.h" 70 #include "llvm/Support/Regex.h" 71 72 using namespace lldb; 73 using namespace lldb_private; 74 75 #define DEFAULT_DISASM_BYTE_SIZE 32 76 77 namespace { 78 79 Status AttachToProcess(ProcessAttachInfo &attach_info, Target &target) { 80 std::lock_guard<std::recursive_mutex> guard(target.GetAPIMutex()); 81 82 auto process_sp = target.GetProcessSP(); 83 if (process_sp) { 84 const auto state = process_sp->GetState(); 85 if (process_sp->IsAlive() && state == eStateConnected) { 86 // If we are already connected, then we have already specified the 87 // listener, so if a valid listener is supplied, we need to error out to 88 // let the client know. 89 if (attach_info.GetListener()) 90 return Status("process is connected and already has a listener, pass " 91 "empty listener"); 92 } 93 } 94 95 return target.Attach(attach_info, nullptr); 96 } 97 98 } // namespace 99 100 //---------------------------------------------------------------------- 101 // SBTarget constructor 102 //---------------------------------------------------------------------- 103 SBTarget::SBTarget() : m_opaque_sp() {} 104 105 SBTarget::SBTarget(const SBTarget &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 106 107 SBTarget::SBTarget(const TargetSP &target_sp) : m_opaque_sp(target_sp) {} 108 109 const SBTarget &SBTarget::operator=(const SBTarget &rhs) { 110 if (this != &rhs) 111 m_opaque_sp = rhs.m_opaque_sp; 112 return *this; 113 } 114 115 //---------------------------------------------------------------------- 116 // Destructor 117 //---------------------------------------------------------------------- 118 SBTarget::~SBTarget() {} 119 120 bool SBTarget::EventIsTargetEvent(const SBEvent &event) { 121 return Target::TargetEventData::GetEventDataFromEvent(event.get()) != NULL; 122 } 123 124 SBTarget SBTarget::GetTargetFromEvent(const SBEvent &event) { 125 return Target::TargetEventData::GetTargetFromEvent(event.get()); 126 } 127 128 uint32_t SBTarget::GetNumModulesFromEvent(const SBEvent &event) { 129 const ModuleList module_list = 130 Target::TargetEventData::GetModuleListFromEvent(event.get()); 131 return module_list.GetSize(); 132 } 133 134 SBModule SBTarget::GetModuleAtIndexFromEvent(const uint32_t idx, 135 const SBEvent &event) { 136 const ModuleList module_list = 137 Target::TargetEventData::GetModuleListFromEvent(event.get()); 138 return SBModule(module_list.GetModuleAtIndex(idx)); 139 } 140 141 const char *SBTarget::GetBroadcasterClassName() { 142 return Target::GetStaticBroadcasterClass().AsCString(); 143 } 144 145 bool SBTarget::IsValid() const { 146 return m_opaque_sp.get() != NULL && m_opaque_sp->IsValid(); 147 } 148 149 SBProcess SBTarget::GetProcess() { 150 SBProcess sb_process; 151 ProcessSP process_sp; 152 TargetSP target_sp(GetSP()); 153 if (target_sp) { 154 process_sp = target_sp->GetProcessSP(); 155 sb_process.SetSP(process_sp); 156 } 157 158 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 159 if (log) 160 log->Printf("SBTarget(%p)::GetProcess () => SBProcess(%p)", 161 static_cast<void *>(target_sp.get()), 162 static_cast<void *>(process_sp.get())); 163 164 return sb_process; 165 } 166 167 SBPlatform SBTarget::GetPlatform() { 168 TargetSP target_sp(GetSP()); 169 if (!target_sp) 170 return SBPlatform(); 171 172 SBPlatform platform; 173 platform.m_opaque_sp = target_sp->GetPlatform(); 174 175 return platform; 176 } 177 178 SBDebugger SBTarget::GetDebugger() const { 179 SBDebugger debugger; 180 TargetSP target_sp(GetSP()); 181 if (target_sp) 182 debugger.reset(target_sp->GetDebugger().shared_from_this()); 183 return debugger; 184 } 185 186 SBStructuredData SBTarget::GetStatistics() { 187 SBStructuredData data; 188 TargetSP target_sp(GetSP()); 189 if (!target_sp) 190 return data; 191 192 auto stats_up = llvm::make_unique<StructuredData::Dictionary>(); 193 int i = 0; 194 for (auto &Entry : target_sp->GetStatistics()) { 195 std::string Desc = lldb_private::GetStatDescription( 196 static_cast<lldb_private::StatisticKind>(i)); 197 stats_up->AddIntegerItem(Desc, Entry); 198 i += 1; 199 } 200 201 data.m_impl_up->SetObjectSP(std::move(stats_up)); 202 return data; 203 } 204 205 SBProcess SBTarget::LoadCore(const char *core_file) { 206 lldb::SBError error; // Ignored 207 return LoadCore(core_file, error); 208 } 209 210 SBProcess SBTarget::LoadCore(const char *core_file, lldb::SBError &error) { 211 SBProcess sb_process; 212 TargetSP target_sp(GetSP()); 213 if (target_sp) { 214 FileSpec filespec(core_file, true); 215 ProcessSP process_sp(target_sp->CreateProcess( 216 target_sp->GetDebugger().GetListener(), "", &filespec)); 217 if (process_sp) { 218 error.SetError(process_sp->LoadCore()); 219 if (error.Success()) 220 sb_process.SetSP(process_sp); 221 } else { 222 error.SetErrorString("Failed to create the process"); 223 } 224 } else { 225 error.SetErrorString("SBTarget is invalid"); 226 } 227 return sb_process; 228 } 229 230 SBProcess SBTarget::LaunchSimple(char const **argv, char const **envp, 231 const char *working_directory) { 232 char *stdin_path = NULL; 233 char *stdout_path = NULL; 234 char *stderr_path = NULL; 235 uint32_t launch_flags = 0; 236 bool stop_at_entry = false; 237 SBError error; 238 SBListener listener = GetDebugger().GetListener(); 239 return Launch(listener, argv, envp, stdin_path, stdout_path, stderr_path, 240 working_directory, launch_flags, stop_at_entry, error); 241 } 242 243 SBError SBTarget::Install() { 244 SBError sb_error; 245 TargetSP target_sp(GetSP()); 246 if (target_sp) { 247 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 248 sb_error.ref() = target_sp->Install(NULL); 249 } 250 return sb_error; 251 } 252 253 SBProcess SBTarget::Launch(SBListener &listener, char const **argv, 254 char const **envp, const char *stdin_path, 255 const char *stdout_path, const char *stderr_path, 256 const char *working_directory, 257 uint32_t launch_flags, // See LaunchFlags 258 bool stop_at_entry, lldb::SBError &error) { 259 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 260 261 SBProcess sb_process; 262 ProcessSP process_sp; 263 TargetSP target_sp(GetSP()); 264 265 if (log) 266 log->Printf("SBTarget(%p)::Launch (argv=%p, envp=%p, stdin=%s, stdout=%s, " 267 "stderr=%s, working-dir=%s, launch_flags=0x%x, " 268 "stop_at_entry=%i, &error (%p))...", 269 static_cast<void *>(target_sp.get()), static_cast<void *>(argv), 270 static_cast<void *>(envp), stdin_path ? stdin_path : "NULL", 271 stdout_path ? stdout_path : "NULL", 272 stderr_path ? stderr_path : "NULL", 273 working_directory ? working_directory : "NULL", launch_flags, 274 stop_at_entry, static_cast<void *>(error.get())); 275 276 if (target_sp) { 277 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 278 279 if (stop_at_entry) 280 launch_flags |= eLaunchFlagStopAtEntry; 281 282 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR")) 283 launch_flags |= eLaunchFlagDisableASLR; 284 285 StateType state = eStateInvalid; 286 process_sp = target_sp->GetProcessSP(); 287 if (process_sp) { 288 state = process_sp->GetState(); 289 290 if (process_sp->IsAlive() && state != eStateConnected) { 291 if (state == eStateAttaching) 292 error.SetErrorString("process attach is in progress"); 293 else 294 error.SetErrorString("a process is already being debugged"); 295 return sb_process; 296 } 297 } 298 299 if (state == eStateConnected) { 300 // If we are already connected, then we have already specified the 301 // listener, so if a valid listener is supplied, we need to error out to 302 // let the client know. 303 if (listener.IsValid()) { 304 error.SetErrorString("process is connected and already has a listener, " 305 "pass empty listener"); 306 return sb_process; 307 } 308 } 309 310 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO")) 311 launch_flags |= eLaunchFlagDisableSTDIO; 312 313 ProcessLaunchInfo launch_info( 314 FileSpec{stdin_path, false}, FileSpec{stdout_path, false}, 315 FileSpec{stderr_path, false}, FileSpec{working_directory, false}, 316 launch_flags); 317 318 Module *exe_module = target_sp->GetExecutableModulePointer(); 319 if (exe_module) 320 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 321 if (argv) 322 launch_info.GetArguments().AppendArguments(argv); 323 if (envp) 324 launch_info.GetEnvironment() = Environment(envp); 325 326 if (listener.IsValid()) 327 launch_info.SetListener(listener.GetSP()); 328 329 error.SetError(target_sp->Launch(launch_info, NULL)); 330 331 sb_process.SetSP(target_sp->GetProcessSP()); 332 } else { 333 error.SetErrorString("SBTarget is invalid"); 334 } 335 336 log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API); 337 if (log) 338 log->Printf("SBTarget(%p)::Launch (...) => SBProcess(%p), SBError(%s)", 339 static_cast<void *>(target_sp.get()), 340 static_cast<void *>(sb_process.GetSP().get()), 341 error.GetCString()); 342 343 return sb_process; 344 } 345 346 SBProcess SBTarget::Launch(SBLaunchInfo &sb_launch_info, SBError &error) { 347 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 348 349 SBProcess sb_process; 350 TargetSP target_sp(GetSP()); 351 352 if (log) 353 log->Printf("SBTarget(%p)::Launch (launch_info, error)...", 354 static_cast<void *>(target_sp.get())); 355 356 if (target_sp) { 357 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 358 StateType state = eStateInvalid; 359 { 360 ProcessSP process_sp = target_sp->GetProcessSP(); 361 if (process_sp) { 362 state = process_sp->GetState(); 363 364 if (process_sp->IsAlive() && state != eStateConnected) { 365 if (state == eStateAttaching) 366 error.SetErrorString("process attach is in progress"); 367 else 368 error.SetErrorString("a process is already being debugged"); 369 return sb_process; 370 } 371 } 372 } 373 374 lldb_private::ProcessLaunchInfo launch_info = sb_launch_info.ref(); 375 376 if (!launch_info.GetExecutableFile()) { 377 Module *exe_module = target_sp->GetExecutableModulePointer(); 378 if (exe_module) 379 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 380 } 381 382 const ArchSpec &arch_spec = target_sp->GetArchitecture(); 383 if (arch_spec.IsValid()) 384 launch_info.GetArchitecture() = arch_spec; 385 386 error.SetError(target_sp->Launch(launch_info, NULL)); 387 sb_launch_info.set_ref(launch_info); 388 sb_process.SetSP(target_sp->GetProcessSP()); 389 } else { 390 error.SetErrorString("SBTarget is invalid"); 391 } 392 393 log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API); 394 if (log) 395 log->Printf("SBTarget(%p)::Launch (...) => SBProcess(%p)", 396 static_cast<void *>(target_sp.get()), 397 static_cast<void *>(sb_process.GetSP().get())); 398 399 return sb_process; 400 } 401 402 lldb::SBProcess SBTarget::Attach(SBAttachInfo &sb_attach_info, SBError &error) { 403 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 404 405 SBProcess sb_process; 406 TargetSP target_sp(GetSP()); 407 408 if (log) 409 log->Printf("SBTarget(%p)::Attach (sb_attach_info, error)...", 410 static_cast<void *>(target_sp.get())); 411 412 if (target_sp) { 413 ProcessAttachInfo &attach_info = sb_attach_info.ref(); 414 if (attach_info.ProcessIDIsValid() && !attach_info.UserIDIsValid()) { 415 PlatformSP platform_sp = target_sp->GetPlatform(); 416 // See if we can pre-verify if a process exists or not 417 if (platform_sp && platform_sp->IsConnected()) { 418 lldb::pid_t attach_pid = attach_info.GetProcessID(); 419 ProcessInstanceInfo instance_info; 420 if (platform_sp->GetProcessInfo(attach_pid, instance_info)) { 421 attach_info.SetUserID(instance_info.GetEffectiveUserID()); 422 } else { 423 error.ref().SetErrorStringWithFormat( 424 "no process found with process ID %" PRIu64, attach_pid); 425 if (log) { 426 log->Printf("SBTarget(%p)::Attach (...) => error %s", 427 static_cast<void *>(target_sp.get()), 428 error.GetCString()); 429 } 430 return sb_process; 431 } 432 } 433 } 434 error.SetError(AttachToProcess(attach_info, *target_sp)); 435 if (error.Success()) 436 sb_process.SetSP(target_sp->GetProcessSP()); 437 } else { 438 error.SetErrorString("SBTarget is invalid"); 439 } 440 441 if (log) 442 log->Printf("SBTarget(%p)::Attach (...) => SBProcess(%p)", 443 static_cast<void *>(target_sp.get()), 444 static_cast<void *>(sb_process.GetSP().get())); 445 446 return sb_process; 447 } 448 449 lldb::SBProcess SBTarget::AttachToProcessWithID( 450 SBListener &listener, 451 lldb::pid_t pid, // The process ID to attach to 452 SBError &error // An error explaining what went wrong if attach fails 453 ) { 454 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 455 456 SBProcess sb_process; 457 TargetSP target_sp(GetSP()); 458 459 if (log) 460 log->Printf("SBTarget(%p)::%s (listener, pid=%" PRId64 ", error)...", 461 static_cast<void *>(target_sp.get()), __FUNCTION__, pid); 462 463 if (target_sp) { 464 ProcessAttachInfo attach_info; 465 attach_info.SetProcessID(pid); 466 if (listener.IsValid()) 467 attach_info.SetListener(listener.GetSP()); 468 469 ProcessInstanceInfo instance_info; 470 if (target_sp->GetPlatform()->GetProcessInfo(pid, instance_info)) 471 attach_info.SetUserID(instance_info.GetEffectiveUserID()); 472 473 error.SetError(AttachToProcess(attach_info, *target_sp)); 474 if (error.Success()) 475 sb_process.SetSP(target_sp->GetProcessSP()); 476 } else 477 error.SetErrorString("SBTarget is invalid"); 478 479 if (log) 480 log->Printf("SBTarget(%p)::%s (...) => SBProcess(%p)", 481 static_cast<void *>(target_sp.get()), __FUNCTION__, 482 static_cast<void *>(sb_process.GetSP().get())); 483 return sb_process; 484 } 485 486 lldb::SBProcess SBTarget::AttachToProcessWithName( 487 SBListener &listener, 488 const char *name, // basename of process to attach to 489 bool wait_for, // if true wait for a new instance of "name" to be launched 490 SBError &error // An error explaining what went wrong if attach fails 491 ) { 492 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 493 494 SBProcess sb_process; 495 TargetSP target_sp(GetSP()); 496 497 if (log) 498 log->Printf("SBTarget(%p)::%s (listener, name=%s, wait_for=%s, error)...", 499 static_cast<void *>(target_sp.get()), __FUNCTION__, name, 500 wait_for ? "true" : "false"); 501 502 if (name && target_sp) { 503 ProcessAttachInfo attach_info; 504 attach_info.GetExecutableFile().SetFile(name, false, 505 FileSpec::Style::native); 506 attach_info.SetWaitForLaunch(wait_for); 507 if (listener.IsValid()) 508 attach_info.SetListener(listener.GetSP()); 509 510 error.SetError(AttachToProcess(attach_info, *target_sp)); 511 if (error.Success()) 512 sb_process.SetSP(target_sp->GetProcessSP()); 513 } else 514 error.SetErrorString("SBTarget is invalid"); 515 516 if (log) 517 log->Printf("SBTarget(%p)::%s (...) => SBProcess(%p)", 518 static_cast<void *>(target_sp.get()), __FUNCTION__, 519 static_cast<void *>(sb_process.GetSP().get())); 520 return sb_process; 521 } 522 523 lldb::SBProcess SBTarget::ConnectRemote(SBListener &listener, const char *url, 524 const char *plugin_name, 525 SBError &error) { 526 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 527 528 SBProcess sb_process; 529 ProcessSP process_sp; 530 TargetSP target_sp(GetSP()); 531 532 if (log) 533 log->Printf("SBTarget(%p)::ConnectRemote (listener, url=%s, " 534 "plugin_name=%s, error)...", 535 static_cast<void *>(target_sp.get()), url, plugin_name); 536 537 if (target_sp) { 538 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 539 if (listener.IsValid()) 540 process_sp = 541 target_sp->CreateProcess(listener.m_opaque_sp, plugin_name, NULL); 542 else 543 process_sp = target_sp->CreateProcess( 544 target_sp->GetDebugger().GetListener(), plugin_name, NULL); 545 546 if (process_sp) { 547 sb_process.SetSP(process_sp); 548 error.SetError(process_sp->ConnectRemote(NULL, url)); 549 } else { 550 error.SetErrorString("unable to create lldb_private::Process"); 551 } 552 } else { 553 error.SetErrorString("SBTarget is invalid"); 554 } 555 556 if (log) 557 log->Printf("SBTarget(%p)::ConnectRemote (...) => SBProcess(%p)", 558 static_cast<void *>(target_sp.get()), 559 static_cast<void *>(process_sp.get())); 560 return sb_process; 561 } 562 563 SBFileSpec SBTarget::GetExecutable() { 564 565 SBFileSpec exe_file_spec; 566 TargetSP target_sp(GetSP()); 567 if (target_sp) { 568 Module *exe_module = target_sp->GetExecutableModulePointer(); 569 if (exe_module) 570 exe_file_spec.SetFileSpec(exe_module->GetFileSpec()); 571 } 572 573 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 574 if (log) { 575 log->Printf("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)", 576 static_cast<void *>(target_sp.get()), 577 static_cast<const void *>(exe_file_spec.get())); 578 } 579 580 return exe_file_spec; 581 } 582 583 bool SBTarget::operator==(const SBTarget &rhs) const { 584 return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 585 } 586 587 bool SBTarget::operator!=(const SBTarget &rhs) const { 588 return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 589 } 590 591 lldb::TargetSP SBTarget::GetSP() const { return m_opaque_sp; } 592 593 void SBTarget::SetSP(const lldb::TargetSP &target_sp) { 594 m_opaque_sp = target_sp; 595 } 596 597 lldb::SBAddress SBTarget::ResolveLoadAddress(lldb::addr_t vm_addr) { 598 lldb::SBAddress sb_addr; 599 Address &addr = sb_addr.ref(); 600 TargetSP target_sp(GetSP()); 601 if (target_sp) { 602 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 603 if (target_sp->ResolveLoadAddress(vm_addr, addr)) 604 return sb_addr; 605 } 606 607 // We have a load address that isn't in a section, just return an address 608 // with the offset filled in (the address) and the section set to NULL 609 addr.SetRawAddress(vm_addr); 610 return sb_addr; 611 } 612 613 lldb::SBAddress SBTarget::ResolveFileAddress(lldb::addr_t file_addr) { 614 lldb::SBAddress sb_addr; 615 Address &addr = sb_addr.ref(); 616 TargetSP target_sp(GetSP()); 617 if (target_sp) { 618 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 619 if (target_sp->ResolveFileAddress(file_addr, addr)) 620 return sb_addr; 621 } 622 623 addr.SetRawAddress(file_addr); 624 return sb_addr; 625 } 626 627 lldb::SBAddress SBTarget::ResolvePastLoadAddress(uint32_t stop_id, 628 lldb::addr_t vm_addr) { 629 lldb::SBAddress sb_addr; 630 Address &addr = sb_addr.ref(); 631 TargetSP target_sp(GetSP()); 632 if (target_sp) { 633 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 634 if (target_sp->ResolveLoadAddress(vm_addr, addr)) 635 return sb_addr; 636 } 637 638 // We have a load address that isn't in a section, just return an address 639 // with the offset filled in (the address) and the section set to NULL 640 addr.SetRawAddress(vm_addr); 641 return sb_addr; 642 } 643 644 SBSymbolContext 645 SBTarget::ResolveSymbolContextForAddress(const SBAddress &addr, 646 uint32_t resolve_scope) { 647 SBSymbolContext sc; 648 if (addr.IsValid()) { 649 TargetSP target_sp(GetSP()); 650 if (target_sp) 651 target_sp->GetImages().ResolveSymbolContextForAddress( 652 addr.ref(), resolve_scope, sc.ref()); 653 } 654 return sc; 655 } 656 657 size_t SBTarget::ReadMemory(const SBAddress addr, void *buf, size_t size, 658 lldb::SBError &error) { 659 SBError sb_error; 660 size_t bytes_read = 0; 661 TargetSP target_sp(GetSP()); 662 if (target_sp) { 663 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 664 bytes_read = 665 target_sp->ReadMemory(addr.ref(), false, buf, size, sb_error.ref()); 666 } else { 667 sb_error.SetErrorString("invalid target"); 668 } 669 670 return bytes_read; 671 } 672 673 SBBreakpoint SBTarget::BreakpointCreateByLocation(const char *file, 674 uint32_t line) { 675 return SBBreakpoint( 676 BreakpointCreateByLocation(SBFileSpec(file, false), line)); 677 } 678 679 SBBreakpoint 680 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec, 681 uint32_t line) { 682 return BreakpointCreateByLocation(sb_file_spec, line, 0); 683 } 684 685 SBBreakpoint 686 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec, 687 uint32_t line, lldb::addr_t offset) { 688 SBFileSpecList empty_list; 689 return BreakpointCreateByLocation(sb_file_spec, line, offset, empty_list); 690 } 691 692 SBBreakpoint 693 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec, 694 uint32_t line, lldb::addr_t offset, 695 SBFileSpecList &sb_module_list) { 696 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 697 698 SBBreakpoint sb_bp; 699 TargetSP target_sp(GetSP()); 700 if (target_sp && line != 0) { 701 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 702 703 const LazyBool check_inlines = eLazyBoolCalculate; 704 const LazyBool skip_prologue = eLazyBoolCalculate; 705 const bool internal = false; 706 const bool hardware = false; 707 const LazyBool move_to_nearest_code = eLazyBoolCalculate; 708 const FileSpecList *module_list = nullptr; 709 if (sb_module_list.GetSize() > 0) { 710 module_list = sb_module_list.get(); 711 } 712 sb_bp = target_sp->CreateBreakpoint( 713 module_list, *sb_file_spec, line, offset, check_inlines, skip_prologue, 714 internal, hardware, move_to_nearest_code); 715 } 716 717 if (log) { 718 SBStream sstr; 719 sb_bp.GetDescription(sstr); 720 char path[PATH_MAX]; 721 sb_file_spec->GetPath(path, sizeof(path)); 722 log->Printf("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => " 723 "SBBreakpoint(%p): %s", 724 static_cast<void *>(target_sp.get()), path, line, 725 static_cast<void *>(sb_bp.GetSP().get()), sstr.GetData()); 726 } 727 728 return sb_bp; 729 } 730 731 SBBreakpoint SBTarget::BreakpointCreateByName(const char *symbol_name, 732 const char *module_name) { 733 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 734 735 SBBreakpoint sb_bp; 736 TargetSP target_sp(GetSP()); 737 if (target_sp.get()) { 738 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 739 740 const bool internal = false; 741 const bool hardware = false; 742 const LazyBool skip_prologue = eLazyBoolCalculate; 743 const lldb::addr_t offset = 0; 744 if (module_name && module_name[0]) { 745 FileSpecList module_spec_list; 746 module_spec_list.Append(FileSpec(module_name, false)); 747 sb_bp = target_sp->CreateBreakpoint( 748 &module_spec_list, NULL, symbol_name, eFunctionNameTypeAuto, 749 eLanguageTypeUnknown, offset, skip_prologue, internal, hardware); 750 } else { 751 sb_bp = target_sp->CreateBreakpoint( 752 NULL, NULL, symbol_name, eFunctionNameTypeAuto, eLanguageTypeUnknown, 753 offset, skip_prologue, internal, hardware); 754 } 755 } 756 757 if (log) 758 log->Printf("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", " 759 "module=\"%s\") => SBBreakpoint(%p)", 760 static_cast<void *>(target_sp.get()), symbol_name, module_name, 761 static_cast<void *>(sb_bp.GetSP().get())); 762 763 return sb_bp; 764 } 765 766 lldb::SBBreakpoint 767 SBTarget::BreakpointCreateByName(const char *symbol_name, 768 const SBFileSpecList &module_list, 769 const SBFileSpecList &comp_unit_list) { 770 uint32_t name_type_mask = eFunctionNameTypeAuto; 771 return BreakpointCreateByName(symbol_name, name_type_mask, 772 eLanguageTypeUnknown, module_list, 773 comp_unit_list); 774 } 775 776 lldb::SBBreakpoint SBTarget::BreakpointCreateByName( 777 const char *symbol_name, uint32_t name_type_mask, 778 const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) { 779 return BreakpointCreateByName(symbol_name, name_type_mask, 780 eLanguageTypeUnknown, module_list, 781 comp_unit_list); 782 } 783 784 lldb::SBBreakpoint SBTarget::BreakpointCreateByName( 785 const char *symbol_name, uint32_t name_type_mask, 786 LanguageType symbol_language, const SBFileSpecList &module_list, 787 const SBFileSpecList &comp_unit_list) { 788 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 789 790 SBBreakpoint sb_bp; 791 TargetSP target_sp(GetSP()); 792 if (target_sp && symbol_name && symbol_name[0]) { 793 const bool internal = false; 794 const bool hardware = false; 795 const LazyBool skip_prologue = eLazyBoolCalculate; 796 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 797 sb_bp = target_sp->CreateBreakpoint( 798 module_list.get(), comp_unit_list.get(), symbol_name, name_type_mask, 799 symbol_language, 0, skip_prologue, internal, hardware); 800 } 801 802 if (log) 803 log->Printf("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", " 804 "name_type: %d) => SBBreakpoint(%p)", 805 static_cast<void *>(target_sp.get()), symbol_name, 806 name_type_mask, static_cast<void *>(sb_bp.GetSP().get())); 807 808 return sb_bp; 809 } 810 811 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames( 812 const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask, 813 const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) { 814 return BreakpointCreateByNames(symbol_names, num_names, name_type_mask, 815 eLanguageTypeUnknown, module_list, 816 comp_unit_list); 817 } 818 819 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames( 820 const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask, 821 LanguageType symbol_language, const SBFileSpecList &module_list, 822 const SBFileSpecList &comp_unit_list) { 823 return BreakpointCreateByNames(symbol_names, num_names, name_type_mask, 824 eLanguageTypeUnknown, 0, module_list, 825 comp_unit_list); 826 } 827 828 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames( 829 const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask, 830 LanguageType symbol_language, lldb::addr_t offset, 831 const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) { 832 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 833 834 SBBreakpoint sb_bp; 835 TargetSP target_sp(GetSP()); 836 if (target_sp && num_names > 0) { 837 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 838 const bool internal = false; 839 const bool hardware = false; 840 const LazyBool skip_prologue = eLazyBoolCalculate; 841 sb_bp = target_sp->CreateBreakpoint( 842 module_list.get(), comp_unit_list.get(), symbol_names, num_names, 843 name_type_mask, symbol_language, offset, skip_prologue, internal, 844 hardware); 845 } 846 847 if (log) { 848 log->Printf("SBTarget(%p)::BreakpointCreateByName (symbols={", 849 static_cast<void *>(target_sp.get())); 850 for (uint32_t i = 0; i < num_names; i++) { 851 char sep; 852 if (i < num_names - 1) 853 sep = ','; 854 else 855 sep = '}'; 856 if (symbol_names[i] != NULL) 857 log->Printf("\"%s\"%c ", symbol_names[i], sep); 858 else 859 log->Printf("\"<NULL>\"%c ", sep); 860 } 861 log->Printf("name_type: %d) => SBBreakpoint(%p)", name_type_mask, 862 static_cast<void *>(sb_bp.GetSP().get())); 863 } 864 865 return sb_bp; 866 } 867 868 SBBreakpoint SBTarget::BreakpointCreateByRegex(const char *symbol_name_regex, 869 const char *module_name) { 870 SBFileSpecList module_spec_list; 871 SBFileSpecList comp_unit_list; 872 if (module_name && module_name[0]) { 873 module_spec_list.Append(FileSpec(module_name, false)); 874 } 875 return BreakpointCreateByRegex(symbol_name_regex, eLanguageTypeUnknown, 876 module_spec_list, comp_unit_list); 877 } 878 879 lldb::SBBreakpoint 880 SBTarget::BreakpointCreateByRegex(const char *symbol_name_regex, 881 const SBFileSpecList &module_list, 882 const SBFileSpecList &comp_unit_list) { 883 return BreakpointCreateByRegex(symbol_name_regex, eLanguageTypeUnknown, 884 module_list, comp_unit_list); 885 } 886 887 lldb::SBBreakpoint SBTarget::BreakpointCreateByRegex( 888 const char *symbol_name_regex, LanguageType symbol_language, 889 const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) { 890 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 891 892 SBBreakpoint sb_bp; 893 TargetSP target_sp(GetSP()); 894 if (target_sp && symbol_name_regex && symbol_name_regex[0]) { 895 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 896 RegularExpression regexp((llvm::StringRef(symbol_name_regex))); 897 const bool internal = false; 898 const bool hardware = false; 899 const LazyBool skip_prologue = eLazyBoolCalculate; 900 901 sb_bp = target_sp->CreateFuncRegexBreakpoint( 902 module_list.get(), comp_unit_list.get(), regexp, symbol_language, 903 skip_prologue, internal, hardware); 904 } 905 906 if (log) 907 log->Printf("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\") " 908 "=> SBBreakpoint(%p)", 909 static_cast<void *>(target_sp.get()), symbol_name_regex, 910 static_cast<void *>(sb_bp.GetSP().get())); 911 912 return sb_bp; 913 } 914 915 SBBreakpoint SBTarget::BreakpointCreateByAddress(addr_t address) { 916 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 917 918 SBBreakpoint sb_bp; 919 TargetSP target_sp(GetSP()); 920 if (target_sp) { 921 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 922 const bool hardware = false; 923 sb_bp = target_sp->CreateBreakpoint(address, false, hardware); 924 } 925 926 if (log) 927 log->Printf("SBTarget(%p)::BreakpointCreateByAddress (address=%" PRIu64 928 ") => SBBreakpoint(%p)", 929 static_cast<void *>(target_sp.get()), 930 static_cast<uint64_t>(address), 931 static_cast<void *>(sb_bp.GetSP().get())); 932 933 return sb_bp; 934 } 935 936 SBBreakpoint SBTarget::BreakpointCreateBySBAddress(SBAddress &sb_address) { 937 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 938 939 SBBreakpoint sb_bp; 940 TargetSP target_sp(GetSP()); 941 if (!sb_address.IsValid()) { 942 if (log) 943 log->Printf("SBTarget(%p)::BreakpointCreateBySBAddress called with " 944 "invalid address", 945 static_cast<void *>(target_sp.get())); 946 return sb_bp; 947 } 948 949 if (target_sp) { 950 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 951 const bool hardware = false; 952 sb_bp = target_sp->CreateBreakpoint(sb_address.ref(), false, hardware); 953 } 954 955 if (log) { 956 SBStream s; 957 sb_address.GetDescription(s); 958 log->Printf("SBTarget(%p)::BreakpointCreateBySBAddress (address=%s) => " 959 "SBBreakpoint(%p)", 960 static_cast<void *>(target_sp.get()), s.GetData(), 961 static_cast<void *>(sb_bp.GetSP().get())); 962 } 963 964 return sb_bp; 965 } 966 967 lldb::SBBreakpoint 968 SBTarget::BreakpointCreateBySourceRegex(const char *source_regex, 969 const lldb::SBFileSpec &source_file, 970 const char *module_name) { 971 SBFileSpecList module_spec_list; 972 973 if (module_name && module_name[0]) { 974 module_spec_list.Append(FileSpec(module_name, false)); 975 } 976 977 SBFileSpecList source_file_list; 978 if (source_file.IsValid()) { 979 source_file_list.Append(source_file); 980 } 981 982 return BreakpointCreateBySourceRegex(source_regex, module_spec_list, 983 source_file_list); 984 } 985 986 lldb::SBBreakpoint SBTarget::BreakpointCreateBySourceRegex( 987 const char *source_regex, const SBFileSpecList &module_list, 988 const lldb::SBFileSpecList &source_file_list) { 989 return BreakpointCreateBySourceRegex(source_regex, module_list, 990 source_file_list, SBStringList()); 991 } 992 993 lldb::SBBreakpoint SBTarget::BreakpointCreateBySourceRegex( 994 const char *source_regex, const SBFileSpecList &module_list, 995 const lldb::SBFileSpecList &source_file_list, 996 const SBStringList &func_names) { 997 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 998 999 SBBreakpoint sb_bp; 1000 TargetSP target_sp(GetSP()); 1001 if (target_sp && source_regex && source_regex[0]) { 1002 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1003 const bool hardware = false; 1004 const LazyBool move_to_nearest_code = eLazyBoolCalculate; 1005 RegularExpression regexp((llvm::StringRef(source_regex))); 1006 std::unordered_set<std::string> func_names_set; 1007 for (size_t i = 0; i < func_names.GetSize(); i++) { 1008 func_names_set.insert(func_names.GetStringAtIndex(i)); 1009 } 1010 1011 sb_bp = target_sp->CreateSourceRegexBreakpoint( 1012 module_list.get(), source_file_list.get(), func_names_set, regexp, 1013 false, hardware, move_to_nearest_code); 1014 } 1015 1016 if (log) 1017 log->Printf("SBTarget(%p)::BreakpointCreateByRegex (source_regex=\"%s\") " 1018 "=> SBBreakpoint(%p)", 1019 static_cast<void *>(target_sp.get()), source_regex, 1020 static_cast<void *>(sb_bp.GetSP().get())); 1021 1022 return sb_bp; 1023 } 1024 1025 lldb::SBBreakpoint 1026 SBTarget::BreakpointCreateForException(lldb::LanguageType language, 1027 bool catch_bp, bool throw_bp) { 1028 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1029 1030 SBBreakpoint sb_bp; 1031 TargetSP target_sp(GetSP()); 1032 if (target_sp) { 1033 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1034 const bool hardware = false; 1035 sb_bp = target_sp->CreateExceptionBreakpoint(language, catch_bp, throw_bp, 1036 hardware); 1037 } 1038 1039 if (log) 1040 log->Printf("SBTarget(%p)::BreakpointCreateByRegex (Language: %s, catch: " 1041 "%s throw: %s) => SBBreakpoint(%p)", 1042 static_cast<void *>(target_sp.get()), 1043 Language::GetNameForLanguageType(language), 1044 catch_bp ? "on" : "off", throw_bp ? "on" : "off", 1045 static_cast<void *>(sb_bp.GetSP().get())); 1046 1047 return sb_bp; 1048 } 1049 1050 uint32_t SBTarget::GetNumBreakpoints() const { 1051 TargetSP target_sp(GetSP()); 1052 if (target_sp) { 1053 // The breakpoint list is thread safe, no need to lock 1054 return target_sp->GetBreakpointList().GetSize(); 1055 } 1056 return 0; 1057 } 1058 1059 SBBreakpoint SBTarget::GetBreakpointAtIndex(uint32_t idx) const { 1060 SBBreakpoint sb_breakpoint; 1061 TargetSP target_sp(GetSP()); 1062 if (target_sp) { 1063 // The breakpoint list is thread safe, no need to lock 1064 sb_breakpoint = target_sp->GetBreakpointList().GetBreakpointAtIndex(idx); 1065 } 1066 return sb_breakpoint; 1067 } 1068 1069 bool SBTarget::BreakpointDelete(break_id_t bp_id) { 1070 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1071 1072 bool result = false; 1073 TargetSP target_sp(GetSP()); 1074 if (target_sp) { 1075 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1076 result = target_sp->RemoveBreakpointByID(bp_id); 1077 } 1078 1079 if (log) 1080 log->Printf("SBTarget(%p)::BreakpointDelete (bp_id=%d) => %i", 1081 static_cast<void *>(target_sp.get()), 1082 static_cast<uint32_t>(bp_id), result); 1083 1084 return result; 1085 } 1086 1087 SBBreakpoint SBTarget::FindBreakpointByID(break_id_t bp_id) { 1088 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1089 1090 SBBreakpoint sb_breakpoint; 1091 TargetSP target_sp(GetSP()); 1092 if (target_sp && bp_id != LLDB_INVALID_BREAK_ID) { 1093 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1094 sb_breakpoint = target_sp->GetBreakpointByID(bp_id); 1095 } 1096 1097 if (log) 1098 log->Printf( 1099 "SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)", 1100 static_cast<void *>(target_sp.get()), static_cast<uint32_t>(bp_id), 1101 static_cast<void *>(sb_breakpoint.GetSP().get())); 1102 1103 return sb_breakpoint; 1104 } 1105 1106 bool SBTarget::FindBreakpointsByName(const char *name, 1107 SBBreakpointList &bkpts) { 1108 TargetSP target_sp(GetSP()); 1109 if (target_sp) { 1110 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1111 BreakpointList bkpt_list(false); 1112 bool is_valid = 1113 target_sp->GetBreakpointList().FindBreakpointsByName(name, bkpt_list); 1114 if (!is_valid) 1115 return false; 1116 for (BreakpointSP bkpt_sp : bkpt_list.Breakpoints()) { 1117 bkpts.AppendByID(bkpt_sp->GetID()); 1118 } 1119 } 1120 return true; 1121 } 1122 1123 void SBTarget::GetBreakpointNames(SBStringList &names) 1124 { 1125 names.Clear(); 1126 1127 TargetSP target_sp(GetSP()); 1128 if (target_sp) { 1129 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1130 1131 std::vector<std::string> name_vec; 1132 target_sp->GetBreakpointNames(name_vec); 1133 for (auto name : name_vec) 1134 names.AppendString(name.c_str()); 1135 } 1136 } 1137 1138 void SBTarget::DeleteBreakpointName(const char *name) 1139 { 1140 TargetSP target_sp(GetSP()); 1141 if (target_sp) { 1142 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1143 target_sp->DeleteBreakpointName(ConstString(name)); 1144 } 1145 } 1146 1147 bool SBTarget::EnableAllBreakpoints() { 1148 TargetSP target_sp(GetSP()); 1149 if (target_sp) { 1150 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1151 target_sp->EnableAllowedBreakpoints(); 1152 return true; 1153 } 1154 return false; 1155 } 1156 1157 bool SBTarget::DisableAllBreakpoints() { 1158 TargetSP target_sp(GetSP()); 1159 if (target_sp) { 1160 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1161 target_sp->DisableAllowedBreakpoints(); 1162 return true; 1163 } 1164 return false; 1165 } 1166 1167 bool SBTarget::DeleteAllBreakpoints() { 1168 TargetSP target_sp(GetSP()); 1169 if (target_sp) { 1170 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1171 target_sp->RemoveAllowedBreakpoints(); 1172 return true; 1173 } 1174 return false; 1175 } 1176 1177 lldb::SBError SBTarget::BreakpointsCreateFromFile(SBFileSpec &source_file, 1178 SBBreakpointList &new_bps) { 1179 SBStringList empty_name_list; 1180 return BreakpointsCreateFromFile(source_file, empty_name_list, new_bps); 1181 } 1182 1183 lldb::SBError SBTarget::BreakpointsCreateFromFile(SBFileSpec &source_file, 1184 SBStringList &matching_names, 1185 SBBreakpointList &new_bps) { 1186 SBError sberr; 1187 TargetSP target_sp(GetSP()); 1188 if (!target_sp) { 1189 sberr.SetErrorString( 1190 "BreakpointCreateFromFile called with invalid target."); 1191 return sberr; 1192 } 1193 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1194 1195 BreakpointIDList bp_ids; 1196 1197 std::vector<std::string> name_vector; 1198 size_t num_names = matching_names.GetSize(); 1199 for (size_t i = 0; i < num_names; i++) 1200 name_vector.push_back(matching_names.GetStringAtIndex(i)); 1201 1202 sberr.ref() = target_sp->CreateBreakpointsFromFile(source_file.ref(), 1203 name_vector, bp_ids); 1204 if (sberr.Fail()) 1205 return sberr; 1206 1207 size_t num_bkpts = bp_ids.GetSize(); 1208 for (size_t i = 0; i < num_bkpts; i++) { 1209 BreakpointID bp_id = bp_ids.GetBreakpointIDAtIndex(i); 1210 new_bps.AppendByID(bp_id.GetBreakpointID()); 1211 } 1212 return sberr; 1213 } 1214 1215 lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file) { 1216 SBError sberr; 1217 TargetSP target_sp(GetSP()); 1218 if (!target_sp) { 1219 sberr.SetErrorString("BreakpointWriteToFile called with invalid target."); 1220 return sberr; 1221 } 1222 SBBreakpointList bkpt_list(*this); 1223 return BreakpointsWriteToFile(dest_file, bkpt_list); 1224 } 1225 1226 lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file, 1227 SBBreakpointList &bkpt_list, 1228 bool append) { 1229 SBError sberr; 1230 TargetSP target_sp(GetSP()); 1231 if (!target_sp) { 1232 sberr.SetErrorString("BreakpointWriteToFile called with invalid target."); 1233 return sberr; 1234 } 1235 1236 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1237 BreakpointIDList bp_id_list; 1238 bkpt_list.CopyToBreakpointIDList(bp_id_list); 1239 sberr.ref() = target_sp->SerializeBreakpointsToFile(dest_file.ref(), 1240 bp_id_list, append); 1241 return sberr; 1242 } 1243 1244 uint32_t SBTarget::GetNumWatchpoints() const { 1245 TargetSP target_sp(GetSP()); 1246 if (target_sp) { 1247 // The watchpoint list is thread safe, no need to lock 1248 return target_sp->GetWatchpointList().GetSize(); 1249 } 1250 return 0; 1251 } 1252 1253 SBWatchpoint SBTarget::GetWatchpointAtIndex(uint32_t idx) const { 1254 SBWatchpoint sb_watchpoint; 1255 TargetSP target_sp(GetSP()); 1256 if (target_sp) { 1257 // The watchpoint list is thread safe, no need to lock 1258 sb_watchpoint.SetSP(target_sp->GetWatchpointList().GetByIndex(idx)); 1259 } 1260 return sb_watchpoint; 1261 } 1262 1263 bool SBTarget::DeleteWatchpoint(watch_id_t wp_id) { 1264 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1265 1266 bool result = false; 1267 TargetSP target_sp(GetSP()); 1268 if (target_sp) { 1269 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1270 std::unique_lock<std::recursive_mutex> lock; 1271 target_sp->GetWatchpointList().GetListMutex(lock); 1272 result = target_sp->RemoveWatchpointByID(wp_id); 1273 } 1274 1275 if (log) 1276 log->Printf("SBTarget(%p)::WatchpointDelete (wp_id=%d) => %i", 1277 static_cast<void *>(target_sp.get()), 1278 static_cast<uint32_t>(wp_id), result); 1279 1280 return result; 1281 } 1282 1283 SBWatchpoint SBTarget::FindWatchpointByID(lldb::watch_id_t wp_id) { 1284 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1285 1286 SBWatchpoint sb_watchpoint; 1287 lldb::WatchpointSP watchpoint_sp; 1288 TargetSP target_sp(GetSP()); 1289 if (target_sp && wp_id != LLDB_INVALID_WATCH_ID) { 1290 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1291 std::unique_lock<std::recursive_mutex> lock; 1292 target_sp->GetWatchpointList().GetListMutex(lock); 1293 watchpoint_sp = target_sp->GetWatchpointList().FindByID(wp_id); 1294 sb_watchpoint.SetSP(watchpoint_sp); 1295 } 1296 1297 if (log) 1298 log->Printf( 1299 "SBTarget(%p)::FindWatchpointByID (bp_id=%d) => SBWatchpoint(%p)", 1300 static_cast<void *>(target_sp.get()), static_cast<uint32_t>(wp_id), 1301 static_cast<void *>(watchpoint_sp.get())); 1302 1303 return sb_watchpoint; 1304 } 1305 1306 lldb::SBWatchpoint SBTarget::WatchAddress(lldb::addr_t addr, size_t size, 1307 bool read, bool write, 1308 SBError &error) { 1309 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1310 1311 SBWatchpoint sb_watchpoint; 1312 lldb::WatchpointSP watchpoint_sp; 1313 TargetSP target_sp(GetSP()); 1314 if (target_sp && (read || write) && addr != LLDB_INVALID_ADDRESS && 1315 size > 0) { 1316 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1317 uint32_t watch_type = 0; 1318 if (read) 1319 watch_type |= LLDB_WATCH_TYPE_READ; 1320 if (write) 1321 watch_type |= LLDB_WATCH_TYPE_WRITE; 1322 if (watch_type == 0) { 1323 error.SetErrorString( 1324 "Can't create a watchpoint that is neither read nor write."); 1325 return sb_watchpoint; 1326 } 1327 1328 // Target::CreateWatchpoint() is thread safe. 1329 Status cw_error; 1330 // This API doesn't take in a type, so we can't figure out what it is. 1331 CompilerType *type = NULL; 1332 watchpoint_sp = 1333 target_sp->CreateWatchpoint(addr, size, type, watch_type, cw_error); 1334 error.SetError(cw_error); 1335 sb_watchpoint.SetSP(watchpoint_sp); 1336 } 1337 1338 if (log) 1339 log->Printf("SBTarget(%p)::WatchAddress (addr=0x%" PRIx64 1340 ", 0x%u) => SBWatchpoint(%p)", 1341 static_cast<void *>(target_sp.get()), addr, 1342 static_cast<uint32_t>(size), 1343 static_cast<void *>(watchpoint_sp.get())); 1344 1345 return sb_watchpoint; 1346 } 1347 1348 bool SBTarget::EnableAllWatchpoints() { 1349 TargetSP target_sp(GetSP()); 1350 if (target_sp) { 1351 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1352 std::unique_lock<std::recursive_mutex> lock; 1353 target_sp->GetWatchpointList().GetListMutex(lock); 1354 target_sp->EnableAllWatchpoints(); 1355 return true; 1356 } 1357 return false; 1358 } 1359 1360 bool SBTarget::DisableAllWatchpoints() { 1361 TargetSP target_sp(GetSP()); 1362 if (target_sp) { 1363 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1364 std::unique_lock<std::recursive_mutex> lock; 1365 target_sp->GetWatchpointList().GetListMutex(lock); 1366 target_sp->DisableAllWatchpoints(); 1367 return true; 1368 } 1369 return false; 1370 } 1371 1372 SBValue SBTarget::CreateValueFromAddress(const char *name, SBAddress addr, 1373 SBType type) { 1374 SBValue sb_value; 1375 lldb::ValueObjectSP new_value_sp; 1376 if (IsValid() && name && *name && addr.IsValid() && type.IsValid()) { 1377 lldb::addr_t load_addr(addr.GetLoadAddress(*this)); 1378 ExecutionContext exe_ctx( 1379 ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false))); 1380 CompilerType ast_type(type.GetSP()->GetCompilerType(true)); 1381 new_value_sp = ValueObject::CreateValueObjectFromAddress(name, load_addr, 1382 exe_ctx, ast_type); 1383 } 1384 sb_value.SetSP(new_value_sp); 1385 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1386 if (log) { 1387 if (new_value_sp) 1388 log->Printf("SBTarget(%p)::CreateValueFromAddress => \"%s\"", 1389 static_cast<void *>(m_opaque_sp.get()), 1390 new_value_sp->GetName().AsCString()); 1391 else 1392 log->Printf("SBTarget(%p)::CreateValueFromAddress => NULL", 1393 static_cast<void *>(m_opaque_sp.get())); 1394 } 1395 return sb_value; 1396 } 1397 1398 lldb::SBValue SBTarget::CreateValueFromData(const char *name, lldb::SBData data, 1399 lldb::SBType type) { 1400 SBValue sb_value; 1401 lldb::ValueObjectSP new_value_sp; 1402 if (IsValid() && name && *name && data.IsValid() && type.IsValid()) { 1403 DataExtractorSP extractor(*data); 1404 ExecutionContext exe_ctx( 1405 ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false))); 1406 CompilerType ast_type(type.GetSP()->GetCompilerType(true)); 1407 new_value_sp = ValueObject::CreateValueObjectFromData(name, *extractor, 1408 exe_ctx, ast_type); 1409 } 1410 sb_value.SetSP(new_value_sp); 1411 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1412 if (log) { 1413 if (new_value_sp) 1414 log->Printf("SBTarget(%p)::CreateValueFromData => \"%s\"", 1415 static_cast<void *>(m_opaque_sp.get()), 1416 new_value_sp->GetName().AsCString()); 1417 else 1418 log->Printf("SBTarget(%p)::CreateValueFromData => NULL", 1419 static_cast<void *>(m_opaque_sp.get())); 1420 } 1421 return sb_value; 1422 } 1423 1424 lldb::SBValue SBTarget::CreateValueFromExpression(const char *name, 1425 const char *expr) { 1426 SBValue sb_value; 1427 lldb::ValueObjectSP new_value_sp; 1428 if (IsValid() && name && *name && expr && *expr) { 1429 ExecutionContext exe_ctx( 1430 ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false))); 1431 new_value_sp = 1432 ValueObject::CreateValueObjectFromExpression(name, expr, exe_ctx); 1433 } 1434 sb_value.SetSP(new_value_sp); 1435 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1436 if (log) { 1437 if (new_value_sp) 1438 log->Printf("SBTarget(%p)::CreateValueFromExpression => \"%s\"", 1439 static_cast<void *>(m_opaque_sp.get()), 1440 new_value_sp->GetName().AsCString()); 1441 else 1442 log->Printf("SBTarget(%p)::CreateValueFromExpression => NULL", 1443 static_cast<void *>(m_opaque_sp.get())); 1444 } 1445 return sb_value; 1446 } 1447 1448 bool SBTarget::DeleteAllWatchpoints() { 1449 TargetSP target_sp(GetSP()); 1450 if (target_sp) { 1451 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 1452 std::unique_lock<std::recursive_mutex> lock; 1453 target_sp->GetWatchpointList().GetListMutex(lock); 1454 target_sp->RemoveAllWatchpoints(); 1455 return true; 1456 } 1457 return false; 1458 } 1459 1460 lldb::SBModule SBTarget::AddModule(const char *path, const char *triple, 1461 const char *uuid_cstr) { 1462 return AddModule(path, triple, uuid_cstr, NULL); 1463 } 1464 1465 lldb::SBModule SBTarget::AddModule(const char *path, const char *triple, 1466 const char *uuid_cstr, const char *symfile) { 1467 lldb::SBModule sb_module; 1468 TargetSP target_sp(GetSP()); 1469 if (target_sp) { 1470 ModuleSpec module_spec; 1471 if (path) 1472 module_spec.GetFileSpec().SetFile(path, false, FileSpec::Style::native); 1473 1474 if (uuid_cstr) 1475 module_spec.GetUUID().SetFromStringRef(uuid_cstr); 1476 1477 if (triple) 1478 module_spec.GetArchitecture() = Platform::GetAugmentedArchSpec( 1479 target_sp->GetPlatform().get(), triple); 1480 else 1481 module_spec.GetArchitecture() = target_sp->GetArchitecture(); 1482 1483 if (symfile) 1484 module_spec.GetSymbolFileSpec().SetFile(symfile, false, 1485 FileSpec::Style::native); 1486 1487 sb_module.SetSP(target_sp->GetSharedModule(module_spec)); 1488 } 1489 return sb_module; 1490 } 1491 1492 lldb::SBModule SBTarget::AddModule(const SBModuleSpec &module_spec) { 1493 lldb::SBModule sb_module; 1494 TargetSP target_sp(GetSP()); 1495 if (target_sp) 1496 sb_module.SetSP(target_sp->GetSharedModule(*module_spec.m_opaque_ap)); 1497 return sb_module; 1498 } 1499 1500 bool SBTarget::AddModule(lldb::SBModule &module) { 1501 TargetSP target_sp(GetSP()); 1502 if (target_sp) { 1503 target_sp->GetImages().AppendIfNeeded(module.GetSP()); 1504 return true; 1505 } 1506 return false; 1507 } 1508 1509 uint32_t SBTarget::GetNumModules() const { 1510 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1511 1512 uint32_t num = 0; 1513 TargetSP target_sp(GetSP()); 1514 if (target_sp) { 1515 // The module list is thread safe, no need to lock 1516 num = target_sp->GetImages().GetSize(); 1517 } 1518 1519 if (log) 1520 log->Printf("SBTarget(%p)::GetNumModules () => %d", 1521 static_cast<void *>(target_sp.get()), num); 1522 1523 return num; 1524 } 1525 1526 void SBTarget::Clear() { 1527 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1528 1529 if (log) 1530 log->Printf("SBTarget(%p)::Clear ()", 1531 static_cast<void *>(m_opaque_sp.get())); 1532 1533 m_opaque_sp.reset(); 1534 } 1535 1536 SBModule SBTarget::FindModule(const SBFileSpec &sb_file_spec) { 1537 SBModule sb_module; 1538 TargetSP target_sp(GetSP()); 1539 if (target_sp && sb_file_spec.IsValid()) { 1540 ModuleSpec module_spec(*sb_file_spec); 1541 // The module list is thread safe, no need to lock 1542 sb_module.SetSP(target_sp->GetImages().FindFirstModule(module_spec)); 1543 } 1544 return sb_module; 1545 } 1546 1547 lldb::ByteOrder SBTarget::GetByteOrder() { 1548 TargetSP target_sp(GetSP()); 1549 if (target_sp) 1550 return target_sp->GetArchitecture().GetByteOrder(); 1551 return eByteOrderInvalid; 1552 } 1553 1554 const char *SBTarget::GetTriple() { 1555 TargetSP target_sp(GetSP()); 1556 if (target_sp) { 1557 std::string triple(target_sp->GetArchitecture().GetTriple().str()); 1558 // Unique the string so we don't run into ownership issues since the const 1559 // strings put the string into the string pool once and the strings never 1560 // comes out 1561 ConstString const_triple(triple.c_str()); 1562 return const_triple.GetCString(); 1563 } 1564 return NULL; 1565 } 1566 1567 uint32_t SBTarget::GetDataByteSize() { 1568 TargetSP target_sp(GetSP()); 1569 if (target_sp) { 1570 return target_sp->GetArchitecture().GetDataByteSize(); 1571 } 1572 return 0; 1573 } 1574 1575 uint32_t SBTarget::GetCodeByteSize() { 1576 TargetSP target_sp(GetSP()); 1577 if (target_sp) { 1578 return target_sp->GetArchitecture().GetCodeByteSize(); 1579 } 1580 return 0; 1581 } 1582 1583 uint32_t SBTarget::GetAddressByteSize() { 1584 TargetSP target_sp(GetSP()); 1585 if (target_sp) 1586 return target_sp->GetArchitecture().GetAddressByteSize(); 1587 return sizeof(void *); 1588 } 1589 1590 SBModule SBTarget::GetModuleAtIndex(uint32_t idx) { 1591 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1592 1593 SBModule sb_module; 1594 ModuleSP module_sp; 1595 TargetSP target_sp(GetSP()); 1596 if (target_sp) { 1597 // The module list is thread safe, no need to lock 1598 module_sp = target_sp->GetImages().GetModuleAtIndex(idx); 1599 sb_module.SetSP(module_sp); 1600 } 1601 1602 if (log) 1603 log->Printf("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)", 1604 static_cast<void *>(target_sp.get()), idx, 1605 static_cast<void *>(module_sp.get())); 1606 1607 return sb_module; 1608 } 1609 1610 bool SBTarget::RemoveModule(lldb::SBModule module) { 1611 TargetSP target_sp(GetSP()); 1612 if (target_sp) 1613 return target_sp->GetImages().Remove(module.GetSP()); 1614 return false; 1615 } 1616 1617 SBBroadcaster SBTarget::GetBroadcaster() const { 1618 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1619 1620 TargetSP target_sp(GetSP()); 1621 SBBroadcaster broadcaster(target_sp.get(), false); 1622 1623 if (log) 1624 log->Printf("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)", 1625 static_cast<void *>(target_sp.get()), 1626 static_cast<void *>(broadcaster.get())); 1627 1628 return broadcaster; 1629 } 1630 1631 bool SBTarget::GetDescription(SBStream &description, 1632 lldb::DescriptionLevel description_level) { 1633 Stream &strm = description.ref(); 1634 1635 TargetSP target_sp(GetSP()); 1636 if (target_sp) { 1637 target_sp->Dump(&strm, description_level); 1638 } else 1639 strm.PutCString("No value"); 1640 1641 return true; 1642 } 1643 1644 lldb::SBSymbolContextList SBTarget::FindFunctions(const char *name, 1645 uint32_t name_type_mask) { 1646 lldb::SBSymbolContextList sb_sc_list; 1647 if (name && name[0]) { 1648 TargetSP target_sp(GetSP()); 1649 if (target_sp) { 1650 const bool symbols_ok = true; 1651 const bool inlines_ok = true; 1652 const bool append = true; 1653 target_sp->GetImages().FindFunctions(ConstString(name), name_type_mask, 1654 symbols_ok, inlines_ok, append, 1655 *sb_sc_list); 1656 } 1657 } 1658 return sb_sc_list; 1659 } 1660 1661 lldb::SBSymbolContextList SBTarget::FindGlobalFunctions(const char *name, 1662 uint32_t max_matches, 1663 MatchType matchtype) { 1664 lldb::SBSymbolContextList sb_sc_list; 1665 if (name && name[0]) { 1666 llvm::StringRef name_ref(name); 1667 TargetSP target_sp(GetSP()); 1668 if (target_sp) { 1669 std::string regexstr; 1670 switch (matchtype) { 1671 case eMatchTypeRegex: 1672 target_sp->GetImages().FindFunctions(RegularExpression(name_ref), true, 1673 true, true, *sb_sc_list); 1674 break; 1675 case eMatchTypeStartsWith: 1676 regexstr = llvm::Regex::escape(name) + ".*"; 1677 target_sp->GetImages().FindFunctions(RegularExpression(regexstr), true, 1678 true, true, *sb_sc_list); 1679 break; 1680 default: 1681 target_sp->GetImages().FindFunctions(ConstString(name), 1682 eFunctionNameTypeAny, true, true, 1683 true, *sb_sc_list); 1684 break; 1685 } 1686 } 1687 } 1688 return sb_sc_list; 1689 } 1690 1691 lldb::SBType SBTarget::FindFirstType(const char *typename_cstr) { 1692 TargetSP target_sp(GetSP()); 1693 if (typename_cstr && typename_cstr[0] && target_sp) { 1694 ConstString const_typename(typename_cstr); 1695 SymbolContext sc; 1696 const bool exact_match = false; 1697 1698 const ModuleList &module_list = target_sp->GetImages(); 1699 size_t count = module_list.GetSize(); 1700 for (size_t idx = 0; idx < count; idx++) { 1701 ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); 1702 if (module_sp) { 1703 TypeSP type_sp( 1704 module_sp->FindFirstType(sc, const_typename, exact_match)); 1705 if (type_sp) 1706 return SBType(type_sp); 1707 } 1708 } 1709 1710 // Didn't find the type in the symbols; try the Objective-C runtime if one 1711 // is installed 1712 1713 ProcessSP process_sp(target_sp->GetProcessSP()); 1714 1715 if (process_sp) { 1716 ObjCLanguageRuntime *objc_language_runtime = 1717 process_sp->GetObjCLanguageRuntime(); 1718 1719 if (objc_language_runtime) { 1720 DeclVendor *objc_decl_vendor = objc_language_runtime->GetDeclVendor(); 1721 1722 if (objc_decl_vendor) { 1723 std::vector<clang::NamedDecl *> decls; 1724 1725 if (objc_decl_vendor->FindDecls(const_typename, true, 1, decls) > 0) { 1726 if (CompilerType type = ClangASTContext::GetTypeForDecl(decls[0])) { 1727 return SBType(type); 1728 } 1729 } 1730 } 1731 } 1732 } 1733 1734 // No matches, search for basic typename matches 1735 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 1736 if (clang_ast) 1737 return SBType(ClangASTContext::GetBasicType(clang_ast->getASTContext(), 1738 const_typename)); 1739 } 1740 return SBType(); 1741 } 1742 1743 SBType SBTarget::GetBasicType(lldb::BasicType type) { 1744 TargetSP target_sp(GetSP()); 1745 if (target_sp) { 1746 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 1747 if (clang_ast) 1748 return SBType( 1749 ClangASTContext::GetBasicType(clang_ast->getASTContext(), type)); 1750 } 1751 return SBType(); 1752 } 1753 1754 lldb::SBTypeList SBTarget::FindTypes(const char *typename_cstr) { 1755 SBTypeList sb_type_list; 1756 TargetSP target_sp(GetSP()); 1757 if (typename_cstr && typename_cstr[0] && target_sp) { 1758 ModuleList &images = target_sp->GetImages(); 1759 ConstString const_typename(typename_cstr); 1760 bool exact_match = false; 1761 SymbolContext sc; 1762 TypeList type_list; 1763 llvm::DenseSet<SymbolFile *> searched_symbol_files; 1764 uint32_t num_matches = 1765 images.FindTypes(sc, const_typename, exact_match, UINT32_MAX, 1766 searched_symbol_files, type_list); 1767 1768 if (num_matches > 0) { 1769 for (size_t idx = 0; idx < num_matches; idx++) { 1770 TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 1771 if (type_sp) 1772 sb_type_list.Append(SBType(type_sp)); 1773 } 1774 } 1775 1776 // Try the Objective-C runtime if one is installed 1777 1778 ProcessSP process_sp(target_sp->GetProcessSP()); 1779 1780 if (process_sp) { 1781 ObjCLanguageRuntime *objc_language_runtime = 1782 process_sp->GetObjCLanguageRuntime(); 1783 1784 if (objc_language_runtime) { 1785 DeclVendor *objc_decl_vendor = objc_language_runtime->GetDeclVendor(); 1786 1787 if (objc_decl_vendor) { 1788 std::vector<clang::NamedDecl *> decls; 1789 1790 if (objc_decl_vendor->FindDecls(const_typename, true, 1, decls) > 0) { 1791 for (clang::NamedDecl *decl : decls) { 1792 if (CompilerType type = ClangASTContext::GetTypeForDecl(decl)) { 1793 sb_type_list.Append(SBType(type)); 1794 } 1795 } 1796 } 1797 } 1798 } 1799 } 1800 1801 if (sb_type_list.GetSize() == 0) { 1802 // No matches, search for basic typename matches 1803 ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); 1804 if (clang_ast) 1805 sb_type_list.Append(SBType(ClangASTContext::GetBasicType( 1806 clang_ast->getASTContext(), const_typename))); 1807 } 1808 } 1809 return sb_type_list; 1810 } 1811 1812 SBValueList SBTarget::FindGlobalVariables(const char *name, 1813 uint32_t max_matches) { 1814 SBValueList sb_value_list; 1815 1816 TargetSP target_sp(GetSP()); 1817 if (name && target_sp) { 1818 VariableList variable_list; 1819 const uint32_t match_count = target_sp->GetImages().FindGlobalVariables( 1820 ConstString(name), max_matches, variable_list); 1821 1822 if (match_count > 0) { 1823 ExecutionContextScope *exe_scope = target_sp->GetProcessSP().get(); 1824 if (exe_scope == NULL) 1825 exe_scope = target_sp.get(); 1826 for (uint32_t i = 0; i < match_count; ++i) { 1827 lldb::ValueObjectSP valobj_sp(ValueObjectVariable::Create( 1828 exe_scope, variable_list.GetVariableAtIndex(i))); 1829 if (valobj_sp) 1830 sb_value_list.Append(SBValue(valobj_sp)); 1831 } 1832 } 1833 } 1834 1835 return sb_value_list; 1836 } 1837 1838 SBValueList SBTarget::FindGlobalVariables(const char *name, 1839 uint32_t max_matches, 1840 MatchType matchtype) { 1841 SBValueList sb_value_list; 1842 1843 TargetSP target_sp(GetSP()); 1844 if (name && target_sp) { 1845 llvm::StringRef name_ref(name); 1846 VariableList variable_list; 1847 1848 std::string regexstr; 1849 uint32_t match_count; 1850 switch (matchtype) { 1851 case eMatchTypeNormal: 1852 match_count = target_sp->GetImages().FindGlobalVariables( 1853 ConstString(name), max_matches, variable_list); 1854 break; 1855 case eMatchTypeRegex: 1856 match_count = target_sp->GetImages().FindGlobalVariables( 1857 RegularExpression(name_ref), max_matches, variable_list); 1858 break; 1859 case eMatchTypeStartsWith: 1860 regexstr = llvm::Regex::escape(name) + ".*"; 1861 match_count = target_sp->GetImages().FindGlobalVariables( 1862 RegularExpression(regexstr), max_matches, variable_list); 1863 break; 1864 } 1865 1866 if (match_count > 0) { 1867 ExecutionContextScope *exe_scope = target_sp->GetProcessSP().get(); 1868 if (exe_scope == NULL) 1869 exe_scope = target_sp.get(); 1870 for (uint32_t i = 0; i < match_count; ++i) { 1871 lldb::ValueObjectSP valobj_sp(ValueObjectVariable::Create( 1872 exe_scope, variable_list.GetVariableAtIndex(i))); 1873 if (valobj_sp) 1874 sb_value_list.Append(SBValue(valobj_sp)); 1875 } 1876 } 1877 } 1878 1879 return sb_value_list; 1880 } 1881 1882 lldb::SBValue SBTarget::FindFirstGlobalVariable(const char *name) { 1883 SBValueList sb_value_list(FindGlobalVariables(name, 1)); 1884 if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 1885 return sb_value_list.GetValueAtIndex(0); 1886 return SBValue(); 1887 } 1888 1889 SBSourceManager SBTarget::GetSourceManager() { 1890 SBSourceManager source_manager(*this); 1891 return source_manager; 1892 } 1893 1894 lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr, 1895 uint32_t count) { 1896 return ReadInstructions(base_addr, count, NULL); 1897 } 1898 1899 lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr, 1900 uint32_t count, 1901 const char *flavor_string) { 1902 SBInstructionList sb_instructions; 1903 1904 TargetSP target_sp(GetSP()); 1905 if (target_sp) { 1906 Address *addr_ptr = base_addr.get(); 1907 1908 if (addr_ptr) { 1909 DataBufferHeap data( 1910 target_sp->GetArchitecture().GetMaximumOpcodeByteSize() * count, 0); 1911 bool prefer_file_cache = false; 1912 lldb_private::Status error; 1913 lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; 1914 const size_t bytes_read = 1915 target_sp->ReadMemory(*addr_ptr, prefer_file_cache, data.GetBytes(), 1916 data.GetByteSize(), error, &load_addr); 1917 const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; 1918 sb_instructions.SetDisassembler(Disassembler::DisassembleBytes( 1919 target_sp->GetArchitecture(), NULL, flavor_string, *addr_ptr, 1920 data.GetBytes(), bytes_read, count, data_from_file)); 1921 } 1922 } 1923 1924 return sb_instructions; 1925 } 1926 1927 lldb::SBInstructionList SBTarget::GetInstructions(lldb::SBAddress base_addr, 1928 const void *buf, 1929 size_t size) { 1930 return GetInstructionsWithFlavor(base_addr, NULL, buf, size); 1931 } 1932 1933 lldb::SBInstructionList 1934 SBTarget::GetInstructionsWithFlavor(lldb::SBAddress base_addr, 1935 const char *flavor_string, const void *buf, 1936 size_t size) { 1937 SBInstructionList sb_instructions; 1938 1939 TargetSP target_sp(GetSP()); 1940 if (target_sp) { 1941 Address addr; 1942 1943 if (base_addr.get()) 1944 addr = *base_addr.get(); 1945 1946 const bool data_from_file = true; 1947 1948 sb_instructions.SetDisassembler(Disassembler::DisassembleBytes( 1949 target_sp->GetArchitecture(), NULL, flavor_string, addr, buf, size, 1950 UINT32_MAX, data_from_file)); 1951 } 1952 1953 return sb_instructions; 1954 } 1955 1956 lldb::SBInstructionList SBTarget::GetInstructions(lldb::addr_t base_addr, 1957 const void *buf, 1958 size_t size) { 1959 return GetInstructionsWithFlavor(ResolveLoadAddress(base_addr), NULL, buf, 1960 size); 1961 } 1962 1963 lldb::SBInstructionList 1964 SBTarget::GetInstructionsWithFlavor(lldb::addr_t base_addr, 1965 const char *flavor_string, const void *buf, 1966 size_t size) { 1967 return GetInstructionsWithFlavor(ResolveLoadAddress(base_addr), flavor_string, 1968 buf, size); 1969 } 1970 1971 SBError SBTarget::SetSectionLoadAddress(lldb::SBSection section, 1972 lldb::addr_t section_base_addr) { 1973 SBError sb_error; 1974 TargetSP target_sp(GetSP()); 1975 if (target_sp) { 1976 if (!section.IsValid()) { 1977 sb_error.SetErrorStringWithFormat("invalid section"); 1978 } else { 1979 SectionSP section_sp(section.GetSP()); 1980 if (section_sp) { 1981 if (section_sp->IsThreadSpecific()) { 1982 sb_error.SetErrorString( 1983 "thread specific sections are not yet supported"); 1984 } else { 1985 ProcessSP process_sp(target_sp->GetProcessSP()); 1986 if (target_sp->SetSectionLoadAddress(section_sp, section_base_addr)) { 1987 ModuleSP module_sp(section_sp->GetModule()); 1988 if (module_sp) { 1989 ModuleList module_list; 1990 module_list.Append(module_sp); 1991 target_sp->ModulesDidLoad(module_list); 1992 } 1993 // Flush info in the process (stack frames, etc) 1994 if (process_sp) 1995 process_sp->Flush(); 1996 } 1997 } 1998 } 1999 } 2000 } else { 2001 sb_error.SetErrorString("invalid target"); 2002 } 2003 return sb_error; 2004 } 2005 2006 SBError SBTarget::ClearSectionLoadAddress(lldb::SBSection section) { 2007 SBError sb_error; 2008 2009 TargetSP target_sp(GetSP()); 2010 if (target_sp) { 2011 if (!section.IsValid()) { 2012 sb_error.SetErrorStringWithFormat("invalid section"); 2013 } else { 2014 SectionSP section_sp(section.GetSP()); 2015 if (section_sp) { 2016 ProcessSP process_sp(target_sp->GetProcessSP()); 2017 if (target_sp->SetSectionUnloaded(section_sp)) { 2018 ModuleSP module_sp(section_sp->GetModule()); 2019 if (module_sp) { 2020 ModuleList module_list; 2021 module_list.Append(module_sp); 2022 target_sp->ModulesDidUnload(module_list, false); 2023 } 2024 // Flush info in the process (stack frames, etc) 2025 if (process_sp) 2026 process_sp->Flush(); 2027 } 2028 } else { 2029 sb_error.SetErrorStringWithFormat("invalid section"); 2030 } 2031 } 2032 } else { 2033 sb_error.SetErrorStringWithFormat("invalid target"); 2034 } 2035 return sb_error; 2036 } 2037 2038 SBError SBTarget::SetModuleLoadAddress(lldb::SBModule module, 2039 int64_t slide_offset) { 2040 SBError sb_error; 2041 2042 TargetSP target_sp(GetSP()); 2043 if (target_sp) { 2044 ModuleSP module_sp(module.GetSP()); 2045 if (module_sp) { 2046 bool changed = false; 2047 if (module_sp->SetLoadAddress(*target_sp, slide_offset, true, changed)) { 2048 // The load was successful, make sure that at least some sections 2049 // changed before we notify that our module was loaded. 2050 if (changed) { 2051 ModuleList module_list; 2052 module_list.Append(module_sp); 2053 target_sp->ModulesDidLoad(module_list); 2054 // Flush info in the process (stack frames, etc) 2055 ProcessSP process_sp(target_sp->GetProcessSP()); 2056 if (process_sp) 2057 process_sp->Flush(); 2058 } 2059 } 2060 } else { 2061 sb_error.SetErrorStringWithFormat("invalid module"); 2062 } 2063 2064 } else { 2065 sb_error.SetErrorStringWithFormat("invalid target"); 2066 } 2067 return sb_error; 2068 } 2069 2070 SBError SBTarget::ClearModuleLoadAddress(lldb::SBModule module) { 2071 SBError sb_error; 2072 2073 char path[PATH_MAX]; 2074 TargetSP target_sp(GetSP()); 2075 if (target_sp) { 2076 ModuleSP module_sp(module.GetSP()); 2077 if (module_sp) { 2078 ObjectFile *objfile = module_sp->GetObjectFile(); 2079 if (objfile) { 2080 SectionList *section_list = objfile->GetSectionList(); 2081 if (section_list) { 2082 ProcessSP process_sp(target_sp->GetProcessSP()); 2083 2084 bool changed = false; 2085 const size_t num_sections = section_list->GetSize(); 2086 for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) { 2087 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx)); 2088 if (section_sp) 2089 changed |= target_sp->SetSectionUnloaded(section_sp); 2090 } 2091 if (changed) { 2092 ModuleList module_list; 2093 module_list.Append(module_sp); 2094 target_sp->ModulesDidUnload(module_list, false); 2095 // Flush info in the process (stack frames, etc) 2096 ProcessSP process_sp(target_sp->GetProcessSP()); 2097 if (process_sp) 2098 process_sp->Flush(); 2099 } 2100 } else { 2101 module_sp->GetFileSpec().GetPath(path, sizeof(path)); 2102 sb_error.SetErrorStringWithFormat("no sections in object file '%s'", 2103 path); 2104 } 2105 } else { 2106 module_sp->GetFileSpec().GetPath(path, sizeof(path)); 2107 sb_error.SetErrorStringWithFormat("no object file for module '%s'", 2108 path); 2109 } 2110 } else { 2111 sb_error.SetErrorStringWithFormat("invalid module"); 2112 } 2113 } else { 2114 sb_error.SetErrorStringWithFormat("invalid target"); 2115 } 2116 return sb_error; 2117 } 2118 2119 lldb::SBSymbolContextList SBTarget::FindSymbols(const char *name, 2120 lldb::SymbolType symbol_type) { 2121 SBSymbolContextList sb_sc_list; 2122 if (name && name[0]) { 2123 TargetSP target_sp(GetSP()); 2124 if (target_sp) { 2125 bool append = true; 2126 target_sp->GetImages().FindSymbolsWithNameAndType( 2127 ConstString(name), symbol_type, *sb_sc_list, append); 2128 } 2129 } 2130 return sb_sc_list; 2131 } 2132 2133 lldb::SBValue SBTarget::EvaluateExpression(const char *expr) { 2134 TargetSP target_sp(GetSP()); 2135 if (!target_sp) 2136 return SBValue(); 2137 2138 SBExpressionOptions options; 2139 lldb::DynamicValueType fetch_dynamic_value = 2140 target_sp->GetPreferDynamicValue(); 2141 options.SetFetchDynamicValue(fetch_dynamic_value); 2142 options.SetUnwindOnError(true); 2143 return EvaluateExpression(expr, options); 2144 } 2145 2146 lldb::SBValue SBTarget::EvaluateExpression(const char *expr, 2147 const SBExpressionOptions &options) { 2148 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2149 #if !defined(LLDB_DISABLE_PYTHON) 2150 Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 2151 #endif 2152 SBValue expr_result; 2153 ExpressionResults exe_results = eExpressionSetupError; 2154 ValueObjectSP expr_value_sp; 2155 TargetSP target_sp(GetSP()); 2156 StackFrame *frame = NULL; 2157 if (target_sp) { 2158 if (expr == NULL || expr[0] == '\0') { 2159 if (log) 2160 log->Printf( 2161 "SBTarget::EvaluateExpression called with an empty expression"); 2162 return expr_result; 2163 } 2164 2165 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 2166 ExecutionContext exe_ctx(m_opaque_sp.get()); 2167 2168 if (log) 2169 log->Printf("SBTarget()::EvaluateExpression (expr=\"%s\")...", expr); 2170 2171 frame = exe_ctx.GetFramePtr(); 2172 Target *target = exe_ctx.GetTargetPtr(); 2173 2174 if (target) { 2175 #ifdef LLDB_CONFIGURATION_DEBUG 2176 StreamString frame_description; 2177 if (frame) 2178 frame->DumpUsingSettingsFormat(&frame_description); 2179 llvm::PrettyStackTraceFormat stack_trace( 2180 "SBTarget::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = " 2181 "%u) %s", 2182 expr, options.GetFetchDynamicValue(), 2183 frame_description.GetString().str().c_str()); 2184 #endif 2185 exe_results = 2186 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 2187 2188 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 2189 } else { 2190 if (log) 2191 log->Printf("SBTarget::EvaluateExpression () => error: could not " 2192 "reconstruct frame object for this SBTarget."); 2193 } 2194 } 2195 #ifndef LLDB_DISABLE_PYTHON 2196 if (expr_log) 2197 expr_log->Printf("** [SBTarget::EvaluateExpression] Expression result is " 2198 "%s, summary %s **", 2199 expr_result.GetValue(), expr_result.GetSummary()); 2200 2201 if (log) 2202 log->Printf("SBTarget(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 2203 "(execution result=%d)", 2204 static_cast<void *>(frame), expr, 2205 static_cast<void *>(expr_value_sp.get()), exe_results); 2206 #endif 2207 2208 return expr_result; 2209 } 2210 2211 lldb::addr_t SBTarget::GetStackRedZoneSize() { 2212 TargetSP target_sp(GetSP()); 2213 if (target_sp) { 2214 ABISP abi_sp; 2215 ProcessSP process_sp(target_sp->GetProcessSP()); 2216 if (process_sp) 2217 abi_sp = process_sp->GetABI(); 2218 else 2219 abi_sp = ABI::FindPlugin(ProcessSP(), target_sp->GetArchitecture()); 2220 if (abi_sp) 2221 return abi_sp->GetRedZoneSize(); 2222 } 2223 return 0; 2224 } 2225 2226 lldb::SBLaunchInfo SBTarget::GetLaunchInfo() const { 2227 lldb::SBLaunchInfo launch_info(NULL); 2228 TargetSP target_sp(GetSP()); 2229 if (target_sp) 2230 launch_info.set_ref(m_opaque_sp->GetProcessLaunchInfo()); 2231 return launch_info; 2232 } 2233 2234 void SBTarget::SetLaunchInfo(const lldb::SBLaunchInfo &launch_info) { 2235 TargetSP target_sp(GetSP()); 2236 if (target_sp) 2237 m_opaque_sp->SetProcessLaunchInfo(launch_info.ref()); 2238 } 2239