Index: lldb/trunk/include/lldb/Target/Target.h =================================================================== --- lldb/trunk/include/lldb/Target/Target.h +++ lldb/trunk/include/lldb/Target/Target.h @@ -1071,6 +1071,9 @@ bool SetArchitecture (const ArchSpec &arch_spec); + bool + MergeArchitecture (const ArchSpec &arch_spec); + Debugger & GetDebugger () { Index: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp =================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -939,16 +939,17 @@ if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false) == GDBRemoteCommunication::PacketResult::Success) { - if (!m_target.GetArchitecture().IsValid()) + const ArchSpec &process_arch = m_gdb_comm.GetProcessArchitecture(); + + if (process_arch.IsValid()) { - if (m_gdb_comm.GetProcessArchitecture().IsValid()) - { - m_target.SetArchitecture(m_gdb_comm.GetProcessArchitecture()); - } - else - { - m_target.SetArchitecture(m_gdb_comm.GetHostArchitecture()); - } + m_target.MergeArchitecture(process_arch); + } + else + { + const ArchSpec &host_arch = m_gdb_comm.GetHostArchitecture(); + if (host_arch.IsValid()) + m_target.MergeArchitecture(host_arch); } SetPrivateState (SetThreadStopInfo (m_last_stop_packet)); Index: lldb/trunk/source/Target/Target.cpp =================================================================== --- lldb/trunk/source/Target/Target.cpp +++ lldb/trunk/source/Target/Target.cpp @@ -1189,6 +1189,30 @@ return false; } +bool +Target::MergeArchitecture (const ArchSpec &arch_spec) +{ + if (arch_spec.IsValid()) + { + if (m_arch.IsCompatibleMatch(arch_spec)) + { + // The current target arch is compatible with "arch_spec", see if we + // can improve our current architecture using bits from "arch_spec" + + // Merge bits from arch_spec into "merged_arch" and set our architecture + ArchSpec merged_arch (m_arch); + merged_arch.MergeFrom (arch_spec); + return SetArchitecture(merged_arch); + } + else + { + // The new architecture is different, we just need to replace it + return SetArchitecture(arch_spec); + } + } + return false; +} + void Target::WillClearList (const ModuleList& module_list) {