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