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 %" PRIu64 " is not supported", (uint64_t)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             m_process_sp->ModulesDidLoad (module_list);
1176         }
1177         // TODO: make event data that packages up the module_list
1178         BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
1179     }
1180 }
1181 
1182 void
1183 Target::SymbolsDidLoad (ModuleList &module_list)
1184 {
1185     if (module_list.GetSize())
1186     {
1187         if (m_process_sp)
1188         {
1189             LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1190             if (runtime)
1191             {
1192                 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1193                 objc_runtime->SymbolsDidLoad(module_list);
1194             }
1195         }
1196 
1197         m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1198         BroadcastEvent(eBroadcastBitSymbolsLoaded, NULL);
1199     }
1200 }
1201 
1202 void
1203 Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
1204 {
1205     if (module_list.GetSize())
1206     {
1207         m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
1208         // TODO: make event data that packages up the module_list
1209         BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
1210     }
1211 }
1212 
1213 bool
1214 Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_file_spec)
1215 {
1216     if (GetBreakpointsConsultPlatformAvoidList())
1217     {
1218         ModuleList matchingModules;
1219         ModuleSpec module_spec (module_file_spec);
1220         size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1221 
1222         // If there is more than one module for this file spec, only return true if ALL the modules are on the
1223         // black list.
1224         if (num_modules > 0)
1225         {
1226             for (size_t i  = 0; i < num_modules; i++)
1227             {
1228                 if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i)))
1229                     return false;
1230             }
1231             return true;
1232         }
1233     }
1234     return false;
1235 }
1236 
1237 bool
1238 Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp)
1239 {
1240     if (GetBreakpointsConsultPlatformAvoidList())
1241     {
1242         if (m_platform_sp)
1243             return m_platform_sp->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp);
1244     }
1245     return false;
1246 }
1247 
1248 size_t
1249 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1250 {
1251     SectionSP section_sp (addr.GetSection());
1252     if (section_sp)
1253     {
1254         // If the contents of this section are encrypted, the on-disk file is unusuable.  Read only from live memory.
1255         if (section_sp->IsEncrypted())
1256         {
1257             error.SetErrorString("section is encrypted");
1258             return 0;
1259         }
1260         ModuleSP module_sp (section_sp->GetModule());
1261         if (module_sp)
1262         {
1263             ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1264             if (objfile)
1265             {
1266                 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1267                                                               addr.GetOffset(),
1268                                                               dst,
1269                                                               dst_len);
1270                 if (bytes_read > 0)
1271                     return bytes_read;
1272                 else
1273                     error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1274             }
1275             else
1276                 error.SetErrorString("address isn't from a object file");
1277         }
1278         else
1279             error.SetErrorString("address isn't in a module");
1280     }
1281     else
1282         error.SetErrorString("address doesn't contain a section that points to a section in a object file");
1283 
1284     return 0;
1285 }
1286 
1287 size_t
1288 Target::ReadMemory (const Address& addr,
1289                     bool prefer_file_cache,
1290                     void *dst,
1291                     size_t dst_len,
1292                     Error &error,
1293                     lldb::addr_t *load_addr_ptr)
1294 {
1295     error.Clear();
1296 
1297     // if we end up reading this from process memory, we will fill this
1298     // with the actual load address
1299     if (load_addr_ptr)
1300         *load_addr_ptr = LLDB_INVALID_ADDRESS;
1301 
1302     size_t bytes_read = 0;
1303 
1304     addr_t load_addr = LLDB_INVALID_ADDRESS;
1305     addr_t file_addr = LLDB_INVALID_ADDRESS;
1306     Address resolved_addr;
1307     if (!addr.IsSectionOffset())
1308     {
1309         SectionLoadList &section_load_list = GetSectionLoadList();
1310         if (section_load_list.IsEmpty())
1311         {
1312             // No sections are loaded, so we must assume we are not running
1313             // yet and anything we are given is a file address.
1314             file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1315             m_images.ResolveFileAddress (file_addr, resolved_addr);
1316         }
1317         else
1318         {
1319             // We have at least one section loaded. This can be becuase
1320             // we have manually loaded some sections with "target modules load ..."
1321             // or because we have have a live process that has sections loaded
1322             // through the dynamic loader
1323             load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
1324             section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
1325         }
1326     }
1327     if (!resolved_addr.IsValid())
1328         resolved_addr = addr;
1329 
1330 
1331     if (prefer_file_cache)
1332     {
1333         bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1334         if (bytes_read > 0)
1335             return bytes_read;
1336     }
1337 
1338     if (ProcessIsValid())
1339     {
1340         if (load_addr == LLDB_INVALID_ADDRESS)
1341             load_addr = resolved_addr.GetLoadAddress (this);
1342 
1343         if (load_addr == LLDB_INVALID_ADDRESS)
1344         {
1345             ModuleSP addr_module_sp (resolved_addr.GetModule());
1346             if (addr_module_sp && addr_module_sp->GetFileSpec())
1347                 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
1348                                                addr_module_sp->GetFileSpec().GetFilename().AsCString(),
1349                                                resolved_addr.GetFileAddress(),
1350                                                addr_module_sp->GetFileSpec().GetFilename().AsCString());
1351             else
1352                 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
1353         }
1354         else
1355         {
1356             bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1357             if (bytes_read != dst_len)
1358             {
1359                 if (error.Success())
1360                 {
1361                     if (bytes_read == 0)
1362                         error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
1363                     else
1364                         error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1365                 }
1366             }
1367             if (bytes_read)
1368             {
1369                 if (load_addr_ptr)
1370                     *load_addr_ptr = load_addr;
1371                 return bytes_read;
1372             }
1373             // If the address is not section offset we have an address that
1374             // doesn't resolve to any address in any currently loaded shared
1375             // libaries and we failed to read memory so there isn't anything
1376             // more we can do. If it is section offset, we might be able to
1377             // read cached memory from the object file.
1378             if (!resolved_addr.IsSectionOffset())
1379                 return 0;
1380         }
1381     }
1382 
1383     if (!prefer_file_cache && resolved_addr.IsSectionOffset())
1384     {
1385         // If we didn't already try and read from the object file cache, then
1386         // try it after failing to read from the process.
1387         return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1388     }
1389     return 0;
1390 }
1391 
1392 size_t
1393 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1394 {
1395     char buf[256];
1396     out_str.clear();
1397     addr_t curr_addr = addr.GetLoadAddress(this);
1398     Address address(addr);
1399     while (1)
1400     {
1401         size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1402         if (length == 0)
1403             break;
1404         out_str.append(buf, length);
1405         // If we got "length - 1" bytes, we didn't get the whole C string, we
1406         // need to read some more characters
1407         if (length == sizeof(buf) - 1)
1408             curr_addr += length;
1409         else
1410             break;
1411         address = Address(curr_addr);
1412     }
1413     return out_str.size();
1414 }
1415 
1416 
1417 size_t
1418 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1419 {
1420     size_t total_cstr_len = 0;
1421     if (dst && dst_max_len)
1422     {
1423         result_error.Clear();
1424         // NULL out everything just to be safe
1425         memset (dst, 0, dst_max_len);
1426         Error error;
1427         addr_t curr_addr = addr.GetLoadAddress(this);
1428         Address address(addr);
1429         const size_t cache_line_size = 512;
1430         size_t bytes_left = dst_max_len - 1;
1431         char *curr_dst = dst;
1432 
1433         while (bytes_left > 0)
1434         {
1435             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1436             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1437             size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1438 
1439             if (bytes_read == 0)
1440             {
1441                 result_error = error;
1442                 dst[total_cstr_len] = '\0';
1443                 break;
1444             }
1445             const size_t len = strlen(curr_dst);
1446 
1447             total_cstr_len += len;
1448 
1449             if (len < bytes_to_read)
1450                 break;
1451 
1452             curr_dst += bytes_read;
1453             curr_addr += bytes_read;
1454             bytes_left -= bytes_read;
1455             address = Address(curr_addr);
1456         }
1457     }
1458     else
1459     {
1460         if (dst == NULL)
1461             result_error.SetErrorString("invalid arguments");
1462         else
1463             result_error.Clear();
1464     }
1465     return total_cstr_len;
1466 }
1467 
1468 size_t
1469 Target::ReadScalarIntegerFromMemory (const Address& addr,
1470                                      bool prefer_file_cache,
1471                                      uint32_t byte_size,
1472                                      bool is_signed,
1473                                      Scalar &scalar,
1474                                      Error &error)
1475 {
1476     uint64_t uval;
1477 
1478     if (byte_size <= sizeof(uval))
1479     {
1480         size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1481         if (bytes_read == byte_size)
1482         {
1483             DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
1484             lldb::offset_t offset = 0;
1485             if (byte_size <= 4)
1486                 scalar = data.GetMaxU32 (&offset, byte_size);
1487             else
1488                 scalar = data.GetMaxU64 (&offset, byte_size);
1489 
1490             if (is_signed)
1491                 scalar.SignExtend(byte_size * 8);
1492             return bytes_read;
1493         }
1494     }
1495     else
1496     {
1497         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1498     }
1499     return 0;
1500 }
1501 
1502 uint64_t
1503 Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1504                                        bool prefer_file_cache,
1505                                        size_t integer_byte_size,
1506                                        uint64_t fail_value,
1507                                        Error &error)
1508 {
1509     Scalar scalar;
1510     if (ReadScalarIntegerFromMemory (addr,
1511                                      prefer_file_cache,
1512                                      integer_byte_size,
1513                                      false,
1514                                      scalar,
1515                                      error))
1516         return scalar.ULongLong(fail_value);
1517     return fail_value;
1518 }
1519 
1520 bool
1521 Target::ReadPointerFromMemory (const Address& addr,
1522                                bool prefer_file_cache,
1523                                Error &error,
1524                                Address &pointer_addr)
1525 {
1526     Scalar scalar;
1527     if (ReadScalarIntegerFromMemory (addr,
1528                                      prefer_file_cache,
1529                                      m_arch.GetAddressByteSize(),
1530                                      false,
1531                                      scalar,
1532                                      error))
1533     {
1534         addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1535         if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1536         {
1537             SectionLoadList &section_load_list = GetSectionLoadList();
1538             if (section_load_list.IsEmpty())
1539             {
1540                 // No sections are loaded, so we must assume we are not running
1541                 // yet and anything we are given is a file address.
1542                 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1543             }
1544             else
1545             {
1546                 // We have at least one section loaded. This can be becuase
1547                 // we have manually loaded some sections with "target modules load ..."
1548                 // or because we have have a live process that has sections loaded
1549                 // through the dynamic loader
1550                 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
1551             }
1552             // We weren't able to resolve the pointer value, so just return
1553             // an address with no section
1554             if (!pointer_addr.IsValid())
1555                 pointer_addr.SetOffset (pointer_vm_addr);
1556             return true;
1557 
1558         }
1559     }
1560     return false;
1561 }
1562 
1563 ModuleSP
1564 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
1565 {
1566     ModuleSP module_sp;
1567 
1568     Error error;
1569 
1570     // First see if we already have this module in our module list.  If we do, then we're done, we don't need
1571     // to consult the shared modules list.  But only do this if we are passed a UUID.
1572 
1573     if (module_spec.GetUUID().IsValid())
1574         module_sp = m_images.FindFirstModule(module_spec);
1575 
1576     if (!module_sp)
1577     {
1578         ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1579         bool did_create_module = false;
1580 
1581         // If there are image search path entries, try to use them first to acquire a suitable image.
1582         if (m_image_search_paths.GetSize())
1583         {
1584             ModuleSpec transformed_spec (module_spec);
1585             if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1586             {
1587                 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1588                 error = ModuleList::GetSharedModule (transformed_spec,
1589                                                      module_sp,
1590                                                      &GetExecutableSearchPaths(),
1591                                                      &old_module_sp,
1592                                                      &did_create_module);
1593             }
1594         }
1595 
1596         if (!module_sp)
1597         {
1598             // If we have a UUID, we can check our global shared module list in case
1599             // we already have it. If we don't have a valid UUID, then we can't since
1600             // the path in "module_spec" will be a platform path, and we will need to
1601             // let the platform find that file. For example, we could be asking for
1602             // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1603             // the local copy of "/usr/lib/dyld" since our platform could be a remote
1604             // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1605             // cache.
1606             if (module_spec.GetUUID().IsValid())
1607             {
1608                 // We have a UUID, it is OK to check the global module list...
1609                 error = ModuleList::GetSharedModule (module_spec,
1610                                                      module_sp,
1611                                                      &GetExecutableSearchPaths(),
1612                                                      &old_module_sp,
1613                                                      &did_create_module);
1614             }
1615 
1616             if (!module_sp)
1617             {
1618                 // The platform is responsible for finding and caching an appropriate
1619                 // module in the shared module cache.
1620                 if (m_platform_sp)
1621                 {
1622                     FileSpec platform_file_spec;
1623                     error = m_platform_sp->GetSharedModule (module_spec,
1624                                                             module_sp,
1625                                                             &GetExecutableSearchPaths(),
1626                                                             &old_module_sp,
1627                                                             &did_create_module);
1628                 }
1629                 else
1630                 {
1631                     error.SetErrorString("no platform is currently set");
1632                 }
1633             }
1634         }
1635 
1636         // We found a module that wasn't in our target list.  Let's make sure that there wasn't an equivalent
1637         // module in the list already, and if there was, let's remove it.
1638         if (module_sp)
1639         {
1640             ObjectFile *objfile = module_sp->GetObjectFile();
1641             if (objfile)
1642             {
1643                 switch (objfile->GetType())
1644                 {
1645                     case ObjectFile::eTypeCoreFile:      /// A core file that has a checkpoint of a program's execution state
1646                     case ObjectFile::eTypeExecutable:    /// A normal executable
1647                     case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1648                     case ObjectFile::eTypeObjectFile:    /// An intermediate object file
1649                     case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1650                         break;
1651                     case ObjectFile::eTypeDebugInfo:     /// An object file that contains only debug information
1652                         if (error_ptr)
1653                             error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1654                         return ModuleSP();
1655                     case ObjectFile::eTypeStubLibrary:   /// A library that can be linked against but not used for execution
1656                         if (error_ptr)
1657                             error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1658                         return ModuleSP();
1659                     default:
1660                         if (error_ptr)
1661                             error_ptr->SetErrorString("unsupported file type, please specify an executable");
1662                         return ModuleSP();
1663                 }
1664                 // GetSharedModule is not guaranteed to find the old shared module, for instance
1665                 // in the common case where you pass in the UUID, it is only going to find the one
1666                 // module matching the UUID.  In fact, it has no good way to know what the "old module"
1667                 // relevant to this target is, since there might be many copies of a module with this file spec
1668                 // in various running debug sessions, but only one of them will belong to this target.
1669                 // So let's remove the UUID from the module list, and look in the target's module list.
1670                 // Only do this if there is SOMETHING else in the module spec...
1671                 if (!old_module_sp)
1672                 {
1673                     if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
1674                     {
1675                         ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1676                         module_spec_copy.GetUUID().Clear();
1677 
1678                         ModuleList found_modules;
1679                         size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1680                         if (num_found == 1)
1681                         {
1682                             old_module_sp = found_modules.GetModuleAtIndex(0);
1683                         }
1684                     }
1685                 }
1686 
1687                 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1688                 {
1689                     m_images.ReplaceModule(old_module_sp, module_sp);
1690                     Module *old_module_ptr = old_module_sp.get();
1691                     old_module_sp.reset();
1692                     ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1693                 }
1694                 else
1695                     m_images.Append(module_sp);
1696             }
1697         }
1698     }
1699     if (error_ptr)
1700         *error_ptr = error;
1701     return module_sp;
1702 }
1703 
1704 
1705 TargetSP
1706 Target::CalculateTarget ()
1707 {
1708     return shared_from_this();
1709 }
1710 
1711 ProcessSP
1712 Target::CalculateProcess ()
1713 {
1714     return ProcessSP();
1715 }
1716 
1717 ThreadSP
1718 Target::CalculateThread ()
1719 {
1720     return ThreadSP();
1721 }
1722 
1723 StackFrameSP
1724 Target::CalculateStackFrame ()
1725 {
1726     return StackFrameSP();
1727 }
1728 
1729 void
1730 Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
1731 {
1732     exe_ctx.Clear();
1733     exe_ctx.SetTargetPtr(this);
1734 }
1735 
1736 PathMappingList &
1737 Target::GetImageSearchPathList ()
1738 {
1739     return m_image_search_paths;
1740 }
1741 
1742 void
1743 Target::ImageSearchPathsChanged
1744 (
1745     const PathMappingList &path_list,
1746     void *baton
1747 )
1748 {
1749     Target *target = (Target *)baton;
1750     ModuleSP exe_module_sp (target->GetExecutableModule());
1751     if (exe_module_sp)
1752         target->SetExecutableModule (exe_module_sp, true);
1753 }
1754 
1755 ClangASTContext *
1756 Target::GetScratchClangASTContext(bool create_on_demand)
1757 {
1758     // Now see if we know the target triple, and if so, create our scratch AST context:
1759     if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
1760     {
1761         m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
1762         m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
1763         m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
1764         llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
1765         m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
1766     }
1767     return m_scratch_ast_context_ap.get();
1768 }
1769 
1770 ClangASTImporter *
1771 Target::GetClangASTImporter()
1772 {
1773     ClangASTImporter *ast_importer = m_ast_importer_ap.get();
1774 
1775     if (!ast_importer)
1776     {
1777         ast_importer = new ClangASTImporter();
1778         m_ast_importer_ap.reset(ast_importer);
1779     }
1780 
1781     return ast_importer;
1782 }
1783 
1784 void
1785 Target::SettingsInitialize ()
1786 {
1787     Process::SettingsInitialize ();
1788 }
1789 
1790 void
1791 Target::SettingsTerminate ()
1792 {
1793     Process::SettingsTerminate ();
1794 }
1795 
1796 FileSpecList
1797 Target::GetDefaultExecutableSearchPaths ()
1798 {
1799     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1800     if (properties_sp)
1801         return properties_sp->GetExecutableSearchPaths();
1802     return FileSpecList();
1803 }
1804 
1805 FileSpecList
1806 Target::GetDefaultDebugFileSearchPaths ()
1807 {
1808     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1809     if (properties_sp)
1810         return properties_sp->GetDebugFileSearchPaths();
1811     return FileSpecList();
1812 }
1813 
1814 ArchSpec
1815 Target::GetDefaultArchitecture ()
1816 {
1817     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1818     if (properties_sp)
1819         return properties_sp->GetDefaultArchitecture();
1820     return ArchSpec();
1821 }
1822 
1823 void
1824 Target::SetDefaultArchitecture (const ArchSpec &arch)
1825 {
1826     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1827     if (properties_sp)
1828     {
1829         LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to  %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
1830         return properties_sp->SetDefaultArchitecture(arch);
1831     }
1832 }
1833 
1834 Target *
1835 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1836 {
1837     // The target can either exist in the "process" of ExecutionContext, or in
1838     // the "target_sp" member of SymbolContext. This accessor helper function
1839     // will get the target from one of these locations.
1840 
1841     Target *target = NULL;
1842     if (sc_ptr != NULL)
1843         target = sc_ptr->target_sp.get();
1844     if (target == NULL && exe_ctx_ptr)
1845         target = exe_ctx_ptr->GetTargetPtr();
1846     return target;
1847 }
1848 
1849 ExecutionResults
1850 Target::EvaluateExpression
1851 (
1852     const char *expr_cstr,
1853     StackFrame *frame,
1854     lldb::ValueObjectSP &result_valobj_sp,
1855     const EvaluateExpressionOptions& options
1856 )
1857 {
1858     result_valobj_sp.reset();
1859 
1860     ExecutionResults execution_results = eExecutionSetupError;
1861 
1862     if (expr_cstr == NULL || expr_cstr[0] == '\0')
1863         return execution_results;
1864 
1865     // We shouldn't run stop hooks in expressions.
1866     // Be sure to reset this if you return anywhere within this function.
1867     bool old_suppress_value = m_suppress_stop_hooks;
1868     m_suppress_stop_hooks = true;
1869 
1870     ExecutionContext exe_ctx;
1871 
1872     if (frame)
1873     {
1874         frame->CalculateExecutionContext(exe_ctx);
1875     }
1876     else if (m_process_sp)
1877     {
1878         m_process_sp->CalculateExecutionContext(exe_ctx);
1879     }
1880     else
1881     {
1882         CalculateExecutionContext(exe_ctx);
1883     }
1884 
1885     // Make sure we aren't just trying to see the value of a persistent
1886     // variable (something like "$0")
1887     lldb::ClangExpressionVariableSP persistent_var_sp;
1888     // Only check for persistent variables the expression starts with a '$'
1889     if (expr_cstr[0] == '$')
1890         persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr);
1891 
1892     if (persistent_var_sp)
1893     {
1894         result_valobj_sp = persistent_var_sp->GetValueObject ();
1895         execution_results = eExecutionCompleted;
1896     }
1897     else
1898     {
1899         const char *prefix = GetExpressionPrefixContentsAsCString();
1900         Error error;
1901         execution_results = ClangUserExpression::Evaluate (exe_ctx,
1902                                                            options,
1903                                                            expr_cstr,
1904                                                            prefix,
1905                                                            result_valobj_sp,
1906                                                            error);
1907     }
1908 
1909     m_suppress_stop_hooks = old_suppress_value;
1910 
1911     return execution_results;
1912 }
1913 
1914 lldb::addr_t
1915 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1916 {
1917     addr_t code_addr = load_addr;
1918     switch (m_arch.GetMachine())
1919     {
1920     case llvm::Triple::arm:
1921     case llvm::Triple::thumb:
1922         switch (addr_class)
1923         {
1924         case eAddressClassData:
1925         case eAddressClassDebug:
1926             return LLDB_INVALID_ADDRESS;
1927 
1928         case eAddressClassUnknown:
1929         case eAddressClassInvalid:
1930         case eAddressClassCode:
1931         case eAddressClassCodeAlternateISA:
1932         case eAddressClassRuntime:
1933             // Check if bit zero it no set?
1934             if ((code_addr & 1ull) == 0)
1935             {
1936                 // Bit zero isn't set, check if the address is a multiple of 2?
1937                 if (code_addr & 2ull)
1938                 {
1939                     // The address is a multiple of 2 so it must be thumb, set bit zero
1940                     code_addr |= 1ull;
1941                 }
1942                 else if (addr_class == eAddressClassCodeAlternateISA)
1943                 {
1944                     // We checked the address and the address claims to be the alternate ISA
1945                     // which means thumb, so set bit zero.
1946                     code_addr |= 1ull;
1947                 }
1948             }
1949             break;
1950         }
1951         break;
1952 
1953     default:
1954         break;
1955     }
1956     return code_addr;
1957 }
1958 
1959 lldb::addr_t
1960 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1961 {
1962     addr_t opcode_addr = load_addr;
1963     switch (m_arch.GetMachine())
1964     {
1965     case llvm::Triple::arm:
1966     case llvm::Triple::thumb:
1967         switch (addr_class)
1968         {
1969         case eAddressClassData:
1970         case eAddressClassDebug:
1971             return LLDB_INVALID_ADDRESS;
1972 
1973         case eAddressClassInvalid:
1974         case eAddressClassUnknown:
1975         case eAddressClassCode:
1976         case eAddressClassCodeAlternateISA:
1977         case eAddressClassRuntime:
1978             opcode_addr &= ~(1ull);
1979             break;
1980         }
1981         break;
1982 
1983     default:
1984         break;
1985     }
1986     return opcode_addr;
1987 }
1988 
1989 SourceManager &
1990 Target::GetSourceManager ()
1991 {
1992     if (m_source_manager_ap.get() == NULL)
1993         m_source_manager_ap.reset (new SourceManager(shared_from_this()));
1994     return *m_source_manager_ap;
1995 }
1996 
1997 
1998 Target::StopHookSP
1999 Target::CreateStopHook ()
2000 {
2001     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2002     Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2003     m_stop_hooks[new_uid] = stop_hook_sp;
2004     return stop_hook_sp;
2005 }
2006 
2007 bool
2008 Target::RemoveStopHookByID (lldb::user_id_t user_id)
2009 {
2010     size_t num_removed;
2011     num_removed = m_stop_hooks.erase (user_id);
2012     if (num_removed == 0)
2013         return false;
2014     else
2015         return true;
2016 }
2017 
2018 void
2019 Target::RemoveAllStopHooks ()
2020 {
2021     m_stop_hooks.clear();
2022 }
2023 
2024 Target::StopHookSP
2025 Target::GetStopHookByID (lldb::user_id_t user_id)
2026 {
2027     StopHookSP found_hook;
2028 
2029     StopHookCollection::iterator specified_hook_iter;
2030     specified_hook_iter = m_stop_hooks.find (user_id);
2031     if (specified_hook_iter != m_stop_hooks.end())
2032         found_hook = (*specified_hook_iter).second;
2033     return found_hook;
2034 }
2035 
2036 bool
2037 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2038 {
2039     StopHookCollection::iterator specified_hook_iter;
2040     specified_hook_iter = m_stop_hooks.find (user_id);
2041     if (specified_hook_iter == m_stop_hooks.end())
2042         return false;
2043 
2044     (*specified_hook_iter).second->SetIsActive (active_state);
2045     return true;
2046 }
2047 
2048 void
2049 Target::SetAllStopHooksActiveState (bool active_state)
2050 {
2051     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2052     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2053     {
2054         (*pos).second->SetIsActive (active_state);
2055     }
2056 }
2057 
2058 void
2059 Target::RunStopHooks ()
2060 {
2061     if (m_suppress_stop_hooks)
2062         return;
2063 
2064     if (!m_process_sp)
2065         return;
2066 
2067     // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2068     // since in that case we do not want to run the stop-hooks
2069     if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2070         return;
2071 
2072     if (m_stop_hooks.empty())
2073         return;
2074 
2075     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2076 
2077     // If there aren't any active stop hooks, don't bother either:
2078     bool any_active_hooks = false;
2079     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2080     {
2081         if ((*pos).second->IsActive())
2082         {
2083             any_active_hooks = true;
2084             break;
2085         }
2086     }
2087     if (!any_active_hooks)
2088         return;
2089 
2090     CommandReturnObject result;
2091 
2092     std::vector<ExecutionContext> exc_ctx_with_reasons;
2093     std::vector<SymbolContext> sym_ctx_with_reasons;
2094 
2095     ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2096     size_t num_threads = cur_threadlist.GetSize();
2097     for (size_t i = 0; i < num_threads; i++)
2098     {
2099         lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2100         if (cur_thread_sp->ThreadStoppedForAReason())
2101         {
2102             lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2103             exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2104             sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2105         }
2106     }
2107 
2108     // If no threads stopped for a reason, don't run the stop-hooks.
2109     size_t num_exe_ctx = exc_ctx_with_reasons.size();
2110     if (num_exe_ctx == 0)
2111         return;
2112 
2113     result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2114     result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
2115 
2116     bool keep_going = true;
2117     bool hooks_ran = false;
2118     bool print_hook_header;
2119     bool print_thread_header;
2120 
2121     if (num_exe_ctx == 1)
2122         print_thread_header = false;
2123     else
2124         print_thread_header = true;
2125 
2126     if (m_stop_hooks.size() == 1)
2127         print_hook_header = false;
2128     else
2129         print_hook_header = true;
2130 
2131     for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2132     {
2133         // result.Clear();
2134         StopHookSP cur_hook_sp = (*pos).second;
2135         if (!cur_hook_sp->IsActive())
2136             continue;
2137 
2138         bool any_thread_matched = false;
2139         for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2140         {
2141             if ((cur_hook_sp->GetSpecifier () == NULL
2142                   || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2143                 && (cur_hook_sp->GetThreadSpecifier() == NULL
2144                     || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
2145             {
2146                 if (!hooks_ran)
2147                 {
2148                     hooks_ran = true;
2149                 }
2150                 if (print_hook_header && !any_thread_matched)
2151                 {
2152                     const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2153                                        cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2154                                        NULL);
2155                     if (cmd)
2156                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
2157                     else
2158                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
2159                     any_thread_matched = true;
2160                 }
2161 
2162                 if (print_thread_header)
2163                     result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2164 
2165                 bool stop_on_continue = true;
2166                 bool stop_on_error = true;
2167                 bool echo_commands = false;
2168                 bool print_results = true;
2169                 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2170                                                                       &exc_ctx_with_reasons[i],
2171                                                                       stop_on_continue,
2172                                                                       stop_on_error,
2173                                                                       echo_commands,
2174                                                                       print_results,
2175                                                                       eLazyBoolNo,
2176                                                                       result);
2177 
2178                 // If the command started the target going again, we should bag out of
2179                 // running the stop hooks.
2180                 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2181                     (result.GetStatus() == eReturnStatusSuccessContinuingResult))
2182                 {
2183                     result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
2184                     keep_going = false;
2185                 }
2186             }
2187         }
2188     }
2189 
2190     result.GetImmediateOutputStream()->Flush();
2191     result.GetImmediateErrorStream()->Flush();
2192 }
2193 
2194 const TargetPropertiesSP &
2195 Target::GetGlobalProperties()
2196 {
2197     static TargetPropertiesSP g_settings_sp;
2198     if (!g_settings_sp)
2199     {
2200         g_settings_sp.reset (new TargetProperties (NULL));
2201     }
2202     return g_settings_sp;
2203 }
2204 
2205 Error
2206 Target::Install (ProcessLaunchInfo *launch_info)
2207 {
2208     Error error;
2209     PlatformSP platform_sp (GetPlatform());
2210     if (platform_sp)
2211     {
2212         if (platform_sp->IsRemote())
2213         {
2214             if (platform_sp->IsConnected())
2215             {
2216                 // Install all files that have an install path, and always install the
2217                 // main executable when connected to a remote platform
2218                 const ModuleList& modules = GetImages();
2219                 const size_t num_images = modules.GetSize();
2220                 for (size_t idx = 0; idx < num_images; ++idx)
2221                 {
2222                     const bool is_main_executable = idx == 0;
2223                     ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2224                     if (module_sp)
2225                     {
2226                         FileSpec local_file (module_sp->GetFileSpec());
2227                         if (local_file)
2228                         {
2229                             FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2230                             if (!remote_file)
2231                             {
2232                                 if (is_main_executable) // TODO: add setting for always installing main executable???
2233                                 {
2234                                     // Always install the main executable
2235                                     remote_file.GetDirectory() = platform_sp->GetWorkingDirectory();
2236                                     remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename();
2237                                 }
2238                             }
2239                             if (remote_file)
2240                             {
2241                                 error = platform_sp->Install(local_file, remote_file);
2242                                 if (error.Success())
2243                                 {
2244                                     module_sp->SetPlatformFileSpec(remote_file);
2245                                     if (is_main_executable)
2246                                     {
2247                                         if (launch_info)
2248                                             launch_info->SetExecutableFile(remote_file, false);
2249                                     }
2250                                 }
2251                                 else
2252                                     break;
2253                             }
2254                         }
2255                     }
2256                 }
2257             }
2258         }
2259     }
2260     return error;
2261 }
2262 
2263 bool
2264 Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2265 {
2266     return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2267 }
2268 
2269 bool
2270 Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2271 {
2272     const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2273     if (old_section_load_addr != new_section_load_addr)
2274     {
2275         uint32_t stop_id = 0;
2276         ProcessSP process_sp(GetProcessSP());
2277         if (process_sp)
2278             stop_id = process_sp->GetStopID();
2279         else
2280             stop_id = m_section_load_history.GetLastStopID();
2281         if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2282             return true; // Return true if the section load address was changed...
2283     }
2284     return false; // Return false to indicate nothing changed
2285 
2286 }
2287 
2288 bool
2289 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2290 {
2291     uint32_t stop_id = 0;
2292     ProcessSP process_sp(GetProcessSP());
2293     if (process_sp)
2294         stop_id = process_sp->GetStopID();
2295     else
2296         stop_id = m_section_load_history.GetLastStopID();
2297     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2298 }
2299 
2300 bool
2301 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2302 {
2303     uint32_t stop_id = 0;
2304     ProcessSP process_sp(GetProcessSP());
2305     if (process_sp)
2306         stop_id = process_sp->GetStopID();
2307     else
2308         stop_id = m_section_load_history.GetLastStopID();
2309     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2310 }
2311 
2312 void
2313 Target::ClearAllLoadedSections ()
2314 {
2315     m_section_load_history.Clear();
2316 }
2317 
2318 
2319 Error
2320 Target::Launch (Listener &listener, ProcessLaunchInfo &launch_info)
2321 {
2322     Error error;
2323 
2324     StateType state = eStateInvalid;
2325 
2326     // Scope to temporarily get the process state in case someone has manually
2327     // remotely connected already to a process and we can skip the platform
2328     // launching.
2329     {
2330         ProcessSP process_sp (GetProcessSP());
2331 
2332         if (process_sp)
2333             state = process_sp->GetState();
2334     }
2335 
2336     launch_info.GetFlags().Set (eLaunchFlagDebug);
2337 
2338     // Get the value of synchronous execution here.  If you wait till after you have started to
2339     // run, then you could have hit a breakpoint, whose command might switch the value, and
2340     // then you'll pick up that incorrect value.
2341     Debugger &debugger = GetDebugger();
2342     const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2343 
2344     PlatformSP platform_sp (GetPlatform());
2345 
2346     // Finalize the file actions, and if none were given, default to opening
2347     // up a pseudo terminal
2348     const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
2349     launch_info.FinalizeFileActions (this, default_to_use_pty);
2350 
2351     if (state == eStateConnected)
2352     {
2353         if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2354         {
2355             error.SetErrorString("can't launch in tty when launching through a remote connection");
2356             return error;
2357         }
2358     }
2359 
2360     if (!launch_info.GetArchitecture().IsValid())
2361         launch_info.GetArchitecture() = GetArchitecture();
2362 
2363     if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2364     {
2365         m_process_sp = GetPlatform()->DebugProcess (launch_info,
2366                                                     debugger,
2367                                                     this,
2368                                                     listener,
2369                                                     error);
2370     }
2371     else
2372     {
2373         if (state == eStateConnected)
2374         {
2375             assert(m_process_sp);
2376         }
2377         else
2378         {
2379             const char *plugin_name = launch_info.GetProcessPluginName();
2380             CreateProcess (listener, plugin_name, NULL);
2381         }
2382 
2383         if (m_process_sp)
2384             error = m_process_sp->Launch (launch_info);
2385     }
2386 
2387     if (!m_process_sp)
2388     {
2389         if (error.Success())
2390             error.SetErrorString("failed to launch or debug process");
2391         return error;
2392     }
2393 
2394     if (error.Success())
2395     {
2396         if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
2397         {
2398             ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
2399 
2400             StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get());
2401 
2402             if (state == eStateStopped)
2403             {
2404                 if (!synchronous_execution)
2405                     m_process_sp->RestoreProcessEvents ();
2406 
2407                 error = m_process_sp->PrivateResume();
2408 
2409                 if (error.Success())
2410                 {
2411                     if (synchronous_execution)
2412                     {
2413                         state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get());
2414                         const bool must_be_alive = false; // eStateExited is ok, so this must be false
2415                         if (!StateIsStoppedState(state, must_be_alive))
2416                         {
2417                             error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
2418                         }
2419                     }
2420                 }
2421                 else
2422                 {
2423                     Error error2;
2424                     error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
2425                     error = error2;
2426                 }
2427             }
2428             else
2429             {
2430                 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
2431             }
2432         }
2433         m_process_sp->RestoreProcessEvents ();
2434     }
2435     else
2436     {
2437         Error error2;
2438         error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
2439         error = error2;
2440     }
2441     return error;
2442 }
2443 //--------------------------------------------------------------
2444 // Target::StopHook
2445 //--------------------------------------------------------------
2446 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
2447         UserID (uid),
2448         m_target_sp (target_sp),
2449         m_commands (),
2450         m_specifier_sp (),
2451         m_thread_spec_ap(),
2452         m_active (true)
2453 {
2454 }
2455 
2456 Target::StopHook::StopHook (const StopHook &rhs) :
2457         UserID (rhs.GetID()),
2458         m_target_sp (rhs.m_target_sp),
2459         m_commands (rhs.m_commands),
2460         m_specifier_sp (rhs.m_specifier_sp),
2461         m_thread_spec_ap (),
2462         m_active (rhs.m_active)
2463 {
2464     if (rhs.m_thread_spec_ap.get() != NULL)
2465         m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
2466 }
2467 
2468 
2469 Target::StopHook::~StopHook ()
2470 {
2471 }
2472 
2473 void
2474 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
2475 {
2476     m_thread_spec_ap.reset (specifier);
2477 }
2478 
2479 
2480 void
2481 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
2482 {
2483     int indent_level = s->GetIndentLevel();
2484 
2485     s->SetIndentLevel(indent_level + 2);
2486 
2487     s->Printf ("Hook: %" PRIu64 "\n", GetID());
2488     if (m_active)
2489         s->Indent ("State: enabled\n");
2490     else
2491         s->Indent ("State: disabled\n");
2492 
2493     if (m_specifier_sp)
2494     {
2495         s->Indent();
2496         s->PutCString ("Specifier:\n");
2497         s->SetIndentLevel (indent_level + 4);
2498         m_specifier_sp->GetDescription (s, level);
2499         s->SetIndentLevel (indent_level + 2);
2500     }
2501 
2502     if (m_thread_spec_ap.get() != NULL)
2503     {
2504         StreamString tmp;
2505         s->Indent("Thread:\n");
2506         m_thread_spec_ap->GetDescription (&tmp, level);
2507         s->SetIndentLevel (indent_level + 4);
2508         s->Indent (tmp.GetData());
2509         s->PutCString ("\n");
2510         s->SetIndentLevel (indent_level + 2);
2511     }
2512 
2513     s->Indent ("Commands: \n");
2514     s->SetIndentLevel (indent_level + 4);
2515     uint32_t num_commands = m_commands.GetSize();
2516     for (uint32_t i = 0; i < num_commands; i++)
2517     {
2518         s->Indent(m_commands.GetStringAtIndex(i));
2519         s->PutCString ("\n");
2520     }
2521     s->SetIndentLevel (indent_level);
2522 }
2523 
2524 //--------------------------------------------------------------
2525 // class TargetProperties
2526 //--------------------------------------------------------------
2527 
2528 OptionEnumValueElement
2529 lldb_private::g_dynamic_value_types[] =
2530 {
2531     { eNoDynamicValues,      "no-dynamic-values", "Don't calculate the dynamic type of values"},
2532     { eDynamicCanRunTarget,  "run-target",        "Calculate the dynamic type of values even if you have to run the target."},
2533     { eDynamicDontRunTarget, "no-run-target",     "Calculate the dynamic type of values, but don't run the target."},
2534     { 0, NULL, NULL }
2535 };
2536 
2537 static OptionEnumValueElement
2538 g_inline_breakpoint_enums[] =
2539 {
2540     { 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."},
2541     { eInlineBreakpointsHeaders, "headers",   "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
2542     { eInlineBreakpointsAlways,  "always",    "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
2543     { 0, NULL, NULL }
2544 };
2545 
2546 typedef enum x86DisassemblyFlavor
2547 {
2548     eX86DisFlavorDefault,
2549     eX86DisFlavorIntel,
2550     eX86DisFlavorATT
2551 } x86DisassemblyFlavor;
2552 
2553 static OptionEnumValueElement
2554 g_x86_dis_flavor_value_types[] =
2555 {
2556     { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
2557     { eX86DisFlavorIntel,   "intel",   "Intel disassembler flavor."},
2558     { eX86DisFlavorATT,     "att",     "AT&T disassembler flavor."},
2559     { 0, NULL, NULL }
2560 };
2561 
2562 static OptionEnumValueElement
2563 g_hex_immediate_style_values[] =
2564 {
2565     { Disassembler::eHexStyleC,        "c",      "C-style (0xffff)."},
2566     { Disassembler::eHexStyleAsm,      "asm",    "Asm-style (0ffffh)."},
2567     { 0, NULL, NULL }
2568 };
2569 
2570 static OptionEnumValueElement
2571 g_load_script_from_sym_file_values[] =
2572 {
2573     { eLoadScriptFromSymFileTrue,    "true",    "Load debug scripts inside symbol files"},
2574     { eLoadScriptFromSymFileFalse,   "false",   "Do not load debug scripts inside symbol files."},
2575     { eLoadScriptFromSymFileWarn,    "warn",    "Warn about debug scripts inside symbol files but do not load them."},
2576     { 0, NULL, NULL }
2577 };
2578 
2579 
2580 static OptionEnumValueElement
2581 g_memory_module_load_level_values[] =
2582 {
2583     { eMemoryModuleLoadLevelMinimal,  "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
2584     { eMemoryModuleLoadLevelPartial,  "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
2585     { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
2586     { 0, NULL, NULL }
2587 };
2588 
2589 static PropertyDefinition
2590 g_properties[] =
2591 {
2592     { "default-arch"                       , OptionValue::eTypeArch      , true , 0                         , NULL, NULL, "Default architecture to choose, when there's a choice." },
2593     { "expr-prefix"                        , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." },
2594     { "prefer-dynamic-value"               , OptionValue::eTypeEnum      , false, eNoDynamicValues          , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
2595     { "enable-synthetic-value"             , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Should synthetic values be used by default whenever available." },
2596     { "skip-prologue"                      , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
2597     { "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 "
2598       "where it exists on the current system.  It consists of an array of duples, the first element of each duple is "
2599       "some part (starting at the root) of the path to the file when it was built, "
2600       "and the second is where the remainder of the original build hierarchy is rooted on the local system.  "
2601       "Each element of the array is checked in order and the first one that results in a match wins." },
2602     { "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." },
2603     { "debug-file-search-paths"            , OptionValue::eTypeFileSpecList, false, 0                       , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
2604     { "max-children-count"                 , OptionValue::eTypeSInt64    , false, 256                       , NULL, NULL, "Maximum number of children to expand in any level of depth." },
2605     { "max-string-summary-length"          , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." },
2606     { "max-memory-read-size"               , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
2607     { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." },
2608     { "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." },
2609     { "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." },
2610     { "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." },
2611     { "inherit-env"                        , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
2612     { "input-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
2613     { "output-path"                        , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
2614     { "error-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
2615     { "disable-aslr"                       , OptionValue::eTypeBoolean   , false, true                      , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
2616     { "disable-stdio"                      , OptionValue::eTypeBoolean   , false, false                     , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
2617     { "inline-breakpoint-strategy"         , OptionValue::eTypeEnum      , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
2618         "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. "
2619         "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
2620         "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
2621         "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the "
2622         "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings "
2623         "file and line breakpoints." },
2624     // 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.
2625     { "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." },
2626     { "use-hex-immediates"                 , OptionValue::eTypeBoolean   , false, true,                       NULL, NULL, "Show immediates in disassembly as hexadecimal." },
2627     { "hex-immediate-style"                , OptionValue::eTypeEnum   ,    false, Disassembler::eHexStyleC,   NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." },
2628     { "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." },
2629     { "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." },
2630     { "memory-module-load-level"           , OptionValue::eTypeEnum   ,    false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
2631         "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. "
2632         "This setting helps users control how much information gets loaded when loading modules from memory."
2633         "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
2634         "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
2635         "'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). " },
2636     { "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." },
2637     { "trap-handler-names"                 , OptionValue::eTypeArray     , true,  OptionValue::eTypeString,   NULL, NULL, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." },
2638     { NULL                                 , OptionValue::eTypeInvalid   , false, 0                         , NULL, NULL, NULL }
2639 };
2640 enum
2641 {
2642     ePropertyDefaultArch,
2643     ePropertyExprPrefix,
2644     ePropertyPreferDynamic,
2645     ePropertyEnableSynthetic,
2646     ePropertySkipPrologue,
2647     ePropertySourceMap,
2648     ePropertyExecutableSearchPaths,
2649     ePropertyDebugFileSearchPaths,
2650     ePropertyMaxChildrenCount,
2651     ePropertyMaxSummaryLength,
2652     ePropertyMaxMemReadSize,
2653     ePropertyBreakpointUseAvoidList,
2654     ePropertyArg0,
2655     ePropertyRunArgs,
2656     ePropertyEnvVars,
2657     ePropertyInheritEnv,
2658     ePropertyInputPath,
2659     ePropertyOutputPath,
2660     ePropertyErrorPath,
2661     ePropertyDisableASLR,
2662     ePropertyDisableSTDIO,
2663     ePropertyInlineStrategy,
2664     ePropertyDisassemblyFlavor,
2665     ePropertyUseHexImmediates,
2666     ePropertyHexImmediateStyle,
2667     ePropertyUseFastStepping,
2668     ePropertyLoadScriptFromSymbolFile,
2669     ePropertyMemoryModuleLoadLevel,
2670     ePropertyDisplayExpressionsInCrashlogs,
2671     ePropertyTrapHandlerNames
2672 };
2673 
2674 
2675 class TargetOptionValueProperties : public OptionValueProperties
2676 {
2677 public:
2678     TargetOptionValueProperties (const ConstString &name) :
2679         OptionValueProperties (name),
2680         m_target (NULL),
2681         m_got_host_env (false)
2682     {
2683     }
2684 
2685     // This constructor is used when creating TargetOptionValueProperties when it
2686     // is part of a new lldb_private::Target instance. It will copy all current
2687     // global property values as needed
2688     TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
2689         OptionValueProperties(*target_properties_sp->GetValueProperties()),
2690         m_target (target),
2691         m_got_host_env (false)
2692     {
2693     }
2694 
2695     virtual const Property *
2696     GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
2697     {
2698         // When gettings the value for a key from the target options, we will always
2699         // try and grab the setting from the current target if there is one. Else we just
2700         // use the one from this instance.
2701         if (idx == ePropertyEnvVars)
2702             GetHostEnvironmentIfNeeded ();
2703 
2704         if (exe_ctx)
2705         {
2706             Target *target = exe_ctx->GetTargetPtr();
2707             if (target)
2708             {
2709                 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
2710                 if (this != target_properties)
2711                     return target_properties->ProtectedGetPropertyAtIndex (idx);
2712             }
2713         }
2714         return ProtectedGetPropertyAtIndex (idx);
2715     }
2716 
2717     lldb::TargetSP
2718     GetTargetSP ()
2719     {
2720         return m_target->shared_from_this();
2721     }
2722 
2723 protected:
2724 
2725     void
2726     GetHostEnvironmentIfNeeded () const
2727     {
2728         if (!m_got_host_env)
2729         {
2730             if (m_target)
2731             {
2732                 m_got_host_env = true;
2733                 const uint32_t idx = ePropertyInheritEnv;
2734                 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
2735                 {
2736                     PlatformSP platform_sp (m_target->GetPlatform());
2737                     if (platform_sp)
2738                     {
2739                         StringList env;
2740                         if (platform_sp->GetEnvironment(env))
2741                         {
2742                             OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
2743                             if (env_dict)
2744                             {
2745                                 const bool can_replace = false;
2746                                 const size_t envc = env.GetSize();
2747                                 for (size_t idx=0; idx<envc; idx++)
2748                                 {
2749                                     const char *env_entry = env.GetStringAtIndex (idx);
2750                                     if (env_entry)
2751                                     {
2752                                         const char *equal_pos = ::strchr(env_entry, '=');
2753                                         ConstString key;
2754                                         // It is ok to have environment variables with no values
2755                                         const char *value = NULL;
2756                                         if (equal_pos)
2757                                         {
2758                                             key.SetCStringWithLength(env_entry, equal_pos - env_entry);
2759                                             if (equal_pos[1])
2760                                                 value = equal_pos + 1;
2761                                         }
2762                                         else
2763                                         {
2764                                             key.SetCString(env_entry);
2765                                         }
2766                                         // Don't allow existing keys to be replaced with ones we get from the platform environment
2767                                         env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
2768                                     }
2769                                 }
2770                             }
2771                         }
2772                     }
2773                 }
2774             }
2775         }
2776     }
2777     Target *m_target;
2778     mutable bool m_got_host_env;
2779 };
2780 
2781 //----------------------------------------------------------------------
2782 // TargetProperties
2783 //----------------------------------------------------------------------
2784 TargetProperties::TargetProperties (Target *target) :
2785     Properties ()
2786 {
2787     if (target)
2788     {
2789         m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
2790     }
2791     else
2792     {
2793         m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
2794         m_collection_sp->Initialize(g_properties);
2795         m_collection_sp->AppendProperty(ConstString("process"),
2796                                         ConstString("Settings specify to processes."),
2797                                         true,
2798                                         Process::GetGlobalProperties()->GetValueProperties());
2799     }
2800 }
2801 
2802 TargetProperties::~TargetProperties ()
2803 {
2804 }
2805 ArchSpec
2806 TargetProperties::GetDefaultArchitecture () const
2807 {
2808     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2809     if (value)
2810         return value->GetCurrentValue();
2811     return ArchSpec();
2812 }
2813 
2814 void
2815 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
2816 {
2817     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2818     if (value)
2819         return value->SetCurrentValue(arch, true);
2820 }
2821 
2822 lldb::DynamicValueType
2823 TargetProperties::GetPreferDynamicValue() const
2824 {
2825     const uint32_t idx = ePropertyPreferDynamic;
2826     return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2827 }
2828 
2829 bool
2830 TargetProperties::GetDisableASLR () const
2831 {
2832     const uint32_t idx = ePropertyDisableASLR;
2833     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2834 }
2835 
2836 void
2837 TargetProperties::SetDisableASLR (bool b)
2838 {
2839     const uint32_t idx = ePropertyDisableASLR;
2840     m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2841 }
2842 
2843 bool
2844 TargetProperties::GetDisableSTDIO () const
2845 {
2846     const uint32_t idx = ePropertyDisableSTDIO;
2847     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2848 }
2849 
2850 void
2851 TargetProperties::SetDisableSTDIO (bool b)
2852 {
2853     const uint32_t idx = ePropertyDisableSTDIO;
2854     m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2855 }
2856 
2857 const char *
2858 TargetProperties::GetDisassemblyFlavor () const
2859 {
2860     const uint32_t idx = ePropertyDisassemblyFlavor;
2861     const char *return_value;
2862 
2863     x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2864     return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
2865     return return_value;
2866 }
2867 
2868 InlineStrategy
2869 TargetProperties::GetInlineStrategy () const
2870 {
2871     const uint32_t idx = ePropertyInlineStrategy;
2872     return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2873 }
2874 
2875 const char *
2876 TargetProperties::GetArg0 () const
2877 {
2878     const uint32_t idx = ePropertyArg0;
2879     return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
2880 }
2881 
2882 void
2883 TargetProperties::SetArg0 (const char *arg)
2884 {
2885     const uint32_t idx = ePropertyArg0;
2886     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
2887 }
2888 
2889 bool
2890 TargetProperties::GetRunArguments (Args &args) const
2891 {
2892     const uint32_t idx = ePropertyRunArgs;
2893     return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
2894 }
2895 
2896 void
2897 TargetProperties::SetRunArguments (const Args &args)
2898 {
2899     const uint32_t idx = ePropertyRunArgs;
2900     m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
2901 }
2902 
2903 size_t
2904 TargetProperties::GetEnvironmentAsArgs (Args &env) const
2905 {
2906     const uint32_t idx = ePropertyEnvVars;
2907     return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
2908 }
2909 
2910 bool
2911 TargetProperties::GetSkipPrologue() const
2912 {
2913     const uint32_t idx = ePropertySkipPrologue;
2914     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2915 }
2916 
2917 PathMappingList &
2918 TargetProperties::GetSourcePathMap () const
2919 {
2920     const uint32_t idx = ePropertySourceMap;
2921     OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
2922     assert(option_value);
2923     return option_value->GetCurrentValue();
2924 }
2925 
2926 FileSpecList &
2927 TargetProperties::GetExecutableSearchPaths ()
2928 {
2929     const uint32_t idx = ePropertyExecutableSearchPaths;
2930     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2931     assert(option_value);
2932     return option_value->GetCurrentValue();
2933 }
2934 
2935 FileSpecList &
2936 TargetProperties::GetDebugFileSearchPaths ()
2937 {
2938     const uint32_t idx = ePropertyDebugFileSearchPaths;
2939     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2940     assert(option_value);
2941     return option_value->GetCurrentValue();
2942 }
2943 
2944 bool
2945 TargetProperties::GetEnableSyntheticValue () const
2946 {
2947     const uint32_t idx = ePropertyEnableSynthetic;
2948     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2949 }
2950 
2951 uint32_t
2952 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
2953 {
2954     const uint32_t idx = ePropertyMaxChildrenCount;
2955     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2956 }
2957 
2958 uint32_t
2959 TargetProperties::GetMaximumSizeOfStringSummary() const
2960 {
2961     const uint32_t idx = ePropertyMaxSummaryLength;
2962     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2963 }
2964 
2965 uint32_t
2966 TargetProperties::GetMaximumMemReadSize () const
2967 {
2968     const uint32_t idx = ePropertyMaxMemReadSize;
2969     return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2970 }
2971 
2972 FileSpec
2973 TargetProperties::GetStandardInputPath () const
2974 {
2975     const uint32_t idx = ePropertyInputPath;
2976     return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
2977 }
2978 
2979 void
2980 TargetProperties::SetStandardInputPath (const char *p)
2981 {
2982     const uint32_t idx = ePropertyInputPath;
2983     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
2984 }
2985 
2986 FileSpec
2987 TargetProperties::GetStandardOutputPath () const
2988 {
2989     const uint32_t idx = ePropertyOutputPath;
2990     return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
2991 }
2992 
2993 void
2994 TargetProperties::SetStandardOutputPath (const char *p)
2995 {
2996     const uint32_t idx = ePropertyOutputPath;
2997     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
2998 }
2999 
3000 FileSpec
3001 TargetProperties::GetStandardErrorPath () const
3002 {
3003     const uint32_t idx = ePropertyErrorPath;
3004     return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3005 }
3006 
3007 const char *
3008 TargetProperties::GetExpressionPrefixContentsAsCString ()
3009 {
3010     const uint32_t idx = ePropertyExprPrefix;
3011     OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3012     if (file)
3013     {
3014         const bool null_terminate = true;
3015         DataBufferSP data_sp(file->GetFileContents(null_terminate));
3016         if (data_sp)
3017             return (const char *) data_sp->GetBytes();
3018     }
3019     return NULL;
3020 }
3021 
3022 void
3023 TargetProperties::SetStandardErrorPath (const char *p)
3024 {
3025     const uint32_t idx = ePropertyErrorPath;
3026     m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3027 }
3028 
3029 bool
3030 TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3031 {
3032     const uint32_t idx = ePropertyBreakpointUseAvoidList;
3033     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3034 }
3035 
3036 bool
3037 TargetProperties::GetUseHexImmediates () const
3038 {
3039     const uint32_t idx = ePropertyUseHexImmediates;
3040     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3041 }
3042 
3043 bool
3044 TargetProperties::GetUseFastStepping () const
3045 {
3046     const uint32_t idx = ePropertyUseFastStepping;
3047     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3048 }
3049 
3050 bool
3051 TargetProperties::GetDisplayExpressionsInCrashlogs () const
3052 {
3053     const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3054     return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3055 }
3056 
3057 LoadScriptFromSymFile
3058 TargetProperties::GetLoadScriptFromSymbolFile () const
3059 {
3060     const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
3061     return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3062 }
3063 
3064 Disassembler::HexImmediateStyle
3065 TargetProperties::GetHexImmediateStyle () const
3066 {
3067     const uint32_t idx = ePropertyHexImmediateStyle;
3068     return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3069 }
3070 
3071 MemoryModuleLoadLevel
3072 TargetProperties::GetMemoryModuleLoadLevel() const
3073 {
3074     const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3075     return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3076 }
3077 
3078 bool
3079 TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3080 {
3081     const uint32_t idx = ePropertyTrapHandlerNames;
3082     return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3083 }
3084 
3085 void
3086 TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3087 {
3088     const uint32_t idx = ePropertyTrapHandlerNames;
3089     m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3090 }
3091 
3092 //----------------------------------------------------------------------
3093 // Target::TargetEventData
3094 //----------------------------------------------------------------------
3095 const ConstString &
3096 Target::TargetEventData::GetFlavorString ()
3097 {
3098     static ConstString g_flavor ("Target::TargetEventData");
3099     return g_flavor;
3100 }
3101 
3102 const ConstString &
3103 Target::TargetEventData::GetFlavor () const
3104 {
3105     return TargetEventData::GetFlavorString ();
3106 }
3107 
3108 Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) :
3109     EventData(),
3110     m_target_sp (new_target_sp)
3111 {
3112 }
3113 
3114 Target::TargetEventData::~TargetEventData()
3115 {
3116 
3117 }
3118 
3119 void
3120 Target::TargetEventData::Dump (Stream *s) const
3121 {
3122 
3123 }
3124 
3125 const TargetSP
3126 Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp)
3127 {
3128     TargetSP target_sp;
3129 
3130     const TargetEventData *data = GetEventDataFromEvent (event_sp.get());
3131     if (data)
3132         target_sp = data->m_target_sp;
3133 
3134     return target_sp;
3135 }
3136 
3137 const Target::TargetEventData *
3138 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
3139 {
3140     if (event_ptr)
3141     {
3142         const EventData *event_data = event_ptr->GetData();
3143         if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
3144             return static_cast <const TargetEventData *> (event_ptr->GetData());
3145     }
3146     return NULL;
3147 }
3148 
3149