Skip to content

Commit

Permalink
Fix fetching the architecture of the target on process launch
Browse files Browse the repository at this point in the history
Previously it was fetched only if the architecture isn't valid, but the
architecture can be valid without containing all information about the
current target (e.g. missing os).

Differential revision: http://reviews.llvm.org/D8057

llvm-svn: 232153
  • Loading branch information
Tamas Berghammer committed Mar 13, 2015
1 parent e724af1 commit e9f4dfe
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 9 deletions.
3 changes: 3 additions & 0 deletions lldb/include/lldb/Target/Target.h
Expand Up @@ -1071,6 +1071,9 @@ class Target :
bool
SetArchitecture (const ArchSpec &arch_spec);

bool
MergeArchitecture (const ArchSpec &arch_spec);

Debugger &
GetDebugger ()
{
Expand Down
19 changes: 10 additions & 9 deletions lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
Expand Up @@ -939,16 +939,17 @@ ProcessGDBRemote::DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info)

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));
Expand Down
24 changes: 24 additions & 0 deletions lldb/source/Target/Target.cpp
Expand Up @@ -1189,6 +1189,30 @@ Target::SetArchitecture (const ArchSpec &arch_spec)
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)
{
Expand Down

0 comments on commit e9f4dfe

Please sign in to comment.