clang API Documentation
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 }