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 Status error = ModuleList::GetSharedModule(module_spec, executable_sp, 1578 &GetExecutableSearchPaths(), 1579 nullptr, nullptr); 1580 1581 if (!error.Fail() && executable_sp) { 1582 SetExecutableModule(executable_sp, eLoadDependentsYes); 1583 return true; 1584 } 1585 } 1586 return false; 1587 } 1588 1589 bool Target::MergeArchitecture(const ArchSpec &arch_spec) { 1590 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 1591 if (arch_spec.IsValid()) { 1592 if (m_arch.GetSpec().IsCompatibleMatch(arch_spec)) { 1593 // The current target arch is compatible with "arch_spec", see if we can 1594 // improve our current architecture using bits from "arch_spec" 1595 1596 if (log) 1597 log->Printf("Target::MergeArchitecture target has arch %s, merging with " 1598 "arch %s", 1599 m_arch.GetSpec().GetTriple().getTriple().c_str(), 1600 arch_spec.GetTriple().getTriple().c_str()); 1601 1602 // Merge bits from arch_spec into "merged_arch" and set our architecture 1603 ArchSpec merged_arch(m_arch.GetSpec()); 1604 merged_arch.MergeFrom(arch_spec); 1605 return SetArchitecture(merged_arch); 1606 } else { 1607 // The new architecture is different, we just need to replace it 1608 return SetArchitecture(arch_spec); 1609 } 1610 } 1611 return false; 1612 } 1613 1614 void Target::NotifyWillClearList(const ModuleList &module_list) {} 1615 1616 void Target::NotifyModuleAdded(const ModuleList &module_list, 1617 const ModuleSP &module_sp) { 1618 // A module is being added to this target for the first time 1619 if (m_valid) { 1620 ModuleList my_module_list; 1621 my_module_list.Append(module_sp); 1622 ModulesDidLoad(my_module_list); 1623 } 1624 } 1625 1626 void Target::NotifyModuleRemoved(const ModuleList &module_list, 1627 const ModuleSP &module_sp) { 1628 // A module is being removed from this target. 1629 if (m_valid) { 1630 ModuleList my_module_list; 1631 my_module_list.Append(module_sp); 1632 ModulesDidUnload(my_module_list, false); 1633 } 1634 } 1635 1636 void Target::NotifyModuleUpdated(const ModuleList &module_list, 1637 const ModuleSP &old_module_sp, 1638 const ModuleSP &new_module_sp) { 1639 // A module is replacing an already added module 1640 if (m_valid) { 1641 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, 1642 new_module_sp); 1643 m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced( 1644 old_module_sp, new_module_sp); 1645 } 1646 } 1647 1648 void Target::NotifyModulesRemoved(lldb_private::ModuleList &module_list) { 1649 ModulesDidUnload (module_list, false); 1650 } 1651 1652 1653 void Target::ModulesDidLoad(ModuleList &module_list) { 1654 const size_t num_images = module_list.GetSize(); 1655 if (m_valid && num_images) { 1656 for (size_t idx = 0; idx < num_images; ++idx) { 1657 ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); 1658 LoadScriptingResourceForModule(module_sp, this); 1659 } 1660 m_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1661 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1662 if (m_process_sp) { 1663 m_process_sp->ModulesDidLoad(module_list); 1664 } 1665 BroadcastEvent(eBroadcastBitModulesLoaded, 1666 new TargetEventData(this->shared_from_this(), module_list)); 1667 } 1668 } 1669 1670 void Target::SymbolsDidLoad(ModuleList &module_list) { 1671 if (m_valid && module_list.GetSize()) { 1672 if (m_process_sp) { 1673 LanguageRuntime *runtime = 1674 m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1675 if (runtime) { 1676 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime *)runtime; 1677 objc_runtime->SymbolsDidLoad(module_list); 1678 } 1679 } 1680 1681 m_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1682 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1683 BroadcastEvent(eBroadcastBitSymbolsLoaded, 1684 new TargetEventData(this->shared_from_this(), module_list)); 1685 } 1686 } 1687 1688 void Target::ModulesDidUnload(ModuleList &module_list, bool delete_locations) { 1689 if (m_valid && module_list.GetSize()) { 1690 UnloadModuleSections(module_list); 1691 m_breakpoint_list.UpdateBreakpoints(module_list, false, delete_locations); 1692 m_internal_breakpoint_list.UpdateBreakpoints(module_list, false, 1693 delete_locations); 1694 BroadcastEvent(eBroadcastBitModulesUnloaded, 1695 new TargetEventData(this->shared_from_this(), module_list)); 1696 } 1697 } 1698 1699 bool Target::ModuleIsExcludedForUnconstrainedSearches( 1700 const FileSpec &module_file_spec) { 1701 if (GetBreakpointsConsultPlatformAvoidList()) { 1702 ModuleList matchingModules; 1703 ModuleSpec module_spec(module_file_spec); 1704 size_t num_modules = GetImages().FindModules(module_spec, matchingModules); 1705 1706 // If there is more than one module for this file spec, only return true if 1707 // ALL the modules are on the 1708 // black list. 1709 if (num_modules > 0) { 1710 for (size_t i = 0; i < num_modules; i++) { 1711 if (!ModuleIsExcludedForUnconstrainedSearches( 1712 matchingModules.GetModuleAtIndex(i))) 1713 return false; 1714 } 1715 return true; 1716 } 1717 } 1718 return false; 1719 } 1720 1721 bool Target::ModuleIsExcludedForUnconstrainedSearches( 1722 const lldb::ModuleSP &module_sp) { 1723 if (GetBreakpointsConsultPlatformAvoidList()) { 1724 if (m_platform_sp) 1725 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*this, 1726 module_sp); 1727 } 1728 return false; 1729 } 1730 1731 size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst, 1732 size_t dst_len, Status &error) { 1733 SectionSP section_sp(addr.GetSection()); 1734 if (section_sp) { 1735 // If the contents of this section are encrypted, the on-disk file is 1736 // unusable. Read only from live memory. 1737 if (section_sp->IsEncrypted()) { 1738 error.SetErrorString("section is encrypted"); 1739 return 0; 1740 } 1741 ModuleSP module_sp(section_sp->GetModule()); 1742 if (module_sp) { 1743 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile(); 1744 if (objfile) { 1745 size_t bytes_read = objfile->ReadSectionData( 1746 section_sp.get(), addr.GetOffset(), dst, dst_len); 1747 if (bytes_read > 0) 1748 return bytes_read; 1749 else 1750 error.SetErrorStringWithFormat("error reading data from section %s", 1751 section_sp->GetName().GetCString()); 1752 } else 1753 error.SetErrorString("address isn't from a object file"); 1754 } else 1755 error.SetErrorString("address isn't in a module"); 1756 } else 1757 error.SetErrorString("address doesn't contain a section that points to a " 1758 "section in a object file"); 1759 1760 return 0; 1761 } 1762 1763 size_t Target::ReadMemory(const Address &addr, bool prefer_file_cache, 1764 void *dst, size_t dst_len, Status &error, 1765 lldb::addr_t *load_addr_ptr) { 1766 error.Clear(); 1767 1768 // if we end up reading this from process memory, we will fill this with the 1769 // actual load address 1770 if (load_addr_ptr) 1771 *load_addr_ptr = LLDB_INVALID_ADDRESS; 1772 1773 size_t bytes_read = 0; 1774 1775 addr_t load_addr = LLDB_INVALID_ADDRESS; 1776 addr_t file_addr = LLDB_INVALID_ADDRESS; 1777 Address resolved_addr; 1778 if (!addr.IsSectionOffset()) { 1779 SectionLoadList §ion_load_list = GetSectionLoadList(); 1780 if (section_load_list.IsEmpty()) { 1781 // No sections are loaded, so we must assume we are not running yet and 1782 // anything we are given is a file address. 1783 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its 1784 // offset is the file address 1785 m_images.ResolveFileAddress(file_addr, resolved_addr); 1786 } else { 1787 // We have at least one section loaded. This can be because we have 1788 // manually loaded some sections with "target modules load ..." or 1789 // because we have have a live process that has sections loaded through 1790 // the dynamic loader 1791 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its 1792 // offset is the load address 1793 section_load_list.ResolveLoadAddress(load_addr, resolved_addr); 1794 } 1795 } 1796 if (!resolved_addr.IsValid()) 1797 resolved_addr = addr; 1798 1799 if (prefer_file_cache) { 1800 bytes_read = ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error); 1801 if (bytes_read > 0) 1802 return bytes_read; 1803 } 1804 1805 if (ProcessIsValid()) { 1806 if (load_addr == LLDB_INVALID_ADDRESS) 1807 load_addr = resolved_addr.GetLoadAddress(this); 1808 1809 if (load_addr == LLDB_INVALID_ADDRESS) { 1810 ModuleSP addr_module_sp(resolved_addr.GetModule()); 1811 if (addr_module_sp && addr_module_sp->GetFileSpec()) 1812 error.SetErrorStringWithFormatv( 1813 "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded", 1814 addr_module_sp->GetFileSpec(), resolved_addr.GetFileAddress()); 1815 else 1816 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", 1817 resolved_addr.GetFileAddress()); 1818 } else { 1819 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error); 1820 if (bytes_read != dst_len) { 1821 if (error.Success()) { 1822 if (bytes_read == 0) 1823 error.SetErrorStringWithFormat( 1824 "read memory from 0x%" PRIx64 " failed", load_addr); 1825 else 1826 error.SetErrorStringWithFormat( 1827 "only %" PRIu64 " of %" PRIu64 1828 " bytes were read from memory at 0x%" PRIx64, 1829 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr); 1830 } 1831 } 1832 if (bytes_read) { 1833 if (load_addr_ptr) 1834 *load_addr_ptr = load_addr; 1835 return bytes_read; 1836 } 1837 // If the address is not section offset we have an address that doesn't 1838 // resolve to any address in any currently loaded shared libraries and we 1839 // failed to read memory so there isn't anything more we can do. If it is 1840 // section offset, we might be able to read cached memory from the object 1841 // file. 1842 if (!resolved_addr.IsSectionOffset()) 1843 return 0; 1844 } 1845 } 1846 1847 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) { 1848 // If we didn't already try and read from the object file cache, then try 1849 // it after failing to read from the process. 1850 return ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error); 1851 } 1852 return 0; 1853 } 1854 1855 size_t Target::ReadCStringFromMemory(const Address &addr, std::string &out_str, 1856 Status &error) { 1857 char buf[256]; 1858 out_str.clear(); 1859 addr_t curr_addr = addr.GetLoadAddress(this); 1860 Address address(addr); 1861 while (1) { 1862 size_t length = ReadCStringFromMemory(address, buf, sizeof(buf), error); 1863 if (length == 0) 1864 break; 1865 out_str.append(buf, length); 1866 // If we got "length - 1" bytes, we didn't get the whole C string, we need 1867 // to read some more characters 1868 if (length == sizeof(buf) - 1) 1869 curr_addr += length; 1870 else 1871 break; 1872 address = Address(curr_addr); 1873 } 1874 return out_str.size(); 1875 } 1876 1877 size_t Target::ReadCStringFromMemory(const Address &addr, char *dst, 1878 size_t dst_max_len, Status &result_error) { 1879 size_t total_cstr_len = 0; 1880 if (dst && dst_max_len) { 1881 result_error.Clear(); 1882 // NULL out everything just to be safe 1883 memset(dst, 0, dst_max_len); 1884 Status error; 1885 addr_t curr_addr = addr.GetLoadAddress(this); 1886 Address address(addr); 1887 1888 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't think 1889 // this really needs to be tied to the memory cache subsystem's cache line 1890 // size, so leave this as a fixed constant. 1891 const size_t cache_line_size = 512; 1892 1893 size_t bytes_left = dst_max_len - 1; 1894 char *curr_dst = dst; 1895 1896 while (bytes_left > 0) { 1897 addr_t cache_line_bytes_left = 1898 cache_line_size - (curr_addr % cache_line_size); 1899 addr_t bytes_to_read = 1900 std::min<addr_t>(bytes_left, cache_line_bytes_left); 1901 size_t bytes_read = 1902 ReadMemory(address, false, curr_dst, bytes_to_read, error); 1903 1904 if (bytes_read == 0) { 1905 result_error = error; 1906 dst[total_cstr_len] = '\0'; 1907 break; 1908 } 1909 const size_t len = strlen(curr_dst); 1910 1911 total_cstr_len += len; 1912 1913 if (len < bytes_to_read) 1914 break; 1915 1916 curr_dst += bytes_read; 1917 curr_addr += bytes_read; 1918 bytes_left -= bytes_read; 1919 address = Address(curr_addr); 1920 } 1921 } else { 1922 if (dst == nullptr) 1923 result_error.SetErrorString("invalid arguments"); 1924 else 1925 result_error.Clear(); 1926 } 1927 return total_cstr_len; 1928 } 1929 1930 size_t Target::ReadScalarIntegerFromMemory(const Address &addr, 1931 bool prefer_file_cache, 1932 uint32_t byte_size, bool is_signed, 1933 Scalar &scalar, Status &error) { 1934 uint64_t uval; 1935 1936 if (byte_size <= sizeof(uval)) { 1937 size_t bytes_read = 1938 ReadMemory(addr, prefer_file_cache, &uval, byte_size, error); 1939 if (bytes_read == byte_size) { 1940 DataExtractor data(&uval, sizeof(uval), m_arch.GetSpec().GetByteOrder(), 1941 m_arch.GetSpec().GetAddressByteSize()); 1942 lldb::offset_t offset = 0; 1943 if (byte_size <= 4) 1944 scalar = data.GetMaxU32(&offset, byte_size); 1945 else 1946 scalar = data.GetMaxU64(&offset, byte_size); 1947 1948 if (is_signed) 1949 scalar.SignExtend(byte_size * 8); 1950 return bytes_read; 1951 } 1952 } else { 1953 error.SetErrorStringWithFormat( 1954 "byte size of %u is too large for integer scalar type", byte_size); 1955 } 1956 return 0; 1957 } 1958 1959 uint64_t Target::ReadUnsignedIntegerFromMemory(const Address &addr, 1960 bool prefer_file_cache, 1961 size_t integer_byte_size, 1962 uint64_t fail_value, 1963 Status &error) { 1964 Scalar scalar; 1965 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, integer_byte_size, 1966 false, scalar, error)) 1967 return scalar.ULongLong(fail_value); 1968 return fail_value; 1969 } 1970 1971 bool Target::ReadPointerFromMemory(const Address &addr, bool prefer_file_cache, 1972 Status &error, Address &pointer_addr) { 1973 Scalar scalar; 1974 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, 1975 m_arch.GetSpec().GetAddressByteSize(), false, scalar, 1976 error)) { 1977 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1978 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) { 1979 SectionLoadList §ion_load_list = GetSectionLoadList(); 1980 if (section_load_list.IsEmpty()) { 1981 // No sections are loaded, so we must assume we are not running yet and 1982 // anything we are given is a file address. 1983 m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr); 1984 } else { 1985 // We have at least one section loaded. This can be because we have 1986 // manually loaded some sections with "target modules load ..." or 1987 // because we have have a live process that has sections loaded through 1988 // the dynamic loader 1989 section_load_list.ResolveLoadAddress(pointer_vm_addr, pointer_addr); 1990 } 1991 // We weren't able to resolve the pointer value, so just return an 1992 // address with no section 1993 if (!pointer_addr.IsValid()) 1994 pointer_addr.SetOffset(pointer_vm_addr); 1995 return true; 1996 } 1997 } 1998 return false; 1999 } 2000 2001 ModuleSP Target::GetOrCreateModule(const ModuleSpec &module_spec, bool notify, 2002 Status *error_ptr) { 2003 ModuleSP module_sp; 2004 2005 Status error; 2006 2007 // First see if we already have this module in our module list. If we do, 2008 // then we're done, we don't need to consult the shared modules list. But 2009 // only do this if we are passed a UUID. 2010 2011 if (module_spec.GetUUID().IsValid()) 2012 module_sp = m_images.FindFirstModule(module_spec); 2013 2014 if (!module_sp) { 2015 ModuleSP old_module_sp; // This will get filled in if we have a new version 2016 // of the library 2017 bool did_create_module = false; 2018 2019 // If there are image search path entries, try to use them first to acquire 2020 // a suitable image. 2021 if (m_image_search_paths.GetSize()) { 2022 ModuleSpec transformed_spec(module_spec); 2023 if (m_image_search_paths.RemapPath( 2024 module_spec.GetFileSpec().GetDirectory(), 2025 transformed_spec.GetFileSpec().GetDirectory())) { 2026 transformed_spec.GetFileSpec().GetFilename() = 2027 module_spec.GetFileSpec().GetFilename(); 2028 error = ModuleList::GetSharedModule(transformed_spec, module_sp, 2029 &GetExecutableSearchPaths(), 2030 &old_module_sp, &did_create_module); 2031 } 2032 } 2033 2034 if (!module_sp) { 2035 // If we have a UUID, we can check our global shared module list in case 2036 // we already have it. If we don't have a valid UUID, then we can't since 2037 // the path in "module_spec" will be a platform path, and we will need to 2038 // let the platform find that file. For example, we could be asking for 2039 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick 2040 // the local copy of "/usr/lib/dyld" since our platform could be a remote 2041 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file 2042 // cache. 2043 if (module_spec.GetUUID().IsValid()) { 2044 // We have a UUID, it is OK to check the global module list... 2045 error = ModuleList::GetSharedModule(module_spec, module_sp, 2046 &GetExecutableSearchPaths(), 2047 &old_module_sp, &did_create_module); 2048 } 2049 2050 if (!module_sp) { 2051 // The platform is responsible for finding and caching an appropriate 2052 // module in the shared module cache. 2053 if (m_platform_sp) { 2054 error = m_platform_sp->GetSharedModule( 2055 module_spec, m_process_sp.get(), module_sp, 2056 &GetExecutableSearchPaths(), &old_module_sp, &did_create_module); 2057 } else { 2058 error.SetErrorString("no platform is currently set"); 2059 } 2060 } 2061 } 2062 2063 // We found a module that wasn't in our target list. Let's make sure that 2064 // there wasn't an equivalent module in the list already, and if there was, 2065 // let's remove it. 2066 if (module_sp) { 2067 ObjectFile *objfile = module_sp->GetObjectFile(); 2068 if (objfile) { 2069 switch (objfile->GetType()) { 2070 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of 2071 /// a program's execution state 2072 case ObjectFile::eTypeExecutable: /// A normal executable 2073 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker 2074 /// executable 2075 case ObjectFile::eTypeObjectFile: /// An intermediate object file 2076 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be 2077 /// used during execution 2078 break; 2079 case ObjectFile::eTypeDebugInfo: /// An object file that contains only 2080 /// debug information 2081 if (error_ptr) 2082 error_ptr->SetErrorString("debug info files aren't valid target " 2083 "modules, please specify an executable"); 2084 return ModuleSP(); 2085 case ObjectFile::eTypeStubLibrary: /// A library that can be linked 2086 /// against but not used for 2087 /// execution 2088 if (error_ptr) 2089 error_ptr->SetErrorString("stub libraries aren't valid target " 2090 "modules, please specify an executable"); 2091 return ModuleSP(); 2092 default: 2093 if (error_ptr) 2094 error_ptr->SetErrorString( 2095 "unsupported file type, please specify an executable"); 2096 return ModuleSP(); 2097 } 2098 // GetSharedModule is not guaranteed to find the old shared module, for 2099 // instance in the common case where you pass in the UUID, it is only 2100 // going to find the one module matching the UUID. In fact, it has no 2101 // good way to know what the "old module" relevant to this target is, 2102 // since there might be many copies of a module with this file spec in 2103 // various running debug sessions, but only one of them will belong to 2104 // this target. So let's remove the UUID from the module list, and look 2105 // in the target's module list. Only do this if there is SOMETHING else 2106 // in the module spec... 2107 if (!old_module_sp) { 2108 if (module_spec.GetUUID().IsValid() && 2109 !module_spec.GetFileSpec().GetFilename().IsEmpty() && 2110 !module_spec.GetFileSpec().GetDirectory().IsEmpty()) { 2111 ModuleSpec module_spec_copy(module_spec.GetFileSpec()); 2112 module_spec_copy.GetUUID().Clear(); 2113 2114 ModuleList found_modules; 2115 size_t num_found = 2116 m_images.FindModules(module_spec_copy, found_modules); 2117 if (num_found == 1) { 2118 old_module_sp = found_modules.GetModuleAtIndex(0); 2119 } 2120 } 2121 } 2122 2123 // Preload symbols outside of any lock, so hopefully we can do this for 2124 // each library in parallel. 2125 if (GetPreloadSymbols()) 2126 module_sp->PreloadSymbols(); 2127 2128 if (old_module_sp && 2129 m_images.GetIndexForModule(old_module_sp.get()) != 2130 LLDB_INVALID_INDEX32) { 2131 m_images.ReplaceModule(old_module_sp, module_sp); 2132 Module *old_module_ptr = old_module_sp.get(); 2133 old_module_sp.reset(); 2134 ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr); 2135 } else { 2136 m_images.Append(module_sp, notify); 2137 } 2138 } else 2139 module_sp.reset(); 2140 } 2141 } 2142 if (error_ptr) 2143 *error_ptr = error; 2144 return module_sp; 2145 } 2146 2147 TargetSP Target::CalculateTarget() { return shared_from_this(); } 2148 2149 ProcessSP Target::CalculateProcess() { return m_process_sp; } 2150 2151 ThreadSP Target::CalculateThread() { return ThreadSP(); } 2152 2153 StackFrameSP Target::CalculateStackFrame() { return StackFrameSP(); } 2154 2155 void Target::CalculateExecutionContext(ExecutionContext &exe_ctx) { 2156 exe_ctx.Clear(); 2157 exe_ctx.SetTargetPtr(this); 2158 } 2159 2160 PathMappingList &Target::GetImageSearchPathList() { 2161 return m_image_search_paths; 2162 } 2163 2164 void Target::ImageSearchPathsChanged(const PathMappingList &path_list, 2165 void *baton) { 2166 Target *target = (Target *)baton; 2167 ModuleSP exe_module_sp(target->GetExecutableModule()); 2168 if (exe_module_sp) 2169 target->SetExecutableModule(exe_module_sp, eLoadDependentsYes); 2170 } 2171 2172 TypeSystem *Target::GetScratchTypeSystemForLanguage(Status *error, 2173 lldb::LanguageType language, 2174 bool create_on_demand) { 2175 if (!m_valid) 2176 return nullptr; 2177 2178 if (error) { 2179 error->Clear(); 2180 } 2181 2182 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all 2183 // assembly code 2184 || language == eLanguageTypeUnknown) { 2185 std::set<lldb::LanguageType> languages_for_types; 2186 std::set<lldb::LanguageType> languages_for_expressions; 2187 2188 Language::GetLanguagesSupportingTypeSystems(languages_for_types, 2189 languages_for_expressions); 2190 2191 if (languages_for_expressions.count(eLanguageTypeC)) { 2192 language = eLanguageTypeC; // LLDB's default. Override by setting the 2193 // target language. 2194 } else { 2195 if (languages_for_expressions.empty()) { 2196 return nullptr; 2197 } else { 2198 language = *languages_for_expressions.begin(); 2199 } 2200 } 2201 } 2202 2203 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, 2204 create_on_demand); 2205 } 2206 2207 PersistentExpressionState * 2208 Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) { 2209 TypeSystem *type_system = 2210 GetScratchTypeSystemForLanguage(nullptr, language, true); 2211 2212 if (type_system) { 2213 return type_system->GetPersistentExpressionState(); 2214 } else { 2215 return nullptr; 2216 } 2217 } 2218 2219 UserExpression *Target::GetUserExpressionForLanguage( 2220 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, 2221 Expression::ResultType desired_type, 2222 const EvaluateExpressionOptions &options, 2223 ValueObject *ctx_obj, Status &error) { 2224 Status type_system_error; 2225 2226 TypeSystem *type_system = 2227 GetScratchTypeSystemForLanguage(&type_system_error, language); 2228 UserExpression *user_expr = nullptr; 2229 2230 if (!type_system) { 2231 error.SetErrorStringWithFormat( 2232 "Could not find type system for language %s: %s", 2233 Language::GetNameForLanguageType(language), 2234 type_system_error.AsCString()); 2235 return nullptr; 2236 } 2237 2238 user_expr = type_system->GetUserExpression(expr, prefix, language, 2239 desired_type, options, ctx_obj); 2240 if (!user_expr) 2241 error.SetErrorStringWithFormat( 2242 "Could not create an expression for language %s", 2243 Language::GetNameForLanguageType(language)); 2244 2245 return user_expr; 2246 } 2247 2248 FunctionCaller *Target::GetFunctionCallerForLanguage( 2249 lldb::LanguageType language, const CompilerType &return_type, 2250 const Address &function_address, const ValueList &arg_value_list, 2251 const char *name, Status &error) { 2252 Status type_system_error; 2253 TypeSystem *type_system = 2254 GetScratchTypeSystemForLanguage(&type_system_error, language); 2255 FunctionCaller *persistent_fn = nullptr; 2256 2257 if (!type_system) { 2258 error.SetErrorStringWithFormat( 2259 "Could not find type system for language %s: %s", 2260 Language::GetNameForLanguageType(language), 2261 type_system_error.AsCString()); 2262 return persistent_fn; 2263 } 2264 2265 persistent_fn = type_system->GetFunctionCaller(return_type, function_address, 2266 arg_value_list, name); 2267 if (!persistent_fn) 2268 error.SetErrorStringWithFormat( 2269 "Could not create an expression for language %s", 2270 Language::GetNameForLanguageType(language)); 2271 2272 return persistent_fn; 2273 } 2274 2275 UtilityFunction * 2276 Target::GetUtilityFunctionForLanguage(const char *text, 2277 lldb::LanguageType language, 2278 const char *name, Status &error) { 2279 Status type_system_error; 2280 TypeSystem *type_system = 2281 GetScratchTypeSystemForLanguage(&type_system_error, language); 2282 UtilityFunction *utility_fn = nullptr; 2283 2284 if (!type_system) { 2285 error.SetErrorStringWithFormat( 2286 "Could not find type system for language %s: %s", 2287 Language::GetNameForLanguageType(language), 2288 type_system_error.AsCString()); 2289 return utility_fn; 2290 } 2291 2292 utility_fn = type_system->GetUtilityFunction(text, name); 2293 if (!utility_fn) 2294 error.SetErrorStringWithFormat( 2295 "Could not create an expression for language %s", 2296 Language::GetNameForLanguageType(language)); 2297 2298 return utility_fn; 2299 } 2300 2301 ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) { 2302 if (m_valid) { 2303 if (TypeSystem *type_system = GetScratchTypeSystemForLanguage( 2304 nullptr, eLanguageTypeC, create_on_demand)) 2305 return llvm::dyn_cast<ClangASTContext>(type_system); 2306 } 2307 return nullptr; 2308 } 2309 2310 ClangASTImporterSP Target::GetClangASTImporter() { 2311 if (m_valid) { 2312 if (!m_ast_importer_sp) { 2313 m_ast_importer_sp = std::make_shared<ClangASTImporter>(); 2314 } 2315 return m_ast_importer_sp; 2316 } 2317 return ClangASTImporterSP(); 2318 } 2319 2320 void Target::SettingsInitialize() { Process::SettingsInitialize(); } 2321 2322 void Target::SettingsTerminate() { Process::SettingsTerminate(); } 2323 2324 FileSpecList Target::GetDefaultExecutableSearchPaths() { 2325 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2326 if (properties_sp) 2327 return properties_sp->GetExecutableSearchPaths(); 2328 return FileSpecList(); 2329 } 2330 2331 FileSpecList Target::GetDefaultDebugFileSearchPaths() { 2332 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2333 if (properties_sp) 2334 return properties_sp->GetDebugFileSearchPaths(); 2335 return FileSpecList(); 2336 } 2337 2338 FileSpecList Target::GetDefaultClangModuleSearchPaths() { 2339 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2340 if (properties_sp) 2341 return properties_sp->GetClangModuleSearchPaths(); 2342 return FileSpecList(); 2343 } 2344 2345 ArchSpec Target::GetDefaultArchitecture() { 2346 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2347 if (properties_sp) 2348 return properties_sp->GetDefaultArchitecture(); 2349 return ArchSpec(); 2350 } 2351 2352 void Target::SetDefaultArchitecture(const ArchSpec &arch) { 2353 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2354 if (properties_sp) { 2355 LogIfAnyCategoriesSet( 2356 LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's " 2357 "default architecture to %s (%s)", 2358 arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str()); 2359 return properties_sp->SetDefaultArchitecture(arch); 2360 } 2361 } 2362 2363 Target *Target::GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr, 2364 const SymbolContext *sc_ptr) { 2365 // The target can either exist in the "process" of ExecutionContext, or in 2366 // the "target_sp" member of SymbolContext. This accessor helper function 2367 // will get the target from one of these locations. 2368 2369 Target *target = nullptr; 2370 if (sc_ptr != nullptr) 2371 target = sc_ptr->target_sp.get(); 2372 if (target == nullptr && exe_ctx_ptr) 2373 target = exe_ctx_ptr->GetTargetPtr(); 2374 return target; 2375 } 2376 2377 ExpressionResults Target::EvaluateExpression( 2378 llvm::StringRef expr, ExecutionContextScope *exe_scope, 2379 lldb::ValueObjectSP &result_valobj_sp, 2380 const EvaluateExpressionOptions &options, std::string *fixed_expression, 2381 ValueObject *ctx_obj) { 2382 result_valobj_sp.reset(); 2383 2384 ExpressionResults execution_results = eExpressionSetupError; 2385 2386 if (expr.empty()) 2387 return execution_results; 2388 2389 // We shouldn't run stop hooks in expressions. Be sure to reset this if you 2390 // return anywhere within this function. 2391 bool old_suppress_value = m_suppress_stop_hooks; 2392 m_suppress_stop_hooks = true; 2393 2394 ExecutionContext exe_ctx; 2395 2396 if (exe_scope) { 2397 exe_scope->CalculateExecutionContext(exe_ctx); 2398 } else if (m_process_sp) { 2399 m_process_sp->CalculateExecutionContext(exe_ctx); 2400 } else { 2401 CalculateExecutionContext(exe_ctx); 2402 } 2403 2404 // Make sure we aren't just trying to see the value of a persistent variable 2405 // (something like "$0") 2406 lldb::ExpressionVariableSP persistent_var_sp; 2407 // Only check for persistent variables the expression starts with a '$' 2408 if (expr[0] == '$') 2409 persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC) 2410 ->GetPersistentExpressionState() 2411 ->GetVariable(expr); 2412 2413 if (persistent_var_sp) { 2414 result_valobj_sp = persistent_var_sp->GetValueObject(); 2415 execution_results = eExpressionCompleted; 2416 } else { 2417 llvm::StringRef prefix = GetExpressionPrefixContents(); 2418 Status error; 2419 execution_results = 2420 UserExpression::Evaluate(exe_ctx, options, expr, prefix, 2421 result_valobj_sp, error, fixed_expression, 2422 nullptr, // Module 2423 ctx_obj); 2424 } 2425 2426 m_suppress_stop_hooks = old_suppress_value; 2427 2428 return execution_results; 2429 } 2430 2431 lldb::ExpressionVariableSP 2432 Target::GetPersistentVariable(ConstString name) { 2433 lldb::ExpressionVariableSP variable_sp; 2434 m_scratch_type_system_map.ForEach( 2435 [name, &variable_sp](TypeSystem *type_system) -> bool { 2436 if (PersistentExpressionState *persistent_state = 2437 type_system->GetPersistentExpressionState()) { 2438 variable_sp = persistent_state->GetVariable(name); 2439 2440 if (variable_sp) 2441 return false; // Stop iterating the ForEach 2442 } 2443 return true; // Keep iterating the ForEach 2444 }); 2445 return variable_sp; 2446 } 2447 2448 lldb::addr_t Target::GetPersistentSymbol(ConstString name) { 2449 lldb::addr_t address = LLDB_INVALID_ADDRESS; 2450 2451 m_scratch_type_system_map.ForEach( 2452 [name, &address](TypeSystem *type_system) -> bool { 2453 if (PersistentExpressionState *persistent_state = 2454 type_system->GetPersistentExpressionState()) { 2455 address = persistent_state->LookupSymbol(name); 2456 if (address != LLDB_INVALID_ADDRESS) 2457 return false; // Stop iterating the ForEach 2458 } 2459 return true; // Keep iterating the ForEach 2460 }); 2461 return address; 2462 } 2463 2464 lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr, 2465 AddressClass addr_class) const { 2466 auto arch_plugin = GetArchitecturePlugin(); 2467 return arch_plugin ? 2468 arch_plugin->GetCallableLoadAddress(load_addr, addr_class) : load_addr; 2469 } 2470 2471 lldb::addr_t Target::GetOpcodeLoadAddress(lldb::addr_t load_addr, 2472 AddressClass addr_class) const { 2473 auto arch_plugin = GetArchitecturePlugin(); 2474 return arch_plugin ? 2475 arch_plugin->GetOpcodeLoadAddress(load_addr, addr_class) : load_addr; 2476 } 2477 2478 lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) { 2479 auto arch_plugin = GetArchitecturePlugin(); 2480 return arch_plugin ? 2481 arch_plugin->GetBreakableLoadAddress(addr, *this) : addr; 2482 } 2483 2484 SourceManager &Target::GetSourceManager() { 2485 if (!m_source_manager_up) 2486 m_source_manager_up.reset(new SourceManager(shared_from_this())); 2487 return *m_source_manager_up; 2488 } 2489 2490 ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() { 2491 static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended 2492 // we can make it 2493 // per-target 2494 2495 { 2496 std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex); 2497 2498 if (!m_clang_modules_decl_vendor_up) { 2499 m_clang_modules_decl_vendor_up.reset( 2500 ClangModulesDeclVendor::Create(*this)); 2501 } 2502 } 2503 2504 return m_clang_modules_decl_vendor_up.get(); 2505 } 2506 2507 Target::StopHookSP Target::CreateStopHook() { 2508 lldb::user_id_t new_uid = ++m_stop_hook_next_id; 2509 Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid)); 2510 m_stop_hooks[new_uid] = stop_hook_sp; 2511 return stop_hook_sp; 2512 } 2513 2514 bool Target::RemoveStopHookByID(lldb::user_id_t user_id) { 2515 size_t num_removed = m_stop_hooks.erase(user_id); 2516 return (num_removed != 0); 2517 } 2518 2519 void Target::RemoveAllStopHooks() { m_stop_hooks.clear(); } 2520 2521 Target::StopHookSP Target::GetStopHookByID(lldb::user_id_t user_id) { 2522 StopHookSP found_hook; 2523 2524 StopHookCollection::iterator specified_hook_iter; 2525 specified_hook_iter = m_stop_hooks.find(user_id); 2526 if (specified_hook_iter != m_stop_hooks.end()) 2527 found_hook = (*specified_hook_iter).second; 2528 return found_hook; 2529 } 2530 2531 bool Target::SetStopHookActiveStateByID(lldb::user_id_t user_id, 2532 bool active_state) { 2533 StopHookCollection::iterator specified_hook_iter; 2534 specified_hook_iter = m_stop_hooks.find(user_id); 2535 if (specified_hook_iter == m_stop_hooks.end()) 2536 return false; 2537 2538 (*specified_hook_iter).second->SetIsActive(active_state); 2539 return true; 2540 } 2541 2542 void Target::SetAllStopHooksActiveState(bool active_state) { 2543 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2544 for (pos = m_stop_hooks.begin(); pos != end; pos++) { 2545 (*pos).second->SetIsActive(active_state); 2546 } 2547 } 2548 2549 void Target::RunStopHooks() { 2550 if (m_suppress_stop_hooks) 2551 return; 2552 2553 if (!m_process_sp) 2554 return; 2555 2556 // Somebody might have restarted the process: 2557 if (m_process_sp->GetState() != eStateStopped) 2558 return; 2559 2560 // <rdar://problem/12027563> make sure we check that we are not stopped 2561 // because of us running a user expression since in that case we do not want 2562 // to run the stop-hooks 2563 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression()) 2564 return; 2565 2566 if (m_stop_hooks.empty()) 2567 return; 2568 2569 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2570 2571 // If there aren't any active stop hooks, don't bother either. 2572 // Also see if any of the active hooks want to auto-continue. 2573 bool any_active_hooks = false; 2574 bool auto_continue = false; 2575 for (auto hook : m_stop_hooks) { 2576 if (hook.second->IsActive()) { 2577 any_active_hooks = true; 2578 auto_continue |= hook.second->GetAutoContinue(); 2579 } 2580 } 2581 if (!any_active_hooks) 2582 return; 2583 2584 CommandReturnObject result; 2585 2586 std::vector<ExecutionContext> exc_ctx_with_reasons; 2587 std::vector<SymbolContext> sym_ctx_with_reasons; 2588 2589 ThreadList &cur_threadlist = m_process_sp->GetThreadList(); 2590 size_t num_threads = cur_threadlist.GetSize(); 2591 for (size_t i = 0; i < num_threads; i++) { 2592 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex(i); 2593 if (cur_thread_sp->ThreadStoppedForAReason()) { 2594 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0); 2595 exc_ctx_with_reasons.push_back(ExecutionContext( 2596 m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get())); 2597 sym_ctx_with_reasons.push_back( 2598 cur_frame_sp->GetSymbolContext(eSymbolContextEverything)); 2599 } 2600 } 2601 2602 // If no threads stopped for a reason, don't run the stop-hooks. 2603 size_t num_exe_ctx = exc_ctx_with_reasons.size(); 2604 if (num_exe_ctx == 0) 2605 return; 2606 2607 result.SetImmediateOutputStream(m_debugger.GetAsyncOutputStream()); 2608 result.SetImmediateErrorStream(m_debugger.GetAsyncErrorStream()); 2609 2610 bool keep_going = true; 2611 bool hooks_ran = false; 2612 bool print_hook_header = (m_stop_hooks.size() != 1); 2613 bool print_thread_header = (num_exe_ctx != 1); 2614 bool did_restart = false; 2615 2616 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) { 2617 // result.Clear(); 2618 StopHookSP cur_hook_sp = (*pos).second; 2619 if (!cur_hook_sp->IsActive()) 2620 continue; 2621 2622 bool any_thread_matched = false; 2623 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) { 2624 if ((cur_hook_sp->GetSpecifier() == nullptr || 2625 cur_hook_sp->GetSpecifier()->SymbolContextMatches( 2626 sym_ctx_with_reasons[i])) && 2627 (cur_hook_sp->GetThreadSpecifier() == nullptr || 2628 cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests( 2629 exc_ctx_with_reasons[i].GetThreadRef()))) { 2630 if (!hooks_ran) { 2631 hooks_ran = true; 2632 } 2633 if (print_hook_header && !any_thread_matched) { 2634 const char *cmd = 2635 (cur_hook_sp->GetCommands().GetSize() == 1 2636 ? cur_hook_sp->GetCommands().GetStringAtIndex(0) 2637 : nullptr); 2638 if (cmd) 2639 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", 2640 cur_hook_sp->GetID(), cmd); 2641 else 2642 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", 2643 cur_hook_sp->GetID()); 2644 any_thread_matched = true; 2645 } 2646 2647 if (print_thread_header) 2648 result.AppendMessageWithFormat( 2649 "-- Thread %d\n", 2650 exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID()); 2651 2652 CommandInterpreterRunOptions options; 2653 options.SetStopOnContinue(true); 2654 options.SetStopOnError(true); 2655 options.SetEchoCommands(false); 2656 options.SetPrintResults(true); 2657 options.SetAddToHistory(false); 2658 2659 // Force Async: 2660 bool old_async = GetDebugger().GetAsyncExecution(); 2661 GetDebugger().SetAsyncExecution(true); 2662 GetDebugger().GetCommandInterpreter().HandleCommands( 2663 cur_hook_sp->GetCommands(), &exc_ctx_with_reasons[i], options, 2664 result); 2665 GetDebugger().SetAsyncExecution(old_async); 2666 // If the command started the target going again, we should bag out of 2667 // running the stop hooks. 2668 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) || 2669 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) { 2670 // But only complain if there were more stop hooks to do: 2671 StopHookCollection::iterator tmp = pos; 2672 if (++tmp != end) 2673 result.AppendMessageWithFormat("\nAborting stop hooks, hook %" PRIu64 2674 " set the program running.\n" 2675 " Consider using '-G true' to make " 2676 "stop hooks auto-continue.\n", 2677 cur_hook_sp->GetID()); 2678 keep_going = false; 2679 did_restart = true; 2680 } 2681 } 2682 } 2683 } 2684 // Finally, if auto-continue was requested, do it now: 2685 if (!did_restart && auto_continue) 2686 m_process_sp->PrivateResume(); 2687 2688 result.GetImmediateOutputStream()->Flush(); 2689 result.GetImmediateErrorStream()->Flush(); 2690 } 2691 2692 const TargetPropertiesSP &Target::GetGlobalProperties() { 2693 // NOTE: intentional leak so we don't crash if global destructor chain gets 2694 // called as other threads still use the result of this function 2695 static TargetPropertiesSP *g_settings_sp_ptr = 2696 new TargetPropertiesSP(new TargetProperties(nullptr)); 2697 return *g_settings_sp_ptr; 2698 } 2699 2700 Status Target::Install(ProcessLaunchInfo *launch_info) { 2701 Status error; 2702 PlatformSP platform_sp(GetPlatform()); 2703 if (platform_sp) { 2704 if (platform_sp->IsRemote()) { 2705 if (platform_sp->IsConnected()) { 2706 // Install all files that have an install path, and always install the 2707 // main executable when connected to a remote platform 2708 const ModuleList &modules = GetImages(); 2709 const size_t num_images = modules.GetSize(); 2710 for (size_t idx = 0; idx < num_images; ++idx) { 2711 ModuleSP module_sp(modules.GetModuleAtIndex(idx)); 2712 if (module_sp) { 2713 const bool is_main_executable = module_sp == GetExecutableModule(); 2714 FileSpec local_file(module_sp->GetFileSpec()); 2715 if (local_file) { 2716 FileSpec remote_file(module_sp->GetRemoteInstallFileSpec()); 2717 if (!remote_file) { 2718 if (is_main_executable) // TODO: add setting for always 2719 // installing main executable??? 2720 { 2721 // Always install the main executable 2722 remote_file = platform_sp->GetRemoteWorkingDirectory(); 2723 remote_file.AppendPathComponent( 2724 module_sp->GetFileSpec().GetFilename().GetCString()); 2725 } 2726 } 2727 if (remote_file) { 2728 error = platform_sp->Install(local_file, remote_file); 2729 if (error.Success()) { 2730 module_sp->SetPlatformFileSpec(remote_file); 2731 if (is_main_executable) { 2732 platform_sp->SetFilePermissions(remote_file, 0700); 2733 if (launch_info) 2734 launch_info->SetExecutableFile(remote_file, false); 2735 } 2736 } else 2737 break; 2738 } 2739 } 2740 } 2741 } 2742 } 2743 } 2744 } 2745 return error; 2746 } 2747 2748 bool Target::ResolveLoadAddress(addr_t load_addr, Address &so_addr, 2749 uint32_t stop_id) { 2750 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr); 2751 } 2752 2753 bool Target::ResolveFileAddress(lldb::addr_t file_addr, 2754 Address &resolved_addr) { 2755 return m_images.ResolveFileAddress(file_addr, resolved_addr); 2756 } 2757 2758 bool Target::SetSectionLoadAddress(const SectionSP §ion_sp, 2759 addr_t new_section_load_addr, 2760 bool warn_multiple) { 2761 const addr_t old_section_load_addr = 2762 m_section_load_history.GetSectionLoadAddress( 2763 SectionLoadHistory::eStopIDNow, section_sp); 2764 if (old_section_load_addr != new_section_load_addr) { 2765 uint32_t stop_id = 0; 2766 ProcessSP process_sp(GetProcessSP()); 2767 if (process_sp) 2768 stop_id = process_sp->GetStopID(); 2769 else 2770 stop_id = m_section_load_history.GetLastStopID(); 2771 if (m_section_load_history.SetSectionLoadAddress( 2772 stop_id, section_sp, new_section_load_addr, warn_multiple)) 2773 return true; // Return true if the section load address was changed... 2774 } 2775 return false; // Return false to indicate nothing changed 2776 } 2777 2778 size_t Target::UnloadModuleSections(const ModuleList &module_list) { 2779 size_t section_unload_count = 0; 2780 size_t num_modules = module_list.GetSize(); 2781 for (size_t i = 0; i < num_modules; ++i) { 2782 section_unload_count += 2783 UnloadModuleSections(module_list.GetModuleAtIndex(i)); 2784 } 2785 return section_unload_count; 2786 } 2787 2788 size_t Target::UnloadModuleSections(const lldb::ModuleSP &module_sp) { 2789 uint32_t stop_id = 0; 2790 ProcessSP process_sp(GetProcessSP()); 2791 if (process_sp) 2792 stop_id = process_sp->GetStopID(); 2793 else 2794 stop_id = m_section_load_history.GetLastStopID(); 2795 SectionList *sections = module_sp->GetSectionList(); 2796 size_t section_unload_count = 0; 2797 if (sections) { 2798 const uint32_t num_sections = sections->GetNumSections(0); 2799 for (uint32_t i = 0; i < num_sections; ++i) { 2800 section_unload_count += m_section_load_history.SetSectionUnloaded( 2801 stop_id, sections->GetSectionAtIndex(i)); 2802 } 2803 } 2804 return section_unload_count; 2805 } 2806 2807 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp) { 2808 uint32_t stop_id = 0; 2809 ProcessSP process_sp(GetProcessSP()); 2810 if (process_sp) 2811 stop_id = process_sp->GetStopID(); 2812 else 2813 stop_id = m_section_load_history.GetLastStopID(); 2814 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp); 2815 } 2816 2817 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp, 2818 addr_t load_addr) { 2819 uint32_t stop_id = 0; 2820 ProcessSP process_sp(GetProcessSP()); 2821 if (process_sp) 2822 stop_id = process_sp->GetStopID(); 2823 else 2824 stop_id = m_section_load_history.GetLastStopID(); 2825 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp, 2826 load_addr); 2827 } 2828 2829 void Target::ClearAllLoadedSections() { m_section_load_history.Clear(); } 2830 2831 Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) { 2832 Status error; 2833 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 2834 2835 if (log) 2836 log->Printf("Target::%s() called for %s", __FUNCTION__, 2837 launch_info.GetExecutableFile().GetPath().c_str()); 2838 2839 StateType state = eStateInvalid; 2840 2841 // Scope to temporarily get the process state in case someone has manually 2842 // remotely connected already to a process and we can skip the platform 2843 // launching. 2844 { 2845 ProcessSP process_sp(GetProcessSP()); 2846 2847 if (process_sp) { 2848 state = process_sp->GetState(); 2849 if (log) 2850 log->Printf( 2851 "Target::%s the process exists, and its current state is %s", 2852 __FUNCTION__, StateAsCString(state)); 2853 } else { 2854 if (log) 2855 log->Printf("Target::%s the process instance doesn't currently exist.", 2856 __FUNCTION__); 2857 } 2858 } 2859 2860 launch_info.GetFlags().Set(eLaunchFlagDebug); 2861 2862 // Get the value of synchronous execution here. If you wait till after you 2863 // have started to run, then you could have hit a breakpoint, whose command 2864 // might switch the value, and then you'll pick up that incorrect value. 2865 Debugger &debugger = GetDebugger(); 2866 const bool synchronous_execution = 2867 debugger.GetCommandInterpreter().GetSynchronous(); 2868 2869 PlatformSP platform_sp(GetPlatform()); 2870 2871 FinalizeFileActions(launch_info); 2872 2873 if (state == eStateConnected) { 2874 if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) { 2875 error.SetErrorString( 2876 "can't launch in tty when launching through a remote connection"); 2877 return error; 2878 } 2879 } 2880 2881 if (!launch_info.GetArchitecture().IsValid()) 2882 launch_info.GetArchitecture() = GetArchitecture(); 2883 2884 // If we're not already connected to the process, and if we have a platform 2885 // that can launch a process for debugging, go ahead and do that here. 2886 if (state != eStateConnected && platform_sp && 2887 platform_sp->CanDebugProcess()) { 2888 if (log) 2889 log->Printf("Target::%s asking the platform to debug the process", 2890 __FUNCTION__); 2891 2892 // If there was a previous process, delete it before we make the new one. 2893 // One subtle point, we delete the process before we release the reference 2894 // to m_process_sp. That way even if we are the last owner, the process 2895 // will get Finalized before it gets destroyed. 2896 DeleteCurrentProcess(); 2897 2898 m_process_sp = 2899 GetPlatform()->DebugProcess(launch_info, debugger, this, error); 2900 2901 } else { 2902 if (log) 2903 log->Printf("Target::%s the platform doesn't know how to debug a " 2904 "process, getting a process plugin to do this for us.", 2905 __FUNCTION__); 2906 2907 if (state == eStateConnected) { 2908 assert(m_process_sp); 2909 } else { 2910 // Use a Process plugin to construct the process. 2911 const char *plugin_name = launch_info.GetProcessPluginName(); 2912 CreateProcess(launch_info.GetListener(), plugin_name, nullptr); 2913 } 2914 2915 // Since we didn't have a platform launch the process, launch it here. 2916 if (m_process_sp) 2917 error = m_process_sp->Launch(launch_info); 2918 } 2919 2920 if (!m_process_sp) { 2921 if (error.Success()) 2922 error.SetErrorString("failed to launch or debug process"); 2923 return error; 2924 } 2925 2926 if (error.Success()) { 2927 if (synchronous_execution || 2928 !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) { 2929 ListenerSP hijack_listener_sp(launch_info.GetHijackListener()); 2930 if (!hijack_listener_sp) { 2931 hijack_listener_sp = 2932 Listener::MakeListener("lldb.Target.Launch.hijack"); 2933 launch_info.SetHijackListener(hijack_listener_sp); 2934 m_process_sp->HijackProcessEvents(hijack_listener_sp); 2935 } 2936 2937 StateType state = m_process_sp->WaitForProcessToStop( 2938 llvm::None, nullptr, false, hijack_listener_sp, nullptr); 2939 2940 if (state == eStateStopped) { 2941 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) { 2942 if (synchronous_execution) { 2943 // Now we have handled the stop-from-attach, and we are just switching 2944 // to a synchronous resume. So we should switch to the SyncResume 2945 // hijacker. 2946 m_process_sp->RestoreProcessEvents(); 2947 m_process_sp->ResumeSynchronous(stream); 2948 } else { 2949 m_process_sp->RestoreProcessEvents(); 2950 error = m_process_sp->PrivateResume(); 2951 } 2952 if (!error.Success()) { 2953 Status error2; 2954 error2.SetErrorStringWithFormat( 2955 "process resume at entry point failed: %s", error.AsCString()); 2956 error = error2; 2957 } 2958 } 2959 } else if (state == eStateExited) { 2960 bool with_shell = !!launch_info.GetShell(); 2961 const int exit_status = m_process_sp->GetExitStatus(); 2962 const char *exit_desc = m_process_sp->GetExitDescription(); 2963 #define LAUNCH_SHELL_MESSAGE \ 2964 "\n'r' and 'run' are aliases that default to launching through a " \ 2965 "shell.\nTry launching without going through a shell by using 'process " \ 2966 "launch'." 2967 if (exit_desc && exit_desc[0]) { 2968 if (with_shell) 2969 error.SetErrorStringWithFormat( 2970 "process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, 2971 exit_status, exit_desc); 2972 else 2973 error.SetErrorStringWithFormat("process exited with status %i (%s)", 2974 exit_status, exit_desc); 2975 } else { 2976 if (with_shell) 2977 error.SetErrorStringWithFormat( 2978 "process exited with status %i" LAUNCH_SHELL_MESSAGE, 2979 exit_status); 2980 else 2981 error.SetErrorStringWithFormat("process exited with status %i", 2982 exit_status); 2983 } 2984 } else { 2985 error.SetErrorStringWithFormat( 2986 "initial process state wasn't stopped: %s", StateAsCString(state)); 2987 } 2988 } 2989 m_process_sp->RestoreProcessEvents(); 2990 } else { 2991 Status error2; 2992 error2.SetErrorStringWithFormat("process launch failed: %s", 2993 error.AsCString()); 2994 error = error2; 2995 } 2996 return error; 2997 } 2998 2999 Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) { 3000 auto state = eStateInvalid; 3001 auto process_sp = GetProcessSP(); 3002 if (process_sp) { 3003 state = process_sp->GetState(); 3004 if (process_sp->IsAlive() && state != eStateConnected) { 3005 if (state == eStateAttaching) 3006 return Status("process attach is in progress"); 3007 return Status("a process is already being debugged"); 3008 } 3009 } 3010 3011 const ModuleSP old_exec_module_sp = GetExecutableModule(); 3012 3013 // If no process info was specified, then use the target executable name as 3014 // the process to attach to by default 3015 if (!attach_info.ProcessInfoSpecified()) { 3016 if (old_exec_module_sp) 3017 attach_info.GetExecutableFile().GetFilename() = 3018 old_exec_module_sp->GetPlatformFileSpec().GetFilename(); 3019 3020 if (!attach_info.ProcessInfoSpecified()) { 3021 return Status("no process specified, create a target with a file, or " 3022 "specify the --pid or --name"); 3023 } 3024 } 3025 3026 const auto platform_sp = 3027 GetDebugger().GetPlatformList().GetSelectedPlatform(); 3028 ListenerSP hijack_listener_sp; 3029 const bool async = attach_info.GetAsync(); 3030 if (!async) { 3031 hijack_listener_sp = 3032 Listener::MakeListener("lldb.Target.Attach.attach.hijack"); 3033 attach_info.SetHijackListener(hijack_listener_sp); 3034 } 3035 3036 Status error; 3037 if (state != eStateConnected && platform_sp != nullptr && 3038 platform_sp->CanDebugProcess()) { 3039 SetPlatform(platform_sp); 3040 process_sp = platform_sp->Attach(attach_info, GetDebugger(), this, error); 3041 } else { 3042 if (state != eStateConnected) { 3043 const char *plugin_name = attach_info.GetProcessPluginName(); 3044 process_sp = 3045 CreateProcess(attach_info.GetListenerForProcess(GetDebugger()), 3046 plugin_name, nullptr); 3047 if (process_sp == nullptr) { 3048 error.SetErrorStringWithFormat( 3049 "failed to create process using plugin %s", 3050 (plugin_name) ? plugin_name : "null"); 3051 return error; 3052 } 3053 } 3054 if (hijack_listener_sp) 3055 process_sp->HijackProcessEvents(hijack_listener_sp); 3056 error = process_sp->Attach(attach_info); 3057 } 3058 3059 if (error.Success() && process_sp) { 3060 if (async) { 3061 process_sp->RestoreProcessEvents(); 3062 } else { 3063 state = process_sp->WaitForProcessToStop( 3064 llvm::None, nullptr, false, attach_info.GetHijackListener(), stream); 3065 process_sp->RestoreProcessEvents(); 3066 3067 if (state != eStateStopped) { 3068 const char *exit_desc = process_sp->GetExitDescription(); 3069 if (exit_desc) 3070 error.SetErrorStringWithFormat("%s", exit_desc); 3071 else 3072 error.SetErrorString( 3073 "process did not stop (no such process or permission problem?)"); 3074 process_sp->Destroy(false); 3075 } 3076 } 3077 } 3078 return error; 3079 } 3080 3081 void Target::FinalizeFileActions(ProcessLaunchInfo &info) { 3082 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 3083 3084 // Finalize the file actions, and if none were given, default to opening up a 3085 // pseudo terminal 3086 PlatformSP platform_sp = GetPlatform(); 3087 const bool default_to_use_pty = 3088 m_platform_sp ? m_platform_sp->IsHost() : false; 3089 LLDB_LOG( 3090 log, 3091 "have platform={0}, platform_sp->IsHost()={1}, default_to_use_pty={2}", 3092 bool(platform_sp), 3093 platform_sp ? (platform_sp->IsHost() ? "true" : "false") : "n/a", 3094 default_to_use_pty); 3095 3096 // If nothing for stdin or stdout or stderr was specified, then check the 3097 // process for any default settings that were set with "settings set" 3098 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr || 3099 info.GetFileActionForFD(STDOUT_FILENO) == nullptr || 3100 info.GetFileActionForFD(STDERR_FILENO) == nullptr) { 3101 LLDB_LOG(log, "at least one of stdin/stdout/stderr was not set, evaluating " 3102 "default handling"); 3103 3104 if (info.GetFlags().Test(eLaunchFlagLaunchInTTY)) { 3105 // Do nothing, if we are launching in a remote terminal no file actions 3106 // should be done at all. 3107 return; 3108 } 3109 3110 if (info.GetFlags().Test(eLaunchFlagDisableSTDIO)) { 3111 LLDB_LOG(log, "eLaunchFlagDisableSTDIO set, adding suppression action " 3112 "for stdin, stdout and stderr"); 3113 info.AppendSuppressFileAction(STDIN_FILENO, true, false); 3114 info.AppendSuppressFileAction(STDOUT_FILENO, false, true); 3115 info.AppendSuppressFileAction(STDERR_FILENO, false, true); 3116 } else { 3117 // Check for any values that might have gotten set with any of: (lldb) 3118 // settings set target.input-path (lldb) settings set target.output-path 3119 // (lldb) settings set target.error-path 3120 FileSpec in_file_spec; 3121 FileSpec out_file_spec; 3122 FileSpec err_file_spec; 3123 // Only override with the target settings if we don't already have an 3124 // action for in, out or error 3125 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr) 3126 in_file_spec = GetStandardInputPath(); 3127 if (info.GetFileActionForFD(STDOUT_FILENO) == nullptr) 3128 out_file_spec = GetStandardOutputPath(); 3129 if (info.GetFileActionForFD(STDERR_FILENO) == nullptr) 3130 err_file_spec = GetStandardErrorPath(); 3131 3132 LLDB_LOG(log, "target stdin='{0}', target stdout='{1}', stderr='{1}'", 3133 in_file_spec, out_file_spec, err_file_spec); 3134 3135 if (in_file_spec) { 3136 info.AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false); 3137 LLDB_LOG(log, "appended stdin open file action for {0}", in_file_spec); 3138 } 3139 3140 if (out_file_spec) { 3141 info.AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true); 3142 LLDB_LOG(log, "appended stdout open file action for {0}", 3143 out_file_spec); 3144 } 3145 3146 if (err_file_spec) { 3147 info.AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true); 3148 LLDB_LOG(log, "appended stderr open file action for {0}", 3149 err_file_spec); 3150 } 3151 3152 if (default_to_use_pty && 3153 (!in_file_spec || !out_file_spec || !err_file_spec)) { 3154 llvm::Error Err = info.SetUpPtyRedirection(); 3155 LLDB_LOG_ERROR(log, std::move(Err), "SetUpPtyRedirection failed: {0}"); 3156 } 3157 } 3158 } 3159 } 3160 3161 // Target::StopHook 3162 Target::StopHook::StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid) 3163 : UserID(uid), m_target_sp(target_sp), m_commands(), m_specifier_sp(), 3164 m_thread_spec_up() {} 3165 3166 Target::StopHook::StopHook(const StopHook &rhs) 3167 : UserID(rhs.GetID()), m_target_sp(rhs.m_target_sp), 3168 m_commands(rhs.m_commands), m_specifier_sp(rhs.m_specifier_sp), 3169 m_thread_spec_up(), m_active(rhs.m_active), 3170 m_auto_continue(rhs.m_auto_continue) { 3171 if (rhs.m_thread_spec_up) 3172 m_thread_spec_up.reset(new ThreadSpec(*rhs.m_thread_spec_up)); 3173 } 3174 3175 Target::StopHook::~StopHook() = default; 3176 3177 void Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) { 3178 m_specifier_sp.reset(specifier); 3179 } 3180 3181 void Target::StopHook::SetThreadSpecifier(ThreadSpec *specifier) { 3182 m_thread_spec_up.reset(specifier); 3183 } 3184 3185 void Target::StopHook::GetDescription(Stream *s, 3186 lldb::DescriptionLevel level) const { 3187 int indent_level = s->GetIndentLevel(); 3188 3189 s->SetIndentLevel(indent_level + 2); 3190 3191 s->Printf("Hook: %" PRIu64 "\n", GetID()); 3192 if (m_active) 3193 s->Indent("State: enabled\n"); 3194 else 3195 s->Indent("State: disabled\n"); 3196 3197 if (m_auto_continue) 3198 s->Indent("AutoContinue on\n"); 3199 3200 if (m_specifier_sp) { 3201 s->Indent(); 3202 s->PutCString("Specifier:\n"); 3203 s->SetIndentLevel(indent_level + 4); 3204 m_specifier_sp->GetDescription(s, level); 3205 s->SetIndentLevel(indent_level + 2); 3206 } 3207 3208 if (m_thread_spec_up) { 3209 StreamString tmp; 3210 s->Indent("Thread:\n"); 3211 m_thread_spec_up->GetDescription(&tmp, level); 3212 s->SetIndentLevel(indent_level + 4); 3213 s->Indent(tmp.GetString()); 3214 s->PutCString("\n"); 3215 s->SetIndentLevel(indent_level + 2); 3216 } 3217 3218 s->Indent("Commands: \n"); 3219 s->SetIndentLevel(indent_level + 4); 3220 uint32_t num_commands = m_commands.GetSize(); 3221 for (uint32_t i = 0; i < num_commands; i++) { 3222 s->Indent(m_commands.GetStringAtIndex(i)); 3223 s->PutCString("\n"); 3224 } 3225 s->SetIndentLevel(indent_level); 3226 } 3227 3228 // class TargetProperties 3229 3230 // clang-format off 3231 static constexpr OptionEnumValueElement g_dynamic_value_types[] = { 3232 {eNoDynamicValues, "no-dynamic-values", 3233 "Don't calculate the dynamic type of values"}, 3234 {eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values " 3235 "even if you have to run the target."}, 3236 {eDynamicDontRunTarget, "no-run-target", 3237 "Calculate the dynamic type of values, but don't run the target."} }; 3238 3239 OptionEnumValues lldb_private::GetDynamicValueTypes() { 3240 return OptionEnumValues(g_dynamic_value_types); 3241 } 3242 3243 static constexpr OptionEnumValueElement g_inline_breakpoint_enums[] = { 3244 {eInlineBreakpointsNever, "never", "Never look for inline breakpoint " 3245 "locations (fastest). This setting " 3246 "should only be used if you know that " 3247 "no inlining occurs in your programs."}, 3248 {eInlineBreakpointsHeaders, "headers", 3249 "Only check for inline breakpoint locations when setting breakpoints in " 3250 "header files, but not when setting breakpoint in implementation source " 3251 "files (default)."}, 3252 {eInlineBreakpointsAlways, "always", 3253 "Always look for inline breakpoint locations when setting file and line " 3254 "breakpoints (slower but most accurate)."} }; 3255 3256 typedef enum x86DisassemblyFlavor { 3257 eX86DisFlavorDefault, 3258 eX86DisFlavorIntel, 3259 eX86DisFlavorATT 3260 } x86DisassemblyFlavor; 3261 3262 static constexpr OptionEnumValueElement g_x86_dis_flavor_value_types[] = { 3263 {eX86DisFlavorDefault, "default", "Disassembler default (currently att)."}, 3264 {eX86DisFlavorIntel, "intel", "Intel disassembler flavor."}, 3265 {eX86DisFlavorATT, "att", "AT&T disassembler flavor."} }; 3266 3267 static constexpr OptionEnumValueElement g_hex_immediate_style_values[] = { 3268 {Disassembler::eHexStyleC, "c", "C-style (0xffff)."}, 3269 {Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."} }; 3270 3271 static constexpr OptionEnumValueElement g_load_script_from_sym_file_values[] = { 3272 {eLoadScriptFromSymFileTrue, "true", 3273 "Load debug scripts inside symbol files"}, 3274 {eLoadScriptFromSymFileFalse, "false", 3275 "Do not load debug scripts inside symbol files."}, 3276 {eLoadScriptFromSymFileWarn, "warn", 3277 "Warn about debug scripts inside symbol files but do not load them."} }; 3278 3279 static constexpr 3280 OptionEnumValueElement g_load_current_working_dir_lldbinit_values[] = { 3281 {eLoadCWDlldbinitTrue, "true", 3282 "Load .lldbinit files from current directory"}, 3283 {eLoadCWDlldbinitFalse, "false", 3284 "Do not load .lldbinit files from current directory"}, 3285 {eLoadCWDlldbinitWarn, "warn", 3286 "Warn about loading .lldbinit files from current directory"} }; 3287 3288 static constexpr OptionEnumValueElement g_memory_module_load_level_values[] = { 3289 {eMemoryModuleLoadLevelMinimal, "minimal", 3290 "Load minimal information when loading modules from memory. Currently " 3291 "this setting loads sections only."}, 3292 {eMemoryModuleLoadLevelPartial, "partial", 3293 "Load partial information when loading modules from memory. Currently " 3294 "this setting loads sections and function bounds."}, 3295 {eMemoryModuleLoadLevelComplete, "complete", 3296 "Load complete information when loading modules from memory. Currently " 3297 "this setting loads sections and all symbols."} }; 3298 3299 static constexpr PropertyDefinition g_properties[] = { 3300 {"default-arch", OptionValue::eTypeArch, true, 0, nullptr, {}, 3301 "Default architecture to choose, when there's a choice."}, 3302 {"move-to-nearest-code", OptionValue::eTypeBoolean, false, true, nullptr, 3303 {}, "Move breakpoints to nearest code."}, 3304 {"language", OptionValue::eTypeLanguage, false, eLanguageTypeUnknown, 3305 nullptr, {}, 3306 "The language to use when interpreting expressions entered in commands."}, 3307 {"expr-prefix", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3308 "Path to a file containing expressions to be prepended to all " 3309 "expressions."}, 3310 {"prefer-dynamic-value", OptionValue::eTypeEnum, false, 3311 eDynamicDontRunTarget, nullptr, OptionEnumValues(g_dynamic_value_types), 3312 "Should printed values be shown as their dynamic value."}, 3313 {"enable-synthetic-value", OptionValue::eTypeBoolean, false, true, nullptr, 3314 {}, "Should synthetic values be used by default whenever available."}, 3315 {"skip-prologue", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3316 "Skip function prologues when setting breakpoints by name."}, 3317 {"source-map", OptionValue::eTypePathMap, false, 0, nullptr, {}, 3318 "Source path remappings are used to track the change of location between " 3319 "a source file when built, and " 3320 "where it exists on the current system. It consists of an array of " 3321 "duples, the first element of each duple is " 3322 "some part (starting at the root) of the path to the file when it was " 3323 "built, " 3324 "and the second is where the remainder of the original build hierarchy is " 3325 "rooted on the local system. " 3326 "Each element of the array is checked in order and the first one that " 3327 "results in a match wins."}, 3328 {"exec-search-paths", OptionValue::eTypeFileSpecList, false, 0, nullptr, 3329 {}, "Executable search paths to use when locating executable files " 3330 "whose paths don't match the local file system."}, 3331 {"debug-file-search-paths", OptionValue::eTypeFileSpecList, false, 0, 3332 nullptr, {}, 3333 "List of directories to be searched when locating debug symbol files. " 3334 "See also symbols.enable-external-lookup."}, 3335 {"clang-module-search-paths", OptionValue::eTypeFileSpecList, false, 0, 3336 nullptr, {}, 3337 "List of directories to be searched when locating modules for Clang."}, 3338 {"auto-import-clang-modules", OptionValue::eTypeBoolean, false, true, 3339 nullptr, {}, 3340 "Automatically load Clang modules referred to by the program."}, 3341 {"import-std-module", OptionValue::eTypeBoolean, false, false, 3342 nullptr, {}, 3343 "Import the C++ std module to improve debugging STL containers."}, 3344 {"auto-apply-fixits", OptionValue::eTypeBoolean, false, true, nullptr, 3345 {}, "Automatically apply fix-it hints to expressions."}, 3346 {"notify-about-fixits", OptionValue::eTypeBoolean, false, true, nullptr, 3347 {}, "Print the fixed expression text."}, 3348 {"save-jit-objects", OptionValue::eTypeBoolean, false, false, nullptr, 3349 {}, "Save intermediate object files generated by the LLVM JIT"}, 3350 {"max-children-count", OptionValue::eTypeSInt64, false, 256, nullptr, 3351 {}, "Maximum number of children to expand in any level of depth."}, 3352 {"max-string-summary-length", OptionValue::eTypeSInt64, false, 1024, 3353 nullptr, {}, 3354 "Maximum number of characters to show when using %s in summary strings."}, 3355 {"max-memory-read-size", OptionValue::eTypeSInt64, false, 1024, nullptr, 3356 {}, "Maximum number of bytes that 'memory read' will fetch before " 3357 "--force must be specified."}, 3358 {"breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean, false, 3359 true, nullptr, {}, "Consult the platform module avoid list when " 3360 "setting non-module specific breakpoints."}, 3361 {"arg0", OptionValue::eTypeString, false, 0, nullptr, {}, 3362 "The first argument passed to the program in the argument array which can " 3363 "be different from the executable itself."}, 3364 {"run-args", OptionValue::eTypeArgs, false, 0, nullptr, {}, 3365 "A list containing all the arguments to be passed to the executable when " 3366 "it is run. Note that this does NOT include the argv[0] which is in " 3367 "target.arg0."}, 3368 {"env-vars", OptionValue::eTypeDictionary, false, OptionValue::eTypeString, 3369 nullptr, {}, "A list of all the environment variables to be passed " 3370 "to the executable's environment, and their values."}, 3371 {"inherit-env", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3372 "Inherit the environment from the process that is running LLDB."}, 3373 {"input-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3374 "The file/path to be used by the executable program for reading its " 3375 "standard input."}, 3376 {"output-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3377 "The file/path to be used by the executable program for writing its " 3378 "standard output."}, 3379 {"error-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3380 "The file/path to be used by the executable program for writing its " 3381 "standard error."}, 3382 {"detach-on-error", OptionValue::eTypeBoolean, false, true, nullptr, 3383 {}, "debugserver will detach (rather than killing) a process if it " 3384 "loses connection with lldb."}, 3385 {"preload-symbols", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3386 "Enable loading of symbol tables before they are needed."}, 3387 {"disable-aslr", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3388 "Disable Address Space Layout Randomization (ASLR)"}, 3389 {"disable-stdio", OptionValue::eTypeBoolean, false, false, nullptr, {}, 3390 "Disable stdin/stdout for process (e.g. for a GUI application)"}, 3391 {"inline-breakpoint-strategy", OptionValue::eTypeEnum, false, 3392 eInlineBreakpointsAlways, nullptr, 3393 OptionEnumValues(g_inline_breakpoint_enums), 3394 "The strategy to use when settings breakpoints by file and line. " 3395 "Breakpoint locations can end up being inlined by the compiler, so that a " 3396 "compile unit 'a.c' might contain an inlined function from another source " 3397 "file. " 3398 "Usually this is limited to breakpoint locations from inlined functions " 3399 "from header or other include files, or more accurately " 3400 "non-implementation source files. " 3401 "Sometimes code might #include implementation files and cause inlined " 3402 "breakpoint locations in inlined implementation files. " 3403 "Always checking for inlined breakpoint locations can be expensive " 3404 "(memory and time), so if you have a project with many headers " 3405 "and find that setting breakpoints is slow, then you can change this " 3406 "setting to headers. " 3407 "This setting allows you to control exactly which strategy is used when " 3408 "setting " 3409 "file and line breakpoints."}, 3410 // FIXME: This is the wrong way to do per-architecture settings, but we 3411 // don't have a general per architecture settings system in place yet. 3412 {"x86-disassembly-flavor", OptionValue::eTypeEnum, false, 3413 eX86DisFlavorDefault, nullptr, 3414 OptionEnumValues(g_x86_dis_flavor_value_types), 3415 "The default disassembly flavor to use for x86 or x86-64 targets."}, 3416 {"use-hex-immediates", OptionValue::eTypeBoolean, false, true, nullptr, 3417 {}, "Show immediates in disassembly as hexadecimal."}, 3418 {"hex-immediate-style", OptionValue::eTypeEnum, false, 3419 Disassembler::eHexStyleC, nullptr, 3420 OptionEnumValues(g_hex_immediate_style_values), 3421 "Which style to use for printing hexadecimal disassembly values."}, 3422 {"use-fast-stepping", OptionValue::eTypeBoolean, false, true, nullptr, 3423 {}, "Use a fast stepping algorithm based on running from branch to " 3424 "branch rather than instruction single-stepping."}, 3425 {"load-script-from-symbol-file", OptionValue::eTypeEnum, false, 3426 eLoadScriptFromSymFileWarn, nullptr, 3427 OptionEnumValues(g_load_script_from_sym_file_values), 3428 "Allow LLDB to load scripting resources embedded in symbol files when " 3429 "available."}, 3430 {"load-cwd-lldbinit", OptionValue::eTypeEnum, false, eLoadCWDlldbinitWarn, 3431 nullptr, OptionEnumValues(g_load_current_working_dir_lldbinit_values), 3432 "Allow LLDB to .lldbinit files from the current directory automatically."}, 3433 {"memory-module-load-level", OptionValue::eTypeEnum, false, 3434 eMemoryModuleLoadLevelComplete, nullptr, 3435 OptionEnumValues(g_memory_module_load_level_values), 3436 "Loading modules from memory can be slow as reading the symbol tables and " 3437 "other data can take a long time depending on your connection to the " 3438 "debug target. " 3439 "This setting helps users control how much information gets loaded when " 3440 "loading modules from memory." 3441 "'complete' is the default value for this setting which will load all " 3442 "sections and symbols by reading them from memory (slowest, most " 3443 "accurate). " 3444 "'partial' will load sections and attempt to find function bounds without " 3445 "downloading the symbol table (faster, still accurate, missing symbol " 3446 "names). " 3447 "'minimal' is the fastest setting and will load section data with no " 3448 "symbols, but should rarely be used as stack frames in these memory " 3449 "regions will be inaccurate and not provide any context (fastest). "}, 3450 {"display-expression-in-crashlogs", OptionValue::eTypeBoolean, false, false, 3451 nullptr, {}, "Expressions that crash will show up in crash logs if " 3452 "the host system supports executable specific crash log " 3453 "strings and this setting is set to true."}, 3454 {"trap-handler-names", OptionValue::eTypeArray, true, 3455 OptionValue::eTypeString, nullptr, {}, 3456 "A list of trap handler function names, e.g. a common Unix user process " 3457 "one is _sigtramp."}, 3458 {"display-runtime-support-values", OptionValue::eTypeBoolean, false, false, 3459 nullptr, {}, "If true, LLDB will show variables that are meant to " 3460 "support the operation of a language's runtime support."}, 3461 {"display-recognized-arguments", OptionValue::eTypeBoolean, false, false, 3462 nullptr, {}, "Show recognized arguments in variable listings by default."}, 3463 {"non-stop-mode", OptionValue::eTypeBoolean, false, 0, nullptr, {}, 3464 "Disable lock-step debugging, instead control threads independently."}, 3465 {"require-hardware-breakpoint", OptionValue::eTypeBoolean, false, 0, 3466 nullptr, {}, "Require all breakpoints to be hardware breakpoints."}}; 3467 // clang-format on 3468 3469 enum { 3470 ePropertyDefaultArch, 3471 ePropertyMoveToNearestCode, 3472 ePropertyLanguage, 3473 ePropertyExprPrefix, 3474 ePropertyPreferDynamic, 3475 ePropertyEnableSynthetic, 3476 ePropertySkipPrologue, 3477 ePropertySourceMap, 3478 ePropertyExecutableSearchPaths, 3479 ePropertyDebugFileSearchPaths, 3480 ePropertyClangModuleSearchPaths, 3481 ePropertyAutoImportClangModules, 3482 ePropertyImportStdModule, 3483 ePropertyAutoApplyFixIts, 3484 ePropertyNotifyAboutFixIts, 3485 ePropertySaveObjects, 3486 ePropertyMaxChildrenCount, 3487 ePropertyMaxSummaryLength, 3488 ePropertyMaxMemReadSize, 3489 ePropertyBreakpointUseAvoidList, 3490 ePropertyArg0, 3491 ePropertyRunArgs, 3492 ePropertyEnvVars, 3493 ePropertyInheritEnv, 3494 ePropertyInputPath, 3495 ePropertyOutputPath, 3496 ePropertyErrorPath, 3497 ePropertyDetachOnError, 3498 ePropertyPreloadSymbols, 3499 ePropertyDisableASLR, 3500 ePropertyDisableSTDIO, 3501 ePropertyInlineStrategy, 3502 ePropertyDisassemblyFlavor, 3503 ePropertyUseHexImmediates, 3504 ePropertyHexImmediateStyle, 3505 ePropertyUseFastStepping, 3506 ePropertyLoadScriptFromSymbolFile, 3507 ePropertyLoadCWDlldbinitFile, 3508 ePropertyMemoryModuleLoadLevel, 3509 ePropertyDisplayExpressionsInCrashlogs, 3510 ePropertyTrapHandlerNames, 3511 ePropertyDisplayRuntimeSupportValues, 3512 ePropertyDisplayRecognizedArguments, 3513 ePropertyNonStopModeEnabled, 3514 ePropertyRequireHardwareBreakpoints, 3515 ePropertyExperimental, 3516 }; 3517 3518 class TargetOptionValueProperties : public OptionValueProperties { 3519 public: 3520 TargetOptionValueProperties(ConstString name) 3521 : OptionValueProperties(name), m_target(nullptr), m_got_host_env(false) {} 3522 3523 // This constructor is used when creating TargetOptionValueProperties when it 3524 // is part of a new lldb_private::Target instance. It will copy all current 3525 // global property values as needed 3526 TargetOptionValueProperties(Target *target, 3527 const TargetPropertiesSP &target_properties_sp) 3528 : OptionValueProperties(*target_properties_sp->GetValueProperties()), 3529 m_target(target), m_got_host_env(false) {} 3530 3531 const Property *GetPropertyAtIndex(const ExecutionContext *exe_ctx, 3532 bool will_modify, 3533 uint32_t idx) const override { 3534 // When getting the value for a key from the target options, we will always 3535 // try and grab the setting from the current target if there is one. Else 3536 // we just use the one from this instance. 3537 if (idx == ePropertyEnvVars) 3538 GetHostEnvironmentIfNeeded(); 3539 3540 if (exe_ctx) { 3541 Target *target = exe_ctx->GetTargetPtr(); 3542 if (target) { 3543 TargetOptionValueProperties *target_properties = 3544 static_cast<TargetOptionValueProperties *>( 3545 target->GetValueProperties().get()); 3546 if (this != target_properties) 3547 return target_properties->ProtectedGetPropertyAtIndex(idx); 3548 } 3549 } 3550 return ProtectedGetPropertyAtIndex(idx); 3551 } 3552 3553 lldb::TargetSP GetTargetSP() { return m_target->shared_from_this(); } 3554 3555 protected: 3556 void GetHostEnvironmentIfNeeded() const { 3557 if (!m_got_host_env) { 3558 if (m_target) { 3559 m_got_host_env = true; 3560 const uint32_t idx = ePropertyInheritEnv; 3561 if (GetPropertyAtIndexAsBoolean( 3562 nullptr, idx, g_properties[idx].default_uint_value != 0)) { 3563 PlatformSP platform_sp(m_target->GetPlatform()); 3564 if (platform_sp) { 3565 Environment env = platform_sp->GetEnvironment(); 3566 OptionValueDictionary *env_dict = 3567 GetPropertyAtIndexAsOptionValueDictionary(nullptr, 3568 ePropertyEnvVars); 3569 if (env_dict) { 3570 const bool can_replace = false; 3571 for (const auto &KV : env) { 3572 // Don't allow existing keys to be replaced with ones we get 3573 // from the platform environment 3574 env_dict->SetValueForKey( 3575 ConstString(KV.first()), 3576 OptionValueSP(new OptionValueString(KV.second.c_str())), 3577 can_replace); 3578 } 3579 } 3580 } 3581 } 3582 } 3583 } 3584 } 3585 Target *m_target; 3586 mutable bool m_got_host_env; 3587 }; 3588 3589 // TargetProperties 3590 static constexpr PropertyDefinition g_experimental_properties[]{ 3591 {"inject-local-vars", OptionValue::eTypeBoolean, true, true, nullptr, 3592 {}, 3593 "If true, inject local variables explicitly into the expression text. " 3594 "This will fix symbol resolution when there are name collisions between " 3595 "ivars and local variables. " 3596 "But it can make expressions run much more slowly."}, 3597 {"use-modern-type-lookup", OptionValue::eTypeBoolean, true, false, nullptr, 3598 {}, "If true, use Clang's modern type lookup infrastructure."}}; 3599 3600 enum { ePropertyInjectLocalVars = 0, ePropertyUseModernTypeLookup }; 3601 3602 class TargetExperimentalOptionValueProperties : public OptionValueProperties { 3603 public: 3604 TargetExperimentalOptionValueProperties() 3605 : OptionValueProperties( 3606 ConstString(Properties::GetExperimentalSettingsName())) {} 3607 }; 3608 3609 TargetExperimentalProperties::TargetExperimentalProperties() 3610 : Properties(OptionValuePropertiesSP( 3611 new TargetExperimentalOptionValueProperties())) { 3612 m_collection_sp->Initialize(g_experimental_properties); 3613 } 3614 3615 // TargetProperties 3616 TargetProperties::TargetProperties(Target *target) 3617 : Properties(), m_launch_info() { 3618 if (target) { 3619 m_collection_sp = std::make_shared<TargetOptionValueProperties>( 3620 target, Target::GetGlobalProperties()); 3621 3622 // Set callbacks to update launch_info whenever "settins set" updated any 3623 // of these properties 3624 m_collection_sp->SetValueChangedCallback( 3625 ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this); 3626 m_collection_sp->SetValueChangedCallback( 3627 ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this); 3628 m_collection_sp->SetValueChangedCallback( 3629 ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this); 3630 m_collection_sp->SetValueChangedCallback( 3631 ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, 3632 this); 3633 m_collection_sp->SetValueChangedCallback( 3634 ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, 3635 this); 3636 m_collection_sp->SetValueChangedCallback( 3637 ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, 3638 this); 3639 m_collection_sp->SetValueChangedCallback( 3640 ePropertyDetachOnError, 3641 TargetProperties::DetachOnErrorValueChangedCallback, this); 3642 m_collection_sp->SetValueChangedCallback( 3643 ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, 3644 this); 3645 m_collection_sp->SetValueChangedCallback( 3646 ePropertyDisableSTDIO, 3647 TargetProperties::DisableSTDIOValueChangedCallback, this); 3648 3649 m_experimental_properties_up.reset(new TargetExperimentalProperties()); 3650 m_collection_sp->AppendProperty( 3651 ConstString(Properties::GetExperimentalSettingsName()), 3652 ConstString("Experimental settings - setting these won't produce " 3653 "errors if the setting is not present."), 3654 true, m_experimental_properties_up->GetValueProperties()); 3655 3656 // Update m_launch_info once it was created 3657 Arg0ValueChangedCallback(this, nullptr); 3658 RunArgsValueChangedCallback(this, nullptr); 3659 // EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in 3660 // Target::GetPlatform() 3661 InputPathValueChangedCallback(this, nullptr); 3662 OutputPathValueChangedCallback(this, nullptr); 3663 ErrorPathValueChangedCallback(this, nullptr); 3664 DetachOnErrorValueChangedCallback(this, nullptr); 3665 DisableASLRValueChangedCallback(this, nullptr); 3666 DisableSTDIOValueChangedCallback(this, nullptr); 3667 } else { 3668 m_collection_sp = 3669 std::make_shared<TargetOptionValueProperties>(ConstString("target")); 3670 m_collection_sp->Initialize(g_properties); 3671 m_experimental_properties_up.reset(new TargetExperimentalProperties()); 3672 m_collection_sp->AppendProperty( 3673 ConstString(Properties::GetExperimentalSettingsName()), 3674 ConstString("Experimental settings - setting these won't produce " 3675 "errors if the setting is not present."), 3676 true, m_experimental_properties_up->GetValueProperties()); 3677 m_collection_sp->AppendProperty( 3678 ConstString("process"), ConstString("Settings specific to processes."), 3679 true, Process::GetGlobalProperties()->GetValueProperties()); 3680 } 3681 } 3682 3683 TargetProperties::~TargetProperties() = default; 3684 3685 bool TargetProperties::GetInjectLocalVariables( 3686 ExecutionContext *exe_ctx) const { 3687 const Property *exp_property = m_collection_sp->GetPropertyAtIndex( 3688 exe_ctx, false, ePropertyExperimental); 3689 OptionValueProperties *exp_values = 3690 exp_property->GetValue()->GetAsProperties(); 3691 if (exp_values) 3692 return exp_values->GetPropertyAtIndexAsBoolean( 3693 exe_ctx, ePropertyInjectLocalVars, true); 3694 else 3695 return true; 3696 } 3697 3698 void TargetProperties::SetInjectLocalVariables(ExecutionContext *exe_ctx, 3699 bool b) { 3700 const Property *exp_property = 3701 m_collection_sp->GetPropertyAtIndex(exe_ctx, true, ePropertyExperimental); 3702 OptionValueProperties *exp_values = 3703 exp_property->GetValue()->GetAsProperties(); 3704 if (exp_values) 3705 exp_values->SetPropertyAtIndexAsBoolean(exe_ctx, ePropertyInjectLocalVars, 3706 true); 3707 } 3708 3709 bool TargetProperties::GetUseModernTypeLookup() const { 3710 const Property *exp_property = m_collection_sp->GetPropertyAtIndex( 3711 nullptr, false, ePropertyExperimental); 3712 OptionValueProperties *exp_values = 3713 exp_property->GetValue()->GetAsProperties(); 3714 if (exp_values) 3715 return exp_values->GetPropertyAtIndexAsBoolean( 3716 nullptr, ePropertyUseModernTypeLookup, true); 3717 else 3718 return true; 3719 } 3720 3721 ArchSpec TargetProperties::GetDefaultArchitecture() const { 3722 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch( 3723 nullptr, ePropertyDefaultArch); 3724 if (value) 3725 return value->GetCurrentValue(); 3726 return ArchSpec(); 3727 } 3728 3729 void TargetProperties::SetDefaultArchitecture(const ArchSpec &arch) { 3730 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch( 3731 nullptr, ePropertyDefaultArch); 3732 if (value) 3733 return value->SetCurrentValue(arch, true); 3734 } 3735 3736 bool TargetProperties::GetMoveToNearestCode() const { 3737 const uint32_t idx = ePropertyMoveToNearestCode; 3738 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3739 nullptr, idx, g_properties[idx].default_uint_value != 0); 3740 } 3741 3742 lldb::DynamicValueType TargetProperties::GetPreferDynamicValue() const { 3743 const uint32_t idx = ePropertyPreferDynamic; 3744 return (lldb::DynamicValueType) 3745 m_collection_sp->GetPropertyAtIndexAsEnumeration( 3746 nullptr, idx, g_properties[idx].default_uint_value); 3747 } 3748 3749 bool TargetProperties::SetPreferDynamicValue(lldb::DynamicValueType d) { 3750 const uint32_t idx = ePropertyPreferDynamic; 3751 return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d); 3752 } 3753 3754 bool TargetProperties::GetPreloadSymbols() const { 3755 const uint32_t idx = ePropertyPreloadSymbols; 3756 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3757 nullptr, idx, g_properties[idx].default_uint_value != 0); 3758 } 3759 3760 void TargetProperties::SetPreloadSymbols(bool b) { 3761 const uint32_t idx = ePropertyPreloadSymbols; 3762 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3763 } 3764 3765 bool TargetProperties::GetDisableASLR() const { 3766 const uint32_t idx = ePropertyDisableASLR; 3767 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3768 nullptr, idx, g_properties[idx].default_uint_value != 0); 3769 } 3770 3771 void TargetProperties::SetDisableASLR(bool b) { 3772 const uint32_t idx = ePropertyDisableASLR; 3773 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3774 } 3775 3776 bool TargetProperties::GetDetachOnError() const { 3777 const uint32_t idx = ePropertyDetachOnError; 3778 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3779 nullptr, idx, g_properties[idx].default_uint_value != 0); 3780 } 3781 3782 void TargetProperties::SetDetachOnError(bool b) { 3783 const uint32_t idx = ePropertyDetachOnError; 3784 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3785 } 3786 3787 bool TargetProperties::GetDisableSTDIO() const { 3788 const uint32_t idx = ePropertyDisableSTDIO; 3789 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3790 nullptr, idx, g_properties[idx].default_uint_value != 0); 3791 } 3792 3793 void TargetProperties::SetDisableSTDIO(bool b) { 3794 const uint32_t idx = ePropertyDisableSTDIO; 3795 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3796 } 3797 3798 const char *TargetProperties::GetDisassemblyFlavor() const { 3799 const uint32_t idx = ePropertyDisassemblyFlavor; 3800 const char *return_value; 3801 3802 x86DisassemblyFlavor flavor_value = 3803 (x86DisassemblyFlavor)m_collection_sp->GetPropertyAtIndexAsEnumeration( 3804 nullptr, idx, g_properties[idx].default_uint_value); 3805 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value; 3806 return return_value; 3807 } 3808 3809 InlineStrategy TargetProperties::GetInlineStrategy() const { 3810 const uint32_t idx = ePropertyInlineStrategy; 3811 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration( 3812 nullptr, idx, g_properties[idx].default_uint_value); 3813 } 3814 3815 llvm::StringRef TargetProperties::GetArg0() const { 3816 const uint32_t idx = ePropertyArg0; 3817 return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx, llvm::StringRef()); 3818 } 3819 3820 void TargetProperties::SetArg0(llvm::StringRef arg) { 3821 const uint32_t idx = ePropertyArg0; 3822 m_collection_sp->SetPropertyAtIndexAsString( 3823 nullptr, idx, arg); 3824 m_launch_info.SetArg0(arg); 3825 } 3826 3827 bool TargetProperties::GetRunArguments(Args &args) const { 3828 const uint32_t idx = ePropertyRunArgs; 3829 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args); 3830 } 3831 3832 void TargetProperties::SetRunArguments(const Args &args) { 3833 const uint32_t idx = ePropertyRunArgs; 3834 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args); 3835 m_launch_info.GetArguments() = args; 3836 } 3837 3838 Environment TargetProperties::GetEnvironment() const { 3839 // TODO: Get rid of the Args intermediate step 3840 Args env; 3841 const uint32_t idx = ePropertyEnvVars; 3842 m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env); 3843 return Environment(env); 3844 } 3845 3846 void TargetProperties::SetEnvironment(Environment env) { 3847 // TODO: Get rid of the Args intermediate step 3848 const uint32_t idx = ePropertyEnvVars; 3849 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, Args(env)); 3850 m_launch_info.GetEnvironment() = std::move(env); 3851 } 3852 3853 bool TargetProperties::GetSkipPrologue() const { 3854 const uint32_t idx = ePropertySkipPrologue; 3855 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3856 nullptr, idx, g_properties[idx].default_uint_value != 0); 3857 } 3858 3859 PathMappingList &TargetProperties::GetSourcePathMap() const { 3860 const uint32_t idx = ePropertySourceMap; 3861 OptionValuePathMappings *option_value = 3862 m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr, 3863 false, idx); 3864 assert(option_value); 3865 return option_value->GetCurrentValue(); 3866 } 3867 3868 FileSpecList &TargetProperties::GetExecutableSearchPaths() { 3869 const uint32_t idx = ePropertyExecutableSearchPaths; 3870 OptionValueFileSpecList *option_value = 3871 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3872 false, idx); 3873 assert(option_value); 3874 return option_value->GetCurrentValue(); 3875 } 3876 3877 FileSpecList &TargetProperties::GetDebugFileSearchPaths() { 3878 const uint32_t idx = ePropertyDebugFileSearchPaths; 3879 OptionValueFileSpecList *option_value = 3880 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3881 false, idx); 3882 assert(option_value); 3883 return option_value->GetCurrentValue(); 3884 } 3885 3886 FileSpecList &TargetProperties::GetClangModuleSearchPaths() { 3887 const uint32_t idx = ePropertyClangModuleSearchPaths; 3888 OptionValueFileSpecList *option_value = 3889 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3890 false, idx); 3891 assert(option_value); 3892 return option_value->GetCurrentValue(); 3893 } 3894 3895 bool TargetProperties::GetEnableAutoImportClangModules() const { 3896 const uint32_t idx = ePropertyAutoImportClangModules; 3897 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3898 nullptr, idx, g_properties[idx].default_uint_value != 0); 3899 } 3900 3901 bool TargetProperties::GetEnableImportStdModule() const { 3902 const uint32_t idx = ePropertyImportStdModule; 3903 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3904 nullptr, idx, g_properties[idx].default_uint_value != 0); 3905 } 3906 3907 bool TargetProperties::GetEnableAutoApplyFixIts() const { 3908 const uint32_t idx = ePropertyAutoApplyFixIts; 3909 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3910 nullptr, idx, g_properties[idx].default_uint_value != 0); 3911 } 3912 3913 bool TargetProperties::GetEnableNotifyAboutFixIts() const { 3914 const uint32_t idx = ePropertyNotifyAboutFixIts; 3915 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3916 nullptr, idx, g_properties[idx].default_uint_value != 0); 3917 } 3918 3919 bool TargetProperties::GetEnableSaveObjects() const { 3920 const uint32_t idx = ePropertySaveObjects; 3921 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3922 nullptr, idx, g_properties[idx].default_uint_value != 0); 3923 } 3924 3925 bool TargetProperties::GetEnableSyntheticValue() const { 3926 const uint32_t idx = ePropertyEnableSynthetic; 3927 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3928 nullptr, idx, g_properties[idx].default_uint_value != 0); 3929 } 3930 3931 uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const { 3932 const uint32_t idx = ePropertyMaxChildrenCount; 3933 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3934 nullptr, idx, g_properties[idx].default_uint_value); 3935 } 3936 3937 uint32_t TargetProperties::GetMaximumSizeOfStringSummary() const { 3938 const uint32_t idx = ePropertyMaxSummaryLength; 3939 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3940 nullptr, idx, g_properties[idx].default_uint_value); 3941 } 3942 3943 uint32_t TargetProperties::GetMaximumMemReadSize() const { 3944 const uint32_t idx = ePropertyMaxMemReadSize; 3945 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3946 nullptr, idx, g_properties[idx].default_uint_value); 3947 } 3948 3949 FileSpec TargetProperties::GetStandardInputPath() const { 3950 const uint32_t idx = ePropertyInputPath; 3951 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3952 } 3953 3954 void TargetProperties::SetStandardInputPath(llvm::StringRef path) { 3955 const uint32_t idx = ePropertyInputPath; 3956 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3957 } 3958 3959 FileSpec TargetProperties::GetStandardOutputPath() const { 3960 const uint32_t idx = ePropertyOutputPath; 3961 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3962 } 3963 3964 void TargetProperties::SetStandardOutputPath(llvm::StringRef path) { 3965 const uint32_t idx = ePropertyOutputPath; 3966 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3967 } 3968 3969 FileSpec TargetProperties::GetStandardErrorPath() const { 3970 const uint32_t idx = ePropertyErrorPath; 3971 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3972 } 3973 3974 void TargetProperties::SetStandardErrorPath(llvm::StringRef path) { 3975 const uint32_t idx = ePropertyErrorPath; 3976 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3977 } 3978 3979 LanguageType TargetProperties::GetLanguage() const { 3980 OptionValueLanguage *value = 3981 m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage( 3982 nullptr, ePropertyLanguage); 3983 if (value) 3984 return value->GetCurrentValue(); 3985 return LanguageType(); 3986 } 3987 3988 llvm::StringRef TargetProperties::GetExpressionPrefixContents() { 3989 const uint32_t idx = ePropertyExprPrefix; 3990 OptionValueFileSpec *file = 3991 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false, 3992 idx); 3993 if (file) { 3994 DataBufferSP data_sp(file->GetFileContents()); 3995 if (data_sp) 3996 return llvm::StringRef( 3997 reinterpret_cast<const char *>(data_sp->GetBytes()), 3998 data_sp->GetByteSize()); 3999 } 4000 return ""; 4001 } 4002 4003 bool TargetProperties::GetBreakpointsConsultPlatformAvoidList() { 4004 const uint32_t idx = ePropertyBreakpointUseAvoidList; 4005 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4006 nullptr, idx, g_properties[idx].default_uint_value != 0); 4007 } 4008 4009 bool TargetProperties::GetUseHexImmediates() const { 4010 const uint32_t idx = ePropertyUseHexImmediates; 4011 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4012 nullptr, idx, g_properties[idx].default_uint_value != 0); 4013 } 4014 4015 bool TargetProperties::GetUseFastStepping() const { 4016 const uint32_t idx = ePropertyUseFastStepping; 4017 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4018 nullptr, idx, g_properties[idx].default_uint_value != 0); 4019 } 4020 4021 bool TargetProperties::GetDisplayExpressionsInCrashlogs() const { 4022 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs; 4023 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4024 nullptr, idx, g_properties[idx].default_uint_value != 0); 4025 } 4026 4027 LoadScriptFromSymFile TargetProperties::GetLoadScriptFromSymbolFile() const { 4028 const uint32_t idx = ePropertyLoadScriptFromSymbolFile; 4029 return (LoadScriptFromSymFile) 4030 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4031 nullptr, idx, g_properties[idx].default_uint_value); 4032 } 4033 4034 LoadCWDlldbinitFile TargetProperties::GetLoadCWDlldbinitFile() const { 4035 const uint32_t idx = ePropertyLoadCWDlldbinitFile; 4036 return (LoadCWDlldbinitFile)m_collection_sp->GetPropertyAtIndexAsEnumeration( 4037 nullptr, idx, g_properties[idx].default_uint_value); 4038 } 4039 4040 Disassembler::HexImmediateStyle TargetProperties::GetHexImmediateStyle() const { 4041 const uint32_t idx = ePropertyHexImmediateStyle; 4042 return (Disassembler::HexImmediateStyle) 4043 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4044 nullptr, idx, g_properties[idx].default_uint_value); 4045 } 4046 4047 MemoryModuleLoadLevel TargetProperties::GetMemoryModuleLoadLevel() const { 4048 const uint32_t idx = ePropertyMemoryModuleLoadLevel; 4049 return (MemoryModuleLoadLevel) 4050 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4051 nullptr, idx, g_properties[idx].default_uint_value); 4052 } 4053 4054 bool TargetProperties::GetUserSpecifiedTrapHandlerNames(Args &args) const { 4055 const uint32_t idx = ePropertyTrapHandlerNames; 4056 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args); 4057 } 4058 4059 void TargetProperties::SetUserSpecifiedTrapHandlerNames(const Args &args) { 4060 const uint32_t idx = ePropertyTrapHandlerNames; 4061 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args); 4062 } 4063 4064 bool TargetProperties::GetDisplayRuntimeSupportValues() const { 4065 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 4066 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4067 } 4068 4069 void TargetProperties::SetDisplayRuntimeSupportValues(bool b) { 4070 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 4071 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4072 } 4073 4074 bool TargetProperties::GetDisplayRecognizedArguments() const { 4075 const uint32_t idx = ePropertyDisplayRecognizedArguments; 4076 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4077 } 4078 4079 void TargetProperties::SetDisplayRecognizedArguments(bool b) { 4080 const uint32_t idx = ePropertyDisplayRecognizedArguments; 4081 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4082 } 4083 4084 bool TargetProperties::GetNonStopModeEnabled() const { 4085 const uint32_t idx = ePropertyNonStopModeEnabled; 4086 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4087 } 4088 4089 void TargetProperties::SetNonStopModeEnabled(bool b) { 4090 const uint32_t idx = ePropertyNonStopModeEnabled; 4091 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4092 } 4093 4094 const ProcessLaunchInfo &TargetProperties::GetProcessLaunchInfo() { 4095 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work 4096 return m_launch_info; 4097 } 4098 4099 void TargetProperties::SetProcessLaunchInfo( 4100 const ProcessLaunchInfo &launch_info) { 4101 m_launch_info = launch_info; 4102 SetArg0(launch_info.GetArg0()); 4103 SetRunArguments(launch_info.GetArguments()); 4104 SetEnvironment(launch_info.GetEnvironment()); 4105 const FileAction *input_file_action = 4106 launch_info.GetFileActionForFD(STDIN_FILENO); 4107 if (input_file_action) { 4108 SetStandardInputPath(input_file_action->GetPath()); 4109 } 4110 const FileAction *output_file_action = 4111 launch_info.GetFileActionForFD(STDOUT_FILENO); 4112 if (output_file_action) { 4113 SetStandardOutputPath(output_file_action->GetPath()); 4114 } 4115 const FileAction *error_file_action = 4116 launch_info.GetFileActionForFD(STDERR_FILENO); 4117 if (error_file_action) { 4118 SetStandardErrorPath(error_file_action->GetPath()); 4119 } 4120 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError)); 4121 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR)); 4122 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO)); 4123 } 4124 4125 bool TargetProperties::GetRequireHardwareBreakpoints() const { 4126 const uint32_t idx = ePropertyRequireHardwareBreakpoints; 4127 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4128 nullptr, idx, g_properties[idx].default_uint_value != 0); 4129 } 4130 4131 void TargetProperties::SetRequireHardwareBreakpoints(bool b) { 4132 const uint32_t idx = ePropertyRequireHardwareBreakpoints; 4133 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4134 } 4135 4136 void TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, 4137 OptionValue *) { 4138 TargetProperties *this_ = 4139 reinterpret_cast<TargetProperties *>(target_property_ptr); 4140 this_->m_launch_info.SetArg0(this_->GetArg0()); 4141 } 4142 4143 void TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, 4144 OptionValue *) { 4145 TargetProperties *this_ = 4146 reinterpret_cast<TargetProperties *>(target_property_ptr); 4147 Args args; 4148 if (this_->GetRunArguments(args)) 4149 this_->m_launch_info.GetArguments() = args; 4150 } 4151 4152 void TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, 4153 OptionValue *) { 4154 TargetProperties *this_ = 4155 reinterpret_cast<TargetProperties *>(target_property_ptr); 4156 this_->m_launch_info.GetEnvironment() = this_->GetEnvironment(); 4157 } 4158 4159 void TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, 4160 OptionValue *) { 4161 TargetProperties *this_ = 4162 reinterpret_cast<TargetProperties *>(target_property_ptr); 4163 this_->m_launch_info.AppendOpenFileAction( 4164 STDIN_FILENO, this_->GetStandardInputPath(), true, false); 4165 } 4166 4167 void TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, 4168 OptionValue *) { 4169 TargetProperties *this_ = 4170 reinterpret_cast<TargetProperties *>(target_property_ptr); 4171 this_->m_launch_info.AppendOpenFileAction( 4172 STDOUT_FILENO, this_->GetStandardOutputPath(), false, true); 4173 } 4174 4175 void TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, 4176 OptionValue *) { 4177 TargetProperties *this_ = 4178 reinterpret_cast<TargetProperties *>(target_property_ptr); 4179 this_->m_launch_info.AppendOpenFileAction( 4180 STDERR_FILENO, this_->GetStandardErrorPath(), false, true); 4181 } 4182 4183 void TargetProperties::DetachOnErrorValueChangedCallback( 4184 void *target_property_ptr, OptionValue *) { 4185 TargetProperties *this_ = 4186 reinterpret_cast<TargetProperties *>(target_property_ptr); 4187 if (this_->GetDetachOnError()) 4188 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError); 4189 else 4190 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError); 4191 } 4192 4193 void TargetProperties::DisableASLRValueChangedCallback( 4194 void *target_property_ptr, OptionValue *) { 4195 TargetProperties *this_ = 4196 reinterpret_cast<TargetProperties *>(target_property_ptr); 4197 if (this_->GetDisableASLR()) 4198 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR); 4199 else 4200 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR); 4201 } 4202 4203 void TargetProperties::DisableSTDIOValueChangedCallback( 4204 void *target_property_ptr, OptionValue *) { 4205 TargetProperties *this_ = 4206 reinterpret_cast<TargetProperties *>(target_property_ptr); 4207 if (this_->GetDisableSTDIO()) 4208 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO); 4209 else 4210 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO); 4211 } 4212 4213 // Target::TargetEventData 4214 4215 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp) 4216 : EventData(), m_target_sp(target_sp), m_module_list() {} 4217 4218 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp, 4219 const ModuleList &module_list) 4220 : EventData(), m_target_sp(target_sp), m_module_list(module_list) {} 4221 4222 Target::TargetEventData::~TargetEventData() = default; 4223 4224 ConstString Target::TargetEventData::GetFlavorString() { 4225 static ConstString g_flavor("Target::TargetEventData"); 4226 return g_flavor; 4227 } 4228 4229 void Target::TargetEventData::Dump(Stream *s) const { 4230 for (size_t i = 0; i < m_module_list.GetSize(); ++i) { 4231 if (i != 0) 4232 *s << ", "; 4233 m_module_list.GetModuleAtIndex(i)->GetDescription( 4234 s, lldb::eDescriptionLevelBrief); 4235 } 4236 } 4237 4238 const Target::TargetEventData * 4239 Target::TargetEventData::GetEventDataFromEvent(const Event *event_ptr) { 4240 if (event_ptr) { 4241 const EventData *event_data = event_ptr->GetData(); 4242 if (event_data && 4243 event_data->GetFlavor() == TargetEventData::GetFlavorString()) 4244 return static_cast<const TargetEventData *>(event_ptr->GetData()); 4245 } 4246 return nullptr; 4247 } 4248 4249 TargetSP Target::TargetEventData::GetTargetFromEvent(const Event *event_ptr) { 4250 TargetSP target_sp; 4251 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr); 4252 if (event_data) 4253 target_sp = event_data->m_target_sp; 4254 return target_sp; 4255 } 4256 4257 ModuleList 4258 Target::TargetEventData::GetModuleListFromEvent(const Event *event_ptr) { 4259 ModuleList module_list; 4260 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr); 4261 if (event_data) 4262 module_list = event_data->m_module_list; 4263 return module_list; 4264 } 4265