Skip to content

Commit c48e0c1

Browse files
authored
[lldb][RISC-V] Extended if conditions to support alias names for registers (#124475)
Extending the conditionals in `AugmentRegisterInfo` to support alternative names for lldb. Fixes #124023 There is an exception with register `X8` which is not covered here but more details can be found in the issue #127900.
1 parent 81ed485 commit c48e0c1

File tree

7 files changed

+458
-74
lines changed

7 files changed

+458
-74
lines changed

lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,62 @@ void ABISysV_riscv::AugmentRegisterInfo(
850850
it.value().alt_name.SetCString("x3");
851851
else if (it.value().name == "fp")
852852
it.value().alt_name.SetCString("s0");
853+
else if (it.value().name == "tp")
854+
it.value().alt_name.SetCString("x4");
853855
else if (it.value().name == "s0")
854856
it.value().alt_name.SetCString("x8");
857+
else if (it.value().name == "s1")
858+
it.value().alt_name.SetCString("x9");
859+
else if (it.value().name == "t0")
860+
it.value().alt_name.SetCString("x5");
861+
else if (it.value().name == "t1")
862+
it.value().alt_name.SetCString("x6");
863+
else if (it.value().name == "t2")
864+
it.value().alt_name.SetCString("x7");
865+
else if (it.value().name == "a0")
866+
it.value().alt_name.SetCString("x10");
867+
else if (it.value().name == "a1")
868+
it.value().alt_name.SetCString("x11");
869+
else if (it.value().name == "a2")
870+
it.value().alt_name.SetCString("x12");
871+
else if (it.value().name == "a3")
872+
it.value().alt_name.SetCString("x13");
873+
else if (it.value().name == "a4")
874+
it.value().alt_name.SetCString("x14");
875+
else if (it.value().name == "a5")
876+
it.value().alt_name.SetCString("x15");
877+
else if (it.value().name == "a6")
878+
it.value().alt_name.SetCString("x16");
879+
else if (it.value().name == "a7")
880+
it.value().alt_name.SetCString("x17");
881+
else if (it.value().name == "s2")
882+
it.value().alt_name.SetCString("x18");
883+
else if (it.value().name == "s3")
884+
it.value().alt_name.SetCString("x19");
885+
else if (it.value().name == "s4")
886+
it.value().alt_name.SetCString("x20");
887+
else if (it.value().name == "s5")
888+
it.value().alt_name.SetCString("x21");
889+
else if (it.value().name == "s6")
890+
it.value().alt_name.SetCString("x22");
891+
else if (it.value().name == "s7")
892+
it.value().alt_name.SetCString("x23");
893+
else if (it.value().name == "s8")
894+
it.value().alt_name.SetCString("x24");
895+
else if (it.value().name == "s9")
896+
it.value().alt_name.SetCString("x25");
897+
else if (it.value().name == "s10")
898+
it.value().alt_name.SetCString("x26");
899+
else if (it.value().name == "s11")
900+
it.value().alt_name.SetCString("x27");
901+
else if (it.value().name == "t3")
902+
it.value().alt_name.SetCString("x28");
903+
else if (it.value().name == "t4")
904+
it.value().alt_name.SetCString("x29");
905+
else if (it.value().name == "t5")
906+
it.value().alt_name.SetCString("x30");
907+
else if (it.value().name == "t6")
908+
it.value().alt_name.SetCString("x31");
855909

856910
// Set generic regnum so lldb knows what the PC, etc is
857911
it.value().regnum_generic = GetGenericNum(it.value().name.GetStringRef());

lldb/test/API/functionalities/gdb_remote_client/TestGDBServerTargetXML.py

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,154 @@ def haltReason(self):
652652
)
653653
self.match("register read s31", ["s31 = 128"])
654654

655+
@skipIfXmlSupportMissing
656+
@skipIfRemote
657+
@skipIfLLVMTargetMissing("RISCV")
658+
def test_riscv64_regs(self):
659+
"""Test grabbing various riscv64 registers from gdbserver."""
660+
661+
class MyResponder(MockGDBServerResponder):
662+
reg_data = (
663+
"0102030405060708" # zero
664+
"0102030405060708" # ra
665+
"0102030405060708" # sp
666+
"0102030405060708" # gp
667+
"0102030405060708" # tp
668+
"0102030405060708" # t0
669+
"0102030405060708" # t1
670+
"0102030405060708" # t2
671+
"0102030405060708" # fp
672+
"0102030405060708" # s1
673+
"0102030405060708" # a0
674+
"0102030405060708" # a1
675+
"0102030405060708" # a2
676+
"0102030405060708" # a3
677+
"0102030405060708" # a4
678+
"0102030405060708" # a5
679+
"0102030405060708" # a6
680+
"0102030405060708" # a7
681+
"0102030405060708" # s2
682+
"0102030405060708" # s3
683+
"0102030405060708" # s4
684+
"0102030405060708" # s5
685+
"0102030405060708" # s6
686+
"0102030405060708" # s7
687+
"0102030405060708" # s8
688+
"0102030405060708" # s9
689+
"0102030405060708" # s10
690+
"0102030405060708" # s11
691+
"0102030405060708" # t3
692+
"0102030405060708" # t4
693+
"0102030405060708" # t5
694+
"0102030405060708" # t6
695+
)
696+
697+
def qXferRead(self, obj, annex, offset, length):
698+
if annex == "target.xml":
699+
# Note that this XML does not include any aliases, LLDB must generate them itself.
700+
return (
701+
"""<?xml version="1.0"?>
702+
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
703+
<target>
704+
<architecture>riscv</architecture>
705+
<feature name="org.gnu.gdb.riscv.cpu">
706+
<reg name="zero" bitsize="64" type="int"/>
707+
<reg name="ra" bitsize="64" type="code_ptr"/>
708+
<reg name="sp" bitsize="64" type="data_ptr"/>
709+
<reg name="gp" bitsize="64" type="data_ptr"/>
710+
<reg name="tp" bitsize="64" type="data_ptr"/>
711+
<reg name="t0" bitsize="64" type="int"/>
712+
<reg name="t1" bitsize="64" type="int"/>
713+
<reg name="t2" bitsize="64" type="int"/>
714+
<reg name="fp" bitsize="64" type="data_ptr"/>
715+
<reg name="s1" bitsize="64" type="int"/>
716+
<reg name="a0" bitsize="64" type="int"/>
717+
<reg name="a1" bitsize="64" type="int"/>
718+
<reg name="a2" bitsize="64" type="int"/>
719+
<reg name="a3" bitsize="64" type="int"/>
720+
<reg name="a4" bitsize="64" type="int"/>
721+
<reg name="a5" bitsize="64" type="int"/>
722+
<reg name="a6" bitsize="64" type="int"/>
723+
<reg name="a7" bitsize="64" type="int"/>
724+
<reg name="s2" bitsize="64" type="int"/>
725+
<reg name="s3" bitsize="64" type="int"/>
726+
<reg name="s4" bitsize="64" type="int"/>
727+
<reg name="s5" bitsize="64" type="int"/>
728+
<reg name="s6" bitsize="64" type="int"/>
729+
<reg name="s7" bitsize="64" type="int"/>
730+
<reg name="s8" bitsize="64" type="int"/>
731+
<reg name="s9" bitsize="64" type="int"/>
732+
<reg name="s10" bitsize="64" type="int"/>
733+
<reg name="s11" bitsize="64" type="int"/>
734+
<reg name="t3" bitsize="64" type="int"/>
735+
<reg name="t4" bitsize="64" type="int"/>
736+
<reg name="t5" bitsize="64" type="int"/>
737+
<reg name="t6" bitsize="64" type="int"/>
738+
<reg name="pc" bitsize="64" type="code_ptr"/>
739+
</feature>
740+
</target>""",
741+
False,
742+
)
743+
else:
744+
return None, False
745+
746+
def readRegister(self, regnum):
747+
return ""
748+
749+
def readRegisters(self):
750+
return self.reg_data
751+
752+
def writeRegisters(self, reg_hex):
753+
self.reg_data = reg_hex
754+
return "OK"
755+
756+
def haltReason(self):
757+
return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
758+
759+
self.server.responder = MyResponder()
760+
761+
target = self.createTarget("basic_eh_frame-riscv64.yaml")
762+
process = self.connect(target)
763+
lldbutil.expect_state_changes(
764+
self, self.dbg.GetListener(), process, [lldb.eStateStopped]
765+
)
766+
767+
# test generic aliases
768+
self.match("register read x0", ["zero = 0x0807060504030201"])
769+
self.match("register read x1", ["ra = 0x0807060504030201"])
770+
self.match("register read x2", ["sp = 0x0807060504030201"])
771+
self.match("register read x3", ["gp = 0x0807060504030201"])
772+
self.match("register read x4", ["tp = 0x0807060504030201"])
773+
self.match("register read x5", ["t0 = 0x0807060504030201"])
774+
self.match("register read x6", ["t1 = 0x0807060504030201"])
775+
self.match("register read x7", ["t2 = 0x0807060504030201"])
776+
# Register x8 is probably not working because it has two aliases fp, s0
777+
# See issue #127900
778+
# self.match("register read x8", ["fp = 0x0807060504030201"])
779+
self.match("register read x9", ["s1 = 0x0807060504030201"])
780+
self.match("register read x10", ["a0 = 0x0807060504030201"])
781+
self.match("register read x11", ["a1 = 0x0807060504030201"])
782+
self.match("register read x12", ["a2 = 0x0807060504030201"])
783+
self.match("register read x13", ["a3 = 0x0807060504030201"])
784+
self.match("register read x14", ["a4 = 0x0807060504030201"])
785+
self.match("register read x15", ["a5 = 0x0807060504030201"])
786+
self.match("register read x16", ["a6 = 0x0807060504030201"])
787+
self.match("register read x17", ["a7 = 0x0807060504030201"])
788+
self.match("register read x18", ["s2 = 0x0807060504030201"])
789+
self.match("register read x19", ["s3 = 0x0807060504030201"])
790+
self.match("register read x20", ["s4 = 0x0807060504030201"])
791+
self.match("register read x21", ["s5 = 0x0807060504030201"])
792+
self.match("register read x22", ["s6 = 0x0807060504030201"])
793+
self.match("register read x23", ["s7 = 0x0807060504030201"])
794+
self.match("register read x24", ["s8 = 0x0807060504030201"])
795+
self.match("register read x25", ["s9 = 0x0807060504030201"])
796+
self.match("register read x26", ["s10 = 0x0807060504030201"])
797+
self.match("register read x27", ["s11 = 0x0807060504030201"])
798+
self.match("register read x28", ["t3 = 0x0807060504030201"])
799+
self.match("register read x29", ["t4 = 0x0807060504030201"])
800+
self.match("register read x30", ["t5 = 0x0807060504030201"])
801+
self.match("register read x31", ["t6 = 0x0807060504030201"])
802+
655803
@skipIfXmlSupportMissing
656804
@skipIfRemote
657805
@skipIfLLVMTargetMissing("X86")
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--- !ELF
2+
FileHeader:
3+
Class: ELFCLASS64
4+
Data: ELFDATA2LSB
5+
Type: ET_EXEC
6+
Machine: EM_RISCV
7+
Sections:
8+
- Name: .text
9+
Type: SHT_PROGBITS
10+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
11+
Address: 0x0000000000000570
12+
AddressAlign: 0x0000000000000004
13+
Content: DEADBEEF
14+
- Name: .eh_frame
15+
Type: SHT_PROGBITS
16+
Flags: [ SHF_ALLOC ]
17+
Address: 0x0000000000000688
18+
AddressAlign: 0x0000000000000008
19+
Content: 000006881000000000000000037a5200017c0101000006981b0d02001000000018000000ccfeffff000006a82200000000070100200000002c000000000006b89cffffff1000000000420e1042880242000006c80c080046c80c0210420e000000000000
20+
...

0 commit comments

Comments
 (0)