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;
import ghidra.app.util.importer.MessageLog;
import ghidra.program.model.data.DataTypeConflictHandler;
import ghidra.program.model.data.EnumDataType;
import ghidra.program.model.symbol.SymbolUtilities;
import ghidra.util.exception.CancelledException;
@ -65,7 +66,9 @@ class ApplyEnums {
xmlParser.next();//member end element
}
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() {
addDataType(new TypedefDataType("wchar", WideCharDataType.dataType));
cachePrimitiveDataType(new TypedefDataType("wchar", WideCharDataType.dataType));
addDataType(new TypedefDataType("__int8",
cachePrimitiveDataType(new TypedefDataType("__int8",
AbstractIntegerDataType.getSignedDataType(1, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint8",
cachePrimitiveDataType(new TypedefDataType("__uint8",
AbstractIntegerDataType.getUnsignedDataType(1, programDataTypeMgr)));
addDataType(new TypedefDataType("__int16",
cachePrimitiveDataType(new TypedefDataType("__int16",
AbstractIntegerDataType.getSignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint16",
cachePrimitiveDataType(new TypedefDataType("__uint16",
AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__int32",
cachePrimitiveDataType(new TypedefDataType("__int32",
AbstractIntegerDataType.getSignedDataType(4, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint32",
cachePrimitiveDataType(new TypedefDataType("__uint32",
AbstractIntegerDataType.getUnsignedDataType(2, programDataTypeMgr)));
addDataType(new TypedefDataType("__int64",
cachePrimitiveDataType(new TypedefDataType("__int64",
AbstractIntegerDataType.getSignedDataType(8, programDataTypeMgr)));
addDataType(new TypedefDataType("__uint64",
cachePrimitiveDataType(new TypedefDataType("__uint64",
AbstractIntegerDataType.getUnsignedDataType(8, programDataTypeMgr)));
}
@ -125,33 +125,8 @@ class PdbDataTypeParser {
dataTypeCache.put(key, dataType);
}
void addDataType(DataType 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
}
}
}
void cachePrimitiveDataType(DataType dataType) {
dataTypeCache.put(dataType.getName(), dataType);
}
private DataType findDataTypeInArchives(String datatype, TaskMonitor monitor)

View file

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