#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "revng/ADT/RecursiveCoroutine.h" #include "revng/Model/Importer/Binary/BinaryImporterHelper.h" class DwarfImporter; class DwarfToModelConverter : public BinaryImporterHelper { private: DwarfImporter &Importer; TupleTree &Model; size_t Index; size_t AltIndex; size_t TypesWithIdentityCount; llvm::DWARFContext &Context; std::map Placeholders; std::set InvalidPrimitives; std::set InProgressDies; public: DwarfToModelConverter(DwarfImporter &Importer, llvm::DWARFContext &Context, size_t Index, size_t AltIndex, uint64_t PreferredBaseAddress); public: void run(); private: model::ABI::Values getABI(llvm::dwarf::CallingConvention CC = llvm::dwarf::DW_CC_normal) const; const model::UpcastableType &record(const llvm::DWARFDie &Die, model::UpcastableType &&Type); const model::UpcastableType &recordPlaceholder(const llvm::DWARFDie &Die, model::UpcastableType &&Type); enum class TypeSearchResult { Absent, PlaceholderType, RegularType }; std::pair findType(const llvm::DWARFDie &Die); private: static bool isType(llvm::dwarf::Tag Tag); static bool hasModelIdentity(llvm::dwarf::Tag Tag); void createInvalidPrimitivePlaceholder(const llvm::DWARFDie &Die); void createType(const llvm::DWARFDie &Die); void handleTypeDeclaration(const llvm::DWARFDie &Die); void materializeTypesWithIdentity(); std::string getName(const llvm::DWARFDie &Die) const; RecursiveCoroutine makeType(const llvm::DWARFDie &Die); RecursiveCoroutine makeTypeOrVoid(const llvm::DWARFDie &Die); RecursiveCoroutine resolveTypeWithIdentity(const llvm::DWARFDie &Die, model::UpcastableType &Type); RecursiveCoroutine resolveType(const llvm::DWARFDie &Die, bool ResolveIfHasIdentity); void resolveAllTypes(); model::UpcastableType getSubprogramPrototype(const llvm::DWARFDie &InitialDie); void createFunctions(); void purgeUnresolvedPlaceholders(); };