PTHManager.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
105436638acc7c010349a69c3395f1a57c642dc62Ying Wang//===--- PTHManager.h - Manager object for PTH processing -------*- C++ -*-===// 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang// 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang// The LLVM Compiler Infrastructure 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang// 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang// This file is distributed under the University of Illinois Open Source 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang// License. See LICENSE.TXT for details. 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang// 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang//===----------------------------------------------------------------------===// 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang// 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang// This file defines the PTHManager interface. 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang// 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang//===----------------------------------------------------------------------===// 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef LLVM_CLANG_PTHMANAGER_H 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define LLVM_CLANG_PTHMANAGER_H 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "clang/Basic/Diagnostic.h" 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "clang/Basic/IdentifierTable.h" 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "clang/Basic/LangOptions.h" 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "clang/Lex/PTHLexer.h" 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "llvm/ADT/DenseMap.h" 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "llvm/Support/Allocator.h" 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <string> 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace llvm { 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang class MemoryBuffer; 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace clang { 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass FileEntry; 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass PTHLexer; 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass DiagnosticsEngine; 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass FileSystemStatCache; 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass PTHManager : public IdentifierInfoLookup { 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang friend class PTHLexer; 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// The memory mapped PTH file. 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang const llvm::MemoryBuffer* Buf; 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Alloc - Allocator used for IdentifierInfo objects. 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang llvm::BumpPtrAllocator Alloc; 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// IdMap - A lazily generated cache mapping from persistent identifiers to 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// IdentifierInfo*. 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang IdentifierInfo** PerIDCache; 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// FileLookup - Abstract data structure used for mapping between files 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// and token data in the PTH file. 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang void* FileLookup; 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// IdDataTable - Array representing the mapping from persistent IDs to the 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// data offset within the PTH file containing the information to 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// reconsitute an IdentifierInfo. 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const unsigned char* const IdDataTable; 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// SortedIdTable - Abstract data structure mapping from strings to 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// persistent IDs. This is used by get(). 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang void* StringIdLookup; 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// NumIds - The number of identifiers in the PTH file. 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang const unsigned NumIds; 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// PP - The Preprocessor object that will use this PTHManager to create 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// PTHLexer objects. 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Preprocessor* PP; 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// SpellingBase - The base offset within the PTH memory buffer that 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// contains the cached spellings for literals. 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang const unsigned char* const SpellingBase; 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// OriginalSourceFile - A null-terminated C-string that specifies the name 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// if the file (if any) that was to used to generate the PTH cache. 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* OriginalSourceFile; 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// This constructor is intended to only be called by the static 'Create' 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// method. 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang PTHManager(const llvm::MemoryBuffer* buf, void* fileLookup, 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang const unsigned char* idDataTable, IdentifierInfo** perIDCache, 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang void* stringIdLookup, unsigned numIds, 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const unsigned char* spellingBase, const char *originalSourceFile); 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang PTHManager(const PTHManager &) LLVM_DELETED_FUNCTION; 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang void operator=(const PTHManager &) LLVM_DELETED_FUNCTION; 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// getSpellingAtPTHOffset - Used by PTHLexer classes to get the cached 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// spelling for a token. 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned getSpellingAtPTHOffset(unsigned PTHOffset, const char*& Buffer); 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// GetIdentifierInfo - Used to reconstruct IdentifierInfo objects from the 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// PTH file. 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline IdentifierInfo* GetIdentifierInfo(unsigned PersistentID) { 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang // Check if the IdentifierInfo has already been resolved. 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (IdentifierInfo* II = PerIDCache[PersistentID]) 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return II; 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return LazilyCreateIdentifierInfo(PersistentID); 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang IdentifierInfo* LazilyCreateIdentifierInfo(unsigned PersistentID); 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang // The current PTH version. 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang enum { Version = 10 }; 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ~PTHManager(); 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// getOriginalSourceFile - Return the full path to the original header 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// file name that was used to generate the PTH cache. 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* getOriginalSourceFile() const { 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return OriginalSourceFile; 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// get - Return the identifier token info for the specified named identifier. 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Unlike the version in IdentifierTable, this returns a pointer instead 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// of a reference. If the pointer is NULL then the IdentifierInfo cannot 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// be found. 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang IdentifierInfo *get(StringRef Name) override; 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// Create - This method creates PTHManager objects. The 'file' argument 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// is the name of the PTH file. This method returns NULL upon failure. 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang static PTHManager *Create(const std::string& file, DiagnosticsEngine &Diags); 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang void setPreprocessor(Preprocessor *pp) { PP = pp; } 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// CreateLexer - Return a PTHLexer that "lexes" the cached tokens for the 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// specified file. This method returns NULL if no cached tokens exist. 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// It is the responsibility of the caller to 'delete' the returned object. 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang PTHLexer *CreateLexer(FileID FID); 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// createStatCache - Returns a FileSystemStatCache object for use with 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// FileManager objects. These objects use the PTH data to speed up 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// calls to stat by memoizing their results from when the PTH file 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /// was generated. 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang FileSystemStatCache *createStatCache(); 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} // end namespace clang 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang