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