Merge remote-tracking branch 'origin/GP-2761_Dan_registerEditsNewConventions--SQUASHED'

This commit is contained in:
Ryan Kurtz 2022-11-30 12:16:30 -05:00
commit 2cd77234d2
12 changed files with 226 additions and 54 deletions

View file

@ -102,15 +102,21 @@ public interface InternalTracePlatform extends TracePlatform {
@Override
default PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
Register register) {
String name) {
PathMatcher matcher = schema.searchFor(TargetRegister.class, path, true);
if (matcher.isEmpty()) {
return matcher;
}
String name = getConventionalRegisterObjectName(register);
return matcher.applyKeys(Align.RIGHT, List.of(name));
}
@Override
default PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
Register register) {
return getConventionalRegisterPath(schema, path,
getConventionalRegisterObjectName(register));
}
@Override
default PathMatcher getConventionalRegisterPath(TraceObject container, Register register) {
return getConventionalRegisterPath(container.getTargetSchema(),

View file

@ -270,7 +270,7 @@ public class DBTraceMemorySpace
@Override
public DBTraceCodeSpace getCodeSpace(boolean createIfAbsent) {
if (space.isRegisterSpace()) {
if (space.isRegisterSpace() && !space.isOverlaySpace()) {
return trace.getCodeManager().getCodeRegisterSpace(thread, frameLevel, createIfAbsent);
}
return trace.getCodeManager().getCodeSpace(space, createIfAbsent);

View file

@ -40,7 +40,6 @@ import ghidra.util.LockHold;
import ghidra.util.Msg;
import ghidra.util.database.*;
import ghidra.util.database.annot.*;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor;
@ -207,8 +206,9 @@ public abstract class AbstractDBTraceSpaceBasedManager<M extends DBTraceSpaceBas
protected M getForRegisterSpace(TraceThread thread, int frameLevel, boolean createIfAbsent) {
trace.getThreadManager().assertIsMine(thread);
if (thread instanceof TraceObjectThread objThread) {
return getForRegisterSpaceObjectThread(objThread, frameLevel, createIfAbsent);
if (trace.getObjectManager().hasSchema()) {
return getForRegisterSpaceObjectThread((TraceObjectThread) thread, frameLevel,
createIfAbsent);
}
Pair<TraceThread, Integer> frame = ImmutablePair.of(thread, frameLevel);
if (!createIfAbsent) {

View file

@ -182,6 +182,17 @@ public interface TracePlatform {
*/
String getConventionalRegisterObjectName(Register register);
/**
* Get the expected path where an object defining the register value would be
*
* @param schema the schema of the register container
* @param path the path to the register container
* @param name the name of the register on the target
* @return the path matcher, possibly empty
*/
PathMatcher getConventionalRegisterPath(TargetObjectSchema schema, List<String> path,
String name);
/**
* Get the expected path where an object defining the register value would be
*

View file

@ -140,24 +140,31 @@ public enum TraceRegisterUtils {
return new RegisterValue(register, addr.getOffsetAsBigInteger());
}
public static RegisterValue combineWithTraceBaseRegisterValue(RegisterValue rv,
TracePlatform platform, long snap, TraceMemorySpace regs, boolean requireKnown) {
public static RegisterValue combineWithTraceParentRegisterValue(Register parent,
RegisterValue rv, TracePlatform platform, long snap, TraceMemorySpace regs,
boolean requireKnown) {
Register reg = rv.getRegister();
if (reg.isBaseRegister()) {
if (reg == parent) {
return rv;
}
if (regs == null) {
if (requireKnown) {
throw new IllegalStateException("Must fetch base register before setting a child");
throw new IllegalStateException("Must fetch " + parent + " before setting " + reg);
}
return rv.getBaseRegisterValue();
return rv.getRegisterValue(parent);
}
if (requireKnown) {
if (TraceMemoryState.KNOWN != regs.getState(platform, snap, reg.getBaseRegister())) {
throw new IllegalStateException("Must fetch base register before setting a child");
throw new IllegalStateException("Must fetch " + parent + " before setting " + reg);
}
}
return regs.getValue(platform, snap, reg.getBaseRegister()).combineValues(rv);
return regs.getValue(platform, snap, parent).combineValues(rv);
}
public static RegisterValue combineWithTraceBaseRegisterValue(RegisterValue rv,
TracePlatform platform, long snap, TraceMemorySpace regs, boolean requireKnown) {
return combineWithTraceParentRegisterValue(rv.getRegister().getBaseRegister(), rv, platform,
snap, regs, requireKnown);
}
public static ByteBuffer prepareBuffer(Register register) {