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