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