diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc index 32ede6b0f2..118bf74e9a 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc @@ -754,6 +754,23 @@ void TypeUnicode::encode(Encoder &encoder) const encoder.closeElement(ELEM_TYPE); } +/// Parse a \ element for the \b id attributes of the \b void data-type. +/// The \b void data-type is usually marshaled with the \ element, but this is an alternate +/// encoding that allows a specific id to be associated with the data-type when core data-types are specified. +/// \param decoder is the stream decoder +/// \param typegrp is the factory owning \b this data-type +void TypeVoid::decode(Decoder &decoder,TypeFactory &typegrp) + +{ + for(;;) { + uint4 attrib = decoder.getNextAttributeId(); + if (attrib == 0) break; + if (attrib == ATTRIB_ID) { + id = decoder.readUnsignedInteger(); + } + } +} + void TypeVoid::encode(Encoder &encoder) const { @@ -4070,6 +4087,13 @@ Datatype *TypeFactory::decodeTypeNoRef(Decoder &decoder,bool forcecore) case TYPE_CODE: ct = decodeCode(decoder,false, false, forcecore); break; + case TYPE_VOID: + { + TypeVoid voidType; + voidType.decode(decoder,*this); + ct = findAdd(voidType); + } + break; default: for(;;) { uint4 attribId = decoder.getNextAttributeId(); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/type.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/type.hh index cc385564f7..5e73969e02 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/type.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/type.hh @@ -326,6 +326,7 @@ public: class TypeVoid : public Datatype { protected: friend class TypeFactory; + void decode(Decoder &decoder,TypeFactory &typegrp); ///< Restore \b void data-type, with an id public: /// Construct from another TypeVoid TypeVoid(const TypeVoid &op) : Datatype(op) { flags |= Datatype::coretype; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java index 50f601cfd2..2207edb9e0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java @@ -1137,6 +1137,9 @@ public class PcodeDataTypeManager { TypeMap type = new TypeMap(DataType.DEFAULT, "undefined", "unknown", false, false, DEFAULT_DECOMPILER_ID); coreBuiltin.put(type.id, type); + type = new TypeMap(displayLanguage, VoidDataType.dataType, "void", false, false, + builtInDataTypes); + coreBuiltin.put(type.id, type); for (BuiltIn dt : Undefined.getUndefinedDataTypes()) { type = new TypeMap(displayLanguage, dt, "unknown", false, false, builtInDataTypes); @@ -1218,8 +1221,6 @@ public class PcodeDataTypeManager { */ public void encodeCoreTypes(Encoder encoder) throws IOException { encoder.openElement(ELEM_CORETYPES); - encoder.openElement(ELEM_VOID); - encoder.closeElement(ELEM_VOID); for (TypeMap typeMap : coreBuiltin.values()) { encoder.openElement(ELEM_TYPE);