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/Target/Target.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Breakpoint/BreakpointResolver.h" 17 #include "lldb/Breakpoint/BreakpointResolverAddress.h" 18 #include "lldb/Breakpoint/BreakpointResolverFileLine.h" 19 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h" 20 #include "lldb/Breakpoint/BreakpointResolverName.h" 21 #include "lldb/Breakpoint/Watchpoint.h" 22 #include "lldb/Core/Debugger.h" 23 #include "lldb/Core/Event.h" 24 #include "lldb/Core/Log.h" 25 #include "lldb/Core/Module.h" 26 #include "lldb/Core/ModuleSpec.h" 27 #include "lldb/Core/Section.h" 28 #include "lldb/Core/SourceManager.h" 29 #include "lldb/Core/State.h" 30 #include "lldb/Core/StreamFile.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/ClangPersistentVariables.h" 36 #include "lldb/Expression/ClangUserExpression.h" 37 #include "lldb/Expression/ClangModulesDeclVendor.h" 38 #include "lldb/Host/FileSpec.h" 39 #include "lldb/Host/Host.h" 40 #include "lldb/Interpreter/CommandInterpreter.h" 41 #include "lldb/Interpreter/CommandReturnObject.h" 42 #include "lldb/Interpreter/OptionGroupWatchpoint.h" 43 #include "lldb/Interpreter/OptionValues.h" 44 #include "lldb/Interpreter/Property.h" 45 #include "lldb/Symbol/ClangASTContext.h" 46 #include "lldb/Symbol/ObjectFile.h" 47 #include "lldb/Symbol/Function.h" 48 #include "lldb/Symbol/Symbol.h" 49 #include "lldb/Target/LanguageRuntime.h" 50 #include "lldb/Target/ObjCLanguageRuntime.h" 51 #include "lldb/Target/Process.h" 52 #include "lldb/Target/SectionLoadList.h" 53 #include "lldb/Target/StackFrame.h" 54 #include "lldb/Target/SystemRuntime.h" 55 #include "lldb/Target/Thread.h" 56 #include "lldb/Target/ThreadSpec.h" 57 58 using namespace lldb; 59 using namespace lldb_private; 60 61 ConstString & 62 Target::GetStaticBroadcasterClass () 63 { 64 static ConstString class_name ("lldb.target"); 65 return class_name; 66 } 67 68 //---------------------------------------------------------------------- 69 // Target constructor 70 //---------------------------------------------------------------------- 71 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp, bool is_dummy_target) : 72 TargetProperties (this), 73 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()), 74 ExecutionContextScope (), 75 m_debugger (debugger), 76 m_platform_sp (platform_sp), 77 m_mutex (Mutex::eMutexTypeRecursive), 78 m_arch (target_arch), 79 m_images (this), 80 m_section_load_history (), 81 m_breakpoint_list (false), 82 m_internal_breakpoint_list (true), 83 m_watchpoint_list (), 84 m_process_sp (), 85 m_search_filter_sp (), 86 m_image_search_paths (ImageSearchPathsChanged, this), 87 m_scratch_ast_context_ap (), 88 m_scratch_ast_source_ap (), 89 m_ast_importer_ap (), 90 m_persistent_variables (new ClangPersistentVariables), 91 m_source_manager_ap(), 92 m_stop_hooks (), 93 m_stop_hook_next_id (0), 94 m_valid (true), 95 m_suppress_stop_hooks (false), 96 m_is_dummy_target(is_dummy_target) 97 98 { 99 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed"); 100 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded"); 101 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded"); 102 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed"); 103 SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded"); 104 105 CheckInWithManager(); 106 107 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 108 if (log) 109 log->Printf ("%p Target::Target()", static_cast<void*>(this)); 110 if (m_arch.IsValid()) 111 { 112 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 113 } 114 } 115 116 void 117 Target::PrimeFromDummyTarget(Target *target) 118 { 119 if (!target) 120 return; 121 122 m_stop_hooks = target->m_stop_hooks; 123 124 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints()) 125 { 126 if (breakpoint_sp->IsInternal()) 127 continue; 128 129 BreakpointSP new_bp (new Breakpoint (*this, *breakpoint_sp.get())); 130 AddBreakpoint (new_bp, false); 131 } 132 } 133 134 //---------------------------------------------------------------------- 135 // Destructor 136 //---------------------------------------------------------------------- 137 Target::~Target() 138 { 139 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 140 if (log) 141 log->Printf ("%p Target::~Target()", static_cast<void*>(this)); 142 DeleteCurrentProcess (); 143 } 144 145 void 146 Target::Dump (Stream *s, lldb::DescriptionLevel description_level) 147 { 148 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 149 if (description_level != lldb::eDescriptionLevelBrief) 150 { 151 s->Indent(); 152 s->PutCString("Target\n"); 153 s->IndentMore(); 154 m_images.Dump(s); 155 m_breakpoint_list.Dump(s); 156 m_internal_breakpoint_list.Dump(s); 157 s->IndentLess(); 158 } 159 else 160 { 161 Module *exe_module = GetExecutableModulePointer(); 162 if (exe_module) 163 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString()); 164 else 165 s->PutCString ("No executable module."); 166 } 167 } 168 169 void 170 Target::CleanupProcess () 171 { 172 // Do any cleanup of the target we need to do between process instances. 173 // NB It is better to do this before destroying the process in case the 174 // clean up needs some help from the process. 175 m_breakpoint_list.ClearAllBreakpointSites(); 176 m_internal_breakpoint_list.ClearAllBreakpointSites(); 177 // Disable watchpoints just on the debugger side. 178 Mutex::Locker locker; 179 this->GetWatchpointList().GetListMutex(locker); 180 DisableAllWatchpoints(false); 181 ClearAllWatchpointHitCounts(); 182 ClearAllWatchpointHistoricValues(); 183 } 184 185 void 186 Target::DeleteCurrentProcess () 187 { 188 if (m_process_sp.get()) 189 { 190 m_section_load_history.Clear(); 191 if (m_process_sp->IsAlive()) 192 m_process_sp->Destroy(false); 193 194 m_process_sp->Finalize(); 195 196 CleanupProcess (); 197 198 m_process_sp.reset(); 199 } 200 } 201 202 const lldb::ProcessSP & 203 Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file) 204 { 205 DeleteCurrentProcess (); 206 m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name, listener, crash_file); 207 return m_process_sp; 208 } 209 210 const lldb::ProcessSP & 211 Target::GetProcessSP () const 212 { 213 return m_process_sp; 214 } 215 216 void 217 Target::Destroy() 218 { 219 Mutex::Locker locker (m_mutex); 220 m_valid = false; 221 DeleteCurrentProcess (); 222 m_platform_sp.reset(); 223 m_arch.Clear(); 224 ClearModules(true); 225 m_section_load_history.Clear(); 226 const bool notify = false; 227 m_breakpoint_list.RemoveAll(notify); 228 m_internal_breakpoint_list.RemoveAll(notify); 229 m_last_created_breakpoint.reset(); 230 m_last_created_watchpoint.reset(); 231 m_search_filter_sp.reset(); 232 m_image_search_paths.Clear(notify); 233 m_persistent_variables->Clear(); 234 m_stop_hooks.clear(); 235 m_stop_hook_next_id = 0; 236 m_suppress_stop_hooks = false; 237 } 238 239 240 BreakpointList & 241 Target::GetBreakpointList(bool internal) 242 { 243 if (internal) 244 return m_internal_breakpoint_list; 245 else 246 return m_breakpoint_list; 247 } 248 249 const BreakpointList & 250 Target::GetBreakpointList(bool internal) const 251 { 252 if (internal) 253 return m_internal_breakpoint_list; 254 else 255 return m_breakpoint_list; 256 } 257 258 BreakpointSP 259 Target::GetBreakpointByID (break_id_t break_id) 260 { 261 BreakpointSP bp_sp; 262 263 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 264 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 265 else 266 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 267 268 return bp_sp; 269 } 270 271 BreakpointSP 272 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules, 273 const FileSpecList *source_file_spec_list, 274 RegularExpression &source_regex, 275 bool internal, 276 bool hardware, 277 LazyBool move_to_nearest_code) 278 { 279 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list)); 280 if (move_to_nearest_code == eLazyBoolCalculate) 281 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo; 282 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex, !static_cast<bool>(move_to_nearest_code))); 283 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 284 } 285 286 287 BreakpointSP 288 Target::CreateBreakpoint (const FileSpecList *containingModules, 289 const FileSpec &file, 290 uint32_t line_no, 291 LazyBool check_inlines, 292 LazyBool skip_prologue, 293 bool internal, 294 bool hardware, 295 LazyBool move_to_nearest_code) 296 { 297 if (check_inlines == eLazyBoolCalculate) 298 { 299 const InlineStrategy inline_strategy = GetInlineStrategy(); 300 switch (inline_strategy) 301 { 302 case eInlineBreakpointsNever: 303 check_inlines = eLazyBoolNo; 304 break; 305 306 case eInlineBreakpointsHeaders: 307 if (file.IsSourceImplementationFile()) 308 check_inlines = eLazyBoolNo; 309 else 310 check_inlines = eLazyBoolYes; 311 break; 312 313 case eInlineBreakpointsAlways: 314 check_inlines = eLazyBoolYes; 315 break; 316 } 317 } 318 SearchFilterSP filter_sp; 319 if (check_inlines == eLazyBoolNo) 320 { 321 // Not checking for inlines, we are looking only for matching compile units 322 FileSpecList compile_unit_list; 323 compile_unit_list.Append (file); 324 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list); 325 } 326 else 327 { 328 filter_sp = GetSearchFilterForModuleList (containingModules); 329 } 330 if (skip_prologue == eLazyBoolCalculate) 331 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 332 if (move_to_nearest_code == eLazyBoolCalculate) 333 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo; 334 335 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, 336 file, 337 line_no, 338 check_inlines, 339 skip_prologue, 340 !static_cast<bool>(move_to_nearest_code))); 341 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 342 } 343 344 345 BreakpointSP 346 Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware) 347 { 348 Address so_addr; 349 350 // Check for any reason we want to move this breakpoint to other address. 351 addr = GetBreakableLoadAddress(addr); 352 353 // Attempt to resolve our load address if possible, though it is ok if 354 // it doesn't resolve to section/offset. 355 356 // Try and resolve as a load address if possible 357 GetSectionLoadList().ResolveLoadAddress(addr, so_addr); 358 if (!so_addr.IsValid()) 359 { 360 // The address didn't resolve, so just set this as an absolute address 361 so_addr.SetOffset (addr); 362 } 363 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware)); 364 return bp_sp; 365 } 366 367 BreakpointSP 368 Target::CreateBreakpoint (Address &addr, bool internal, bool hardware) 369 { 370 SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this())); 371 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr)); 372 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false); 373 } 374 375 BreakpointSP 376 Target::CreateBreakpoint (const FileSpecList *containingModules, 377 const FileSpecList *containingSourceFiles, 378 const char *func_name, 379 uint32_t func_name_type_mask, 380 LanguageType language, 381 LazyBool skip_prologue, 382 bool internal, 383 bool hardware) 384 { 385 BreakpointSP bp_sp; 386 if (func_name) 387 { 388 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 389 390 if (skip_prologue == eLazyBoolCalculate) 391 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 392 if (language == lldb::eLanguageTypeUnknown) 393 language = GetLanguage(); 394 395 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 396 func_name, 397 func_name_type_mask, 398 language, 399 Breakpoint::Exact, 400 skip_prologue)); 401 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 402 } 403 return bp_sp; 404 } 405 406 lldb::BreakpointSP 407 Target::CreateBreakpoint (const FileSpecList *containingModules, 408 const FileSpecList *containingSourceFiles, 409 const std::vector<std::string> &func_names, 410 uint32_t func_name_type_mask, 411 LanguageType language, 412 LazyBool skip_prologue, 413 bool internal, 414 bool hardware) 415 { 416 BreakpointSP bp_sp; 417 size_t num_names = func_names.size(); 418 if (num_names > 0) 419 { 420 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 421 422 if (skip_prologue == eLazyBoolCalculate) 423 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 424 if (language == lldb::eLanguageTypeUnknown) 425 language = GetLanguage(); 426 427 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 428 func_names, 429 func_name_type_mask, 430 language, 431 skip_prologue)); 432 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 433 } 434 return bp_sp; 435 } 436 437 BreakpointSP 438 Target::CreateBreakpoint (const FileSpecList *containingModules, 439 const FileSpecList *containingSourceFiles, 440 const char *func_names[], 441 size_t num_names, 442 uint32_t func_name_type_mask, 443 LanguageType language, 444 LazyBool skip_prologue, 445 bool internal, 446 bool hardware) 447 { 448 BreakpointSP bp_sp; 449 if (num_names > 0) 450 { 451 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 452 453 if (skip_prologue == eLazyBoolCalculate) 454 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 455 if (language == lldb::eLanguageTypeUnknown) 456 language = GetLanguage(); 457 458 459 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 460 func_names, 461 num_names, 462 func_name_type_mask, 463 language, 464 skip_prologue)); 465 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 466 } 467 return bp_sp; 468 } 469 470 SearchFilterSP 471 Target::GetSearchFilterForModule (const FileSpec *containingModule) 472 { 473 SearchFilterSP filter_sp; 474 if (containingModule != NULL) 475 { 476 // TODO: We should look into sharing module based search filters 477 // across many breakpoints like we do for the simple target based one 478 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule)); 479 } 480 else 481 { 482 if (m_search_filter_sp.get() == NULL) 483 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this())); 484 filter_sp = m_search_filter_sp; 485 } 486 return filter_sp; 487 } 488 489 SearchFilterSP 490 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules) 491 { 492 SearchFilterSP filter_sp; 493 if (containingModules && containingModules->GetSize() != 0) 494 { 495 // TODO: We should look into sharing module based search filters 496 // across many breakpoints like we do for the simple target based one 497 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules)); 498 } 499 else 500 { 501 if (m_search_filter_sp.get() == NULL) 502 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this())); 503 filter_sp = m_search_filter_sp; 504 } 505 return filter_sp; 506 } 507 508 SearchFilterSP 509 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, 510 const FileSpecList *containingSourceFiles) 511 { 512 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0) 513 return GetSearchFilterForModuleList(containingModules); 514 515 SearchFilterSP filter_sp; 516 if (containingModules == NULL) 517 { 518 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable, 519 // but that will take a little reworking. 520 521 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles)); 522 } 523 else 524 { 525 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles)); 526 } 527 return filter_sp; 528 } 529 530 BreakpointSP 531 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules, 532 const FileSpecList *containingSourceFiles, 533 RegularExpression &func_regex, 534 LazyBool skip_prologue, 535 bool internal, 536 bool hardware) 537 { 538 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 539 bool skip = 540 (skip_prologue == eLazyBoolCalculate) ? GetSkipPrologue() 541 : static_cast<bool>(skip_prologue); 542 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, 543 func_regex, 544 skip)); 545 546 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 547 } 548 549 lldb::BreakpointSP 550 Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal, Args *additional_args, Error *error) 551 { 552 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal); 553 if (exc_bkpt_sp && additional_args) 554 { 555 Breakpoint::BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition(); 556 if (precondition_sp && additional_args) 557 { 558 if (error) 559 *error = precondition_sp->ConfigurePrecondition(*additional_args); 560 else 561 precondition_sp->ConfigurePrecondition(*additional_args); 562 } 563 } 564 return exc_bkpt_sp; 565 } 566 567 BreakpointSP 568 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols) 569 { 570 BreakpointSP bp_sp; 571 if (filter_sp && resolver_sp) 572 { 573 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols)); 574 resolver_sp->SetBreakpoint (bp_sp.get()); 575 AddBreakpoint (bp_sp, internal); 576 } 577 return bp_sp; 578 } 579 580 void 581 Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal) 582 { 583 if (!bp_sp) 584 return; 585 if (internal) 586 m_internal_breakpoint_list.Add (bp_sp, false); 587 else 588 m_breakpoint_list.Add (bp_sp, true); 589 590 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 591 if (log) 592 { 593 StreamString s; 594 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 595 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData()); 596 } 597 598 bp_sp->ResolveBreakpoint(); 599 600 if (!internal) 601 { 602 m_last_created_breakpoint = bp_sp; 603 } 604 } 605 606 bool 607 Target::ProcessIsValid() 608 { 609 return (m_process_sp && m_process_sp->IsAlive()); 610 } 611 612 static bool 613 CheckIfWatchpointsExhausted(Target *target, Error &error) 614 { 615 uint32_t num_supported_hardware_watchpoints; 616 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints); 617 if (rc.Success()) 618 { 619 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize(); 620 if (num_current_watchpoints >= num_supported_hardware_watchpoints) 621 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached", 622 num_supported_hardware_watchpoints); 623 } 624 return false; 625 } 626 627 // See also Watchpoint::SetWatchpointType(uint32_t type) and 628 // the OptionGroupWatchpoint::WatchType enum type. 629 WatchpointSP 630 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const CompilerType *type, uint32_t kind, Error &error) 631 { 632 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 633 if (log) 634 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n", 635 __FUNCTION__, addr, (uint64_t)size, kind); 636 637 WatchpointSP wp_sp; 638 if (!ProcessIsValid()) 639 { 640 error.SetErrorString("process is not alive"); 641 return wp_sp; 642 } 643 644 if (addr == LLDB_INVALID_ADDRESS || size == 0) 645 { 646 if (size == 0) 647 error.SetErrorString("cannot set a watchpoint with watch_size of 0"); 648 else 649 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr); 650 return wp_sp; 651 } 652 653 if (!LLDB_WATCH_TYPE_IS_VALID(kind)) 654 { 655 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind); 656 } 657 658 // Currently we only support one watchpoint per address, with total number 659 // of watchpoints limited by the hardware which the inferior is running on. 660 661 // Grab the list mutex while doing operations. 662 const bool notify = false; // Don't notify about all the state changes we do on creating the watchpoint. 663 Mutex::Locker locker; 664 this->GetWatchpointList().GetListMutex(locker); 665 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr); 666 if (matched_sp) 667 { 668 size_t old_size = matched_sp->GetByteSize(); 669 uint32_t old_type = 670 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) | 671 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0); 672 // Return the existing watchpoint if both size and type match. 673 if (size == old_size && kind == old_type) 674 { 675 wp_sp = matched_sp; 676 wp_sp->SetEnabled(false, notify); 677 } 678 else 679 { 680 // Nil the matched watchpoint; we will be creating a new one. 681 m_process_sp->DisableWatchpoint(matched_sp.get(), notify); 682 m_watchpoint_list.Remove(matched_sp->GetID(), true); 683 } 684 } 685 686 if (!wp_sp) 687 { 688 wp_sp.reset(new Watchpoint(*this, addr, size, type)); 689 wp_sp->SetWatchpointType(kind, notify); 690 m_watchpoint_list.Add (wp_sp, true); 691 } 692 693 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify); 694 if (log) 695 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n", 696 __FUNCTION__, 697 error.Success() ? "succeeded" : "failed", 698 wp_sp->GetID()); 699 700 if (error.Fail()) 701 { 702 // Enabling the watchpoint on the device side failed. 703 // Remove the said watchpoint from the list maintained by the target instance. 704 m_watchpoint_list.Remove (wp_sp->GetID(), true); 705 // See if we could provide more helpful error message. 706 if (!CheckIfWatchpointsExhausted(this, error)) 707 { 708 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size)) 709 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size); 710 } 711 wp_sp.reset(); 712 } 713 else 714 m_last_created_watchpoint = wp_sp; 715 return wp_sp; 716 } 717 718 void 719 Target::RemoveAllBreakpoints (bool internal_also) 720 { 721 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 722 if (log) 723 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 724 725 m_breakpoint_list.RemoveAll (true); 726 if (internal_also) 727 m_internal_breakpoint_list.RemoveAll (false); 728 729 m_last_created_breakpoint.reset(); 730 } 731 732 void 733 Target::DisableAllBreakpoints (bool internal_also) 734 { 735 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 736 if (log) 737 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 738 739 m_breakpoint_list.SetEnabledAll (false); 740 if (internal_also) 741 m_internal_breakpoint_list.SetEnabledAll (false); 742 } 743 744 void 745 Target::EnableAllBreakpoints (bool internal_also) 746 { 747 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 748 if (log) 749 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 750 751 m_breakpoint_list.SetEnabledAll (true); 752 if (internal_also) 753 m_internal_breakpoint_list.SetEnabledAll (true); 754 } 755 756 bool 757 Target::RemoveBreakpointByID (break_id_t break_id) 758 { 759 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 760 if (log) 761 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 762 763 if (DisableBreakpointByID (break_id)) 764 { 765 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 766 m_internal_breakpoint_list.Remove(break_id, false); 767 else 768 { 769 if (m_last_created_breakpoint) 770 { 771 if (m_last_created_breakpoint->GetID() == break_id) 772 m_last_created_breakpoint.reset(); 773 } 774 m_breakpoint_list.Remove(break_id, true); 775 } 776 return true; 777 } 778 return false; 779 } 780 781 bool 782 Target::DisableBreakpointByID (break_id_t break_id) 783 { 784 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 785 if (log) 786 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 787 788 BreakpointSP bp_sp; 789 790 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 791 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 792 else 793 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 794 if (bp_sp) 795 { 796 bp_sp->SetEnabled (false); 797 return true; 798 } 799 return false; 800 } 801 802 bool 803 Target::EnableBreakpointByID (break_id_t break_id) 804 { 805 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 806 if (log) 807 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", 808 __FUNCTION__, 809 break_id, 810 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 811 812 BreakpointSP bp_sp; 813 814 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 815 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 816 else 817 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 818 819 if (bp_sp) 820 { 821 bp_sp->SetEnabled (true); 822 return true; 823 } 824 return false; 825 } 826 827 // The flag 'end_to_end', default to true, signifies that the operation is 828 // performed end to end, for both the debugger and the debuggee. 829 830 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 831 // to end operations. 832 bool 833 Target::RemoveAllWatchpoints (bool end_to_end) 834 { 835 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 836 if (log) 837 log->Printf ("Target::%s\n", __FUNCTION__); 838 839 if (!end_to_end) { 840 m_watchpoint_list.RemoveAll(true); 841 return true; 842 } 843 844 // Otherwise, it's an end to end operation. 845 846 if (!ProcessIsValid()) 847 return false; 848 849 size_t num_watchpoints = m_watchpoint_list.GetSize(); 850 for (size_t i = 0; i < num_watchpoints; ++i) 851 { 852 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 853 if (!wp_sp) 854 return false; 855 856 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 857 if (rc.Fail()) 858 return false; 859 } 860 m_watchpoint_list.RemoveAll (true); 861 m_last_created_watchpoint.reset(); 862 return true; // Success! 863 } 864 865 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 866 // end operations. 867 bool 868 Target::DisableAllWatchpoints (bool end_to_end) 869 { 870 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 871 if (log) 872 log->Printf ("Target::%s\n", __FUNCTION__); 873 874 if (!end_to_end) { 875 m_watchpoint_list.SetEnabledAll(false); 876 return true; 877 } 878 879 // Otherwise, it's an end to end operation. 880 881 if (!ProcessIsValid()) 882 return false; 883 884 size_t num_watchpoints = m_watchpoint_list.GetSize(); 885 for (size_t i = 0; i < num_watchpoints; ++i) 886 { 887 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 888 if (!wp_sp) 889 return false; 890 891 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 892 if (rc.Fail()) 893 return false; 894 } 895 return true; // Success! 896 } 897 898 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 899 // end operations. 900 bool 901 Target::EnableAllWatchpoints (bool end_to_end) 902 { 903 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 904 if (log) 905 log->Printf ("Target::%s\n", __FUNCTION__); 906 907 if (!end_to_end) { 908 m_watchpoint_list.SetEnabledAll(true); 909 return true; 910 } 911 912 // Otherwise, it's an end to end operation. 913 914 if (!ProcessIsValid()) 915 return false; 916 917 size_t num_watchpoints = m_watchpoint_list.GetSize(); 918 for (size_t i = 0; i < num_watchpoints; ++i) 919 { 920 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 921 if (!wp_sp) 922 return false; 923 924 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 925 if (rc.Fail()) 926 return false; 927 } 928 return true; // Success! 929 } 930 931 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 932 bool 933 Target::ClearAllWatchpointHitCounts () 934 { 935 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 936 if (log) 937 log->Printf ("Target::%s\n", __FUNCTION__); 938 939 size_t num_watchpoints = m_watchpoint_list.GetSize(); 940 for (size_t i = 0; i < num_watchpoints; ++i) 941 { 942 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 943 if (!wp_sp) 944 return false; 945 946 wp_sp->ResetHitCount(); 947 } 948 return true; // Success! 949 } 950 951 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 952 bool 953 Target::ClearAllWatchpointHistoricValues () 954 { 955 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 956 if (log) 957 log->Printf ("Target::%s\n", __FUNCTION__); 958 959 size_t num_watchpoints = m_watchpoint_list.GetSize(); 960 for (size_t i = 0; i < num_watchpoints; ++i) 961 { 962 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 963 if (!wp_sp) 964 return false; 965 966 wp_sp->ResetHistoricValues(); 967 } 968 return true; // Success! 969 } 970 971 // Assumption: Caller holds the list mutex lock for m_watchpoint_list 972 // during these operations. 973 bool 974 Target::IgnoreAllWatchpoints (uint32_t ignore_count) 975 { 976 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 977 if (log) 978 log->Printf ("Target::%s\n", __FUNCTION__); 979 980 if (!ProcessIsValid()) 981 return false; 982 983 size_t num_watchpoints = m_watchpoint_list.GetSize(); 984 for (size_t i = 0; i < num_watchpoints; ++i) 985 { 986 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 987 if (!wp_sp) 988 return false; 989 990 wp_sp->SetIgnoreCount(ignore_count); 991 } 992 return true; // Success! 993 } 994 995 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 996 bool 997 Target::DisableWatchpointByID (lldb::watch_id_t watch_id) 998 { 999 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 1000 if (log) 1001 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1002 1003 if (!ProcessIsValid()) 1004 return false; 1005 1006 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 1007 if (wp_sp) 1008 { 1009 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 1010 if (rc.Success()) 1011 return true; 1012 1013 // Else, fallthrough. 1014 } 1015 return false; 1016 } 1017 1018 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1019 bool 1020 Target::EnableWatchpointByID (lldb::watch_id_t watch_id) 1021 { 1022 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 1023 if (log) 1024 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1025 1026 if (!ProcessIsValid()) 1027 return false; 1028 1029 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 1030 if (wp_sp) 1031 { 1032 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 1033 if (rc.Success()) 1034 return true; 1035 1036 // Else, fallthrough. 1037 } 1038 return false; 1039 } 1040 1041 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1042 bool 1043 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id) 1044 { 1045 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 1046 if (log) 1047 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1048 1049 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id); 1050 if (watch_to_remove_sp == m_last_created_watchpoint) 1051 m_last_created_watchpoint.reset(); 1052 1053 if (DisableWatchpointByID (watch_id)) 1054 { 1055 m_watchpoint_list.Remove(watch_id, true); 1056 return true; 1057 } 1058 return false; 1059 } 1060 1061 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1062 bool 1063 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count) 1064 { 1065 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 1066 if (log) 1067 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1068 1069 if (!ProcessIsValid()) 1070 return false; 1071 1072 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 1073 if (wp_sp) 1074 { 1075 wp_sp->SetIgnoreCount(ignore_count); 1076 return true; 1077 } 1078 return false; 1079 } 1080 1081 ModuleSP 1082 Target::GetExecutableModule () 1083 { 1084 // search for the first executable in the module list 1085 for (size_t i = 0; i < m_images.GetSize(); ++i) 1086 { 1087 ModuleSP module_sp = m_images.GetModuleAtIndex (i); 1088 lldb_private::ObjectFile * obj = module_sp->GetObjectFile(); 1089 if (obj == nullptr) 1090 continue; 1091 if (obj->GetType() == ObjectFile::Type::eTypeExecutable) 1092 return module_sp; 1093 } 1094 // as fall back return the first module loaded 1095 return m_images.GetModuleAtIndex (0); 1096 } 1097 1098 Module* 1099 Target::GetExecutableModulePointer () 1100 { 1101 return GetExecutableModule().get(); 1102 } 1103 1104 static void 1105 LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target) 1106 { 1107 Error error; 1108 StreamString feedback_stream; 1109 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream)) 1110 { 1111 if (error.AsCString()) 1112 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n", 1113 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(), 1114 error.AsCString()); 1115 } 1116 if (feedback_stream.GetSize()) 1117 target->GetDebugger().GetErrorFile()->Printf("%s\n", 1118 feedback_stream.GetData()); 1119 } 1120 1121 void 1122 Target::ClearModules(bool delete_locations) 1123 { 1124 ModulesDidUnload (m_images, delete_locations); 1125 m_section_load_history.Clear(); 1126 m_images.Clear(); 1127 m_scratch_ast_context_ap.reset(); 1128 m_scratch_ast_source_ap.reset(); 1129 m_ast_importer_ap.reset(); 1130 } 1131 1132 void 1133 Target::DidExec () 1134 { 1135 // When a process exec's we need to know about it so we can do some cleanup. 1136 m_breakpoint_list.RemoveInvalidLocations(m_arch); 1137 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch); 1138 } 1139 1140 void 1141 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files) 1142 { 1143 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 1144 ClearModules(false); 1145 1146 if (executable_sp.get()) 1147 { 1148 Timer scoped_timer (__PRETTY_FUNCTION__, 1149 "Target::SetExecutableModule (executable = '%s')", 1150 executable_sp->GetFileSpec().GetPath().c_str()); 1151 1152 m_images.Append(executable_sp); // The first image is our executable file 1153 1154 // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module. 1155 if (!m_arch.IsValid()) 1156 { 1157 m_arch = executable_sp->GetArchitecture(); 1158 if (log) 1159 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 1160 } 1161 1162 FileSpecList dependent_files; 1163 ObjectFile *executable_objfile = executable_sp->GetObjectFile(); 1164 1165 if (executable_objfile && get_dependent_files) 1166 { 1167 executable_objfile->GetDependentModules(dependent_files); 1168 for (uint32_t i=0; i<dependent_files.GetSize(); i++) 1169 { 1170 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i)); 1171 FileSpec platform_dependent_file_spec; 1172 if (m_platform_sp) 1173 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec); 1174 else 1175 platform_dependent_file_spec = dependent_file_spec; 1176 1177 ModuleSpec module_spec (platform_dependent_file_spec, m_arch); 1178 ModuleSP image_module_sp(GetSharedModule (module_spec)); 1179 if (image_module_sp.get()) 1180 { 1181 ObjectFile *objfile = image_module_sp->GetObjectFile(); 1182 if (objfile) 1183 objfile->GetDependentModules(dependent_files); 1184 } 1185 } 1186 } 1187 } 1188 } 1189 1190 1191 bool 1192 Target::SetArchitecture (const ArchSpec &arch_spec) 1193 { 1194 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 1195 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid()) 1196 { 1197 // If we haven't got a valid arch spec, or the architectures are 1198 // compatible, so just update the architecture. Architectures can be 1199 // equal, yet the triple OS and vendor might change, so we need to do 1200 // the assignment here just in case. 1201 m_arch = arch_spec; 1202 if (log) 1203 log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1204 return true; 1205 } 1206 else 1207 { 1208 // If we have an executable file, try to reset the executable to the desired architecture 1209 if (log) 1210 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1211 m_arch = arch_spec; 1212 ModuleSP executable_sp = GetExecutableModule (); 1213 1214 ClearModules(true); 1215 // Need to do something about unsetting breakpoints. 1216 1217 if (executable_sp) 1218 { 1219 if (log) 1220 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1221 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec); 1222 Error error = ModuleList::GetSharedModule (module_spec, 1223 executable_sp, 1224 &GetExecutableSearchPaths(), 1225 NULL, 1226 NULL); 1227 1228 if (!error.Fail() && executable_sp) 1229 { 1230 SetExecutableModule (executable_sp, true); 1231 return true; 1232 } 1233 } 1234 } 1235 return false; 1236 } 1237 1238 bool 1239 Target::MergeArchitecture (const ArchSpec &arch_spec) 1240 { 1241 if (arch_spec.IsValid()) 1242 { 1243 if (m_arch.IsCompatibleMatch(arch_spec)) 1244 { 1245 // The current target arch is compatible with "arch_spec", see if we 1246 // can improve our current architecture using bits from "arch_spec" 1247 1248 // Merge bits from arch_spec into "merged_arch" and set our architecture 1249 ArchSpec merged_arch (m_arch); 1250 merged_arch.MergeFrom (arch_spec); 1251 return SetArchitecture(merged_arch); 1252 } 1253 else 1254 { 1255 // The new architecture is different, we just need to replace it 1256 return SetArchitecture(arch_spec); 1257 } 1258 } 1259 return false; 1260 } 1261 1262 void 1263 Target::WillClearList (const ModuleList& module_list) 1264 { 1265 } 1266 1267 void 1268 Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp) 1269 { 1270 // A module is being added to this target for the first time 1271 if (m_valid) 1272 { 1273 ModuleList my_module_list; 1274 my_module_list.Append(module_sp); 1275 LoadScriptingResourceForModule(module_sp, this); 1276 ModulesDidLoad (my_module_list); 1277 } 1278 } 1279 1280 void 1281 Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp) 1282 { 1283 // A module is being added to this target for the first time 1284 if (m_valid) 1285 { 1286 ModuleList my_module_list; 1287 my_module_list.Append(module_sp); 1288 ModulesDidUnload (my_module_list, false); 1289 } 1290 } 1291 1292 void 1293 Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp) 1294 { 1295 // A module is replacing an already added module 1296 if (m_valid) 1297 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp); 1298 } 1299 1300 void 1301 Target::ModulesDidLoad (ModuleList &module_list) 1302 { 1303 if (m_valid && module_list.GetSize()) 1304 { 1305 m_breakpoint_list.UpdateBreakpoints (module_list, true, false); 1306 if (m_process_sp) 1307 { 1308 m_process_sp->ModulesDidLoad (module_list); 1309 } 1310 BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list)); 1311 } 1312 } 1313 1314 void 1315 Target::SymbolsDidLoad (ModuleList &module_list) 1316 { 1317 if (m_valid && module_list.GetSize()) 1318 { 1319 if (m_process_sp) 1320 { 1321 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1322 if (runtime) 1323 { 1324 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime; 1325 objc_runtime->SymbolsDidLoad(module_list); 1326 } 1327 } 1328 1329 m_breakpoint_list.UpdateBreakpoints (module_list, true, false); 1330 BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list)); 1331 } 1332 } 1333 1334 void 1335 Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations) 1336 { 1337 if (m_valid && module_list.GetSize()) 1338 { 1339 UnloadModuleSections (module_list); 1340 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations); 1341 BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list)); 1342 } 1343 } 1344 1345 bool 1346 Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec) 1347 { 1348 if (GetBreakpointsConsultPlatformAvoidList()) 1349 { 1350 ModuleList matchingModules; 1351 ModuleSpec module_spec (module_file_spec); 1352 size_t num_modules = GetImages().FindModules(module_spec, matchingModules); 1353 1354 // If there is more than one module for this file spec, only return true if ALL the modules are on the 1355 // black list. 1356 if (num_modules > 0) 1357 { 1358 for (size_t i = 0; i < num_modules; i++) 1359 { 1360 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i))) 1361 return false; 1362 } 1363 return true; 1364 } 1365 } 1366 return false; 1367 } 1368 1369 bool 1370 Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp) 1371 { 1372 if (GetBreakpointsConsultPlatformAvoidList()) 1373 { 1374 if (m_platform_sp) 1375 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp); 1376 } 1377 return false; 1378 } 1379 1380 size_t 1381 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error) 1382 { 1383 SectionSP section_sp (addr.GetSection()); 1384 if (section_sp) 1385 { 1386 // If the contents of this section are encrypted, the on-disk file is unusable. Read only from live memory. 1387 if (section_sp->IsEncrypted()) 1388 { 1389 error.SetErrorString("section is encrypted"); 1390 return 0; 1391 } 1392 ModuleSP module_sp (section_sp->GetModule()); 1393 if (module_sp) 1394 { 1395 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile(); 1396 if (objfile) 1397 { 1398 size_t bytes_read = objfile->ReadSectionData (section_sp.get(), 1399 addr.GetOffset(), 1400 dst, 1401 dst_len); 1402 if (bytes_read > 0) 1403 return bytes_read; 1404 else 1405 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString()); 1406 } 1407 else 1408 error.SetErrorString("address isn't from a object file"); 1409 } 1410 else 1411 error.SetErrorString("address isn't in a module"); 1412 } 1413 else 1414 error.SetErrorString("address doesn't contain a section that points to a section in a object file"); 1415 1416 return 0; 1417 } 1418 1419 size_t 1420 Target::ReadMemory (const Address& addr, 1421 bool prefer_file_cache, 1422 void *dst, 1423 size_t dst_len, 1424 Error &error, 1425 lldb::addr_t *load_addr_ptr) 1426 { 1427 error.Clear(); 1428 1429 // if we end up reading this from process memory, we will fill this 1430 // with the actual load address 1431 if (load_addr_ptr) 1432 *load_addr_ptr = LLDB_INVALID_ADDRESS; 1433 1434 size_t bytes_read = 0; 1435 1436 addr_t load_addr = LLDB_INVALID_ADDRESS; 1437 addr_t file_addr = LLDB_INVALID_ADDRESS; 1438 Address resolved_addr; 1439 if (!addr.IsSectionOffset()) 1440 { 1441 SectionLoadList §ion_load_list = GetSectionLoadList(); 1442 if (section_load_list.IsEmpty()) 1443 { 1444 // No sections are loaded, so we must assume we are not running 1445 // yet and anything we are given is a file address. 1446 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address 1447 m_images.ResolveFileAddress (file_addr, resolved_addr); 1448 } 1449 else 1450 { 1451 // We have at least one section loaded. This can be because 1452 // we have manually loaded some sections with "target modules load ..." 1453 // or because we have have a live process that has sections loaded 1454 // through the dynamic loader 1455 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address 1456 section_load_list.ResolveLoadAddress (load_addr, resolved_addr); 1457 } 1458 } 1459 if (!resolved_addr.IsValid()) 1460 resolved_addr = addr; 1461 1462 1463 if (prefer_file_cache) 1464 { 1465 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1466 if (bytes_read > 0) 1467 return bytes_read; 1468 } 1469 1470 if (ProcessIsValid()) 1471 { 1472 if (load_addr == LLDB_INVALID_ADDRESS) 1473 load_addr = resolved_addr.GetLoadAddress (this); 1474 1475 if (load_addr == LLDB_INVALID_ADDRESS) 1476 { 1477 ModuleSP addr_module_sp (resolved_addr.GetModule()); 1478 if (addr_module_sp && addr_module_sp->GetFileSpec()) 1479 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded", 1480 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"), 1481 resolved_addr.GetFileAddress(), 1482 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>")); 1483 else 1484 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress()); 1485 } 1486 else 1487 { 1488 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error); 1489 if (bytes_read != dst_len) 1490 { 1491 if (error.Success()) 1492 { 1493 if (bytes_read == 0) 1494 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr); 1495 else 1496 error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr); 1497 } 1498 } 1499 if (bytes_read) 1500 { 1501 if (load_addr_ptr) 1502 *load_addr_ptr = load_addr; 1503 return bytes_read; 1504 } 1505 // If the address is not section offset we have an address that 1506 // doesn't resolve to any address in any currently loaded shared 1507 // libraries and we failed to read memory so there isn't anything 1508 // more we can do. If it is section offset, we might be able to 1509 // read cached memory from the object file. 1510 if (!resolved_addr.IsSectionOffset()) 1511 return 0; 1512 } 1513 } 1514 1515 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) 1516 { 1517 // If we didn't already try and read from the object file cache, then 1518 // try it after failing to read from the process. 1519 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1520 } 1521 return 0; 1522 } 1523 1524 size_t 1525 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error) 1526 { 1527 char buf[256]; 1528 out_str.clear(); 1529 addr_t curr_addr = addr.GetLoadAddress(this); 1530 Address address(addr); 1531 while (1) 1532 { 1533 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error); 1534 if (length == 0) 1535 break; 1536 out_str.append(buf, length); 1537 // If we got "length - 1" bytes, we didn't get the whole C string, we 1538 // need to read some more characters 1539 if (length == sizeof(buf) - 1) 1540 curr_addr += length; 1541 else 1542 break; 1543 address = Address(curr_addr); 1544 } 1545 return out_str.size(); 1546 } 1547 1548 1549 size_t 1550 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error) 1551 { 1552 size_t total_cstr_len = 0; 1553 if (dst && dst_max_len) 1554 { 1555 result_error.Clear(); 1556 // NULL out everything just to be safe 1557 memset (dst, 0, dst_max_len); 1558 Error error; 1559 addr_t curr_addr = addr.GetLoadAddress(this); 1560 Address address(addr); 1561 1562 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't 1563 // think this really needs to be tied to the memory cache subsystem's 1564 // cache line size, so leave this as a fixed constant. 1565 const size_t cache_line_size = 512; 1566 1567 size_t bytes_left = dst_max_len - 1; 1568 char *curr_dst = dst; 1569 1570 while (bytes_left > 0) 1571 { 1572 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1573 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1574 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error); 1575 1576 if (bytes_read == 0) 1577 { 1578 result_error = error; 1579 dst[total_cstr_len] = '\0'; 1580 break; 1581 } 1582 const size_t len = strlen(curr_dst); 1583 1584 total_cstr_len += len; 1585 1586 if (len < bytes_to_read) 1587 break; 1588 1589 curr_dst += bytes_read; 1590 curr_addr += bytes_read; 1591 bytes_left -= bytes_read; 1592 address = Address(curr_addr); 1593 } 1594 } 1595 else 1596 { 1597 if (dst == NULL) 1598 result_error.SetErrorString("invalid arguments"); 1599 else 1600 result_error.Clear(); 1601 } 1602 return total_cstr_len; 1603 } 1604 1605 size_t 1606 Target::ReadScalarIntegerFromMemory (const Address& addr, 1607 bool prefer_file_cache, 1608 uint32_t byte_size, 1609 bool is_signed, 1610 Scalar &scalar, 1611 Error &error) 1612 { 1613 uint64_t uval; 1614 1615 if (byte_size <= sizeof(uval)) 1616 { 1617 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error); 1618 if (bytes_read == byte_size) 1619 { 1620 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize()); 1621 lldb::offset_t offset = 0; 1622 if (byte_size <= 4) 1623 scalar = data.GetMaxU32 (&offset, byte_size); 1624 else 1625 scalar = data.GetMaxU64 (&offset, byte_size); 1626 1627 if (is_signed) 1628 scalar.SignExtend(byte_size * 8); 1629 return bytes_read; 1630 } 1631 } 1632 else 1633 { 1634 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 1635 } 1636 return 0; 1637 } 1638 1639 uint64_t 1640 Target::ReadUnsignedIntegerFromMemory (const Address& addr, 1641 bool prefer_file_cache, 1642 size_t integer_byte_size, 1643 uint64_t fail_value, 1644 Error &error) 1645 { 1646 Scalar scalar; 1647 if (ReadScalarIntegerFromMemory (addr, 1648 prefer_file_cache, 1649 integer_byte_size, 1650 false, 1651 scalar, 1652 error)) 1653 return scalar.ULongLong(fail_value); 1654 return fail_value; 1655 } 1656 1657 bool 1658 Target::ReadPointerFromMemory (const Address& addr, 1659 bool prefer_file_cache, 1660 Error &error, 1661 Address &pointer_addr) 1662 { 1663 Scalar scalar; 1664 if (ReadScalarIntegerFromMemory (addr, 1665 prefer_file_cache, 1666 m_arch.GetAddressByteSize(), 1667 false, 1668 scalar, 1669 error)) 1670 { 1671 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1672 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) 1673 { 1674 SectionLoadList §ion_load_list = GetSectionLoadList(); 1675 if (section_load_list.IsEmpty()) 1676 { 1677 // No sections are loaded, so we must assume we are not running 1678 // yet and anything we are given is a file address. 1679 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr); 1680 } 1681 else 1682 { 1683 // We have at least one section loaded. This can be because 1684 // we have manually loaded some sections with "target modules load ..." 1685 // or because we have have a live process that has sections loaded 1686 // through the dynamic loader 1687 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr); 1688 } 1689 // We weren't able to resolve the pointer value, so just return 1690 // an address with no section 1691 if (!pointer_addr.IsValid()) 1692 pointer_addr.SetOffset (pointer_vm_addr); 1693 return true; 1694 1695 } 1696 } 1697 return false; 1698 } 1699 1700 ModuleSP 1701 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr) 1702 { 1703 ModuleSP module_sp; 1704 1705 Error error; 1706 1707 // First see if we already have this module in our module list. If we do, then we're done, we don't need 1708 // to consult the shared modules list. But only do this if we are passed a UUID. 1709 1710 if (module_spec.GetUUID().IsValid()) 1711 module_sp = m_images.FindFirstModule(module_spec); 1712 1713 if (!module_sp) 1714 { 1715 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library 1716 bool did_create_module = false; 1717 1718 // If there are image search path entries, try to use them first to acquire a suitable image. 1719 if (m_image_search_paths.GetSize()) 1720 { 1721 ModuleSpec transformed_spec (module_spec); 1722 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory())) 1723 { 1724 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename(); 1725 error = ModuleList::GetSharedModule (transformed_spec, 1726 module_sp, 1727 &GetExecutableSearchPaths(), 1728 &old_module_sp, 1729 &did_create_module); 1730 } 1731 } 1732 1733 if (!module_sp) 1734 { 1735 // If we have a UUID, we can check our global shared module list in case 1736 // we already have it. If we don't have a valid UUID, then we can't since 1737 // the path in "module_spec" will be a platform path, and we will need to 1738 // let the platform find that file. For example, we could be asking for 1739 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick 1740 // the local copy of "/usr/lib/dyld" since our platform could be a remote 1741 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file 1742 // cache. 1743 if (module_spec.GetUUID().IsValid()) 1744 { 1745 // We have a UUID, it is OK to check the global module list... 1746 error = ModuleList::GetSharedModule (module_spec, 1747 module_sp, 1748 &GetExecutableSearchPaths(), 1749 &old_module_sp, 1750 &did_create_module); 1751 } 1752 1753 if (!module_sp) 1754 { 1755 // The platform is responsible for finding and caching an appropriate 1756 // module in the shared module cache. 1757 if (m_platform_sp) 1758 { 1759 error = m_platform_sp->GetSharedModule (module_spec, 1760 m_process_sp.get(), 1761 module_sp, 1762 &GetExecutableSearchPaths(), 1763 &old_module_sp, 1764 &did_create_module); 1765 } 1766 else 1767 { 1768 error.SetErrorString("no platform is currently set"); 1769 } 1770 } 1771 } 1772 1773 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent 1774 // module in the list already, and if there was, let's remove it. 1775 if (module_sp) 1776 { 1777 ObjectFile *objfile = module_sp->GetObjectFile(); 1778 if (objfile) 1779 { 1780 switch (objfile->GetType()) 1781 { 1782 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state 1783 case ObjectFile::eTypeExecutable: /// A normal executable 1784 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable 1785 case ObjectFile::eTypeObjectFile: /// An intermediate object file 1786 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution 1787 break; 1788 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information 1789 if (error_ptr) 1790 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable"); 1791 return ModuleSP(); 1792 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution 1793 if (error_ptr) 1794 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable"); 1795 return ModuleSP(); 1796 default: 1797 if (error_ptr) 1798 error_ptr->SetErrorString("unsupported file type, please specify an executable"); 1799 return ModuleSP(); 1800 } 1801 // GetSharedModule is not guaranteed to find the old shared module, for instance 1802 // in the common case where you pass in the UUID, it is only going to find the one 1803 // module matching the UUID. In fact, it has no good way to know what the "old module" 1804 // relevant to this target is, since there might be many copies of a module with this file spec 1805 // in various running debug sessions, but only one of them will belong to this target. 1806 // So let's remove the UUID from the module list, and look in the target's module list. 1807 // Only do this if there is SOMETHING else in the module spec... 1808 if (!old_module_sp) 1809 { 1810 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty()) 1811 { 1812 ModuleSpec module_spec_copy(module_spec.GetFileSpec()); 1813 module_spec_copy.GetUUID().Clear(); 1814 1815 ModuleList found_modules; 1816 size_t num_found = m_images.FindModules (module_spec_copy, found_modules); 1817 if (num_found == 1) 1818 { 1819 old_module_sp = found_modules.GetModuleAtIndex(0); 1820 } 1821 } 1822 } 1823 1824 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32) 1825 { 1826 m_images.ReplaceModule(old_module_sp, module_sp); 1827 Module *old_module_ptr = old_module_sp.get(); 1828 old_module_sp.reset(); 1829 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr); 1830 } 1831 else 1832 m_images.Append(module_sp); 1833 } 1834 else 1835 module_sp.reset(); 1836 } 1837 } 1838 if (error_ptr) 1839 *error_ptr = error; 1840 return module_sp; 1841 } 1842 1843 1844 TargetSP 1845 Target::CalculateTarget () 1846 { 1847 return shared_from_this(); 1848 } 1849 1850 ProcessSP 1851 Target::CalculateProcess () 1852 { 1853 return ProcessSP(); 1854 } 1855 1856 ThreadSP 1857 Target::CalculateThread () 1858 { 1859 return ThreadSP(); 1860 } 1861 1862 StackFrameSP 1863 Target::CalculateStackFrame () 1864 { 1865 return StackFrameSP(); 1866 } 1867 1868 void 1869 Target::CalculateExecutionContext (ExecutionContext &exe_ctx) 1870 { 1871 exe_ctx.Clear(); 1872 exe_ctx.SetTargetPtr(this); 1873 } 1874 1875 PathMappingList & 1876 Target::GetImageSearchPathList () 1877 { 1878 return m_image_search_paths; 1879 } 1880 1881 void 1882 Target::ImageSearchPathsChanged 1883 ( 1884 const PathMappingList &path_list, 1885 void *baton 1886 ) 1887 { 1888 Target *target = (Target *)baton; 1889 ModuleSP exe_module_sp (target->GetExecutableModule()); 1890 if (exe_module_sp) 1891 target->SetExecutableModule (exe_module_sp, true); 1892 } 1893 1894 ClangASTContext * 1895 Target::GetScratchClangASTContext(bool create_on_demand) 1896 { 1897 // Now see if we know the target triple, and if so, create our scratch AST context: 1898 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand) 1899 { 1900 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str())); 1901 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this())); 1902 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext()); 1903 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy()); 1904 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source); 1905 } 1906 return m_scratch_ast_context_ap.get(); 1907 } 1908 1909 TypeSystem* 1910 Target::GetTypeSystemForLanguage (lldb::LanguageType language) 1911 { 1912 switch (language) 1913 { 1914 case lldb::eLanguageTypeC: 1915 case lldb::eLanguageTypeC11: 1916 case lldb::eLanguageTypeC89: 1917 case lldb::eLanguageTypeC99: 1918 case lldb::eLanguageTypeC_plus_plus: 1919 case lldb::eLanguageTypeC_plus_plus_03: 1920 case lldb::eLanguageTypeC_plus_plus_11: 1921 case lldb::eLanguageTypeC_plus_plus_14: 1922 case lldb::eLanguageTypeObjC: 1923 case lldb::eLanguageTypeObjC_plus_plus: 1924 return GetScratchClangASTContext(true); 1925 default: 1926 return nullptr; 1927 } 1928 } 1929 1930 ClangASTImporter * 1931 Target::GetClangASTImporter() 1932 { 1933 ClangASTImporter *ast_importer = m_ast_importer_ap.get(); 1934 1935 if (!ast_importer) 1936 { 1937 ast_importer = new ClangASTImporter(); 1938 m_ast_importer_ap.reset(ast_importer); 1939 } 1940 1941 return ast_importer; 1942 } 1943 1944 void 1945 Target::SettingsInitialize () 1946 { 1947 Process::SettingsInitialize (); 1948 } 1949 1950 void 1951 Target::SettingsTerminate () 1952 { 1953 Process::SettingsTerminate (); 1954 } 1955 1956 FileSpecList 1957 Target::GetDefaultExecutableSearchPaths () 1958 { 1959 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1960 if (properties_sp) 1961 return properties_sp->GetExecutableSearchPaths(); 1962 return FileSpecList(); 1963 } 1964 1965 FileSpecList 1966 Target::GetDefaultDebugFileSearchPaths () 1967 { 1968 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1969 if (properties_sp) 1970 return properties_sp->GetDebugFileSearchPaths(); 1971 return FileSpecList(); 1972 } 1973 1974 FileSpecList 1975 Target::GetDefaultClangModuleSearchPaths () 1976 { 1977 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1978 if (properties_sp) 1979 return properties_sp->GetClangModuleSearchPaths(); 1980 return FileSpecList(); 1981 } 1982 1983 ArchSpec 1984 Target::GetDefaultArchitecture () 1985 { 1986 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1987 if (properties_sp) 1988 return properties_sp->GetDefaultArchitecture(); 1989 return ArchSpec(); 1990 } 1991 1992 void 1993 Target::SetDefaultArchitecture (const ArchSpec &arch) 1994 { 1995 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1996 if (properties_sp) 1997 { 1998 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str()); 1999 return properties_sp->SetDefaultArchitecture(arch); 2000 } 2001 } 2002 2003 Target * 2004 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr) 2005 { 2006 // The target can either exist in the "process" of ExecutionContext, or in 2007 // the "target_sp" member of SymbolContext. This accessor helper function 2008 // will get the target from one of these locations. 2009 2010 Target *target = NULL; 2011 if (sc_ptr != NULL) 2012 target = sc_ptr->target_sp.get(); 2013 if (target == NULL && exe_ctx_ptr) 2014 target = exe_ctx_ptr->GetTargetPtr(); 2015 return target; 2016 } 2017 2018 ExpressionResults 2019 Target::EvaluateExpression 2020 ( 2021 const char *expr_cstr, 2022 StackFrame *frame, 2023 lldb::ValueObjectSP &result_valobj_sp, 2024 const EvaluateExpressionOptions& options 2025 ) 2026 { 2027 result_valobj_sp.reset(); 2028 2029 ExpressionResults execution_results = eExpressionSetupError; 2030 2031 if (expr_cstr == NULL || expr_cstr[0] == '\0') 2032 return execution_results; 2033 2034 // We shouldn't run stop hooks in expressions. 2035 // Be sure to reset this if you return anywhere within this function. 2036 bool old_suppress_value = m_suppress_stop_hooks; 2037 m_suppress_stop_hooks = true; 2038 2039 ExecutionContext exe_ctx; 2040 2041 if (frame) 2042 { 2043 frame->CalculateExecutionContext(exe_ctx); 2044 } 2045 else if (m_process_sp) 2046 { 2047 m_process_sp->CalculateExecutionContext(exe_ctx); 2048 } 2049 else 2050 { 2051 CalculateExecutionContext(exe_ctx); 2052 } 2053 2054 // Make sure we aren't just trying to see the value of a persistent 2055 // variable (something like "$0") 2056 lldb::ExpressionVariableSP persistent_var_sp; 2057 // Only check for persistent variables the expression starts with a '$' 2058 if (expr_cstr[0] == '$') 2059 persistent_var_sp = m_persistent_variables->GetVariable (expr_cstr); 2060 2061 if (persistent_var_sp) 2062 { 2063 result_valobj_sp = persistent_var_sp->GetValueObject (); 2064 execution_results = eExpressionCompleted; 2065 } 2066 else 2067 { 2068 const char *prefix = GetExpressionPrefixContentsAsCString(); 2069 Error error; 2070 execution_results = ClangUserExpression::Evaluate (exe_ctx, 2071 options, 2072 expr_cstr, 2073 prefix, 2074 result_valobj_sp, 2075 error); 2076 } 2077 2078 m_suppress_stop_hooks = old_suppress_value; 2079 2080 return execution_results; 2081 } 2082 2083 ClangPersistentVariables & 2084 Target::GetPersistentVariables() 2085 { 2086 return *m_persistent_variables; 2087 } 2088 2089 lldb::addr_t 2090 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 2091 { 2092 addr_t code_addr = load_addr; 2093 switch (m_arch.GetMachine()) 2094 { 2095 case llvm::Triple::arm: 2096 case llvm::Triple::thumb: 2097 switch (addr_class) 2098 { 2099 case eAddressClassData: 2100 case eAddressClassDebug: 2101 return LLDB_INVALID_ADDRESS; 2102 2103 case eAddressClassUnknown: 2104 case eAddressClassInvalid: 2105 case eAddressClassCode: 2106 case eAddressClassCodeAlternateISA: 2107 case eAddressClassRuntime: 2108 // Check if bit zero it no set? 2109 if ((code_addr & 1ull) == 0) 2110 { 2111 // Bit zero isn't set, check if the address is a multiple of 2? 2112 if (code_addr & 2ull) 2113 { 2114 // The address is a multiple of 2 so it must be thumb, set bit zero 2115 code_addr |= 1ull; 2116 } 2117 else if (addr_class == eAddressClassCodeAlternateISA) 2118 { 2119 // We checked the address and the address claims to be the alternate ISA 2120 // which means thumb, so set bit zero. 2121 code_addr |= 1ull; 2122 } 2123 } 2124 break; 2125 } 2126 break; 2127 2128 default: 2129 break; 2130 } 2131 return code_addr; 2132 } 2133 2134 lldb::addr_t 2135 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 2136 { 2137 addr_t opcode_addr = load_addr; 2138 switch (m_arch.GetMachine()) 2139 { 2140 case llvm::Triple::arm: 2141 case llvm::Triple::thumb: 2142 switch (addr_class) 2143 { 2144 case eAddressClassData: 2145 case eAddressClassDebug: 2146 return LLDB_INVALID_ADDRESS; 2147 2148 case eAddressClassInvalid: 2149 case eAddressClassUnknown: 2150 case eAddressClassCode: 2151 case eAddressClassCodeAlternateISA: 2152 case eAddressClassRuntime: 2153 opcode_addr &= ~(1ull); 2154 break; 2155 } 2156 break; 2157 2158 default: 2159 break; 2160 } 2161 return opcode_addr; 2162 } 2163 2164 lldb::addr_t 2165 Target::GetBreakableLoadAddress (lldb::addr_t addr) 2166 { 2167 addr_t breakable_addr = addr; 2168 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 2169 2170 switch (m_arch.GetMachine()) 2171 { 2172 default: 2173 break; 2174 case llvm::Triple::mips: 2175 case llvm::Triple::mipsel: 2176 case llvm::Triple::mips64: 2177 case llvm::Triple::mips64el: 2178 { 2179 addr_t function_start = 0; 2180 addr_t current_offset = 0; 2181 uint32_t loop_count = 0; 2182 Address resolved_addr; 2183 uint32_t arch_flags = m_arch.GetFlags (); 2184 bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16; 2185 bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips; 2186 SectionLoadList §ion_load_list = GetSectionLoadList(); 2187 2188 if (section_load_list.IsEmpty()) 2189 // No sections are loaded, so we must assume we are not running yet 2190 // and need to operate only on file address. 2191 m_images.ResolveFileAddress (addr, resolved_addr); 2192 else 2193 section_load_list.ResolveLoadAddress(addr, resolved_addr); 2194 2195 // Get the function boundaries to make sure we don't scan back before the beginning of the current function. 2196 ModuleSP temp_addr_module_sp (resolved_addr.GetModule()); 2197 if (temp_addr_module_sp) 2198 { 2199 SymbolContext sc; 2200 uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol; 2201 temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc); 2202 if (sc.function) 2203 { 2204 function_start = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(this); 2205 if (function_start == LLDB_INVALID_ADDRESS) 2206 function_start = sc.function->GetAddressRange().GetBaseAddress().GetFileAddress(); 2207 } 2208 else if (sc.symbol) 2209 { 2210 Address sym_addr = sc.symbol->GetAddress(); 2211 function_start = sym_addr.GetFileAddress(); 2212 } 2213 current_offset = addr - function_start; 2214 } 2215 2216 // If breakpoint address is start of function then we dont have to do anything. 2217 if (current_offset == 0) 2218 return breakable_addr; 2219 else 2220 loop_count = current_offset / 2; 2221 2222 if (loop_count > 3) 2223 { 2224 // Scan previous 6 bytes 2225 if (IsMips16 | IsMicromips) 2226 loop_count = 3; 2227 // For mips-only, instructions are always 4 bytes, so scan previous 4 bytes only. 2228 else 2229 loop_count = 2; 2230 } 2231 2232 // Create Disassembler Instance 2233 lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(m_arch, NULL, NULL)); 2234 2235 ExecutionContext exe_ctx; 2236 CalculateExecutionContext(exe_ctx); 2237 InstructionList instruction_list; 2238 InstructionSP prev_insn; 2239 bool prefer_file_cache = true; // Read from file 2240 uint32_t inst_to_choose = 0; 2241 2242 for (uint32_t i = 1; i <= loop_count; i++) 2243 { 2244 // Adjust the address to read from. 2245 resolved_addr.Slide (-2); 2246 AddressRange range(resolved_addr, i*2); 2247 uint32_t insn_size = 0; 2248 2249 disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache); 2250 2251 uint32_t num_insns = disasm_sp->GetInstructionList().GetSize(); 2252 if (num_insns) 2253 { 2254 prev_insn = disasm_sp->GetInstructionList().GetInstructionAtIndex(0); 2255 insn_size = prev_insn->GetOpcode().GetByteSize(); 2256 if (i == 1 && insn_size == 2) 2257 { 2258 // This looks like a valid 2-byte instruction (but it could be a part of upper 4 byte instruction). 2259 instruction_list.Append(prev_insn); 2260 inst_to_choose = 1; 2261 } 2262 else if (i == 2) 2263 { 2264 // Here we may get one 4-byte instruction or two 2-byte instructions. 2265 if (num_insns == 2) 2266 { 2267 // Looks like there are two 2-byte instructions above our breakpoint target address. 2268 // Now the upper 2-byte instruction is either a valid 2-byte instruction or could be a part of it's upper 4-byte instruction. 2269 // In both cases we don't care because in this case lower 2-byte instruction is definitely a valid instruction 2270 // and whatever i=1 iteration has found out is true. 2271 inst_to_choose = 1; 2272 break; 2273 } 2274 else if (insn_size == 4) 2275 { 2276 // This instruction claims its a valid 4-byte instruction. But it could be a part of it's upper 4-byte instruction. 2277 // Lets try scanning upper 2 bytes to verify this. 2278 instruction_list.Append(prev_insn); 2279 inst_to_choose = 2; 2280 } 2281 } 2282 else if (i == 3) 2283 { 2284 if (insn_size == 4) 2285 // FIXME: We reached here that means instruction at [target - 4] has already claimed to be a 4-byte instruction, 2286 // and now instruction at [target - 6] is also claiming that it's a 4-byte instruction. This can not be true. 2287 // In this case we can not decide the valid previous instruction so we let lldb set the breakpoint at the address given by user. 2288 inst_to_choose = 0; 2289 else 2290 // This is straight-forward 2291 inst_to_choose = 2; 2292 break; 2293 } 2294 } 2295 else 2296 { 2297 // Decode failed, bytes do not form a valid instruction. So whatever previous iteration has found out is true. 2298 if (i > 1) 2299 { 2300 inst_to_choose = i - 1; 2301 break; 2302 } 2303 } 2304 } 2305 2306 // Check if we are able to find any valid instruction. 2307 if (inst_to_choose) 2308 { 2309 if (inst_to_choose > instruction_list.GetSize()) 2310 inst_to_choose--; 2311 prev_insn = instruction_list.GetInstructionAtIndex(inst_to_choose - 1); 2312 2313 if (prev_insn->HasDelaySlot()) 2314 { 2315 uint32_t shift_size = prev_insn->GetOpcode().GetByteSize(); 2316 // Adjust the breakable address 2317 breakable_addr = addr - shift_size; 2318 if (log) 2319 log->Printf ("Target::%s Breakpoint at 0x%8.8" PRIx64 " is adjusted to 0x%8.8" PRIx64 " due to delay slot\n", __FUNCTION__, addr, breakable_addr); 2320 } 2321 } 2322 break; 2323 } 2324 } 2325 return breakable_addr; 2326 } 2327 2328 SourceManager & 2329 Target::GetSourceManager () 2330 { 2331 if (m_source_manager_ap.get() == NULL) 2332 m_source_manager_ap.reset (new SourceManager(shared_from_this())); 2333 return *m_source_manager_ap; 2334 } 2335 2336 ClangModulesDeclVendor * 2337 Target::GetClangModulesDeclVendor () 2338 { 2339 static Mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target 2340 2341 { 2342 Mutex::Locker clang_modules_decl_vendor_locker(s_clang_modules_decl_vendor_mutex); 2343 2344 if (!m_clang_modules_decl_vendor_ap) 2345 { 2346 m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this)); 2347 } 2348 } 2349 2350 return m_clang_modules_decl_vendor_ap.get(); 2351 } 2352 2353 Target::StopHookSP 2354 Target::CreateStopHook () 2355 { 2356 lldb::user_id_t new_uid = ++m_stop_hook_next_id; 2357 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid)); 2358 m_stop_hooks[new_uid] = stop_hook_sp; 2359 return stop_hook_sp; 2360 } 2361 2362 bool 2363 Target::RemoveStopHookByID (lldb::user_id_t user_id) 2364 { 2365 size_t num_removed; 2366 num_removed = m_stop_hooks.erase (user_id); 2367 if (num_removed == 0) 2368 return false; 2369 else 2370 return true; 2371 } 2372 2373 void 2374 Target::RemoveAllStopHooks () 2375 { 2376 m_stop_hooks.clear(); 2377 } 2378 2379 Target::StopHookSP 2380 Target::GetStopHookByID (lldb::user_id_t user_id) 2381 { 2382 StopHookSP found_hook; 2383 2384 StopHookCollection::iterator specified_hook_iter; 2385 specified_hook_iter = m_stop_hooks.find (user_id); 2386 if (specified_hook_iter != m_stop_hooks.end()) 2387 found_hook = (*specified_hook_iter).second; 2388 return found_hook; 2389 } 2390 2391 bool 2392 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state) 2393 { 2394 StopHookCollection::iterator specified_hook_iter; 2395 specified_hook_iter = m_stop_hooks.find (user_id); 2396 if (specified_hook_iter == m_stop_hooks.end()) 2397 return false; 2398 2399 (*specified_hook_iter).second->SetIsActive (active_state); 2400 return true; 2401 } 2402 2403 void 2404 Target::SetAllStopHooksActiveState (bool active_state) 2405 { 2406 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2407 for (pos = m_stop_hooks.begin(); pos != end; pos++) 2408 { 2409 (*pos).second->SetIsActive (active_state); 2410 } 2411 } 2412 2413 void 2414 Target::RunStopHooks () 2415 { 2416 if (m_suppress_stop_hooks) 2417 return; 2418 2419 if (!m_process_sp) 2420 return; 2421 2422 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression 2423 // since in that case we do not want to run the stop-hooks 2424 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression()) 2425 return; 2426 2427 if (m_stop_hooks.empty()) 2428 return; 2429 2430 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2431 2432 // If there aren't any active stop hooks, don't bother either: 2433 bool any_active_hooks = false; 2434 for (pos = m_stop_hooks.begin(); pos != end; pos++) 2435 { 2436 if ((*pos).second->IsActive()) 2437 { 2438 any_active_hooks = true; 2439 break; 2440 } 2441 } 2442 if (!any_active_hooks) 2443 return; 2444 2445 CommandReturnObject result; 2446 2447 std::vector<ExecutionContext> exc_ctx_with_reasons; 2448 std::vector<SymbolContext> sym_ctx_with_reasons; 2449 2450 ThreadList &cur_threadlist = m_process_sp->GetThreadList(); 2451 size_t num_threads = cur_threadlist.GetSize(); 2452 for (size_t i = 0; i < num_threads; i++) 2453 { 2454 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i); 2455 if (cur_thread_sp->ThreadStoppedForAReason()) 2456 { 2457 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0); 2458 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get())); 2459 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything)); 2460 } 2461 } 2462 2463 // If no threads stopped for a reason, don't run the stop-hooks. 2464 size_t num_exe_ctx = exc_ctx_with_reasons.size(); 2465 if (num_exe_ctx == 0) 2466 return; 2467 2468 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream()); 2469 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream()); 2470 2471 bool keep_going = true; 2472 bool hooks_ran = false; 2473 bool print_hook_header; 2474 bool print_thread_header; 2475 2476 if (num_exe_ctx == 1) 2477 print_thread_header = false; 2478 else 2479 print_thread_header = true; 2480 2481 if (m_stop_hooks.size() == 1) 2482 print_hook_header = false; 2483 else 2484 print_hook_header = true; 2485 2486 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) 2487 { 2488 // result.Clear(); 2489 StopHookSP cur_hook_sp = (*pos).second; 2490 if (!cur_hook_sp->IsActive()) 2491 continue; 2492 2493 bool any_thread_matched = false; 2494 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) 2495 { 2496 if ((cur_hook_sp->GetSpecifier () == NULL 2497 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i])) 2498 && (cur_hook_sp->GetThreadSpecifier() == NULL 2499 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef()))) 2500 { 2501 if (!hooks_ran) 2502 { 2503 hooks_ran = true; 2504 } 2505 if (print_hook_header && !any_thread_matched) 2506 { 2507 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ? 2508 cur_hook_sp->GetCommands().GetStringAtIndex(0) : 2509 NULL); 2510 if (cmd) 2511 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd); 2512 else 2513 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID()); 2514 any_thread_matched = true; 2515 } 2516 2517 if (print_thread_header) 2518 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID()); 2519 2520 CommandInterpreterRunOptions options; 2521 options.SetStopOnContinue (true); 2522 options.SetStopOnError (true); 2523 options.SetEchoCommands (false); 2524 options.SetPrintResults (true); 2525 options.SetAddToHistory (false); 2526 2527 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(), 2528 &exc_ctx_with_reasons[i], 2529 options, 2530 result); 2531 2532 // If the command started the target going again, we should bag out of 2533 // running the stop hooks. 2534 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) || 2535 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) 2536 { 2537 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID()); 2538 keep_going = false; 2539 } 2540 } 2541 } 2542 } 2543 2544 result.GetImmediateOutputStream()->Flush(); 2545 result.GetImmediateErrorStream()->Flush(); 2546 } 2547 2548 const TargetPropertiesSP & 2549 Target::GetGlobalProperties() 2550 { 2551 static TargetPropertiesSP g_settings_sp; 2552 if (!g_settings_sp) 2553 { 2554 g_settings_sp.reset (new TargetProperties (NULL)); 2555 } 2556 return g_settings_sp; 2557 } 2558 2559 Error 2560 Target::Install (ProcessLaunchInfo *launch_info) 2561 { 2562 Error error; 2563 PlatformSP platform_sp (GetPlatform()); 2564 if (platform_sp) 2565 { 2566 if (platform_sp->IsRemote()) 2567 { 2568 if (platform_sp->IsConnected()) 2569 { 2570 // Install all files that have an install path, and always install the 2571 // main executable when connected to a remote platform 2572 const ModuleList& modules = GetImages(); 2573 const size_t num_images = modules.GetSize(); 2574 for (size_t idx = 0; idx < num_images; ++idx) 2575 { 2576 const bool is_main_executable = idx == 0; 2577 ModuleSP module_sp(modules.GetModuleAtIndex(idx)); 2578 if (module_sp) 2579 { 2580 FileSpec local_file (module_sp->GetFileSpec()); 2581 if (local_file) 2582 { 2583 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec()); 2584 if (!remote_file) 2585 { 2586 if (is_main_executable) // TODO: add setting for always installing main executable??? 2587 { 2588 // Always install the main executable 2589 remote_file = platform_sp->GetRemoteWorkingDirectory(); 2590 remote_file.AppendPathComponent(module_sp->GetFileSpec().GetFilename().GetCString()); 2591 } 2592 } 2593 if (remote_file) 2594 { 2595 error = platform_sp->Install(local_file, remote_file); 2596 if (error.Success()) 2597 { 2598 module_sp->SetPlatformFileSpec(remote_file); 2599 if (is_main_executable) 2600 { 2601 platform_sp->SetFilePermissions(remote_file, 0700); 2602 if (launch_info) 2603 launch_info->SetExecutableFile(remote_file, false); 2604 } 2605 } 2606 else 2607 break; 2608 } 2609 } 2610 } 2611 } 2612 } 2613 } 2614 } 2615 return error; 2616 } 2617 2618 bool 2619 Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id) 2620 { 2621 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr); 2622 } 2623 2624 bool 2625 Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr) 2626 { 2627 return m_images.ResolveFileAddress(file_addr, resolved_addr); 2628 } 2629 2630 bool 2631 Target::SetSectionLoadAddress (const SectionSP §ion_sp, addr_t new_section_load_addr, bool warn_multiple) 2632 { 2633 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp); 2634 if (old_section_load_addr != new_section_load_addr) 2635 { 2636 uint32_t stop_id = 0; 2637 ProcessSP process_sp(GetProcessSP()); 2638 if (process_sp) 2639 stop_id = process_sp->GetStopID(); 2640 else 2641 stop_id = m_section_load_history.GetLastStopID(); 2642 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple)) 2643 return true; // Return true if the section load address was changed... 2644 } 2645 return false; // Return false to indicate nothing changed 2646 2647 } 2648 2649 size_t 2650 Target::UnloadModuleSections (const ModuleList &module_list) 2651 { 2652 size_t section_unload_count = 0; 2653 size_t num_modules = module_list.GetSize(); 2654 for (size_t i=0; i<num_modules; ++i) 2655 { 2656 section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i)); 2657 } 2658 return section_unload_count; 2659 } 2660 2661 size_t 2662 Target::UnloadModuleSections (const lldb::ModuleSP &module_sp) 2663 { 2664 uint32_t stop_id = 0; 2665 ProcessSP process_sp(GetProcessSP()); 2666 if (process_sp) 2667 stop_id = process_sp->GetStopID(); 2668 else 2669 stop_id = m_section_load_history.GetLastStopID(); 2670 SectionList *sections = module_sp->GetSectionList(); 2671 size_t section_unload_count = 0; 2672 if (sections) 2673 { 2674 const uint32_t num_sections = sections->GetNumSections(0); 2675 for (uint32_t i = 0; i < num_sections; ++i) 2676 { 2677 section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i)); 2678 } 2679 } 2680 return section_unload_count; 2681 } 2682 2683 bool 2684 Target::SetSectionUnloaded (const lldb::SectionSP §ion_sp) 2685 { 2686 uint32_t stop_id = 0; 2687 ProcessSP process_sp(GetProcessSP()); 2688 if (process_sp) 2689 stop_id = process_sp->GetStopID(); 2690 else 2691 stop_id = m_section_load_history.GetLastStopID(); 2692 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp); 2693 } 2694 2695 bool 2696 Target::SetSectionUnloaded (const lldb::SectionSP §ion_sp, addr_t load_addr) 2697 { 2698 uint32_t stop_id = 0; 2699 ProcessSP process_sp(GetProcessSP()); 2700 if (process_sp) 2701 stop_id = process_sp->GetStopID(); 2702 else 2703 stop_id = m_section_load_history.GetLastStopID(); 2704 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr); 2705 } 2706 2707 void 2708 Target::ClearAllLoadedSections () 2709 { 2710 m_section_load_history.Clear(); 2711 } 2712 2713 2714 Error 2715 Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream) 2716 { 2717 Error error; 2718 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 2719 2720 if (log) 2721 log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ()); 2722 2723 StateType state = eStateInvalid; 2724 2725 // Scope to temporarily get the process state in case someone has manually 2726 // remotely connected already to a process and we can skip the platform 2727 // launching. 2728 { 2729 ProcessSP process_sp (GetProcessSP()); 2730 2731 if (process_sp) 2732 { 2733 state = process_sp->GetState(); 2734 if (log) 2735 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state)); 2736 } 2737 else 2738 { 2739 if (log) 2740 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__); 2741 } 2742 } 2743 2744 launch_info.GetFlags().Set (eLaunchFlagDebug); 2745 2746 // Get the value of synchronous execution here. If you wait till after you have started to 2747 // run, then you could have hit a breakpoint, whose command might switch the value, and 2748 // then you'll pick up that incorrect value. 2749 Debugger &debugger = GetDebugger(); 2750 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous (); 2751 2752 PlatformSP platform_sp (GetPlatform()); 2753 2754 // Finalize the file actions, and if none were given, default to opening 2755 // up a pseudo terminal 2756 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false; 2757 if (log) 2758 log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s", 2759 __FUNCTION__, 2760 platform_sp ? "true" : "false", 2761 platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a", 2762 default_to_use_pty ? "true" : "false"); 2763 2764 launch_info.FinalizeFileActions (this, default_to_use_pty); 2765 2766 if (state == eStateConnected) 2767 { 2768 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY)) 2769 { 2770 error.SetErrorString("can't launch in tty when launching through a remote connection"); 2771 return error; 2772 } 2773 } 2774 2775 if (!launch_info.GetArchitecture().IsValid()) 2776 launch_info.GetArchitecture() = GetArchitecture(); 2777 2778 // If we're not already connected to the process, and if we have a platform that can launch a process for debugging, go ahead and do that here. 2779 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ()) 2780 { 2781 if (log) 2782 log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__); 2783 2784 // Get a weak pointer to the previous process if we have one 2785 ProcessWP process_wp; 2786 if (m_process_sp) 2787 process_wp = m_process_sp; 2788 m_process_sp = GetPlatform()->DebugProcess (launch_info, 2789 debugger, 2790 this, 2791 error); 2792 2793 // Cleanup the old process since someone might still have a strong 2794 // reference to this process and we would like to allow it to cleanup 2795 // as much as it can without the object being destroyed. We try to 2796 // lock the shared pointer and if that works, then someone else still 2797 // has a strong reference to the process. 2798 2799 ProcessSP old_process_sp(process_wp.lock()); 2800 if (old_process_sp) 2801 old_process_sp->Finalize(); 2802 } 2803 else 2804 { 2805 if (log) 2806 log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__); 2807 2808 if (state == eStateConnected) 2809 { 2810 assert(m_process_sp); 2811 } 2812 else 2813 { 2814 // Use a Process plugin to construct the process. 2815 const char *plugin_name = launch_info.GetProcessPluginName(); 2816 CreateProcess (launch_info.GetListenerForProcess(debugger), plugin_name, NULL); 2817 } 2818 2819 // Since we didn't have a platform launch the process, launch it here. 2820 if (m_process_sp) 2821 error = m_process_sp->Launch (launch_info); 2822 } 2823 2824 if (!m_process_sp) 2825 { 2826 if (error.Success()) 2827 error.SetErrorString("failed to launch or debug process"); 2828 return error; 2829 } 2830 2831 if (error.Success()) 2832 { 2833 if (synchronous_execution || launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false) 2834 { 2835 ListenerSP hijack_listener_sp (launch_info.GetHijackListener()); 2836 if (!hijack_listener_sp) 2837 { 2838 hijack_listener_sp.reset(new Listener("lldb.Target.Launch.hijack")); 2839 launch_info.SetHijackListener(hijack_listener_sp); 2840 m_process_sp->HijackProcessEvents(hijack_listener_sp.get()); 2841 } 2842 2843 StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get(), NULL); 2844 2845 if (state == eStateStopped) 2846 { 2847 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) 2848 { 2849 if (synchronous_execution) 2850 { 2851 error = m_process_sp->PrivateResume(); 2852 if (error.Success()) 2853 { 2854 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get(), stream); 2855 const bool must_be_alive = false; // eStateExited is ok, so this must be false 2856 if (!StateIsStoppedState(state, must_be_alive)) 2857 { 2858 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state)); 2859 } 2860 } 2861 } 2862 else 2863 { 2864 m_process_sp->RestoreProcessEvents(); 2865 error = m_process_sp->PrivateResume(); 2866 } 2867 if (!error.Success()) 2868 { 2869 Error error2; 2870 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString()); 2871 error = error2; 2872 } 2873 } 2874 } 2875 else if (state == eStateExited) 2876 { 2877 bool with_shell = !!launch_info.GetShell(); 2878 const int exit_status = m_process_sp->GetExitStatus(); 2879 const char *exit_desc = m_process_sp->GetExitDescription(); 2880 #define LAUNCH_SHELL_MESSAGE "\n'r' and 'run' are aliases that default to launching through a shell.\nTry launching without going through a shell by using 'process launch'." 2881 if (exit_desc && exit_desc[0]) 2882 { 2883 if (with_shell) 2884 error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc); 2885 else 2886 error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc); 2887 } 2888 else 2889 { 2890 if (with_shell) 2891 error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status); 2892 else 2893 error.SetErrorStringWithFormat ("process exited with status %i", exit_status); 2894 } 2895 } 2896 else 2897 { 2898 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state)); 2899 } 2900 } 2901 m_process_sp->RestoreProcessEvents (); 2902 } 2903 else 2904 { 2905 Error error2; 2906 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString()); 2907 error = error2; 2908 } 2909 return error; 2910 } 2911 2912 Error 2913 Target::Attach (ProcessAttachInfo &attach_info, Stream *stream) 2914 { 2915 auto state = eStateInvalid; 2916 auto process_sp = GetProcessSP (); 2917 if (process_sp) 2918 { 2919 state = process_sp->GetState (); 2920 if (process_sp->IsAlive () && state != eStateConnected) 2921 { 2922 if (state == eStateAttaching) 2923 return Error ("process attach is in progress"); 2924 return Error ("a process is already being debugged"); 2925 } 2926 } 2927 2928 ListenerSP hijack_listener_sp (new Listener ("lldb.Target.Attach.attach.hijack")); 2929 attach_info.SetHijackListener (hijack_listener_sp); 2930 2931 const ModuleSP old_exec_module_sp = GetExecutableModule (); 2932 2933 // If no process info was specified, then use the target executable 2934 // name as the process to attach to by default 2935 if (!attach_info.ProcessInfoSpecified ()) 2936 { 2937 if (old_exec_module_sp) 2938 attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename (); 2939 2940 if (!attach_info.ProcessInfoSpecified ()) 2941 { 2942 return Error ("no process specified, create a target with a file, or specify the --pid or --name"); 2943 } 2944 } 2945 2946 const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform (); 2947 2948 Error error; 2949 if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ()) 2950 { 2951 SetPlatform (platform_sp); 2952 process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error); 2953 } 2954 else 2955 { 2956 if (state != eStateConnected) 2957 { 2958 const char *plugin_name = attach_info.GetProcessPluginName (); 2959 process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr); 2960 if (process_sp == nullptr) 2961 { 2962 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null"); 2963 return error; 2964 } 2965 } 2966 process_sp->HijackProcessEvents (hijack_listener_sp.get ()); 2967 error = process_sp->Attach (attach_info); 2968 } 2969 2970 if (error.Success () && process_sp) 2971 { 2972 state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener ().get (), stream); 2973 process_sp->RestoreProcessEvents (); 2974 2975 if (state != eStateStopped) 2976 { 2977 const char *exit_desc = process_sp->GetExitDescription (); 2978 if (exit_desc) 2979 error.SetErrorStringWithFormat ("attach failed: %s", exit_desc); 2980 else 2981 error.SetErrorString ("attach failed: process did not stop (no such process or permission problem?)"); 2982 process_sp->Destroy (false); 2983 } 2984 } 2985 return error; 2986 } 2987 2988 //-------------------------------------------------------------- 2989 // Target::StopHook 2990 //-------------------------------------------------------------- 2991 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) : 2992 UserID (uid), 2993 m_target_sp (target_sp), 2994 m_commands (), 2995 m_specifier_sp (), 2996 m_thread_spec_ap(), 2997 m_active (true) 2998 { 2999 } 3000 3001 Target::StopHook::StopHook (const StopHook &rhs) : 3002 UserID (rhs.GetID()), 3003 m_target_sp (rhs.m_target_sp), 3004 m_commands (rhs.m_commands), 3005 m_specifier_sp (rhs.m_specifier_sp), 3006 m_thread_spec_ap (), 3007 m_active (rhs.m_active) 3008 { 3009 if (rhs.m_thread_spec_ap.get() != NULL) 3010 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get())); 3011 } 3012 3013 3014 Target::StopHook::~StopHook () 3015 { 3016 } 3017 3018 void 3019 Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) 3020 { 3021 m_specifier_sp.reset(specifier); 3022 } 3023 3024 void 3025 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier) 3026 { 3027 m_thread_spec_ap.reset (specifier); 3028 } 3029 3030 3031 void 3032 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const 3033 { 3034 int indent_level = s->GetIndentLevel(); 3035 3036 s->SetIndentLevel(indent_level + 2); 3037 3038 s->Printf ("Hook: %" PRIu64 "\n", GetID()); 3039 if (m_active) 3040 s->Indent ("State: enabled\n"); 3041 else 3042 s->Indent ("State: disabled\n"); 3043 3044 if (m_specifier_sp) 3045 { 3046 s->Indent(); 3047 s->PutCString ("Specifier:\n"); 3048 s->SetIndentLevel (indent_level + 4); 3049 m_specifier_sp->GetDescription (s, level); 3050 s->SetIndentLevel (indent_level + 2); 3051 } 3052 3053 if (m_thread_spec_ap.get() != NULL) 3054 { 3055 StreamString tmp; 3056 s->Indent("Thread:\n"); 3057 m_thread_spec_ap->GetDescription (&tmp, level); 3058 s->SetIndentLevel (indent_level + 4); 3059 s->Indent (tmp.GetData()); 3060 s->PutCString ("\n"); 3061 s->SetIndentLevel (indent_level + 2); 3062 } 3063 3064 s->Indent ("Commands: \n"); 3065 s->SetIndentLevel (indent_level + 4); 3066 uint32_t num_commands = m_commands.GetSize(); 3067 for (uint32_t i = 0; i < num_commands; i++) 3068 { 3069 s->Indent(m_commands.GetStringAtIndex(i)); 3070 s->PutCString ("\n"); 3071 } 3072 s->SetIndentLevel (indent_level); 3073 } 3074 3075 //-------------------------------------------------------------- 3076 // class TargetProperties 3077 //-------------------------------------------------------------- 3078 3079 OptionEnumValueElement 3080 lldb_private::g_dynamic_value_types[] = 3081 { 3082 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"}, 3083 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."}, 3084 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."}, 3085 { 0, NULL, NULL } 3086 }; 3087 3088 static OptionEnumValueElement 3089 g_inline_breakpoint_enums[] = 3090 { 3091 { 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."}, 3092 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."}, 3093 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."}, 3094 { 0, NULL, NULL } 3095 }; 3096 3097 typedef enum x86DisassemblyFlavor 3098 { 3099 eX86DisFlavorDefault, 3100 eX86DisFlavorIntel, 3101 eX86DisFlavorATT 3102 } x86DisassemblyFlavor; 3103 3104 static OptionEnumValueElement 3105 g_x86_dis_flavor_value_types[] = 3106 { 3107 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."}, 3108 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."}, 3109 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."}, 3110 { 0, NULL, NULL } 3111 }; 3112 3113 static OptionEnumValueElement 3114 g_hex_immediate_style_values[] = 3115 { 3116 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."}, 3117 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."}, 3118 { 0, NULL, NULL } 3119 }; 3120 3121 static OptionEnumValueElement 3122 g_load_script_from_sym_file_values[] = 3123 { 3124 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"}, 3125 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."}, 3126 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."}, 3127 { 0, NULL, NULL } 3128 }; 3129 3130 3131 static OptionEnumValueElement 3132 g_memory_module_load_level_values[] = 3133 { 3134 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."}, 3135 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."}, 3136 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."}, 3137 { 0, NULL, NULL } 3138 }; 3139 3140 static PropertyDefinition 3141 g_properties[] = 3142 { 3143 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." }, 3144 { "move-to-nearest-code" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Move breakpoints to nearest code." }, 3145 { "language" , OptionValue::eTypeLanguage , false, eLanguageTypeUnknown , NULL, NULL, "The language to use when interpreting expressions entered in commands." }, 3146 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." }, 3147 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eDynamicDontRunTarget , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." }, 3148 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." }, 3149 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." }, 3150 { "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 " 3151 "where it exists on the current system. It consists of an array of duples, the first element of each duple is " 3152 "some part (starting at the root) of the path to the file when it was built, " 3153 "and the second is where the remainder of the original build hierarchy is rooted on the local system. " 3154 "Each element of the array is checked in order and the first one that results in a match wins." }, 3155 { "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." }, 3156 { "debug-file-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating debug symbol files." }, 3157 { "clang-module-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating modules for Clang." }, 3158 { "auto-import-clang-modules" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Automatically load Clang modules referred to by the program." }, 3159 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." }, 3160 { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." }, 3161 { "max-memory-read-size" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." }, 3162 { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." }, 3163 { "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." }, 3164 { "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." }, 3165 { "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." }, 3166 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." }, 3167 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." }, 3168 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." }, 3169 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." }, 3170 { "detach-on-error" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "debugserver will detach (rather than killing) a process if it loses connection with lldb." }, 3171 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" }, 3172 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" }, 3173 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsAlways , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. " 3174 "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. " 3175 "Usually this is limited to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. " 3176 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. " 3177 "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers " 3178 "and find that setting breakpoints is slow, then you can change this setting to headers. " 3179 "This setting allows you to control exactly which strategy is used when setting " 3180 "file and line breakpoints." }, 3181 // 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. 3182 { "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." }, 3183 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." }, 3184 { "hex-immediate-style" , OptionValue::eTypeEnum , false, Disassembler::eHexStyleC, NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." }, 3185 { "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." }, 3186 { "load-script-from-symbol-file" , OptionValue::eTypeEnum , false, eLoadScriptFromSymFileWarn, NULL, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." }, 3187 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values, 3188 "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. " 3189 "This setting helps users control how much information gets loaded when loading modules from memory." 3190 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). " 3191 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). " 3192 "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " }, 3193 { "display-expression-in-crashlogs" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." }, 3194 { "trap-handler-names" , OptionValue::eTypeArray , true, OptionValue::eTypeString, NULL, NULL, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." }, 3195 { "display-runtime-support-values" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "If true, LLDB will show variables that are meant to support the operation of a language's runtime support." }, 3196 { "non-stop-mode" , OptionValue::eTypeBoolean , false, 0, NULL, NULL, "Disable lock-step debugging, instead control threads independently." }, 3197 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL } 3198 }; 3199 3200 enum 3201 { 3202 ePropertyDefaultArch, 3203 ePropertyMoveToNearestCode, 3204 ePropertyLanguage, 3205 ePropertyExprPrefix, 3206 ePropertyPreferDynamic, 3207 ePropertyEnableSynthetic, 3208 ePropertySkipPrologue, 3209 ePropertySourceMap, 3210 ePropertyExecutableSearchPaths, 3211 ePropertyDebugFileSearchPaths, 3212 ePropertyClangModuleSearchPaths, 3213 ePropertyAutoImportClangModules, 3214 ePropertyMaxChildrenCount, 3215 ePropertyMaxSummaryLength, 3216 ePropertyMaxMemReadSize, 3217 ePropertyBreakpointUseAvoidList, 3218 ePropertyArg0, 3219 ePropertyRunArgs, 3220 ePropertyEnvVars, 3221 ePropertyInheritEnv, 3222 ePropertyInputPath, 3223 ePropertyOutputPath, 3224 ePropertyErrorPath, 3225 ePropertyDetachOnError, 3226 ePropertyDisableASLR, 3227 ePropertyDisableSTDIO, 3228 ePropertyInlineStrategy, 3229 ePropertyDisassemblyFlavor, 3230 ePropertyUseHexImmediates, 3231 ePropertyHexImmediateStyle, 3232 ePropertyUseFastStepping, 3233 ePropertyLoadScriptFromSymbolFile, 3234 ePropertyMemoryModuleLoadLevel, 3235 ePropertyDisplayExpressionsInCrashlogs, 3236 ePropertyTrapHandlerNames, 3237 ePropertyDisplayRuntimeSupportValues, 3238 ePropertyNonStopModeEnabled 3239 }; 3240 3241 3242 class TargetOptionValueProperties : public OptionValueProperties 3243 { 3244 public: 3245 TargetOptionValueProperties (const ConstString &name) : 3246 OptionValueProperties (name), 3247 m_target (NULL), 3248 m_got_host_env (false) 3249 { 3250 } 3251 3252 // This constructor is used when creating TargetOptionValueProperties when it 3253 // is part of a new lldb_private::Target instance. It will copy all current 3254 // global property values as needed 3255 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) : 3256 OptionValueProperties(*target_properties_sp->GetValueProperties()), 3257 m_target (target), 3258 m_got_host_env (false) 3259 { 3260 } 3261 3262 virtual const Property * 3263 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const 3264 { 3265 // When getting the value for a key from the target options, we will always 3266 // try and grab the setting from the current target if there is one. Else we just 3267 // use the one from this instance. 3268 if (idx == ePropertyEnvVars) 3269 GetHostEnvironmentIfNeeded (); 3270 3271 if (exe_ctx) 3272 { 3273 Target *target = exe_ctx->GetTargetPtr(); 3274 if (target) 3275 { 3276 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get()); 3277 if (this != target_properties) 3278 return target_properties->ProtectedGetPropertyAtIndex (idx); 3279 } 3280 } 3281 return ProtectedGetPropertyAtIndex (idx); 3282 } 3283 3284 lldb::TargetSP 3285 GetTargetSP () 3286 { 3287 return m_target->shared_from_this(); 3288 } 3289 3290 protected: 3291 3292 void 3293 GetHostEnvironmentIfNeeded () const 3294 { 3295 if (!m_got_host_env) 3296 { 3297 if (m_target) 3298 { 3299 m_got_host_env = true; 3300 const uint32_t idx = ePropertyInheritEnv; 3301 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0)) 3302 { 3303 PlatformSP platform_sp (m_target->GetPlatform()); 3304 if (platform_sp) 3305 { 3306 StringList env; 3307 if (platform_sp->GetEnvironment(env)) 3308 { 3309 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars); 3310 if (env_dict) 3311 { 3312 const bool can_replace = false; 3313 const size_t envc = env.GetSize(); 3314 for (size_t idx=0; idx<envc; idx++) 3315 { 3316 const char *env_entry = env.GetStringAtIndex (idx); 3317 if (env_entry) 3318 { 3319 const char *equal_pos = ::strchr(env_entry, '='); 3320 ConstString key; 3321 // It is ok to have environment variables with no values 3322 const char *value = NULL; 3323 if (equal_pos) 3324 { 3325 key.SetCStringWithLength(env_entry, equal_pos - env_entry); 3326 if (equal_pos[1]) 3327 value = equal_pos + 1; 3328 } 3329 else 3330 { 3331 key.SetCString(env_entry); 3332 } 3333 // Don't allow existing keys to be replaced with ones we get from the platform environment 3334 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace); 3335 } 3336 } 3337 } 3338 } 3339 } 3340 } 3341 } 3342 } 3343 } 3344 Target *m_target; 3345 mutable bool m_got_host_env; 3346 }; 3347 3348 //---------------------------------------------------------------------- 3349 // TargetProperties 3350 //---------------------------------------------------------------------- 3351 TargetProperties::TargetProperties (Target *target) : 3352 Properties (), 3353 m_launch_info () 3354 { 3355 if (target) 3356 { 3357 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties())); 3358 3359 // Set callbacks to update launch_info whenever "settins set" updated any of these properties 3360 m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this); 3361 m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this); 3362 m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this); 3363 m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this); 3364 m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this); 3365 m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this); 3366 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this); 3367 m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this); 3368 m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this); 3369 3370 // Update m_launch_info once it was created 3371 Arg0ValueChangedCallback(this, NULL); 3372 RunArgsValueChangedCallback(this, NULL); 3373 //EnvVarsValueChangedCallback(this, NULL); // FIXME: cause segfault in Target::GetPlatform() 3374 InputPathValueChangedCallback(this, NULL); 3375 OutputPathValueChangedCallback(this, NULL); 3376 ErrorPathValueChangedCallback(this, NULL); 3377 DetachOnErrorValueChangedCallback(this, NULL); 3378 DisableASLRValueChangedCallback(this, NULL); 3379 DisableSTDIOValueChangedCallback(this, NULL); 3380 } 3381 else 3382 { 3383 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target"))); 3384 m_collection_sp->Initialize(g_properties); 3385 m_collection_sp->AppendProperty(ConstString("process"), 3386 ConstString("Settings specify to processes."), 3387 true, 3388 Process::GetGlobalProperties()->GetValueProperties()); 3389 } 3390 3391 } 3392 3393 TargetProperties::~TargetProperties () 3394 { 3395 } 3396 ArchSpec 3397 TargetProperties::GetDefaultArchitecture () const 3398 { 3399 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 3400 if (value) 3401 return value->GetCurrentValue(); 3402 return ArchSpec(); 3403 } 3404 3405 void 3406 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch) 3407 { 3408 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 3409 if (value) 3410 return value->SetCurrentValue(arch, true); 3411 } 3412 3413 bool 3414 TargetProperties::GetMoveToNearestCode() const 3415 { 3416 const uint32_t idx = ePropertyMoveToNearestCode; 3417 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3418 } 3419 3420 lldb::DynamicValueType 3421 TargetProperties::GetPreferDynamicValue() const 3422 { 3423 const uint32_t idx = ePropertyPreferDynamic; 3424 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 3425 } 3426 3427 bool 3428 TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d) 3429 { 3430 const uint32_t idx = ePropertyPreferDynamic; 3431 return m_collection_sp->SetPropertyAtIndexAsEnumeration(NULL, idx, d); 3432 } 3433 3434 3435 bool 3436 TargetProperties::GetDisableASLR () const 3437 { 3438 const uint32_t idx = ePropertyDisableASLR; 3439 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3440 } 3441 3442 void 3443 TargetProperties::SetDisableASLR (bool b) 3444 { 3445 const uint32_t idx = ePropertyDisableASLR; 3446 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 3447 } 3448 3449 bool 3450 TargetProperties::GetDetachOnError () const 3451 { 3452 const uint32_t idx = ePropertyDetachOnError; 3453 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3454 } 3455 3456 void 3457 TargetProperties::SetDetachOnError (bool b) 3458 { 3459 const uint32_t idx = ePropertyDetachOnError; 3460 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 3461 } 3462 3463 bool 3464 TargetProperties::GetDisableSTDIO () const 3465 { 3466 const uint32_t idx = ePropertyDisableSTDIO; 3467 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3468 } 3469 3470 void 3471 TargetProperties::SetDisableSTDIO (bool b) 3472 { 3473 const uint32_t idx = ePropertyDisableSTDIO; 3474 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 3475 } 3476 3477 const char * 3478 TargetProperties::GetDisassemblyFlavor () const 3479 { 3480 const uint32_t idx = ePropertyDisassemblyFlavor; 3481 const char *return_value; 3482 3483 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 3484 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value; 3485 return return_value; 3486 } 3487 3488 InlineStrategy 3489 TargetProperties::GetInlineStrategy () const 3490 { 3491 const uint32_t idx = ePropertyInlineStrategy; 3492 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 3493 } 3494 3495 const char * 3496 TargetProperties::GetArg0 () const 3497 { 3498 const uint32_t idx = ePropertyArg0; 3499 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL); 3500 } 3501 3502 void 3503 TargetProperties::SetArg0 (const char *arg) 3504 { 3505 const uint32_t idx = ePropertyArg0; 3506 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg); 3507 m_launch_info.SetArg0(arg); 3508 } 3509 3510 bool 3511 TargetProperties::GetRunArguments (Args &args) const 3512 { 3513 const uint32_t idx = ePropertyRunArgs; 3514 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args); 3515 } 3516 3517 void 3518 TargetProperties::SetRunArguments (const Args &args) 3519 { 3520 const uint32_t idx = ePropertyRunArgs; 3521 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args); 3522 m_launch_info.GetArguments() = args; 3523 } 3524 3525 size_t 3526 TargetProperties::GetEnvironmentAsArgs (Args &env) const 3527 { 3528 const uint32_t idx = ePropertyEnvVars; 3529 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env); 3530 } 3531 3532 void 3533 TargetProperties::SetEnvironmentFromArgs (const Args &env) 3534 { 3535 const uint32_t idx = ePropertyEnvVars; 3536 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, env); 3537 m_launch_info.GetEnvironmentEntries() = env; 3538 } 3539 3540 bool 3541 TargetProperties::GetSkipPrologue() const 3542 { 3543 const uint32_t idx = ePropertySkipPrologue; 3544 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3545 } 3546 3547 PathMappingList & 3548 TargetProperties::GetSourcePathMap () const 3549 { 3550 const uint32_t idx = ePropertySourceMap; 3551 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx); 3552 assert(option_value); 3553 return option_value->GetCurrentValue(); 3554 } 3555 3556 FileSpecList & 3557 TargetProperties::GetExecutableSearchPaths () 3558 { 3559 const uint32_t idx = ePropertyExecutableSearchPaths; 3560 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 3561 assert(option_value); 3562 return option_value->GetCurrentValue(); 3563 } 3564 3565 FileSpecList & 3566 TargetProperties::GetDebugFileSearchPaths () 3567 { 3568 const uint32_t idx = ePropertyDebugFileSearchPaths; 3569 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 3570 assert(option_value); 3571 return option_value->GetCurrentValue(); 3572 } 3573 3574 FileSpecList & 3575 TargetProperties::GetClangModuleSearchPaths () 3576 { 3577 const uint32_t idx = ePropertyClangModuleSearchPaths; 3578 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 3579 assert(option_value); 3580 return option_value->GetCurrentValue(); 3581 } 3582 3583 bool 3584 TargetProperties::GetEnableAutoImportClangModules() const 3585 { 3586 const uint32_t idx = ePropertyAutoImportClangModules; 3587 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3588 } 3589 3590 bool 3591 TargetProperties::GetEnableSyntheticValue () const 3592 { 3593 const uint32_t idx = ePropertyEnableSynthetic; 3594 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3595 } 3596 3597 uint32_t 3598 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const 3599 { 3600 const uint32_t idx = ePropertyMaxChildrenCount; 3601 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 3602 } 3603 3604 uint32_t 3605 TargetProperties::GetMaximumSizeOfStringSummary() const 3606 { 3607 const uint32_t idx = ePropertyMaxSummaryLength; 3608 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 3609 } 3610 3611 uint32_t 3612 TargetProperties::GetMaximumMemReadSize () const 3613 { 3614 const uint32_t idx = ePropertyMaxMemReadSize; 3615 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 3616 } 3617 3618 FileSpec 3619 TargetProperties::GetStandardInputPath () const 3620 { 3621 const uint32_t idx = ePropertyInputPath; 3622 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 3623 } 3624 3625 void 3626 TargetProperties::SetStandardInputPath (const char *p) 3627 { 3628 const uint32_t idx = ePropertyInputPath; 3629 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 3630 } 3631 3632 FileSpec 3633 TargetProperties::GetStandardOutputPath () const 3634 { 3635 const uint32_t idx = ePropertyOutputPath; 3636 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 3637 } 3638 3639 void 3640 TargetProperties::SetStandardOutputPath (const char *p) 3641 { 3642 const uint32_t idx = ePropertyOutputPath; 3643 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 3644 } 3645 3646 FileSpec 3647 TargetProperties::GetStandardErrorPath () const 3648 { 3649 const uint32_t idx = ePropertyErrorPath; 3650 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx); 3651 } 3652 3653 LanguageType 3654 TargetProperties::GetLanguage () const 3655 { 3656 OptionValueLanguage *value = m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage (NULL, ePropertyLanguage); 3657 if (value) 3658 return value->GetCurrentValue(); 3659 return LanguageType(); 3660 } 3661 3662 const char * 3663 TargetProperties::GetExpressionPrefixContentsAsCString () 3664 { 3665 const uint32_t idx = ePropertyExprPrefix; 3666 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx); 3667 if (file) 3668 { 3669 const bool null_terminate = true; 3670 DataBufferSP data_sp(file->GetFileContents(null_terminate)); 3671 if (data_sp) 3672 return (const char *) data_sp->GetBytes(); 3673 } 3674 return NULL; 3675 } 3676 3677 void 3678 TargetProperties::SetStandardErrorPath (const char *p) 3679 { 3680 const uint32_t idx = ePropertyErrorPath; 3681 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 3682 } 3683 3684 bool 3685 TargetProperties::GetBreakpointsConsultPlatformAvoidList () 3686 { 3687 const uint32_t idx = ePropertyBreakpointUseAvoidList; 3688 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3689 } 3690 3691 bool 3692 TargetProperties::GetUseHexImmediates () const 3693 { 3694 const uint32_t idx = ePropertyUseHexImmediates; 3695 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3696 } 3697 3698 bool 3699 TargetProperties::GetUseFastStepping () const 3700 { 3701 const uint32_t idx = ePropertyUseFastStepping; 3702 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3703 } 3704 3705 bool 3706 TargetProperties::GetDisplayExpressionsInCrashlogs () const 3707 { 3708 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs; 3709 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3710 } 3711 3712 LoadScriptFromSymFile 3713 TargetProperties::GetLoadScriptFromSymbolFile () const 3714 { 3715 const uint32_t idx = ePropertyLoadScriptFromSymbolFile; 3716 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3717 } 3718 3719 Disassembler::HexImmediateStyle 3720 TargetProperties::GetHexImmediateStyle () const 3721 { 3722 const uint32_t idx = ePropertyHexImmediateStyle; 3723 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3724 } 3725 3726 MemoryModuleLoadLevel 3727 TargetProperties::GetMemoryModuleLoadLevel() const 3728 { 3729 const uint32_t idx = ePropertyMemoryModuleLoadLevel; 3730 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3731 } 3732 3733 bool 3734 TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const 3735 { 3736 const uint32_t idx = ePropertyTrapHandlerNames; 3737 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args); 3738 } 3739 3740 void 3741 TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args) 3742 { 3743 const uint32_t idx = ePropertyTrapHandlerNames; 3744 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args); 3745 } 3746 3747 bool 3748 TargetProperties::GetDisplayRuntimeSupportValues () const 3749 { 3750 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 3751 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false); 3752 } 3753 3754 void 3755 TargetProperties::SetDisplayRuntimeSupportValues (bool b) 3756 { 3757 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 3758 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 3759 } 3760 3761 bool 3762 TargetProperties::GetNonStopModeEnabled () const 3763 { 3764 const uint32_t idx = ePropertyNonStopModeEnabled; 3765 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false); 3766 } 3767 3768 void 3769 TargetProperties::SetNonStopModeEnabled (bool b) 3770 { 3771 const uint32_t idx = ePropertyNonStopModeEnabled; 3772 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 3773 } 3774 3775 const ProcessLaunchInfo & 3776 TargetProperties::GetProcessLaunchInfo () 3777 { 3778 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work 3779 return m_launch_info; 3780 } 3781 3782 void 3783 TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info) 3784 { 3785 m_launch_info = launch_info; 3786 SetArg0(launch_info.GetArg0()); 3787 SetRunArguments(launch_info.GetArguments()); 3788 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries()); 3789 const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO); 3790 if (input_file_action) 3791 { 3792 const char *input_path = input_file_action->GetPath(); 3793 if (input_path) 3794 SetStandardInputPath(input_path); 3795 } 3796 const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO); 3797 if (output_file_action) 3798 { 3799 const char *output_path = output_file_action->GetPath(); 3800 if (output_path) 3801 SetStandardOutputPath(output_path); 3802 } 3803 const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO); 3804 if (error_file_action) 3805 { 3806 const char *error_path = error_file_action->GetPath(); 3807 if (error_path) 3808 SetStandardErrorPath(error_path); 3809 } 3810 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError)); 3811 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR)); 3812 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO)); 3813 } 3814 3815 void 3816 TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *) 3817 { 3818 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3819 this_->m_launch_info.SetArg0(this_->GetArg0()); 3820 } 3821 3822 void 3823 TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *) 3824 { 3825 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3826 Args args; 3827 if (this_->GetRunArguments(args)) 3828 this_->m_launch_info.GetArguments() = args; 3829 } 3830 3831 void 3832 TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *) 3833 { 3834 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3835 Args args; 3836 if (this_->GetEnvironmentAsArgs(args)) 3837 this_->m_launch_info.GetEnvironmentEntries() = args; 3838 } 3839 3840 void 3841 TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *) 3842 { 3843 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3844 this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath(), true, false); 3845 } 3846 3847 void 3848 TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *) 3849 { 3850 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3851 this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath(), false, true); 3852 } 3853 3854 void 3855 TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *) 3856 { 3857 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3858 this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath(), false, true); 3859 } 3860 3861 void 3862 TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *) 3863 { 3864 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3865 if (this_->GetDetachOnError()) 3866 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError); 3867 else 3868 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError); 3869 } 3870 3871 void 3872 TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *) 3873 { 3874 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3875 if (this_->GetDisableASLR()) 3876 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR); 3877 else 3878 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR); 3879 } 3880 3881 void 3882 TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *) 3883 { 3884 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr); 3885 if (this_->GetDisableSTDIO()) 3886 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO); 3887 else 3888 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO); 3889 } 3890 3891 //---------------------------------------------------------------------- 3892 // Target::TargetEventData 3893 //---------------------------------------------------------------------- 3894 3895 Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) : 3896 EventData (), 3897 m_target_sp (target_sp), 3898 m_module_list () 3899 { 3900 } 3901 3902 Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) : 3903 EventData (), 3904 m_target_sp (target_sp), 3905 m_module_list (module_list) 3906 { 3907 } 3908 3909 Target::TargetEventData::~TargetEventData() 3910 { 3911 } 3912 3913 const ConstString & 3914 Target::TargetEventData::GetFlavorString () 3915 { 3916 static ConstString g_flavor ("Target::TargetEventData"); 3917 return g_flavor; 3918 } 3919 3920 void 3921 Target::TargetEventData::Dump (Stream *s) const 3922 { 3923 } 3924 3925 const Target::TargetEventData * 3926 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr) 3927 { 3928 if (event_ptr) 3929 { 3930 const EventData *event_data = event_ptr->GetData(); 3931 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString()) 3932 return static_cast <const TargetEventData *> (event_ptr->GetData()); 3933 } 3934 return NULL; 3935 } 3936 3937 TargetSP 3938 Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr) 3939 { 3940 TargetSP target_sp; 3941 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr); 3942 if (event_data) 3943 target_sp = event_data->m_target_sp; 3944 return target_sp; 3945 } 3946 3947 ModuleList 3948 Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr) 3949 { 3950 ModuleList module_list; 3951 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr); 3952 if (event_data) 3953 module_list = event_data->m_module_list; 3954 return module_list; 3955 } 3956