1 //===-- Target.cpp ----------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/lldb-python.h"
11 
12 #include "lldb/Target/Target.h"
13 
14 // C Includes
15 // C++ Includes
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/Breakpoint/BreakpointResolver.h"
19 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
20 #include "lldb/Breakpoint/BreakpointResolverFileLine.h"
21 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
22 #include "lldb/Breakpoint/BreakpointResolverName.h"
23 #include "lldb/Breakpoint/Watchpoint.h"
24 #include "lldb/Core/Debugger.h"
25 #include "lldb/Core/Event.h"
26 #include "lldb/Core/Log.h"
27 #include "lldb/Core/Module.h"
28 #include "lldb/Core/ModuleSpec.h"
29 #include "lldb/Core/Section.h"
30 #include "lldb/Core/SourceManager.h"
31 #include "lldb/Core/State.h"
32 #include "lldb/Core/StreamFile.h"
33 #include "lldb/Core/StreamString.h"
34 #include "lldb/Core/Timer.h"
35 #include "lldb/Core/ValueObject.h"
36 #include "lldb/Expression/ClangASTSource.h"
37 #include "lldb/Expression/ClangUserExpression.h"
38 #include "lldb/Host/Host.h"
39 #include "lldb/Interpreter/CommandInterpreter.h"
40 #include "lldb/Interpreter/CommandReturnObject.h"
41 #include "lldb/Interpreter/OptionGroupWatchpoint.h"
42 #include "lldb/Interpreter/OptionValues.h"
43 #include "lldb/Interpreter/Property.h"
44 #include "lldb/lldb-private-log.h"
45 #include "lldb/Symbol/ObjectFile.h"
46 #include "lldb/Target/Process.h"
47 #include "lldb/Target/SectionLoadList.h"
48 #include "lldb/Target/StackFrame.h"
49 #include "lldb/Target/SystemRuntime.h"
50 #include "lldb/Target/Thread.h"
51 #include "lldb/Target/ThreadSpec.h"
52 
53 using namespace lldb;
54 using namespace lldb_private;
55 
56 ConstString &
57 Target::GetStaticBroadcasterClass ()
58 {
59     static ConstString class_name ("lldb.target");
60     return class_name;
61 }
62 
63 //----------------------------------------------------------------------
64 // Target constructor
65 //----------------------------------------------------------------------
66 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) :
67     TargetProperties (this),
68     Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()),
69     ExecutionContextScope (),
70     m_debugger (debugger),
71     m_platform_sp (platform_sp),
72     m_mutex (Mutex::eMutexTypeRecursive),
73     m_arch (target_arch),
74     m_images (this),
75     m_section_load_history (),
76     m_breakpoint_list (false),
77     m_internal_breakpoint_list (true),
78     m_watchpoint_list (),
79     m_process_sp (),
80     m_search_filter_sp (),
81     m_image_search_paths (ImageSearchPathsChanged, this),
82     m_scratch_ast_context_ap (),
83     m_scratch_ast_source_ap (),
84     m_ast_importer_ap (),
85     m_persistent_variables (),
86     m_source_manager_ap(),
87     m_stop_hooks (),
88     m_stop_hook_next_id (0),
89     m_valid (true),
90     m_suppress_stop_hooks (false)
91 {
92     SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
93     SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
94     SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
95     SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed");
96     SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded");
97 
98     CheckInWithManager();
99 
100     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
101     if (log)
102         log->Printf ("%p Target::Target()", this);
103     if (m_arch.IsValid())
104     {
105         LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
106     }
107 }
108 
109 //----------------------------------------------------------------------
110 // Destructor
111 //----------------------------------------------------------------------
112 Target::~Target()
113 {
114     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
115     if (log)
116         log->Printf ("%p Target::~Target()", this);
117     DeleteCurrentProcess ();
118 }
119 
120 void
121 Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
122 {
123 //    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
124     if (description_level != lldb::eDescriptionLevelBrief)
125     {
126         s->Indent();
127         s->PutCString("Target\n");
128         s->IndentMore();
129             m_images.Dump(s);
130             m_breakpoint_list.Dump(s);
131             m_internal_breakpoint_list.Dump(s);
132         s->IndentLess();
133     }
134     else
135     {
136         Module *exe_module = GetExecutableModulePointer();
137         if (exe_module)
138             s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
139         else
140             s->PutCString ("No executable module.");
141     }
142 }
143 
144 void
145 Target::CleanupProcess ()
146 {
147     // Do any cleanup of the target we need to do between process instances.
148     // NB It is better to do this before destroying the process in case the
149     // clean up needs some help from the process.
150     m_breakpoint_list.ClearAllBreakpointSites();
151     m_internal_breakpoint_list.ClearAllBreakpointSites();
152     // Disable watchpoints just on the debugger side.
153     Mutex::Locker locker;
154     this->GetWatchpointList().GetListMutex(locker);
155     DisableAllWatchpoints(false);
156     ClearAllWatchpointHitCounts();
157 }
158 
159 void
160 Target::DeleteCurrentProcess ()
161 {
162     if (m_process_sp.get())
163     {
164         m_section_load_history.Clear();
165         if (m_process_sp->IsAlive())
166             m_process_sp->Destroy();
167 
168         m_process_sp->Finalize();
169 
170         CleanupProcess ();
171 
172         m_process_sp.reset();
173     }
174 }
175 
176 const lldb::ProcessSP &
177 Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file)
178 {
179     DeleteCurrentProcess ();
180     m_process_sp = Process::FindPlugin(*this, plugin_name, listener, crash_file);
181     return m_process_sp;
182 }
183 
184 const lldb::ProcessSP &
185 Target::GetProcessSP () const
186 {
187     return m_process_sp;
188 }
189 
190 void
191 Target::Destroy()
192 {
193     Mutex::Locker locker (m_mutex);
194     m_valid = false;
195     DeleteCurrentProcess ();
196     m_platform_sp.reset();
197     m_arch.Clear();
198     ClearModules(true);
199     m_section_load_history.Clear();
200     const bool notify = false;
201     m_breakpoint_list.RemoveAll(notify);
202     m_internal_breakpoint_list.RemoveAll(notify);
203     m_last_created_breakpoint.reset();
204     m_last_created_watchpoint.reset();
205     m_search_filter_sp.reset();
206     m_image_search_paths.Clear(notify);
207     m_persistent_variables.Clear();
208     m_stop_hooks.clear();
209     m_stop_hook_next_id = 0;
210     m_suppress_stop_hooks = false;
211 }
212 
213 
214 BreakpointList &
215 Target::GetBreakpointList(bool internal)
216 {
217     if (internal)
218         return m_internal_breakpoint_list;
219     else
220         return m_breakpoint_list;
221 }
222 
223 const BreakpointList &
224 Target::GetBreakpointList(bool internal) const
225 {
226     if (internal)
227         return m_internal_breakpoint_list;
228     else
229         return m_breakpoint_list;
230 }
231 
232 BreakpointSP
233 Target::GetBreakpointByID (break_id_t break_id)
234 {
235     BreakpointSP bp_sp;
236 
237     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
238         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
239     else
240         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
241 
242     return bp_sp;
243 }
244 
245 BreakpointSP
246 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
247                                      const FileSpecList *source_file_spec_list,
248                                      RegularExpression &source_regex,
249                                      bool internal,
250                                      bool hardware)
251 {
252     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
253     BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex));
254     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
255 }
256 
257 
258 BreakpointSP
259 Target::CreateBreakpoint (const FileSpecList *containingModules,
260                           const FileSpec &file,
261                           uint32_t line_no,
262                           LazyBool check_inlines,
263                           LazyBool skip_prologue,
264                           bool internal,
265                           bool hardware)
266 {
267     if (check_inlines == eLazyBoolCalculate)
268     {
269         const InlineStrategy inline_strategy = GetInlineStrategy();
270         switch (inline_strategy)
271         {
272             case eInlineBreakpointsNever:
273                 check_inlines = eLazyBoolNo;
274                 break;
275 
276             case eInlineBreakpointsHeaders:
277                 if (file.IsSourceImplementationFile())
278                     check_inlines = eLazyBoolNo;
279                 else
280                     check_inlines = eLazyBoolYes;
281                 break;
282 
283             case eInlineBreakpointsAlways:
284                 check_inlines = eLazyBoolYes;
285                 break;
286         }
287     }
288     SearchFilterSP filter_sp;
289     if (check_inlines == eLazyBoolNo)
290     {
291         // Not checking for inlines, we are looking only for matching compile units
292         FileSpecList compile_unit_list;
293         compile_unit_list.Append (file);
294         filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list);
295     }
296     else
297     {
298         filter_sp = GetSearchFilterForModuleList (containingModules);
299     }
300     if (skip_prologue == eLazyBoolCalculate)
301         skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
302 
303     BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL,
304                                                                      file,
305                                                                      line_no,
306                                                                      check_inlines,
307                                                                      skip_prologue));
308     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
309 }
310 
311 
312 BreakpointSP
313 Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware)
314 {
315     Address so_addr;
316     // Attempt to resolve our load address if possible, though it is ok if
317     // it doesn't resolve to section/offset.
318 
319     // Try and resolve as a load address if possible
320     GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
321     if (!so_addr.IsValid())
322     {
323         // The address didn't resolve, so just set this as an absolute address
324         so_addr.SetOffset (addr);
325     }
326     BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware));
327     return bp_sp;
328 }
329 
330 BreakpointSP
331 Target::CreateBreakpoint (Address &addr, bool internal, bool hardware)
332 {
333     SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
334     BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
335     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false);
336 }
337 
338 BreakpointSP
339 Target::CreateBreakpoint (const FileSpecList *containingModules,
340                           const FileSpecList *containingSourceFiles,
341                           const char *func_name,
342                           uint32_t func_name_type_mask,
343                           LazyBool skip_prologue,
344                           bool internal,
345                           bool hardware)
346 {
347     BreakpointSP bp_sp;
348     if (func_name)
349     {
350         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
351 
352         if (skip_prologue == eLazyBoolCalculate)
353             skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
354 
355         BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
356                                                                       func_name,
357                                                                       func_name_type_mask,
358                                                                       Breakpoint::Exact,
359                                                                       skip_prologue));
360         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
361     }
362     return bp_sp;
363 }
364 
365 lldb::BreakpointSP
366 Target::CreateBreakpoint (const FileSpecList *containingModules,
367                           const FileSpecList *containingSourceFiles,
368                           const std::vector<std::string> &func_names,
369                           uint32_t func_name_type_mask,
370                           LazyBool skip_prologue,
371                           bool internal,
372                           bool hardware)
373 {
374     BreakpointSP bp_sp;
375     size_t num_names = func_names.size();
376     if (num_names > 0)
377     {
378         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
379 
380         if (skip_prologue == eLazyBoolCalculate)
381             skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
382 
383         BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
384                                                                       func_names,
385                                                                       func_name_type_mask,
386                                                                       skip_prologue));
387         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
388     }
389     return bp_sp;
390 }
391 
392 BreakpointSP
393 Target::CreateBreakpoint (const FileSpecList *containingModules,
394                           const FileSpecList *containingSourceFiles,
395                           const char *func_names[],
396                           size_t num_names,
397                           uint32_t func_name_type_mask,
398                           LazyBool skip_prologue,
399                           bool internal,
400                           bool hardware)
401 {
402     BreakpointSP bp_sp;
403     if (num_names > 0)
404     {
405         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
406 
407         if (skip_prologue == eLazyBoolCalculate)
408             skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
409 
410         BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
411                                                                       func_names,
412                                                                       num_names,
413                                                                       func_name_type_mask,
414                                                                       skip_prologue));
415         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
416     }
417     return bp_sp;
418 }
419 
420 SearchFilterSP
421 Target::GetSearchFilterForModule (const FileSpec *containingModule)
422 {
423     SearchFilterSP filter_sp;
424     if (containingModule != NULL)
425     {
426         // TODO: We should look into sharing module based search filters
427         // across many breakpoints like we do for the simple target based one
428         filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
429     }
430     else
431     {
432         if (m_search_filter_sp.get() == NULL)
433             m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
434         filter_sp = m_search_filter_sp;
435     }
436     return filter_sp;
437 }
438 
439 SearchFilterSP
440 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
441 {
442     SearchFilterSP filter_sp;
443     if (containingModules && containingModules->GetSize() != 0)
444     {
445         // TODO: We should look into sharing module based search filters
446         // across many breakpoints like we do for the simple target based one
447         filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
448     }
449     else
450     {
451         if (m_search_filter_sp.get() == NULL)
452             m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
453         filter_sp = m_search_filter_sp;
454     }
455     return filter_sp;
456 }
457 
458 SearchFilterSP
459 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
460                                            const FileSpecList *containingSourceFiles)
461 {
462     if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
463         return GetSearchFilterForModuleList(containingModules);
464 
465     SearchFilterSP filter_sp;
466     if (containingModules == NULL)
467     {
468         // We could make a special "CU List only SearchFilter".  Better yet was if these could be composable,
469         // but that will take a little reworking.
470 
471         filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
472     }
473     else
474     {
475         filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
476     }
477     return filter_sp;
478 }
479 
480 BreakpointSP
481 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
482                                    const FileSpecList *containingSourceFiles,
483                                    RegularExpression &func_regex,
484                                    LazyBool skip_prologue,
485                                    bool internal,
486                                    bool hardware)
487 {
488     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
489     BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
490                                                                  func_regex,
491                                                                  skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
492 
493     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
494 }
495 
496 lldb::BreakpointSP
497 Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal)
498 {
499     return LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
500 }
501 
502 BreakpointSP
503 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
504 {
505     BreakpointSP bp_sp;
506     if (filter_sp && resolver_sp)
507     {
508         bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
509         resolver_sp->SetBreakpoint (bp_sp.get());
510 
511         if (internal)
512             m_internal_breakpoint_list.Add (bp_sp, false);
513         else
514             m_breakpoint_list.Add (bp_sp, true);
515 
516         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
517         if (log)
518         {
519             StreamString s;
520             bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
521             log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData());
522         }
523 
524         bp_sp->ResolveBreakpoint();
525     }
526 
527     if (!internal && bp_sp)
528     {
529         m_last_created_breakpoint = bp_sp;
530     }
531 
532     return bp_sp;
533 }
534 
535 bool
536 Target::ProcessIsValid()
537 {
538     return (m_process_sp && m_process_sp->IsAlive());
539 }
540 
541 static bool
542 CheckIfWatchpointsExhausted(Target *target, Error &error)
543 {
544     uint32_t num_supported_hardware_watchpoints;
545     Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
546     if (rc.Success())
547     {
548         uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
549         if (num_current_watchpoints >= num_supported_hardware_watchpoints)
550             error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
551                                            num_supported_hardware_watchpoints);
552     }
553     return false;
554 }
555 
556 // See also Watchpoint::SetWatchpointType(uint32_t type) and
557 // the OptionGroupWatchpoint::WatchType enum type.
558 WatchpointSP
559 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error)
560 {
561     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
562     if (log)
563         log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
564                     __FUNCTION__, addr, (uint64_t)size, kind);
565 
566     WatchpointSP wp_sp;
567     if (!ProcessIsValid())
568     {
569         error.SetErrorString("process is not alive");
570         return wp_sp;
571     }
572 
573     if (addr == LLDB_INVALID_ADDRESS || size == 0)
574     {
575         if (size == 0)
576             error.SetErrorString("cannot set a watchpoint with watch_size of 0");
577         else
578             error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
579         return wp_sp;
580     }
581 
582     if (!LLDB_WATCH_TYPE_IS_VALID(kind))
583     {
584         error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
585     }
586 
587     // Currently we only support one watchpoint per address, with total number
588     // of watchpoints limited by the hardware which the inferior is running on.
589 
590     // Grab the list mutex while doing operations.
591     const bool notify = false;   // Don't notify about all the state changes we do on creating the watchpoint.
592     Mutex::Locker locker;
593     this->GetWatchpointList().GetListMutex(locker);
594     WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
595     if (matched_sp)
596     {
597         size_t old_size = matched_sp->GetByteSize();
598         uint32_t old_type =
599             (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
600             (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
601         // Return the existing watchpoint if both size and type match.
602         if (size == old_size && kind == old_type)
603         {
604             wp_sp = matched_sp;
605             wp_sp->SetEnabled(false, notify);
606         }
607         else
608         {
609             // Nil the matched watchpoint; we will be creating a new one.
610             m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
611             m_watchpoint_list.Remove(matched_sp->GetID(), true);
612         }
613     }
614 
615     if (!wp_sp)
616     {
617         wp_sp.reset(new Watchpoint(*this, addr, size, type));
618         wp_sp->SetWatchpointType(kind, notify);
619         m_watchpoint_list.Add (wp_sp, true);
620     }
621 
622     error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
623     if (log)
624         log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
625                     __FUNCTION__,
626                     error.Success() ? "succeeded" : "failed",
627                     wp_sp->GetID());
628 
629     if (error.Fail())
630     {
631         // Enabling the watchpoint on the device side failed.
632         // Remove the said watchpoint from the list maintained by the target instance.
633         m_watchpoint_list.Remove (wp_sp->GetID(), true);
634         // See if we could provide more helpful error message.
635         if (!CheckIfWatchpointsExhausted(this, error))
636         {
637             if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
638                 error.SetErrorStringWithFormat("watch size of %zu is not supported", size);
639         }
640         wp_sp.reset();
641     }
642     else
643         m_last_created_watchpoint = wp_sp;
644     return wp_sp;
645 }
646 
647 void
648 Target::RemoveAllBreakpoints (bool internal_also)
649 {
650     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
651     if (log)
652         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
653 
654     m_breakpoint_list.RemoveAll (true);
655     if (internal_also)
656         m_internal_breakpoint_list.RemoveAll (false);
657 
658     m_last_created_breakpoint.reset();
659 }
660 
661 void
662 Target::DisableAllBreakpoints (bool internal_also)
663 {
664     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
665     if (log)
666         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
667 
668     m_breakpoint_list.SetEnabledAll (false);
669     if (internal_also)
670         m_internal_breakpoint_list.SetEnabledAll (false);
671 }
672 
673 void
674 Target::EnableAllBreakpoints (bool internal_also)
675 {
676     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
677     if (log)
678         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
679 
680     m_breakpoint_list.SetEnabledAll (true);
681     if (internal_also)
682         m_internal_breakpoint_list.SetEnabledAll (true);
683 }
684 
685 bool
686 Target::RemoveBreakpointByID (break_id_t break_id)
687 {
688     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
689     if (log)
690         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
691 
692     if (DisableBreakpointByID (break_id))
693     {
694         if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
695             m_internal_breakpoint_list.Remove(break_id, false);
696         else
697         {
698             if (m_last_created_breakpoint)
699             {
700                 if (m_last_created_breakpoint->GetID() == break_id)
701                     m_last_created_breakpoint.reset();
702             }
703             m_breakpoint_list.Remove(break_id, true);
704         }
705         return true;
706     }
707     return false;
708 }
709 
710 bool
711 Target::DisableBreakpointByID (break_id_t break_id)
712 {
713     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
714     if (log)
715         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
716 
717     BreakpointSP bp_sp;
718 
719     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
720         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
721     else
722         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
723     if (bp_sp)
724     {
725         bp_sp->SetEnabled (false);
726         return true;
727     }
728     return false;
729 }
730 
731 bool
732 Target::EnableBreakpointByID (break_id_t break_id)
733 {
734     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
735     if (log)
736         log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
737                      __FUNCTION__,
738                      break_id,
739                      LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
740 
741     BreakpointSP bp_sp;
742 
743     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
744         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
745     else
746         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
747 
748     if (bp_sp)
749     {
750         bp_sp->SetEnabled (true);
751         return true;
752     }
753     return false;
754 }
755 
756 // The flag 'end_to_end', default to true, signifies that the operation is
757 // performed end to end, for both the debugger and the debuggee.
758 
759 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
760 // to end operations.
761 bool
762 Target::RemoveAllWatchpoints (bool end_to_end)
763 {
764     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
765     if (log)
766         log->Printf ("Target::%s\n", __FUNCTION__);
767 
768     if (!end_to_end) {
769         m_watchpoint_list.RemoveAll(true);
770         return true;
771     }
772 
773     // Otherwise, it's an end to end operation.
774 
775     if (!ProcessIsValid())
776         return false;
777 
778     size_t num_watchpoints = m_watchpoint_list.GetSize();
779     for (size_t i = 0; i < num_watchpoints; ++i)
780     {
781         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
782         if (!wp_sp)
783             return false;
784 
785         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
786         if (rc.Fail())
787             return false;
788     }
789     m_watchpoint_list.RemoveAll (true);
790     m_last_created_watchpoint.reset();
791     return true; // Success!
792 }
793 
794 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
795 // end operations.
796 bool
797 Target::DisableAllWatchpoints (bool end_to_end)
798 {
799     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
800     if (log)
801         log->Printf ("Target::%s\n", __FUNCTION__);
802 
803     if (!end_to_end) {
804         m_watchpoint_list.SetEnabledAll(false);
805         return true;
806     }
807 
808     // Otherwise, it's an end to end operation.
809 
810     if (!ProcessIsValid())
811         return false;
812 
813     size_t num_watchpoints = m_watchpoint_list.GetSize();
814     for (size_t i = 0; i < num_watchpoints; ++i)
815     {
816         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
817         if (!wp_sp)
818             return false;
819 
820         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
821         if (rc.Fail())
822             return false;
823     }
824     return true; // Success!
825 }
826 
827 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
828 // end operations.
829 bool
830 Target::EnableAllWatchpoints (bool end_to_end)
831 {
832     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
833     if (log)
834         log->Printf ("Target::%s\n", __FUNCTION__);
835 
836     if (!end_to_end) {
837         m_watchpoint_list.SetEnabledAll(true);
838         return true;
839     }
840 
841     // Otherwise, it's an end to end operation.
842 
843     if (!ProcessIsValid())
844         return false;
845 
846     size_t num_watchpoints = m_watchpoint_list.GetSize();
847     for (size_t i = 0; i < num_watchpoints; ++i)
848     {
849         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
850         if (!wp_sp)
851             return false;
852 
853         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
854         if (rc.Fail())
855             return false;
856     }
857     return true; // Success!
858 }
859 
860 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
861 bool
862 Target::ClearAllWatchpointHitCounts ()
863 {
864     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
865     if (log)
866         log->Printf ("Target::%s\n", __FUNCTION__);
867 
868     size_t num_watchpoints = m_watchpoint_list.GetSize();
869     for (size_t i = 0; i < num_watchpoints; ++i)
870     {
871         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
872         if (!wp_sp)
873             return false;
874 
875         wp_sp->ResetHitCount();
876     }
877     return true; // Success!
878 }
879 
880 // Assumption: Caller holds the list mutex lock for m_watchpoint_list
881 // during these operations.
882 bool
883 Target::IgnoreAllWatchpoints (uint32_t ignore_count)
884 {
885     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
886     if (log)
887         log->Printf ("Target::%s\n", __FUNCTION__);
888 
889     if (!ProcessIsValid())
890         return false;
891 
892     size_t num_watchpoints = m_watchpoint_list.GetSize();
893     for (size_t i = 0; i < num_watchpoints; ++i)
894     {
895         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
896         if (!wp_sp)
897             return false;
898 
899         wp_sp->SetIgnoreCount(ignore_count);
900     }
901     return true; // Success!
902 }
903 
904 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
905 bool
906 Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
907 {
908     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
909     if (log)
910         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
911 
912     if (!ProcessIsValid())
913         return false;
914 
915     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
916     if (wp_sp)
917     {
918         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
919         if (rc.Success())
920             return true;
921 
922         // Else, fallthrough.
923     }
924     return false;
925 }
926 
927 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
928 bool
929 Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
930 {
931     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
932     if (log)
933         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
934 
935     if (!ProcessIsValid())
936         return false;
937 
938     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
939     if (wp_sp)
940     {
941         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
942         if (rc.Success())
943             return true;
944 
945         // Else, fallthrough.
946     }
947     return false;
948 }
949 
950 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
951 bool
952 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
953 {
954     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
955     if (log)
956         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
957 
958     WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
959     if (watch_to_remove_sp == m_last_created_watchpoint)
960         m_last_created_watchpoint.reset();
961 
962     if (DisableWatchpointByID (watch_id))
963     {
964         m_watchpoint_list.Remove(watch_id, true);
965         return true;
966     }
967     return false;
968 }
969 
970 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
971 bool
972 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
973 {
974     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
975     if (log)
976         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
977 
978     if (!ProcessIsValid())
979         return false;
980 
981     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
982     if (wp_sp)
983     {
984         wp_sp->SetIgnoreCount(ignore_count);
985         return true;
986     }
987     return false;
988 }
989 
990 ModuleSP
991 Target::GetExecutableModule ()
992 {
993     return m_images.GetModuleAtIndex(0);
994 }
995 
996 Module*
997 Target::GetExecutableModulePointer ()
998 {
999     return m_images.GetModulePointerAtIndex(0);
1000 }
1001 
1002 static void
1003 LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1004 {
1005     Error error;
1006     StreamString feedback_stream;
1007     if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
1008     {
1009         if (error.AsCString())
1010             target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
1011                                                            module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1012                                                            error.AsCString());
1013         if (feedback_stream.GetSize())
1014             target->GetDebugger().GetErrorFile()->Printf("%s\n",
1015                                                            feedback_stream.GetData());
1016     }
1017 }
1018 
1019 void
1020 Target::ClearModules(bool delete_locations)
1021 {
1022     ModulesDidUnload (m_images, delete_locations);
1023     m_section_load_history.Clear();
1024     m_images.Clear();
1025     m_scratch_ast_context_ap.reset();
1026     m_scratch_ast_source_ap.reset();
1027     m_ast_importer_ap.reset();
1028 }
1029 
1030 void
1031 Target::DidExec ()
1032 {
1033     // When a process exec's we need to know about it so we can do some cleanup.
1034     m_breakpoint_list.RemoveInvalidLocations(m_arch);
1035     m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1036 }
1037 
1038 void
1039 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1040 {
1041     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
1042     ClearModules(false);
1043 
1044     if (executable_sp.get())
1045     {
1046         Timer scoped_timer (__PRETTY_FUNCTION__,
1047                             "Target::SetExecutableModule (executable = '%s')",
1048                             executable_sp->GetFileSpec().GetPath().c_str());
1049 
1050         m_images.Append(executable_sp); // The first image is our exectuable file
1051 
1052         // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module.
1053         if (!m_arch.IsValid())
1054         {
1055             m_arch = executable_sp->GetArchitecture();
1056             if (log)
1057               log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1058         }
1059 
1060         FileSpecList dependent_files;
1061         ObjectFile *executable_objfile = executable_sp->GetObjectFile();
1062 
1063         if (executable_objfile && get_dependent_files)
1064         {
1065             executable_objfile->GetDependentModules(dependent_files);
1066             for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1067             {
1068                 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1069                 FileSpec platform_dependent_file_spec;
1070                 if (m_platform_sp)
1071                     m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
1072                 else
1073                     platform_dependent_file_spec = dependent_file_spec;
1074 
1075                 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1076                 ModuleSP image_module_sp(GetSharedModule (module_spec));
1077                 if (image_module_sp.get())
1078                 {
1079                     ObjectFile *objfile = image_module_sp->GetObjectFile();
1080                     if (objfile)
1081                         objfile->GetDependentModules(dependent_files);
1082                 }
1083             }
1084         }
1085     }
1086 }
1087 
1088 
1089 bool
1090 Target::SetArchitecture (const ArchSpec &arch_spec)
1091 {
1092     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
1093     if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid())
1094     {
1095         // If we haven't got a valid arch spec, or the architectures are
1096         // compatible, so just update the architecture. Architectures can be
1097         // equal, yet the triple OS and vendor might change, so we need to do
1098         // the assignment here just in case.
1099         m_arch = arch_spec;
1100         if (log)
1101             log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1102         return true;
1103     }
1104     else
1105     {
1106         // If we have an executable file, try to reset the executable to the desired architecture
1107         if (log)
1108           log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1109         m_arch = arch_spec;
1110         ModuleSP executable_sp = GetExecutableModule ();
1111 
1112         ClearModules(true);
1113         // Need to do something about unsetting breakpoints.
1114 
1115         if (executable_sp)
1116         {
1117             if (log)
1118               log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1119             ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec);
1120             Error error = ModuleList::GetSharedModule (module_spec,
1121                                                        executable_sp,
1122                                                        &GetExecutableSearchPaths(),
1123                                                        NULL,
1124                                                        NULL);
1125 
1126             if (!error.Fail() && executable_sp)
1127             {
1128                 SetExecutableModule (executable_sp, true);
1129                 return true;
1130             }
1131         }
1132     }
1133     return false;
1134 }
1135 
1136 void
1137 Target::WillClearList (const ModuleList& module_list)
1138 {
1139 }
1140 
1141 void
1142 Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
1143 {
1144     // A module is being added to this target for the first time
1145     ModuleList my_module_list;
1146     my_module_list.Append(module_sp);
1147     LoadScriptingResourceForModule(module_sp, this);
1148     ModulesDidLoad (my_module_list);
1149 }
1150 
1151 void
1152 Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
1153 {
1154     // A module is being added to this target for the first time
1155     ModuleList my_module_list;
1156     my_module_list.Append(module_sp);
1157     ModulesDidUnload (my_module_list, false);
1158 }
1159 
1160 void
1161 Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
1162 {
1163     // A module is replacing an already added module
1164     m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
1165 }
1166 
1167 void
1168 Target::ModulesDidLoad (ModuleList &module_list)
1169 {
1170     if (module_list.GetSize())
1171     {
1172         m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1173         if (m_process_sp)
1174         {
1175             SystemRuntime *sys_runtime = m_process_sp->GetSystemRuntime();
1176             if (sys_runtime)
1177             {
1178                 sys_runtime->ModulesDidLoad (module_list);
1179             }
1180         }
1181         // TODO: make event data that packages up the module_list
1182         BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
1183     }
1184 }
1185 
1186 void
1187 Target::SymbolsDidLoad (ModuleList &module_list)
1188 {
1189     if (module_list.GetSize())
1190     {
1191         if (m_process_sp)
1192         {
1193             LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1194             if (runtime)
1195             {
1196                 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1197                 objc_runtime->SymbolsDidLoad(module_list);
1198             }
1199         }
1200 
1201         m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1202         BroadcastEvent(eBroadcastBitSymbolsLoaded, NULL);
1203     }
1204 }
1205 
1206 void
1207 Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
1208 {
1209     if (module_list.GetSize())
1210     {
1211         m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
1212         // TODO: make event data that packages up the module_list
1213         BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
1214     }
1215 }
1216 
1217 bool
1218 Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_file_spec)
1219 {
1220     if (GetBreakpointsConsultPlatformAvoidList())
1221     {
1222         ModuleList matchingModules;
1223         ModuleSpec module_spec (module_file_spec);
1224         size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1225 
1226         // If there is more than one module for this file spec, only return true if ALL the modules are on the
1227         // black list.
1228         if (num_modules > 0)
1229         {
1230             for (size_t i  = 0; i < num_modules; i++)
1231             {
1232                 if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i)))
1233                     return false;
1234             }
1235             return true;
1236         }
1237     }
1238     return false;
1239 }
1240 
1241 bool
1242 Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp)
1243 {
1244     if (GetBreakpointsConsultPlatformAvoidList())
1245     {
1246         if (m_platform_sp)
1247             return m_platform_sp->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp);
1248     }
1249     return false;
1250 }
1251 
1252 size_t
1253 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1254 {
1255     SectionSP section_sp (addr.GetSection());
1256     if (section_sp)
1257     {
1258         // If the contents of this section are encrypted, the on-disk file is unusuable.  Read only from live memory.
1259         if (section_sp->IsEncrypted())
1260         {
1261             error.SetErrorString("section is encrypted");
1262             return 0;
1263         }
1264         ModuleSP module_sp (section_sp->GetModule());
1265         if (module_sp)
1266         {
1267             ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1268             if (objfile)
1269             {
1270                 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1271                                                               addr.GetOffset(),
1272                                                               dst,
1273                                                               dst_len);
1274                 if (bytes_read > 0)
1275                     return bytes_read;
1276                 else
1277                     error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1278             }
1279             else
1280                 error.SetErrorString("address isn't from a object file");
1281         }
1282         else
1283             error.SetErrorString("address isn't in a module");
1284     }
1285     else
1286         error.SetErrorString("address doesn't contain a section that points to a section in a object file");
1287 
1288     return 0;
1289 }
1290 
1291 size_t
1292 Target::ReadMemory (const Address& addr,
1293                     bool prefer_file_cache,
1294                     void *dst,
1295                     size_t dst_len,
1296                     Error &error,
1297                     lldb::addr_t *load_addr_ptr)
1298 {
1299     error.Clear();
1300 
1301     // if we end up reading this from process memory, we will fill this
1302     // with the actual load address
1303     if (load_addr_ptr)
1304         *load_addr_ptr = LLDB_INVALID_ADDRESS;
1305 
1306     size_t bytes_read = 0;
1307 
1308     addr_t load_addr = LLDB_INVALID_ADDRESS;
1309     addr_t file_addr = LLDB_INVALID_ADDRESS;
1310     Address resolved_addr;
1311     if (!addr.IsSectionOffset())
1312     {
1313         SectionLoadList &section_load_list = GetSectionLoadList();
1314         if (section_load_list.IsEmpty())
1315         {
1316             // No sections are loaded, so we must assume we are not running
1317             // yet and anything we are given is a file address.
1318             file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1319             m_images.ResolveFileAddress (file_addr, resolved_addr);
1320         }
1321         else
1322         {
1323             // We have at least one section loaded. This can be becuase
1324             // we have manually loaded some sections with "target modules load ..."
1325             // or because we have have a live process that has sections loaded
1326             // through the dynamic loader
1327             load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
1328             section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
1329         }
1330     }
1331     if (!resolved_addr.IsValid())
1332         resolved_addr = addr;
1333 
1334 
1335     if (prefer_file_cache)
1336     {
1337         bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1338         if (bytes_read > 0)
1339             return bytes_read;
1340     }
1341 
1342     if (ProcessIsValid())
1343     {
1344         if (load_addr == LLDB_INVALID_ADDRESS)
1345             load_addr = resolved_addr.GetLoadAddress (this);
1346 
1347         if (load_addr == LLDB_INVALID_ADDRESS)
1348         {
1349             ModuleSP addr_module_sp (resolved_addr.GetModule());
1350             if (addr_module_sp && addr_module_sp->GetFileSpec())
1351                 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
1352                                                addr_module_sp->GetFileSpec().GetFilename().AsCString(),
1353                                                resolved_addr.GetFileAddress(),
1354                                                addr_module_sp->GetFileSpec().GetFilename().AsCString());
1355             else
1356                 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
1357         }
1358         else
1359         {
1360             bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1361             if (bytes_read != dst_len)
1362             {
1363                 if (error.Success())
1364                 {
1365                     if (bytes_read == 0)
1366                         error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
1367                     else
1368                         error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1369                 }
1370             }
1371             if (bytes_read)
1372             {
1373                 if (load_addr_ptr)
1374                     *load_addr_ptr = load_addr;
1375                 return bytes_read;
1376             }
1377             // If the address is not section offset we have an address that
1378             // doesn't resolve to any address in any currently loaded shared
1379             // libaries and we failed to read memory so there isn't anything
1380             // more we can do. If it is section offset, we might be able to
1381             // read cached memory from the object file.
1382             if (!resolved_addr.IsSectionOffset())
1383                 return 0;
1384         }
1385     }
1386 
1387     if (!prefer_file_cache && resolved_addr.IsSectionOffset())
1388     {
1389         // If we didn't already try and read from the object file cache, then
1390         // try it after failing to read from the process.
1391         return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1392     }
1393     return 0;
1394 }
1395 
1396 size_t
1397 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1398 {
1399     char buf[256];
1400     out_str.clear();
1401     addr_t curr_addr = addr.GetLoadAddress(this);
1402     Address address(addr);
1403     while (1)
1404     {
1405         size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1406         if (length == 0)
1407             break;
1408         out_str.append(buf, length);
1409         // If we got "length - 1" bytes, we didn't get the whole C string, we
1410         // need to read some more characters
1411         if (length == sizeof(buf) - 1)
1412             curr_addr += length;
1413         else
1414             break;
1415         address = Address(curr_addr);
1416     }
1417     return out_str.size();
1418 }
1419 
1420 
1421 size_t
1422 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1423 {
1424     size_t total_cstr_len = 0;
1425     if (dst && dst_max_len)
1426     {
1427         result_error.Clear();
1428         // NULL out everything just to be safe
1429         memset (dst, 0, dst_max_len);
1430         Error error;
1431         addr_t curr_addr = addr.GetLoadAddress(this);
1432         Address address(addr);
1433         const size_t cache_line_size = 512;
1434         size_t bytes_left = dst_max_len - 1;
1435         char *curr_dst = dst;
1436 
1437         while (bytes_left > 0)
1438         {
1439             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1440             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1441             size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1442 
1443             if (bytes_read == 0)
1444             {
1445                 result_error = error;
1446                 dst[total_cstr_len] = '\0';
1447                 break;
1448             }
1449             const size_t len = strlen(curr_dst);
1450 
1451             total_cstr_len += len;
1452 
1453             if (len < bytes_to_read)
1454                 break;
1455 
1456             curr_dst += bytes_read;
1457             curr_addr += bytes_read;
1458             bytes_left -= bytes_read;
1459             address = Address(curr_addr);
1460         }
1461     }
1462     else
1463     {
1464         if (dst == NULL)
1465             result_error.SetErrorString("invalid arguments");
1466         else
1467             result_error.Clear();
1468     }
1469     return total_cstr_len;
1470 }
1471 
1472 size_t
1473 Target::ReadScalarIntegerFromMemory (const Address& addr,
1474                                      bool prefer_file_cache,
1475                                      uint32_t byte_size,
1476                                      bool is_signed,
1477                                      Scalar &scalar,
1478                                      Error &error)
1479 {
1480     uint64_t uval;
1481 
1482     if (byte_size <= sizeof(uval))
1483     {
1484         size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1485         if (bytes_read == byte_size)
1486         {
1487             DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
1488             lldb::offset_t offset = 0;
1489             if (byte_size <= 4)
1490                 scalar = data.GetMaxU32 (&offset, byte_size);
1491             else
1492                 scalar = data.GetMaxU64 (&offset, byte_size);
1493 
1494             if (is_signed)
1495                 scalar.SignExtend(byte_size * 8);
1496             return bytes_read;
1497         }
1498     }
1499     else
1500     {
1501         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1502     }
1503     return 0;
1504 }
1505 
1506 uint64_t
1507 Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1508                                        bool prefer_file_cache,
1509                                        size_t integer_byte_size,
1510                                        uint64_t fail_value,
1511                                        Error &error)
1512 {
1513     Scalar scalar;
1514     if (ReadScalarIntegerFromMemory (addr,
1515                                      prefer_file_cache,
1516                                      integer_byte_size,
1517                                      false,
1518                                      scalar,
1519                                      error))
1520         return scalar.ULongLong(fail_value);
1521     return fail_value;
1522 }
1523 
1524 bool
1525 Target::ReadPointerFromMemory (const Address& addr,
1526                                bool prefer_file_cache,
1527                                Error &error,
1528                                Address &pointer_addr)
1529 {
1530     Scalar scalar;
1531     if (ReadScalarIntegerFromMemory (addr,
1532                                      prefer_file_cache,
1533                                      m_arch.GetAddressByteSize(),
1534                                      false,
1535                                      scalar,
1536                                      error))
1537     {
1538         addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1539         if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1540         {
1541             SectionLoadList &section_load_list = GetSectionLoadList();
1542             if (section_load_list.IsEmpty())
1543             {
1544                 // No sections are loaded, so we must assume we are not running
1545                 // yet and anything we are given is a file address.
1546                 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1547             }
1548             else
1549             {
1550                 // We have at least one section loaded. This can be becuase
1551                 // we have manually loaded some sections with "target modules load ..."
1552                 // or because we have have a live process that has sections loaded
1553                 // through the dynamic loader
1554                 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
1555             }
1556             // We weren't able to resolve the pointer value, so just return
1557             // an address with no section
1558             if (!pointer_addr.IsValid())
1559                 pointer_addr.SetOffset (pointer_vm_addr);
1560             return true;
1561 
1562         }
1563     }
1564     return false;
1565 }
1566 
1567 ModuleSP
1568 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
1569 {
1570     ModuleSP module_sp;
1571 
1572     Error error;
1573 
1574     // First see if we already have this module in our module list.  If we do, then we're done, we don't need
1575     // to consult the shared modules list.  But only do this if we are passed a UUID.
1576 
1577     if (module_spec.GetUUID().IsValid())
1578         module_sp = m_images.FindFirstModule(module_spec);
1579 
1580     if (!module_sp)
1581     {
1582         ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1583         bool did_create_module = false;
1584 
1585         // If there are image search path entries, try to use them first to acquire a suitable image.
1586         if (m_image_search_paths.GetSize())
1587         {
1588             ModuleSpec transformed_spec (module_spec);
1589             if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1590             {
1591                 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1592                 error = ModuleList::GetSharedModule (transformed_spec,
1593                                                      module_sp,
1594                                                      &GetExecutableSearchPaths(),
1595                                                      &old_module_sp,
1596                                                      &did_create_module);
1597             }
1598         }
1599 
1600         if (!module_sp)
1601         {
1602             // If we have a UUID, we can check our global shared module list in case
1603             // we already have it. If we don't have a valid UUID, then we can't since
1604             // the path in "module_spec" will be a platform path, and we will need to
1605             // let the platform find that file. For example, we could be asking for
1606             // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1607             // the local copy of "/usr/lib/dyld" since our platform could be a remote
1608             // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1609             // cache.
1610             if (module_spec.GetUUID().IsValid())
1611             {
1612                 // We have a UUID, it is OK to check the global module list...
1613                 error = ModuleList::GetSharedModule (module_spec,
1614                                                      module_sp,
1615                                                      &GetExecutableSearchPaths(),
1616                                                      &old_module_sp,
1617                                                      &did_create_module);
1618             }
1619 
1620             if (!module_sp)
1621             {
1622                 // The platform is responsible for finding and caching an appropriate
1623                 // module in the shared module cache.
1624                 if (m_platform_sp)
1625                 {
1626                     FileSpec platform_file_spec;
1627                     error = m_platform_sp->GetSharedModule (module_spec,
1628                                                             module_sp,
1629                                                             &GetExecutableSearchPaths(),
1630                                                             &old_module_sp,
1631                                                             &did_create_module);
1632                 }
1633                 else
1634                 {
1635                     error.SetErrorString("no platform is currently set");
1636                 }
1637             }
1638         }
1639 
1640         // We found a module that wasn't in our target list.  Let's make sure that there wasn't an equivalent
1641         // module in the list already, and if there was, let's remove it.
1642         if (module_sp)
1643         {
1644             ObjectFile *objfile = module_sp->GetObjectFile();
1645             if (objfile)
1646             {
1647                 switch (objfile->GetType())
1648                 {
1649                     case ObjectFile::eTypeCoreFile:      /// A core file that has a checkpoint of a program's execution state
1650                     case ObjectFile::eTypeExecutable:    /// A normal executable
1651                     case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1652                     case ObjectFile::eTypeObjectFile:    /// An intermediate object file
1653                     case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1654                         break;
1655                     case ObjectFile::eTypeDebugInfo:     /// An object file that contains only debug information
1656                         if (error_ptr)
1657                             error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1658                         return ModuleSP();
1659                     case ObjectFile::eTypeStubLibrary:   /// A library that can be linked against but not used for execution
1660                         if (error_ptr)
1661                             error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1662                         return ModuleSP();
1663                     default:
1664                         if (error_ptr)
1665                             error_ptr->SetErrorString("unsupported file type, please specify an executable");
1666                         return ModuleSP();
1667                 }
1668                 // GetSharedModule is not guaranteed to find the old shared module, for instance
1669                 // in the common case where you pass in the UUID, it is only going to find the one
1670                 // module matching the UUID.  In fact, it has no good way to know what the "old module"
1671                 // relevant to this target is, since there might be many copies of a module with this file spec
1672                 // in various running debug sessions, but only one of them will belong to this target.
1673                 // So let's remove the UUID from the module list, and look in the target's module list.
1674                 // Only do this if there is SOMETHING else in the module spec...
1675                 if (!old_module_sp)
1676                 {
1677                     if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
1678                     {
1679                         ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1680                         module_spec_copy.GetUUID().Clear();
1681 
1682                         ModuleList found_modules;
1683                         size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1684                         if (num_found == 1)
1685                         {
1686                             old_module_sp = found_modules.GetModuleAtIndex(0);
1687                         }
1688                     }
1689                 }
1690 
1691                 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1692                 {
1693                     m_images.ReplaceModule(old_module_sp, module_sp);
1694                     Module *old_module_ptr = old_module_sp.get();
1695                     old_module_sp.reset();
1696                     ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1697                 }
1698                 else
1699                     m_images.Append(module_sp);
1700             }
1701         }
1702     }
1703     if (error_ptr)
1704         *error_ptr = error;
1705     return module_sp;
1706 }
1707 
1708 
1709 TargetSP
1710 Target::CalculateTarget ()
1711 {
1712     return shared_from_this();
1713 }
1714 
1715 ProcessSP
1716 Target::CalculateProcess ()
1717 {
1718     return ProcessSP();
1719 }
1720 
1721 ThreadSP
1722 Target::CalculateThread ()
1723 {
1724     return ThreadSP();
1725 }
1726 
1727 StackFrameSP
1728 Target::CalculateStackFrame ()
1729 {
1730     return StackFrameSP();
1731 }
1732 
1733 void
1734 Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
1735 {
1736     exe_ctx.Clear();
1737     exe_ctx.SetTargetPtr(this);
1738 }
1739 
1740 PathMappingList &
1741 Target::GetImageSearchPathList ()
1742 {
1743     return m_image_search_paths;
1744 }
1745 
1746 void
1747 Target::ImageSearchPathsChanged
1748 (
1749     const PathMappingList &path_list,
1750     void *baton
1751 )
1752 {
1753     Target *target = (Target *)baton;
1754     ModuleSP exe_module_sp (target->GetExecutableModule());
1755     if (exe_module_sp)
1756         target->SetExecutableModule (exe_module_sp, true);
1757 }
1758 
1759 ClangASTContext *
1760 Target::GetScratchClangASTContext(bool create_on_demand)
1761 {
1762     // Now see if we know the target triple, and if so, create our scratch AST context:
1763     if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
1764     {
1765         m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
1766         m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
1767         m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
1768         llvm::OwningPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
1769         m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
1770     }
1771     return m_scratch_ast_context_ap.get();
1772 }
1773 
1774 ClangASTImporter *
1775 Target::GetClangASTImporter()
1776 {
1777     ClangASTImporter *ast_importer = m_ast_importer_ap.get();
1778 
1779     if (!ast_importer)
1780     {
1781         ast_importer = new ClangASTImporter();
1782         m_ast_importer_ap.reset(ast_importer);
1783     }
1784 
1785     return ast_importer;
1786 }
1787 
1788 void
1789 Target::SettingsInitialize ()
1790 {
1791     Process::SettingsInitialize ();
1792 }
1793 
1794 void
1795 Target::SettingsTerminate ()
1796 {
1797     Process::SettingsTerminate ();
1798 }
1799 
1800 FileSpecList
1801 Target::GetDefaultExecutableSearchPaths ()
1802 {
1803     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1804     if (properties_sp)
1805         return properties_sp->GetExecutableSearchPaths();
1806     return FileSpecList();
1807 }
1808 
1809 FileSpecList
1810 Target::GetDefaultDebugFileSearchPaths ()
1811 {
1812     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1813     if (properties_sp)
1814         return properties_sp->GetDebugFileSearchPaths();
1815     return FileSpecList();
1816 }
1817 
1818 ArchSpec
1819 Target::GetDefaultArchitecture ()
1820 {
1821     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1822     if (properties_sp)
1823         return properties_sp->GetDefaultArchitecture();
1824     return ArchSpec();
1825 }
1826 
1827 void
1828 Target::SetDefaultArchitecture (const ArchSpec &arch)
1829 {
1830     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1831     if (properties_sp)
1832     {
1833         LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to  %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
1834         return properties_sp->SetDefaultArchitecture(arch);
1835     }
1836 }
1837 
1838 Target *
1839 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1840 {
1841     // The target can either exist in the "process" of ExecutionContext, or in
1842     // the "target_sp" member of SymbolContext. This accessor helper function
1843     // will get the target from one of these locations.
1844 
1845     Target *target = NULL;
1846     if (sc_ptr != NULL)
1847         target = sc_ptr->target_sp.get();
1848     if (target == NULL && exe_ctx_ptr)
1849         target = exe_ctx_ptr->GetTargetPtr();
1850     return target;
1851 }
1852 
1853 ExecutionResults
1854 Target::EvaluateExpression
1855 (
1856     const char *expr_cstr,
1857     StackFrame *frame,
1858     lldb::ValueObjectSP &result_valobj_sp,
1859     const EvaluateExpressionOptions& options
1860 )
1861 {
1862     result_valobj_sp.reset();
1863 
1864     ExecutionResults execution_results = eExecutionSetupError;
1865 
1866     if (expr_cstr == NULL || expr_cstr[0] == '\0')
1867         return execution_results;
1868 
1869     // We shouldn't run stop hooks in expressions.
1870     // Be sure to reset this if you return anywhere within this function.
1871     bool old_suppress_value = m_suppress_stop_hooks;
1872     m_suppress_stop_hooks = true;
1873 
1874     ExecutionContext exe_ctx;
1875 
1876     if (frame)
1877     {
1878         frame->CalculateExecutionContext(exe_ctx);
1879     }
1880     else if (m_process_sp)
1881     {
1882         m_process_sp->CalculateExecutionContext(exe_ctx);
1883     }
1884     else
1885     {
1886         CalculateExecutionContext(exe_ctx);
1887     }
1888 
1889     // Make sure we aren't just trying to see the value of a persistent
1890     // variable (something like "$0")
1891     lldb::ClangExpressionVariableSP persistent_var_sp;
1892     // Only check for persistent variables the expression starts with a '$'
1893     if (expr_cstr[0] == '$')
1894         persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr);
1895 
1896     if (persistent_var_sp)
1897     {
1898         result_valobj_sp = persistent_var_sp->GetValueObject ();
1899         execution_results = eExecutionCompleted;
1900     }
1901     else
1902     {
1903         const char *prefix = GetExpressionPrefixContentsAsCString();
1904         Error error;
1905         execution_results = ClangUserExpression::Evaluate (exe_ctx,
1906                                                            options,
1907                                                            expr_cstr,
1908                                                            prefix,
1909                                                            result_valobj_sp,
1910                                                            error);
1911     }
1912 
1913     m_suppress_stop_hooks = old_suppress_value;
1914 
1915     return execution_results;
1916 }
1917 
1918 lldb::addr_t
1919 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1920 {
1921     addr_t code_addr = load_addr;
1922     switch (m_arch.GetMachine())
1923     {
1924     case llvm::Triple::arm:
1925     case llvm::Triple::thumb:
1926         switch (addr_class)
1927         {
1928         case eAddressClassData:
1929         case eAddressClassDebug:
1930             return LLDB_INVALID_ADDRESS;
1931 
1932         case eAddressClassUnknown:
1933         case eAddressClassInvalid:
1934         case eAddressClassCode:
1935         case eAddressClassCodeAlternateISA:
1936         case eAddressClassRuntime:
1937             // Check if bit zero it no set?
1938             if ((code_addr & 1ull) == 0)
1939             {
1940                 // Bit zero isn't set, check if the address is a multiple of 2?
1941                 if (code_addr & 2ull)
1942                 {
1943                     // The address is a multiple of 2 so it must be thumb, set bit zero
1944                     code_addr |= 1ull;
1945                 }
1946                 else if (addr_class == eAddressClassCodeAlternateISA)
1947                 {
1948                     // We checked the address and the address claims to be the alternate ISA
1949                     // which means thumb, so set bit zero.
1950                     code_addr |= 1ull;
1951                 }
1952             }
1953             break;
1954         }
1955         break;
1956 
1957     default:
1958         break;
1959     }
1960     return code_addr;
1961 }
1962 
1963 lldb::addr_t
1964 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1965 {
1966     addr_t opcode_addr = load_addr;
1967     switch (m_arch.GetMachine())
1968     {
1969     case llvm::Triple::arm:
1970     case llvm::Triple::thumb:
1971         switch (addr_class)
1972         {
1973         case eAddressClassData:
1974         case eAddressClassDebug:
1975             return LLDB_INVALID_ADDRESS;
1976 
1977         case eAddressClassInvalid:
1978         case eAddressClassUnknown:
1979         case eAddressClassCode:
1980         case eAddressClassCodeAlternateISA:
1981         case eAddressClassRuntime:
1982             opcode_addr &= ~(1ull);
1983             break;
1984         }
1985         break;
1986 
1987     default:
1988         break;
1989     }
1990     return opcode_addr;
1991 }
1992 
1993 SourceManager &
1994 Target::GetSourceManager ()
1995 {
1996     if (m_source_manager_ap.get() == NULL)
1997         m_source_manager_ap.reset (new SourceManager(shared_from_this()));
1998     return *m_source_manager_ap;
1999 }
2000 
2001 
2002 Target::StopHookSP
2003 Target::CreateStopHook ()
2004 {
2005     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2006     Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2007     m_stop_hooks[new_uid] = stop_hook_sp;
2008     return stop_hook_sp;
2009 }
2010 
2011 bool
2012 Target::RemoveStopHookByID (lldb::user_id_t user_id)
2013 {
2014     size_t num_removed;
2015     num_removed = m_stop_hooks.erase (user_id);
2016     if (num_removed == 0)
2017         return false;
2018     else
2019         return true;
2020 }
2021 
2022 void
2023 Target::RemoveAllStopHooks ()
2024 {
2025     m_stop_hooks.clear();
2026 }
2027 
2028 Target::StopHookSP
2029 Target::GetStopHookByID (lldb::user_id_t user_id)
2030 {
2031     StopHookSP found_hook;
2032 
2033     StopHookCollection::iterator specified_hook_iter;
2034     specified_hook_iter = m_stop_hooks.find (user_id);
2035     if (specified_hook_iter != m_stop_hooks.end())
2036         found_hook = (*specified_hook_iter).second;
2037     return found_hook;
2038 }
2039 
2040 bool
2041 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2042 {
2043     StopHookCollection::iterator specified_hook_iter;
2044     specified_hook_iter = m_stop_hooks.find (user_id);
2045     if (specified_hook_iter == m_stop_hooks.end())
2046         return false;
2047 
2048     (*specified_hook_iter).second->SetIsActive (active_state);
2049     return true;
2050 }
2051 
2052 void
2053 Target::SetAllStopHooksActiveState (bool active_state)
2054 {
2055     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2056     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2057     {
2058         (*pos).second->SetIsActive (active_state);
2059     }
2060 }
2061 
2062 void
2063 Target::RunStopHooks ()
2064 {
2065     if (m_suppress_stop_hooks)
2066         return;
2067 
2068     if (!m_process_sp)
2069         return;
2070 
2071     // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2072     // since in that case we do not want to run the stop-hooks
2073     if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2074         return;
2075 
2076     if (m_stop_hooks.empty())
2077         return;
2078 
2079     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2080 
2081     // If there aren't any active stop hooks, don't bother either:
2082     bool any_active_hooks = false;
2083     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2084     {
2085         if ((*pos).second->IsActive())
2086         {
2087             any_active_hooks = true;
2088             break;
2089         }
2090     }
2091     if (!any_active_hooks)
2092         return;
2093 
2094     CommandReturnObject result;
2095 
2096     std::vector<ExecutionContext> exc_ctx_with_reasons;
2097     std::vector<SymbolContext> sym_ctx_with_reasons;
2098 
2099     ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2100     size_t num_threads = cur_threadlist.GetSize();
2101     for (size_t i = 0; i < num_threads; i++)
2102     {
2103         lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2104         if (cur_thread_sp->ThreadStoppedForAReason())
2105         {
2106             lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2107             exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2108             sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2109         }
2110     }
2111 
2112     // If no threads stopped for a reason, don't run the stop-hooks.
2113     size_t num_exe_ctx = exc_ctx_with_reasons.size();
2114     if (num_exe_ctx == 0)
2115         return;
2116 
2117     result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2118     result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
2119 
2120     bool keep_going = true;
2121     bool hooks_ran = false;
2122     bool print_hook_header;
2123     bool print_thread_header;
2124 
2125     if (num_exe_ctx == 1)
2126         print_thread_header = false;
2127     else
2128         print_thread_header = true;
2129 
2130     if (m_stop_hooks.size() == 1)
2131         print_hook_header = false;
2132     else
2133         print_hook_header = true;
2134 
2135     for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2136     {
2137         // result.Clear();
2138         StopHookSP cur_hook_sp = (*pos).second;
2139         if (!cur_hook_sp->IsActive())
2140             continue;
2141 
2142         bool any_thread_matched = false;
2143         for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2144         {
2145             if ((cur_hook_sp->GetSpecifier () == NULL
2146                   || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2147                 && (cur_hook_sp->GetThreadSpecifier() == NULL
2148                     || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
2149             {
2150                 if (!hooks_ran)
2151                 {
2152                     hooks_ran = true;
2153                 }
2154                 if (print_hook_header && !any_thread_matched)
2155                 {
2156                     const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2157                                        cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2158                                        NULL);
2159                     if (cmd)
2160                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
2161                     else
2162                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
2163                     any_thread_matched = true;
2164                 }
2165 
2166                 if (print_thread_header)
2167                     result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2168 
2169                 bool stop_on_continue = true;
2170                 bool stop_on_error = true;
2171                 bool echo_commands = false;
2172                 bool print_results = true;
2173                 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2174                                                                       &exc_ctx_with_reasons[i],
2175                                                                       stop_on_continue,
2176                                                                       stop_on_error,
2177                                                                       echo_commands,
2178                                                                       print_results,
2179                                                                       eLazyBoolNo,
2180                                                                       result);
2181 
2182                 // If the command started the target going again, we should bag out of
2183                 // running the stop hooks.
2184                 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2185                     (result.GetStatus() == eReturnStatusSuccessContinuingResult))
2186                 {
2187                     result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
2188                     keep_going = false;
2189                 }
2190             }
2191         }
2192     }
2193 
2194     result.GetImmediateOutputStream()->Flush();
2195     result.GetImmediateErrorStream()->Flush();
2196 }
2197 
2198 const TargetPropertiesSP &
2199 Target::GetGlobalProperties()
2200 {
2201     static TargetPropertiesSP g_settings_sp;
2202     if (!g_settings_sp)
2203     {
2204         g_settings_sp.reset (new TargetProperties (NULL));
2205     }
2206     return g_settings_sp;
2207 }
2208 
2209 Error
2210 Target::Install (ProcessLaunchInfo *launch_info)
2211 {
2212     Error error;
2213     PlatformSP platform_sp (GetPlatform());
2214     if (platform_sp)
2215     {
2216         if (platform_sp->IsRemote())
2217         {
2218             if (platform_sp->IsConnected())
2219             {
2220                 // Install all files that have an install path, and always install the
2221                 // main executable when connected to a remote platform
2222                 const ModuleList& modules = GetImages();
2223                 const size_t num_images = modules.GetSize();
2224                 for (size_t idx = 0; idx < num_images; ++idx)
2225                 {
2226                     const bool is_main_executable = idx == 0;
2227                     ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2228                     if (module_sp)
2229                     {
2230                         FileSpec local_file (module_sp->GetFileSpec());
2231                         if (local_file)
2232                         {
2233                             FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2234                             if (!remote_file)
2235                             {
2236                                 if (is_main_executable) // TODO: add setting for always installing main executable???
2237                                 {
2238                                     // Always install the main executable
2239                                     remote_file.GetDirectory() = platform_sp->GetWorkingDirectory();
2240                                     remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename();
2241                                 }
2242                             }
2243                             if (remote_file)
2244                             {
2245                                 error = platform_sp->Install(local_file, remote_file);
2246                                 if (error.Success())
2247                                 {
2248                                     module_sp->SetPlatformFileSpec(remote_file);
2249                                     if (is_main_executable)
2250                                     {
2251                                         if (launch_info)
2252                                             launch_info->SetExecutableFile(remote_file, false);
2253                                     }
2254                                 }
2255                                 else
2256                                     break;
2257                             }
2258                         }
2259                     }
2260                 }
2261             }
2262         }
2263     }
2264     return error;
2265 }
2266 
2267 bool
2268 Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2269 {
2270     return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2271 }
2272 
2273 bool
2274 Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2275 {
2276     const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2277     if (old_section_load_addr != new_section_load_addr)
2278     {
2279         uint32_t stop_id = 0;
2280         ProcessSP process_sp(GetProcessSP());
2281         if (process_sp)
2282             stop_id = process_sp->GetStopID();
2283         else
2284             stop_id = m_section_load_history.GetLastStopID();
2285         if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2286             return true; // Return true if the section load address was changed...
2287     }
2288     return false; // Return false to indicate nothing changed
2289 
2290 }
2291 
2292 bool
2293 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2294 {
2295     uint32_t stop_id = 0;
2296     ProcessSP process_sp(GetProcessSP());
2297     if (process_sp)
2298         stop_id = process_sp->GetStopID();
2299     else
2300         stop_id = m_section_load_history.GetLastStopID();
2301     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2302 }
2303 
2304 bool
2305 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2306 {
2307     uint32_t stop_id = 0;
2308     ProcessSP process_sp(GetProcessSP());
2309     if (process_sp)
2310         stop_id = process_sp->GetStopID();
2311     else
2312         stop_id = m_section_load_history.GetLastStopID();
2313     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2314 }
2315 
2316 void
2317 Target::ClearAllLoadedSections ()
2318 {
2319     m_section_load_history.Clear();
2320 }
2321 
2322 
2323 Error
2324 Target::Launch (Listener &listener, ProcessLaunchInfo &launch_info)
2325 {
2326     Error error;
2327 
2328     StateType state = eStateInvalid;
2329 
2330     // Scope to temporarily get the process state in case someone has manually
2331     // remotely connected already to a process and we can skip the platform
2332     // launching.
2333     {
2334         ProcessSP process_sp (GetProcessSP());
2335 
2336         if (process_sp)
2337             state = process_sp->GetState();
2338     }
2339 
2340     launch_info.GetFlags().Set (eLaunchFlagDebug);
2341 
2342     // Get the value of synchronous execution here.  If you wait till after you have started to
2343     // run, then you could have hit a breakpoint, whose command might switch the value, and
2344     // then you'll pick up that incorrect value.
2345     Debugger &debugger = GetDebugger();
2346     const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2347 
2348     PlatformSP platform_sp (GetPlatform());
2349 
2350     // Finalize the file actions, and if none were given, default to opening
2351     // up a pseudo terminal
2352     const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
2353     launch_info.FinalizeFileActions (this, default_to_use_pty);
2354 
2355     if (state == eStateConnected)
2356     {
2357         if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2358         {
2359             error.SetErrorString("can't launch in tty when launching through a remote connection");
2360             return error;
2361         }
2362     }
2363 
2364     if (!launch_info.GetArchitecture().IsValid())
2365         launch_info.GetArchitecture() = GetArchitecture();
2366 
2367     if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2368     {
2369         m_process_sp = GetPlatform()->DebugProcess (launch_info,
2370                                                     debugger,
2371                                                     this,
2372                                                     listener,
2373                                                     error);
2374     }
2375     else
2376     {
2377         if (state == eStateConnected)
2378         {
2379             assert(m_process_sp);
2380         }
2381         else
2382         {
2383             const char *plugin_name = launch_info.GetProcessPluginName();
2384             CreateProcess (listener, plugin_name, NULL);
2385         }
2386 
2387         if (m_process_sp)
2388             error = m_process_sp->Launch (launch_info);
2389     }
2390 
2391     if (!m_process_sp)
2392     {
2393         if (error.Success())
2394             error.SetErrorString("failed to launch or debug process");
2395         return error;
2396     }
2397 
2398     if (error.Success())
2399     {
2400         if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
2401         {
2402             ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
2403 
2404             StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get());
2405 
2406             if (state == eStateStopped)
2407             {
2408                 if (!synchronous_execution)
2409                     m_process_sp->RestoreProcessEvents ();
2410 
2411                 error = m_process_sp->PrivateResume();
2412 
2413                 if (error.Success())
2414                 {
2415                     if (synchronous_execution)
2416                     {
2417                         state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get());
2418                         const bool must_be_alive = false; // eStateExited is ok, so this must be false
2419                         if (!StateIsStoppedState(state, must_be_alive))
2420                         {
2421                             error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
2422                         }
2423                     }
2424                 }
2425                 else
2426                 {
2427                     Error error2;
2428                     error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
2429                     error = error2;
2430                 }
2431             }
2432             else
2433             {
2434                 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
2435             }
2436         }
2437         m_process_sp->RestoreProcessEvents ();
2438     }
2439     else
2440     {
2441         Error error2;
2442         error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
2443         error = error2;
2444     }
2445     return error;
2446 }
2447 //--------------------------------------------------------------
2448 // Target::StopHook
2449 //--------------------------------------------------------------
2450 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
2451         UserID (uid),
2452         m_target_sp (target_sp),
2453         m_commands (),
2454         m_specifier_sp (),
2455         m_thread_spec_ap(),
2456         m_active (true)
2457 {
2458 }
2459 
2460 Target::StopHook::StopHook (const StopHook &rhs) :
2461         UserID (rhs.GetID()),
2462         m_target_sp (rhs.m_target_sp),
2463         m_commands (rhs.m_commands),
2464         m_specifier_sp (rhs.m_specifier_sp),
2465         m_thread_spec_ap (),
2466         m_active (rhs.m_active)
2467 {
2468     if (rhs.m_thread_spec_ap.get() != NULL)
2469         m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
2470 }
2471 
2472 
2473 Target::StopHook::~StopHook ()
2474 {
2475 }
2476 
2477 void
2478 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
2479 {
2480     m_thread_spec_ap.reset (specifier);
2481 }
2482 
2483 
2484 void
2485 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
2486 {
2487     int indent_level = s->GetIndentLevel();
2488 
2489     s->SetIndentLevel(indent_level + 2);
2490 
2491     s->Printf ("Hook: %" PRIu64 "\n", GetID());
2492     if (m_active)
2493         s->Indent ("State: enabled\n");
2494     else
2495         s->Indent ("State: disabled\n");
2496 
2497     if (m_specifier_sp)
2498     {
2499         s->Indent();
2500         s->PutCString ("Specifier:\n");
2501         s->SetIndentLevel (indent_level + 4);
2502         m_specifier_sp->GetDescription (s, level);
2503         s->SetIndentLevel (indent_level + 2);
2504     }
2505 
2506     if (m_thread_spec_ap.get() != NULL)
2507     {
2508         StreamString tmp;
2509         s->Indent("Thread:\n");
2510         m_thread_spec_ap->GetDescription (&tmp, level);
2511         s->SetIndentLevel (indent_level + 4);
2512         s->Indent (tmp.GetData());
2513         s->PutCString ("\n");
2514         s->SetIndentLevel (indent_level + 2);
2515     }
2516 
2517     s->Indent ("Commands: \n");
2518     s->SetIndentLevel (indent_level + 4);
2519     uint32_t num_commands = m_commands.GetSize();
2520     for (uint32_t i = 0; i < num_commands; i++)
2521     {
2522         s->Indent(m_commands.GetStringAtIndex(i));
2523         s->PutCString ("\n");
2524     }
2525     s->SetIndentLevel (indent_level);
2526 }
2527 
2528 //--------------------------------------------------------------
2529 // class TargetProperties
2530 //--------------------------------------------------------------
2531 
2532 OptionEnumValueElement
2533 lldb_private::g_dynamic_value_types[] =
2534 {
2535     { eNoDynamicValues,      "no-dynamic-values", "Don't calculate the dynamic type of values"},
2536     { eDynamicCanRunTarget,  "run-target",        "Calculate the dynamic type of values even if you have to run the target."},
2537     { eDynamicDontRunTarget, "no-run-target",     "Calculate the dynamic type of values, but don't run the target."},
2538     { 0, NULL, NULL }
2539 };
2540 
2541 static OptionEnumValueElement
2542 g_inline_breakpoint_enums[] =
2543 {
2544     { eInlineBreakpointsNever,   "never",     "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."},
2545     { eInlineBreakpointsHeaders, "headers",   "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
2546     { eInlineBreakpointsAlways,  "always",    "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
2547     { 0, NULL, NULL }
2548 };
2549 
2550 typedef enum x86DisassemblyFlavor
2551 {
2552     eX86DisFlavorDefault,
2553     eX86DisFlavorIntel,
2554     eX86DisFlavorATT
2555 } x86DisassemblyFlavor;
2556 
2557 static OptionEnumValueElement
2558 g_x86_dis_flavor_value_types[] =
2559 {
2560     { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
2561     { eX86DisFlavorIntel,   "intel",   "Intel disassembler flavor."},
2562     { eX86DisFlavorATT,     "att",     "AT&T disassembler flavor."},
2563     { 0, NULL, NULL }
2564 };
2565 
2566 static OptionEnumValueElement
2567 g_hex_immediate_style_values[] =
2568 {
2569     { Disassembler::eHexStyleC,        "c",      "C-style (0xffff)."},
2570     { Disassembler::eHexStyleAsm,      "asm",    "Asm-style (0ffffh)."},
2571     { 0, NULL, NULL }
2572 };
2573 
2574 static OptionEnumValueElement
2575 g_load_script_from_sym_file_values[] =
2576 {
2577     { eLoadScriptFromSymFileTrue,    "true",    "Load debug scripts inside symbol files"},
2578     { eLoadScriptFromSymFileFalse,   "false",   "Do not load debug scripts inside symbol files."},
2579     { eLoadScriptFromSymFileWarn,    "warn",    "Warn about debug scripts inside symbol files but do not load them."},
2580     { 0, NULL, NULL }
2581 };
2582 
2583 
2584 static OptionEnumValueElement
2585 g_memory_module_load_level_values[] =
2586 {
2587     { eMemoryModuleLoadLevelMinimal,  "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
2588     { eMemoryModuleLoadLevelPartial,  "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
2589     { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
2590     { 0, NULL, NULL }
2591 };
2592 
2593 static PropertyDefinition
2594 g_properties[] =
2595 {
2596     { "default-arch"                       , OptionValue::eTypeArch      , true , 0                         , NULL, NULL, "Default architecture to choose, when there's a choice." },
2597     { "expr-prefix"                        , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." },
2598     { "prefer-dynamic-value"               , OptionValue::eTypeEnum      , false, eNoDynamicValues          , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
2599     { "enable-synthetic-value"             , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Should synthetic values be used by default whenever available." },
2600     { "skip-prologue"                      , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
2601     { "source-map"                         , OptionValue::eTypePathMap   , false, 0                         , NULL, NULL, "Source path remappings used to track the change of location between a source file when built, and "
2602       "where it exists on the current system.  It consists of an array of duples, the first element of each duple is "
2603       "some part (starting at the root) of the path to the file when it was built, "
2604       "and the second is where the remainder of the original build hierarchy is rooted on the local system.  "
2605       "Each element of the array is checked in order and the first one that results in a match wins." },
2606     { "exec-search-paths"                  , OptionValue::eTypeFileSpecList, false, 0                       , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." },
2607     { "debug-file-search-paths"            , OptionValue::eTypeFileSpecList, false, 0                       , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
2608     { "max-children-count"                 , OptionValue::eTypeSInt64    , false, 256                       , NULL, NULL, "Maximum number of children to expand in any level of depth." },
2609     { "max-string-summary-length"          , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." },
2610     { "max-memory-read-size"               , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
2611     { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." },
2612     { "arg0"                               , OptionValue::eTypeString    , false, 0                         , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." },
2613     { "run-args"                           , OptionValue::eTypeArgs      , false, 0                         , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." },
2614     { "env-vars"                           , OptionValue::eTypeDictionary, false, OptionValue::eTypeString  , NULL, NULL, "A list of all the environment variables to be passed to the executable's environment, and their values." },
2615     { "inherit-env"                        , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
2616     { "input-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
2617     { "output-path"                        , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
2618     { "error-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
2619     { "disable-aslr"                       , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
2620     { "disable-stdio"                      , OptionValue::eTypeBoolean   , false, false                     , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
2621     { "inline-breakpoint-strategy"         , OptionValue::eTypeEnum      , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
2622         "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. "
2623         "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
2624         "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
2625         "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the "
2626         "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings "
2627         "file and line breakpoints." },
2628     // FIXME: This is the wrong way to do per-architecture settings, but we don't have a general per architecture settings system in place yet.
2629     { "x86-disassembly-flavor"             , OptionValue::eTypeEnum      , false, eX86DisFlavorDefault,       NULL, g_x86_dis_flavor_value_types, "The default disassembly flavor to use for x86 or x86-64 targets." },
2630     { "use-hex-immediates"                 , OptionValue::eTypeBoolean   , false, true,                       NULL, NULL, "Show immediates in disassembly as hexadecimal." },
2631     { "hex-immediate-style"                , OptionValue::eTypeEnum   ,    false, Disassembler::eHexStyleC,   NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." },
2632     { "use-fast-stepping"                  , OptionValue::eTypeBoolean   , false, true,                       NULL, NULL, "Use a fast stepping algorithm based on running from branch to branch rather than instruction single-stepping." },
2633     { "load-script-from-symbol-file"       , OptionValue::eTypeEnum   ,    false, eLoadScriptFromSymFileWarn, NULL, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." },
2634     { "memory-module-load-level"           , OptionValue::eTypeEnum   ,    false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
2635         "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. "
2636         "This setting helps users control how much information gets loaded when loading modules from memory."
2637         "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
2638         "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
2639         "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " },
2640     { "display-expression-in-crashlogs"    , OptionValue::eTypeBoolean   , false, false,                      NULL, NULL, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." },
2641     { NULL                                 , OptionValue::eTypeInvalid   , false, 0                         , NULL, NULL, NULL }
2642 };
2643 enum
2644 {
2645     ePropertyDefaultArch,
2646     ePropertyExprPrefix,
2647     ePropertyPreferDynamic,
2648     ePropertyEnableSynthetic,
2649     ePropertySkipPrologue,
2650     ePropertySourceMap,
2651     ePropertyExecutableSearchPaths,
2652     ePropertyDebugFileSearchPaths,
2653     ePropertyMaxChildrenCount,
2654     ePropertyMaxSummaryLength,
2655     ePropertyMaxMemReadSize,
2656     ePropertyBreakpointUseAvoidList,
2657     ePropertyArg0,
2658     ePropertyRunArgs,
2659     ePropertyEnvVars,
2660     ePropertyInheritEnv,
2661     ePropertyInputPath,
2662     ePropertyOutputPath,
2663     ePropertyErrorPath,
2664     ePropertyDisableASLR,
2665     ePropertyDisableSTDIO,
2666     ePropertyInlineStrategy,
2667     ePropertyDisassemblyFlavor,
2668     ePropertyUseHexImmediates,
2669     ePropertyHexImmediateStyle,
2670     ePropertyUseFastStepping,
2671     ePropertyLoadScriptFromSymbolFile,
2672     ePropertyMemoryModuleLoadLevel,
2673     ePropertyDisplayExpressionsInCrashlogs
2674 };
2675 
2676 
2677 class TargetOptionValueProperties : public OptionValueProperties
2678 {
2679 public:
2680     TargetOptionValueProperties (const ConstString &name) :
2681         OptionValueProperties (name),
2682         m_target (NULL),
2683         m_got_host_env (false)
2684     {
2685     }
2686 
2687     // This constructor is used when creating TargetOptionValueProperties when it
2688     // is part of a new lldb_private::Target instance. It will copy all current
2689     // global property values as needed
2690     TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
2691         OptionValueProperties(*target_properties_sp->GetValueProperties()),
2692         m_target (target),
2693         m_got_host_env (false)
2694     {
2695     }
2696 
2697     virtual const Property *
2698     GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
2699     {
2700         // When gettings the value for a key from the target options, we will always
2701         // try and grab the setting from the current target if there is one. Else we just
2702         // use the one from this instance.
2703         if (idx == ePropertyEnvVars)
2704             GetHostEnvironmentIfNeeded ();
2705 
2706         if (exe_ctx)
2707         {
2708             Target *target = exe_ctx->GetTargetPtr();
2709             if (target)
2710             {
2711                 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
2712                 if (this != target_properties)
2713                     return target_properties->ProtectedGetPropertyAtIndex (idx);
2714             }
2715         }
2716         return ProtectedGetPropertyAtIndex (idx);
2717     }
2718 
2719     lldb::TargetSP
2720     GetTargetSP ()
2721     {
2722         return m_target->shared_from_this();
2723     }
2724 
2725 protected:
2726 
2727     void
2728     GetHostEnvironmentIfNeeded () const
2729     {
2730         if (!m_got_host_env)
2731         {
2732             if (m_target)
2733             {
2734                 m_got_host_env = true;
2735                 const uint32_t idx = ePropertyInheritEnv;
2736                 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
2737                 {
2738                     PlatformSP platform_sp (m_target->GetPlatform());
2739                     if (platform_sp)
2740                     {
2741                         StringList env;
2742                         if (platform_sp->GetEnvironment(env))
2743                         {
2744                             OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
2745                             if (env_dict)
2746                             {
2747                                 const bool can_replace = false;
2748                                 const size_t envc = env.GetSize();
2749                                 for (size_t idx=0; idx<envc; idx++)
2750                                 {
2751                                     const char *env_entry = env.GetStringAtIndex (idx);
2752                                     if (env_entry)
2753                                     {
2754                                         const char *equal_pos = ::strchr(env_entry, '=');
2755                                         ConstString key;
2756                                         // It is ok to have environment variables with no values
2757                                         const char *value = NULL;
2758                                         if (equal_pos)
2759                                         {
2760                                             key.SetCStringWithLength(env_entry, equal_pos - env_entry);
2761                                             if (equal_pos[1])
2762                                                 value = equal_pos + 1;
2763                                         }
2764                                         else
2765                                         {
2766                                             key.SetCString(env_entry);
2767                                         }
2768                                         // Don't allow existing keys to be replaced with ones we get from the platform environment
2769                                         env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
2770                                     }
2771                                 }
2772                             }
2773                         }
2774                     }
2775                 }
2776             }
2777         }
2778     }
2779     Target *m_target;
2780     mutable bool m_got_host_env;
2781 };
2782 
2783 //----------------------------------------------------------------------
2784 // TargetProperties
2785 //----------------------------------------------------------------------
2786 TargetProperties::TargetProperties (Target *target) :
2787     Properties ()
2788 {
2789     if (target)
2790     {
2791         m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
2792     }
2793     else
2794     {
2795         m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
2796         m_collection_sp->Initialize(g_properties);
2797         m_collection_sp->AppendProperty(ConstString("process"),
2798                                         ConstString("Settings specify to processes."),
2799                                         true,
2800                                         Process::GetGlobalProperties()->GetValueProperties());
2801     }
2802 }
2803 
2804 TargetProperties::~TargetProperties ()
2805 {
2806 }
2807 ArchSpec
2808 TargetProperties::GetDefaultArchitecture () const
2809 {
2810     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2811     if (value)
2812         return value->GetCurrentValue();
2813     return ArchSpec();
2814 }
2815 
2816 void
2817 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
2818 {
2819     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2820     if (value)
2821         return value->SetCurrentValue(arch, true);
2822 }
2823 
2824 lldb::DynamicValueType
2825 TargetProperties::GetPreferDynamicValue() const
2826 {
2827     const uint32_t idx = ePropertyPreferDynamic;
2828     return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2829 }
2830 
2831 bool
2832 TargetProperties::GetDisableASLR () const
2833 {
2834     const uint32_t idx = ePropertyDisableASLR;
2835     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2836 }
2837 
2838 void
2839 TargetProperties::SetDisableASLR (bool b)
2840 {
2841     const uint32_t idx = ePropertyDisableASLR;
2842     m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2843 }
2844 
2845 bool
2846 TargetProperties::GetDisableSTDIO () const
2847 {
2848     const uint32_t idx = ePropertyDisableSTDIO;
2849     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2850 }
2851 
2852 void
2853 TargetProperties::SetDisableSTDIO (bool b)
2854 {
2855     const uint32_t idx = ePropertyDisableSTDIO;
2856     m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2857 }
2858 
2859 const char *
2860 TargetProperties::GetDisassemblyFlavor () const
2861 {
2862     const uint32_t idx = ePropertyDisassemblyFlavor;
2863     const char *return_value;
2864 
2865     x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2866     return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
2867     return return_value;
2868 }
2869 
2870 InlineStrategy
2871 TargetProperties::GetInlineStrategy () const
2872 {
2873     const uint32_t idx = ePropertyInlineStrategy;
2874     return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2875 }
2876 
2877 const char *
2878 TargetProperties::GetArg0 () const
2879 {
2880     const uint32_t idx = ePropertyArg0;
2881     return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
2882 }
2883 
2884 void
2885 TargetProperties::SetArg0 (const char *arg)
2886 {
2887     const uint32_t idx = ePropertyArg0;
2888     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
2889 }
2890 
2891 bool
2892 TargetProperties::GetRunArguments (Args &args) const
2893 {
2894     const uint32_t idx = ePropertyRunArgs;
2895     return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
2896 }
2897 
2898 void
2899 TargetProperties::SetRunArguments (const Args &args)
2900 {
2901     const uint32_t idx = ePropertyRunArgs;
2902     m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
2903 }
2904 
2905 size_t
2906 TargetProperties::GetEnvironmentAsArgs (Args &env) const
2907 {
2908     const uint32_t idx = ePropertyEnvVars;
2909     return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
2910 }
2911 
2912 bool
2913 TargetProperties::GetSkipPrologue() const
2914 {
2915     const uint32_t idx = ePropertySkipPrologue;
2916     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2917 }
2918 
2919 PathMappingList &
2920 TargetProperties::GetSourcePathMap () const
2921 {
2922     const uint32_t idx = ePropertySourceMap;
2923     OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
2924     assert(option_value);
2925     return option_value->GetCurrentValue();
2926 }
2927 
2928 FileSpecList &
2929 TargetProperties::GetExecutableSearchPaths ()
2930 {
2931     const uint32_t idx = ePropertyExecutableSearchPaths;
2932     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2933     assert(option_value);
2934     return option_value->GetCurrentValue();
2935 }
2936 
2937 FileSpecList &
2938 TargetProperties::GetDebugFileSearchPaths ()
2939 {
2940     const uint32_t idx = ePropertyDebugFileSearchPaths;
2941     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2942     assert(option_value);
2943     return option_value->GetCurrentValue();
2944 }
2945 
2946 bool
2947 TargetProperties::GetEnableSyntheticValue () const
2948 {
2949     const uint32_t idx = ePropertyEnableSynthetic;
2950     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2951 }
2952 
2953 uint32_t
2954 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
2955 {
2956     const uint32_t idx = ePropertyMaxChildrenCount;
2957     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2958 }
2959 
2960 uint32_t
2961 TargetProperties::GetMaximumSizeOfStringSummary() const
2962 {
2963     const uint32_t idx = ePropertyMaxSummaryLength;
2964     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2965 }
2966 
2967 uint32_t
2968 TargetProperties::GetMaximumMemReadSize () const
2969 {
2970     const uint32_t idx = ePropertyMaxMemReadSize;
2971     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2972 }
2973 
2974 FileSpec
2975 TargetProperties::GetStandardInputPath () const
2976 {
2977     const uint32_t idx = ePropertyInputPath;
2978     return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
2979 }
2980 
2981 void
2982 TargetProperties::SetStandardInputPath (const char *p)
2983 {
2984     const uint32_t idx = ePropertyInputPath;
2985     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
2986 }
2987 
2988 FileSpec
2989 TargetProperties::GetStandardOutputPath () const
2990 {
2991     const uint32_t idx = ePropertyOutputPath;
2992     return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
2993 }
2994 
2995 void
2996 TargetProperties::SetStandardOutputPath (const char *p)
2997 {
2998     const uint32_t idx = ePropertyOutputPath;
2999     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3000 }
3001 
3002 FileSpec
3003 TargetProperties::GetStandardErrorPath () const
3004 {
3005     const uint32_t idx = ePropertyErrorPath;
3006     return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3007 }
3008 
3009 const char *
3010 TargetProperties::GetExpressionPrefixContentsAsCString ()
3011 {
3012     const uint32_t idx = ePropertyExprPrefix;
3013     OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3014     if (file)
3015     {
3016         const bool null_terminate = true;
3017         DataBufferSP data_sp(file->GetFileContents(null_terminate));
3018         if (data_sp)
3019             return (const char *) data_sp->GetBytes();
3020     }
3021     return NULL;
3022 }
3023 
3024 void
3025 TargetProperties::SetStandardErrorPath (const char *p)
3026 {
3027     const uint32_t idx = ePropertyErrorPath;
3028     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3029 }
3030 
3031 bool
3032 TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3033 {
3034     const uint32_t idx = ePropertyBreakpointUseAvoidList;
3035     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3036 }
3037 
3038 bool
3039 TargetProperties::GetUseHexImmediates () const
3040 {
3041     const uint32_t idx = ePropertyUseHexImmediates;
3042     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3043 }
3044 
3045 bool
3046 TargetProperties::GetUseFastStepping () const
3047 {
3048     const uint32_t idx = ePropertyUseFastStepping;
3049     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3050 }
3051 
3052 bool
3053 TargetProperties::GetDisplayExpressionsInCrashlogs () const
3054 {
3055     const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3056     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3057 }
3058 
3059 LoadScriptFromSymFile
3060 TargetProperties::GetLoadScriptFromSymbolFile () const
3061 {
3062     const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
3063     return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3064 }
3065 
3066 Disassembler::HexImmediateStyle
3067 TargetProperties::GetHexImmediateStyle () const
3068 {
3069     const uint32_t idx = ePropertyHexImmediateStyle;
3070     return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3071 }
3072 
3073 MemoryModuleLoadLevel
3074 TargetProperties::GetMemoryModuleLoadLevel() const
3075 {
3076     const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3077     return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3078 }
3079 
3080 
3081 
3082 //----------------------------------------------------------------------
3083 // Target::TargetEventData
3084 //----------------------------------------------------------------------
3085 const ConstString &
3086 Target::TargetEventData::GetFlavorString ()
3087 {
3088     static ConstString g_flavor ("Target::TargetEventData");
3089     return g_flavor;
3090 }
3091 
3092 const ConstString &
3093 Target::TargetEventData::GetFlavor () const
3094 {
3095     return TargetEventData::GetFlavorString ();
3096 }
3097 
3098 Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) :
3099     EventData(),
3100     m_target_sp (new_target_sp)
3101 {
3102 }
3103 
3104 Target::TargetEventData::~TargetEventData()
3105 {
3106 
3107 }
3108 
3109 void
3110 Target::TargetEventData::Dump (Stream *s) const
3111 {
3112 
3113 }
3114 
3115 const TargetSP
3116 Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp)
3117 {
3118     TargetSP target_sp;
3119 
3120     const TargetEventData *data = GetEventDataFromEvent (event_sp.get());
3121     if (data)
3122         target_sp = data->m_target_sp;
3123 
3124     return target_sp;
3125 }
3126 
3127 const Target::TargetEventData *
3128 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
3129 {
3130     if (event_ptr)
3131     {
3132         const EventData *event_data = event_ptr->GetData();
3133         if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
3134             return static_cast <const TargetEventData *> (event_ptr->GetData());
3135     }
3136     return NULL;
3137 }
3138 
3139