Skip to content

Commit eb1b9fc

Browse files
authored
[lldb][LoongArch] Fix the incorrect floating-point register dwarf number
According to the documentation described at https://github.com/loongson/la-abi-specs/blob/release/ladwarf.adoc, the dwarf numbers for floating-point registers range from 32 to 63. An incorrect dwarf number will prevent the register values from being properly restored during unwinding. This test reflects this problem: ``` loongson@linux:~$ cat test.c void foo() { asm volatile ("movgr2fr.d $fs2, $ra":::"$fs2"); } int main() { asm volatile ("movgr2fr.d $fs2, $sp":::"$fs2"); foo(); return 0; } loongson@linux:~$ clang -g test.c -o test ``` Without this patch: ``` loongson@linux:~$ ./_build/bin/lldb ./t (lldb) target create "./t" Current executable set to '/home/loongson/llvm-project/_build_lldb/t' (loongarch64). (lldb) b foo Breakpoint 1: where = t`foo + 20 at test.c:4:1, address = 0x0000000000000714 (lldb) r Process 2455626 launched: '/home/loongson/llvm-project/_build_lldb/t' (loongarch64) Process 2455626 stopped * thread #1, name = 't', stop reason = breakpoint 1.1 frame #0: 0x0000555555554714 t`foo at test.c:4:1 1 #include <stdio.h> 2 3 void foo() { -> 4 asm volatile ("movgr2fr.d $fs2, $ra":::"$fs2"); 5 } 6 int main() { 7 asm volatile ("movgr2fr.d $fs2, $sp":::"$fs2"); (lldb) si Process 2455626 stopped * thread #1, name = 't', stop reason = instruction step into frame #0: 0x0000555555554718 t`foo at test.c:4:1 1 #include <stdio.h> 2 3 void foo() { -> 4 asm volatile ("movgr2fr.d $fs2, $ra":::"$fs2"); 5 } 6 int main() { 7 asm volatile ("movgr2fr.d $fs2, $sp":::"$fs2"); (lldb) f 1 frame #1: 0x0000555555554768 t`main at test.c:8:1 5 } 6 int main() { 7 asm volatile ("movgr2fr.d $fs2, $sp":::"$fs2"); -> 8 foo(); 9 return 0; 10 } (lldb) register read -a General Purpose Registers: r1 = 0x0000555555554768 t`main + 40 at test.c:8:1 r3 = 0x00007ffffffef780 r22 = 0x00007ffffffef7b0 r23 = 0x00007ffffffef918 r24 = 0x0000000000000001 r25 = 0x0000000000000000 r26 = 0x000055555555be08 t`__do_global_dtors_aux_fini_array_entry r27 = 0x0000555555554740 t`main at test.c:6 r28 = 0x00007ffffffef928 r29 = 0x00007ffff7febc88 ld-linux-loongarch-lp64d.so.1`_rtld_global_ro r30 = 0x000055555555be08 t`__do_global_dtors_aux_fini_array_entry pc = 0x0000555555554768 t`main + 40 at test.c:8:1 33 registers were unavailable. Floating Point Registers: f13 = 0x00007ffffffef780 !!!!! wrong register f24 = 0xffffffffffffffff f25 = 0xffffffffffffffff f26 = 0x0000555555554768 t`main + 40 at test.c:8:1 f27 = 0xffffffffffffffff f28 = 0xffffffffffffffff f29 = 0xffffffffffffffff f30 = 0xffffffffffffffff f31 = 0xffffffffffffffff 32 registers were unavailable. ``` With this patch: ``` The previous operations are the same. (lldb) register read -a General Purpose Registers: r1 = 0x0000555555554768 t`main + 40 at test.c:8:1 r3 = 0x00007ffffffef780 r22 = 0x00007ffffffef7b0 r23 = 0x00007ffffffef918 r24 = 0x0000000000000001 r25 = 0x0000000000000000 r26 = 0x000055555555be08 t`__do_global_dtors_aux_fini_array_entry r27 = 0x0000555555554740 t`main at test.c:6 r28 = 0x00007ffffffef928 r29 = 0x00007ffff7febc88 ld-linux-loongarch-lp64d.so.1`_rtld_global_ro r30 = 0x000055555555be08 t`__do_global_dtors_aux_fini_array_entry pc = 0x0000555555554768 t`main + 40 at test.c:8:1 33 registers were unavailable. Floating Point Registers: f24 = 0xffffffffffffffff f25 = 0xffffffffffffffff f26 = 0x00007ffffffef780 f27 = 0xffffffffffffffff f28 = 0xffffffffffffffff f29 = 0xffffffffffffffff f30 = 0xffffffffffffffff f31 = 0xffffffffffffffff 33 registers were unavailable. ``` Reviewed By: SixWeining Pull Request: llvm/llvm-project#120391
1 parent cc7d084 commit eb1b9fc

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

lldb/source/Utility/LoongArch_DWARF_Registers.h

+19-17
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,7 @@ enum {
4747
dwarf_gpr_r30,
4848
dwarf_gpr_r31 = 31,
4949

50-
dwarf_gpr_orig_a0,
51-
dwarf_gpr_pc,
52-
dwarf_gpr_badv,
53-
54-
dwarf_gpr_reserved0 = 35,
55-
dwarf_gpr_reserved1,
56-
dwarf_gpr_reserved2,
57-
dwarf_gpr_reserved3,
58-
dwarf_gpr_reserved4,
59-
dwarf_gpr_reserved5,
60-
dwarf_gpr_reserved6,
61-
dwarf_gpr_reserved7,
62-
dwarf_gpr_reserved8,
63-
dwarf_gpr_reserved9,
64-
65-
dwarf_fpr_f0 = 45,
50+
dwarf_fpr_f0 = 32,
6651
dwarf_fpr_f1,
6752
dwarf_fpr_f2,
6853
dwarf_fpr_f3,
@@ -93,7 +78,7 @@ enum {
9378
dwarf_fpr_f28,
9479
dwarf_fpr_f29,
9580
dwarf_fpr_f30,
96-
dwarf_fpr_f31 = 76,
81+
dwarf_fpr_f31 = 63,
9782

9883
dwarf_fpr_fcc0,
9984
dwarf_fpr_fcc1,
@@ -170,6 +155,23 @@ enum {
170155
dwarf_fpr_fs5 = dwarf_fpr_f29,
171156
dwarf_fpr_fs6 = dwarf_fpr_f30,
172157
dwarf_fpr_fs7 = dwarf_fpr_f31,
158+
159+
// mock pc regnum
160+
dwarf_gpr_pc = 57005,
161+
162+
// fake registers are only used to define `RegisterInfo`
163+
dwarf_gpr_orig_a0,
164+
dwarf_gpr_badv,
165+
dwarf_gpr_reserved0,
166+
dwarf_gpr_reserved1,
167+
dwarf_gpr_reserved2,
168+
dwarf_gpr_reserved3,
169+
dwarf_gpr_reserved4,
170+
dwarf_gpr_reserved5,
171+
dwarf_gpr_reserved6,
172+
dwarf_gpr_reserved7,
173+
dwarf_gpr_reserved8,
174+
dwarf_gpr_reserved9,
173175
};
174176

175177
} // namespace loongarch_dwarf

0 commit comments

Comments
 (0)