diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/disassemble/DisassembleCommand.java b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/disassemble/DisassembleCommand.java index 3b21470da0..9521ec3ece 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/disassemble/DisassembleCommand.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/disassemble/DisassembleCommand.java @@ -276,15 +276,15 @@ public class DisassembleCommand extends BackgroundCommand { continue; } - // 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 // disassemble the seedSet first - doDisassemblySeeds(disassembler, seedSet); + doDisassemblySeeds(disassembler, seedSet, mgr); seedSet = new AddressSet(); // do the current start of the subRangeSet AddressSet localDisAddrs = - doDisassemblySeeds(disassembler, new AddressSet(nextAddr)); + doDisassemblySeeds(disassembler, new AddressSet(nextAddr), mgr); // if anything disassembled, analyze the result set analyzeIfNeeded(mgr, subRangeSet, localDisAddrs, monitor); @@ -301,7 +301,7 @@ public class DisassembleCommand extends BackgroundCommand { // If there are any small seedSet ranges left, disassemble them // Don't kick off analysis, that will be done later if (!seedSet.isEmpty()) { - doDisassemblySeeds(disassembler, seedSet); + doDisassemblySeeds(disassembler, seedSet, mgr); } return disassemblyPerformed || (!nonExecutableStart & !unalignedStart); @@ -312,17 +312,25 @@ public class DisassembleCommand extends BackgroundCommand { * * @param disassembler disassembler to use * @param seedSet set of addresses to be disassembled + * @param mgr * * @return addresses actually disassembled */ - protected AddressSet doDisassemblySeeds(Disassembler disassembler, AddressSet seedSet) { + protected AddressSet doDisassemblySeeds(Disassembler disassembler, AddressSet seedSet, + AutoAnalysisManager mgr) { AddressSet newDisassembledAddrs = disassembler.disassemble(seedSet, restrictedSet, initialContextValue, followFlow); if (!newDisassembledAddrs.isEmpty()) { disassemblyPerformed = true; disassembledAddrs.add(newDisassembledAddrs); + + // notify analysis manager of new code + if (mgr != null) { + mgr.codeDefined(newDisassembledAddrs); + } } + return newDisassembledAddrs; } @@ -348,9 +356,6 @@ public class DisassembleCommand extends BackgroundCommand { return; } - // notify analysis manager of new code - mgr.codeDefined(disassembledSet); - AddressRange firstRange = disassembledSet.getFirstRange(); Address rangeEnd = firstRange.getMaxAddress(); Address nextAddr = rangeEnd.next(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java index 87f590041d..a9f2e3853d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java @@ -25,7 +25,6 @@ import ghidra.app.util.RepeatInstructionByteTracker; import ghidra.framework.options.Options; import ghidra.program.database.register.AddressRangeObjectMap; import ghidra.program.model.address.*; -import ghidra.program.model.data.DefaultDataType; import ghidra.program.model.lang.*; import ghidra.program.model.lang.InstructionError.InstructionErrorType; import ghidra.program.model.listing.*; @@ -464,17 +463,15 @@ public class Disassembler implements DisassemblerConflictHandler { continue; } + todoSubset.delete(nextAddr, nextAddr); + // must be aligned if (nextAddr.getOffset() % alignment != 0) { - todoSubset.delete(nextAddr, nextAddr); continue; } Data data = listing.getUndefinedDataAt(nextAddr); if (data == null) { - // no undefined here, skip to next undefined - todoSubset.delete(nextAddr, nextAddr); - AddressSetView undefinedRanges = null; try { undefinedRanges = @@ -489,10 +486,7 @@ public class Disassembler implements DisassemblerConflictHandler { AddressSet currentSet = disassemble(nextAddr, restrictedSet, initialContextValue, doFollowFlow); - if (currentSet.isEmpty()) { // nothing disassembled - todoSubset.delete(nextAddr, nextAddr); - } - else { + if (!currentSet.isEmpty()) { // nothing disassembled todoSubset.delete(currentSet); disassembledAddrs.add(currentSet); }