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
26namespace llvm {
27template <typename Info> class OnDiskChainedHashTable;
28template <typename Info> class OnDiskIterableChainedHashTable;
29}
30
31namespace clang {
32
33class FileEntry;
34class DeclContext;
35class Module;
36
37namespace serialization {
38
39namespace reader {
40  class ASTDeclContextNameLookupTrait;
41}
42
43/// \brief Specifies the kind of module that has been loaded.
44enum 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.
52struct 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.
65class InputFile {
66  enum {
67    Overridden = 1,
68    OutOfDate = 2,
69    NotFound = 3
70  };
71  llvm::PointerIntPair<const FileEntry *, 2, unsigned> Val;
72
73public:
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.
106class ModuleFile {
107public:
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