1226586Sdim//===--- Module.cpp - Module description ------------------------*- C++ -*-===// 2226586Sdim// 3226586Sdim// The LLVM Compiler Infrastructure 4226586Sdim// 5226586Sdim// This file is distributed under the University of Illinois Open Source 6226586Sdim// License. See LICENSE.TXT for details. 7226586Sdim// 8226586Sdim//===----------------------------------------------------------------------===// 9226586Sdim// 10226586Sdim// This file implements the Module class, which describes a module that has 11226586Sdim// been loaded from an AST file. 12226586Sdim// 13226586Sdim//===----------------------------------------------------------------------===// 14226586Sdim#include "clang/Serialization/Module.h" 15249423Sdim#include "ASTReaderInternals.h" 16249423Sdim#include "llvm/Support/MemoryBuffer.h" 17226586Sdim#include "llvm/Support/raw_ostream.h" 18226586Sdim 19226586Sdimusing namespace clang; 20226586Sdimusing namespace serialization; 21226586Sdimusing namespace reader; 22226586Sdim 23234353SdimModuleFile::ModuleFile(ModuleKind Kind, unsigned Generation) 24243830Sdim : Kind(Kind), File(0), DirectlyImported(false), 25243830Sdim Generation(Generation), SizeInBits(0), 26226586Sdim LocalNumSLocEntries(0), SLocEntryBaseID(0), 27226586Sdim SLocEntryBaseOffset(0), SLocEntryOffsets(0), 28243830Sdim LocalNumIdentifiers(0), 29226586Sdim IdentifierOffsets(0), BaseIdentifierID(0), IdentifierTableData(0), 30243830Sdim IdentifierLookupTable(0), 31243830Sdim LocalNumMacros(0), MacroOffsets(0), 32243830Sdim BasePreprocessedEntityID(0), 33226586Sdim PreprocessedEntityOffsets(0), NumPreprocessedEntities(0), 34226586Sdim LocalNumHeaderFileInfos(0), 35226586Sdim HeaderFileInfoTableData(0), HeaderFileInfoTable(0), 36249423Sdim LocalNumSubmodules(0), BaseSubmoduleID(0), 37226586Sdim LocalNumSelectors(0), SelectorOffsets(0), BaseSelectorID(0), 38226586Sdim SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0), 39226586Sdim DeclOffsets(0), BaseDeclID(0), 40226586Sdim LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(0), 41243830Sdim FileSortedDecls(0), NumFileSortedDecls(0), 42243830Sdim RedeclarationsMap(0), LocalNumRedeclarationsInMap(0), 43234353Sdim ObjCCategoriesMap(0), LocalNumObjCCategoriesInMap(0), 44243830Sdim LocalNumTypes(0), TypeOffsets(0), BaseTypeIndex(0) 45226586Sdim{} 46226586Sdim 47234353SdimModuleFile::~ModuleFile() { 48226586Sdim for (DeclContextInfosMap::iterator I = DeclContextInfos.begin(), 49226586Sdim E = DeclContextInfos.end(); 50226586Sdim I != E; ++I) { 51226586Sdim if (I->second.NameLookupTableData) 52234982Sdim delete I->second.NameLookupTableData; 53226586Sdim } 54226586Sdim 55226586Sdim delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable); 56226586Sdim delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable); 57226586Sdim delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable); 58226586Sdim} 59226586Sdim 60226586Sdimtemplate<typename Key, typename Offset, unsigned InitialCapacity> 61226586Sdimstatic void 62226586SdimdumpLocalRemap(StringRef Name, 63226586Sdim const ContinuousRangeMap<Key, Offset, InitialCapacity> &Map) { 64226586Sdim if (Map.begin() == Map.end()) 65226586Sdim return; 66226586Sdim 67226586Sdim typedef ContinuousRangeMap<Key, Offset, InitialCapacity> MapType; 68226586Sdim llvm::errs() << " " << Name << ":\n"; 69226586Sdim for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 70226586Sdim I != IEnd; ++I) { 71226586Sdim llvm::errs() << " " << I->first << " -> " << I->second << "\n"; 72226586Sdim } 73226586Sdim} 74226586Sdim 75234353Sdimvoid ModuleFile::dump() { 76226586Sdim llvm::errs() << "\nModule: " << FileName << "\n"; 77226586Sdim if (!Imports.empty()) { 78226586Sdim llvm::errs() << " Imports: "; 79226586Sdim for (unsigned I = 0, N = Imports.size(); I != N; ++I) { 80226586Sdim if (I) 81226586Sdim llvm::errs() << ", "; 82226586Sdim llvm::errs() << Imports[I]->FileName; 83226586Sdim } 84226586Sdim llvm::errs() << "\n"; 85226586Sdim } 86226586Sdim 87226586Sdim // Remapping tables. 88226586Sdim llvm::errs() << " Base source location offset: " << SLocEntryBaseOffset 89226586Sdim << '\n'; 90226586Sdim dumpLocalRemap("Source location offset local -> global map", SLocRemap); 91226586Sdim 92226586Sdim llvm::errs() << " Base identifier ID: " << BaseIdentifierID << '\n' 93226586Sdim << " Number of identifiers: " << LocalNumIdentifiers << '\n'; 94226586Sdim dumpLocalRemap("Identifier ID local -> global map", IdentifierRemap); 95234353Sdim 96243830Sdim llvm::errs() << " Base macro ID: " << BaseMacroID << '\n' 97243830Sdim << " Number of macros: " << LocalNumMacros << '\n'; 98243830Sdim dumpLocalRemap("Macro ID local -> global map", MacroRemap); 99243830Sdim 100234353Sdim llvm::errs() << " Base submodule ID: " << BaseSubmoduleID << '\n' 101234353Sdim << " Number of submodules: " << LocalNumSubmodules << '\n'; 102234353Sdim dumpLocalRemap("Submodule ID local -> global map", SubmoduleRemap); 103234353Sdim 104226586Sdim llvm::errs() << " Base selector ID: " << BaseSelectorID << '\n' 105226586Sdim << " Number of selectors: " << LocalNumSelectors << '\n'; 106226586Sdim dumpLocalRemap("Selector ID local -> global map", SelectorRemap); 107226586Sdim 108226586Sdim llvm::errs() << " Base preprocessed entity ID: " << BasePreprocessedEntityID 109226586Sdim << '\n' 110226586Sdim << " Number of preprocessed entities: " 111226586Sdim << NumPreprocessedEntities << '\n'; 112226586Sdim dumpLocalRemap("Preprocessed entity ID local -> global map", 113226586Sdim PreprocessedEntityRemap); 114226586Sdim 115226586Sdim llvm::errs() << " Base type index: " << BaseTypeIndex << '\n' 116226586Sdim << " Number of types: " << LocalNumTypes << '\n'; 117226586Sdim dumpLocalRemap("Type index local -> global map", TypeRemap); 118226586Sdim 119226586Sdim llvm::errs() << " Base decl ID: " << BaseDeclID << '\n' 120226586Sdim << " Number of decls: " << LocalNumDecls << '\n'; 121226586Sdim dumpLocalRemap("Decl ID local -> global map", DeclRemap); 122226586Sdim} 123