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>
50 using namespace clang;
51 
52 using llvm::TimeRecord;
53 
54 namespace {
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 
101 static llvm::sys::SmartMutex<false> &getOnDiskMutex() {
102   static llvm::sys::SmartMutex<false> M(/* recursive = */ true);
103   return M;
104 }
105 
106 static void cleanupOnDiskMapAtExit();
107 
108 typedef llvm::DenseMap<const ASTUnit *, OnDiskData *> OnDiskDataMap;
109 static 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 
119 static 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 
130 static 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 
141 static void erasePreambleFile(const ASTUnit *AU) {
142   getOnDiskData(AU).CleanPreambleFile();
143 }
144 
145 static 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 
158 static void setPreambleFile(const ASTUnit *AU, StringRef preambleFile) {
159   getOnDiskData(AU).PreambleFile = preambleFile;
160 }
161 
162 static const std::string &getPreambleFile(const ASTUnit *AU) {
163   return getOnDiskData(AU).PreambleFile;
164 }
165 
166 void OnDiskData::CleanTemporaryFiles() {
167   for (unsigned I = 0, N = TemporaryFiles.size(); I != N; ++I)
168     TemporaryFiles[I].eraseFromDisk();
169   TemporaryFiles.clear();
170 }
171 
172 void OnDiskData::CleanPreambleFile() {
173   if (!PreambleFile.empty()) {
174     llvm::sys::Path(PreambleFile).eraseFromDisk();
175     PreambleFile.clear();
176   }
177 }
178 
179 void OnDiskData::Cleanup() {
180   CleanTemporaryFiles();
181   CleanPreambleFile();
182 }
183 
184 struct ASTUnit::ASTWriterData {
185   SmallString<128> Buffer;
186   llvm::BitstreamWriter Stream;
187   ASTWriter Writer;
188 
189   ASTWriterData() : Stream(Buffer), Writer(Stream) { }
190 };
191 
192 void 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 
199 void ASTUnit::CleanTemporaryFiles() {
200   getOnDiskData(this).CleanTemporaryFiles();
201 }
202 
203 void 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.
211 const unsigned DefaultPreambleRebuildInterval = 5;
212 
213 /// \brief Tracks the number of ASTUnit objects that are currently active.
214 ///
215 /// Used for debugging purposes only.
216 static llvm::sys::cas_flag ActiveASTUnitObjects;
217 
218 ASTUnit::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 
238 ASTUnit::~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 
269 void ASTUnit::setPreprocessor(Preprocessor *pp) { PP = pp; }
270 
271 /// \brief Determine the set of code-completion contexts in which this
272 /// declaration should be shown.
273 static 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.CPlusPlus11)
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 
345 void 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 
493 void ASTUnit::ClearCachedCompletionResults() {
494   CachedCompletionResults.clear();
495   CachedCompletionTypes.clear();
496   CachedCompletionAllocator = 0;
497 }
498 
499 namespace {
500 
501 /// \brief Gathers information from ASTReader that will be used to initialize
502 /// a Preprocessor.
503 class 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;
515 public:
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 
560 private:
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 
579 class StoredDiagnosticConsumer : public DiagnosticConsumer {
580   SmallVectorImpl<StoredDiagnostic> &StoredDiags;
581 
582 public:
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.
602 class CaptureDroppedDiagnostics {
603   DiagnosticsEngine &Diags;
604   StoredDiagnosticConsumer Client;
605   DiagnosticConsumer *PreviousClient;
606 
607 public:
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 
628 void 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 
636 ASTDeserializationListener *ASTUnit::getDeserializationListener() {
637   if (WriterData)
638     return &WriterData->Writer;
639   return 0;
640 }
641 
642 llvm::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.
649 void 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 
668 ASTUnit *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 
836 namespace {
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.
840 class MacroDefinitionTrackerPPCallbacks : public PPCallbacks {
841   unsigned &Hash;
842 
843 public:
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.
852 void 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 
874 class TopLevelDeclTrackerConsumer : public ASTConsumer {
875   ASTUnit &Unit;
876   unsigned &Hash;
877 
878 public:
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 
929 class TopLevelDeclTrackerAction : public ASTFrontendAction {
930 public:
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 
941 public:
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 
950 class PrecompilePreambleConsumer : public PCHGenerator {
951   ASTUnit &Unit;
952   unsigned &Hash;
953   std::vector<Decl *> TopLevelDecls;
954 
955 public:
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 
992 class PrecompilePreambleAction : public ASTFrontendAction {
993   ASTUnit &Unit;
994 
995 public:
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 
1024 static 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 
1036 static 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.
1057 bool 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 
1182 error:
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.
1199 static 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.
1235 std::pair<llvm::MemoryBuffer *, std::pair<unsigned, bool> >
1236 ASTUnit::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 
1308 static 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.
1342 llvm::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 
1664 void 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 
1679 void 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 
1691 StringRef ASTUnit::getMainFileName() const {
1692   if (Invocation && !Invocation->getFrontendOpts().Inputs.empty()) {
1693     const FrontendInputFile &Input = Invocation->getFrontendOpts().Inputs[0];
1694     if (Input.isFile())
1695       return Input.getFile();
1696     else
1697       return Input.getBuffer()->getBufferIdentifier();
1698   }
1699 
1700   if (SourceMgr) {
1701     if (const FileEntry *
1702           FE = SourceMgr->getFileEntryForID(SourceMgr->getMainFileID()))
1703       return FE->getName();
1704   }
1705 
1706   return StringRef();
1707 }
1708 
1709 ASTUnit *ASTUnit::create(CompilerInvocation *CI,
1710                          IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1711                          bool CaptureDiagnostics,
1712                          bool UserFilesAreVolatile) {
1713   OwningPtr<ASTUnit> AST;
1714   AST.reset(new ASTUnit(false));
1715   ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
1716   AST->Diagnostics = Diags;
1717   AST->Invocation = CI;
1718   AST->FileSystemOpts = CI->getFileSystemOpts();
1719   AST->FileMgr = new FileManager(AST->FileSystemOpts);
1720   AST->UserFilesAreVolatile = UserFilesAreVolatile;
1721   AST->SourceMgr = new SourceManager(AST->getDiagnostics(), *AST->FileMgr,
1722                                      UserFilesAreVolatile);
1723 
1724   return AST.take();
1725 }
1726 
1727 ASTUnit *ASTUnit::LoadFromCompilerInvocationAction(CompilerInvocation *CI,
1728                               IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1729                                              ASTFrontendAction *Action,
1730                                              ASTUnit *Unit,
1731                                              bool Persistent,
1732                                              StringRef ResourceFilesPath,
1733                                              bool OnlyLocalDecls,
1734                                              bool CaptureDiagnostics,
1735                                              bool PrecompilePreamble,
1736                                              bool CacheCodeCompletionResults,
1737                                     bool IncludeBriefCommentsInCodeCompletion,
1738                                              bool UserFilesAreVolatile,
1739                                              OwningPtr<ASTUnit> *ErrAST) {
1740   assert(CI && "A CompilerInvocation is required");
1741 
1742   OwningPtr<ASTUnit> OwnAST;
1743   ASTUnit *AST = Unit;
1744   if (!AST) {
1745     // Create the AST unit.
1746     OwnAST.reset(create(CI, Diags, CaptureDiagnostics, UserFilesAreVolatile));
1747     AST = OwnAST.get();
1748   }
1749 
1750   if (!ResourceFilesPath.empty()) {
1751     // Override the resources path.
1752     CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
1753   }
1754   AST->OnlyLocalDecls = OnlyLocalDecls;
1755   AST->CaptureDiagnostics = CaptureDiagnostics;
1756   if (PrecompilePreamble)
1757     AST->PreambleRebuildCounter = 2;
1758   AST->TUKind = Action ? Action->getTranslationUnitKind() : TU_Complete;
1759   AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1760   AST->IncludeBriefCommentsInCodeCompletion
1761     = IncludeBriefCommentsInCodeCompletion;
1762 
1763   // Recover resources if we crash before exiting this method.
1764   llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1765     ASTUnitCleanup(OwnAST.get());
1766   llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
1767     llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
1768     DiagCleanup(Diags.getPtr());
1769 
1770   // We'll manage file buffers ourselves.
1771   CI->getPreprocessorOpts().RetainRemappedFileBuffers = true;
1772   CI->getFrontendOpts().DisableFree = false;
1773   ProcessWarningOptions(AST->getDiagnostics(), CI->getDiagnosticOpts());
1774 
1775   // Create the compiler instance to use for building the AST.
1776   OwningPtr<CompilerInstance> Clang(new CompilerInstance());
1777 
1778   // Recover resources if we crash before exiting this method.
1779   llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
1780     CICleanup(Clang.get());
1781 
1782   Clang->setInvocation(CI);
1783   AST->OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
1784 
1785   // Set up diagnostics, capturing any diagnostics that would
1786   // otherwise be dropped.
1787   Clang->setDiagnostics(&AST->getDiagnostics());
1788 
1789   // Create the target instance.
1790   Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
1791                                                 &Clang->getTargetOpts()));
1792   if (!Clang->hasTarget())
1793     return 0;
1794 
1795   // Inform the target of the language options.
1796   //
1797   // FIXME: We shouldn't need to do this, the target should be immutable once
1798   // created. This complexity should be lifted elsewhere.
1799   Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
1800 
1801   assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
1802          "Invocation must have exactly one source file!");
1803   assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
1804          "FIXME: AST inputs not yet supported here!");
1805   assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
1806          "IR inputs not supported here!");
1807 
1808   // Configure the various subsystems.
1809   AST->TheSema.reset();
1810   AST->Ctx = 0;
1811   AST->PP = 0;
1812   AST->Reader = 0;
1813 
1814   // Create a file manager object to provide access to and cache the filesystem.
1815   Clang->setFileManager(&AST->getFileManager());
1816 
1817   // Create the source manager.
1818   Clang->setSourceManager(&AST->getSourceManager());
1819 
1820   ASTFrontendAction *Act = Action;
1821 
1822   OwningPtr<TopLevelDeclTrackerAction> TrackerAct;
1823   if (!Act) {
1824     TrackerAct.reset(new TopLevelDeclTrackerAction(*AST));
1825     Act = TrackerAct.get();
1826   }
1827 
1828   // Recover resources if we crash before exiting this method.
1829   llvm::CrashRecoveryContextCleanupRegistrar<TopLevelDeclTrackerAction>
1830     ActCleanup(TrackerAct.get());
1831 
1832   if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
1833     AST->transferASTDataFromCompilerInstance(*Clang);
1834     if (OwnAST && ErrAST)
1835       ErrAST->swap(OwnAST);
1836 
1837     return 0;
1838   }
1839 
1840   if (Persistent && !TrackerAct) {
1841     Clang->getPreprocessor().addPPCallbacks(
1842      new MacroDefinitionTrackerPPCallbacks(AST->getCurrentTopLevelHashValue()));
1843     std::vector<ASTConsumer*> Consumers;
1844     if (Clang->hasASTConsumer())
1845       Consumers.push_back(Clang->takeASTConsumer());
1846     Consumers.push_back(new TopLevelDeclTrackerConsumer(*AST,
1847                                            AST->getCurrentTopLevelHashValue()));
1848     Clang->setASTConsumer(new MultiplexConsumer(Consumers));
1849   }
1850   if (!Act->Execute()) {
1851     AST->transferASTDataFromCompilerInstance(*Clang);
1852     if (OwnAST && ErrAST)
1853       ErrAST->swap(OwnAST);
1854 
1855     return 0;
1856   }
1857 
1858   // Steal the created target, context, and preprocessor.
1859   AST->transferASTDataFromCompilerInstance(*Clang);
1860 
1861   Act->EndSourceFile();
1862 
1863   if (OwnAST)
1864     return OwnAST.take();
1865   else
1866     return AST;
1867 }
1868 
1869 bool ASTUnit::LoadFromCompilerInvocation(bool PrecompilePreamble) {
1870   if (!Invocation)
1871     return true;
1872 
1873   // We'll manage file buffers ourselves.
1874   Invocation->getPreprocessorOpts().RetainRemappedFileBuffers = true;
1875   Invocation->getFrontendOpts().DisableFree = false;
1876   ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
1877 
1878   llvm::MemoryBuffer *OverrideMainBuffer = 0;
1879   if (PrecompilePreamble) {
1880     PreambleRebuildCounter = 2;
1881     OverrideMainBuffer
1882       = getMainBufferWithPrecompiledPreamble(*Invocation);
1883   }
1884 
1885   SimpleTimer ParsingTimer(WantTiming);
1886   ParsingTimer.setOutput("Parsing " + getMainFileName());
1887 
1888   // Recover resources if we crash before exiting this method.
1889   llvm::CrashRecoveryContextCleanupRegistrar<llvm::MemoryBuffer>
1890     MemBufferCleanup(OverrideMainBuffer);
1891 
1892   return Parse(OverrideMainBuffer);
1893 }
1894 
1895 ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
1896                               IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1897                                              bool OnlyLocalDecls,
1898                                              bool CaptureDiagnostics,
1899                                              bool PrecompilePreamble,
1900                                              TranslationUnitKind TUKind,
1901                                              bool CacheCodeCompletionResults,
1902                                     bool IncludeBriefCommentsInCodeCompletion,
1903                                              bool UserFilesAreVolatile) {
1904   // Create the AST unit.
1905   OwningPtr<ASTUnit> AST;
1906   AST.reset(new ASTUnit(false));
1907   ConfigureDiags(Diags, 0, 0, *AST, CaptureDiagnostics);
1908   AST->Diagnostics = Diags;
1909   AST->OnlyLocalDecls = OnlyLocalDecls;
1910   AST->CaptureDiagnostics = CaptureDiagnostics;
1911   AST->TUKind = TUKind;
1912   AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
1913   AST->IncludeBriefCommentsInCodeCompletion
1914     = IncludeBriefCommentsInCodeCompletion;
1915   AST->Invocation = CI;
1916   AST->UserFilesAreVolatile = UserFilesAreVolatile;
1917 
1918   // Recover resources if we crash before exiting this method.
1919   llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
1920     ASTUnitCleanup(AST.get());
1921   llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
1922     llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
1923     DiagCleanup(Diags.getPtr());
1924 
1925   return AST->LoadFromCompilerInvocation(PrecompilePreamble)? 0 : AST.take();
1926 }
1927 
1928 ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
1929                                       const char **ArgEnd,
1930                                     IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
1931                                       StringRef ResourceFilesPath,
1932                                       bool OnlyLocalDecls,
1933                                       bool CaptureDiagnostics,
1934                                       RemappedFile *RemappedFiles,
1935                                       unsigned NumRemappedFiles,
1936                                       bool RemappedFilesKeepOriginalName,
1937                                       bool PrecompilePreamble,
1938                                       TranslationUnitKind TUKind,
1939                                       bool CacheCodeCompletionResults,
1940                                       bool IncludeBriefCommentsInCodeCompletion,
1941                                       bool AllowPCHWithCompilerErrors,
1942                                       bool SkipFunctionBodies,
1943                                       bool UserFilesAreVolatile,
1944                                       bool ForSerialization,
1945                                       OwningPtr<ASTUnit> *ErrAST) {
1946   if (!Diags.getPtr()) {
1947     // No diagnostics engine was provided, so create our own diagnostics object
1948     // with the default options.
1949     Diags = CompilerInstance::createDiagnostics(new DiagnosticOptions(),
1950                                                 ArgEnd - ArgBegin,
1951                                                 ArgBegin);
1952   }
1953 
1954   SmallVector<StoredDiagnostic, 4> StoredDiagnostics;
1955 
1956   IntrusiveRefCntPtr<CompilerInvocation> CI;
1957 
1958   {
1959 
1960     CaptureDroppedDiagnostics Capture(CaptureDiagnostics, *Diags,
1961                                       StoredDiagnostics);
1962 
1963     CI = clang::createInvocationFromCommandLine(
1964                                            llvm::makeArrayRef(ArgBegin, ArgEnd),
1965                                            Diags);
1966     if (!CI)
1967       return 0;
1968   }
1969 
1970   // Override any files that need remapping
1971   for (unsigned I = 0; I != NumRemappedFiles; ++I) {
1972     FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
1973     if (const llvm::MemoryBuffer *
1974             memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
1975       CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, memBuf);
1976     } else {
1977       const char *fname = fileOrBuf.get<const char *>();
1978       CI->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first, fname);
1979     }
1980   }
1981   PreprocessorOptions &PPOpts = CI->getPreprocessorOpts();
1982   PPOpts.RemappedFilesKeepOriginalName = RemappedFilesKeepOriginalName;
1983   PPOpts.AllowPCHWithCompilerErrors = AllowPCHWithCompilerErrors;
1984 
1985   // Override the resources path.
1986   CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath;
1987 
1988   CI->getFrontendOpts().SkipFunctionBodies = SkipFunctionBodies;
1989 
1990   // Create the AST unit.
1991   OwningPtr<ASTUnit> AST;
1992   AST.reset(new ASTUnit(false));
1993   ConfigureDiags(Diags, ArgBegin, ArgEnd, *AST, CaptureDiagnostics);
1994   AST->Diagnostics = Diags;
1995   Diags = 0; // Zero out now to ease cleanup during crash recovery.
1996   AST->FileSystemOpts = CI->getFileSystemOpts();
1997   AST->FileMgr = new FileManager(AST->FileSystemOpts);
1998   AST->OnlyLocalDecls = OnlyLocalDecls;
1999   AST->CaptureDiagnostics = CaptureDiagnostics;
2000   AST->TUKind = TUKind;
2001   AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
2002   AST->IncludeBriefCommentsInCodeCompletion
2003     = IncludeBriefCommentsInCodeCompletion;
2004   AST->UserFilesAreVolatile = UserFilesAreVolatile;
2005   AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size();
2006   AST->StoredDiagnostics.swap(StoredDiagnostics);
2007   AST->Invocation = CI;
2008   if (ForSerialization)
2009     AST->WriterData.reset(new ASTWriterData());
2010   CI = 0; // Zero out now to ease cleanup during crash recovery.
2011 
2012   // Recover resources if we crash before exiting this method.
2013   llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit>
2014     ASTUnitCleanup(AST.get());
2015 
2016   if (AST->LoadFromCompilerInvocation(PrecompilePreamble)) {
2017     // Some error occurred, if caller wants to examine diagnostics, pass it the
2018     // ASTUnit.
2019     if (ErrAST) {
2020       AST->StoredDiagnostics.swap(AST->FailedParseDiagnostics);
2021       ErrAST->swap(AST);
2022     }
2023     return 0;
2024   }
2025 
2026   return AST.take();
2027 }
2028 
2029 bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
2030   if (!Invocation)
2031     return true;
2032 
2033   clearFileLevelDecls();
2034 
2035   SimpleTimer ParsingTimer(WantTiming);
2036   ParsingTimer.setOutput("Reparsing " + getMainFileName());
2037 
2038   // Remap files.
2039   PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts();
2040   for (PreprocessorOptions::remapped_file_buffer_iterator
2041          R = PPOpts.remapped_file_buffer_begin(),
2042          REnd = PPOpts.remapped_file_buffer_end();
2043        R != REnd;
2044        ++R) {
2045     delete R->second;
2046   }
2047   Invocation->getPreprocessorOpts().clearRemappedFiles();
2048   for (unsigned I = 0; I != NumRemappedFiles; ++I) {
2049     FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
2050     if (const llvm::MemoryBuffer *
2051             memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
2052       Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first,
2053                                                         memBuf);
2054     } else {
2055       const char *fname = fileOrBuf.get<const char *>();
2056       Invocation->getPreprocessorOpts().addRemappedFile(RemappedFiles[I].first,
2057                                                         fname);
2058     }
2059   }
2060 
2061   // If we have a preamble file lying around, or if we might try to
2062   // build a precompiled preamble, do so now.
2063   llvm::MemoryBuffer *OverrideMainBuffer = 0;
2064   if (!getPreambleFile(this).empty() || PreambleRebuildCounter > 0)
2065     OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation);
2066 
2067   // Clear out the diagnostics state.
2068   getDiagnostics().Reset();
2069   ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
2070   if (OverrideMainBuffer)
2071     getDiagnostics().setNumWarnings(NumWarningsInPreamble);
2072 
2073   // Parse the sources
2074   bool Result = Parse(OverrideMainBuffer);
2075 
2076   // If we're caching global code-completion results, and the top-level
2077   // declarations have changed, clear out the code-completion cache.
2078   if (!Result && ShouldCacheCodeCompletionResults &&
2079       CurrentTopLevelHashValue != CompletionCacheTopLevelHashValue)
2080     CacheCodeCompletionResults();
2081 
2082   // We now need to clear out the completion info related to this translation
2083   // unit; it'll be recreated if necessary.
2084   CCTUInfo.reset();
2085 
2086   return Result;
2087 }
2088 
2089 //----------------------------------------------------------------------------//
2090 // Code completion
2091 //----------------------------------------------------------------------------//
2092 
2093 namespace {
2094   /// \brief Code completion consumer that combines the cached code-completion
2095   /// results from an ASTUnit with the code-completion results provided to it,
2096   /// then passes the result on to
2097   class AugmentedCodeCompleteConsumer : public CodeCompleteConsumer {
2098     uint64_t NormalContexts;
2099     ASTUnit &AST;
2100     CodeCompleteConsumer &Next;
2101 
2102   public:
2103     AugmentedCodeCompleteConsumer(ASTUnit &AST, CodeCompleteConsumer &Next,
2104                                   const CodeCompleteOptions &CodeCompleteOpts)
2105       : CodeCompleteConsumer(CodeCompleteOpts, Next.isOutputBinary()),
2106         AST(AST), Next(Next)
2107     {
2108       // Compute the set of contexts in which we will look when we don't have
2109       // any information about the specific context.
2110       NormalContexts
2111         = (1LL << CodeCompletionContext::CCC_TopLevel)
2112         | (1LL << CodeCompletionContext::CCC_ObjCInterface)
2113         | (1LL << CodeCompletionContext::CCC_ObjCImplementation)
2114         | (1LL << CodeCompletionContext::CCC_ObjCIvarList)
2115         | (1LL << CodeCompletionContext::CCC_Statement)
2116         | (1LL << CodeCompletionContext::CCC_Expression)
2117         | (1LL << CodeCompletionContext::CCC_ObjCMessageReceiver)
2118         | (1LL << CodeCompletionContext::CCC_DotMemberAccess)
2119         | (1LL << CodeCompletionContext::CCC_ArrowMemberAccess)
2120         | (1LL << CodeCompletionContext::CCC_ObjCPropertyAccess)
2121         | (1LL << CodeCompletionContext::CCC_ObjCProtocolName)
2122         | (1LL << CodeCompletionContext::CCC_ParenthesizedExpression)
2123         | (1LL << CodeCompletionContext::CCC_Recovery);
2124 
2125       if (AST.getASTContext().getLangOpts().CPlusPlus)
2126         NormalContexts |= (1LL << CodeCompletionContext::CCC_EnumTag)
2127                        |  (1LL << CodeCompletionContext::CCC_UnionTag)
2128                        |  (1LL << CodeCompletionContext::CCC_ClassOrStructTag);
2129     }
2130 
2131     virtual void ProcessCodeCompleteResults(Sema &S,
2132                                             CodeCompletionContext Context,
2133                                             CodeCompletionResult *Results,
2134                                             unsigned NumResults);
2135 
2136     virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
2137                                            OverloadCandidate *Candidates,
2138                                            unsigned NumCandidates) {
2139       Next.ProcessOverloadCandidates(S, CurrentArg, Candidates, NumCandidates);
2140     }
2141 
2142     virtual CodeCompletionAllocator &getAllocator() {
2143       return Next.getAllocator();
2144     }
2145 
2146     virtual CodeCompletionTUInfo &getCodeCompletionTUInfo() {
2147       return Next.getCodeCompletionTUInfo();
2148     }
2149   };
2150 }
2151 
2152 /// \brief Helper function that computes which global names are hidden by the
2153 /// local code-completion results.
2154 static void CalculateHiddenNames(const CodeCompletionContext &Context,
2155                                  CodeCompletionResult *Results,
2156                                  unsigned NumResults,
2157                                  ASTContext &Ctx,
2158                           llvm::StringSet<llvm::BumpPtrAllocator> &HiddenNames){
2159   bool OnlyTagNames = false;
2160   switch (Context.getKind()) {
2161   case CodeCompletionContext::CCC_Recovery:
2162   case CodeCompletionContext::CCC_TopLevel:
2163   case CodeCompletionContext::CCC_ObjCInterface:
2164   case CodeCompletionContext::CCC_ObjCImplementation:
2165   case CodeCompletionContext::CCC_ObjCIvarList:
2166   case CodeCompletionContext::CCC_ClassStructUnion:
2167   case CodeCompletionContext::CCC_Statement:
2168   case CodeCompletionContext::CCC_Expression:
2169   case CodeCompletionContext::CCC_ObjCMessageReceiver:
2170   case CodeCompletionContext::CCC_DotMemberAccess:
2171   case CodeCompletionContext::CCC_ArrowMemberAccess:
2172   case CodeCompletionContext::CCC_ObjCPropertyAccess:
2173   case CodeCompletionContext::CCC_Namespace:
2174   case CodeCompletionContext::CCC_Type:
2175   case CodeCompletionContext::CCC_Name:
2176   case CodeCompletionContext::CCC_PotentiallyQualifiedName:
2177   case CodeCompletionContext::CCC_ParenthesizedExpression:
2178   case CodeCompletionContext::CCC_ObjCInterfaceName:
2179     break;
2180 
2181   case CodeCompletionContext::CCC_EnumTag:
2182   case CodeCompletionContext::CCC_UnionTag:
2183   case CodeCompletionContext::CCC_ClassOrStructTag:
2184     OnlyTagNames = true;
2185     break;
2186 
2187   case CodeCompletionContext::CCC_ObjCProtocolName:
2188   case CodeCompletionContext::CCC_MacroName:
2189   case CodeCompletionContext::CCC_MacroNameUse:
2190   case CodeCompletionContext::CCC_PreprocessorExpression:
2191   case CodeCompletionContext::CCC_PreprocessorDirective:
2192   case CodeCompletionContext::CCC_NaturalLanguage:
2193   case CodeCompletionContext::CCC_SelectorName:
2194   case CodeCompletionContext::CCC_TypeQualifiers:
2195   case CodeCompletionContext::CCC_Other:
2196   case CodeCompletionContext::CCC_OtherWithMacros:
2197   case CodeCompletionContext::CCC_ObjCInstanceMessage:
2198   case CodeCompletionContext::CCC_ObjCClassMessage:
2199   case CodeCompletionContext::CCC_ObjCCategoryName:
2200     // We're looking for nothing, or we're looking for names that cannot
2201     // be hidden.
2202     return;
2203   }
2204 
2205   typedef CodeCompletionResult Result;
2206   for (unsigned I = 0; I != NumResults; ++I) {
2207     if (Results[I].Kind != Result::RK_Declaration)
2208       continue;
2209 
2210     unsigned IDNS
2211       = Results[I].Declaration->getUnderlyingDecl()->getIdentifierNamespace();
2212 
2213     bool Hiding = false;
2214     if (OnlyTagNames)
2215       Hiding = (IDNS & Decl::IDNS_Tag);
2216     else {
2217       unsigned HiddenIDNS = (Decl::IDNS_Type | Decl::IDNS_Member |
2218                              Decl::IDNS_Namespace | Decl::IDNS_Ordinary |
2219                              Decl::IDNS_NonMemberOperator);
2220       if (Ctx.getLangOpts().CPlusPlus)
2221         HiddenIDNS |= Decl::IDNS_Tag;
2222       Hiding = (IDNS & HiddenIDNS);
2223     }
2224 
2225     if (!Hiding)
2226       continue;
2227 
2228     DeclarationName Name = Results[I].Declaration->getDeclName();
2229     if (IdentifierInfo *Identifier = Name.getAsIdentifierInfo())
2230       HiddenNames.insert(Identifier->getName());
2231     else
2232       HiddenNames.insert(Name.getAsString());
2233   }
2234 }
2235 
2236 
2237 void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &S,
2238                                             CodeCompletionContext Context,
2239                                             CodeCompletionResult *Results,
2240                                             unsigned NumResults) {
2241   // Merge the results we were given with the results we cached.
2242   bool AddedResult = false;
2243   uint64_t InContexts =
2244       Context.getKind() == CodeCompletionContext::CCC_Recovery
2245         ? NormalContexts : (1LL << Context.getKind());
2246   // Contains the set of names that are hidden by "local" completion results.
2247   llvm::StringSet<llvm::BumpPtrAllocator> HiddenNames;
2248   typedef CodeCompletionResult Result;
2249   SmallVector<Result, 8> AllResults;
2250   for (ASTUnit::cached_completion_iterator
2251             C = AST.cached_completion_begin(),
2252          CEnd = AST.cached_completion_end();
2253        C != CEnd; ++C) {
2254     // If the context we are in matches any of the contexts we are
2255     // interested in, we'll add this result.
2256     if ((C->ShowInContexts & InContexts) == 0)
2257       continue;
2258 
2259     // If we haven't added any results previously, do so now.
2260     if (!AddedResult) {
2261       CalculateHiddenNames(Context, Results, NumResults, S.Context,
2262                            HiddenNames);
2263       AllResults.insert(AllResults.end(), Results, Results + NumResults);
2264       AddedResult = true;
2265     }
2266 
2267     // Determine whether this global completion result is hidden by a local
2268     // completion result. If so, skip it.
2269     if (C->Kind != CXCursor_MacroDefinition &&
2270         HiddenNames.count(C->Completion->getTypedText()))
2271       continue;
2272 
2273     // Adjust priority based on similar type classes.
2274     unsigned Priority = C->Priority;
2275     CodeCompletionString *Completion = C->Completion;
2276     if (!Context.getPreferredType().isNull()) {
2277       if (C->Kind == CXCursor_MacroDefinition) {
2278         Priority = getMacroUsagePriority(C->Completion->getTypedText(),
2279                                          S.getLangOpts(),
2280                                Context.getPreferredType()->isAnyPointerType());
2281       } else if (C->Type) {
2282         CanQualType Expected
2283           = S.Context.getCanonicalType(
2284                                Context.getPreferredType().getUnqualifiedType());
2285         SimplifiedTypeClass ExpectedSTC = getSimplifiedTypeClass(Expected);
2286         if (ExpectedSTC == C->TypeClass) {
2287           // We know this type is similar; check for an exact match.
2288           llvm::StringMap<unsigned> &CachedCompletionTypes
2289             = AST.getCachedCompletionTypes();
2290           llvm::StringMap<unsigned>::iterator Pos
2291             = CachedCompletionTypes.find(QualType(Expected).getAsString());
2292           if (Pos != CachedCompletionTypes.end() && Pos->second == C->Type)
2293             Priority /= CCF_ExactTypeMatch;
2294           else
2295             Priority /= CCF_SimilarTypeMatch;
2296         }
2297       }
2298     }
2299 
2300     // Adjust the completion string, if required.
2301     if (C->Kind == CXCursor_MacroDefinition &&
2302         Context.getKind() == CodeCompletionContext::CCC_MacroNameUse) {
2303       // Create a new code-completion string that just contains the
2304       // macro name, without its arguments.
2305       CodeCompletionBuilder Builder(getAllocator(), getCodeCompletionTUInfo(),
2306                                     CCP_CodePattern, C->Availability);
2307       Builder.AddTypedTextChunk(C->Completion->getTypedText());
2308       Priority = CCP_CodePattern;
2309       Completion = Builder.TakeString();
2310     }
2311 
2312     AllResults.push_back(Result(Completion, Priority, C->Kind,
2313                                 C->Availability));
2314   }
2315 
2316   // If we did not add any cached completion results, just forward the
2317   // results we were given to the next consumer.
2318   if (!AddedResult) {
2319     Next.ProcessCodeCompleteResults(S, Context, Results, NumResults);
2320     return;
2321   }
2322 
2323   Next.ProcessCodeCompleteResults(S, Context, AllResults.data(),
2324                                   AllResults.size());
2325 }
2326 
2327 
2328 
2329 void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
2330                            RemappedFile *RemappedFiles,
2331                            unsigned NumRemappedFiles,
2332                            bool IncludeMacros,
2333                            bool IncludeCodePatterns,
2334                            bool IncludeBriefComments,
2335                            CodeCompleteConsumer &Consumer,
2336                            DiagnosticsEngine &Diag, LangOptions &LangOpts,
2337                            SourceManager &SourceMgr, FileManager &FileMgr,
2338                    SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics,
2339              SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers) {
2340   if (!Invocation)
2341     return;
2342 
2343   SimpleTimer CompletionTimer(WantTiming);
2344   CompletionTimer.setOutput("Code completion @ " + File + ":" +
2345                             Twine(Line) + ":" + Twine(Column));
2346 
2347   IntrusiveRefCntPtr<CompilerInvocation>
2348     CCInvocation(new CompilerInvocation(*Invocation));
2349 
2350   FrontendOptions &FrontendOpts = CCInvocation->getFrontendOpts();
2351   CodeCompleteOptions &CodeCompleteOpts = FrontendOpts.CodeCompleteOpts;
2352   PreprocessorOptions &PreprocessorOpts = CCInvocation->getPreprocessorOpts();
2353 
2354   CodeCompleteOpts.IncludeMacros = IncludeMacros &&
2355                                    CachedCompletionResults.empty();
2356   CodeCompleteOpts.IncludeCodePatterns = IncludeCodePatterns;
2357   CodeCompleteOpts.IncludeGlobals = CachedCompletionResults.empty();
2358   CodeCompleteOpts.IncludeBriefComments = IncludeBriefComments;
2359 
2360   assert(IncludeBriefComments == this->IncludeBriefCommentsInCodeCompletion);
2361 
2362   FrontendOpts.CodeCompletionAt.FileName = File;
2363   FrontendOpts.CodeCompletionAt.Line = Line;
2364   FrontendOpts.CodeCompletionAt.Column = Column;
2365 
2366   // Set the language options appropriately.
2367   LangOpts = *CCInvocation->getLangOpts();
2368 
2369   OwningPtr<CompilerInstance> Clang(new CompilerInstance());
2370 
2371   // Recover resources if we crash before exiting this method.
2372   llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance>
2373     CICleanup(Clang.get());
2374 
2375   Clang->setInvocation(&*CCInvocation);
2376   OriginalSourceFile = Clang->getFrontendOpts().Inputs[0].getFile();
2377 
2378   // Set up diagnostics, capturing any diagnostics produced.
2379   Clang->setDiagnostics(&Diag);
2380   ProcessWarningOptions(Diag, CCInvocation->getDiagnosticOpts());
2381   CaptureDroppedDiagnostics Capture(true,
2382                                     Clang->getDiagnostics(),
2383                                     StoredDiagnostics);
2384 
2385   // Create the target instance.
2386   Clang->setTarget(TargetInfo::CreateTargetInfo(Clang->getDiagnostics(),
2387                                                 &Clang->getTargetOpts()));
2388   if (!Clang->hasTarget()) {
2389     Clang->setInvocation(0);
2390     return;
2391   }
2392 
2393   // Inform the target of the language options.
2394   //
2395   // FIXME: We shouldn't need to do this, the target should be immutable once
2396   // created. This complexity should be lifted elsewhere.
2397   Clang->getTarget().setForcedLangOptions(Clang->getLangOpts());
2398 
2399   assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
2400          "Invocation must have exactly one source file!");
2401   assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_AST &&
2402          "FIXME: AST inputs not yet supported here!");
2403   assert(Clang->getFrontendOpts().Inputs[0].getKind() != IK_LLVM_IR &&
2404          "IR inputs not support here!");
2405 
2406 
2407   // Use the source and file managers that we were given.
2408   Clang->setFileManager(&FileMgr);
2409   Clang->setSourceManager(&SourceMgr);
2410 
2411   // Remap files.
2412   PreprocessorOpts.clearRemappedFiles();
2413   PreprocessorOpts.RetainRemappedFileBuffers = true;
2414   for (unsigned I = 0; I != NumRemappedFiles; ++I) {
2415     FilenameOrMemBuf fileOrBuf = RemappedFiles[I].second;
2416     if (const llvm::MemoryBuffer *
2417             memBuf = fileOrBuf.dyn_cast<const llvm::MemoryBuffer *>()) {
2418       PreprocessorOpts.addRemappedFile(RemappedFiles[I].first, memBuf);
2419       OwnedBuffers.push_back(memBuf);
2420     } else {
2421       const char *fname = fileOrBuf.get<const char *>();
2422       PreprocessorOpts.addRemappedFile(RemappedFiles[I].first, fname);
2423     }
2424   }
2425 
2426   // Use the code completion consumer we were given, but adding any cached
2427   // code-completion results.
2428   AugmentedCodeCompleteConsumer *AugmentedConsumer
2429     = new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts);
2430   Clang->setCodeCompletionConsumer(AugmentedConsumer);
2431 
2432   // If we have a precompiled preamble, try to use it. We only allow
2433   // the use of the precompiled preamble if we're if the completion
2434   // point is within the main file, after the end of the precompiled
2435   // preamble.
2436   llvm::MemoryBuffer *OverrideMainBuffer = 0;
2437   if (!getPreambleFile(this).empty()) {
2438     using llvm::sys::FileStatus;
2439     llvm::sys::PathWithStatus CompleteFilePath(File);
2440     llvm::sys::PathWithStatus MainPath(OriginalSourceFile);
2441     if (const FileStatus *CompleteFileStatus = CompleteFilePath.getFileStatus())
2442       if (const FileStatus *MainStatus = MainPath.getFileStatus())
2443         if (CompleteFileStatus->getUniqueID() == MainStatus->getUniqueID() &&
2444             Line > 1)
2445           OverrideMainBuffer
2446             = getMainBufferWithPrecompiledPreamble(*CCInvocation, false,
2447                                                    Line - 1);
2448   }
2449 
2450   // If the main file has been overridden due to the use of a preamble,
2451   // make that override happen and introduce the preamble.
2452   if (OverrideMainBuffer) {
2453     PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer);
2454     PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size();
2455     PreprocessorOpts.PrecompiledPreambleBytes.second
2456                                                     = PreambleEndsAtStartOfLine;
2457     PreprocessorOpts.ImplicitPCHInclude = getPreambleFile(this);
2458     PreprocessorOpts.DisablePCHValidation = true;
2459 
2460     OwnedBuffers.push_back(OverrideMainBuffer);
2461   } else {
2462     PreprocessorOpts.PrecompiledPreambleBytes.first = 0;
2463     PreprocessorOpts.PrecompiledPreambleBytes.second = false;
2464   }
2465 
2466   // Disable the preprocessing record if modules are not enabled.
2467   if (!Clang->getLangOpts().Modules)
2468     PreprocessorOpts.DetailedRecord = false;
2469 
2470   OwningPtr<SyntaxOnlyAction> Act;
2471   Act.reset(new SyntaxOnlyAction);
2472   if (Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) {
2473     Act->Execute();
2474     Act->EndSourceFile();
2475   }
2476 }
2477 
2478 bool ASTUnit::Save(StringRef File) {
2479   // Write to a temporary file and later rename it to the actual file, to avoid
2480   // possible race conditions.
2481   SmallString<128> TempPath;
2482   TempPath = File;
2483   TempPath += "-%%%%%%%%";
2484   int fd;
2485   if (llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath,
2486                                  /*makeAbsolute=*/false))
2487     return true;
2488 
2489   // FIXME: Can we somehow regenerate the stat cache here, or do we need to
2490   // unconditionally create a stat cache when we parse the file?
2491   llvm::raw_fd_ostream Out(fd, /*shouldClose=*/true);
2492 
2493   serialize(Out);
2494   Out.close();
2495   if (Out.has_error()) {
2496     Out.clear_error();
2497     return true;
2498   }
2499 
2500   if (llvm::sys::fs::rename(TempPath.str(), File)) {
2501     bool exists;
2502     llvm::sys::fs::remove(TempPath.str(), exists);
2503     return true;
2504   }
2505 
2506   return false;
2507 }
2508 
2509 static bool serializeUnit(ASTWriter &Writer,
2510                           SmallVectorImpl<char> &Buffer,
2511                           Sema &S,
2512                           bool hasErrors,
2513                           raw_ostream &OS) {
2514   Writer.WriteAST(S, std::string(), 0, "", hasErrors);
2515 
2516   // Write the generated bitstream to "Out".
2517   if (!Buffer.empty())
2518     OS.write(Buffer.data(), Buffer.size());
2519 
2520   return false;
2521 }
2522 
2523 bool ASTUnit::serialize(raw_ostream &OS) {
2524   bool hasErrors = getDiagnostics().hasErrorOccurred();
2525 
2526   if (WriterData)
2527     return serializeUnit(WriterData->Writer, WriterData->Buffer,
2528                          getSema(), hasErrors, OS);
2529 
2530   SmallString<128> Buffer;
2531   llvm::BitstreamWriter Stream(Buffer);
2532   ASTWriter Writer(Stream);
2533   return serializeUnit(Writer, Buffer, getSema(), hasErrors, OS);
2534 }
2535 
2536 typedef ContinuousRangeMap<unsigned, int, 2> SLocRemap;
2537 
2538 static void TranslateSLoc(SourceLocation &L, SLocRemap &Remap) {
2539   unsigned Raw = L.getRawEncoding();
2540   const unsigned MacroBit = 1U << 31;
2541   L = SourceLocation::getFromRawEncoding((Raw & MacroBit) |
2542       ((Raw & ~MacroBit) + Remap.find(Raw & ~MacroBit)->second));
2543 }
2544 
2545 void ASTUnit::TranslateStoredDiagnostics(
2546                           ASTReader *MMan,
2547                           StringRef ModName,
2548                           SourceManager &SrcMgr,
2549                           const SmallVectorImpl<StoredDiagnostic> &Diags,
2550                           SmallVectorImpl<StoredDiagnostic> &Out) {
2551   // The stored diagnostic has the old source manager in it; update
2552   // the locations to refer into the new source manager. We also need to remap
2553   // all the locations to the new view. This includes the diag location, any
2554   // associated source ranges, and the source ranges of associated fix-its.
2555   // FIXME: There should be a cleaner way to do this.
2556 
2557   SmallVector<StoredDiagnostic, 4> Result;
2558   Result.reserve(Diags.size());
2559   assert(MMan && "Don't have a module manager");
2560   serialization::ModuleFile *Mod = MMan->ModuleMgr.lookup(ModName);
2561   assert(Mod && "Don't have preamble module");
2562   SLocRemap &Remap = Mod->SLocRemap;
2563   for (unsigned I = 0, N = Diags.size(); I != N; ++I) {
2564     // Rebuild the StoredDiagnostic.
2565     const StoredDiagnostic &SD = Diags[I];
2566     SourceLocation L = SD.getLocation();
2567     TranslateSLoc(L, Remap);
2568     FullSourceLoc Loc(L, SrcMgr);
2569 
2570     SmallVector<CharSourceRange, 4> Ranges;
2571     Ranges.reserve(SD.range_size());
2572     for (StoredDiagnostic::range_iterator I = SD.range_begin(),
2573                                           E = SD.range_end();
2574          I != E; ++I) {
2575       SourceLocation BL = I->getBegin();
2576       TranslateSLoc(BL, Remap);
2577       SourceLocation EL = I->getEnd();
2578       TranslateSLoc(EL, Remap);
2579       Ranges.push_back(CharSourceRange(SourceRange(BL, EL), I->isTokenRange()));
2580     }
2581 
2582     SmallVector<FixItHint, 2> FixIts;
2583     FixIts.reserve(SD.fixit_size());
2584     for (StoredDiagnostic::fixit_iterator I = SD.fixit_begin(),
2585                                           E = SD.fixit_end();
2586          I != E; ++I) {
2587       FixIts.push_back(FixItHint());
2588       FixItHint &FH = FixIts.back();
2589       FH.CodeToInsert = I->CodeToInsert;
2590       SourceLocation BL = I->RemoveRange.getBegin();
2591       TranslateSLoc(BL, Remap);
2592       SourceLocation EL = I->RemoveRange.getEnd();
2593       TranslateSLoc(EL, Remap);
2594       FH.RemoveRange = CharSourceRange(SourceRange(BL, EL),
2595                                        I->RemoveRange.isTokenRange());
2596     }
2597 
2598     Result.push_back(StoredDiagnostic(SD.getLevel(), SD.getID(),
2599                                       SD.getMessage(), Loc, Ranges, FixIts));
2600   }
2601   Result.swap(Out);
2602 }
2603 
2604 static inline bool compLocDecl(std::pair<unsigned, Decl *> L,
2605                                std::pair<unsigned, Decl *> R) {
2606   return L.first < R.first;
2607 }
2608 
2609 void ASTUnit::addFileLevelDecl(Decl *D) {
2610   assert(D);
2611 
2612   // We only care about local declarations.
2613   if (D->isFromASTFile())
2614     return;
2615 
2616   SourceManager &SM = *SourceMgr;
2617   SourceLocation Loc = D->getLocation();
2618   if (Loc.isInvalid() || !SM.isLocalSourceLocation(Loc))
2619     return;
2620 
2621   // We only keep track of the file-level declarations of each file.
2622   if (!D->getLexicalDeclContext()->isFileContext())
2623     return;
2624 
2625   SourceLocation FileLoc = SM.getFileLoc(Loc);
2626   assert(SM.isLocalSourceLocation(FileLoc));
2627   FileID FID;
2628   unsigned Offset;
2629   llvm::tie(FID, Offset) = SM.getDecomposedLoc(FileLoc);
2630   if (FID.isInvalid())
2631     return;
2632 
2633   LocDeclsTy *&Decls = FileDecls[FID];
2634   if (!Decls)
2635     Decls = new LocDeclsTy();
2636 
2637   std::pair<unsigned, Decl *> LocDecl(Offset, D);
2638 
2639   if (Decls->empty() || Decls->back().first <= Offset) {
2640     Decls->push_back(LocDecl);
2641     return;
2642   }
2643 
2644   LocDeclsTy::iterator
2645     I = std::upper_bound(Decls->begin(), Decls->end(), LocDecl, compLocDecl);
2646 
2647   Decls->insert(I, LocDecl);
2648 }
2649 
2650 void ASTUnit::findFileRegionDecls(FileID File, unsigned Offset, unsigned Length,
2651                                   SmallVectorImpl<Decl *> &Decls) {
2652   if (File.isInvalid())
2653     return;
2654 
2655   if (SourceMgr->isLoadedFileID(File)) {
2656     assert(Ctx->getExternalSource() && "No external source!");
2657     return Ctx->getExternalSource()->FindFileRegionDecls(File, Offset, Length,
2658                                                          Decls);
2659   }
2660 
2661   FileDeclsTy::iterator I = FileDecls.find(File);
2662   if (I == FileDecls.end())
2663     return;
2664 
2665   LocDeclsTy &LocDecls = *I->second;
2666   if (LocDecls.empty())
2667     return;
2668 
2669   LocDeclsTy::iterator
2670     BeginIt = std::lower_bound(LocDecls.begin(), LocDecls.end(),
2671                                std::make_pair(Offset, (Decl*)0), compLocDecl);
2672   if (BeginIt != LocDecls.begin())
2673     --BeginIt;
2674 
2675   // If we are pointing at a top-level decl inside an objc container, we need
2676   // to backtrack until we find it otherwise we will fail to report that the
2677   // region overlaps with an objc container.
2678   while (BeginIt != LocDecls.begin() &&
2679          BeginIt->second->isTopLevelDeclInObjCContainer())
2680     --BeginIt;
2681 
2682   LocDeclsTy::iterator
2683     EndIt = std::upper_bound(LocDecls.begin(), LocDecls.end(),
2684                              std::make_pair(Offset+Length, (Decl*)0),
2685                              compLocDecl);
2686   if (EndIt != LocDecls.end())
2687     ++EndIt;
2688 
2689   for (LocDeclsTy::iterator DIt = BeginIt; DIt != EndIt; ++DIt)
2690     Decls.push_back(DIt->second);
2691 }
2692 
2693 SourceLocation ASTUnit::getLocation(const FileEntry *File,
2694                                     unsigned Line, unsigned Col) const {
2695   const SourceManager &SM = getSourceManager();
2696   SourceLocation Loc = SM.translateFileLineCol(File, Line, Col);
2697   return SM.getMacroArgExpandedLocation(Loc);
2698 }
2699 
2700 SourceLocation ASTUnit::getLocation(const FileEntry *File,
2701                                     unsigned Offset) const {
2702   const SourceManager &SM = getSourceManager();
2703   SourceLocation FileLoc = SM.translateFileLineCol(File, 1, 1);
2704   return SM.getMacroArgExpandedLocation(FileLoc.getLocWithOffset(Offset));
2705 }
2706 
2707 /// \brief If \arg Loc is a loaded location from the preamble, returns
2708 /// the corresponding local location of the main file, otherwise it returns
2709 /// \arg Loc.
2710 SourceLocation ASTUnit::mapLocationFromPreamble(SourceLocation Loc) {
2711   FileID PreambleID;
2712   if (SourceMgr)
2713     PreambleID = SourceMgr->getPreambleFileID();
2714 
2715   if (Loc.isInvalid() || Preamble.empty() || PreambleID.isInvalid())
2716     return Loc;
2717 
2718   unsigned Offs;
2719   if (SourceMgr->isInFileID(Loc, PreambleID, &Offs) && Offs < Preamble.size()) {
2720     SourceLocation FileLoc
2721         = SourceMgr->getLocForStartOfFile(SourceMgr->getMainFileID());
2722     return FileLoc.getLocWithOffset(Offs);
2723   }
2724 
2725   return Loc;
2726 }
2727 
2728 /// \brief If \arg Loc is a local location of the main file but inside the
2729 /// preamble chunk, returns the corresponding loaded location from the
2730 /// preamble, otherwise it returns \arg Loc.
2731 SourceLocation ASTUnit::mapLocationToPreamble(SourceLocation Loc) {
2732   FileID PreambleID;
2733   if (SourceMgr)
2734     PreambleID = SourceMgr->getPreambleFileID();
2735 
2736   if (Loc.isInvalid() || Preamble.empty() || PreambleID.isInvalid())
2737     return Loc;
2738 
2739   unsigned Offs;
2740   if (SourceMgr->isInFileID(Loc, SourceMgr->getMainFileID(), &Offs) &&
2741       Offs < Preamble.size()) {
2742     SourceLocation FileLoc = SourceMgr->getLocForStartOfFile(PreambleID);
2743     return FileLoc.getLocWithOffset(Offs);
2744   }
2745 
2746   return Loc;
2747 }
2748 
2749 bool ASTUnit::isInPreambleFileID(SourceLocation Loc) {
2750   FileID FID;
2751   if (SourceMgr)
2752     FID = SourceMgr->getPreambleFileID();
2753 
2754   if (Loc.isInvalid() || FID.isInvalid())
2755     return false;
2756 
2757   return SourceMgr->isInFileID(Loc, FID);
2758 }
2759 
2760 bool ASTUnit::isInMainFileID(SourceLocation Loc) {
2761   FileID FID;
2762   if (SourceMgr)
2763     FID = SourceMgr->getMainFileID();
2764 
2765   if (Loc.isInvalid() || FID.isInvalid())
2766     return false;
2767 
2768   return SourceMgr->isInFileID(Loc, FID);
2769 }
2770 
2771 SourceLocation ASTUnit::getEndOfPreambleFileID() {
2772   FileID FID;
2773   if (SourceMgr)
2774     FID = SourceMgr->getPreambleFileID();
2775 
2776   if (FID.isInvalid())
2777     return SourceLocation();
2778 
2779   return SourceMgr->getLocForEndOfFile(FID);
2780 }
2781 
2782 SourceLocation ASTUnit::getStartOfMainFileID() {
2783   FileID FID;
2784   if (SourceMgr)
2785     FID = SourceMgr->getMainFileID();
2786 
2787   if (FID.isInvalid())
2788     return SourceLocation();
2789 
2790   return SourceMgr->getLocForStartOfFile(FID);
2791 }
2792 
2793 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
2794 ASTUnit::getLocalPreprocessingEntities() const {
2795   if (isMainFileAST()) {
2796     serialization::ModuleFile &
2797       Mod = Reader->getModuleManager().getPrimaryModule();
2798     return Reader->getModulePreprocessedEntities(Mod);
2799   }
2800 
2801   if (PreprocessingRecord *PPRec = PP->getPreprocessingRecord())
2802     return std::make_pair(PPRec->local_begin(), PPRec->local_end());
2803 
2804   return std::make_pair(PreprocessingRecord::iterator(),
2805                         PreprocessingRecord::iterator());
2806 }
2807 
2808 bool ASTUnit::visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn) {
2809   if (isMainFileAST()) {
2810     serialization::ModuleFile &
2811       Mod = Reader->getModuleManager().getPrimaryModule();
2812     ASTReader::ModuleDeclIterator MDI, MDE;
2813     llvm::tie(MDI, MDE) = Reader->getModuleFileLevelDecls(Mod);
2814     for (; MDI != MDE; ++MDI) {
2815       if (!Fn(context, *MDI))
2816         return false;
2817     }
2818 
2819     return true;
2820   }
2821 
2822   for (ASTUnit::top_level_iterator TL = top_level_begin(),
2823                                 TLEnd = top_level_end();
2824          TL != TLEnd; ++TL) {
2825     if (!Fn(context, *TL))
2826       return false;
2827   }
2828 
2829   return true;
2830 }
2831 
2832 namespace {
2833 struct PCHLocatorInfo {
2834   serialization::ModuleFile *Mod;
2835   PCHLocatorInfo() : Mod(0) {}
2836 };
2837 }
2838 
2839 static bool PCHLocator(serialization::ModuleFile &M, void *UserData) {
2840   PCHLocatorInfo &Info = *static_cast<PCHLocatorInfo*>(UserData);
2841   switch (M.Kind) {
2842   case serialization::MK_Module:
2843     return true; // skip dependencies.
2844   case serialization::MK_PCH:
2845     Info.Mod = &M;
2846     return true; // found it.
2847   case serialization::MK_Preamble:
2848     return false; // look in dependencies.
2849   case serialization::MK_MainFile:
2850     return false; // look in dependencies.
2851   }
2852 
2853   return true;
2854 }
2855 
2856 const FileEntry *ASTUnit::getPCHFile() {
2857   if (!Reader)
2858     return 0;
2859 
2860   PCHLocatorInfo Info;
2861   Reader->getModuleManager().visit(PCHLocator, &Info);
2862   if (Info.Mod)
2863     return Info.Mod->File;
2864 
2865   return 0;
2866 }
2867 
2868 bool ASTUnit::isModuleFile() {
2869   return isMainFileAST() && !ASTFileLangOpts.CurrentModule.empty();
2870 }
2871 
2872 void ASTUnit::PreambleData::countLines() const {
2873   NumLines = 0;
2874   if (empty())
2875     return;
2876 
2877   for (std::vector<char>::const_iterator
2878          I = Buffer.begin(), E = Buffer.end(); I != E; ++I) {
2879     if (*I == '\n')
2880       ++NumLines;
2881   }
2882   if (Buffer.back() != '\n')
2883     ++NumLines;
2884 }
2885 
2886 #ifndef NDEBUG
2887 ASTUnit::ConcurrencyState::ConcurrencyState() {
2888   Mutex = new llvm::sys::MutexImpl(/*recursive=*/true);
2889 }
2890 
2891 ASTUnit::ConcurrencyState::~ConcurrencyState() {
2892   delete static_cast<llvm::sys::MutexImpl *>(Mutex);
2893 }
2894 
2895 void ASTUnit::ConcurrencyState::start() {
2896   bool acquired = static_cast<llvm::sys::MutexImpl *>(Mutex)->tryacquire();
2897   assert(acquired && "Concurrent access to ASTUnit!");
2898 }
2899 
2900 void ASTUnit::ConcurrencyState::finish() {
2901   static_cast<llvm::sys::MutexImpl *>(Mutex)->release();
2902 }
2903 
2904 #else // NDEBUG
2905 
2906 ASTUnit::ConcurrencyState::ConcurrencyState() {}
2907 ASTUnit::ConcurrencyState::~ConcurrencyState() {}
2908 void ASTUnit::ConcurrencyState::start() {}
2909 void ASTUnit::ConcurrencyState::finish() {}
2910 
2911 #endif
2912