GT-3448_emteere_LargeDisPerf code review changes. Fixing code defined

notification
This commit is contained in:
emteere 2020-02-20 20:23:23 +00:00
parent a9c7e69ac3
commit 8bfd0c1042
2 changed files with 16 additions and 17 deletions

View file

@ -279,12 +279,12 @@ public class DisassembleCommand extends BackgroundCommand {
// process the big range by disassembling flow through the range // process the big range by disassembling flow through the range
// causing the analyzer to kick off between disassembly flows // causing the analyzer to kick off between disassembly flows
// disassemble the seedSet first // disassemble the seedSet first
doDisassemblySeeds(disassembler, seedSet); doDisassemblySeeds(disassembler, seedSet, mgr);
seedSet = new AddressSet(); seedSet = new AddressSet();
// do the current start of the subRangeSet // do the current start of the subRangeSet
AddressSet localDisAddrs = AddressSet localDisAddrs =
doDisassemblySeeds(disassembler, new AddressSet(nextAddr)); doDisassemblySeeds(disassembler, new AddressSet(nextAddr), mgr);
// if anything disassembled, analyze the result set // if anything disassembled, analyze the result set
analyzeIfNeeded(mgr, subRangeSet, localDisAddrs, monitor); analyzeIfNeeded(mgr, subRangeSet, localDisAddrs, monitor);
@ -301,7 +301,7 @@ public class DisassembleCommand extends BackgroundCommand {
// If there are any small seedSet ranges left, disassemble them // If there are any small seedSet ranges left, disassemble them
// Don't kick off analysis, that will be done later // Don't kick off analysis, that will be done later
if (!seedSet.isEmpty()) { if (!seedSet.isEmpty()) {
doDisassemblySeeds(disassembler, seedSet); doDisassemblySeeds(disassembler, seedSet, mgr);
} }
return disassemblyPerformed || (!nonExecutableStart & !unalignedStart); return disassemblyPerformed || (!nonExecutableStart & !unalignedStart);
@ -312,17 +312,25 @@ public class DisassembleCommand extends BackgroundCommand {
* *
* @param disassembler disassembler to use * @param disassembler disassembler to use
* @param seedSet set of addresses to be disassembled * @param seedSet set of addresses to be disassembled
* @param mgr
* *
* @return addresses actually disassembled * @return addresses actually disassembled
*/ */
protected AddressSet doDisassemblySeeds(Disassembler disassembler, AddressSet seedSet) { protected AddressSet doDisassemblySeeds(Disassembler disassembler, AddressSet seedSet,
AutoAnalysisManager mgr) {
AddressSet newDisassembledAddrs = AddressSet newDisassembledAddrs =
disassembler.disassemble(seedSet, restrictedSet, initialContextValue, followFlow); disassembler.disassemble(seedSet, restrictedSet, initialContextValue, followFlow);
if (!newDisassembledAddrs.isEmpty()) { if (!newDisassembledAddrs.isEmpty()) {
disassemblyPerformed = true; disassemblyPerformed = true;
disassembledAddrs.add(newDisassembledAddrs); disassembledAddrs.add(newDisassembledAddrs);
// notify analysis manager of new code
if (mgr != null) {
mgr.codeDefined(newDisassembledAddrs);
} }
}
return newDisassembledAddrs; return newDisassembledAddrs;
} }
@ -348,9 +356,6 @@ public class DisassembleCommand extends BackgroundCommand {
return; return;
} }
// notify analysis manager of new code
mgr.codeDefined(disassembledSet);
AddressRange firstRange = disassembledSet.getFirstRange(); AddressRange firstRange = disassembledSet.getFirstRange();
Address rangeEnd = firstRange.getMaxAddress(); Address rangeEnd = firstRange.getMaxAddress();
Address nextAddr = rangeEnd.next(); Address nextAddr = rangeEnd.next();

View file

@ -25,7 +25,6 @@ import ghidra.app.util.RepeatInstructionByteTracker;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.program.database.register.AddressRangeObjectMap; import ghidra.program.database.register.AddressRangeObjectMap;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.data.DefaultDataType;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
import ghidra.program.model.lang.InstructionError.InstructionErrorType; import ghidra.program.model.lang.InstructionError.InstructionErrorType;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
@ -464,17 +463,15 @@ public class Disassembler implements DisassemblerConflictHandler {
continue; continue;
} }
todoSubset.delete(nextAddr, nextAddr);
// must be aligned // must be aligned
if (nextAddr.getOffset() % alignment != 0) { if (nextAddr.getOffset() % alignment != 0) {
todoSubset.delete(nextAddr, nextAddr);
continue; continue;
} }
Data data = listing.getUndefinedDataAt(nextAddr); Data data = listing.getUndefinedDataAt(nextAddr);
if (data == null) { if (data == null) {
// no undefined here, skip to next undefined
todoSubset.delete(nextAddr, nextAddr);
AddressSetView undefinedRanges = null; AddressSetView undefinedRanges = null;
try { try {
undefinedRanges = undefinedRanges =
@ -489,10 +486,7 @@ public class Disassembler implements DisassemblerConflictHandler {
AddressSet currentSet = AddressSet currentSet =
disassemble(nextAddr, restrictedSet, initialContextValue, doFollowFlow); disassemble(nextAddr, restrictedSet, initialContextValue, doFollowFlow);
if (currentSet.isEmpty()) { // nothing disassembled if (!currentSet.isEmpty()) { // nothing disassembled
todoSubset.delete(nextAddr, nextAddr);
}
else {
todoSubset.delete(currentSet); todoSubset.delete(currentSet);
disassembledAddrs.add(currentSet); disassembledAddrs.add(currentSet);
} }