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