Merge remote-tracking branch 'origin/GT-3558_dev747368_pdb_apply_enums'

This commit is contained in:
ghidorahrex 2020-02-24 13:45:35 -05:00
commit 2a155e105b
3 changed files with 15 additions and 41 deletions

View file

@ -16,6 +16,7 @@
package ghidra.app.util.bin.format.pdb; package ghidra.app.util.bin.format.pdb;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.program.model.data.DataTypeConflictHandler;
import ghidra.program.model.data.EnumDataType; import ghidra.program.model.data.EnumDataType;
import ghidra.program.model.symbol.SymbolUtilities; import ghidra.program.model.symbol.SymbolUtilities;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
@ -65,7 +66,9 @@ class ApplyEnums {
xmlParser.next();//member end element xmlParser.next();//member end element
} }
pdbParser.cacheDataType(name, enumdt); // cache with namespace-based name pdbParser.cacheDataType(name, enumdt); // cache with namespace-based name
pdbParser.addDataType(enumdt); pdbParser.getProgramDataTypeManager()
.resolve(enumdt,
DataTypeConflictHandler.REPLACE_EMPTY_STRUCTS_OR_RENAME_AND_ADD_HANDLER);
} }
} }

View file

@ -48,26 +48,26 @@ class PdbDataTypeParser {
private void createMandatoryDataTypes() { private void createMandatoryDataTypes() {
addDataType(new TypedefDataType("wchar", WideCharDataType.dataType)); cachePrimitiveDataType(new TypedefDataType("wchar", WideCharDataType.dataType));
addDataType(new TypedefDataType("__int8", cachePrimitiveDataType(new TypedefDataType("__int8",
AbstractIntegerDataType.getSignedDataType(1, programDataTypeMgr))); AbstractIntegerDataType.getSignedDataType(1, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint8", cachePrimitiveDataType(new TypedefDataType("__uint8",
AbstractIntegerDataType.getUnsignedDataType(1, programDataTypeMgr))); AbstractIntegerDataType.getUnsignedDataType(1, programDataTypeMgr)));
addDataType(new TypedefDataType("__int16", cachePrimitiveDataType(new TypedefDataType("__int16",
AbstractIntegerDataType.getSignedDataType(2, programDataTypeMgr))); AbstractIntegerDataType.getSignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint16", cachePrimitiveDataType(new TypedefDataType("__uint16",
AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr))); AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__int32", cachePrimitiveDataType(new TypedefDataType("__int32",
AbstractIntegerDataType.getSignedDataType(4, programDataTypeMgr))); AbstractIntegerDataType.getSignedDataType(4, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint32", cachePrimitiveDataType(new TypedefDataType("__uint32",
AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr))); AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__int64", cachePrimitiveDataType(new TypedefDataType("__int64",
AbstractIntegerDataType.getSignedDataType(8, programDataTypeMgr))); AbstractIntegerDataType.getSignedDataType(8, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint64", cachePrimitiveDataType(new TypedefDataType("__uint64",
AbstractIntegerDataType.getUnsignedDataType(8, programDataTypeMgr))); AbstractIntegerDataType.getUnsignedDataType(8, programDataTypeMgr)));
} }
@ -125,33 +125,8 @@ class PdbDataTypeParser {
dataTypeCache.put(key, dataType); dataTypeCache.put(key, dataType);
} }
void addDataType(DataType dataType) { void cachePrimitiveDataType(DataType dataType) {
dataTypeCache.put(dataType.getName(), dataType);
if (dataType instanceof Composite) {
DataTypeComponent[] components = ((Composite) dataType).getComponents();
for (DataTypeComponent component : components) {
addDataType(component.getDataType());
}
}
ArrayList<DataType> oldDataTypeList = new ArrayList<>();
programDataTypeMgr.findDataTypes(dataType.getName(), oldDataTypeList);
dataType = programDataTypeMgr.addDataType(dataType,
DataTypeConflictHandler.REPLACE_EMPTY_STRUCTS_OR_RENAME_AND_ADD_HANDLER);
cacheDataType(dataType.getName(), dataType);
for (DataType oldDataType : oldDataTypeList) {
if (oldDataType.getLength() == 0 &&
oldDataType.getClass().equals(dataType.getClass())) {
try {
programDataTypeMgr.replaceDataType(oldDataType, dataType, false);
}
catch (DataTypeDependencyException e) {
// ignore
}
}
}
} }
private DataType findDataTypeInArchives(String datatype, TaskMonitor monitor) private DataType findDataTypeInArchives(String datatype, TaskMonitor monitor)

View file

@ -1351,10 +1351,6 @@ public class PdbParser {
return getDataTypeParser().getCachedDataType(name); return getDataTypeParser().getCachedDataType(name);
} }
void addDataType(DataType dataType) {
getDataTypeParser().addDataType(dataType);
}
WrappedDataType findDataType(String dataTypeName) throws CancelledException { WrappedDataType findDataType(String dataTypeName) throws CancelledException {
return getDataTypeParser().findDataType(dataTypeName); return getDataTypeParser().findDataType(dataTypeName);
} }