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