Home | History | Annotate | Download | only in Serialization
      1 //===--- Module.h - Module description --------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the Module class, which describes a module that has
     11 //  been loaded from an AST file.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_CLANG_SERIALIZATION_MODULE_H
     16 #define LLVM_CLANG_SERIALIZATION_MODULE_H
     17 
     18 #include "clang/Basic/SourceLocation.h"
     19 #include "clang/Serialization/ASTBitCodes.h"
     20 #include "clang/Serialization/ContinuousRangeMap.h"
     21 #include "llvm/ADT/SetVector.h"
     22 #include "llvm/Bitcode/BitstreamReader.h"
     23 #include <memory>
     24 #include <string>
     25 
     26 namespace llvm {
     27 template <typename Info> class OnDiskChainedHashTable;
     28 template <typename Info> class OnDiskIterableChainedHashTable;
     29 }
     30 
     31 namespace clang {
     32 
     33 class FileEntry;
     34 class DeclContext;
     35 class Module;
     36 
     37 namespace serialization {
     38 
     39 namespace reader {
     40   class ASTDeclContextNameLookupTrait;
     41 }
     42 
     43 /// \brief Specifies the kind of module that has been loaded.
     44 enum ModuleKind {
     45   MK_Module,   ///< File is a module proper.
     46   MK_PCH,      ///< File is a PCH file treated as such.
     47   MK_Preamble, ///< File is a PCH file treated as the preamble.
     48   MK_MainFile  ///< File is a PCH file treated as the actual main file.
     49 };
     50 
     51 /// \brief Information about the contents of a DeclContext.
     52 struct DeclContextInfo {
     53   DeclContextInfo()
     54     : NameLookupTableData(), LexicalDecls(), NumLexicalDecls() {}
     55 
     56   llvm::OnDiskIterableChainedHashTable<reader::ASTDeclContextNameLookupTrait>
     57     *NameLookupTableData; // an ASTDeclContextNameLookupTable.
     58   const KindDeclIDPair *LexicalDecls;
     59   unsigned NumLexicalDecls;
     60 };
     61 
     62 /// \brief The input file that has been loaded from this AST file, along with
     63 /// bools indicating whether this was an overridden buffer or if it was
     64 /// out-of-date or not-found.
     65 class InputFile {
     66   enum {
     67     Overridden = 1,
     68     OutOfDate = 2,
     69     NotFound = 3
     70   };
     71   llvm::PointerIntPair<const FileEntry *, 2, unsigned> Val;
     72 
     73 public:
     74   InputFile() {}
     75   InputFile(const FileEntry *File,
     76             bool isOverridden = false, bool isOutOfDate = false) {
     77     assert(!(isOverridden && isOutOfDate) &&
     78            "an overridden cannot be out-of-date");
     79     unsigned intVal = 0;
     80     if (isOverridden)
     81       intVal = Overridden;
     82     else if (isOutOfDate)
     83       intVal = OutOfDate;
     84     Val.setPointerAndInt(File, intVal);
     85   }
     86 
     87   static InputFile getNotFound() {
     88     InputFile File;
     89     File.Val.setInt(NotFound);
     90     return File;
     91   }
     92 
     93   const FileEntry *getFile() const { return Val.getPointer(); }
     94   bool isOverridden() const { return Val.getInt() == Overridden; }
     95   bool isOutOfDate() const { return Val.getInt() == OutOfDate; }
     96   bool isNotFound() const { return Val.getInt() == NotFound; }
     97 };
     98 
     99 /// \brief Information about a module that has been loaded by the ASTReader.
    100 ///
    101 /// Each instance of the Module class corresponds to a single AST file, which
    102 /// may be a precompiled header, precompiled preamble, a module, or an AST file
    103 /// of some sort loaded as the main file, all of which are specific formulations
    104 /// of the general notion of a "module". A module may depend on any number of
    105 /// other modules.
    106 class ModuleFile {
    107 public:
    108   ModuleFile(ModuleKind Kind, unsigned Generation);
    109   ~ModuleFile();
    110 
    111   // === General information ===
    112 
    113   /// \brief The index of this module in the list of modules.
    114   unsigned Index;
    115 
    116   /// \brief The type of this module.
    117   ModuleKind Kind;
    118 
    119   /// \brief The file name of the module file.
    120   std::string FileName;
    121 
    122   /// \brief The name of the module.
    123   std::string ModuleName;
    124 
    125   std::string getTimestampFilename() const {
    126     return FileName + ".timestamp";
    127   }
    128 
    129   /// \brief The original source file name that was used to build the
    130   /// primary AST file, which may have been modified for
    131   /// relocatable-pch support.
    132   std::string OriginalSourceFileName;
    133 
    134   /// \brief The actual original source file name that was used to
    135   /// build this AST file.
    136   std::string ActualOriginalSourceFileName;
    137 
    138   /// \brief The file ID for the original source file that was used to
    139   /// build this AST file.
    140   FileID OriginalSourceFileID;
    141 
    142   /// \brief The directory that the PCH was originally created in. Used to
    143   /// allow resolving headers even after headers+PCH was moved to a new path.
    144   std::string OriginalDir;
    145 
    146   std::string ModuleMapPath;
    147 
    148   /// \brief Whether this precompiled header is a relocatable PCH file.
    149   bool RelocatablePCH;
    150 
    151   /// \brief The file entry for the module file.
    152   const FileEntry *File;
    153 
    154   /// \brief Whether this module has been directly imported by the
    155   /// user.
    156   bool DirectlyImported;
    157 
    158   /// \brief The generation of which this module file is a part.
    159   unsigned Generation;
    160 
    161   /// \brief The memory buffer that stores the data associated with
    162   /// this AST file.
    163   std::unique_ptr<llvm::MemoryBuffer> Buffer;
    164 
    165   /// \brief The size of this file, in bits.
    166   uint64_t SizeInBits;
    167 
    168   /// \brief The global bit offset (or base) of this module
    169   uint64_t GlobalBitOffset;
    170 
    171   /// \brief The bitstream reader from which we'll read the AST file.
    172   llvm::BitstreamReader StreamFile;
    173 
    174   /// \brief The main bitstream cursor for the main block.
    175   llvm::BitstreamCursor Stream;
    176 
    177   /// \brief The source location where the module was explicitly or implicitly
    178   /// imported in the local translation unit.
    179   ///
    180   /// If module A depends on and imports module B, both modules will have the
    181   /// same DirectImportLoc, but different ImportLoc (B's ImportLoc will be a
    182   /// source location inside module A).
    183   ///
    184   /// WARNING: This is largely useless. It doesn't tell you when a module was
    185   /// made visible, just when the first submodule of that module was imported.
    186   SourceLocation DirectImportLoc;
    187 
    188   /// \brief The source location where this module was first imported.
    189   SourceLocation ImportLoc;
    190 
    191   /// \brief The first source location in this module.
    192   SourceLocation FirstLoc;
    193 
    194   // === Input Files ===
    195   /// \brief The cursor to the start of the input-files block.
    196   llvm::BitstreamCursor InputFilesCursor;
    197 
    198   /// \brief Offsets for all of the input file entries in the AST file.
    199   const uint32_t *InputFileOffsets;
    200 
    201   /// \brief The input files that have been loaded from this AST file.
    202   std::vector<InputFile> InputFilesLoaded;
    203 
    204   /// \brief If non-zero, specifies the time when we last validated input
    205   /// files.  Zero means we never validated them.
    206   ///
    207   /// The time is specified in seconds since the start of the Epoch.
    208   uint64_t InputFilesValidationTimestamp;
    209 
    210   // === Source Locations ===
    211 
    212   /// \brief Cursor used to read source location entries.
    213   llvm::BitstreamCursor SLocEntryCursor;
    214 
    215   /// \brief The number of source location entries in this AST file.
    216   unsigned LocalNumSLocEntries;
    217 
    218   /// \brief The base ID in the source manager's view of this module.
    219   int SLocEntryBaseID;
    220 
    221   /// \brief The base offset in the source manager's view of this module.
    222   unsigned SLocEntryBaseOffset;
    223 
    224   /// \brief Offsets for all of the source location entries in the
    225   /// AST file.
    226   const uint32_t *SLocEntryOffsets;
    227 
    228   /// \brief SLocEntries that we're going to preload.
    229   SmallVector<uint64_t, 4> PreloadSLocEntries;
    230 
    231   /// \brief Remapping table for source locations in this module.
    232   ContinuousRangeMap<uint32_t, int, 2> SLocRemap;
    233 
    234   // === Identifiers ===
    235 
    236   /// \brief The number of identifiers in this AST file.
    237   unsigned LocalNumIdentifiers;
    238 
    239   /// \brief Offsets into the identifier table data.
    240   ///
    241   /// This array is indexed by the identifier ID (-1), and provides
    242   /// the offset into IdentifierTableData where the string data is
    243   /// stored.
    244   const uint32_t *IdentifierOffsets;
    245 
    246   /// \brief Base identifier ID for identifiers local to this module.
    247   serialization::IdentID BaseIdentifierID;
    248 
    249   /// \brief Remapping table for identifier IDs in this module.
    250   ContinuousRangeMap<uint32_t, int, 2> IdentifierRemap;
    251 
    252   /// \brief Actual data for the on-disk hash table of identifiers.
    253   ///
    254   /// This pointer points into a memory buffer, where the on-disk hash
    255   /// table for identifiers actually lives.
    256   const char *IdentifierTableData;
    257 
    258   /// \brief A pointer to an on-disk hash table of opaque type
    259   /// IdentifierHashTable.
    260   void *IdentifierLookupTable;
    261 
    262   // === Macros ===
    263 
    264   /// \brief The cursor to the start of the preprocessor block, which stores
    265   /// all of the macro definitions.
    266   llvm::BitstreamCursor MacroCursor;
    267 
    268   /// \brief The number of macros in this AST file.
    269   unsigned LocalNumMacros;
    270 
    271   /// \brief Offsets of macros in the preprocessor block.
    272   ///
    273   /// This array is indexed by the macro ID (-1), and provides
    274   /// the offset into the preprocessor block where macro definitions are
    275   /// stored.
    276   const uint32_t *MacroOffsets;
    277 
    278   /// \brief Base macro ID for macros local to this module.
    279   serialization::MacroID BaseMacroID;
    280 
    281   /// \brief Remapping table for macro IDs in this module.
    282   ContinuousRangeMap<uint32_t, int, 2> MacroRemap;
    283 
    284   /// \brief The offset of the start of the set of defined macros.
    285   uint64_t MacroStartOffset;
    286 
    287   // === Detailed PreprocessingRecord ===
    288 
    289   /// \brief The cursor to the start of the (optional) detailed preprocessing
    290   /// record block.
    291   llvm::BitstreamCursor PreprocessorDetailCursor;
    292 
    293   /// \brief The offset of the start of the preprocessor detail cursor.
    294   uint64_t PreprocessorDetailStartOffset;
    295 
    296   /// \brief Base preprocessed entity ID for preprocessed entities local to
    297   /// this module.
    298   serialization::PreprocessedEntityID BasePreprocessedEntityID;
    299 
    300   /// \brief Remapping table for preprocessed entity IDs in this module.
    301   ContinuousRangeMap<uint32_t, int, 2> PreprocessedEntityRemap;
    302 
    303   const PPEntityOffset *PreprocessedEntityOffsets;
    304   unsigned NumPreprocessedEntities;
    305 
    306   // === Header search information ===
    307 
    308   /// \brief The number of local HeaderFileInfo structures.
    309   unsigned LocalNumHeaderFileInfos;
    310 
    311   /// \brief Actual data for the on-disk hash table of header file
    312   /// information.
    313   ///
    314   /// This pointer points into a memory buffer, where the on-disk hash
    315   /// table for header file information actually lives.
    316   const char *HeaderFileInfoTableData;
    317 
    318   /// \brief The on-disk hash table that contains information about each of
    319   /// the header files.
    320   void *HeaderFileInfoTable;
    321 
    322   // === Submodule information ===
    323   /// \brief The number of submodules in this module.
    324   unsigned LocalNumSubmodules;
    325 
    326   /// \brief Base submodule ID for submodules local to this module.
    327   serialization::SubmoduleID BaseSubmoduleID;
    328 
    329   /// \brief Remapping table for submodule IDs in this module.
    330   ContinuousRangeMap<uint32_t, int, 2> SubmoduleRemap;
    331 
    332   // === Selectors ===
    333 
    334   /// \brief The number of selectors new to this file.
    335   ///
    336   /// This is the number of entries in SelectorOffsets.
    337   unsigned LocalNumSelectors;
    338 
    339   /// \brief Offsets into the selector lookup table's data array
    340   /// where each selector resides.
    341   const uint32_t *SelectorOffsets;
    342 
    343   /// \brief Base selector ID for selectors local to this module.
    344   serialization::SelectorID BaseSelectorID;
    345 
    346   /// \brief Remapping table for selector IDs in this module.
    347   ContinuousRangeMap<uint32_t, int, 2> SelectorRemap;
    348 
    349   /// \brief A pointer to the character data that comprises the selector table
    350   ///
    351   /// The SelectorOffsets table refers into this memory.
    352   const unsigned char *SelectorLookupTableData;
    353 
    354   /// \brief A pointer to an on-disk hash table of opaque type
    355   /// ASTSelectorLookupTable.
    356   ///
    357   /// This hash table provides the IDs of all selectors, and the associated
    358   /// instance and factory methods.
    359   void *SelectorLookupTable;
    360 
    361   // === Declarations ===
    362 
    363   /// DeclsCursor - This is a cursor to the start of the DECLS_BLOCK block. It
    364   /// has read all the abbreviations at the start of the block and is ready to
    365   /// jump around with these in context.
    366   llvm::BitstreamCursor DeclsCursor;
    367 
    368   /// \brief The number of declarations in this AST file.
    369   unsigned LocalNumDecls;
    370 
    371   /// \brief Offset of each declaration within the bitstream, indexed
    372   /// by the declaration ID (-1).
    373   const DeclOffset *DeclOffsets;
    374 
    375   /// \brief Base declaration ID for declarations local to this module.
    376   serialization::DeclID BaseDeclID;
    377 
    378   /// \brief Remapping table for declaration IDs in this module.
    379   ContinuousRangeMap<uint32_t, int, 2> DeclRemap;
    380 
    381   /// \brief Mapping from the module files that this module file depends on
    382   /// to the base declaration ID for that module as it is understood within this
    383   /// module.
    384   ///
    385   /// This is effectively a reverse global-to-local mapping for declaration
    386   /// IDs, so that we can interpret a true global ID (for this translation unit)
    387   /// as a local ID (for this module file).
    388   llvm::DenseMap<ModuleFile *, serialization::DeclID> GlobalToLocalDeclIDs;
    389 
    390   /// \brief The number of C++ base specifier sets in this AST file.
    391   unsigned LocalNumCXXBaseSpecifiers;
    392 
    393   /// \brief Offset of each C++ base specifier set within the bitstream,
    394   /// indexed by the C++ base specifier set ID (-1).
    395   const uint32_t *CXXBaseSpecifiersOffsets;
    396 
    397   typedef llvm::DenseMap<const DeclContext *, DeclContextInfo>
    398   DeclContextInfosMap;
    399 
    400   /// \brief Information about the lexical and visible declarations
    401   /// for each DeclContext.
    402   DeclContextInfosMap DeclContextInfos;
    403 
    404   /// \brief Array of file-level DeclIDs sorted by file.
    405   const serialization::DeclID *FileSortedDecls;
    406   unsigned NumFileSortedDecls;
    407 
    408   /// \brief Array of redeclaration chain location information within this
    409   /// module file, sorted by the first declaration ID.
    410   const serialization::LocalRedeclarationsInfo *RedeclarationsMap;
    411 
    412   /// \brief The number of redeclaration info entries in RedeclarationsMap.
    413   unsigned LocalNumRedeclarationsInMap;
    414 
    415   /// \brief The redeclaration chains for declarations local to this
    416   /// module file.
    417   SmallVector<uint64_t, 1> RedeclarationChains;
    418 
    419   /// \brief Array of category list location information within this
    420   /// module file, sorted by the definition ID.
    421   const serialization::ObjCCategoriesInfo *ObjCCategoriesMap;
    422 
    423   /// \brief The number of redeclaration info entries in ObjCCategoriesMap.
    424   unsigned LocalNumObjCCategoriesInMap;
    425 
    426   /// \brief The Objective-C category lists for categories known to this
    427   /// module.
    428   SmallVector<uint64_t, 1> ObjCCategories;
    429 
    430   // === Types ===
    431 
    432   /// \brief The number of types in this AST file.
    433   unsigned LocalNumTypes;
    434 
    435   /// \brief Offset of each type within the bitstream, indexed by the
    436   /// type ID, or the representation of a Type*.
    437   const uint32_t *TypeOffsets;
    438 
    439   /// \brief Base type ID for types local to this module as represented in
    440   /// the global type ID space.
    441   serialization::TypeID BaseTypeIndex;
    442 
    443   /// \brief Remapping table for type IDs in this module.
    444   ContinuousRangeMap<uint32_t, int, 2> TypeRemap;
    445 
    446   // === Miscellaneous ===
    447 
    448   /// \brief Diagnostic IDs and their mappings that the user changed.
    449   SmallVector<uint64_t, 8> PragmaDiagMappings;
    450 
    451   /// \brief List of modules which depend on this module
    452   llvm::SetVector<ModuleFile *> ImportedBy;
    453 
    454   /// \brief List of modules which this module depends on
    455   llvm::SetVector<ModuleFile *> Imports;
    456 
    457   /// \brief Determine whether this module was directly imported at
    458   /// any point during translation.
    459   bool isDirectlyImported() const { return DirectlyImported; }
    460 
    461   /// \brief Dump debugging output for this module.
    462   void dump();
    463 };
    464 
    465 } // end namespace serialization
    466 
    467 } // end namespace clang
    468 
    469 #endif
    470