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