clang API Documentation

Serialization/Module.cpp
Go to the documentation of this file.
00001 //===--- Module.cpp - Module description ------------------------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 //  This file implements the Module class, which describes a module that has
00011 //  been loaded from an AST file.
00012 //
00013 //===----------------------------------------------------------------------===//
00014 #include "clang/Serialization/Module.h"
00015 #include "llvm/Support/raw_ostream.h"
00016 #include "llvm/Support/MemoryBuffer.h"
00017 #include "ASTReaderInternals.h"
00018 
00019 using namespace clang;
00020 using namespace serialization;
00021 using namespace reader;
00022 
00023 ModuleFile::ModuleFile(ModuleKind Kind, unsigned Generation)
00024   : Kind(Kind), DirectlyImported(false), Generation(Generation), SizeInBits(0), 
00025     LocalNumSLocEntries(0), SLocEntryBaseID(0),
00026     SLocEntryBaseOffset(0), SLocEntryOffsets(0),
00027     SLocFileOffsets(0), LocalNumIdentifiers(0), 
00028     IdentifierOffsets(0), BaseIdentifierID(0), IdentifierTableData(0),
00029     IdentifierLookupTable(0), BasePreprocessedEntityID(0),
00030     PreprocessedEntityOffsets(0), NumPreprocessedEntities(0),
00031     LocalNumHeaderFileInfos(0), 
00032     HeaderFileInfoTableData(0), HeaderFileInfoTable(0),
00033     HeaderFileFrameworkStrings(0), LocalNumSubmodules(0), BaseSubmoduleID(0),
00034     LocalNumSelectors(0), SelectorOffsets(0), BaseSelectorID(0),
00035     SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0),
00036     DeclOffsets(0), BaseDeclID(0),
00037     LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(0),
00038     FileSortedDecls(0), RedeclarationsMap(0), LocalNumRedeclarationsInMap(0),
00039     ObjCCategoriesMap(0), LocalNumObjCCategoriesInMap(0),
00040     LocalNumTypes(0), TypeOffsets(0), BaseTypeIndex(0), StatCache(0)
00041 {}
00042 
00043 ModuleFile::~ModuleFile() {
00044   for (DeclContextInfosMap::iterator I = DeclContextInfos.begin(),
00045        E = DeclContextInfos.end();
00046        I != E; ++I) {
00047     if (I->second.NameLookupTableData)
00048       delete I->second.NameLookupTableData;
00049   }
00050   
00051   delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable);
00052   delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable);
00053   delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable);
00054 }
00055 
00056 template<typename Key, typename Offset, unsigned InitialCapacity>
00057 static void 
00058 dumpLocalRemap(StringRef Name,
00059                const ContinuousRangeMap<Key, Offset, InitialCapacity> &Map) {
00060   if (Map.begin() == Map.end())
00061     return;
00062   
00063   typedef ContinuousRangeMap<Key, Offset, InitialCapacity> MapType;
00064   llvm::errs() << "  " << Name << ":\n";
00065   for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 
00066        I != IEnd; ++I) {
00067     llvm::errs() << "    " << I->first << " -> " << I->second << "\n";
00068   }
00069 }
00070 
00071 void ModuleFile::dump() {
00072   llvm::errs() << "\nModule: " << FileName << "\n";
00073   if (!Imports.empty()) {
00074     llvm::errs() << "  Imports: ";
00075     for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
00076       if (I)
00077         llvm::errs() << ", ";
00078       llvm::errs() << Imports[I]->FileName;
00079     }
00080     llvm::errs() << "\n";
00081   }
00082   
00083   // Remapping tables.
00084   llvm::errs() << "  Base source location offset: " << SLocEntryBaseOffset 
00085                << '\n';
00086   dumpLocalRemap("Source location offset local -> global map", SLocRemap);
00087   
00088   llvm::errs() << "  Base identifier ID: " << BaseIdentifierID << '\n'
00089                << "  Number of identifiers: " << LocalNumIdentifiers << '\n';
00090   dumpLocalRemap("Identifier ID local -> global map", IdentifierRemap);
00091 
00092   llvm::errs() << "  Base submodule ID: " << BaseSubmoduleID << '\n'
00093                << "  Number of submodules: " << LocalNumSubmodules << '\n';
00094   dumpLocalRemap("Submodule ID local -> global map", SubmoduleRemap);
00095 
00096   llvm::errs() << "  Base selector ID: " << BaseSelectorID << '\n'
00097                << "  Number of selectors: " << LocalNumSelectors << '\n';
00098   dumpLocalRemap("Selector ID local -> global map", SelectorRemap);
00099   
00100   llvm::errs() << "  Base preprocessed entity ID: " << BasePreprocessedEntityID
00101                << '\n'  
00102                << "  Number of preprocessed entities: " 
00103                << NumPreprocessedEntities << '\n';
00104   dumpLocalRemap("Preprocessed entity ID local -> global map", 
00105                  PreprocessedEntityRemap);
00106   
00107   llvm::errs() << "  Base type index: " << BaseTypeIndex << '\n'
00108                << "  Number of types: " << LocalNumTypes << '\n';
00109   dumpLocalRemap("Type index local -> global map", TypeRemap);
00110   
00111   llvm::errs() << "  Base decl ID: " << BaseDeclID << '\n'
00112                << "  Number of decls: " << LocalNumDecls << '\n';
00113   dumpLocalRemap("Decl ID local -> global map", DeclRemap);
00114 }