Merge remote-tracking branch 'origin/patch'

Conflicts:
	Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceUtils.java
This commit is contained in:
Ryan Kurtz 2022-11-16 02:32:34 -05:00
commit 045efef45c
3 changed files with 20 additions and 9 deletions

View file

@ -19,7 +19,8 @@ import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

View file

@ -295,7 +295,9 @@ public class DBTraceMemorySpace
if (state == null) {
throw new NullPointerException();
}
var l = new Object() {
boolean changed;
};
new AddressRangeMapSetter<Entry<TraceAddressSnapRange, TraceMemoryState>, TraceMemoryState>() {
@Override
protected AddressRange getRange(Entry<TraceAddressSnapRange, TraceMemoryState> entry) {
@ -324,6 +326,8 @@ public class DBTraceMemorySpace
@Override
protected Entry<TraceAddressSnapRange, TraceMemoryState> put(AddressRange range,
TraceMemoryState value) {
// This should not get called if the range is already the desired state
l.changed = true;
if (value != TraceMemoryState.UNKNOWN) {
stateMapSpace.put(new ImmutableTraceAddressSnapRange(range, snap), value);
}
@ -331,9 +335,11 @@ public class DBTraceMemorySpace
}
}.set(start, end, state);
if (l.changed) {
trace.setChanged(new TraceChangeRecord<>(TraceMemoryStateChangeType.CHANGED, this,
new ImmutableTraceAddressSnapRange(start, end, snap, snap), state));
}
}
protected void checkState(TraceMemoryState state) {
/**

View file

@ -188,26 +188,30 @@ public abstract class RangeMapSetter<E, D, R, V> {
Map<R, V> toPut = new HashMap<>();
for (E entry : getIntersecting(prev, next)) {
R r = getRange(entry);
boolean precedesMin = compare(getLower(r), lower) < 0;
boolean succeedsMax = compare(getUpper(r), upper) > 0;
int cmpMin = compare(getLower(r), lower);
int cmpMax = compare(getUpper(r), upper);
boolean sameVal = Objects.equals(getValue(entry), value);
if (precedesMin && succeedsMax && sameVal) {
if (cmpMin <= 0 && cmpMax >= 0 && sameVal) {
return entry; // The value in this range is already set as specified
}
toRemove.add(entry);
if (precedesMin) {
if (cmpMin < 0) {
if (sameVal) {
// Expand the new entry to cover the one we just removed
lower = getLower(r);
}
else {
// Create a truncated entry to replace the one we just removed
toPut.put(toSpan(getLower(r), prev), getValue(entry));
}
}
if (succeedsMax) {
if (cmpMax > 0) {
if (sameVal) {
// Expand the new entry to cover the one we just removed
upper = getUpper(r);
}
else {
// Create a truncated entry to replace the one we just removed
toPut.put(toSpan(next, getUpper(r)), getValue(entry));
}
}