From bb006ce29171aef3eb7bdebf52fcd0a5c21385fe Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Sat, 2 Aug 2014 00:33:35 +0000 Subject: [PATCH] After you attach, give the process plugin a chance to report back (through DidAttach) the architecture of the binary you attached to. llvm-svn: 214603 --- lldb/include/lldb/Target/Process.h | 8 ++++++- .../Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp | 4 +++- .../Plugins/Process/MacOSX-Kernel/ProcessKDP.h | 2 +- .../Process/gdb-remote/ProcessGDBRemote.cpp | 28 ++++++++++++---------- .../Plugins/Process/gdb-remote/ProcessGDBRemote.h | 4 ++-- lldb/source/Target/Process.cpp | 8 +++++-- 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 658bc75..11666f9 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1446,11 +1446,17 @@ public: //------------------------------------------------------------------ /// Called after attaching a process. /// + /// @param[in] process_arch + /// If you can figure out the process architecture after attach, fill it in here. + /// /// Allow Process plug-ins to execute some code after attaching to /// a process. //------------------------------------------------------------------ virtual void - DidAttach () {} + DidAttach (ArchSpec &process_arch) + { + process_arch.Clear(); + } //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp index 8ed106a..bba4ef8 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp @@ -428,8 +428,10 @@ ProcessKDP::DoAttachToProcessWithName (const char *process_name, const ProcessAt void -ProcessKDP::DidAttach () +ProcessKDP::DidAttach (ArchSpec &process_arch) { + Process::DidAttach(process_arch); + Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PROCESS)); if (log) log->Printf ("ProcessKDP::DidAttach()"); diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h index 7021aa9..f6432bb 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h @@ -105,7 +105,7 @@ public: DoAttachToProcessWithName (const char *process_name, const lldb_private::ProcessAttachInfo &attach_info); virtual void - DidAttach (); + DidAttach (lldb_private::ArchSpec &process_arch); lldb::addr_t GetImageInfoAddress(); diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 6913815..1b04f42 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -1011,7 +1011,7 @@ ProcessGDBRemote::ConnectToDebugserver (const char *connect_url) } void -ProcessGDBRemote::DidLaunchOrAttach () +ProcessGDBRemote::DidLaunchOrAttach (ArchSpec& process_arch) { Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); if (log) @@ -1022,16 +1022,17 @@ ProcessGDBRemote::DidLaunchOrAttach () // See if the GDB server supports the qHostInfo information - ArchSpec gdb_remote_arch = m_gdb_comm.GetHostArchitecture(); // See if the GDB server supports the qProcessInfo packet, if so // prefer that over the Host information as it will be more specific // to our process. if (m_gdb_comm.GetProcessArchitecture().IsValid()) - gdb_remote_arch = m_gdb_comm.GetProcessArchitecture(); + process_arch = m_gdb_comm.GetProcessArchitecture(); + else + process_arch = m_gdb_comm.GetHostArchitecture(); - if (gdb_remote_arch.IsValid()) + if (process_arch.IsValid()) { ArchSpec &target_arch = GetTarget().GetArchitecture(); @@ -1044,15 +1045,15 @@ ProcessGDBRemote::DidLaunchOrAttach () // it has, so we really need to take the remote host architecture as our // defacto architecture in this case. - if (gdb_remote_arch.GetMachine() == llvm::Triple::arm && - gdb_remote_arch.GetTriple().getVendor() == llvm::Triple::Apple) + if (process_arch.GetMachine() == llvm::Triple::arm && + process_arch.GetTriple().getVendor() == llvm::Triple::Apple) { - target_arch = gdb_remote_arch; + target_arch = process_arch; } else { // Fill in what is missing in the triple - const llvm::Triple &remote_triple = gdb_remote_arch.GetTriple(); + const llvm::Triple &remote_triple = process_arch.GetTriple(); llvm::Triple &target_triple = target_arch.GetTriple(); if (target_triple.getVendorName().size() == 0) { @@ -1072,7 +1073,7 @@ ProcessGDBRemote::DidLaunchOrAttach () { // The target doesn't have a valid architecture yet, set it from // the architecture we got from the remote GDB server - target_arch = gdb_remote_arch; + target_arch = process_arch; } } } @@ -1081,7 +1082,8 @@ ProcessGDBRemote::DidLaunchOrAttach () void ProcessGDBRemote::DidLaunch () { - DidLaunchOrAttach (); + ArchSpec process_arch; + DidLaunchOrAttach (process_arch); } UnixSignals& @@ -1199,9 +1201,11 @@ ProcessGDBRemote::SetExitStatus (int exit_status, const char *cstr) } void -ProcessGDBRemote::DidAttach () +ProcessGDBRemote::DidAttach (ArchSpec &process_arch) { - DidLaunchOrAttach (); + // If you can figure out what the architecture is, fill it in here. + process_arch.Clear(); + DidLaunchOrAttach (process_arch); } diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h index baee872..39395af 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -117,7 +117,7 @@ public: const lldb_private::ProcessAttachInfo &attach_info); virtual void - DidAttach (); + DidAttach (lldb_private::ArchSpec &process_arch); //------------------------------------------------------------------ // PluginInterface protocol @@ -389,7 +389,7 @@ protected: UpdateThreadIDList (); void - DidLaunchOrAttach (); + DidLaunchOrAttach (lldb_private::ArchSpec& process_arch); lldb_private::Error ConnectToDebugserver (const char *host_port); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index cdbbe8d..b4e88bd 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -3063,7 +3063,11 @@ 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(); + ArchSpec process_arch; + DidAttach(process_arch); + + if (process_arch.IsValid()) + m_target.SetArchitecture(process_arch); // We just attached. If we have a platform, ask it for the process architecture, and if it isn't // the same as the one we've already set, switch architectures. @@ -3082,7 +3086,7 @@ Process::CompleteAttach () m_target.SetArchitecture(platform_arch); } } - else + else if (!process_arch.IsValid()) { ProcessInstanceInfo process_info; platform_sp->GetProcessInfo (GetID(), process_info); -- 2.7.4