package regnum import "fmt" // The mapping between hardware registers and DWARF registers, See // https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-dwarf.adoc const ( // Integer Registers RISCV64_X0 = 0 // Link Register RISCV64_LR = 1 // Stack Pointer RISCV64_SP = 2 RISCV64_GP = 3 RISCV64_TP = 4 RISCV64_T0 = 5 RISCV64_T1 = 6 RISCV64_T2 = 7 RISCV64_S0 = 8 // Frame Pointer RISCV64_FP = RISCV64_S0 RISCV64_S1 = 9 RISCV64_A0 = 10 RISCV64_A1 = 11 RISCV64_A2 = 12 RISCV64_A3 = 13 RISCV64_A4 = 14 RISCV64_A5 = 15 RISCV64_A6 = 16 RISCV64_A7 = 17 RISCV64_S2 = 18 RISCV64_S3 = 19 RISCV64_S4 = 20 RISCV64_S5 = 21 RISCV64_S6 = 22 RISCV64_S7 = 23 RISCV64_S8 = 24 RISCV64_S9 = 25 RISCV64_S10 = 26 // G Register RISCV64_S11 = 27 RISCV64_T3 = 28 RISCV64_T4 = 29 RISCV64_T5 = 30 RISCV64_T6 = 31 RISCV64_X31 = RISCV64_T6 // Floating-point Registers RISCV64_F0 = 32 RISCV64_F31 = 63 // Not defined in DWARF specification RISCV64_PC = 65 _RISC64_MaxRegNum = RISCV64_PC ) func RISCV64ToName(num uint64) string { switch { case num <= RISCV64_X31: return fmt.Sprintf("X%d", num) case num >= RISCV64_F0 && num <= RISCV64_F31: return fmt.Sprintf("F%d", num) case num == RISCV64_PC: return "PC" default: return fmt.Sprintf("Unknown%d", num) } } func RISCV64MaxRegNum() uint64 { return _RISC64_MaxRegNum } var RISCV64NameToDwarf = func() map[string]int { r := make(map[string]int) for i := 0; i <= 31; i++ { r[fmt.Sprintf("x%d", i)] = RISCV64_X0 + i } r["pc"] = RISCV64_PC for i := 0; i <= 31; i++ { r[fmt.Sprintf("f%d", i)] = RISCV64_F0 + i } return r }()