1//===--- Module.cpp - 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 implements the Module class, which describes a module that has
11//  been loaded from an AST file.
12//
13//===----------------------------------------------------------------------===//
14#include "clang/Serialization/Module.h"
15#include "ASTReaderInternals.h"
16#include "llvm/Support/MemoryBuffer.h"
17#include "llvm/Support/raw_ostream.h"
18
19using namespace clang;
20using namespace serialization;
21using namespace reader;
22
23ModuleFile::ModuleFile(ModuleKind Kind, unsigned Generation)
24  : Kind(Kind), File(nullptr), DirectlyImported(false),
25    Generation(Generation), SizeInBits(0),
26    LocalNumSLocEntries(0), SLocEntryBaseID(0),
27    SLocEntryBaseOffset(0), SLocEntryOffsets(nullptr),
28    LocalNumIdentifiers(0),
29    IdentifierOffsets(nullptr), BaseIdentifierID(0),
30    IdentifierTableData(nullptr), IdentifierLookupTable(nullptr),
31    LocalNumMacros(0), MacroOffsets(nullptr),
32    BasePreprocessedEntityID(0),
33    PreprocessedEntityOffsets(nullptr), NumPreprocessedEntities(0),
34    LocalNumHeaderFileInfos(0),
35    HeaderFileInfoTableData(nullptr), HeaderFileInfoTable(nullptr),
36    LocalNumSubmodules(0), BaseSubmoduleID(0),
37    LocalNumSelectors(0), SelectorOffsets(nullptr), BaseSelectorID(0),
38    SelectorLookupTableData(nullptr), SelectorLookupTable(nullptr),
39    LocalNumDecls(0), DeclOffsets(nullptr), BaseDeclID(0),
40    LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(nullptr),
41    FileSortedDecls(nullptr), NumFileSortedDecls(0),
42    RedeclarationsMap(nullptr), LocalNumRedeclarationsInMap(0),
43    ObjCCategoriesMap(nullptr), LocalNumObjCCategoriesInMap(0),
44    LocalNumTypes(0), TypeOffsets(nullptr), BaseTypeIndex(0)
45{}
46
47ModuleFile::~ModuleFile() {
48  for (DeclContextInfosMap::iterator I = DeclContextInfos.begin(),
49       E = DeclContextInfos.end();
50       I != E; ++I) {
51    if (I->second.NameLookupTableData)
52      delete I->second.NameLookupTableData;
53  }
54
55  delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable);
56  delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable);
57  delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable);
58}
59
60template<typename Key, typename Offset, unsigned InitialCapacity>
61static void
62dumpLocalRemap(StringRef Name,
63               const ContinuousRangeMap<Key, Offset, InitialCapacity> &Map) {
64  if (Map.begin() == Map.end())
65    return;
66
67  typedef ContinuousRangeMap<Key, Offset, InitialCapacity> MapType;
68  llvm::errs() << "  " << Name << ":\n";
69  for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
70       I != IEnd; ++I) {
71    llvm::errs() << "    " << I->first << " -> " << I->second << "\n";
72  }
73}
74
75void ModuleFile::dump() {
76  llvm::errs() << "\nModule: " << FileName << "\n";
77  if (!Imports.empty()) {
78    llvm::errs() << "  Imports: ";
79    for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
80      if (I)
81        llvm::errs() << ", ";
82      llvm::errs() << Imports[I]->FileName;
83    }
84    llvm::errs() << "\n";
85  }
86
87  // Remapping tables.
88  llvm::errs() << "  Base source location offset: " << SLocEntryBaseOffset
89               << '\n';
90  dumpLocalRemap("Source location offset local -> global map", SLocRemap);
91
92  llvm::errs() << "  Base identifier ID: " << BaseIdentifierID << '\n'
93               << "  Number of identifiers: " << LocalNumIdentifiers << '\n';
94  dumpLocalRemap("Identifier ID local -> global map", IdentifierRemap);
95
96  llvm::errs() << "  Base macro ID: " << BaseMacroID << '\n'
97               << "  Number of macros: " << LocalNumMacros << '\n';
98  dumpLocalRemap("Macro ID local -> global map", MacroRemap);
99
100  llvm::errs() << "  Base submodule ID: " << BaseSubmoduleID << '\n'
101               << "  Number of submodules: " << LocalNumSubmodules << '\n';
102  dumpLocalRemap("Submodule ID local -> global map", SubmoduleRemap);
103
104  llvm::errs() << "  Base selector ID: " << BaseSelectorID << '\n'
105               << "  Number of selectors: " << LocalNumSelectors << '\n';
106  dumpLocalRemap("Selector ID local -> global map", SelectorRemap);
107
108  llvm::errs() << "  Base preprocessed entity ID: " << BasePreprocessedEntityID
109               << '\n'
110               << "  Number of preprocessed entities: "
111               << NumPreprocessedEntities << '\n';
112  dumpLocalRemap("Preprocessed entity ID local -> global map",
113                 PreprocessedEntityRemap);
114
115  llvm::errs() << "  Base type index: " << BaseTypeIndex << '\n'
116               << "  Number of types: " << LocalNumTypes << '\n';
117  dumpLocalRemap("Type index local -> global map", TypeRemap);
118
119  llvm::errs() << "  Base decl ID: " << BaseDeclID << '\n'
120               << "  Number of decls: " << LocalNumDecls << '\n';
121  dumpLocalRemap("Decl ID local -> global map", DeclRemap);
122}
123