GP-25_emteere_StoredProgramRegisters initialize register name map only

as needed, and don't upper case all registers
This commit is contained in:
emteere 2020-07-01 14:57:53 -04:00
parent c5a31bb129
commit 9c7c0d4492
2 changed files with 23 additions and 13 deletions

View file

@ -354,7 +354,7 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
registers = newLanguage.getRegisters(); registers = newLanguage.getRegisters();
baseContextRegister = newLanguage.getContextBaseRegister(); baseContextRegister = newLanguage.getContextBaseRegister();
initNameMap(); initRegisterMap();
registerValueMap.clear(); registerValueMap.clear();
initializedCurrentValues(); initializedCurrentValues();

View file

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,17 +15,17 @@
*/ */
package ghidra.program.util; package ghidra.program.util;
import java.util.*;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;
import ghidra.program.model.lang.RegisterValue; import ghidra.program.model.lang.RegisterValue;
import ghidra.program.model.listing.DefaultProgramContext; import ghidra.program.model.listing.DefaultProgramContext;
import ghidra.program.model.listing.ProgramContext; import ghidra.program.model.listing.ProgramContext;
import java.util.*;
abstract public class AbstractProgramContext implements ProgramContext, DefaultProgramContext { abstract public class AbstractProgramContext implements ProgramContext, DefaultProgramContext {
protected Map<String, Register> registerNameMap; private Map<String, Register> registerNameMap = null;
protected Register[] registers; protected Register[] registers;
protected Register baseContextRegister; protected Register baseContextRegister;
@ -39,8 +38,7 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP
protected AbstractProgramContext(Register[] registers) { protected AbstractProgramContext(Register[] registers) {
this.registers = registers; this.registers = registers;
registerNameMap = new HashMap<String, Register>(); initRegisterMap();
initNameMap();
if (baseContextRegister != null) { if (baseContextRegister != null) {
nonFlowingContextRegisterMask = baseContextRegister.getBaseMask().clone(); nonFlowingContextRegisterMask = baseContextRegister.getBaseMask().clone();
@ -111,23 +109,29 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP
return value.clearBitValues(flowingContextRegisterMask); return value.clearBitValues(flowingContextRegisterMask);
} }
protected void initNameMap() { protected void initRegisterMap() {
registerNameMap = null;
baseContextRegister = null; baseContextRegister = null;
for (Register register : registers) { for (Register register : registers) {
registerNameMap.put(register.getName().toUpperCase(), register);
if (register.isProcessorContext()) { if (register.isProcessorContext()) {
baseContextRegister = register.getBaseRegister(); baseContextRegister = register.getBaseRegister();
} }
for (String alias : register.getAliases()) {
registerNameMap.put(alias.toUpperCase(), register);
}
} }
if (baseContextRegister == null) { if (baseContextRegister == null) {
baseContextRegister = baseContextRegister =
new Register("DEFAULT_CONTEXT", "DEFAULT_CONTEXT", Address.NO_ADDRESS, 4, true, 0); new Register("DEFAULT_CONTEXT", "DEFAULT_CONTEXT", Address.NO_ADDRESS, 4, true, 0);
} }
defaultDisassemblyContext = new RegisterValue(baseContextRegister); defaultDisassemblyContext = new RegisterValue(baseContextRegister);
}
private void initRegisterNameMap() {
// NOTE: if you want upper case names recognized, override this method and add them
for (Register register : registers) {
registerNameMap.put(register.getName(), register);
for (String alias : register.getAliases()) {
registerNameMap.put(alias, register);
}
}
} }
@Override @Override
@ -143,7 +147,13 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP
@Override @Override
public final Register getRegister(String name) { public final Register getRegister(String name) {
return registerNameMap.get(name.toUpperCase()); // if register map hasn't been initialized, initialize it
if (registerNameMap == null) {
registerNameMap = new HashMap<String, Register>();
initRegisterNameMap();
}
Register reg = registerNameMap.get(name);
return reg;
} }
@Override @Override