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