1 //===-- Target.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/lldb-python.h" 11 12 #include "lldb/Target/Target.h" 13 14 // C Includes 15 // C++ Includes 16 // Other libraries and framework includes 17 // Project includes 18 #include "lldb/Breakpoint/BreakpointResolver.h" 19 #include "lldb/Breakpoint/BreakpointResolverAddress.h" 20 #include "lldb/Breakpoint/BreakpointResolverFileLine.h" 21 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h" 22 #include "lldb/Breakpoint/BreakpointResolverName.h" 23 #include "lldb/Breakpoint/Watchpoint.h" 24 #include "lldb/Core/Debugger.h" 25 #include "lldb/Core/Event.h" 26 #include "lldb/Core/Log.h" 27 #include "lldb/Core/Module.h" 28 #include "lldb/Core/ModuleSpec.h" 29 #include "lldb/Core/Section.h" 30 #include "lldb/Core/StreamString.h" 31 #include "lldb/Core/Timer.h" 32 #include "lldb/Core/ValueObject.h" 33 #include "lldb/Expression/ClangASTSource.h" 34 #include "lldb/Expression/ClangUserExpression.h" 35 #include "lldb/Host/Host.h" 36 #include "lldb/Interpreter/CommandInterpreter.h" 37 #include "lldb/Interpreter/CommandReturnObject.h" 38 #include "lldb/Interpreter/OptionGroupWatchpoint.h" 39 #include "lldb/Interpreter/OptionValues.h" 40 #include "lldb/Interpreter/Property.h" 41 #include "lldb/lldb-private-log.h" 42 #include "lldb/Symbol/ObjectFile.h" 43 #include "lldb/Target/Process.h" 44 #include "lldb/Target/StackFrame.h" 45 #include "lldb/Target/Thread.h" 46 #include "lldb/Target/ThreadSpec.h" 47 48 using namespace lldb; 49 using namespace lldb_private; 50 51 ConstString & 52 Target::GetStaticBroadcasterClass () 53 { 54 static ConstString class_name ("lldb.target"); 55 return class_name; 56 } 57 58 //---------------------------------------------------------------------- 59 // Target constructor 60 //---------------------------------------------------------------------- 61 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) : 62 TargetProperties (this), 63 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()), 64 ExecutionContextScope (), 65 m_debugger (debugger), 66 m_platform_sp (platform_sp), 67 m_mutex (Mutex::eMutexTypeRecursive), 68 m_arch (target_arch), 69 m_images (this), 70 m_section_load_list (), 71 m_breakpoint_list (false), 72 m_internal_breakpoint_list (true), 73 m_watchpoint_list (), 74 m_process_sp (), 75 m_valid (true), 76 m_search_filter_sp (), 77 m_image_search_paths (ImageSearchPathsChanged, this), 78 m_scratch_ast_context_ap (NULL), 79 m_scratch_ast_source_ap (NULL), 80 m_ast_importer_ap (NULL), 81 m_persistent_variables (), 82 m_source_manager(*this), 83 m_stop_hooks (), 84 m_stop_hook_next_id (0), 85 m_suppress_stop_hooks (false), 86 m_suppress_synthetic_value(false) 87 { 88 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed"); 89 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded"); 90 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded"); 91 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed"); 92 93 CheckInWithManager(); 94 95 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 96 if (log) 97 log->Printf ("%p Target::Target()", this); 98 if (m_arch.IsValid()) 99 { 100 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 101 } 102 } 103 104 //---------------------------------------------------------------------- 105 // Destructor 106 //---------------------------------------------------------------------- 107 Target::~Target() 108 { 109 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 110 if (log) 111 log->Printf ("%p Target::~Target()", this); 112 DeleteCurrentProcess (); 113 } 114 115 void 116 Target::Dump (Stream *s, lldb::DescriptionLevel description_level) 117 { 118 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 119 if (description_level != lldb::eDescriptionLevelBrief) 120 { 121 s->Indent(); 122 s->PutCString("Target\n"); 123 s->IndentMore(); 124 m_images.Dump(s); 125 m_breakpoint_list.Dump(s); 126 m_internal_breakpoint_list.Dump(s); 127 s->IndentLess(); 128 } 129 else 130 { 131 Module *exe_module = GetExecutableModulePointer(); 132 if (exe_module) 133 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString()); 134 else 135 s->PutCString ("No executable module."); 136 } 137 } 138 139 void 140 Target::CleanupProcess () 141 { 142 // Do any cleanup of the target we need to do between process instances. 143 // NB It is better to do this before destroying the process in case the 144 // clean up needs some help from the process. 145 m_breakpoint_list.ClearAllBreakpointSites(); 146 m_internal_breakpoint_list.ClearAllBreakpointSites(); 147 // Disable watchpoints just on the debugger side. 148 Mutex::Locker locker; 149 this->GetWatchpointList().GetListMutex(locker); 150 DisableAllWatchpoints(false); 151 ClearAllWatchpointHitCounts(); 152 } 153 154 void 155 Target::DeleteCurrentProcess () 156 { 157 if (m_process_sp.get()) 158 { 159 m_section_load_list.Clear(); 160 if (m_process_sp->IsAlive()) 161 m_process_sp->Destroy(); 162 163 m_process_sp->Finalize(); 164 165 CleanupProcess (); 166 167 m_process_sp.reset(); 168 } 169 } 170 171 const lldb::ProcessSP & 172 Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file) 173 { 174 DeleteCurrentProcess (); 175 m_process_sp = Process::FindPlugin(*this, plugin_name, listener, crash_file); 176 return m_process_sp; 177 } 178 179 const lldb::ProcessSP & 180 Target::GetProcessSP () const 181 { 182 return m_process_sp; 183 } 184 185 void 186 Target::Destroy() 187 { 188 Mutex::Locker locker (m_mutex); 189 m_valid = false; 190 DeleteCurrentProcess (); 191 m_platform_sp.reset(); 192 m_arch.Clear(); 193 m_images.Clear(); 194 m_section_load_list.Clear(); 195 const bool notify = false; 196 m_breakpoint_list.RemoveAll(notify); 197 m_internal_breakpoint_list.RemoveAll(notify); 198 m_last_created_breakpoint.reset(); 199 m_last_created_watchpoint.reset(); 200 m_search_filter_sp.reset(); 201 m_image_search_paths.Clear(notify); 202 m_scratch_ast_context_ap.reset(); 203 m_scratch_ast_source_ap.reset(); 204 m_ast_importer_ap.reset(); 205 m_persistent_variables.Clear(); 206 m_stop_hooks.clear(); 207 m_stop_hook_next_id = 0; 208 m_suppress_stop_hooks = false; 209 m_suppress_synthetic_value = false; 210 } 211 212 213 BreakpointList & 214 Target::GetBreakpointList(bool internal) 215 { 216 if (internal) 217 return m_internal_breakpoint_list; 218 else 219 return m_breakpoint_list; 220 } 221 222 const BreakpointList & 223 Target::GetBreakpointList(bool internal) const 224 { 225 if (internal) 226 return m_internal_breakpoint_list; 227 else 228 return m_breakpoint_list; 229 } 230 231 BreakpointSP 232 Target::GetBreakpointByID (break_id_t break_id) 233 { 234 BreakpointSP bp_sp; 235 236 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 237 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 238 else 239 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 240 241 return bp_sp; 242 } 243 244 BreakpointSP 245 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules, 246 const FileSpecList *source_file_spec_list, 247 RegularExpression &source_regex, 248 bool internal) 249 { 250 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list)); 251 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex)); 252 return CreateBreakpoint (filter_sp, resolver_sp, internal); 253 } 254 255 256 BreakpointSP 257 Target::CreateBreakpoint (const FileSpecList *containingModules, 258 const FileSpec &file, 259 uint32_t line_no, 260 LazyBool check_inlines, 261 LazyBool skip_prologue, 262 bool internal) 263 { 264 if (check_inlines == eLazyBoolCalculate) 265 { 266 const InlineStrategy inline_strategy = GetInlineStrategy(); 267 switch (inline_strategy) 268 { 269 case eInlineBreakpointsNever: 270 check_inlines = eLazyBoolNo; 271 break; 272 273 case eInlineBreakpointsHeaders: 274 if (file.IsSourceImplementationFile()) 275 check_inlines = eLazyBoolNo; 276 else 277 check_inlines = eLazyBoolYes; 278 break; 279 280 case eInlineBreakpointsAlways: 281 check_inlines = eLazyBoolYes; 282 break; 283 } 284 } 285 SearchFilterSP filter_sp; 286 if (check_inlines == eLazyBoolNo) 287 { 288 // Not checking for inlines, we are looking only for matching compile units 289 FileSpecList compile_unit_list; 290 compile_unit_list.Append (file); 291 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list); 292 } 293 else 294 { 295 filter_sp = GetSearchFilterForModuleList (containingModules); 296 } 297 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, 298 file, 299 line_no, 300 check_inlines, 301 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 302 return CreateBreakpoint (filter_sp, resolver_sp, internal); 303 } 304 305 306 BreakpointSP 307 Target::CreateBreakpoint (lldb::addr_t addr, bool internal) 308 { 309 Address so_addr; 310 // Attempt to resolve our load address if possible, though it is ok if 311 // it doesn't resolve to section/offset. 312 313 // Try and resolve as a load address if possible 314 m_section_load_list.ResolveLoadAddress(addr, so_addr); 315 if (!so_addr.IsValid()) 316 { 317 // The address didn't resolve, so just set this as an absolute address 318 so_addr.SetOffset (addr); 319 } 320 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal)); 321 return bp_sp; 322 } 323 324 BreakpointSP 325 Target::CreateBreakpoint (Address &addr, bool internal) 326 { 327 SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 328 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr)); 329 return CreateBreakpoint (filter_sp, resolver_sp, internal); 330 } 331 332 BreakpointSP 333 Target::CreateBreakpoint (const FileSpecList *containingModules, 334 const FileSpecList *containingSourceFiles, 335 const char *func_name, 336 uint32_t func_name_type_mask, 337 LazyBool skip_prologue, 338 bool internal) 339 { 340 BreakpointSP bp_sp; 341 if (func_name) 342 { 343 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 344 345 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 346 func_name, 347 func_name_type_mask, 348 Breakpoint::Exact, 349 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 350 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal); 351 } 352 return bp_sp; 353 } 354 355 lldb::BreakpointSP 356 Target::CreateBreakpoint (const FileSpecList *containingModules, 357 const FileSpecList *containingSourceFiles, 358 const std::vector<std::string> &func_names, 359 uint32_t func_name_type_mask, 360 LazyBool skip_prologue, 361 bool internal) 362 { 363 BreakpointSP bp_sp; 364 size_t num_names = func_names.size(); 365 if (num_names > 0) 366 { 367 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 368 369 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 370 func_names, 371 func_name_type_mask, 372 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 373 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal); 374 } 375 return bp_sp; 376 } 377 378 BreakpointSP 379 Target::CreateBreakpoint (const FileSpecList *containingModules, 380 const FileSpecList *containingSourceFiles, 381 const char *func_names[], 382 size_t num_names, 383 uint32_t func_name_type_mask, 384 LazyBool skip_prologue, 385 bool internal) 386 { 387 BreakpointSP bp_sp; 388 if (num_names > 0) 389 { 390 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 391 392 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 393 func_names, 394 num_names, 395 func_name_type_mask, 396 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 397 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal); 398 } 399 return bp_sp; 400 } 401 402 SearchFilterSP 403 Target::GetSearchFilterForModule (const FileSpec *containingModule) 404 { 405 SearchFilterSP filter_sp; 406 if (containingModule != NULL) 407 { 408 // TODO: We should look into sharing module based search filters 409 // across many breakpoints like we do for the simple target based one 410 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule)); 411 } 412 else 413 { 414 if (m_search_filter_sp.get() == NULL) 415 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 416 filter_sp = m_search_filter_sp; 417 } 418 return filter_sp; 419 } 420 421 SearchFilterSP 422 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules) 423 { 424 SearchFilterSP filter_sp; 425 if (containingModules && containingModules->GetSize() != 0) 426 { 427 // TODO: We should look into sharing module based search filters 428 // across many breakpoints like we do for the simple target based one 429 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules)); 430 } 431 else 432 { 433 if (m_search_filter_sp.get() == NULL) 434 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 435 filter_sp = m_search_filter_sp; 436 } 437 return filter_sp; 438 } 439 440 SearchFilterSP 441 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, 442 const FileSpecList *containingSourceFiles) 443 { 444 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0) 445 return GetSearchFilterForModuleList(containingModules); 446 447 SearchFilterSP filter_sp; 448 if (containingModules == NULL) 449 { 450 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable, 451 // but that will take a little reworking. 452 453 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles)); 454 } 455 else 456 { 457 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles)); 458 } 459 return filter_sp; 460 } 461 462 BreakpointSP 463 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules, 464 const FileSpecList *containingSourceFiles, 465 RegularExpression &func_regex, 466 LazyBool skip_prologue, 467 bool internal) 468 { 469 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 470 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, 471 func_regex, 472 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 473 474 return CreateBreakpoint (filter_sp, resolver_sp, internal); 475 } 476 477 lldb::BreakpointSP 478 Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal) 479 { 480 return LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal); 481 } 482 483 BreakpointSP 484 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal) 485 { 486 BreakpointSP bp_sp; 487 if (filter_sp && resolver_sp) 488 { 489 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp)); 490 resolver_sp->SetBreakpoint (bp_sp.get()); 491 492 if (internal) 493 m_internal_breakpoint_list.Add (bp_sp, false); 494 else 495 m_breakpoint_list.Add (bp_sp, true); 496 497 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 498 if (log) 499 { 500 StreamString s; 501 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 502 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData()); 503 } 504 505 bp_sp->ResolveBreakpoint(); 506 } 507 508 if (!internal && bp_sp) 509 { 510 m_last_created_breakpoint = bp_sp; 511 } 512 513 return bp_sp; 514 } 515 516 bool 517 Target::ProcessIsValid() 518 { 519 return (m_process_sp && m_process_sp->IsAlive()); 520 } 521 522 static bool 523 CheckIfWatchpointsExhausted(Target *target, Error &error) 524 { 525 uint32_t num_supported_hardware_watchpoints; 526 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints); 527 if (rc.Success()) 528 { 529 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize(); 530 if (num_current_watchpoints >= num_supported_hardware_watchpoints) 531 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached", 532 num_supported_hardware_watchpoints); 533 } 534 return false; 535 } 536 537 // See also Watchpoint::SetWatchpointType(uint32_t type) and 538 // the OptionGroupWatchpoint::WatchType enum type. 539 WatchpointSP 540 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error) 541 { 542 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 543 if (log) 544 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n", 545 __FUNCTION__, addr, (uint64_t)size, kind); 546 547 WatchpointSP wp_sp; 548 if (!ProcessIsValid()) 549 { 550 error.SetErrorString("process is not alive"); 551 return wp_sp; 552 } 553 if (addr == LLDB_INVALID_ADDRESS || size == 0) 554 { 555 if (size == 0) 556 error.SetErrorString("cannot set a watchpoint with watch_size of 0"); 557 else 558 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr); 559 return wp_sp; 560 } 561 562 // Currently we only support one watchpoint per address, with total number 563 // of watchpoints limited by the hardware which the inferior is running on. 564 565 // Grab the list mutex while doing operations. 566 const bool notify = false; // Don't notify about all the state changes we do on creating the watchpoint. 567 Mutex::Locker locker; 568 this->GetWatchpointList().GetListMutex(locker); 569 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr); 570 if (matched_sp) 571 { 572 size_t old_size = matched_sp->GetByteSize(); 573 uint32_t old_type = 574 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) | 575 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0); 576 // Return the existing watchpoint if both size and type match. 577 if (size == old_size && kind == old_type) { 578 wp_sp = matched_sp; 579 wp_sp->SetEnabled(false, notify); 580 } else { 581 // Nil the matched watchpoint; we will be creating a new one. 582 m_process_sp->DisableWatchpoint(matched_sp.get(), notify); 583 m_watchpoint_list.Remove(matched_sp->GetID(), true); 584 } 585 } 586 587 if (!wp_sp) 588 { 589 wp_sp.reset(new Watchpoint(*this, addr, size, type)); 590 wp_sp->SetWatchpointType(kind, notify); 591 m_watchpoint_list.Add (wp_sp, true); 592 } 593 594 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify); 595 if (log) 596 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n", 597 __FUNCTION__, 598 error.Success() ? "succeeded" : "failed", 599 wp_sp->GetID()); 600 601 if (error.Fail()) 602 { 603 // Enabling the watchpoint on the device side failed. 604 // Remove the said watchpoint from the list maintained by the target instance. 605 m_watchpoint_list.Remove (wp_sp->GetID(), true); 606 // See if we could provide more helpful error message. 607 if (!CheckIfWatchpointsExhausted(this, error)) 608 { 609 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size)) 610 error.SetErrorStringWithFormat("watch size of %lu is not supported", size); 611 } 612 wp_sp.reset(); 613 } 614 else 615 m_last_created_watchpoint = wp_sp; 616 return wp_sp; 617 } 618 619 void 620 Target::RemoveAllBreakpoints (bool internal_also) 621 { 622 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 623 if (log) 624 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 625 626 m_breakpoint_list.RemoveAll (true); 627 if (internal_also) 628 m_internal_breakpoint_list.RemoveAll (false); 629 630 m_last_created_breakpoint.reset(); 631 } 632 633 void 634 Target::DisableAllBreakpoints (bool internal_also) 635 { 636 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 637 if (log) 638 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 639 640 m_breakpoint_list.SetEnabledAll (false); 641 if (internal_also) 642 m_internal_breakpoint_list.SetEnabledAll (false); 643 } 644 645 void 646 Target::EnableAllBreakpoints (bool internal_also) 647 { 648 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 649 if (log) 650 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 651 652 m_breakpoint_list.SetEnabledAll (true); 653 if (internal_also) 654 m_internal_breakpoint_list.SetEnabledAll (true); 655 } 656 657 bool 658 Target::RemoveBreakpointByID (break_id_t break_id) 659 { 660 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 661 if (log) 662 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 663 664 if (DisableBreakpointByID (break_id)) 665 { 666 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 667 m_internal_breakpoint_list.Remove(break_id, false); 668 else 669 { 670 if (m_last_created_breakpoint) 671 { 672 if (m_last_created_breakpoint->GetID() == break_id) 673 m_last_created_breakpoint.reset(); 674 } 675 m_breakpoint_list.Remove(break_id, true); 676 } 677 return true; 678 } 679 return false; 680 } 681 682 bool 683 Target::DisableBreakpointByID (break_id_t break_id) 684 { 685 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 686 if (log) 687 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 688 689 BreakpointSP bp_sp; 690 691 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 692 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 693 else 694 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 695 if (bp_sp) 696 { 697 bp_sp->SetEnabled (false); 698 return true; 699 } 700 return false; 701 } 702 703 bool 704 Target::EnableBreakpointByID (break_id_t break_id) 705 { 706 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 707 if (log) 708 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", 709 __FUNCTION__, 710 break_id, 711 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 712 713 BreakpointSP bp_sp; 714 715 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 716 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 717 else 718 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 719 720 if (bp_sp) 721 { 722 bp_sp->SetEnabled (true); 723 return true; 724 } 725 return false; 726 } 727 728 // The flag 'end_to_end', default to true, signifies that the operation is 729 // performed end to end, for both the debugger and the debuggee. 730 731 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 732 // to end operations. 733 bool 734 Target::RemoveAllWatchpoints (bool end_to_end) 735 { 736 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 737 if (log) 738 log->Printf ("Target::%s\n", __FUNCTION__); 739 740 if (!end_to_end) { 741 m_watchpoint_list.RemoveAll(true); 742 return true; 743 } 744 745 // Otherwise, it's an end to end operation. 746 747 if (!ProcessIsValid()) 748 return false; 749 750 size_t num_watchpoints = m_watchpoint_list.GetSize(); 751 for (size_t i = 0; i < num_watchpoints; ++i) 752 { 753 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 754 if (!wp_sp) 755 return false; 756 757 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 758 if (rc.Fail()) 759 return false; 760 } 761 m_watchpoint_list.RemoveAll (true); 762 return true; // Success! 763 } 764 765 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 766 // end operations. 767 bool 768 Target::DisableAllWatchpoints (bool end_to_end) 769 { 770 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 771 if (log) 772 log->Printf ("Target::%s\n", __FUNCTION__); 773 774 if (!end_to_end) { 775 m_watchpoint_list.SetEnabledAll(false); 776 return true; 777 } 778 779 // Otherwise, it's an end to end operation. 780 781 if (!ProcessIsValid()) 782 return false; 783 784 size_t num_watchpoints = m_watchpoint_list.GetSize(); 785 for (size_t i = 0; i < num_watchpoints; ++i) 786 { 787 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 788 if (!wp_sp) 789 return false; 790 791 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 792 if (rc.Fail()) 793 return false; 794 } 795 return true; // Success! 796 } 797 798 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 799 // end operations. 800 bool 801 Target::EnableAllWatchpoints (bool end_to_end) 802 { 803 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 804 if (log) 805 log->Printf ("Target::%s\n", __FUNCTION__); 806 807 if (!end_to_end) { 808 m_watchpoint_list.SetEnabledAll(true); 809 return true; 810 } 811 812 // Otherwise, it's an end to end operation. 813 814 if (!ProcessIsValid()) 815 return false; 816 817 size_t num_watchpoints = m_watchpoint_list.GetSize(); 818 for (size_t i = 0; i < num_watchpoints; ++i) 819 { 820 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 821 if (!wp_sp) 822 return false; 823 824 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 825 if (rc.Fail()) 826 return false; 827 } 828 return true; // Success! 829 } 830 831 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 832 bool 833 Target::ClearAllWatchpointHitCounts () 834 { 835 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 836 if (log) 837 log->Printf ("Target::%s\n", __FUNCTION__); 838 839 size_t num_watchpoints = m_watchpoint_list.GetSize(); 840 for (size_t i = 0; i < num_watchpoints; ++i) 841 { 842 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 843 if (!wp_sp) 844 return false; 845 846 wp_sp->ResetHitCount(); 847 } 848 return true; // Success! 849 } 850 851 // Assumption: Caller holds the list mutex lock for m_watchpoint_list 852 // during these operations. 853 bool 854 Target::IgnoreAllWatchpoints (uint32_t ignore_count) 855 { 856 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 857 if (log) 858 log->Printf ("Target::%s\n", __FUNCTION__); 859 860 if (!ProcessIsValid()) 861 return false; 862 863 size_t num_watchpoints = m_watchpoint_list.GetSize(); 864 for (size_t i = 0; i < num_watchpoints; ++i) 865 { 866 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 867 if (!wp_sp) 868 return false; 869 870 wp_sp->SetIgnoreCount(ignore_count); 871 } 872 return true; // Success! 873 } 874 875 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 876 bool 877 Target::DisableWatchpointByID (lldb::watch_id_t watch_id) 878 { 879 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 880 if (log) 881 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 882 883 if (!ProcessIsValid()) 884 return false; 885 886 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 887 if (wp_sp) 888 { 889 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 890 if (rc.Success()) 891 return true; 892 893 // Else, fallthrough. 894 } 895 return false; 896 } 897 898 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 899 bool 900 Target::EnableWatchpointByID (lldb::watch_id_t watch_id) 901 { 902 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 903 if (log) 904 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 905 906 if (!ProcessIsValid()) 907 return false; 908 909 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 910 if (wp_sp) 911 { 912 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 913 if (rc.Success()) 914 return true; 915 916 // Else, fallthrough. 917 } 918 return false; 919 } 920 921 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 922 bool 923 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id) 924 { 925 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 926 if (log) 927 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 928 929 if (DisableWatchpointByID (watch_id)) 930 { 931 m_watchpoint_list.Remove(watch_id, true); 932 return true; 933 } 934 return false; 935 } 936 937 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 938 bool 939 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count) 940 { 941 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 942 if (log) 943 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 944 945 if (!ProcessIsValid()) 946 return false; 947 948 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 949 if (wp_sp) 950 { 951 wp_sp->SetIgnoreCount(ignore_count); 952 return true; 953 } 954 return false; 955 } 956 957 ModuleSP 958 Target::GetExecutableModule () 959 { 960 return m_images.GetModuleAtIndex(0); 961 } 962 963 Module* 964 Target::GetExecutableModulePointer () 965 { 966 return m_images.GetModulePointerAtIndex(0); 967 } 968 969 static void 970 LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target) 971 { 972 Error error; 973 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error)) 974 { 975 target->GetDebugger().GetOutputStream().Printf("unable to load scripting data for module %s - error reported was %s\n", 976 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(), 977 error.AsCString()); 978 } 979 } 980 981 void 982 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files) 983 { 984 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 985 m_images.Clear(); 986 m_scratch_ast_context_ap.reset(); 987 m_scratch_ast_source_ap.reset(); 988 m_ast_importer_ap.reset(); 989 990 if (executable_sp.get()) 991 { 992 Timer scoped_timer (__PRETTY_FUNCTION__, 993 "Target::SetExecutableModule (executable = '%s/%s')", 994 executable_sp->GetFileSpec().GetDirectory().AsCString(), 995 executable_sp->GetFileSpec().GetFilename().AsCString()); 996 997 m_images.Append(executable_sp); // The first image is our exectuable file 998 999 // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module. 1000 if (!m_arch.IsValid()) 1001 { 1002 m_arch = executable_sp->GetArchitecture(); 1003 if (log) 1004 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 1005 } 1006 1007 FileSpecList dependent_files; 1008 ObjectFile *executable_objfile = executable_sp->GetObjectFile(); 1009 1010 if (executable_objfile && get_dependent_files) 1011 { 1012 executable_objfile->GetDependentModules(dependent_files); 1013 for (uint32_t i=0; i<dependent_files.GetSize(); i++) 1014 { 1015 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i)); 1016 FileSpec platform_dependent_file_spec; 1017 if (m_platform_sp) 1018 m_platform_sp->GetFile (dependent_file_spec, NULL, platform_dependent_file_spec); 1019 else 1020 platform_dependent_file_spec = dependent_file_spec; 1021 1022 ModuleSpec module_spec (platform_dependent_file_spec, m_arch); 1023 ModuleSP image_module_sp(GetSharedModule (module_spec)); 1024 if (image_module_sp.get()) 1025 { 1026 ObjectFile *objfile = image_module_sp->GetObjectFile(); 1027 if (objfile) 1028 objfile->GetDependentModules(dependent_files); 1029 } 1030 } 1031 } 1032 } 1033 } 1034 1035 1036 bool 1037 Target::SetArchitecture (const ArchSpec &arch_spec) 1038 { 1039 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 1040 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid()) 1041 { 1042 // If we haven't got a valid arch spec, or the architectures are 1043 // compatible, so just update the architecture. Architectures can be 1044 // equal, yet the triple OS and vendor might change, so we need to do 1045 // the assignment here just in case. 1046 m_arch = arch_spec; 1047 if (log) 1048 log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1049 return true; 1050 } 1051 else 1052 { 1053 // If we have an executable file, try to reset the executable to the desired architecture 1054 if (log) 1055 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1056 m_arch = arch_spec; 1057 ModuleSP executable_sp = GetExecutableModule (); 1058 m_images.Clear(); 1059 m_scratch_ast_context_ap.reset(); 1060 m_scratch_ast_source_ap.reset(); 1061 m_ast_importer_ap.reset(); 1062 // Need to do something about unsetting breakpoints. 1063 1064 if (executable_sp) 1065 { 1066 if (log) 1067 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1068 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec); 1069 Error error = ModuleList::GetSharedModule (module_spec, 1070 executable_sp, 1071 &GetExecutableSearchPaths(), 1072 NULL, 1073 NULL); 1074 1075 if (!error.Fail() && executable_sp) 1076 { 1077 SetExecutableModule (executable_sp, true); 1078 return true; 1079 } 1080 } 1081 } 1082 return false; 1083 } 1084 1085 void 1086 Target::WillClearList (const ModuleList& module_list) 1087 { 1088 } 1089 1090 void 1091 Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp) 1092 { 1093 // A module is being added to this target for the first time 1094 ModuleList my_module_list; 1095 my_module_list.Append(module_sp); 1096 LoadScriptingResourceForModule(module_sp, this); 1097 ModulesDidLoad (my_module_list); 1098 } 1099 1100 void 1101 Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp) 1102 { 1103 // A module is being added to this target for the first time 1104 ModuleList my_module_list; 1105 my_module_list.Append(module_sp); 1106 ModulesDidUnload (my_module_list); 1107 } 1108 1109 void 1110 Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp) 1111 { 1112 // A module is replacing an already added module 1113 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp); 1114 } 1115 1116 void 1117 Target::ModulesDidLoad (ModuleList &module_list) 1118 { 1119 if (module_list.GetSize()) 1120 { 1121 m_breakpoint_list.UpdateBreakpoints (module_list, true); 1122 // TODO: make event data that packages up the module_list 1123 BroadcastEvent (eBroadcastBitModulesLoaded, NULL); 1124 } 1125 } 1126 1127 void 1128 Target::ModulesDidUnload (ModuleList &module_list) 1129 { 1130 if (module_list.GetSize()) 1131 { 1132 m_breakpoint_list.UpdateBreakpoints (module_list, false); 1133 // TODO: make event data that packages up the module_list 1134 BroadcastEvent (eBroadcastBitModulesUnloaded, NULL); 1135 } 1136 } 1137 1138 bool 1139 Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_file_spec) 1140 { 1141 if (GetBreakpointsConsultPlatformAvoidList()) 1142 { 1143 ModuleList matchingModules; 1144 ModuleSpec module_spec (module_file_spec); 1145 size_t num_modules = GetImages().FindModules(module_spec, matchingModules); 1146 1147 // If there is more than one module for this file spec, only return true if ALL the modules are on the 1148 // black list. 1149 if (num_modules > 0) 1150 { 1151 for (int i = 0; i < num_modules; i++) 1152 { 1153 if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i))) 1154 return false; 1155 } 1156 return true; 1157 } 1158 } 1159 return false; 1160 } 1161 1162 bool 1163 Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp) 1164 { 1165 if (GetBreakpointsConsultPlatformAvoidList()) 1166 { 1167 if (m_platform_sp) 1168 return m_platform_sp->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp); 1169 } 1170 return false; 1171 } 1172 1173 size_t 1174 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error) 1175 { 1176 SectionSP section_sp (addr.GetSection()); 1177 if (section_sp) 1178 { 1179 // If the contents of this section are encrypted, the on-disk file is unusuable. Read only from live memory. 1180 if (section_sp->IsEncrypted()) 1181 { 1182 error.SetErrorString("section is encrypted"); 1183 return 0; 1184 } 1185 ModuleSP module_sp (section_sp->GetModule()); 1186 if (module_sp) 1187 { 1188 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile(); 1189 if (objfile) 1190 { 1191 size_t bytes_read = objfile->ReadSectionData (section_sp.get(), 1192 addr.GetOffset(), 1193 dst, 1194 dst_len); 1195 if (bytes_read > 0) 1196 return bytes_read; 1197 else 1198 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString()); 1199 } 1200 else 1201 error.SetErrorString("address isn't from a object file"); 1202 } 1203 else 1204 error.SetErrorString("address isn't in a module"); 1205 } 1206 else 1207 error.SetErrorString("address doesn't contain a section that points to a section in a object file"); 1208 1209 return 0; 1210 } 1211 1212 size_t 1213 Target::ReadMemory (const Address& addr, 1214 bool prefer_file_cache, 1215 void *dst, 1216 size_t dst_len, 1217 Error &error, 1218 lldb::addr_t *load_addr_ptr) 1219 { 1220 error.Clear(); 1221 1222 // if we end up reading this from process memory, we will fill this 1223 // with the actual load address 1224 if (load_addr_ptr) 1225 *load_addr_ptr = LLDB_INVALID_ADDRESS; 1226 1227 size_t bytes_read = 0; 1228 1229 addr_t load_addr = LLDB_INVALID_ADDRESS; 1230 addr_t file_addr = LLDB_INVALID_ADDRESS; 1231 Address resolved_addr; 1232 if (!addr.IsSectionOffset()) 1233 { 1234 if (m_section_load_list.IsEmpty()) 1235 { 1236 // No sections are loaded, so we must assume we are not running 1237 // yet and anything we are given is a file address. 1238 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address 1239 m_images.ResolveFileAddress (file_addr, resolved_addr); 1240 } 1241 else 1242 { 1243 // We have at least one section loaded. This can be becuase 1244 // we have manually loaded some sections with "target modules load ..." 1245 // or because we have have a live process that has sections loaded 1246 // through the dynamic loader 1247 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address 1248 m_section_load_list.ResolveLoadAddress (load_addr, resolved_addr); 1249 } 1250 } 1251 if (!resolved_addr.IsValid()) 1252 resolved_addr = addr; 1253 1254 1255 if (prefer_file_cache) 1256 { 1257 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1258 if (bytes_read > 0) 1259 return bytes_read; 1260 } 1261 1262 if (ProcessIsValid()) 1263 { 1264 if (load_addr == LLDB_INVALID_ADDRESS) 1265 load_addr = resolved_addr.GetLoadAddress (this); 1266 1267 if (load_addr == LLDB_INVALID_ADDRESS) 1268 { 1269 ModuleSP addr_module_sp (resolved_addr.GetModule()); 1270 if (addr_module_sp && addr_module_sp->GetFileSpec()) 1271 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded", 1272 addr_module_sp->GetFileSpec().GetFilename().AsCString(), 1273 resolved_addr.GetFileAddress(), 1274 addr_module_sp->GetFileSpec().GetFilename().AsCString()); 1275 else 1276 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress()); 1277 } 1278 else 1279 { 1280 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error); 1281 if (bytes_read != dst_len) 1282 { 1283 if (error.Success()) 1284 { 1285 if (bytes_read == 0) 1286 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr); 1287 else 1288 error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr); 1289 } 1290 } 1291 if (bytes_read) 1292 { 1293 if (load_addr_ptr) 1294 *load_addr_ptr = load_addr; 1295 return bytes_read; 1296 } 1297 // If the address is not section offset we have an address that 1298 // doesn't resolve to any address in any currently loaded shared 1299 // libaries and we failed to read memory so there isn't anything 1300 // more we can do. If it is section offset, we might be able to 1301 // read cached memory from the object file. 1302 if (!resolved_addr.IsSectionOffset()) 1303 return 0; 1304 } 1305 } 1306 1307 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) 1308 { 1309 // If we didn't already try and read from the object file cache, then 1310 // try it after failing to read from the process. 1311 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1312 } 1313 return 0; 1314 } 1315 1316 size_t 1317 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error) 1318 { 1319 char buf[256]; 1320 out_str.clear(); 1321 addr_t curr_addr = addr.GetLoadAddress(this); 1322 Address address(addr); 1323 while (1) 1324 { 1325 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error); 1326 if (length == 0) 1327 break; 1328 out_str.append(buf, length); 1329 // If we got "length - 1" bytes, we didn't get the whole C string, we 1330 // need to read some more characters 1331 if (length == sizeof(buf) - 1) 1332 curr_addr += length; 1333 else 1334 break; 1335 address = Address(curr_addr); 1336 } 1337 return out_str.size(); 1338 } 1339 1340 1341 size_t 1342 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error) 1343 { 1344 size_t total_cstr_len = 0; 1345 if (dst && dst_max_len) 1346 { 1347 result_error.Clear(); 1348 // NULL out everything just to be safe 1349 memset (dst, 0, dst_max_len); 1350 Error error; 1351 addr_t curr_addr = addr.GetLoadAddress(this); 1352 Address address(addr); 1353 const size_t cache_line_size = 512; 1354 size_t bytes_left = dst_max_len - 1; 1355 char *curr_dst = dst; 1356 1357 while (bytes_left > 0) 1358 { 1359 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1360 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1361 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error); 1362 1363 if (bytes_read == 0) 1364 { 1365 result_error = error; 1366 dst[total_cstr_len] = '\0'; 1367 break; 1368 } 1369 const size_t len = strlen(curr_dst); 1370 1371 total_cstr_len += len; 1372 1373 if (len < bytes_to_read) 1374 break; 1375 1376 curr_dst += bytes_read; 1377 curr_addr += bytes_read; 1378 bytes_left -= bytes_read; 1379 address = Address(curr_addr); 1380 } 1381 } 1382 else 1383 { 1384 if (dst == NULL) 1385 result_error.SetErrorString("invalid arguments"); 1386 else 1387 result_error.Clear(); 1388 } 1389 return total_cstr_len; 1390 } 1391 1392 size_t 1393 Target::ReadScalarIntegerFromMemory (const Address& addr, 1394 bool prefer_file_cache, 1395 uint32_t byte_size, 1396 bool is_signed, 1397 Scalar &scalar, 1398 Error &error) 1399 { 1400 uint64_t uval; 1401 1402 if (byte_size <= sizeof(uval)) 1403 { 1404 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error); 1405 if (bytes_read == byte_size) 1406 { 1407 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize()); 1408 lldb::offset_t offset = 0; 1409 if (byte_size <= 4) 1410 scalar = data.GetMaxU32 (&offset, byte_size); 1411 else 1412 scalar = data.GetMaxU64 (&offset, byte_size); 1413 1414 if (is_signed) 1415 scalar.SignExtend(byte_size * 8); 1416 return bytes_read; 1417 } 1418 } 1419 else 1420 { 1421 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 1422 } 1423 return 0; 1424 } 1425 1426 uint64_t 1427 Target::ReadUnsignedIntegerFromMemory (const Address& addr, 1428 bool prefer_file_cache, 1429 size_t integer_byte_size, 1430 uint64_t fail_value, 1431 Error &error) 1432 { 1433 Scalar scalar; 1434 if (ReadScalarIntegerFromMemory (addr, 1435 prefer_file_cache, 1436 integer_byte_size, 1437 false, 1438 scalar, 1439 error)) 1440 return scalar.ULongLong(fail_value); 1441 return fail_value; 1442 } 1443 1444 bool 1445 Target::ReadPointerFromMemory (const Address& addr, 1446 bool prefer_file_cache, 1447 Error &error, 1448 Address &pointer_addr) 1449 { 1450 Scalar scalar; 1451 if (ReadScalarIntegerFromMemory (addr, 1452 prefer_file_cache, 1453 m_arch.GetAddressByteSize(), 1454 false, 1455 scalar, 1456 error)) 1457 { 1458 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1459 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) 1460 { 1461 if (m_section_load_list.IsEmpty()) 1462 { 1463 // No sections are loaded, so we must assume we are not running 1464 // yet and anything we are given is a file address. 1465 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr); 1466 } 1467 else 1468 { 1469 // We have at least one section loaded. This can be becuase 1470 // we have manually loaded some sections with "target modules load ..." 1471 // or because we have have a live process that has sections loaded 1472 // through the dynamic loader 1473 m_section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr); 1474 } 1475 // We weren't able to resolve the pointer value, so just return 1476 // an address with no section 1477 if (!pointer_addr.IsValid()) 1478 pointer_addr.SetOffset (pointer_vm_addr); 1479 return true; 1480 1481 } 1482 } 1483 return false; 1484 } 1485 1486 ModuleSP 1487 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr) 1488 { 1489 ModuleSP module_sp; 1490 1491 Error error; 1492 1493 // First see if we already have this module in our module list. If we do, then we're done, we don't need 1494 // to consult the shared modules list. But only do this if we are passed a UUID. 1495 1496 if (module_spec.GetUUID().IsValid()) 1497 module_sp = m_images.FindFirstModule(module_spec); 1498 1499 if (!module_sp) 1500 { 1501 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library 1502 bool did_create_module = false; 1503 1504 // If there are image search path entries, try to use them first to acquire a suitable image. 1505 if (m_image_search_paths.GetSize()) 1506 { 1507 ModuleSpec transformed_spec (module_spec); 1508 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory())) 1509 { 1510 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename(); 1511 error = ModuleList::GetSharedModule (transformed_spec, 1512 module_sp, 1513 &GetExecutableSearchPaths(), 1514 &old_module_sp, 1515 &did_create_module); 1516 } 1517 } 1518 1519 if (!module_sp) 1520 { 1521 // If we have a UUID, we can check our global shared module list in case 1522 // we already have it. If we don't have a valid UUID, then we can't since 1523 // the path in "module_spec" will be a platform path, and we will need to 1524 // let the platform find that file. For example, we could be asking for 1525 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick 1526 // the local copy of "/usr/lib/dyld" since our platform could be a remote 1527 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file 1528 // cache. 1529 if (module_spec.GetUUID().IsValid()) 1530 { 1531 // We have a UUID, it is OK to check the global module list... 1532 error = ModuleList::GetSharedModule (module_spec, 1533 module_sp, 1534 &GetExecutableSearchPaths(), 1535 &old_module_sp, 1536 &did_create_module); 1537 } 1538 1539 if (!module_sp) 1540 { 1541 // The platform is responsible for finding and caching an appropriate 1542 // module in the shared module cache. 1543 if (m_platform_sp) 1544 { 1545 FileSpec platform_file_spec; 1546 error = m_platform_sp->GetSharedModule (module_spec, 1547 module_sp, 1548 &GetExecutableSearchPaths(), 1549 &old_module_sp, 1550 &did_create_module); 1551 } 1552 else 1553 { 1554 error.SetErrorString("no platform is currently set"); 1555 } 1556 } 1557 } 1558 1559 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent 1560 // module in the list already, and if there was, let's remove it. 1561 if (module_sp) 1562 { 1563 ObjectFile *objfile = module_sp->GetObjectFile(); 1564 if (objfile) 1565 { 1566 switch (objfile->GetType()) 1567 { 1568 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state 1569 case ObjectFile::eTypeExecutable: /// A normal executable 1570 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable 1571 case ObjectFile::eTypeObjectFile: /// An intermediate object file 1572 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution 1573 break; 1574 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information 1575 if (error_ptr) 1576 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable"); 1577 return ModuleSP(); 1578 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution 1579 if (error_ptr) 1580 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable"); 1581 return ModuleSP(); 1582 default: 1583 if (error_ptr) 1584 error_ptr->SetErrorString("unsupported file type, please specify an executable"); 1585 return ModuleSP(); 1586 } 1587 // GetSharedModule is not guaranteed to find the old shared module, for instance 1588 // in the common case where you pass in the UUID, it is only going to find the one 1589 // module matching the UUID. In fact, it has no good way to know what the "old module" 1590 // relevant to this target is, since there might be many copies of a module with this file spec 1591 // in various running debug sessions, but only one of them will belong to this target. 1592 // So let's remove the UUID from the module list, and look in the target's module list. 1593 // Only do this if there is SOMETHING else in the module spec... 1594 if (!old_module_sp) 1595 { 1596 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty()) 1597 { 1598 ModuleSpec module_spec_copy(module_spec.GetFileSpec()); 1599 module_spec_copy.GetUUID().Clear(); 1600 1601 ModuleList found_modules; 1602 size_t num_found = m_images.FindModules (module_spec_copy, found_modules); 1603 if (num_found == 1) 1604 { 1605 old_module_sp = found_modules.GetModuleAtIndex(0); 1606 } 1607 } 1608 } 1609 1610 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32) 1611 { 1612 m_images.ReplaceModule(old_module_sp, module_sp); 1613 Module *old_module_ptr = old_module_sp.get(); 1614 old_module_sp.reset(); 1615 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr); 1616 } 1617 else 1618 m_images.Append(module_sp); 1619 } 1620 } 1621 } 1622 if (error_ptr) 1623 *error_ptr = error; 1624 return module_sp; 1625 } 1626 1627 1628 TargetSP 1629 Target::CalculateTarget () 1630 { 1631 return shared_from_this(); 1632 } 1633 1634 ProcessSP 1635 Target::CalculateProcess () 1636 { 1637 return ProcessSP(); 1638 } 1639 1640 ThreadSP 1641 Target::CalculateThread () 1642 { 1643 return ThreadSP(); 1644 } 1645 1646 StackFrameSP 1647 Target::CalculateStackFrame () 1648 { 1649 return StackFrameSP(); 1650 } 1651 1652 void 1653 Target::CalculateExecutionContext (ExecutionContext &exe_ctx) 1654 { 1655 exe_ctx.Clear(); 1656 exe_ctx.SetTargetPtr(this); 1657 } 1658 1659 PathMappingList & 1660 Target::GetImageSearchPathList () 1661 { 1662 return m_image_search_paths; 1663 } 1664 1665 void 1666 Target::ImageSearchPathsChanged 1667 ( 1668 const PathMappingList &path_list, 1669 void *baton 1670 ) 1671 { 1672 Target *target = (Target *)baton; 1673 ModuleSP exe_module_sp (target->GetExecutableModule()); 1674 if (exe_module_sp) 1675 { 1676 target->m_images.Clear(); 1677 target->SetExecutableModule (exe_module_sp, true); 1678 } 1679 } 1680 1681 ClangASTContext * 1682 Target::GetScratchClangASTContext(bool create_on_demand) 1683 { 1684 // Now see if we know the target triple, and if so, create our scratch AST context: 1685 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand) 1686 { 1687 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str())); 1688 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this())); 1689 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext()); 1690 llvm::OwningPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy()); 1691 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source); 1692 } 1693 return m_scratch_ast_context_ap.get(); 1694 } 1695 1696 ClangASTImporter * 1697 Target::GetClangASTImporter() 1698 { 1699 ClangASTImporter *ast_importer = m_ast_importer_ap.get(); 1700 1701 if (!ast_importer) 1702 { 1703 ast_importer = new ClangASTImporter(); 1704 m_ast_importer_ap.reset(ast_importer); 1705 } 1706 1707 return ast_importer; 1708 } 1709 1710 void 1711 Target::SettingsInitialize () 1712 { 1713 Process::SettingsInitialize (); 1714 } 1715 1716 void 1717 Target::SettingsTerminate () 1718 { 1719 Process::SettingsTerminate (); 1720 } 1721 1722 FileSpecList 1723 Target::GetDefaultExecutableSearchPaths () 1724 { 1725 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1726 if (properties_sp) 1727 return properties_sp->GetExecutableSearchPaths(); 1728 return FileSpecList(); 1729 } 1730 1731 ArchSpec 1732 Target::GetDefaultArchitecture () 1733 { 1734 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1735 if (properties_sp) 1736 return properties_sp->GetDefaultArchitecture(); 1737 return ArchSpec(); 1738 } 1739 1740 void 1741 Target::SetDefaultArchitecture (const ArchSpec &arch) 1742 { 1743 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1744 if (properties_sp) 1745 { 1746 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str()); 1747 return properties_sp->SetDefaultArchitecture(arch); 1748 } 1749 } 1750 1751 Target * 1752 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr) 1753 { 1754 // The target can either exist in the "process" of ExecutionContext, or in 1755 // the "target_sp" member of SymbolContext. This accessor helper function 1756 // will get the target from one of these locations. 1757 1758 Target *target = NULL; 1759 if (sc_ptr != NULL) 1760 target = sc_ptr->target_sp.get(); 1761 if (target == NULL && exe_ctx_ptr) 1762 target = exe_ctx_ptr->GetTargetPtr(); 1763 return target; 1764 } 1765 1766 ExecutionResults 1767 Target::EvaluateExpression 1768 ( 1769 const char *expr_cstr, 1770 StackFrame *frame, 1771 lldb::ValueObjectSP &result_valobj_sp, 1772 const EvaluateExpressionOptions& options 1773 ) 1774 { 1775 result_valobj_sp.reset(); 1776 1777 ExecutionResults execution_results = eExecutionSetupError; 1778 1779 if (expr_cstr == NULL || expr_cstr[0] == '\0') 1780 return execution_results; 1781 1782 // We shouldn't run stop hooks in expressions. 1783 // Be sure to reset this if you return anywhere within this function. 1784 bool old_suppress_value = m_suppress_stop_hooks; 1785 m_suppress_stop_hooks = true; 1786 1787 ExecutionContext exe_ctx; 1788 1789 if (frame) 1790 { 1791 frame->CalculateExecutionContext(exe_ctx); 1792 } 1793 else if (m_process_sp) 1794 { 1795 m_process_sp->CalculateExecutionContext(exe_ctx); 1796 } 1797 else 1798 { 1799 CalculateExecutionContext(exe_ctx); 1800 } 1801 1802 // Make sure we aren't just trying to see the value of a persistent 1803 // variable (something like "$0") 1804 lldb::ClangExpressionVariableSP persistent_var_sp; 1805 // Only check for persistent variables the expression starts with a '$' 1806 if (expr_cstr[0] == '$') 1807 persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr); 1808 1809 if (persistent_var_sp) 1810 { 1811 result_valobj_sp = persistent_var_sp->GetValueObject (); 1812 execution_results = eExecutionCompleted; 1813 } 1814 else 1815 { 1816 const char *prefix = GetExpressionPrefixContentsAsCString(); 1817 1818 execution_results = ClangUserExpression::Evaluate (exe_ctx, 1819 options.GetExecutionPolicy(), 1820 lldb::eLanguageTypeUnknown, 1821 options.DoesCoerceToId() ? ClangUserExpression::eResultTypeId : ClangUserExpression::eResultTypeAny, 1822 options.DoesUnwindOnError(), 1823 options.DoesIgnoreBreakpoints(), 1824 expr_cstr, 1825 prefix, 1826 result_valobj_sp, 1827 options.GetRunOthers(), 1828 options.GetTimeoutUsec()); 1829 } 1830 1831 m_suppress_stop_hooks = old_suppress_value; 1832 1833 return execution_results; 1834 } 1835 1836 lldb::addr_t 1837 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 1838 { 1839 addr_t code_addr = load_addr; 1840 switch (m_arch.GetMachine()) 1841 { 1842 case llvm::Triple::arm: 1843 case llvm::Triple::thumb: 1844 switch (addr_class) 1845 { 1846 case eAddressClassData: 1847 case eAddressClassDebug: 1848 return LLDB_INVALID_ADDRESS; 1849 1850 case eAddressClassUnknown: 1851 case eAddressClassInvalid: 1852 case eAddressClassCode: 1853 case eAddressClassCodeAlternateISA: 1854 case eAddressClassRuntime: 1855 // Check if bit zero it no set? 1856 if ((code_addr & 1ull) == 0) 1857 { 1858 // Bit zero isn't set, check if the address is a multiple of 2? 1859 if (code_addr & 2ull) 1860 { 1861 // The address is a multiple of 2 so it must be thumb, set bit zero 1862 code_addr |= 1ull; 1863 } 1864 else if (addr_class == eAddressClassCodeAlternateISA) 1865 { 1866 // We checked the address and the address claims to be the alternate ISA 1867 // which means thumb, so set bit zero. 1868 code_addr |= 1ull; 1869 } 1870 } 1871 break; 1872 } 1873 break; 1874 1875 default: 1876 break; 1877 } 1878 return code_addr; 1879 } 1880 1881 lldb::addr_t 1882 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 1883 { 1884 addr_t opcode_addr = load_addr; 1885 switch (m_arch.GetMachine()) 1886 { 1887 case llvm::Triple::arm: 1888 case llvm::Triple::thumb: 1889 switch (addr_class) 1890 { 1891 case eAddressClassData: 1892 case eAddressClassDebug: 1893 return LLDB_INVALID_ADDRESS; 1894 1895 case eAddressClassInvalid: 1896 case eAddressClassUnknown: 1897 case eAddressClassCode: 1898 case eAddressClassCodeAlternateISA: 1899 case eAddressClassRuntime: 1900 opcode_addr &= ~(1ull); 1901 break; 1902 } 1903 break; 1904 1905 default: 1906 break; 1907 } 1908 return opcode_addr; 1909 } 1910 1911 lldb::user_id_t 1912 Target::AddStopHook (Target::StopHookSP &new_hook_sp) 1913 { 1914 lldb::user_id_t new_uid = ++m_stop_hook_next_id; 1915 new_hook_sp.reset (new StopHook(shared_from_this(), new_uid)); 1916 m_stop_hooks[new_uid] = new_hook_sp; 1917 return new_uid; 1918 } 1919 1920 bool 1921 Target::RemoveStopHookByID (lldb::user_id_t user_id) 1922 { 1923 size_t num_removed; 1924 num_removed = m_stop_hooks.erase (user_id); 1925 if (num_removed == 0) 1926 return false; 1927 else 1928 return true; 1929 } 1930 1931 void 1932 Target::RemoveAllStopHooks () 1933 { 1934 m_stop_hooks.clear(); 1935 } 1936 1937 Target::StopHookSP 1938 Target::GetStopHookByID (lldb::user_id_t user_id) 1939 { 1940 StopHookSP found_hook; 1941 1942 StopHookCollection::iterator specified_hook_iter; 1943 specified_hook_iter = m_stop_hooks.find (user_id); 1944 if (specified_hook_iter != m_stop_hooks.end()) 1945 found_hook = (*specified_hook_iter).second; 1946 return found_hook; 1947 } 1948 1949 bool 1950 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state) 1951 { 1952 StopHookCollection::iterator specified_hook_iter; 1953 specified_hook_iter = m_stop_hooks.find (user_id); 1954 if (specified_hook_iter == m_stop_hooks.end()) 1955 return false; 1956 1957 (*specified_hook_iter).second->SetIsActive (active_state); 1958 return true; 1959 } 1960 1961 void 1962 Target::SetAllStopHooksActiveState (bool active_state) 1963 { 1964 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 1965 for (pos = m_stop_hooks.begin(); pos != end; pos++) 1966 { 1967 (*pos).second->SetIsActive (active_state); 1968 } 1969 } 1970 1971 void 1972 Target::RunStopHooks () 1973 { 1974 if (m_suppress_stop_hooks) 1975 return; 1976 1977 if (!m_process_sp) 1978 return; 1979 1980 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression 1981 // since in that case we do not want to run the stop-hooks 1982 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression()) 1983 return; 1984 1985 if (m_stop_hooks.empty()) 1986 return; 1987 1988 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 1989 1990 // If there aren't any active stop hooks, don't bother either: 1991 bool any_active_hooks = false; 1992 for (pos = m_stop_hooks.begin(); pos != end; pos++) 1993 { 1994 if ((*pos).second->IsActive()) 1995 { 1996 any_active_hooks = true; 1997 break; 1998 } 1999 } 2000 if (!any_active_hooks) 2001 return; 2002 2003 CommandReturnObject result; 2004 2005 std::vector<ExecutionContext> exc_ctx_with_reasons; 2006 std::vector<SymbolContext> sym_ctx_with_reasons; 2007 2008 ThreadList &cur_threadlist = m_process_sp->GetThreadList(); 2009 size_t num_threads = cur_threadlist.GetSize(); 2010 for (size_t i = 0; i < num_threads; i++) 2011 { 2012 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i); 2013 if (cur_thread_sp->ThreadStoppedForAReason()) 2014 { 2015 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0); 2016 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get())); 2017 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything)); 2018 } 2019 } 2020 2021 // If no threads stopped for a reason, don't run the stop-hooks. 2022 size_t num_exe_ctx = exc_ctx_with_reasons.size(); 2023 if (num_exe_ctx == 0) 2024 return; 2025 2026 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream()); 2027 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream()); 2028 2029 bool keep_going = true; 2030 bool hooks_ran = false; 2031 bool print_hook_header; 2032 bool print_thread_header; 2033 2034 if (num_exe_ctx == 1) 2035 print_thread_header = false; 2036 else 2037 print_thread_header = true; 2038 2039 if (m_stop_hooks.size() == 1) 2040 print_hook_header = false; 2041 else 2042 print_hook_header = true; 2043 2044 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) 2045 { 2046 // result.Clear(); 2047 StopHookSP cur_hook_sp = (*pos).second; 2048 if (!cur_hook_sp->IsActive()) 2049 continue; 2050 2051 bool any_thread_matched = false; 2052 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) 2053 { 2054 if ((cur_hook_sp->GetSpecifier () == NULL 2055 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i])) 2056 && (cur_hook_sp->GetThreadSpecifier() == NULL 2057 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef()))) 2058 { 2059 if (!hooks_ran) 2060 { 2061 hooks_ran = true; 2062 } 2063 if (print_hook_header && !any_thread_matched) 2064 { 2065 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ? 2066 cur_hook_sp->GetCommands().GetStringAtIndex(0) : 2067 NULL); 2068 if (cmd) 2069 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd); 2070 else 2071 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID()); 2072 any_thread_matched = true; 2073 } 2074 2075 if (print_thread_header) 2076 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID()); 2077 2078 bool stop_on_continue = true; 2079 bool stop_on_error = true; 2080 bool echo_commands = false; 2081 bool print_results = true; 2082 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(), 2083 &exc_ctx_with_reasons[i], 2084 stop_on_continue, 2085 stop_on_error, 2086 echo_commands, 2087 print_results, 2088 eLazyBoolNo, 2089 result); 2090 2091 // If the command started the target going again, we should bag out of 2092 // running the stop hooks. 2093 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) || 2094 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) 2095 { 2096 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID()); 2097 keep_going = false; 2098 } 2099 } 2100 } 2101 } 2102 2103 result.GetImmediateOutputStream()->Flush(); 2104 result.GetImmediateErrorStream()->Flush(); 2105 } 2106 2107 2108 //-------------------------------------------------------------- 2109 // class Target::StopHook 2110 //-------------------------------------------------------------- 2111 2112 2113 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) : 2114 UserID (uid), 2115 m_target_sp (target_sp), 2116 m_commands (), 2117 m_specifier_sp (), 2118 m_thread_spec_ap(NULL), 2119 m_active (true) 2120 { 2121 } 2122 2123 Target::StopHook::StopHook (const StopHook &rhs) : 2124 UserID (rhs.GetID()), 2125 m_target_sp (rhs.m_target_sp), 2126 m_commands (rhs.m_commands), 2127 m_specifier_sp (rhs.m_specifier_sp), 2128 m_thread_spec_ap (NULL), 2129 m_active (rhs.m_active) 2130 { 2131 if (rhs.m_thread_spec_ap.get() != NULL) 2132 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get())); 2133 } 2134 2135 2136 Target::StopHook::~StopHook () 2137 { 2138 } 2139 2140 void 2141 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier) 2142 { 2143 m_thread_spec_ap.reset (specifier); 2144 } 2145 2146 2147 void 2148 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const 2149 { 2150 int indent_level = s->GetIndentLevel(); 2151 2152 s->SetIndentLevel(indent_level + 2); 2153 2154 s->Printf ("Hook: %" PRIu64 "\n", GetID()); 2155 if (m_active) 2156 s->Indent ("State: enabled\n"); 2157 else 2158 s->Indent ("State: disabled\n"); 2159 2160 if (m_specifier_sp) 2161 { 2162 s->Indent(); 2163 s->PutCString ("Specifier:\n"); 2164 s->SetIndentLevel (indent_level + 4); 2165 m_specifier_sp->GetDescription (s, level); 2166 s->SetIndentLevel (indent_level + 2); 2167 } 2168 2169 if (m_thread_spec_ap.get() != NULL) 2170 { 2171 StreamString tmp; 2172 s->Indent("Thread:\n"); 2173 m_thread_spec_ap->GetDescription (&tmp, level); 2174 s->SetIndentLevel (indent_level + 4); 2175 s->Indent (tmp.GetData()); 2176 s->PutCString ("\n"); 2177 s->SetIndentLevel (indent_level + 2); 2178 } 2179 2180 s->Indent ("Commands: \n"); 2181 s->SetIndentLevel (indent_level + 4); 2182 uint32_t num_commands = m_commands.GetSize(); 2183 for (uint32_t i = 0; i < num_commands; i++) 2184 { 2185 s->Indent(m_commands.GetStringAtIndex(i)); 2186 s->PutCString ("\n"); 2187 } 2188 s->SetIndentLevel (indent_level); 2189 } 2190 2191 //-------------------------------------------------------------- 2192 // class TargetProperties 2193 //-------------------------------------------------------------- 2194 2195 OptionEnumValueElement 2196 lldb_private::g_dynamic_value_types[] = 2197 { 2198 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"}, 2199 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."}, 2200 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."}, 2201 { 0, NULL, NULL } 2202 }; 2203 2204 static OptionEnumValueElement 2205 g_inline_breakpoint_enums[] = 2206 { 2207 { eInlineBreakpointsNever, "never", "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."}, 2208 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."}, 2209 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."}, 2210 { 0, NULL, NULL } 2211 }; 2212 2213 static PropertyDefinition 2214 g_properties[] = 2215 { 2216 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." }, 2217 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." }, 2218 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eNoDynamicValues , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." }, 2219 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." }, 2220 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." }, 2221 { "source-map" , OptionValue::eTypePathMap , false, 0 , NULL, NULL, "Source path remappings used to track the change of location between a source file when built, and " 2222 "where it exists on the current system. It consists of an array of duples, the first element of each duple is " 2223 "some part (starting at the root) of the path to the file when it was built, " 2224 "and the second is where the remainder of the original build hierarchy is rooted on the local system. " 2225 "Each element of the array is checked in order and the first one that results in a match wins." }, 2226 { "exec-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." }, 2227 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." }, 2228 { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." }, 2229 { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." }, 2230 { "arg0" , OptionValue::eTypeString , false, 0 , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." }, 2231 { "run-args" , OptionValue::eTypeArgs , false, 0 , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." }, 2232 { "env-vars" , OptionValue::eTypeDictionary, false, OptionValue::eTypeString , NULL, NULL, "A list of all the environment variables to be passed to the executable's environment, and their values." }, 2233 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." }, 2234 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." }, 2235 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." }, 2236 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." }, 2237 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" }, 2238 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" }, 2239 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. " 2240 "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. " 2241 "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. " 2242 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. " 2243 "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the " 2244 "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings " 2245 "file and line breakpoints." }, 2246 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL } 2247 }; 2248 enum 2249 { 2250 ePropertyDefaultArch, 2251 ePropertyExprPrefix, 2252 ePropertyPreferDynamic, 2253 ePropertyEnableSynthetic, 2254 ePropertySkipPrologue, 2255 ePropertySourceMap, 2256 ePropertyExecutableSearchPaths, 2257 ePropertyMaxChildrenCount, 2258 ePropertyMaxSummaryLength, 2259 ePropertyBreakpointUseAvoidList, 2260 ePropertyArg0, 2261 ePropertyRunArgs, 2262 ePropertyEnvVars, 2263 ePropertyInheritEnv, 2264 ePropertyInputPath, 2265 ePropertyOutputPath, 2266 ePropertyErrorPath, 2267 ePropertyDisableASLR, 2268 ePropertyDisableSTDIO, 2269 ePropertyInlineStrategy 2270 }; 2271 2272 2273 class TargetOptionValueProperties : public OptionValueProperties 2274 { 2275 public: 2276 TargetOptionValueProperties (const ConstString &name) : 2277 OptionValueProperties (name), 2278 m_target (NULL), 2279 m_got_host_env (false) 2280 { 2281 } 2282 2283 // This constructor is used when creating TargetOptionValueProperties when it 2284 // is part of a new lldb_private::Target instance. It will copy all current 2285 // global property values as needed 2286 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) : 2287 OptionValueProperties(*target_properties_sp->GetValueProperties()), 2288 m_target (target), 2289 m_got_host_env (false) 2290 { 2291 } 2292 2293 virtual const Property * 2294 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const 2295 { 2296 // When gettings the value for a key from the target options, we will always 2297 // try and grab the setting from the current target if there is one. Else we just 2298 // use the one from this instance. 2299 if (idx == ePropertyEnvVars) 2300 GetHostEnvironmentIfNeeded (); 2301 2302 if (exe_ctx) 2303 { 2304 Target *target = exe_ctx->GetTargetPtr(); 2305 if (target) 2306 { 2307 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get()); 2308 if (this != target_properties) 2309 return target_properties->ProtectedGetPropertyAtIndex (idx); 2310 } 2311 } 2312 return ProtectedGetPropertyAtIndex (idx); 2313 } 2314 protected: 2315 2316 void 2317 GetHostEnvironmentIfNeeded () const 2318 { 2319 if (!m_got_host_env) 2320 { 2321 if (m_target) 2322 { 2323 m_got_host_env = true; 2324 const uint32_t idx = ePropertyInheritEnv; 2325 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0)) 2326 { 2327 PlatformSP platform_sp (m_target->GetPlatform()); 2328 if (platform_sp) 2329 { 2330 StringList env; 2331 if (platform_sp->GetEnvironment(env)) 2332 { 2333 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars); 2334 if (env_dict) 2335 { 2336 const bool can_replace = false; 2337 const size_t envc = env.GetSize(); 2338 for (size_t idx=0; idx<envc; idx++) 2339 { 2340 const char *env_entry = env.GetStringAtIndex (idx); 2341 if (env_entry) 2342 { 2343 const char *equal_pos = ::strchr(env_entry, '='); 2344 ConstString key; 2345 // It is ok to have environment variables with no values 2346 const char *value = NULL; 2347 if (equal_pos) 2348 { 2349 key.SetCStringWithLength(env_entry, equal_pos - env_entry); 2350 if (equal_pos[1]) 2351 value = equal_pos + 1; 2352 } 2353 else 2354 { 2355 key.SetCString(env_entry); 2356 } 2357 // Don't allow existing keys to be replaced with ones we get from the platform environment 2358 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace); 2359 } 2360 } 2361 } 2362 } 2363 } 2364 } 2365 } 2366 } 2367 } 2368 Target *m_target; 2369 mutable bool m_got_host_env; 2370 }; 2371 2372 TargetProperties::TargetProperties (Target *target) : 2373 Properties () 2374 { 2375 if (target) 2376 { 2377 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties())); 2378 } 2379 else 2380 { 2381 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target"))); 2382 m_collection_sp->Initialize(g_properties); 2383 m_collection_sp->AppendProperty(ConstString("process"), 2384 ConstString("Settings specify to processes."), 2385 true, 2386 Process::GetGlobalProperties()->GetValueProperties()); 2387 } 2388 } 2389 2390 TargetProperties::~TargetProperties () 2391 { 2392 } 2393 ArchSpec 2394 TargetProperties::GetDefaultArchitecture () const 2395 { 2396 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 2397 if (value) 2398 return value->GetCurrentValue(); 2399 return ArchSpec(); 2400 } 2401 2402 void 2403 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch) 2404 { 2405 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 2406 if (value) 2407 return value->SetCurrentValue(arch, true); 2408 } 2409 2410 lldb::DynamicValueType 2411 TargetProperties::GetPreferDynamicValue() const 2412 { 2413 const uint32_t idx = ePropertyPreferDynamic; 2414 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 2415 } 2416 2417 bool 2418 TargetProperties::GetDisableASLR () const 2419 { 2420 const uint32_t idx = ePropertyDisableASLR; 2421 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2422 } 2423 2424 void 2425 TargetProperties::SetDisableASLR (bool b) 2426 { 2427 const uint32_t idx = ePropertyDisableASLR; 2428 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 2429 } 2430 2431 bool 2432 TargetProperties::GetDisableSTDIO () const 2433 { 2434 const uint32_t idx = ePropertyDisableSTDIO; 2435 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2436 } 2437 2438 void 2439 TargetProperties::SetDisableSTDIO (bool b) 2440 { 2441 const uint32_t idx = ePropertyDisableSTDIO; 2442 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 2443 } 2444 2445 InlineStrategy 2446 TargetProperties::GetInlineStrategy () const 2447 { 2448 const uint32_t idx = ePropertyInlineStrategy; 2449 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 2450 } 2451 2452 const char * 2453 TargetProperties::GetArg0 () const 2454 { 2455 const uint32_t idx = ePropertyArg0; 2456 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL); 2457 } 2458 2459 void 2460 TargetProperties::SetArg0 (const char *arg) 2461 { 2462 const uint32_t idx = ePropertyArg0; 2463 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg); 2464 } 2465 2466 bool 2467 TargetProperties::GetRunArguments (Args &args) const 2468 { 2469 const uint32_t idx = ePropertyRunArgs; 2470 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args); 2471 } 2472 2473 void 2474 TargetProperties::SetRunArguments (const Args &args) 2475 { 2476 const uint32_t idx = ePropertyRunArgs; 2477 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args); 2478 } 2479 2480 size_t 2481 TargetProperties::GetEnvironmentAsArgs (Args &env) const 2482 { 2483 const uint32_t idx = ePropertyEnvVars; 2484 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env); 2485 } 2486 2487 bool 2488 TargetProperties::GetSkipPrologue() const 2489 { 2490 const uint32_t idx = ePropertySkipPrologue; 2491 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2492 } 2493 2494 PathMappingList & 2495 TargetProperties::GetSourcePathMap () const 2496 { 2497 const uint32_t idx = ePropertySourceMap; 2498 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx); 2499 assert(option_value); 2500 return option_value->GetCurrentValue(); 2501 } 2502 2503 FileSpecList & 2504 TargetProperties::GetExecutableSearchPaths () 2505 { 2506 const uint32_t idx = ePropertyExecutableSearchPaths; 2507 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 2508 assert(option_value); 2509 return option_value->GetCurrentValue(); 2510 } 2511 2512 bool 2513 TargetProperties::GetEnableSyntheticValue () const 2514 { 2515 const uint32_t idx = ePropertyEnableSynthetic; 2516 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2517 } 2518 2519 uint32_t 2520 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const 2521 { 2522 const uint32_t idx = ePropertyMaxChildrenCount; 2523 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 2524 } 2525 2526 uint32_t 2527 TargetProperties::GetMaximumSizeOfStringSummary() const 2528 { 2529 const uint32_t idx = ePropertyMaxSummaryLength; 2530 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 2531 } 2532 2533 FileSpec 2534 TargetProperties::GetStandardInputPath () const 2535 { 2536 const uint32_t idx = ePropertyInputPath; 2537 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 2538 } 2539 2540 void 2541 TargetProperties::SetStandardInputPath (const char *p) 2542 { 2543 const uint32_t idx = ePropertyInputPath; 2544 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 2545 } 2546 2547 FileSpec 2548 TargetProperties::GetStandardOutputPath () const 2549 { 2550 const uint32_t idx = ePropertyOutputPath; 2551 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 2552 } 2553 2554 void 2555 TargetProperties::SetStandardOutputPath (const char *p) 2556 { 2557 const uint32_t idx = ePropertyOutputPath; 2558 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 2559 } 2560 2561 FileSpec 2562 TargetProperties::GetStandardErrorPath () const 2563 { 2564 const uint32_t idx = ePropertyErrorPath; 2565 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx); 2566 } 2567 2568 const char * 2569 TargetProperties::GetExpressionPrefixContentsAsCString () 2570 { 2571 const uint32_t idx = ePropertyExprPrefix; 2572 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx); 2573 if (file) 2574 { 2575 const bool null_terminate = true; 2576 DataBufferSP data_sp(file->GetFileContents(null_terminate)); 2577 if (data_sp) 2578 return (const char *) data_sp->GetBytes(); 2579 } 2580 return NULL; 2581 } 2582 2583 void 2584 TargetProperties::SetStandardErrorPath (const char *p) 2585 { 2586 const uint32_t idx = ePropertyErrorPath; 2587 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 2588 } 2589 2590 bool 2591 TargetProperties::GetBreakpointsConsultPlatformAvoidList () 2592 { 2593 const uint32_t idx = ePropertyBreakpointUseAvoidList; 2594 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2595 } 2596 2597 const TargetPropertiesSP & 2598 Target::GetGlobalProperties() 2599 { 2600 static TargetPropertiesSP g_settings_sp; 2601 if (!g_settings_sp) 2602 { 2603 g_settings_sp.reset (new TargetProperties (NULL)); 2604 } 2605 return g_settings_sp; 2606 } 2607 2608 const ConstString & 2609 Target::TargetEventData::GetFlavorString () 2610 { 2611 static ConstString g_flavor ("Target::TargetEventData"); 2612 return g_flavor; 2613 } 2614 2615 const ConstString & 2616 Target::TargetEventData::GetFlavor () const 2617 { 2618 return TargetEventData::GetFlavorString (); 2619 } 2620 2621 Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) : 2622 EventData(), 2623 m_target_sp (new_target_sp) 2624 { 2625 } 2626 2627 Target::TargetEventData::~TargetEventData() 2628 { 2629 2630 } 2631 2632 void 2633 Target::TargetEventData::Dump (Stream *s) const 2634 { 2635 2636 } 2637 2638 const TargetSP 2639 Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp) 2640 { 2641 TargetSP target_sp; 2642 2643 const TargetEventData *data = GetEventDataFromEvent (event_sp.get()); 2644 if (data) 2645 target_sp = data->m_target_sp; 2646 2647 return target_sp; 2648 } 2649 2650 const Target::TargetEventData * 2651 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr) 2652 { 2653 if (event_ptr) 2654 { 2655 const EventData *event_data = event_ptr->GetData(); 2656 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString()) 2657 return static_cast <const TargetEventData *> (event_ptr->GetData()); 2658 } 2659 return NULL; 2660 } 2661 2662