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