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