Switching back to using std::tr1::shared_ptr. We originally switched away
due to RTTI worries since llvm and clang don't use RTTI, but I was able to 
switch back with no issues as far as I can tell. Once the RTTI issue wasn't
an issue, we were looking for a way to properly track weak pointers to objects
to solve some of the threading issues we have been running into which naturally
led us back to std::tr1::weak_ptr. We also wanted the ability to make a shared 
pointer from just a pointer, which is also easily solved using the 
std::tr1::enable_shared_from_this class. 

The main reason for this move back is so we can start properly having weak
references to objects. Currently a lldb_private::Thread class has a refrence
to its parent lldb_private::Process. This doesn't work well when we now hand
out a SBThread object that contains a shared pointer to a lldb_private::Thread
as this SBThread can be held onto by external clients and if they end up
using one of these objects we can easily crash.

So the next task is to start adopting std::tr1::weak_ptr where ever it makes
sense which we can do with lldb_private::Debugger, lldb_private::Target,
lldb_private::Process, lldb_private::Thread, lldb_private::StackFrame, and
many more objects now that they are no longer using intrusive ref counted
pointer objects (you can't do std::tr1::weak_ptr functionality with intrusive
pointers).



git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@149207 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBAddress.cpp b/source/API/SBAddress.cpp
index f005965..6e6a806 100644
--- a/source/API/SBAddress.cpp
+++ b/source/API/SBAddress.cpp
@@ -32,7 +32,7 @@
         }
 
         AddressImpl (const Address &addr) :
-            m_module_sp (addr.GetModule()),
+            m_module_sp (addr.GetModuleSP()),
             m_address (addr)
         {
         }
@@ -301,7 +301,7 @@
     {
         Module *module = m_opaque_ap->GetModule();
         if (module)
-            *sb_module = module;
+            *sb_module = module->shared_from_this();
     }
     return sb_module;
 }
diff --git a/source/API/SBBreakpoint.cpp b/source/API/SBBreakpoint.cpp
index 62e4a4c..33bdbe0 100644
--- a/source/API/SBBreakpoint.cpp
+++ b/source/API/SBBreakpoint.cpp
@@ -497,14 +497,14 @@
             Process *process = ctx->exe_ctx.GetProcessPtr();
             if (process)
             {
-                SBProcess sb_process (process->GetSP());
+                SBProcess sb_process (process->shared_from_this());
                 SBThread sb_thread;
                 SBBreakpointLocation sb_location;
                 assert (bp_sp);
                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
                 Thread *thread = ctx->exe_ctx.GetThreadPtr();
                 if (thread)
-                    sb_thread.SetThread(thread->GetSP());
+                    sb_thread.SetThread(thread->shared_from_this());
 
                 return data->callback (data->callback_baton, 
                                           sb_process, 
diff --git a/source/API/SBBreakpointLocation.cpp b/source/API/SBBreakpointLocation.cpp
index 619428e..57cf5a1 100644
--- a/source/API/SBBreakpointLocation.cpp
+++ b/source/API/SBBreakpointLocation.cpp
@@ -301,7 +301,7 @@
     if (m_opaque_sp)
     {
         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
-        *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
+        *sb_bp = m_opaque_sp->GetBreakpoint ().shared_from_this();
     }
 
     if (log)
diff --git a/source/API/SBFrame.cpp b/source/API/SBFrame.cpp
index 3a3c582..c0a6978 100644
--- a/source/API/SBFrame.cpp
+++ b/source/API/SBFrame.cpp
@@ -553,7 +553,7 @@
     if (m_opaque_sp)
     {
         Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
-        sb_thread.SetThread (m_opaque_sp->GetThread().GetSP());
+        sb_thread.SetThread (m_opaque_sp->GetThread().shared_from_this());
     }
 
     if (log)
diff --git a/source/API/SBFunction.cpp b/source/API/SBFunction.cpp
index 4e23b9d..f55b214 100644
--- a/source/API/SBFunction.cpp
+++ b/source/API/SBFunction.cpp
@@ -133,10 +133,10 @@
             target->CalculateExecutionContext (exe_ctx);
             exe_ctx.SetProcessSP(target->GetProcessSP());
         }
-        Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule();
-        if (module)
+        ModuleSP module_sp = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModuleSP();
+        if (module_sp)
         {
-            sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
+            sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
                                                                              NULL,
                                                                              exe_ctx,
                                                                              m_opaque_ptr->GetAddressRange()));
diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp
index aacec52..76c1bad 100644
--- a/source/API/SBProcess.cpp
+++ b/source/API/SBProcess.cpp
@@ -238,7 +238,7 @@
 
     SBTarget sb_target;
     if (m_opaque_sp)
-        sb_target = m_opaque_sp->GetTarget().GetSP();
+        sb_target = m_opaque_sp->GetTarget().shared_from_this();
     
     if (log)
         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
diff --git a/source/API/SBSection.cpp b/source/API/SBSection.cpp
index ed6dba7..dedcc7a 100644
--- a/source/API/SBSection.cpp
+++ b/source/API/SBSection.cpp
@@ -29,7 +29,7 @@
             m_section (section)
         {
             if (section)
-                m_module_sp = section->GetModule();
+                m_module_sp = section->GetModule()->shared_from_this();
         }
         
         SectionImpl (const SectionImpl &rhs) :
diff --git a/source/API/SBSymbol.cpp b/source/API/SBSymbol.cpp
index 1765dbd..51bb98c 100644
--- a/source/API/SBSymbol.cpp
+++ b/source/API/SBSymbol.cpp
@@ -131,10 +131,10 @@
         const AddressRange *symbol_range = m_opaque_ptr->GetAddressRangePtr();
         if (symbol_range)
         {
-            Module *module = symbol_range->GetBaseAddress().GetModule();
-            if (module)
+            ModuleSP module_sp = symbol_range->GetBaseAddress().GetModuleSP();
+            if (module_sp)
             {
-                sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture (),
+                sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture (),
                                                                                  NULL,
                                                                                  exe_ctx,
                                                                                  *symbol_range));
diff --git a/source/API/SBTarget.cpp b/source/API/SBTarget.cpp
index 82224a9..f594827 100644
--- a/source/API/SBTarget.cpp
+++ b/source/API/SBTarget.cpp
@@ -119,7 +119,7 @@
 {
     SBDebugger debugger;
     if (m_opaque_sp)
-        debugger.reset (m_opaque_sp->GetDebugger().GetSP());
+        debugger.reset (m_opaque_sp->GetDebugger().shared_from_this());
     return debugger;
 }
 
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 1ed3fea..87413e0 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -883,7 +883,7 @@
     {
         if (m_opaque_sp->GetExecutionContextScope())
         {
-            result = SBThread(m_opaque_sp->GetExecutionContextScope()->CalculateThread()->GetSP());
+            result = SBThread(m_opaque_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@@ -905,7 +905,7 @@
     {
         if (m_opaque_sp->GetExecutionContextScope())
         {
-            result.SetFrame (m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->GetSP());
+            result.SetFrame (m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
diff --git a/source/Breakpoint/Breakpoint.cpp b/source/Breakpoint/Breakpoint.cpp
index 9095db0..aa9fab2 100644
--- a/source/Breakpoint/Breakpoint.cpp
+++ b/source/Breakpoint/Breakpoint.cpp
@@ -556,11 +556,3 @@
 {
     m_filter_sp->GetDescription (s);
 }
-
-const BreakpointSP
-Breakpoint::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return BreakpointSP (this);
-}
diff --git a/source/Breakpoint/BreakpointLocation.cpp b/source/Breakpoint/BreakpointLocation.cpp
index 9adf189..fb123de 100644
--- a/source/Breakpoint/BreakpointLocation.cpp
+++ b/source/Breakpoint/BreakpointLocation.cpp
@@ -149,11 +149,10 @@
 ThreadPlan *
 BreakpointLocation::GetThreadPlanToTestCondition (ExecutionContext &exe_ctx, Stream &error)
 {
-    lldb::BreakpointLocationSP this_sp(this);
     if (m_options_ap.get())
-        return m_options_ap->GetThreadPlanToTestCondition (exe_ctx, this_sp, error);
+        return m_options_ap->GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
     else
-        return m_owner.GetThreadPlanToTestCondition (exe_ctx, this_sp, error);
+        return m_owner.GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
 }
 
 const char *
@@ -259,9 +258,7 @@
     if (m_owner.GetTarget().GetSectionLoadList().IsEmpty())
         return false;
 
-    BreakpointLocationSP this_sp(this);
-
-    lldb::break_id_t new_id = process->CreateBreakpointSite (this_sp, false);
+    lldb::break_id_t new_id = process->CreateBreakpointSite (shared_from_this(), false);
 
     if (new_id == LLDB_INVALID_BREAK_ID)
     {
diff --git a/source/Breakpoint/BreakpointSite.cpp b/source/Breakpoint/BreakpointSite.cpp
index 962117c..1ad7f8f 100644
--- a/source/Breakpoint/BreakpointSite.cpp
+++ b/source/Breakpoint/BreakpointSite.cpp
@@ -23,7 +23,7 @@
 BreakpointSite::BreakpointSite
 (
     BreakpointSiteList *list,
-    BreakpointLocationSP& owner,
+    const BreakpointLocationSP& owner,
     lldb::addr_t addr,
     lldb::tid_t tid,
     bool use_hardware
@@ -155,7 +155,7 @@
 }
 
 void
-BreakpointSite::AddOwner (BreakpointLocationSP &owner)
+BreakpointSite::AddOwner (const BreakpointLocationSP &owner)
 {
     m_owners.Add(owner);
 }
diff --git a/source/Commands/CommandObjectArgs.cpp b/source/Commands/CommandObjectArgs.cpp
index dfbbe79..01f798f 100644
--- a/source/Commands/CommandObjectArgs.cpp
+++ b/source/Commands/CommandObjectArgs.cpp
@@ -148,7 +148,7 @@
         return false;
     }
     
-    Module *thread_module = thread_cur_frame->GetFrameCodeAddress ().GetModule ();
+    Module *thread_module = thread_cur_frame->GetFrameCodeAddress ().GetModulePtr ();
     if (!thread_module)
     {
         result.AppendError ("The PC has no associated module.");
diff --git a/source/Commands/CommandObjectSource.cpp b/source/Commands/CommandObjectSource.cpp
index 07e133c..21f6339 100644
--- a/source/Commands/CommandObjectSource.cpp
+++ b/source/Commands/CommandObjectSource.cpp
@@ -468,7 +468,7 @@
                     {
                         const bool show_inlines = true;
                         m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines);
-                        SearchFilter target_search_filter (target->GetSP());
+                        SearchFilter target_search_filter (target->shared_from_this());
                         target_search_filter.Search (m_breakpoint_locations);
                     }
                 }
@@ -570,7 +570,7 @@
                     {
                         const bool show_inlines = true;
                         m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
-                        SearchFilter target_search_filter (target->GetSP());
+                        SearchFilter target_search_filter (target->shared_from_this());
                         target_search_filter.Search (m_breakpoint_locations);
                     }
                     else
diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp
index 8b0fd17..3e05d21 100644
--- a/source/Commands/CommandObjectTarget.cpp
+++ b/source/Commands/CommandObjectTarget.cpp
@@ -1329,7 +1329,7 @@
         {
             if (!target->GetSectionLoadList().ResolveLoadAddress (addr, so_addr))
                 return false;
-            else if (so_addr.GetModule() != module)
+            else if (so_addr.GetModulePtr() != module)
                 return false;
         }
         else
@@ -1643,7 +1643,7 @@
             {
                 if (FileSpec::Equal(module->GetFileSpec(), module_file_spec, true))
                 {
-                    module_sp = module;
+                    module_sp = module->shared_from_this();
                     module_list.AppendIfNeeded(module_sp);
                 }
             }
@@ -2757,7 +2757,7 @@
                     Address module_address;
                     if (module_address.SetLoadAddress(m_options.m_module_addr, target))
                     {
-                        Module *module = module_address.GetModule();
+                        Module *module = module_address.GetModulePtr();
                         if (module)
                         {
                             PrintModule (strm, module);
@@ -2800,7 +2800,7 @@
                     if (use_global_module_list)
                     {
                         module = Module::GetAllocatedModuleAtIndex(image_idx);
-                        module_sp = module;
+                        module_sp = module->shared_from_this();
                     }
                     else
                     {
@@ -2874,7 +2874,7 @@
                     case 'r':
                         {
                             uint32_t ref_count = 0;
-                            ModuleSP module_sp (module);
+                            ModuleSP module_sp (module->shared_from_this());
                             if (module_sp)
                             {
                                 // Take one away to make sure we don't count our local "module_sp"
diff --git a/source/Commands/CommandObjectType.cpp b/source/Commands/CommandObjectType.cpp
index 26a110e..61756d7 100644
--- a/source/Commands/CommandObjectType.cpp
+++ b/source/Commands/CommandObjectType.cpp
@@ -75,7 +75,7 @@
     {
     }
     
-    typedef lldb::SharedPtr<ScriptAddOptions>::Type SharedPointer;
+    typedef SHARED_PTR(ScriptAddOptions) SharedPointer;
     
 };
 
@@ -108,7 +108,7 @@
     {
     }
     
-    typedef lldb::SharedPtr<SynthAddOptions>::Type SharedPointer;
+    typedef SHARED_PTR(SynthAddOptions) SharedPointer;
     
 };
 
diff --git a/source/Core/Address.cpp b/source/Core/Address.cpp
index 2ea3bb1..120ae5e 100644
--- a/source/Core/Address.cpp
+++ b/source/Core/Address.cpp
@@ -55,7 +55,7 @@
 
     if (byte_order == eByteOrderInvalid || addr_size == 0)
     {
-        Module *module = address.GetModule();
+        Module *module = address.GetModulePtr();
         if (module)
         {
             byte_order = module->GetArchitecture().GetByteOrder();
@@ -118,7 +118,7 @@
         {
             // If we were not running, yet able to read an integer, we must
             // have a module
-            Module *module = address.GetModule();
+            Module *module = address.GetModulePtr();
             assert (module);
             if (module->ResolveFileAddress(deref_addr, deref_so_addr))
                 return true;
@@ -248,13 +248,26 @@
 }
 
 Module *
-Address::GetModule () const
+Address::GetModulePtr () const
 {
     if (m_section)
         return m_section->GetModule();
     return NULL;
 }
 
+ModuleSP
+Address::GetModuleSP () const
+{
+    lldb::ModuleSP module_sp;
+    if (m_section)
+    {
+        Module *module = m_section->GetModule();
+        if (module)
+            module_sp = module->shared_from_this();
+    }
+    return module_sp;
+}
+
 addr_t
 Address::GetFileAddress () const
 {
@@ -434,7 +447,7 @@
             }
 
             uint32_t pointer_size = 4;
-            Module *module = GetModule();
+            Module *module = GetModulePtr();
             if (target)
                 pointer_size = target->GetArchitecture().GetAddressByteSize();
             else if (module)
@@ -670,7 +683,7 @@
     case DumpStyleDetailedSymbolContext:
         if (IsSectionOffset())
         {
-            Module *module = GetModule();
+            Module *module = GetModulePtr();
             if (module)
             {
                 SymbolContext sc;
@@ -738,7 +751,7 @@
         Module *address_module = m_section->GetModule();
         if (address_module)
         {
-            sc->module_sp = address_module;
+            sc->module_sp = address_module->shared_from_this();
             if (sc->module_sp)
                 return sc->module_sp->ResolveSymbolContextForAddress (*this, resolve_scope, *sc);
         }
@@ -760,7 +773,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextCompUnit, sc);
@@ -776,7 +789,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextFunction, sc);
@@ -792,7 +805,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextBlock, sc);
@@ -808,7 +821,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextSymbol, sc);
@@ -824,7 +837,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextLineEntry, sc);
@@ -868,8 +881,8 @@
 int
 Address::CompareModulePointerAndOffset (const Address& a, const Address& b)
 {
-    Module *a_module = a.GetModule ();
-    Module *b_module = b.GetModule ();
+    Module *a_module = a.GetModulePtr ();
+    Module *b_module = b.GetModulePtr ();
     if (a_module < b_module)
         return -1;
     if (a_module > b_module)
@@ -913,8 +926,8 @@
 bool
 lldb_private::operator< (const Address& lhs, const Address& rhs)
 {
-    Module *lhs_module = lhs.GetModule();
-    Module *rhs_module = rhs.GetModule();    
+    Module *lhs_module = lhs.GetModulePtr();
+    Module *rhs_module = rhs.GetModulePtr();    
     if (lhs_module == rhs_module)
     {
         // Addresses are in the same module, just compare the file addresses
@@ -931,8 +944,8 @@
 bool
 lldb_private::operator> (const Address& lhs, const Address& rhs)
 {
-    Module *lhs_module = lhs.GetModule();
-    Module *rhs_module = rhs.GetModule();    
+    Module *lhs_module = lhs.GetModulePtr();
+    Module *rhs_module = rhs.GetModulePtr();    
     if (lhs_module == rhs_module)
     {
         // Addresses are in the same module, just compare the file addresses
@@ -987,7 +1000,7 @@
 AddressClass
 Address::GetAddressClass () const
 {
-    Module *module = GetModule();
+    Module *module = GetModulePtr();
     if (module)
     {
         ObjectFile *obj_file = module->GetObjectFile();
diff --git a/source/Core/AddressRange.cpp b/source/Core/AddressRange.cpp
index 391f611..700de90 100644
--- a/source/Core/AddressRange.cpp
+++ b/source/Core/AddressRange.cpp
@@ -177,7 +177,7 @@
     {
         if (show_module)
         {
-            Module *module = GetBaseAddress().GetModule();
+            Module *module = GetBaseAddress().GetModulePtr();
             if (module)
                 s->Printf("%s", module->GetFileSpec().GetFilename().AsCString());
         }
diff --git a/source/Core/Debugger.cpp b/source/Core/Debugger.cpp
index 8b5e8d4..f979c8d 100644
--- a/source/Core/Debugger.cpp
+++ b/source/Core/Debugger.cpp
@@ -263,14 +263,6 @@
 }
 
 DebuggerSP
-Debugger::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return DebuggerSP (this);
-}
-
-DebuggerSP
 Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name)
 {
     DebuggerSP debugger_sp;
diff --git a/source/Core/Disassembler.cpp b/source/Core/Disassembler.cpp
index fe044a6..d6b19ac 100644
--- a/source/Core/Disassembler.cpp
+++ b/source/Core/Disassembler.cpp
@@ -383,7 +383,7 @@
 
             prev_sc = sc;
 
-            Module *module = addr.GetModule();
+            Module *module = addr.GetModulePtr();
             if (module)
             {
                 uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
diff --git a/source/Core/Module.cpp b/source/Core/Module.cpp
index 556b4a5..28e8be2 100644
--- a/source/Core/Module.cpp
+++ b/source/Core/Module.cpp
@@ -224,7 +224,7 @@
         return;
 
     SymbolContext sc;
-    sc.module_sp = this;
+    sc.module_sp = shared_from_this();
     uint32_t cu_idx;
     SymbolVendor *symbols = GetSymbolVendor ();
 
@@ -258,7 +258,7 @@
 void
 Module::CalculateSymbolContext(SymbolContext* sc)
 {
-    sc->module_sp = this;
+    sc->module_sp = shared_from_this();
 }
 
 Module *
@@ -328,7 +328,7 @@
     {
         // If the section offset based address resolved itself, then this
         // is the right module.
-        sc.module_sp = this;
+        sc.module_sp = shared_from_this();
         resolved_flags |= eSymbolContextModule;
 
         // Resolve the compile unit, function, block, line table or line
@@ -430,7 +430,7 @@
     const uint32_t start_size = sc_list.GetSize();
     const uint32_t num_compile_units = GetNumCompileUnits();
     SymbolContext sc;
-    sc.module_sp = this;
+    sc.module_sp = shared_from_this();
     const bool compare_directory = path.GetDirectory();
     for (uint32_t i=0; i<num_compile_units; ++i)
     {
diff --git a/source/Core/ModuleList.cpp b/source/Core/ModuleList.cpp
index ff25f19..5046f4a 100644
--- a/source/Core/ModuleList.cpp
+++ b/source/Core/ModuleList.cpp
@@ -585,7 +585,7 @@
 {
     // The address is already section offset so it has a module
     uint32_t resolved_flags = 0;
-    Module *module = so_addr.GetModule();
+    Module *module = so_addr.GetModulePtr();
     if (module)
     {
         resolved_flags = module->ResolveSymbolContextForAddress (so_addr,
diff --git a/source/Core/SearchFilter.cpp b/source/Core/SearchFilter.cpp
index d31ed8b..342e988 100644
--- a/source/Core/SearchFilter.cpp
+++ b/source/Core/SearchFilter.cpp
@@ -318,7 +318,7 @@
 // SearchFilterByModule constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModule::SearchFilterByModule (lldb::TargetSP &target_sp, const FileSpec &module) :
+SearchFilterByModule::SearchFilterByModule (const lldb::TargetSP &target_sp, const FileSpec &module) :
     SearchFilter (target_sp),
     m_module_spec (module)
 {
@@ -430,7 +430,7 @@
         Module* module = m_target_sp->GetImages().GetModulePointerAtIndex(i);
         if (FileSpec::Compare (m_module_spec, module->GetFileSpec(), false) == 0)
         {
-            SymbolContext matchingContext(m_target_sp, ModuleSP(module));
+            SymbolContext matchingContext(m_target_sp, module->shared_from_this());
             Searcher::CallbackReturn shouldContinue;
 
             shouldContinue = DoModuleIteration(matchingContext, searcher);
@@ -476,7 +476,7 @@
 // SearchFilterByModuleList constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModuleList::SearchFilterByModuleList (lldb::TargetSP &target_sp, const FileSpecList &module_list) :
+SearchFilterByModuleList::SearchFilterByModuleList (const lldb::TargetSP &target_sp, const FileSpecList &module_list) :
     SearchFilter (target_sp),
     m_module_spec_list (module_list)
 {
@@ -594,7 +594,7 @@
         Module* module = m_target_sp->GetImages().GetModulePointerAtIndex(i);
         if (m_module_spec_list.FindFileIndex(0, module->GetFileSpec(), false) != UINT32_MAX)
         {
-            SymbolContext matchingContext(m_target_sp, ModuleSP(module));
+            SymbolContext matchingContext(m_target_sp, module->shared_from_this());
             Searcher::CallbackReturn shouldContinue;
 
             shouldContinue = DoModuleIteration(matchingContext, searcher);
@@ -664,7 +664,7 @@
 // SearchFilterByModuleListAndCU constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU (lldb::TargetSP &target_sp, 
+SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU (const lldb::TargetSP &target_sp, 
                                                               const FileSpecList &module_list,
                                                               const FileSpecList &cu_list) :
     SearchFilterByModuleList (target_sp, module_list),
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index cfc5dcd..dbf5bc6 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -3490,7 +3490,7 @@
     Target *target = exe_ctx.GetTargetPtr();
     if (target != NULL)
     {
-        m_target_sp = target;
+        m_target_sp = target->shared_from_this();
         m_process_sp = exe_ctx.GetProcessSP();
         if (!m_process_sp)
             m_process_sp = target->GetProcessSP();
diff --git a/source/Core/ValueObjectMemory.cpp b/source/Core/ValueObjectMemory.cpp
index bd7a791..5d9406e 100644
--- a/source/Core/ValueObjectMemory.cpp
+++ b/source/Core/ValueObjectMemory.cpp
@@ -272,7 +272,7 @@
 Module *
 ValueObjectMemory::GetModule()
 {
-    return m_address.GetModule();
+    return m_address.GetModulePtr();
 }
 
 
diff --git a/source/Expression/ClangASTSource.cpp b/source/Expression/ClangASTSource.cpp
index d7a1926..162dfab 100644
--- a/source/Expression/ClangASTSource.cpp
+++ b/source/Expression/ClangASTSource.cpp
@@ -946,7 +946,7 @@
 NamespaceDecl *
 ClangASTSource::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
 {
-    if (namespace_decls.empty())
+    if (!namespace_decls)
         return NULL;
     
     lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
diff --git a/source/Expression/ClangFunction.cpp b/source/Expression/ClangFunction.cpp
index c583da9..2244769 100644
--- a/source/Expression/ClangFunction.cpp
+++ b/source/Expression/ClangFunction.cpp
@@ -70,7 +70,7 @@
     // Can't make a ClangFunction without a process.
     assert (process != NULL);
         
-    m_jit_process_sp = process->GetSP();
+    m_jit_process_sp = process->shared_from_this();
 }
 
 ClangFunction::ClangFunction
@@ -95,7 +95,7 @@
     // Can't make a ClangFunction without a process.
     assert (process != NULL);
         
-    m_jit_process_sp = process->GetSP();
+    m_jit_process_sp = process->shared_from_this();
 
     m_function_addr = m_function_ptr->GetAddressRange().GetBaseAddress();
     m_function_return_qual_type = m_function_ptr->GetReturnClangType();
@@ -266,7 +266,7 @@
     if (!jit_error.Success())
         return false;
     if (process && m_jit_alloc != LLDB_INVALID_ADDRESS)
-        m_jit_process_sp = process->GetSP();
+        m_jit_process_sp = process->shared_from_this();
 
     return true;
 }
diff --git a/source/Expression/ClangUserExpression.cpp b/source/Expression/ClangUserExpression.cpp
index 7719f08..0bcae47 100644
--- a/source/Expression/ClangUserExpression.cpp
+++ b/source/Expression/ClangUserExpression.cpp
@@ -357,7 +357,7 @@
     if (jit_error.Success())
     {
         if (process && m_jit_alloc != LLDB_INVALID_ADDRESS)
-            m_jit_process_sp = process->GetSP();        
+            m_jit_process_sp = process->shared_from_this();        
         return true;
     }
     else
diff --git a/source/Expression/ClangUtilityFunction.cpp b/source/Expression/ClangUtilityFunction.cpp
index 7220be8..78c3c16 100644
--- a/source/Expression/ClangUtilityFunction.cpp
+++ b/source/Expression/ClangUtilityFunction.cpp
@@ -148,7 +148,7 @@
     }
     
     if (m_jit_start_addr != LLDB_INVALID_ADDRESS)
-        m_jit_process_sp = process->GetSP();
+        m_jit_process_sp = process->shared_from_this();
     
 #if 0
 	// jingham: look here
diff --git a/source/Expression/IRInterpreter.cpp b/source/Expression/IRInterpreter.cpp
index 3cbe9f3..a7ca4c8 100644
--- a/source/Expression/IRInterpreter.cpp
+++ b/source/Expression/IRInterpreter.cpp
@@ -69,8 +69,8 @@
     return s;
 }
 
-typedef lldb::SharedPtr <lldb_private::DataEncoder>::Type DataEncoderSP;
-typedef lldb::SharedPtr <lldb_private::DataExtractor>::Type DataExtractorSP;
+typedef SHARED_PTR(lldb_private::DataEncoder) DataEncoderSP;
+typedef SHARED_PTR(lldb_private::DataExtractor) DataExtractorSP;
 
 class Memory
 {
@@ -127,7 +127,7 @@
         }
     };
     
-    typedef lldb::SharedPtr <Allocation>::Type  AllocationSP;
+    typedef SHARED_PTR(Allocation)  AllocationSP;
     
     struct Region
     {
diff --git a/source/Interpreter/CommandInterpreter.cpp b/source/Interpreter/CommandInterpreter.cpp
index 77cab23..9d6ac25 100644
--- a/source/Interpreter/CommandInterpreter.cpp
+++ b/source/Interpreter/CommandInterpreter.cpp
@@ -2559,7 +2559,7 @@
             m_exe_ctx.SetProcessSP (process_sp);
             if (process_sp && process_sp->IsAlive() && !process_sp->IsRunning())
             {
-                ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread().get());
+                ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread());
                 if (thread_sp)
                 {
                     m_exe_ctx.SetThreadSP (thread_sp);
diff --git a/source/Interpreter/ScriptInterpreterPython.cpp b/source/Interpreter/ScriptInterpreterPython.cpp
index 691e0d5..58cb329 100644
--- a/source/Interpreter/ScriptInterpreterPython.cpp
+++ b/source/Interpreter/ScriptInterpreterPython.cpp
@@ -1727,7 +1727,7 @@
         return false;
     }
     
-    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().GetSP();
+    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
 
     {
         Locker py_lock(this);
@@ -1837,7 +1837,7 @@
         return false;
     }
     
-    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().GetSP();
+    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
 
     if (!debugger_sp.get())
     {
diff --git a/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index e395ccc..0d1e74b 100644
--- a/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -122,7 +122,7 @@
     }
     else
     {
-        Module *module = inst_addr.GetModule();
+        Module *module = inst_addr.GetModulePtr();
         if (module)
         {
             if (module->ResolveFileAddress(operand_value, so_addr))
diff --git a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
index d74bdf1..4f915a9 100644
--- a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
+++ b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
@@ -1255,12 +1255,12 @@
         AddressRange *ar = sym_ctx.symbol->GetAddressRangePtr();
         if (ar)
         {
-            module_sp = ar->GetBaseAddress().GetModule();
+            module_sp = ar->GetBaseAddress().GetModuleSP();
         }
     }
     if (module_sp.get() == NULL && sym_ctx.function)
     {
-        module_sp = sym_ctx.function->GetAddressRange().GetBaseAddress().GetModule();
+        module_sp = sym_ctx.function->GetAddressRange().GetBaseAddress().GetModuleSP();
     }
     if (module_sp.get() == NULL)
         return false;
@@ -1522,7 +1522,7 @@
                         
                         Module* module_to_add = sc.symbol->CalculateSymbolContextModule();
                         if (module_to_add)
-                             modules_to_search.AppendIfNeeded(static_cast<ModuleSP>(module_to_add));
+                             modules_to_search.AppendIfNeeded(module_to_add->shared_from_this());
                     }
                     
                     // If the original stub symbol is a resolver, then we don't want to break on the symbol with the
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
index 7df812c..c6e0819 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
@@ -220,7 +220,7 @@
 {
     // Maybe check here and if we have a handler already, and the UUID of this module is the same as the one in the
     // current module, then we don't have to reread it?
-    m_objc_trampoline_handler_ap.reset(new AppleObjCTrampolineHandler (m_process->GetSP(), module_sp));
+    m_objc_trampoline_handler_ap.reset(new AppleObjCTrampolineHandler (m_process->shared_from_this(), module_sp));
     if (m_objc_trampoline_handler_ap.get() != NULL)
     {
         m_read_objc_library = true;
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
index b7c7a1d..13dc7d7 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
@@ -19,7 +19,7 @@
 
 AppleObjCSymbolVendor::AppleObjCSymbolVendor(Process *process) :
     SymbolVendor(NULL),
-    m_process(process->GetSP()),
+    m_process(process->shared_from_this()),
     m_ast_ctx(process->GetTarget().GetArchitecture().GetTriple().getTriple().c_str())
 {
 }
diff --git a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
index def3f73..6501c5a 100644
--- a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
+++ b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
@@ -118,7 +118,7 @@
     class Archive
     {
     public:
-        typedef lldb::SharedPtr<Archive>::Type shared_ptr;
+        typedef SHARED_PTR(Archive) shared_ptr;
         typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map;
 
         static Map &
diff --git a/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp b/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
index 199b55c..6e230fb 100644
--- a/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
+++ b/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
@@ -104,7 +104,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }
 
diff --git a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
index 3dc2102..3ae19f9 100644
--- a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -126,7 +126,7 @@
         {
             m_current_offset = frame_sp->GetFrameCodeAddress().GetOffset() - m_start_pc.GetOffset();
         }
-        else if (frame_sp->GetFrameCodeAddress().GetModule() == m_start_pc.GetModule())
+        else if (frame_sp->GetFrameCodeAddress().GetModulePtr() == m_start_pc.GetModulePtr())
         {
             // This means that whatever symbol we kicked up isn't really correct
             // as no should cross section boundaries... We really should NULL out
@@ -284,7 +284,7 @@
 
     // If we don't have a Module for some reason, we're not going to find symbol/function information - just
     // stick in some reasonable defaults and hope we can unwind past this frame.
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL)
     {
         if (log)
         {
@@ -397,7 +397,7 @@
     }
 
     // We require that eSymbolContextSymbol be successfully filled in or this context is of no use to us.
-    if ((m_current_pc.GetModule()->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
+    if ((m_current_pc.GetModulePtr()->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
     {
         m_sym_ctx_valid = true;
     }
@@ -436,7 +436,7 @@
         temporary_pc.SetOffset(m_current_pc.GetOffset() - 1);
         m_sym_ctx.Clear();
         m_sym_ctx_valid = false;
-        if ((m_current_pc.GetModule()->ResolveSymbolContextForAddress (temporary_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
+        if ((m_current_pc.GetModulePtr()->ResolveSymbolContextForAddress (temporary_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
         {
             m_sym_ctx_valid = true;
         }
@@ -619,13 +619,13 @@
 RegisterContextLLDB::GetFastUnwindPlanForFrame ()
 {
     UnwindPlanSP unwind_plan_sp;
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL || m_current_pc.GetModulePtr()->GetObjectFile() == NULL)
         return unwind_plan_sp;
 
     if (IsFrameZero ())
         return unwind_plan_sp;
 
-    FuncUnwindersSP func_unwinders_sp (m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
+    FuncUnwindersSP func_unwinders_sp (m_current_pc.GetModulePtr()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
     if (!func_unwinders_sp)
         return unwind_plan_sp;
 
@@ -712,7 +712,7 @@
     }
 
     // No Module for the current pc, try using the architecture default unwind.
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL || m_current_pc.GetModulePtr()->GetObjectFile() == NULL)
     {
         m_frame_type = eNormalFrame;
         return arch_default_unwind_plan_sp;
@@ -721,7 +721,7 @@
     FuncUnwindersSP func_unwinders_sp;
     if (m_sym_ctx_valid)
     {
-        func_unwinders_sp = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
+        func_unwinders_sp = m_current_pc.GetModulePtr()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
     }
 
     // No FuncUnwinders available for this pc, try using architectural default unwind.
diff --git a/source/Plugins/Process/Utility/RegisterContextLLDB.h b/source/Plugins/Process/Utility/RegisterContextLLDB.h
index a578fd7..cdb0ccb 100644
--- a/source/Plugins/Process/Utility/RegisterContextLLDB.h
+++ b/source/Plugins/Process/Utility/RegisterContextLLDB.h
@@ -25,7 +25,7 @@
 class RegisterContextLLDB : public lldb_private::RegisterContext
 {
 public:
-    typedef lldb::SharedPtr<RegisterContextLLDB>::Type SharedPtr;
+    typedef SHARED_PTR(RegisterContextLLDB) SharedPtr;
 
     RegisterContextLLDB (lldb_private::Thread &thread,
                          const SharedPtr& next_frame,
diff --git a/source/Plugins/Process/Utility/UnwindLLDB.cpp b/source/Plugins/Process/Utility/UnwindLLDB.cpp
index 954ad8b..bf71b00 100644
--- a/source/Plugins/Process/Utility/UnwindLLDB.cpp
+++ b/source/Plugins/Process/Utility/UnwindLLDB.cpp
@@ -69,10 +69,10 @@
 {
     // First, set up the 0th (initial) frame
     CursorSP first_cursor_sp(new Cursor ());
-    RegisterContextLLDBSharedPtr reg_ctx_sp (new RegisterContextLLDB (m_thread, 
-                                                                        RegisterContextLLDBSharedPtr(), 
-                                                                        first_cursor_sp->sctx, 
-                                                                        0, *this));
+    RegisterContextLLDBSP reg_ctx_sp (new RegisterContextLLDB (m_thread, 
+                                                               RegisterContextLLDBSP(), 
+                                                               first_cursor_sp->sctx, 
+                                                               0, *this));
     if (reg_ctx_sp.get() == NULL)
         return false;
     
@@ -87,7 +87,7 @@
 
     // Everything checks out, so release the auto pointer value and let the
     // cursor own it in its shared pointer
-    first_cursor_sp->reg_ctx = reg_ctx_sp;
+    first_cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
     m_frames.push_back (first_cursor_sp);
     return true;
 }
@@ -104,10 +104,11 @@
         return false;
 
     uint32_t cur_idx = m_frames.size ();
-    RegisterContextLLDBSharedPtr reg_ctx_sp(new RegisterContextLLDB (m_thread, 
-                                                                       m_frames[cur_idx - 1]->reg_ctx, 
-                                                                       cursor_sp->sctx, 
-                                                                       cur_idx, *this));
+    RegisterContextLLDBSP reg_ctx_sp(new RegisterContextLLDB (m_thread, 
+                                                              m_frames[cur_idx - 1]->reg_ctx_lldb_sp, 
+                                                              cursor_sp->sctx, 
+                                                              cur_idx, 
+                                                              *this));
     if (reg_ctx_sp.get() == NULL)
         return false;
 
@@ -171,7 +172,7 @@
             }
         }
     }
-    cursor_sp->reg_ctx = reg_ctx_sp;
+    cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
     m_frames.push_back (cursor_sp);
     return true;
 }
@@ -218,21 +219,27 @@
 
     ABI *abi = m_thread.GetProcess().GetABI().get();
 
-    while (idx >= m_frames.size() && AddOneMoreFrame (abi))
-        ;
+    while (idx >= m_frames.size())
+    {
+        if (!AddOneMoreFrame (abi))
+            break;
+    }
 
-    if (idx < m_frames.size ())
-        reg_ctx_sp = m_frames[idx]->reg_ctx;
+    const uint32_t num_frames = m_frames.size();
+    if (idx < num_frames)
+    {
+        Cursor *frame_cursor = m_frames[idx].get();
+        reg_ctx_sp = frame_cursor->reg_ctx_lldb_sp->shared_from_this();
+    }
     return reg_ctx_sp;
 }
 
-UnwindLLDB::RegisterContextLLDBSharedPtr
+UnwindLLDB::RegisterContextLLDBSP
 UnwindLLDB::GetRegisterContextForFrameNum (uint32_t frame_num)
 {
-    RegisterContextLLDBSharedPtr reg_ctx_sp;
-    if (frame_num >= m_frames.size())
-        return reg_ctx_sp;
-    reg_ctx_sp = m_frames[frame_num]->reg_ctx;
+    RegisterContextLLDBSP reg_ctx_sp;
+    if (frame_num < m_frames.size())
+        reg_ctx_sp = m_frames[frame_num]->reg_ctx_lldb_sp;
     return reg_ctx_sp;
 }
 
@@ -244,7 +251,7 @@
         return false;
     while (frame_num >= 0)
     {
-        if (m_frames[frame_num]->reg_ctx->SavedLocationForRegister (lldb_regnum, regloc, false))
+        if (m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc, false))
             return true;
         frame_num--;
     }
diff --git a/source/Plugins/Process/Utility/UnwindLLDB.h b/source/Plugins/Process/Utility/UnwindLLDB.h
index ec9271b..b9352b6 100644
--- a/source/Plugins/Process/Utility/UnwindLLDB.h
+++ b/source/Plugins/Process/Utility/UnwindLLDB.h
@@ -69,11 +69,11 @@
     lldb::RegisterContextSP
     DoCreateRegisterContextForFrame (lldb_private::StackFrame *frame);
 
-    typedef lldb::SharedPtr<lldb_private::RegisterContextLLDB>::Type RegisterContextLLDBSharedPtr;
+    typedef SHARED_PTR(RegisterContextLLDB) RegisterContextLLDBSP;
 
     // Needed to retrieve the "next" frame (e.g. frame 2 needs to retrieve frame 1's RegisterContextLLDB)
     // The RegisterContext for frame_num must already exist or this returns an empty shared pointer.
-    RegisterContextLLDBSharedPtr
+    RegisterContextLLDBSP
     GetRegisterContextForFrameNum (uint32_t frame_num);
 
     // Iterate over the RegisterContextLLDB's in our m_frames vector, look for the first one that
@@ -89,14 +89,14 @@
         lldb::addr_t start_pc;  // The start address of the function/symbol for this frame - current pc if unknown
         lldb::addr_t cfa;       // The canonical frame address for this stack frame
         lldb_private::SymbolContext sctx;  // A symbol context we'll contribute to & provide to the StackFrame creation
-        RegisterContextLLDBSharedPtr reg_ctx; // These are all RegisterContextLLDB's
+        RegisterContextLLDBSP reg_ctx_lldb_sp; // These are all RegisterContextLLDB's
 
-        Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx() { }
+        Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx_lldb_sp() { }
     private:
         DISALLOW_COPY_AND_ASSIGN (Cursor);
     };
 
-    typedef lldb::SharedPtr<Cursor>::Type CursorSP;
+    typedef SHARED_PTR(Cursor) CursorSP;
     std::vector<CursorSP> m_frames;
 
     bool AddOneMoreFrame (ABI *abi);
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
index a605221..7fd5802 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
@@ -104,7 +104,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }
 
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
index e71d319..f4ee96b 100644
--- a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
+++ b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
@@ -21,7 +21,7 @@
 typedef CStringToDIEMap::iterator CStringToDIEMapIter;
 typedef CStringToDIEMap::const_iterator CStringToDIEMapConstIter;
 
-typedef lldb::SharedPtr<DWARFCompileUnit>::Type DWARFCompileUnitSP;
+typedef SHARED_PTR(DWARFCompileUnit) DWARFCompileUnitSP;
 
 class DWARFDebugInfo
 {
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h b/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
index 51e0062..843d081 100644
--- a/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
+++ b/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
@@ -68,7 +68,7 @@
         {
         }
 
-        typedef lldb::SharedPtr<Prologue>::Type shared_ptr;
+        typedef SHARED_PTR(Prologue) shared_ptr;
 
         uint32_t    total_length;   // The size in bytes of the statement information for this compilation unit (not including the total_length field itself).
         uint16_t    version;        // Version identifier for the statement information format.
@@ -135,7 +135,7 @@
     //------------------------------------------------------------------
     struct LineTable
     {
-        typedef lldb::SharedPtr<LineTable>::Type shared_ptr;
+        typedef SHARED_PTR(LineTable) shared_ptr;
 
         LineTable() :
             prologue(),
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 816cd64..5e96350 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -2031,7 +2031,7 @@
         
     if (sc.function)
     {        
-        sc.module_sp = sc.function->CalculateSymbolContextModule();
+        sc.module_sp = sc.function->CalculateSymbolContextModule()->shared_from_this();
         return true;
     }
     
@@ -2449,7 +2449,7 @@
     if (num_matches)
     {
         SymbolContext sc;
-        sc.module_sp = m_obj_file->GetModule();
+        sc.module_sp = m_obj_file->GetModule()->shared_from_this();
         assert (sc.module_sp);
         
         DWARFDebugInfo* debug_info = DebugInfo();
@@ -2535,7 +2535,7 @@
     }
 
     SymbolContext sc;
-    sc.module_sp = m_obj_file->GetModule();
+    sc.module_sp = m_obj_file->GetModule()->shared_from_this();
     assert (sc.module_sp);
     
     DWARFCompileUnit* dwarf_cu = NULL;
@@ -3149,7 +3149,7 @@
                 if (matching_type)
                 {
                     // We found a type pointer, now find the shared pointer form our type list
-                    types.InsertUnique (TypeSP (matching_type));
+                    types.InsertUnique (matching_type->shared_from_this());
                     if (types.GetSize() >= max_matches)
                         break;
                 }
@@ -3267,7 +3267,7 @@
         if (matching_type)
         {
             // We found a type pointer, now find the shared pointer form our type list
-            types.InsertUnique (TypeSP (matching_type));
+            types.InsertUnique (matching_type->shared_from_this());
             ++num_matches;
             if (num_matches >= max_matches)
                 break;
@@ -3282,7 +3282,6 @@
 size_t
 SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc,
                                        clang::DeclContext *containing_decl_ctx,
-                                       TypeSP& type_sp,
                                        DWARFCompileUnit* dwarf_cu,
                                        const DWARFDebugInfoEntry *parent_die,
                                        bool skip_artificial,
@@ -3676,7 +3675,7 @@
         else if (type_ptr != DIE_IS_BEING_PARSED)
         {
             // Grab the existing type from the master types lists
-            type_sp = type_ptr;
+            type_sp = type_ptr->shared_from_this();
         }
 
     }
@@ -4026,7 +4025,7 @@
                             
                             if (die)
                                 m_die_to_type[die] = resolved_type;
-                            type_sp = resolved_type;
+                            type_sp = resolved_type->shared_from_this();
                             break;
                         }
                     }
@@ -4148,7 +4147,7 @@
                                       MakeUserID(type_cu->GetOffset()));
                         
                         m_die_to_type[die] = resolved_type;
-                        type_sp = resolved_type;
+                        type_sp = resolved_type->shared_from_this();
                         break;
                     }
                 }
@@ -4934,7 +4933,6 @@
                         bool skip_artificial = true;
                         ParseChildParameters (sc, 
                                               containing_decl_ctx,
-                                              type_sp, 
                                               dwarf_cu, 
                                               die, 
                                               skip_artificial,
@@ -5120,7 +5118,7 @@
                                                 type_ptr = m_die_to_type[die];
                                                 if (type_ptr)
                                                 {
-                                                    type_sp = type_ptr;
+                                                    type_sp = type_ptr->shared_from_this();
                                                     break;
                                                 }
                                             }
@@ -5343,7 +5341,7 @@
         }
         else if (type_ptr != DIE_IS_BEING_PARSED)
         {
-            type_sp = type_ptr;
+            type_sp = type_ptr->shared_from_this();
         }
     }
     return type_sp;
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 7f4b16e..72ac346 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -347,7 +347,6 @@
     size_t                  ParseChildParameters(
                                 const lldb_private::SymbolContext& sc,
                                 clang::DeclContext *containing_decl_ctx,
-                                lldb::TypeSP& type_sp,
                                 DWARFCompileUnit* dwarf_cu,
                                 const DWARFDebugInfoEntry *parent_die,
                                 bool skip_artificial,
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 5c4fba2..2fa5a93 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -172,10 +172,10 @@
             // use the debug map, to add new sections to each .o file and
             // even though a .o file might not have changed, the sections
             // that get added to the .o file can change.
-            comp_unit_info->oso_module_sp = new Module (oso_file_spec, 
-                                                        m_obj_file->GetModule()->GetArchitecture(),
-                                                        NULL, 
-                                                        0);
+            comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec, 
+                                                             m_obj_file->GetModule()->GetArchitecture(),
+                                                             NULL, 
+                                                             0));
         }
     }
     return comp_unit_info->oso_module_sp.get();
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
index 6d80d77..8dca2c5 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -141,7 +141,7 @@
         lldb_private::SymbolVendor *oso_symbol_vendor;
         std::vector<uint32_t> function_indexes;
         std::vector<uint32_t> static_indexes;
-        lldb::SharedPtr<lldb_private::SectionList>::Type debug_map_sections_sp;
+        SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp;
 
         CompileUnitInfo() :
             so_file (),
diff --git a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
index d560bc3..6fc5968 100644
--- a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
+++ b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
@@ -411,7 +411,7 @@
         
         Declaration decl;
         
-        lldb::TypeSP type(new Type (iter->second,
+        lldb::TypeSP type(new Type (match->value,
                                     this,
                                     name,
                                     0,      // byte_size - don't change this from 0, we currently use that to identify these "synthetic" ObjC class types.
diff --git a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
index 1224367..fce609b 100644
--- a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
+++ b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
@@ -162,7 +162,7 @@
             // Just create our symbol vendor using the current objfile as this is either
             // an executable with no dSYM (that we could locate), an executable with
             // a dSYM that has a UUID that doesn't match.
-            symbol_vendor->AddSymbolFileRepresentation(obj_file->GetSP());
+            symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
         }
     }
     return symbol_vendor;
diff --git a/source/Symbol/ObjectFile.cpp b/source/Symbol/ObjectFile.cpp
index 075e48f..02f176a 100644
--- a/source/Symbol/ObjectFile.cpp
+++ b/source/Symbol/ObjectFile.cpp
@@ -276,14 +276,6 @@
     return eAddressClassUnknown;
 }
 
-ObjectFileSP
-ObjectFile::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return ObjectFileSP (this);
-}
-
 size_t
 ObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const
 {
diff --git a/source/Symbol/Symbol.cpp b/source/Symbol/Symbol.cpp
index 016ac97..0f1b7ce 100644
--- a/source/Symbol/Symbol.cpp
+++ b/source/Symbol/Symbol.cpp
@@ -267,7 +267,7 @@
         if (!m_type_data_resolved)
         {
             m_type_data_resolved = true;
-            Module *module = m_addr_range.GetBaseAddress().GetModule();
+            Module *module = m_addr_range.GetBaseAddress().GetModulePtr();
             SymbolContext sc;
             if (module && module->ResolveSymbolContextForAddress (m_addr_range.GetBaseAddress(),
                                                                   eSymbolContextLineEntry,
@@ -350,15 +350,9 @@
     sc->symbol = this;
     const AddressRange *range = GetAddressRangePtr();
     if (range)
-    {   
-        Module *module = range->GetBaseAddress().GetModule ();
-        if (module)
-        {
-            sc->module_sp = module;
-            return;
-        }
-    }
-    sc->module_sp.reset();
+        sc->module_sp = range->GetBaseAddress().GetModuleSP ();
+    else
+        sc->module_sp.reset();
 }
 
 Module *
@@ -366,7 +360,7 @@
 {
     const AddressRange *range = GetAddressRangePtr();
     if (range)
-        return range->GetBaseAddress().GetModule ();
+        return range->GetBaseAddress().GetModulePtr ();
     return NULL;
 }
 
@@ -384,7 +378,7 @@
     const AddressRange *range = GetAddressRangePtr();
     if (range)
     {   
-        Module *module = range->GetBaseAddress().GetModule ();
+        Module *module = range->GetBaseAddress().GetModulePtr ();
         if (module)
         {
             dumped_module = true;
diff --git a/source/Symbol/SymbolVendor.cpp b/source/Symbol/SymbolVendor.cpp
index 3a48756..631135d 100644
--- a/source/Symbol/SymbolVendor.cpp
+++ b/source/Symbol/SymbolVendor.cpp
@@ -58,7 +58,7 @@
     {
         ObjectFile *objfile = module->GetObjectFile();
         if (objfile)
-            instance_ap->AddSymbolFileRepresentation(objfile->GetSP());
+            instance_ap->AddSymbolFileRepresentation(objfile->shared_from_this());
     }
     return instance_ap.release();
 }
diff --git a/source/Symbol/Type.cpp b/source/Symbol/Type.cpp
index 985174b..66a13e2 100644
--- a/source/Symbol/Type.cpp
+++ b/source/Symbol/Type.cpp
@@ -34,7 +34,7 @@
 SymbolFileType::GetType ()
 {
     if (!m_type_sp)
-        m_type_sp = m_symbol_file.ResolveTypeUID (GetID());
+        m_type_sp = m_symbol_file.ResolveTypeUID (GetID())->shared_from_this();
     return m_type_sp.get();
 }
 
diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp
index cb3f86e..a868e5f 100644
--- a/source/Symbol/Variable.cpp
+++ b/source/Symbol/Variable.cpp
@@ -243,7 +243,7 @@
     {
         SymbolContext sc;
         CalculateSymbolContext(&sc);
-        if (sc.module_sp.get() == address.GetModule())
+        if (sc.module_sp.get() == address.GetModulePtr())
         {
             // Is the variable is described by a single location?
             if (!m_location.IsLocationList())
@@ -480,7 +480,7 @@
     {
         SymbolContext sc;
         CalculateSymbolContext(&sc);
-        if (sc.module_sp.get() == address.GetModule())
+        if (sc.module_sp.get() == address.GetModulePtr())
         {
             ABI *abi = NULL;
             if (m_owner_scope)
diff --git a/source/Target/ExecutionContext.cpp b/source/Target/ExecutionContext.cpp
index 41cf04d..8360d1a 100644
--- a/source/Target/ExecutionContext.cpp
+++ b/source/Target/ExecutionContext.cpp
@@ -46,7 +46,7 @@
 }
 
 ExecutionContext::ExecutionContext (Target* t, bool fill_current_process_thread_frame) :
-    m_target_sp (t),
+    m_target_sp (t->shared_from_this()),
     m_process_sp (),
     m_thread_sp (),
     m_frame_sp ()
@@ -58,17 +58,19 @@
         {
             m_thread_sp = m_process_sp->GetThreadList().GetSelectedThread();
             if (m_thread_sp)
-                m_frame_sp = m_thread_sp->GetSelectedFrame().get();
+                m_frame_sp = m_thread_sp->GetSelectedFrame();
         }
     }
 }
 
 ExecutionContext::ExecutionContext(Process* process, Thread *thread, StackFrame *frame) :
-    m_target_sp (process ? &process->GetTarget() : NULL),
-    m_process_sp (process),
-    m_thread_sp (thread),
-    m_frame_sp (frame)
+    m_target_sp (),
+    m_process_sp (process->shared_from_this()),
+    m_thread_sp (thread->shared_from_this()),
+    m_frame_sp (frame->shared_from_this())
 {
+    if (process)
+        m_target_sp = process->GetTarget().shared_from_this();
 }
 
 ExecutionContext::ExecutionContext (ExecutionContextScope *exe_scope_ptr)
@@ -200,24 +202,36 @@
 void
 ExecutionContext::SetTargetPtr (Target* target)
 {
-    m_target_sp = target;
+    if (target)
+        m_target_sp = target->shared_from_this();
+    else
+        m_target_sp.reset();
 }
 
 void
 ExecutionContext::SetProcessPtr (Process *process)
 {
-    m_process_sp = process;
+    if (process)
+        m_process_sp = process->shared_from_this();
+    else
+        m_process_sp.reset();
 }
 
 void
 ExecutionContext::SetThreadPtr (Thread *thread)
 {
-    m_thread_sp = thread;
+    if (thread)
+        m_thread_sp = thread->shared_from_this();
+    else
+        m_thread_sp.reset();
 }
 
 void
 ExecutionContext::SetFramePtr (StackFrame *frame)
 {
-    m_frame_sp = frame;
+    if (frame)
+        m_frame_sp = frame->shared_from_this();
+    else
+        m_frame_sp.reset();
 }
 
diff --git a/source/Target/Process.cpp b/source/Target/Process.cpp
index 2eb519f..e991437 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -848,7 +848,7 @@
     m_abi_sp.reset();
     m_os_ap.reset();
     m_dyld_ap.reset();
-    m_thread_list.Clear();
+    m_thread_list.Destroy();
     std::vector<Notifications> empty_notifications;
     m_notifications.swap(empty_notifications);
     m_image_tokens.clear();
@@ -1543,7 +1543,7 @@
 }
 
 lldb::break_id_t
-Process::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware)
+Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
 {
     const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
     if (load_addr != LLDB_INVALID_ADDRESS)
@@ -3410,12 +3410,6 @@
     exe_ctx.SetFramePtr (NULL);
 }
 
-lldb::ProcessSP
-Process::GetSP ()
-{
-    return GetTarget().GetProcessSP();
-}
-
 //uint32_t
 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
 //{
@@ -3680,13 +3674,10 @@
 Process::UpdateInstanceName ()
 {
     Module *module = GetTarget().GetExecutableModulePointer();
-    if (module)
+    if (module && module->GetFileSpec().GetFilename())
     {
-        StreamString sstr;
-        sstr.Printf ("%s", module->GetFileSpec().GetFilename().AsCString());
-                    
         GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(),
-                                                         sstr.GetData());
+                                                         module->GetFileSpec().GetFilename().AsCString());
     }
 }
 
diff --git a/source/Target/StackFrame.cpp b/source/Target/StackFrame.cpp
index 666bc1d..2ce69f8 100644
--- a/source/Target/StackFrame.cpp
+++ b/source/Target/StackFrame.cpp
@@ -95,7 +95,7 @@
     
     if (reg_context_sp && !m_sc.target_sp)
     {
-        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().GetSP();
+        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().shared_from_this();
         m_flags.Set (eSymbolContextTarget);
     }
 }
@@ -129,16 +129,16 @@
     
     if (m_sc.target_sp.get() == NULL && reg_context_sp)
     {
-        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().GetSP();
+        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().shared_from_this();
         m_flags.Set (eSymbolContextTarget);
     }
     
-    Module *pc_module = pc_addr.GetModule();
+    Module *pc_module = pc_addr.GetModulePtr();
     if (m_sc.module_sp.get() == NULL || m_sc.module_sp.get() != pc_module)
     {
         if (pc_module)
         {
-            m_sc.module_sp = pc_module;
+            m_sc.module_sp = pc_module->shared_from_this();
             m_flags.Set (eSymbolContextModule);
         }
         else
@@ -218,7 +218,7 @@
                 Module *module = section->GetModule();
                 if (module)
                 {
-                    m_sc.module_sp = module;
+                    m_sc.module_sp = module->shared_from_this();
                     if (m_sc.module_sp)
                         m_flags.Set(eSymbolContextModule);
                 }
@@ -417,7 +417,7 @@
         // If the target was requested add that:
         if (m_sc.target_sp.get() == NULL)
         {
-            m_sc.target_sp = CalculateProcess()->GetTarget().GetSP();
+            m_sc.target_sp = CalculateProcess()->GetTarget().shared_from_this();
             if (m_sc.target_sp)
                 resolved |= eSymbolContextTarget;
         }
@@ -1245,16 +1245,6 @@
     return false;
 }
 
-StackFrameSP
-StackFrame::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return StackFrameSP (this);
-}
-
-
-
 bool
 StackFrame::GetStatus (Stream& strm,
                        bool show_frame_info,
diff --git a/source/Target/Target.cpp b/source/Target/Target.cpp
index 46ce1d3..f4159de 100644
--- a/source/Target/Target.cpp
+++ b/source/Target/Target.cpp
@@ -149,14 +149,6 @@
     return m_process_sp;
 }
 
-lldb::TargetSP
-Target::GetSP()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return TargetSP(this);
-}
-
 void
 Target::Destroy()
 {
@@ -256,8 +248,7 @@
 BreakpointSP
 Target::CreateBreakpoint (Address &addr, bool internal)
 {
-    TargetSP target_sp = this->GetSP();
-    SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (target_sp));
+    SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
     BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
     return CreateBreakpoint (filter_sp, resolver_sp, internal);
 }
@@ -290,17 +281,16 @@
 Target::GetSearchFilterForModule (const FileSpec *containingModule)
 {
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModule != NULL)
     {
         // TODO: We should look into sharing module based search filters
         // across many breakpoints like we do for the simple target based one
-        filter_sp.reset (new SearchFilterByModule (target_sp, *containingModule));
+        filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
     }
     else
     {
         if (m_search_filter_sp.get() == NULL)
-            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp));
+            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
         filter_sp = m_search_filter_sp;
     }
     return filter_sp;
@@ -310,17 +300,16 @@
 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
 {
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModules && containingModules->GetSize() != 0)
     {
         // TODO: We should look into sharing module based search filters
         // across many breakpoints like we do for the simple target based one
-        filter_sp.reset (new SearchFilterByModuleList (target_sp, *containingModules));
+        filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
     }
     else
     {
         if (m_search_filter_sp.get() == NULL)
-            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp));
+            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
         filter_sp = m_search_filter_sp;
     }
     return filter_sp;
@@ -333,17 +322,16 @@
         return GetSearchFilterForModuleList(containingModules);
         
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModules == NULL)
     {
         // We could make a special "CU List only SearchFilter".  Better yet was if these could be composable, 
         // but that will take a little reworking.
         
-        filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, FileSpecList(), *containingSourceFiles));
+        filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
     }
     else
     {
-        filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, *containingModules, *containingSourceFiles));
+        filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
     }
     return filter_sp;
 }
@@ -1073,11 +1061,12 @@
 
         if (load_addr == LLDB_INVALID_ADDRESS)
         {
-            if (resolved_addr.GetModule() && resolved_addr.GetModule()->GetFileSpec())
+            Module *addr_module = resolved_addr.GetModulePtr();
+            if (addr_module && addr_module->GetFileSpec())
                 error.SetErrorStringWithFormat("%s[0x%llx] can't be resolved, %s in not currently loaded", 
-                                               resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString(), 
+                                               addr_module->GetFileSpec().GetFilename().AsCString(), 
                                                resolved_addr.GetFileAddress(),
-                                               resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString());
+                                               addr_module->GetFileSpec().GetFilename().AsCString());
             else
                 error.SetErrorStringWithFormat("0x%llx can't be resolved", resolved_addr.GetFileAddress());
         }
@@ -1339,7 +1328,7 @@
     if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
     {
         m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
-        m_scratch_ast_source_ap.reset (new ClangASTSource(GetSP()));
+        m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
         m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
         llvm::OwningPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
         m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
@@ -1678,7 +1667,7 @@
 Target::AddStopHook (Target::StopHookSP &new_hook_sp)
 {
     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
-    new_hook_sp.reset (new StopHook(GetSP(), new_uid));
+    new_hook_sp.reset (new StopHook(shared_from_this(), new_uid));
     m_stop_hooks[new_uid] = new_hook_sp;
     return new_uid;
 }
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index ae083c7..5d7c905 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -1030,15 +1030,6 @@
                             &end);
 }
 
-lldb::ThreadSP
-Thread::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return ThreadSP(this);
-}
-
-
 void
 Thread::SettingsInitialize ()
 {
diff --git a/source/Target/ThreadList.cpp b/source/Target/ThreadList.cpp
index f4d75f5..62eb1de 100644
--- a/source/Target/ThreadList.cpp
+++ b/source/Target/ThreadList.cpp
@@ -355,6 +355,17 @@
 }
 
 void
+ThreadList::Destroy()
+{
+    Mutex::Locker locker(m_threads_mutex);
+    const uint32_t num_threads = m_threads.size();
+    for (uint32_t idx = 0; idx < num_threads; ++idx)
+    {
+        m_threads[idx]->DestroyThread();
+    }
+}
+
+void
 ThreadList::RefreshStateAfterStop ()
 {
     Mutex::Locker locker(m_threads_mutex);
@@ -603,6 +614,32 @@
         m_stop_id = rhs.m_stop_id;
         m_threads.swap(rhs.m_threads);
         m_selected_tid = rhs.m_selected_tid;
+        
+        
+        // Now we look for threads that we are done with and
+        // make sure to clear them up as much as possible so 
+        // anyone with a shared pointer will still have a reference,
+        // but the thread won't be of much use. Using std::weak_ptr
+        // for all backward references (such as a thread to a process)
+        // will eventually solve this issue for us, but for now, we
+        // need to work around the issue
+        collection::iterator rhs_pos, rhs_end = rhs.m_threads.end();
+        for (rhs_pos = rhs.m_threads.begin(); rhs_pos != rhs_end; ++rhs_pos)
+        {
+            const lldb::tid_t tid = (*rhs_pos)->GetID();
+            bool thread_is_alive = false;
+            const uint32_t num_threads = m_threads.size();
+            for (uint32_t idx = 0; idx < num_threads; ++idx)
+            {
+                if (m_threads[idx]->GetID() == tid)
+                {
+                    thread_is_alive = true;
+                    break;
+                }
+            }
+            if (!thread_is_alive)
+                (*rhs_pos)->DestroyThread();
+        }        
     }
 }
 
diff --git a/source/Target/ThreadPlanTestCondition.cpp b/source/Target/ThreadPlanTestCondition.cpp
index 42aa01c..b9f8a27 100644
--- a/source/Target/ThreadPlanTestCondition.cpp
+++ b/source/Target/ThreadPlanTestCondition.cpp
@@ -119,7 +119,7 @@
     else
     {
         // Now we have to change the event to a breakpoint event and mark it up appropriately:
-        Process::ProcessEventData *new_data = new Process::ProcessEventData (m_thread.GetProcess().GetSP(), eStateStopped);
+        Process::ProcessEventData *new_data = new Process::ProcessEventData (m_thread.GetProcess().shared_from_this(), eStateStopped);
         event_ptr->SetData(new_data);
         event_ptr->SetType(Process::eBroadcastBitStateChanged);
         SetStopInfo(StopInfo::CreateStopReasonWithBreakpointSiteID (m_thread, 
diff --git a/source/lldb-log.cpp b/source/lldb-log.cpp
index 6dc32f0..b02dd25 100644
--- a/source/lldb-log.cpp
+++ b/source/lldb-log.cpp
@@ -169,7 +169,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }