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;
|
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
|
// 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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue