Index: lldb/source/Plugins/ABI/AArch64/ABIAArch64.h =================================================================== --- lldb/source/Plugins/ABI/AArch64/ABIAArch64.h +++ lldb/source/Plugins/ABI/AArch64/ABIAArch64.h @@ -31,6 +31,8 @@ uint32_t GetGenericNum(llvm::StringRef name) override; + void AugmentRegisterInfo(lldb_private::RegisterInfo &info) override; + using lldb_private::MCBasedABI::MCBasedABI; }; #endif Index: lldb/source/Plugins/ABI/AArch64/ABIAArch64.cpp =================================================================== --- lldb/source/Plugins/ABI/AArch64/ABIAArch64.cpp +++ lldb/source/Plugins/ABI/AArch64/ABIAArch64.cpp @@ -52,6 +52,7 @@ MapRegisterName(reg, "x30", "lr"); return reg; } + uint32_t ABIAArch64::GetGenericNum(llvm::StringRef name) { return llvm::StringSwitch(name) .Case("pc", LLDB_REGNUM_GENERIC_PC) @@ -69,3 +70,11 @@ .Case("x7", LLDB_REGNUM_GENERIC_ARG8) .Default(LLDB_INVALID_REGNUM); } + +void ABIAArch64::AugmentRegisterInfo(lldb_private::RegisterInfo &info) { + lldb_private::MCBasedABI::AugmentRegisterInfo(info); + + // GDB sends x31 as "sp". Add the "x31" alt_name for convenience. + if (!strcmp(info.name, "sp") && !info.alt_name) + info.alt_name = "x31"; +} 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 @@ -581,8 +581,12 @@ // We have to make a temporary ABI here, and not use the GetABI because // this code gets called in DidAttach, when the target architecture // (and consequently the ABI we'll get from the process) may be wrong. - if (ABISP abi_sp = ABI::FindPlugin(shared_from_this(), arch_to_use)) + if (ABISP abi_sp = ABI::FindPlugin(shared_from_this(), arch_to_use)) { abi_sp->AugmentRegisterInfo(reg_info); + // AugmentRegisterInfo() can modify alt_name + if (reg_info.alt_name) + alt_name.SetCString(reg_info.alt_name); + } m_register_info_sp->AddRegister(reg_info, reg_name, alt_name, set_name); } else { @@ -4554,8 +4558,12 @@ reg_num_remote = reg_info.kinds[eRegisterKindProcessPlugin] + 1; ++reg_num_local; reg_info.name = reg_name.AsCString(); - if (abi_sp) + if (abi_sp) { abi_sp->AugmentRegisterInfo(reg_info); + // AugmentRegisterInfo() can modify alt_name + if (reg_info.alt_name) + alt_name.SetCString(reg_info.alt_name); + } dyn_reg_info.AddRegister(reg_info, reg_name, alt_name, set_name); return true; // Keep iterating through all "reg" elements 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 @@ -397,6 +397,12 @@ ["x0 = 0x0807060504030201"]) self.match("register read x1", ["x1 = 0x1817161514131211"]) + self.match("register read x29", + ["x29 = 0x3837363534333231"]) + self.match("register read x30", + ["x30 = 0x4847464544434241"]) + self.match("register read x31", + ["sp = 0x5857565554535251"]) self.match("register read sp", ["sp = 0x5857565554535251"]) self.match("register read pc",