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/ClangModulesDeclVendor.h"
11 #include "lldb/Breakpoint/BreakpointIDList.h"
12 #include "lldb/Breakpoint/BreakpointPrecondition.h"
13 #include "lldb/Breakpoint/BreakpointResolver.h"
14 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
15 #include "lldb/Breakpoint/BreakpointResolverFileLine.h"
16 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
17 #include "lldb/Breakpoint/BreakpointResolverName.h"
18 #include "lldb/Breakpoint/BreakpointResolverScripted.h"
19 #include "lldb/Breakpoint/Watchpoint.h"
20 #include "lldb/Core/Debugger.h"
21 #include "lldb/Core/Module.h"
22 #include "lldb/Core/ModuleSpec.h"
23 #include "lldb/Core/PluginManager.h"
24 #include "lldb/Core/SearchFilter.h"
25 #include "lldb/Core/Section.h"
26 #include "lldb/Core/SourceManager.h"
27 #include "lldb/Core/StreamFile.h"
28 #include "lldb/Core/StructuredDataImpl.h"
29 #include "lldb/Core/ValueObject.h"
30 #include "lldb/Expression/REPL.h"
31 #include "lldb/Expression/UserExpression.h"
32 #include "lldb/Host/Host.h"
33 #include "lldb/Host/PosixApi.h"
34 #include "lldb/Interpreter/CommandInterpreter.h"
35 #include "lldb/Interpreter/CommandReturnObject.h"
36 #include "lldb/Interpreter/OptionGroupWatchpoint.h"
37 #include "lldb/Interpreter/OptionValues.h"
38 #include "lldb/Interpreter/Property.h"
39 #include "lldb/Symbol/ClangASTContext.h"
40 #include "lldb/Symbol/ClangASTImporter.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/Process.h"
47 #include "lldb/Target/SectionLoadList.h"
48 #include "lldb/Target/StackFrame.h"
49 #include "lldb/Target/SystemRuntime.h"
50 #include "lldb/Target/Thread.h"
51 #include "lldb/Target/ThreadSpec.h"
52 #include "lldb/Utility/Event.h"
53 #include "lldb/Utility/FileSpec.h"
54 #include "lldb/Utility/LLDBAssert.h"
55 #include "lldb/Utility/Log.h"
56 #include "lldb/Utility/State.h"
57 #include "lldb/Utility/StreamString.h"
58 #include "lldb/Utility/Timer.h"
59 
60 #include "llvm/ADT/ScopeExit.h"
61 
62 #include <memory>
63 #include <mutex>
64 
65 using namespace lldb;
66 using namespace lldb_private;
67 
68 constexpr std::chrono::milliseconds EvaluateExpressionOptions::default_timeout;
69 
70 Target::Arch::Arch(const ArchSpec &spec)
71     : m_spec(spec),
72       m_plugin_up(PluginManager::CreateArchitectureInstance(spec)) {}
73 
74 const Target::Arch& Target::Arch::operator=(const ArchSpec &spec) {
75   m_spec = spec;
76   m_plugin_up = PluginManager::CreateArchitectureInstance(spec);
77   return *this;
78 }
79 
80 ConstString &Target::GetStaticBroadcasterClass() {
81   static ConstString class_name("lldb.target");
82   return class_name;
83 }
84 
85 Target::Target(Debugger &debugger, const ArchSpec &target_arch,
86                const lldb::PlatformSP &platform_sp, bool is_dummy_target)
87     : TargetProperties(this),
88       Broadcaster(debugger.GetBroadcasterManager(),
89                   Target::GetStaticBroadcasterClass().AsCString()),
90       ExecutionContextScope(), m_debugger(debugger), m_platform_sp(platform_sp),
91       m_mutex(), m_arch(target_arch), m_images(this), m_section_load_history(),
92       m_breakpoint_list(false), m_internal_breakpoint_list(true),
93       m_watchpoint_list(), m_process_sp(), m_search_filter_sp(),
94       m_image_search_paths(ImageSearchPathsChanged, this), m_ast_importer_sp(),
95       m_source_manager_up(), m_stop_hooks(), m_stop_hook_next_id(0),
96       m_valid(true), m_suppress_stop_hooks(false),
97       m_is_dummy_target(is_dummy_target),
98       m_stats_storage(static_cast<int>(StatisticKind::StatisticMax))
99 
100 {
101   SetEventName(eBroadcastBitBreakpointChanged, "breakpoint-changed");
102   SetEventName(eBroadcastBitModulesLoaded, "modules-loaded");
103   SetEventName(eBroadcastBitModulesUnloaded, "modules-unloaded");
104   SetEventName(eBroadcastBitWatchpointChanged, "watchpoint-changed");
105   SetEventName(eBroadcastBitSymbolsLoaded, "symbols-loaded");
106 
107   CheckInWithManager();
108 
109   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
110   if (log)
111     log->Printf("%p Target::Target()", static_cast<void *>(this));
112   if (target_arch.IsValid()) {
113     LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET,
114                           "Target::Target created with architecture %s (%s)",
115                           target_arch.GetArchitectureName(),
116                           target_arch.GetTriple().getTriple().c_str());
117   }
118 }
119 
120 Target::~Target() {
121   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
122   if (log)
123     log->Printf("%p Target::~Target()", static_cast<void *>(this));
124   DeleteCurrentProcess();
125 }
126 
127 void Target::PrimeFromDummyTarget(Target *target) {
128   if (!target)
129     return;
130 
131   m_stop_hooks = target->m_stop_hooks;
132 
133   for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints()) {
134     if (breakpoint_sp->IsInternal())
135       continue;
136 
137     BreakpointSP new_bp(new Breakpoint(*this, *breakpoint_sp.get()));
138     AddBreakpoint(new_bp, false);
139   }
140 
141   for (auto bp_name_entry : target->m_breakpoint_names)
142   {
143 
144     BreakpointName *new_bp_name = new BreakpointName(*bp_name_entry.second);
145     AddBreakpointName(new_bp_name);
146   }
147 }
148 
149 void Target::Dump(Stream *s, lldb::DescriptionLevel description_level) {
150   //    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
151   if (description_level != lldb::eDescriptionLevelBrief) {
152     s->Indent();
153     s->PutCString("Target\n");
154     s->IndentMore();
155     m_images.Dump(s);
156     m_breakpoint_list.Dump(s);
157     m_internal_breakpoint_list.Dump(s);
158     s->IndentLess();
159   } else {
160     Module *exe_module = GetExecutableModulePointer();
161     if (exe_module)
162       s->PutCString(exe_module->GetFileSpec().GetFilename().GetCString());
163     else
164       s->PutCString("No executable module.");
165   }
166 }
167 
168 void Target::CleanupProcess() {
169   // Do any cleanup of the target we need to do between process instances.
170   // NB It is better to do this before destroying the process in case the
171   // clean up needs some help from the process.
172   m_breakpoint_list.ClearAllBreakpointSites();
173   m_internal_breakpoint_list.ClearAllBreakpointSites();
174   // Disable watchpoints just on the debugger side.
175   std::unique_lock<std::recursive_mutex> lock;
176   this->GetWatchpointList().GetListMutex(lock);
177   DisableAllWatchpoints(false);
178   ClearAllWatchpointHitCounts();
179   ClearAllWatchpointHistoricValues();
180 }
181 
182 void Target::DeleteCurrentProcess() {
183   if (m_process_sp) {
184     m_section_load_history.Clear();
185     if (m_process_sp->IsAlive())
186       m_process_sp->Destroy(false);
187 
188     m_process_sp->Finalize();
189 
190     CleanupProcess();
191 
192     m_process_sp.reset();
193   }
194 }
195 
196 const lldb::ProcessSP &Target::CreateProcess(ListenerSP listener_sp,
197                                              llvm::StringRef plugin_name,
198                                              const FileSpec *crash_file) {
199   if (!listener_sp)
200     listener_sp = GetDebugger().GetListener();
201   DeleteCurrentProcess();
202   m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name,
203                                      listener_sp, crash_file);
204   return m_process_sp;
205 }
206 
207 const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; }
208 
209 lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language,
210                              const char *repl_options, bool can_create) {
211   if (language == eLanguageTypeUnknown) {
212     std::set<LanguageType> repl_languages;
213 
214     Language::GetLanguagesSupportingREPLs(repl_languages);
215 
216     if (repl_languages.size() == 1) {
217       language = *repl_languages.begin();
218     } else if (repl_languages.size() == 0) {
219       err.SetErrorStringWithFormat(
220           "LLDB isn't configured with REPL support for any languages.");
221       return REPLSP();
222     } else {
223       err.SetErrorStringWithFormat(
224           "Multiple possible REPL languages.  Please specify a language.");
225       return REPLSP();
226     }
227   }
228 
229   REPLMap::iterator pos = m_repl_map.find(language);
230 
231   if (pos != m_repl_map.end()) {
232     return pos->second;
233   }
234 
235   if (!can_create) {
236     err.SetErrorStringWithFormat(
237         "Couldn't find an existing REPL for %s, and can't create a new one",
238         Language::GetNameForLanguageType(language));
239     return lldb::REPLSP();
240   }
241 
242   Debugger *const debugger = nullptr;
243   lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options);
244 
245   if (ret) {
246     m_repl_map[language] = ret;
247     return m_repl_map[language];
248   }
249 
250   if (err.Success()) {
251     err.SetErrorStringWithFormat("Couldn't create a REPL for %s",
252                                  Language::GetNameForLanguageType(language));
253   }
254 
255   return lldb::REPLSP();
256 }
257 
258 void Target::SetREPL(lldb::LanguageType language, lldb::REPLSP repl_sp) {
259   lldbassert(!m_repl_map.count(language));
260 
261   m_repl_map[language] = repl_sp;
262 }
263 
264 void Target::Destroy() {
265   std::lock_guard<std::recursive_mutex> guard(m_mutex);
266   m_valid = false;
267   DeleteCurrentProcess();
268   m_platform_sp.reset();
269   m_arch = ArchSpec();
270   ClearModules(true);
271   m_section_load_history.Clear();
272   const bool notify = false;
273   m_breakpoint_list.RemoveAll(notify);
274   m_internal_breakpoint_list.RemoveAll(notify);
275   m_last_created_breakpoint.reset();
276   m_last_created_watchpoint.reset();
277   m_search_filter_sp.reset();
278   m_image_search_paths.Clear(notify);
279   m_stop_hooks.clear();
280   m_stop_hook_next_id = 0;
281   m_suppress_stop_hooks = false;
282 }
283 
284 BreakpointList &Target::GetBreakpointList(bool internal) {
285   if (internal)
286     return m_internal_breakpoint_list;
287   else
288     return m_breakpoint_list;
289 }
290 
291 const BreakpointList &Target::GetBreakpointList(bool internal) const {
292   if (internal)
293     return m_internal_breakpoint_list;
294   else
295     return m_breakpoint_list;
296 }
297 
298 BreakpointSP Target::GetBreakpointByID(break_id_t break_id) {
299   BreakpointSP bp_sp;
300 
301   if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
302     bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
303   else
304     bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
305 
306   return bp_sp;
307 }
308 
309 BreakpointSP Target::CreateSourceRegexBreakpoint(
310     const FileSpecList *containingModules,
311     const FileSpecList *source_file_spec_list,
312     const std::unordered_set<std::string> &function_names,
313     RegularExpression &source_regex, bool internal, bool hardware,
314     LazyBool move_to_nearest_code) {
315   SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
316       containingModules, source_file_spec_list));
317   if (move_to_nearest_code == eLazyBoolCalculate)
318     move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
319   BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex(
320       nullptr, source_regex, function_names,
321       !static_cast<bool>(move_to_nearest_code)));
322 
323   return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
324 }
325 
326 BreakpointSP Target::CreateBreakpoint(const FileSpecList *containingModules,
327                                       const FileSpec &file, uint32_t line_no,
328                                       uint32_t column, lldb::addr_t offset,
329                                       LazyBool check_inlines,
330                                       LazyBool skip_prologue, bool internal,
331                                       bool hardware,
332                                       LazyBool move_to_nearest_code) {
333   FileSpec remapped_file;
334   if (!GetSourcePathMap().ReverseRemapPath(file, remapped_file))
335     remapped_file = file;
336 
337   if (check_inlines == eLazyBoolCalculate) {
338     const InlineStrategy inline_strategy = GetInlineStrategy();
339     switch (inline_strategy) {
340     case eInlineBreakpointsNever:
341       check_inlines = eLazyBoolNo;
342       break;
343 
344     case eInlineBreakpointsHeaders:
345       if (remapped_file.IsSourceImplementationFile())
346         check_inlines = eLazyBoolNo;
347       else
348         check_inlines = eLazyBoolYes;
349       break;
350 
351     case eInlineBreakpointsAlways:
352       check_inlines = eLazyBoolYes;
353       break;
354     }
355   }
356   SearchFilterSP filter_sp;
357   if (check_inlines == eLazyBoolNo) {
358     // Not checking for inlines, we are looking only for matching compile units
359     FileSpecList compile_unit_list;
360     compile_unit_list.Append(remapped_file);
361     filter_sp = GetSearchFilterForModuleAndCUList(containingModules,
362                                                   &compile_unit_list);
363   } else {
364     filter_sp = GetSearchFilterForModuleList(containingModules);
365   }
366   if (skip_prologue == eLazyBoolCalculate)
367     skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
368   if (move_to_nearest_code == eLazyBoolCalculate)
369     move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
370 
371   BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine(
372       nullptr, remapped_file, line_no, column, offset, check_inlines,
373       skip_prologue, !static_cast<bool>(move_to_nearest_code)));
374   return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
375 }
376 
377 BreakpointSP Target::CreateBreakpoint(lldb::addr_t addr, bool internal,
378                                       bool hardware) {
379   Address so_addr;
380 
381   // Check for any reason we want to move this breakpoint to other address.
382   addr = GetBreakableLoadAddress(addr);
383 
384   // Attempt to resolve our load address if possible, though it is ok if it
385   // doesn't resolve to section/offset.
386 
387   // Try and resolve as a load address if possible
388   GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
389   if (!so_addr.IsValid()) {
390     // The address didn't resolve, so just set this as an absolute address
391     so_addr.SetOffset(addr);
392   }
393   BreakpointSP bp_sp(CreateBreakpoint(so_addr, internal, hardware));
394   return bp_sp;
395 }
396 
397 BreakpointSP Target::CreateBreakpoint(const Address &addr, bool internal,
398                                       bool hardware) {
399   SearchFilterSP filter_sp(
400       new SearchFilterForUnconstrainedSearches(shared_from_this()));
401   BreakpointResolverSP resolver_sp(
402       new BreakpointResolverAddress(nullptr, addr));
403   return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, false);
404 }
405 
406 lldb::BreakpointSP
407 Target::CreateAddressInModuleBreakpoint(lldb::addr_t file_addr, bool internal,
408                                         const FileSpec *file_spec,
409                                         bool request_hardware) {
410   SearchFilterSP filter_sp(
411       new SearchFilterForUnconstrainedSearches(shared_from_this()));
412   BreakpointResolverSP resolver_sp(
413       new BreakpointResolverAddress(nullptr, file_addr, file_spec));
414   return CreateBreakpoint(filter_sp, resolver_sp, internal, request_hardware,
415                           false);
416 }
417 
418 BreakpointSP Target::CreateBreakpoint(
419     const FileSpecList *containingModules,
420     const FileSpecList *containingSourceFiles, const char *func_name,
421     FunctionNameType func_name_type_mask, LanguageType language,
422     lldb::addr_t offset, LazyBool skip_prologue, bool internal, bool hardware) {
423   BreakpointSP bp_sp;
424   if (func_name) {
425     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
426         containingModules, containingSourceFiles));
427 
428     if (skip_prologue == eLazyBoolCalculate)
429       skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
430     if (language == lldb::eLanguageTypeUnknown)
431       language = GetLanguage();
432 
433     BreakpointResolverSP resolver_sp(new BreakpointResolverName(
434         nullptr, func_name, func_name_type_mask, language, Breakpoint::Exact,
435         offset, skip_prologue));
436     bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
437   }
438   return bp_sp;
439 }
440 
441 lldb::BreakpointSP
442 Target::CreateBreakpoint(const FileSpecList *containingModules,
443                          const FileSpecList *containingSourceFiles,
444                          const std::vector<std::string> &func_names,
445                          FunctionNameType func_name_type_mask,
446                          LanguageType language, lldb::addr_t offset,
447                          LazyBool skip_prologue, bool internal, bool hardware) {
448   BreakpointSP bp_sp;
449   size_t num_names = func_names.size();
450   if (num_names > 0) {
451     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
452         containingModules, containingSourceFiles));
453 
454     if (skip_prologue == eLazyBoolCalculate)
455       skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
456     if (language == lldb::eLanguageTypeUnknown)
457       language = GetLanguage();
458 
459     BreakpointResolverSP resolver_sp(
460         new BreakpointResolverName(nullptr, func_names, func_name_type_mask,
461                                    language, offset, skip_prologue));
462     bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
463   }
464   return bp_sp;
465 }
466 
467 BreakpointSP
468 Target::CreateBreakpoint(const FileSpecList *containingModules,
469                          const FileSpecList *containingSourceFiles,
470                          const char *func_names[], size_t num_names,
471                          FunctionNameType func_name_type_mask,
472                          LanguageType language, lldb::addr_t offset,
473                          LazyBool skip_prologue, bool internal, bool hardware) {
474   BreakpointSP bp_sp;
475   if (num_names > 0) {
476     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
477         containingModules, containingSourceFiles));
478 
479     if (skip_prologue == eLazyBoolCalculate) {
480       if (offset == 0)
481         skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
482       else
483         skip_prologue = eLazyBoolNo;
484     }
485     if (language == lldb::eLanguageTypeUnknown)
486       language = GetLanguage();
487 
488     BreakpointResolverSP resolver_sp(new BreakpointResolverName(
489         nullptr, func_names, num_names, func_name_type_mask, language, offset,
490         skip_prologue));
491     resolver_sp->SetOffset(offset);
492     bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
493   }
494   return bp_sp;
495 }
496 
497 SearchFilterSP
498 Target::GetSearchFilterForModule(const FileSpec *containingModule) {
499   SearchFilterSP filter_sp;
500   if (containingModule != nullptr) {
501     // TODO: We should look into sharing module based search filters
502     // across many breakpoints like we do for the simple target based one
503     filter_sp = std::make_shared<SearchFilterByModule>(shared_from_this(),
504                                                        *containingModule);
505   } else {
506     if (!m_search_filter_sp)
507       m_search_filter_sp =
508           std::make_shared<SearchFilterForUnconstrainedSearches>(
509               shared_from_this());
510     filter_sp = m_search_filter_sp;
511   }
512   return filter_sp;
513 }
514 
515 SearchFilterSP
516 Target::GetSearchFilterForModuleList(const FileSpecList *containingModules) {
517   SearchFilterSP filter_sp;
518   if (containingModules && containingModules->GetSize() != 0) {
519     // TODO: We should look into sharing module based search filters
520     // across many breakpoints like we do for the simple target based one
521     filter_sp = std::make_shared<SearchFilterByModuleList>(shared_from_this(),
522                                                            *containingModules);
523   } else {
524     if (!m_search_filter_sp)
525       m_search_filter_sp =
526           std::make_shared<SearchFilterForUnconstrainedSearches>(
527               shared_from_this());
528     filter_sp = m_search_filter_sp;
529   }
530   return filter_sp;
531 }
532 
533 SearchFilterSP Target::GetSearchFilterForModuleAndCUList(
534     const FileSpecList *containingModules,
535     const FileSpecList *containingSourceFiles) {
536   if (containingSourceFiles == nullptr || containingSourceFiles->GetSize() == 0)
537     return GetSearchFilterForModuleList(containingModules);
538 
539   SearchFilterSP filter_sp;
540   if (containingModules == nullptr) {
541     // We could make a special "CU List only SearchFilter".  Better yet was if
542     // these could be composable, but that will take a little reworking.
543 
544     filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
545         shared_from_this(), FileSpecList(), *containingSourceFiles);
546   } else {
547     filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
548         shared_from_this(), *containingModules, *containingSourceFiles);
549   }
550   return filter_sp;
551 }
552 
553 BreakpointSP Target::CreateFuncRegexBreakpoint(
554     const FileSpecList *containingModules,
555     const FileSpecList *containingSourceFiles, RegularExpression &func_regex,
556     lldb::LanguageType requested_language, LazyBool skip_prologue,
557     bool internal, bool hardware) {
558   SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
559       containingModules, containingSourceFiles));
560   bool skip = (skip_prologue == eLazyBoolCalculate)
561                   ? GetSkipPrologue()
562                   : static_cast<bool>(skip_prologue);
563   BreakpointResolverSP resolver_sp(new BreakpointResolverName(
564       nullptr, func_regex, requested_language, 0, skip));
565 
566   return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
567 }
568 
569 lldb::BreakpointSP
570 Target::CreateExceptionBreakpoint(enum lldb::LanguageType language,
571                                   bool catch_bp, bool throw_bp, bool internal,
572                                   Args *additional_args, Status *error) {
573   BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint(
574       *this, language, catch_bp, throw_bp, internal);
575   if (exc_bkpt_sp && additional_args) {
576     BreakpointPreconditionSP precondition_sp = 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       for (LanguageRuntime *runtime : m_process_sp->GetLanguageRuntimes()) {
1672         runtime->SymbolsDidLoad(module_list);
1673       }
1674     }
1675 
1676     m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1677     m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1678     BroadcastEvent(eBroadcastBitSymbolsLoaded,
1679                    new TargetEventData(this->shared_from_this(), module_list));
1680   }
1681 }
1682 
1683 void Target::ModulesDidUnload(ModuleList &module_list, bool delete_locations) {
1684   if (m_valid && module_list.GetSize()) {
1685     UnloadModuleSections(module_list);
1686     m_breakpoint_list.UpdateBreakpoints(module_list, false, delete_locations);
1687     m_internal_breakpoint_list.UpdateBreakpoints(module_list, false,
1688                                                  delete_locations);
1689     BroadcastEvent(eBroadcastBitModulesUnloaded,
1690                    new TargetEventData(this->shared_from_this(), module_list));
1691   }
1692 }
1693 
1694 bool Target::ModuleIsExcludedForUnconstrainedSearches(
1695     const FileSpec &module_file_spec) {
1696   if (GetBreakpointsConsultPlatformAvoidList()) {
1697     ModuleList matchingModules;
1698     ModuleSpec module_spec(module_file_spec);
1699     size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1700 
1701     // If there is more than one module for this file spec, only return true if
1702     // ALL the modules are on the
1703     // black list.
1704     if (num_modules > 0) {
1705       for (size_t i = 0; i < num_modules; i++) {
1706         if (!ModuleIsExcludedForUnconstrainedSearches(
1707                 matchingModules.GetModuleAtIndex(i)))
1708           return false;
1709       }
1710       return true;
1711     }
1712   }
1713   return false;
1714 }
1715 
1716 bool Target::ModuleIsExcludedForUnconstrainedSearches(
1717     const lldb::ModuleSP &module_sp) {
1718   if (GetBreakpointsConsultPlatformAvoidList()) {
1719     if (m_platform_sp)
1720       return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*this,
1721                                                                      module_sp);
1722   }
1723   return false;
1724 }
1725 
1726 size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst,
1727                                        size_t dst_len, Status &error) {
1728   SectionSP section_sp(addr.GetSection());
1729   if (section_sp) {
1730     // If the contents of this section are encrypted, the on-disk file is
1731     // unusable.  Read only from live memory.
1732     if (section_sp->IsEncrypted()) {
1733       error.SetErrorString("section is encrypted");
1734       return 0;
1735     }
1736     ModuleSP module_sp(section_sp->GetModule());
1737     if (module_sp) {
1738       ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1739       if (objfile) {
1740         size_t bytes_read = objfile->ReadSectionData(
1741             section_sp.get(), addr.GetOffset(), dst, dst_len);
1742         if (bytes_read > 0)
1743           return bytes_read;
1744         else
1745           error.SetErrorStringWithFormat("error reading data from section %s",
1746                                          section_sp->GetName().GetCString());
1747       } else
1748         error.SetErrorString("address isn't from a object file");
1749     } else
1750       error.SetErrorString("address isn't in a module");
1751   } else
1752     error.SetErrorString("address doesn't contain a section that points to a "
1753                          "section in a object file");
1754 
1755   return 0;
1756 }
1757 
1758 size_t Target::ReadMemory(const Address &addr, bool prefer_file_cache,
1759                           void *dst, size_t dst_len, Status &error,
1760                           lldb::addr_t *load_addr_ptr) {
1761   error.Clear();
1762 
1763   // if we end up reading this from process memory, we will fill this with the
1764   // actual load address
1765   if (load_addr_ptr)
1766     *load_addr_ptr = LLDB_INVALID_ADDRESS;
1767 
1768   size_t bytes_read = 0;
1769 
1770   addr_t load_addr = LLDB_INVALID_ADDRESS;
1771   addr_t file_addr = LLDB_INVALID_ADDRESS;
1772   Address resolved_addr;
1773   if (!addr.IsSectionOffset()) {
1774     SectionLoadList &section_load_list = GetSectionLoadList();
1775     if (section_load_list.IsEmpty()) {
1776       // No sections are loaded, so we must assume we are not running yet and
1777       // anything we are given is a file address.
1778       file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1779                                     // offset is the file address
1780       m_images.ResolveFileAddress(file_addr, resolved_addr);
1781     } else {
1782       // We have at least one section loaded. This can be because we have
1783       // manually loaded some sections with "target modules load ..." or
1784       // because we have have a live process that has sections loaded through
1785       // the dynamic loader
1786       load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1787                                     // offset is the load address
1788       section_load_list.ResolveLoadAddress(load_addr, resolved_addr);
1789     }
1790   }
1791   if (!resolved_addr.IsValid())
1792     resolved_addr = addr;
1793 
1794   if (prefer_file_cache) {
1795     bytes_read = ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1796     if (bytes_read > 0)
1797       return bytes_read;
1798   }
1799 
1800   if (ProcessIsValid()) {
1801     if (load_addr == LLDB_INVALID_ADDRESS)
1802       load_addr = resolved_addr.GetLoadAddress(this);
1803 
1804     if (load_addr == LLDB_INVALID_ADDRESS) {
1805       ModuleSP addr_module_sp(resolved_addr.GetModule());
1806       if (addr_module_sp && addr_module_sp->GetFileSpec())
1807         error.SetErrorStringWithFormatv(
1808             "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded",
1809             addr_module_sp->GetFileSpec(), resolved_addr.GetFileAddress());
1810       else
1811         error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved",
1812                                        resolved_addr.GetFileAddress());
1813     } else {
1814       bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1815       if (bytes_read != dst_len) {
1816         if (error.Success()) {
1817           if (bytes_read == 0)
1818             error.SetErrorStringWithFormat(
1819                 "read memory from 0x%" PRIx64 " failed", load_addr);
1820           else
1821             error.SetErrorStringWithFormat(
1822                 "only %" PRIu64 " of %" PRIu64
1823                 " bytes were read from memory at 0x%" PRIx64,
1824                 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1825         }
1826       }
1827       if (bytes_read) {
1828         if (load_addr_ptr)
1829           *load_addr_ptr = load_addr;
1830         return bytes_read;
1831       }
1832       // If the address is not section offset we have an address that doesn't
1833       // resolve to any address in any currently loaded shared libraries and we
1834       // failed to read memory so there isn't anything more we can do. If it is
1835       // section offset, we might be able to read cached memory from the object
1836       // file.
1837       if (!resolved_addr.IsSectionOffset())
1838         return 0;
1839     }
1840   }
1841 
1842   if (!prefer_file_cache && resolved_addr.IsSectionOffset()) {
1843     // If we didn't already try and read from the object file cache, then try
1844     // it after failing to read from the process.
1845     return ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1846   }
1847   return 0;
1848 }
1849 
1850 size_t Target::ReadCStringFromMemory(const Address &addr, std::string &out_str,
1851                                      Status &error) {
1852   char buf[256];
1853   out_str.clear();
1854   addr_t curr_addr = addr.GetLoadAddress(this);
1855   Address address(addr);
1856   while (true) {
1857     size_t length = ReadCStringFromMemory(address, buf, sizeof(buf), error);
1858     if (length == 0)
1859       break;
1860     out_str.append(buf, length);
1861     // If we got "length - 1" bytes, we didn't get the whole C string, we need
1862     // to read some more characters
1863     if (length == sizeof(buf) - 1)
1864       curr_addr += length;
1865     else
1866       break;
1867     address = Address(curr_addr);
1868   }
1869   return out_str.size();
1870 }
1871 
1872 size_t Target::ReadCStringFromMemory(const Address &addr, char *dst,
1873                                      size_t dst_max_len, Status &result_error) {
1874   size_t total_cstr_len = 0;
1875   if (dst && dst_max_len) {
1876     result_error.Clear();
1877     // NULL out everything just to be safe
1878     memset(dst, 0, dst_max_len);
1879     Status error;
1880     addr_t curr_addr = addr.GetLoadAddress(this);
1881     Address address(addr);
1882 
1883     // We could call m_process_sp->GetMemoryCacheLineSize() but I don't think
1884     // this really needs to be tied to the memory cache subsystem's cache line
1885     // size, so leave this as a fixed constant.
1886     const size_t cache_line_size = 512;
1887 
1888     size_t bytes_left = dst_max_len - 1;
1889     char *curr_dst = dst;
1890 
1891     while (bytes_left > 0) {
1892       addr_t cache_line_bytes_left =
1893           cache_line_size - (curr_addr % cache_line_size);
1894       addr_t bytes_to_read =
1895           std::min<addr_t>(bytes_left, cache_line_bytes_left);
1896       size_t bytes_read =
1897           ReadMemory(address, false, curr_dst, bytes_to_read, error);
1898 
1899       if (bytes_read == 0) {
1900         result_error = error;
1901         dst[total_cstr_len] = '\0';
1902         break;
1903       }
1904       const size_t len = strlen(curr_dst);
1905 
1906       total_cstr_len += len;
1907 
1908       if (len < bytes_to_read)
1909         break;
1910 
1911       curr_dst += bytes_read;
1912       curr_addr += bytes_read;
1913       bytes_left -= bytes_read;
1914       address = Address(curr_addr);
1915     }
1916   } else {
1917     if (dst == nullptr)
1918       result_error.SetErrorString("invalid arguments");
1919     else
1920       result_error.Clear();
1921   }
1922   return total_cstr_len;
1923 }
1924 
1925 size_t Target::ReadScalarIntegerFromMemory(const Address &addr,
1926                                            bool prefer_file_cache,
1927                                            uint32_t byte_size, bool is_signed,
1928                                            Scalar &scalar, Status &error) {
1929   uint64_t uval;
1930 
1931   if (byte_size <= sizeof(uval)) {
1932     size_t bytes_read =
1933         ReadMemory(addr, prefer_file_cache, &uval, byte_size, error);
1934     if (bytes_read == byte_size) {
1935       DataExtractor data(&uval, sizeof(uval), m_arch.GetSpec().GetByteOrder(),
1936                          m_arch.GetSpec().GetAddressByteSize());
1937       lldb::offset_t offset = 0;
1938       if (byte_size <= 4)
1939         scalar = data.GetMaxU32(&offset, byte_size);
1940       else
1941         scalar = data.GetMaxU64(&offset, byte_size);
1942 
1943       if (is_signed)
1944         scalar.SignExtend(byte_size * 8);
1945       return bytes_read;
1946     }
1947   } else {
1948     error.SetErrorStringWithFormat(
1949         "byte size of %u is too large for integer scalar type", byte_size);
1950   }
1951   return 0;
1952 }
1953 
1954 uint64_t Target::ReadUnsignedIntegerFromMemory(const Address &addr,
1955                                                bool prefer_file_cache,
1956                                                size_t integer_byte_size,
1957                                                uint64_t fail_value,
1958                                                Status &error) {
1959   Scalar scalar;
1960   if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, integer_byte_size,
1961                                   false, scalar, error))
1962     return scalar.ULongLong(fail_value);
1963   return fail_value;
1964 }
1965 
1966 bool Target::ReadPointerFromMemory(const Address &addr, bool prefer_file_cache,
1967                                    Status &error, Address &pointer_addr) {
1968   Scalar scalar;
1969   if (ReadScalarIntegerFromMemory(addr, prefer_file_cache,
1970                                   m_arch.GetSpec().GetAddressByteSize(), false, scalar,
1971                                   error)) {
1972     addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1973     if (pointer_vm_addr != LLDB_INVALID_ADDRESS) {
1974       SectionLoadList &section_load_list = GetSectionLoadList();
1975       if (section_load_list.IsEmpty()) {
1976         // No sections are loaded, so we must assume we are not running yet and
1977         // anything we are given is a file address.
1978         m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr);
1979       } else {
1980         // We have at least one section loaded. This can be because we have
1981         // manually loaded some sections with "target modules load ..." or
1982         // because we have have a live process that has sections loaded through
1983         // the dynamic loader
1984         section_load_list.ResolveLoadAddress(pointer_vm_addr, pointer_addr);
1985       }
1986       // We weren't able to resolve the pointer value, so just return an
1987       // address with no section
1988       if (!pointer_addr.IsValid())
1989         pointer_addr.SetOffset(pointer_vm_addr);
1990       return true;
1991     }
1992   }
1993   return false;
1994 }
1995 
1996 ModuleSP Target::GetOrCreateModule(const ModuleSpec &module_spec, bool notify,
1997                                    Status *error_ptr) {
1998   ModuleSP module_sp;
1999 
2000   Status error;
2001 
2002   // First see if we already have this module in our module list.  If we do,
2003   // then we're done, we don't need to consult the shared modules list.  But
2004   // only do this if we are passed a UUID.
2005 
2006   if (module_spec.GetUUID().IsValid())
2007     module_sp = m_images.FindFirstModule(module_spec);
2008 
2009   if (!module_sp) {
2010     ModuleSP old_module_sp; // This will get filled in if we have a new version
2011                             // of the library
2012     bool did_create_module = false;
2013     FileSpecList search_paths = GetExecutableSearchPaths();
2014     // If there are image search path entries, try to use them first to acquire
2015     // a suitable image.
2016     if (m_image_search_paths.GetSize()) {
2017       ModuleSpec transformed_spec(module_spec);
2018       if (m_image_search_paths.RemapPath(
2019               module_spec.GetFileSpec().GetDirectory(),
2020               transformed_spec.GetFileSpec().GetDirectory())) {
2021         transformed_spec.GetFileSpec().GetFilename() =
2022             module_spec.GetFileSpec().GetFilename();
2023         error = ModuleList::GetSharedModule(transformed_spec, module_sp,
2024                                             &search_paths,
2025                                             &old_module_sp, &did_create_module);
2026       }
2027     }
2028 
2029     if (!module_sp) {
2030       // If we have a UUID, we can check our global shared module list in case
2031       // we already have it. If we don't have a valid UUID, then we can't since
2032       // the path in "module_spec" will be a platform path, and we will need to
2033       // let the platform find that file. For example, we could be asking for
2034       // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
2035       // the local copy of "/usr/lib/dyld" since our platform could be a remote
2036       // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
2037       // cache.
2038       if (module_spec.GetUUID().IsValid()) {
2039         // We have a UUID, it is OK to check the global module list...
2040         error = ModuleList::GetSharedModule(module_spec, module_sp,
2041                                             &search_paths,
2042                                             &old_module_sp, &did_create_module);
2043       }
2044 
2045       if (!module_sp) {
2046         // The platform is responsible for finding and caching an appropriate
2047         // module in the shared module cache.
2048         if (m_platform_sp) {
2049           error = m_platform_sp->GetSharedModule(
2050               module_spec, m_process_sp.get(), module_sp,
2051               &search_paths, &old_module_sp, &did_create_module);
2052         } else {
2053           error.SetErrorString("no platform is currently set");
2054         }
2055       }
2056     }
2057 
2058     // We found a module that wasn't in our target list.  Let's make sure that
2059     // there wasn't an equivalent module in the list already, and if there was,
2060     // let's remove it.
2061     if (module_sp) {
2062       ObjectFile *objfile = module_sp->GetObjectFile();
2063       if (objfile) {
2064         switch (objfile->GetType()) {
2065         case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of
2066                                         /// a program's execution state
2067         case ObjectFile::eTypeExecutable:    /// A normal executable
2068         case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker
2069                                              /// executable
2070         case ObjectFile::eTypeObjectFile:    /// An intermediate object file
2071         case ObjectFile::eTypeSharedLibrary: /// A shared library that can be
2072                                              /// used during execution
2073           break;
2074         case ObjectFile::eTypeDebugInfo: /// An object file that contains only
2075                                          /// debug information
2076           if (error_ptr)
2077             error_ptr->SetErrorString("debug info files aren't valid target "
2078                                       "modules, please specify an executable");
2079           return ModuleSP();
2080         case ObjectFile::eTypeStubLibrary: /// A library that can be linked
2081                                            /// against but not used for
2082                                            /// execution
2083           if (error_ptr)
2084             error_ptr->SetErrorString("stub libraries aren't valid target "
2085                                       "modules, please specify an executable");
2086           return ModuleSP();
2087         default:
2088           if (error_ptr)
2089             error_ptr->SetErrorString(
2090                 "unsupported file type, please specify an executable");
2091           return ModuleSP();
2092         }
2093         // GetSharedModule is not guaranteed to find the old shared module, for
2094         // instance in the common case where you pass in the UUID, it is only
2095         // going to find the one module matching the UUID.  In fact, it has no
2096         // good way to know what the "old module" relevant to this target is,
2097         // since there might be many copies of a module with this file spec in
2098         // various running debug sessions, but only one of them will belong to
2099         // this target. So let's remove the UUID from the module list, and look
2100         // in the target's module list. Only do this if there is SOMETHING else
2101         // in the module spec...
2102         if (!old_module_sp) {
2103           if (module_spec.GetUUID().IsValid() &&
2104               !module_spec.GetFileSpec().GetFilename().IsEmpty() &&
2105               !module_spec.GetFileSpec().GetDirectory().IsEmpty()) {
2106             ModuleSpec module_spec_copy(module_spec.GetFileSpec());
2107             module_spec_copy.GetUUID().Clear();
2108 
2109             ModuleList found_modules;
2110             size_t num_found =
2111                 m_images.FindModules(module_spec_copy, found_modules);
2112             if (num_found == 1) {
2113               old_module_sp = found_modules.GetModuleAtIndex(0);
2114             }
2115           }
2116         }
2117 
2118         // Preload symbols outside of any lock, so hopefully we can do this for
2119         // each library in parallel.
2120         if (GetPreloadSymbols())
2121           module_sp->PreloadSymbols();
2122 
2123         if (old_module_sp &&
2124             m_images.GetIndexForModule(old_module_sp.get()) !=
2125                 LLDB_INVALID_INDEX32) {
2126           m_images.ReplaceModule(old_module_sp, module_sp);
2127           Module *old_module_ptr = old_module_sp.get();
2128           old_module_sp.reset();
2129           ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr);
2130         } else {
2131           m_images.Append(module_sp, notify);
2132         }
2133       } else
2134         module_sp.reset();
2135     }
2136   }
2137   if (error_ptr)
2138     *error_ptr = error;
2139   return module_sp;
2140 }
2141 
2142 TargetSP Target::CalculateTarget() { return shared_from_this(); }
2143 
2144 ProcessSP Target::CalculateProcess() { return m_process_sp; }
2145 
2146 ThreadSP Target::CalculateThread() { return ThreadSP(); }
2147 
2148 StackFrameSP Target::CalculateStackFrame() { return StackFrameSP(); }
2149 
2150 void Target::CalculateExecutionContext(ExecutionContext &exe_ctx) {
2151   exe_ctx.Clear();
2152   exe_ctx.SetTargetPtr(this);
2153 }
2154 
2155 PathMappingList &Target::GetImageSearchPathList() {
2156   return m_image_search_paths;
2157 }
2158 
2159 void Target::ImageSearchPathsChanged(const PathMappingList &path_list,
2160                                      void *baton) {
2161   Target *target = (Target *)baton;
2162   ModuleSP exe_module_sp(target->GetExecutableModule());
2163   if (exe_module_sp)
2164     target->SetExecutableModule(exe_module_sp, eLoadDependentsYes);
2165 }
2166 
2167 TypeSystem *Target::GetScratchTypeSystemForLanguage(Status *error,
2168                                                     lldb::LanguageType language,
2169                                                     bool create_on_demand) {
2170   if (!m_valid)
2171     return nullptr;
2172 
2173   if (error) {
2174     error->Clear();
2175   }
2176 
2177   if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all
2178                                              // assembly code
2179       || language == eLanguageTypeUnknown) {
2180     std::set<lldb::LanguageType> languages_for_types;
2181     std::set<lldb::LanguageType> languages_for_expressions;
2182 
2183     Language::GetLanguagesSupportingTypeSystems(languages_for_types,
2184                                                 languages_for_expressions);
2185 
2186     if (languages_for_expressions.count(eLanguageTypeC)) {
2187       language = eLanguageTypeC; // LLDB's default.  Override by setting the
2188                                  // target language.
2189     } else {
2190       if (languages_for_expressions.empty()) {
2191         return nullptr;
2192       } else {
2193         language = *languages_for_expressions.begin();
2194       }
2195     }
2196   }
2197 
2198   return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this,
2199                                                             create_on_demand);
2200 }
2201 
2202 PersistentExpressionState *
2203 Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) {
2204   TypeSystem *type_system =
2205       GetScratchTypeSystemForLanguage(nullptr, language, true);
2206 
2207   if (type_system) {
2208     return type_system->GetPersistentExpressionState();
2209   } else {
2210     return nullptr;
2211   }
2212 }
2213 
2214 UserExpression *Target::GetUserExpressionForLanguage(
2215     llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language,
2216     Expression::ResultType desired_type,
2217     const EvaluateExpressionOptions &options,
2218     ValueObject *ctx_obj, Status &error) {
2219   Status type_system_error;
2220 
2221   TypeSystem *type_system =
2222       GetScratchTypeSystemForLanguage(&type_system_error, language);
2223   UserExpression *user_expr = nullptr;
2224 
2225   if (!type_system) {
2226     error.SetErrorStringWithFormat(
2227         "Could not find type system for language %s: %s",
2228         Language::GetNameForLanguageType(language),
2229         type_system_error.AsCString());
2230     return nullptr;
2231   }
2232 
2233   user_expr = type_system->GetUserExpression(expr, prefix, language,
2234                                              desired_type, options, ctx_obj);
2235   if (!user_expr)
2236     error.SetErrorStringWithFormat(
2237         "Could not create an expression for language %s",
2238         Language::GetNameForLanguageType(language));
2239 
2240   return user_expr;
2241 }
2242 
2243 FunctionCaller *Target::GetFunctionCallerForLanguage(
2244     lldb::LanguageType language, const CompilerType &return_type,
2245     const Address &function_address, const ValueList &arg_value_list,
2246     const char *name, Status &error) {
2247   Status type_system_error;
2248   TypeSystem *type_system =
2249       GetScratchTypeSystemForLanguage(&type_system_error, language);
2250   FunctionCaller *persistent_fn = nullptr;
2251 
2252   if (!type_system) {
2253     error.SetErrorStringWithFormat(
2254         "Could not find type system for language %s: %s",
2255         Language::GetNameForLanguageType(language),
2256         type_system_error.AsCString());
2257     return persistent_fn;
2258   }
2259 
2260   persistent_fn = type_system->GetFunctionCaller(return_type, function_address,
2261                                                  arg_value_list, name);
2262   if (!persistent_fn)
2263     error.SetErrorStringWithFormat(
2264         "Could not create an expression for language %s",
2265         Language::GetNameForLanguageType(language));
2266 
2267   return persistent_fn;
2268 }
2269 
2270 UtilityFunction *
2271 Target::GetUtilityFunctionForLanguage(const char *text,
2272                                       lldb::LanguageType language,
2273                                       const char *name, Status &error) {
2274   Status type_system_error;
2275   TypeSystem *type_system =
2276       GetScratchTypeSystemForLanguage(&type_system_error, language);
2277   UtilityFunction *utility_fn = nullptr;
2278 
2279   if (!type_system) {
2280     error.SetErrorStringWithFormat(
2281         "Could not find type system for language %s: %s",
2282         Language::GetNameForLanguageType(language),
2283         type_system_error.AsCString());
2284     return utility_fn;
2285   }
2286 
2287   utility_fn = type_system->GetUtilityFunction(text, name);
2288   if (!utility_fn)
2289     error.SetErrorStringWithFormat(
2290         "Could not create an expression for language %s",
2291         Language::GetNameForLanguageType(language));
2292 
2293   return utility_fn;
2294 }
2295 
2296 ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) {
2297   if (m_valid) {
2298     if (TypeSystem *type_system = GetScratchTypeSystemForLanguage(
2299             nullptr, eLanguageTypeC, create_on_demand))
2300       return llvm::dyn_cast<ClangASTContext>(type_system);
2301   }
2302   return nullptr;
2303 }
2304 
2305 ClangASTImporterSP Target::GetClangASTImporter() {
2306   if (m_valid) {
2307     if (!m_ast_importer_sp) {
2308       m_ast_importer_sp = std::make_shared<ClangASTImporter>();
2309     }
2310     return m_ast_importer_sp;
2311   }
2312   return ClangASTImporterSP();
2313 }
2314 
2315 void Target::SettingsInitialize() { Process::SettingsInitialize(); }
2316 
2317 void Target::SettingsTerminate() { Process::SettingsTerminate(); }
2318 
2319 FileSpecList Target::GetDefaultExecutableSearchPaths() {
2320   TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2321   if (properties_sp)
2322     return properties_sp->GetExecutableSearchPaths();
2323   return FileSpecList();
2324 }
2325 
2326 FileSpecList Target::GetDefaultDebugFileSearchPaths() {
2327   TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2328   if (properties_sp)
2329     return properties_sp->GetDebugFileSearchPaths();
2330   return FileSpecList();
2331 }
2332 
2333 FileSpecList Target::GetDefaultClangModuleSearchPaths() {
2334   TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2335   if (properties_sp)
2336     return properties_sp->GetClangModuleSearchPaths();
2337   return FileSpecList();
2338 }
2339 
2340 ArchSpec Target::GetDefaultArchitecture() {
2341   TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2342   if (properties_sp)
2343     return properties_sp->GetDefaultArchitecture();
2344   return ArchSpec();
2345 }
2346 
2347 void Target::SetDefaultArchitecture(const ArchSpec &arch) {
2348   TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2349   if (properties_sp) {
2350     LogIfAnyCategoriesSet(
2351         LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's "
2352                             "default architecture to  %s (%s)",
2353         arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
2354     return properties_sp->SetDefaultArchitecture(arch);
2355   }
2356 }
2357 
2358 Target *Target::GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr,
2359                                       const SymbolContext *sc_ptr) {
2360   // The target can either exist in the "process" of ExecutionContext, or in
2361   // the "target_sp" member of SymbolContext. This accessor helper function
2362   // will get the target from one of these locations.
2363 
2364   Target *target = nullptr;
2365   if (sc_ptr != nullptr)
2366     target = sc_ptr->target_sp.get();
2367   if (target == nullptr && exe_ctx_ptr)
2368     target = exe_ctx_ptr->GetTargetPtr();
2369   return target;
2370 }
2371 
2372 ExpressionResults Target::EvaluateExpression(
2373     llvm::StringRef expr, ExecutionContextScope *exe_scope,
2374     lldb::ValueObjectSP &result_valobj_sp,
2375     const EvaluateExpressionOptions &options, std::string *fixed_expression,
2376     ValueObject *ctx_obj) {
2377   result_valobj_sp.reset();
2378 
2379   ExpressionResults execution_results = eExpressionSetupError;
2380 
2381   if (expr.empty())
2382     return execution_results;
2383 
2384   // We shouldn't run stop hooks in expressions.
2385   bool old_suppress_value = m_suppress_stop_hooks;
2386   m_suppress_stop_hooks = true;
2387   auto on_exit = llvm::make_scope_exit([this, old_suppress_value]() {
2388       m_suppress_stop_hooks = old_suppress_value; });
2389 
2390   ExecutionContext exe_ctx;
2391 
2392   if (exe_scope) {
2393     exe_scope->CalculateExecutionContext(exe_ctx);
2394   } else if (m_process_sp) {
2395     m_process_sp->CalculateExecutionContext(exe_ctx);
2396   } else {
2397     CalculateExecutionContext(exe_ctx);
2398   }
2399 
2400   // Make sure we aren't just trying to see the value of a persistent variable
2401   // (something like "$0")
2402   lldb::ExpressionVariableSP persistent_var_sp;
2403   // Only check for persistent variables the expression starts with a '$'
2404   if (expr[0] == '$')
2405     persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)
2406                             ->GetPersistentExpressionState()
2407                             ->GetVariable(expr);
2408 
2409   if (persistent_var_sp) {
2410     result_valobj_sp = persistent_var_sp->GetValueObject();
2411     execution_results = eExpressionCompleted;
2412   } else {
2413     llvm::StringRef prefix = GetExpressionPrefixContents();
2414     Status error;
2415     execution_results =
2416         UserExpression::Evaluate(exe_ctx, options, expr, prefix,
2417                                  result_valobj_sp, error, fixed_expression,
2418                                  nullptr, // Module
2419                                  ctx_obj);
2420   }
2421 
2422   return execution_results;
2423 }
2424 
2425 lldb::ExpressionVariableSP
2426 Target::GetPersistentVariable(ConstString name) {
2427   lldb::ExpressionVariableSP variable_sp;
2428   m_scratch_type_system_map.ForEach(
2429       [name, &variable_sp](TypeSystem *type_system) -> bool {
2430         if (PersistentExpressionState *persistent_state =
2431                 type_system->GetPersistentExpressionState()) {
2432           variable_sp = persistent_state->GetVariable(name);
2433 
2434           if (variable_sp)
2435             return false; // Stop iterating the ForEach
2436         }
2437         return true; // Keep iterating the ForEach
2438       });
2439   return variable_sp;
2440 }
2441 
2442 lldb::addr_t Target::GetPersistentSymbol(ConstString name) {
2443   lldb::addr_t address = LLDB_INVALID_ADDRESS;
2444 
2445   m_scratch_type_system_map.ForEach(
2446       [name, &address](TypeSystem *type_system) -> bool {
2447         if (PersistentExpressionState *persistent_state =
2448                 type_system->GetPersistentExpressionState()) {
2449           address = persistent_state->LookupSymbol(name);
2450           if (address != LLDB_INVALID_ADDRESS)
2451             return false; // Stop iterating the ForEach
2452         }
2453         return true; // Keep iterating the ForEach
2454       });
2455   return address;
2456 }
2457 
2458 lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr,
2459                                             AddressClass addr_class) const {
2460   auto arch_plugin = GetArchitecturePlugin();
2461   return arch_plugin ?
2462       arch_plugin->GetCallableLoadAddress(load_addr, addr_class) : load_addr;
2463 }
2464 
2465 lldb::addr_t Target::GetOpcodeLoadAddress(lldb::addr_t load_addr,
2466                                           AddressClass addr_class) const {
2467   auto arch_plugin = GetArchitecturePlugin();
2468   return arch_plugin ?
2469       arch_plugin->GetOpcodeLoadAddress(load_addr, addr_class) : load_addr;
2470 }
2471 
2472 lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) {
2473   auto arch_plugin = GetArchitecturePlugin();
2474   return arch_plugin ?
2475       arch_plugin->GetBreakableLoadAddress(addr, *this) : addr;
2476 }
2477 
2478 SourceManager &Target::GetSourceManager() {
2479   if (!m_source_manager_up)
2480     m_source_manager_up.reset(new SourceManager(shared_from_this()));
2481   return *m_source_manager_up;
2482 }
2483 
2484 ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() {
2485   static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended
2486                                                        // we can make it
2487                                                        // per-target
2488 
2489   {
2490     std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex);
2491 
2492     if (!m_clang_modules_decl_vendor_up) {
2493       m_clang_modules_decl_vendor_up.reset(
2494           ClangModulesDeclVendor::Create(*this));
2495     }
2496   }
2497 
2498   return m_clang_modules_decl_vendor_up.get();
2499 }
2500 
2501 Target::StopHookSP Target::CreateStopHook() {
2502   lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2503   Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid));
2504   m_stop_hooks[new_uid] = stop_hook_sp;
2505   return stop_hook_sp;
2506 }
2507 
2508 bool Target::RemoveStopHookByID(lldb::user_id_t user_id) {
2509   size_t num_removed = m_stop_hooks.erase(user_id);
2510   return (num_removed != 0);
2511 }
2512 
2513 void Target::RemoveAllStopHooks() { m_stop_hooks.clear(); }
2514 
2515 Target::StopHookSP Target::GetStopHookByID(lldb::user_id_t user_id) {
2516   StopHookSP found_hook;
2517 
2518   StopHookCollection::iterator specified_hook_iter;
2519   specified_hook_iter = m_stop_hooks.find(user_id);
2520   if (specified_hook_iter != m_stop_hooks.end())
2521     found_hook = (*specified_hook_iter).second;
2522   return found_hook;
2523 }
2524 
2525 bool Target::SetStopHookActiveStateByID(lldb::user_id_t user_id,
2526                                         bool active_state) {
2527   StopHookCollection::iterator specified_hook_iter;
2528   specified_hook_iter = m_stop_hooks.find(user_id);
2529   if (specified_hook_iter == m_stop_hooks.end())
2530     return false;
2531 
2532   (*specified_hook_iter).second->SetIsActive(active_state);
2533   return true;
2534 }
2535 
2536 void Target::SetAllStopHooksActiveState(bool active_state) {
2537   StopHookCollection::iterator pos, end = m_stop_hooks.end();
2538   for (pos = m_stop_hooks.begin(); pos != end; pos++) {
2539     (*pos).second->SetIsActive(active_state);
2540   }
2541 }
2542 
2543 void Target::RunStopHooks() {
2544   if (m_suppress_stop_hooks)
2545     return;
2546 
2547   if (!m_process_sp)
2548     return;
2549 
2550   // Somebody might have restarted the process:
2551   if (m_process_sp->GetState() != eStateStopped)
2552     return;
2553 
2554   // <rdar://problem/12027563> make sure we check that we are not stopped
2555   // because of us running a user expression since in that case we do not want
2556   // to run the stop-hooks
2557   if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2558     return;
2559 
2560   if (m_stop_hooks.empty())
2561     return;
2562 
2563   StopHookCollection::iterator pos, end = m_stop_hooks.end();
2564 
2565   // If there aren't any active stop hooks, don't bother either.
2566   // Also see if any of the active hooks want to auto-continue.
2567   bool any_active_hooks = false;
2568   bool auto_continue = false;
2569   for (auto hook : m_stop_hooks) {
2570     if (hook.second->IsActive()) {
2571       any_active_hooks = true;
2572       auto_continue |= hook.second->GetAutoContinue();
2573     }
2574   }
2575   if (!any_active_hooks)
2576     return;
2577 
2578   CommandReturnObject result;
2579 
2580   std::vector<ExecutionContext> exc_ctx_with_reasons;
2581   std::vector<SymbolContext> sym_ctx_with_reasons;
2582 
2583   ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2584   size_t num_threads = cur_threadlist.GetSize();
2585   for (size_t i = 0; i < num_threads; i++) {
2586     lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex(i);
2587     if (cur_thread_sp->ThreadStoppedForAReason()) {
2588       lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2589       exc_ctx_with_reasons.push_back(ExecutionContext(
2590           m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2591       sym_ctx_with_reasons.push_back(
2592           cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2593     }
2594   }
2595 
2596   // If no threads stopped for a reason, don't run the stop-hooks.
2597   size_t num_exe_ctx = exc_ctx_with_reasons.size();
2598   if (num_exe_ctx == 0)
2599     return;
2600 
2601   result.SetImmediateOutputStream(m_debugger.GetAsyncOutputStream());
2602   result.SetImmediateErrorStream(m_debugger.GetAsyncErrorStream());
2603 
2604   bool keep_going = true;
2605   bool hooks_ran = false;
2606   bool print_hook_header = (m_stop_hooks.size() != 1);
2607   bool print_thread_header = (num_exe_ctx != 1);
2608   bool did_restart = false;
2609 
2610   for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) {
2611     // result.Clear();
2612     StopHookSP cur_hook_sp = (*pos).second;
2613     if (!cur_hook_sp->IsActive())
2614       continue;
2615 
2616     bool any_thread_matched = false;
2617     for (size_t i = 0; keep_going && i < num_exe_ctx; i++) {
2618       if ((cur_hook_sp->GetSpecifier() == nullptr ||
2619            cur_hook_sp->GetSpecifier()->SymbolContextMatches(
2620                sym_ctx_with_reasons[i])) &&
2621           (cur_hook_sp->GetThreadSpecifier() == nullptr ||
2622            cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(
2623                exc_ctx_with_reasons[i].GetThreadRef()))) {
2624         if (!hooks_ran) {
2625           hooks_ran = true;
2626         }
2627         if (print_hook_header && !any_thread_matched) {
2628           const char *cmd =
2629               (cur_hook_sp->GetCommands().GetSize() == 1
2630                    ? cur_hook_sp->GetCommands().GetStringAtIndex(0)
2631                    : nullptr);
2632           if (cmd)
2633             result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n",
2634                                            cur_hook_sp->GetID(), cmd);
2635           else
2636             result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n",
2637                                            cur_hook_sp->GetID());
2638           any_thread_matched = true;
2639         }
2640 
2641         if (print_thread_header)
2642           result.AppendMessageWithFormat(
2643               "-- Thread %d\n",
2644               exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2645 
2646         CommandInterpreterRunOptions options;
2647         options.SetStopOnContinue(true);
2648         options.SetStopOnError(true);
2649         options.SetEchoCommands(false);
2650         options.SetPrintResults(true);
2651         options.SetPrintErrors(true);
2652         options.SetAddToHistory(false);
2653 
2654         // Force Async:
2655         bool old_async = GetDebugger().GetAsyncExecution();
2656         GetDebugger().SetAsyncExecution(true);
2657         GetDebugger().GetCommandInterpreter().HandleCommands(
2658             cur_hook_sp->GetCommands(), &exc_ctx_with_reasons[i], options,
2659             result);
2660         GetDebugger().SetAsyncExecution(old_async);
2661         // If the command started the target going again, we should bag out of
2662         // running the stop hooks.
2663         if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2664             (result.GetStatus() == eReturnStatusSuccessContinuingResult)) {
2665           // But only complain if there were more stop hooks to do:
2666           StopHookCollection::iterator tmp = pos;
2667           if (++tmp != end)
2668             result.AppendMessageWithFormat("\nAborting stop hooks, hook %" PRIu64
2669                                            " set the program running.\n"
2670                                            "  Consider using '-G true' to make "
2671                                            "stop hooks auto-continue.\n",
2672                                            cur_hook_sp->GetID());
2673           keep_going = false;
2674           did_restart = true;
2675         }
2676       }
2677     }
2678   }
2679   // Finally, if auto-continue was requested, do it now:
2680   if (!did_restart && auto_continue)
2681     m_process_sp->PrivateResume();
2682 
2683   result.GetImmediateOutputStream()->Flush();
2684   result.GetImmediateErrorStream()->Flush();
2685 }
2686 
2687 const TargetPropertiesSP &Target::GetGlobalProperties() {
2688   // NOTE: intentional leak so we don't crash if global destructor chain gets
2689   // called as other threads still use the result of this function
2690   static TargetPropertiesSP *g_settings_sp_ptr =
2691       new TargetPropertiesSP(new TargetProperties(nullptr));
2692   return *g_settings_sp_ptr;
2693 }
2694 
2695 Status Target::Install(ProcessLaunchInfo *launch_info) {
2696   Status error;
2697   PlatformSP platform_sp(GetPlatform());
2698   if (platform_sp) {
2699     if (platform_sp->IsRemote()) {
2700       if (platform_sp->IsConnected()) {
2701         // Install all files that have an install path, and always install the
2702         // main executable when connected to a remote platform
2703         const ModuleList &modules = GetImages();
2704         const size_t num_images = modules.GetSize();
2705         for (size_t idx = 0; idx < num_images; ++idx) {
2706           ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2707           if (module_sp) {
2708             const bool is_main_executable = module_sp == GetExecutableModule();
2709             FileSpec local_file(module_sp->GetFileSpec());
2710             if (local_file) {
2711               FileSpec remote_file(module_sp->GetRemoteInstallFileSpec());
2712               if (!remote_file) {
2713                 if (is_main_executable) // TODO: add setting for always
2714                                         // installing main executable???
2715                 {
2716                   // Always install the main executable
2717                   remote_file = platform_sp->GetRemoteWorkingDirectory();
2718                   remote_file.AppendPathComponent(
2719                       module_sp->GetFileSpec().GetFilename().GetCString());
2720                 }
2721               }
2722               if (remote_file) {
2723                 error = platform_sp->Install(local_file, remote_file);
2724                 if (error.Success()) {
2725                   module_sp->SetPlatformFileSpec(remote_file);
2726                   if (is_main_executable) {
2727                     platform_sp->SetFilePermissions(remote_file, 0700);
2728                     if (launch_info)
2729                       launch_info->SetExecutableFile(remote_file, false);
2730                   }
2731                 } else
2732                   break;
2733               }
2734             }
2735           }
2736         }
2737       }
2738     }
2739   }
2740   return error;
2741 }
2742 
2743 bool Target::ResolveLoadAddress(addr_t load_addr, Address &so_addr,
2744                                 uint32_t stop_id) {
2745   return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2746 }
2747 
2748 bool Target::ResolveFileAddress(lldb::addr_t file_addr,
2749                                 Address &resolved_addr) {
2750   return m_images.ResolveFileAddress(file_addr, resolved_addr);
2751 }
2752 
2753 bool Target::SetSectionLoadAddress(const SectionSP &section_sp,
2754                                    addr_t new_section_load_addr,
2755                                    bool warn_multiple) {
2756   const addr_t old_section_load_addr =
2757       m_section_load_history.GetSectionLoadAddress(
2758           SectionLoadHistory::eStopIDNow, section_sp);
2759   if (old_section_load_addr != new_section_load_addr) {
2760     uint32_t stop_id = 0;
2761     ProcessSP process_sp(GetProcessSP());
2762     if (process_sp)
2763       stop_id = process_sp->GetStopID();
2764     else
2765       stop_id = m_section_load_history.GetLastStopID();
2766     if (m_section_load_history.SetSectionLoadAddress(
2767             stop_id, section_sp, new_section_load_addr, warn_multiple))
2768       return true; // Return true if the section load address was changed...
2769   }
2770   return false; // Return false to indicate nothing changed
2771 }
2772 
2773 size_t Target::UnloadModuleSections(const ModuleList &module_list) {
2774   size_t section_unload_count = 0;
2775   size_t num_modules = module_list.GetSize();
2776   for (size_t i = 0; i < num_modules; ++i) {
2777     section_unload_count +=
2778         UnloadModuleSections(module_list.GetModuleAtIndex(i));
2779   }
2780   return section_unload_count;
2781 }
2782 
2783 size_t Target::UnloadModuleSections(const lldb::ModuleSP &module_sp) {
2784   uint32_t stop_id = 0;
2785   ProcessSP process_sp(GetProcessSP());
2786   if (process_sp)
2787     stop_id = process_sp->GetStopID();
2788   else
2789     stop_id = m_section_load_history.GetLastStopID();
2790   SectionList *sections = module_sp->GetSectionList();
2791   size_t section_unload_count = 0;
2792   if (sections) {
2793     const uint32_t num_sections = sections->GetNumSections(0);
2794     for (uint32_t i = 0; i < num_sections; ++i) {
2795       section_unload_count += m_section_load_history.SetSectionUnloaded(
2796           stop_id, sections->GetSectionAtIndex(i));
2797     }
2798   }
2799   return section_unload_count;
2800 }
2801 
2802 bool Target::SetSectionUnloaded(const lldb::SectionSP &section_sp) {
2803   uint32_t stop_id = 0;
2804   ProcessSP process_sp(GetProcessSP());
2805   if (process_sp)
2806     stop_id = process_sp->GetStopID();
2807   else
2808     stop_id = m_section_load_history.GetLastStopID();
2809   return m_section_load_history.SetSectionUnloaded(stop_id, section_sp);
2810 }
2811 
2812 bool Target::SetSectionUnloaded(const lldb::SectionSP &section_sp,
2813                                 addr_t load_addr) {
2814   uint32_t stop_id = 0;
2815   ProcessSP process_sp(GetProcessSP());
2816   if (process_sp)
2817     stop_id = process_sp->GetStopID();
2818   else
2819     stop_id = m_section_load_history.GetLastStopID();
2820   return m_section_load_history.SetSectionUnloaded(stop_id, section_sp,
2821                                                    load_addr);
2822 }
2823 
2824 void Target::ClearAllLoadedSections() { m_section_load_history.Clear(); }
2825 
2826 Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) {
2827   Status error;
2828   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
2829 
2830   if (log)
2831     log->Printf("Target::%s() called for %s", __FUNCTION__,
2832                 launch_info.GetExecutableFile().GetPath().c_str());
2833 
2834   StateType state = eStateInvalid;
2835 
2836   // Scope to temporarily get the process state in case someone has manually
2837   // remotely connected already to a process and we can skip the platform
2838   // launching.
2839   {
2840     ProcessSP process_sp(GetProcessSP());
2841 
2842     if (process_sp) {
2843       state = process_sp->GetState();
2844       if (log)
2845         log->Printf(
2846             "Target::%s the process exists, and its current state is %s",
2847             __FUNCTION__, StateAsCString(state));
2848     } else {
2849       if (log)
2850         log->Printf("Target::%s the process instance doesn't currently exist.",
2851                     __FUNCTION__);
2852     }
2853   }
2854 
2855   launch_info.GetFlags().Set(eLaunchFlagDebug);
2856 
2857   // Get the value of synchronous execution here.  If you wait till after you
2858   // have started to run, then you could have hit a breakpoint, whose command
2859   // might switch the value, and then you'll pick up that incorrect value.
2860   Debugger &debugger = GetDebugger();
2861   const bool synchronous_execution =
2862       debugger.GetCommandInterpreter().GetSynchronous();
2863 
2864   PlatformSP platform_sp(GetPlatform());
2865 
2866   FinalizeFileActions(launch_info);
2867 
2868   if (state == eStateConnected) {
2869     if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
2870       error.SetErrorString(
2871           "can't launch in tty when launching through a remote connection");
2872       return error;
2873     }
2874   }
2875 
2876   if (!launch_info.GetArchitecture().IsValid())
2877     launch_info.GetArchitecture() = GetArchitecture();
2878 
2879   // If we're not already connected to the process, and if we have a platform
2880   // that can launch a process for debugging, go ahead and do that here.
2881   if (state != eStateConnected && platform_sp &&
2882       platform_sp->CanDebugProcess()) {
2883     if (log)
2884       log->Printf("Target::%s asking the platform to debug the process",
2885                   __FUNCTION__);
2886 
2887     // If there was a previous process, delete it before we make the new one.
2888     // One subtle point, we delete the process before we release the reference
2889     // to m_process_sp.  That way even if we are the last owner, the process
2890     // will get Finalized before it gets destroyed.
2891     DeleteCurrentProcess();
2892 
2893     m_process_sp =
2894         GetPlatform()->DebugProcess(launch_info, debugger, this, error);
2895 
2896   } else {
2897     if (log)
2898       log->Printf("Target::%s the platform doesn't know how to debug a "
2899                   "process, getting a process plugin to do this for us.",
2900                   __FUNCTION__);
2901 
2902     if (state == eStateConnected) {
2903       assert(m_process_sp);
2904     } else {
2905       // Use a Process plugin to construct the process.
2906       const char *plugin_name = launch_info.GetProcessPluginName();
2907       CreateProcess(launch_info.GetListener(), plugin_name, nullptr);
2908     }
2909 
2910     // Since we didn't have a platform launch the process, launch it here.
2911     if (m_process_sp)
2912       error = m_process_sp->Launch(launch_info);
2913   }
2914 
2915   if (!m_process_sp) {
2916     if (error.Success())
2917       error.SetErrorString("failed to launch or debug process");
2918     return error;
2919   }
2920 
2921   if (error.Success()) {
2922     if (synchronous_execution ||
2923         !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2924       ListenerSP hijack_listener_sp(launch_info.GetHijackListener());
2925       if (!hijack_listener_sp) {
2926         hijack_listener_sp =
2927             Listener::MakeListener("lldb.Target.Launch.hijack");
2928         launch_info.SetHijackListener(hijack_listener_sp);
2929         m_process_sp->HijackProcessEvents(hijack_listener_sp);
2930       }
2931 
2932       StateType state = m_process_sp->WaitForProcessToStop(
2933           llvm::None, nullptr, false, hijack_listener_sp, nullptr);
2934 
2935       if (state == eStateStopped) {
2936         if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2937           if (synchronous_execution) {
2938             // Now we have handled the stop-from-attach, and we are just switching
2939             // to a synchronous resume.  So we should switch to the SyncResume
2940             // hijacker.
2941             m_process_sp->RestoreProcessEvents();
2942             m_process_sp->ResumeSynchronous(stream);
2943           } else {
2944             m_process_sp->RestoreProcessEvents();
2945             error = m_process_sp->PrivateResume();
2946           }
2947           if (!error.Success()) {
2948             Status error2;
2949             error2.SetErrorStringWithFormat(
2950                 "process resume at entry point failed: %s", error.AsCString());
2951             error = error2;
2952           }
2953         }
2954       } else if (state == eStateExited) {
2955         bool with_shell = !!launch_info.GetShell();
2956         const int exit_status = m_process_sp->GetExitStatus();
2957         const char *exit_desc = m_process_sp->GetExitDescription();
2958 #define LAUNCH_SHELL_MESSAGE                                                   \
2959   "\n'r' and 'run' are aliases that default to launching through a "           \
2960   "shell.\nTry launching without going through a shell by using 'process "     \
2961   "launch'."
2962         if (exit_desc && exit_desc[0]) {
2963           if (with_shell)
2964             error.SetErrorStringWithFormat(
2965                 "process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE,
2966                 exit_status, exit_desc);
2967           else
2968             error.SetErrorStringWithFormat("process exited with status %i (%s)",
2969                                            exit_status, exit_desc);
2970         } else {
2971           if (with_shell)
2972             error.SetErrorStringWithFormat(
2973                 "process exited with status %i" LAUNCH_SHELL_MESSAGE,
2974                 exit_status);
2975           else
2976             error.SetErrorStringWithFormat("process exited with status %i",
2977                                            exit_status);
2978         }
2979       } else {
2980         error.SetErrorStringWithFormat(
2981             "initial process state wasn't stopped: %s", StateAsCString(state));
2982       }
2983     }
2984     m_process_sp->RestoreProcessEvents();
2985   } else {
2986     Status error2;
2987     error2.SetErrorStringWithFormat("process launch failed: %s",
2988                                     error.AsCString());
2989     error = error2;
2990   }
2991   return error;
2992 }
2993 
2994 Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) {
2995   auto state = eStateInvalid;
2996   auto process_sp = GetProcessSP();
2997   if (process_sp) {
2998     state = process_sp->GetState();
2999     if (process_sp->IsAlive() && state != eStateConnected) {
3000       if (state == eStateAttaching)
3001         return Status("process attach is in progress");
3002       return Status("a process is already being debugged");
3003     }
3004   }
3005 
3006   const ModuleSP old_exec_module_sp = GetExecutableModule();
3007 
3008   // If no process info was specified, then use the target executable name as
3009   // the process to attach to by default
3010   if (!attach_info.ProcessInfoSpecified()) {
3011     if (old_exec_module_sp)
3012       attach_info.GetExecutableFile().GetFilename() =
3013           old_exec_module_sp->GetPlatformFileSpec().GetFilename();
3014 
3015     if (!attach_info.ProcessInfoSpecified()) {
3016       return Status("no process specified, create a target with a file, or "
3017                     "specify the --pid or --name");
3018     }
3019   }
3020 
3021   const auto platform_sp =
3022       GetDebugger().GetPlatformList().GetSelectedPlatform();
3023   ListenerSP hijack_listener_sp;
3024   const bool async = attach_info.GetAsync();
3025   if (!async) {
3026     hijack_listener_sp =
3027         Listener::MakeListener("lldb.Target.Attach.attach.hijack");
3028     attach_info.SetHijackListener(hijack_listener_sp);
3029   }
3030 
3031   Status error;
3032   if (state != eStateConnected && platform_sp != nullptr &&
3033       platform_sp->CanDebugProcess()) {
3034     SetPlatform(platform_sp);
3035     process_sp = platform_sp->Attach(attach_info, GetDebugger(), this, error);
3036   } else {
3037     if (state != eStateConnected) {
3038       const char *plugin_name = attach_info.GetProcessPluginName();
3039       process_sp =
3040           CreateProcess(attach_info.GetListenerForProcess(GetDebugger()),
3041                         plugin_name, nullptr);
3042       if (process_sp == nullptr) {
3043         error.SetErrorStringWithFormat(
3044             "failed to create process using plugin %s",
3045             (plugin_name) ? plugin_name : "null");
3046         return error;
3047       }
3048     }
3049     if (hijack_listener_sp)
3050       process_sp->HijackProcessEvents(hijack_listener_sp);
3051     error = process_sp->Attach(attach_info);
3052   }
3053 
3054   if (error.Success() && process_sp) {
3055     if (async) {
3056       process_sp->RestoreProcessEvents();
3057     } else {
3058       state = process_sp->WaitForProcessToStop(
3059           llvm::None, nullptr, false, attach_info.GetHijackListener(), stream);
3060       process_sp->RestoreProcessEvents();
3061 
3062       if (state != eStateStopped) {
3063         const char *exit_desc = process_sp->GetExitDescription();
3064         if (exit_desc)
3065           error.SetErrorStringWithFormat("%s", exit_desc);
3066         else
3067           error.SetErrorString(
3068               "process did not stop (no such process or permission problem?)");
3069         process_sp->Destroy(false);
3070       }
3071     }
3072   }
3073   return error;
3074 }
3075 
3076 void Target::FinalizeFileActions(ProcessLaunchInfo &info) {
3077   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3078 
3079   // Finalize the file actions, and if none were given, default to opening up a
3080   // pseudo terminal
3081   PlatformSP platform_sp = GetPlatform();
3082   const bool default_to_use_pty =
3083       m_platform_sp ? m_platform_sp->IsHost() : false;
3084   LLDB_LOG(
3085       log,
3086       "have platform={0}, platform_sp->IsHost()={1}, default_to_use_pty={2}",
3087       bool(platform_sp),
3088       platform_sp ? (platform_sp->IsHost() ? "true" : "false") : "n/a",
3089       default_to_use_pty);
3090 
3091   // If nothing for stdin or stdout or stderr was specified, then check the
3092   // process for any default settings that were set with "settings set"
3093   if (info.GetFileActionForFD(STDIN_FILENO) == nullptr ||
3094       info.GetFileActionForFD(STDOUT_FILENO) == nullptr ||
3095       info.GetFileActionForFD(STDERR_FILENO) == nullptr) {
3096     LLDB_LOG(log, "at least one of stdin/stdout/stderr was not set, evaluating "
3097                   "default handling");
3098 
3099     if (info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
3100       // Do nothing, if we are launching in a remote terminal no file actions
3101       // should be done at all.
3102       return;
3103     }
3104 
3105     if (info.GetFlags().Test(eLaunchFlagDisableSTDIO)) {
3106       LLDB_LOG(log, "eLaunchFlagDisableSTDIO set, adding suppression action "
3107                     "for stdin, stdout and stderr");
3108       info.AppendSuppressFileAction(STDIN_FILENO, true, false);
3109       info.AppendSuppressFileAction(STDOUT_FILENO, false, true);
3110       info.AppendSuppressFileAction(STDERR_FILENO, false, true);
3111     } else {
3112       // Check for any values that might have gotten set with any of: (lldb)
3113       // settings set target.input-path (lldb) settings set target.output-path
3114       // (lldb) settings set target.error-path
3115       FileSpec in_file_spec;
3116       FileSpec out_file_spec;
3117       FileSpec err_file_spec;
3118       // Only override with the target settings if we don't already have an
3119       // action for in, out or error
3120       if (info.GetFileActionForFD(STDIN_FILENO) == nullptr)
3121         in_file_spec = GetStandardInputPath();
3122       if (info.GetFileActionForFD(STDOUT_FILENO) == nullptr)
3123         out_file_spec = GetStandardOutputPath();
3124       if (info.GetFileActionForFD(STDERR_FILENO) == nullptr)
3125         err_file_spec = GetStandardErrorPath();
3126 
3127       LLDB_LOG(log, "target stdin='{0}', target stdout='{1}', stderr='{1}'",
3128                in_file_spec, out_file_spec, err_file_spec);
3129 
3130       if (in_file_spec) {
3131         info.AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false);
3132         LLDB_LOG(log, "appended stdin open file action for {0}", in_file_spec);
3133       }
3134 
3135       if (out_file_spec) {
3136         info.AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true);
3137         LLDB_LOG(log, "appended stdout open file action for {0}",
3138                  out_file_spec);
3139       }
3140 
3141       if (err_file_spec) {
3142         info.AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true);
3143         LLDB_LOG(log, "appended stderr open file action for {0}",
3144                  err_file_spec);
3145       }
3146 
3147       if (default_to_use_pty &&
3148           (!in_file_spec || !out_file_spec || !err_file_spec)) {
3149         llvm::Error Err = info.SetUpPtyRedirection();
3150         LLDB_LOG_ERROR(log, std::move(Err), "SetUpPtyRedirection failed: {0}");
3151       }
3152     }
3153   }
3154 }
3155 
3156 // Target::StopHook
3157 Target::StopHook::StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid)
3158     : UserID(uid), m_target_sp(target_sp), m_commands(), m_specifier_sp(),
3159       m_thread_spec_up() {}
3160 
3161 Target::StopHook::StopHook(const StopHook &rhs)
3162     : UserID(rhs.GetID()), m_target_sp(rhs.m_target_sp),
3163       m_commands(rhs.m_commands), m_specifier_sp(rhs.m_specifier_sp),
3164       m_thread_spec_up(), m_active(rhs.m_active),
3165       m_auto_continue(rhs.m_auto_continue) {
3166   if (rhs.m_thread_spec_up)
3167     m_thread_spec_up.reset(new ThreadSpec(*rhs.m_thread_spec_up));
3168 }
3169 
3170 Target::StopHook::~StopHook() = default;
3171 
3172 void Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) {
3173   m_specifier_sp.reset(specifier);
3174 }
3175 
3176 void Target::StopHook::SetThreadSpecifier(ThreadSpec *specifier) {
3177   m_thread_spec_up.reset(specifier);
3178 }
3179 
3180 void Target::StopHook::GetDescription(Stream *s,
3181                                       lldb::DescriptionLevel level) const {
3182   int indent_level = s->GetIndentLevel();
3183 
3184   s->SetIndentLevel(indent_level + 2);
3185 
3186   s->Printf("Hook: %" PRIu64 "\n", GetID());
3187   if (m_active)
3188     s->Indent("State: enabled\n");
3189   else
3190     s->Indent("State: disabled\n");
3191 
3192   if (m_auto_continue)
3193     s->Indent("AutoContinue on\n");
3194 
3195   if (m_specifier_sp) {
3196     s->Indent();
3197     s->PutCString("Specifier:\n");
3198     s->SetIndentLevel(indent_level + 4);
3199     m_specifier_sp->GetDescription(s, level);
3200     s->SetIndentLevel(indent_level + 2);
3201   }
3202 
3203   if (m_thread_spec_up) {
3204     StreamString tmp;
3205     s->Indent("Thread:\n");
3206     m_thread_spec_up->GetDescription(&tmp, level);
3207     s->SetIndentLevel(indent_level + 4);
3208     s->Indent(tmp.GetString());
3209     s->PutCString("\n");
3210     s->SetIndentLevel(indent_level + 2);
3211   }
3212 
3213   s->Indent("Commands: \n");
3214   s->SetIndentLevel(indent_level + 4);
3215   uint32_t num_commands = m_commands.GetSize();
3216   for (uint32_t i = 0; i < num_commands; i++) {
3217     s->Indent(m_commands.GetStringAtIndex(i));
3218     s->PutCString("\n");
3219   }
3220   s->SetIndentLevel(indent_level);
3221 }
3222 
3223 // class TargetProperties
3224 
3225 // clang-format off
3226 static constexpr OptionEnumValueElement g_dynamic_value_types[] = {
3227     {eNoDynamicValues, "no-dynamic-values",
3228      "Don't calculate the dynamic type of values"},
3229     {eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values "
3230                                          "even if you have to run the target."},
3231     {eDynamicDontRunTarget, "no-run-target",
3232      "Calculate the dynamic type of values, but don't run the target."} };
3233 
3234 OptionEnumValues lldb_private::GetDynamicValueTypes() {
3235   return OptionEnumValues(g_dynamic_value_types);
3236 }
3237 
3238 static constexpr OptionEnumValueElement g_inline_breakpoint_enums[] = {
3239     {eInlineBreakpointsNever, "never", "Never look for inline breakpoint "
3240                                        "locations (fastest). This setting "
3241                                        "should only be used if you know that "
3242                                        "no inlining occurs in your programs."},
3243     {eInlineBreakpointsHeaders, "headers",
3244      "Only check for inline breakpoint locations when setting breakpoints in "
3245      "header files, but not when setting breakpoint in implementation source "
3246      "files (default)."},
3247     {eInlineBreakpointsAlways, "always",
3248      "Always look for inline breakpoint locations when setting file and line "
3249      "breakpoints (slower but most accurate)."} };
3250 
3251 enum x86DisassemblyFlavor {
3252   eX86DisFlavorDefault,
3253   eX86DisFlavorIntel,
3254   eX86DisFlavorATT
3255 };
3256 
3257 static constexpr OptionEnumValueElement g_x86_dis_flavor_value_types[] = {
3258     {eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
3259     {eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
3260     {eX86DisFlavorATT, "att", "AT&T disassembler flavor."} };
3261 
3262 static constexpr OptionEnumValueElement g_hex_immediate_style_values[] = {
3263     {Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
3264     {Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."} };
3265 
3266 static constexpr OptionEnumValueElement g_load_script_from_sym_file_values[] = {
3267     {eLoadScriptFromSymFileTrue, "true",
3268      "Load debug scripts inside symbol files"},
3269     {eLoadScriptFromSymFileFalse, "false",
3270      "Do not load debug scripts inside symbol files."},
3271     {eLoadScriptFromSymFileWarn, "warn",
3272      "Warn about debug scripts inside symbol files but do not load them."} };
3273 
3274 static constexpr
3275 OptionEnumValueElement g_load_current_working_dir_lldbinit_values[] = {
3276     {eLoadCWDlldbinitTrue, "true",
3277      "Load .lldbinit files from current directory"},
3278     {eLoadCWDlldbinitFalse, "false",
3279      "Do not load .lldbinit files from current directory"},
3280     {eLoadCWDlldbinitWarn, "warn",
3281      "Warn about loading .lldbinit files from current directory"} };
3282 
3283 static constexpr OptionEnumValueElement g_memory_module_load_level_values[] = {
3284     {eMemoryModuleLoadLevelMinimal, "minimal",
3285      "Load minimal information when loading modules from memory. Currently "
3286      "this setting loads sections only."},
3287     {eMemoryModuleLoadLevelPartial, "partial",
3288      "Load partial information when loading modules from memory. Currently "
3289      "this setting loads sections and function bounds."},
3290     {eMemoryModuleLoadLevelComplete, "complete",
3291      "Load complete information when loading modules from memory. Currently "
3292      "this setting loads sections and all symbols."} };
3293 
3294 static constexpr PropertyDefinition g_properties[] = {
3295     {"default-arch", OptionValue::eTypeArch, true, 0, nullptr, {},
3296      "Default architecture to choose, when there's a choice."},
3297     {"move-to-nearest-code", OptionValue::eTypeBoolean, false, true, nullptr,
3298      {}, "Move breakpoints to nearest code."},
3299     {"language", OptionValue::eTypeLanguage, false, eLanguageTypeUnknown,
3300      nullptr, {},
3301      "The language to use when interpreting expressions entered in commands."},
3302     {"expr-prefix", OptionValue::eTypeFileSpec, false, 0, nullptr, {},
3303      "Path to a file containing expressions to be prepended to all "
3304      "expressions."},
3305     {"prefer-dynamic-value", OptionValue::eTypeEnum, false,
3306      eDynamicDontRunTarget, nullptr, OptionEnumValues(g_dynamic_value_types),
3307      "Should printed values be shown as their dynamic value."},
3308     {"enable-synthetic-value", OptionValue::eTypeBoolean, false, true, nullptr,
3309      {}, "Should synthetic values be used by default whenever available."},
3310     {"skip-prologue", OptionValue::eTypeBoolean, false, true, nullptr, {},
3311      "Skip function prologues when setting breakpoints by name."},
3312     {"source-map", OptionValue::eTypePathMap, false, 0, nullptr, {},
3313      "Source path remappings are used to track the change of location between "
3314      "a source file when built, and "
3315      "where it exists on the current system.  It consists of an array of "
3316      "duples, the first element of each duple is "
3317      "some part (starting at the root) of the path to the file when it was "
3318      "built, "
3319      "and the second is where the remainder of the original build hierarchy is "
3320      "rooted on the local system.  "
3321      "Each element of the array is checked in order and the first one that "
3322      "results in a match wins."},
3323     {"exec-search-paths", OptionValue::eTypeFileSpecList, false, 0, nullptr,
3324      {}, "Executable search paths to use when locating executable files "
3325          "whose paths don't match the local file system."},
3326     {"debug-file-search-paths", OptionValue::eTypeFileSpecList, false, 0,
3327      nullptr, {},
3328      "List of directories to be searched when locating debug symbol files. "
3329      "See also symbols.enable-external-lookup."},
3330     {"clang-module-search-paths", OptionValue::eTypeFileSpecList, false, 0,
3331      nullptr, {},
3332      "List of directories to be searched when locating modules for Clang."},
3333     {"auto-import-clang-modules", OptionValue::eTypeBoolean, false, true,
3334      nullptr, {},
3335      "Automatically load Clang modules referred to by the program."},
3336     {"import-std-module", OptionValue::eTypeBoolean, false, false,
3337      nullptr, {},
3338      "Import the C++ std module to improve debugging STL containers."},
3339     {"auto-apply-fixits", OptionValue::eTypeBoolean, false, true, nullptr,
3340      {}, "Automatically apply fix-it hints to expressions."},
3341     {"notify-about-fixits", OptionValue::eTypeBoolean, false, true, nullptr,
3342      {}, "Print the fixed expression text."},
3343     {"save-jit-objects", OptionValue::eTypeBoolean, false, false, nullptr,
3344      {}, "Save intermediate object files generated by the LLVM JIT"},
3345     {"max-children-count", OptionValue::eTypeSInt64, false, 256, nullptr,
3346      {}, "Maximum number of children to expand in any level of depth."},
3347     {"max-string-summary-length", OptionValue::eTypeSInt64, false, 1024,
3348      nullptr, {},
3349      "Maximum number of characters to show when using %s in summary strings."},
3350     {"max-memory-read-size", OptionValue::eTypeSInt64, false, 1024, nullptr,
3351      {}, "Maximum number of bytes that 'memory read' will fetch before "
3352          "--force must be specified."},
3353     {"breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean, false,
3354      true, nullptr, {}, "Consult the platform module avoid list when "
3355                         "setting non-module specific breakpoints."},
3356     {"arg0", OptionValue::eTypeString, false, 0, nullptr, {},
3357      "The first argument passed to the program in the argument array which can "
3358      "be different from the executable itself."},
3359     {"run-args", OptionValue::eTypeArgs, false, 0, nullptr, {},
3360      "A list containing all the arguments to be passed to the executable when "
3361      "it is run. Note that this does NOT include the argv[0] which is in "
3362      "target.arg0."},
3363     {"env-vars", OptionValue::eTypeDictionary, false, OptionValue::eTypeString,
3364      nullptr, {}, "A list of all the environment variables to be passed "
3365                   "to the executable's environment, and their values."},
3366     {"inherit-env", OptionValue::eTypeBoolean, false, true, nullptr, {},
3367      "Inherit the environment from the process that is running LLDB."},
3368     {"input-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {},
3369      "The file/path to be used by the executable program for reading its "
3370      "standard input."},
3371     {"output-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {},
3372      "The file/path to be used by the executable program for writing its "
3373      "standard output."},
3374     {"error-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {},
3375      "The file/path to be used by the executable program for writing its "
3376      "standard error."},
3377     {"detach-on-error", OptionValue::eTypeBoolean, false, true, nullptr,
3378      {}, "debugserver will detach (rather than killing) a process if it "
3379               "loses connection with lldb."},
3380     {"preload-symbols", OptionValue::eTypeBoolean, false, true, nullptr, {},
3381      "Enable loading of symbol tables before they are needed."},
3382     {"disable-aslr", OptionValue::eTypeBoolean, false, true, nullptr, {},
3383      "Disable Address Space Layout Randomization (ASLR)"},
3384     {"disable-stdio", OptionValue::eTypeBoolean, false, false, nullptr, {},
3385      "Disable stdin/stdout for process (e.g. for a GUI application)"},
3386     {"inline-breakpoint-strategy", OptionValue::eTypeEnum, false,
3387      eInlineBreakpointsAlways, nullptr,
3388      OptionEnumValues(g_inline_breakpoint_enums),
3389      "The strategy to use when settings breakpoints by file and line. "
3390      "Breakpoint locations can end up being inlined by the compiler, so that a "
3391      "compile unit 'a.c' might contain an inlined function from another source "
3392      "file. "
3393      "Usually this is limited to breakpoint locations from inlined functions "
3394      "from header or other include files, or more accurately "
3395      "non-implementation source files. "
3396      "Sometimes code might #include implementation files and cause inlined "
3397      "breakpoint locations in inlined implementation files. "
3398      "Always checking for inlined breakpoint locations can be expensive "
3399      "(memory and time), so if you have a project with many headers "
3400      "and find that setting breakpoints is slow, then you can change this "
3401      "setting to headers. "
3402      "This setting allows you to control exactly which strategy is used when "
3403      "setting "
3404      "file and line breakpoints."},
3405     // FIXME: This is the wrong way to do per-architecture settings, but we
3406     // don't have a general per architecture settings system in place yet.
3407     {"x86-disassembly-flavor", OptionValue::eTypeEnum, false,
3408      eX86DisFlavorDefault, nullptr,
3409      OptionEnumValues(g_x86_dis_flavor_value_types),
3410      "The default disassembly flavor to use for x86 or x86-64 targets."},
3411     {"use-hex-immediates", OptionValue::eTypeBoolean, false, true, nullptr,
3412      {}, "Show immediates in disassembly as hexadecimal."},
3413     {"hex-immediate-style", OptionValue::eTypeEnum, false,
3414      Disassembler::eHexStyleC, nullptr,
3415      OptionEnumValues(g_hex_immediate_style_values),
3416      "Which style to use for printing hexadecimal disassembly values."},
3417     {"use-fast-stepping", OptionValue::eTypeBoolean, false, true, nullptr,
3418      {}, "Use a fast stepping algorithm based on running from branch to "
3419          "branch rather than instruction single-stepping."},
3420     {"load-script-from-symbol-file", OptionValue::eTypeEnum, false,
3421      eLoadScriptFromSymFileWarn, nullptr,
3422      OptionEnumValues(g_load_script_from_sym_file_values),
3423      "Allow LLDB to load scripting resources embedded in symbol files when "
3424      "available."},
3425     {"load-cwd-lldbinit", OptionValue::eTypeEnum, false, eLoadCWDlldbinitWarn,
3426      nullptr, OptionEnumValues(g_load_current_working_dir_lldbinit_values),
3427      "Allow LLDB to .lldbinit files from the current directory automatically."},
3428     {"memory-module-load-level", OptionValue::eTypeEnum, false,
3429      eMemoryModuleLoadLevelComplete, nullptr,
3430      OptionEnumValues(g_memory_module_load_level_values),
3431      "Loading modules from memory can be slow as reading the symbol tables and "
3432      "other data can take a long time depending on your connection to the "
3433      "debug target. "
3434      "This setting helps users control how much information gets loaded when "
3435      "loading modules from memory."
3436      "'complete' is the default value for this setting which will load all "
3437      "sections and symbols by reading them from memory (slowest, most "
3438      "accurate). "
3439      "'partial' will load sections and attempt to find function bounds without "
3440      "downloading the symbol table (faster, still accurate, missing symbol "
3441      "names). "
3442      "'minimal' is the fastest setting and will load section data with no "
3443      "symbols, but should rarely be used as stack frames in these memory "
3444      "regions will be inaccurate and not provide any context (fastest). "},
3445     {"display-expression-in-crashlogs", OptionValue::eTypeBoolean, false, false,
3446      nullptr, {}, "Expressions that crash will show up in crash logs if "
3447                   "the host system supports executable specific crash log "
3448                   "strings and this setting is set to true."},
3449     {"trap-handler-names", OptionValue::eTypeArray, true,
3450      OptionValue::eTypeString, nullptr, {},
3451      "A list of trap handler function names, e.g. a common Unix user process "
3452      "one is _sigtramp."},
3453     {"display-runtime-support-values", OptionValue::eTypeBoolean, false, false,
3454      nullptr, {}, "If true, LLDB will show variables that are meant to "
3455                   "support the operation of a language's runtime support."},
3456     {"display-recognized-arguments", OptionValue::eTypeBoolean, false, false,
3457      nullptr, {}, "Show recognized arguments in variable listings by default."},
3458     {"non-stop-mode", OptionValue::eTypeBoolean, false, 0, nullptr, {},
3459      "Disable lock-step debugging, instead control threads independently."},
3460     {"require-hardware-breakpoint", OptionValue::eTypeBoolean, false, 0,
3461      nullptr, {}, "Require all breakpoints to be hardware breakpoints."}};
3462 // clang-format on
3463 
3464 enum {
3465   ePropertyDefaultArch,
3466   ePropertyMoveToNearestCode,
3467   ePropertyLanguage,
3468   ePropertyExprPrefix,
3469   ePropertyPreferDynamic,
3470   ePropertyEnableSynthetic,
3471   ePropertySkipPrologue,
3472   ePropertySourceMap,
3473   ePropertyExecutableSearchPaths,
3474   ePropertyDebugFileSearchPaths,
3475   ePropertyClangModuleSearchPaths,
3476   ePropertyAutoImportClangModules,
3477   ePropertyImportStdModule,
3478   ePropertyAutoApplyFixIts,
3479   ePropertyNotifyAboutFixIts,
3480   ePropertySaveObjects,
3481   ePropertyMaxChildrenCount,
3482   ePropertyMaxSummaryLength,
3483   ePropertyMaxMemReadSize,
3484   ePropertyBreakpointUseAvoidList,
3485   ePropertyArg0,
3486   ePropertyRunArgs,
3487   ePropertyEnvVars,
3488   ePropertyInheritEnv,
3489   ePropertyInputPath,
3490   ePropertyOutputPath,
3491   ePropertyErrorPath,
3492   ePropertyDetachOnError,
3493   ePropertyPreloadSymbols,
3494   ePropertyDisableASLR,
3495   ePropertyDisableSTDIO,
3496   ePropertyInlineStrategy,
3497   ePropertyDisassemblyFlavor,
3498   ePropertyUseHexImmediates,
3499   ePropertyHexImmediateStyle,
3500   ePropertyUseFastStepping,
3501   ePropertyLoadScriptFromSymbolFile,
3502   ePropertyLoadCWDlldbinitFile,
3503   ePropertyMemoryModuleLoadLevel,
3504   ePropertyDisplayExpressionsInCrashlogs,
3505   ePropertyTrapHandlerNames,
3506   ePropertyDisplayRuntimeSupportValues,
3507   ePropertyDisplayRecognizedArguments,
3508   ePropertyNonStopModeEnabled,
3509   ePropertyRequireHardwareBreakpoints,
3510   ePropertyExperimental,
3511 };
3512 
3513 class TargetOptionValueProperties : public OptionValueProperties {
3514 public:
3515   TargetOptionValueProperties(ConstString name)
3516       : OptionValueProperties(name), m_target(nullptr), m_got_host_env(false) {}
3517 
3518   // This constructor is used when creating TargetOptionValueProperties when it
3519   // is part of a new lldb_private::Target instance. It will copy all current
3520   // global property values as needed
3521   TargetOptionValueProperties(Target *target,
3522                               const TargetPropertiesSP &target_properties_sp)
3523       : OptionValueProperties(*target_properties_sp->GetValueProperties()),
3524         m_target(target), m_got_host_env(false) {}
3525 
3526   const Property *GetPropertyAtIndex(const ExecutionContext *exe_ctx,
3527                                      bool will_modify,
3528                                      uint32_t idx) const override {
3529     // When getting the value for a key from the target options, we will always
3530     // try and grab the setting from the current target if there is one. Else
3531     // we just use the one from this instance.
3532     if (idx == ePropertyEnvVars)
3533       GetHostEnvironmentIfNeeded();
3534 
3535     if (exe_ctx) {
3536       Target *target = exe_ctx->GetTargetPtr();
3537       if (target) {
3538         TargetOptionValueProperties *target_properties =
3539             static_cast<TargetOptionValueProperties *>(
3540                 target->GetValueProperties().get());
3541         if (this != target_properties)
3542           return target_properties->ProtectedGetPropertyAtIndex(idx);
3543       }
3544     }
3545     return ProtectedGetPropertyAtIndex(idx);
3546   }
3547 
3548   lldb::TargetSP GetTargetSP() { return m_target->shared_from_this(); }
3549 
3550 protected:
3551   void GetHostEnvironmentIfNeeded() const {
3552     if (!m_got_host_env) {
3553       if (m_target) {
3554         m_got_host_env = true;
3555         const uint32_t idx = ePropertyInheritEnv;
3556         if (GetPropertyAtIndexAsBoolean(
3557                 nullptr, idx, g_properties[idx].default_uint_value != 0)) {
3558           PlatformSP platform_sp(m_target->GetPlatform());
3559           if (platform_sp) {
3560             Environment env = platform_sp->GetEnvironment();
3561             OptionValueDictionary *env_dict =
3562                 GetPropertyAtIndexAsOptionValueDictionary(nullptr,
3563                                                           ePropertyEnvVars);
3564             if (env_dict) {
3565               const bool can_replace = false;
3566               for (const auto &KV : env) {
3567                 // Don't allow existing keys to be replaced with ones we get
3568                 // from the platform environment
3569                 env_dict->SetValueForKey(
3570                     ConstString(KV.first()),
3571                     OptionValueSP(new OptionValueString(KV.second.c_str())),
3572                     can_replace);
3573               }
3574             }
3575           }
3576         }
3577       }
3578     }
3579   }
3580   Target *m_target;
3581   mutable bool m_got_host_env;
3582 };
3583 
3584 // TargetProperties
3585 static constexpr PropertyDefinition g_experimental_properties[]{
3586     {"inject-local-vars", OptionValue::eTypeBoolean, true, true, nullptr,
3587      {},
3588      "If true, inject local variables explicitly into the expression text.  "
3589      "This will fix symbol resolution when there are name collisions between "
3590      "ivars and local variables.  "
3591      "But it can make expressions run much more slowly."},
3592     {"use-modern-type-lookup", OptionValue::eTypeBoolean, true, false, nullptr,
3593      {}, "If true, use Clang's modern type lookup infrastructure."}};
3594 
3595 enum { ePropertyInjectLocalVars = 0, ePropertyUseModernTypeLookup };
3596 
3597 class TargetExperimentalOptionValueProperties : public OptionValueProperties {
3598 public:
3599   TargetExperimentalOptionValueProperties()
3600       : OptionValueProperties(
3601             ConstString(Properties::GetExperimentalSettingsName())) {}
3602 };
3603 
3604 TargetExperimentalProperties::TargetExperimentalProperties()
3605     : Properties(OptionValuePropertiesSP(
3606           new TargetExperimentalOptionValueProperties())) {
3607   m_collection_sp->Initialize(g_experimental_properties);
3608 }
3609 
3610 // TargetProperties
3611 TargetProperties::TargetProperties(Target *target)
3612     : Properties(), m_launch_info() {
3613   if (target) {
3614     m_collection_sp = std::make_shared<TargetOptionValueProperties>(
3615         target, Target::GetGlobalProperties());
3616 
3617     // Set callbacks to update launch_info whenever "settins set" updated any
3618     // of these properties
3619     m_collection_sp->SetValueChangedCallback(
3620         ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3621     m_collection_sp->SetValueChangedCallback(
3622         ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3623     m_collection_sp->SetValueChangedCallback(
3624         ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3625     m_collection_sp->SetValueChangedCallback(
3626         ePropertyInputPath, TargetProperties::InputPathValueChangedCallback,
3627         this);
3628     m_collection_sp->SetValueChangedCallback(
3629         ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback,
3630         this);
3631     m_collection_sp->SetValueChangedCallback(
3632         ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback,
3633         this);
3634     m_collection_sp->SetValueChangedCallback(
3635         ePropertyDetachOnError,
3636         TargetProperties::DetachOnErrorValueChangedCallback, this);
3637     m_collection_sp->SetValueChangedCallback(
3638         ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback,
3639         this);
3640     m_collection_sp->SetValueChangedCallback(
3641         ePropertyDisableSTDIO,
3642         TargetProperties::DisableSTDIOValueChangedCallback, this);
3643 
3644     m_experimental_properties_up.reset(new TargetExperimentalProperties());
3645     m_collection_sp->AppendProperty(
3646         ConstString(Properties::GetExperimentalSettingsName()),
3647         ConstString("Experimental settings - setting these won't produce "
3648                     "errors if the setting is not present."),
3649         true, m_experimental_properties_up->GetValueProperties());
3650 
3651     // Update m_launch_info once it was created
3652     Arg0ValueChangedCallback(this, nullptr);
3653     RunArgsValueChangedCallback(this, nullptr);
3654     // EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in
3655     // Target::GetPlatform()
3656     InputPathValueChangedCallback(this, nullptr);
3657     OutputPathValueChangedCallback(this, nullptr);
3658     ErrorPathValueChangedCallback(this, nullptr);
3659     DetachOnErrorValueChangedCallback(this, nullptr);
3660     DisableASLRValueChangedCallback(this, nullptr);
3661     DisableSTDIOValueChangedCallback(this, nullptr);
3662   } else {
3663     m_collection_sp =
3664         std::make_shared<TargetOptionValueProperties>(ConstString("target"));
3665     m_collection_sp->Initialize(g_properties);
3666     m_experimental_properties_up.reset(new TargetExperimentalProperties());
3667     m_collection_sp->AppendProperty(
3668         ConstString(Properties::GetExperimentalSettingsName()),
3669         ConstString("Experimental settings - setting these won't produce "
3670                     "errors if the setting is not present."),
3671         true, m_experimental_properties_up->GetValueProperties());
3672     m_collection_sp->AppendProperty(
3673         ConstString("process"), ConstString("Settings specific to processes."),
3674         true, Process::GetGlobalProperties()->GetValueProperties());
3675   }
3676 }
3677 
3678 TargetProperties::~TargetProperties() = default;
3679 
3680 bool TargetProperties::GetInjectLocalVariables(
3681     ExecutionContext *exe_ctx) const {
3682   const Property *exp_property = m_collection_sp->GetPropertyAtIndex(
3683       exe_ctx, false, ePropertyExperimental);
3684   OptionValueProperties *exp_values =
3685       exp_property->GetValue()->GetAsProperties();
3686   if (exp_values)
3687     return exp_values->GetPropertyAtIndexAsBoolean(
3688         exe_ctx, ePropertyInjectLocalVars, true);
3689   else
3690     return true;
3691 }
3692 
3693 void TargetProperties::SetInjectLocalVariables(ExecutionContext *exe_ctx,
3694                                                bool b) {
3695   const Property *exp_property =
3696       m_collection_sp->GetPropertyAtIndex(exe_ctx, true, ePropertyExperimental);
3697   OptionValueProperties *exp_values =
3698       exp_property->GetValue()->GetAsProperties();
3699   if (exp_values)
3700     exp_values->SetPropertyAtIndexAsBoolean(exe_ctx, ePropertyInjectLocalVars,
3701                                             true);
3702 }
3703 
3704 bool TargetProperties::GetUseModernTypeLookup() const {
3705   const Property *exp_property = m_collection_sp->GetPropertyAtIndex(
3706       nullptr, false, ePropertyExperimental);
3707   OptionValueProperties *exp_values =
3708       exp_property->GetValue()->GetAsProperties();
3709   if (exp_values)
3710     return exp_values->GetPropertyAtIndexAsBoolean(
3711         nullptr, ePropertyUseModernTypeLookup, true);
3712   else
3713     return true;
3714 }
3715 
3716 ArchSpec TargetProperties::GetDefaultArchitecture() const {
3717   OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3718       nullptr, ePropertyDefaultArch);
3719   if (value)
3720     return value->GetCurrentValue();
3721   return ArchSpec();
3722 }
3723 
3724 void TargetProperties::SetDefaultArchitecture(const ArchSpec &arch) {
3725   OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3726       nullptr, ePropertyDefaultArch);
3727   if (value)
3728     return value->SetCurrentValue(arch, true);
3729 }
3730 
3731 bool TargetProperties::GetMoveToNearestCode() const {
3732   const uint32_t idx = ePropertyMoveToNearestCode;
3733   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3734       nullptr, idx, g_properties[idx].default_uint_value != 0);
3735 }
3736 
3737 lldb::DynamicValueType TargetProperties::GetPreferDynamicValue() const {
3738   const uint32_t idx = ePropertyPreferDynamic;
3739   return (lldb::DynamicValueType)
3740       m_collection_sp->GetPropertyAtIndexAsEnumeration(
3741           nullptr, idx, g_properties[idx].default_uint_value);
3742 }
3743 
3744 bool TargetProperties::SetPreferDynamicValue(lldb::DynamicValueType d) {
3745   const uint32_t idx = ePropertyPreferDynamic;
3746   return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d);
3747 }
3748 
3749 bool TargetProperties::GetPreloadSymbols() const {
3750   const uint32_t idx = ePropertyPreloadSymbols;
3751   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3752       nullptr, idx, g_properties[idx].default_uint_value != 0);
3753 }
3754 
3755 void TargetProperties::SetPreloadSymbols(bool b) {
3756   const uint32_t idx = ePropertyPreloadSymbols;
3757   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3758 }
3759 
3760 bool TargetProperties::GetDisableASLR() const {
3761   const uint32_t idx = ePropertyDisableASLR;
3762   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3763       nullptr, idx, g_properties[idx].default_uint_value != 0);
3764 }
3765 
3766 void TargetProperties::SetDisableASLR(bool b) {
3767   const uint32_t idx = ePropertyDisableASLR;
3768   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3769 }
3770 
3771 bool TargetProperties::GetDetachOnError() const {
3772   const uint32_t idx = ePropertyDetachOnError;
3773   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3774       nullptr, idx, g_properties[idx].default_uint_value != 0);
3775 }
3776 
3777 void TargetProperties::SetDetachOnError(bool b) {
3778   const uint32_t idx = ePropertyDetachOnError;
3779   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3780 }
3781 
3782 bool TargetProperties::GetDisableSTDIO() const {
3783   const uint32_t idx = ePropertyDisableSTDIO;
3784   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3785       nullptr, idx, g_properties[idx].default_uint_value != 0);
3786 }
3787 
3788 void TargetProperties::SetDisableSTDIO(bool b) {
3789   const uint32_t idx = ePropertyDisableSTDIO;
3790   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3791 }
3792 
3793 const char *TargetProperties::GetDisassemblyFlavor() const {
3794   const uint32_t idx = ePropertyDisassemblyFlavor;
3795   const char *return_value;
3796 
3797   x86DisassemblyFlavor flavor_value =
3798       (x86DisassemblyFlavor)m_collection_sp->GetPropertyAtIndexAsEnumeration(
3799           nullptr, idx, g_properties[idx].default_uint_value);
3800   return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3801   return return_value;
3802 }
3803 
3804 InlineStrategy TargetProperties::GetInlineStrategy() const {
3805   const uint32_t idx = ePropertyInlineStrategy;
3806   return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration(
3807       nullptr, idx, g_properties[idx].default_uint_value);
3808 }
3809 
3810 llvm::StringRef TargetProperties::GetArg0() const {
3811   const uint32_t idx = ePropertyArg0;
3812   return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx, llvm::StringRef());
3813 }
3814 
3815 void TargetProperties::SetArg0(llvm::StringRef arg) {
3816   const uint32_t idx = ePropertyArg0;
3817   m_collection_sp->SetPropertyAtIndexAsString(
3818       nullptr, idx, arg);
3819   m_launch_info.SetArg0(arg);
3820 }
3821 
3822 bool TargetProperties::GetRunArguments(Args &args) const {
3823   const uint32_t idx = ePropertyRunArgs;
3824   return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
3825 }
3826 
3827 void TargetProperties::SetRunArguments(const Args &args) {
3828   const uint32_t idx = ePropertyRunArgs;
3829   m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
3830   m_launch_info.GetArguments() = args;
3831 }
3832 
3833 Environment TargetProperties::GetEnvironment() const {
3834   // TODO: Get rid of the Args intermediate step
3835   Args env;
3836   const uint32_t idx = ePropertyEnvVars;
3837   m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env);
3838   return Environment(env);
3839 }
3840 
3841 void TargetProperties::SetEnvironment(Environment env) {
3842   // TODO: Get rid of the Args intermediate step
3843   const uint32_t idx = ePropertyEnvVars;
3844   m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, Args(env));
3845   m_launch_info.GetEnvironment() = std::move(env);
3846 }
3847 
3848 bool TargetProperties::GetSkipPrologue() const {
3849   const uint32_t idx = ePropertySkipPrologue;
3850   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3851       nullptr, idx, g_properties[idx].default_uint_value != 0);
3852 }
3853 
3854 PathMappingList &TargetProperties::GetSourcePathMap() const {
3855   const uint32_t idx = ePropertySourceMap;
3856   OptionValuePathMappings *option_value =
3857       m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr,
3858                                                                    false, idx);
3859   assert(option_value);
3860   return option_value->GetCurrentValue();
3861 }
3862 
3863 void TargetProperties::AppendExecutableSearchPaths(const FileSpec& dir) {
3864   const uint32_t idx = ePropertyExecutableSearchPaths;
3865   OptionValueFileSpecList *option_value =
3866       m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3867                                                                    false, idx);
3868   assert(option_value);
3869   option_value->AppendCurrentValue(dir);
3870 }
3871 
3872 FileSpecList TargetProperties::GetExecutableSearchPaths() {
3873   const uint32_t idx = ePropertyExecutableSearchPaths;
3874   const OptionValueFileSpecList *option_value =
3875       m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3876                                                                    false, idx);
3877   assert(option_value);
3878   return option_value->GetCurrentValue();
3879 }
3880 
3881 FileSpecList TargetProperties::GetDebugFileSearchPaths() {
3882   const uint32_t idx = ePropertyDebugFileSearchPaths;
3883   const OptionValueFileSpecList *option_value =
3884       m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3885                                                                    false, idx);
3886   assert(option_value);
3887   return option_value->GetCurrentValue();
3888 }
3889 
3890 FileSpecList TargetProperties::GetClangModuleSearchPaths() {
3891   const uint32_t idx = ePropertyClangModuleSearchPaths;
3892   const OptionValueFileSpecList *option_value =
3893       m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3894                                                                    false, idx);
3895   assert(option_value);
3896   return option_value->GetCurrentValue();
3897 }
3898 
3899 bool TargetProperties::GetEnableAutoImportClangModules() const {
3900   const uint32_t idx = ePropertyAutoImportClangModules;
3901   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3902       nullptr, idx, g_properties[idx].default_uint_value != 0);
3903 }
3904 
3905 bool TargetProperties::GetEnableImportStdModule() const {
3906   const uint32_t idx = ePropertyImportStdModule;
3907   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3908       nullptr, idx, g_properties[idx].default_uint_value != 0);
3909 }
3910 
3911 bool TargetProperties::GetEnableAutoApplyFixIts() const {
3912   const uint32_t idx = ePropertyAutoApplyFixIts;
3913   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3914       nullptr, idx, g_properties[idx].default_uint_value != 0);
3915 }
3916 
3917 bool TargetProperties::GetEnableNotifyAboutFixIts() const {
3918   const uint32_t idx = ePropertyNotifyAboutFixIts;
3919   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3920       nullptr, idx, g_properties[idx].default_uint_value != 0);
3921 }
3922 
3923 bool TargetProperties::GetEnableSaveObjects() const {
3924   const uint32_t idx = ePropertySaveObjects;
3925   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3926       nullptr, idx, g_properties[idx].default_uint_value != 0);
3927 }
3928 
3929 bool TargetProperties::GetEnableSyntheticValue() const {
3930   const uint32_t idx = ePropertyEnableSynthetic;
3931   return m_collection_sp->GetPropertyAtIndexAsBoolean(
3932       nullptr, idx, g_properties[idx].default_uint_value != 0);
3933 }
3934 
3935 uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const {
3936   const uint32_t idx = ePropertyMaxChildrenCount;
3937   return m_collection_sp->GetPropertyAtIndexAsSInt64(
3938       nullptr, idx, g_properties[idx].default_uint_value);
3939 }
3940 
3941 uint32_t TargetProperties::GetMaximumSizeOfStringSummary() const {
3942   const uint32_t idx = ePropertyMaxSummaryLength;
3943   return m_collection_sp->GetPropertyAtIndexAsSInt64(
3944       nullptr, idx, g_properties[idx].default_uint_value);
3945 }
3946 
3947 uint32_t TargetProperties::GetMaximumMemReadSize() const {
3948   const uint32_t idx = ePropertyMaxMemReadSize;
3949   return m_collection_sp->GetPropertyAtIndexAsSInt64(
3950       nullptr, idx, g_properties[idx].default_uint_value);
3951 }
3952 
3953 FileSpec TargetProperties::GetStandardInputPath() const {
3954   const uint32_t idx = ePropertyInputPath;
3955   return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3956 }
3957 
3958 void TargetProperties::SetStandardInputPath(llvm::StringRef path) {
3959   const uint32_t idx = ePropertyInputPath;
3960   m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3961 }
3962 
3963 FileSpec TargetProperties::GetStandardOutputPath() const {
3964   const uint32_t idx = ePropertyOutputPath;
3965   return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3966 }
3967 
3968 void TargetProperties::SetStandardOutputPath(llvm::StringRef path) {
3969   const uint32_t idx = ePropertyOutputPath;
3970   m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3971 }
3972 
3973 FileSpec TargetProperties::GetStandardErrorPath() const {
3974   const uint32_t idx = ePropertyErrorPath;
3975   return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3976 }
3977 
3978 void TargetProperties::SetStandardErrorPath(llvm::StringRef path) {
3979   const uint32_t idx = ePropertyErrorPath;
3980   m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3981 }
3982 
3983 LanguageType TargetProperties::GetLanguage() const {
3984   OptionValueLanguage *value =
3985       m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage(
3986           nullptr, ePropertyLanguage);
3987   if (value)
3988     return value->GetCurrentValue();
3989   return LanguageType();
3990 }
3991 
3992 llvm::StringRef TargetProperties::GetExpressionPrefixContents() {
3993   const uint32_t idx = ePropertyExprPrefix;
3994   OptionValueFileSpec *file =
3995       m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false,
3996                                                                idx);
3997   if (file) {
3998     DataBufferSP data_sp(file->GetFileContents());
3999     if (data_sp)
4000       return llvm::StringRef(
4001           reinterpret_cast<const char *>(data_sp->GetBytes()),
4002           data_sp->GetByteSize());
4003   }
4004   return "";
4005 }
4006 
4007 bool TargetProperties::GetBreakpointsConsultPlatformAvoidList() {
4008   const uint32_t idx = ePropertyBreakpointUseAvoidList;
4009   return m_collection_sp->GetPropertyAtIndexAsBoolean(
4010       nullptr, idx, g_properties[idx].default_uint_value != 0);
4011 }
4012 
4013 bool TargetProperties::GetUseHexImmediates() const {
4014   const uint32_t idx = ePropertyUseHexImmediates;
4015   return m_collection_sp->GetPropertyAtIndexAsBoolean(
4016       nullptr, idx, g_properties[idx].default_uint_value != 0);
4017 }
4018 
4019 bool TargetProperties::GetUseFastStepping() const {
4020   const uint32_t idx = ePropertyUseFastStepping;
4021   return m_collection_sp->GetPropertyAtIndexAsBoolean(
4022       nullptr, idx, g_properties[idx].default_uint_value != 0);
4023 }
4024 
4025 bool TargetProperties::GetDisplayExpressionsInCrashlogs() const {
4026   const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
4027   return m_collection_sp->GetPropertyAtIndexAsBoolean(
4028       nullptr, idx, g_properties[idx].default_uint_value != 0);
4029 }
4030 
4031 LoadScriptFromSymFile TargetProperties::GetLoadScriptFromSymbolFile() const {
4032   const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
4033   return (LoadScriptFromSymFile)
4034       m_collection_sp->GetPropertyAtIndexAsEnumeration(
4035           nullptr, idx, g_properties[idx].default_uint_value);
4036 }
4037 
4038 LoadCWDlldbinitFile TargetProperties::GetLoadCWDlldbinitFile() const {
4039   const uint32_t idx = ePropertyLoadCWDlldbinitFile;
4040   return (LoadCWDlldbinitFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(
4041       nullptr, idx, g_properties[idx].default_uint_value);
4042 }
4043 
4044 Disassembler::HexImmediateStyle TargetProperties::GetHexImmediateStyle() const {
4045   const uint32_t idx = ePropertyHexImmediateStyle;
4046   return (Disassembler::HexImmediateStyle)
4047       m_collection_sp->GetPropertyAtIndexAsEnumeration(
4048           nullptr, idx, g_properties[idx].default_uint_value);
4049 }
4050 
4051 MemoryModuleLoadLevel TargetProperties::GetMemoryModuleLoadLevel() const {
4052   const uint32_t idx = ePropertyMemoryModuleLoadLevel;
4053   return (MemoryModuleLoadLevel)
4054       m_collection_sp->GetPropertyAtIndexAsEnumeration(
4055           nullptr, idx, g_properties[idx].default_uint_value);
4056 }
4057 
4058 bool TargetProperties::GetUserSpecifiedTrapHandlerNames(Args &args) const {
4059   const uint32_t idx = ePropertyTrapHandlerNames;
4060   return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
4061 }
4062 
4063 void TargetProperties::SetUserSpecifiedTrapHandlerNames(const Args &args) {
4064   const uint32_t idx = ePropertyTrapHandlerNames;
4065   m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
4066 }
4067 
4068 bool TargetProperties::GetDisplayRuntimeSupportValues() const {
4069   const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
4070   return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
4071 }
4072 
4073 void TargetProperties::SetDisplayRuntimeSupportValues(bool b) {
4074   const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
4075   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4076 }
4077 
4078 bool TargetProperties::GetDisplayRecognizedArguments() const {
4079   const uint32_t idx = ePropertyDisplayRecognizedArguments;
4080   return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
4081 }
4082 
4083 void TargetProperties::SetDisplayRecognizedArguments(bool b) {
4084   const uint32_t idx = ePropertyDisplayRecognizedArguments;
4085   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4086 }
4087 
4088 bool TargetProperties::GetNonStopModeEnabled() const {
4089   const uint32_t idx = ePropertyNonStopModeEnabled;
4090   return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
4091 }
4092 
4093 void TargetProperties::SetNonStopModeEnabled(bool b) {
4094   const uint32_t idx = ePropertyNonStopModeEnabled;
4095   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4096 }
4097 
4098 const ProcessLaunchInfo &TargetProperties::GetProcessLaunchInfo() {
4099   m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
4100   return m_launch_info;
4101 }
4102 
4103 void TargetProperties::SetProcessLaunchInfo(
4104     const ProcessLaunchInfo &launch_info) {
4105   m_launch_info = launch_info;
4106   SetArg0(launch_info.GetArg0());
4107   SetRunArguments(launch_info.GetArguments());
4108   SetEnvironment(launch_info.GetEnvironment());
4109   const FileAction *input_file_action =
4110       launch_info.GetFileActionForFD(STDIN_FILENO);
4111   if (input_file_action) {
4112     SetStandardInputPath(input_file_action->GetPath());
4113   }
4114   const FileAction *output_file_action =
4115       launch_info.GetFileActionForFD(STDOUT_FILENO);
4116   if (output_file_action) {
4117     SetStandardOutputPath(output_file_action->GetPath());
4118   }
4119   const FileAction *error_file_action =
4120       launch_info.GetFileActionForFD(STDERR_FILENO);
4121   if (error_file_action) {
4122     SetStandardErrorPath(error_file_action->GetPath());
4123   }
4124   SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
4125   SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
4126   SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
4127 }
4128 
4129 bool TargetProperties::GetRequireHardwareBreakpoints() const {
4130   const uint32_t idx = ePropertyRequireHardwareBreakpoints;
4131   return m_collection_sp->GetPropertyAtIndexAsBoolean(
4132       nullptr, idx, g_properties[idx].default_uint_value != 0);
4133 }
4134 
4135 void TargetProperties::SetRequireHardwareBreakpoints(bool b) {
4136   const uint32_t idx = ePropertyRequireHardwareBreakpoints;
4137   m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4138 }
4139 
4140 void TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr,
4141                                                 OptionValue *) {
4142   TargetProperties *this_ =
4143       reinterpret_cast<TargetProperties *>(target_property_ptr);
4144   this_->m_launch_info.SetArg0(this_->GetArg0());
4145 }
4146 
4147 void TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr,
4148                                                    OptionValue *) {
4149   TargetProperties *this_ =
4150       reinterpret_cast<TargetProperties *>(target_property_ptr);
4151   Args args;
4152   if (this_->GetRunArguments(args))
4153     this_->m_launch_info.GetArguments() = args;
4154 }
4155 
4156 void TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr,
4157                                                    OptionValue *) {
4158   TargetProperties *this_ =
4159       reinterpret_cast<TargetProperties *>(target_property_ptr);
4160   this_->m_launch_info.GetEnvironment() = this_->GetEnvironment();
4161 }
4162 
4163 void TargetProperties::InputPathValueChangedCallback(void *target_property_ptr,
4164                                                      OptionValue *) {
4165   TargetProperties *this_ =
4166       reinterpret_cast<TargetProperties *>(target_property_ptr);
4167   this_->m_launch_info.AppendOpenFileAction(
4168       STDIN_FILENO, this_->GetStandardInputPath(), true, false);
4169 }
4170 
4171 void TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr,
4172                                                       OptionValue *) {
4173   TargetProperties *this_ =
4174       reinterpret_cast<TargetProperties *>(target_property_ptr);
4175   this_->m_launch_info.AppendOpenFileAction(
4176       STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
4177 }
4178 
4179 void TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr,
4180                                                      OptionValue *) {
4181   TargetProperties *this_ =
4182       reinterpret_cast<TargetProperties *>(target_property_ptr);
4183   this_->m_launch_info.AppendOpenFileAction(
4184       STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
4185 }
4186 
4187 void TargetProperties::DetachOnErrorValueChangedCallback(
4188     void *target_property_ptr, OptionValue *) {
4189   TargetProperties *this_ =
4190       reinterpret_cast<TargetProperties *>(target_property_ptr);
4191   if (this_->GetDetachOnError())
4192     this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4193   else
4194     this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
4195 }
4196 
4197 void TargetProperties::DisableASLRValueChangedCallback(
4198     void *target_property_ptr, OptionValue *) {
4199   TargetProperties *this_ =
4200       reinterpret_cast<TargetProperties *>(target_property_ptr);
4201   if (this_->GetDisableASLR())
4202     this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4203   else
4204     this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
4205 }
4206 
4207 void TargetProperties::DisableSTDIOValueChangedCallback(
4208     void *target_property_ptr, OptionValue *) {
4209   TargetProperties *this_ =
4210       reinterpret_cast<TargetProperties *>(target_property_ptr);
4211   if (this_->GetDisableSTDIO())
4212     this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4213   else
4214     this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
4215 }
4216 
4217 // Target::TargetEventData
4218 
4219 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp)
4220     : EventData(), m_target_sp(target_sp), m_module_list() {}
4221 
4222 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp,
4223                                          const ModuleList &module_list)
4224     : EventData(), m_target_sp(target_sp), m_module_list(module_list) {}
4225 
4226 Target::TargetEventData::~TargetEventData() = default;
4227 
4228 ConstString Target::TargetEventData::GetFlavorString() {
4229   static ConstString g_flavor("Target::TargetEventData");
4230   return g_flavor;
4231 }
4232 
4233 void Target::TargetEventData::Dump(Stream *s) const {
4234   for (size_t i = 0; i < m_module_list.GetSize(); ++i) {
4235     if (i != 0)
4236       *s << ", ";
4237     m_module_list.GetModuleAtIndex(i)->GetDescription(
4238         s, lldb::eDescriptionLevelBrief);
4239   }
4240 }
4241 
4242 const Target::TargetEventData *
4243 Target::TargetEventData::GetEventDataFromEvent(const Event *event_ptr) {
4244   if (event_ptr) {
4245     const EventData *event_data = event_ptr->GetData();
4246     if (event_data &&
4247         event_data->GetFlavor() == TargetEventData::GetFlavorString())
4248       return static_cast<const TargetEventData *>(event_ptr->GetData());
4249   }
4250   return nullptr;
4251 }
4252 
4253 TargetSP Target::TargetEventData::GetTargetFromEvent(const Event *event_ptr) {
4254   TargetSP target_sp;
4255   const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4256   if (event_data)
4257     target_sp = event_data->m_target_sp;
4258   return target_sp;
4259 }
4260 
4261 ModuleList
4262 Target::TargetEventData::GetModuleListFromEvent(const Event *event_ptr) {
4263   ModuleList module_list;
4264   const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4265   if (event_data)
4266     module_list = event_data->m_module_list;
4267   return module_list;
4268 }
4269