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