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