@@ -1650,7 +1650,7 @@ class Arm64Architecture : public Architecture
16501650
16511651 virtual vector<uint32_t > GetFullWidthRegisters () override
16521652 {
1653- return vector<uint32_t >{
1653+ static vector<uint32_t > r = {
16541654 REG_X0, REG_X1, REG_X2, REG_X3, REG_X4, REG_X5, REG_X6, REG_X7,
16551655 REG_X8, REG_X9, REG_X10, REG_X11, REG_X12, REG_X13, REG_X14, REG_X15,
16561656 REG_X16, REG_X17, REG_X18, REG_X19, REG_X20, REG_X21, REG_X22, REG_X23,
@@ -1666,12 +1666,13 @@ class Arm64Architecture : public Architecture
16661666 REG_P16, REG_P17, REG_P18, REG_P19, REG_P20, REG_P21, REG_P22, REG_P23,
16671667 REG_P24, REG_P25, REG_P26, REG_P27, REG_P29, REG_P29, REG_P30, REG_P31,
16681668 };
1669+ return r;
16691670 }
16701671
16711672
16721673 virtual vector<uint32_t > GetAllRegisters () override
16731674 {
1674- vector<uint32_t > r = {
1675+ const static vector<uint32_t > r = {
16751676 /* regular registers */
16761677 REG_W0, REG_W1, REG_W2, REG_W3, REG_W4, REG_W5, REG_W6, REG_W7,
16771678 REG_W8, REG_W9, REG_W10, REG_W11, REG_W12, REG_W13, REG_W14, REG_W15,
@@ -1846,8 +1847,6 @@ class Arm64Architecture : public Architecture
18461847 has no name (is implementation specific) */
18471848 FAKEREG_SYSCALL_INFO
18481849 };
1849- // auto sysregs = get_system_registers();
1850- // r.insert(r.end(), sysregs.begin(), sysregs.end());
18511850 return r;
18521851 }
18531852
@@ -2230,16 +2229,8 @@ class Arm64Architecture : public Architecture
22302229 if (reg == FAKEREG_SYSCALL_INFO)
22312230 return RegisterInfo (reg, 0 , 4 );
22322231
2233- if (reg > SYSREG_NONE && reg < SYSREG_END)
2234- // constexpr auto sysregs = []() {
2235- // auto sysregs = get_system_registers();
2236- // auto sysreg_set = std::unordered_set<uint32_t>(sysregs.begin(), sysregs.end());
2237- // return sysreg_set;
2238- // };
2239- // auto sysreg_set = sysregs();
2240- // if (sysreg_set.find(reg) != sysreg_set.end())
2241- // return RegisterInfo(reg, 0, 8);
2242- LogWarn (" GetRegisterInfo called on sysreg %#x/%d" , reg, reg);
2232+ if (has_system_register_name ((SystemReg)reg))
2233+ LogDebug (" GetRegisterInfo called on sysreg %#x/%d" , reg, reg);
22432234
22442235 return RegisterInfo (0 , 0 , 0 );
22452236 }
@@ -2255,18 +2246,11 @@ class Arm64Architecture : public Architecture
22552246
22562247 virtual vector<uint32_t > GetSystemRegisters () override
22572248 {
2258- // vector<uint32_t> system_regs = {};
2259- //
2260- // for (uint32_t ii = SYSREG_NONE + 1; ii < SYSREG_END; ++ii)
2261- // {
2262- // system_regs.push_back(ii);
2263- // }
2264- //
2265- // system_regs.push_back(FAKEREG_SYSREG_UNKNOWN);
2266- //
2267- // return system_regs;
2268- vector<uint32_t > system_regs = get_system_registers ();
2269- system_regs.push_back (FAKEREG_SYSREG_UNKNOWN);
2249+ static vector<uint32_t > system_regs (get_system_registers ());
2250+ static std::once_flag once;
2251+ std::call_once (once, []() {
2252+ system_regs.push_back (FAKEREG_SYSREG_UNKNOWN);
2253+ });
22702254 return system_regs;
22712255 }
22722256};
0 commit comments