mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
Merge remote-tracking branch
'origin/GP-1547_Dan_listingChangeLanguages--SQUASHED' into Ghidra_10.1
This commit is contained in:
commit
aae2b95fcd
36 changed files with 3827 additions and 498 deletions
|
@ -220,9 +220,7 @@ public class DBTraceDataTypeManager extends DataTypeManagerDB
|
|||
@Override
|
||||
public DataOrganization getDataOrganization() {
|
||||
if (dataOrganization == null) {
|
||||
// TODO: Do I need to have a base compiler spec?
|
||||
dataOrganization =
|
||||
trace.getBaseLanguage().getDefaultCompilerSpec().getDataOrganization();
|
||||
dataOrganization = trace.getBaseCompilerSpec().getDataOrganization();
|
||||
}
|
||||
return dataOrganization;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import ghidra.program.model.mem.MemBuffer;
|
|||
import ghidra.program.model.mem.MemoryAccessException;
|
||||
import ghidra.program.model.symbol.*;
|
||||
import ghidra.trace.database.DBTraceUtils;
|
||||
import ghidra.trace.database.context.DBTraceRegisterContextManager;
|
||||
import ghidra.trace.database.context.DBTraceRegisterContextSpace;
|
||||
import ghidra.trace.database.language.DBTraceGuestLanguage;
|
||||
import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree;
|
||||
|
@ -621,13 +622,12 @@ public class DBTraceInstruction extends AbstractDBTraceCodeUnit<DBTraceInstructi
|
|||
@Override
|
||||
public BigInteger getValue(Register register, boolean signed) {
|
||||
try (LockHold hold = LockHold.lock(space.lock.readLock())) {
|
||||
DBTraceRegisterContextSpace ctxSpace =
|
||||
space.trace.getRegisterContextManager().get(space, false);
|
||||
if (ctxSpace == null) {
|
||||
DBTraceRegisterContextManager manager = space.trace.getRegisterContextManager();
|
||||
RegisterValue rv =
|
||||
manager.getValueWithDefault(getLanguage(), register, getStartSnap(), getAddress());
|
||||
if (rv == null) {
|
||||
return null;
|
||||
}
|
||||
RegisterValue rv =
|
||||
ctxSpace.getValue(getLanguage(), register, getStartSnap(), getAddress());
|
||||
return signed ? rv.getSignedValue() : rv.getUnsignedValue();
|
||||
}
|
||||
}
|
||||
|
@ -635,12 +635,9 @@ public class DBTraceInstruction extends AbstractDBTraceCodeUnit<DBTraceInstructi
|
|||
@Override
|
||||
public RegisterValue getRegisterValue(Register register) {
|
||||
try (LockHold hold = LockHold.lock(space.lock.readLock())) {
|
||||
DBTraceRegisterContextSpace ctxSpace =
|
||||
space.trace.getRegisterContextManager().get(space, false);
|
||||
if (ctxSpace == null) {
|
||||
return null;
|
||||
}
|
||||
return ctxSpace.getValue(getLanguage(), register, getStartSnap(), getAddress());
|
||||
DBTraceRegisterContextManager manager = space.trace.getRegisterContextManager();
|
||||
return manager.getValueWithDefault(getLanguage(), register, getStartSnap(),
|
||||
getAddress());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ import ghidra.trace.model.listing.TraceInstructionsView;
|
|||
import ghidra.trace.util.OverlappingObjectIterator;
|
||||
import ghidra.trace.util.TraceChangeRecord;
|
||||
import ghidra.util.LockHold;
|
||||
import ghidra.util.SystemUtilities;
|
||||
import ghidra.util.exception.CancelledException;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
|
||||
|
@ -66,34 +67,9 @@ public class DBTraceInstructionsView extends AbstractBaseDBTraceDefinedUnitsView
|
|||
this.conflictCodeUnit = conflictCodeUnit;
|
||||
}
|
||||
|
||||
protected void doSetContexts(Range<Long> lifespan, Address min, Address max,
|
||||
ProcessorContextView context) {
|
||||
Language language = space.baseLanguage;
|
||||
Register contextReg = language.getContextBaseRegister();
|
||||
if (contextReg == null) {
|
||||
return;
|
||||
}
|
||||
RegisterValue newValue = context.getRegisterValue(contextReg);
|
||||
DBTraceRegisterContextManager ctxMgr = space.trace.getRegisterContextManager();
|
||||
if (Objects.equals(ctxMgr.getDefaultValue(language, contextReg, min), newValue)) {
|
||||
DBTraceRegisterContextSpace ctxSpace = ctxMgr.get(space, false);
|
||||
if (ctxSpace == null) {
|
||||
return;
|
||||
}
|
||||
ctxSpace.setValue(language, null, lifespan, new AddressRangeImpl(min, max));
|
||||
return;
|
||||
}
|
||||
DBTraceRegisterContextSpace ctxSpace = ctxMgr.get(space, true);
|
||||
// TODO: Do not save non-flowing context beyond???
|
||||
ctxSpace.setValue(language, newValue, lifespan, new AddressRangeImpl(min, max));
|
||||
}
|
||||
|
||||
protected Instruction doCreateInstruction(Range<Long> lifespan, Address address,
|
||||
InstructionPrototype prototype, Instruction protoInstr) {
|
||||
try {
|
||||
doSetContexts(lifespan, address, address.addNoWrap(prototype.getLength() - 1),
|
||||
protoInstr);
|
||||
|
||||
Instruction created = doCreate(lifespan, address, prototype, protoInstr);
|
||||
// copy override settings to replacement instruction
|
||||
if (protoInstr.isFallThroughOverridden()) {
|
||||
|
@ -183,6 +159,27 @@ public class DBTraceInstructionsView extends AbstractBaseDBTraceDefinedUnitsView
|
|||
super(space, space.instructionMapSpace);
|
||||
}
|
||||
|
||||
protected void doSetContexts(TraceAddressSnapRange tasr, Language language,
|
||||
ProcessorContextView context) {
|
||||
Register contextReg = language.getContextBaseRegister();
|
||||
if (contextReg == null || contextReg == Register.NO_CONTEXT) {
|
||||
return;
|
||||
}
|
||||
RegisterValue newValue = context.getRegisterValue(contextReg);
|
||||
DBTraceRegisterContextManager ctxMgr = space.trace.getRegisterContextManager();
|
||||
if (Objects.equals(ctxMgr.getDefaultValue(language, contextReg, tasr.getX1()), newValue)) {
|
||||
DBTraceRegisterContextSpace ctxSpace = ctxMgr.get(space, false);
|
||||
if (ctxSpace == null) {
|
||||
return;
|
||||
}
|
||||
ctxSpace.setValue(language, null, tasr.getLifespan(), tasr.getRange());
|
||||
return;
|
||||
}
|
||||
DBTraceRegisterContextSpace ctxSpace = ctxMgr.get(space, true);
|
||||
// TODO: Do not save non-flowing context beyond???
|
||||
ctxSpace.setValue(language, newValue, tasr.getLifespan(), tasr.getRange());
|
||||
}
|
||||
|
||||
protected DBTraceInstruction doCreate(Range<Long> lifespan, Address address,
|
||||
InstructionPrototype prototype, ProcessorContextView context)
|
||||
throws CodeUnitInsertionException, AddressOverflowException {
|
||||
|
@ -214,6 +211,8 @@ public class DBTraceInstructionsView extends AbstractBaseDBTraceDefinedUnitsView
|
|||
throw new CodeUnitInsertionException("Code units cannot overlap");
|
||||
}
|
||||
|
||||
doSetContexts(tasr, prototype.getLanguage(), context);
|
||||
|
||||
DBTraceInstruction created = space.instructionMapSpace.put(tasr, null);
|
||||
created.set(prototype, context);
|
||||
|
||||
|
|
|
@ -416,25 +416,33 @@ public abstract class AbstractDBTraceProgramViewListing implements TraceProgramV
|
|||
forward)));
|
||||
}
|
||||
|
||||
protected AddressSetView getCommentAddresses(int commentType, AddressSetView addrSet) {
|
||||
return new IntersectionAddressSetView(addrSet, program.viewport.unionedAddresses(
|
||||
s -> program.trace.getCommentAdapter()
|
||||
.getAddressSetView(Range.singleton(s), e -> e.getType() == commentType)));
|
||||
}
|
||||
|
||||
protected AddressSetView getCommentAddresses(AddressSetView addrSet) {
|
||||
return new IntersectionAddressSetView(addrSet, program.viewport.unionedAddresses(
|
||||
s -> program.trace.getCommentAdapter()
|
||||
.getAddressSetView(Range.singleton(s))));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodeUnitIterator getCommentCodeUnitIterator(int commentType, AddressSetView addrSet) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return new WrappingCodeUnitIterator(
|
||||
getCodeUnitIterator(getCommentAddresses(commentType, addrSet), true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public AddressIterator getCommentAddressIterator(int commentType, AddressSetView addrSet,
|
||||
boolean forward) {
|
||||
return new IntersectionAddressSetView(addrSet, program.viewport.unionedAddresses(
|
||||
s -> program.trace.getCommentAdapter()
|
||||
.getAddressSetView(Range.singleton(s), e -> e.getType() == commentType)))
|
||||
.getAddresses(forward);
|
||||
return getCommentAddresses(commentType, addrSet).getAddresses(forward);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AddressIterator getCommentAddressIterator(AddressSetView addrSet, boolean forward) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return getCommentAddresses(addrSet).getAddresses(forward);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -25,6 +25,7 @@ import javax.help.UnsupportedOperationException;
|
|||
|
||||
import com.google.common.collect.Range;
|
||||
|
||||
import generic.NestedIterator;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.program.model.lang.Register;
|
||||
import ghidra.program.model.listing.Variable;
|
||||
|
@ -240,13 +241,22 @@ public abstract class AbstractDBTraceProgramViewReferenceManager implements Refe
|
|||
: (r1, r2) -> -r1.getFromAddress().compareTo(r2.getFromAddress());
|
||||
}
|
||||
|
||||
protected Iterator<Reference> getReferenceIteratorForSnap(long snap, Address startAddr) {
|
||||
AddressIterator addresses =
|
||||
refs.getReferenceSources(Range.singleton(snap)).getAddresses(startAddr, true);
|
||||
return NestedIterator.start(addresses, a -> {
|
||||
return refs.getReferencesFrom(snap, a).iterator();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReferenceIterator getReferenceIterator(Address startAddr) {
|
||||
if (refs(false) == null) {
|
||||
return new ReferenceIteratorAdapter(Collections.emptyIterator());
|
||||
}
|
||||
// TODO: This will fail to occlude on equal (src,dst,opIndex) keys
|
||||
return new ReferenceIteratorAdapter(
|
||||
program.viewport.mergedIterator(s -> refs.getReferencesFrom(s, startAddr).iterator(),
|
||||
program.viewport.mergedIterator(s -> getReferenceIteratorForSnap(s, startAddr),
|
||||
getReferenceFromComparator(true)));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue