mgorny created this revision. mgorny added reviewers: labath, emaste, krytarowski, jasonmolenda, JDevlieghere. mgorny requested review of this revision.
Update GetRegisterInfoByName() methods to support getting registers by a generic name independently of alt_name entries in the register context. This makes it possible to use generic names when interacting with gdbserver (that does not supply alt_names). It also makes it possible to remove some of the duplicated information from register context declarations and/or use alt_names for another purpose. https://reviews.llvm.org/D108554 Files: lldb/source/Host/common/NativeRegisterContext.cpp lldb/source/Target/RegisterContext.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 @@ -20,8 +20,16 @@ <architecture>i386:x86-64</architecture> <osabi>GNU/Linux</osabi> <feature name="org.gnu.gdb.i386.core"> + <reg name="rcx" bitsize="64" type="int64" regnum="2"/> + <reg name="rdx" bitsize="64" type="int64" regnum="3"/> + <reg name="rsi" bitsize="64" type="int64" regnum="4"/> + <reg name="rdi" bitsize="64" type="int64" regnum="5"/> + <reg name="rbp" bitsize="64" type="data_ptr" regnum="6"/> <reg name="rsp" bitsize="64" type="data_ptr" regnum="7"/> + <reg name="r8" bitsize="64" type="int64" regnum="8"/> + <reg name="r9" bitsize="64" type="int64" regnum="9"/> <reg name="rip" bitsize="64" type="code_ptr" regnum="16"/> + <reg name="eflags" bitsize="32" type="i386_eflags" regnum="17"/> <reg name="st0" bitsize="80" type="i387_ext" regnum="24"/> <reg name="st1" bitsize="80" type="i387_ext" regnum="25"/> <reg name="st2" bitsize="80" type="i387_ext" regnum="26"/> @@ -59,8 +67,16 @@ def readRegisters(self): return ( - "0102030405060708" # rsp - "1112131415161718" # rip + "0102030405060708" # rcx + "1112131415161718" # rdx + "2122232425262728" # rsi + "3132333435363738" # rdi + "4142434445464748" # rbp + "5152535455565758" # rsp + "6162636465666768" # r8 + "7172737475767778" # r9 + "8182838485868788" # rip + "91929394" # eflags "0102030405060708090a" # st0 "1112131415161718191a" + # st1 "2122232425262728292a" * 6 + # st2..st7 @@ -81,9 +97,31 @@ # rsp and rip should be displayed as uints self.match("register read rsp", - ["rsp = 0x0807060504030201"]) + ["rsp = 0x5857565554535251"]) self.match("register read rip", - ["rip = 0x1817161514131211"]) + ["rip = 0x8887868584838281"]) + + # test generic aliases + self.match("register read arg4", + ["rcx = 0x0807060504030201"]) + self.match("register read arg3", + ["rdx = 0x1817161514131211"]) + self.match("register read arg2", + ["rsi = 0x2827262524232221"]) + self.match("register read arg1", + ["rdi = 0x3837363534333231"]) + self.match("register read fp", + ["rbp = 0x4847464544434241"]) + self.match("register read sp", + ["rsp = 0x5857565554535251"]) + self.match("register read arg5", + ["r8 = 0x6867666564636261"]) + self.match("register read arg6", + ["r9 = 0x7877767574737271"]) + self.match("register read pc", + ["rip = 0x8887868584838281"]) + self.match("register read flags", + ["eflags = 0x94939291"]) # both stX and xmmX should be displayed as vectors self.match("register read st0", Index: lldb/source/Target/RegisterContext.cpp =================================================================== --- lldb/source/Target/RegisterContext.cpp +++ lldb/source/Target/RegisterContext.cpp @@ -62,6 +62,13 @@ reg_name.equals_insensitive(reg_info->alt_name)) return reg_info; } + + // if none of the register entries matched directly, try matching + // using a generic register name. + uint32_t generic_reg = Args::StringToGenericRegister(reg_name); + if (generic_reg != LLDB_INVALID_REGNUM) + return GetRegisterInfo(eRegisterKindGeneric, generic_reg); + return nullptr; } Index: lldb/source/Host/common/NativeRegisterContext.cpp =================================================================== --- lldb/source/Host/common/NativeRegisterContext.cpp +++ lldb/source/Host/common/NativeRegisterContext.cpp @@ -64,6 +64,13 @@ reg_name.equals_insensitive(reg_info->alt_name)) return reg_info; } + + // if none of the register entries matched directly, try matching + // using a generic register name. + uint32_t generic_reg = Args::StringToGenericRegister(reg_name); + if (generic_reg != LLDB_INVALID_REGNUM) + return GetRegisterInfo(eRegisterKindGeneric, generic_reg); + return nullptr; }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits