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