GP-4252 handle bulk datatype replacements more efficiently

This commit is contained in:
ghidra1 2024-01-22 12:08:35 -05:00
parent e15e12b248
commit 9dce76ae53
11 changed files with 128 additions and 113 deletions

View file

@ -16,7 +16,8 @@
package ghidra.trace.database.data;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle;
@ -184,16 +185,14 @@ public class DBTraceDataTypeManager extends ProgramBasedDataTypeManagerDB
}
@Override
protected void replaceDataTypeIDs(long oldID, long newID) {
if (oldID == newID) {
return;
}
trace.getCodeManager().replaceDataTypes(oldID, newID);
trace.getSymbolManager().replaceDataTypes(oldID, newID);
protected void replaceDataTypesUsed(Map<Long, Long> dataTypeReplacementMap) {
trace.getCodeManager().replaceDataTypes(dataTypeReplacementMap);
trace.getSymbolManager().replaceDataTypes(dataTypeReplacementMap);
}
@Override
protected void deleteDataTypeIDs(LinkedList<Long> deletedIds) {
protected void deleteDataTypesUsed(Set<Long> deletedIds) {
// TODO: Should use replacement type instead of clearing
trace.getCodeManager().clearData(deletedIds, TaskMonitor.DUMMY);
trace.getSymbolManager().invalidateCache(false);
}

View file

@ -433,8 +433,7 @@ public class DBTraceCodeManager extends AbstractDBTraceSpaceBasedManager<DBTrace
}
@Override
public DBTraceCodeSpace getCodeRegisterSpace(TraceThread thread,
boolean createIfAbsent) {
public DBTraceCodeSpace getCodeRegisterSpace(TraceThread thread, boolean createIfAbsent) {
return getForRegisterSpace(thread, 0, createIfAbsent);
}
@ -445,26 +444,24 @@ public class DBTraceCodeManager extends AbstractDBTraceSpaceBasedManager<DBTrace
}
@Override
public DBTraceCodeSpace getCodeRegisterSpace(TraceStackFrame frame,
boolean createIfAbsent) {
public DBTraceCodeSpace getCodeRegisterSpace(TraceStackFrame frame, boolean createIfAbsent) {
return getForRegisterSpace(frame, createIfAbsent);
}
@Internal
public void replaceDataTypes(long oldID, long newID) {
public void replaceDataTypes(Map<Long, Long> dataTypeReplacementMap) {
TODO();
}
@Internal
public void clearData(LinkedList<Long> deletedDataTypeIds, TaskMonitor monitor) {
public void clearData(Set<Long> deletedDataTypeIds, TaskMonitor monitor) {
TODO();
}
@Internal
public void clearPlatform(Lifespan span, AddressRange range, DBTraceGuestPlatform guest,
TaskMonitor monitor) throws CancelledException {
delegateDeleteV(range.getAddressSpace(),
m -> m.clearPlatform(span, range, guest, monitor));
delegateDeleteV(range.getAddressSpace(), m -> m.clearPlatform(span, range, guest, monitor));
}
@Internal

View file

@ -138,10 +138,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
@DBAnnotatedColumn(STORAGE_COLUMN_NAME)
static DBObjectColumn STORAGE_COLUMN;
@DBAnnotatedField(
column = STORAGE_COLUMN_NAME,
indexed = true,
codec = VariableStorageDBFieldCodec.class)
@DBAnnotatedField(column = STORAGE_COLUMN_NAME, indexed = true, codec = VariableStorageDBFieldCodec.class)
private VariableStorage storage;
protected final DBTraceSymbolManager manager;
@ -241,8 +238,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
public DBTraceSymbolManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTraceDataTypeManager dataTypeManager,
DBTraceOverlaySpaceAdapter overlayAdapter)
throws VersionException, IOException {
DBTraceOverlaySpaceAdapter overlayAdapter) throws VersionException, IOException {
this.trace = trace;
this.lock = lock;
this.threadManager = threadManager;
@ -278,8 +274,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
allNamespaces = new DBTraceSymbolMultipleTypesView<>(this, namespaces, classes);
uniqueNamespaces =
new DBTraceSymbolMultipleTypesNoDuplicatesView<>(this, namespaces, classes);
notLabels =
new DBTraceSymbolMultipleTypesNoDuplicatesView<>(this, namespaces, classes);
notLabels = new DBTraceSymbolMultipleTypesNoDuplicatesView<>(this, namespaces, classes);
allSymbols = new DBTraceSymbolMultipleTypesView<>(this, labels, namespaces, classes);
}
@ -357,7 +352,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
}
// Internal
public void replaceDataTypes(long oldID, long newID) {
public void replaceDataTypes(Map<Long, Long> dataTypeReplacementMap) {
// Would apply to functions and variables, but those are not supported.
}
@ -521,9 +516,8 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
delID(thread, symbol.getAddress().getAddressSpace(), symbol.getID());
}
// TODO: Remove from other space maps, once implemented.
trace.setChanged(
new TraceChangeRecord<>(TraceSymbolChangeType.DELETED, symbol.getSpace(), symbol, null,
null));
trace.setChanged(new TraceChangeRecord<>(TraceSymbolChangeType.DELETED, symbol.getSpace(),
symbol, null, null));
return true;
}
@ -593,9 +587,9 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
Collection<Long> result = new ArrayList<>();
for (DBTraceAddressSnapRangePropertyMapSpace<Long, DBTraceSymbolIDEntry> space : idMap
.getActiveMemorySpaces()) {
result.addAll(space
.reduce(TraceAddressSnapRangeQuery.added(from, to, space.getAddressSpace()))
.values());
result.addAll(
space.reduce(TraceAddressSnapRangeQuery.added(from, to, space.getAddressSpace()))
.values());
}
return result;
}
@ -608,9 +602,9 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
Collection<Long> result = new ArrayList<>();
for (DBTraceAddressSnapRangePropertyMapSpace<Long, DBTraceSymbolIDEntry> space : idMap
.getActiveMemorySpaces()) {
result.addAll(space
.reduce(TraceAddressSnapRangeQuery.removed(from, to, space.getAddressSpace()))
.values());
result.addAll(
space.reduce(TraceAddressSnapRangeQuery.removed(from, to, space.getAddressSpace()))
.values());
}
return result;
}