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