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