1 //===-- Target.cpp ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
13 // Other libraries and framework includes
15 #include "Plugins/ExpressionParser/Clang/ClangASTSource.h"
16 #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
17 #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
18 #include "lldb/Breakpoint/BreakpointIDList.h"
19 #include "lldb/Breakpoint/BreakpointResolver.h"
20 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
21 #include "lldb/Breakpoint/BreakpointResolverFileLine.h"
22 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
23 #include "lldb/Breakpoint/BreakpointResolverName.h"
24 #include "lldb/Breakpoint/Watchpoint.h"
25 #include "lldb/Core/Debugger.h"
26 #include "lldb/Core/Event.h"
27 #include "lldb/Core/Module.h"
28 #include "lldb/Core/ModuleSpec.h"
29 #include "lldb/Core/Section.h"
30 #include "lldb/Core/SourceManager.h"
31 #include "lldb/Core/State.h"
32 #include "lldb/Core/StreamFile.h"
33 #include "lldb/Core/ValueObject.h"
34 #include "lldb/Expression/REPL.h"
35 #include "lldb/Expression/UserExpression.h"
36 #include "lldb/Host/Host.h"
37 #include "lldb/Host/PosixApi.h"
38 #include "lldb/Interpreter/CommandInterpreter.h"
39 #include "lldb/Interpreter/CommandReturnObject.h"
40 #include "lldb/Interpreter/OptionGroupWatchpoint.h"
41 #include "lldb/Interpreter/OptionValues.h"
42 #include "lldb/Interpreter/Property.h"
43 #include "lldb/Symbol/ClangASTContext.h"
44 #include "lldb/Symbol/Function.h"
45 #include "lldb/Symbol/ObjectFile.h"
46 #include "lldb/Symbol/Symbol.h"
47 #include "lldb/Target/Language.h"
48 #include "lldb/Target/LanguageRuntime.h"
49 #include "lldb/Target/ObjCLanguageRuntime.h"
50 #include "lldb/Target/Process.h"
51 #include "lldb/Target/SectionLoadList.h"
52 #include "lldb/Target/StackFrame.h"
53 #include "lldb/Target/SystemRuntime.h"
54 #include "lldb/Target/Target.h"
55 #include "lldb/Target/Thread.h"
56 #include "lldb/Target/ThreadSpec.h"
57 #include "lldb/Utility/FileSpec.h"
58 #include "lldb/Utility/LLDBAssert.h"
59 #include "lldb/Utility/Log.h"
60 #include "lldb/Utility/StreamString.h"
61 #include "lldb/Utility/Timer.h"
64 using namespace lldb_private;
66 constexpr std::chrono::milliseconds EvaluateExpressionOptions::default_timeout;
68 ConstString &Target::GetStaticBroadcasterClass() {
69 static ConstString class_name("lldb.target");
73 Target::Target(Debugger &debugger, const ArchSpec &target_arch,
74 const lldb::PlatformSP &platform_sp, bool is_dummy_target)
75 : TargetProperties(this),
76 Broadcaster(debugger.GetBroadcasterManager(),
77 Target::GetStaticBroadcasterClass().AsCString()),
78 ExecutionContextScope(), m_debugger(debugger), m_platform_sp(platform_sp),
79 m_mutex(), m_arch(target_arch), m_images(this), m_section_load_history(),
80 m_breakpoint_list(false), m_internal_breakpoint_list(true),
81 m_watchpoint_list(), m_process_sp(), m_search_filter_sp(),
82 m_image_search_paths(ImageSearchPathsChanged, this), m_ast_importer_sp(),
83 m_source_manager_ap(), m_stop_hooks(), m_stop_hook_next_id(0),
84 m_valid(true), m_suppress_stop_hooks(false),
85 m_is_dummy_target(is_dummy_target)
88 SetEventName(eBroadcastBitBreakpointChanged, "breakpoint-changed");
89 SetEventName(eBroadcastBitModulesLoaded, "modules-loaded");
90 SetEventName(eBroadcastBitModulesUnloaded, "modules-unloaded");
91 SetEventName(eBroadcastBitWatchpointChanged, "watchpoint-changed");
92 SetEventName(eBroadcastBitSymbolsLoaded, "symbols-loaded");
96 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
98 log->Printf("%p Target::Target()", static_cast<void *>(this));
99 if (m_arch.IsValid()) {
100 LogIfAnyCategoriesSet(
101 LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)",
102 m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
107 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
109 log->Printf("%p Target::~Target()", static_cast<void *>(this));
110 DeleteCurrentProcess();
113 void Target::PrimeFromDummyTarget(Target *target) {
117 m_stop_hooks = target->m_stop_hooks;
119 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints()) {
120 if (breakpoint_sp->IsInternal())
123 BreakpointSP new_bp(new Breakpoint(*this, *breakpoint_sp.get()));
124 AddBreakpoint(new_bp, false);
128 void Target::Dump(Stream *s, lldb::DescriptionLevel description_level) {
129 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
130 if (description_level != lldb::eDescriptionLevelBrief) {
132 s->PutCString("Target\n");
135 m_breakpoint_list.Dump(s);
136 m_internal_breakpoint_list.Dump(s);
139 Module *exe_module = GetExecutableModulePointer();
141 s->PutCString(exe_module->GetFileSpec().GetFilename().GetCString());
143 s->PutCString("No executable module.");
147 void Target::CleanupProcess() {
148 // Do any cleanup of the target we need to do between process instances.
149 // NB It is better to do this before destroying the process in case the
150 // clean up needs some help from the process.
151 m_breakpoint_list.ClearAllBreakpointSites();
152 m_internal_breakpoint_list.ClearAllBreakpointSites();
153 // Disable watchpoints just on the debugger side.
154 std::unique_lock<std::recursive_mutex> lock;
155 this->GetWatchpointList().GetListMutex(lock);
156 DisableAllWatchpoints(false);
157 ClearAllWatchpointHitCounts();
158 ClearAllWatchpointHistoricValues();
161 void Target::DeleteCurrentProcess() {
163 m_section_load_history.Clear();
164 if (m_process_sp->IsAlive())
165 m_process_sp->Destroy(false);
167 m_process_sp->Finalize();
171 m_process_sp.reset();
175 const lldb::ProcessSP &Target::CreateProcess(ListenerSP listener_sp,
176 llvm::StringRef plugin_name,
177 const FileSpec *crash_file) {
178 DeleteCurrentProcess();
179 m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name,
180 listener_sp, crash_file);
184 const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; }
186 lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language,
187 const char *repl_options, bool can_create) {
188 if (language == eLanguageTypeUnknown) {
189 std::set<LanguageType> repl_languages;
191 Language::GetLanguagesSupportingREPLs(repl_languages);
193 if (repl_languages.size() == 1) {
194 language = *repl_languages.begin();
195 } else if (repl_languages.size() == 0) {
196 err.SetErrorStringWithFormat(
197 "LLDB isn't configured with REPL support for any languages.");
200 err.SetErrorStringWithFormat(
201 "Multiple possible REPL languages. Please specify a language.");
206 REPLMap::iterator pos = m_repl_map.find(language);
208 if (pos != m_repl_map.end()) {
213 err.SetErrorStringWithFormat(
214 "Couldn't find an existing REPL for %s, and can't create a new one",
215 Language::GetNameForLanguageType(language));
216 return lldb::REPLSP();
219 Debugger *const debugger = nullptr;
220 lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options);
223 m_repl_map[language] = ret;
224 return m_repl_map[language];
228 err.SetErrorStringWithFormat("Couldn't create a REPL for %s",
229 Language::GetNameForLanguageType(language));
232 return lldb::REPLSP();
235 void Target::SetREPL(lldb::LanguageType language, lldb::REPLSP repl_sp) {
236 lldbassert(!m_repl_map.count(language));
238 m_repl_map[language] = repl_sp;
241 void Target::Destroy() {
242 std::lock_guard<std::recursive_mutex> guard(m_mutex);
244 DeleteCurrentProcess();
245 m_platform_sp.reset();
248 m_section_load_history.Clear();
249 const bool notify = false;
250 m_breakpoint_list.RemoveAll(notify);
251 m_internal_breakpoint_list.RemoveAll(notify);
252 m_last_created_breakpoint.reset();
253 m_last_created_watchpoint.reset();
254 m_search_filter_sp.reset();
255 m_image_search_paths.Clear(notify);
256 m_stop_hooks.clear();
257 m_stop_hook_next_id = 0;
258 m_suppress_stop_hooks = false;
261 BreakpointList &Target::GetBreakpointList(bool internal) {
263 return m_internal_breakpoint_list;
265 return m_breakpoint_list;
268 const BreakpointList &Target::GetBreakpointList(bool internal) const {
270 return m_internal_breakpoint_list;
272 return m_breakpoint_list;
275 BreakpointSP Target::GetBreakpointByID(break_id_t break_id) {
278 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
279 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
281 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
286 BreakpointSP Target::CreateSourceRegexBreakpoint(
287 const FileSpecList *containingModules,
288 const FileSpecList *source_file_spec_list,
289 const std::unordered_set<std::string> &function_names,
290 RegularExpression &source_regex, bool internal, bool hardware,
291 LazyBool move_to_nearest_code) {
292 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
293 containingModules, source_file_spec_list));
294 if (move_to_nearest_code == eLazyBoolCalculate)
295 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
296 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex(
297 nullptr, source_regex, function_names,
298 !static_cast<bool>(move_to_nearest_code)));
300 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
303 BreakpointSP Target::CreateBreakpoint(const FileSpecList *containingModules,
304 const FileSpec &file, uint32_t line_no,
306 LazyBool check_inlines,
307 LazyBool skip_prologue, bool internal,
309 LazyBool move_to_nearest_code) {
310 FileSpec remapped_file;
311 ConstString remapped_path;
312 if (GetSourcePathMap().ReverseRemapPath(ConstString(file.GetPath().c_str()),
314 remapped_file.SetFile(remapped_path.AsCString(), true);
316 remapped_file = file;
318 if (check_inlines == eLazyBoolCalculate) {
319 const InlineStrategy inline_strategy = GetInlineStrategy();
320 switch (inline_strategy) {
321 case eInlineBreakpointsNever:
322 check_inlines = eLazyBoolNo;
325 case eInlineBreakpointsHeaders:
326 if (remapped_file.IsSourceImplementationFile())
327 check_inlines = eLazyBoolNo;
329 check_inlines = eLazyBoolYes;
332 case eInlineBreakpointsAlways:
333 check_inlines = eLazyBoolYes;
337 SearchFilterSP filter_sp;
338 if (check_inlines == eLazyBoolNo) {
339 // Not checking for inlines, we are looking only for matching compile units
340 FileSpecList compile_unit_list;
341 compile_unit_list.Append(remapped_file);
342 filter_sp = GetSearchFilterForModuleAndCUList(containingModules,
345 filter_sp = GetSearchFilterForModuleList(containingModules);
347 if (skip_prologue == eLazyBoolCalculate)
348 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
349 if (move_to_nearest_code == eLazyBoolCalculate)
350 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
352 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine(
353 nullptr, remapped_file, line_no, offset, check_inlines, skip_prologue,
354 !static_cast<bool>(move_to_nearest_code)));
355 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
358 BreakpointSP Target::CreateBreakpoint(lldb::addr_t addr, bool internal,
362 // Check for any reason we want to move this breakpoint to other address.
363 addr = GetBreakableLoadAddress(addr);
365 // Attempt to resolve our load address if possible, though it is ok if
366 // it doesn't resolve to section/offset.
368 // Try and resolve as a load address if possible
369 GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
370 if (!so_addr.IsValid()) {
371 // The address didn't resolve, so just set this as an absolute address
372 so_addr.SetOffset(addr);
374 BreakpointSP bp_sp(CreateBreakpoint(so_addr, internal, hardware));
378 BreakpointSP Target::CreateBreakpoint(const Address &addr, bool internal,
380 SearchFilterSP filter_sp(
381 new SearchFilterForUnconstrainedSearches(shared_from_this()));
382 BreakpointResolverSP resolver_sp(
383 new BreakpointResolverAddress(nullptr, addr));
384 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, false);
388 Target::CreateAddressInModuleBreakpoint(lldb::addr_t file_addr, bool internal,
389 const FileSpec *file_spec,
390 bool request_hardware) {
391 SearchFilterSP filter_sp(
392 new SearchFilterForUnconstrainedSearches(shared_from_this()));
393 BreakpointResolverSP resolver_sp(
394 new BreakpointResolverAddress(nullptr, file_addr, file_spec));
395 return CreateBreakpoint(filter_sp, resolver_sp, internal, request_hardware,
400 Target::CreateBreakpoint(const FileSpecList *containingModules,
401 const FileSpecList *containingSourceFiles,
402 const char *func_name, uint32_t func_name_type_mask,
403 LanguageType language, lldb::addr_t offset,
404 LazyBool skip_prologue, bool internal, bool hardware) {
407 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
408 containingModules, containingSourceFiles));
410 if (skip_prologue == eLazyBoolCalculate)
411 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
412 if (language == lldb::eLanguageTypeUnknown)
413 language = GetLanguage();
415 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
416 nullptr, func_name, func_name_type_mask, language, Breakpoint::Exact,
417 offset, skip_prologue));
418 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
424 Target::CreateBreakpoint(const FileSpecList *containingModules,
425 const FileSpecList *containingSourceFiles,
426 const std::vector<std::string> &func_names,
427 uint32_t func_name_type_mask, LanguageType language,
428 lldb::addr_t offset, LazyBool skip_prologue,
429 bool internal, bool hardware) {
431 size_t num_names = func_names.size();
433 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
434 containingModules, containingSourceFiles));
436 if (skip_prologue == eLazyBoolCalculate)
437 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
438 if (language == lldb::eLanguageTypeUnknown)
439 language = GetLanguage();
441 BreakpointResolverSP resolver_sp(
442 new BreakpointResolverName(nullptr, func_names, func_name_type_mask,
443 language, offset, skip_prologue));
444 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
449 BreakpointSP Target::CreateBreakpoint(
450 const FileSpecList *containingModules,
451 const FileSpecList *containingSourceFiles, const char *func_names[],
452 size_t num_names, uint32_t func_name_type_mask, LanguageType language,
453 lldb::addr_t offset, LazyBool skip_prologue, bool internal, bool hardware) {
456 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
457 containingModules, containingSourceFiles));
459 if (skip_prologue == eLazyBoolCalculate) {
461 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
463 skip_prologue = eLazyBoolNo;
465 if (language == lldb::eLanguageTypeUnknown)
466 language = GetLanguage();
468 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
469 nullptr, func_names, num_names, func_name_type_mask, language, offset,
471 resolver_sp->SetOffset(offset);
472 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
478 Target::GetSearchFilterForModule(const FileSpec *containingModule) {
479 SearchFilterSP filter_sp;
480 if (containingModule != nullptr) {
481 // TODO: We should look into sharing module based search filters
482 // across many breakpoints like we do for the simple target based one
484 new SearchFilterByModule(shared_from_this(), *containingModule));
486 if (!m_search_filter_sp)
487 m_search_filter_sp.reset(
488 new SearchFilterForUnconstrainedSearches(shared_from_this()));
489 filter_sp = m_search_filter_sp;
495 Target::GetSearchFilterForModuleList(const FileSpecList *containingModules) {
496 SearchFilterSP filter_sp;
497 if (containingModules && containingModules->GetSize() != 0) {
498 // TODO: We should look into sharing module based search filters
499 // across many breakpoints like we do for the simple target based one
501 new SearchFilterByModuleList(shared_from_this(), *containingModules));
503 if (!m_search_filter_sp)
504 m_search_filter_sp.reset(
505 new SearchFilterForUnconstrainedSearches(shared_from_this()));
506 filter_sp = m_search_filter_sp;
511 SearchFilterSP Target::GetSearchFilterForModuleAndCUList(
512 const FileSpecList *containingModules,
513 const FileSpecList *containingSourceFiles) {
514 if (containingSourceFiles == nullptr || containingSourceFiles->GetSize() == 0)
515 return GetSearchFilterForModuleList(containingModules);
517 SearchFilterSP filter_sp;
518 if (containingModules == nullptr) {
519 // We could make a special "CU List only SearchFilter". Better yet was if
520 // these could be composable,
521 // but that will take a little reworking.
523 filter_sp.reset(new SearchFilterByModuleListAndCU(
524 shared_from_this(), FileSpecList(), *containingSourceFiles));
526 filter_sp.reset(new SearchFilterByModuleListAndCU(
527 shared_from_this(), *containingModules, *containingSourceFiles));
532 BreakpointSP Target::CreateFuncRegexBreakpoint(
533 const FileSpecList *containingModules,
534 const FileSpecList *containingSourceFiles, RegularExpression &func_regex,
535 lldb::LanguageType requested_language, LazyBool skip_prologue,
536 bool internal, bool hardware) {
537 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
538 containingModules, containingSourceFiles));
539 bool skip = (skip_prologue == eLazyBoolCalculate)
541 : static_cast<bool>(skip_prologue);
542 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
543 nullptr, func_regex, requested_language, 0, skip));
545 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
549 Target::CreateExceptionBreakpoint(enum lldb::LanguageType language,
550 bool catch_bp, bool throw_bp, bool internal,
551 Args *additional_args, Status *error) {
552 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint(
553 *this, language, catch_bp, throw_bp, internal);
554 if (exc_bkpt_sp && additional_args) {
555 Breakpoint::BreakpointPreconditionSP precondition_sp =
556 exc_bkpt_sp->GetPrecondition();
557 if (precondition_sp && additional_args) {
559 *error = precondition_sp->ConfigurePrecondition(*additional_args);
561 precondition_sp->ConfigurePrecondition(*additional_args);
567 BreakpointSP Target::CreateBreakpoint(SearchFilterSP &filter_sp,
568 BreakpointResolverSP &resolver_sp,
569 bool internal, bool request_hardware,
570 bool resolve_indirect_symbols) {
572 if (filter_sp && resolver_sp) {
573 bp_sp.reset(new Breakpoint(*this, filter_sp, resolver_sp, request_hardware,
574 resolve_indirect_symbols));
575 resolver_sp->SetBreakpoint(bp_sp.get());
576 AddBreakpoint(bp_sp, internal);
581 void Target::AddBreakpoint(lldb::BreakpointSP bp_sp, bool internal) {
585 m_internal_breakpoint_list.Add(bp_sp, false);
587 m_breakpoint_list.Add(bp_sp, true);
589 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
592 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
593 log->Printf("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__,
594 bp_sp->IsInternal() ? "yes" : "no", s.GetData());
597 bp_sp->ResolveBreakpoint();
600 m_last_created_breakpoint = bp_sp;
604 bool Target::ProcessIsValid() {
605 return (m_process_sp && m_process_sp->IsAlive());
608 static bool CheckIfWatchpointsExhausted(Target *target, Status &error) {
609 uint32_t num_supported_hardware_watchpoints;
610 Status rc = target->GetProcessSP()->GetWatchpointSupportInfo(
611 num_supported_hardware_watchpoints);
612 if (num_supported_hardware_watchpoints == 0) {
613 error.SetErrorStringWithFormat(
614 "Target supports (%u) hardware watchpoint slots.\n",
615 num_supported_hardware_watchpoints);
621 // See also Watchpoint::SetWatchpointType(uint32_t type) and
622 // the OptionGroupWatchpoint::WatchType enum type.
623 WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
624 const CompilerType *type, uint32_t kind,
626 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
628 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64
630 __FUNCTION__, addr, (uint64_t)size, kind);
633 if (!ProcessIsValid()) {
634 error.SetErrorString("process is not alive");
638 if (addr == LLDB_INVALID_ADDRESS || size == 0) {
640 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
642 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
646 if (!LLDB_WATCH_TYPE_IS_VALID(kind)) {
647 error.SetErrorStringWithFormat("invalid watchpoint type: %d", kind);
650 if (!CheckIfWatchpointsExhausted(this, error))
653 // Currently we only support one watchpoint per address, with total number
654 // of watchpoints limited by the hardware which the inferior is running on.
656 // Grab the list mutex while doing operations.
657 const bool notify = false; // Don't notify about all the state changes we do
658 // on creating the watchpoint.
659 std::unique_lock<std::recursive_mutex> lock;
660 this->GetWatchpointList().GetListMutex(lock);
661 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
663 size_t old_size = matched_sp->GetByteSize();
665 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
666 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
667 // Return the existing watchpoint if both size and type match.
668 if (size == old_size && kind == old_type) {
670 wp_sp->SetEnabled(false, notify);
672 // Nil the matched watchpoint; we will be creating a new one.
673 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
674 m_watchpoint_list.Remove(matched_sp->GetID(), true);
679 wp_sp.reset(new Watchpoint(*this, addr, size, type));
680 wp_sp->SetWatchpointType(kind, notify);
681 m_watchpoint_list.Add(wp_sp, true);
684 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
686 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
687 __FUNCTION__, error.Success() ? "succeeded" : "failed",
691 // Enabling the watchpoint on the device side failed.
692 // Remove the said watchpoint from the list maintained by the target
694 m_watchpoint_list.Remove(wp_sp->GetID(), true);
695 // See if we could provide more helpful error message.
696 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
697 error.SetErrorStringWithFormat(
698 "watch size of %" PRIu64 " is not supported", (uint64_t)size);
702 m_last_created_watchpoint = wp_sp;
706 void Target::RemoveAllBreakpoints(bool internal_also) {
707 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
709 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__,
710 internal_also ? "yes" : "no");
712 m_breakpoint_list.RemoveAll(true);
714 m_internal_breakpoint_list.RemoveAll(false);
716 m_last_created_breakpoint.reset();
719 void Target::DisableAllBreakpoints(bool internal_also) {
720 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
722 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__,
723 internal_also ? "yes" : "no");
725 m_breakpoint_list.SetEnabledAll(false);
727 m_internal_breakpoint_list.SetEnabledAll(false);
730 void Target::EnableAllBreakpoints(bool internal_also) {
731 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
733 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__,
734 internal_also ? "yes" : "no");
736 m_breakpoint_list.SetEnabledAll(true);
738 m_internal_breakpoint_list.SetEnabledAll(true);
741 bool Target::RemoveBreakpointByID(break_id_t break_id) {
742 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
744 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
745 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
747 if (DisableBreakpointByID(break_id)) {
748 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
749 m_internal_breakpoint_list.Remove(break_id, false);
751 if (m_last_created_breakpoint) {
752 if (m_last_created_breakpoint->GetID() == break_id)
753 m_last_created_breakpoint.reset();
755 m_breakpoint_list.Remove(break_id, true);
762 bool Target::DisableBreakpointByID(break_id_t break_id) {
763 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
765 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
766 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
770 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
771 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
773 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
775 bp_sp->SetEnabled(false);
781 bool Target::EnableBreakpointByID(break_id_t break_id) {
782 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
784 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
785 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
789 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
790 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
792 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
795 bp_sp->SetEnabled(true);
801 Status Target::SerializeBreakpointsToFile(const FileSpec &file,
802 const BreakpointIDList &bp_ids,
807 error.SetErrorString("Invalid FileSpec.");
811 std::string path(file.GetPath());
812 StructuredData::ObjectSP input_data_sp;
814 StructuredData::ArraySP break_store_sp;
815 StructuredData::Array *break_store_ptr = nullptr;
818 input_data_sp = StructuredData::ParseJSONFromFile(file, error);
819 if (error.Success()) {
820 break_store_ptr = input_data_sp->GetAsArray();
821 if (!break_store_ptr) {
822 error.SetErrorStringWithFormat(
823 "Tried to append to invalid input file %s", path.c_str());
829 if (!break_store_ptr) {
830 break_store_sp.reset(new StructuredData::Array());
831 break_store_ptr = break_store_sp.get();
834 StreamFile out_file(path.c_str(),
835 File::OpenOptions::eOpenOptionTruncate |
836 File::OpenOptions::eOpenOptionWrite |
837 File::OpenOptions::eOpenOptionCanCreate |
838 File::OpenOptions::eOpenOptionCloseOnExec,
839 lldb::eFilePermissionsFileDefault);
840 if (!out_file.GetFile().IsValid()) {
841 error.SetErrorStringWithFormat("Unable to open output file: %s.",
846 std::unique_lock<std::recursive_mutex> lock;
847 GetBreakpointList().GetListMutex(lock);
849 if (bp_ids.GetSize() == 0) {
850 const BreakpointList &breakpoints = GetBreakpointList();
852 size_t num_breakpoints = breakpoints.GetSize();
853 for (size_t i = 0; i < num_breakpoints; i++) {
854 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get();
855 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData();
856 // If a breakpoint can't serialize it, just ignore it for now:
858 break_store_ptr->AddItem(bkpt_save_sp);
862 std::unordered_set<lldb::break_id_t> processed_bkpts;
863 const size_t count = bp_ids.GetSize();
864 for (size_t i = 0; i < count; ++i) {
865 BreakpointID cur_bp_id = bp_ids.GetBreakpointIDAtIndex(i);
866 lldb::break_id_t bp_id = cur_bp_id.GetBreakpointID();
868 if (bp_id != LLDB_INVALID_BREAK_ID) {
869 // Only do each breakpoint once:
870 std::pair<std::unordered_set<lldb::break_id_t>::iterator, bool>
871 insert_result = processed_bkpts.insert(bp_id);
872 if (!insert_result.second)
875 Breakpoint *bp = GetBreakpointByID(bp_id).get();
876 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData();
877 // If the user explicitly asked to serialize a breakpoint, and we
881 error.SetErrorStringWithFormat("Unable to serialize breakpoint %d",
885 break_store_ptr->AddItem(bkpt_save_sp);
890 break_store_ptr->Dump(out_file, false);
891 out_file.PutChar('\n');
895 Status Target::CreateBreakpointsFromFile(const FileSpec &file,
896 BreakpointIDList &new_bps) {
897 std::vector<std::string> no_names;
898 return CreateBreakpointsFromFile(file, no_names, new_bps);
901 Status Target::CreateBreakpointsFromFile(const FileSpec &file,
902 std::vector<std::string> &names,
903 BreakpointIDList &new_bps) {
904 std::unique_lock<std::recursive_mutex> lock;
905 GetBreakpointList().GetListMutex(lock);
908 StructuredData::ObjectSP input_data_sp =
909 StructuredData::ParseJSONFromFile(file, error);
910 if (!error.Success()) {
912 } else if (!input_data_sp || !input_data_sp->IsValid()) {
913 error.SetErrorStringWithFormat("Invalid JSON from input file: %s.",
914 file.GetPath().c_str());
918 StructuredData::Array *bkpt_array = input_data_sp->GetAsArray();
920 error.SetErrorStringWithFormat(
921 "Invalid breakpoint data from input file: %s.", file.GetPath().c_str());
925 size_t num_bkpts = bkpt_array->GetSize();
926 size_t num_names = names.size();
928 for (size_t i = 0; i < num_bkpts; i++) {
929 StructuredData::ObjectSP bkpt_object_sp = bkpt_array->GetItemAtIndex(i);
930 // Peel off the breakpoint key, and feed the rest to the Breakpoint:
931 StructuredData::Dictionary *bkpt_dict = bkpt_object_sp->GetAsDictionary();
933 error.SetErrorStringWithFormat(
934 "Invalid breakpoint data for element %zu from input file: %s.", i,
935 file.GetPath().c_str());
938 StructuredData::ObjectSP bkpt_data_sp =
939 bkpt_dict->GetValueForKey(Breakpoint::GetSerializationKey());
941 !Breakpoint::SerializedBreakpointMatchesNames(bkpt_data_sp, names))
944 BreakpointSP bkpt_sp =
945 Breakpoint::CreateFromStructuredData(*this, bkpt_data_sp, error);
946 if (!error.Success()) {
947 error.SetErrorStringWithFormat(
948 "Error restoring breakpoint %zu from %s: %s.", i,
949 file.GetPath().c_str(), error.AsCString());
952 new_bps.AddBreakpointID(BreakpointID(bkpt_sp->GetID()));
957 // The flag 'end_to_end', default to true, signifies that the operation is
958 // performed end to end, for both the debugger and the debuggee.
960 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
961 // to end operations.
962 bool Target::RemoveAllWatchpoints(bool end_to_end) {
963 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
965 log->Printf("Target::%s\n", __FUNCTION__);
968 m_watchpoint_list.RemoveAll(true);
972 // Otherwise, it's an end to end operation.
974 if (!ProcessIsValid())
977 size_t num_watchpoints = m_watchpoint_list.GetSize();
978 for (size_t i = 0; i < num_watchpoints; ++i) {
979 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
983 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
987 m_watchpoint_list.RemoveAll(true);
988 m_last_created_watchpoint.reset();
989 return true; // Success!
992 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
994 bool Target::DisableAllWatchpoints(bool end_to_end) {
995 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
997 log->Printf("Target::%s\n", __FUNCTION__);
1000 m_watchpoint_list.SetEnabledAll(false);
1004 // Otherwise, it's an end to end operation.
1006 if (!ProcessIsValid())
1009 size_t num_watchpoints = m_watchpoint_list.GetSize();
1010 for (size_t i = 0; i < num_watchpoints; ++i) {
1011 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1015 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
1019 return true; // Success!
1022 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
1024 bool Target::EnableAllWatchpoints(bool end_to_end) {
1025 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1027 log->Printf("Target::%s\n", __FUNCTION__);
1030 m_watchpoint_list.SetEnabledAll(true);
1034 // Otherwise, it's an end to end operation.
1036 if (!ProcessIsValid())
1039 size_t num_watchpoints = m_watchpoint_list.GetSize();
1040 for (size_t i = 0; i < num_watchpoints; ++i) {
1041 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1045 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
1049 return true; // Success!
1052 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1053 bool Target::ClearAllWatchpointHitCounts() {
1054 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1056 log->Printf("Target::%s\n", __FUNCTION__);
1058 size_t num_watchpoints = m_watchpoint_list.GetSize();
1059 for (size_t i = 0; i < num_watchpoints; ++i) {
1060 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1064 wp_sp->ResetHitCount();
1066 return true; // Success!
1069 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1070 bool Target::ClearAllWatchpointHistoricValues() {
1071 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1073 log->Printf("Target::%s\n", __FUNCTION__);
1075 size_t num_watchpoints = m_watchpoint_list.GetSize();
1076 for (size_t i = 0; i < num_watchpoints; ++i) {
1077 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1081 wp_sp->ResetHistoricValues();
1083 return true; // Success!
1086 // Assumption: Caller holds the list mutex lock for m_watchpoint_list
1087 // during these operations.
1088 bool Target::IgnoreAllWatchpoints(uint32_t ignore_count) {
1089 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1091 log->Printf("Target::%s\n", __FUNCTION__);
1093 if (!ProcessIsValid())
1096 size_t num_watchpoints = m_watchpoint_list.GetSize();
1097 for (size_t i = 0; i < num_watchpoints; ++i) {
1098 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1102 wp_sp->SetIgnoreCount(ignore_count);
1104 return true; // Success!
1107 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1108 bool Target::DisableWatchpointByID(lldb::watch_id_t watch_id) {
1109 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1111 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1113 if (!ProcessIsValid())
1116 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1118 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
1122 // Else, fallthrough.
1127 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1128 bool Target::EnableWatchpointByID(lldb::watch_id_t watch_id) {
1129 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1131 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1133 if (!ProcessIsValid())
1136 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1138 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
1142 // Else, fallthrough.
1147 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1148 bool Target::RemoveWatchpointByID(lldb::watch_id_t watch_id) {
1149 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1151 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1153 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1154 if (watch_to_remove_sp == m_last_created_watchpoint)
1155 m_last_created_watchpoint.reset();
1157 if (DisableWatchpointByID(watch_id)) {
1158 m_watchpoint_list.Remove(watch_id, true);
1164 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1165 bool Target::IgnoreWatchpointByID(lldb::watch_id_t watch_id,
1166 uint32_t ignore_count) {
1167 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
1169 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1171 if (!ProcessIsValid())
1174 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1176 wp_sp->SetIgnoreCount(ignore_count);
1182 ModuleSP Target::GetExecutableModule() {
1183 // search for the first executable in the module list
1184 for (size_t i = 0; i < m_images.GetSize(); ++i) {
1185 ModuleSP module_sp = m_images.GetModuleAtIndex(i);
1186 lldb_private::ObjectFile *obj = module_sp->GetObjectFile();
1189 if (obj->GetType() == ObjectFile::Type::eTypeExecutable)
1192 // as fall back return the first module loaded
1193 return m_images.GetModuleAtIndex(0);
1196 Module *Target::GetExecutableModulePointer() {
1197 return GetExecutableModule().get();
1200 static void LoadScriptingResourceForModule(const ModuleSP &module_sp,
1203 StreamString feedback_stream;
1205 !module_sp->LoadScriptingResourceInTarget(target, error,
1206 &feedback_stream)) {
1207 if (error.AsCString())
1208 target->GetDebugger().GetErrorFile()->Printf(
1209 "unable to load scripting data for module %s - error reported was "
1211 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1214 if (feedback_stream.GetSize())
1215 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1216 feedback_stream.GetData());
1219 void Target::ClearModules(bool delete_locations) {
1220 ModulesDidUnload(m_images, delete_locations);
1221 m_section_load_history.Clear();
1223 m_scratch_type_system_map.Clear();
1224 m_ast_importer_sp.reset();
1227 void Target::DidExec() {
1228 // When a process exec's we need to know about it so we can do some cleanup.
1229 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1230 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1233 void Target::SetExecutableModule(ModuleSP &executable_sp,
1234 bool get_dependent_files) {
1235 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
1236 ClearModules(false);
1238 if (executable_sp) {
1239 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
1240 Timer scoped_timer(func_cat,
1241 "Target::SetExecutableModule (executable = '%s')",
1242 executable_sp->GetFileSpec().GetPath().c_str());
1244 m_images.Append(executable_sp); // The first image is our executable file
1246 // If we haven't set an architecture yet, reset our architecture based on
1247 // what we found in the executable module.
1248 if (!m_arch.IsValid()) {
1249 m_arch = executable_sp->GetArchitecture();
1251 log->Printf("Target::SetExecutableModule setting architecture to %s "
1252 "(%s) based on executable file",
1253 m_arch.GetArchitectureName(),
1254 m_arch.GetTriple().getTriple().c_str());
1257 FileSpecList dependent_files;
1258 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
1260 if (executable_objfile && get_dependent_files) {
1261 executable_objfile->GetDependentModules(dependent_files);
1262 for (uint32_t i = 0; i < dependent_files.GetSize(); i++) {
1263 FileSpec dependent_file_spec(
1264 dependent_files.GetFileSpecPointerAtIndex(i));
1265 FileSpec platform_dependent_file_spec;
1267 m_platform_sp->GetFileWithUUID(dependent_file_spec, nullptr,
1268 platform_dependent_file_spec);
1270 platform_dependent_file_spec = dependent_file_spec;
1272 ModuleSpec module_spec(platform_dependent_file_spec, m_arch);
1273 ModuleSP image_module_sp(GetSharedModule(module_spec));
1274 if (image_module_sp) {
1275 ObjectFile *objfile = image_module_sp->GetObjectFile();
1277 objfile->GetDependentModules(dependent_files);
1284 bool Target::SetArchitecture(const ArchSpec &arch_spec) {
1285 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
1286 bool missing_local_arch = !m_arch.IsValid();
1287 bool replace_local_arch = true;
1288 bool compatible_local_arch = false;
1289 ArchSpec other(arch_spec);
1291 if (!missing_local_arch) {
1292 if (m_arch.IsCompatibleMatch(arch_spec)) {
1293 other.MergeFrom(m_arch);
1295 if (m_arch.IsCompatibleMatch(other)) {
1296 compatible_local_arch = true;
1297 bool arch_changed, vendor_changed, os_changed, os_ver_changed,
1300 m_arch.PiecewiseTripleCompare(other, arch_changed, vendor_changed,
1301 os_changed, os_ver_changed, env_changed);
1303 if (!arch_changed && !vendor_changed && !os_changed && !env_changed)
1304 replace_local_arch = false;
1309 if (compatible_local_arch || missing_local_arch) {
1310 // If we haven't got a valid arch spec, or the architectures are compatible
1311 // update the architecture, unless the one we already have is more specified
1312 if (replace_local_arch)
1315 log->Printf("Target::SetArchitecture set architecture to %s (%s)",
1316 m_arch.GetArchitectureName(),
1317 m_arch.GetTriple().getTriple().c_str());
1321 // If we have an executable file, try to reset the executable to the desired
1324 log->Printf("Target::SetArchitecture changing architecture to %s (%s)",
1325 arch_spec.GetArchitectureName(),
1326 arch_spec.GetTriple().getTriple().c_str());
1328 ModuleSP executable_sp = GetExecutableModule();
1331 // Need to do something about unsetting breakpoints.
1333 if (executable_sp) {
1335 log->Printf("Target::SetArchitecture Trying to select executable file "
1336 "architecture %s (%s)",
1337 arch_spec.GetArchitectureName(),
1338 arch_spec.GetTriple().getTriple().c_str());
1339 ModuleSpec module_spec(executable_sp->GetFileSpec(), other);
1340 Status error = ModuleList::GetSharedModule(module_spec, executable_sp,
1341 &GetExecutableSearchPaths(),
1344 if (!error.Fail() && executable_sp) {
1345 SetExecutableModule(executable_sp, true);
1352 bool Target::MergeArchitecture(const ArchSpec &arch_spec) {
1353 if (arch_spec.IsValid()) {
1354 if (m_arch.IsCompatibleMatch(arch_spec)) {
1355 // The current target arch is compatible with "arch_spec", see if we
1356 // can improve our current architecture using bits from "arch_spec"
1358 // Merge bits from arch_spec into "merged_arch" and set our architecture
1359 ArchSpec merged_arch(m_arch);
1360 merged_arch.MergeFrom(arch_spec);
1361 return SetArchitecture(merged_arch);
1363 // The new architecture is different, we just need to replace it
1364 return SetArchitecture(arch_spec);
1370 void Target::WillClearList(const ModuleList &module_list) {}
1372 void Target::ModuleAdded(const ModuleList &module_list,
1373 const ModuleSP &module_sp) {
1374 // A module is being added to this target for the first time
1376 ModuleList my_module_list;
1377 my_module_list.Append(module_sp);
1378 LoadScriptingResourceForModule(module_sp, this);
1379 ModulesDidLoad(my_module_list);
1383 void Target::ModuleRemoved(const ModuleList &module_list,
1384 const ModuleSP &module_sp) {
1385 // A module is being removed from this target.
1387 ModuleList my_module_list;
1388 my_module_list.Append(module_sp);
1389 ModulesDidUnload(my_module_list, false);
1393 void Target::ModuleUpdated(const ModuleList &module_list,
1394 const ModuleSP &old_module_sp,
1395 const ModuleSP &new_module_sp) {
1396 // A module is replacing an already added module
1398 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp,
1400 m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(
1401 old_module_sp, new_module_sp);
1405 void Target::ModulesDidLoad(ModuleList &module_list) {
1406 if (m_valid && module_list.GetSize()) {
1407 m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1408 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1410 m_process_sp->ModulesDidLoad(module_list);
1412 BroadcastEvent(eBroadcastBitModulesLoaded,
1413 new TargetEventData(this->shared_from_this(), module_list));
1417 void Target::SymbolsDidLoad(ModuleList &module_list) {
1418 if (m_valid && module_list.GetSize()) {
1420 LanguageRuntime *runtime =
1421 m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1423 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime *)runtime;
1424 objc_runtime->SymbolsDidLoad(module_list);
1428 m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1429 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1430 BroadcastEvent(eBroadcastBitSymbolsLoaded,
1431 new TargetEventData(this->shared_from_this(), module_list));
1435 void Target::ModulesDidUnload(ModuleList &module_list, bool delete_locations) {
1436 if (m_valid && module_list.GetSize()) {
1437 UnloadModuleSections(module_list);
1438 m_breakpoint_list.UpdateBreakpoints(module_list, false, delete_locations);
1439 m_internal_breakpoint_list.UpdateBreakpoints(module_list, false,
1441 BroadcastEvent(eBroadcastBitModulesUnloaded,
1442 new TargetEventData(this->shared_from_this(), module_list));
1446 bool Target::ModuleIsExcludedForUnconstrainedSearches(
1447 const FileSpec &module_file_spec) {
1448 if (GetBreakpointsConsultPlatformAvoidList()) {
1449 ModuleList matchingModules;
1450 ModuleSpec module_spec(module_file_spec);
1451 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1453 // If there is more than one module for this file spec, only return true if
1454 // ALL the modules are on the
1456 if (num_modules > 0) {
1457 for (size_t i = 0; i < num_modules; i++) {
1458 if (!ModuleIsExcludedForUnconstrainedSearches(
1459 matchingModules.GetModuleAtIndex(i)))
1468 bool Target::ModuleIsExcludedForUnconstrainedSearches(
1469 const lldb::ModuleSP &module_sp) {
1470 if (GetBreakpointsConsultPlatformAvoidList()) {
1472 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*this,
1478 size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst,
1479 size_t dst_len, Status &error) {
1480 SectionSP section_sp(addr.GetSection());
1482 // If the contents of this section are encrypted, the on-disk file is
1483 // unusable. Read only from live memory.
1484 if (section_sp->IsEncrypted()) {
1485 error.SetErrorString("section is encrypted");
1488 ModuleSP module_sp(section_sp->GetModule());
1490 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1492 size_t bytes_read = objfile->ReadSectionData(
1493 section_sp.get(), addr.GetOffset(), dst, dst_len);
1497 error.SetErrorStringWithFormat("error reading data from section %s",
1498 section_sp->GetName().GetCString());
1500 error.SetErrorString("address isn't from a object file");
1502 error.SetErrorString("address isn't in a module");
1504 error.SetErrorString("address doesn't contain a section that points to a "
1505 "section in a object file");
1510 size_t Target::ReadMemory(const Address &addr, bool prefer_file_cache,
1511 void *dst, size_t dst_len, Status &error,
1512 lldb::addr_t *load_addr_ptr) {
1515 // if we end up reading this from process memory, we will fill this
1516 // with the actual load address
1518 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1520 size_t bytes_read = 0;
1522 addr_t load_addr = LLDB_INVALID_ADDRESS;
1523 addr_t file_addr = LLDB_INVALID_ADDRESS;
1524 Address resolved_addr;
1525 if (!addr.IsSectionOffset()) {
1526 SectionLoadList §ion_load_list = GetSectionLoadList();
1527 if (section_load_list.IsEmpty()) {
1528 // No sections are loaded, so we must assume we are not running
1529 // yet and anything we are given is a file address.
1530 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1531 // offset is the file address
1532 m_images.ResolveFileAddress(file_addr, resolved_addr);
1534 // We have at least one section loaded. This can be because
1535 // we have manually loaded some sections with "target modules load ..."
1536 // or because we have have a live process that has sections loaded
1537 // through the dynamic loader
1538 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1539 // offset is the load address
1540 section_load_list.ResolveLoadAddress(load_addr, resolved_addr);
1543 if (!resolved_addr.IsValid())
1544 resolved_addr = addr;
1546 if (prefer_file_cache) {
1547 bytes_read = ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1552 if (ProcessIsValid()) {
1553 if (load_addr == LLDB_INVALID_ADDRESS)
1554 load_addr = resolved_addr.GetLoadAddress(this);
1556 if (load_addr == LLDB_INVALID_ADDRESS) {
1557 ModuleSP addr_module_sp(resolved_addr.GetModule());
1558 if (addr_module_sp && addr_module_sp->GetFileSpec())
1559 error.SetErrorStringWithFormatv(
1560 "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded",
1561 addr_module_sp->GetFileSpec(), resolved_addr.GetFileAddress());
1563 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved",
1564 resolved_addr.GetFileAddress());
1566 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1567 if (bytes_read != dst_len) {
1568 if (error.Success()) {
1569 if (bytes_read == 0)
1570 error.SetErrorStringWithFormat(
1571 "read memory from 0x%" PRIx64 " failed", load_addr);
1573 error.SetErrorStringWithFormat(
1574 "only %" PRIu64 " of %" PRIu64
1575 " bytes were read from memory at 0x%" PRIx64,
1576 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1581 *load_addr_ptr = load_addr;
1584 // If the address is not section offset we have an address that
1585 // doesn't resolve to any address in any currently loaded shared
1586 // libraries and we failed to read memory so there isn't anything
1587 // more we can do. If it is section offset, we might be able to
1588 // read cached memory from the object file.
1589 if (!resolved_addr.IsSectionOffset())
1594 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) {
1595 // If we didn't already try and read from the object file cache, then
1596 // try it after failing to read from the process.
1597 return ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1602 size_t Target::ReadCStringFromMemory(const Address &addr, std::string &out_str,
1606 addr_t curr_addr = addr.GetLoadAddress(this);
1607 Address address(addr);
1609 size_t length = ReadCStringFromMemory(address, buf, sizeof(buf), error);
1612 out_str.append(buf, length);
1613 // If we got "length - 1" bytes, we didn't get the whole C string, we
1614 // need to read some more characters
1615 if (length == sizeof(buf) - 1)
1616 curr_addr += length;
1619 address = Address(curr_addr);
1621 return out_str.size();
1624 size_t Target::ReadCStringFromMemory(const Address &addr, char *dst,
1625 size_t dst_max_len, Status &result_error) {
1626 size_t total_cstr_len = 0;
1627 if (dst && dst_max_len) {
1628 result_error.Clear();
1629 // NULL out everything just to be safe
1630 memset(dst, 0, dst_max_len);
1632 addr_t curr_addr = addr.GetLoadAddress(this);
1633 Address address(addr);
1635 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1636 // think this really needs to be tied to the memory cache subsystem's
1637 // cache line size, so leave this as a fixed constant.
1638 const size_t cache_line_size = 512;
1640 size_t bytes_left = dst_max_len - 1;
1641 char *curr_dst = dst;
1643 while (bytes_left > 0) {
1644 addr_t cache_line_bytes_left =
1645 cache_line_size - (curr_addr % cache_line_size);
1646 addr_t bytes_to_read =
1647 std::min<addr_t>(bytes_left, cache_line_bytes_left);
1649 ReadMemory(address, false, curr_dst, bytes_to_read, error);
1651 if (bytes_read == 0) {
1652 result_error = error;
1653 dst[total_cstr_len] = '\0';
1656 const size_t len = strlen(curr_dst);
1658 total_cstr_len += len;
1660 if (len < bytes_to_read)
1663 curr_dst += bytes_read;
1664 curr_addr += bytes_read;
1665 bytes_left -= bytes_read;
1666 address = Address(curr_addr);
1670 result_error.SetErrorString("invalid arguments");
1672 result_error.Clear();
1674 return total_cstr_len;
1677 size_t Target::ReadScalarIntegerFromMemory(const Address &addr,
1678 bool prefer_file_cache,
1679 uint32_t byte_size, bool is_signed,
1680 Scalar &scalar, Status &error) {
1683 if (byte_size <= sizeof(uval)) {
1685 ReadMemory(addr, prefer_file_cache, &uval, byte_size, error);
1686 if (bytes_read == byte_size) {
1687 DataExtractor data(&uval, sizeof(uval), m_arch.GetByteOrder(),
1688 m_arch.GetAddressByteSize());
1689 lldb::offset_t offset = 0;
1691 scalar = data.GetMaxU32(&offset, byte_size);
1693 scalar = data.GetMaxU64(&offset, byte_size);
1696 scalar.SignExtend(byte_size * 8);
1700 error.SetErrorStringWithFormat(
1701 "byte size of %u is too large for integer scalar type", byte_size);
1706 uint64_t Target::ReadUnsignedIntegerFromMemory(const Address &addr,
1707 bool prefer_file_cache,
1708 size_t integer_byte_size,
1709 uint64_t fail_value,
1712 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, integer_byte_size,
1713 false, scalar, error))
1714 return scalar.ULongLong(fail_value);
1718 bool Target::ReadPointerFromMemory(const Address &addr, bool prefer_file_cache,
1719 Status &error, Address &pointer_addr) {
1721 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache,
1722 m_arch.GetAddressByteSize(), false, scalar,
1724 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1725 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) {
1726 SectionLoadList §ion_load_list = GetSectionLoadList();
1727 if (section_load_list.IsEmpty()) {
1728 // No sections are loaded, so we must assume we are not running
1729 // yet and anything we are given is a file address.
1730 m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr);
1732 // We have at least one section loaded. This can be because
1733 // we have manually loaded some sections with "target modules load ..."
1734 // or because we have have a live process that has sections loaded
1735 // through the dynamic loader
1736 section_load_list.ResolveLoadAddress(pointer_vm_addr, pointer_addr);
1738 // We weren't able to resolve the pointer value, so just return
1739 // an address with no section
1740 if (!pointer_addr.IsValid())
1741 pointer_addr.SetOffset(pointer_vm_addr);
1748 ModuleSP Target::GetSharedModule(const ModuleSpec &module_spec,
1749 Status *error_ptr) {
1754 // First see if we already have this module in our module list. If we do,
1755 // then we're done, we don't need
1756 // to consult the shared modules list. But only do this if we are passed a
1759 if (module_spec.GetUUID().IsValid())
1760 module_sp = m_images.FindFirstModule(module_spec);
1763 ModuleSP old_module_sp; // This will get filled in if we have a new version
1765 bool did_create_module = false;
1767 // If there are image search path entries, try to use them first to acquire
1768 // a suitable image.
1769 if (m_image_search_paths.GetSize()) {
1770 ModuleSpec transformed_spec(module_spec);
1771 if (m_image_search_paths.RemapPath(
1772 module_spec.GetFileSpec().GetDirectory(),
1773 transformed_spec.GetFileSpec().GetDirectory())) {
1774 transformed_spec.GetFileSpec().GetFilename() =
1775 module_spec.GetFileSpec().GetFilename();
1776 error = ModuleList::GetSharedModule(transformed_spec, module_sp,
1777 &GetExecutableSearchPaths(),
1778 &old_module_sp, &did_create_module);
1783 // If we have a UUID, we can check our global shared module list in case
1784 // we already have it. If we don't have a valid UUID, then we can't since
1785 // the path in "module_spec" will be a platform path, and we will need to
1786 // let the platform find that file. For example, we could be asking for
1787 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1788 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1789 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1791 if (module_spec.GetUUID().IsValid()) {
1792 // We have a UUID, it is OK to check the global module list...
1793 error = ModuleList::GetSharedModule(module_spec, module_sp,
1794 &GetExecutableSearchPaths(),
1795 &old_module_sp, &did_create_module);
1799 // The platform is responsible for finding and caching an appropriate
1800 // module in the shared module cache.
1801 if (m_platform_sp) {
1802 error = m_platform_sp->GetSharedModule(
1803 module_spec, m_process_sp.get(), module_sp,
1804 &GetExecutableSearchPaths(), &old_module_sp, &did_create_module);
1806 error.SetErrorString("no platform is currently set");
1811 // We found a module that wasn't in our target list. Let's make sure that
1812 // there wasn't an equivalent
1813 // module in the list already, and if there was, let's remove it.
1815 ObjectFile *objfile = module_sp->GetObjectFile();
1817 switch (objfile->GetType()) {
1818 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of
1819 /// a program's execution state
1820 case ObjectFile::eTypeExecutable: /// A normal executable
1821 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker
1823 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1824 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be
1825 /// used during execution
1827 case ObjectFile::eTypeDebugInfo: /// An object file that contains only
1828 /// debug information
1830 error_ptr->SetErrorString("debug info files aren't valid target "
1831 "modules, please specify an executable");
1833 case ObjectFile::eTypeStubLibrary: /// A library that can be linked
1834 /// against but not used for
1837 error_ptr->SetErrorString("stub libraries aren't valid target "
1838 "modules, please specify an executable");
1842 error_ptr->SetErrorString(
1843 "unsupported file type, please specify an executable");
1846 // GetSharedModule is not guaranteed to find the old shared module, for
1848 // in the common case where you pass in the UUID, it is only going to
1850 // module matching the UUID. In fact, it has no good way to know what
1852 // relevant to this target is, since there might be many copies of a
1853 // module with this file spec
1854 // in various running debug sessions, but only one of them will belong
1856 // So let's remove the UUID from the module list, and look in the
1857 // target's module list.
1858 // Only do this if there is SOMETHING else in the module spec...
1859 if (!old_module_sp) {
1860 if (module_spec.GetUUID().IsValid() &&
1861 !module_spec.GetFileSpec().GetFilename().IsEmpty() &&
1862 !module_spec.GetFileSpec().GetDirectory().IsEmpty()) {
1863 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1864 module_spec_copy.GetUUID().Clear();
1866 ModuleList found_modules;
1868 m_images.FindModules(module_spec_copy, found_modules);
1869 if (num_found == 1) {
1870 old_module_sp = found_modules.GetModuleAtIndex(0);
1875 // Preload symbols outside of any lock, so hopefully we can do this for
1876 // each library in parallel.
1877 if (GetPreloadSymbols())
1878 module_sp->PreloadSymbols();
1880 if (old_module_sp &&
1881 m_images.GetIndexForModule(old_module_sp.get()) !=
1882 LLDB_INVALID_INDEX32) {
1883 m_images.ReplaceModule(old_module_sp, module_sp);
1884 Module *old_module_ptr = old_module_sp.get();
1885 old_module_sp.reset();
1886 ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr);
1888 m_images.Append(module_sp);
1898 TargetSP Target::CalculateTarget() { return shared_from_this(); }
1900 ProcessSP Target::CalculateProcess() { return m_process_sp; }
1902 ThreadSP Target::CalculateThread() { return ThreadSP(); }
1904 StackFrameSP Target::CalculateStackFrame() { return StackFrameSP(); }
1906 void Target::CalculateExecutionContext(ExecutionContext &exe_ctx) {
1908 exe_ctx.SetTargetPtr(this);
1911 PathMappingList &Target::GetImageSearchPathList() {
1912 return m_image_search_paths;
1915 void Target::ImageSearchPathsChanged(const PathMappingList &path_list,
1917 Target *target = (Target *)baton;
1918 ModuleSP exe_module_sp(target->GetExecutableModule());
1920 target->SetExecutableModule(exe_module_sp, true);
1923 TypeSystem *Target::GetScratchTypeSystemForLanguage(Status *error,
1924 lldb::LanguageType language,
1925 bool create_on_demand) {
1933 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all
1935 || language == eLanguageTypeUnknown) {
1936 std::set<lldb::LanguageType> languages_for_types;
1937 std::set<lldb::LanguageType> languages_for_expressions;
1939 Language::GetLanguagesSupportingTypeSystems(languages_for_types,
1940 languages_for_expressions);
1942 if (languages_for_expressions.count(eLanguageTypeC)) {
1943 language = eLanguageTypeC; // LLDB's default. Override by setting the
1946 if (languages_for_expressions.empty()) {
1949 language = *languages_for_expressions.begin();
1954 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this,
1958 PersistentExpressionState *
1959 Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) {
1960 TypeSystem *type_system =
1961 GetScratchTypeSystemForLanguage(nullptr, language, true);
1964 return type_system->GetPersistentExpressionState();
1970 UserExpression *Target::GetUserExpressionForLanguage(
1971 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language,
1972 Expression::ResultType desired_type,
1973 const EvaluateExpressionOptions &options, Status &error) {
1974 Status type_system_error;
1976 TypeSystem *type_system =
1977 GetScratchTypeSystemForLanguage(&type_system_error, language);
1978 UserExpression *user_expr = nullptr;
1981 error.SetErrorStringWithFormat(
1982 "Could not find type system for language %s: %s",
1983 Language::GetNameForLanguageType(language),
1984 type_system_error.AsCString());
1988 user_expr = type_system->GetUserExpression(expr, prefix, language,
1989 desired_type, options);
1991 error.SetErrorStringWithFormat(
1992 "Could not create an expression for language %s",
1993 Language::GetNameForLanguageType(language));
1998 FunctionCaller *Target::GetFunctionCallerForLanguage(
1999 lldb::LanguageType language, const CompilerType &return_type,
2000 const Address &function_address, const ValueList &arg_value_list,
2001 const char *name, Status &error) {
2002 Status type_system_error;
2003 TypeSystem *type_system =
2004 GetScratchTypeSystemForLanguage(&type_system_error, language);
2005 FunctionCaller *persistent_fn = nullptr;
2008 error.SetErrorStringWithFormat(
2009 "Could not find type system for language %s: %s",
2010 Language::GetNameForLanguageType(language),
2011 type_system_error.AsCString());
2012 return persistent_fn;
2015 persistent_fn = type_system->GetFunctionCaller(return_type, function_address,
2016 arg_value_list, name);
2018 error.SetErrorStringWithFormat(
2019 "Could not create an expression for language %s",
2020 Language::GetNameForLanguageType(language));
2022 return persistent_fn;
2026 Target::GetUtilityFunctionForLanguage(const char *text,
2027 lldb::LanguageType language,
2028 const char *name, Status &error) {
2029 Status type_system_error;
2030 TypeSystem *type_system =
2031 GetScratchTypeSystemForLanguage(&type_system_error, language);
2032 UtilityFunction *utility_fn = nullptr;
2035 error.SetErrorStringWithFormat(
2036 "Could not find type system for language %s: %s",
2037 Language::GetNameForLanguageType(language),
2038 type_system_error.AsCString());
2042 utility_fn = type_system->GetUtilityFunction(text, name);
2044 error.SetErrorStringWithFormat(
2045 "Could not create an expression for language %s",
2046 Language::GetNameForLanguageType(language));
2051 ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) {
2053 if (TypeSystem *type_system = GetScratchTypeSystemForLanguage(
2054 nullptr, eLanguageTypeC, create_on_demand))
2055 return llvm::dyn_cast<ClangASTContext>(type_system);
2060 ClangASTImporterSP Target::GetClangASTImporter() {
2062 if (!m_ast_importer_sp) {
2063 m_ast_importer_sp.reset(new ClangASTImporter());
2065 return m_ast_importer_sp;
2067 return ClangASTImporterSP();
2070 void Target::SettingsInitialize() { Process::SettingsInitialize(); }
2072 void Target::SettingsTerminate() { Process::SettingsTerminate(); }
2074 FileSpecList Target::GetDefaultExecutableSearchPaths() {
2075 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2077 return properties_sp->GetExecutableSearchPaths();
2078 return FileSpecList();
2081 FileSpecList Target::GetDefaultDebugFileSearchPaths() {
2082 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2084 return properties_sp->GetDebugFileSearchPaths();
2085 return FileSpecList();
2088 FileSpecList Target::GetDefaultClangModuleSearchPaths() {
2089 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2091 return properties_sp->GetClangModuleSearchPaths();
2092 return FileSpecList();
2095 ArchSpec Target::GetDefaultArchitecture() {
2096 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2098 return properties_sp->GetDefaultArchitecture();
2102 void Target::SetDefaultArchitecture(const ArchSpec &arch) {
2103 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2104 if (properties_sp) {
2105 LogIfAnyCategoriesSet(
2106 LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's "
2107 "default architecture to %s (%s)",
2108 arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
2109 return properties_sp->SetDefaultArchitecture(arch);
2113 Target *Target::GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr,
2114 const SymbolContext *sc_ptr) {
2115 // The target can either exist in the "process" of ExecutionContext, or in
2116 // the "target_sp" member of SymbolContext. This accessor helper function
2117 // will get the target from one of these locations.
2119 Target *target = nullptr;
2120 if (sc_ptr != nullptr)
2121 target = sc_ptr->target_sp.get();
2122 if (target == nullptr && exe_ctx_ptr)
2123 target = exe_ctx_ptr->GetTargetPtr();
2127 ExpressionResults Target::EvaluateExpression(
2128 llvm::StringRef expr, ExecutionContextScope *exe_scope,
2129 lldb::ValueObjectSP &result_valobj_sp,
2130 const EvaluateExpressionOptions &options, std::string *fixed_expression) {
2131 result_valobj_sp.reset();
2133 ExpressionResults execution_results = eExpressionSetupError;
2136 return execution_results;
2138 // We shouldn't run stop hooks in expressions.
2139 // Be sure to reset this if you return anywhere within this function.
2140 bool old_suppress_value = m_suppress_stop_hooks;
2141 m_suppress_stop_hooks = true;
2143 ExecutionContext exe_ctx;
2146 exe_scope->CalculateExecutionContext(exe_ctx);
2147 } else if (m_process_sp) {
2148 m_process_sp->CalculateExecutionContext(exe_ctx);
2150 CalculateExecutionContext(exe_ctx);
2153 // Make sure we aren't just trying to see the value of a persistent
2154 // variable (something like "$0")
2155 lldb::ExpressionVariableSP persistent_var_sp;
2156 // Only check for persistent variables the expression starts with a '$'
2158 persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)
2159 ->GetPersistentExpressionState()
2160 ->GetVariable(expr);
2162 if (persistent_var_sp) {
2163 result_valobj_sp = persistent_var_sp->GetValueObject();
2164 execution_results = eExpressionCompleted;
2166 const char *prefix = GetExpressionPrefixContentsAsCString();
2168 execution_results = UserExpression::Evaluate(exe_ctx, options, expr, prefix,
2169 result_valobj_sp, error,
2174 m_suppress_stop_hooks = old_suppress_value;
2176 return execution_results;
2179 lldb::ExpressionVariableSP
2180 Target::GetPersistentVariable(const ConstString &name) {
2181 lldb::ExpressionVariableSP variable_sp;
2182 m_scratch_type_system_map.ForEach(
2183 [name, &variable_sp](TypeSystem *type_system) -> bool {
2184 if (PersistentExpressionState *persistent_state =
2185 type_system->GetPersistentExpressionState()) {
2186 variable_sp = persistent_state->GetVariable(name);
2189 return false; // Stop iterating the ForEach
2191 return true; // Keep iterating the ForEach
2196 lldb::addr_t Target::GetPersistentSymbol(const ConstString &name) {
2197 lldb::addr_t address = LLDB_INVALID_ADDRESS;
2199 m_scratch_type_system_map.ForEach(
2200 [name, &address](TypeSystem *type_system) -> bool {
2201 if (PersistentExpressionState *persistent_state =
2202 type_system->GetPersistentExpressionState()) {
2203 address = persistent_state->LookupSymbol(name);
2204 if (address != LLDB_INVALID_ADDRESS)
2205 return false; // Stop iterating the ForEach
2207 return true; // Keep iterating the ForEach
2212 lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr,
2213 AddressClass addr_class) const {
2214 addr_t code_addr = load_addr;
2215 switch (m_arch.GetMachine()) {
2216 case llvm::Triple::mips:
2217 case llvm::Triple::mipsel:
2218 case llvm::Triple::mips64:
2219 case llvm::Triple::mips64el:
2220 switch (addr_class) {
2221 case eAddressClassData:
2222 case eAddressClassDebug:
2223 return LLDB_INVALID_ADDRESS;
2225 case eAddressClassUnknown:
2226 case eAddressClassInvalid:
2227 case eAddressClassCode:
2228 case eAddressClassCodeAlternateISA:
2229 case eAddressClassRuntime:
2230 if ((code_addr & 2ull) || (addr_class == eAddressClassCodeAlternateISA))
2236 case llvm::Triple::arm:
2237 case llvm::Triple::thumb:
2238 switch (addr_class) {
2239 case eAddressClassData:
2240 case eAddressClassDebug:
2241 return LLDB_INVALID_ADDRESS;
2243 case eAddressClassUnknown:
2244 case eAddressClassInvalid:
2245 case eAddressClassCode:
2246 case eAddressClassCodeAlternateISA:
2247 case eAddressClassRuntime:
2248 // Check if bit zero it no set?
2249 if ((code_addr & 1ull) == 0) {
2250 // Bit zero isn't set, check if the address is a multiple of 2?
2251 if (code_addr & 2ull) {
2252 // The address is a multiple of 2 so it must be thumb, set bit zero
2254 } else if (addr_class == eAddressClassCodeAlternateISA) {
2255 // We checked the address and the address claims to be the alternate
2257 // which means thumb, so set bit zero.
2271 lldb::addr_t Target::GetOpcodeLoadAddress(lldb::addr_t load_addr,
2272 AddressClass addr_class) const {
2273 addr_t opcode_addr = load_addr;
2274 switch (m_arch.GetMachine()) {
2275 case llvm::Triple::mips:
2276 case llvm::Triple::mipsel:
2277 case llvm::Triple::mips64:
2278 case llvm::Triple::mips64el:
2279 case llvm::Triple::arm:
2280 case llvm::Triple::thumb:
2281 switch (addr_class) {
2282 case eAddressClassData:
2283 case eAddressClassDebug:
2284 return LLDB_INVALID_ADDRESS;
2286 case eAddressClassInvalid:
2287 case eAddressClassUnknown:
2288 case eAddressClassCode:
2289 case eAddressClassCodeAlternateISA:
2290 case eAddressClassRuntime:
2291 opcode_addr &= ~(1ull);
2302 lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) {
2303 addr_t breakable_addr = addr;
2304 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
2306 switch (m_arch.GetMachine()) {
2309 case llvm::Triple::mips:
2310 case llvm::Triple::mipsel:
2311 case llvm::Triple::mips64:
2312 case llvm::Triple::mips64el: {
2313 addr_t function_start = 0;
2314 addr_t current_offset = 0;
2315 uint32_t loop_count = 0;
2316 Address resolved_addr;
2317 uint32_t arch_flags = m_arch.GetFlags();
2318 bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
2319 bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
2320 SectionLoadList §ion_load_list = GetSectionLoadList();
2322 if (section_load_list.IsEmpty())
2323 // No sections are loaded, so we must assume we are not running yet
2324 // and need to operate only on file address.
2325 m_images.ResolveFileAddress(addr, resolved_addr);
2327 section_load_list.ResolveLoadAddress(addr, resolved_addr);
2329 // Get the function boundaries to make sure we don't scan back before the
2330 // beginning of the current function.
2331 ModuleSP temp_addr_module_sp(resolved_addr.GetModule());
2332 if (temp_addr_module_sp) {
2334 uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
2335 temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr,
2339 sym_addr = sc.function->GetAddressRange().GetBaseAddress();
2341 sym_addr = sc.symbol->GetAddress();
2343 function_start = sym_addr.GetLoadAddress(this);
2344 if (function_start == LLDB_INVALID_ADDRESS)
2345 function_start = sym_addr.GetFileAddress();
2348 current_offset = addr - function_start;
2351 // If breakpoint address is start of function then we dont have to do
2353 if (current_offset == 0)
2354 return breakable_addr;
2356 loop_count = current_offset / 2;
2358 if (loop_count > 3) {
2359 // Scan previous 6 bytes
2360 if (IsMips16 | IsMicromips)
2362 // For mips-only, instructions are always 4 bytes, so scan previous 4
2368 // Create Disassembler Instance
2369 lldb::DisassemblerSP disasm_sp(
2370 Disassembler::FindPlugin(m_arch, nullptr, nullptr));
2372 ExecutionContext exe_ctx;
2373 CalculateExecutionContext(exe_ctx);
2374 InstructionList instruction_list;
2375 InstructionSP prev_insn;
2376 bool prefer_file_cache = true; // Read from file
2377 uint32_t inst_to_choose = 0;
2379 for (uint32_t i = 1; i <= loop_count; i++) {
2380 // Adjust the address to read from.
2381 resolved_addr.Slide(-2);
2382 AddressRange range(resolved_addr, i * 2);
2383 uint32_t insn_size = 0;
2385 disasm_sp->ParseInstructions(&exe_ctx, range, nullptr, prefer_file_cache);
2387 uint32_t num_insns = disasm_sp->GetInstructionList().GetSize();
2389 prev_insn = disasm_sp->GetInstructionList().GetInstructionAtIndex(0);
2390 insn_size = prev_insn->GetOpcode().GetByteSize();
2391 if (i == 1 && insn_size == 2) {
2392 // This looks like a valid 2-byte instruction (but it could be a part
2393 // of upper 4 byte instruction).
2394 instruction_list.Append(prev_insn);
2396 } else if (i == 2) {
2397 // Here we may get one 4-byte instruction or two 2-byte instructions.
2398 if (num_insns == 2) {
2399 // Looks like there are two 2-byte instructions above our breakpoint
2401 // Now the upper 2-byte instruction is either a valid 2-byte
2402 // instruction or could be a part of it's upper 4-byte instruction.
2403 // In both cases we don't care because in this case lower 2-byte
2404 // instruction is definitely a valid instruction
2405 // and whatever i=1 iteration has found out is true.
2408 } else if (insn_size == 4) {
2409 // This instruction claims its a valid 4-byte instruction. But it
2410 // could be a part of it's upper 4-byte instruction.
2411 // Lets try scanning upper 2 bytes to verify this.
2412 instruction_list.Append(prev_insn);
2415 } else if (i == 3) {
2417 // FIXME: We reached here that means instruction at [target - 4] has
2418 // already claimed to be a 4-byte instruction,
2419 // and now instruction at [target - 6] is also claiming that it's a
2420 // 4-byte instruction. This can not be true.
2421 // In this case we can not decide the valid previous instruction so
2422 // we let lldb set the breakpoint at the address given by user.
2425 // This is straight-forward
2430 // Decode failed, bytes do not form a valid instruction. So whatever
2431 // previous iteration has found out is true.
2433 inst_to_choose = i - 1;
2439 // Check if we are able to find any valid instruction.
2440 if (inst_to_choose) {
2441 if (inst_to_choose > instruction_list.GetSize())
2443 prev_insn = instruction_list.GetInstructionAtIndex(inst_to_choose - 1);
2445 if (prev_insn->HasDelaySlot()) {
2446 uint32_t shift_size = prev_insn->GetOpcode().GetByteSize();
2447 // Adjust the breakable address
2448 breakable_addr = addr - shift_size;
2450 log->Printf("Target::%s Breakpoint at 0x%8.8" PRIx64
2451 " is adjusted to 0x%8.8" PRIx64 " due to delay slot\n",
2452 __FUNCTION__, addr, breakable_addr);
2458 return breakable_addr;
2461 SourceManager &Target::GetSourceManager() {
2462 if (!m_source_manager_ap)
2463 m_source_manager_ap.reset(new SourceManager(shared_from_this()));
2464 return *m_source_manager_ap;
2467 ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() {
2468 static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended
2473 std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex);
2475 if (!m_clang_modules_decl_vendor_ap) {
2476 m_clang_modules_decl_vendor_ap.reset(
2477 ClangModulesDeclVendor::Create(*this));
2481 return m_clang_modules_decl_vendor_ap.get();
2484 Target::StopHookSP Target::CreateStopHook() {
2485 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2486 Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid));
2487 m_stop_hooks[new_uid] = stop_hook_sp;
2488 return stop_hook_sp;
2491 bool Target::RemoveStopHookByID(lldb::user_id_t user_id) {
2492 size_t num_removed = m_stop_hooks.erase(user_id);
2493 return (num_removed != 0);
2496 void Target::RemoveAllStopHooks() { m_stop_hooks.clear(); }
2498 Target::StopHookSP Target::GetStopHookByID(lldb::user_id_t user_id) {
2499 StopHookSP found_hook;
2501 StopHookCollection::iterator specified_hook_iter;
2502 specified_hook_iter = m_stop_hooks.find(user_id);
2503 if (specified_hook_iter != m_stop_hooks.end())
2504 found_hook = (*specified_hook_iter).second;
2508 bool Target::SetStopHookActiveStateByID(lldb::user_id_t user_id,
2509 bool active_state) {
2510 StopHookCollection::iterator specified_hook_iter;
2511 specified_hook_iter = m_stop_hooks.find(user_id);
2512 if (specified_hook_iter == m_stop_hooks.end())
2515 (*specified_hook_iter).second->SetIsActive(active_state);
2519 void Target::SetAllStopHooksActiveState(bool active_state) {
2520 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2521 for (pos = m_stop_hooks.begin(); pos != end; pos++) {
2522 (*pos).second->SetIsActive(active_state);
2526 void Target::RunStopHooks() {
2527 if (m_suppress_stop_hooks)
2533 // <rdar://problem/12027563> make sure we check that we are not stopped
2534 // because of us running a user expression
2535 // since in that case we do not want to run the stop-hooks
2536 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2539 if (m_stop_hooks.empty())
2542 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2544 // If there aren't any active stop hooks, don't bother either:
2545 bool any_active_hooks = false;
2546 for (pos = m_stop_hooks.begin(); pos != end; pos++) {
2547 if ((*pos).second->IsActive()) {
2548 any_active_hooks = true;
2552 if (!any_active_hooks)
2555 CommandReturnObject result;
2557 std::vector<ExecutionContext> exc_ctx_with_reasons;
2558 std::vector<SymbolContext> sym_ctx_with_reasons;
2560 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2561 size_t num_threads = cur_threadlist.GetSize();
2562 for (size_t i = 0; i < num_threads; i++) {
2563 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex(i);
2564 if (cur_thread_sp->ThreadStoppedForAReason()) {
2565 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2566 exc_ctx_with_reasons.push_back(ExecutionContext(
2567 m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2568 sym_ctx_with_reasons.push_back(
2569 cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2573 // If no threads stopped for a reason, don't run the stop-hooks.
2574 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2575 if (num_exe_ctx == 0)
2578 result.SetImmediateOutputStream(m_debugger.GetAsyncOutputStream());
2579 result.SetImmediateErrorStream(m_debugger.GetAsyncErrorStream());
2581 bool keep_going = true;
2582 bool hooks_ran = false;
2583 bool print_hook_header = (m_stop_hooks.size() != 1);
2584 bool print_thread_header = (num_exe_ctx != 1);
2586 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) {
2588 StopHookSP cur_hook_sp = (*pos).second;
2589 if (!cur_hook_sp->IsActive())
2592 bool any_thread_matched = false;
2593 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) {
2594 if ((cur_hook_sp->GetSpecifier() == nullptr ||
2595 cur_hook_sp->GetSpecifier()->SymbolContextMatches(
2596 sym_ctx_with_reasons[i])) &&
2597 (cur_hook_sp->GetThreadSpecifier() == nullptr ||
2598 cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(
2599 exc_ctx_with_reasons[i].GetThreadRef()))) {
2603 if (print_hook_header && !any_thread_matched) {
2605 (cur_hook_sp->GetCommands().GetSize() == 1
2606 ? cur_hook_sp->GetCommands().GetStringAtIndex(0)
2609 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n",
2610 cur_hook_sp->GetID(), cmd);
2612 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n",
2613 cur_hook_sp->GetID());
2614 any_thread_matched = true;
2617 if (print_thread_header)
2618 result.AppendMessageWithFormat(
2620 exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2622 CommandInterpreterRunOptions options;
2623 options.SetStopOnContinue(true);
2624 options.SetStopOnError(true);
2625 options.SetEchoCommands(false);
2626 options.SetPrintResults(true);
2627 options.SetAddToHistory(false);
2629 GetDebugger().GetCommandInterpreter().HandleCommands(
2630 cur_hook_sp->GetCommands(), &exc_ctx_with_reasons[i], options,
2633 // If the command started the target going again, we should bag out of
2634 // running the stop hooks.
2635 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2636 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) {
2637 result.AppendMessageWithFormat("Aborting stop hooks, hook %" PRIu64
2638 " set the program running.",
2639 cur_hook_sp->GetID());
2646 result.GetImmediateOutputStream()->Flush();
2647 result.GetImmediateErrorStream()->Flush();
2650 const TargetPropertiesSP &Target::GetGlobalProperties() {
2651 // NOTE: intentional leak so we don't crash if global destructor chain gets
2652 // called as other threads still use the result of this function
2653 static TargetPropertiesSP *g_settings_sp_ptr =
2654 new TargetPropertiesSP(new TargetProperties(nullptr));
2655 return *g_settings_sp_ptr;
2658 Status Target::Install(ProcessLaunchInfo *launch_info) {
2660 PlatformSP platform_sp(GetPlatform());
2662 if (platform_sp->IsRemote()) {
2663 if (platform_sp->IsConnected()) {
2664 // Install all files that have an install path, and always install the
2665 // main executable when connected to a remote platform
2666 const ModuleList &modules = GetImages();
2667 const size_t num_images = modules.GetSize();
2668 for (size_t idx = 0; idx < num_images; ++idx) {
2669 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2671 const bool is_main_executable = module_sp == GetExecutableModule();
2672 FileSpec local_file(module_sp->GetFileSpec());
2674 FileSpec remote_file(module_sp->GetRemoteInstallFileSpec());
2676 if (is_main_executable) // TODO: add setting for always
2677 // installing main executable???
2679 // Always install the main executable
2680 remote_file = platform_sp->GetRemoteWorkingDirectory();
2681 remote_file.AppendPathComponent(
2682 module_sp->GetFileSpec().GetFilename().GetCString());
2686 error = platform_sp->Install(local_file, remote_file);
2687 if (error.Success()) {
2688 module_sp->SetPlatformFileSpec(remote_file);
2689 if (is_main_executable) {
2690 platform_sp->SetFilePermissions(remote_file, 0700);
2692 launch_info->SetExecutableFile(remote_file, false);
2706 bool Target::ResolveLoadAddress(addr_t load_addr, Address &so_addr,
2708 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2711 bool Target::ResolveFileAddress(lldb::addr_t file_addr,
2712 Address &resolved_addr) {
2713 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2716 bool Target::SetSectionLoadAddress(const SectionSP §ion_sp,
2717 addr_t new_section_load_addr,
2718 bool warn_multiple) {
2719 const addr_t old_section_load_addr =
2720 m_section_load_history.GetSectionLoadAddress(
2721 SectionLoadHistory::eStopIDNow, section_sp);
2722 if (old_section_load_addr != new_section_load_addr) {
2723 uint32_t stop_id = 0;
2724 ProcessSP process_sp(GetProcessSP());
2726 stop_id = process_sp->GetStopID();
2728 stop_id = m_section_load_history.GetLastStopID();
2729 if (m_section_load_history.SetSectionLoadAddress(
2730 stop_id, section_sp, new_section_load_addr, warn_multiple))
2731 return true; // Return true if the section load address was changed...
2733 return false; // Return false to indicate nothing changed
2736 size_t Target::UnloadModuleSections(const ModuleList &module_list) {
2737 size_t section_unload_count = 0;
2738 size_t num_modules = module_list.GetSize();
2739 for (size_t i = 0; i < num_modules; ++i) {
2740 section_unload_count +=
2741 UnloadModuleSections(module_list.GetModuleAtIndex(i));
2743 return section_unload_count;
2746 size_t Target::UnloadModuleSections(const lldb::ModuleSP &module_sp) {
2747 uint32_t stop_id = 0;
2748 ProcessSP process_sp(GetProcessSP());
2750 stop_id = process_sp->GetStopID();
2752 stop_id = m_section_load_history.GetLastStopID();
2753 SectionList *sections = module_sp->GetSectionList();
2754 size_t section_unload_count = 0;
2756 const uint32_t num_sections = sections->GetNumSections(0);
2757 for (uint32_t i = 0; i < num_sections; ++i) {
2758 section_unload_count += m_section_load_history.SetSectionUnloaded(
2759 stop_id, sections->GetSectionAtIndex(i));
2762 return section_unload_count;
2765 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp) {
2766 uint32_t stop_id = 0;
2767 ProcessSP process_sp(GetProcessSP());
2769 stop_id = process_sp->GetStopID();
2771 stop_id = m_section_load_history.GetLastStopID();
2772 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp);
2775 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp,
2777 uint32_t stop_id = 0;
2778 ProcessSP process_sp(GetProcessSP());
2780 stop_id = process_sp->GetStopID();
2782 stop_id = m_section_load_history.GetLastStopID();
2783 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp,
2787 void Target::ClearAllLoadedSections() { m_section_load_history.Clear(); }
2789 Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) {
2791 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
2794 log->Printf("Target::%s() called for %s", __FUNCTION__,
2795 launch_info.GetExecutableFile().GetPath().c_str());
2797 StateType state = eStateInvalid;
2799 // Scope to temporarily get the process state in case someone has manually
2800 // remotely connected already to a process and we can skip the platform
2803 ProcessSP process_sp(GetProcessSP());
2806 state = process_sp->GetState();
2809 "Target::%s the process exists, and its current state is %s",
2810 __FUNCTION__, StateAsCString(state));
2813 log->Printf("Target::%s the process instance doesn't currently exist.",
2818 launch_info.GetFlags().Set(eLaunchFlagDebug);
2820 // Get the value of synchronous execution here. If you wait till after you
2822 // run, then you could have hit a breakpoint, whose command might switch the
2824 // then you'll pick up that incorrect value.
2825 Debugger &debugger = GetDebugger();
2826 const bool synchronous_execution =
2827 debugger.GetCommandInterpreter().GetSynchronous();
2829 PlatformSP platform_sp(GetPlatform());
2831 // Finalize the file actions, and if none were given, default to opening
2832 // up a pseudo terminal
2833 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
2835 log->Printf("Target::%s have platform=%s, platform_sp->IsHost()=%s, "
2836 "default_to_use_pty=%s",
2837 __FUNCTION__, platform_sp ? "true" : "false",
2838 platform_sp ? (platform_sp->IsHost() ? "true" : "false")
2840 default_to_use_pty ? "true" : "false");
2842 launch_info.FinalizeFileActions(this, default_to_use_pty);
2844 if (state == eStateConnected) {
2845 if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
2846 error.SetErrorString(
2847 "can't launch in tty when launching through a remote connection");
2852 if (!launch_info.GetArchitecture().IsValid())
2853 launch_info.GetArchitecture() = GetArchitecture();
2855 // If we're not already connected to the process, and if we have a platform
2856 // that can launch a process for debugging, go ahead and do that here.
2857 if (state != eStateConnected && platform_sp &&
2858 platform_sp->CanDebugProcess()) {
2860 log->Printf("Target::%s asking the platform to debug the process",
2863 // Get a weak pointer to the previous process if we have one
2864 ProcessWP process_wp;
2866 process_wp = m_process_sp;
2868 GetPlatform()->DebugProcess(launch_info, debugger, this, error);
2870 // Cleanup the old process since someone might still have a strong
2871 // reference to this process and we would like to allow it to cleanup
2872 // as much as it can without the object being destroyed. We try to
2873 // lock the shared pointer and if that works, then someone else still
2874 // has a strong reference to the process.
2876 ProcessSP old_process_sp(process_wp.lock());
2878 old_process_sp->Finalize();
2881 log->Printf("Target::%s the platform doesn't know how to debug a "
2882 "process, getting a process plugin to do this for us.",
2885 if (state == eStateConnected) {
2886 assert(m_process_sp);
2888 // Use a Process plugin to construct the process.
2889 const char *plugin_name = launch_info.GetProcessPluginName();
2890 CreateProcess(launch_info.GetListenerForProcess(debugger), plugin_name,
2894 // Since we didn't have a platform launch the process, launch it here.
2896 error = m_process_sp->Launch(launch_info);
2899 if (!m_process_sp) {
2900 if (error.Success())
2901 error.SetErrorString("failed to launch or debug process");
2905 if (error.Success()) {
2906 if (synchronous_execution ||
2907 !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2908 ListenerSP hijack_listener_sp(launch_info.GetHijackListener());
2909 if (!hijack_listener_sp) {
2910 hijack_listener_sp =
2911 Listener::MakeListener("lldb.Target.Launch.hijack");
2912 launch_info.SetHijackListener(hijack_listener_sp);
2913 m_process_sp->HijackProcessEvents(hijack_listener_sp);
2916 StateType state = m_process_sp->WaitForProcessToStop(
2917 llvm::None, nullptr, false, hijack_listener_sp, nullptr);
2919 if (state == eStateStopped) {
2920 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2921 if (synchronous_execution) {
2922 error = m_process_sp->PrivateResume();
2923 if (error.Success()) {
2924 state = m_process_sp->WaitForProcessToStop(
2925 llvm::None, nullptr, true, hijack_listener_sp, stream);
2926 const bool must_be_alive =
2927 false; // eStateExited is ok, so this must be false
2928 if (!StateIsStoppedState(state, must_be_alive)) {
2929 error.SetErrorStringWithFormat("process isn't stopped: %s",
2930 StateAsCString(state));
2934 m_process_sp->RestoreProcessEvents();
2935 error = m_process_sp->PrivateResume();
2937 if (!error.Success()) {
2939 error2.SetErrorStringWithFormat(
2940 "process resume at entry point failed: %s", error.AsCString());
2944 } else if (state == eStateExited) {
2945 bool with_shell = !!launch_info.GetShell();
2946 const int exit_status = m_process_sp->GetExitStatus();
2947 const char *exit_desc = m_process_sp->GetExitDescription();
2948 #define LAUNCH_SHELL_MESSAGE \
2949 "\n'r' and 'run' are aliases that default to launching through a " \
2950 "shell.\nTry launching without going through a shell by using 'process " \
2952 if (exit_desc && exit_desc[0]) {
2954 error.SetErrorStringWithFormat(
2955 "process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE,
2956 exit_status, exit_desc);
2958 error.SetErrorStringWithFormat("process exited with status %i (%s)",
2959 exit_status, exit_desc);
2962 error.SetErrorStringWithFormat(
2963 "process exited with status %i" LAUNCH_SHELL_MESSAGE,
2966 error.SetErrorStringWithFormat("process exited with status %i",
2970 error.SetErrorStringWithFormat(
2971 "initial process state wasn't stopped: %s", StateAsCString(state));
2974 m_process_sp->RestoreProcessEvents();
2977 error2.SetErrorStringWithFormat("process launch failed: %s",
2984 Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) {
2985 auto state = eStateInvalid;
2986 auto process_sp = GetProcessSP();
2988 state = process_sp->GetState();
2989 if (process_sp->IsAlive() && state != eStateConnected) {
2990 if (state == eStateAttaching)
2991 return Status("process attach is in progress");
2992 return Status("a process is already being debugged");
2996 const ModuleSP old_exec_module_sp = GetExecutableModule();
2998 // If no process info was specified, then use the target executable
2999 // name as the process to attach to by default
3000 if (!attach_info.ProcessInfoSpecified()) {
3001 if (old_exec_module_sp)
3002 attach_info.GetExecutableFile().GetFilename() =
3003 old_exec_module_sp->GetPlatformFileSpec().GetFilename();
3005 if (!attach_info.ProcessInfoSpecified()) {
3006 return Status("no process specified, create a target with a file, or "
3007 "specify the --pid or --name");
3011 const auto platform_sp =
3012 GetDebugger().GetPlatformList().GetSelectedPlatform();
3013 ListenerSP hijack_listener_sp;
3014 const bool async = attach_info.GetAsync();
3016 hijack_listener_sp =
3017 Listener::MakeListener("lldb.Target.Attach.attach.hijack");
3018 attach_info.SetHijackListener(hijack_listener_sp);
3022 if (state != eStateConnected && platform_sp != nullptr &&
3023 platform_sp->CanDebugProcess()) {
3024 SetPlatform(platform_sp);
3025 process_sp = platform_sp->Attach(attach_info, GetDebugger(), this, error);
3027 if (state != eStateConnected) {
3028 const char *plugin_name = attach_info.GetProcessPluginName();
3030 CreateProcess(attach_info.GetListenerForProcess(GetDebugger()),
3031 plugin_name, nullptr);
3032 if (process_sp == nullptr) {
3033 error.SetErrorStringWithFormat(
3034 "failed to create process using plugin %s",
3035 (plugin_name) ? plugin_name : "null");
3039 if (hijack_listener_sp)
3040 process_sp->HijackProcessEvents(hijack_listener_sp);
3041 error = process_sp->Attach(attach_info);
3044 if (error.Success() && process_sp) {
3046 process_sp->RestoreProcessEvents();
3048 state = process_sp->WaitForProcessToStop(
3049 llvm::None, nullptr, false, attach_info.GetHijackListener(), stream);
3050 process_sp->RestoreProcessEvents();
3052 if (state != eStateStopped) {
3053 const char *exit_desc = process_sp->GetExitDescription();
3055 error.SetErrorStringWithFormat("%s", exit_desc);
3057 error.SetErrorString(
3058 "process did not stop (no such process or permission problem?)");
3059 process_sp->Destroy(false);
3066 //--------------------------------------------------------------
3068 //--------------------------------------------------------------
3069 Target::StopHook::StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid)
3070 : UserID(uid), m_target_sp(target_sp), m_commands(), m_specifier_sp(),
3071 m_thread_spec_ap(), m_active(true) {}
3073 Target::StopHook::StopHook(const StopHook &rhs)
3074 : UserID(rhs.GetID()), m_target_sp(rhs.m_target_sp),
3075 m_commands(rhs.m_commands), m_specifier_sp(rhs.m_specifier_sp),
3076 m_thread_spec_ap(), m_active(rhs.m_active) {
3077 if (rhs.m_thread_spec_ap)
3078 m_thread_spec_ap.reset(new ThreadSpec(*rhs.m_thread_spec_ap.get()));
3081 Target::StopHook::~StopHook() = default;
3083 void Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) {
3084 m_specifier_sp.reset(specifier);
3087 void Target::StopHook::SetThreadSpecifier(ThreadSpec *specifier) {
3088 m_thread_spec_ap.reset(specifier);
3091 void Target::StopHook::GetDescription(Stream *s,
3092 lldb::DescriptionLevel level) const {
3093 int indent_level = s->GetIndentLevel();
3095 s->SetIndentLevel(indent_level + 2);
3097 s->Printf("Hook: %" PRIu64 "\n", GetID());
3099 s->Indent("State: enabled\n");
3101 s->Indent("State: disabled\n");
3103 if (m_specifier_sp) {
3105 s->PutCString("Specifier:\n");
3106 s->SetIndentLevel(indent_level + 4);
3107 m_specifier_sp->GetDescription(s, level);
3108 s->SetIndentLevel(indent_level + 2);
3111 if (m_thread_spec_ap) {
3113 s->Indent("Thread:\n");
3114 m_thread_spec_ap->GetDescription(&tmp, level);
3115 s->SetIndentLevel(indent_level + 4);
3116 s->Indent(tmp.GetString());
3117 s->PutCString("\n");
3118 s->SetIndentLevel(indent_level + 2);
3121 s->Indent("Commands: \n");
3122 s->SetIndentLevel(indent_level + 4);
3123 uint32_t num_commands = m_commands.GetSize();
3124 for (uint32_t i = 0; i < num_commands; i++) {
3125 s->Indent(m_commands.GetStringAtIndex(i));
3126 s->PutCString("\n");
3128 s->SetIndentLevel(indent_level);
3131 //--------------------------------------------------------------
3132 // class TargetProperties
3133 //--------------------------------------------------------------
3135 OptionEnumValueElement lldb_private::g_dynamic_value_types[] = {
3136 {eNoDynamicValues, "no-dynamic-values",
3137 "Don't calculate the dynamic type of values"},
3138 {eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values "
3139 "even if you have to run the target."},
3140 {eDynamicDontRunTarget, "no-run-target",
3141 "Calculate the dynamic type of values, but don't run the target."},
3142 {0, nullptr, nullptr}};
3144 static OptionEnumValueElement g_inline_breakpoint_enums[] = {
3145 {eInlineBreakpointsNever, "never", "Never look for inline breakpoint "
3146 "locations (fastest). This setting "
3147 "should only be used if you know that "
3148 "no inlining occurs in your programs."},
3149 {eInlineBreakpointsHeaders, "headers",
3150 "Only check for inline breakpoint locations when setting breakpoints in "
3151 "header files, but not when setting breakpoint in implementation source "
3152 "files (default)."},
3153 {eInlineBreakpointsAlways, "always",
3154 "Always look for inline breakpoint locations when setting file and line "
3155 "breakpoints (slower but most accurate)."},
3156 {0, nullptr, nullptr}};
3158 typedef enum x86DisassemblyFlavor {
3159 eX86DisFlavorDefault,
3162 } x86DisassemblyFlavor;
3164 static OptionEnumValueElement g_x86_dis_flavor_value_types[] = {
3165 {eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
3166 {eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
3167 {eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
3168 {0, nullptr, nullptr}};
3170 static OptionEnumValueElement g_hex_immediate_style_values[] = {
3171 {Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
3172 {Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
3173 {0, nullptr, nullptr}};
3175 static OptionEnumValueElement g_load_script_from_sym_file_values[] = {
3176 {eLoadScriptFromSymFileTrue, "true",
3177 "Load debug scripts inside symbol files"},
3178 {eLoadScriptFromSymFileFalse, "false",
3179 "Do not load debug scripts inside symbol files."},
3180 {eLoadScriptFromSymFileWarn, "warn",
3181 "Warn about debug scripts inside symbol files but do not load them."},
3182 {0, nullptr, nullptr}};
3184 static OptionEnumValueElement g_load_current_working_dir_lldbinit_values[] = {
3185 {eLoadCWDlldbinitTrue, "true",
3186 "Load .lldbinit files from current directory"},
3187 {eLoadCWDlldbinitFalse, "false",
3188 "Do not load .lldbinit files from current directory"},
3189 {eLoadCWDlldbinitWarn, "warn",
3190 "Warn about loading .lldbinit files from current directory"},
3191 {0, nullptr, nullptr}};
3193 static OptionEnumValueElement g_memory_module_load_level_values[] = {
3194 {eMemoryModuleLoadLevelMinimal, "minimal",
3195 "Load minimal information when loading modules from memory. Currently "
3196 "this setting loads sections only."},
3197 {eMemoryModuleLoadLevelPartial, "partial",
3198 "Load partial information when loading modules from memory. Currently "
3199 "this setting loads sections and function bounds."},
3200 {eMemoryModuleLoadLevelComplete, "complete",
3201 "Load complete information when loading modules from memory. Currently "
3202 "this setting loads sections and all symbols."},
3203 {0, nullptr, nullptr}};
3205 static PropertyDefinition g_properties[] = {
3206 {"default-arch", OptionValue::eTypeArch, true, 0, nullptr, nullptr,
3207 "Default architecture to choose, when there's a choice."},
3208 {"move-to-nearest-code", OptionValue::eTypeBoolean, false, true, nullptr,
3209 nullptr, "Move breakpoints to nearest code."},
3210 {"language", OptionValue::eTypeLanguage, false, eLanguageTypeUnknown,
3212 "The language to use when interpreting expressions entered in commands."},
3213 {"expr-prefix", OptionValue::eTypeFileSpec, false, 0, nullptr, nullptr,
3214 "Path to a file containing expressions to be prepended to all "
3216 {"prefer-dynamic-value", OptionValue::eTypeEnum, false,
3217 eDynamicDontRunTarget, nullptr, g_dynamic_value_types,
3218 "Should printed values be shown as their dynamic value."},
3219 {"enable-synthetic-value", OptionValue::eTypeBoolean, false, true, nullptr,
3220 nullptr, "Should synthetic values be used by default whenever available."},
3221 {"skip-prologue", OptionValue::eTypeBoolean, false, true, nullptr, nullptr,
3222 "Skip function prologues when setting breakpoints by name."},
3223 {"source-map", OptionValue::eTypePathMap, false, 0, nullptr, nullptr,
3224 "Source path remappings are used to track the change of location between "
3225 "a source file when built, and "
3226 "where it exists on the current system. It consists of an array of "
3227 "duples, the first element of each duple is "
3228 "some part (starting at the root) of the path to the file when it was "
3230 "and the second is where the remainder of the original build hierarchy is "
3231 "rooted on the local system. "
3232 "Each element of the array is checked in order and the first one that "
3233 "results in a match wins."},
3234 {"exec-search-paths", OptionValue::eTypeFileSpecList, false, 0, nullptr,
3235 nullptr, "Executable search paths to use when locating executable files "
3236 "whose paths don't match the local file system."},
3237 {"debug-file-search-paths", OptionValue::eTypeFileSpecList, false, 0,
3239 "List of directories to be searched when locating debug symbol files."},
3240 {"clang-module-search-paths", OptionValue::eTypeFileSpecList, false, 0,
3242 "List of directories to be searched when locating modules for Clang."},
3243 {"auto-import-clang-modules", OptionValue::eTypeBoolean, false, true,
3245 "Automatically load Clang modules referred to by the program."},
3246 {"auto-apply-fixits", OptionValue::eTypeBoolean, false, true, nullptr,
3247 nullptr, "Automatically apply fix-it hints to expressions."},
3248 {"notify-about-fixits", OptionValue::eTypeBoolean, false, true, nullptr,
3249 nullptr, "Print the fixed expression text."},
3250 {"save-jit-objects", OptionValue::eTypeBoolean, false, false, nullptr,
3251 nullptr, "Save intermediate object files generated by the LLVM JIT"},
3252 {"max-children-count", OptionValue::eTypeSInt64, false, 256, nullptr,
3253 nullptr, "Maximum number of children to expand in any level of depth."},
3254 {"max-string-summary-length", OptionValue::eTypeSInt64, false, 1024,
3256 "Maximum number of characters to show when using %s in summary strings."},
3257 {"max-memory-read-size", OptionValue::eTypeSInt64, false, 1024, nullptr,
3258 nullptr, "Maximum number of bytes that 'memory read' will fetch before "
3259 "--force must be specified."},
3260 {"breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean, false,
3261 true, nullptr, nullptr, "Consult the platform module avoid list when "
3262 "setting non-module specific breakpoints."},
3263 {"arg0", OptionValue::eTypeString, false, 0, nullptr, nullptr,
3264 "The first argument passed to the program in the argument array which can "
3265 "be different from the executable itself."},
3266 {"run-args", OptionValue::eTypeArgs, false, 0, nullptr, nullptr,
3267 "A list containing all the arguments to be passed to the executable when "
3268 "it is run. Note that this does NOT include the argv[0] which is in "
3270 {"env-vars", OptionValue::eTypeDictionary, false, OptionValue::eTypeString,
3271 nullptr, nullptr, "A list of all the environment variables to be passed "
3272 "to the executable's environment, and their values."},
3273 {"inherit-env", OptionValue::eTypeBoolean, false, true, nullptr, nullptr,
3274 "Inherit the environment from the process that is running LLDB."},
3275 {"input-path", OptionValue::eTypeFileSpec, false, 0, nullptr, nullptr,
3276 "The file/path to be used by the executable program for reading its "
3278 {"output-path", OptionValue::eTypeFileSpec, false, 0, nullptr, nullptr,
3279 "The file/path to be used by the executable program for writing its "
3280 "standard output."},
3281 {"error-path", OptionValue::eTypeFileSpec, false, 0, nullptr, nullptr,
3282 "The file/path to be used by the executable program for writing its "
3284 {"detach-on-error", OptionValue::eTypeBoolean, false, true, nullptr,
3285 nullptr, "debugserver will detach (rather than killing) a process if it "
3286 "loses connection with lldb."},
3287 {"preload-symbols", OptionValue::eTypeBoolean, false, true, nullptr, nullptr,
3288 "Enable loading of symbol tables before they are needed."},
3289 {"disable-aslr", OptionValue::eTypeBoolean, false, true, nullptr, nullptr,
3290 "Disable Address Space Layout Randomization (ASLR)"},
3291 {"disable-stdio", OptionValue::eTypeBoolean, false, false, nullptr, nullptr,
3292 "Disable stdin/stdout for process (e.g. for a GUI application)"},
3293 {"inline-breakpoint-strategy", OptionValue::eTypeEnum, false,
3294 eInlineBreakpointsAlways, nullptr, g_inline_breakpoint_enums,
3295 "The strategy to use when settings breakpoints by file and line. "
3296 "Breakpoint locations can end up being inlined by the compiler, so that a "
3297 "compile unit 'a.c' might contain an inlined function from another source "
3299 "Usually this is limited to breakpoint locations from inlined functions "
3300 "from header or other include files, or more accurately "
3301 "non-implementation source files. "
3302 "Sometimes code might #include implementation files and cause inlined "
3303 "breakpoint locations in inlined implementation files. "
3304 "Always checking for inlined breakpoint locations can be expensive "
3305 "(memory and time), so if you have a project with many headers "
3306 "and find that setting breakpoints is slow, then you can change this "
3307 "setting to headers. "
3308 "This setting allows you to control exactly which strategy is used when "
3310 "file and line breakpoints."},
3311 // FIXME: This is the wrong way to do per-architecture settings, but we
3312 // don't have a general per architecture settings system in place yet.
3313 {"x86-disassembly-flavor", OptionValue::eTypeEnum, false,
3314 eX86DisFlavorDefault, nullptr, g_x86_dis_flavor_value_types,
3315 "The default disassembly flavor to use for x86 or x86-64 targets."},
3316 {"use-hex-immediates", OptionValue::eTypeBoolean, false, true, nullptr,
3317 nullptr, "Show immediates in disassembly as hexadecimal."},
3318 {"hex-immediate-style", OptionValue::eTypeEnum, false,
3319 Disassembler::eHexStyleC, nullptr, g_hex_immediate_style_values,
3320 "Which style to use for printing hexadecimal disassembly values."},
3321 {"use-fast-stepping", OptionValue::eTypeBoolean, false, true, nullptr,
3322 nullptr, "Use a fast stepping algorithm based on running from branch to "
3323 "branch rather than instruction single-stepping."},
3324 {"load-script-from-symbol-file", OptionValue::eTypeEnum, false,
3325 eLoadScriptFromSymFileWarn, nullptr, g_load_script_from_sym_file_values,
3326 "Allow LLDB to load scripting resources embedded in symbol files when "
3328 {"load-cwd-lldbinit", OptionValue::eTypeEnum, false, eLoadCWDlldbinitWarn,
3329 nullptr, g_load_current_working_dir_lldbinit_values,
3330 "Allow LLDB to .lldbinit files from the current directory automatically."},
3331 {"memory-module-load-level", OptionValue::eTypeEnum, false,
3332 eMemoryModuleLoadLevelComplete, nullptr, g_memory_module_load_level_values,
3333 "Loading modules from memory can be slow as reading the symbol tables and "
3334 "other data can take a long time depending on your connection to the "
3336 "This setting helps users control how much information gets loaded when "
3337 "loading modules from memory."
3338 "'complete' is the default value for this setting which will load all "
3339 "sections and symbols by reading them from memory (slowest, most "
3341 "'partial' will load sections and attempt to find function bounds without "
3342 "downloading the symbol table (faster, still accurate, missing symbol "
3344 "'minimal' is the fastest setting and will load section data with no "
3345 "symbols, but should rarely be used as stack frames in these memory "
3346 "regions will be inaccurate and not provide any context (fastest). "},
3347 {"display-expression-in-crashlogs", OptionValue::eTypeBoolean, false, false,
3348 nullptr, nullptr, "Expressions that crash will show up in crash logs if "
3349 "the host system supports executable specific crash log "
3350 "strings and this setting is set to true."},
3351 {"trap-handler-names", OptionValue::eTypeArray, true,
3352 OptionValue::eTypeString, nullptr, nullptr,
3353 "A list of trap handler function names, e.g. a common Unix user process "
3354 "one is _sigtramp."},
3355 {"display-runtime-support-values", OptionValue::eTypeBoolean, false, false,
3356 nullptr, nullptr, "If true, LLDB will show variables that are meant to "
3357 "support the operation of a language's runtime "
3359 {"non-stop-mode", OptionValue::eTypeBoolean, false, 0, nullptr, nullptr,
3360 "Disable lock-step debugging, instead control threads independently."},
3361 {nullptr, OptionValue::eTypeInvalid, false, 0, nullptr, nullptr, nullptr}};
3364 ePropertyDefaultArch,
3365 ePropertyMoveToNearestCode,
3367 ePropertyExprPrefix,
3368 ePropertyPreferDynamic,
3369 ePropertyEnableSynthetic,
3370 ePropertySkipPrologue,
3372 ePropertyExecutableSearchPaths,
3373 ePropertyDebugFileSearchPaths,
3374 ePropertyClangModuleSearchPaths,
3375 ePropertyAutoImportClangModules,
3376 ePropertyAutoApplyFixIts,
3377 ePropertyNotifyAboutFixIts,
3378 ePropertySaveObjects,
3379 ePropertyMaxChildrenCount,
3380 ePropertyMaxSummaryLength,
3381 ePropertyMaxMemReadSize,
3382 ePropertyBreakpointUseAvoidList,
3386 ePropertyInheritEnv,
3388 ePropertyOutputPath,
3390 ePropertyDetachOnError,
3391 ePropertyPreloadSymbols,
3392 ePropertyDisableASLR,
3393 ePropertyDisableSTDIO,
3394 ePropertyInlineStrategy,
3395 ePropertyDisassemblyFlavor,
3396 ePropertyUseHexImmediates,
3397 ePropertyHexImmediateStyle,
3398 ePropertyUseFastStepping,
3399 ePropertyLoadScriptFromSymbolFile,
3400 ePropertyLoadCWDlldbinitFile,
3401 ePropertyMemoryModuleLoadLevel,
3402 ePropertyDisplayExpressionsInCrashlogs,
3403 ePropertyTrapHandlerNames,
3404 ePropertyDisplayRuntimeSupportValues,
3405 ePropertyNonStopModeEnabled,
3406 ePropertyExperimental
3409 class TargetOptionValueProperties : public OptionValueProperties {
3411 TargetOptionValueProperties(const ConstString &name)
3412 : OptionValueProperties(name), m_target(nullptr), m_got_host_env(false) {}
3414 // This constructor is used when creating TargetOptionValueProperties when it
3415 // is part of a new lldb_private::Target instance. It will copy all current
3416 // global property values as needed
3417 TargetOptionValueProperties(Target *target,
3418 const TargetPropertiesSP &target_properties_sp)
3419 : OptionValueProperties(*target_properties_sp->GetValueProperties()),
3420 m_target(target), m_got_host_env(false) {}
3422 const Property *GetPropertyAtIndex(const ExecutionContext *exe_ctx,
3424 uint32_t idx) const override {
3425 // When getting the value for a key from the target options, we will always
3426 // try and grab the setting from the current target if there is one. Else we
3428 // use the one from this instance.
3429 if (idx == ePropertyEnvVars)
3430 GetHostEnvironmentIfNeeded();
3433 Target *target = exe_ctx->GetTargetPtr();
3435 TargetOptionValueProperties *target_properties =
3436 static_cast<TargetOptionValueProperties *>(
3437 target->GetValueProperties().get());
3438 if (this != target_properties)
3439 return target_properties->ProtectedGetPropertyAtIndex(idx);
3442 return ProtectedGetPropertyAtIndex(idx);
3445 lldb::TargetSP GetTargetSP() { return m_target->shared_from_this(); }
3448 void GetHostEnvironmentIfNeeded() const {
3449 if (!m_got_host_env) {
3451 m_got_host_env = true;
3452 const uint32_t idx = ePropertyInheritEnv;
3453 if (GetPropertyAtIndexAsBoolean(
3454 nullptr, idx, g_properties[idx].default_uint_value != 0)) {
3455 PlatformSP platform_sp(m_target->GetPlatform());
3458 if (platform_sp->GetEnvironment(env)) {
3459 OptionValueDictionary *env_dict =
3460 GetPropertyAtIndexAsOptionValueDictionary(nullptr,
3463 const bool can_replace = false;
3464 const size_t envc = env.GetSize();
3465 for (size_t idx = 0; idx < envc; idx++) {
3466 const char *env_entry = env.GetStringAtIndex(idx);
3468 const char *equal_pos = ::strchr(env_entry, '=');
3470 // It is ok to have environment variables with no values
3471 const char *value = nullptr;
3473 key.SetCStringWithLength(env_entry,
3474 equal_pos - env_entry);
3476 value = equal_pos + 1;
3478 key.SetCString(env_entry);
3480 // Don't allow existing keys to be replaced with ones we get
3481 // from the platform environment
3482 env_dict->SetValueForKey(
3483 key, OptionValueSP(new OptionValueString(value)),
3495 mutable bool m_got_host_env;
3498 //----------------------------------------------------------------------
3500 //----------------------------------------------------------------------
3501 static PropertyDefinition g_experimental_properties[]{
3502 {"inject-local-vars", OptionValue::eTypeBoolean, true, true, nullptr,
3504 "If true, inject local variables explicitly into the expression text. "
3505 "This will fix symbol resolution when there are name collisions between "
3506 "ivars and local variables. "
3507 "But it can make expressions run much more slowly."},
3508 {nullptr, OptionValue::eTypeInvalid, true, 0, nullptr, nullptr, nullptr}};
3510 enum { ePropertyInjectLocalVars = 0 };
3512 class TargetExperimentalOptionValueProperties : public OptionValueProperties {
3514 TargetExperimentalOptionValueProperties()
3515 : OptionValueProperties(
3516 ConstString(Properties::GetExperimentalSettingsName())) {}
3519 TargetExperimentalProperties::TargetExperimentalProperties()
3520 : Properties(OptionValuePropertiesSP(
3521 new TargetExperimentalOptionValueProperties())) {
3522 m_collection_sp->Initialize(g_experimental_properties);
3525 //----------------------------------------------------------------------
3527 //----------------------------------------------------------------------
3528 TargetProperties::TargetProperties(Target *target)
3529 : Properties(), m_launch_info() {
3531 m_collection_sp.reset(
3532 new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
3534 // Set callbacks to update launch_info whenever "settins set" updated any of
3536 m_collection_sp->SetValueChangedCallback(
3537 ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3538 m_collection_sp->SetValueChangedCallback(
3539 ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3540 m_collection_sp->SetValueChangedCallback(
3541 ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3542 m_collection_sp->SetValueChangedCallback(
3543 ePropertyInputPath, TargetProperties::InputPathValueChangedCallback,
3545 m_collection_sp->SetValueChangedCallback(
3546 ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback,
3548 m_collection_sp->SetValueChangedCallback(
3549 ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback,
3551 m_collection_sp->SetValueChangedCallback(
3552 ePropertyDetachOnError,
3553 TargetProperties::DetachOnErrorValueChangedCallback, this);
3554 m_collection_sp->SetValueChangedCallback(
3555 ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback,
3557 m_collection_sp->SetValueChangedCallback(
3558 ePropertyDisableSTDIO,
3559 TargetProperties::DisableSTDIOValueChangedCallback, this);
3561 m_experimental_properties_up.reset(new TargetExperimentalProperties());
3562 m_collection_sp->AppendProperty(
3563 ConstString(Properties::GetExperimentalSettingsName()),
3564 ConstString("Experimental settings - setting these won't produce "
3565 "errors if the setting is not present."),
3566 true, m_experimental_properties_up->GetValueProperties());
3568 // Update m_launch_info once it was created
3569 Arg0ValueChangedCallback(this, nullptr);
3570 RunArgsValueChangedCallback(this, nullptr);
3571 // EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in
3572 // Target::GetPlatform()
3573 InputPathValueChangedCallback(this, nullptr);
3574 OutputPathValueChangedCallback(this, nullptr);
3575 ErrorPathValueChangedCallback(this, nullptr);
3576 DetachOnErrorValueChangedCallback(this, nullptr);
3577 DisableASLRValueChangedCallback(this, nullptr);
3578 DisableSTDIOValueChangedCallback(this, nullptr);
3580 m_collection_sp.reset(
3581 new TargetOptionValueProperties(ConstString("target")));
3582 m_collection_sp->Initialize(g_properties);
3583 m_experimental_properties_up.reset(new TargetExperimentalProperties());
3584 m_collection_sp->AppendProperty(
3585 ConstString(Properties::GetExperimentalSettingsName()),
3586 ConstString("Experimental settings - setting these won't produce "
3587 "errors if the setting is not present."),
3588 true, m_experimental_properties_up->GetValueProperties());
3589 m_collection_sp->AppendProperty(
3590 ConstString("process"), ConstString("Settings specific to processes."),
3591 true, Process::GetGlobalProperties()->GetValueProperties());
3595 TargetProperties::~TargetProperties() = default;
3597 bool TargetProperties::GetInjectLocalVariables(
3598 ExecutionContext *exe_ctx) const {
3599 const Property *exp_property = m_collection_sp->GetPropertyAtIndex(
3600 exe_ctx, false, ePropertyExperimental);
3601 OptionValueProperties *exp_values =
3602 exp_property->GetValue()->GetAsProperties();
3604 return exp_values->GetPropertyAtIndexAsBoolean(
3605 exe_ctx, ePropertyInjectLocalVars, true);
3610 void TargetProperties::SetInjectLocalVariables(ExecutionContext *exe_ctx,
3612 const Property *exp_property =
3613 m_collection_sp->GetPropertyAtIndex(exe_ctx, true, ePropertyExperimental);
3614 OptionValueProperties *exp_values =
3615 exp_property->GetValue()->GetAsProperties();
3617 exp_values->SetPropertyAtIndexAsBoolean(exe_ctx, ePropertyInjectLocalVars,
3621 ArchSpec TargetProperties::GetDefaultArchitecture() const {
3622 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3623 nullptr, ePropertyDefaultArch);
3625 return value->GetCurrentValue();
3629 void TargetProperties::SetDefaultArchitecture(const ArchSpec &arch) {
3630 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3631 nullptr, ePropertyDefaultArch);
3633 return value->SetCurrentValue(arch, true);
3636 bool TargetProperties::GetMoveToNearestCode() const {
3637 const uint32_t idx = ePropertyMoveToNearestCode;
3638 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3639 nullptr, idx, g_properties[idx].default_uint_value != 0);
3642 lldb::DynamicValueType TargetProperties::GetPreferDynamicValue() const {
3643 const uint32_t idx = ePropertyPreferDynamic;
3644 return (lldb::DynamicValueType)
3645 m_collection_sp->GetPropertyAtIndexAsEnumeration(
3646 nullptr, idx, g_properties[idx].default_uint_value);
3649 bool TargetProperties::SetPreferDynamicValue(lldb::DynamicValueType d) {
3650 const uint32_t idx = ePropertyPreferDynamic;
3651 return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d);
3654 bool TargetProperties::GetPreloadSymbols() const {
3655 const uint32_t idx = ePropertyPreloadSymbols;
3656 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3657 nullptr, idx, g_properties[idx].default_uint_value != 0);
3660 void TargetProperties::SetPreloadSymbols(bool b) {
3661 const uint32_t idx = ePropertyPreloadSymbols;
3662 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3665 bool TargetProperties::GetDisableASLR() const {
3666 const uint32_t idx = ePropertyDisableASLR;
3667 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3668 nullptr, idx, g_properties[idx].default_uint_value != 0);
3671 void TargetProperties::SetDisableASLR(bool b) {
3672 const uint32_t idx = ePropertyDisableASLR;
3673 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3676 bool TargetProperties::GetDetachOnError() const {
3677 const uint32_t idx = ePropertyDetachOnError;
3678 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3679 nullptr, idx, g_properties[idx].default_uint_value != 0);
3682 void TargetProperties::SetDetachOnError(bool b) {
3683 const uint32_t idx = ePropertyDetachOnError;
3684 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3687 bool TargetProperties::GetDisableSTDIO() const {
3688 const uint32_t idx = ePropertyDisableSTDIO;
3689 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3690 nullptr, idx, g_properties[idx].default_uint_value != 0);
3693 void TargetProperties::SetDisableSTDIO(bool b) {
3694 const uint32_t idx = ePropertyDisableSTDIO;
3695 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3698 const char *TargetProperties::GetDisassemblyFlavor() const {
3699 const uint32_t idx = ePropertyDisassemblyFlavor;
3700 const char *return_value;
3702 x86DisassemblyFlavor flavor_value =
3703 (x86DisassemblyFlavor)m_collection_sp->GetPropertyAtIndexAsEnumeration(
3704 nullptr, idx, g_properties[idx].default_uint_value);
3705 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3706 return return_value;
3709 InlineStrategy TargetProperties::GetInlineStrategy() const {
3710 const uint32_t idx = ePropertyInlineStrategy;
3711 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration(
3712 nullptr, idx, g_properties[idx].default_uint_value);
3715 llvm::StringRef TargetProperties::GetArg0() const {
3716 const uint32_t idx = ePropertyArg0;
3717 return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx, llvm::StringRef());
3720 void TargetProperties::SetArg0(llvm::StringRef arg) {
3721 const uint32_t idx = ePropertyArg0;
3722 m_collection_sp->SetPropertyAtIndexAsString(
3724 m_launch_info.SetArg0(arg);
3727 bool TargetProperties::GetRunArguments(Args &args) const {
3728 const uint32_t idx = ePropertyRunArgs;
3729 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
3732 void TargetProperties::SetRunArguments(const Args &args) {
3733 const uint32_t idx = ePropertyRunArgs;
3734 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
3735 m_launch_info.GetArguments() = args;
3738 size_t TargetProperties::GetEnvironmentAsArgs(Args &env) const {
3739 const uint32_t idx = ePropertyEnvVars;
3740 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env);
3743 void TargetProperties::SetEnvironmentFromArgs(const Args &env) {
3744 const uint32_t idx = ePropertyEnvVars;
3745 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, env);
3746 m_launch_info.GetEnvironmentEntries() = env;
3749 bool TargetProperties::GetSkipPrologue() const {
3750 const uint32_t idx = ePropertySkipPrologue;
3751 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3752 nullptr, idx, g_properties[idx].default_uint_value != 0);
3755 PathMappingList &TargetProperties::GetSourcePathMap() const {
3756 const uint32_t idx = ePropertySourceMap;
3757 OptionValuePathMappings *option_value =
3758 m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr,
3760 assert(option_value);
3761 return option_value->GetCurrentValue();
3764 FileSpecList &TargetProperties::GetExecutableSearchPaths() {
3765 const uint32_t idx = ePropertyExecutableSearchPaths;
3766 OptionValueFileSpecList *option_value =
3767 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3769 assert(option_value);
3770 return option_value->GetCurrentValue();
3773 FileSpecList &TargetProperties::GetDebugFileSearchPaths() {
3774 const uint32_t idx = ePropertyDebugFileSearchPaths;
3775 OptionValueFileSpecList *option_value =
3776 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3778 assert(option_value);
3779 return option_value->GetCurrentValue();
3782 FileSpecList &TargetProperties::GetClangModuleSearchPaths() {
3783 const uint32_t idx = ePropertyClangModuleSearchPaths;
3784 OptionValueFileSpecList *option_value =
3785 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3787 assert(option_value);
3788 return option_value->GetCurrentValue();
3791 bool TargetProperties::GetEnableAutoImportClangModules() const {
3792 const uint32_t idx = ePropertyAutoImportClangModules;
3793 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3794 nullptr, idx, g_properties[idx].default_uint_value != 0);
3797 bool TargetProperties::GetEnableAutoApplyFixIts() const {
3798 const uint32_t idx = ePropertyAutoApplyFixIts;
3799 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3800 nullptr, idx, g_properties[idx].default_uint_value != 0);
3803 bool TargetProperties::GetEnableNotifyAboutFixIts() const {
3804 const uint32_t idx = ePropertyNotifyAboutFixIts;
3805 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3806 nullptr, idx, g_properties[idx].default_uint_value != 0);
3809 bool TargetProperties::GetEnableSaveObjects() const {
3810 const uint32_t idx = ePropertySaveObjects;
3811 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3812 nullptr, idx, g_properties[idx].default_uint_value != 0);
3815 bool TargetProperties::GetEnableSyntheticValue() const {
3816 const uint32_t idx = ePropertyEnableSynthetic;
3817 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3818 nullptr, idx, g_properties[idx].default_uint_value != 0);
3821 uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const {
3822 const uint32_t idx = ePropertyMaxChildrenCount;
3823 return m_collection_sp->GetPropertyAtIndexAsSInt64(
3824 nullptr, idx, g_properties[idx].default_uint_value);
3827 uint32_t TargetProperties::GetMaximumSizeOfStringSummary() const {
3828 const uint32_t idx = ePropertyMaxSummaryLength;
3829 return m_collection_sp->GetPropertyAtIndexAsSInt64(
3830 nullptr, idx, g_properties[idx].default_uint_value);
3833 uint32_t TargetProperties::GetMaximumMemReadSize() const {
3834 const uint32_t idx = ePropertyMaxMemReadSize;
3835 return m_collection_sp->GetPropertyAtIndexAsSInt64(
3836 nullptr, idx, g_properties[idx].default_uint_value);
3839 FileSpec TargetProperties::GetStandardInputPath() const {
3840 const uint32_t idx = ePropertyInputPath;
3841 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3844 void TargetProperties::SetStandardInputPath(llvm::StringRef path) {
3845 const uint32_t idx = ePropertyInputPath;
3846 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3849 FileSpec TargetProperties::GetStandardOutputPath() const {
3850 const uint32_t idx = ePropertyOutputPath;
3851 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3854 void TargetProperties::SetStandardOutputPath(llvm::StringRef path) {
3855 const uint32_t idx = ePropertyOutputPath;
3856 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3859 FileSpec TargetProperties::GetStandardErrorPath() const {
3860 const uint32_t idx = ePropertyErrorPath;
3861 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3864 void TargetProperties::SetStandardErrorPath(llvm::StringRef path) {
3865 const uint32_t idx = ePropertyErrorPath;
3866 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3869 LanguageType TargetProperties::GetLanguage() const {
3870 OptionValueLanguage *value =
3871 m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage(
3872 nullptr, ePropertyLanguage);
3874 return value->GetCurrentValue();
3875 return LanguageType();
3878 const char *TargetProperties::GetExpressionPrefixContentsAsCString() {
3879 const uint32_t idx = ePropertyExprPrefix;
3880 OptionValueFileSpec *file =
3881 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false,
3884 const bool null_terminate = true;
3885 DataBufferSP data_sp(file->GetFileContents(null_terminate));
3887 return (const char *)data_sp->GetBytes();
3892 bool TargetProperties::GetBreakpointsConsultPlatformAvoidList() {
3893 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3894 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3895 nullptr, idx, g_properties[idx].default_uint_value != 0);
3898 bool TargetProperties::GetUseHexImmediates() const {
3899 const uint32_t idx = ePropertyUseHexImmediates;
3900 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3901 nullptr, idx, g_properties[idx].default_uint_value != 0);
3904 bool TargetProperties::GetUseFastStepping() const {
3905 const uint32_t idx = ePropertyUseFastStepping;
3906 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3907 nullptr, idx, g_properties[idx].default_uint_value != 0);
3910 bool TargetProperties::GetDisplayExpressionsInCrashlogs() const {
3911 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3912 return m_collection_sp->GetPropertyAtIndexAsBoolean(
3913 nullptr, idx, g_properties[idx].default_uint_value != 0);
3916 LoadScriptFromSymFile TargetProperties::GetLoadScriptFromSymbolFile() const {
3917 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
3918 return (LoadScriptFromSymFile)
3919 m_collection_sp->GetPropertyAtIndexAsEnumeration(
3920 nullptr, idx, g_properties[idx].default_uint_value);
3923 LoadCWDlldbinitFile TargetProperties::GetLoadCWDlldbinitFile() const {
3924 const uint32_t idx = ePropertyLoadCWDlldbinitFile;
3925 return (LoadCWDlldbinitFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(
3926 nullptr, idx, g_properties[idx].default_uint_value);
3929 Disassembler::HexImmediateStyle TargetProperties::GetHexImmediateStyle() const {
3930 const uint32_t idx = ePropertyHexImmediateStyle;
3931 return (Disassembler::HexImmediateStyle)
3932 m_collection_sp->GetPropertyAtIndexAsEnumeration(
3933 nullptr, idx, g_properties[idx].default_uint_value);
3936 MemoryModuleLoadLevel TargetProperties::GetMemoryModuleLoadLevel() const {
3937 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3938 return (MemoryModuleLoadLevel)
3939 m_collection_sp->GetPropertyAtIndexAsEnumeration(
3940 nullptr, idx, g_properties[idx].default_uint_value);
3943 bool TargetProperties::GetUserSpecifiedTrapHandlerNames(Args &args) const {
3944 const uint32_t idx = ePropertyTrapHandlerNames;
3945 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
3948 void TargetProperties::SetUserSpecifiedTrapHandlerNames(const Args &args) {
3949 const uint32_t idx = ePropertyTrapHandlerNames;
3950 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
3953 bool TargetProperties::GetDisplayRuntimeSupportValues() const {
3954 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3955 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
3958 void TargetProperties::SetDisplayRuntimeSupportValues(bool b) {
3959 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3960 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3963 bool TargetProperties::GetNonStopModeEnabled() const {
3964 const uint32_t idx = ePropertyNonStopModeEnabled;
3965 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
3968 void TargetProperties::SetNonStopModeEnabled(bool b) {
3969 const uint32_t idx = ePropertyNonStopModeEnabled;
3970 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3973 const ProcessLaunchInfo &TargetProperties::GetProcessLaunchInfo() {
3974 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
3975 return m_launch_info;
3978 void TargetProperties::SetProcessLaunchInfo(
3979 const ProcessLaunchInfo &launch_info) {
3980 m_launch_info = launch_info;
3981 SetArg0(launch_info.GetArg0());
3982 SetRunArguments(launch_info.GetArguments());
3983 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
3984 const FileAction *input_file_action =
3985 launch_info.GetFileActionForFD(STDIN_FILENO);
3986 if (input_file_action) {
3987 SetStandardInputPath(input_file_action->GetPath());
3989 const FileAction *output_file_action =
3990 launch_info.GetFileActionForFD(STDOUT_FILENO);
3991 if (output_file_action) {
3992 SetStandardOutputPath(output_file_action->GetPath());
3994 const FileAction *error_file_action =
3995 launch_info.GetFileActionForFD(STDERR_FILENO);
3996 if (error_file_action) {
3997 SetStandardErrorPath(error_file_action->GetPath());
3999 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
4000 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
4001 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
4004 void TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr,
4006 TargetProperties *this_ =
4007 reinterpret_cast<TargetProperties *>(target_property_ptr);
4008 this_->m_launch_info.SetArg0(this_->GetArg0());
4011 void TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr,
4013 TargetProperties *this_ =
4014 reinterpret_cast<TargetProperties *>(target_property_ptr);
4016 if (this_->GetRunArguments(args))
4017 this_->m_launch_info.GetArguments() = args;
4020 void TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr,
4022 TargetProperties *this_ =
4023 reinterpret_cast<TargetProperties *>(target_property_ptr);
4025 if (this_->GetEnvironmentAsArgs(args))
4026 this_->m_launch_info.GetEnvironmentEntries() = args;
4029 void TargetProperties::InputPathValueChangedCallback(void *target_property_ptr,
4031 TargetProperties *this_ =
4032 reinterpret_cast<TargetProperties *>(target_property_ptr);
4033 this_->m_launch_info.AppendOpenFileAction(
4034 STDIN_FILENO, this_->GetStandardInputPath(), true, false);
4037 void TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr,
4039 TargetProperties *this_ =
4040 reinterpret_cast<TargetProperties *>(target_property_ptr);
4041 this_->m_launch_info.AppendOpenFileAction(
4042 STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
4045 void TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr,
4047 TargetProperties *this_ =
4048 reinterpret_cast<TargetProperties *>(target_property_ptr);
4049 this_->m_launch_info.AppendOpenFileAction(
4050 STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
4053 void TargetProperties::DetachOnErrorValueChangedCallback(
4054 void *target_property_ptr, OptionValue *) {
4055 TargetProperties *this_ =
4056 reinterpret_cast<TargetProperties *>(target_property_ptr);
4057 if (this_->GetDetachOnError())
4058 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4060 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
4063 void TargetProperties::DisableASLRValueChangedCallback(
4064 void *target_property_ptr, OptionValue *) {
4065 TargetProperties *this_ =
4066 reinterpret_cast<TargetProperties *>(target_property_ptr);
4067 if (this_->GetDisableASLR())
4068 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4070 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
4073 void TargetProperties::DisableSTDIOValueChangedCallback(
4074 void *target_property_ptr, OptionValue *) {
4075 TargetProperties *this_ =
4076 reinterpret_cast<TargetProperties *>(target_property_ptr);
4077 if (this_->GetDisableSTDIO())
4078 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4080 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
4083 //----------------------------------------------------------------------
4084 // Target::TargetEventData
4085 //----------------------------------------------------------------------
4087 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp)
4088 : EventData(), m_target_sp(target_sp), m_module_list() {}
4090 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp,
4091 const ModuleList &module_list)
4092 : EventData(), m_target_sp(target_sp), m_module_list(module_list) {}
4094 Target::TargetEventData::~TargetEventData() = default;
4096 const ConstString &Target::TargetEventData::GetFlavorString() {
4097 static ConstString g_flavor("Target::TargetEventData");
4101 void Target::TargetEventData::Dump(Stream *s) const {
4102 for (size_t i = 0; i < m_module_list.GetSize(); ++i) {
4105 m_module_list.GetModuleAtIndex(i)->GetDescription(
4106 s, lldb::eDescriptionLevelBrief);
4110 const Target::TargetEventData *
4111 Target::TargetEventData::GetEventDataFromEvent(const Event *event_ptr) {
4113 const EventData *event_data = event_ptr->GetData();
4115 event_data->GetFlavor() == TargetEventData::GetFlavorString())
4116 return static_cast<const TargetEventData *>(event_ptr->GetData());
4121 TargetSP Target::TargetEventData::GetTargetFromEvent(const Event *event_ptr) {
4123 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4125 target_sp = event_data->m_target_sp;
4130 Target::TargetEventData::GetModuleListFromEvent(const Event *event_ptr) {
4131 ModuleList module_list;
4132 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4134 module_list = event_data->m_module_list;