diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc index 41fe8fed5e..a8e761ea19 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc @@ -1222,11 +1222,10 @@ bool Funcdata::attemptDynamicMapping(SymbolEntry *entry,DynamicHash &dhash) } Varnode *vn = dhash.findVarnode(this,entry->getFirstUseAddress(),entry->getHash()); if (vn == (Varnode *)0) return false; + if (vn->getSymbolEntry() != (SymbolEntry *)0) return false; // Varnode is already labeled if (category == Symbol::equate) { // Is this an equate symbol - if (vn->mapentry != entry) { // Check we haven't marked this before - vn->setSymbolEntry(entry); - return true; - } + vn->setSymbolEntry(entry); + return true; } else if (entry->getSize() == vn->getSize()) { if (vn->setSymbolProperties(entry)) @@ -1254,7 +1253,7 @@ bool Funcdata::attemptDynamicMappingLate(SymbolEntry *entry,DynamicHash &dhash) Varnode *vn = dhash.findVarnode(this,entry->getFirstUseAddress(),entry->getHash()); if (vn == (Varnode *)0) return false; - if (vn->getSymbolEntry() == entry) return false; // Already applied it + if (vn->getSymbolEntry() != (SymbolEntry *)0) return false; // Symbol already applied if (sym->getCategory() == Symbol::equate) { // Equate symbol does not depend on size vn->setSymbolEntry(entry); return true; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java index 0b2ee72704..01372bef38 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/SpecExtension.java @@ -637,7 +637,13 @@ public class SpecExtension { } cspecValidator.verify(res.optionName, document); checkExtension(res); - parseExtension(res.optionName, document, program.getCompilerSpec(), false); + if (!(program.getCompilerSpec() instanceof BasicCompilerSpec)) { + throw new SleighException( + "Can only test specification extensions against SLEIGH program"); + } + BasicCompilerSpec cSpecCopy = + new BasicCompilerSpec((BasicCompilerSpec) program.getCompilerSpec()); + parseExtension(res.optionName, document, cSpecCopy, false); return res; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java index 921d6d25a1..f340c80ee8 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java @@ -157,7 +157,7 @@ public class BasicCompilerSpec implements CompilerSpec { * spec from Language. * @param op2 is the spec to clone */ - protected BasicCompilerSpec(BasicCompilerSpec op2) { + public BasicCompilerSpec(BasicCompilerSpec op2) { language = op2.language; description = op2.description; // PrototypeModel is immutable but the map may change, so callingConventionMap