From 96e20ec3bf91d2d70903c61f003124468c69fa27 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:44:43 -0400 Subject: [PATCH] GP-4536 Speed up disassembly by not checking for reference overrides until and if there are needed --- .../listing/InstructionPcodeOverride.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/InstructionPcodeOverride.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/InstructionPcodeOverride.java index db1c8535a6..81fe5d48b3 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/InstructionPcodeOverride.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/InstructionPcodeOverride.java @@ -45,7 +45,18 @@ public class InstructionPcodeOverride implements PcodeOverride { */ public InstructionPcodeOverride(Instruction instr) { this.instr = instr; + } + /** + * Initialize the cache or any references on an instruction that would cause an override. + * + * @return list of any program overrides + */ + private List getPrimaryOverridingReferences() { + if (primaryOverridingReferences != null) { + return primaryOverridingReferences; + } + primaryOverridingReferences = new ArrayList<>(); for (Reference ref : instr.getReferencesFrom()) { if (!ref.isPrimary() || !ref.getToAddress().isMemoryAddress()) { @@ -59,6 +70,8 @@ public class InstructionPcodeOverride implements PcodeOverride { primaryCallAddress = ref.getToAddress(); } } + + return primaryOverridingReferences; } @Override @@ -86,8 +99,10 @@ public class InstructionPcodeOverride implements PcodeOverride { if (!type.isOverride()) { return null; } + + List overridingRefs = getPrimaryOverridingReferences(); Address overrideAddress = null; - for (Reference ref : primaryOverridingReferences) { + for (Reference ref : overridingRefs) { if (ref.getReferenceType().equals(type)) { if (overrideAddress == null) { overrideAddress = ref.getToAddress(); @@ -102,6 +117,7 @@ public class InstructionPcodeOverride implements PcodeOverride { @Override public Address getPrimaryCallReference() { + getPrimaryOverridingReferences(); return primaryCallAddress; } @@ -180,6 +196,7 @@ public class InstructionPcodeOverride implements PcodeOverride { @Override public boolean hasPotentialOverride() { - return !primaryOverridingReferences.isEmpty(); + List overridingRefs = getPrimaryOverridingReferences(); + return !overridingRefs.isEmpty(); } }