diff --git a/lib/Model/Importer/Binary/ELFImporter.cpp b/lib/Model/Importer/Binary/ELFImporter.cpp index a06e24579..f536a80bc 100644 --- a/lib/Model/Importer/Binary/ELFImporter.cpp +++ b/lib/Model/Importer/Binary/ELFImporter.cpp @@ -167,7 +167,7 @@ uint64_t symbolsCount(const FilePortion &Relocations) { template Error ELFImporter::import(const ImporterOptions &Options) { revng_log(ELFImporterLog, "Starting ELF import"); - llvm::Task Task(12, "Import ELF"); + llvm::Task Task(13, "Import ELF"); Task.advance("Parse ELF", true); // Parse the ELF file @@ -425,6 +425,9 @@ Error ELFImporter::import(const ImporterOptions &Options) { findMissingTypes(TheELF, AdjustedOptions); } + Task.advance("Flatten primitive typedefs", true); + model::flattenPrimitiveTypedefs(Model); + Task.advance("Deduplicate colliding names", true); model::deduplicateCollidingNames(Model); @@ -538,6 +541,7 @@ void ELFImporter::findMissingTypes(object::ELFFile &TheELF, Model.evictCachedReferences(); Model.initializeReferences(); + model::flattenPrimitiveTypedefs(Model); deduplicateEquivalentTypes(Model); model::deduplicateCollidingNames(Model); } diff --git a/lib/Model/Importer/Binary/MachOImporter.cpp b/lib/Model/Importer/Binary/MachOImporter.cpp index 5780426ba..b20b66130 100644 --- a/lib/Model/Importer/Binary/MachOImporter.cpp +++ b/lib/Model/Importer/Binary/MachOImporter.cpp @@ -13,6 +13,7 @@ #include "revng/Model/Importer/Binary/BinaryImporterHelper.h" #include "revng/Model/Importer/Binary/Options.h" #include "revng/Model/Pass/DeduplicateCollidingNames.h" +#include "revng/Model/Pass/FlattenPrimitiveTypedefs.h" #include "revng/Model/RawBinaryView.h" #include "revng/Support/Debug.h" #include "revng/Support/FunctionTags.h" @@ -298,6 +299,7 @@ Error MachOImporter::import() { if (TheError) revng_log(Log, "Error while decoding weakBindTable: " << TheError); + model::flattenPrimitiveTypedefs(Model); model::deduplicateCollidingNames(Model); return Error::success(); } diff --git a/lib/Model/Importer/Binary/PECOFFImporter.cpp b/lib/Model/Importer/Binary/PECOFFImporter.cpp index 9ce79273b..b92738f89 100644 --- a/lib/Model/Importer/Binary/PECOFFImporter.cpp +++ b/lib/Model/Importer/Binary/PECOFFImporter.cpp @@ -498,6 +498,7 @@ void PECOFFImporter::findMissingTypes(const ImporterOptions &Opts) { Model.evictCachedReferences(); Model.initializeReferences(); + model::flattenPrimitiveTypedefs(Model); deduplicateEquivalentTypes(Model); model::deduplicateCollidingNames(Model); } @@ -539,6 +540,7 @@ Error PECOFFImporter::import(const ImporterOptions &Options) { findMissingTypes(Options); } + model::flattenPrimitiveTypedefs(Model); model::deduplicateCollidingNames(Model); return Error::success(); } diff --git a/lib/Model/Importer/DebugInfo/DwarfImporter.cpp b/lib/Model/Importer/DebugInfo/DwarfImporter.cpp index 8215e9f7b..50912a6bb 100644 --- a/lib/Model/Importer/DebugInfo/DwarfImporter.cpp +++ b/lib/Model/Importer/DebugInfo/DwarfImporter.cpp @@ -924,7 +924,7 @@ private: public: void run() { - Task T(9, "Importing DWARF"); + Task T(10, "Importing DWARF"); T.advance("Materialize types with an identity", true); materializeTypesWithIdentity(); T.advance("Resolve types", true); @@ -935,6 +935,8 @@ public: purgeUnresolvedPlaceholders(); T.advance("Remove types that couldn't be imported fully", true); purgeInvalidTypes(Model); + T.advance("Flatten primitive typedefs", true); + model::flattenPrimitiveTypedefs(Model); T.advance("Deduplicate equivalent types", true); deduplicateEquivalentTypes(Model); T.advance("Deduplicate colliding names", true); diff --git a/lib/Model/Importer/DebugInfo/PDBImporter.cpp b/lib/Model/Importer/DebugInfo/PDBImporter.cpp index b9f5003fa..2d9147c2b 100644 --- a/lib/Model/Importer/DebugInfo/PDBImporter.cpp +++ b/lib/Model/Importer/DebugInfo/PDBImporter.cpp @@ -288,6 +288,7 @@ void PDBImporterImpl::run(NativeSession &Session) { populateSymbolsWithTypes(Session); TupleTree &Model = Importer.getModel(); + model::flattenPrimitiveTypedefs(Model); deduplicateEquivalentTypes(Model); model::deduplicateCollidingNames(Model); purgeUnreachableTypes(Model); diff --git a/lib/Model/Importer/WellKnownModels.cpp b/lib/Model/Importer/WellKnownModels.cpp index f96b88193..f9fe04267 100644 --- a/lib/Model/Importer/WellKnownModels.cpp +++ b/lib/Model/Importer/WellKnownModels.cpp @@ -7,6 +7,7 @@ #include "revng/Model/Binary.h" #include "revng/Model/Importer/TypeCopier.h" #include "revng/Model/Pass/DeduplicateCollidingNames.h" +#include "revng/Model/Pass/FlattenPrimitiveTypedefs.h" #include "revng/Pipeline/RegisterAnalysis.h" #include "revng/Pipes/ModelGlobal.h" #include "revng/Support/ResourceFinder.h" @@ -103,6 +104,7 @@ public: for (auto &WLF : WellKnownModels) WLF->Copier.finalize(); + model::flattenPrimitiveTypedefs(Model); model::deduplicateCollidingNames(Model); return llvm::Error::success(); diff --git a/python/revng/internal/cli/_commands/import_idb.py b/python/revng/internal/cli/_commands/import_idb.py index 185c084c9..ca25c0890 100644 --- a/python/revng/internal/cli/_commands/import_idb.py +++ b/python/revng/internal/cli/_commands/import_idb.py @@ -75,6 +75,18 @@ class ImportIDBCommand(Command): options, ) + run_revng_command( + [ + "model", + "opt", + "-flatten-primitive-typedefs", + model_file.name, + "-o", + model_file.name, + ], + options, + ) + run_revng_command( [ "model",