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/Serialization/ASTBitCodes.h" 19 #include "clang/Serialization/ContinuousRangeMap.h" 20 #include "clang/Basic/SourceLocation.h" 21 #include "llvm/ADT/OwningPtr.h" 22 #include "llvm/ADT/SetVector.h" 23 #include "llvm/Bitcode/BitstreamReader.h" 24 #include <string> 25 26 namespace clang { 27 28 class DeclContext; 29 class Module; 30 template<typename Info> class OnDiskChainedHashTable; 31 32 namespace serialization { 33 34 namespace reader { 35 class ASTDeclContextNameLookupTrait; 36 } 37 38 /// \brief Specifies the kind of module that has been loaded. 39 enum ModuleKind { 40 MK_Module, ///< File is a module proper. 41 MK_PCH, ///< File is a PCH file treated as such. 42 MK_Preamble, ///< File is a PCH file treated as the preamble. 43 MK_MainFile ///< File is a PCH file treated as the actual main file. 44 }; 45 46 /// \brief Information about the contents of a DeclContext. 47 struct DeclContextInfo { DeclContextInfoDeclContextInfo48 DeclContextInfo() 49 : NameLookupTableData(), LexicalDecls(), NumLexicalDecls() {} 50 51 OnDiskChainedHashTable<reader::ASTDeclContextNameLookupTrait> 52 *NameLookupTableData; // an ASTDeclContextNameLookupTable. 53 const KindDeclIDPair *LexicalDecls; 54 unsigned NumLexicalDecls; 55 }; 56 57 /// \brief Information about a module that has been loaded by the ASTReader. 58 /// 59 /// Each instance of the Module class corresponds to a single AST file, which 60 /// may be a precompiled header, precompiled preamble, a module, or an AST file 61 /// of some sort loaded as the main file, all of which are specific formulations 62 /// of the general notion of a "module". A module may depend on any number of 63 /// other modules. 64 class ModuleFile { 65 public: 66 ModuleFile(ModuleKind Kind, unsigned Generation); 67 ~ModuleFile(); 68 69 // === General information === 70 71 /// \brief The type of this module. 72 ModuleKind Kind; 73 74 /// \brief The file name of the module file. 75 std::string FileName; 76 77 /// \brief Whether this module has been directly imported by the 78 /// user. 79 bool DirectlyImported; 80 81 /// \brief The generation of which this module file is a part. 82 unsigned Generation; 83 84 /// \brief The memory buffer that stores the data associated with 85 /// this AST file. 86 OwningPtr<llvm::MemoryBuffer> Buffer; 87 88 /// \brief The size of this file, in bits. 89 uint64_t SizeInBits; 90 91 /// \brief The global bit offset (or base) of this module 92 uint64_t GlobalBitOffset; 93 94 /// \brief The bitstream reader from which we'll read the AST file. 95 llvm::BitstreamReader StreamFile; 96 97 /// \brief The main bitstream cursor for the main block. 98 llvm::BitstreamCursor Stream; 99 100 /// \brief The source location where this module was first imported. 101 SourceLocation ImportLoc; 102 103 /// \brief The first source location in this module. 104 SourceLocation FirstLoc; 105 106 // === Source Locations === 107 108 /// \brief Cursor used to read source location entries. 109 llvm::BitstreamCursor SLocEntryCursor; 110 111 /// \brief The number of source location entries in this AST file. 112 unsigned LocalNumSLocEntries; 113 114 /// \brief The base ID in the source manager's view of this module. 115 int SLocEntryBaseID; 116 117 /// \brief The base offset in the source manager's view of this module. 118 unsigned SLocEntryBaseOffset; 119 120 /// \brief Offsets for all of the source location entries in the 121 /// AST file. 122 const uint32_t *SLocEntryOffsets; 123 124 /// \brief SLocEntries that we're going to preload. 125 SmallVector<uint64_t, 4> PreloadSLocEntries; 126 127 /// \brief The number of source location file entries in this AST file. 128 unsigned LocalNumSLocFileEntries; 129 130 /// \brief Offsets for all of the source location file entries in the 131 /// AST file. 132 const uint32_t *SLocFileOffsets; 133 134 /// \brief Remapping table for source locations in this module. 135 ContinuousRangeMap<uint32_t, int, 2> SLocRemap; 136 137 // === Identifiers === 138 139 /// \brief The number of identifiers in this AST file. 140 unsigned LocalNumIdentifiers; 141 142 /// \brief Offsets into the identifier table data. 143 /// 144 /// This array is indexed by the identifier ID (-1), and provides 145 /// the offset into IdentifierTableData where the string data is 146 /// stored. 147 const uint32_t *IdentifierOffsets; 148 149 /// \brief Base identifier ID for identifiers local to this module. 150 serialization::IdentID BaseIdentifierID; 151 152 /// \brief Remapping table for identifier IDs in this module. 153 ContinuousRangeMap<uint32_t, int, 2> IdentifierRemap; 154 155 /// \brief Actual data for the on-disk hash table of identifiers. 156 /// 157 /// This pointer points into a memory buffer, where the on-disk hash 158 /// table for identifiers actually lives. 159 const char *IdentifierTableData; 160 161 /// \brief A pointer to an on-disk hash table of opaque type 162 /// IdentifierHashTable. 163 void *IdentifierLookupTable; 164 165 // === Macros === 166 167 /// \brief The cursor to the start of the preprocessor block, which stores 168 /// all of the macro definitions. 169 llvm::BitstreamCursor MacroCursor; 170 171 /// \brief The offset of the start of the set of defined macros. 172 uint64_t MacroStartOffset; 173 174 // === Detailed PreprocessingRecord === 175 176 /// \brief The cursor to the start of the (optional) detailed preprocessing 177 /// record block. 178 llvm::BitstreamCursor PreprocessorDetailCursor; 179 180 /// \brief The offset of the start of the preprocessor detail cursor. 181 uint64_t PreprocessorDetailStartOffset; 182 183 /// \brief Base preprocessed entity ID for preprocessed entities local to 184 /// this module. 185 serialization::PreprocessedEntityID BasePreprocessedEntityID; 186 187 /// \brief Remapping table for preprocessed entity IDs in this module. 188 ContinuousRangeMap<uint32_t, int, 2> PreprocessedEntityRemap; 189 190 const PPEntityOffset *PreprocessedEntityOffsets; 191 unsigned NumPreprocessedEntities; 192 193 // === Header search information === 194 195 /// \brief The number of local HeaderFileInfo structures. 196 unsigned LocalNumHeaderFileInfos; 197 198 /// \brief Actual data for the on-disk hash table of header file 199 /// information. 200 /// 201 /// This pointer points into a memory buffer, where the on-disk hash 202 /// table for header file information actually lives. 203 const char *HeaderFileInfoTableData; 204 205 /// \brief The on-disk hash table that contains information about each of 206 /// the header files. 207 void *HeaderFileInfoTable; 208 209 /// \brief Actual data for the list of framework names used in the header 210 /// search information. 211 const char *HeaderFileFrameworkStrings; 212 213 // === Submodule information === 214 /// \brief The number of submodules in this module. 215 unsigned LocalNumSubmodules; 216 217 /// \brief Base submodule ID for submodules local to this module. 218 serialization::SubmoduleID BaseSubmoduleID; 219 220 /// \brief Remapping table for submodule IDs in this module. 221 ContinuousRangeMap<uint32_t, int, 2> SubmoduleRemap; 222 223 // === Selectors === 224 225 /// \brief The number of selectors new to this file. 226 /// 227 /// This is the number of entries in SelectorOffsets. 228 unsigned LocalNumSelectors; 229 230 /// \brief Offsets into the selector lookup table's data array 231 /// where each selector resides. 232 const uint32_t *SelectorOffsets; 233 234 /// \brief Base selector ID for selectors local to this module. 235 serialization::SelectorID BaseSelectorID; 236 237 /// \brief Remapping table for selector IDs in this module. 238 ContinuousRangeMap<uint32_t, int, 2> SelectorRemap; 239 240 /// \brief A pointer to the character data that comprises the selector table 241 /// 242 /// The SelectorOffsets table refers into this memory. 243 const unsigned char *SelectorLookupTableData; 244 245 /// \brief A pointer to an on-disk hash table of opaque type 246 /// ASTSelectorLookupTable. 247 /// 248 /// This hash table provides the IDs of all selectors, and the associated 249 /// instance and factory methods. 250 void *SelectorLookupTable; 251 252 // === Declarations === 253 254 /// DeclsCursor - This is a cursor to the start of the DECLS_BLOCK block. It 255 /// has read all the abbreviations at the start of the block and is ready to 256 /// jump around with these in context. 257 llvm::BitstreamCursor DeclsCursor; 258 259 /// \brief The number of declarations in this AST file. 260 unsigned LocalNumDecls; 261 262 /// \brief Offset of each declaration within the bitstream, indexed 263 /// by the declaration ID (-1). 264 const DeclOffset *DeclOffsets; 265 266 /// \brief Base declaration ID for declarations local to this module. 267 serialization::DeclID BaseDeclID; 268 269 /// \brief Remapping table for declaration IDs in this module. 270 ContinuousRangeMap<uint32_t, int, 2> DeclRemap; 271 272 /// \brief Mapping from the module files that this module file depends on 273 /// to the base declaration ID for that module as it is understood within this 274 /// module. 275 /// 276 /// This is effectively a reverse global-to-local mapping for declaration 277 /// IDs, so that we can interpret a true global ID (for this translation unit) 278 /// as a local ID (for this module file). 279 llvm::DenseMap<ModuleFile *, serialization::DeclID> GlobalToLocalDeclIDs; 280 281 /// \brief The number of C++ base specifier sets in this AST file. 282 unsigned LocalNumCXXBaseSpecifiers; 283 284 /// \brief Offset of each C++ base specifier set within the bitstream, 285 /// indexed by the C++ base specifier set ID (-1). 286 const uint32_t *CXXBaseSpecifiersOffsets; 287 288 typedef llvm::DenseMap<const DeclContext *, DeclContextInfo> 289 DeclContextInfosMap; 290 291 /// \brief Information about the lexical and visible declarations 292 /// for each DeclContext. 293 DeclContextInfosMap DeclContextInfos; 294 295 /// \brief Array of file-level DeclIDs sorted by file. 296 const serialization::DeclID *FileSortedDecls; 297 298 /// \brief Array of redeclaration chain location information within this 299 /// module file, sorted by the first declaration ID. 300 const serialization::LocalRedeclarationsInfo *RedeclarationsMap; 301 302 /// \brief The number of redeclaration info entries in RedeclarationsMap. 303 unsigned LocalNumRedeclarationsInMap; 304 305 /// \brief The redeclaration chains for declarations local to this 306 /// module file. 307 SmallVector<uint64_t, 1> RedeclarationChains; 308 309 /// \brief Array of category list location information within this 310 /// module file, sorted by the definition ID. 311 const serialization::ObjCCategoriesInfo *ObjCCategoriesMap; 312 313 /// \brief The number of redeclaration info entries in ObjCCategoriesMap. 314 unsigned LocalNumObjCCategoriesInMap; 315 316 /// \brief The Objective-C category lists for categories known to this 317 /// module. 318 SmallVector<uint64_t, 1> ObjCCategories; 319 320 // === Types === 321 322 /// \brief The number of types in this AST file. 323 unsigned LocalNumTypes; 324 325 /// \brief Offset of each type within the bitstream, indexed by the 326 /// type ID, or the representation of a Type*. 327 const uint32_t *TypeOffsets; 328 329 /// \brief Base type ID for types local to this module as represented in 330 /// the global type ID space. 331 serialization::TypeID BaseTypeIndex; 332 333 /// \brief Remapping table for type IDs in this module. 334 ContinuousRangeMap<uint32_t, int, 2> TypeRemap; 335 336 // === Miscellaneous === 337 338 /// \brief Diagnostic IDs and their mappings that the user changed. 339 SmallVector<uint64_t, 8> PragmaDiagMappings; 340 341 /// \brief The AST stat cache installed for this file, if any. 342 /// 343 /// The dynamic type of this stat cache is always ASTStatCache 344 void *StatCache; 345 346 /// \brief List of modules which depend on this module 347 llvm::SetVector<ModuleFile *> ImportedBy; 348 349 /// \brief List of modules which this module depends on 350 llvm::SetVector<ModuleFile *> Imports; 351 352 /// \brief Determine whether this module was directly imported at 353 /// any point during translation. isDirectlyImported()354 bool isDirectlyImported() const { return DirectlyImported; } 355 356 /// \brief Dump debugging output for this module. 357 void dump(); 358 }; 359 360 } // end namespace serialization 361 362 } // end namespace clang 363 364 #endif 365