mgorny updated this revision to Diff 370756.
mgorny added a comment.
Add initial tests for aarch64 regs (roughly confirming that it gets the
target.xml correctly).
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D109272/new/
https://reviews.llvm.org/D109272
Files:
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py
Index: lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py
===================================================================
--- lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py
+++ lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py
@@ -272,3 +272,141 @@
["ymm0 = {0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 0xd9 "
"0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 "
"0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef}"])
+
+ @skipIfXmlSupportMissing
+ @skipIfRemote
+ def test_aarch64_regs(self):
+ """Test grabbing various aarch64 registers from gdbserver."""
+ reg_data = [
+ "0102030405060708", # x0
+ "1112131415161718", # x1
+ ] + 27 * [
+ "2122232425262728", # x2..x28
+ ] + [
+ "3132333435363738", # x29 (fp)
+ "4142434445464748", # x30 (lr)
+ "5152535455565758", # x31 (sp)
+ "6162636465666768", # pc
+ "71727374", # cpsr
+ "8182838485868788898a8b8c8d8e8f90", # v0
+ "9192939495969798999a9b9c9d9e9fa0", # v1
+ ] + 30 * [
+ "a1a2a3a4a5a6a7a8a9aaabacadaeafb0", # v2..v31
+ ] + [
+ "00000000", # fpsr
+ "00000000", # fpcr
+ ]
+
+ class MyResponder(MockGDBServerResponder):
+ def qXferRead(self, obj, annex, offset, length):
+ if annex == "target.xml":
+ return """<?xml version="1.0"?>
+ <!DOCTYPE feature SYSTEM "gdb-target.dtd">
+ <target>
+ <architecture>aarch64</architecture>
+ <feature name="org.gnu.gdb.aarch64.core">
+ <reg name="x0" bitsize="64" type="int" regnum="0"/>
+ <reg name="x1" bitsize="64" type="int" regnum="1"/>
+ <reg name="x2" bitsize="64" type="int" regnum="2"/>
+ <reg name="x3" bitsize="64" type="int" regnum="3"/>
+ <reg name="x4" bitsize="64" type="int" regnum="4"/>
+ <reg name="x5" bitsize="64" type="int" regnum="5"/>
+ <reg name="x6" bitsize="64" type="int" regnum="6"/>
+ <reg name="x7" bitsize="64" type="int" regnum="7"/>
+ <reg name="x8" bitsize="64" type="int" regnum="8"/>
+ <reg name="x9" bitsize="64" type="int" regnum="9"/>
+ <reg name="x10" bitsize="64" type="int" regnum="10"/>
+ <reg name="x11" bitsize="64" type="int" regnum="11"/>
+ <reg name="x12" bitsize="64" type="int" regnum="12"/>
+ <reg name="x13" bitsize="64" type="int" regnum="13"/>
+ <reg name="x14" bitsize="64" type="int" regnum="14"/>
+ <reg name="x15" bitsize="64" type="int" regnum="15"/>
+ <reg name="x16" bitsize="64" type="int" regnum="16"/>
+ <reg name="x17" bitsize="64" type="int" regnum="17"/>
+ <reg name="x18" bitsize="64" type="int" regnum="18"/>
+ <reg name="x19" bitsize="64" type="int" regnum="19"/>
+ <reg name="x20" bitsize="64" type="int" regnum="20"/>
+ <reg name="x21" bitsize="64" type="int" regnum="21"/>
+ <reg name="x22" bitsize="64" type="int" regnum="22"/>
+ <reg name="x23" bitsize="64" type="int" regnum="23"/>
+ <reg name="x24" bitsize="64" type="int" regnum="24"/>
+ <reg name="x25" bitsize="64" type="int" regnum="25"/>
+ <reg name="x26" bitsize="64" type="int" regnum="26"/>
+ <reg name="x27" bitsize="64" type="int" regnum="27"/>
+ <reg name="x28" bitsize="64" type="int" regnum="28"/>
+ <reg name="x29" bitsize="64" type="int" regnum="29"/>
+ <reg name="x30" bitsize="64" type="int" regnum="30"/>
+ <reg name="sp" bitsize="64" type="data_ptr" regnum="31"/>
+ <reg name="pc" bitsize="64" type="code_ptr" regnum="32"/>
+ <reg name="cpsr" bitsize="32" type="cpsr_flags" regnum="33"/>
+ </feature>
+ <feature name="org.gnu.gdb.aarch64.fpu">
+ <reg name="v0" bitsize="128" type="aarch64v" regnum="34"/>
+ <reg name="v1" bitsize="128" type="aarch64v" regnum="35"/>
+ <reg name="v2" bitsize="128" type="aarch64v" regnum="36"/>
+ <reg name="v3" bitsize="128" type="aarch64v" regnum="37"/>
+ <reg name="v4" bitsize="128" type="aarch64v" regnum="38"/>
+ <reg name="v5" bitsize="128" type="aarch64v" regnum="39"/>
+ <reg name="v6" bitsize="128" type="aarch64v" regnum="40"/>
+ <reg name="v7" bitsize="128" type="aarch64v" regnum="41"/>
+ <reg name="v8" bitsize="128" type="aarch64v" regnum="42"/>
+ <reg name="v9" bitsize="128" type="aarch64v" regnum="43"/>
+ <reg name="v10" bitsize="128" type="aarch64v" regnum="44"/>
+ <reg name="v11" bitsize="128" type="aarch64v" regnum="45"/>
+ <reg name="v12" bitsize="128" type="aarch64v" regnum="46"/>
+ <reg name="v13" bitsize="128" type="aarch64v" regnum="47"/>
+ <reg name="v14" bitsize="128" type="aarch64v" regnum="48"/>
+ <reg name="v15" bitsize="128" type="aarch64v" regnum="49"/>
+ <reg name="v16" bitsize="128" type="aarch64v" regnum="50"/>
+ <reg name="v17" bitsize="128" type="aarch64v" regnum="51"/>
+ <reg name="v18" bitsize="128" type="aarch64v" regnum="52"/>
+ <reg name="v19" bitsize="128" type="aarch64v" regnum="53"/>
+ <reg name="v20" bitsize="128" type="aarch64v" regnum="54"/>
+ <reg name="v21" bitsize="128" type="aarch64v" regnum="55"/>
+ <reg name="v22" bitsize="128" type="aarch64v" regnum="56"/>
+ <reg name="v23" bitsize="128" type="aarch64v" regnum="57"/>
+ <reg name="v24" bitsize="128" type="aarch64v" regnum="58"/>
+ <reg name="v25" bitsize="128" type="aarch64v" regnum="59"/>
+ <reg name="v26" bitsize="128" type="aarch64v" regnum="60"/>
+ <reg name="v27" bitsize="128" type="aarch64v" regnum="61"/>
+ <reg name="v28" bitsize="128" type="aarch64v" regnum="62"/>
+ <reg name="v29" bitsize="128" type="aarch64v" regnum="63"/>
+ <reg name="v30" bitsize="128" type="aarch64v" regnum="64"/>
+ <reg name="v31" bitsize="128" type="aarch64v" regnum="65"/>
+ <reg name="fpsr" bitsize="32" type="int" regnum="66"/>
+ <reg name="fpcr" bitsize="32" type="int" regnum="67"/>
+ </feature>
+ </target>""", False
+ else:
+ return None, False
+
+ def readRegister(self, regnum):
+ return ""
+
+ def readRegisters(self):
+ return "".join(reg_data)
+
+ def writeRegisters(self, reg_hex):
+ return "OK"
+
+ def haltReason(self):
+ return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
+
+ self.server.responder = MyResponder()
+
+ target = self.createTarget("basic_eh_frame-aarch64.yaml")
+ process = self.connect(target)
+ lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
+ [lldb.eStateStopped])
+
+ # GPRs should be displayed as uints
+ self.match("register read x0",
+ ["x0 = 0x0807060504030201"])
+ self.match("register read x1",
+ ["x1 = 0x1817161514131211"])
+ self.match("register read sp",
+ ["sp = 0x5857565554535251"])
+ self.match("register read pc",
+ ["pc = 0x6867666564636261"])
+ self.match("register read cpsr",
+ ["cpsr = 0x74737271"])
Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -4661,24 +4661,22 @@
}
}
- // If the target.xml includes an architecture entry like
+ // gdbserver does not implement the LLDB packets used to determine host
+ // or process architecture. If that is the case, attempt to use
+ // the <architecture/> field from target.xml, e.g.:
+ //
// <architecture>i386:x86-64</architecture> (seen from VMWare ESXi)
- // <architecture>arm</architecture> (seen from Segger JLink on unspecified arm board)
- // use that if we don't have anything better.
+ // <architecture>arm</architecture> (seen from Segger JLink on unspecified
+ // arm board)
if (!arch_to_use.IsValid() && !target_info.arch.empty()) {
- if (target_info.arch == "i386:x86-64") {
- // We don't have any information about vendor or OS.
- arch_to_use.SetTriple("x86_64--");
- GetTarget().MergeArchitecture(arch_to_use);
- }
+ // We don't have any information about vendor or OS.
+ arch_to_use.SetTriple(llvm::StringSwitch<std::string>(target_info.arch)
+ .Case("i386:x86-64", "x86_64")
+ .Default(target_info.arch) +
+ "--");
- // SEGGER J-Link jtag boards send this very-generic arch name,
- // we'll need to use this if we have absolutely nothing better
- // to work with or the register definitions won't be accepted.
- if (target_info.arch == "arm") {
- arch_to_use.SetTriple("arm--");
+ if (arch_to_use.IsValid())
GetTarget().MergeArchitecture(arch_to_use);
- }
}
if (arch_to_use.IsValid()) {
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits