15#define HWCAP_FPHP (1ULL << 9)
16#define HWCAP_ASIMDHP (1ULL << 10)
17#define HWCAP_DIT (1ULL << 24)
18#define HWCAP_SSBS (1ULL << 28)
20#define HWCAP2_BTI (1ULL << 17)
21#define HWCAP2_MTE (1ULL << 18)
22#define HWCAP2_AFP (1ULL << 20)
23#define HWCAP2_EBF16 (1ULL << 32)
47 return {{
"TAGS", 3, 18},
50 {
"TAGGED_ADDR_ENABLE", 0}};
55 std::vector<RegisterFlags::Field> fpcr_fields{
56 {
"AHP", 26}, {
"DN", 25}, {
"FZ", 24}, {
"RMode", 22, 23},
63 fpcr_fields.push_back({
"FZ16", 19});
67 fpcr_fields.push_back({
"IDE", 15});
71 fpcr_fields.push_back({
"EBF", 13});
73 fpcr_fields.push_back({
"IXE", 12});
74 fpcr_fields.push_back({
"UFE", 11});
75 fpcr_fields.push_back({
"OFE", 10});
76 fpcr_fields.push_back({
"DZE", 9});
77 fpcr_fields.push_back({
"IOE", 8});
81 fpcr_fields.push_back({
"NEP", 2});
82 fpcr_fields.push_back({
"AH", 1});
83 fpcr_fields.push_back({
"FIZ", 0});
116 std::vector<RegisterFlags::Field> cpsr_fields{
117 {
"N", 31}, {
"Z", 30}, {
"C", 29}, {
"V", 28},
122 cpsr_fields.push_back({
"TCO", 25});
124 cpsr_fields.push_back({
"DIT", 24});
129 cpsr_fields.push_back({
"SS", 21});
130 cpsr_fields.push_back({
"IL", 20});
136 cpsr_fields.push_back({
"SSBS", 12});
138 cpsr_fields.push_back({
"BTYPE", 10, 11});
140 cpsr_fields.push_back({
"D", 9});
141 cpsr_fields.push_back({
"A", 8});
142 cpsr_fields.push_back({
"I", 7});
143 cpsr_fields.push_back({
"F", 6});
146 cpsr_fields.push_back({
"nRW", 4});
148 cpsr_fields.push_back({
"EL", 2, 3});
150 cpsr_fields.push_back({
"SP", 0});
157 reg.m_flags.SetFields(reg.m_detector(hwcap, hwcap2));
164 "Must call DetectFields before updating register info.");
169 std::vector<std::pair<llvm::StringRef, const RegisterFlags *>>
174 if (reg.m_flags.GetFields().size())
175 search_registers.push_back({reg.m_name, ®.m_flags});
185 for (uint32_t idx = 0; idx < num_regs && search_registers.size();
187 auto reg_it = std::find_if(
188 search_registers.cbegin(), search_registers.cend(),
189 [reg_info](
auto reg) { return reg.first == reg_info->name; });
191 if (reg_it != search_registers.end()) {
195 search_registers.erase(reg_it);
static Fields DetectCPSRFields(uint64_t hwcap, uint64_t hwcap2)
static Fields DetectFPSRFields(uint64_t hwcap, uint64_t hwcap2)
static Fields DetectFPCRFields(uint64_t hwcap, uint64_t hwcap2)
struct lldb_private::LinuxArm64RegisterFlags::RegisterEntry m_registers[5]
static Fields DetectMTECtrlFields(uint64_t hwcap, uint64_t hwcap2)
void DetectFields(uint64_t hwcap, uint64_t hwcap2)
For the registers listed in this class, detect which fields are present.
void UpdateRegisterInfo(const RegisterInfo *reg_info, uint32_t num_regs)
Add the field information of any registers named in this class, to the relevant RegisterInfo instance...
static Fields DetectSVCRFields(uint64_t hwcap, uint64_t hwcap2)
std::vector< RegisterFlags::Field > Fields
A class that represents a running process on the host machine.
Every register is described in detail including its name, alternate name (optional),...
const RegisterFlags * flags_type
If not nullptr, a type defined by XML descriptions.