mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-4252 handle bulk datatype replacements more efficiently
This commit is contained in:
parent
e15e12b248
commit
9dce76ae53
11 changed files with 128 additions and 113 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue