ASTUnit.cpp revision 1d9f1fe7173e3084325f43c78af812a36d8a2a7c
14b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis//===--- ASTUnit.cpp - ASTUnit utility ------------------------------------===// 24b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// 34b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 44b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// 54b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 64b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 74b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// 84b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 94b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// 104b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// ASTUnit Implementation. 114b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis// 124b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 134b562cf889bc59e1914dd2c5d9fbd7e7bfa1ad77Argyrios Kyrtzidis 140853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h" 150853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/AST/ASTContext.h" 16521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar#include "clang/AST/ASTConsumer.h" 170853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/AST/DeclVisitor.h" 18f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor#include "clang/AST/TypeOrdering.h" 190853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/AST/StmtVisitor.h" 207b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "clang/Driver/Compilation.h" 217b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "clang/Driver/Driver.h" 227b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "clang/Driver/Job.h" 237b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "clang/Driver/Tool.h" 24521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar#include "clang/Frontend/CompilerInstance.h" 25521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar#include "clang/Frontend/FrontendActions.h" 267b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 27521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar#include "clang/Frontend/FrontendOptions.h" 286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h" 297faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "clang/Serialization/ASTWriter.h" 300853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/Lex/HeaderSearch.h" 310853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/Lex/Preprocessor.h" 32d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar#include "clang/Basic/TargetOptions.h" 330853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/Basic/TargetInfo.h" 340853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis#include "clang/Basic/Diagnostic.h" 35349d38cef04ddf8938047c1b542a799aa82dfe84Douglas Gregor#include "llvm/ADT/StringSet.h" 364db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor#include "llvm/Support/MemoryBuffer.h" 377b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar#include "llvm/System/Host.h" 384a630d30cd8ee9c8f46b8d3c9ad7e7e00d393f32Benjamin Kramer#include "llvm/System/Path.h" 39df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor#include "llvm/Support/raw_ostream.h" 40385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor#include "llvm/Support/Timer.h" 4144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor#include <cstdlib> 42ad23ebe22b7e52e3875981eeb46a1fd61a7554fbZhongxing Xu#include <cstdio> 43cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor#include <sys/stat.h> 440853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidisusing namespace clang; 450853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 46eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor/// \brief After failing to build a precompiled preamble (due to 47eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor/// errors in the source that occurs in the preamble), the number of 48eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor/// reparses during which we'll skip even trying to precompile the 49eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor/// preamble. 50eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregorconst unsigned DefaultPreambleRebuildInterval = 5; 51eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor 523687e9d3a5dbfa9963af02a49a2b139d91310813Douglas GregorASTUnit::ASTUnit(bool _MainFileIsAST) 53abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor : CaptureDiagnostics(false), MainFileIsAST(_MainFileIsAST), 54df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor CompleteTranslationUnit(true), ConcurrencyCheckValue(CheckUnlocked), 55671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreambleRebuildCounter(0), SavedMainFileBuffer(0), PreambleBuffer(0), 56727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor ShouldCacheCodeCompletionResults(false), 57727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor NumTopLevelDeclsAtLastCompletionCache(0), 588b1540c159093e0e627ebf6542d0c0b7aba99eafDouglas Gregor CacheCodeCompletionCoolDown(0), 598b1540c159093e0e627ebf6542d0c0b7aba99eafDouglas Gregor UnsafeToFree(false) { 60385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor} 613687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor 62521bf9c529e653ab28896d027352d3e16e2672d5Daniel DunbarASTUnit::~ASTUnit() { 63bdf6062bc10aa3b73b16402b440b8073310acd06Douglas Gregor ConcurrencyCheckValue = CheckLocked; 64abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor CleanTemporaryFiles(); 65175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (!PreambleFile.empty()) 66385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::sys::Path(PreambleFile).eraseFromDisk(); 67f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 68f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // Free the buffers associated with remapped files. We are required to 69f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // perform this operation here because we explicitly request that the 70f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // compiler instance *not* free these buffers for each invocation of the 71f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // parser. 72f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (Invocation.get()) { 73f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 74f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor for (PreprocessorOptions::remapped_file_buffer_iterator 75f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor FB = PPOpts.remapped_file_buffer_begin(), 76f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor FBEnd = PPOpts.remapped_file_buffer_end(); 77f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor FB != FBEnd; 78f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor ++FB) 79f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor delete FB->second; 80f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor } 8128233428da1ebec20c893d6297ae3191318940ddDouglas Gregor 8228233428da1ebec20c893d6297ae3191318940ddDouglas Gregor delete SavedMainFileBuffer; 83671947b18dba342f9aba022ee992babef325a833Douglas Gregor delete PreambleBuffer; 84671947b18dba342f9aba022ee992babef325a833Douglas Gregor 8587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor ClearCachedCompletionResults(); 8687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 878c8d5412cddcc1c45beb0353d91d7894db74e585Douglas Gregor if (TimerGroup) 888c8d5412cddcc1c45beb0353d91d7894db74e585Douglas Gregor TimerGroup->printAll(llvm::errs()); 898c8d5412cddcc1c45beb0353d91d7894db74e585Douglas Gregor 90385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor for (unsigned I = 0, N = Timers.size(); I != N; ++I) 91385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor delete Timers[I]; 92abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor} 93abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 94abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregorvoid ASTUnit::CleanTemporaryFiles() { 95313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I) 96313e26c4e81f0e467490a530548450f4c824a6c4Douglas Gregor TemporaryFiles[I].eraseFromDisk(); 97abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor TemporaryFiles.clear(); 98e19944c93961b7618f4f3f3185f698f46369ea54Steve Naroff} 990853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 1008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor/// \brief Determine the set of code-completion contexts in which this 1018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor/// declaration should be shown. 1028071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregorstatic unsigned getDeclShowContexts(NamedDecl *ND, 103a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor const LangOptions &LangOpts, 104a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor bool &IsNestedNameSpecifier) { 105a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier = false; 106a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 1078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (isa<UsingShadowDecl>(ND)) 1088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor ND = dyn_cast<NamedDecl>(ND->getUnderlyingDecl()); 1098071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (!ND) 1108071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor return 0; 1118071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1128071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor unsigned Contexts = 0; 1138071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND) || 1148071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor isa<ClassTemplateDecl>(ND) || isa<TemplateTemplateParmDecl>(ND)) { 1158071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Types can appear in these contexts. 1168071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (LangOpts.CPlusPlus || !isa<TagDecl>(ND)) 1178071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_TopLevel - 1)) 1188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCIvarList - 1)) 1198071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor | (1 << (CodeCompletionContext::CCC_ClassStructUnion - 1)) 1208071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor | (1 << (CodeCompletionContext::CCC_Statement - 1)) 1210268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_Type - 1)) 1220268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1)); 1238071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1248071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // In C++, types can appear in expressions contexts (for functional casts). 1258071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (LangOpts.CPlusPlus) 1268071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_Expression - 1)); 1278071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1288071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // In Objective-C, message sends can send interfaces. In Objective-C++, 1298071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // all types are available due to functional casts. 1308071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (LangOpts.CPlusPlus || isa<ObjCInterfaceDecl>(ND)) 1318071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1)); 1328071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1338071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Deal with tag names. 1348071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (isa<EnumDecl>(ND)) { 1358071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_EnumTag - 1)); 1368071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 137a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor // Part of the nested-name-specifier in C++0x. 1388071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (LangOpts.CPlusPlus0x) 139a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier = true; 1408071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } else if (RecordDecl *Record = dyn_cast<RecordDecl>(ND)) { 1418071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (Record->isUnion()) 1428071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_UnionTag - 1)); 1438071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor else 1448071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts |= (1 << (CodeCompletionContext::CCC_ClassOrStructTag - 1)); 1458071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1468071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor if (LangOpts.CPlusPlus) 147a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier = true; 14852779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor } else if (isa<ClassTemplateDecl>(ND)) 149a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier = true; 1508071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } else if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND)) { 1518071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Values can appear in these contexts. 1528071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts = (1 << (CodeCompletionContext::CCC_Statement - 1)) 1538071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor | (1 << (CodeCompletionContext::CCC_Expression - 1)) 1540268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1)) 1558071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1)); 1568071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } else if (isa<ObjCProtocolDecl>(ND)) { 1578071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor Contexts = (1 << (CodeCompletionContext::CCC_ObjCProtocolName - 1)); 1588071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } else if (isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) { 159a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Contexts = (1 << (CodeCompletionContext::CCC_Namespace - 1)); 1608071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1618071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor // Part of the nested-name-specifier. 162a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier = true; 1638071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 1648071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 1658071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor return Contexts; 1668071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor} 1678071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 16887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregorvoid ASTUnit::CacheCodeCompletionResults() { 16987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (!TheSema) 17087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor return; 17187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 17287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor llvm::Timer *CachingTimer = 0; 17387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (TimerGroup.get()) { 17487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachingTimer = new llvm::Timer("Cache global code completions", 17587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor *TimerGroup); 17687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachingTimer->startTimer(); 17787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Timers.push_back(CachingTimer); 17887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 17987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 18087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Clear out the previous results. 18187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor ClearCachedCompletionResults(); 18287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 18387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Gather the set of global code completions. 1840a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 18587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor llvm::SmallVector<Result, 8> Results; 18687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor TheSema->GatherGlobalCodeCompletions(Results); 18787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 18887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Translate global code completions into cached completions. 189f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor llvm::DenseMap<CanQualType, unsigned> CompletionTypes; 190f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor 19187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor for (unsigned I = 0, N = Results.size(); I != N; ++I) { 19287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor switch (Results[I].Kind) { 1938071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor case Result::RK_Declaration: { 194a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor bool IsNestedNameSpecifier = false; 1958071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedCodeCompletionResult CachedResult; 1968071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedResult.Completion = Results[I].CreateCodeCompletionString(*TheSema); 1978071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedResult.ShowInContexts = getDeclShowContexts(Results[I].Declaration, 198a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Ctx->getLangOptions(), 199a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier); 2008071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedResult.Priority = Results[I].Priority; 2018071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedResult.Kind = Results[I].CursorKind; 20258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CachedResult.Availability = Results[I].Availability; 203c4421e966d77a18f815284175b3fcbb46f36fa39Douglas Gregor 204f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor // Keep track of the type of this completion in an ASTContext-agnostic 205f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor // way. 206c4421e966d77a18f815284175b3fcbb46f36fa39Douglas Gregor QualType UsageType = getDeclUsageType(*Ctx, Results[I].Declaration); 207f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor if (UsageType.isNull()) { 208c4421e966d77a18f815284175b3fcbb46f36fa39Douglas Gregor CachedResult.TypeClass = STC_Void; 209f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedResult.Type = 0; 210f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor } else { 211f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CanQualType CanUsageType 212f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor = Ctx->getCanonicalType(UsageType.getUnqualifiedType()); 213f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedResult.TypeClass = getSimplifiedTypeClass(CanUsageType); 214f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor 215f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor // Determine whether we have already seen this type. If so, we save 216f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor // ourselves the work of formatting the type string by using the 217f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor // temporary, CanQualType-based hash table to find the associated value. 218f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor unsigned &TypeValue = CompletionTypes[CanUsageType]; 219f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor if (TypeValue == 0) { 220f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor TypeValue = CompletionTypes.size(); 221f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedCompletionTypes[QualType(CanUsageType).getAsString()] 222f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor = TypeValue; 223f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor } 224f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor 225f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedResult.Type = TypeValue; 226c4421e966d77a18f815284175b3fcbb46f36fa39Douglas Gregor } 227f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor 2288071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor CachedCompletionResults.push_back(CachedResult); 229a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 230a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor /// Handle nested-name-specifiers in C++. 231a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (TheSema->Context.getLangOptions().CPlusPlus && 232a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor IsNestedNameSpecifier && !Results[I].StartsNestedNameSpecifier) { 233a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor // The contexts in which a nested-name-specifier can appear in C++. 234a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor unsigned NNSContexts 235a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor = (1 << (CodeCompletionContext::CCC_TopLevel - 1)) 236a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCIvarList - 1)) 237a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_ClassStructUnion - 1)) 238a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_Statement - 1)) 239a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_Expression - 1)) 240a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1)) 241a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_EnumTag - 1)) 242a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_UnionTag - 1)) 243a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor | (1 << (CodeCompletionContext::CCC_ClassOrStructTag - 1)) 2442ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor | (1 << (CodeCompletionContext::CCC_Type - 1)) 2450268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_PotentiallyQualifiedName - 1)) 2460268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1)); 247a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 248a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (isa<NamespaceDecl>(Results[I].Declaration) || 249a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor isa<NamespaceAliasDecl>(Results[I].Declaration)) 250a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor NNSContexts |= (1 << (CodeCompletionContext::CCC_Namespace - 1)); 251a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor 252a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor if (unsigned RemainingContexts 253a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor = NNSContexts & ~CachedResult.ShowInContexts) { 254a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor // If there any contexts where this completion can be a 255a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor // nested-name-specifier but isn't already an option, create a 256a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor // nested-name-specifier completion. 257a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Results[I].StartsNestedNameSpecifier = true; 258a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedResult.Completion = Results[I].CreateCodeCompletionString(*TheSema); 259a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedResult.ShowInContexts = RemainingContexts; 260a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedResult.Priority = CCP_NestedNameSpecifier; 261a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedResult.TypeClass = STC_Void; 262a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedResult.Type = 0; 263a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor CachedCompletionResults.push_back(CachedResult); 264a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 265a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor } 26687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 2678071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor } 2688071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor 26987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor case Result::RK_Keyword: 27087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor case Result::RK_Pattern: 27187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Ignore keywords and patterns; we don't care, since they are so 27287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // easily regenerated. 27387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 27487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 27587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor case Result::RK_Macro: { 27687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedCodeCompletionResult CachedResult; 27787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedResult.Completion = Results[I].CreateCodeCompletionString(*TheSema); 27887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedResult.ShowInContexts 27987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor = (1 << (CodeCompletionContext::CCC_TopLevel - 1)) 28087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCInterface - 1)) 28187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCImplementation - 1)) 28287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCIvarList - 1)) 28387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ClassStructUnion - 1)) 28487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_Statement - 1)) 28587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_Expression - 1)) 2861fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1)) 287f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor | (1 << (CodeCompletionContext::CCC_MacroNameUse - 1)) 2880268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_PreprocessorExpression - 1)) 2890268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1)); 2900268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 2912ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor 29287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedResult.Priority = Results[I].Priority; 29387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedResult.Kind = Results[I].CursorKind; 29458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor CachedResult.Availability = Results[I].Availability; 2951827e10051638770ad9ccf3e285caf95f995afd1Douglas Gregor CachedResult.TypeClass = STC_Void; 296f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedResult.Type = 0; 29787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedCompletionResults.push_back(CachedResult); 29887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor break; 29987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 30087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 30187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Results[I].Destroy(); 30287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 30387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 30487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (CachingTimer) 30587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachingTimer->stopTimer(); 306727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor 307727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor // Make a note of the state when we performed this caching. 308727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor NumTopLevelDeclsAtLastCompletionCache = top_level_size(); 309727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor CacheCodeCompletionCoolDown = 15; 31087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 31187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 31287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregorvoid ASTUnit::ClearCachedCompletionResults() { 31387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor for (unsigned I = 0, N = CachedCompletionResults.size(); I != N; ++I) 31487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor delete CachedCompletionResults[I].Completion; 31587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CachedCompletionResults.clear(); 316f5586f6b311c98e1022a8fe0609053849b70d323Douglas Gregor CachedCompletionTypes.clear(); 31787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 31887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 3190853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidisnamespace { 3200853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 321c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl/// \brief Gathers information from ASTReader that will be used to initialize 3220853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis/// a Preprocessor. 3233c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redlclass ASTInfoCollector : public ASTReaderListener { 3240853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis LangOptions &LangOpt; 3250853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis HeaderSearch &HSI; 3260853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string &TargetTriple; 3270853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string &Predefines; 3280853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis unsigned &Counter; 3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3300853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis unsigned NumHeaderInfos; 3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3320853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidispublic: 3333c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl ASTInfoCollector(LangOptions &LangOpt, HeaderSearch &HSI, 3340853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string &TargetTriple, std::string &Predefines, 3350853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis unsigned &Counter) 3360853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis : LangOpt(LangOpt), HSI(HSI), TargetTriple(TargetTriple), 3370853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis Predefines(Predefines), Counter(Counter), NumHeaderInfos(0) {} 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3390853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis virtual bool ReadLanguageOptions(const LangOptions &LangOpts) { 3400853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis LangOpt = LangOpts; 3410853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis return false; 3420853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344dc3c0d20375bda7775b2fade05b20e315798b9feDaniel Dunbar virtual bool ReadTargetTriple(llvm::StringRef Triple) { 3450853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis TargetTriple = Triple; 3460853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis return false; 3470853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 349cb481aacdc0f08e225c68c99c65351b367042475Sebastian Redl virtual bool ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers, 3507b5a1210d93ca62ecd61800f245c87259b1f8f79Daniel Dunbar llvm::StringRef OriginalFileName, 3510853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string &SuggestedPredefines) { 352cb481aacdc0f08e225c68c99c65351b367042475Sebastian Redl Predefines = Buffers[0].Data; 353cb481aacdc0f08e225c68c99c65351b367042475Sebastian Redl for (unsigned I = 1, N = Buffers.size(); I != N; ++I) { 354cb481aacdc0f08e225c68c99c65351b367042475Sebastian Redl Predefines += Buffers[I].Data; 355cb481aacdc0f08e225c68c99c65351b367042475Sebastian Redl } 3560853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis return false; 3570853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359ec1afbfd8e880d0169aab0ececa2e7e1611f4955Douglas Gregor virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID) { 3600853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis HSI.setHeaderFileInfoForUID(HFI, NumHeaderInfos++); 3610853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 3621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3630853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis virtual void ReadCounter(unsigned Value) { 3640853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis Counter = Value; 3650853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 3660853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis}; 3670853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 368a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclass StoredDiagnosticClient : public DiagnosticClient { 369a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor llvm::SmallVectorImpl<StoredDiagnostic> &StoredDiags; 370a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 371a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorpublic: 372a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor explicit StoredDiagnosticClient( 373a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor llvm::SmallVectorImpl<StoredDiagnostic> &StoredDiags) 374a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor : StoredDiags(StoredDiags) { } 375a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 376a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor virtual void HandleDiagnostic(Diagnostic::Level Level, 377a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const DiagnosticInfo &Info); 378a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor}; 379a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 380a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor/// \brief RAII object that optionally captures diagnostics, if 381a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor/// there is no diagnostic client to capture them already. 382a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorclass CaptureDroppedDiagnostics { 383a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor Diagnostic &Diags; 384a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor StoredDiagnosticClient Client; 385a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor DiagnosticClient *PreviousClient; 386a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 387a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorpublic: 388a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor CaptureDroppedDiagnostics(bool RequestCapture, Diagnostic &Diags, 389a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor llvm::SmallVectorImpl<StoredDiagnostic> &StoredDiags) 390bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor : Diags(Diags), Client(StoredDiags), PreviousClient(0) 391a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor { 392bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor if (RequestCapture || Diags.getClient() == 0) { 393bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor PreviousClient = Diags.takeClient(); 394a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor Diags.setClient(&Client); 395bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor } 396a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor } 397a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 398a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor ~CaptureDroppedDiagnostics() { 399bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor if (Diags.getClient() == &Client) { 400bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor Diags.takeClient(); 401bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor Diags.setClient(PreviousClient); 402bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor } 403a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor } 404a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor}; 405a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 4060853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis} // anonymous namespace 4070853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 408a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregorvoid StoredDiagnosticClient::HandleDiagnostic(Diagnostic::Level Level, 409a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const DiagnosticInfo &Info) { 410a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor StoredDiags.push_back(StoredDiagnostic(Level, Info)); 411a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor} 412a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 41377accc11f04ed4ff9afd4e27d430144d4714be56Steve Naroffconst std::string &ASTUnit::getOriginalSourceFileName() { 41468d40e2d16b9fadba386853d6bbb60089291fdc5Daniel Dunbar return OriginalSourceFile; 41577accc11f04ed4ff9afd4e27d430144d4714be56Steve Naroff} 4160853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 4173c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redlconst std::string &ASTUnit::getASTFileName() { 4183c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl assert(isMainFileAST() && "Not an ASTUnit from an AST file!"); 419c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl return static_cast<ASTReader *>(Ctx->getExternalSource())->getFileName(); 420e19944c93961b7618f4f3f3185f698f46369ea54Steve Naroff} 421e19944c93961b7618f4f3f3185f698f46369ea54Steve Naroff 4223c7f4134603d04b44f997b43c0a9def270f25386Sebastian RedlASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename, 42328019772db70d4547be05a042eb950bc910f134fDouglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diags, 4245cf48766d626ff6b223acc9d4b7e415ca8480836Ted Kremenek bool OnlyLocalDecls, 4254db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor RemappedFile *RemappedFiles, 426a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned NumRemappedFiles, 427a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor bool CaptureDiagnostics) { 4283687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor llvm::OwningPtr<ASTUnit> AST(new ASTUnit(true)); 4293687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor 43028019772db70d4547be05a042eb950bc910f134fDouglas Gregor if (!Diags.getPtr()) { 4313687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor // No diagnostics engine was provided, so create our own diagnostics object 4323687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor // with the default options. 4333687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor DiagnosticOptions DiagOpts; 43428019772db70d4547be05a042eb950bc910f134fDouglas Gregor Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); 4353687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor } 436abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 437abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST->CaptureDiagnostics = CaptureDiagnostics; 4387d1d49d2971b20a97b3c2a301470b9eaaa130137Douglas Gregor AST->OnlyLocalDecls = OnlyLocalDecls; 43928019772db70d4547be05a042eb950bc910f134fDouglas Gregor AST->Diagnostics = Diags; 4403687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->FileMgr.reset(new FileManager); 4413687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->SourceMgr.reset(new SourceManager(AST->getDiagnostics())); 44236c4464ba6cfc2a63dc67c493ef2f5ab2aea09ccSteve Naroff AST->HeaderInfo.reset(new HeaderSearch(AST->getFileManager())); 443914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor 444a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor // If requested, capture diagnostics in the ASTUnit. 4453687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor CaptureDroppedDiagnostics Capture(CaptureDiagnostics, AST->getDiagnostics(), 446405634b215f19eec7183bd8005e34aa5a02f64a1Douglas Gregor AST->StoredDiagnostics); 447a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 4484db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor for (unsigned I = 0; I != NumRemappedFiles; ++I) { 4494db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Create the file entry for the file that we're mapping from. 4504db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor const FileEntry *FromFile 4514db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor = AST->getFileManager().getVirtualFile(RemappedFiles[I].first, 4524db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor RemappedFiles[I].second->getBufferSize(), 4534db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 0); 4544db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor if (!FromFile) { 4553687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->getDiagnostics().Report(diag::err_fe_remap_missing_from_file) 4564db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor << RemappedFiles[I].first; 457c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor delete RemappedFiles[I].second; 4584db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor continue; 4594db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor } 4604db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 4614db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Override the contents of the "from" file with the contents of 4624db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // the "to" file. 4634db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor AST->getSourceManager().overrideFileContents(FromFile, 4644db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor RemappedFiles[I].second); 4654db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor } 4664db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 4670853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis // Gather Info for preprocessor construction later on. 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4690853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis LangOptions LangInfo; 4700853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis HeaderSearch &HeaderInfo = *AST->HeaderInfo.get(); 4710853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string TargetTriple; 4720853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis std::string Predefines; 4730853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis unsigned Counter; 4740853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 475c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl llvm::OwningPtr<ASTReader> Reader; 4760853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 477c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl Reader.reset(new ASTReader(AST->getSourceManager(), AST->getFileManager(), 4783687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->getDiagnostics())); 4793c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl Reader->setListener(new ASTInfoCollector(LangInfo, HeaderInfo, TargetTriple, 480cc318939daaa50fc07f7d431caec3c8679893e9cDaniel Dunbar Predefines, Counter)); 481cc318939daaa50fc07f7d431caec3c8679893e9cDaniel Dunbar 4821d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl switch (Reader->ReadAST(Filename, ASTReader::MainFile)) { 483c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Success: 4840853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis break; 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 486c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Failure: 487c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::IgnorePCH: 4883687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->getDiagnostics().Report(diag::err_fe_unable_to_load_pch); 4890853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis return NULL; 4900853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis } 4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49268d40e2d16b9fadba386853d6bbb60089291fdc5Daniel Dunbar AST->OriginalSourceFile = Reader->getOriginalSourceFile(); 49368d40e2d16b9fadba386853d6bbb60089291fdc5Daniel Dunbar 4943c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // AST file loaded successfully. Now create the preprocessor. 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4960853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis // Get information about the target being compiled for. 497d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar // 4983c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // FIXME: This is broken, we should store the TargetOptions in the AST file. 499d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOptions TargetOpts; 500d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOpts.ABI = ""; 501875ab10245d3bf37252dd822aa1616bb0a391095John McCall TargetOpts.CXXABI = ""; 502d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOpts.CPU = ""; 503d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOpts.Features.clear(); 504d58c03f42ebb4e548c2b53fa25b1cfe02ebb9ac0Daniel Dunbar TargetOpts.Triple = TargetTriple; 5053687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->Target.reset(TargetInfo::CreateTargetInfo(AST->getDiagnostics(), 5063687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor TargetOpts)); 5073687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor AST->PP.reset(new Preprocessor(AST->getDiagnostics(), LangInfo, 5083687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor *AST->Target.get(), 50931b87d8006d4863dd9b17e515ac720941efc38e3Daniel Dunbar AST->getSourceManager(), HeaderInfo)); 5100853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis Preprocessor &PP = *AST->PP.get(); 5110853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 512d5b6126389e1e2fd89e498fe17da4bb44ece0302Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 5130853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis PP.setCounterValue(Counter); 514cc318939daaa50fc07f7d431caec3c8679893e9cDaniel Dunbar Reader->setPreprocessor(PP); 5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5160853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis // Create and initialize the ASTContext. 5170853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 5180853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis AST->Ctx.reset(new ASTContext(LangInfo, 51931b87d8006d4863dd9b17e515ac720941efc38e3Daniel Dunbar AST->getSourceManager(), 5200853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis *AST->Target.get(), 5210853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis PP.getIdentifierTable(), 5220853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis PP.getSelectorTable(), 5230853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis PP.getBuiltinInfo(), 5240853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis /* size_reserve = */0)); 5250853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis ASTContext &Context = *AST->Ctx.get(); 5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 527cc318939daaa50fc07f7d431caec3c8679893e9cDaniel Dunbar Reader->InitializeContext(Context); 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 529c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl // Attach the AST reader to the AST context as an external AST 5300853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis // source, so that declarations will be deserialized from the 5313c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl // AST file as needed. 532c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl ASTReader *ReaderPtr = Reader.get(); 533914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor llvm::OwningPtr<ExternalASTSource> Source(Reader.take()); 5340853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis Context.setExternalSource(Source); 5350853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis 536914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor // Create an AST consumer, even though it isn't used. 537914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor AST->Consumer.reset(new ASTConsumer); 538914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor 539c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl // Create a semantic analysis object and tell the AST reader about it. 540914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor AST->TheSema.reset(new Sema(PP, Context, *AST->Consumer)); 541914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor AST->TheSema->Initialize(); 542914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor ReaderPtr->InitializeSema(*AST->TheSema); 543914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor 5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return AST.take(); 5450853a02c3b04d96a3c432b883e403175c954cd81Argyrios Kyrtzidis} 546521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 547521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbarnamespace { 548521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 549f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbarclass TopLevelDeclTrackerConsumer : public ASTConsumer { 550f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar ASTUnit &Unit; 551f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar 552f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbarpublic: 553f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar TopLevelDeclTrackerConsumer(ASTUnit &_Unit) : Unit(_Unit) {} 554f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar 555f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar void HandleTopLevelDecl(DeclGroupRef D) { 556da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek for (DeclGroupRef::iterator it = D.begin(), ie = D.end(); it != ie; ++it) { 557da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek Decl *D = *it; 558da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek // FIXME: Currently ObjC method declarations are incorrectly being 559da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek // reported as top-level declarations, even though their DeclContext 560da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek // is the containing ObjC @interface/@implementation. This is a 561da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek // fundamental problem in the parser right now. 562da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek if (isa<ObjCMethodDecl>(D)) 563da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek continue; 564eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor Unit.addTopLevelDecl(D); 565da5a428bf3db404fe3c91b689cd87c68789d6db9Ted Kremenek } 566f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar } 56727372b4f1f402e95dd479ecf40c39ca71c15619fSebastian Redl 56827372b4f1f402e95dd479ecf40c39ca71c15619fSebastian Redl // We're not interested in "interesting" decls. 56927372b4f1f402e95dd479ecf40c39ca71c15619fSebastian Redl void HandleInterestingDecl(DeclGroupRef) {} 570f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar}; 571f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar 572f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbarclass TopLevelDeclTrackerAction : public ASTFrontendAction { 573f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbarpublic: 574f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar ASTUnit &Unit; 575f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar 576521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 577521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar llvm::StringRef InFile) { 578f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar return new TopLevelDeclTrackerConsumer(Unit); 579521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar } 580521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 581521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbarpublic: 582f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar TopLevelDeclTrackerAction(ASTUnit &_Unit) : Unit(_Unit) {} 583f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar 584521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar virtual bool hasCodeCompletionSupport() const { return false; } 585df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor virtual bool usesCompleteTranslationUnit() { 586df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor return Unit.isCompleteTranslationUnit(); 587df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 588521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar}; 589521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 5901d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregorclass PrecompilePreambleConsumer : public PCHGenerator { 5911d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor ASTUnit &Unit; 592eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor std::vector<Decl *> TopLevelDecls; 5931d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 5941d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregorpublic: 5951d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor PrecompilePreambleConsumer(ASTUnit &Unit, 5961d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor const Preprocessor &PP, bool Chaining, 5971d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor const char *isysroot, llvm::raw_ostream *Out) 5981d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor : PCHGenerator(PP, Chaining, isysroot, Out), Unit(Unit) { } 5991d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 600eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor virtual void HandleTopLevelDecl(DeclGroupRef D) { 6011d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor for (DeclGroupRef::iterator it = D.begin(), ie = D.end(); it != ie; ++it) { 6021d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor Decl *D = *it; 6031d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor // FIXME: Currently ObjC method declarations are incorrectly being 6041d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor // reported as top-level declarations, even though their DeclContext 6051d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor // is the containing ObjC @interface/@implementation. This is a 6061d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor // fundamental problem in the parser right now. 6071d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor if (isa<ObjCMethodDecl>(D)) 6081d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor continue; 609eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDecls.push_back(D); 610eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor } 611eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor } 612eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor 613eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor virtual void HandleTranslationUnit(ASTContext &Ctx) { 614eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor PCHGenerator::HandleTranslationUnit(Ctx); 615eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor if (!Unit.getDiagnostics().hasErrorOccurred()) { 616eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // Translate the top-level declarations we captured during 617eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // parsing into declaration IDs in the precompiled 618eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // preamble. This will allow us to deserialize those top-level 619eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // declarations when requested. 620eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor for (unsigned I = 0, N = TopLevelDecls.size(); I != N; ++I) 621eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor Unit.addTopLevelDeclFromPreamble( 622eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor getWriter().getDeclID(TopLevelDecls[I])); 6231d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor } 6241d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor } 6251d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor}; 6261d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 6271d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregorclass PrecompilePreambleAction : public ASTFrontendAction { 6281d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor ASTUnit &Unit; 6291d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 6301d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregorpublic: 6311d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor explicit PrecompilePreambleAction(ASTUnit &Unit) : Unit(Unit) {} 6321d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 6331d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 6341d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor llvm::StringRef InFile) { 6351d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor std::string Sysroot; 6361d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor llvm::raw_ostream *OS = 0; 6371d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor bool Chaining; 6381d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor if (GeneratePCHAction::ComputeASTConsumerArguments(CI, InFile, Sysroot, 6391d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor OS, Chaining)) 6401d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor return 0; 6411d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 6421d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor const char *isysroot = CI.getFrontendOpts().RelocatablePCH ? 6431d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor Sysroot.c_str() : 0; 6441d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor return new PrecompilePreambleConsumer(Unit, CI.getPreprocessor(), Chaining, 6451d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor isysroot, OS); 6461d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor } 6471d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 6481d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor virtual bool hasCodeCompletionSupport() const { return false; } 6491d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor virtual bool hasASTFileSupport() const { return false; } 650df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor virtual bool usesCompleteTranslationUnit() { return false; } 6511d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor}; 6521d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor 653521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar} 654521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 655abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor/// Parse the source file into a translation unit using the given compiler 656abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor/// invocation, replacing the current translation unit. 657abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor/// 658abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor/// \returns True if a failure occurred that causes the ASTUnit not to 659abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor/// contain any translation-unit information, false otherwise. 660754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregorbool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) { 66128233428da1ebec20c893d6297ae3191318940ddDouglas Gregor delete SavedMainFileBuffer; 66228233428da1ebec20c893d6297ae3191318940ddDouglas Gregor SavedMainFileBuffer = 0; 66328233428da1ebec20c893d6297ae3191318940ddDouglas Gregor 664671947b18dba342f9aba022ee992babef325a833Douglas Gregor if (!Invocation.get()) { 665671947b18dba342f9aba022ee992babef325a833Douglas Gregor delete OverrideMainBuffer; 666abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor return true; 667671947b18dba342f9aba022ee992babef325a833Douglas Gregor } 668abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 669521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // Create the compiler instance to use for building the AST. 670cb6dda1a7abe2fe30b0345bfbbf872cc73446678Daniel Dunbar CompilerInstance Clang; 671abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Clang.setInvocation(Invocation.take()); 672abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor OriginalSourceFile = Clang.getFrontendOpts().Inputs[0].second; 673abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 6741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Set up diagnostics, capturing any diagnostics that would 6751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // otherwise be dropped. 676abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Clang.setDiagnostics(&getDiagnostics()); 6771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CaptureDroppedDiagnostics Capture(CaptureDiagnostics, 6781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor getDiagnostics(), 6791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor StoredDiagnostics); 6803687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor 681521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // Create the target instance. 682521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.setTarget(TargetInfo::CreateTargetInfo(Clang.getDiagnostics(), 683521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.getTargetOpts())); 684671947b18dba342f9aba022ee992babef325a833Douglas Gregor if (!Clang.hasTarget()) { 685671947b18dba342f9aba022ee992babef325a833Douglas Gregor delete OverrideMainBuffer; 686abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor return true; 687671947b18dba342f9aba022ee992babef325a833Douglas Gregor } 688671947b18dba342f9aba022ee992babef325a833Douglas Gregor 689521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // Inform the target of the language options. 690521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // 691521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // FIXME: We shouldn't need to do this, the target should be immutable once 692521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // created. This complexity should be lifted elsewhere. 693521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.getTarget().setForcedLangOptions(Clang.getLangOpts()); 694abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 695521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar assert(Clang.getFrontendOpts().Inputs.size() == 1 && 696521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar "Invocation must have exactly one source file!"); 697c34ce3fa613d5e4a283e53615fceafd17390445bDaniel Dunbar assert(Clang.getFrontendOpts().Inputs[0].first != IK_AST && 698521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar "FIXME: AST inputs not yet supported here!"); 699faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar assert(Clang.getFrontendOpts().Inputs[0].first != IK_LLVM_IR && 700faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar "IR inputs not support here!"); 701521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar 702abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // Configure the various subsystems. 703abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // FIXME: Should we retain the previous file manager? 704abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor FileMgr.reset(new FileManager); 705abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor SourceMgr.reset(new SourceManager(getDiagnostics())); 706914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor TheSema.reset(); 707abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Ctx.reset(); 708abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor PP.reset(); 709abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 710abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // Clear out old caches and data. 711abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor TopLevelDecls.clear(); 712abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor CleanTemporaryFiles(); 713abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor PreprocessedEntitiesByFile.clear(); 714c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 715f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor if (!OverrideMainBuffer) { 716c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor StoredDiagnostics.clear(); 717f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor TopLevelDeclsInPreamble.clear(); 718f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor } 719f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor 720521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // Create a file manager object to provide access to and cache the filesystem. 721abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Clang.setFileManager(&getFileManager()); 722abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 723521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar // Create the source manager. 724abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Clang.setSourceManager(&getSourceManager()); 725abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 726f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // If the main file has been overridden due to the use of a preamble, 727f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // make that override happen and introduce the preamble. 728f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOptions &PreprocessorOpts = Clang.getPreprocessorOpts(); 7291abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor std::string PriorImplicitPCHInclude; 730f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (OverrideMainBuffer) { 731f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer); 732f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size(); 733f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.second 734f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor = PreambleEndsAtStartOfLine; 7351abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PriorImplicitPCHInclude = PreprocessorOpts.ImplicitPCHInclude; 736385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreprocessorOpts.ImplicitPCHInclude = PreambleFile; 737fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor PreprocessorOpts.DisablePCHValidation = true; 73828233428da1ebec20c893d6297ae3191318940ddDouglas Gregor 73928233428da1ebec20c893d6297ae3191318940ddDouglas Gregor // Keep track of the override buffer; 74028233428da1ebec20c893d6297ae3191318940ddDouglas Gregor SavedMainFileBuffer = OverrideMainBuffer; 741c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 742c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // The stored diagnostic has the old source manager in it; update 743c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // the locations to refer into the new source manager. Since we've 744c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // been careful to make sure that the source manager's state 745c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // before and after are identical, so that we can reuse the source 746c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // location itself. 747c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor for (unsigned I = 0, N = StoredDiagnostics.size(); I != N; ++I) { 748c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor FullSourceLoc Loc(StoredDiagnostics[I].getLocation(), 749c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor getSourceManager()); 750c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor StoredDiagnostics[I].setLocation(Loc); 751c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor } 752f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor } else { 753f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.first = 0; 754f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.second = false; 755f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor } 756f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 757abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor llvm::OwningPtr<TopLevelDeclTrackerAction> Act; 758abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Act.reset(new TopLevelDeclTrackerAction(*this)); 759f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar if (!Act->BeginSourceFile(Clang, Clang.getFrontendOpts().Inputs[0].second, 760d3598a65716e120aef45aa2841d730e03f7101feDaniel Dunbar Clang.getFrontendOpts().Inputs[0].first)) 761521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar goto error; 762abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 763f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar Act->Execute(); 764abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 76564a32baec6fdc7e5fbcba417a2754f78ab876245Daniel Dunbar // Steal the created target, context, and preprocessor, and take back the 76664a32baec6fdc7e5fbcba417a2754f78ab876245Daniel Dunbar // source and file managers. 767914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor TheSema.reset(Clang.takeSema()); 768914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor Consumer.reset(Clang.takeASTConsumer()); 769abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Ctx.reset(Clang.takeASTContext()); 770abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor PP.reset(Clang.takePreprocessor()); 771521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.takeSourceManager(); 772521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.takeFileManager(); 773abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Target.reset(Clang.takeTarget()); 774abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 775f772d1e2a5688572d07f42896a50ac57a4a41fe8Daniel Dunbar Act->EndSourceFile(); 776f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 777f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // Remove the overridden buffer we used for the preamble. 7781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (OverrideMainBuffer) { 779f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.eraseRemappedFile( 780f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 7811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PreprocessorOpts.ImplicitPCHInclude = PriorImplicitPCHInclude; 7821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 7831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 784abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Invocation.reset(Clang.takeInvocation()); 78587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 78687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // If we were asked to cache code-completion results and don't have any 78787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // results yet, do so now. 78887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (ShouldCacheCodeCompletionResults && CachedCompletionResults.empty()) 78987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CacheCodeCompletionResults(); 79087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 791abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor return false; 792abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 793521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbarerror: 794f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // Remove the overridden buffer we used for the preamble. 795fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor if (OverrideMainBuffer) { 796f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.eraseRemappedFile( 797f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 798fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor PreprocessorOpts.DisablePCHValidation = true; 7991abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PreprocessorOpts.ImplicitPCHInclude = PriorImplicitPCHInclude; 800671947b18dba342f9aba022ee992babef325a833Douglas Gregor delete OverrideMainBuffer; 801fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor } 802f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 803521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.takeSourceManager(); 804521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar Clang.takeFileManager(); 805abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Invocation.reset(Clang.takeInvocation()); 806abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor return true; 807abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor} 808abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 80944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor/// \brief Simple function to retrieve a path for a preamble precompiled header. 81044c181aec37789f25f6c15543c164416f72e562aDouglas Gregorstatic std::string GetPreamblePCHPath() { 81144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // FIXME: This is lame; sys::Path should provide this function (in particular, 81244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // it should know how to find the temporary files dir). 81344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // FIXME: This is really lame. I copied this code from the Driver! 814424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor // FIXME: This is a hack so that we can override the preamble file during 815424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor // crash-recovery testing, which is the only case where the preamble files 816424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor // are not necessarily cleaned up. 817424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor const char *TmpFile = ::getenv("CINDEXTEST_PREAMBLE_FILE"); 818424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor if (TmpFile) 819424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor return TmpFile; 820424668cc90a07f3f98b36dad252940a43ded83d8Douglas Gregor 82144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor std::string Error; 82244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor const char *TmpDir = ::getenv("TMPDIR"); 82344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!TmpDir) 82444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor TmpDir = ::getenv("TEMP"); 82544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!TmpDir) 82644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor TmpDir = ::getenv("TMP"); 827c6cb2b02f0f4b3f162985803df3729b4def32108Douglas Gregor#ifdef LLVM_ON_WIN32 828c6cb2b02f0f4b3f162985803df3729b4def32108Douglas Gregor if (!TmpDir) 829c6cb2b02f0f4b3f162985803df3729b4def32108Douglas Gregor TmpDir = ::getenv("USERPROFILE"); 830c6cb2b02f0f4b3f162985803df3729b4def32108Douglas Gregor#endif 83144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!TmpDir) 83244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor TmpDir = "/tmp"; 83344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor llvm::sys::Path P(TmpDir); 834c6cb2b02f0f4b3f162985803df3729b4def32108Douglas Gregor P.createDirectoryOnDisk(true); 83544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor P.appendComponent("preamble"); 8366bf1830875673d6bd6c5bfcd65c9dcabfb45958bDouglas Gregor P.appendSuffix("pch"); 83744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (P.createTemporaryFileOnDisk()) 83844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor return std::string(); 83944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 84044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor return P.str(); 84144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor} 84244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 843f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor/// \brief Compute the preamble for the main file, providing the source buffer 844f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor/// that corresponds to the main file along with a pair (bytes, start-of-line) 845f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor/// that describes the preamble. 846f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregorstd::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> > 847df95a13ec73d2cdaea79555cb412d767f4963120Douglas GregorASTUnit::ComputePreamble(CompilerInvocation &Invocation, 848df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor unsigned MaxLines, bool &CreatedBuffer) { 849175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor FrontendOptions &FrontendOpts = Invocation.getFrontendOpts(); 85044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor PreprocessorOptions &PreprocessorOpts 851175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor = Invocation.getPreprocessorOpts(); 852175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor CreatedBuffer = false; 853175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 85444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Try to determine if the main file has been remapped, either from the 85544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // command line (to another file) or directly through the compiler invocation 85644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // (to a memory buffer). 857175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor llvm::MemoryBuffer *Buffer = 0; 85844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].second); 85944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (const llvm::sys::FileStatus *MainFileStatus = MainFilePath.getFileStatus()) { 86044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Check whether there is a file-file remapping of the main file 86144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor for (PreprocessorOptions::remapped_file_iterator 862175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor M = PreprocessorOpts.remapped_file_begin(), 863175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor E = PreprocessorOpts.remapped_file_end(); 86444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor M != E; 86544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor ++M) { 86644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor llvm::sys::PathWithStatus MPath(M->first); 86744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (const llvm::sys::FileStatus *MStatus = MPath.getFileStatus()) { 86844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (MainFileStatus->uniqueID == MStatus->uniqueID) { 86944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // We found a remapping. Try to load the resulting, remapped source. 870175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedBuffer) { 87144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor delete Buffer; 872175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor CreatedBuffer = false; 873175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 874175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 87544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Buffer = llvm::MemoryBuffer::getFile(M->second); 87644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!Buffer) 877f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor return std::make_pair((llvm::MemoryBuffer*)0, 878f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor std::make_pair(0, true)); 879175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor CreatedBuffer = true; 88044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 881175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // Remove this remapping. We've captured the buffer already. 88244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor M = PreprocessorOpts.eraseRemappedFile(M); 88344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor E = PreprocessorOpts.remapped_file_end(); 884c1cf1586f7bbdf8a955a3be79309834ebc25c3afDaniel Dunbar if (M == E) 885c1cf1586f7bbdf8a955a3be79309834ebc25c3afDaniel Dunbar break; 88644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 88744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 88844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 88944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 89044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Check whether there is a file-buffer remapping. It supercedes the 89144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // file-file remapping. 89244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor for (PreprocessorOptions::remapped_file_buffer_iterator 89344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor M = PreprocessorOpts.remapped_file_buffer_begin(), 89444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor E = PreprocessorOpts.remapped_file_buffer_end(); 89544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor M != E; 89644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor ++M) { 89744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor llvm::sys::PathWithStatus MPath(M->first); 89844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (const llvm::sys::FileStatus *MStatus = MPath.getFileStatus()) { 89944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (MainFileStatus->uniqueID == MStatus->uniqueID) { 90044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // We found a remapping. 901175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedBuffer) { 90244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor delete Buffer; 903175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor CreatedBuffer = false; 904175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 90544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 906175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Buffer = const_cast<llvm::MemoryBuffer *>(M->second); 907175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 908175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // Remove this remapping. We've captured the buffer already. 90944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor M = PreprocessorOpts.eraseRemappedFile(M); 91044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor E = PreprocessorOpts.remapped_file_buffer_end(); 911c1cf1586f7bbdf8a955a3be79309834ebc25c3afDaniel Dunbar if (M == E) 912c1cf1586f7bbdf8a955a3be79309834ebc25c3afDaniel Dunbar break; 91344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 91444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 915175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 91644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 91744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 91844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // If the main source file was not remapped, load it now. 91944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!Buffer) { 92044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Buffer = llvm::MemoryBuffer::getFile(FrontendOpts.Inputs[0].second); 92144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!Buffer) 922f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor return std::make_pair((llvm::MemoryBuffer*)0, std::make_pair(0, true)); 923175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 924175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor CreatedBuffer = true; 925175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 926175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 927df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor return std::make_pair(Buffer, Lexer::ComputePreamble(Buffer, MaxLines)); 928175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor} 929175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 930754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregorstatic llvm::MemoryBuffer *CreatePaddedMainFileBuffer(llvm::MemoryBuffer *Old, 931754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor bool DeleteOld, 932754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor unsigned NewSize, 933754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor llvm::StringRef NewName) { 934754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor llvm::MemoryBuffer *Result 935754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor = llvm::MemoryBuffer::getNewUninitMemBuffer(NewSize, NewName); 936754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor memcpy(const_cast<char*>(Result->getBufferStart()), 937754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor Old->getBufferStart(), Old->getBufferSize()); 938754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor memset(const_cast<char*>(Result->getBufferStart()) + Old->getBufferSize(), 939f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor ' ', NewSize - Old->getBufferSize() - 1); 940f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor const_cast<char*>(Result->getBufferEnd())[-1] = '\n'; 941754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor 942754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor if (DeleteOld) 943754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor delete Old; 944754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor 945754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return Result; 946754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor} 947754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor 948175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// \brief Attempt to build or re-use a precompiled preamble when (re-)parsing 949175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// the source file. 950175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// 951175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// This routine will compute the preamble of the main source file. If a 952175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// non-trivial preamble is found, it will precompile that preamble into a 953175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// precompiled header so that the precompiled preamble can be used to reduce 954175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// reparsing time. If a precompiled preamble has already been constructed, 955175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// this routine will determine if it is still valid and, if so, avoid 956175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// rebuilding the precompiled preamble. 957175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor/// 958df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// \param AllowRebuild When true (the default), this routine is 959df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// allowed to rebuild the precompiled preamble if it is found to be 960df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// out-of-date. 961df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// 962df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// \param MaxLines When non-zero, the maximum number of lines that 963df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// can occur within the preamble. 964df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor/// 965754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor/// \returns If the precompiled preamble can be used, returns a newly-allocated 966754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor/// buffer that should be used in place of the main file when doing so. 967754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor/// Otherwise, returns a NULL pointer. 968df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregorllvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( 9692283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor CompilerInvocation PreambleInvocation, 970df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor bool AllowRebuild, 971df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor unsigned MaxLines) { 972175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor FrontendOptions &FrontendOpts = PreambleInvocation.getFrontendOpts(); 973175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor PreprocessorOptions &PreprocessorOpts 974175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor = PreambleInvocation.getPreprocessorOpts(); 975175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 976175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor bool CreatedPreambleBuffer = false; 977f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> > NewPreamble 978df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor = ComputePreamble(PreambleInvocation, MaxLines, CreatedPreambleBuffer); 979175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 980f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (!NewPreamble.second.first) { 981175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // We couldn't find a preamble in the main source. Clear out the current 982175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // preamble, if we have one. It's obviously no good any more. 983175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Preamble.clear(); 984175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (!PreambleFile.empty()) { 985385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::sys::Path(PreambleFile).eraseFromDisk(); 986175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor PreambleFile.clear(); 987175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 988175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedPreambleBuffer) 989175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor delete NewPreamble.first; 990eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor 991eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // The next time we actually see a preamble, precompile it. 992eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = 1; 993754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return 0; 99444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 99544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 996175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (!Preamble.empty()) { 997175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // We've previously computed a preamble. Check whether we have the same 998175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // preamble now that we did before, and that there's enough space in 999175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // the main-file buffer within the precompiled preamble to fit the 1000175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // new main file. 1001f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (Preamble.size() == NewPreamble.second.first && 1002f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreambleEndsAtStartOfLine == NewPreamble.second.second && 1003592508ed997e52207cf380f9b6eb9943994ad7aeDouglas Gregor NewPreamble.first->getBufferSize() < PreambleReservedSize-2 && 1004175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor memcmp(&Preamble[0], NewPreamble.first->getBufferStart(), 1005f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor NewPreamble.second.first) == 0) { 1006175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // The preamble has not changed. We may be able to re-use the precompiled 1007175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // preamble. 1008c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 1009cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // Check that none of the files used by the preamble have changed. 1010cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor bool AnyFileChanged = false; 1011cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1012cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // First, make a record of those files that have been overridden via 1013cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // remapping or unsaved_files. 1014cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor llvm::StringMap<std::pair<off_t, time_t> > OverriddenFiles; 1015cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor for (PreprocessorOptions::remapped_file_iterator 1016cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor R = PreprocessorOpts.remapped_file_begin(), 1017cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor REnd = PreprocessorOpts.remapped_file_end(); 1018cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor !AnyFileChanged && R != REnd; 1019cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor ++R) { 1020cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor struct stat StatBuf; 1021cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (stat(R->second.c_str(), &StatBuf)) { 1022cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // If we can't stat the file we're remapping to, assume that something 1023cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // horrible happened. 1024cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor AnyFileChanged = true; 1025cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor break; 1026cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1027754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor 1028cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor OverriddenFiles[R->first] = std::make_pair(StatBuf.st_size, 1029cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor StatBuf.st_mtime); 1030cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1031cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor for (PreprocessorOptions::remapped_file_buffer_iterator 1032cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor R = PreprocessorOpts.remapped_file_buffer_begin(), 1033cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor REnd = PreprocessorOpts.remapped_file_buffer_end(); 1034cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor !AnyFileChanged && R != REnd; 1035cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor ++R) { 1036cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // FIXME: Should we actually compare the contents of file->buffer 1037cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // remappings? 1038cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor OverriddenFiles[R->first] = std::make_pair(R->second->getBufferSize(), 1039cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 0); 1040cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1041cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1042cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // Check whether anything has changed. 1043cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor for (llvm::StringMap<std::pair<off_t, time_t> >::iterator 1044cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor F = FilesInPreamble.begin(), FEnd = FilesInPreamble.end(); 1045cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor !AnyFileChanged && F != FEnd; 1046cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor ++F) { 1047cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor llvm::StringMap<std::pair<off_t, time_t> >::iterator Overridden 1048cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor = OverriddenFiles.find(F->first()); 1049cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (Overridden != OverriddenFiles.end()) { 1050cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // This file was remapped; check whether the newly-mapped file 1051cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // matches up with the previous mapping. 1052cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (Overridden->second != F->second) 1053cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor AnyFileChanged = true; 1054cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor continue; 1055cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1056cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1057cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // The file was not remapped; check whether it has changed on disk. 1058cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor struct stat StatBuf; 1059cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (stat(F->first(), &StatBuf)) { 1060cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // If we can't stat the file, assume that something horrible happened. 1061cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor AnyFileChanged = true; 1062cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } else if (StatBuf.st_size != F->second.first || 1063cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor StatBuf.st_mtime != F->second.second) 1064cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor AnyFileChanged = true; 1065cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1066cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1067cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (!AnyFileChanged) { 1068c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // Okay! We can re-use the precompiled preamble. 1069c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 1070c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // Set the state of the diagnostic object to mimic its state 1071c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // after parsing the preamble. 1072c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor getDiagnostics().Reset(); 1073c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor getDiagnostics().setNumWarnings(NumWarningsInPreamble); 1074c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor if (StoredDiagnostics.size() > NumStoredDiagnosticsInPreamble) 1075c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor StoredDiagnostics.erase( 1076c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor StoredDiagnostics.begin() + NumStoredDiagnosticsInPreamble, 1077c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor StoredDiagnostics.end()); 1078c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 1079c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // Create a version of the main file buffer that is padded to 1080c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // buffer size we reserved when creating the preamble. 1081cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor return CreatePaddedMainFileBuffer(NewPreamble.first, 1082cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor CreatedPreambleBuffer, 1083cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor PreambleReservedSize, 1084cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor FrontendOpts.Inputs[0].second); 1085cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1086175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 1087df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 1088df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // If we aren't allowed to rebuild the precompiled preamble, just 1089df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // return now. 1090df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (!AllowRebuild) 1091df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor return 0; 1092175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 1093175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // We can't reuse the previously-computed preamble. Build a new one. 1094175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Preamble.clear(); 1095385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::sys::Path(PreambleFile).eraseFromDisk(); 1096eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = 1; 1097df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } else if (!AllowRebuild) { 1098df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // We aren't allowed to rebuild the precompiled preamble; just 1099df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // return now. 1100df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor return 0; 1101df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 1102eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor 1103eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // If the preamble rebuild counter > 1, it's because we previously 1104eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // failed to build a preamble and we're not yet ready to try 1105eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // again. Decrement the counter and return a failure. 1106eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor if (PreambleRebuildCounter > 1) { 1107eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor --PreambleRebuildCounter; 1108eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor return 0; 1109eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor } 1110eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor 11112cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor // Create a temporary file for the precompiled preamble. In rare 11122cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor // circumstances, this can fail. 11132cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor std::string PreamblePCHPath = GetPreamblePCHPath(); 11142cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor if (PreamblePCHPath.empty()) { 11152cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor // Try again next time. 11162cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor PreambleRebuildCounter = 1; 11172cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor return 0; 11182cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor } 11192cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor 1120175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // We did not previously compute a preamble, or it can't be reused anyway. 1121385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::Timer *PreambleTimer = 0; 1122385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (TimerGroup.get()) { 1123385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer = new llvm::Timer("Precompiling preamble", *TimerGroup); 1124385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer->startTimer(); 1125385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor Timers.push_back(PreambleTimer); 1126385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor } 112744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 112844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Create a new buffer that stores the preamble. The buffer also contains 112944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // extra space for the original contents of the file (which will be present 113044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // when we actually parse the file) along with more room in case the file 1131175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // grows. 1132175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor PreambleReservedSize = NewPreamble.first->getBufferSize(); 1133175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (PreambleReservedSize < 4096) 1134f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PreambleReservedSize = 8191; 113544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor else 1136175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor PreambleReservedSize *= 2; 1137175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 1138c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // Save the preamble text for later; we'll need to compare against it for 1139c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor // subsequent reparses. 1140c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor Preamble.assign(NewPreamble.first->getBufferStart(), 1141c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor NewPreamble.first->getBufferStart() 1142c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor + NewPreamble.second.first); 1143c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor PreambleEndsAtStartOfLine = NewPreamble.second.second; 1144c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor 1145671947b18dba342f9aba022ee992babef325a833Douglas Gregor delete PreambleBuffer; 1146671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreambleBuffer 1147175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor = llvm::MemoryBuffer::getNewUninitMemBuffer(PreambleReservedSize, 114844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor FrontendOpts.Inputs[0].second); 114944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor memcpy(const_cast<char*>(PreambleBuffer->getBufferStart()), 1150175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor NewPreamble.first->getBufferStart(), Preamble.size()); 1151175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor memset(const_cast<char*>(PreambleBuffer->getBufferStart()) + Preamble.size(), 1152f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor ' ', PreambleReservedSize - Preamble.size() - 1); 1153f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor const_cast<char*>(PreambleBuffer->getBufferEnd())[-1] = '\n'; 115444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 115544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Remap the main source file to the preamble buffer. 1156175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].second); 115744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor PreprocessorOpts.addRemappedFile(MainFilePath.str(), PreambleBuffer); 115844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 115944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Tell the compiler invocation to generate a temporary precompiled header. 116044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor FrontendOpts.ProgramAction = frontend::GeneratePCH; 116185e5191934143edfa9fed582149d8f85c99c753fDouglas Gregor FrontendOpts.ChainedPCH = true; 116244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // FIXME: Generate the precompiled header into memory? 11632cd4fd4b7554480cbea67b48de5e5d467d06e292Douglas Gregor FrontendOpts.OutputFile = PreamblePCHPath; 116444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 116544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Create the compiler instance to use for building the precompiled preamble. 116644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor CompilerInstance Clang; 116744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.setInvocation(&PreambleInvocation); 116844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor OriginalSourceFile = Clang.getFrontendOpts().Inputs[0].second; 116944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 11701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Set up diagnostics, capturing all of the diagnostics produced. 117144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.setDiagnostics(&getDiagnostics()); 11721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CaptureDroppedDiagnostics Capture(CaptureDiagnostics, 11731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor getDiagnostics(), 11741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor StoredDiagnostics); 117544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 117644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Create the target instance. 117744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.setTarget(TargetInfo::CreateTargetInfo(Clang.getDiagnostics(), 117844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.getTargetOpts())); 117944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!Clang.hasTarget()) { 1180175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk(); 1181175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Preamble.clear(); 1182175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedPreambleBuffer) 1183175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor delete NewPreamble.first; 1184385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (PreambleTimer) 1185385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer->stopTimer(); 1186eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = DefaultPreambleRebuildInterval; 1187671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.eraseRemappedFile( 1188671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 1189754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return 0; 119044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 119144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 119244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Inform the target of the language options. 119344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // 119444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // FIXME: We shouldn't need to do this, the target should be immutable once 119544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // created. This complexity should be lifted elsewhere. 119644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.getTarget().setForcedLangOptions(Clang.getLangOpts()); 119744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 119844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor assert(Clang.getFrontendOpts().Inputs.size() == 1 && 119944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor "Invocation must have exactly one source file!"); 120044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor assert(Clang.getFrontendOpts().Inputs[0].first != IK_AST && 120144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor "FIXME: AST inputs not yet supported here!"); 120244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor assert(Clang.getFrontendOpts().Inputs[0].first != IK_LLVM_IR && 120344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor "IR inputs not support here!"); 120444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 120544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Clear out old caches and data. 120644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor StoredDiagnostics.clear(); 1207eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDecls.clear(); 1208eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDeclsInPreamble.clear(); 120944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 121044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Create a file manager object to provide access to and cache the filesystem. 121144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.setFileManager(new FileManager); 121244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 121344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor // Create the source manager. 121444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.setSourceManager(new SourceManager(getDiagnostics())); 121544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 12161d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor llvm::OwningPtr<PrecompilePreambleAction> Act; 12171d715ac14bf440664fb0d1425ea882274f994f57Douglas Gregor Act.reset(new PrecompilePreambleAction(*this)); 121844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor if (!Act->BeginSourceFile(Clang, Clang.getFrontendOpts().Inputs[0].second, 121944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.getFrontendOpts().Inputs[0].first)) { 122044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.takeInvocation(); 1221175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk(); 1222175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Preamble.clear(); 1223175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedPreambleBuffer) 1224175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor delete NewPreamble.first; 1225385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (PreambleTimer) 1226385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer->stopTimer(); 1227eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = DefaultPreambleRebuildInterval; 1228671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.eraseRemappedFile( 1229671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 1230754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return 0; 123144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor } 123244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 123344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Act->Execute(); 123444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Act->EndSourceFile(); 123544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Clang.takeInvocation(); 123644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 1237eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor if (Diagnostics->hasErrorOccurred()) { 1238175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // There were errors parsing the preamble, so no precompiled header was 1239175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // generated. Forget that we even tried. 124006e504462014b0506a70c7730ea45c551a103364Douglas Gregor // FIXME: Should we leave a note for ourselves to try again? 1241175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk(); 1242175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor Preamble.clear(); 1243175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor if (CreatedPreambleBuffer) 1244175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor delete NewPreamble.first; 1245385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (PreambleTimer) 1246385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer->stopTimer(); 1247eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDeclsInPreamble.clear(); 1248eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = DefaultPreambleRebuildInterval; 1249671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.eraseRemappedFile( 1250671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 1251754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return 0; 1252175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor } 1253175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 1254175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // Keep track of the preamble we precompiled. 1255175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor PreambleFile = FrontendOpts.OutputFile; 1256c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor NumStoredDiagnosticsInPreamble = StoredDiagnostics.size(); 1257c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor NumWarningsInPreamble = getDiagnostics().getNumWarnings(); 1258cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1259cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // Keep track of all of the files that the source manager knows about, 1260cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // so we can verify whether they have changed or not. 1261cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor FilesInPreamble.clear(); 1262cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor SourceManager &SourceMgr = Clang.getSourceManager(); 1263cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor const llvm::MemoryBuffer *MainFileBuffer 1264cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor = SourceMgr.getBuffer(SourceMgr.getMainFileID()); 1265cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor for (SourceManager::fileinfo_iterator F = SourceMgr.fileinfo_begin(), 1266cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor FEnd = SourceMgr.fileinfo_end(); 1267cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor F != FEnd; 1268cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor ++F) { 1269cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor const FileEntry *File = F->second->Entry; 1270cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor if (!File || F->second->getRawBuffer() == MainFileBuffer) 1271cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor continue; 1272cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1273cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor FilesInPreamble[File->getName()] 1274cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor = std::make_pair(F->second->getSize(), File->getModificationTime()); 1275cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor } 1276cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1277385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (PreambleTimer) 1278385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor PreambleTimer->stopTimer(); 127906e504462014b0506a70c7730ea45c551a103364Douglas Gregor 1280eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor PreambleRebuildCounter = 1; 1281671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.eraseRemappedFile( 1282671947b18dba342f9aba022ee992babef325a833Douglas Gregor PreprocessorOpts.remapped_file_buffer_end() - 1); 1283754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor return CreatePaddedMainFileBuffer(NewPreamble.first, 1284754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor CreatedPreambleBuffer, 1285754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor PreambleReservedSize, 1286754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor FrontendOpts.Inputs[0].second); 128744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor} 1288abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1289eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregorvoid ASTUnit::RealizeTopLevelDeclsFromPreamble() { 1290eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor std::vector<Decl *> Resolved; 1291eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor Resolved.reserve(TopLevelDeclsInPreamble.size()); 1292eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor ExternalASTSource &Source = *getASTContext().getExternalSource(); 1293eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor for (unsigned I = 0, N = TopLevelDeclsInPreamble.size(); I != N; ++I) { 1294eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // Resolve the declaration ID to an actual declaration, possibly 1295eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor // deserializing the declaration in the process. 1296eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor Decl *D = Source.GetExternalDecl(TopLevelDeclsInPreamble[I]); 1297eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor if (D) 1298eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor Resolved.push_back(D); 1299eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor } 1300eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDeclsInPreamble.clear(); 1301eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor TopLevelDecls.insert(TopLevelDecls.begin(), Resolved.begin(), Resolved.end()); 1302eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor} 1303eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor 1304eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregorunsigned ASTUnit::getMaxPCHLevel() const { 1305eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor if (!getOnlyLocalDecls()) 1306eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor return Decl::MaxPCHLevel; 1307eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor 13081d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl return 0; 1309eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor} 1310eb8837b88c18631c69ac75f64ab1853762063180Douglas Gregor 1311abc563f554951259bbe0315055cad92ee14d87e4Douglas GregorASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI, 1312abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diags, 1313abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor bool OnlyLocalDecls, 131444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor bool CaptureDiagnostics, 1315df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor bool PrecompilePreamble, 131687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor bool CompleteTranslationUnit, 131787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor bool CacheCodeCompletionResults) { 1318abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor if (!Diags.getPtr()) { 1319abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // No diagnostics engine was provided, so create our own diagnostics object 1320abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // with the default options. 1321abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor DiagnosticOptions DiagOpts; 1322abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); 1323abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor } 1324abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1325abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // Create the AST unit. 1326abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor llvm::OwningPtr<ASTUnit> AST; 1327abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST.reset(new ASTUnit(false)); 1328abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST->Diagnostics = Diags; 1329abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST->CaptureDiagnostics = CaptureDiagnostics; 1330abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST->OnlyLocalDecls = OnlyLocalDecls; 1331df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor AST->CompleteTranslationUnit = CompleteTranslationUnit; 133287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults; 1333abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor AST->Invocation.reset(CI); 1334f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor CI->getPreprocessorOpts().RetainRemappedFileBuffers = true; 1335abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1336385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (getenv("LIBCLANG_TIMING")) 1337385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor AST->TimerGroup.reset( 1338385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor new llvm::TimerGroup(CI->getFrontendOpts().Inputs[0].second)); 1339385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor 1340385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor 1341754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor llvm::MemoryBuffer *OverrideMainBuffer = 0; 1342fd0b87006b478bb573d369385aed64a58225264dDouglas Gregor // FIXME: When C++ PCH is ready, allow use of it for a precompiled preamble. 1343eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor if (PrecompilePreamble && !CI->getLangOpts().CPlusPlus) { 1344eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor AST->PreambleRebuildCounter = 1; 13452283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor OverrideMainBuffer 13462283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor = AST->getMainBufferWithPrecompiledPreamble(*AST->Invocation); 1347eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor } 134844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor 1349385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::Timer *ParsingTimer = 0; 1350385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (AST->TimerGroup.get()) { 1351385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ParsingTimer = new llvm::Timer("Initial parse", *AST->TimerGroup); 1352385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ParsingTimer->startTimer(); 1353385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor AST->Timers.push_back(ParsingTimer); 1354385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor } 1355abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1356385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor bool Failed = AST->Parse(OverrideMainBuffer); 1357385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (ParsingTimer) 1358385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ParsingTimer->stopTimer(); 1359385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor 1360385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor return Failed? 0 : AST.take(); 1361521bf9c529e653ab28896d027352d3e16e2672d5Daniel Dunbar} 13627b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 13637b55668db7618334cc40011d3c1e128524d89462Daniel DunbarASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, 13647b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar const char **ArgEnd, 136528019772db70d4547be05a042eb950bc910f134fDouglas Gregor llvm::IntrusiveRefCntPtr<Diagnostic> Diags, 1366869824e87940f97b87064db2df2861e82e08a8c6Daniel Dunbar llvm::StringRef ResourceFilesPath, 13677b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar bool OnlyLocalDecls, 13684db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor RemappedFile *RemappedFiles, 1369a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor unsigned NumRemappedFiles, 137044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor bool CaptureDiagnostics, 1371df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor bool PrecompilePreamble, 137287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor bool CompleteTranslationUnit, 137387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor bool CacheCodeCompletionResults) { 1374bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor bool CreatedDiagnosticsObject = false; 1375bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor 137628019772db70d4547be05a042eb950bc910f134fDouglas Gregor if (!Diags.getPtr()) { 13773687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor // No diagnostics engine was provided, so create our own diagnostics object 13783687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor // with the default options. 13793687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor DiagnosticOptions DiagOpts; 138028019772db70d4547be05a042eb950bc910f134fDouglas Gregor Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0); 1381bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor CreatedDiagnosticsObject = true; 13823687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor } 13833687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor 13847b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar llvm::SmallVector<const char *, 16> Args; 13857b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar Args.push_back("<clang>"); // FIXME: Remove dummy argument. 13867b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar Args.insert(Args.end(), ArgBegin, ArgEnd); 13877b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 13887b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar // FIXME: Find a cleaner way to force the driver into restricted modes. We 13897b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar // also want to force it to use clang. 13907b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar Args.push_back("-fsyntax-only"); 13917b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 1392869824e87940f97b87064db2df2861e82e08a8c6Daniel Dunbar // FIXME: We shouldn't have to pass in the path info. 13930bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar driver::Driver TheDriver("clang", llvm::sys::getHostTriple(), 13943687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor "a.out", false, false, *Diags); 13953bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar 13963bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar // Don't check that inputs exist, they have been remapped. 13973bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar TheDriver.setCheckInputsExist(false); 13983bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar 13997b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar llvm::OwningPtr<driver::Compilation> C( 14007b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar TheDriver.BuildCompilation(Args.size(), Args.data())); 14017b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 14027b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar // We expect to get back exactly one command job, if we didn't something 14037b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar // failed. 14047b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar const driver::JobList &Jobs = C->getJobs(); 14057b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar if (Jobs.size() != 1 || !isa<driver::Command>(Jobs.begin())) { 14067b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar llvm::SmallString<256> Msg; 14077b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar llvm::raw_svector_ostream OS(Msg); 14087b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar C->PrintJob(OS, C->getJobs(), "; ", true); 14093687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor Diags->Report(diag::err_fe_expected_compiler_job) << OS.str(); 14107b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar return 0; 14117b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar } 14127b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 14137b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar const driver::Command *Cmd = cast<driver::Command>(*Jobs.begin()); 14147b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar if (llvm::StringRef(Cmd->getCreator().getName()) != "clang") { 14153687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor Diags->Report(diag::err_fe_expected_clang_command); 14167b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar return 0; 14177b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar } 14187b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 14197b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar const driver::ArgStringList &CCArgs = Cmd->getArguments(); 1420807b06157a1a5c050520fc194d32f16d22d423a8Daniel Dunbar llvm::OwningPtr<CompilerInvocation> CI(new CompilerInvocation); 1421cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman CompilerInvocation::CreateFromArgs(*CI, 1422cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<const char **>(CCArgs.data()), 1423cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman const_cast<const char **>(CCArgs.data()) + 142444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor CCArgs.size(), 14253687e9d3a5dbfa9963af02a49a2b139d91310813Douglas Gregor *Diags); 14261e69fe3a9f0a42b32a3000bda51677d51416564eDaniel Dunbar 14274db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Override any files that need remapping 14284db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor for (unsigned I = 0; I != NumRemappedFiles; ++I) 1429807b06157a1a5c050520fc194d32f16d22d423a8Daniel Dunbar CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, 1430b26d483a9f7fdc815e87bbbac4af916307b4c07dDaniel Dunbar RemappedFiles[I].second); 14314db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 14328b9adfea5e834eaee0f45d8cc7fb052d68df4a46Daniel Dunbar // Override the resources path. 1433807b06157a1a5c050520fc194d32f16d22d423a8Daniel Dunbar CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath; 14347b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar 1435f421089b73800066bbf43613c9a8422a96c1b0c3Douglas Gregor CI->getFrontendOpts().DisableFree = false; 1436a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor return LoadFromCompilerInvocation(CI.take(), Diags, OnlyLocalDecls, 1437df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor CaptureDiagnostics, PrecompilePreamble, 143887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CompleteTranslationUnit, 143987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CacheCodeCompletionResults); 14407b55668db7618334cc40011d3c1e128524d89462Daniel Dunbar} 1441abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1442abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregorbool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) { 1443abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor if (!Invocation.get()) 1444abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor return true; 1445abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1446385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor llvm::Timer *ReparsingTimer = 0; 1447385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (TimerGroup.get()) { 1448385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ReparsingTimer = new llvm::Timer("Reparse", *TimerGroup); 1449385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ReparsingTimer->startTimer(); 1450385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor Timers.push_back(ReparsingTimer); 1451385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor } 1452385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor 1453cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor // Remap files. 1454f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 1455f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor for (PreprocessorOptions::remapped_file_buffer_iterator 1456f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor R = PPOpts.remapped_file_buffer_begin(), 1457f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor REnd = PPOpts.remapped_file_buffer_end(); 1458f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor R != REnd; 1459f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor ++R) { 1460f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor delete R->second; 1461f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor } 1462cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor Invocation->getPreprocessorOpts().clearRemappedFiles(); 1463cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor for (unsigned I = 0; I != NumRemappedFiles; ++I) 1464cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, 1465cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor RemappedFiles[I].second); 1466cc5888d833caf90ebda37f24da40d2cd06b4d820Douglas Gregor 1467eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // If we have a preamble file lying around, or if we might try to 1468eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor // build a precompiled preamble, do so now. 1469754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor llvm::MemoryBuffer *OverrideMainBuffer = 0; 1470eababfbddb74d186f78783a9731a78ad371c9800Douglas Gregor if (!PreambleFile.empty() || PreambleRebuildCounter > 0) 14712283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation); 1472175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor 1473abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor // Clear out the diagnostics state. 1474c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor if (!OverrideMainBuffer) 1475c0659ec614c428c7d15746fcad15d50a2703751dDouglas Gregor getDiagnostics().Reset(); 1476abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor 1477175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor // Parse the sources 1478754f3490c5b0f5d83361f001bc87944f23644abbDouglas Gregor bool Result = Parse(OverrideMainBuffer); 1479385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor if (ReparsingTimer) 1480385103b79c5338a2be5da0ca70652400bc267371Douglas Gregor ReparsingTimer->stopTimer(); 1481727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor 1482727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor if (ShouldCacheCodeCompletionResults) { 1483727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor if (CacheCodeCompletionCoolDown > 0) 1484727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor --CacheCodeCompletionCoolDown; 1485727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor else if (top_level_size() != NumTopLevelDeclsAtLastCompletionCache) 1486727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor CacheCodeCompletionResults(); 1487727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor } 1488727d93ef49e18147149354fadd10e86b13bc4ab0Douglas Gregor 1489175c4a9aa61f4449f27b729737e4438684ac6d92Douglas Gregor return Result; 1490abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor} 14911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 149287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor//----------------------------------------------------------------------------// 149387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor// Code completion 149487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor//----------------------------------------------------------------------------// 149587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 149687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregornamespace { 149787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor /// \brief Code completion consumer that combines the cached code-completion 149887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor /// results from an ASTUnit with the code-completion results provided to it, 149987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor /// then passes the result on to 150087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer { 150187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor unsigned NormalContexts; 150287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor ASTUnit &AST; 150387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CodeCompleteConsumer &Next; 150487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 150587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor public: 150687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AugmentedCodeCompleteConsumer(ASTUnit &AST, CodeCompleteConsumer &Next, 15078071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor bool IncludeMacros, bool IncludeCodePatterns, 15088071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor bool IncludeGlobals) 15098071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor : CodeCompleteConsumer(IncludeMacros, IncludeCodePatterns, IncludeGlobals, 151087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Next.isOutputBinary()), AST(AST), Next(Next) 151187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor { 151287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Compute the set of contexts in which we will look when we don't have 151387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // any information about the specific context. 151487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor NormalContexts 151587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor = (1 << (CodeCompletionContext::CCC_TopLevel - 1)) 151687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCInterface - 1)) 151787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCImplementation - 1)) 151887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCIvarList - 1)) 151987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_Statement - 1)) 152087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_Expression - 1)) 152187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCMessageReceiver - 1)) 152287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_MemberAccess - 1)) 15230268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor | (1 << (CodeCompletionContext::CCC_ObjCProtocolName - 1)) 152452779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor | (1 << (CodeCompletionContext::CCC_ParenthesizedExpression - 1)) 152552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor | (1 << (CodeCompletionContext::CCC_Recovery - 1)); 15260268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor 152787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor if (AST.getASTContext().getLangOptions().CPlusPlus) 152887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor NormalContexts |= (1 << (CodeCompletionContext::CCC_EnumTag - 1)) 152987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_UnionTag - 1)) 153087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor | (1 << (CodeCompletionContext::CCC_ClassOrStructTag - 1)); 153187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 153287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 153387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor virtual void ProcessCodeCompleteResults(Sema &S, 153487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor CodeCompletionContext Context, 15350a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 1536697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor unsigned NumResults); 153787c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 153887c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, 153987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor OverloadCandidate *Candidates, 154087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor unsigned NumCandidates) { 154187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates); 154287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 154387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor }; 154487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor} 1545697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 15465f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor/// \brief Helper function that computes which global names are hidden by the 15475f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor/// local code-completion results. 15485f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregorvoid CalculateHiddenNames(const CodeCompletionContext &Context, 15490a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 15505f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor unsigned NumResults, 15515f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor ASTContext &Ctx, 15525f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor llvm::StringSet<> &HiddenNames) { 15535f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor bool OnlyTagNames = false; 15545f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor switch (Context.getKind()) { 155552779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CodeCompletionContext::CCC_Recovery: 15565f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_TopLevel: 15575f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ObjCInterface: 15585f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ObjCImplementation: 15595f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ObjCIvarList: 15605f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ClassStructUnion: 15615f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_Statement: 15625f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_Expression: 15635f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ObjCMessageReceiver: 15645f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_MemberAccess: 15655f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_Namespace: 15665f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_Type: 15672ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor case CodeCompletionContext::CCC_Name: 15682ccccb3ff40c64927817a7e1ddf1da8c188ed224Douglas Gregor case CodeCompletionContext::CCC_PotentiallyQualifiedName: 15690268810a46780144a2d5fb5a017c938d1199189cDouglas Gregor case CodeCompletionContext::CCC_ParenthesizedExpression: 15705f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor break; 15715f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 15725f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_EnumTag: 15735f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_UnionTag: 15745f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ClassOrStructTag: 15755f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor OnlyTagNames = true; 15765f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor break; 15775f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 15785f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor case CodeCompletionContext::CCC_ObjCProtocolName: 15791fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor case CodeCompletionContext::CCC_MacroName: 15801fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor case CodeCompletionContext::CCC_MacroNameUse: 1581f29c5233085a5af795c3c01b94d319e5b3235d56Douglas Gregor case CodeCompletionContext::CCC_PreprocessorExpression: 1582721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor case CodeCompletionContext::CCC_PreprocessorDirective: 158359a66946aa7723c7b14831aa50902d533baaa957Douglas Gregor case CodeCompletionContext::CCC_NaturalLanguage: 1584458433d2f0f5c96a9e0d21decdd44bebccf20b11Douglas Gregor case CodeCompletionContext::CCC_SelectorName: 15851a480c403a3b141ab89c9c59cf7b681102a1bfabDouglas Gregor case CodeCompletionContext::CCC_TypeQualifiers: 158652779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor case CodeCompletionContext::CCC_Other: 1587721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // We're looking for nothing, or we're looking for names that cannot 1588721f359a350059a81945baa08f63b2e5feceb044Douglas Gregor // be hidden. 15895f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor return; 15905f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor } 15915f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 15920a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 15935f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor for (unsigned I = 0; I != NumResults; ++I) { 15945f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (Results[I].Kind != Result::RK_Declaration) 15955f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor continue; 15965f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 15975f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor unsigned IDNS 15985f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor = Results[I].Declaration->getUnderlyingDecl()->getIdentifierNamespace(); 15995f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 16005f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor bool Hiding = false; 16015f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (OnlyTagNames) 16025f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor Hiding = (IDNS & Decl::IDNS_Tag); 16035f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor else { 16045f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor unsigned HiddenIDNS = (Decl::IDNS_Type | Decl::IDNS_Member | 1605a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Decl::IDNS_Namespace | Decl::IDNS_Ordinary | 1606a5fb7c3b56c3698e19a7c1e97d41150de33cf6c9Douglas Gregor Decl::IDNS_NonMemberOperator); 16075f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (Ctx.getLangOptions().CPlusPlus) 16085f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor HiddenIDNS |= Decl::IDNS_Tag; 16095f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor Hiding = (IDNS & HiddenIDNS); 16105f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor } 16115f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 16125f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (!Hiding) 16135f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor continue; 16145f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 16155f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor DeclarationName Name = Results[I].Declaration->getDeclName(); 16165f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (IdentifierInfo *Identifier = Name.getAsIdentifierInfo()) 16175f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor HiddenNames.insert(Identifier->getName()); 16185f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor else 16195f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor HiddenNames.insert(Name.getAsString()); 16205f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor } 16215f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor} 16225f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 16235f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 1624697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregorvoid AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &S, 1625697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor CodeCompletionContext Context, 16260a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall CodeCompletionResult *Results, 1627697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor unsigned NumResults) { 1628697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // Merge the results we were given with the results we cached. 1629697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor bool AddedResult = false; 16305f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor unsigned InContexts 163152779fb71795534d0447f6f4d4a6f6a7b09c4639Douglas Gregor = (Context.getKind() == CodeCompletionContext::CCC_Recovery? NormalContexts 16325f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor : (1 << (Context.getKind() - 1))); 16335f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 16345f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor // Contains the set of names that are hidden by "local" completion results. 16355f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor llvm::StringSet<> HiddenNames; 16361fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor llvm::SmallVector<CodeCompletionString *, 4> StringsToDestroy; 16370a2c5e256abb4dc031c21fe4dc92c4f3afe9947cJohn McCall typedef CodeCompletionResult Result; 1638697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor llvm::SmallVector<Result, 8> AllResults; 1639697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor for (ASTUnit::cached_completion_iterator 16405535d5721b6bfb5df9583bc0632da910a176109dDouglas Gregor C = AST.cached_completion_begin(), 16415535d5721b6bfb5df9583bc0632da910a176109dDouglas Gregor CEnd = AST.cached_completion_end(); 1642697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor C != CEnd; ++C) { 1643697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // If the context we are in matches any of the contexts we are 1644697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // interested in, we'll add this result. 1645697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if ((C->ShowInContexts & InContexts) == 0) 1646697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor continue; 1647697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 1648697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // If we haven't added any results previously, do so now. 1649697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (!AddedResult) { 16505f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor CalculateHiddenNames(Context, Results, NumResults, S.Context, 16515f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor HiddenNames); 1652697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor AllResults.insert(AllResults.end(), Results, Results + NumResults); 1653697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor AddedResult = true; 1654697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 1655697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 16565f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor // Determine whether this global completion result is hidden by a local 16575f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor // completion result. If so, skip it. 16585f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor if (C->Kind != CXCursor_MacroDefinition && 16595f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor HiddenNames.count(C->Completion->getTypedText())) 16605f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor continue; 16615f808c2bfe2f95c984029d76deb4aaebcad30cbcDouglas Gregor 1662697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // Adjust priority based on similar type classes. 1663697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor unsigned Priority = C->Priority; 16644125c37c71c6c8475019497de837204f0ee4370fDouglas Gregor CXCursorKind CursorKind = C->Kind; 16651fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor CodeCompletionString *Completion = C->Completion; 1666697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (!Context.getPreferredType().isNull()) { 1667697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (C->Kind == CXCursor_MacroDefinition) { 1668697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Priority = getMacroUsagePriority(C->Completion->getTypedText(), 1669b05496dbd63f03bf474dae2c4d1e2142608780ccDouglas Gregor S.getLangOptions(), 16701fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Context.getPreferredType()->isAnyPointerType()); 1671697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } else if (C->Type) { 1672697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor CanQualType Expected 16735535d5721b6bfb5df9583bc0632da910a176109dDouglas Gregor = S.Context.getCanonicalType( 1674697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Context.getPreferredType().getUnqualifiedType()); 1675697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor SimplifiedTypeClass ExpectedSTC = getSimplifiedTypeClass(Expected); 1676697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (ExpectedSTC == C->TypeClass) { 1677697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // We know this type is similar; check for an exact match. 1678697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor llvm::StringMap<unsigned> &CachedCompletionTypes 16795535d5721b6bfb5df9583bc0632da910a176109dDouglas Gregor = AST.getCachedCompletionTypes(); 1680697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor llvm::StringMap<unsigned>::iterator Pos 16815535d5721b6bfb5df9583bc0632da910a176109dDouglas Gregor = CachedCompletionTypes.find(QualType(Expected).getAsString()); 1682697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (Pos != CachedCompletionTypes.end() && Pos->second == C->Type) 1683697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Priority /= CCF_ExactTypeMatch; 1684697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor else 1685697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Priority /= CCF_SimilarTypeMatch; 1686697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 1687697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 1688697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 1689697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 16901fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Adjust the completion string, if required. 16911fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor if (C->Kind == CXCursor_MacroDefinition && 16921fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Context.getKind() == CodeCompletionContext::CCC_MacroNameUse) { 16931fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // Create a new code-completion string that just contains the 16941fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor // macro name, without its arguments. 16951fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Completion = new CodeCompletionString; 16961fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor Completion->AddTypedTextChunk(C->Completion->getTypedText()); 16971fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor StringsToDestroy.push_back(Completion); 16984125c37c71c6c8475019497de837204f0ee4370fDouglas Gregor CursorKind = CXCursor_NotImplemented; 16994125c37c71c6c8475019497de837204f0ee4370fDouglas Gregor Priority = CCP_CodePattern; 17001fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor } 17011fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 17024125c37c71c6c8475019497de837204f0ee4370fDouglas Gregor AllResults.push_back(Result(Completion, Priority, CursorKind, 170358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor C->Availability)); 1704697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 1705697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 1706697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // If we did not add any cached completion results, just forward the 1707697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor // results we were given to the next consumer. 1708697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor if (!AddedResult) { 1709697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Next.ProcessCodeCompleteResults(S, Context, Results, NumResults); 1710697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor return; 1711697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor } 17121e5e6684b0f27701e6f7c65f8c6a32a10cbcc3edDouglas Gregor 1713697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor Next.ProcessCodeCompleteResults(S, Context, AllResults.data(), 1714697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor AllResults.size()); 17151fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor 17161fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor for (unsigned I = 0, N = StringsToDestroy.size(); I != N; ++I) 17171fbb447e9d43c2c676e94081fbfee7eb6cbe933bDouglas Gregor delete StringsToDestroy[I]; 1718697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor} 1719697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 1720697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 1721697ca6dc944fd1233a6f07f0777807fbab6a31c1Douglas Gregor 17221abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregorvoid ASTUnit::CodeComplete(llvm::StringRef File, unsigned Line, unsigned Column, 17231abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFile *RemappedFiles, 17241abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned NumRemappedFiles, 1725cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor bool IncludeMacros, 1726cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor bool IncludeCodePatterns, 17271abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CodeCompleteConsumer &Consumer, 17281abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Diagnostic &Diag, LangOptions &LangOpts, 17291abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor SourceManager &SourceMgr, FileManager &FileMgr, 17302283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor llvm::SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics, 17312283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor llvm::SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers) { 17321abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Invocation.get()) 17331abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return; 17341abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 1735df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::Timer *CompletionTimer = 0; 1736df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (TimerGroup.get()) { 1737df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::SmallString<128> TimerName; 1738df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::raw_svector_ostream TimerNameOut(TimerName); 1739df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor TimerNameOut << "Code completion @ " << File << ":" << Line << ":" 1740df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor << Column; 1741df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor CompletionTimer = new llvm::Timer(TimerNameOut.str(), *TimerGroup); 1742df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor CompletionTimer->startTimer(); 1743df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor Timers.push_back(CompletionTimer); 1744df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 1745df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 17461abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CompilerInvocation CCInvocation(*Invocation); 17471abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor FrontendOptions &FrontendOpts = CCInvocation.getFrontendOpts(); 17481abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PreprocessorOptions &PreprocessorOpts = CCInvocation.getPreprocessorOpts(); 1749cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 175087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor FrontendOpts.ShowMacrosInCodeCompletion 175187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor = IncludeMacros && CachedCompletionResults.empty(); 1752cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor FrontendOpts.ShowCodePatternsInCodeCompletion = IncludeCodePatterns; 17538071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor FrontendOpts.ShowGlobalSymbolsInCodeCompletion 17548071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor = CachedCompletionResults.empty(); 17551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor FrontendOpts.CodeCompletionAt.FileName = File; 17561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor FrontendOpts.CodeCompletionAt.Line = Line; 17571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor FrontendOpts.CodeCompletionAt.Column = Column; 17581abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 1759cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor // Turn on spell-checking when performing code completion. It leads 1760cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor // to better results. 1761cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor unsigned SpellChecking = CCInvocation.getLangOpts().SpellChecking; 1762cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor CCInvocation.getLangOpts().SpellChecking = 1; 1763cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor 17641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Set the language options appropriately. 17651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor LangOpts = CCInvocation.getLangOpts(); 17661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CompilerInstance Clang; 17681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.setInvocation(&CCInvocation); 17691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor OriginalSourceFile = Clang.getFrontendOpts().Inputs[0].second; 17701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Set up diagnostics, capturing any diagnostics produced. 17721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.setDiagnostics(&Diag); 17731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor CaptureDroppedDiagnostics Capture(true, 17741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.getDiagnostics(), 17751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor StoredDiagnostics); 17761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Create the target instance. 17781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.setTarget(TargetInfo::CreateTargetInfo(Clang.getDiagnostics(), 17791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.getTargetOpts())); 17801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Clang.hasTarget()) { 17811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.takeInvocation(); 1782bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor CCInvocation.getLangOpts().SpellChecking = SpellChecking; 1783bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor return; 17841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 17851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Inform the target of the language options. 17871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // 17881abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // FIXME: We shouldn't need to do this, the target should be immutable once 17891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // created. This complexity should be lifted elsewhere. 17901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.getTarget().setForcedLangOptions(Clang.getLangOpts()); 17911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor assert(Clang.getFrontendOpts().Inputs.size() == 1 && 17931abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor "Invocation must have exactly one source file!"); 17941abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor assert(Clang.getFrontendOpts().Inputs[0].first != IK_AST && 17951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor "FIXME: AST inputs not yet supported here!"); 17961abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor assert(Clang.getFrontendOpts().Inputs[0].first != IK_LLVM_IR && 17971abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor "IR inputs not support here!"); 17981abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 17991abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 18001abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Use the source and file managers that we were given. 18011abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.setFileManager(&FileMgr); 18021abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.setSourceManager(&SourceMgr); 18031abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 18041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Remap files. 18051abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PreprocessorOpts.clearRemappedFiles(); 1806b75d3dfa4ca6531858b8132eb4db7260408671cfDouglas Gregor PreprocessorOpts.RetainRemappedFileBuffers = true; 18072283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor for (unsigned I = 0; I != NumRemappedFiles; ++I) { 18081abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PreprocessorOpts.addRemappedFile(RemappedFiles[I].first, 18091abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor RemappedFiles[I].second); 18102283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor OwnedBuffers.push_back(RemappedFiles[I].second); 18112283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor } 18121abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 181387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // Use the code completion consumer we were given, but adding any cached 181487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor // code-completion results. 181587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AugmentedCodeCompleteConsumer 181687c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor AugmentedConsumer(*this, Consumer, FrontendOpts.ShowMacrosInCodeCompletion, 18178071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor FrontendOpts.ShowCodePatternsInCodeCompletion, 18188071e4212ae08f8014e0c3ae6d18b7388003a5ccDouglas Gregor FrontendOpts.ShowGlobalSymbolsInCodeCompletion); 181987c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor Clang.setCodeCompletionConsumer(&AugmentedConsumer); 18201abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 1821df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // If we have a precompiled preamble, try to use it. We only allow 1822df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // the use of the precompiled preamble if we're if the completion 1823df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // point is within the main file, after the end of the precompiled 1824df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // preamble. 1825df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::MemoryBuffer *OverrideMainBuffer = 0; 1826df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (!PreambleFile.empty()) { 1827df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor using llvm::sys::FileStatus; 1828df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::sys::PathWithStatus CompleteFilePath(File); 1829df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor llvm::sys::PathWithStatus MainPath(OriginalSourceFile); 1830df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (const FileStatus *CompleteFileStatus = CompleteFilePath.getFileStatus()) 1831df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (const FileStatus *MainStatus = MainPath.getFileStatus()) 1832df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (CompleteFileStatus->getUniqueID() == MainStatus->getUniqueID()) 18332283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor OverrideMainBuffer 1834c9c29a8d7a0f78ddf2b393dd92f77c7f2046179cDouglas Gregor = getMainBufferWithPrecompiledPreamble(CCInvocation, false, 1835c9c29a8d7a0f78ddf2b393dd92f77c7f2046179cDouglas Gregor Line - 1); 1836df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 1837df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 1838df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // If the main file has been overridden due to the use of a preamble, 1839df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // make that override happen and introduce the preamble. 1840df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (OverrideMainBuffer) { 1841df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer); 1842df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size(); 1843df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.second 1844df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor = PreambleEndsAtStartOfLine; 1845df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor PreprocessorOpts.ImplicitPCHInclude = PreambleFile; 1846df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor PreprocessorOpts.DisablePCHValidation = true; 1847df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 1848df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // The stored diagnostics have the old source manager. Copy them 1849df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // to our output set of stored diagnostics, updating the source 1850df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor // manager to the one we were given. 1851df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor for (unsigned I = 0, N = this->StoredDiagnostics.size(); I != N; ++I) { 1852df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor StoredDiagnostics.push_back(this->StoredDiagnostics[I]); 1853df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor FullSourceLoc Loc(StoredDiagnostics[I].getLocation(), SourceMgr); 1854df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor StoredDiagnostics[I].setLocation(Loc); 1855df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 18562283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor 18572283d79155a3e82442fce124ce5fd704ca138801Douglas Gregor OwnedBuffers.push_back(OverrideMainBuffer); 1858f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor } else { 1859f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.first = 0; 1860f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754Douglas Gregor PreprocessorOpts.PrecompiledPreambleBytes.second = false; 1861df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor } 1862df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 18631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::OwningPtr<SyntaxOnlyAction> Act; 18641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Act.reset(new SyntaxOnlyAction); 18651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (Act->BeginSourceFile(Clang, Clang.getFrontendOpts().Inputs[0].second, 18661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.getFrontendOpts().Inputs[0].first)) { 18671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Act->Execute(); 18681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Act->EndSourceFile(); 18691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 1870df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor 1871df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor if (CompletionTimer) 1872df95a13ec73d2cdaea79555cb412d767f4963120Douglas Gregor CompletionTimer->stopTimer(); 18731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 18741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Steal back our resources. 18751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.takeFileManager(); 18761abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.takeSourceManager(); 18771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.takeInvocation(); 18781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Clang.takeCodeCompletionConsumer(); 1879cee235cdf0b8047761ffac598c4c3a32ab7411a2Douglas Gregor CCInvocation.getLangOpts().SpellChecking = SpellChecking; 18801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 18817ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor 18827ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregorbool ASTUnit::Save(llvm::StringRef File) { 18837ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor if (getDiagnostics().hasErrorOccurred()) 18847ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor return true; 18857ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor 18867ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor // FIXME: Can we somehow regenerate the stat cache here, or do we need to 18877ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor // unconditionally create a stat cache when we parse the file? 18887ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor std::string ErrorInfo; 18891395c5d00588a9c3154683ffe6c223bb7af2fbf2Benjamin Kramer llvm::raw_fd_ostream Out(File.str().c_str(), ErrorInfo, 18901395c5d00588a9c3154683ffe6c223bb7af2fbf2Benjamin Kramer llvm::raw_fd_ostream::F_Binary); 18917ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor if (!ErrorInfo.empty() || Out.has_error()) 18927ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor return true; 18937ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor 18947ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor std::vector<unsigned char> Buffer; 18957ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor llvm::BitstreamWriter Stream(Buffer); 1896a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl ASTWriter Writer(Stream); 1897a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl Writer.WriteAST(getSema(), 0, 0); 18987ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor 18997ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor // Write the generated bitstream to "Out". 1900bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor if (!Buffer.empty()) 1901bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor Out.write((char *)&Buffer.front(), Buffer.size()); 19027ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor Out.close(); 19037ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor return Out.has_error(); 19047ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor} 1905