mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-25_emteere_StoredProgramRegisters initialize register name map only
as needed, and don't upper case all registers
This commit is contained in:
parent
c5a31bb129
commit
9c7c0d4492
2 changed files with 23 additions and 13 deletions
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue