forked from OSchip/llvm-project
Fix llgs to send triple for non-Apple platforms and lldb to interpret correctly.
This change addresses this bug: http://llvm.org/bugs/show_bug.cgi?id=20755 This change: * Modifies llgs to send triple instead of cputype and cpusubtype when not on Apple platforms in qProcessInfo. * Modifies lldb's GDBRemoteCommunicationClient to handle the triple returned from qProcessInfo if given. When given, it will prefer to use triple over cputype and cpusubtype. * Adds gdb-remote protocol tests to verify that cputype and cpusubtype are specified on darwin, and that triple is specified on Linux. llvm-svn: 216470
This commit is contained in:
parent
840438bb06
commit
c540dd0daf
|
@ -2442,6 +2442,11 @@ GDBRemoteCommunicationClient::GetCurrentProcessInfo ()
|
|||
if (sub != 0)
|
||||
++num_keys_decoded;
|
||||
}
|
||||
else if (name.compare("triple") == 0)
|
||||
{
|
||||
triple = value;
|
||||
++num_keys_decoded;
|
||||
}
|
||||
else if (name.compare("ostype") == 0)
|
||||
{
|
||||
os_name.swap (value);
|
||||
|
@ -2479,7 +2484,17 @@ GDBRemoteCommunicationClient::GetCurrentProcessInfo ()
|
|||
m_curr_pid_is_valid = eLazyBoolYes;
|
||||
m_curr_pid = pid;
|
||||
}
|
||||
if (cpu != LLDB_INVALID_CPUTYPE && !os_name.empty() && !vendor_name.empty())
|
||||
|
||||
// Set the ArchSpec from the triple if we have it.
|
||||
if (!triple.empty ())
|
||||
{
|
||||
m_process_arch.SetTriple (triple.c_str ());
|
||||
if (pointer_byte_size)
|
||||
{
|
||||
assert (pointer_byte_size == m_process_arch.GetAddressByteSize());
|
||||
}
|
||||
}
|
||||
else if (cpu != LLDB_INVALID_CPUTYPE && !os_name.empty() && !vendor_name.empty())
|
||||
{
|
||||
m_process_arch.SetArchitecture (eArchTypeMachO, cpu, sub);
|
||||
if (pointer_byte_size)
|
||||
|
|
|
@ -1328,6 +1328,9 @@ CreateProcessInfoResponse_DebugServerStyle (const ProcessInstanceInfo &proc_info
|
|||
const ArchSpec &proc_arch = proc_info.GetArchitecture();
|
||||
if (proc_arch.IsValid())
|
||||
{
|
||||
const llvm::Triple &proc_triple = proc_arch.GetTriple();
|
||||
#if defined(__APPLE__)
|
||||
// We'll send cputype/cpusubtype.
|
||||
const uint32_t cpu_type = proc_arch.GetMachOCPUType();
|
||||
if (cpu_type != 0)
|
||||
response.Printf ("cputype:%" PRIx32 ";", cpu_type);
|
||||
|
@ -1335,12 +1338,15 @@ CreateProcessInfoResponse_DebugServerStyle (const ProcessInstanceInfo &proc_info
|
|||
const uint32_t cpu_subtype = proc_arch.GetMachOCPUSubType();
|
||||
if (cpu_subtype != 0)
|
||||
response.Printf ("cpusubtype:%" PRIx32 ";", cpu_subtype);
|
||||
|
||||
|
||||
const llvm::Triple &proc_triple = proc_arch.GetTriple();
|
||||
const std::string vendor = proc_triple.getVendorName ();
|
||||
if (!vendor.empty ())
|
||||
response.Printf ("vendor:%s;", vendor.c_str ());
|
||||
|
||||
#else
|
||||
// We'll send the triple.
|
||||
response.Printf ("triple:%s;", proc_triple.getTriple().c_str ());
|
||||
#endif
|
||||
std::string ostype = proc_triple.getOSName ();
|
||||
// Adjust so ostype reports ios for Apple/ARM and Apple/ARM64.
|
||||
if (proc_triple.getVendor () == llvm::Triple::Apple)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import unittest2
|
||||
|
||||
import gdbremote_testcase
|
||||
import lldbgdbserverutils
|
||||
import sys
|
||||
import unittest2
|
||||
|
||||
from lldbtest import *
|
||||
|
||||
|
@ -108,6 +108,42 @@ class TestGdbRemoteProcessInfo(gdbremote_testcase.GdbRemoteTestCaseBase):
|
|||
self.buildDwarf()
|
||||
self.qProcessInfo_reports_valid_endian()
|
||||
|
||||
def qProcessInfo_contains_keys(self, expected_key_set):
|
||||
procs = self.prep_debug_monitor_and_inferior()
|
||||
self.add_process_info_collection_packets()
|
||||
|
||||
# Run the stream
|
||||
context = self.expect_gdbremote_sequence()
|
||||
self.assertIsNotNone(context)
|
||||
|
||||
# Gather process info response
|
||||
process_info = self.parse_process_info_response(context)
|
||||
self.assertIsNotNone(process_info)
|
||||
|
||||
# Ensure the expected keys are present and non-None within the process info.
|
||||
missing_key_set = set()
|
||||
for expected_key in expected_key_set:
|
||||
if expected_key not in process_info:
|
||||
missing_key_set.add(expected_key)
|
||||
|
||||
self.assertEquals(missing_key_set, set(), "the listed keys are missing in the qProcessInfo result")
|
||||
|
||||
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
|
||||
@debugserver_test
|
||||
@dsym_test
|
||||
def test_qProcessInfo_contains_cputype_cpusubtype_debugserver_darwin(self):
|
||||
self.init_debugserver_test()
|
||||
self.buildDsym()
|
||||
self.qProcessInfo_contains_keys(set(['cputype', 'cpusubtype']))
|
||||
|
||||
@unittest2.skipUnless(sys.platform.startswith("linux"), "requires Linux")
|
||||
@llgs_test
|
||||
@dwarf_test
|
||||
def test_qProcessInfo_contains_triple_llgs_linux(self):
|
||||
self.init_llgs_test()
|
||||
self.buildDwarf()
|
||||
self.qProcessInfo_contains_keys(set(['triple']))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
|
|
|
@ -428,6 +428,7 @@ class GdbRemoteTestCaseBase(TestBase):
|
|||
"cputype",
|
||||
"cpusubtype",
|
||||
"ostype",
|
||||
"triple",
|
||||
"vendor",
|
||||
"endian",
|
||||
"ptrsize"
|
||||
|
|
Loading…
Reference in New Issue