ASTUnit.h revision 175c4a9aa61f4449f27b729737e4438684ac6d92
14950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//===--- ASTUnit.h - ASTUnit utility ----------------------------*- C++ -*-===//
29769ab22265b313171d201b5928688524a01bd87Misha Brukman//
34950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//                     The LLVM Compiler Infrastructure
44950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
79769ab22265b313171d201b5928688524a01bd87Misha Brukman//
84950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//===----------------------------------------------------------------------===//
94950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//
104950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner// ASTUnit utility class.
119769ab22265b313171d201b5928688524a01bd87Misha Brukman//
124950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner//===----------------------------------------------------------------------===//
134950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
144950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#ifndef LLVM_CLANG_FRONTEND_ASTUNIT_H
154950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#define LLVM_CLANG_FRONTEND_ASTUNIT_H
164950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
174950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "clang/Lex/PreprocessingRecord.h"
184950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "clang/Basic/SourceManager.h"
194950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "llvm/ADT/IntrusiveRefCntPtr.h"
204950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "llvm/ADT/OwningPtr.h"
214950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "clang/Basic/FileManager.h"
2235fa43907e2ea751ad35bfbaab8c4d3511422c14Reid Spencer#include "clang/Index/ASTLocation.h"
235a6c1a840ad343c0ed2fa54a0edb50b61f828f0fEvan Cheng#include "llvm/ADT/SmallVector.h"
244950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include "llvm/System/Path.h"
254950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include <map>
264950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include <string>
274950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#include <vector>
28d19534add90a2a894af61523b830887097bb780bDan Gohman#include <cassert>
29789558db70d9513a017c11c5be30945839fdff1cNick Lewycky#include <utility>
303e6307698084e7adfc10b739442ae29742beefd0Nick Lewycky
314950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnernamespace llvm {
324950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  class MemoryBuffer;
334950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner}
344950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
354950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnernamespace clang {
364950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass ASTContext;
37246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohmanclass CompilerInvocation;
38246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohmanclass Decl;
394950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass Diagnostic;
409a6ae965d69b131d692de8fc69545b6c7aaea0b2Dan Gohmanclass FileEntry;
419769ab22265b313171d201b5928688524a01bd87Misha Brukmanclass FileManager;
424950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass HeaderSearch;
434950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass Preprocessor;
444950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass SourceManager;
454950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass TargetInfo;
464950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
474950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerusing namespace idx;
484950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
494950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner/// \brief Utility class for loading a ASTContext from a PCH file.
504950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner///
514950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerclass ASTUnit {
524950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerpublic:
534950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  typedef std::map<FileID, std::vector<PreprocessedEntity *> >
544950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    PreprocessedEntitiesByFileMap;
554950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerprivate:
56afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  llvm::IntrusiveRefCntPtr<Diagnostic> Diagnostics;
57246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  llvm::OwningPtr<FileManager>      FileMgr;
58246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  llvm::OwningPtr<SourceManager>    SourceMgr;
59afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  llvm::OwningPtr<HeaderSearch>     HeaderInfo;
60afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  llvm::OwningPtr<TargetInfo>       Target;
61afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  llvm::OwningPtr<Preprocessor>     PP;
625a6c1a840ad343c0ed2fa54a0edb50b61f828f0fEvan Cheng  llvm::OwningPtr<ASTContext>       Ctx;
635a6c1a840ad343c0ed2fa54a0edb50b61f828f0fEvan Cheng
645a6c1a840ad343c0ed2fa54a0edb50b61f828f0fEvan Cheng  /// Optional owned invocation, just used to make the invocation used in
655a6c1a840ad343c0ed2fa54a0edb50b61f828f0fEvan Cheng  /// LoadFromCommandLine available.
66b7ef72963b2215ca23c27fa8ea777bada06994d0Dan Gohman  llvm::OwningPtr<CompilerInvocation> Invocation;
674950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
684950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // OnlyLocalDecls - when true, walking this AST should only visit declarations
694950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // that come from the AST itself, not from included precompiled headers.
704950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // FIXME: This is temporary; eventually, CIndex will always do this.
714950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  bool                              OnlyLocalDecls;
724950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
734950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// \brief Whether to capture any diagnostics produced.
744950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  bool CaptureDiagnostics;
754950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
7684923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// Track whether the main file was loaded from an AST or not.
774950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  bool MainFileIsAST;
7884923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman
7984923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// Track the top-level decls which appeared in an ASTUnit which was loaded
804950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// from a source file.
814950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  //
8284923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  // FIXME: This is just an optimization hack to avoid deserializing large parts
8384923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  // of a PCH file when using the Index library on an ASTUnit loaded from
8484923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  // source. In the long term we should make the Index library use efficient and
8584923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  // more scalable search mechanisms.
864950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  std::vector<Decl*> TopLevelDecls;
874950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
884950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// The name of the original source file used to generate this ASTUnit.
899769ab22265b313171d201b5928688524a01bd87Misha Brukman  std::string OriginalSourceFile;
904950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
914950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // Critical optimization when using clang_getCursor().
924950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ASTLocation LastLoc;
934950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
944950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// \brief The set of diagnostics produced when creating this
954950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// translation unit.
964950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  llvm::SmallVector<StoredDiagnostic, 4> StoredDiagnostics;
974950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
9884923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// \brief Temporary files that should be removed when the ASTUnit is
9984923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// destroyed.
10084923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  llvm::SmallVector<llvm::sys::Path, 4> TemporaryFiles;
10184923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman
10284923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// \brief A mapping from file IDs to the set of preprocessed entities
10384923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// stored in that file.
10484923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  ///
10584923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// FIXME: This is just an optimization hack to avoid searching through
10684923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// many preprocessed entities during cursor traversal in the CIndex library.
10784923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// Ideally, we would just be able to perform a binary search within the
10884923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// list of preprocessed entities.
10984923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  PreprocessedEntitiesByFileMap PreprocessedEntitiesByFile;
11084923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman
11184923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// \brief Simple hack to allow us to assert that ASTUnit is not being
11284923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// used concurrently, which is not supported.
11384923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  ///
11484923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// Clients should create instances of the ConcurrencyCheck class whenever
11584923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// using the ASTUnit in a way that isn't intended to be concurrent, which is
11684923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  /// just about any usage.
11784923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  unsigned int ConcurrencyCheckValue;
11884923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  static const unsigned int CheckLocked = 28573289;
11984923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman  static const unsigned int CheckUnlocked = 9803453;
120afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner
121246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  /// \brief The file in which the precompiled preamble is stored.
122246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  llvm::sys::Path PreambleFile;
123246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman
124afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  /// \brief The contents of the preamble that has been precompiled to
125afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  /// \c PreambleFile.
126246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  std::vector<char> Preamble;
127afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner
128afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  /// \brief The size of the source buffer that we've reserved for the main
129b7ef72963b2215ca23c27fa8ea777bada06994d0Dan Gohman  /// file within the precompiled preamble.
1304950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  unsigned PreambleReservedSize;
1314950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1324950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ASTUnit(const ASTUnit&); // DO NOT IMPLEMENT
1334950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ASTUnit &operator=(const ASTUnit &); // DO NOT IMPLEMENT
1344950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1354950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  explicit ASTUnit(bool MainFileIsAST);
1364950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1374950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  void CleanTemporaryFiles();
1384950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  bool Parse();
1394950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1404950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  std::pair<llvm::MemoryBuffer *, unsigned> ComputePreamble(
1414950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                                CompilerInvocation &Invocation,
14284923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman                                                          bool &CreatedBuffer);
143246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman
144246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  std::pair<llvm::MemoryBuffer *, bool> BuildPrecompiledPreamble();
1454950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1464950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattnerpublic:
1474950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  class ConcurrencyCheck {
14884923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman    volatile ASTUnit &Self;
149afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner
150246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  public:
151246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman    explicit ConcurrencyCheck(ASTUnit &Self)
152246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman      : Self(Self)
153afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner    {
154afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner      assert(Self.ConcurrencyCheckValue == CheckUnlocked &&
155246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman             "Concurrent access to ASTUnit!");
156afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner      Self.ConcurrencyCheckValue = CheckLocked;
157afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner    }
158b7ef72963b2215ca23c27fa8ea777bada06994d0Dan Gohman
1594950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    ~ConcurrencyCheck() {
1604950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner      Self.ConcurrencyCheckValue = CheckUnlocked;
1614950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    }
1624950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  };
1634950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  friend class ConcurrencyCheck;
1644950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
1654950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ~ASTUnit();
1664950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
167d19534add90a2a894af61523b830887097bb780bDan Gohman  bool isMainFileAST() const { return MainFileIsAST; }
168d19534add90a2a894af61523b830887097bb780bDan Gohman
169d19534add90a2a894af61523b830887097bb780bDan Gohman  const Diagnostic &getDiagnostics() const { return *Diagnostics; }
170d19534add90a2a894af61523b830887097bb780bDan Gohman  Diagnostic &getDiagnostics()             { return *Diagnostics; }
17184923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman
172246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  const SourceManager &getSourceManager() const { return *SourceMgr; }
173246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman        SourceManager &getSourceManager()       { return *SourceMgr; }
174d19534add90a2a894af61523b830887097bb780bDan Gohman
175d19534add90a2a894af61523b830887097bb780bDan Gohman  const Preprocessor &getPreprocessor() const { return *PP.get(); }
176d19534add90a2a894af61523b830887097bb780bDan Gohman        Preprocessor &getPreprocessor()       { return *PP.get(); }
17784923602fdc2a81957e5dee178d5737ad8e72f55Dan Gohman
178d19534add90a2a894af61523b830887097bb780bDan Gohman  const ASTContext &getASTContext() const { return *Ctx.get(); }
179246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman        ASTContext &getASTContext()       { return *Ctx.get(); }
180246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman
181246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  const FileManager &getFileManager() const { return *FileMgr; }
182d19534add90a2a894af61523b830887097bb780bDan Gohman        FileManager &getFileManager()       { return *FileMgr; }
183d19534add90a2a894af61523b830887097bb780bDan Gohman
184246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  const std::string &getOriginalSourceFileName();
185d19534add90a2a894af61523b830887097bb780bDan Gohman  const std::string &getPCHFileName();
186d19534add90a2a894af61523b830887097bb780bDan Gohman
187b7ef72963b2215ca23c27fa8ea777bada06994d0Dan Gohman  /// \brief Add a temporary file that the ASTUnit depends on.
188d19534add90a2a894af61523b830887097bb780bDan Gohman  ///
189d19534add90a2a894af61523b830887097bb780bDan Gohman  /// This file will be erased when the ASTUnit is destroyed.
190d19534add90a2a894af61523b830887097bb780bDan Gohman  void addTemporaryFile(const llvm::sys::Path &TempFile) {
191d19534add90a2a894af61523b830887097bb780bDan Gohman    TemporaryFiles.push_back(TempFile);
192d19534add90a2a894af61523b830887097bb780bDan Gohman  }
193d19534add90a2a894af61523b830887097bb780bDan Gohman
194d19534add90a2a894af61523b830887097bb780bDan Gohman  bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
195d19534add90a2a894af61523b830887097bb780bDan Gohman
1964950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  void setLastASTLocation(ASTLocation ALoc) { LastLoc = ALoc; }
197d9480d0f6875d8aa3a0d91942d24f0ee416b1ff1Dan Gohman  ASTLocation getLastASTLocation() const { return LastLoc; }
198d9480d0f6875d8aa3a0d91942d24f0ee416b1ff1Dan Gohman
199d9480d0f6875d8aa3a0d91942d24f0ee416b1ff1Dan Gohman  std::vector<Decl*> &getTopLevelDecls() {
200d9480d0f6875d8aa3a0d91942d24f0ee416b1ff1Dan Gohman    assert(!isMainFileAST() && "Invalid call for AST based ASTUnit!");
201ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman    return TopLevelDecls;
202ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  }
2034950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  const std::vector<Decl*> &getTopLevelDecls() const {
2044950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    assert(!isMainFileAST() && "Invalid call for AST based ASTUnit!");
205ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman    return TopLevelDecls;
206ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  }
207ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman
2084950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// \brief Retrieve the mapping from File IDs to the preprocessed entities
2094950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// within that file.
21034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  PreprocessedEntitiesByFileMap &getPreprocessedEntitiesByFile() {
2114950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    return PreprocessedEntitiesByFile;
2124950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  }
2134950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
2144950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // Retrieve the diagnostics associated with this AST
2154950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  typedef const StoredDiagnostic *stored_diag_iterator;
2164950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  stored_diag_iterator stored_diag_begin() const {
2174950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    return StoredDiagnostics.begin();
2184950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  }
2194950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  stored_diag_iterator stored_diag_end() const {
2204950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    return StoredDiagnostics.end();
2214950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  }
2224950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  unsigned stored_diag_size() const { return StoredDiagnostics.size(); }
2234950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
2244950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  llvm::SmallVector<StoredDiagnostic, 4> &getStoredDiagnostics() {
2254950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner    return StoredDiagnostics;
2264950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  }
22739592233304acbbeea8c53bac2b6a822a63a4c4bDan Gohman
228803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// \brief A mapping from a file name to the memory buffer that stores the
229803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// remapped contents of that file.
2304950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  typedef std::pair<std::string, const llvm::MemoryBuffer *> RemappedFile;
231803513b364e27d303285d396fd8ee5b32149962aChris Lattner
2324950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// \brief Create a ASTUnit from a PCH file.
233ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov  ///
234803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// \param Filename - The PCH file to load.
235803513b364e27d303285d396fd8ee5b32149962aChris Lattner  ///
236803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// \param Diags - The diagnostics engine to use for reporting errors; its
237803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// lifetime is expected to extend past that of the returned ASTUnit.
238ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov  ///
239803513b364e27d303285d396fd8ee5b32149962aChris Lattner  /// \returns - The initialized ASTUnit or null if the PCH failed to load.
2404950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  static ASTUnit *LoadFromPCHFile(const std::string &Filename,
2414950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                  llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
242ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                  bool OnlyLocalDecls = false,
243ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                  RemappedFile *RemappedFiles = 0,
244ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                  unsigned NumRemappedFiles = 0,
245ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                  bool CaptureDiagnostics = false);
246ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman
247ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// LoadFromCompilerInvocation - Create an ASTUnit from a source file, via a
248ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// CompilerInvocation object.
249ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  ///
250ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// \param CI - The compiler invocation to use; it must have exactly one input
251ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// source file. The ASTUnit takes ownership of the CompilerInvocation object.
252ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  ///
253ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// \param Diags - The diagnostics engine to use for reporting errors; its
254ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// lifetime is expected to extend past that of the returned ASTUnit.
255ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  //
256ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
257ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  // shouldn't need to specify them at construction time.
258ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  static ASTUnit *LoadFromCompilerInvocation(CompilerInvocation *CI,
259ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                     llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
260ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                             bool OnlyLocalDecls = false,
261ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                             bool CaptureDiagnostics = false,
262ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman                                             bool PrecompilePreamble = false);
263ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman
264ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// LoadFromCommandLine - Create an ASTUnit from a vector of command line
265ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// arguments, which must specify exactly one source file.
266ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  ///
267ecb403a9d3a340009c266d05cfca2bd778c7b156Dan Gohman  /// \param ArgBegin - The beginning of the argument vector.
268afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  ///
269246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  /// \param ArgEnd - The end of the argument vector.
270246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  ///
271afc0dc7184cf73ff7ac64e516284fbe0c7023ba4Chris Lattner  /// \param Diags - The diagnostics engine to use for reporting errors; its
2724950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// lifetime is expected to extend past that of the returned ASTUnit.
2734950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ///
274b7ef72963b2215ca23c27fa8ea777bada06994d0Dan Gohman  /// \param ResourceFilesPath - The path to the compiler resource files.
2754950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  //
2764950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
2774950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  // shouldn't need to specify them at construction time.
2784950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  static ASTUnit *LoadFromCommandLine(const char **ArgBegin,
2794950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                      const char **ArgEnd,
280c54c561c9f7270c055dd7ba75a3a003b771a42d9Nick Lewycky                                    llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
2813e6307698084e7adfc10b739442ae29742beefd0Nick Lewycky                                      llvm::StringRef ResourceFilesPath,
2823e6307698084e7adfc10b739442ae29742beefd0Nick Lewycky                                      bool OnlyLocalDecls = false,
2834950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                      RemappedFile *RemappedFiles = 0,
2844950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                      unsigned NumRemappedFiles = 0,
2854950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                      bool CaptureDiagnostics = false,
2864950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner                                      bool PrecompilePreamble = false);
2874950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
2884950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// \brief Reparse the source files using the same command-line options that
2894950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  /// were originally used to produce this translation unit.
2904950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner  ///
291246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  /// \returns True if a failure occurred that causes the ASTUnit not to
292246b2564d3bbbafe06ebf6a67745cd24141b5cb4Dan Gohman  /// contain any translation-unit information, false otherwise.
293adf3eab7735741926c67e6fc12b952500c45a9baDan Gohman  bool Reparse(RemappedFile *RemappedFiles = 0,
2944950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner               unsigned NumRemappedFiles = 0);
2954950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner};
2964950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
2974950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner} // namespace clang
2984950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner
2994950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner#endif
3004950e88e0fa7c44c0b54e2f64ddf57415ed83d40Chris Lattner