mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
GT-3448_emteere_LargeDisPerf code review changes. Fixing code defined
notification
This commit is contained in:
parent
a9c7e69ac3
commit
8bfd0c1042
2 changed files with 16 additions and 17 deletions
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue