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