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