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