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