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/Target/Target.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Breakpoint/BreakpointResolver.h"
17 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
18 #include "lldb/Breakpoint/BreakpointResolverFileLine.h"
19 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
20 #include "lldb/Breakpoint/BreakpointResolverName.h"
21 #include "lldb/Breakpoint/Watchpoint.h"
22 #include "lldb/Core/Debugger.h"
23 #include "lldb/Core/Event.h"
24 #include "lldb/Core/Log.h"
25 #include "lldb/Core/StreamAsynchronousIO.h"
26 #include "lldb/Core/StreamString.h"
27 #include "lldb/Core/Timer.h"
28 #include "lldb/Core/ValueObject.h"
29 #include "lldb/Expression/ClangUserExpression.h"
30 #include "lldb/Host/Host.h"
31 #include "lldb/Interpreter/CommandInterpreter.h"
32 #include "lldb/Interpreter/CommandReturnObject.h"
33 #include "lldb/lldb-private-log.h"
34 #include "lldb/Symbol/ObjectFile.h"
35 #include "lldb/Target/Process.h"
36 #include "lldb/Target/StackFrame.h"
37 #include "lldb/Target/Thread.h"
38 #include "lldb/Target/ThreadSpec.h"
39 
40 using namespace lldb;
41 using namespace lldb_private;
42 
43 //----------------------------------------------------------------------
44 // Target constructor
45 //----------------------------------------------------------------------
46 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) :
47     Broadcaster ("lldb.target"),
48     ExecutionContextScope (),
49     TargetInstanceSettings (*GetSettingsController()),
50     m_debugger (debugger),
51     m_platform_sp (platform_sp),
52     m_mutex (Mutex::eMutexTypeRecursive),
53     m_arch (target_arch),
54     m_images (),
55     m_section_load_list (),
56     m_breakpoint_list (false),
57     m_internal_breakpoint_list (true),
58     m_watchpoint_list (),
59     m_process_sp (),
60     m_search_filter_sp (),
61     m_image_search_paths (ImageSearchPathsChanged, this),
62     m_scratch_ast_context_ap (NULL),
63     m_persistent_variables (),
64     m_source_manager(*this),
65     m_stop_hooks (),
66     m_stop_hook_next_id (0),
67     m_suppress_stop_hooks (false)
68 {
69     SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
70     SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
71     SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
72 
73     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
74     if (log)
75         log->Printf ("%p Target::Target()", this);
76 }
77 
78 //----------------------------------------------------------------------
79 // Destructor
80 //----------------------------------------------------------------------
81 Target::~Target()
82 {
83     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
84     if (log)
85         log->Printf ("%p Target::~Target()", this);
86     DeleteCurrentProcess ();
87 }
88 
89 void
90 Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
91 {
92 //    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
93     if (description_level != lldb::eDescriptionLevelBrief)
94     {
95         s->Indent();
96         s->PutCString("Target\n");
97         s->IndentMore();
98             m_images.Dump(s);
99             m_breakpoint_list.Dump(s);
100             m_internal_breakpoint_list.Dump(s);
101         s->IndentLess();
102     }
103     else
104     {
105         Module *exe_module = GetExecutableModulePointer();
106         if (exe_module)
107             s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
108         else
109             s->PutCString ("No executable module.");
110     }
111 }
112 
113 void
114 Target::DeleteCurrentProcess ()
115 {
116     if (m_process_sp.get())
117     {
118         m_section_load_list.Clear();
119         if (m_process_sp->IsAlive())
120             m_process_sp->Destroy();
121 
122         m_process_sp->Finalize();
123 
124         // Do any cleanup of the target we need to do between process instances.
125         // NB It is better to do this before destroying the process in case the
126         // clean up needs some help from the process.
127         m_breakpoint_list.ClearAllBreakpointSites();
128         m_internal_breakpoint_list.ClearAllBreakpointSites();
129         // Disable watchpoints just on the debugger side.
130         DisableAllWatchpoints(false);
131         m_process_sp.reset();
132     }
133 }
134 
135 const lldb::ProcessSP &
136 Target::CreateProcess (Listener &listener, const char *plugin_name)
137 {
138     DeleteCurrentProcess ();
139     m_process_sp.reset(Process::FindPlugin(*this, plugin_name, listener));
140     return m_process_sp;
141 }
142 
143 const lldb::ProcessSP &
144 Target::GetProcessSP () const
145 {
146     return m_process_sp;
147 }
148 
149 lldb::TargetSP
150 Target::GetSP()
151 {
152     // This object contains an instrusive ref count base class so we can
153     // easily make a shared pointer to this object
154     return TargetSP(this);
155 }
156 
157 void
158 Target::Destroy()
159 {
160     Mutex::Locker locker (m_mutex);
161     DeleteCurrentProcess ();
162     m_platform_sp.reset();
163     m_arch.Clear();
164     m_images.Clear();
165     m_section_load_list.Clear();
166     const bool notify = false;
167     m_breakpoint_list.RemoveAll(notify);
168     m_internal_breakpoint_list.RemoveAll(notify);
169     m_last_created_breakpoint.reset();
170     m_last_created_watchpoint.reset();
171     m_search_filter_sp.reset();
172     m_image_search_paths.Clear(notify);
173     m_scratch_ast_context_ap.reset();
174     m_persistent_variables.Clear();
175     m_stop_hooks.clear();
176     m_stop_hook_next_id = 0;
177     m_suppress_stop_hooks = false;
178 }
179 
180 
181 BreakpointList &
182 Target::GetBreakpointList(bool internal)
183 {
184     if (internal)
185         return m_internal_breakpoint_list;
186     else
187         return m_breakpoint_list;
188 }
189 
190 const BreakpointList &
191 Target::GetBreakpointList(bool internal) const
192 {
193     if (internal)
194         return m_internal_breakpoint_list;
195     else
196         return m_breakpoint_list;
197 }
198 
199 BreakpointSP
200 Target::GetBreakpointByID (break_id_t break_id)
201 {
202     BreakpointSP bp_sp;
203 
204     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
205         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
206     else
207         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
208 
209     return bp_sp;
210 }
211 
212 BreakpointSP
213 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
214                   const FileSpecList *source_file_spec_list,
215                   RegularExpression &source_regex,
216                   bool internal)
217 {
218     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
219     BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex));
220     return CreateBreakpoint (filter_sp, resolver_sp, internal);
221 }
222 
223 
224 BreakpointSP
225 Target::CreateBreakpoint (const FileSpecList *containingModules, const FileSpec &file, uint32_t line_no, bool check_inlines, bool internal)
226 {
227     SearchFilterSP filter_sp(GetSearchFilterForModuleList (containingModules));
228     BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, file, line_no, check_inlines));
229     return CreateBreakpoint (filter_sp, resolver_sp, internal);
230 }
231 
232 
233 BreakpointSP
234 Target::CreateBreakpoint (lldb::addr_t addr, bool internal)
235 {
236     Address so_addr;
237     // Attempt to resolve our load address if possible, though it is ok if
238     // it doesn't resolve to section/offset.
239 
240     // Try and resolve as a load address if possible
241     m_section_load_list.ResolveLoadAddress(addr, so_addr);
242     if (!so_addr.IsValid())
243     {
244         // The address didn't resolve, so just set this as an absolute address
245         so_addr.SetOffset (addr);
246     }
247     BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal));
248     return bp_sp;
249 }
250 
251 BreakpointSP
252 Target::CreateBreakpoint (Address &addr, bool internal)
253 {
254     TargetSP target_sp = this->GetSP();
255     SearchFilterSP filter_sp(new SearchFilter (target_sp));
256     BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
257     return CreateBreakpoint (filter_sp, resolver_sp, internal);
258 }
259 
260 BreakpointSP
261 Target::CreateBreakpoint (const FileSpecList *containingModules,
262                           const FileSpecList *containingSourceFiles,
263                           const char *func_name,
264                           uint32_t func_name_type_mask,
265                           bool internal,
266                           LazyBool skip_prologue)
267 {
268     BreakpointSP bp_sp;
269     if (func_name)
270     {
271         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
272 
273         BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
274                                                                       func_name,
275                                                                       func_name_type_mask,
276                                                                       Breakpoint::Exact,
277                                                                       skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
278         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal);
279     }
280     return bp_sp;
281 }
282 
283 
284 SearchFilterSP
285 Target::GetSearchFilterForModule (const FileSpec *containingModule)
286 {
287     SearchFilterSP filter_sp;
288     lldb::TargetSP target_sp = this->GetSP();
289     if (containingModule != NULL)
290     {
291         // TODO: We should look into sharing module based search filters
292         // across many breakpoints like we do for the simple target based one
293         filter_sp.reset (new SearchFilterByModule (target_sp, *containingModule));
294     }
295     else
296     {
297         if (m_search_filter_sp.get() == NULL)
298             m_search_filter_sp.reset (new SearchFilter (target_sp));
299         filter_sp = m_search_filter_sp;
300     }
301     return filter_sp;
302 }
303 
304 SearchFilterSP
305 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
306 {
307     SearchFilterSP filter_sp;
308     lldb::TargetSP target_sp = this->GetSP();
309     if (containingModules && containingModules->GetSize() != 0)
310     {
311         // TODO: We should look into sharing module based search filters
312         // across many breakpoints like we do for the simple target based one
313         filter_sp.reset (new SearchFilterByModuleList (target_sp, *containingModules));
314     }
315     else
316     {
317         if (m_search_filter_sp.get() == NULL)
318             m_search_filter_sp.reset (new SearchFilter (target_sp));
319         filter_sp = m_search_filter_sp;
320     }
321     return filter_sp;
322 }
323 
324 SearchFilterSP
325 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, const FileSpecList *containingSourceFiles)
326 {
327     if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
328         return GetSearchFilterForModuleList(containingModules);
329 
330     SearchFilterSP filter_sp;
331     lldb::TargetSP target_sp = this->GetSP();
332     if (containingModules == NULL)
333     {
334         // We could make a special "CU List only SearchFilter".  Better yet was if these could be composable,
335         // but that will take a little reworking.
336 
337         filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, FileSpecList(), *containingSourceFiles));
338     }
339     else
340     {
341         filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, *containingModules, *containingSourceFiles));
342     }
343     return filter_sp;
344 }
345 
346 BreakpointSP
347 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
348                           const FileSpecList *containingSourceFiles,
349                           RegularExpression &func_regex,
350                           bool internal,
351                           LazyBool skip_prologue)
352 {
353     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
354     BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
355                                                                  func_regex,
356                                                                  skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
357 
358     return CreateBreakpoint (filter_sp, resolver_sp, internal);
359 }
360 
361 BreakpointSP
362 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal)
363 {
364     BreakpointSP bp_sp;
365     if (filter_sp && resolver_sp)
366     {
367         bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp));
368         resolver_sp->SetBreakpoint (bp_sp.get());
369 
370         if (internal)
371             m_internal_breakpoint_list.Add (bp_sp, false);
372         else
373             m_breakpoint_list.Add (bp_sp, true);
374 
375         LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
376         if (log)
377         {
378             StreamString s;
379             bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
380             log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData());
381         }
382 
383         bp_sp->ResolveBreakpoint();
384     }
385 
386     if (!internal && bp_sp)
387     {
388         m_last_created_breakpoint = bp_sp;
389     }
390 
391     return bp_sp;
392 }
393 
394 bool
395 Target::ProcessIsValid()
396 {
397     return (m_process_sp && m_process_sp->IsAlive());
398 }
399 
400 // See also Watchpoint::SetWatchpointType(uint32_t type) and
401 // the OptionGroupWatchpoint::WatchType enum type.
402 WatchpointSP
403 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, uint32_t type)
404 {
405     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
406     if (log)
407         log->Printf("Target::%s (addr = 0x%8.8llx size = %zu type = %u)\n",
408                     __FUNCTION__, addr, size, type);
409 
410     WatchpointSP wp_sp;
411     if (!ProcessIsValid())
412         return wp_sp;
413     if (addr == LLDB_INVALID_ADDRESS || size == 0)
414         return wp_sp;
415 
416     // Currently we only support one watchpoint per address, with total number
417     // of watchpoints limited by the hardware which the inferior is running on.
418     WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
419     if (matched_sp)
420     {
421         size_t old_size = matched_sp->GetByteSize();
422         uint32_t old_type =
423             (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
424             (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
425         // Return the existing watchpoint if both size and type match.
426         if (size == old_size && type == old_type) {
427             wp_sp = matched_sp;
428             wp_sp->SetEnabled(false);
429         } else {
430             // Nil the matched watchpoint; we will be creating a new one.
431             m_process_sp->DisableWatchpoint(matched_sp.get());
432             m_watchpoint_list.Remove(matched_sp->GetID());
433         }
434     }
435 
436     if (!wp_sp) {
437         Watchpoint *new_wp = new Watchpoint(addr, size);
438         if (!new_wp) {
439             printf("Watchpoint ctor failed, out of memory?\n");
440             return wp_sp;
441         }
442         new_wp->SetWatchpointType(type);
443         new_wp->SetTarget(this);
444         wp_sp.reset(new_wp);
445         m_watchpoint_list.Add(wp_sp);
446     }
447 
448     Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
449     if (log)
450             log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
451                         __FUNCTION__,
452                         rc.Success() ? "succeeded" : "failed",
453                         wp_sp->GetID());
454 
455     if (rc.Fail())
456         wp_sp.reset();
457     else
458         m_last_created_watchpoint = wp_sp;
459     return wp_sp;
460 }
461 
462 void
463 Target::RemoveAllBreakpoints (bool internal_also)
464 {
465     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
466     if (log)
467         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
468 
469     m_breakpoint_list.RemoveAll (true);
470     if (internal_also)
471         m_internal_breakpoint_list.RemoveAll (false);
472 
473     m_last_created_breakpoint.reset();
474 }
475 
476 void
477 Target::DisableAllBreakpoints (bool internal_also)
478 {
479     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
480     if (log)
481         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
482 
483     m_breakpoint_list.SetEnabledAll (false);
484     if (internal_also)
485         m_internal_breakpoint_list.SetEnabledAll (false);
486 }
487 
488 void
489 Target::EnableAllBreakpoints (bool internal_also)
490 {
491     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
492     if (log)
493         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
494 
495     m_breakpoint_list.SetEnabledAll (true);
496     if (internal_also)
497         m_internal_breakpoint_list.SetEnabledAll (true);
498 }
499 
500 bool
501 Target::RemoveBreakpointByID (break_id_t break_id)
502 {
503     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
504     if (log)
505         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
506 
507     if (DisableBreakpointByID (break_id))
508     {
509         if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
510             m_internal_breakpoint_list.Remove(break_id, false);
511         else
512         {
513             if (m_last_created_breakpoint)
514             {
515                 if (m_last_created_breakpoint->GetID() == break_id)
516                     m_last_created_breakpoint.reset();
517             }
518             m_breakpoint_list.Remove(break_id, true);
519         }
520         return true;
521     }
522     return false;
523 }
524 
525 bool
526 Target::DisableBreakpointByID (break_id_t break_id)
527 {
528     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
529     if (log)
530         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
531 
532     BreakpointSP bp_sp;
533 
534     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
535         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
536     else
537         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
538     if (bp_sp)
539     {
540         bp_sp->SetEnabled (false);
541         return true;
542     }
543     return false;
544 }
545 
546 bool
547 Target::EnableBreakpointByID (break_id_t break_id)
548 {
549     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
550     if (log)
551         log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
552                      __FUNCTION__,
553                      break_id,
554                      LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
555 
556     BreakpointSP bp_sp;
557 
558     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
559         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
560     else
561         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
562 
563     if (bp_sp)
564     {
565         bp_sp->SetEnabled (true);
566         return true;
567     }
568     return false;
569 }
570 
571 // The flag 'end_to_end', default to true, signifies that the operation is
572 // performed end to end, for both the debugger and the debuggee.
573 
574 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
575 // to end operations.
576 bool
577 Target::RemoveAllWatchpoints (bool end_to_end)
578 {
579     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
580     if (log)
581         log->Printf ("Target::%s\n", __FUNCTION__);
582 
583     if (!end_to_end) {
584         m_watchpoint_list.RemoveAll();
585         return true;
586     }
587 
588     // Otherwise, it's an end to end operation.
589 
590     if (!ProcessIsValid())
591         return false;
592 
593     size_t num_watchpoints = m_watchpoint_list.GetSize();
594     for (size_t i = 0; i < num_watchpoints; ++i)
595     {
596         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
597         if (!wp_sp)
598             return false;
599 
600         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
601         if (rc.Fail())
602             return false;
603     }
604     m_watchpoint_list.RemoveAll ();
605     return true; // Success!
606 }
607 
608 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
609 // end operations.
610 bool
611 Target::DisableAllWatchpoints (bool end_to_end)
612 {
613     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
614     if (log)
615         log->Printf ("Target::%s\n", __FUNCTION__);
616 
617     if (!end_to_end) {
618         m_watchpoint_list.SetEnabledAll(false);
619         return true;
620     }
621 
622     // Otherwise, it's an end to end operation.
623 
624     if (!ProcessIsValid())
625         return false;
626 
627     size_t num_watchpoints = m_watchpoint_list.GetSize();
628     for (size_t i = 0; i < num_watchpoints; ++i)
629     {
630         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
631         if (!wp_sp)
632             return false;
633 
634         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
635         if (rc.Fail())
636             return false;
637     }
638     return true; // Success!
639 }
640 
641 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
642 // end operations.
643 bool
644 Target::EnableAllWatchpoints (bool end_to_end)
645 {
646     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
647     if (log)
648         log->Printf ("Target::%s\n", __FUNCTION__);
649 
650     if (!end_to_end) {
651         m_watchpoint_list.SetEnabledAll(true);
652         return true;
653     }
654 
655     // Otherwise, it's an end to end operation.
656 
657     if (!ProcessIsValid())
658         return false;
659 
660     size_t num_watchpoints = m_watchpoint_list.GetSize();
661     for (size_t i = 0; i < num_watchpoints; ++i)
662     {
663         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
664         if (!wp_sp)
665             return false;
666 
667         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
668         if (rc.Fail())
669             return false;
670     }
671     return true; // Success!
672 }
673 
674 // Assumption: Caller holds the list mutex lock for m_watchpoint_list
675 // during these operations.
676 bool
677 Target::IgnoreAllWatchpoints (uint32_t ignore_count)
678 {
679     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
680     if (log)
681         log->Printf ("Target::%s\n", __FUNCTION__);
682 
683     if (!ProcessIsValid())
684         return false;
685 
686     size_t num_watchpoints = m_watchpoint_list.GetSize();
687     for (size_t i = 0; i < num_watchpoints; ++i)
688     {
689         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
690         if (!wp_sp)
691             return false;
692 
693         wp_sp->SetIgnoreCount(ignore_count);
694     }
695     return true; // Success!
696 }
697 
698 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
699 bool
700 Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
701 {
702     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
703     if (log)
704         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
705 
706     if (!ProcessIsValid())
707         return false;
708 
709     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
710     if (wp_sp)
711     {
712         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
713         if (rc.Success())
714             return true;
715 
716         // Else, fallthrough.
717     }
718     return false;
719 }
720 
721 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
722 bool
723 Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
724 {
725     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
726     if (log)
727         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
728 
729     if (!ProcessIsValid())
730         return false;
731 
732     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
733     if (wp_sp)
734     {
735         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
736         if (rc.Success())
737             return true;
738 
739         // Else, fallthrough.
740     }
741     return false;
742 }
743 
744 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
745 bool
746 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
747 {
748     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
749     if (log)
750         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
751 
752     if (DisableWatchpointByID (watch_id))
753     {
754         m_watchpoint_list.Remove(watch_id);
755         return true;
756     }
757     return false;
758 }
759 
760 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
761 bool
762 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
763 {
764     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
765     if (log)
766         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
767 
768     if (!ProcessIsValid())
769         return false;
770 
771     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
772     if (wp_sp)
773     {
774         wp_sp->SetIgnoreCount(ignore_count);
775         return true;
776     }
777     return false;
778 }
779 
780 ModuleSP
781 Target::GetExecutableModule ()
782 {
783     return m_images.GetModuleAtIndex(0);
784 }
785 
786 Module*
787 Target::GetExecutableModulePointer ()
788 {
789     return m_images.GetModulePointerAtIndex(0);
790 }
791 
792 void
793 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
794 {
795     m_images.Clear();
796     m_scratch_ast_context_ap.reset();
797 
798     if (executable_sp.get())
799     {
800         Timer scoped_timer (__PRETTY_FUNCTION__,
801                             "Target::SetExecutableModule (executable = '%s/%s')",
802                             executable_sp->GetFileSpec().GetDirectory().AsCString(),
803                             executable_sp->GetFileSpec().GetFilename().AsCString());
804 
805         m_images.Append(executable_sp); // The first image is our exectuable file
806 
807         // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module.
808         if (!m_arch.IsValid())
809             m_arch = executable_sp->GetArchitecture();
810 
811         FileSpecList dependent_files;
812         ObjectFile *executable_objfile = executable_sp->GetObjectFile();
813 
814         if (executable_objfile && get_dependent_files)
815         {
816             executable_objfile->GetDependentModules(dependent_files);
817             for (uint32_t i=0; i<dependent_files.GetSize(); i++)
818             {
819                 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
820                 FileSpec platform_dependent_file_spec;
821                 if (m_platform_sp)
822                     m_platform_sp->GetFile (dependent_file_spec, NULL, platform_dependent_file_spec);
823                 else
824                     platform_dependent_file_spec = dependent_file_spec;
825 
826                 ModuleSP image_module_sp(GetSharedModule (platform_dependent_file_spec,
827                                                           m_arch));
828                 if (image_module_sp.get())
829                 {
830                     ObjectFile *objfile = image_module_sp->GetObjectFile();
831                     if (objfile)
832                         objfile->GetDependentModules(dependent_files);
833                 }
834             }
835         }
836 
837     }
838 
839     UpdateInstanceName();
840 }
841 
842 
843 bool
844 Target::SetArchitecture (const ArchSpec &arch_spec)
845 {
846     if (m_arch == arch_spec)
847     {
848         // If we're setting the architecture to our current architecture, we
849         // don't need to do anything.
850         return true;
851     }
852     else if (!m_arch.IsValid())
853     {
854         // If we haven't got a valid arch spec, then we just need to set it.
855         m_arch = arch_spec;
856         return true;
857     }
858     else
859     {
860         // If we have an executable file, try to reset the executable to the desired architecture
861         m_arch = arch_spec;
862         ModuleSP executable_sp = GetExecutableModule ();
863         m_images.Clear();
864         m_scratch_ast_context_ap.reset();
865         // Need to do something about unsetting breakpoints.
866 
867         if (executable_sp)
868         {
869             FileSpec exec_file_spec = executable_sp->GetFileSpec();
870             Error error = ModuleList::GetSharedModule(exec_file_spec,
871                                                       arch_spec,
872                                                       NULL,
873                                                       NULL,
874                                                       0,
875                                                       executable_sp,
876                                                       NULL,
877                                                       NULL);
878 
879             if (!error.Fail() && executable_sp)
880             {
881                 SetExecutableModule (executable_sp, true);
882                 return true;
883             }
884             else
885             {
886                 return false;
887             }
888         }
889         else
890         {
891             return false;
892         }
893     }
894 }
895 
896 void
897 Target::ModuleAdded (ModuleSP &module_sp)
898 {
899     // A module is being added to this target for the first time
900     ModuleList module_list;
901     module_list.Append(module_sp);
902     ModulesDidLoad (module_list);
903 }
904 
905 void
906 Target::ModuleUpdated (ModuleSP &old_module_sp, ModuleSP &new_module_sp)
907 {
908     // A module is replacing an already added module
909     ModuleList module_list;
910     module_list.Append (old_module_sp);
911     ModulesDidUnload (module_list);
912     module_list.Clear ();
913     module_list.Append (new_module_sp);
914     ModulesDidLoad (module_list);
915 }
916 
917 void
918 Target::ModulesDidLoad (ModuleList &module_list)
919 {
920     m_breakpoint_list.UpdateBreakpoints (module_list, true);
921     // TODO: make event data that packages up the module_list
922     BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
923 }
924 
925 void
926 Target::ModulesDidUnload (ModuleList &module_list)
927 {
928     m_breakpoint_list.UpdateBreakpoints (module_list, false);
929 
930     // Remove the images from the target image list
931     m_images.Remove(module_list);
932 
933     // TODO: make event data that packages up the module_list
934     BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
935 }
936 
937 size_t
938 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
939 {
940     const Section *section = addr.GetSection();
941     if (section && section->GetModule())
942     {
943         ObjectFile *objfile = section->GetModule()->GetObjectFile();
944         if (objfile)
945         {
946             size_t bytes_read = section->ReadSectionDataFromObjectFile (objfile,
947                                                                         addr.GetOffset(),
948                                                                         dst,
949                                                                         dst_len);
950             if (bytes_read > 0)
951                 return bytes_read;
952             else
953                 error.SetErrorStringWithFormat("error reading data from section %s", section->GetName().GetCString());
954         }
955         else
956         {
957             error.SetErrorString("address isn't from a object file");
958         }
959     }
960     else
961     {
962         error.SetErrorString("address doesn't contain a section that points to a section in a object file");
963     }
964     return 0;
965 }
966 
967 size_t
968 Target::ReadMemory (const Address& addr,
969                     bool prefer_file_cache,
970                     void *dst,
971                     size_t dst_len,
972                     Error &error,
973                     lldb::addr_t *load_addr_ptr)
974 {
975     error.Clear();
976 
977     // if we end up reading this from process memory, we will fill this
978     // with the actual load address
979     if (load_addr_ptr)
980         *load_addr_ptr = LLDB_INVALID_ADDRESS;
981 
982     size_t bytes_read = 0;
983 
984     addr_t load_addr = LLDB_INVALID_ADDRESS;
985     addr_t file_addr = LLDB_INVALID_ADDRESS;
986     Address resolved_addr;
987     if (!addr.IsSectionOffset())
988     {
989         if (m_section_load_list.IsEmpty())
990         {
991             // No sections are loaded, so we must assume we are not running
992             // yet and anything we are given is a file address.
993             file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
994             m_images.ResolveFileAddress (file_addr, resolved_addr);
995         }
996         else
997         {
998             // We have at least one section loaded. This can be becuase
999             // we have manually loaded some sections with "target modules load ..."
1000             // or because we have have a live process that has sections loaded
1001             // through the dynamic loader
1002             load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
1003             m_section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
1004         }
1005     }
1006     if (!resolved_addr.IsValid())
1007         resolved_addr = addr;
1008 
1009 
1010     if (prefer_file_cache)
1011     {
1012         bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1013         if (bytes_read > 0)
1014             return bytes_read;
1015     }
1016 
1017     if (ProcessIsValid())
1018     {
1019         if (load_addr == LLDB_INVALID_ADDRESS)
1020             load_addr = resolved_addr.GetLoadAddress (this);
1021 
1022         if (load_addr == LLDB_INVALID_ADDRESS)
1023         {
1024             if (resolved_addr.GetModule() && resolved_addr.GetModule()->GetFileSpec())
1025                 error.SetErrorStringWithFormat("%s[0x%llx] can't be resolved, %s in not currently loaded.\n",
1026                                                resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString(),
1027                                                resolved_addr.GetFileAddress(),
1028                                                resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString());
1029             else
1030                 error.SetErrorStringWithFormat("0x%llx can't be resolved.\n", resolved_addr.GetFileAddress());
1031         }
1032         else
1033         {
1034             bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1035             if (bytes_read != dst_len)
1036             {
1037                 if (error.Success())
1038                 {
1039                     if (bytes_read == 0)
1040                         error.SetErrorStringWithFormat("Read memory from 0x%llx failed.\n", load_addr);
1041                     else
1042                         error.SetErrorStringWithFormat("Only %zu of %zu bytes were read from memory at 0x%llx.\n", bytes_read, dst_len, load_addr);
1043                 }
1044             }
1045             if (bytes_read)
1046             {
1047                 if (load_addr_ptr)
1048                     *load_addr_ptr = load_addr;
1049                 return bytes_read;
1050             }
1051             // If the address is not section offset we have an address that
1052             // doesn't resolve to any address in any currently loaded shared
1053             // libaries and we failed to read memory so there isn't anything
1054             // more we can do. If it is section offset, we might be able to
1055             // read cached memory from the object file.
1056             if (!resolved_addr.IsSectionOffset())
1057                 return 0;
1058         }
1059     }
1060 
1061     if (!prefer_file_cache && resolved_addr.IsSectionOffset())
1062     {
1063         // If we didn't already try and read from the object file cache, then
1064         // try it after failing to read from the process.
1065         return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1066     }
1067     return 0;
1068 }
1069 
1070 size_t
1071 Target::ReadScalarIntegerFromMemory (const Address& addr,
1072                                      bool prefer_file_cache,
1073                                      uint32_t byte_size,
1074                                      bool is_signed,
1075                                      Scalar &scalar,
1076                                      Error &error)
1077 {
1078     uint64_t uval;
1079 
1080     if (byte_size <= sizeof(uval))
1081     {
1082         size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1083         if (bytes_read == byte_size)
1084         {
1085             DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
1086             uint32_t offset = 0;
1087             if (byte_size <= 4)
1088                 scalar = data.GetMaxU32 (&offset, byte_size);
1089             else
1090                 scalar = data.GetMaxU64 (&offset, byte_size);
1091 
1092             if (is_signed)
1093                 scalar.SignExtend(byte_size * 8);
1094             return bytes_read;
1095         }
1096     }
1097     else
1098     {
1099         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1100     }
1101     return 0;
1102 }
1103 
1104 uint64_t
1105 Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1106                                        bool prefer_file_cache,
1107                                        size_t integer_byte_size,
1108                                        uint64_t fail_value,
1109                                        Error &error)
1110 {
1111     Scalar scalar;
1112     if (ReadScalarIntegerFromMemory (addr,
1113                                      prefer_file_cache,
1114                                      integer_byte_size,
1115                                      false,
1116                                      scalar,
1117                                      error))
1118         return scalar.ULongLong(fail_value);
1119     return fail_value;
1120 }
1121 
1122 bool
1123 Target::ReadPointerFromMemory (const Address& addr,
1124                                bool prefer_file_cache,
1125                                Error &error,
1126                                Address &pointer_addr)
1127 {
1128     Scalar scalar;
1129     if (ReadScalarIntegerFromMemory (addr,
1130                                      prefer_file_cache,
1131                                      m_arch.GetAddressByteSize(),
1132                                      false,
1133                                      scalar,
1134                                      error))
1135     {
1136         addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1137         if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1138         {
1139             if (m_section_load_list.IsEmpty())
1140             {
1141                 // No sections are loaded, so we must assume we are not running
1142                 // yet and anything we are given is a file address.
1143                 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1144             }
1145             else
1146             {
1147                 // We have at least one section loaded. This can be becuase
1148                 // we have manually loaded some sections with "target modules load ..."
1149                 // or because we have have a live process that has sections loaded
1150                 // through the dynamic loader
1151                 m_section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
1152             }
1153             // We weren't able to resolve the pointer value, so just return
1154             // an address with no section
1155             if (!pointer_addr.IsValid())
1156                 pointer_addr.SetOffset (pointer_vm_addr);
1157             return true;
1158 
1159         }
1160     }
1161     return false;
1162 }
1163 
1164 ModuleSP
1165 Target::GetSharedModule
1166 (
1167     const FileSpec& file_spec,
1168     const ArchSpec& arch,
1169     const lldb_private::UUID *uuid_ptr,
1170     const ConstString *object_name,
1171     off_t object_offset,
1172     Error *error_ptr
1173 )
1174 {
1175     // Don't pass in the UUID so we can tell if we have a stale value in our list
1176     ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1177     bool did_create_module = false;
1178     ModuleSP module_sp;
1179 
1180     Error error;
1181 
1182     // If there are image search path entries, try to use them first to acquire a suitable image.
1183     if (m_image_search_paths.GetSize())
1184     {
1185         FileSpec transformed_spec;
1186         if (m_image_search_paths.RemapPath (file_spec.GetDirectory(), transformed_spec.GetDirectory()))
1187         {
1188             transformed_spec.GetFilename() = file_spec.GetFilename();
1189             error = ModuleList::GetSharedModule (transformed_spec, arch, uuid_ptr, object_name, object_offset, module_sp, &old_module_sp, &did_create_module);
1190         }
1191     }
1192 
1193     // The platform is responsible for finding and caching an appropriate
1194     // module in the shared module cache.
1195     if (m_platform_sp)
1196     {
1197         FileSpec platform_file_spec;
1198         error = m_platform_sp->GetSharedModule (file_spec,
1199                                                 arch,
1200                                                 uuid_ptr,
1201                                                 object_name,
1202                                                 object_offset,
1203                                                 module_sp,
1204                                                 &old_module_sp,
1205                                                 &did_create_module);
1206     }
1207     else
1208     {
1209         error.SetErrorString("no platform is currently set");
1210     }
1211 
1212     // If a module hasn't been found yet, use the unmodified path.
1213     if (module_sp)
1214     {
1215         m_images.Append (module_sp);
1216         if (did_create_module)
1217         {
1218             if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1219                 ModuleUpdated(old_module_sp, module_sp);
1220             else
1221                 ModuleAdded(module_sp);
1222         }
1223     }
1224     if (error_ptr)
1225         *error_ptr = error;
1226     return module_sp;
1227 }
1228 
1229 
1230 Target *
1231 Target::CalculateTarget ()
1232 {
1233     return this;
1234 }
1235 
1236 Process *
1237 Target::CalculateProcess ()
1238 {
1239     return NULL;
1240 }
1241 
1242 Thread *
1243 Target::CalculateThread ()
1244 {
1245     return NULL;
1246 }
1247 
1248 StackFrame *
1249 Target::CalculateStackFrame ()
1250 {
1251     return NULL;
1252 }
1253 
1254 void
1255 Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
1256 {
1257     exe_ctx.Clear();
1258     exe_ctx.SetTargetPtr(this);
1259 }
1260 
1261 PathMappingList &
1262 Target::GetImageSearchPathList ()
1263 {
1264     return m_image_search_paths;
1265 }
1266 
1267 void
1268 Target::ImageSearchPathsChanged
1269 (
1270     const PathMappingList &path_list,
1271     void *baton
1272 )
1273 {
1274     Target *target = (Target *)baton;
1275     ModuleSP exe_module_sp (target->GetExecutableModule());
1276     if (exe_module_sp)
1277     {
1278         target->m_images.Clear();
1279         target->SetExecutableModule (exe_module_sp, true);
1280     }
1281 }
1282 
1283 ClangASTContext *
1284 Target::GetScratchClangASTContext()
1285 {
1286     // Now see if we know the target triple, and if so, create our scratch AST context:
1287     if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid())
1288         m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
1289     return m_scratch_ast_context_ap.get();
1290 }
1291 
1292 void
1293 Target::SettingsInitialize ()
1294 {
1295     UserSettingsControllerSP &usc = GetSettingsController();
1296     usc.reset (new SettingsController);
1297     UserSettingsController::InitializeSettingsController (usc,
1298                                                           SettingsController::global_settings_table,
1299                                                           SettingsController::instance_settings_table);
1300 
1301     // Now call SettingsInitialize() on each 'child' setting of Target
1302     Process::SettingsInitialize ();
1303 }
1304 
1305 void
1306 Target::SettingsTerminate ()
1307 {
1308 
1309     // Must call SettingsTerminate() on each settings 'child' of Target, before terminating Target's Settings.
1310 
1311     Process::SettingsTerminate ();
1312 
1313     // Now terminate Target Settings.
1314 
1315     UserSettingsControllerSP &usc = GetSettingsController();
1316     UserSettingsController::FinalizeSettingsController (usc);
1317     usc.reset();
1318 }
1319 
1320 UserSettingsControllerSP &
1321 Target::GetSettingsController ()
1322 {
1323     static UserSettingsControllerSP g_settings_controller;
1324     return g_settings_controller;
1325 }
1326 
1327 ArchSpec
1328 Target::GetDefaultArchitecture ()
1329 {
1330     lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController());
1331 
1332     if (settings_controller_sp)
1333         return static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture ();
1334     return ArchSpec();
1335 }
1336 
1337 void
1338 Target::SetDefaultArchitecture (const ArchSpec& arch)
1339 {
1340     lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController());
1341 
1342     if (settings_controller_sp)
1343         static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture () = arch;
1344 }
1345 
1346 Target *
1347 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1348 {
1349     // The target can either exist in the "process" of ExecutionContext, or in
1350     // the "target_sp" member of SymbolContext. This accessor helper function
1351     // will get the target from one of these locations.
1352 
1353     Target *target = NULL;
1354     if (sc_ptr != NULL)
1355         target = sc_ptr->target_sp.get();
1356     if (target == NULL && exe_ctx_ptr)
1357         target = exe_ctx_ptr->GetTargetPtr();
1358     return target;
1359 }
1360 
1361 
1362 void
1363 Target::UpdateInstanceName ()
1364 {
1365     StreamString sstr;
1366 
1367     Module *exe_module = GetExecutableModulePointer();
1368     if (exe_module)
1369     {
1370         sstr.Printf ("%s_%s",
1371                      exe_module->GetFileSpec().GetFilename().AsCString(),
1372                      exe_module->GetArchitecture().GetArchitectureName());
1373         GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), sstr.GetData());
1374     }
1375 }
1376 
1377 const char *
1378 Target::GetExpressionPrefixContentsAsCString ()
1379 {
1380     if (m_expr_prefix_contents_sp)
1381         return (const char *)m_expr_prefix_contents_sp->GetBytes();
1382     return NULL;
1383 }
1384 
1385 ExecutionResults
1386 Target::EvaluateExpression
1387 (
1388     const char *expr_cstr,
1389     StackFrame *frame,
1390     lldb_private::ExecutionPolicy execution_policy,
1391     bool unwind_on_error,
1392     bool keep_in_memory,
1393     lldb::DynamicValueType use_dynamic,
1394     lldb::ValueObjectSP &result_valobj_sp
1395 )
1396 {
1397     ExecutionResults execution_results = eExecutionSetupError;
1398 
1399     result_valobj_sp.reset();
1400 
1401     // We shouldn't run stop hooks in expressions.
1402     // Be sure to reset this if you return anywhere within this function.
1403     bool old_suppress_value = m_suppress_stop_hooks;
1404     m_suppress_stop_hooks = true;
1405 
1406     ExecutionContext exe_ctx;
1407     if (frame)
1408     {
1409         frame->CalculateExecutionContext(exe_ctx);
1410         Error error;
1411         const uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember |
1412                                            StackFrame::eExpressionPathOptionsNoFragileObjcIvar |
1413                                            StackFrame::eExpressionPathOptionsNoSyntheticChildren;
1414         lldb::VariableSP var_sp;
1415         result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr,
1416                                                                      use_dynamic,
1417                                                                      expr_path_options,
1418                                                                      var_sp,
1419                                                                      error);
1420     }
1421     else if (m_process_sp)
1422     {
1423         m_process_sp->CalculateExecutionContext(exe_ctx);
1424     }
1425     else
1426     {
1427         CalculateExecutionContext(exe_ctx);
1428     }
1429 
1430     if (result_valobj_sp)
1431     {
1432         execution_results = eExecutionCompleted;
1433         // We got a result from the frame variable expression path above...
1434         ConstString persistent_variable_name (m_persistent_variables.GetNextPersistentVariableName());
1435 
1436         lldb::ValueObjectSP const_valobj_sp;
1437 
1438         // Check in case our value is already a constant value
1439         if (result_valobj_sp->GetIsConstant())
1440         {
1441             const_valobj_sp = result_valobj_sp;
1442             const_valobj_sp->SetName (persistent_variable_name);
1443         }
1444         else
1445         {
1446             if (use_dynamic != lldb::eNoDynamicValues)
1447             {
1448                 ValueObjectSP dynamic_sp = result_valobj_sp->GetDynamicValue(use_dynamic);
1449                 if (dynamic_sp)
1450                     result_valobj_sp = dynamic_sp;
1451             }
1452 
1453             const_valobj_sp = result_valobj_sp->CreateConstantValue (persistent_variable_name);
1454         }
1455 
1456         lldb::ValueObjectSP live_valobj_sp = result_valobj_sp;
1457 
1458         result_valobj_sp = const_valobj_sp;
1459 
1460         ClangExpressionVariableSP clang_expr_variable_sp(m_persistent_variables.CreatePersistentVariable(result_valobj_sp));
1461         assert (clang_expr_variable_sp.get());
1462 
1463         // Set flags and live data as appropriate
1464 
1465         const Value &result_value = live_valobj_sp->GetValue();
1466 
1467         switch (result_value.GetValueType())
1468         {
1469         case Value::eValueTypeHostAddress:
1470         case Value::eValueTypeFileAddress:
1471             // we don't do anything with these for now
1472             break;
1473         case Value::eValueTypeScalar:
1474             clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1475             clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1476             break;
1477         case Value::eValueTypeLoadAddress:
1478             clang_expr_variable_sp->m_live_sp = live_valobj_sp;
1479             clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
1480             break;
1481         }
1482     }
1483     else
1484     {
1485         // Make sure we aren't just trying to see the value of a persistent
1486         // variable (something like "$0")
1487         lldb::ClangExpressionVariableSP persistent_var_sp;
1488         // Only check for persistent variables the expression starts with a '$'
1489         if (expr_cstr[0] == '$')
1490             persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr);
1491 
1492         if (persistent_var_sp)
1493         {
1494             result_valobj_sp = persistent_var_sp->GetValueObject ();
1495             execution_results = eExecutionCompleted;
1496         }
1497         else
1498         {
1499             const char *prefix = GetExpressionPrefixContentsAsCString();
1500 
1501             execution_results = ClangUserExpression::Evaluate (exe_ctx,
1502                                                                execution_policy,
1503                                                                unwind_on_error,
1504                                                                expr_cstr,
1505                                                                prefix,
1506                                                                result_valobj_sp);
1507         }
1508     }
1509 
1510     m_suppress_stop_hooks = old_suppress_value;
1511 
1512     return execution_results;
1513 }
1514 
1515 lldb::addr_t
1516 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1517 {
1518     addr_t code_addr = load_addr;
1519     switch (m_arch.GetMachine())
1520     {
1521     case llvm::Triple::arm:
1522     case llvm::Triple::thumb:
1523         switch (addr_class)
1524         {
1525         case eAddressClassData:
1526         case eAddressClassDebug:
1527             return LLDB_INVALID_ADDRESS;
1528 
1529         case eAddressClassUnknown:
1530         case eAddressClassInvalid:
1531         case eAddressClassCode:
1532         case eAddressClassCodeAlternateISA:
1533         case eAddressClassRuntime:
1534             // Check if bit zero it no set?
1535             if ((code_addr & 1ull) == 0)
1536             {
1537                 // Bit zero isn't set, check if the address is a multiple of 2?
1538                 if (code_addr & 2ull)
1539                 {
1540                     // The address is a multiple of 2 so it must be thumb, set bit zero
1541                     code_addr |= 1ull;
1542                 }
1543                 else if (addr_class == eAddressClassCodeAlternateISA)
1544                 {
1545                     // We checked the address and the address claims to be the alternate ISA
1546                     // which means thumb, so set bit zero.
1547                     code_addr |= 1ull;
1548                 }
1549             }
1550             break;
1551         }
1552         break;
1553 
1554     default:
1555         break;
1556     }
1557     return code_addr;
1558 }
1559 
1560 lldb::addr_t
1561 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1562 {
1563     addr_t opcode_addr = load_addr;
1564     switch (m_arch.GetMachine())
1565     {
1566     case llvm::Triple::arm:
1567     case llvm::Triple::thumb:
1568         switch (addr_class)
1569         {
1570         case eAddressClassData:
1571         case eAddressClassDebug:
1572             return LLDB_INVALID_ADDRESS;
1573 
1574         case eAddressClassInvalid:
1575         case eAddressClassUnknown:
1576         case eAddressClassCode:
1577         case eAddressClassCodeAlternateISA:
1578         case eAddressClassRuntime:
1579             opcode_addr &= ~(1ull);
1580             break;
1581         }
1582         break;
1583 
1584     default:
1585         break;
1586     }
1587     return opcode_addr;
1588 }
1589 
1590 lldb::user_id_t
1591 Target::AddStopHook (Target::StopHookSP &new_hook_sp)
1592 {
1593     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
1594     new_hook_sp.reset (new StopHook(GetSP(), new_uid));
1595     m_stop_hooks[new_uid] = new_hook_sp;
1596     return new_uid;
1597 }
1598 
1599 bool
1600 Target::RemoveStopHookByID (lldb::user_id_t user_id)
1601 {
1602     size_t num_removed;
1603     num_removed = m_stop_hooks.erase (user_id);
1604     if (num_removed == 0)
1605         return false;
1606     else
1607         return true;
1608 }
1609 
1610 void
1611 Target::RemoveAllStopHooks ()
1612 {
1613     m_stop_hooks.clear();
1614 }
1615 
1616 Target::StopHookSP
1617 Target::GetStopHookByID (lldb::user_id_t user_id)
1618 {
1619     StopHookSP found_hook;
1620 
1621     StopHookCollection::iterator specified_hook_iter;
1622     specified_hook_iter = m_stop_hooks.find (user_id);
1623     if (specified_hook_iter != m_stop_hooks.end())
1624         found_hook = (*specified_hook_iter).second;
1625     return found_hook;
1626 }
1627 
1628 bool
1629 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
1630 {
1631     StopHookCollection::iterator specified_hook_iter;
1632     specified_hook_iter = m_stop_hooks.find (user_id);
1633     if (specified_hook_iter == m_stop_hooks.end())
1634         return false;
1635 
1636     (*specified_hook_iter).second->SetIsActive (active_state);
1637     return true;
1638 }
1639 
1640 void
1641 Target::SetAllStopHooksActiveState (bool active_state)
1642 {
1643     StopHookCollection::iterator pos, end = m_stop_hooks.end();
1644     for (pos = m_stop_hooks.begin(); pos != end; pos++)
1645     {
1646         (*pos).second->SetIsActive (active_state);
1647     }
1648 }
1649 
1650 void
1651 Target::RunStopHooks ()
1652 {
1653     if (m_suppress_stop_hooks)
1654         return;
1655 
1656     if (!m_process_sp)
1657         return;
1658 
1659     if (m_stop_hooks.empty())
1660         return;
1661 
1662     StopHookCollection::iterator pos, end = m_stop_hooks.end();
1663 
1664     // If there aren't any active stop hooks, don't bother either:
1665     bool any_active_hooks = false;
1666     for (pos = m_stop_hooks.begin(); pos != end; pos++)
1667     {
1668         if ((*pos).second->IsActive())
1669         {
1670             any_active_hooks = true;
1671             break;
1672         }
1673     }
1674     if (!any_active_hooks)
1675         return;
1676 
1677     CommandReturnObject result;
1678 
1679     std::vector<ExecutionContext> exc_ctx_with_reasons;
1680     std::vector<SymbolContext> sym_ctx_with_reasons;
1681 
1682     ThreadList &cur_threadlist = m_process_sp->GetThreadList();
1683     size_t num_threads = cur_threadlist.GetSize();
1684     for (size_t i = 0; i < num_threads; i++)
1685     {
1686         lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
1687         if (cur_thread_sp->ThreadStoppedForAReason())
1688         {
1689             lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
1690             exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
1691             sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
1692         }
1693     }
1694 
1695     // If no threads stopped for a reason, don't run the stop-hooks.
1696     size_t num_exe_ctx = exc_ctx_with_reasons.size();
1697     if (num_exe_ctx == 0)
1698         return;
1699 
1700     result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
1701     result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
1702 
1703     bool keep_going = true;
1704     bool hooks_ran = false;
1705     bool print_hook_header;
1706     bool print_thread_header;
1707 
1708     if (num_exe_ctx == 1)
1709         print_thread_header = false;
1710     else
1711         print_thread_header = true;
1712 
1713     if (m_stop_hooks.size() == 1)
1714         print_hook_header = false;
1715     else
1716         print_hook_header = true;
1717 
1718     for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
1719     {
1720         // result.Clear();
1721         StopHookSP cur_hook_sp = (*pos).second;
1722         if (!cur_hook_sp->IsActive())
1723             continue;
1724 
1725         bool any_thread_matched = false;
1726         for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
1727         {
1728             if ((cur_hook_sp->GetSpecifier () == NULL
1729                   || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
1730                 && (cur_hook_sp->GetThreadSpecifier() == NULL
1731                     || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadPtr())))
1732             {
1733                 if (!hooks_ran)
1734                 {
1735                     hooks_ran = true;
1736                 }
1737                 if (print_hook_header && !any_thread_matched)
1738                 {
1739                     result.AppendMessageWithFormat("\n- Hook %d\n", cur_hook_sp->GetID());
1740                     any_thread_matched = true;
1741                 }
1742 
1743                 if (print_thread_header)
1744                     result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
1745 
1746                 bool stop_on_continue = true;
1747                 bool stop_on_error = true;
1748                 bool echo_commands = false;
1749                 bool print_results = true;
1750                 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
1751                                                                       &exc_ctx_with_reasons[i],
1752                                                                       stop_on_continue,
1753                                                                       stop_on_error,
1754                                                                       echo_commands,
1755                                                                       print_results,
1756                                                                       result);
1757 
1758                 // If the command started the target going again, we should bag out of
1759                 // running the stop hooks.
1760                 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
1761                     (result.GetStatus() == eReturnStatusSuccessContinuingResult))
1762                 {
1763                     result.AppendMessageWithFormat ("Aborting stop hooks, hook %d set the program running.", cur_hook_sp->GetID());
1764                     keep_going = false;
1765                 }
1766             }
1767         }
1768     }
1769 
1770     result.GetImmediateOutputStream()->Flush();
1771     result.GetImmediateErrorStream()->Flush();
1772 }
1773 
1774 bool
1775 Target::LoadModuleWithSlide (Module *module, lldb::addr_t slide)
1776 {
1777     bool changed = false;
1778     if (module)
1779     {
1780         ObjectFile *object_file = module->GetObjectFile();
1781         if (object_file)
1782         {
1783             SectionList *section_list = object_file->GetSectionList ();
1784             if (section_list)
1785             {
1786                 // All sections listed in the dyld image info structure will all
1787                 // either be fixed up already, or they will all be off by a single
1788                 // slide amount that is determined by finding the first segment
1789                 // that is at file offset zero which also has bytes (a file size
1790                 // that is greater than zero) in the object file.
1791 
1792                 // Determine the slide amount (if any)
1793                 const size_t num_sections = section_list->GetSize();
1794                 size_t sect_idx = 0;
1795                 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1796                 {
1797                     // Iterate through the object file sections to find the
1798                     // first section that starts of file offset zero and that
1799                     // has bytes in the file...
1800                     Section *section = section_list->GetSectionAtIndex (sect_idx).get();
1801                     if (section)
1802                     {
1803                         if (m_section_load_list.SetSectionLoadAddress (section, section->GetFileAddress() + slide))
1804                             changed = true;
1805                     }
1806                 }
1807             }
1808         }
1809     }
1810     return changed;
1811 }
1812 
1813 
1814 //--------------------------------------------------------------
1815 // class Target::StopHook
1816 //--------------------------------------------------------------
1817 
1818 
1819 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
1820         UserID (uid),
1821         m_target_sp (target_sp),
1822         m_commands (),
1823         m_specifier_sp (),
1824         m_thread_spec_ap(NULL),
1825         m_active (true)
1826 {
1827 }
1828 
1829 Target::StopHook::StopHook (const StopHook &rhs) :
1830         UserID (rhs.GetID()),
1831         m_target_sp (rhs.m_target_sp),
1832         m_commands (rhs.m_commands),
1833         m_specifier_sp (rhs.m_specifier_sp),
1834         m_thread_spec_ap (NULL),
1835         m_active (rhs.m_active)
1836 {
1837     if (rhs.m_thread_spec_ap.get() != NULL)
1838         m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
1839 }
1840 
1841 
1842 Target::StopHook::~StopHook ()
1843 {
1844 }
1845 
1846 void
1847 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
1848 {
1849     m_thread_spec_ap.reset (specifier);
1850 }
1851 
1852 
1853 void
1854 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
1855 {
1856     int indent_level = s->GetIndentLevel();
1857 
1858     s->SetIndentLevel(indent_level + 2);
1859 
1860     s->Printf ("Hook: %d\n", GetID());
1861     if (m_active)
1862         s->Indent ("State: enabled\n");
1863     else
1864         s->Indent ("State: disabled\n");
1865 
1866     if (m_specifier_sp)
1867     {
1868         s->Indent();
1869         s->PutCString ("Specifier:\n");
1870         s->SetIndentLevel (indent_level + 4);
1871         m_specifier_sp->GetDescription (s, level);
1872         s->SetIndentLevel (indent_level + 2);
1873     }
1874 
1875     if (m_thread_spec_ap.get() != NULL)
1876     {
1877         StreamString tmp;
1878         s->Indent("Thread:\n");
1879         m_thread_spec_ap->GetDescription (&tmp, level);
1880         s->SetIndentLevel (indent_level + 4);
1881         s->Indent (tmp.GetData());
1882         s->PutCString ("\n");
1883         s->SetIndentLevel (indent_level + 2);
1884     }
1885 
1886     s->Indent ("Commands: \n");
1887     s->SetIndentLevel (indent_level + 4);
1888     uint32_t num_commands = m_commands.GetSize();
1889     for (uint32_t i = 0; i < num_commands; i++)
1890     {
1891         s->Indent(m_commands.GetStringAtIndex(i));
1892         s->PutCString ("\n");
1893     }
1894     s->SetIndentLevel (indent_level);
1895 }
1896 
1897 
1898 //--------------------------------------------------------------
1899 // class Target::SettingsController
1900 //--------------------------------------------------------------
1901 
1902 Target::SettingsController::SettingsController () :
1903     UserSettingsController ("target", Debugger::GetSettingsController()),
1904     m_default_architecture ()
1905 {
1906     m_default_settings.reset (new TargetInstanceSettings (*this, false,
1907                                                           InstanceSettings::GetDefaultName().AsCString()));
1908 }
1909 
1910 Target::SettingsController::~SettingsController ()
1911 {
1912 }
1913 
1914 lldb::InstanceSettingsSP
1915 Target::SettingsController::CreateInstanceSettings (const char *instance_name)
1916 {
1917     TargetInstanceSettings *new_settings = new TargetInstanceSettings (*GetSettingsController(),
1918                                                                        false,
1919                                                                        instance_name);
1920     lldb::InstanceSettingsSP new_settings_sp (new_settings);
1921     return new_settings_sp;
1922 }
1923 
1924 
1925 #define TSC_DEFAULT_ARCH      "default-arch"
1926 #define TSC_EXPR_PREFIX       "expr-prefix"
1927 #define TSC_PREFER_DYNAMIC    "prefer-dynamic-value"
1928 #define TSC_SKIP_PROLOGUE     "skip-prologue"
1929 #define TSC_SOURCE_MAP        "source-map"
1930 #define TSC_MAX_CHILDREN      "max-children-count"
1931 #define TSC_MAX_STRLENSUMMARY "max-string-summary-length"
1932 
1933 
1934 static const ConstString &
1935 GetSettingNameForDefaultArch ()
1936 {
1937     static ConstString g_const_string (TSC_DEFAULT_ARCH);
1938     return g_const_string;
1939 }
1940 
1941 static const ConstString &
1942 GetSettingNameForExpressionPrefix ()
1943 {
1944     static ConstString g_const_string (TSC_EXPR_PREFIX);
1945     return g_const_string;
1946 }
1947 
1948 static const ConstString &
1949 GetSettingNameForPreferDynamicValue ()
1950 {
1951     static ConstString g_const_string (TSC_PREFER_DYNAMIC);
1952     return g_const_string;
1953 }
1954 
1955 static const ConstString &
1956 GetSettingNameForSourcePathMap ()
1957 {
1958     static ConstString g_const_string (TSC_SOURCE_MAP);
1959     return g_const_string;
1960 }
1961 
1962 static const ConstString &
1963 GetSettingNameForSkipPrologue ()
1964 {
1965     static ConstString g_const_string (TSC_SKIP_PROLOGUE);
1966     return g_const_string;
1967 }
1968 
1969 static const ConstString &
1970 GetSettingNameForMaxChildren ()
1971 {
1972     static ConstString g_const_string (TSC_MAX_CHILDREN);
1973     return g_const_string;
1974 }
1975 
1976 static const ConstString &
1977 GetSettingNameForMaxStringSummaryLength ()
1978 {
1979     static ConstString g_const_string (TSC_MAX_STRLENSUMMARY);
1980     return g_const_string;
1981 }
1982 
1983 bool
1984 Target::SettingsController::SetGlobalVariable (const ConstString &var_name,
1985                                                const char *index_value,
1986                                                const char *value,
1987                                                const SettingEntry &entry,
1988                                                const VarSetOperationType op,
1989                                                Error&err)
1990 {
1991     if (var_name == GetSettingNameForDefaultArch())
1992     {
1993         m_default_architecture.SetTriple (value, NULL);
1994         if (!m_default_architecture.IsValid())
1995             err.SetErrorStringWithFormat ("'%s' is not a valid architecture or triple.", value);
1996     }
1997     return true;
1998 }
1999 
2000 
2001 bool
2002 Target::SettingsController::GetGlobalVariable (const ConstString &var_name,
2003                                                StringList &value,
2004                                                Error &err)
2005 {
2006     if (var_name == GetSettingNameForDefaultArch())
2007     {
2008         // If the arch is invalid (the default), don't show a string for it
2009         if (m_default_architecture.IsValid())
2010             value.AppendString (m_default_architecture.GetArchitectureName());
2011         return true;
2012     }
2013     else
2014         err.SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
2015 
2016     return false;
2017 }
2018 
2019 //--------------------------------------------------------------
2020 // class TargetInstanceSettings
2021 //--------------------------------------------------------------
2022 
2023 TargetInstanceSettings::TargetInstanceSettings
2024 (
2025     UserSettingsController &owner,
2026     bool live_instance,
2027     const char *name
2028 ) :
2029     InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
2030     m_expr_prefix_file (),
2031     m_expr_prefix_contents_sp (),
2032     m_prefer_dynamic_value (2),
2033     m_skip_prologue (true, true),
2034     m_source_map (NULL, NULL),
2035     m_max_children_display(256),
2036     m_max_strlen_length(1024)
2037 {
2038     // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
2039     // until the vtables for TargetInstanceSettings are properly set up, i.e. AFTER all the initializers.
2040     // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
2041     // This is true for CreateInstanceName() too.
2042 
2043     if (GetInstanceName () == InstanceSettings::InvalidName())
2044     {
2045         ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
2046         m_owner.RegisterInstanceSettings (this);
2047     }
2048 
2049     if (live_instance)
2050     {
2051         const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
2052         CopyInstanceSettings (pending_settings,false);
2053     }
2054 }
2055 
2056 TargetInstanceSettings::TargetInstanceSettings (const TargetInstanceSettings &rhs) :
2057     InstanceSettings (*Target::GetSettingsController(), CreateInstanceName().AsCString()),
2058     m_expr_prefix_file (rhs.m_expr_prefix_file),
2059     m_expr_prefix_contents_sp (rhs.m_expr_prefix_contents_sp),
2060     m_prefer_dynamic_value (rhs.m_prefer_dynamic_value),
2061     m_skip_prologue (rhs.m_skip_prologue),
2062     m_source_map (rhs.m_source_map),
2063     m_max_children_display(rhs.m_max_children_display),
2064     m_max_strlen_length(rhs.m_max_strlen_length)
2065 {
2066     if (m_instance_name != InstanceSettings::GetDefaultName())
2067     {
2068         const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
2069         CopyInstanceSettings (pending_settings,false);
2070     }
2071 }
2072 
2073 TargetInstanceSettings::~TargetInstanceSettings ()
2074 {
2075 }
2076 
2077 TargetInstanceSettings&
2078 TargetInstanceSettings::operator= (const TargetInstanceSettings &rhs)
2079 {
2080     if (this != &rhs)
2081     {
2082     }
2083 
2084     return *this;
2085 }
2086 
2087 void
2088 TargetInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
2089                                                         const char *index_value,
2090                                                         const char *value,
2091                                                         const ConstString &instance_name,
2092                                                         const SettingEntry &entry,
2093                                                         VarSetOperationType op,
2094                                                         Error &err,
2095                                                         bool pending)
2096 {
2097     if (var_name == GetSettingNameForExpressionPrefix ())
2098     {
2099         err = UserSettingsController::UpdateFileSpecOptionValue (value, op, m_expr_prefix_file);
2100         if (err.Success())
2101         {
2102             switch (op)
2103             {
2104             default:
2105                 break;
2106             case eVarSetOperationAssign:
2107             case eVarSetOperationAppend:
2108                 {
2109                     if (!m_expr_prefix_file.GetCurrentValue().Exists())
2110                     {
2111                         err.SetErrorToGenericError ();
2112                         err.SetErrorStringWithFormat ("%s does not exist.\n", value);
2113                         return;
2114                     }
2115 
2116                     m_expr_prefix_contents_sp = m_expr_prefix_file.GetCurrentValue().ReadFileContents();
2117 
2118                     if (!m_expr_prefix_contents_sp && m_expr_prefix_contents_sp->GetByteSize() == 0)
2119                     {
2120                         err.SetErrorStringWithFormat ("Couldn't read data from '%s'\n", value);
2121                         m_expr_prefix_contents_sp.reset();
2122                     }
2123                 }
2124                 break;
2125             case eVarSetOperationClear:
2126                 m_expr_prefix_contents_sp.reset();
2127             }
2128         }
2129     }
2130     else if (var_name == GetSettingNameForPreferDynamicValue())
2131     {
2132         int new_value;
2133         UserSettingsController::UpdateEnumVariable (g_dynamic_value_types, &new_value, value, err);
2134         if (err.Success())
2135             m_prefer_dynamic_value = new_value;
2136     }
2137     else if (var_name == GetSettingNameForSkipPrologue())
2138     {
2139         err = UserSettingsController::UpdateBooleanOptionValue (value, op, m_skip_prologue);
2140     }
2141     else if (var_name == GetSettingNameForMaxChildren())
2142     {
2143         bool ok;
2144         uint32_t new_value = Args::StringToUInt32(value, 0, 10, &ok);
2145         if (ok)
2146             m_max_children_display = new_value;
2147     }
2148     else if (var_name == GetSettingNameForMaxStringSummaryLength())
2149     {
2150         bool ok;
2151         uint32_t new_value = Args::StringToUInt32(value, 0, 10, &ok);
2152         if (ok)
2153             m_max_strlen_length = new_value;
2154     }
2155     else if (var_name == GetSettingNameForSourcePathMap ())
2156     {
2157         switch (op)
2158         {
2159             case eVarSetOperationReplace:
2160             case eVarSetOperationInsertBefore:
2161             case eVarSetOperationInsertAfter:
2162             case eVarSetOperationRemove:
2163             default:
2164                 break;
2165             case eVarSetOperationAssign:
2166                 m_source_map.Clear(true);
2167                 // Fall through to append....
2168             case eVarSetOperationAppend:
2169                 {
2170                     Args args(value);
2171                     const uint32_t argc = args.GetArgumentCount();
2172                     if (argc & 1 || argc == 0)
2173                     {
2174                         err.SetErrorStringWithFormat ("an even number of paths must be supplied to to the source-map setting: %u arguments given", argc);
2175                     }
2176                     else
2177                     {
2178                         char resolved_new_path[PATH_MAX];
2179                         FileSpec file_spec;
2180                         const char *old_path;
2181                         for (uint32_t idx = 0; (old_path = args.GetArgumentAtIndex(idx)) != NULL; idx += 2)
2182                         {
2183                             const char *new_path = args.GetArgumentAtIndex(idx+1);
2184                             assert (new_path); // We have an even number of paths, this shouldn't happen!
2185 
2186                             file_spec.SetFile(new_path, true);
2187                             if (file_spec.Exists())
2188                             {
2189                                 if (file_spec.GetPath (resolved_new_path, sizeof(resolved_new_path)) >= sizeof(resolved_new_path))
2190                                 {
2191                                     err.SetErrorStringWithFormat("new path '%s' is too long", new_path);
2192                                     return;
2193                                 }
2194                             }
2195                             else
2196                             {
2197                                 err.SetErrorStringWithFormat("new path '%s' doesn't exist", new_path);
2198                                 return;
2199                             }
2200                             m_source_map.Append(ConstString (old_path), ConstString (resolved_new_path), true);
2201                         }
2202                     }
2203                 }
2204                 break;
2205 
2206             case eVarSetOperationClear:
2207                 m_source_map.Clear(true);
2208                 break;
2209         }
2210     }
2211 }
2212 
2213 void
2214 TargetInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, bool pending)
2215 {
2216     TargetInstanceSettings *new_settings_ptr = static_cast <TargetInstanceSettings *> (new_settings.get());
2217 
2218     if (!new_settings_ptr)
2219         return;
2220 
2221     m_expr_prefix_file          = new_settings_ptr->m_expr_prefix_file;
2222     m_expr_prefix_contents_sp   = new_settings_ptr->m_expr_prefix_contents_sp;
2223     m_prefer_dynamic_value      = new_settings_ptr->m_prefer_dynamic_value;
2224     m_skip_prologue             = new_settings_ptr->m_skip_prologue;
2225     m_max_children_display      = new_settings_ptr->m_max_children_display;
2226     m_max_strlen_length         = new_settings_ptr->m_max_strlen_length;
2227 }
2228 
2229 bool
2230 TargetInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
2231                                                   const ConstString &var_name,
2232                                                   StringList &value,
2233                                                   Error *err)
2234 {
2235     if (var_name == GetSettingNameForExpressionPrefix ())
2236     {
2237         char path[PATH_MAX];
2238         const size_t path_len = m_expr_prefix_file.GetCurrentValue().GetPath (path, sizeof(path));
2239         if (path_len > 0)
2240             value.AppendString (path, path_len);
2241     }
2242     else if (var_name == GetSettingNameForPreferDynamicValue())
2243     {
2244         value.AppendString (g_dynamic_value_types[m_prefer_dynamic_value].string_value);
2245     }
2246     else if (var_name == GetSettingNameForSkipPrologue())
2247     {
2248         if (m_skip_prologue)
2249             value.AppendString ("true");
2250         else
2251             value.AppendString ("false");
2252     }
2253     else if (var_name == GetSettingNameForSourcePathMap ())
2254     {
2255     }
2256     else if (var_name == GetSettingNameForMaxChildren())
2257     {
2258         StreamString count_str;
2259         count_str.Printf ("%d", m_max_children_display);
2260         value.AppendString (count_str.GetData());
2261     }
2262     else if (var_name == GetSettingNameForMaxStringSummaryLength())
2263     {
2264         StreamString count_str;
2265         count_str.Printf ("%d", m_max_strlen_length);
2266         value.AppendString (count_str.GetData());
2267     }
2268     else
2269     {
2270         if (err)
2271             err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
2272         return false;
2273     }
2274 
2275     return true;
2276 }
2277 
2278 const ConstString
2279 TargetInstanceSettings::CreateInstanceName ()
2280 {
2281     StreamString sstr;
2282     static int instance_count = 1;
2283 
2284     sstr.Printf ("target_%d", instance_count);
2285     ++instance_count;
2286 
2287     const ConstString ret_val (sstr.GetData());
2288     return ret_val;
2289 }
2290 
2291 //--------------------------------------------------
2292 // Target::SettingsController Variable Tables
2293 //--------------------------------------------------
2294 OptionEnumValueElement
2295 TargetInstanceSettings::g_dynamic_value_types[] =
2296 {
2297 { eNoDynamicValues,      "no-dynamic-values", "Don't calculate the dynamic type of values"},
2298 { eDynamicCanRunTarget,  "run-target",        "Calculate the dynamic type of values even if you have to run the target."},
2299 { eDynamicDontRunTarget, "no-run-target",     "Calculate the dynamic type of values, but don't run the target."},
2300 { 0, NULL, NULL }
2301 };
2302 
2303 SettingEntry
2304 Target::SettingsController::global_settings_table[] =
2305 {
2306     // var-name           var-type           default      enum  init'd hidden help-text
2307     // =================  ================== ===========  ====  ====== ====== =========================================================================
2308     { TSC_DEFAULT_ARCH  , eSetVarTypeString , NULL      , NULL, false, false, "Default architecture to choose, when there's a choice." },
2309     { NULL              , eSetVarTypeNone   , NULL      , NULL, false, false, NULL }
2310 };
2311 
2312 SettingEntry
2313 Target::SettingsController::instance_settings_table[] =
2314 {
2315     // var-name             var-type            default         enum                    init'd hidden help-text
2316     // =================    ==================  =============== ======================= ====== ====== =========================================================================
2317     { TSC_EXPR_PREFIX       , eSetVarTypeString , NULL          , NULL,                  false, false, "Path to a file containing expressions to be prepended to all expressions." },
2318     { TSC_PREFER_DYNAMIC    , eSetVarTypeEnum   , NULL          , g_dynamic_value_types, false, false, "Should printed values be shown as their dynamic value." },
2319     { TSC_SKIP_PROLOGUE     , eSetVarTypeBoolean, "true"        , NULL,                  false, false, "Skip function prologues when setting breakpoints by name." },
2320     { TSC_SOURCE_MAP        , eSetVarTypeArray  , NULL          , NULL,                  false, false, "Source path remappings to use when locating source files from debug information." },
2321     { TSC_MAX_CHILDREN      , eSetVarTypeInt    , "256"         , NULL,                  true,  false, "Maximum number of children to expand in any level of depth." },
2322     { TSC_MAX_STRLENSUMMARY , eSetVarTypeInt    , "1024"        , NULL,                  true,  false, "Maximum number of characters to show when using %s in summary strings." },
2323     { NULL                  , eSetVarTypeNone   , NULL          , NULL,                  false, false, NULL }
2324 };
2325