[Lldb-commits] [lldb] r125650 - in /lldb/trunk: include/lldb/ include/lldb/Target/ source/Core/ source/Host/common/ source/Plugins/DynamicLoader/Linux-DYLD/ source/Plugins/DynamicLoader/MacOSX-DYLD/ source/Plugins/Process/Linux/ source/Plugins/Process/MacOSX-User/source/ source/Plugins/Process/gdb-remote/ source/Target/ tools/debugserver/source/

Greg Clayton gclayton at apple.com
Tue Feb 15 20:46:07 PST 2011


Author: gclayton
Date: Tue Feb 15 22:46:07 2011
New Revision: 125650

URL: http://llvm.org/viewvc/llvm-project?rev=125650&view=rev
Log:
The DynamicLoader plug-in instance now lives up in lldb_private::Process where
it should live and the lldb_private::Process takes care of managing the 
auto pointer to the dynamic loader instance.

Also, now that the ArchSpec contains the target triple, we are able to 
correctly set the Target architecture in DidLaunch/DidAttach in the subclasses,
and then the lldb_private::Process will find the dynamic loader plug-in 
by letting the dynamic loader plug-ins inspect the arch/triple in the target.

So now the ProcessGDBRemote plug-in is another step closer to be purely 
process/platform agnostic.

I updated the ProcessMacOSX and the ProcessLinux plug-ins accordingly.


Modified:
    lldb/trunk/include/lldb/Target/Process.h
    lldb/trunk/include/lldb/lldb-private-interfaces.h
    lldb/trunk/source/Core/DynamicLoader.cpp
    lldb/trunk/source/Host/common/Host.cpp
    lldb/trunk/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp
    lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
    lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h
    lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp
    lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h
    lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
    lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
    lldb/trunk/source/Target/Process.cpp
    lldb/trunk/tools/debugserver/source/RNBRemote.cpp

Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Tue Feb 15 22:46:07 2011
@@ -1232,6 +1232,12 @@
     lldb::StateType
     GetPrivateState ();
 
+    //------------------------------------------------------------------
+    // Called internally
+    //------------------------------------------------------------------
+    void
+    CompleteAttach ();
+    
 public:
     //------------------------------------------------------------------
     /// Get the exit status for a process.
@@ -1755,9 +1761,12 @@
     const ABI *
     GetABI ();
 
-    virtual DynamicLoader *
-    GetDynamicLoader ();
-    
+    DynamicLoader *
+    GetDynamicLoader ()
+    {
+        return m_dyld_ap.get();
+    }
+
     virtual LanguageRuntime *
     GetLanguageRuntime (lldb::LanguageType language);
 
@@ -1940,6 +1949,7 @@
     Listener                    &m_listener;
     BreakpointSiteList          m_breakpoint_site_list; ///< This is the list of breakpoint locations we intend
                                                         ///< to insert in the target.
+    std::auto_ptr<DynamicLoader> m_dyld_ap;
     std::auto_ptr<DynamicCheckerFunctions>  m_dynamic_checkers_ap; ///< The functions used by the expression parser to validate data that expressions use.
     UnixSignals                 m_unix_signals;         /// This is the current signal set for this process.
     lldb::ABISP                 m_abi_sp;

Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)
+++ lldb/trunk/include/lldb/lldb-private-interfaces.h Tue Feb 15 22:46:07 2011
@@ -18,7 +18,7 @@
 {
     typedef ABI* (*ABICreateInstance) (const ArchSpec &arch);
     typedef Disassembler* (*DisassemblerCreateInstance) (const ArchSpec &arch);
-    typedef DynamicLoader* (*DynamicLoaderCreateInstance) (Process* process);
+    typedef DynamicLoader* (*DynamicLoaderCreateInstance) (Process* process, bool force);
     typedef ObjectContainer* (*ObjectContainerCreateInstance) (Module* module, lldb::DataBufferSP& dataSP, const FileSpec *file, lldb::addr_t offset, lldb::addr_t length);
     typedef ObjectFile* (*ObjectFileCreateInstance) (Module* module, lldb::DataBufferSP& dataSP, const FileSpec* file, lldb::addr_t offset, lldb::addr_t length);
     typedef LogChannel* (*LogChannelCreateInstance) ();

Modified: lldb/trunk/source/Core/DynamicLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/DynamicLoader.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Core/DynamicLoader.cpp (original)
+++ lldb/trunk/source/Core/DynamicLoader.cpp Tue Feb 15 22:46:07 2011
@@ -23,7 +23,7 @@
         create_callback  = PluginManager::GetDynamicLoaderCreateCallbackForPluginName (plugin_name);
         if (create_callback)
         {
-            std::auto_ptr<DynamicLoader> instance_ap(create_callback(process));
+            std::auto_ptr<DynamicLoader> instance_ap(create_callback(process, true));
             if (instance_ap.get())
                 return instance_ap.release();
         }
@@ -32,7 +32,7 @@
     {
         for (uint32_t idx = 0; (create_callback = PluginManager::GetDynamicLoaderCreateCallbackAtIndex(idx)) != NULL; ++idx)
         {
-            std::auto_ptr<DynamicLoader> instance_ap(create_callback(process));
+            std::auto_ptr<DynamicLoader> instance_ap(create_callback(process, false));
             if (instance_ap.get())
                 return instance_ap.release();
         }

Modified: lldb/trunk/source/Host/common/Host.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Host.cpp (original)
+++ lldb/trunk/source/Host/common/Host.cpp Tue Feb 15 22:46:07 2011
@@ -261,20 +261,20 @@
             
             if (is_64_bit_capable)
             {
+#if defined (__i386__) || defined (__x86_64__)
+                if (cpusubtype == CPU_SUBTYPE_486)
+                    cpusubtype = CPU_SUBTYPE_I386_ALL;
+#endif
                 if (cputype & CPU_ARCH_ABI64)
                 {
                     // We have a 64 bit kernel on a 64 bit system
-                    g_host_arch_32.SetMachOArch (CPU_TYPE_I386, CPU_SUBTYPE_386);
+                    g_host_arch_32.SetMachOArch (~(CPU_ARCH_MASK) & cputype, cpusubtype);
                     g_host_arch_64.SetMachOArch (cputype, cpusubtype);
                 }
                 else
                 {
                     // We have a 32 bit kernel on a 64 bit system
                     g_host_arch_32.SetMachOArch (cputype, cpusubtype);
-#if defined (__i386__) || defined (__x86_64__)
-                    if (cpusubtype == CPU_SUBTYPE_486)
-                        cpusubtype = CPU_SUBTYPE_I386_ALL;
-#endif
                     cputype |= CPU_ARCH_ABI64;
                     g_host_arch_64.SetMachOArch (cputype, cpusubtype);
                 }

Modified: lldb/trunk/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp Tue Feb 15 22:46:07 2011
@@ -73,9 +73,19 @@
 }
 
 DynamicLoader *
-DynamicLoaderLinuxDYLD::CreateInstance(Process *process)
+DynamicLoaderLinuxDYLD::CreateInstance(Process *process, bool force)
 {
-    return new DynamicLoaderLinuxDYLD(process);
+    bool create = force;
+    if (!create)
+    {
+        const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
+        if (triple_ref.getOS() == llvm::Triple::Linux)
+            create = true;
+    }
+    
+    if (create)
+        return new DynamicLoaderLinuxDYLD (process);
+    return NULL;
 }
 
 DynamicLoaderLinuxDYLD::DynamicLoaderLinuxDYLD(Process *process)

Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp Tue Feb 15 22:46:07 2011
@@ -63,9 +63,19 @@
 // allows the lldb to instantiate an instance of this class.
 //----------------------------------------------------------------------
 DynamicLoader *
-DynamicLoaderMacOSXDYLD::CreateInstance (Process* process)
+DynamicLoaderMacOSXDYLD::CreateInstance (Process* process, bool force)
 {
-    return new DynamicLoaderMacOSXDYLD (process);
+    bool create = force;
+    if (!create)
+    {
+        const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
+        if (triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple)
+            create = true;
+    }
+    
+    if (create)
+        return new DynamicLoaderMacOSXDYLD (process);
+    return NULL;
 }
 
 //----------------------------------------------------------------------

Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h Tue Feb 15 22:46:07 2011
@@ -44,7 +44,7 @@
     GetPluginDescriptionStatic();
 
     static lldb_private::DynamicLoader *
-    CreateInstance (lldb_private::Process *process);
+    CreateInstance (lldb_private::Process *process, bool force);
 
     DynamicLoaderMacOSXDYLD (lldb_private::Process *process);
 

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.cpp Tue Feb 15 22:46:07 2011
@@ -106,12 +106,6 @@
 ProcessLinux::WillLaunch(Module* module)
 {
     Error error;
-
-    m_dyld_ap.reset(DynamicLoader::FindPlugin(this, "dynamic-loader.linux-dyld"));
-    if (m_dyld_ap.get() == NULL)
-        error.SetErrorString("unable to find the dynamic loader named "
-                             "'dynamic-loader.linux-dyld'");
-
     return error;
 }
 
@@ -146,8 +140,6 @@
 void
 ProcessLinux::DidLaunch()
 {
-    if (m_dyld_ap.get() != NULL)
-        m_dyld_ap->DidLaunch();
 }
 
 Error
@@ -405,12 +397,6 @@
     return m_byte_order;
 }
 
-DynamicLoader *
-ProcessLinux::GetDynamicLoader()
-{
-    return m_dyld_ap.get();
-}
-
 //------------------------------------------------------------------------------
 // ProcessInterface protocol.
 

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessLinux.h Tue Feb 15 22:46:07 2011
@@ -138,9 +138,6 @@
     virtual lldb::addr_t
     GetImageInfoAddress();
 
-    virtual lldb_private::DynamicLoader *
-    GetDynamicLoader();
-
     //------------------------------------------------------------------
     // PluginInterface protocol
     //------------------------------------------------------------------
@@ -186,9 +183,6 @@
     lldb_private::Mutex m_message_mutex;
     std::queue<ProcessMessage> m_message_queue;
 
-    /// Dynamic loader plugin associated with this process.
-    std::auto_ptr<lldb_private::DynamicLoader> m_dyld_ap;
-
     /// Updates the loaded sections provided by the executable.
     ///
     /// FIXME:  It would probably be better to delegate this task to the

Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp Tue Feb 15 22:46:07 2011
@@ -234,8 +234,7 @@
     m_stdout_data (),
     m_exception_messages (),
     m_exception_messages_mutex (Mutex::eMutexTypeRecursive),
-    m_arch_spec (),
-    m_dynamic_loader_ap ()
+    m_arch_spec ()
 {
 }
 
@@ -414,14 +413,7 @@
 Error
 ProcessMacOSX::WillLaunchOrAttach ()
 {
-    Error error;
-    // TODO: this is hardcoded for macosx right now. We need this to be more dynamic
-    m_dynamic_loader_ap.reset(DynamicLoader::FindPlugin(this, "dynamic-loader.macosx-dyld"));
-
-    if (m_dynamic_loader_ap.get() == NULL)
-        error.SetErrorString("unable to find the dynamic loader named 'dynamic-loader.macosx-dyld'");
-    
-    return error;
+    return Error();
 }
 
 
@@ -434,11 +426,7 @@
 void
 ProcessMacOSX::DidLaunchOrAttach ()
 {
-    if (GetID() == LLDB_INVALID_PROCESS_ID)
-    {
-        m_dynamic_loader_ap.reset();
-    }
-    else
+    if (GetID() != LLDB_INVALID_PROCESS_ID)
     {
         Module * exe_module = GetTarget().GetExecutableModule ().get();
         assert (exe_module);
@@ -455,16 +443,12 @@
 {
     ProcessMacOSXLog::LogIf (PD_LOG_PROCESS, "ProcessMacOSX::DidLaunch()");
     DidLaunchOrAttach ();
-    if (m_dynamic_loader_ap.get())
-        m_dynamic_loader_ap->DidLaunch();
 }
 
 void
 ProcessMacOSX::DidAttach ()
 {
     DidLaunchOrAttach ();
-    if (m_dynamic_loader_ap.get())
-        m_dynamic_loader_ap->DidAttach();
 }
 
 Error
@@ -870,12 +854,6 @@
     return Task().GetDYLDAllImageInfosAddress();
 }
 
-DynamicLoader *
-ProcessMacOSX::GetDynamicLoader()
-{
-    return m_dynamic_loader_ap.get();
-}
-
 //------------------------------------------------------------------
 // Process Memory
 //------------------------------------------------------------------

Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h Tue Feb 15 22:46:07 2011
@@ -222,9 +222,6 @@
     virtual lldb_private::Error
     DisableWatchpoint (lldb_private::WatchpointLocation *wp_loc);
 
-    virtual lldb_private::DynamicLoader *
-    GetDynamicLoader ();
-
     static void
     AddArchCreateCallback(const lldb_private::ArchSpec& arch_spec,
                           ProcessMacOSX::CreateArchCalback callback);
@@ -244,7 +241,6 @@
     MachException::Message::collection m_exception_messages;       // A collection of exception messages caught when listening to the exception port
     lldb_private::Mutex m_exception_messages_mutex; // Multithreaded protection for m_exception_messages
     lldb_private::ArchSpec m_arch_spec;
-    std::auto_ptr<lldb_private::DynamicLoader> m_dynamic_loader_ap;
 
     //----------------------------------------------------------------------
     // Child process control

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Tue Feb 15 22:46:07 2011
@@ -101,7 +101,6 @@
 //----------------------------------------------------------------------
 ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) :
     Process (target, listener),
-    m_dynamic_loader_ap (),
     m_flags (0),
     m_stdio_mutex (Mutex::eMutexTypeRecursive),
     m_gdb_comm(),
@@ -132,8 +131,6 @@
 //----------------------------------------------------------------------
 ProcessGDBRemote::~ProcessGDBRemote()
 {
-    m_dynamic_loader_ap.reset();
-
     if (IS_VALID_LLDB_HOST_THREAD(m_debugserver_thread))
     {
         Host::ThreadCancel (m_debugserver_thread, NULL);
@@ -410,13 +407,7 @@
 ProcessGDBRemote::WillLaunchOrAttach ()
 {
     Error error;
-    // TODO: this is hardcoded for macosx right now. We need this to be more dynamic
-    m_dynamic_loader_ap.reset(DynamicLoader::FindPlugin(this, "dynamic-loader.macosx-dyld"));
-
-    if (m_dynamic_loader_ap.get() == NULL)
-        error.SetErrorString("unable to find the dynamic loader named 'dynamic-loader.macosx-dyld'");
     m_stdio_communication.Clear ();
-    
     return error;
 }
 
@@ -628,11 +619,7 @@
     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
     if (log)
         log->Printf ("ProcessGDBRemote::DidLaunch()");
-    if (GetID() == LLDB_INVALID_PROCESS_ID)
-    {
-        m_dynamic_loader_ap.reset();
-    }
-    else
+    if (GetID() != LLDB_INVALID_PROCESS_ID)
     {
         m_dispatch_queue_offsets_addr = LLDB_INVALID_ADDRESS;
 
@@ -673,8 +660,6 @@
 ProcessGDBRemote::DidLaunch ()
 {
     DidLaunchOrAttach ();
-    if (m_dynamic_loader_ap.get())
-        m_dynamic_loader_ap->DidLaunch();
 }
 
 Error
@@ -816,8 +801,6 @@
 ProcessGDBRemote::DidAttach ()
 {
     DidLaunchOrAttach ();
-    if (m_dynamic_loader_ap.get())
-        m_dynamic_loader_ap->DidAttach();
 }
 
 Error
@@ -1540,12 +1523,6 @@
     return LLDB_INVALID_ADDRESS;
 }
 
-DynamicLoader *
-ProcessGDBRemote::GetDynamicLoader()
-{
-    return m_dynamic_loader_ap.get();
-}
-
 //------------------------------------------------------------------
 // Process Memory
 //------------------------------------------------------------------

Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h Tue Feb 15 22:46:07 2011
@@ -219,9 +219,6 @@
     virtual lldb_private::Error
     DisableWatchpoint (lldb_private::WatchpointLocation *wp_loc);
 
-    virtual lldb_private::DynamicLoader *
-    GetDynamicLoader ();
-    
     virtual bool
     StartNoticingNewThreads();    
 
@@ -328,8 +325,6 @@
         eBroadcastBitAsyncThreadShouldExit          = (1 << 1)
     };
 
-
-    std::auto_ptr<lldb_private::DynamicLoader> m_dynamic_loader_ap;
     lldb_private::Flags m_flags;            // Process specific flags (see eFlags enums)
     lldb_private::Mutex m_stdio_mutex;      // Multithreaded protection for stdio
     GDBRemoteCommunication m_gdb_comm;

Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Tue Feb 15 22:46:07 2011
@@ -845,12 +845,6 @@
     return error;
 }
 
-DynamicLoader *
-Process::GetDynamicLoader()
-{
-    return NULL;
-}
-
 const ABI *
 Process::GetABI()
 {
@@ -1503,6 +1497,7 @@
 {
     Error error;
     m_abi_sp.reset();
+    m_dyld_ap.reset();
     m_process_input_reader.reset();
 
     Module *exe_module = m_target.GetExecutableModule().get();
@@ -1569,8 +1564,13 @@
 
                     if (state == eStateStopped || state == eStateCrashed)
                     {
+
                         DidLaunch ();
 
+                        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, false));
+                        if (m_dyld_ap.get())
+                            m_dyld_ap->DidLaunch();
+
                         // This delays passing the stopped event to listeners till DidLaunch gets
                         // a chance to complete...
                         HandlePrivateEvent (event_sp);
@@ -1609,25 +1609,7 @@
             // lldb_private::Process subclasses must set the process must set
             // the new process ID.
             assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
-            m_process->DidAttach ();
-            // Figure out which one is the executable, and set that in our target:
-            ModuleList &modules = m_process->GetTarget().GetImages();
-            
-            size_t num_modules = modules.GetSize();
-            for (int i = 0; i < num_modules; i++)
-            {
-                ModuleSP module_sp = modules.GetModuleAtIndex(i);
-                if (module_sp->IsExecutable())
-                {
-                    ModuleSP exec_module = m_process->GetTarget().GetExecutableModule();
-                    if (!exec_module || exec_module != module_sp)
-                    {
-                        
-                        m_process->GetTarget().SetExecutableModule (module_sp, false);
-                    }
-                    break;
-                }
-            }
+            m_process->CompleteAttach ();
             return eEventActionSuccess;
         }
             
@@ -1671,6 +1653,8 @@
         GetTarget().SetArchitecture(attach_spec);
     }
 
+    m_dyld_ap.reset();
+
     Error error (WillAttachToProcessWithID(attach_pid));
     if (error.Success())
     {
@@ -1716,6 +1700,8 @@
             GetTarget().SetArchitecture(attach_spec);
         }
     }
+
+    m_dyld_ap.reset();
     
     Error error (WillAttachToProcessWithName(process_name, wait_for_launch));
     if (error.Success())
@@ -1743,6 +1729,36 @@
     return error;
 }
 
+void
+Process::CompleteAttach ()
+{
+    // Let the process subclass figure out at much as it can about the process
+    // before we go looking for a dynamic loader plug-in.
+    DidAttach();
+
+    // We have complete the attach, now it is time to find the dynamic loader
+    // plug-in
+    m_dyld_ap.reset (DynamicLoader::FindPlugin(this, false));
+    if (m_dyld_ap.get())
+        m_dyld_ap->DidAttach();
+
+    // Figure out which one is the executable, and set that in our target:
+    ModuleList &modules = m_target.GetImages();
+    
+    size_t num_modules = modules.GetSize();
+    for (int i = 0; i < num_modules; i++)
+    {
+        ModuleSP module_sp (modules.GetModuleAtIndex(i));
+        if (module_sp->IsExecutable())
+        {
+            ModuleSP target_exe_module_sp (m_target.GetExecutableModule());
+            if (target_exe_module_sp != module_sp)
+                m_target.SetExecutableModule (module_sp, false);
+            break;
+        }
+    }
+}
+
 Error
 Process::ConnectRemote (const char *remote_url)
 {

Modified: lldb/trunk/tools/debugserver/source/RNBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/RNBRemote.cpp?rev=125650&r1=125649&r2=125650&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/RNBRemote.cpp (original)
+++ lldb/trunk/tools/debugserver/source/RNBRemote.cpp Tue Feb 15 22:46:07 2011
@@ -3258,7 +3258,11 @@
     char ostype[64];
     len = sizeof(ostype);
     if (::sysctlbyname("kern.ostype", &ostype, &len, NULL, 0) == 0)
+    {
+        len = strlen(ostype);
+        std::transform (ostype, ostype + len, ostype, tolower);
         strm << "ostype:" << std::dec << ostype << ';';
+    }
 
     strm << "vendor:apple;";
 





More information about the lldb-commits mailing list