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