From 9c7c0d44927d0db08a117fb77a2f7da24a54a30c Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 1 Jul 2020 14:57:53 -0400 Subject: [PATCH] GP-25_emteere_StoredProgramRegisters initialize register name map only as needed, and don't upper case all registers --- .../register/ProgramRegisterContextDB.java | 2 +- .../program/util/AbstractProgramContext.java | 34 ++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java index 2cd68cb0ee..454835e4d6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java @@ -354,7 +354,7 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple registers = newLanguage.getRegisters(); baseContextRegister = newLanguage.getContextBaseRegister(); - initNameMap(); + initRegisterMap(); registerValueMap.clear(); initializedCurrentValues(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractProgramContext.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractProgramContext.java index c7be32ce85..406573bef0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractProgramContext.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractProgramContext.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +15,17 @@ */ package ghidra.program.util; +import java.util.*; + import ghidra.program.model.address.Address; import ghidra.program.model.lang.Register; import ghidra.program.model.lang.RegisterValue; import ghidra.program.model.listing.DefaultProgramContext; import ghidra.program.model.listing.ProgramContext; -import java.util.*; - abstract public class AbstractProgramContext implements ProgramContext, DefaultProgramContext { - protected Map registerNameMap; + private Map registerNameMap = null; protected Register[] registers; protected Register baseContextRegister; @@ -39,8 +38,7 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP protected AbstractProgramContext(Register[] registers) { this.registers = registers; - registerNameMap = new HashMap(); - initNameMap(); + initRegisterMap(); if (baseContextRegister != null) { nonFlowingContextRegisterMask = baseContextRegister.getBaseMask().clone(); @@ -111,23 +109,29 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP return value.clearBitValues(flowingContextRegisterMask); } - protected void initNameMap() { + protected void initRegisterMap() { + registerNameMap = null; baseContextRegister = null; for (Register register : registers) { - registerNameMap.put(register.getName().toUpperCase(), register); if (register.isProcessorContext()) { baseContextRegister = register.getBaseRegister(); } - for (String alias : register.getAliases()) { - registerNameMap.put(alias.toUpperCase(), register); - } } if (baseContextRegister == null) { baseContextRegister = new Register("DEFAULT_CONTEXT", "DEFAULT_CONTEXT", Address.NO_ADDRESS, 4, true, 0); } 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 @@ -143,7 +147,13 @@ abstract public class AbstractProgramContext implements ProgramContext, DefaultP @Override 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(); + initRegisterNameMap(); + } + Register reg = registerNameMap.get(name); + return reg; } @Override