GT-3586 remove Bad Instruction bookmarks before language upgrade

This commit is contained in:
ghidra1 2020-03-10 12:21:24 -04:00
parent c5af849e1e
commit be7d6b6562
4 changed files with 32 additions and 17 deletions

View file

@ -39,6 +39,7 @@ import ghidra.test.ToyProgramBuilder;
import ghidra.util.Lock; import ghidra.util.Lock;
import ghidra.util.SaveableColor; import ghidra.util.SaveableColor;
import ghidra.util.exception.NoValueException; import ghidra.util.exception.NoValueException;
import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter; import ghidra.util.task.TaskMonitorAdapter;
/** /**
@ -1008,7 +1009,7 @@ public class CodeManagerTest extends AbstractGenericTest {
instructionAt = pdb.getListing().getInstructionAt(addr(0x2000)); instructionAt = pdb.getListing().getInstructionAt(addr(0x2000));
assertEquals(FlowOverride.CALL, instructionAt.getFlowOverride()); assertEquals(FlowOverride.CALL, instructionAt.getFlowOverride());
pdb.getCodeManager().reDisassembleAllInstructions(0, TaskMonitorAdapter.DUMMY_MONITOR); pdb.getCodeManager().reDisassembleAllInstructions(TaskMonitor.DUMMY);
instructionAt = pdb.getListing().getInstructionAt(addr(0x2000)); instructionAt = pdb.getListing().getInstructionAt(addr(0x2000));
assertEquals(FlowOverride.CALL, instructionAt.getFlowOverride()); assertEquals(FlowOverride.CALL, instructionAt.getFlowOverride());
@ -1032,7 +1033,7 @@ public class CodeManagerTest extends AbstractGenericTest {
Instruction instructionAt = pdb.getListing().getInstructionAt(addr(0x2000)); Instruction instructionAt = pdb.getListing().getInstructionAt(addr(0x2000));
assertEquals(FlowOverride.NONE, instructionAt.getFlowOverride()); assertEquals(FlowOverride.NONE, instructionAt.getFlowOverride());
pdb.getCodeManager().reDisassembleAllInstructions(0, TaskMonitorAdapter.DUMMY_MONITOR); pdb.getCodeManager().reDisassembleAllInstructions(TaskMonitor.DUMMY);
instructionAt = pdb.getListing().getInstructionAt(addr(0x2002)); instructionAt = pdb.getListing().getInstructionAt(addr(0x2002));
assertEquals(null, instructionAt); assertEquals(null, instructionAt);

View file

@ -44,7 +44,6 @@ import ghidra.program.database.register.ProgramRegisterContextDB;
import ghidra.program.database.reloc.RelocationManager; import ghidra.program.database.reloc.RelocationManager;
import ghidra.program.database.symbol.*; import ghidra.program.database.symbol.*;
import ghidra.program.database.util.AddressSetPropertyMapDB; import ghidra.program.database.util.AddressSetPropertyMapDB;
import ghidra.program.disassemble.Disassembler;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
import ghidra.program.model.listing.*; import ghidra.program.model.listing.*;
@ -486,7 +485,6 @@ public class ProgramDB extends DomainObjectAdapterDB implements Program, ChangeM
return ve; return ve;
} }
@Override @Override
protected void setDomainFile(DomainFile df) { protected void setDomainFile(DomainFile df) {
super.setDomainFile(df); super.setDomainFile(df);
@ -2208,21 +2206,16 @@ public class ProgramDB extends DomainObjectAdapterDB implements Program, ChangeM
monitor.setProgress(0); monitor.setProgress(0);
ProgramRegisterContextDB contextMgr = ProgramRegisterContextDB contextMgr =
(ProgramRegisterContextDB) getProgramContext(); (ProgramRegisterContextDB) getProgramContext();
if (redisassemblyRequired) { if (redisassemblyRequired) {
contextMgr.setLanguage(translator, compilerSpec, memoryManager, monitor); contextMgr.setLanguage(translator, compilerSpec, memoryManager, monitor);
repairContext(oldLanguageVersion, oldLanguageMinorVersion, translator, monitor);
getCodeManager().reDisassembleAllInstructions(monitor);
} }
else { else {
contextMgr.initializeDefaultValues(language, compilerSpec); contextMgr.initializeDefaultValues(language, compilerSpec);
} }
if (redisassemblyRequired) {
Disassembler.clearUnimplementedPcodeWarnings(this, null, monitor);
repairContext(oldLanguageVersion, oldLanguageMinorVersion, translator, monitor);
monitor.setMessage("Updating instructions...");
monitor.setProgress(0);
getCodeManager().reDisassembleAllInstructions(500, monitor);
}
// Force function manager to reconcile calling conventions // Force function manager to reconcile calling conventions
managers[FUNCTION_MGR].setProgram(this); managers[FUNCTION_MGR].setProgram(this);
managers[FUNCTION_MGR].programReady(UPDATE, getStoredVersion(), monitor); managers[FUNCTION_MGR].programReady(UPDATE, getStoredVersion(), monitor);

View file

@ -20,7 +20,6 @@ import java.util.*;
import db.*; import db.*;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.store.LockException;
import ghidra.program.database.*; import ghidra.program.database.*;
import ghidra.program.database.data.DataTypeManagerDB; import ghidra.program.database.data.DataTypeManagerDB;
import ghidra.program.database.map.*; import ghidra.program.database.map.*;
@ -3526,13 +3525,13 @@ public class CodeManager implements ErrorHandler, ManagerDB {
* be discarded and all instructions redisassembled following flow and adjusting context as needed. * be discarded and all instructions redisassembled following flow and adjusting context as needed.
* Instructions which fail to redisassemble will be marked - since only one byte will be skipped, such bad * Instructions which fail to redisassemble will be marked - since only one byte will be skipped, such bad
* instruction disassembly may cause subsequent errors due to possible instruction shift. * instruction disassembly may cause subsequent errors due to possible instruction shift.
* This method is only intended for use by the ProgramDB setLanguage method. * This method is only intended for use by the ProgramDB setLanguage method which must ensure that
* @param bookmarkLimit maximum number of errors to bookmark * the context has been properly initialized.
* @param monitor task monitor * @param monitor task monitor
* @throws IOException * @throws IOException if IO error occurs
* @throws CancelledException if the operation is canceled. * @throws CancelledException if the operation is canceled.
*/ */
public void reDisassembleAllInstructions(int bookmarkLimit, TaskMonitor monitor) public void reDisassembleAllInstructions(TaskMonitor monitor)
throws IOException, CancelledException { throws IOException, CancelledException {
redisassemblyMode = true; redisassemblyMode = true;
@ -3540,6 +3539,10 @@ public class CodeManager implements ErrorHandler, ManagerDB {
if (lock.getOwner() != Thread.currentThread()) { if (lock.getOwner() != Thread.currentThread()) {
throw new IllegalStateException("Must be invoked by lock owner"); throw new IllegalStateException("Must be invoked by lock owner");
} }
Disassembler.clearUnimplementedPcodeWarnings(program, null, monitor);
Disassembler.clearBadInstructionErrors(program, null, monitor);
int maxCount = instAdapter.getRecordCount(); int maxCount = instAdapter.getRecordCount();
monitor.initialize(maxCount); monitor.initialize(maxCount);
monitor.setMessage("Preparing for Re-Disassembly..."); monitor.setMessage("Preparing for Re-Disassembly...");

View file

@ -1471,6 +1471,24 @@ public class Disassembler implements DisassemblerConflictHandler {
} }
} }
/**
* Clear all bookmarks which indicate Bad Instruction within the specified address set.
* @param program program to clear bookmarks
* @param addressSet restricted address set or null for entire program
* @param monitor allow canceling
* @throws CancelledException if monitor canceled
*/
public static void clearBadInstructionErrors(Program program, AddressSetView addressSet,
TaskMonitor monitor) throws CancelledException {
BookmarkManager bmMgr = program.getBookmarkManager();
if (addressSet == null) {
bmMgr.removeBookmarks(BookmarkType.ERROR, ERROR_BOOKMARK_CATEGORY, monitor);
}
else {
bmMgr.removeBookmarks(addressSet, BookmarkType.ERROR, ERROR_BOOKMARK_CATEGORY, monitor);
}
}
private void reportMessage(final String msg) { private void reportMessage(final String msg) {
if (listener != null) { if (listener != null) {
listener.disassembleMessageReported(msg); listener.disassembleMessageReported(msg);