mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-0: Post-merge refactoring.
This commit is contained in:
parent
230a24e12c
commit
b779f318d6
6 changed files with 62 additions and 23 deletions
|
@ -15,11 +15,11 @@
|
||||||
*/
|
*/
|
||||||
package agent.dbgeng.model;
|
package agent.dbgeng.model;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import agent.dbgeng.model.invm.InVmDbgengModelHost;
|
|
||||||
import ghidra.dbg.target.*;
|
import ghidra.dbg.target.*;
|
||||||
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
import ghidra.dbg.target.TargetMethod.TargetParameterMap;
|
||||||
import ghidra.dbg.test.AbstractDebuggerModelAttacherTest;
|
import ghidra.dbg.test.AbstractDebuggerModelAttacherTest;
|
||||||
|
@ -28,13 +28,6 @@ import ghidra.dbg.util.PathUtils;
|
||||||
public abstract class AbstractModelForDbgengRootAttacherTest
|
public abstract class AbstractModelForDbgengRootAttacherTest
|
||||||
extends AbstractDebuggerModelAttacherTest {
|
extends AbstractDebuggerModelAttacherTest {
|
||||||
|
|
||||||
public class InVmModelForDbgengRootAttacherTest extends AbstractModelForDbgengRootAttacherTest {
|
|
||||||
@Override
|
|
||||||
public ModelHost modelHost() throws Throwable {
|
|
||||||
return new InVmDbgengModelHost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TargetObject findProcessContainer() throws Throwable {
|
protected TargetObject findProcessContainer() throws Throwable {
|
||||||
return m.findContainer(TargetProcess.class, PathUtils.parse("Sessions[0]"));
|
return m.findContainer(TargetProcess.class, PathUtils.parse("Sessions[0]"));
|
||||||
|
|
|
@ -29,8 +29,7 @@ import ghidra.trace.database.DBTraceUtils;
|
||||||
import ghidra.trace.database.symbol.*;
|
import ghidra.trace.database.symbol.*;
|
||||||
import ghidra.trace.model.symbol.*;
|
import ghidra.trace.model.symbol.*;
|
||||||
import ghidra.util.*;
|
import ghidra.util.*;
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.*;
|
||||||
import ghidra.util.exception.InvalidInputException;
|
|
||||||
|
|
||||||
public class DBTraceProgramViewSymbolTable implements SymbolTable {
|
public class DBTraceProgramViewSymbolTable implements SymbolTable {
|
||||||
|
|
||||||
|
@ -571,6 +570,47 @@ public class DBTraceProgramViewSymbolTable implements SymbolTable {
|
||||||
return symbolManager.namespaces().add(name, assertTraceNamespace(parent), source);
|
return symbolManager.namespaces().add(name, assertTraceNamespace(parent), source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Namespace getOrCreateNameSpace(Namespace parent, String name, SourceType source)
|
||||||
|
throws DuplicateNameException, InvalidInputException {
|
||||||
|
try (LockHold hold = program.trace.lockWrite()) {
|
||||||
|
Collection<? extends DBTraceNamespaceSymbol> exist =
|
||||||
|
symbolManager.namespaces().getNamed(name);
|
||||||
|
if (!exist.isEmpty()) {
|
||||||
|
return exist.iterator().next();
|
||||||
|
}
|
||||||
|
return createNameSpace(parent, name, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GhidraClass convertNamespaceToClass(Namespace namespace) {
|
||||||
|
if (namespace instanceof GhidraClass) {
|
||||||
|
return (GhidraClass) namespace;
|
||||||
|
}
|
||||||
|
try (LockHold hold = program.trace.lockWrite()) {
|
||||||
|
DBTraceNamespaceSymbol dbNamespace = symbolManager.assertIsMine(namespace);
|
||||||
|
|
||||||
|
String origName = dbNamespace.getName();
|
||||||
|
SourceType origSource = dbNamespace.getSource();
|
||||||
|
|
||||||
|
String tempName = origName + System.nanoTime();
|
||||||
|
DBTraceClassSymbol dbClass =
|
||||||
|
symbolManager.classes().add(tempName, dbNamespace.getParentNamespace(), origSource);
|
||||||
|
for (AbstractDBTraceSymbol child : dbNamespace.getChildren()) {
|
||||||
|
child.setNamespace(dbClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
dbNamespace.delete();
|
||||||
|
dbClass.setName(origName, origSource);
|
||||||
|
return dbClass;
|
||||||
|
}
|
||||||
|
catch (DuplicateNameException | InvalidInputException | IllegalArgumentException
|
||||||
|
| CircularDependencyException e) {
|
||||||
|
throw new AssertException("Unexpected exception creating class from namespace", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Symbol createSymbolPlaceholder(Address address, long id) {
|
public Symbol createSymbolPlaceholder(Address address, long id) {
|
||||||
return new DBTracePlaceholderSymbol(symbolManager, id);
|
return new DBTracePlaceholderSymbol(symbolManager, id);
|
||||||
|
|
|
@ -42,7 +42,7 @@ public class DBTraceFunctionStackFrame implements StackFrame, Unfinished {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected synchronized boolean checkIsValid() {
|
protected synchronized boolean checkIsValid() {
|
||||||
if (function.checkIsValid()) {
|
if (!function.isDeleted()) {
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
growsNegative = function.getTrace().getBaseCompilerSpec().stackGrowsNegative();
|
growsNegative = function.getTrace().getBaseCompilerSpec().stackGrowsNegative();
|
||||||
variables = function.getVariables(VariableFilter.COMPOUND_STACK_VARIABLE_FILTER);
|
variables = function.getVariables(VariableFilter.COMPOUND_STACK_VARIABLE_FILTER);
|
||||||
|
|
|
@ -326,7 +326,10 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
|
||||||
@DBAnnotatedColumn(STORAGE_COLUMN_NAME)
|
@DBAnnotatedColumn(STORAGE_COLUMN_NAME)
|
||||||
static DBObjectColumn STORAGE_COLUMN;
|
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;
|
private VariableStorage storage;
|
||||||
|
|
||||||
protected final DBTraceSymbolManager manager;
|
protected final DBTraceSymbolManager manager;
|
||||||
|
@ -642,7 +645,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
|
||||||
view.invalidateCache();
|
view.invalidateCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!globalNamespace.checkIsValid()) {
|
if (globalNamespace.isDeleted()) {
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -766,7 +769,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
|
||||||
if (dbns.manager != this) {
|
if (dbns.manager != this) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!dbns.checkIsValid()) {
|
if (dbns.isDeleted()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (namespaceStore.contains(dbns)) {
|
if (namespaceStore.contains(dbns)) {
|
||||||
|
@ -794,7 +797,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
|
||||||
if (dbSym.manager != this) {
|
if (dbSym.manager != this) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!dbSym.checkIsValid()) {
|
if (dbSym.isDeleted()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
long symbolID = dbSym.getID();
|
long symbolID = dbSym.getID();
|
||||||
|
@ -818,7 +821,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
|
||||||
if (dbFunc.manager != this) {
|
if (dbFunc.manager != this) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!dbFunc.checkIsValid()) {
|
if (dbFunc.isDeleted()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (functionStore.contains(dbFunc)) {
|
if (functionStore.contains(dbFunc)) {
|
||||||
|
|
|
@ -246,7 +246,7 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
|
||||||
obj.space1.deleteValue(entry1);
|
obj.space1.deleteValue(entry1);
|
||||||
assertEquals(0, obj.space1.size());
|
assertEquals(0, obj.space1.size());
|
||||||
assertTrue(obj.space1.isEmpty());
|
assertTrue(obj.space1.isEmpty());
|
||||||
assertFalse(entry1.checkIsValid());
|
assertTrue(entry1.isDeleted());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
obj.space1.deleteValue(entry2);
|
obj.space1.deleteValue(entry2);
|
||||||
|
@ -281,7 +281,7 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
|
||||||
|
|
||||||
assertTrue(obj.space1.remove(entry1));
|
assertTrue(obj.space1.remove(entry1));
|
||||||
assertTrue(obj.space1.isEmpty());
|
assertTrue(obj.space1.isEmpty());
|
||||||
assertFalse(entry1.getValue().checkIsValid());
|
assertTrue(entry1.getValue().isDeleted());
|
||||||
assertTrue(obj.space2.remove(entry1)); // TODO: Should match by shape?
|
assertTrue(obj.space2.remove(entry1)); // TODO: Should match by shape?
|
||||||
TODO();
|
TODO();
|
||||||
assertTrue(obj.space2.isEmpty());
|
assertTrue(obj.space2.isEmpty());
|
||||||
|
@ -358,10 +358,10 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
|
||||||
MyEntry entry1 =
|
MyEntry entry1 =
|
||||||
obj.space1.put(new ImmutableTraceAddressSnapRange(addr(0x1000), 5), null);
|
obj.space1.put(new ImmutableTraceAddressSnapRange(addr(0x1000), 5), null);
|
||||||
assertEquals(1, obj.space1.size());
|
assertEquals(1, obj.space1.size());
|
||||||
assertFalse(entry1.isInvalid());
|
assertFalse(entry1.isDeleted());
|
||||||
|
|
||||||
obj.space1.clear();
|
obj.space1.clear();
|
||||||
assertTrue(entry1.isInvalid());
|
assertTrue(entry1.isDeleted());
|
||||||
assertTrue(obj.space1.isEmpty());
|
assertTrue(obj.space1.isEmpty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,14 +19,13 @@ import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import db.DBRecord;
|
import db.DBRecord;
|
||||||
import db.util.ErrorHandler;
|
|
||||||
import ghidra.program.database.DatabaseObject;
|
import ghidra.program.database.DatabaseObject;
|
||||||
import ghidra.util.LockHold;
|
import ghidra.util.LockHold;
|
||||||
import ghidra.util.database.DBCachedObjectStoreFactory.DBFieldCodec;
|
import ghidra.util.database.DBCachedObjectStoreFactory.DBFieldCodec;
|
||||||
|
|
||||||
public class DBAnnotatedObject extends DatabaseObject {
|
public class DBAnnotatedObject extends DatabaseObject {
|
||||||
private final DBCachedObjectStore<?> store;
|
private final DBCachedObjectStore<?> store;
|
||||||
private final ErrorHandler adapter;
|
private final DBCachedDomainObjectAdapter adapter;
|
||||||
private final List<DBFieldCodec<?, ?, ?>> codecs;
|
private final List<DBFieldCodec<?, ?, ?>> codecs;
|
||||||
|
|
||||||
DBRecord record;
|
DBRecord record;
|
||||||
|
@ -187,4 +186,8 @@ public class DBAnnotatedObject extends DatabaseObject {
|
||||||
fresh(false);
|
fresh(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDeleted() {
|
||||||
|
return super.isDeleted(adapter.getLock());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue