diff options
Diffstat (limited to 'lldb')
15 files changed, 95 insertions, 119 deletions
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 99636942c08..8ee12702e46 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1232,6 +1232,12 @@ protected: lldb::StateType GetPrivateState (); + //------------------------------------------------------------------ + // Called internally + //------------------------------------------------------------------ + void + CompleteAttach (); + public: //------------------------------------------------------------------ /// Get the exit status for a process. @@ -1755,9 +1761,12 @@ public: const ABI * GetABI (); - virtual DynamicLoader * - GetDynamicLoader (); - + DynamicLoader * + GetDynamicLoader () + { + return m_dyld_ap.get(); + } + virtual LanguageRuntime * GetLanguageRuntime (lldb::LanguageType language); @@ -1940,6 +1949,7 @@ protected: 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; diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 3ab7f5faef1..64d0bace27c 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -18,7 +18,7 @@ namespace lldb_private { 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) (); diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp index a207e9f3315..fa00e77ceb7 100644 --- a/lldb/source/Core/DynamicLoader.cpp +++ b/lldb/source/Core/DynamicLoader.cpp @@ -23,7 +23,7 @@ DynamicLoader::FindPlugin (Process *process, const char *plugin_name) 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 @@ DynamicLoader::FindPlugin (Process *process, const char *plugin_name) { 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(); } diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index 64d123570a8..20709ded465 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -261,20 +261,20 @@ Host::GetArchitecture (SystemDefaultArchitecture arch_kind) 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); } diff --git a/lldb/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp b/lldb/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp index 0802ff65575..78ebe4db0ca 100644 --- a/lldb/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/Linux-DYLD/DynamicLoaderLinuxDYLD.cpp @@ -73,9 +73,19 @@ DynamicLoaderLinuxDYLD::GetPluginVersion() } 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) diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index 003ed9a6493..67958c97d79 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -63,9 +63,19 @@ DynamicLoaderMacOSXDYLD::GetImageInfo (const FileSpec &file_spec, const lldb_pri // 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; } //---------------------------------------------------------------------- diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h index eee6bc1bacc..d5575101496 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h @@ -44,7 +44,7 @@ public: GetPluginDescriptionStatic(); static lldb_private::DynamicLoader * - CreateInstance (lldb_private::Process *process); + CreateInstance (lldb_private::Process *process, bool force); DynamicLoaderMacOSXDYLD (lldb_private::Process *process); diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp index fa5b5b70ec3..9939fe7d988 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp @@ -106,12 +106,6 @@ Error 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 @@ ProcessLinux::DoLaunch(Module *module, void ProcessLinux::DidLaunch() { - if (m_dyld_ap.get() != NULL) - m_dyld_ap->DidLaunch(); } Error @@ -405,12 +397,6 @@ ProcessLinux::GetByteOrder() const return m_byte_order; } -DynamicLoader * -ProcessLinux::GetDynamicLoader() -{ - return m_dyld_ap.get(); -} - //------------------------------------------------------------------------------ // ProcessInterface protocol. diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.h b/lldb/source/Plugins/Process/Linux/ProcessLinux.h index 6fe05526647..18e5aa712d0 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessLinux.h +++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.h @@ -138,9 +138,6 @@ public: virtual lldb::addr_t GetImageInfoAddress(); - virtual lldb_private::DynamicLoader * - GetDynamicLoader(); - //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ @@ -186,9 +183,6 @@ private: 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 diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp index 5318014d3a7..e4be2730584 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp +++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp @@ -234,8 +234,7 @@ ProcessMacOSX::ProcessMacOSX(Target& target, Listener &listener) : 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 @@ ProcessMacOSX::DoAttachToProcessWithID (lldb::pid_t attach_pid) 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 @@ ProcessMacOSX::WillLaunch (Module* module) 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 @@ ProcessMacOSX::DidLaunch () { 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 @@ ProcessMacOSX::GetImageInfoAddress() return Task().GetDYLDAllImageInfosAddress(); } -DynamicLoader * -ProcessMacOSX::GetDynamicLoader() -{ - return m_dynamic_loader_ap.get(); -} - //------------------------------------------------------------------ // Process Memory //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h index c0a80c58715..f2ab6cfcdd9 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h +++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h @@ -222,9 +222,6 @@ public: 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 @@ protected: 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 diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index cba0ca162fe..df3e09a9988 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -101,7 +101,6 @@ ProcessGDBRemote::CanDebug(Target &target) //---------------------------------------------------------------------- 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(Target& target, Listener &listener) : //---------------------------------------------------------------------- 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 @@ Error 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 @@ ProcessGDBRemote::DidLaunchOrAttach () 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 @@ void ProcessGDBRemote::DidLaunch () { DidLaunchOrAttach (); - if (m_dynamic_loader_ap.get()) - m_dynamic_loader_ap->DidLaunch(); } Error @@ -816,8 +801,6 @@ void ProcessGDBRemote::DidAttach () { DidLaunchOrAttach (); - if (m_dynamic_loader_ap.get()) - m_dynamic_loader_ap->DidAttach(); } Error @@ -1540,12 +1523,6 @@ ProcessGDBRemote::GetImageInfoAddress() return LLDB_INVALID_ADDRESS; } -DynamicLoader * -ProcessGDBRemote::GetDynamicLoader() -{ - return m_dynamic_loader_ap.get(); -} - //------------------------------------------------------------------ // Process Memory //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h index 3e61ac6b840..7d5a361e98b 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -219,9 +219,6 @@ public: virtual lldb_private::Error DisableWatchpoint (lldb_private::WatchpointLocation *wp_loc); - virtual lldb_private::DynamicLoader * - GetDynamicLoader (); - virtual bool StartNoticingNewThreads(); @@ -328,8 +325,6 @@ protected: 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; diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index cf019e61328..fb6614d3f67 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -845,12 +845,6 @@ Process::UnloadImage (uint32_t image_token) return error; } -DynamicLoader * -Process::GetDynamicLoader() -{ - return NULL; -} - const ABI * Process::GetABI() { @@ -1503,6 +1497,7 @@ Process::Launch { 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 @@ Process::Launch 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 @@ Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) // 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 @@ Process::Attach (lldb::pid_t attach_pid) GetTarget().SetArchitecture(attach_spec); } + m_dyld_ap.reset(); + Error error (WillAttachToProcessWithID(attach_pid)); if (error.Success()) { @@ -1716,6 +1700,8 @@ Process::Attach (const char *process_name, bool wait_for_launch) GetTarget().SetArchitecture(attach_spec); } } + + m_dyld_ap.reset(); Error error (WillAttachToProcessWithName(process_name, wait_for_launch)); if (error.Success()) @@ -1743,6 +1729,36 @@ Process::Attach (const char *process_name, bool wait_for_launch) 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) { diff --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp index e1b8fc4103c..1d6d0883c23 100644 --- a/lldb/tools/debugserver/source/RNBRemote.cpp +++ b/lldb/tools/debugserver/source/RNBRemote.cpp @@ -3258,7 +3258,11 @@ RNBRemote::HandlePacket_qHostInfo (const char *p) 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;"; |