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