ASTUnit.cpp revision 55fc873017f10f6f566b182b70f6fc22aefa3464
1//===--- ASTUnit.cpp - ASTUnit utility ------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// ASTUnit Implementation.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Frontend/ASTUnit.h"
15#include "clang/AST/ASTConsumer.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/AST/DeclVisitor.h"
18#include "clang/AST/StmtVisitor.h"
19#include "clang/AST/TypeOrdering.h"
20#include "clang/Basic/Diagnostic.h"
21#include "clang/Basic/TargetInfo.h"
22#include "clang/Basic/TargetOptions.h"
23#include "clang/Frontend/CompilerInstance.h"
24#include "clang/Frontend/FrontendActions.h"
25#include "clang/Frontend/FrontendDiagnostic.h"
26#include "clang/Frontend/FrontendOptions.h"
27#include "clang/Frontend/MultiplexConsumer.h"
28#include "clang/Frontend/Utils.h"
29#include "clang/Lex/HeaderSearch.h"
30#include "clang/Lex/Preprocessor.h"
31#include "clang/Lex/PreprocessorOptions.h"
32#include "clang/Serialization/ASTReader.h"
33#include "clang/Serialization/ASTWriter.h"
34#include "llvm/ADT/ArrayRef.h"
35#include "llvm/ADT/StringExtras.h"
36#include "llvm/ADT/StringSet.h"
37#include "llvm/Support/Atomic.h"
38#include "llvm/Support/CrashRecoveryContext.h"
39#include "llvm/Support/FileSystem.h"
40#include "llvm/Support/Host.h"
41#include "llvm/Support/MemoryBuffer.h"
42#include "llvm/Support/Mutex.h"
43#include "llvm/Support/MutexGuard.h"
44#include "llvm/Support/Path.h"
45#include "llvm/Support/Timer.h"
46#include "llvm/Support/raw_ostream.h"
47#include <cstdio>
48#include <cstdlib>
49#include <sys/stat.h>
50using namespace clang;
51
52using llvm::TimeRecord;
53
54namespace {
55  class SimpleTimer {
56    bool WantTiming;
57    TimeRecord Start;
58    std::string Output;
59
60  public:
61    explicit SimpleTimer(bool WantTiming) : WantTiming(WantTiming) {
62      if (WantTiming)
63        Start = TimeRecord::getCurrentTime();
64    }
65
66    void setOutput(const Twine &Output) {
67      if (WantTiming)
68        this->Output = Output.str();
69    }
70
71    ~SimpleTimer() {
72      if (WantTiming) {
73        TimeRecord Elapsed = TimeRecord::getCurrentTime();
74        Elapsed -= Start;
75        llvm::errs() << Output << ':';
76        Elapsed.print(Elapsed, llvm::errs());
77        llvm::errs() << '\n';
78      }
79    }
80  };
81
82  struct OnDiskData {
83    /// \brief The file in which the precompiled preamble is stored.
84    std::string PreambleFile;
85
86    /// \brief Temporary files that should be removed when the ASTUnit is
87    /// destroyed.
88    SmallVector<llvm::sys::Path, 4> TemporaryFiles;
89
90    /// \brief Erase temporary files.
91    void CleanTemporaryFiles();
92
93    /// \brief Erase the preamble file.
94    void CleanPreambleFile();
95
96    /// \brief Erase temporary files and the preamble file.
97    void Cleanup();
98  };
99}
100
101static llvm::sys::SmartMutex<false> &getOnDiskMutex() {
102  static llvm::sys::SmartMutex<false> M(/* recursive = */ true);
103  return M;
104}
105
106static void cleanupOnDiskMapAtExit();
107
108typedef llvm::DenseMap<const ASTUnit *, OnDiskData *> OnDiskDataMap;
109static OnDiskDataMap &getOnDiskDataMap() {
110  static OnDiskDataMap M;
111  static bool hasRegisteredAtExit = false;
112  if (!hasRegisteredAtExit) {
113    hasRegisteredAtExit = true;
114    atexit(cleanupOnDiskMapAtExit);
115  }
116  return M;
117}
118
119static void cleanupOnDiskMapAtExit() {
120  // Use the mutex because there can be an alive thread destroying an ASTUnit.
121  llvm::MutexGuard Guard(getOnDiskMutex());
122  OnDiskDataMap &M = getOnDiskDataMap();
123  for (OnDiskDataMap::iterator I = M.begin(), E = M.end(); I != E; ++I) {
124    // We don't worry about freeing the memory associated with OnDiskDataMap.
125    // All we care about is erasing stale files.
126    I->second->Cleanup();
127  }
128}
129
130static OnDiskData &getOnDiskData(const ASTUnit *AU) {
131  // We require the mutex since we are modifying the structure of the
132  // DenseMap.
133  llvm::MutexGuard Guard(getOnDiskMutex());
134  OnDiskDataMap &M = getOnDiskDataMap();
135  OnDiskData *&D = M[AU];
136  if (!D)
137    D = new OnDiskData();
138  return *D;
139}
140
141static void erasePreambleFile(const ASTUnit *AU) {
142  getOnDiskData(AU).CleanPreambleFile();
143}
144
145static void removeOnDiskEntry(const ASTUnit *AU) {
146  // We require the mutex since we are modifying the structure of the
147  // DenseMap.
148  llvm::MutexGuard Guard(getOnDiskMutex());
149  OnDiskDataMap &M = getOnDiskDataMap();
150  OnDiskDataMap::iterator I = M.find(AU);
151  if (I != M.end()) {
152    I->second->Cleanup();
153    delete I->second;
154    M.erase(AU);
155  }
156}
157
158static void setPreambleFile(const ASTUnit *AU, llvm::StringRef preambleFile) {
159  getOnDiskData(AU).PreambleFile = preambleFile;
160}
161
162static const std::string &getPreambleFile(const ASTUnit *AU) {
163  return getOnDiskData(AU).PreambleFile;
164}
165
166void OnDiskData::CleanTemporaryFiles() {
167  for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I)
168    TemporaryFiles[I].eraseFromDisk();
169  TemporaryFiles.clear();
170}
171
172void OnDiskData::CleanPreambleFile() {
173  if (!PreambleFile.empty()) {
174    llvm::sys::Path(PreambleFile).eraseFromDisk();
175    PreambleFile.clear();
176  }
177}
178
179void OnDiskData::Cleanup() {
180  CleanTemporaryFiles();
181  CleanPreambleFile();
182}
183
184struct ASTUnit::ASTWriterData {
185  SmallString<128> Buffer;
186  llvm::BitstreamWriter Stream;
187  ASTWriter Writer;
188
189  ASTWriterData() : Stream(Buffer), Writer(Stream) { }
190};
191
192void ASTUnit::clearFileLevelDecls() {
193  for (FileDeclsTy::iterator
194         I = FileDecls.begin(), E = FileDecls.end(); I != E; ++I)
195    delete I->second;
196  FileDecls.clear();
197}
198
199void ASTUnit::CleanTemporaryFiles() {
200  getOnDiskData(this).CleanTemporaryFiles();
201}
202
203void ASTUnit::addTemporaryFile(const llvm::sys::Path &TempFile) {
204  getOnDiskData(this).TemporaryFiles.push_back(TempFile);
205}
206
207/// \brief After failing to build a precompiled preamble (due to
208/// errors in the source that occurs in the preamble), the number of
209/// reparses during which we'll skip even trying to precompile the
210/// preamble.
211const unsigned DefaultPreambleRebuildInterval = 5;
212
213/// \brief Tracks the number of ASTUnit objects that are currently active.
214///
215/// Used for debugging purposes only.
216static llvm::sys::cas_flag ActiveASTUnitObjects;
217
218ASTUnit::ASTUnit(bool _MainFileIsAST)
219  : Reader(0), OnlyLocalDecls(false), CaptureDiagnostics(false),
220    MainFileIsAST(_MainFileIsAST),
221    TUKind(TU_Complete), WantTiming(getenv("LIBCLANG_TIMING")),
222    OwnsRemappedFileBuffers(true),
223    NumStoredDiagnosticsFromDriver(0),
224    PreambleRebuildCounter(0), SavedMainFileBuffer(0), PreambleBuffer(0),
225    NumWarningsInPreamble(0),
226    ShouldCacheCodeCompletionResults(false),
227    IncludeBriefCommentsInCodeCompletion(false), UserFilesAreVolatile(false),
228    CompletionCacheTopLevelHashValue(0),
229    PreambleTopLevelHashValue(0),
230    CurrentTopLevelHashValue(0),
231    UnsafeToFree(false) {
232  if (getenv("LIBCLANG_OBJTRACKING")) {
233    llvm::sys::AtomicIncrement(&ActiveASTUnitObjects);
234    fprintf(stderr, "+++ %d translation units\n", ActiveASTUnitObjects);
235  }
236}
237
238ASTUnit::~ASTUnit() {
239  clearFileLevelDecls();
240
241  // Clean up the temporary files and the preamble file.
242  removeOnDiskEntry(this);
243
244  // Free the buffers associated with remapped files. We are required to
245  // perform this operation here because we explicitly request that the
246  // compiler instance *not* free these buffers for each invocation of the
247  // parser.
248  if (Invocation.getPtr() && OwnsRemappedFileBuffers) {
249    PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
250    for (PreprocessorOptions::remapped_file_buffer_iterator
251           FB = PPOpts.remapped_file_buffer_begin(),
252           FBEnd = PPOpts.remapped_file_buffer_end();
253         FB != FBEnd;
254         ++FB)
255      delete FB->second;
256  }
257
258  delete SavedMainFileBuffer;
259  delete PreambleBuffer;
260
261  ClearCachedCompletionResults();
262
263  if (getenv("LIBCLANG_OBJTRACKING")) {
264    llvm::sys::AtomicDecrement(&ActiveASTUnitObjects);
265    fprintf(stderr, "--- %d translation units\n", ActiveASTUnitObjects);
266  }
267}
268
269void ASTUnit::setPreprocessor(Preprocessor *pp) { PP = pp; }
270
271/// \brief Determine the set of code-completion contexts in which this
272/// declaration should be shown.
273static unsigned getDeclShowContexts(NamedDecl *ND,
274                                    const LangOptions &LangOpts,
275                                    bool &IsNestedNameSpecifier) {
276  IsNestedNameSpecifier = false;
277
278  if (isa<UsingShadowDecl>(ND))
279    ND = dyn_cast<NamedDecl>(ND->getUnderlyingDecl());
280  if (!ND)
281    return 0;
282
283  uint64_t Contexts = 0;
284  if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND) ||
285      isa<ClassTemplateDecl>(ND) || isa<TemplateTemplateParmDecl>(ND)) {
286    // Types can appear in these contexts.
287    if (LangOpts.CPlusPlus || !isa<TagDecl>(ND))
288      Contexts |= (1LL << CodeCompletionContext::CCC_TopLevel)
289               |  (1LL << CodeCompletionContext::CCC_ObjCIvarList)
290               |  (1LL << CodeCompletionContext::CCC_ClassStructUnion)
291               |  (1LL << CodeCompletionContext::CCC_Statement)
292               |  (1LL << CodeCompletionContext::CCC_Type)
293               |  (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
294
295    // In C++, types can appear in expressions contexts (for functional casts).
296    if (LangOpts.CPlusPlus)
297      Contexts |= (1LL << CodeCompletionContext::CCC_Expression);
298
299    // In Objective-C, message sends can send interfaces. In Objective-C++,
300    // all types are available due to functional casts.
301    if (LangOpts.CPlusPlus || isa<ObjCInterfaceDecl>(ND))
302      Contexts |= (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver);
303
304    // In Objective-C, you can only be a subclass of another Objective-C class
305    if (isa<ObjCInterfaceDecl>(ND))
306      Contexts |= (1LL << CodeCompletionContext::CCC_ObjCInterfaceName);
307
308    // Deal with tag names.
309    if (isa<EnumDecl>(ND)) {
310      Contexts |= (1LL << CodeCompletionContext::CCC_EnumTag);
311
312      // Part of the nested-name-specifier in C++0x.
313      if (LangOpts.CPlusPlus0x)
314        IsNestedNameSpecifier = true;
315    } else if (RecordDecl *Record = dyn_cast<RecordDecl>(ND)) {
316      if (Record->isUnion())
317        Contexts |= (1LL << CodeCompletionContext::CCC_UnionTag);
318      else
319        Contexts |= (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
320
321      if (LangOpts.CPlusPlus)
322        IsNestedNameSpecifier = true;
323    } else if (isa<ClassTemplateDecl>(ND))
324      IsNestedNameSpecifier = true;
325  } else if (isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND)) {
326    // Values can appear in these contexts.
327    Contexts = (1LL << CodeCompletionContext::CCC_Statement)
328             | (1LL << CodeCompletionContext::CCC_Expression)
329             | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
330             | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver);
331  } else if (isa<ObjCProtocolDecl>(ND)) {
332    Contexts = (1LL << CodeCompletionContext::CCC_ObjCProtocolName);
333  } else if (isa<ObjCCategoryDecl>(ND)) {
334    Contexts = (1LL << CodeCompletionContext::CCC_ObjCCategoryName);
335  } else if (isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND)) {
336    Contexts = (1LL << CodeCompletionContext::CCC_Namespace);
337
338    // Part of the nested-name-specifier.
339    IsNestedNameSpecifier = true;
340  }
341
342  return Contexts;
343}
344
345void ASTUnit::CacheCodeCompletionResults() {
346  if (!TheSema)
347    return;
348
349  SimpleTimer Timer(WantTiming);
350  Timer.setOutput("Cache global code completions for " + getMainFileName());
351
352  // Clear out the previous results.
353  ClearCachedCompletionResults();
354
355  // Gather the set of global code completions.
356  typedef CodeCompletionResult Result;
357  SmallVector<Result, 8> Results;
358  CachedCompletionAllocator = new GlobalCodeCompletionAllocator;
359  CodeCompletionTUInfo CCTUInfo(CachedCompletionAllocator);
360  TheSema->GatherGlobalCodeCompletions(*CachedCompletionAllocator,
361                                       CCTUInfo, Results);
362
363  // Translate global code completions into cached completions.
364  llvm::DenseMap<CanQualType, unsigned> CompletionTypes;
365
366  for (unsigned I = 0, N = Results.size(); I != N; ++I) {
367    switch (Results[I].Kind) {
368    case Result::RK_Declaration: {
369      bool IsNestedNameSpecifier = false;
370      CachedCodeCompletionResult CachedResult;
371      CachedResult.Completion = Results[I].CreateCodeCompletionString(*TheSema,
372                                                    *CachedCompletionAllocator,
373                                                    CCTUInfo,
374                                          IncludeBriefCommentsInCodeCompletion);
375      CachedResult.ShowInContexts = getDeclShowContexts(Results[I].Declaration,
376                                                        Ctx->getLangOpts(),
377                                                        IsNestedNameSpecifier);
378      CachedResult.Priority = Results[I].Priority;
379      CachedResult.Kind = Results[I].CursorKind;
380      CachedResult.Availability = Results[I].Availability;
381
382      // Keep track of the type of this completion in an ASTContext-agnostic
383      // way.
384      QualType UsageType = getDeclUsageType(*Ctx, Results[I].Declaration);
385      if (UsageType.isNull()) {
386        CachedResult.TypeClass = STC_Void;
387        CachedResult.Type = 0;
388      } else {
389        CanQualType CanUsageType
390          = Ctx->getCanonicalType(UsageType.getUnqualifiedType());
391        CachedResult.TypeClass = getSimplifiedTypeClass(CanUsageType);
392
393        // Determine whether we have already seen this type. If so, we save
394        // ourselves the work of formatting the type string by using the
395        // temporary, CanQualType-based hash table to find the associated value.
396        unsigned &TypeValue = CompletionTypes[CanUsageType];
397        if (TypeValue == 0) {
398          TypeValue = CompletionTypes.size();
399          CachedCompletionTypes[QualType(CanUsageType).getAsString()]
400            = TypeValue;
401        }
402
403        CachedResult.Type = TypeValue;
404      }
405
406      CachedCompletionResults.push_back(CachedResult);
407
408      /// Handle nested-name-specifiers in C++.
409      if (TheSema->Context.getLangOpts().CPlusPlus &&
410          IsNestedNameSpecifier && !Results[I].StartsNestedNameSpecifier) {
411        // The contexts in which a nested-name-specifier can appear in C++.
412        uint64_t NNSContexts
413          = (1LL << CodeCompletionContext::CCC_TopLevel)
414          | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
415          | (1LL << CodeCompletionContext::CCC_ClassStructUnion)
416          | (1LL << CodeCompletionContext::CCC_Statement)
417          | (1LL << CodeCompletionContext::CCC_Expression)
418          | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
419          | (1LL << CodeCompletionContext::CCC_EnumTag)
420          | (1LL << CodeCompletionContext::CCC_UnionTag)
421          | (1LL << CodeCompletionContext::CCC_ClassOrStructTag)
422          | (1LL << CodeCompletionContext::CCC_Type)
423          | (1LL << CodeCompletionContext::CCC_PotentiallyQualifiedName)
424          | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression);
425
426        if (isa<NamespaceDecl>(Results[I].Declaration) ||
427            isa<NamespaceAliasDecl>(Results[I].Declaration))
428          NNSContexts |= (1LL << CodeCompletionContext::CCC_Namespace);
429
430        if (unsigned RemainingContexts
431                                = NNSContexts & ~CachedResult.ShowInContexts) {
432          // If there any contexts where this completion can be a
433          // nested-name-specifier but isn't already an option, create a
434          // nested-name-specifier completion.
435          Results[I].StartsNestedNameSpecifier = true;
436          CachedResult.Completion
437            = Results[I].CreateCodeCompletionString(*TheSema,
438                                                    *CachedCompletionAllocator,
439                                                    CCTUInfo,
440                                        IncludeBriefCommentsInCodeCompletion);
441          CachedResult.ShowInContexts = RemainingContexts;
442          CachedResult.Priority = CCP_NestedNameSpecifier;
443          CachedResult.TypeClass = STC_Void;
444          CachedResult.Type = 0;
445          CachedCompletionResults.push_back(CachedResult);
446        }
447      }
448      break;
449    }
450
451    case Result::RK_Keyword:
452    case Result::RK_Pattern:
453      // Ignore keywords and patterns; we don't care, since they are so
454      // easily regenerated.
455      break;
456
457    case Result::RK_Macro: {
458      CachedCodeCompletionResult CachedResult;
459      CachedResult.Completion
460        = Results[I].CreateCodeCompletionString(*TheSema,
461                                                *CachedCompletionAllocator,
462                                                CCTUInfo,
463                                          IncludeBriefCommentsInCodeCompletion);
464      CachedResult.ShowInContexts
465        = (1LL << CodeCompletionContext::CCC_TopLevel)
466        | (1LL << CodeCompletionContext::CCC_ObjCInterface)
467        | (1LL << CodeCompletionContext::CCC_ObjCImplementation)
468        | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
469        | (1LL << CodeCompletionContext::CCC_ClassStructUnion)
470        | (1LL << CodeCompletionContext::CCC_Statement)
471        | (1LL << CodeCompletionContext::CCC_Expression)
472        | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
473        | (1LL << CodeCompletionContext::CCC_MacroNameUse)
474        | (1LL << CodeCompletionContext::CCC_PreprocessorExpression)
475        | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
476        | (1LL << CodeCompletionContext::CCC_OtherWithMacros);
477
478      CachedResult.Priority = Results[I].Priority;
479      CachedResult.Kind = Results[I].CursorKind;
480      CachedResult.Availability = Results[I].Availability;
481      CachedResult.TypeClass = STC_Void;
482      CachedResult.Type = 0;
483      CachedCompletionResults.push_back(CachedResult);
484      break;
485    }
486    }
487  }
488
489  // Save the current top-level hash value.
490  CompletionCacheTopLevelHashValue = CurrentTopLevelHashValue;
491}
492
493void ASTUnit::ClearCachedCompletionResults() {
494  CachedCompletionResults.clear();
495  CachedCompletionTypes.clear();
496  CachedCompletionAllocator = 0;
497}
498
499namespace {
500
501/// \brief Gathers information from ASTReader that will be used to initialize
502/// a Preprocessor.
503class ASTInfoCollector : public ASTReaderListener {
504  Preprocessor &PP;
505  ASTContext &Context;
506  LangOptions &LangOpt;
507  HeaderSearch &HSI;
508  IntrusiveRefCntPtr<TargetOptions> &TargetOpts;
509  IntrusiveRefCntPtr<TargetInfo> &Target;
510  unsigned &Counter;
511
512  unsigned NumHeaderInfos;
513
514  bool InitializedLanguage;
515public:
516  ASTInfoCollector(Preprocessor &PP, ASTContext &Context, LangOptions &LangOpt,
517                   HeaderSearch &HSI,
518                   IntrusiveRefCntPtr<TargetOptions> &TargetOpts,
519                   IntrusiveRefCntPtr<TargetInfo> &Target,
520                   unsigned &Counter)
521    : PP(PP), Context(Context), LangOpt(LangOpt), HSI(HSI),
522      TargetOpts(TargetOpts), Target(Target),
523      Counter(Counter), NumHeaderInfos(0),
524      InitializedLanguage(false) {}
525
526  virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
527                                   bool Complain) {
528    if (InitializedLanguage)
529      return false;
530
531    LangOpt = LangOpts;
532    InitializedLanguage = true;
533
534    updated();
535    return false;
536  }
537
538  virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
539                                 bool Complain) {
540    // If we've already initialized the target, don't do it again.
541    if (Target)
542      return false;
543
544    this->TargetOpts = new TargetOptions(TargetOpts);
545    Target = TargetInfo::CreateTargetInfo(PP.getDiagnostics(),
546                                          &*this->TargetOpts);
547
548    updated();
549    return false;
550  }
551
552  virtual void ReadHeaderFileInfo(const HeaderFileInfo &HFI, unsigned ID) {
553    HSI.setHeaderFileInfoForUID(HFI, NumHeaderInfos++);
554  }
555
556  virtual void ReadCounter(const serialization::ModuleFile &M, unsigned Value) {
557    Counter = Value;
558  }
559
560private:
561  void updated() {
562    if (!Target || !InitializedLanguage)
563      return;
564
565    // Inform the target of the language options.
566    //
567    // FIXME: We shouldn't need to do this, the target should be immutable once
568    // created. This complexity should be lifted elsewhere.
569    Target->setForcedLangOptions(LangOpt);
570
571    // Initialize the preprocessor.
572    PP.Initialize(*Target);
573
574    // Initialize the ASTContext
575    Context.InitBuiltinTypes(*Target);
576  }
577};
578
579class StoredDiagnosticConsumer : public DiagnosticConsumer {
580  SmallVectorImpl<StoredDiagnostic> &StoredDiags;
581
582public:
583  explicit StoredDiagnosticConsumer(
584                          SmallVectorImpl<StoredDiagnostic> &StoredDiags)
585    : StoredDiags(StoredDiags) { }
586
587  virtual void HandleDiagnostic(DiagnosticsEngine::Level Level,
588                                const Diagnostic &Info);
589
590  DiagnosticConsumer *clone(DiagnosticsEngine &Diags) const {
591    // Just drop any diagnostics that come from cloned consumers; they'll
592    // have different source managers anyway.
593    // FIXME: We'd like to be able to capture these somehow, even if it's just
594    // file/line/column, because they could occur when parsing module maps or
595    // building modules on-demand.
596    return new IgnoringDiagConsumer();
597  }
598};
599
600/// \brief RAII object that optionally captures diagnostics, if
601/// there is no diagnostic client to capture them already.
602class CaptureDroppedDiagnostics {
603  DiagnosticsEngine &Diags;
604  StoredDiagnosticConsumer Client;
605  DiagnosticConsumer *PreviousClient;
606
607public:
608  CaptureDroppedDiagnostics(bool RequestCapture, DiagnosticsEngine &Diags,
609                          SmallVectorImpl<StoredDiagnostic> &StoredDiags)
610    : Diags(Diags), Client(StoredDiags), PreviousClient(0)
611  {
612    if (RequestCapture || Diags.getClient() == 0) {
613      PreviousClient = Diags.takeClient();
614      Diags.setClient(&Client);
615    }
616  }
617
618  ~CaptureDroppedDiagnostics() {
619    if (Diags.getClient() == &Client) {
620      Diags.takeClient();
621      Diags.setClient(PreviousClient);
622    }
623  }
624};
625
626} // anonymous namespace
627
628void StoredDiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level Level,
629                                              const Diagnostic &Info) {
630  // Default implementation (Warnings/errors count).
631  DiagnosticConsumer::HandleDiagnostic(Level, Info);
632
633  StoredDiags.push_back(StoredDiagnostic(Level, Info));
634}
635
636ASTDeserializationListener *ASTUnit::getDeserializationListener() {
637  if (WriterData)
638    return &WriterData->Writer;
639  return 0;
640}
641
642llvm::MemoryBuffer *ASTUnit::getBufferForFile(StringRef Filename,
643                                              std::string *ErrorStr) {
644  assert(FileMgr);
645  return FileMgr->getBufferForFile(Filename, ErrorStr);
646}
647
648/// \brief Configure the diagnostics object for use with ASTUnit.
649void ASTUnit::ConfigureDiags(IntrusiveRefCntPtr<DiagnosticsEngine> &Diags,
650                             const char **ArgBegin, const char **ArgEnd,
651                             ASTUnit &AST, bool CaptureDiagnostics) {
652  if (!Diags.getPtr()) {
653    // No diagnostics engine was provided, so create our own diagnostics object
654    // with the default options.
655    DiagnosticConsumer *Client = 0;
656    if (CaptureDiagnostics)
657      Client = new StoredDiagnosticConsumer(AST.StoredDiagnostics);
658    Diags = CompilerInstance::createDiagnostics(new DiagnosticOptions(),
659                                                ArgEnd-ArgBegin,
660                                                ArgBegin, Client,
661                                                /*ShouldOwnClient=*/true,
662                                                /*ShouldCloneClient=*/false);
663  } else if (CaptureDiagnostics) {
664    Diags->setClient(new StoredDiagnosticConsumer(AST.StoredDiagnostics));
665  }
666}
667
668ASTUnit *ASTUnit::LoadFromASTFile(const std::string &Filename,
669                              IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
670                                  const FileSystemOptions &FileSystemOpts,
671                                  bool OnlyLocalDecls,
672                                  RemappedFile *RemappedFiles,
673                                  unsigned NumRemappedFiles,
674                                  bool CaptureDiagnostics,
675                                  bool AllowPCHWithCompilerErrors,
676                                  bool UserFilesAreVolatile) {
677  OwningPtr<ASTUnit> AST(new ASTUnit(true));
678
679  // Recover resources if we crash before exiting this method.
680  llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
681    ASTUnitCleanup(AST.get());
682  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
683    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
684    DiagCleanup(Diags.getPtr());
685
686  ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
687
688  AST->OnlyLocalDecls = OnlyLocalDecls;
689  AST->CaptureDiagnostics = CaptureDiagnostics;
690  AST->Diagnostics = Diags;
691  AST->FileMgr = new FileManager(FileSystemOpts);
692  AST->UserFilesAreVolatile = UserFilesAreVolatile;
693  AST->SourceMgr = new SourceManager(AST->getDiagnostics(),
694                                     AST->getFileManager(),
695                                     UserFilesAreVolatile);
696  AST->HSOpts = new HeaderSearchOptions();
697
698  AST->HeaderInfo.reset(new HeaderSearch(AST->HSOpts,
699                                         AST->getFileManager(),
700                                         AST->getDiagnostics(),
701                                         AST->ASTFileLangOpts,
702                                         /*Target=*/0));
703
704  for (unsigned I = 0; I != NumRemappedFiles; ++I) {
705    FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
706    if (const llvm::MemoryBuffer *
707          memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
708      // Create the file entry for the file that we're mapping from.
709      const FileEntry *FromFile
710        = AST->getFileManager().getVirtualFile(RemappedFiles[I].first,
711                                               memBuf->getBufferSize(),
712                                               0);
713      if (!FromFile) {
714        AST->getDiagnostics().Report(diag::err_fe_remap_missing_from_file)
715          << RemappedFiles[I].first;
716        delete memBuf;
717        continue;
718      }
719
720      // Override the contents of the "from" file with the contents of
721      // the "to" file.
722      AST->getSourceManager().overrideFileContents(FromFile, memBuf);
723
724    } else {
725      const char *fname = fileOrBuf.get<const char *>();
726      const FileEntry *ToFile = AST->FileMgr->getFile(fname);
727      if (!ToFile) {
728        AST->getDiagnostics().Report(diag::err_fe_remap_missing_to_file)
729        << RemappedFiles[I].first << fname;
730        continue;
731      }
732
733      // Create the file entry for the file that we're mapping from.
734      const FileEntry *FromFile
735        = AST->getFileManager().getVirtualFile(RemappedFiles[I].first,
736                                               ToFile->getSize(),
737                                               0);
738      if (!FromFile) {
739        AST->getDiagnostics().Report(diag::err_fe_remap_missing_from_file)
740          << RemappedFiles[I].first;
741        delete memBuf;
742        continue;
743      }
744
745      // Override the contents of the "from" file with the contents of
746      // the "to" file.
747      AST->getSourceManager().overrideFileContents(FromFile, ToFile);
748    }
749  }
750
751  // Gather Info for preprocessor construction later on.
752
753  HeaderSearch &HeaderInfo = *AST->HeaderInfo.get();
754  unsigned Counter;
755
756  OwningPtr<ASTReader> Reader;
757
758  AST->PP = new Preprocessor(new PreprocessorOptions(),
759                             AST->getDiagnostics(), AST->ASTFileLangOpts,
760                             /*Target=*/0, AST->getSourceManager(), HeaderInfo,
761                             *AST,
762                             /*IILookup=*/0,
763                             /*OwnsHeaderSearch=*/false,
764                             /*DelayInitialization=*/true);
765  Preprocessor &PP = *AST->PP;
766
767  AST->Ctx = new ASTContext(AST->ASTFileLangOpts,
768                            AST->getSourceManager(),
769                            /*Target=*/0,
770                            PP.getIdentifierTable(),
771                            PP.getSelectorTable(),
772                            PP.getBuiltinInfo(),
773                            /* size_reserve = */0,
774                            /*DelayInitialization=*/true);
775  ASTContext &Context = *AST->Ctx;
776
777  bool disableValid = false;
778  if (::getenv("LIBCLANG_DISABLE_PCH_VALIDATION"))
779    disableValid = true;
780  Reader.reset(new ASTReader(PP, Context,
781                             /*isysroot=*/"",
782                             /*DisableValidation=*/disableValid,
783                             AllowPCHWithCompilerErrors));
784
785  // Recover resources if we crash before exiting this method.
786  llvm::CrashRecoveryContextCleanupRegistrar<ASTReader>
787    ReaderCleanup(Reader.get());
788
789  Reader->setListener(new ASTInfoCollector(*AST->PP, Context,
790                                           AST->ASTFileLangOpts, HeaderInfo,
791                                           AST->TargetOpts, AST->Target,
792                                           Counter));
793
794  switch (Reader->ReadAST(Filename, serialization::MK_MainFile,
795                          SourceLocation(), ASTReader::ARR_None)) {
796  case ASTReader::Success:
797    break;
798
799  case ASTReader::Failure:
800  case ASTReader::OutOfDate:
801  case ASTReader::VersionMismatch:
802  case ASTReader::ConfigurationMismatch:
803  case ASTReader::HadErrors:
804    AST->getDiagnostics().Report(diag::err_fe_unable_to_load_pch);
805    return NULL;
806  }
807
808  AST->OriginalSourceFile = Reader->getOriginalSourceFile();
809
810  PP.setCounterValue(Counter);
811
812  // Attach the AST reader to the AST context as an external AST
813  // source, so that declarations will be deserialized from the
814  // AST file as needed.
815  ASTReader *ReaderPtr = Reader.get();
816  OwningPtr<ExternalASTSource> Source(Reader.take());
817
818  // Unregister the cleanup for ASTReader.  It will get cleaned up
819  // by the ASTUnit cleanup.
820  ReaderCleanup.unregister();
821
822  Context.setExternalSource(Source);
823
824  // Create an AST consumer, even though it isn't used.
825  AST->Consumer.reset(new ASTConsumer);
826
827  // Create a semantic analysis object and tell the AST reader about it.
828  AST->TheSema.reset(new Sema(PP, Context, *AST->Consumer));
829  AST->TheSema->Initialize();
830  ReaderPtr->InitializeSema(*AST->TheSema);
831  AST->Reader = ReaderPtr;
832
833  return AST.take();
834}
835
836namespace {
837
838/// \brief Preprocessor callback class that updates a hash value with the names
839/// of all macros that have been defined by the translation unit.
840class MacroDefinitionTrackerPPCallbacks : public PPCallbacks {
841  unsigned &Hash;
842
843public:
844  explicit MacroDefinitionTrackerPPCallbacks(unsigned &Hash) : Hash(Hash) { }
845
846  virtual void MacroDefined(const Token &MacroNameTok, const MacroInfo *MI) {
847    Hash = llvm::HashString(MacroNameTok.getIdentifierInfo()->getName(), Hash);
848  }
849};
850
851/// \brief Add the given declaration to the hash of all top-level entities.
852void AddTopLevelDeclarationToHash(Decl *D, unsigned &Hash) {
853  if (!D)
854    return;
855
856  DeclContext *DC = D->getDeclContext();
857  if (!DC)
858    return;
859
860  if (!(DC->isTranslationUnit() || DC->getLookupParent()->isTranslationUnit()))
861    return;
862
863  if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
864    if (ND->getIdentifier())
865      Hash = llvm::HashString(ND->getIdentifier()->getName(), Hash);
866    else if (DeclarationName Name = ND->getDeclName()) {
867      std::string NameStr = Name.getAsString();
868      Hash = llvm::HashString(NameStr, Hash);
869    }
870    return;
871  }
872}
873
874class TopLevelDeclTrackerConsumer : public ASTConsumer {
875  ASTUnit &Unit;
876  unsigned &Hash;
877
878public:
879  TopLevelDeclTrackerConsumer(ASTUnit &_Unit, unsigned &Hash)
880    : Unit(_Unit), Hash(Hash) {
881    Hash = 0;
882  }
883
884  void handleTopLevelDecl(Decl *D) {
885    if (!D)
886      return;
887
888    // FIXME: Currently ObjC method declarations are incorrectly being
889    // reported as top-level declarations, even though their DeclContext
890    // is the containing ObjC @interface/@implementation.  This is a
891    // fundamental problem in the parser right now.
892    if (isa<ObjCMethodDecl>(D))
893      return;
894
895    AddTopLevelDeclarationToHash(D, Hash);
896    Unit.addTopLevelDecl(D);
897
898    handleFileLevelDecl(D);
899  }
900
901  void handleFileLevelDecl(Decl *D) {
902    Unit.addFileLevelDecl(D);
903    if (NamespaceDecl *NSD = dyn_cast<NamespaceDecl>(D)) {
904      for (NamespaceDecl::decl_iterator
905             I = NSD->decls_begin(), E = NSD->decls_end(); I != E; ++I)
906        handleFileLevelDecl(*I);
907    }
908  }
909
910  bool HandleTopLevelDecl(DeclGroupRef D) {
911    for (DeclGroupRef::iterator it = D.begin(), ie = D.end(); it != ie; ++it)
912      handleTopLevelDecl(*it);
913    return true;
914  }
915
916  // We're not interested in "interesting" decls.
917  void HandleInterestingDecl(DeclGroupRef) {}
918
919  void HandleTopLevelDeclInObjCContainer(DeclGroupRef D) {
920    for (DeclGroupRef::iterator it = D.begin(), ie = D.end(); it != ie; ++it)
921      handleTopLevelDecl(*it);
922  }
923
924  virtual ASTDeserializationListener *GetASTDeserializationListener() {
925    return Unit.getDeserializationListener();
926  }
927};
928
929class TopLevelDeclTrackerAction : public ASTFrontendAction {
930public:
931  ASTUnit &Unit;
932
933  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
934                                         StringRef InFile) {
935    CI.getPreprocessor().addPPCallbacks(
936     new MacroDefinitionTrackerPPCallbacks(Unit.getCurrentTopLevelHashValue()));
937    return new TopLevelDeclTrackerConsumer(Unit,
938                                           Unit.getCurrentTopLevelHashValue());
939  }
940
941public:
942  TopLevelDeclTrackerAction(ASTUnit &_Unit) : Unit(_Unit) {}
943
944  virtual bool hasCodeCompletionSupport() const { return false; }
945  virtual TranslationUnitKind getTranslationUnitKind()  {
946    return Unit.getTranslationUnitKind();
947  }
948};
949
950class PrecompilePreambleConsumer : public PCHGenerator {
951  ASTUnit &Unit;
952  unsigned &Hash;
953  std::vector<Decl *> TopLevelDecls;
954
955public:
956  PrecompilePreambleConsumer(ASTUnit &Unit, const Preprocessor &PP,
957                             StringRef isysroot, raw_ostream *Out)
958    : PCHGenerator(PP, "", 0, isysroot, Out), Unit(Unit),
959      Hash(Unit.getCurrentTopLevelHashValue()) {
960    Hash = 0;
961  }
962
963  virtual bool HandleTopLevelDecl(DeclGroupRef D) {
964    for (DeclGroupRef::iterator it = D.begin(), ie = D.end(); it != ie; ++it) {
965      Decl *D = *it;
966      // FIXME: Currently ObjC method declarations are incorrectly being
967      // reported as top-level declarations, even though their DeclContext
968      // is the containing ObjC @interface/@implementation.  This is a
969      // fundamental problem in the parser right now.
970      if (isa<ObjCMethodDecl>(D))
971        continue;
972      AddTopLevelDeclarationToHash(D, Hash);
973      TopLevelDecls.push_back(D);
974    }
975    return true;
976  }
977
978  virtual void HandleTranslationUnit(ASTContext &Ctx) {
979    PCHGenerator::HandleTranslationUnit(Ctx);
980    if (!Unit.getDiagnostics().hasErrorOccurred()) {
981      // Translate the top-level declarations we captured during
982      // parsing into declaration IDs in the precompiled
983      // preamble. This will allow us to deserialize those top-level
984      // declarations when requested.
985      for (unsigned I = 0, N = TopLevelDecls.size(); I != N; ++I)
986        Unit.addTopLevelDeclFromPreamble(
987                                      getWriter().getDeclID(TopLevelDecls[I]));
988    }
989  }
990};
991
992class PrecompilePreambleAction : public ASTFrontendAction {
993  ASTUnit &Unit;
994
995public:
996  explicit PrecompilePreambleAction(ASTUnit &Unit) : Unit(Unit) {}
997
998  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
999                                         StringRef InFile) {
1000    std::string Sysroot;
1001    std::string OutputFile;
1002    raw_ostream *OS = 0;
1003    if (GeneratePCHAction::ComputeASTConsumerArguments(CI, InFile, Sysroot,
1004                                                       OutputFile,
1005                                                       OS))
1006      return 0;
1007
1008    if (!CI.getFrontendOpts().RelocatablePCH)
1009      Sysroot.clear();
1010
1011    CI.getPreprocessor().addPPCallbacks(
1012     new MacroDefinitionTrackerPPCallbacks(Unit.getCurrentTopLevelHashValue()));
1013    return new PrecompilePreambleConsumer(Unit, CI.getPreprocessor(), Sysroot,
1014                                          OS);
1015  }
1016
1017  virtual bool hasCodeCompletionSupport() const { return false; }
1018  virtual bool hasASTFileSupport() const { return false; }
1019  virtual TranslationUnitKind getTranslationUnitKind() { return TU_Prefix; }
1020};
1021
1022}
1023
1024static void checkAndRemoveNonDriverDiags(SmallVectorImpl<StoredDiagnostic> &
1025                                                            StoredDiagnostics) {
1026  // Get rid of stored diagnostics except the ones from the driver which do not
1027  // have a source location.
1028  for (unsigned I = 0; I < StoredDiagnostics.size(); ++I) {
1029    if (StoredDiagnostics[I].getLocation().isValid()) {
1030      StoredDiagnostics.erase(StoredDiagnostics.begin()+I);
1031      --I;
1032    }
1033  }
1034}
1035
1036static void checkAndSanitizeDiags(SmallVectorImpl<StoredDiagnostic> &
1037                                                              StoredDiagnostics,
1038                                  SourceManager &SM) {
1039  // The stored diagnostic has the old source manager in it; update
1040  // the locations to refer into the new source manager. Since we've
1041  // been careful to make sure that the source manager's state
1042  // before and after are identical, so that we can reuse the source
1043  // location itself.
1044  for (unsigned I = 0, N = StoredDiagnostics.size(); I < N; ++I) {
1045    if (StoredDiagnostics[I].getLocation().isValid()) {
1046      FullSourceLoc Loc(StoredDiagnostics[I].getLocation(), SM);
1047      StoredDiagnostics[I].setLocation(Loc);
1048    }
1049  }
1050}
1051
1052/// Parse the source file into a translation unit using the given compiler
1053/// invocation, replacing the current translation unit.
1054///
1055/// \returns True if a failure occurred that causes the ASTUnit not to
1056/// contain any translation-unit information, false otherwise.
1057bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
1058  delete SavedMainFileBuffer;
1059  SavedMainFileBuffer = 0;
1060
1061  if (!Invocation) {
1062    delete OverrideMainBuffer;
1063    return true;
1064  }
1065
1066  // Create the compiler instance to use for building the AST.
1067  OwningPtr<CompilerInstance> Clang(new CompilerInstance());
1068
1069  // Recover resources if we crash before exiting this method.
1070  llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1071    CICleanup(Clang.get());
1072
1073  IntrusiveRefCntPtr<CompilerInvocation>
1074    CCInvocation(new CompilerInvocation(*Invocation));
1075
1076  Clang->setInvocation(CCInvocation.getPtr());
1077  OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
1078
1079  // Set up diagnostics, capturing any diagnostics that would
1080  // otherwise be dropped.
1081  Clang->setDiagnostics(&getDiagnostics());
1082
1083  // Create the target instance.
1084  Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
1085                   &Clang->getTargetOpts()));
1086  if (!Clang->hasTarget()) {
1087    delete OverrideMainBuffer;
1088    return true;
1089  }
1090
1091  // Inform the target of the language options.
1092  //
1093  // FIXME: We shouldn't need to do this, the target should be immutable once
1094  // created. This complexity should be lifted elsewhere.
1095  Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
1096
1097  assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1098         "Invocation must have exactly one source file!");
1099  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
1100         "FIXME: AST inputs not yet supported here!");
1101  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
1102         "IR inputs not support here!");
1103
1104  // Configure the various subsystems.
1105  // FIXME: Should we retain the previous file manager?
1106  LangOpts = &Clang->getLangOpts();
1107  FileSystemOpts = Clang->getFileSystemOpts();
1108  FileMgr = new FileManager(FileSystemOpts);
1109  SourceMgr = new SourceManager(getDiagnostics(), *FileMgr,
1110                                UserFilesAreVolatile);
1111  TheSema.reset();
1112  Ctx = 0;
1113  PP = 0;
1114  Reader = 0;
1115
1116  // Clear out old caches and data.
1117  TopLevelDecls.clear();
1118  clearFileLevelDecls();
1119  CleanTemporaryFiles();
1120
1121  if (!OverrideMainBuffer) {
1122    checkAndRemoveNonDriverDiags(StoredDiagnostics);
1123    TopLevelDeclsInPreamble.clear();
1124  }
1125
1126  // Create a file manager object to provide access to and cache the filesystem.
1127  Clang->setFileManager(&getFileManager());
1128
1129  // Create the source manager.
1130  Clang->setSourceManager(&getSourceManager());
1131
1132  // If the main file has been overridden due to the use of a preamble,
1133  // make that override happen and introduce the preamble.
1134  PreprocessorOptions &PreprocessorOpts = Clang->getPreprocessorOpts();
1135  if (OverrideMainBuffer) {
1136    PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer);
1137    PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size();
1138    PreprocessorOpts.PrecompiledPreambleBytes.second
1139                                                    = PreambleEndsAtStartOfLine;
1140    PreprocessorOpts.ImplicitPCHInclude = getPreambleFile(this);
1141    PreprocessorOpts.DisablePCHValidation = true;
1142
1143    // The stored diagnostic has the old source manager in it; update
1144    // the locations to refer into the new source manager. Since we've
1145    // been careful to make sure that the source manager's state
1146    // before and after are identical, so that we can reuse the source
1147    // location itself.
1148    checkAndSanitizeDiags(StoredDiagnostics, getSourceManager());
1149
1150    // Keep track of the override buffer;
1151    SavedMainFileBuffer = OverrideMainBuffer;
1152  }
1153
1154  OwningPtr<TopLevelDeclTrackerAction> Act(
1155    new TopLevelDeclTrackerAction(*this));
1156
1157  // Recover resources if we crash before exiting this method.
1158  llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
1159    ActCleanup(Act.get());
1160
1161  if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0]))
1162    goto error;
1163
1164  if (OverrideMainBuffer) {
1165    std::string ModName = getPreambleFile(this);
1166    TranslateStoredDiagnostics(Clang->getModuleManager(), ModName,
1167                               getSourceManager(), PreambleDiagnostics,
1168                               StoredDiagnostics);
1169  }
1170
1171  if (!Act->Execute())
1172    goto error;
1173
1174  transferASTDataFromCompilerInstance(*Clang);
1175
1176  Act->EndSourceFile();
1177
1178  FailedParseDiagnostics.clear();
1179
1180  return false;
1181
1182error:
1183  // Remove the overridden buffer we used for the preamble.
1184  if (OverrideMainBuffer) {
1185    delete OverrideMainBuffer;
1186    SavedMainFileBuffer = 0;
1187  }
1188
1189  // Keep the ownership of the data in the ASTUnit because the client may
1190  // want to see the diagnostics.
1191  transferASTDataFromCompilerInstance(*Clang);
1192  FailedParseDiagnostics.swap(StoredDiagnostics);
1193  StoredDiagnostics.clear();
1194  NumStoredDiagnosticsFromDriver = 0;
1195  return true;
1196}
1197
1198/// \brief Simple function to retrieve a path for a preamble precompiled header.
1199static std::string GetPreamblePCHPath() {
1200  // FIXME: This is lame; sys::Path should provide this function (in particular,
1201  // it should know how to find the temporary files dir).
1202  // FIXME: This is really lame. I copied this code from the Driver!
1203  // FIXME: This is a hack so that we can override the preamble file during
1204  // crash-recovery testing, which is the only case where the preamble files
1205  // are not necessarily cleaned up.
1206  const char *TmpFile = ::getenv("CINDEXTEST_PREAMBLE_FILE");
1207  if (TmpFile)
1208    return TmpFile;
1209
1210  std::string Error;
1211  const char *TmpDir = ::getenv("TMPDIR");
1212  if (!TmpDir)
1213    TmpDir = ::getenv("TEMP");
1214  if (!TmpDir)
1215    TmpDir = ::getenv("TMP");
1216#ifdef LLVM_ON_WIN32
1217  if (!TmpDir)
1218    TmpDir = ::getenv("USERPROFILE");
1219#endif
1220  if (!TmpDir)
1221    TmpDir = "/tmp";
1222  llvm::sys::Path P(TmpDir);
1223  P.createDirectoryOnDisk(true);
1224  P.appendComponent("preamble");
1225  P.appendSuffix("pch");
1226  if (P.makeUnique(/*reuse_current=*/false, /*ErrMsg*/0))
1227    return std::string();
1228
1229  return P.str();
1230}
1231
1232/// \brief Compute the preamble for the main file, providing the source buffer
1233/// that corresponds to the main file along with a pair (bytes, start-of-line)
1234/// that describes the preamble.
1235std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> >
1236ASTUnit::ComputePreamble(CompilerInvocation &Invocation,
1237                         unsigned MaxLines, bool &CreatedBuffer) {
1238  FrontendOptions &FrontendOpts = Invocation.getFrontendOpts();
1239  PreprocessorOptions &PreprocessorOpts = Invocation.getPreprocessorOpts();
1240  CreatedBuffer = false;
1241
1242  // Try to determine if the main file has been remapped, either from the
1243  // command line (to another file) or directly through the compiler invocation
1244  // (to a memory buffer).
1245  llvm::MemoryBuffer *Buffer = 0;
1246  llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].getFile());
1247  if (const llvm::sys::FileStatus *MainFileStatus = MainFilePath.getFileStatus()) {
1248    // Check whether there is a file-file remapping of the main file
1249    for (PreprocessorOptions::remapped_file_iterator
1250          M = PreprocessorOpts.remapped_file_begin(),
1251          E = PreprocessorOpts.remapped_file_end();
1252         M != E;
1253         ++M) {
1254      llvm::sys::PathWithStatus MPath(M->first);
1255      if (const llvm::sys::FileStatus *MStatus = MPath.getFileStatus()) {
1256        if (MainFileStatus->uniqueID == MStatus->uniqueID) {
1257          // We found a remapping. Try to load the resulting, remapped source.
1258          if (CreatedBuffer) {
1259            delete Buffer;
1260            CreatedBuffer = false;
1261          }
1262
1263          Buffer = getBufferForFile(M->second);
1264          if (!Buffer)
1265            return std::make_pair((llvm::MemoryBuffer*)0,
1266                                  std::make_pair(0, true));
1267          CreatedBuffer = true;
1268        }
1269      }
1270    }
1271
1272    // Check whether there is a file-buffer remapping. It supercedes the
1273    // file-file remapping.
1274    for (PreprocessorOptions::remapped_file_buffer_iterator
1275           M = PreprocessorOpts.remapped_file_buffer_begin(),
1276           E = PreprocessorOpts.remapped_file_buffer_end();
1277         M != E;
1278         ++M) {
1279      llvm::sys::PathWithStatus MPath(M->first);
1280      if (const llvm::sys::FileStatus *MStatus = MPath.getFileStatus()) {
1281        if (MainFileStatus->uniqueID == MStatus->uniqueID) {
1282          // We found a remapping.
1283          if (CreatedBuffer) {
1284            delete Buffer;
1285            CreatedBuffer = false;
1286          }
1287
1288          Buffer = const_cast<llvm::MemoryBuffer *>(M->second);
1289        }
1290      }
1291    }
1292  }
1293
1294  // If the main source file was not remapped, load it now.
1295  if (!Buffer) {
1296    Buffer = getBufferForFile(FrontendOpts.Inputs[0].getFile());
1297    if (!Buffer)
1298      return std::make_pair((llvm::MemoryBuffer*)0, std::make_pair(0, true));
1299
1300    CreatedBuffer = true;
1301  }
1302
1303  return std::make_pair(Buffer, Lexer::ComputePreamble(Buffer,
1304                                                       *Invocation.getLangOpts(),
1305                                                       MaxLines));
1306}
1307
1308static llvm::MemoryBuffer *CreatePaddedMainFileBuffer(llvm::MemoryBuffer *Old,
1309                                                      unsigned NewSize,
1310                                                      StringRef NewName) {
1311  llvm::MemoryBuffer *Result
1312    = llvm::MemoryBuffer::getNewUninitMemBuffer(NewSize, NewName);
1313  memcpy(const_cast<char*>(Result->getBufferStart()),
1314         Old->getBufferStart(), Old->getBufferSize());
1315  memset(const_cast<char*>(Result->getBufferStart()) + Old->getBufferSize(),
1316         ' ', NewSize - Old->getBufferSize() - 1);
1317  const_cast<char*>(Result->getBufferEnd())[-1] = '\n';
1318
1319  return Result;
1320}
1321
1322/// \brief Attempt to build or re-use a precompiled preamble when (re-)parsing
1323/// the source file.
1324///
1325/// This routine will compute the preamble of the main source file. If a
1326/// non-trivial preamble is found, it will precompile that preamble into a
1327/// precompiled header so that the precompiled preamble can be used to reduce
1328/// reparsing time. If a precompiled preamble has already been constructed,
1329/// this routine will determine if it is still valid and, if so, avoid
1330/// rebuilding the precompiled preamble.
1331///
1332/// \param AllowRebuild When true (the default), this routine is
1333/// allowed to rebuild the precompiled preamble if it is found to be
1334/// out-of-date.
1335///
1336/// \param MaxLines When non-zero, the maximum number of lines that
1337/// can occur within the preamble.
1338///
1339/// \returns If the precompiled preamble can be used, returns a newly-allocated
1340/// buffer that should be used in place of the main file when doing so.
1341/// Otherwise, returns a NULL pointer.
1342llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
1343                              const CompilerInvocation &PreambleInvocationIn,
1344                                                           bool AllowRebuild,
1345                                                           unsigned MaxLines) {
1346
1347  IntrusiveRefCntPtr<CompilerInvocation>
1348    PreambleInvocation(new CompilerInvocation(PreambleInvocationIn));
1349  FrontendOptions &FrontendOpts = PreambleInvocation->getFrontendOpts();
1350  PreprocessorOptions &PreprocessorOpts
1351    = PreambleInvocation->getPreprocessorOpts();
1352
1353  bool CreatedPreambleBuffer = false;
1354  std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> > NewPreamble
1355    = ComputePreamble(*PreambleInvocation, MaxLines, CreatedPreambleBuffer);
1356
1357  // If ComputePreamble() Take ownership of the preamble buffer.
1358  OwningPtr<llvm::MemoryBuffer> OwnedPreambleBuffer;
1359  if (CreatedPreambleBuffer)
1360    OwnedPreambleBuffer.reset(NewPreamble.first);
1361
1362  if (!NewPreamble.second.first) {
1363    // We couldn't find a preamble in the main source. Clear out the current
1364    // preamble, if we have one. It's obviously no good any more.
1365    Preamble.clear();
1366    erasePreambleFile(this);
1367
1368    // The next time we actually see a preamble, precompile it.
1369    PreambleRebuildCounter = 1;
1370    return 0;
1371  }
1372
1373  if (!Preamble.empty()) {
1374    // We've previously computed a preamble. Check whether we have the same
1375    // preamble now that we did before, and that there's enough space in
1376    // the main-file buffer within the precompiled preamble to fit the
1377    // new main file.
1378    if (Preamble.size() == NewPreamble.second.first &&
1379        PreambleEndsAtStartOfLine == NewPreamble.second.second &&
1380        NewPreamble.first->getBufferSize() < PreambleReservedSize-2 &&
1381        memcmp(Preamble.getBufferStart(), NewPreamble.first->getBufferStart(),
1382               NewPreamble.second.first) == 0) {
1383      // The preamble has not changed. We may be able to re-use the precompiled
1384      // preamble.
1385
1386      // Check that none of the files used by the preamble have changed.
1387      bool AnyFileChanged = false;
1388
1389      // First, make a record of those files that have been overridden via
1390      // remapping or unsaved_files.
1391      llvm::StringMap<std::pair<off_t, time_t> > OverriddenFiles;
1392      for (PreprocessorOptions::remapped_file_iterator
1393                R = PreprocessorOpts.remapped_file_begin(),
1394             REnd = PreprocessorOpts.remapped_file_end();
1395           !AnyFileChanged && R != REnd;
1396           ++R) {
1397        struct stat StatBuf;
1398        if (FileMgr->getNoncachedStatValue(R->second, StatBuf)) {
1399          // If we can't stat the file we're remapping to, assume that something
1400          // horrible happened.
1401          AnyFileChanged = true;
1402          break;
1403        }
1404
1405        OverriddenFiles[R->first] = std::make_pair(StatBuf.st_size,
1406                                                   StatBuf.st_mtime);
1407      }
1408      for (PreprocessorOptions::remapped_file_buffer_iterator
1409                R = PreprocessorOpts.remapped_file_buffer_begin(),
1410             REnd = PreprocessorOpts.remapped_file_buffer_end();
1411           !AnyFileChanged && R != REnd;
1412           ++R) {
1413        // FIXME: Should we actually compare the contents of file->buffer
1414        // remappings?
1415        OverriddenFiles[R->first] = std::make_pair(R->second->getBufferSize(),
1416                                                   0);
1417      }
1418
1419      // Check whether anything has changed.
1420      for (llvm::StringMap<std::pair<off_t, time_t> >::iterator
1421             F = FilesInPreamble.begin(), FEnd = FilesInPreamble.end();
1422           !AnyFileChanged && F != FEnd;
1423           ++F) {
1424        llvm::StringMap<std::pair<off_t, time_t> >::iterator Overridden
1425          = OverriddenFiles.find(F->first());
1426        if (Overridden != OverriddenFiles.end()) {
1427          // This file was remapped; check whether the newly-mapped file
1428          // matches up with the previous mapping.
1429          if (Overridden->second != F->second)
1430            AnyFileChanged = true;
1431          continue;
1432        }
1433
1434        // The file was not remapped; check whether it has changed on disk.
1435        struct stat StatBuf;
1436        if (FileMgr->getNoncachedStatValue(F->first(), StatBuf)) {
1437          // If we can't stat the file, assume that something horrible happened.
1438          AnyFileChanged = true;
1439        } else if (StatBuf.st_size != F->second.first ||
1440                   StatBuf.st_mtime != F->second.second)
1441          AnyFileChanged = true;
1442      }
1443
1444      if (!AnyFileChanged) {
1445        // Okay! We can re-use the precompiled preamble.
1446
1447        // Set the state of the diagnostic object to mimic its state
1448        // after parsing the preamble.
1449        getDiagnostics().Reset();
1450        ProcessWarningOptions(getDiagnostics(),
1451                              PreambleInvocation->getDiagnosticOpts());
1452        getDiagnostics().setNumWarnings(NumWarningsInPreamble);
1453
1454        // Create a version of the main file buffer that is padded to
1455        // buffer size we reserved when creating the preamble.
1456        return CreatePaddedMainFileBuffer(NewPreamble.first,
1457                                          PreambleReservedSize,
1458                                          FrontendOpts.Inputs[0].getFile());
1459      }
1460    }
1461
1462    // If we aren't allowed to rebuild the precompiled preamble, just
1463    // return now.
1464    if (!AllowRebuild)
1465      return 0;
1466
1467    // We can't reuse the previously-computed preamble. Build a new one.
1468    Preamble.clear();
1469    PreambleDiagnostics.clear();
1470    erasePreambleFile(this);
1471    PreambleRebuildCounter = 1;
1472  } else if (!AllowRebuild) {
1473    // We aren't allowed to rebuild the precompiled preamble; just
1474    // return now.
1475    return 0;
1476  }
1477
1478  // If the preamble rebuild counter > 1, it's because we previously
1479  // failed to build a preamble and we're not yet ready to try
1480  // again. Decrement the counter and return a failure.
1481  if (PreambleRebuildCounter > 1) {
1482    --PreambleRebuildCounter;
1483    return 0;
1484  }
1485
1486  // Create a temporary file for the precompiled preamble. In rare
1487  // circumstances, this can fail.
1488  std::string PreamblePCHPath = GetPreamblePCHPath();
1489  if (PreamblePCHPath.empty()) {
1490    // Try again next time.
1491    PreambleRebuildCounter = 1;
1492    return 0;
1493  }
1494
1495  // We did not previously compute a preamble, or it can't be reused anyway.
1496  SimpleTimer PreambleTimer(WantTiming);
1497  PreambleTimer.setOutput("Precompiling preamble");
1498
1499  // Create a new buffer that stores the preamble. The buffer also contains
1500  // extra space for the original contents of the file (which will be present
1501  // when we actually parse the file) along with more room in case the file
1502  // grows.
1503  PreambleReservedSize = NewPreamble.first->getBufferSize();
1504  if (PreambleReservedSize < 4096)
1505    PreambleReservedSize = 8191;
1506  else
1507    PreambleReservedSize *= 2;
1508
1509  // Save the preamble text for later; we'll need to compare against it for
1510  // subsequent reparses.
1511  StringRef MainFilename = PreambleInvocation->getFrontendOpts().Inputs[0].getFile();
1512  Preamble.assign(FileMgr->getFile(MainFilename),
1513                  NewPreamble.first->getBufferStart(),
1514                  NewPreamble.first->getBufferStart()
1515                                                  + NewPreamble.second.first);
1516  PreambleEndsAtStartOfLine = NewPreamble.second.second;
1517
1518  delete PreambleBuffer;
1519  PreambleBuffer
1520    = llvm::MemoryBuffer::getNewUninitMemBuffer(PreambleReservedSize,
1521                                                FrontendOpts.Inputs[0].getFile());
1522  memcpy(const_cast<char*>(PreambleBuffer->getBufferStart()),
1523         NewPreamble.first->getBufferStart(), Preamble.size());
1524  memset(const_cast<char*>(PreambleBuffer->getBufferStart()) + Preamble.size(),
1525         ' ', PreambleReservedSize - Preamble.size() - 1);
1526  const_cast<char*>(PreambleBuffer->getBufferEnd())[-1] = '\n';
1527
1528  // Remap the main source file to the preamble buffer.
1529  llvm::sys::PathWithStatus MainFilePath(FrontendOpts.Inputs[0].getFile());
1530  PreprocessorOpts.addRemappedFile(MainFilePath.str(), PreambleBuffer);
1531
1532  // Tell the compiler invocation to generate a temporary precompiled header.
1533  FrontendOpts.ProgramAction = frontend::GeneratePCH;
1534  // FIXME: Generate the precompiled header into memory?
1535  FrontendOpts.OutputFile = PreamblePCHPath;
1536  PreprocessorOpts.PrecompiledPreambleBytes.first = 0;
1537  PreprocessorOpts.PrecompiledPreambleBytes.second = false;
1538
1539  // Create the compiler instance to use for building the precompiled preamble.
1540  OwningPtr<CompilerInstance> Clang(new CompilerInstance());
1541
1542  // Recover resources if we crash before exiting this method.
1543  llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1544    CICleanup(Clang.get());
1545
1546  Clang->setInvocation(&*PreambleInvocation);
1547  OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
1548
1549  // Set up diagnostics, capturing all of the diagnostics produced.
1550  Clang->setDiagnostics(&getDiagnostics());
1551
1552  // Create the target instance.
1553  Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
1554                                                &Clang->getTargetOpts()));
1555  if (!Clang->hasTarget()) {
1556    llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk();
1557    Preamble.clear();
1558    PreambleRebuildCounter = DefaultPreambleRebuildInterval;
1559    PreprocessorOpts.eraseRemappedFile(
1560                               PreprocessorOpts.remapped_file_buffer_end() - 1);
1561    return 0;
1562  }
1563
1564  // Inform the target of the language options.
1565  //
1566  // FIXME: We shouldn't need to do this, the target should be immutable once
1567  // created. This complexity should be lifted elsewhere.
1568  Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
1569
1570  assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1571         "Invocation must have exactly one source file!");
1572  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
1573         "FIXME: AST inputs not yet supported here!");
1574  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
1575         "IR inputs not support here!");
1576
1577  // Clear out old caches and data.
1578  getDiagnostics().Reset();
1579  ProcessWarningOptions(getDiagnostics(), Clang->getDiagnosticOpts());
1580  checkAndRemoveNonDriverDiags(StoredDiagnostics);
1581  TopLevelDecls.clear();
1582  TopLevelDeclsInPreamble.clear();
1583
1584  // Create a file manager object to provide access to and cache the filesystem.
1585  Clang->setFileManager(new FileManager(Clang->getFileSystemOpts()));
1586
1587  // Create the source manager.
1588  Clang->setSourceManager(new SourceManager(getDiagnostics(),
1589                                            Clang->getFileManager()));
1590
1591  OwningPtr<PrecompilePreambleAction> Act;
1592  Act.reset(new PrecompilePreambleAction(*this));
1593  if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
1594    llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk();
1595    Preamble.clear();
1596    PreambleRebuildCounter = DefaultPreambleRebuildInterval;
1597    PreprocessorOpts.eraseRemappedFile(
1598                               PreprocessorOpts.remapped_file_buffer_end() - 1);
1599    return 0;
1600  }
1601
1602  Act->Execute();
1603  Act->EndSourceFile();
1604
1605  if (Diagnostics->hasErrorOccurred()) {
1606    // There were errors parsing the preamble, so no precompiled header was
1607    // generated. Forget that we even tried.
1608    // FIXME: Should we leave a note for ourselves to try again?
1609    llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk();
1610    Preamble.clear();
1611    TopLevelDeclsInPreamble.clear();
1612    PreambleRebuildCounter = DefaultPreambleRebuildInterval;
1613    PreprocessorOpts.eraseRemappedFile(
1614                               PreprocessorOpts.remapped_file_buffer_end() - 1);
1615    return 0;
1616  }
1617
1618  // Transfer any diagnostics generated when parsing the preamble into the set
1619  // of preamble diagnostics.
1620  PreambleDiagnostics.clear();
1621  PreambleDiagnostics.insert(PreambleDiagnostics.end(),
1622                            stored_diag_afterDriver_begin(), stored_diag_end());
1623  checkAndRemoveNonDriverDiags(StoredDiagnostics);
1624
1625  // Keep track of the preamble we precompiled.
1626  setPreambleFile(this, FrontendOpts.OutputFile);
1627  NumWarningsInPreamble = getDiagnostics().getNumWarnings();
1628
1629  // Keep track of all of the files that the source manager knows about,
1630  // so we can verify whether they have changed or not.
1631  FilesInPreamble.clear();
1632  SourceManager &SourceMgr = Clang->getSourceManager();
1633  const llvm::MemoryBuffer *MainFileBuffer
1634    = SourceMgr.getBuffer(SourceMgr.getMainFileID());
1635  for (SourceManager::fileinfo_iterator F = SourceMgr.fileinfo_begin(),
1636                                     FEnd = SourceMgr.fileinfo_end();
1637       F != FEnd;
1638       ++F) {
1639    const FileEntry *File = F->second->OrigEntry;
1640    if (!File || F->second->getRawBuffer() == MainFileBuffer)
1641      continue;
1642
1643    FilesInPreamble[File->getName()]
1644      = std::make_pair(F->second->getSize(), File->getModificationTime());
1645  }
1646
1647  PreambleRebuildCounter = 1;
1648  PreprocessorOpts.eraseRemappedFile(
1649                               PreprocessorOpts.remapped_file_buffer_end() - 1);
1650
1651  // If the hash of top-level entities differs from the hash of the top-level
1652  // entities the last time we rebuilt the preamble, clear out the completion
1653  // cache.
1654  if (CurrentTopLevelHashValue != PreambleTopLevelHashValue) {
1655    CompletionCacheTopLevelHashValue = 0;
1656    PreambleTopLevelHashValue = CurrentTopLevelHashValue;
1657  }
1658
1659  return CreatePaddedMainFileBuffer(NewPreamble.first,
1660                                    PreambleReservedSize,
1661                                    FrontendOpts.Inputs[0].getFile());
1662}
1663
1664void ASTUnit::RealizeTopLevelDeclsFromPreamble() {
1665  std::vector<Decl *> Resolved;
1666  Resolved.reserve(TopLevelDeclsInPreamble.size());
1667  ExternalASTSource &Source = *getASTContext().getExternalSource();
1668  for (unsigned I = 0, N = TopLevelDeclsInPreamble.size(); I != N; ++I) {
1669    // Resolve the declaration ID to an actual declaration, possibly
1670    // deserializing the declaration in the process.
1671    Decl *D = Source.GetExternalDecl(TopLevelDeclsInPreamble[I]);
1672    if (D)
1673      Resolved.push_back(D);
1674  }
1675  TopLevelDeclsInPreamble.clear();
1676  TopLevelDecls.insert(TopLevelDecls.begin(), Resolved.begin(), Resolved.end());
1677}
1678
1679void ASTUnit::transferASTDataFromCompilerInstance(CompilerInstance &CI) {
1680  // Steal the created target, context, and preprocessor.
1681  TheSema.reset(CI.takeSema());
1682  Consumer.reset(CI.takeASTConsumer());
1683  Ctx = &CI.getASTContext();
1684  PP = &CI.getPreprocessor();
1685  CI.setSourceManager(0);
1686  CI.setFileManager(0);
1687  Target = &CI.getTarget();
1688  Reader = CI.getModuleManager();
1689}
1690
1691StringRef ASTUnit::getMainFileName() const {
1692  return Invocation->getFrontendOpts().Inputs[0].getFile();
1693}
1694
1695ASTUnit *ASTUnit::create(CompilerInvocation *CI,
1696                         IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1697                         bool CaptureDiagnostics,
1698                         bool UserFilesAreVolatile) {
1699  OwningPtr<ASTUnit> AST;
1700  AST.reset(new ASTUnit(false));
1701  ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
1702  AST->Diagnostics = Diags;
1703  AST->Invocation = CI;
1704  AST->FileSystemOpts = CI->getFileSystemOpts();
1705  AST->FileMgr = new FileManager(AST->FileSystemOpts);
1706  AST->UserFilesAreVolatile = UserFilesAreVolatile;
1707  AST->SourceMgr = new SourceManager(AST->getDiagnostics(), *AST->FileMgr,
1708                                     UserFilesAreVolatile);
1709
1710  return AST.take();
1711}
1712
1713ASTUnit *ASTUnit::LoadFromCompilerInvocationAction(CompilerInvocation *CI,
1714                              IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1715                                             ASTFrontendAction *Action,
1716                                             ASTUnit *Unit,
1717                                             bool Persistent,
1718                                             StringRef ResourceFilesPath,
1719                                             bool OnlyLocalDecls,
1720                                             bool CaptureDiagnostics,
1721                                             bool PrecompilePreamble,
1722                                             bool CacheCodeCompletionResults,
1723                                    bool IncludeBriefCommentsInCodeCompletion,
1724                                             bool UserFilesAreVolatile,
1725                                             OwningPtr<ASTUnit> *ErrAST) {
1726  assert(CI && "A CompilerInvocation is required");
1727
1728  OwningPtr<ASTUnit> OwnAST;
1729  ASTUnit *AST = Unit;
1730  if (!AST) {
1731    // Create the AST unit.
1732    OwnAST.reset(create(CI, Diags, CaptureDiagnostics, UserFilesAreVolatile));
1733    AST = OwnAST.get();
1734  }
1735
1736  if (!ResourceFilesPath.empty()) {
1737    // Override the resources path.
1738    CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
1739  }
1740  AST->OnlyLocalDecls = OnlyLocalDecls;
1741  AST->CaptureDiagnostics = CaptureDiagnostics;
1742  if (PrecompilePreamble)
1743    AST->PreambleRebuildCounter = 2;
1744  AST->TUKind = Action ? Action->getTranslationUnitKind() : TU_Complete;
1745  AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1746  AST->IncludeBriefCommentsInCodeCompletion
1747    = IncludeBriefCommentsInCodeCompletion;
1748
1749  // Recover resources if we crash before exiting this method.
1750  llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1751    ASTUnitCleanup(OwnAST.get());
1752  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
1753    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
1754    DiagCleanup(Diags.getPtr());
1755
1756  // We'll manage file buffers ourselves.
1757  CI->getPreprocessorOpts().RetainRemappedFileBuffers = true;
1758  CI->getFrontendOpts().DisableFree = false;
1759  ProcessWarningOptions(AST->getDiagnostics(), CI->getDiagnosticOpts());
1760
1761  // Create the compiler instance to use for building the AST.
1762  OwningPtr<CompilerInstance> Clang(new CompilerInstance());
1763
1764  // Recover resources if we crash before exiting this method.
1765  llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1766    CICleanup(Clang.get());
1767
1768  Clang->setInvocation(CI);
1769  AST->OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
1770
1771  // Set up diagnostics, capturing any diagnostics that would
1772  // otherwise be dropped.
1773  Clang->setDiagnostics(&AST->getDiagnostics());
1774
1775  // Create the target instance.
1776  Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
1777                                                &Clang->getTargetOpts()));
1778  if (!Clang->hasTarget())
1779    return 0;
1780
1781  // Inform the target of the language options.
1782  //
1783  // FIXME: We shouldn't need to do this, the target should be immutable once
1784  // created. This complexity should be lifted elsewhere.
1785  Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
1786
1787  assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1788         "Invocation must have exactly one source file!");
1789  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
1790         "FIXME: AST inputs not yet supported here!");
1791  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
1792         "IR inputs not supported here!");
1793
1794  // Configure the various subsystems.
1795  AST->TheSema.reset();
1796  AST->Ctx = 0;
1797  AST->PP = 0;
1798  AST->Reader = 0;
1799
1800  // Create a file manager object to provide access to and cache the filesystem.
1801  Clang->setFileManager(&AST->getFileManager());
1802
1803  // Create the source manager.
1804  Clang->setSourceManager(&AST->getSourceManager());
1805
1806  ASTFrontendAction *Act = Action;
1807
1808  OwningPtr<TopLevelDeclTrackerAction> TrackerAct;
1809  if (!Act) {
1810    TrackerAct.reset(new TopLevelDeclTrackerAction(*AST));
1811    Act = TrackerAct.get();
1812  }
1813
1814  // Recover resources if we crash before exiting this method.
1815  llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
1816    ActCleanup(TrackerAct.get());
1817
1818  if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
1819    AST->transferASTDataFromCompilerInstance(*Clang);
1820    if (OwnAST && ErrAST)
1821      ErrAST->swap(OwnAST);
1822
1823    return 0;
1824  }
1825
1826  if (Persistent && !TrackerAct) {
1827    Clang->getPreprocessor().addPPCallbacks(
1828     new MacroDefinitionTrackerPPCallbacks(AST->getCurrentTopLevelHashValue()));
1829    std::vector<ASTConsumer*> Consumers;
1830    if (Clang->hasASTConsumer())
1831      Consumers.push_back(Clang->takeASTConsumer());
1832    Consumers.push_back(new TopLevelDeclTrackerConsumer(*AST,
1833                                           AST->getCurrentTopLevelHashValue()));
1834    Clang->setASTConsumer(new MultiplexConsumer(Consumers));
1835  }
1836  if (!Act->Execute()) {
1837    AST->transferASTDataFromCompilerInstance(*Clang);
1838    if (OwnAST && ErrAST)
1839      ErrAST->swap(OwnAST);
1840
1841    return 0;
1842  }
1843
1844  // Steal the created target, context, and preprocessor.
1845  AST->transferASTDataFromCompilerInstance(*Clang);
1846
1847  Act->EndSourceFile();
1848
1849  if (OwnAST)
1850    return OwnAST.take();
1851  else
1852    return AST;
1853}
1854
1855bool ASTUnit::LoadFromCompilerInvocation(bool PrecompilePreamble) {
1856  if (!Invocation)
1857    return true;
1858
1859  // We'll manage file buffers ourselves.
1860  Invocation->getPreprocessorOpts().RetainRemappedFileBuffers = true;
1861  Invocation->getFrontendOpts().DisableFree = false;
1862  ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
1863
1864  llvm::MemoryBuffer *OverrideMainBuffer = 0;
1865  if (PrecompilePreamble) {
1866    PreambleRebuildCounter = 2;
1867    OverrideMainBuffer
1868      = getMainBufferWithPrecompiledPreamble(*Invocation);
1869  }
1870
1871  SimpleTimer ParsingTimer(WantTiming);
1872  ParsingTimer.setOutput("Parsing " + getMainFileName());
1873
1874  // Recover resources if we crash before exiting this method.
1875  llvm::CrashRecoveryContextCleanupRegistrar<llvm::MemoryBuffer>
1876    MemBufferCleanup(OverrideMainBuffer);
1877
1878  return Parse(OverrideMainBuffer);
1879}
1880
1881ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
1882                              IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1883                                             bool OnlyLocalDecls,
1884                                             bool CaptureDiagnostics,
1885                                             bool PrecompilePreamble,
1886                                             TranslationUnitKind TUKind,
1887                                             bool CacheCodeCompletionResults,
1888                                    bool IncludeBriefCommentsInCodeCompletion,
1889                                             bool UserFilesAreVolatile) {
1890  // Create the AST unit.
1891  OwningPtr<ASTUnit> AST;
1892  AST.reset(new ASTUnit(false));
1893  ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
1894  AST->Diagnostics = Diags;
1895  AST->OnlyLocalDecls = OnlyLocalDecls;
1896  AST->CaptureDiagnostics = CaptureDiagnostics;
1897  AST->TUKind = TUKind;
1898  AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1899  AST->IncludeBriefCommentsInCodeCompletion
1900    = IncludeBriefCommentsInCodeCompletion;
1901  AST->Invocation = CI;
1902  AST->UserFilesAreVolatile = UserFilesAreVolatile;
1903
1904  // Recover resources if we crash before exiting this method.
1905  llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1906    ASTUnitCleanup(AST.get());
1907  llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
1908    llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
1909    DiagCleanup(Diags.getPtr());
1910
1911  return AST->LoadFromCompilerInvocation(PrecompilePreamble)? 0 : AST.take();
1912}
1913
1914ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
1915                                      const char **ArgEnd,
1916                                    IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1917                                      StringRef ResourceFilesPath,
1918                                      bool OnlyLocalDecls,
1919                                      bool CaptureDiagnostics,
1920                                      RemappedFile *RemappedFiles,
1921                                      unsigned NumRemappedFiles,
1922                                      bool RemappedFilesKeepOriginalName,
1923                                      bool PrecompilePreamble,
1924                                      TranslationUnitKind TUKind,
1925                                      bool CacheCodeCompletionResults,
1926                                      bool IncludeBriefCommentsInCodeCompletion,
1927                                      bool AllowPCHWithCompilerErrors,
1928                                      bool SkipFunctionBodies,
1929                                      bool UserFilesAreVolatile,
1930                                      bool ForSerialization,
1931                                      OwningPtr<ASTUnit> *ErrAST) {
1932  if (!Diags.getPtr()) {
1933    // No diagnostics engine was provided, so create our own diagnostics object
1934    // with the default options.
1935    Diags = CompilerInstance::createDiagnostics(new DiagnosticOptions(),
1936                                                ArgEnd - ArgBegin,
1937                                                ArgBegin);
1938  }
1939
1940  SmallVector<StoredDiagnostic, 4> StoredDiagnostics;
1941
1942  IntrusiveRefCntPtr<CompilerInvocation> CI;
1943
1944  {
1945
1946    CaptureDroppedDiagnostics Capture(CaptureDiagnostics, *Diags,
1947                                      StoredDiagnostics);
1948
1949    CI = clang::createInvocationFromCommandLine(
1950                                           llvm::makeArrayRef(ArgBegin, ArgEnd),
1951                                           Diags);
1952    if (!CI)
1953      return 0;
1954  }
1955
1956  // Override any files that need remapping
1957  for (unsigned I = 0; I != NumRemappedFiles; ++I) {
1958    FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
1959    if (const llvm::MemoryBuffer *
1960            memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
1961      CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, memBuf);
1962    } else {
1963      const char *fname = fileOrBuf.get<const char *>();
1964      CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, fname);
1965    }
1966  }
1967  PreprocessorOptions &PPOpts = CI->getPreprocessorOpts();
1968  PPOpts.RemappedFilesKeepOriginalName = RemappedFilesKeepOriginalName;
1969  PPOpts.AllowPCHWithCompilerErrors = AllowPCHWithCompilerErrors;
1970
1971  // Override the resources path.
1972  CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
1973
1974  CI->getFrontendOpts().SkipFunctionBodies = SkipFunctionBodies;
1975
1976  // Create the AST unit.
1977  OwningPtr<ASTUnit> AST;
1978  AST.reset(new ASTUnit(false));
1979  ConfigureDiags(Diags, ArgBegin, ArgEnd, *AST, CaptureDiagnostics);
1980  AST->Diagnostics = Diags;
1981  Diags = 0; // Zero out now to ease cleanup during crash recovery.
1982  AST->FileSystemOpts = CI->getFileSystemOpts();
1983  AST->FileMgr = new FileManager(AST->FileSystemOpts);
1984  AST->OnlyLocalDecls = OnlyLocalDecls;
1985  AST->CaptureDiagnostics = CaptureDiagnostics;
1986  AST->TUKind = TUKind;
1987  AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1988  AST->IncludeBriefCommentsInCodeCompletion
1989    = IncludeBriefCommentsInCodeCompletion;
1990  AST->UserFilesAreVolatile = UserFilesAreVolatile;
1991  AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size();
1992  AST->StoredDiagnostics.swap(StoredDiagnostics);
1993  AST->Invocation = CI;
1994  if (ForSerialization)
1995    AST->WriterData.reset(new ASTWriterData());
1996  CI = 0; // Zero out now to ease cleanup during crash recovery.
1997
1998  // Recover resources if we crash before exiting this method.
1999  llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
2000    ASTUnitCleanup(AST.get());
2001
2002  if (AST->LoadFromCompilerInvocation(PrecompilePreamble)) {
2003    // Some error occurred, if caller wants to examine diagnostics, pass it the
2004    // ASTUnit.
2005    if (ErrAST) {
2006      AST->StoredDiagnostics.swap(AST->FailedParseDiagnostics);
2007      ErrAST->swap(AST);
2008    }
2009    return 0;
2010  }
2011
2012  return AST.take();
2013}
2014
2015bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
2016  if (!Invocation)
2017    return true;
2018
2019  clearFileLevelDecls();
2020
2021  SimpleTimer ParsingTimer(WantTiming);
2022  ParsingTimer.setOutput("Reparsing " + getMainFileName());
2023
2024  // Remap files.
2025  PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
2026  for (PreprocessorOptions::remapped_file_buffer_iterator
2027         R = PPOpts.remapped_file_buffer_begin(),
2028         REnd = PPOpts.remapped_file_buffer_end();
2029       R != REnd;
2030       ++R) {
2031    delete R->second;
2032  }
2033  Invocation->getPreprocessorOpts().clearRemappedFiles();
2034  for (unsigned I = 0; I != NumRemappedFiles; ++I) {
2035    FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
2036    if (const llvm::MemoryBuffer *
2037            memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
2038      Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first,
2039                                                        memBuf);
2040    } else {
2041      const char *fname = fileOrBuf.get<const char *>();
2042      Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first,
2043                                                        fname);
2044    }
2045  }
2046
2047  // If we have a preamble file lying around, or if we might try to
2048  // build a precompiled preamble, do so now.
2049  llvm::MemoryBuffer *OverrideMainBuffer = 0;
2050  if (!getPreambleFile(this).empty() || PreambleRebuildCounter > 0)
2051    OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation);
2052
2053  // Clear out the diagnostics state.
2054  getDiagnostics().Reset();
2055  ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
2056  if (OverrideMainBuffer)
2057    getDiagnostics().setNumWarnings(NumWarningsInPreamble);
2058
2059  // Parse the sources
2060  bool Result = Parse(OverrideMainBuffer);
2061
2062  // If we're caching global code-completion results, and the top-level
2063  // declarations have changed, clear out the code-completion cache.
2064  if (!Result && ShouldCacheCodeCompletionResults &&
2065      CurrentTopLevelHashValue != CompletionCacheTopLevelHashValue)
2066    CacheCodeCompletionResults();
2067
2068  // We now need to clear out the completion info related to this translation
2069  // unit; it'll be recreated if necessary.
2070  CCTUInfo.reset();
2071
2072  return Result;
2073}
2074
2075//----------------------------------------------------------------------------//
2076// Code completion
2077//----------------------------------------------------------------------------//
2078
2079namespace {
2080  /// \brief Code completion consumer that combines the cached code-completion
2081  /// results from an ASTUnit with the code-completion results provided to it,
2082  /// then passes the result on to
2083  class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer {
2084    uint64_t NormalContexts;
2085    ASTUnit &AST;
2086    CodeCompleteConsumer &Next;
2087
2088  public:
2089    AugmentedCodeCompleteConsumer(ASTUnit &AST, CodeCompleteConsumer &Next,
2090                                  const CodeCompleteOptions &CodeCompleteOpts)
2091      : CodeCompleteConsumer(CodeCompleteOpts, Next.isOutputBinary()),
2092        AST(AST), Next(Next)
2093    {
2094      // Compute the set of contexts in which we will look when we don't have
2095      // any information about the specific context.
2096      NormalContexts
2097        = (1LL << CodeCompletionContext::CCC_TopLevel)
2098        | (1LL << CodeCompletionContext::CCC_ObjCInterface)
2099        | (1LL << CodeCompletionContext::CCC_ObjCImplementation)
2100        | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
2101        | (1LL << CodeCompletionContext::CCC_Statement)
2102        | (1LL << CodeCompletionContext::CCC_Expression)
2103        | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
2104        | (1LL << CodeCompletionContext::CCC_DotMemberAccess)
2105        | (1LL << CodeCompletionContext::CCC_ArrowMemberAccess)
2106        | (1LL << CodeCompletionContext::CCC_ObjCPropertyAccess)
2107        | (1LL << CodeCompletionContext::CCC_ObjCProtocolName)
2108        | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
2109        | (1LL << CodeCompletionContext::CCC_Recovery);
2110
2111      if (AST.getASTContext().getLangOpts().CPlusPlus)
2112        NormalContexts |= (1LL << CodeCompletionContext::CCC_EnumTag)
2113                       |  (1LL << CodeCompletionContext::CCC_UnionTag)
2114                       |  (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
2115    }
2116
2117    virtual void ProcessCodeCompleteResults(Sema &S,
2118                                            CodeCompletionContext Context,
2119                                            CodeCompletionResult *Results,
2120                                            unsigned NumResults);
2121
2122    virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
2123                                           OverloadCandidate *Candidates,
2124                                           unsigned NumCandidates) {
2125      Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates);
2126    }
2127
2128    virtual CodeCompletionAllocator &getAllocator() {
2129      return Next.getAllocator();
2130    }
2131
2132    virtual CodeCompletionTUInfo &getCodeCompletionTUInfo() {
2133      return Next.getCodeCompletionTUInfo();
2134    }
2135  };
2136}
2137
2138/// \brief Helper function that computes which global names are hidden by the
2139/// local code-completion results.
2140static void CalculateHiddenNames(const CodeCompletionContext &Context,
2141                                 CodeCompletionResult *Results,
2142                                 unsigned NumResults,
2143                                 ASTContext &Ctx,
2144                          llvm::StringSet<llvm::BumpPtrAllocator> &HiddenNames){
2145  bool OnlyTagNames = false;
2146  switch (Context.getKind()) {
2147  case CodeCompletionContext::CCC_Recovery:
2148  case CodeCompletionContext::CCC_TopLevel:
2149  case CodeCompletionContext::CCC_ObjCInterface:
2150  case CodeCompletionContext::CCC_ObjCImplementation:
2151  case CodeCompletionContext::CCC_ObjCIvarList:
2152  case CodeCompletionContext::CCC_ClassStructUnion:
2153  case CodeCompletionContext::CCC_Statement:
2154  case CodeCompletionContext::CCC_Expression:
2155  case CodeCompletionContext::CCC_ObjCMessageReceiver:
2156  case CodeCompletionContext::CCC_DotMemberAccess:
2157  case CodeCompletionContext::CCC_ArrowMemberAccess:
2158  case CodeCompletionContext::CCC_ObjCPropertyAccess:
2159  case CodeCompletionContext::CCC_Namespace:
2160  case CodeCompletionContext::CCC_Type:
2161  case CodeCompletionContext::CCC_Name:
2162  case CodeCompletionContext::CCC_PotentiallyQualifiedName:
2163  case CodeCompletionContext::CCC_ParenthesizedExpression:
2164  case CodeCompletionContext::CCC_ObjCInterfaceName:
2165    break;
2166
2167  case CodeCompletionContext::CCC_EnumTag:
2168  case CodeCompletionContext::CCC_UnionTag:
2169  case CodeCompletionContext::CCC_ClassOrStructTag:
2170    OnlyTagNames = true;
2171    break;
2172
2173  case CodeCompletionContext::CCC_ObjCProtocolName:
2174  case CodeCompletionContext::CCC_MacroName:
2175  case CodeCompletionContext::CCC_MacroNameUse:
2176  case CodeCompletionContext::CCC_PreprocessorExpression:
2177  case CodeCompletionContext::CCC_PreprocessorDirective:
2178  case CodeCompletionContext::CCC_NaturalLanguage:
2179  case CodeCompletionContext::CCC_SelectorName:
2180  case CodeCompletionContext::CCC_TypeQualifiers:
2181  case CodeCompletionContext::CCC_Other:
2182  case CodeCompletionContext::CCC_OtherWithMacros:
2183  case CodeCompletionContext::CCC_ObjCInstanceMessage:
2184  case CodeCompletionContext::CCC_ObjCClassMessage:
2185  case CodeCompletionContext::CCC_ObjCCategoryName:
2186    // We're looking for nothing, or we're looking for names that cannot
2187    // be hidden.
2188    return;
2189  }
2190
2191  typedef CodeCompletionResult Result;
2192  for (unsigned I = 0; I != NumResults; ++I) {
2193    if (Results[I].Kind != Result::RK_Declaration)
2194      continue;
2195
2196    unsigned IDNS
2197      = Results[I].Declaration->getUnderlyingDecl()->getIdentifierNamespace();
2198
2199    bool Hiding = false;
2200    if (OnlyTagNames)
2201      Hiding = (IDNS & Decl::IDNS_Tag);
2202    else {
2203      unsigned HiddenIDNS = (Decl::IDNS_Type | Decl::IDNS_Member |
2204                             Decl::IDNS_Namespace | Decl::IDNS_Ordinary |
2205                             Decl::IDNS_NonMemberOperator);
2206      if (Ctx.getLangOpts().CPlusPlus)
2207        HiddenIDNS |= Decl::IDNS_Tag;
2208      Hiding = (IDNS & HiddenIDNS);
2209    }
2210
2211    if (!Hiding)
2212      continue;
2213
2214    DeclarationName Name = Results[I].Declaration->getDeclName();
2215    if (IdentifierInfo *Identifier = Name.getAsIdentifierInfo())
2216      HiddenNames.insert(Identifier->getName());
2217    else
2218      HiddenNames.insert(Name.getAsString());
2219  }
2220}
2221
2222
2223void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &S,
2224                                            CodeCompletionContext Context,
2225                                            CodeCompletionResult *Results,
2226                                            unsigned NumResults) {
2227  // Merge the results we were given with the results we cached.
2228  bool AddedResult = false;
2229  uint64_t InContexts =
2230      Context.getKind() == CodeCompletionContext::CCC_Recovery
2231        ? NormalContexts : (1LL << Context.getKind());
2232  // Contains the set of names that are hidden by "local" completion results.
2233  llvm::StringSet<llvm::BumpPtrAllocator> HiddenNames;
2234  typedef CodeCompletionResult Result;
2235  SmallVector<Result, 8> AllResults;
2236  for (ASTUnit::cached_completion_iterator
2237            C = AST.cached_completion_begin(),
2238         CEnd = AST.cached_completion_end();
2239       C != CEnd; ++C) {
2240    // If the context we are in matches any of the contexts we are
2241    // interested in, we'll add this result.
2242    if ((C->ShowInContexts & InContexts) == 0)
2243      continue;
2244
2245    // If we haven't added any results previously, do so now.
2246    if (!AddedResult) {
2247      CalculateHiddenNames(Context, Results, NumResults, S.Context,
2248                           HiddenNames);
2249      AllResults.insert(AllResults.end(), Results, Results + NumResults);
2250      AddedResult = true;
2251    }
2252
2253    // Determine whether this global completion result is hidden by a local
2254    // completion result. If so, skip it.
2255    if (C->Kind != CXCursor_MacroDefinition &&
2256        HiddenNames.count(C->Completion->getTypedText()))
2257      continue;
2258
2259    // Adjust priority based on similar type classes.
2260    unsigned Priority = C->Priority;
2261    CodeCompletionString *Completion = C->Completion;
2262    if (!Context.getPreferredType().isNull()) {
2263      if (C->Kind == CXCursor_MacroDefinition) {
2264        Priority = getMacroUsagePriority(C->Completion->getTypedText(),
2265                                         S.getLangOpts(),
2266                               Context.getPreferredType()->isAnyPointerType());
2267      } else if (C->Type) {
2268        CanQualType Expected
2269          = S.Context.getCanonicalType(
2270                               Context.getPreferredType().getUnqualifiedType());
2271        SimplifiedTypeClass ExpectedSTC = getSimplifiedTypeClass(Expected);
2272        if (ExpectedSTC == C->TypeClass) {
2273          // We know this type is similar; check for an exact match.
2274          llvm::StringMap<unsigned> &CachedCompletionTypes
2275            = AST.getCachedCompletionTypes();
2276          llvm::StringMap<unsigned>::iterator Pos
2277            = CachedCompletionTypes.find(QualType(Expected).getAsString());
2278          if (Pos != CachedCompletionTypes.end() && Pos->second == C->Type)
2279            Priority /= CCF_ExactTypeMatch;
2280          else
2281            Priority /= CCF_SimilarTypeMatch;
2282        }
2283      }
2284    }
2285
2286    // Adjust the completion string, if required.
2287    if (C->Kind == CXCursor_MacroDefinition &&
2288        Context.getKind() == CodeCompletionContext::CCC_MacroNameUse) {
2289      // Create a new code-completion string that just contains the
2290      // macro name, without its arguments.
2291      CodeCompletionBuilder Builder(getAllocator(), getCodeCompletionTUInfo(),
2292                                    CCP_CodePattern, C->Availability);
2293      Builder.AddTypedTextChunk(C->Completion->getTypedText());
2294      Priority = CCP_CodePattern;
2295      Completion = Builder.TakeString();
2296    }
2297
2298    AllResults.push_back(Result(Completion, Priority, C->Kind,
2299                                C->Availability));
2300  }
2301
2302  // If we did not add any cached completion results, just forward the
2303  // results we were given to the next consumer.
2304  if (!AddedResult) {
2305    Next.ProcessCodeCompleteResults(S, Context, Results, NumResults);
2306    return;
2307  }
2308
2309  Next.ProcessCodeCompleteResults(S, Context, AllResults.data(),
2310                                  AllResults.size());
2311}
2312
2313
2314
2315void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
2316                           RemappedFile *RemappedFiles,
2317                           unsigned NumRemappedFiles,
2318                           bool IncludeMacros,
2319                           bool IncludeCodePatterns,
2320                           bool IncludeBriefComments,
2321                           CodeCompleteConsumer &Consumer,
2322                           DiagnosticsEngine &Diag, LangOptions &LangOpts,
2323                           SourceManager &SourceMgr, FileManager &FileMgr,
2324                   SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics,
2325             SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers) {
2326  if (!Invocation)
2327    return;
2328
2329  SimpleTimer CompletionTimer(WantTiming);
2330  CompletionTimer.setOutput("Code completion @ " + File + ":" +
2331                            Twine(Line) + ":" + Twine(Column));
2332
2333  IntrusiveRefCntPtr<CompilerInvocation>
2334    CCInvocation(new CompilerInvocation(*Invocation));
2335
2336  FrontendOptions &FrontendOpts = CCInvocation->getFrontendOpts();
2337  CodeCompleteOptions &CodeCompleteOpts = FrontendOpts.CodeCompleteOpts;
2338  PreprocessorOptions &PreprocessorOpts = CCInvocation->getPreprocessorOpts();
2339
2340  CodeCompleteOpts.IncludeMacros = IncludeMacros &&
2341                                   CachedCompletionResults.empty();
2342  CodeCompleteOpts.IncludeCodePatterns = IncludeCodePatterns;
2343  CodeCompleteOpts.IncludeGlobals = CachedCompletionResults.empty();
2344  CodeCompleteOpts.IncludeBriefComments = IncludeBriefComments;
2345
2346  assert(IncludeBriefComments == this->IncludeBriefCommentsInCodeCompletion);
2347
2348  FrontendOpts.CodeCompletionAt.FileName = File;
2349  FrontendOpts.CodeCompletionAt.Line = Line;
2350  FrontendOpts.CodeCompletionAt.Column = Column;
2351
2352  // Set the language options appropriately.
2353  LangOpts = *CCInvocation->getLangOpts();
2354
2355  OwningPtr<CompilerInstance> Clang(new CompilerInstance());
2356
2357  // Recover resources if we crash before exiting this method.
2358  llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
2359    CICleanup(Clang.get());
2360
2361  Clang->setInvocation(&*CCInvocation);
2362  OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
2363
2364  // Set up diagnostics, capturing any diagnostics produced.
2365  Clang->setDiagnostics(&Diag);
2366  ProcessWarningOptions(Diag, CCInvocation->getDiagnosticOpts());
2367  CaptureDroppedDiagnostics Capture(true,
2368                                    Clang->getDiagnostics(),
2369                                    StoredDiagnostics);
2370
2371  // Create the target instance.
2372  Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
2373                                                &Clang->getTargetOpts()));
2374  if (!Clang->hasTarget()) {
2375    Clang->setInvocation(0);
2376    return;
2377  }
2378
2379  // Inform the target of the language options.
2380  //
2381  // FIXME: We shouldn't need to do this, the target should be immutable once
2382  // created. This complexity should be lifted elsewhere.
2383  Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
2384
2385  assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
2386         "Invocation must have exactly one source file!");
2387  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
2388         "FIXME: AST inputs not yet supported here!");
2389  assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
2390         "IR inputs not support here!");
2391
2392
2393  // Use the source and file managers that we were given.
2394  Clang->setFileManager(&FileMgr);
2395  Clang->setSourceManager(&SourceMgr);
2396
2397  // Remap files.
2398  PreprocessorOpts.clearRemappedFiles();
2399  PreprocessorOpts.RetainRemappedFileBuffers = true;
2400  for (unsigned I = 0; I != NumRemappedFiles; ++I) {
2401    FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
2402    if (const llvm::MemoryBuffer *
2403            memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
2404      PreprocessorOpts.addRemappedFile(RemappedFiles[I].first, memBuf);
2405      OwnedBuffers.push_back(memBuf);
2406    } else {
2407      const char *fname = fileOrBuf.get<const char *>();
2408      PreprocessorOpts.addRemappedFile(RemappedFiles[I].first, fname);
2409    }
2410  }
2411
2412  // Use the code completion consumer we were given, but adding any cached
2413  // code-completion results.
2414  AugmentedCodeCompleteConsumer *AugmentedConsumer
2415    = new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts);
2416  Clang->setCodeCompletionConsumer(AugmentedConsumer);
2417
2418  // If we have a precompiled preamble, try to use it. We only allow
2419  // the use of the precompiled preamble if we're if the completion
2420  // point is within the main file, after the end of the precompiled
2421  // preamble.
2422  llvm::MemoryBuffer *OverrideMainBuffer = 0;
2423  if (!getPreambleFile(this).empty()) {
2424    using llvm::sys::FileStatus;
2425    llvm::sys::PathWithStatus CompleteFilePath(File);
2426    llvm::sys::PathWithStatus MainPath(OriginalSourceFile);
2427    if (const FileStatus *CompleteFileStatus = CompleteFilePath.getFileStatus())
2428      if (const FileStatus *MainStatus = MainPath.getFileStatus())
2429        if (CompleteFileStatus->getUniqueID() == MainStatus->getUniqueID() &&
2430            Line > 1)
2431          OverrideMainBuffer
2432            = getMainBufferWithPrecompiledPreamble(*CCInvocation, false,
2433                                                   Line - 1);
2434  }
2435
2436  // If the main file has been overridden due to the use of a preamble,
2437  // make that override happen and introduce the preamble.
2438  StoredDiagnostics.insert(StoredDiagnostics.end(),
2439                           stored_diag_begin(),
2440                           stored_diag_afterDriver_begin());
2441  if (OverrideMainBuffer) {
2442    PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer);
2443    PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size();
2444    PreprocessorOpts.PrecompiledPreambleBytes.second
2445                                                    = PreambleEndsAtStartOfLine;
2446    PreprocessorOpts.ImplicitPCHInclude = getPreambleFile(this);
2447    PreprocessorOpts.DisablePCHValidation = true;
2448
2449    OwnedBuffers.push_back(OverrideMainBuffer);
2450  } else {
2451    PreprocessorOpts.PrecompiledPreambleBytes.first = 0;
2452    PreprocessorOpts.PrecompiledPreambleBytes.second = false;
2453  }
2454
2455  // Disable the preprocessing record if modules are not enabled.
2456  if (!Clang->getLangOpts().Modules)
2457    PreprocessorOpts.DetailedRecord = false;
2458
2459  OwningPtr<SyntaxOnlyAction> Act;
2460  Act.reset(new SyntaxOnlyAction);
2461  if (Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
2462    if (OverrideMainBuffer) {
2463      std::string ModName = getPreambleFile(this);
2464      TranslateStoredDiagnostics(Clang->getModuleManager(), ModName,
2465                                 getSourceManager(), PreambleDiagnostics,
2466                                 StoredDiagnostics);
2467    }
2468    Act->Execute();
2469    Act->EndSourceFile();
2470  }
2471
2472  checkAndSanitizeDiags(StoredDiagnostics, getSourceManager());
2473}
2474
2475bool ASTUnit::Save(StringRef File) {
2476  // Write to a temporary file and later rename it to the actual file, to avoid
2477  // possible race conditions.
2478  SmallString<128> TempPath;
2479  TempPath = File;
2480  TempPath += "-%%%%%%%%";
2481  int fd;
2482  if (llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath,
2483                                 /*makeAbsolute=*/false))
2484    return true;
2485
2486  // FIXME: Can we somehow regenerate the stat cache here, or do we need to
2487  // unconditionally create a stat cache when we parse the file?
2488  llvm::raw_fd_ostream Out(fd, /*shouldClose=*/true);
2489
2490  serialize(Out);
2491  Out.close();
2492  if (Out.has_error()) {
2493    Out.clear_error();
2494    return true;
2495  }
2496
2497  if (llvm::sys::fs::rename(TempPath.str(), File)) {
2498    bool exists;
2499    llvm::sys::fs::remove(TempPath.str(), exists);
2500    return true;
2501  }
2502
2503  return false;
2504}
2505
2506static bool serializeUnit(ASTWriter &Writer,
2507                          SmallVectorImpl<char> &Buffer,
2508                          Sema &S,
2509                          bool hasErrors,
2510                          raw_ostream &OS) {
2511  Writer.WriteAST(S, std::string(), 0, "", hasErrors);
2512
2513  // Write the generated bitstream to "Out".
2514  if (!Buffer.empty())
2515    OS.write(Buffer.data(), Buffer.size());
2516
2517  return false;
2518}
2519
2520bool ASTUnit::serialize(raw_ostream &OS) {
2521  bool hasErrors = getDiagnostics().hasErrorOccurred();
2522
2523  if (WriterData)
2524    return serializeUnit(WriterData->Writer, WriterData->Buffer,
2525                         getSema(), hasErrors, OS);
2526
2527  SmallString<128> Buffer;
2528  llvm::BitstreamWriter Stream(Buffer);
2529  ASTWriter Writer(Stream);
2530  return serializeUnit(Writer, Buffer, getSema(), hasErrors, OS);
2531}
2532
2533typedef ContinuousRangeMap<unsigned, int, 2> SLocRemap;
2534
2535static void TranslateSLoc(SourceLocation &L, SLocRemap &Remap) {
2536  unsigned Raw = L.getRawEncoding();
2537  const unsigned MacroBit = 1U << 31;
2538  L = SourceLocation::getFromRawEncoding((Raw & MacroBit) |
2539      ((Raw & ~MacroBit) + Remap.find(Raw & ~MacroBit)->second));
2540}
2541
2542void ASTUnit::TranslateStoredDiagnostics(
2543                          ASTReader *MMan,
2544                          StringRef ModName,
2545                          SourceManager &SrcMgr,
2546                          const SmallVectorImpl<StoredDiagnostic> &Diags,
2547                          SmallVectorImpl<StoredDiagnostic> &Out) {
2548  // The stored diagnostic has the old source manager in it; update
2549  // the locations to refer into the new source manager. We also need to remap
2550  // all the locations to the new view. This includes the diag location, any
2551  // associated source ranges, and the source ranges of associated fix-its.
2552  // FIXME: There should be a cleaner way to do this.
2553
2554  SmallVector<StoredDiagnostic, 4> Result;
2555  Result.reserve(Diags.size());
2556  assert(MMan && "Don't have a module manager");
2557  serialization::ModuleFile *Mod = MMan->ModuleMgr.lookup(ModName);
2558  assert(Mod && "Don't have preamble module");
2559  SLocRemap &Remap = Mod->SLocRemap;
2560  for (unsigned I = 0, N = Diags.size(); I != N; ++I) {
2561    // Rebuild the StoredDiagnostic.
2562    const StoredDiagnostic &SD = Diags[I];
2563    SourceLocation L = SD.getLocation();
2564    TranslateSLoc(L, Remap);
2565    FullSourceLoc Loc(L, SrcMgr);
2566
2567    SmallVector<CharSourceRange, 4> Ranges;
2568    Ranges.reserve(SD.range_size());
2569    for (StoredDiagnostic::range_iterator I = SD.range_begin(),
2570                                          E = SD.range_end();
2571         I != E; ++I) {
2572      SourceLocation BL = I->getBegin();
2573      TranslateSLoc(BL, Remap);
2574      SourceLocation EL = I->getEnd();
2575      TranslateSLoc(EL, Remap);
2576      Ranges.push_back(CharSourceRange(SourceRange(BL, EL), I->isTokenRange()));
2577    }
2578
2579    SmallVector<FixItHint, 2> FixIts;
2580    FixIts.reserve(SD.fixit_size());
2581    for (StoredDiagnostic::fixit_iterator I = SD.fixit_begin(),
2582                                          E = SD.fixit_end();
2583         I != E; ++I) {
2584      FixIts.push_back(FixItHint());
2585      FixItHint &FH = FixIts.back();
2586      FH.CodeToInsert = I->CodeToInsert;
2587      SourceLocation BL = I->RemoveRange.getBegin();
2588      TranslateSLoc(BL, Remap);
2589      SourceLocation EL = I->RemoveRange.getEnd();
2590      TranslateSLoc(EL, Remap);
2591      FH.RemoveRange = CharSourceRange(SourceRange(BL, EL),
2592                                       I->RemoveRange.isTokenRange());
2593    }
2594
2595    Result.push_back(StoredDiagnostic(SD.getLevel(), SD.getID(),
2596                                      SD.getMessage(), Loc, Ranges, FixIts));
2597  }
2598  Result.swap(Out);
2599}
2600
2601static inline bool compLocDecl(std::pair<unsigned, Decl *> L,
2602                               std::pair<unsigned, Decl *> R) {
2603  return L.first < R.first;
2604}
2605
2606void ASTUnit::addFileLevelDecl(Decl *D) {
2607  assert(D);
2608
2609  // We only care about local declarations.
2610  if (D->isFromASTFile())
2611    return;
2612
2613  SourceManager &SM = *SourceMgr;
2614  SourceLocation Loc = D->getLocation();
2615  if (Loc.isInvalid() || !SM.isLocalSourceLocation(Loc))
2616    return;
2617
2618  // We only keep track of the file-level declarations of each file.
2619  if (!D->getLexicalDeclContext()->isFileContext())
2620    return;
2621
2622  SourceLocation FileLoc = SM.getFileLoc(Loc);
2623  assert(SM.isLocalSourceLocation(FileLoc));
2624  FileID FID;
2625  unsigned Offset;
2626  llvm::tie(FID, Offset) = SM.getDecomposedLoc(FileLoc);
2627  if (FID.isInvalid())
2628    return;
2629
2630  LocDeclsTy *&Decls = FileDecls[FID];
2631  if (!Decls)
2632    Decls = new LocDeclsTy();
2633
2634  std::pair<unsigned, Decl *> LocDecl(Offset, D);
2635
2636  if (Decls->empty() || Decls->back().first <= Offset) {
2637    Decls->push_back(LocDecl);
2638    return;
2639  }
2640
2641  LocDeclsTy::iterator
2642    I = std::upper_bound(Decls->begin(), Decls->end(), LocDecl, compLocDecl);
2643
2644  Decls->insert(I, LocDecl);
2645}
2646
2647void ASTUnit::findFileRegionDecls(FileID File, unsigned Offset, unsigned Length,
2648                                  SmallVectorImpl<Decl *> &Decls) {
2649  if (File.isInvalid())
2650    return;
2651
2652  if (SourceMgr->isLoadedFileID(File)) {
2653    assert(Ctx->getExternalSource() && "No external source!");
2654    return Ctx->getExternalSource()->FindFileRegionDecls(File, Offset, Length,
2655                                                         Decls);
2656  }
2657
2658  FileDeclsTy::iterator I = FileDecls.find(File);
2659  if (I == FileDecls.end())
2660    return;
2661
2662  LocDeclsTy &LocDecls = *I->second;
2663  if (LocDecls.empty())
2664    return;
2665
2666  LocDeclsTy::iterator
2667    BeginIt = std::lower_bound(LocDecls.begin(), LocDecls.end(),
2668                               std::make_pair(Offset, (Decl*)0), compLocDecl);
2669  if (BeginIt != LocDecls.begin())
2670    --BeginIt;
2671
2672  // If we are pointing at a top-level decl inside an objc container, we need
2673  // to backtrack until we find it otherwise we will fail to report that the
2674  // region overlaps with an objc container.
2675  while (BeginIt != LocDecls.begin() &&
2676         BeginIt->second->isTopLevelDeclInObjCContainer())
2677    --BeginIt;
2678
2679  LocDeclsTy::iterator
2680    EndIt = std::upper_bound(LocDecls.begin(), LocDecls.end(),
2681                             std::make_pair(Offset+Length, (Decl*)0),
2682                             compLocDecl);
2683  if (EndIt != LocDecls.end())
2684    ++EndIt;
2685
2686  for (LocDeclsTy::iterator DIt = BeginIt; DIt != EndIt; ++DIt)
2687    Decls.push_back(DIt->second);
2688}
2689
2690SourceLocation ASTUnit::getLocation(const FileEntry *File,
2691                                    unsigned Line, unsigned Col) const {
2692  const SourceManager &SM = getSourceManager();
2693  SourceLocation Loc = SM.translateFileLineCol(File, Line, Col);
2694  return SM.getMacroArgExpandedLocation(Loc);
2695}
2696
2697SourceLocation ASTUnit::getLocation(const FileEntry *File,
2698                                    unsigned Offset) const {
2699  const SourceManager &SM = getSourceManager();
2700  SourceLocation FileLoc = SM.translateFileLineCol(File, 1, 1);
2701  return SM.getMacroArgExpandedLocation(FileLoc.getLocWithOffset(Offset));
2702}
2703
2704/// \brief If \arg Loc is a loaded location from the preamble, returns
2705/// the corresponding local location of the main file, otherwise it returns
2706/// \arg Loc.
2707SourceLocation ASTUnit::mapLocationFromPreamble(SourceLocation Loc) {
2708  FileID PreambleID;
2709  if (SourceMgr)
2710    PreambleID = SourceMgr->getPreambleFileID();
2711
2712  if (Loc.isInvalid() || Preamble.empty() || PreambleID.isInvalid())
2713    return Loc;
2714
2715  unsigned Offs;
2716  if (SourceMgr->isInFileID(Loc, PreambleID, &Offs) && Offs < Preamble.size()) {
2717    SourceLocation FileLoc
2718        = SourceMgr->getLocForStartOfFile(SourceMgr->getMainFileID());
2719    return FileLoc.getLocWithOffset(Offs);
2720  }
2721
2722  return Loc;
2723}
2724
2725/// \brief If \arg Loc is a local location of the main file but inside the
2726/// preamble chunk, returns the corresponding loaded location from the
2727/// preamble, otherwise it returns \arg Loc.
2728SourceLocation ASTUnit::mapLocationToPreamble(SourceLocation Loc) {
2729  FileID PreambleID;
2730  if (SourceMgr)
2731    PreambleID = SourceMgr->getPreambleFileID();
2732
2733  if (Loc.isInvalid() || Preamble.empty() || PreambleID.isInvalid())
2734    return Loc;
2735
2736  unsigned Offs;
2737  if (SourceMgr->isInFileID(Loc, SourceMgr->getMainFileID(), &Offs) &&
2738      Offs < Preamble.size()) {
2739    SourceLocation FileLoc = SourceMgr->getLocForStartOfFile(PreambleID);
2740    return FileLoc.getLocWithOffset(Offs);
2741  }
2742
2743  return Loc;
2744}
2745
2746bool ASTUnit::isInPreambleFileID(SourceLocation Loc) {
2747  FileID FID;
2748  if (SourceMgr)
2749    FID = SourceMgr->getPreambleFileID();
2750
2751  if (Loc.isInvalid() || FID.isInvalid())
2752    return false;
2753
2754  return SourceMgr->isInFileID(Loc, FID);
2755}
2756
2757bool ASTUnit::isInMainFileID(SourceLocation Loc) {
2758  FileID FID;
2759  if (SourceMgr)
2760    FID = SourceMgr->getMainFileID();
2761
2762  if (Loc.isInvalid() || FID.isInvalid())
2763    return false;
2764
2765  return SourceMgr->isInFileID(Loc, FID);
2766}
2767
2768SourceLocation ASTUnit::getEndOfPreambleFileID() {
2769  FileID FID;
2770  if (SourceMgr)
2771    FID = SourceMgr->getPreambleFileID();
2772
2773  if (FID.isInvalid())
2774    return SourceLocation();
2775
2776  return SourceMgr->getLocForEndOfFile(FID);
2777}
2778
2779SourceLocation ASTUnit::getStartOfMainFileID() {
2780  FileID FID;
2781  if (SourceMgr)
2782    FID = SourceMgr->getMainFileID();
2783
2784  if (FID.isInvalid())
2785    return SourceLocation();
2786
2787  return SourceMgr->getLocForStartOfFile(FID);
2788}
2789
2790std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
2791ASTUnit::getLocalPreprocessingEntities() const {
2792  if (isMainFileAST()) {
2793    serialization::ModuleFile &
2794      Mod = Reader->getModuleManager().getPrimaryModule();
2795    return Reader->getModulePreprocessedEntities(Mod);
2796  }
2797
2798  if (PreprocessingRecord *PPRec = PP->getPreprocessingRecord())
2799    return std::make_pair(PPRec->local_begin(), PPRec->local_end());
2800
2801  return std::make_pair(PreprocessingRecord::iterator(),
2802                        PreprocessingRecord::iterator());
2803}
2804
2805bool ASTUnit::visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn) {
2806  if (isMainFileAST()) {
2807    serialization::ModuleFile &
2808      Mod = Reader->getModuleManager().getPrimaryModule();
2809    ASTReader::ModuleDeclIterator MDI, MDE;
2810    llvm::tie(MDI, MDE) = Reader->getModuleFileLevelDecls(Mod);
2811    for (; MDI != MDE; ++MDI) {
2812      if (!Fn(context, *MDI))
2813        return false;
2814    }
2815
2816    return true;
2817  }
2818
2819  for (ASTUnit::top_level_iterator TL = top_level_begin(),
2820                                TLEnd = top_level_end();
2821         TL != TLEnd; ++TL) {
2822    if (!Fn(context, *TL))
2823      return false;
2824  }
2825
2826  return true;
2827}
2828
2829namespace {
2830struct PCHLocatorInfo {
2831  serialization::ModuleFile *Mod;
2832  PCHLocatorInfo() : Mod(0) {}
2833};
2834}
2835
2836static bool PCHLocator(serialization::ModuleFile &M, void *UserData) {
2837  PCHLocatorInfo &Info = *static_cast<PCHLocatorInfo*>(UserData);
2838  switch (M.Kind) {
2839  case serialization::MK_Module:
2840    return true; // skip dependencies.
2841  case serialization::MK_PCH:
2842    Info.Mod = &M;
2843    return true; // found it.
2844  case serialization::MK_Preamble:
2845    return false; // look in dependencies.
2846  case serialization::MK_MainFile:
2847    return false; // look in dependencies.
2848  }
2849
2850  return true;
2851}
2852
2853const FileEntry *ASTUnit::getPCHFile() {
2854  if (!Reader)
2855    return 0;
2856
2857  PCHLocatorInfo Info;
2858  Reader->getModuleManager().visit(PCHLocator, &Info);
2859  if (Info.Mod)
2860    return Info.Mod->File;
2861
2862  return 0;
2863}
2864
2865bool ASTUnit::isModuleFile() {
2866  return isMainFileAST() && !ASTFileLangOpts.CurrentModule.empty();
2867}
2868
2869void ASTUnit::PreambleData::countLines() const {
2870  NumLines = 0;
2871  if (empty())
2872    return;
2873
2874  for (std::vector<char>::const_iterator
2875         I = Buffer.begin(), E = Buffer.end(); I != E; ++I) {
2876    if (*I == '\n')
2877      ++NumLines;
2878  }
2879  if (Buffer.back() != '\n')
2880    ++NumLines;
2881}
2882
2883#ifndef NDEBUG
2884ASTUnit::ConcurrencyState::ConcurrencyState() {
2885  Mutex = new llvm::sys::MutexImpl(/*recursive=*/true);
2886}
2887
2888ASTUnit::ConcurrencyState::~ConcurrencyState() {
2889  delete static_cast<llvm::sys::MutexImpl *>(Mutex);
2890}
2891
2892void ASTUnit::ConcurrencyState::start() {
2893  bool acquired = static_cast<llvm::sys::MutexImpl *>(Mutex)->tryacquire();
2894  assert(acquired && "Concurrent access to ASTUnit!");
2895}
2896
2897void ASTUnit::ConcurrencyState::finish() {
2898  static_cast<llvm::sys::MutexImpl *>(Mutex)->release();
2899}
2900
2901#else // NDEBUG
2902
2903ASTUnit::ConcurrencyState::ConcurrencyState() {}
2904ASTUnit::ConcurrencyState::~ConcurrencyState() {}
2905void ASTUnit::ConcurrencyState::start() {}
2906void ASTUnit::ConcurrencyState::finish() {}
2907
2908#endif
2909