Skip to content

Commit 100faeb

Browse files
committed
[aarch64] use static var to avoid recreation of sysregs vector
1 parent 6479724 commit 100faeb

File tree

7 files changed

+6176
-6221
lines changed

7 files changed

+6176
-6221
lines changed

arch/arm64/arch_arm64.cpp

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)