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