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
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to