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