@@ -65,7 +65,7 @@ struct riscv_frame_cache
65
65
struct trad_frame_saved_reg * saved_regs ;
66
66
};
67
67
68
- static const char * const riscv_gdb_reg_names [RISCV_NUM_REGS ] =
68
+ static const char * const riscv_gdb_reg_names [RISCV_LAST_FP_REGNUM + 1 ] =
69
69
{
70
70
"x0" , "x1" , "x2" , "x3" , "x4" , "x5" , "x6" , "x7" ,
71
71
"x8" , "x9" , "x10" , "x11" , "x12" , "x13" , "x14" , "x15" ,
@@ -76,10 +76,6 @@ static const char * const riscv_gdb_reg_names[RISCV_NUM_REGS] =
76
76
"f8" , "f9" , "f10" , "f11" , "f12" , "f13" , "f14" , "f15" ,
77
77
"f16" , "f17" , "f18" , "f19" , "f20" , "f21" , "f22" , "f23" ,
78
78
"f24" , "f25" , "f26" , "f27" , "f28" , "f29" , "f30" , "f31" ,
79
-
80
- #define DECLARE_CSR (name , num ) #name ,
81
- #include "opcode/riscv-opc.h"
82
- #undef DECLARE_CSR
83
79
};
84
80
85
81
struct register_alias
@@ -156,6 +152,9 @@ static const struct register_alias riscv_register_aliases[] =
156
152
{ "ft9" , 62 },
157
153
{ "ft10" , 63 },
158
154
{ "ft11" , 64 },
155
+ #define DECLARE_CSR (name , num ) { #name , (num ) + 65 },
156
+ #include "opcode /riscv - opc .h "
157
+ #undef DECLARE_CSR
159
158
};
160
159
161
160
static const gdb_byte *
@@ -189,22 +188,41 @@ value_of_riscv_user_reg (struct frame_info *frame, const void *baton)
189
188
}
190
189
191
190
static const char *
192
- riscv_register_name (struct gdbarch * gdbarch ,
193
- int regnum )
191
+ register_name (struct gdbarch * gdbarch ,
192
+ int regnum ,
193
+ int prefer_alias )
194
194
{
195
195
int i ;
196
+ static char buf [20 ];
196
197
197
198
if (tdesc_has_registers (gdbarch_target_desc (gdbarch )))
198
199
return tdesc_register_name (gdbarch , regnum );
199
- else if (regnum >= 0 && regnum < RISCV_LAST_REGNUM )
200
+ /* Prefer to use the alias. */
201
+ if (prefer_alias &&
202
+ regnum >= RISCV_ZERO_REGNUM && regnum <= RISCV_LAST_REGNUM )
200
203
{
201
204
for (i = 0 ; i < ARRAY_SIZE (riscv_register_aliases ); ++ i )
202
205
if (regnum == riscv_register_aliases [i ].regnum )
203
206
return riscv_register_aliases [i ].name ;
207
+ }
208
+
209
+ if (regnum >= RISCV_ZERO_REGNUM && regnum <= RISCV_LAST_FP_REGNUM )
204
210
return riscv_gdb_reg_names [regnum ];
211
+
212
+ if (regnum >= RISCV_FIRST_CSR_REGNUM && regnum <= RISCV_LAST_CSR_REGNUM )
213
+ {
214
+ sprintf (buf , "csr%d" , regnum - RISCV_FIRST_CSR_REGNUM );
215
+ return buf ;
205
216
}
206
- else
207
- return NULL ;
217
+
218
+ return NULL ;
219
+ }
220
+
221
+ static const char *
222
+ riscv_register_name (struct gdbarch * gdbarch ,
223
+ int regnum )
224
+ {
225
+ return register_name (gdbarch , regnum , 0 );
208
226
}
209
227
210
228
static void
@@ -510,12 +528,12 @@ riscv_print_register_formatted (struct ui_file *file, struct frame_info *frame,
510
528
511
529
if (!deprecated_frame_register_read (frame , regnum , raw_buffer ))
512
530
{
513
- fprintf_filtered (file , "%-15s[Invalid]" ,
514
- riscv_register_name (gdbarch , regnum ));
531
+ fprintf_filtered (file , "%-15s[Invalid]\n " ,
532
+ register_name (gdbarch , regnum , 1 ));
515
533
return ;
516
534
}
517
535
518
- fprintf_filtered (file , "%-15s" , riscv_register_name (gdbarch , regnum ));
536
+ fprintf_filtered (file , "%-15s" , register_name (gdbarch , regnum , 1 ));
519
537
if (gdbarch_byte_order (gdbarch ) == BFD_ENDIAN_BIG )
520
538
offset = register_size (gdbarch , regnum ) - register_size (gdbarch , regnum );
521
539
else
@@ -586,41 +604,7 @@ riscv_print_register_formatted (struct ui_file *file, struct frame_info *frame,
586
604
& opts , 0 , file );
587
605
}
588
606
}
589
- }
590
-
591
- static void
592
- riscv_print_registers_info (struct gdbarch * gdbarch ,
593
- struct ui_file * file ,
594
- struct frame_info * frame ,
595
- int regnum ,
596
- int all )
597
- {
598
- if (regnum != -1 )
599
- {
600
- /* Print one specified register. */
601
- gdb_assert (regnum < RISCV_LAST_REGNUM );
602
- if ('\0' == * (riscv_register_name (gdbarch , regnum )))
603
- error (_ ("Not a valid register for the current processor type" ));
604
- riscv_print_register_formatted (file , frame , regnum );
605
- fprintf_filtered (file , "\n" );
606
- }
607
- else
608
- for (regnum = 0 ; regnum < RISCV_LAST_REGNUM ; ++ regnum )
609
- {
610
- if ('\0' == * (riscv_register_name (gdbarch , regnum )))
611
- error (_ ("Not a valid register for the current processor type" ));
612
-
613
- /* Zero never changes, so might as well hide by default. */
614
- if (regnum == RISCV_ZERO_REGNUM && !all )
615
- continue ;
616
-
617
- /* Only show the main integer register set by default. */
618
- if (all || regnum < RISCV_FIRST_FP_REGNUM )
619
- {
620
- riscv_print_register_formatted (file , frame , regnum );
621
- fprintf_filtered (file , "\n" );
622
- }
623
- }
607
+ fprintf_filtered (file , "\n" );
624
608
}
625
609
626
610
static int
@@ -630,14 +614,24 @@ riscv_register_reggroup_p (struct gdbarch *gdbarch,
630
614
{
631
615
int float_p ;
632
616
int raw_p ;
617
+ unsigned int i ;
618
+
619
+ /* Used by 'info registers' and 'info registers <groupname>'. */
633
620
634
621
if (gdbarch_register_name (gdbarch , regnum ) == NULL
635
622
|| gdbarch_register_name (gdbarch , regnum )[0 ] == '\0' )
636
623
return 0 ;
637
624
638
- if (reggroup == all_reggroup )
639
- return 1 ;
640
- else if (reggroup == float_reggroup )
625
+ if (reggroup == all_reggroup ) {
626
+ if (regnum < RISCV_FIRST_CSR_REGNUM )
627
+ return 1 ;
628
+ /* Only include CSRs that have aliases. */
629
+ for (i = 0 ; i < ARRAY_SIZE (riscv_register_aliases ); ++ i ) {
630
+ if (regnum == riscv_register_aliases [i ].regnum )
631
+ return 1 ;
632
+ }
633
+ return 0 ;
634
+ } else if (reggroup == float_reggroup )
641
635
return (regnum >= RISCV_FIRST_FP_REGNUM && regnum <= RISCV_LAST_FP_REGNUM )
642
636
|| (regnum == RISCV_CSR_FCSR_REGNUM
643
637
|| regnum == RISCV_CSR_FFLAGS_REGNUM
@@ -646,14 +640,55 @@ riscv_register_reggroup_p (struct gdbarch *gdbarch,
646
640
return regnum < RISCV_FIRST_FP_REGNUM ;
647
641
else if (reggroup == restore_reggroup || reggroup == save_reggroup )
648
642
return regnum <= RISCV_LAST_FP_REGNUM ;
649
- else if (reggroup == system_reggroup )
650
- return regnum >= RISCV_FIRST_CSR_REGNUM && regnum <= RISCV_LAST_CSR_REGNUM ;
651
- else if (reggroup == vector_reggroup )
643
+ else if (reggroup == system_reggroup ) {
644
+ /* Only include CSRs that have aliases. */
645
+ if (regnum < RISCV_FIRST_CSR_REGNUM || regnum > RISCV_LAST_CSR_REGNUM )
646
+ return 0 ;
647
+ for (i = 0 ; i < ARRAY_SIZE (riscv_register_aliases ); ++ i ) {
648
+ if (regnum == riscv_register_aliases [i ].regnum )
649
+ return 1 ;
650
+ }
651
+ return 0 ;
652
+ } else if (reggroup == vector_reggroup )
652
653
return 0 ;
653
654
else
654
655
internal_error (__FILE__ , __LINE__ , _ ("unhandled reggroup" ));
655
656
}
656
657
658
+ static void
659
+ riscv_print_registers_info (struct gdbarch * gdbarch ,
660
+ struct ui_file * file ,
661
+ struct frame_info * frame ,
662
+ int regnum ,
663
+ int all )
664
+ {
665
+ /* Use by 'info all-registers'. */
666
+ struct reggroup * reggroup ;
667
+
668
+ if (regnum != -1 )
669
+ {
670
+ /* Print one specified register. */
671
+ gdb_assert (regnum < RISCV_LAST_REGNUM );
672
+ if (NULL == register_name (gdbarch , regnum , 1 ))
673
+ error (_ ("Not a valid register for the current processor type" ));
674
+ riscv_print_register_formatted (file , frame , regnum );
675
+ return ;
676
+ }
677
+
678
+ if (all )
679
+ reggroup = all_reggroup ;
680
+ else
681
+ reggroup = general_reggroup ;
682
+ for (regnum = 0 ; regnum <= RISCV_LAST_REGNUM ; ++ regnum )
683
+ {
684
+ /* Zero never changes, so might as well hide by default. */
685
+ if (regnum == RISCV_ZERO_REGNUM && !all )
686
+ continue ;
687
+ if (riscv_register_reggroup_p (gdbarch , regnum , reggroup ))
688
+ riscv_print_register_formatted (file , frame , regnum );
689
+ }
690
+ }
691
+
657
692
static ULONGEST
658
693
riscv_fetch_instruction (struct gdbarch * gdbarch , CORE_ADDR addr )
659
694
{
@@ -718,7 +753,7 @@ riscv_scan_prologue (struct gdbarch *gdbarch,
718
753
int seen_sp_adjust = 0 ;
719
754
int load_immediate_bytes = 0 ;
720
755
721
- /* Can be called when there's no process, and hence when there's no THIS_FRAME. */
756
+ /* Can be called when there's no process, and hence when there's no THIS_FRAME. */
722
757
if (this_frame != NULL )
723
758
sp = get_frame_register_signed (this_frame , RISCV_SP_REGNUM );
724
759
else
@@ -1115,7 +1150,7 @@ riscv_gdbarch_init (struct gdbarch_info info,
1115
1150
set_gdbarch_sp_regnum (gdbarch , RISCV_SP_REGNUM );
1116
1151
set_gdbarch_pc_regnum (gdbarch , RISCV_PC_REGNUM );
1117
1152
set_gdbarch_ps_regnum (gdbarch , RISCV_FP_REGNUM );
1118
- set_gdbarch_deprecated_fp_regnum (gdbarch , RISCV_FIRST_FP_REGNUM );
1153
+ set_gdbarch_deprecated_fp_regnum (gdbarch , RISCV_FP_REGNUM );
1119
1154
1120
1155
/* Functions to supply register information. */
1121
1156
set_gdbarch_register_name (gdbarch , riscv_register_name );
@@ -1157,8 +1192,15 @@ riscv_gdbarch_init (struct gdbarch_info info,
1157
1192
tdesc_data = tdesc_data_alloc ();
1158
1193
1159
1194
valid_p = 1 ;
1160
- for (i = RISCV_ZERO_REGNUM ; i < RISCV_LAST_REGNUM ; ++ i )
1161
- valid_p &= tdesc_numbered_register (feature , tdesc_data , i , riscv_gdb_reg_names [i ]);
1195
+ for (i = RISCV_ZERO_REGNUM ; i <= RISCV_LAST_FP_REGNUM ; ++ i )
1196
+ valid_p &= tdesc_numbered_register (feature , tdesc_data , i ,
1197
+ riscv_gdb_reg_names [i ]);
1198
+ for (i = RISCV_FIRST_CSR_REGNUM ; i <= RISCV_LAST_CSR_REGNUM ; ++ i )
1199
+ {
1200
+ char buf [20 ];
1201
+ sprintf (buf , "csr%d" , i - RISCV_FIRST_CSR_REGNUM );
1202
+ valid_p &= tdesc_numbered_register (feature , tdesc_data , i , buf );
1203
+ }
1162
1204
1163
1205
if (!valid_p )
1164
1206
tdesc_data_cleanup (tdesc_data );
0 commit comments