xref: /llvm-project/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h (revision 660e34fd38c3fb39fba1871bbf5b2eb3a48bf277)
1 //===-- RegisterInfoPOSIX_riscv64.h -----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIX_RISCV64_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIX_RISCV64_H
11 
12 #include "RegisterInfoAndSetInterface.h"
13 #include "lldb/Target/RegisterContext.h"
14 #include "lldb/Utility/Flags.h"
15 #include "lldb/lldb-private.h"
16 #include <map>
17 
18 class RegisterInfoPOSIX_riscv64
19     : public lldb_private::RegisterInfoAndSetInterface {
20 public:
21   enum { GPRegSet = 0 };
22 
23   // RISC-V64 register set mask value
24   enum {
25     eRegsetMaskDefault = 0,
26     eRegsetMaskFP = 1,
27     eRegsetMaskAll = -1,
28   };
29 
30   struct GPR {
31     // note: gpr[0] is pc, not x0
32     uint64_t gpr[32];
33   };
34 
35   struct FPR {
36     uint64_t fpr[32];
37     uint32_t fcsr;
38   };
39 
40   struct VPR {
41     // The size should be VLEN*32 in bits, but we don't have VLEN here.
42     void *vpr;
43   };
44 
45   RegisterInfoPOSIX_riscv64(const lldb_private::ArchSpec &target_arch,
46                             lldb_private::Flags opt_regsets);
47 
48   void AddRegSetGP();
49 
50   void AddRegSetFP();
51 
52   size_t GetGPRSize() const override;
53 
54   size_t GetFPRSize() const override;
55 
56   const lldb_private::RegisterInfo *GetRegisterInfo() const override;
57 
58   uint32_t GetRegisterCount() const override;
59 
60   const lldb_private::RegisterSet *
61   GetRegisterSet(size_t reg_set) const override;
62 
63   size_t GetRegisterSetCount() const override;
64 
65   size_t GetRegisterSetFromRegisterIndex(uint32_t reg_index) const override;
66 
67   bool IsFPPresent() const { return m_opt_regsets.AnySet(eRegsetMaskFP); }
68 
69   bool IsFPReg(unsigned reg) const;
70 
71 private:
72   std::vector<lldb_private::RegisterInfo> m_register_infos;
73 
74   std::vector<lldb_private::RegisterSet> m_register_sets;
75 
76   // Contains pair of [start, end] register numbers of a register set with start
77   // and end included.
78   std::map<uint32_t, std::pair<uint32_t, uint32_t>> m_per_regset_regnum_range;
79 
80   // Register collections to be stored as reference for m_register_sets items
81   std::vector<uint32_t> m_fp_regnum_collection;
82 
83   lldb_private::Flags m_opt_regsets;
84 };
85 
86 #endif
87