CompilerInstance.cpp revision 29f2787b6da552018a7716f18f5bd8f67bd6edb5
1//===--- CompilerInstance.cpp ---------------------------------------------===// 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#include "clang/Frontend/CompilerInstance.h" 11#include "clang/Sema/Sema.h" 12#include "clang/AST/ASTConsumer.h" 13#include "clang/AST/ASTContext.h" 14#include "clang/AST/Decl.h" 15#include "clang/Basic/Diagnostic.h" 16#include "clang/Basic/FileManager.h" 17#include "clang/Basic/SourceManager.h" 18#include "clang/Basic/TargetInfo.h" 19#include "clang/Basic/Version.h" 20#include "clang/Lex/HeaderSearch.h" 21#include "clang/Lex/Preprocessor.h" 22#include "clang/Lex/PTHManager.h" 23#include "clang/Frontend/ChainedDiagnosticConsumer.h" 24#include "clang/Frontend/FrontendAction.h" 25#include "clang/Frontend/FrontendActions.h" 26#include "clang/Frontend/FrontendDiagnostic.h" 27#include "clang/Frontend/LogDiagnosticPrinter.h" 28#include "clang/Frontend/SerializedDiagnosticPrinter.h" 29#include "clang/Frontend/TextDiagnosticPrinter.h" 30#include "clang/Frontend/VerifyDiagnosticConsumer.h" 31#include "clang/Frontend/Utils.h" 32#include "clang/Serialization/ASTReader.h" 33#include "clang/Sema/CodeCompleteConsumer.h" 34#include "llvm/Support/FileSystem.h" 35#include "llvm/Support/MemoryBuffer.h" 36#include "llvm/Support/raw_ostream.h" 37#include "llvm/ADT/Statistic.h" 38#include "llvm/Support/Timer.h" 39#include "llvm/Support/Host.h" 40#include "llvm/Support/Path.h" 41#include "llvm/Support/Program.h" 42#include "llvm/Support/Signals.h" 43#include "llvm/Support/system_error.h" 44#include "llvm/Support/CrashRecoveryContext.h" 45#include "llvm/Config/config.h" 46 47// Support for FileLockManager 48#include <fstream> 49#include <sys/types.h> 50#include <sys/stat.h> 51 52#if LLVM_ON_WIN32 53#include <windows.h> 54#endif 55#if LLVM_ON_UNIX 56#include <unistd.h> 57#endif 58 59using namespace clang; 60 61CompilerInstance::CompilerInstance() 62 : Invocation(new CompilerInvocation()), ModuleManager(0) { 63} 64 65CompilerInstance::~CompilerInstance() { 66} 67 68void CompilerInstance::setInvocation(CompilerInvocation *Value) { 69 Invocation = Value; 70} 71 72void CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) { 73 Diagnostics = Value; 74} 75 76void CompilerInstance::setTarget(TargetInfo *Value) { 77 Target = Value; 78} 79 80void CompilerInstance::setFileManager(FileManager *Value) { 81 FileMgr = Value; 82} 83 84void CompilerInstance::setSourceManager(SourceManager *Value) { 85 SourceMgr = Value; 86} 87 88void CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; } 89 90void CompilerInstance::setASTContext(ASTContext *Value) { Context = Value; } 91 92void CompilerInstance::setSema(Sema *S) { 93 TheSema.reset(S); 94} 95 96void CompilerInstance::setASTConsumer(ASTConsumer *Value) { 97 Consumer.reset(Value); 98} 99 100void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) { 101 CompletionConsumer.reset(Value); 102} 103 104// Diagnostics 105static void SetUpBuildDumpLog(const DiagnosticOptions &DiagOpts, 106 unsigned argc, const char* const *argv, 107 DiagnosticsEngine &Diags) { 108 std::string ErrorInfo; 109 llvm::OwningPtr<raw_ostream> OS( 110 new llvm::raw_fd_ostream(DiagOpts.DumpBuildInformation.c_str(), ErrorInfo)); 111 if (!ErrorInfo.empty()) { 112 Diags.Report(diag::err_fe_unable_to_open_logfile) 113 << DiagOpts.DumpBuildInformation << ErrorInfo; 114 return; 115 } 116 117 (*OS) << "clang -cc1 command line arguments: "; 118 for (unsigned i = 0; i != argc; ++i) 119 (*OS) << argv[i] << ' '; 120 (*OS) << '\n'; 121 122 // Chain in a diagnostic client which will log the diagnostics. 123 DiagnosticConsumer *Logger = 124 new TextDiagnosticPrinter(*OS.take(), DiagOpts, /*OwnsOutputStream=*/true); 125 Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), Logger)); 126} 127 128static void SetUpDiagnosticLog(const DiagnosticOptions &DiagOpts, 129 const CodeGenOptions *CodeGenOpts, 130 DiagnosticsEngine &Diags) { 131 std::string ErrorInfo; 132 bool OwnsStream = false; 133 raw_ostream *OS = &llvm::errs(); 134 if (DiagOpts.DiagnosticLogFile != "-") { 135 // Create the output stream. 136 llvm::raw_fd_ostream *FileOS( 137 new llvm::raw_fd_ostream(DiagOpts.DiagnosticLogFile.c_str(), 138 ErrorInfo, llvm::raw_fd_ostream::F_Append)); 139 if (!ErrorInfo.empty()) { 140 Diags.Report(diag::warn_fe_cc_log_diagnostics_failure) 141 << DiagOpts.DumpBuildInformation << ErrorInfo; 142 } else { 143 FileOS->SetUnbuffered(); 144 FileOS->SetUseAtomicWrites(true); 145 OS = FileOS; 146 OwnsStream = true; 147 } 148 } 149 150 // Chain in the diagnostic client which will log the diagnostics. 151 LogDiagnosticPrinter *Logger = new LogDiagnosticPrinter(*OS, DiagOpts, 152 OwnsStream); 153 if (CodeGenOpts) 154 Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags); 155 Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), Logger)); 156} 157 158static void SetupSerializedDiagnostics(const DiagnosticOptions &DiagOpts, 159 DiagnosticsEngine &Diags, 160 StringRef OutputFile) { 161 std::string ErrorInfo; 162 llvm::OwningPtr<llvm::raw_fd_ostream> OS; 163 OS.reset(new llvm::raw_fd_ostream(OutputFile.str().c_str(), ErrorInfo, 164 llvm::raw_fd_ostream::F_Binary)); 165 166 if (!ErrorInfo.empty()) { 167 Diags.Report(diag::warn_fe_serialized_diag_failure) 168 << OutputFile << ErrorInfo; 169 return; 170 } 171 172 DiagnosticConsumer *SerializedConsumer = 173 clang::serialized_diags::create(OS.take()); 174 175 176 Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), 177 SerializedConsumer)); 178} 179 180void CompilerInstance::createDiagnostics(int Argc, const char* const *Argv, 181 DiagnosticConsumer *Client, 182 bool ShouldOwnClient, 183 bool ShouldCloneClient) { 184 Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv, Client, 185 ShouldOwnClient, ShouldCloneClient, 186 &getCodeGenOpts()); 187} 188 189llvm::IntrusiveRefCntPtr<DiagnosticsEngine> 190CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, 191 int Argc, const char* const *Argv, 192 DiagnosticConsumer *Client, 193 bool ShouldOwnClient, 194 bool ShouldCloneClient, 195 const CodeGenOptions *CodeGenOpts) { 196 llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 197 llvm::IntrusiveRefCntPtr<DiagnosticsEngine> 198 Diags(new DiagnosticsEngine(DiagID)); 199 200 // Create the diagnostic client for reporting errors or for 201 // implementing -verify. 202 if (Client) { 203 if (ShouldCloneClient) 204 Diags->setClient(Client->clone(*Diags), ShouldOwnClient); 205 else 206 Diags->setClient(Client, ShouldOwnClient); 207 } else 208 Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); 209 210 // Chain in -verify checker, if requested. 211 if (Opts.VerifyDiagnostics) 212 Diags->setClient(new VerifyDiagnosticConsumer(*Diags)); 213 214 // Chain in -diagnostic-log-file dumper, if requested. 215 if (!Opts.DiagnosticLogFile.empty()) 216 SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags); 217 218 if (!Opts.DumpBuildInformation.empty()) 219 SetUpBuildDumpLog(Opts, Argc, Argv, *Diags); 220 221 if (!Opts.DiagnosticSerializationFile.empty()) 222 SetupSerializedDiagnostics(Opts, *Diags, 223 Opts.DiagnosticSerializationFile); 224 225 // Configure our handling of diagnostics. 226 ProcessWarningOptions(*Diags, Opts); 227 228 return Diags; 229} 230 231// File Manager 232 233void CompilerInstance::createFileManager() { 234 FileMgr = new FileManager(getFileSystemOpts()); 235} 236 237// Source Manager 238 239void CompilerInstance::createSourceManager(FileManager &FileMgr) { 240 SourceMgr = new SourceManager(getDiagnostics(), FileMgr); 241} 242 243// Preprocessor 244 245void CompilerInstance::createPreprocessor() { 246 const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 247 248 // Create a PTH manager if we are using some form of a token cache. 249 PTHManager *PTHMgr = 0; 250 if (!PPOpts.TokenCache.empty()) 251 PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics()); 252 253 // Create the Preprocessor. 254 HeaderSearch *HeaderInfo = new HeaderSearch(getFileManager(), 255 getDiagnostics()); 256 PP = new Preprocessor(getDiagnostics(), getLangOpts(), &getTarget(), 257 getSourceManager(), *HeaderInfo, *this, PTHMgr, 258 /*OwnsHeaderSearch=*/true); 259 260 // Note that this is different then passing PTHMgr to Preprocessor's ctor. 261 // That argument is used as the IdentifierInfoLookup argument to 262 // IdentifierTable's ctor. 263 if (PTHMgr) { 264 PTHMgr->setPreprocessor(&*PP); 265 PP->setPTHManager(PTHMgr); 266 } 267 268 if (PPOpts.DetailedRecord) 269 PP->createPreprocessingRecord( 270 PPOpts.DetailedRecordIncludesNestedMacroExpansions); 271 272 InitializePreprocessor(*PP, PPOpts, getHeaderSearchOpts(), getFrontendOpts()); 273 274 // Set up the module path, including the hash for the 275 // module-creation options. 276 llvm::SmallString<256> SpecificModuleCache( 277 getHeaderSearchOpts().ModuleCachePath); 278 if (!getHeaderSearchOpts().DisableModuleHash) 279 llvm::sys::path::append(SpecificModuleCache, 280 getInvocation().getModuleHash()); 281 PP->getHeaderSearchInfo().configureModules(SpecificModuleCache, 282 getLangOpts().CurrentModule); 283 284 // Handle generating dependencies, if requested. 285 const DependencyOutputOptions &DepOpts = getDependencyOutputOpts(); 286 if (!DepOpts.OutputFile.empty()) 287 AttachDependencyFileGen(*PP, DepOpts); 288 289 // Handle generating header include information, if requested. 290 if (DepOpts.ShowHeaderIncludes) 291 AttachHeaderIncludeGen(*PP); 292 if (!DepOpts.HeaderIncludeOutputFile.empty()) { 293 StringRef OutputPath = DepOpts.HeaderIncludeOutputFile; 294 if (OutputPath == "-") 295 OutputPath = ""; 296 AttachHeaderIncludeGen(*PP, /*ShowAllHeaders=*/true, OutputPath, 297 /*ShowDepth=*/false); 298 } 299} 300 301// ASTContext 302 303void CompilerInstance::createASTContext() { 304 Preprocessor &PP = getPreprocessor(); 305 Context = new ASTContext(getLangOpts(), PP.getSourceManager(), 306 &getTarget(), PP.getIdentifierTable(), 307 PP.getSelectorTable(), PP.getBuiltinInfo(), 308 /*size_reserve=*/ 0); 309} 310 311// ExternalASTSource 312 313void CompilerInstance::createPCHExternalASTSource(StringRef Path, 314 bool DisablePCHValidation, 315 bool DisableStatCache, 316 void *DeserializationListener){ 317 llvm::OwningPtr<ExternalASTSource> Source; 318 bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; 319 Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 320 DisablePCHValidation, 321 DisableStatCache, 322 getPreprocessor(), getASTContext(), 323 DeserializationListener, 324 Preamble)); 325 ModuleManager = static_cast<ASTReader*>(Source.get()); 326 getASTContext().setExternalSource(Source); 327} 328 329ExternalASTSource * 330CompilerInstance::createPCHExternalASTSource(StringRef Path, 331 const std::string &Sysroot, 332 bool DisablePCHValidation, 333 bool DisableStatCache, 334 Preprocessor &PP, 335 ASTContext &Context, 336 void *DeserializationListener, 337 bool Preamble) { 338 llvm::OwningPtr<ASTReader> Reader; 339 Reader.reset(new ASTReader(PP, Context, 340 Sysroot.empty() ? "" : Sysroot.c_str(), 341 DisablePCHValidation, DisableStatCache)); 342 343 Reader->setDeserializationListener( 344 static_cast<ASTDeserializationListener *>(DeserializationListener)); 345 switch (Reader->ReadAST(Path, 346 Preamble ? serialization::MK_Preamble 347 : serialization::MK_PCH)) { 348 case ASTReader::Success: 349 // Set the predefines buffer as suggested by the PCH reader. Typically, the 350 // predefines buffer will be empty. 351 PP.setPredefines(Reader->getSuggestedPredefines()); 352 return Reader.take(); 353 354 case ASTReader::Failure: 355 // Unrecoverable failure: don't even try to process the input file. 356 break; 357 358 case ASTReader::IgnorePCH: 359 // No suitable PCH file could be found. Return an error. 360 break; 361 } 362 363 return 0; 364} 365 366// Code Completion 367 368static bool EnableCodeCompletion(Preprocessor &PP, 369 const std::string &Filename, 370 unsigned Line, 371 unsigned Column) { 372 // Tell the source manager to chop off the given file at a specific 373 // line and column. 374 const FileEntry *Entry = PP.getFileManager().getFile(Filename); 375 if (!Entry) { 376 PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 377 << Filename; 378 return true; 379 } 380 381 // Truncate the named file at the given line/column. 382 PP.SetCodeCompletionPoint(Entry, Line, Column); 383 return false; 384} 385 386void CompilerInstance::createCodeCompletionConsumer() { 387 const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 388 if (!CompletionConsumer) { 389 CompletionConsumer.reset( 390 createCodeCompletionConsumer(getPreprocessor(), 391 Loc.FileName, Loc.Line, Loc.Column, 392 getFrontendOpts().ShowMacrosInCodeCompletion, 393 getFrontendOpts().ShowCodePatternsInCodeCompletion, 394 getFrontendOpts().ShowGlobalSymbolsInCodeCompletion, 395 llvm::outs())); 396 if (!CompletionConsumer) 397 return; 398 } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, 399 Loc.Line, Loc.Column)) { 400 CompletionConsumer.reset(); 401 return; 402 } 403 404 if (CompletionConsumer->isOutputBinary() && 405 llvm::sys::Program::ChangeStdoutToBinary()) { 406 getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary); 407 CompletionConsumer.reset(); 408 } 409} 410 411void CompilerInstance::createFrontendTimer() { 412 FrontendTimer.reset(new llvm::Timer("Clang front-end timer")); 413} 414 415CodeCompleteConsumer * 416CompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 417 const std::string &Filename, 418 unsigned Line, 419 unsigned Column, 420 bool ShowMacros, 421 bool ShowCodePatterns, 422 bool ShowGlobals, 423 raw_ostream &OS) { 424 if (EnableCodeCompletion(PP, Filename, Line, Column)) 425 return 0; 426 427 // Set up the creation routine for code-completion. 428 return new PrintingCodeCompleteConsumer(ShowMacros, ShowCodePatterns, 429 ShowGlobals, OS); 430} 431 432void CompilerInstance::createSema(TranslationUnitKind TUKind, 433 CodeCompleteConsumer *CompletionConsumer) { 434 TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(), 435 TUKind, CompletionConsumer)); 436} 437 438// Output Files 439 440void CompilerInstance::addOutputFile(const OutputFile &OutFile) { 441 assert(OutFile.OS && "Attempt to add empty stream to output list!"); 442 OutputFiles.push_back(OutFile); 443} 444 445void CompilerInstance::clearOutputFiles(bool EraseFiles) { 446 for (std::list<OutputFile>::iterator 447 it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { 448 delete it->OS; 449 if (!it->TempFilename.empty()) { 450 if (EraseFiles) { 451 bool existed; 452 llvm::sys::fs::remove(it->TempFilename, existed); 453 } else { 454 llvm::SmallString<128> NewOutFile(it->Filename); 455 456 // If '-working-directory' was passed, the output filename should be 457 // relative to that. 458 FileMgr->FixupRelativePath(NewOutFile); 459 if (llvm::error_code ec = llvm::sys::fs::rename(it->TempFilename, 460 NewOutFile.str())) { 461 getDiagnostics().Report(diag::err_fe_unable_to_rename_temp) 462 << it->TempFilename << it->Filename << ec.message(); 463 464 bool existed; 465 llvm::sys::fs::remove(it->TempFilename, existed); 466 } 467 } 468 } else if (!it->Filename.empty() && EraseFiles) 469 llvm::sys::Path(it->Filename).eraseFromDisk(); 470 471 } 472 OutputFiles.clear(); 473} 474 475llvm::raw_fd_ostream * 476CompilerInstance::createDefaultOutputFile(bool Binary, 477 StringRef InFile, 478 StringRef Extension) { 479 return createOutputFile(getFrontendOpts().OutputFile, Binary, 480 /*RemoveFileOnSignal=*/true, InFile, Extension); 481} 482 483llvm::raw_fd_ostream * 484CompilerInstance::createOutputFile(StringRef OutputPath, 485 bool Binary, bool RemoveFileOnSignal, 486 StringRef InFile, 487 StringRef Extension, 488 bool UseTemporary) { 489 std::string Error, OutputPathName, TempPathName; 490 llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, 491 RemoveFileOnSignal, 492 InFile, Extension, 493 UseTemporary, 494 &OutputPathName, 495 &TempPathName); 496 if (!OS) { 497 getDiagnostics().Report(diag::err_fe_unable_to_open_output) 498 << OutputPath << Error; 499 return 0; 500 } 501 502 // Add the output file -- but don't try to remove "-", since this means we are 503 // using stdin. 504 addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", 505 TempPathName, OS)); 506 507 return OS; 508} 509 510llvm::raw_fd_ostream * 511CompilerInstance::createOutputFile(StringRef OutputPath, 512 std::string &Error, 513 bool Binary, 514 bool RemoveFileOnSignal, 515 StringRef InFile, 516 StringRef Extension, 517 bool UseTemporary, 518 std::string *ResultPathName, 519 std::string *TempPathName) { 520 std::string OutFile, TempFile; 521 if (!OutputPath.empty()) { 522 OutFile = OutputPath; 523 } else if (InFile == "-") { 524 OutFile = "-"; 525 } else if (!Extension.empty()) { 526 llvm::sys::Path Path(InFile); 527 Path.eraseSuffix(); 528 Path.appendSuffix(Extension); 529 OutFile = Path.str(); 530 } else { 531 OutFile = "-"; 532 } 533 534 llvm::OwningPtr<llvm::raw_fd_ostream> OS; 535 std::string OSFile; 536 537 if (UseTemporary && OutFile != "-") { 538 llvm::sys::Path OutPath(OutFile); 539 // Only create the temporary if we can actually write to OutPath, otherwise 540 // we want to fail early. 541 bool Exists; 542 if ((llvm::sys::fs::exists(OutPath.str(), Exists) || !Exists) || 543 (OutPath.isRegularFile() && OutPath.canWrite())) { 544 // Create a temporary file. 545 llvm::SmallString<128> TempPath; 546 TempPath = OutFile; 547 TempPath += "-%%%%%%%%"; 548 int fd; 549 if (llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath, 550 /*makeAbsolute=*/false) == llvm::errc::success) { 551 OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); 552 OSFile = TempFile = TempPath.str(); 553 } 554 } 555 } 556 557 if (!OS) { 558 OSFile = OutFile; 559 OS.reset( 560 new llvm::raw_fd_ostream(OSFile.c_str(), Error, 561 (Binary ? llvm::raw_fd_ostream::F_Binary : 0))); 562 if (!Error.empty()) 563 return 0; 564 } 565 566 // Make sure the out stream file gets removed if we crash. 567 if (RemoveFileOnSignal) 568 llvm::sys::RemoveFileOnSignal(llvm::sys::Path(OSFile)); 569 570 if (ResultPathName) 571 *ResultPathName = OutFile; 572 if (TempPathName) 573 *TempPathName = TempFile; 574 575 return OS.take(); 576} 577 578// Initialization Utilities 579 580bool CompilerInstance::InitializeSourceManager(StringRef InputFile) { 581 return InitializeSourceManager(InputFile, getDiagnostics(), getFileManager(), 582 getSourceManager(), getFrontendOpts()); 583} 584 585bool CompilerInstance::InitializeSourceManager(StringRef InputFile, 586 DiagnosticsEngine &Diags, 587 FileManager &FileMgr, 588 SourceManager &SourceMgr, 589 const FrontendOptions &Opts) { 590 // Figure out where to get and map in the main file. 591 if (InputFile != "-") { 592 const FileEntry *File = FileMgr.getFile(InputFile); 593 if (!File) { 594 Diags.Report(diag::err_fe_error_reading) << InputFile; 595 return false; 596 } 597 SourceMgr.createMainFileID(File); 598 } else { 599 llvm::OwningPtr<llvm::MemoryBuffer> SB; 600 if (llvm::MemoryBuffer::getSTDIN(SB)) { 601 // FIXME: Give ec.message() in this diag. 602 Diags.Report(diag::err_fe_error_reading_stdin); 603 return false; 604 } 605 const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), 606 SB->getBufferSize(), 0); 607 SourceMgr.createMainFileID(File); 608 SourceMgr.overrideFileContents(File, SB.take()); 609 } 610 611 assert(!SourceMgr.getMainFileID().isInvalid() && 612 "Couldn't establish MainFileID!"); 613 return true; 614} 615 616// High-Level Operations 617 618bool CompilerInstance::ExecuteAction(FrontendAction &Act) { 619 assert(hasDiagnostics() && "Diagnostics engine is not initialized!"); 620 assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!"); 621 assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!"); 622 623 // FIXME: Take this as an argument, once all the APIs we used have moved to 624 // taking it as an input instead of hard-coding llvm::errs. 625 raw_ostream &OS = llvm::errs(); 626 627 // Create the target instance. 628 setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), getTargetOpts())); 629 if (!hasTarget()) 630 return false; 631 632 // Inform the target of the language options. 633 // 634 // FIXME: We shouldn't need to do this, the target should be immutable once 635 // created. This complexity should be lifted elsewhere. 636 getTarget().setForcedLangOptions(getLangOpts()); 637 638 // Validate/process some options. 639 if (getHeaderSearchOpts().Verbose) 640 OS << "clang -cc1 version " CLANG_VERSION_STRING 641 << " based upon " << PACKAGE_STRING 642 << " default target " << llvm::sys::getDefaultTargetTriple() << "\n"; 643 644 if (getFrontendOpts().ShowTimers) 645 createFrontendTimer(); 646 647 if (getFrontendOpts().ShowStats) 648 llvm::EnableStatistics(); 649 650 for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) { 651 const std::string &InFile = getFrontendOpts().Inputs[i].second; 652 653 // Reset the ID tables if we are reusing the SourceManager. 654 if (hasSourceManager()) 655 getSourceManager().clearIDTables(); 656 657 if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) { 658 Act.Execute(); 659 Act.EndSourceFile(); 660 } 661 } 662 663 // Notify the diagnostic client that all files were processed. 664 getDiagnostics().getClient()->finish(); 665 666 if (getDiagnosticOpts().ShowCarets) { 667 // We can have multiple diagnostics sharing one diagnostic client. 668 // Get the total number of warnings/errors from the client. 669 unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings(); 670 unsigned NumErrors = getDiagnostics().getClient()->getNumErrors(); 671 672 if (NumWarnings) 673 OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); 674 if (NumWarnings && NumErrors) 675 OS << " and "; 676 if (NumErrors) 677 OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s"); 678 if (NumWarnings || NumErrors) 679 OS << " generated.\n"; 680 } 681 682 if (getFrontendOpts().ShowStats && hasFileManager()) { 683 getFileManager().PrintStats(); 684 OS << "\n"; 685 } 686 687 return !getDiagnostics().getClient()->getNumErrors(); 688} 689 690/// \brief Determine the appropriate source input kind based on language 691/// options. 692static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { 693 if (LangOpts.OpenCL) 694 return IK_OpenCL; 695 if (LangOpts.CUDA) 696 return IK_CUDA; 697 if (LangOpts.ObjC1) 698 return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC; 699 return LangOpts.CPlusPlus? IK_CXX : IK_C; 700} 701 702namespace { 703 struct CompileModuleMapData { 704 CompilerInstance &Instance; 705 GenerateModuleAction &CreateModuleAction; 706 }; 707} 708 709/// \brief Helper function that executes the module-generating action under 710/// a crash recovery context. 711static void doCompileMapModule(void *UserData) { 712 CompileModuleMapData &Data 713 = *reinterpret_cast<CompileModuleMapData *>(UserData); 714 Data.Instance.ExecuteAction(Data.CreateModuleAction); 715} 716 717namespace { 718 /// \brief Class that manages the creation of a lock file to aid 719 /// implicit coordination between different processes. 720 /// 721 /// The implicit coordination works by creating a ".lock" file alongside 722 /// the file that we're coordinating for, using the atomicity of the file 723 /// system to ensure that only a single process can create that ".lock" file. 724 /// When the lock file is removed, the owning process has finished the 725 /// operation. 726 class LockFileManager { 727 public: 728 /// \brief Describes the state of a lock file. 729 enum LockFileState { 730 /// \brief The lock file has been created and is owned by this instance 731 /// of the object. 732 LFS_Owned, 733 /// \brief The lock file already exists and is owned by some other 734 /// instance. 735 LFS_Shared, 736 /// \brief An error occurred while trying to create or find the lock 737 /// file. 738 LFS_Error 739 }; 740 741 private: 742 llvm::SmallString<128> LockFileName; 743 llvm::SmallString<128> UniqueLockFileName; 744 745 llvm::Optional<std::pair<std::string, int> > Owner; 746 llvm::Optional<llvm::error_code> Error; 747 748 LockFileManager(const LockFileManager &); 749 LockFileManager &operator=(const LockFileManager &); 750 751 static llvm::Optional<std::pair<std::string, int> > 752 readLockFile(StringRef LockFileName); 753 754 static bool processStillExecuting(StringRef Hostname, int PID); 755 756 public: 757 758 LockFileManager(StringRef FileName); 759 ~LockFileManager(); 760 761 /// \brief Determine the state of the lock file. 762 LockFileState getState() const; 763 764 operator LockFileState() const { return getState(); } 765 766 /// \brief For a shared lock, wait until the owner releases the lock. 767 void waitForUnlock(); 768 }; 769} 770 771/// \brief Attempt to read the lock file with the given name, if it exists. 772/// 773/// \param LockFileName The name of the lock file to read. 774/// 775/// \returns The process ID of the process that owns this lock file 776llvm::Optional<std::pair<std::string, int> > 777LockFileManager::readLockFile(StringRef LockFileName) { 778 // Check whether the lock file exists. If not, clearly there's nothing 779 // to read, so we just return. 780 bool Exists = false; 781 if (llvm::sys::fs::exists(LockFileName, Exists) || !Exists) 782 return llvm::Optional<std::pair<std::string, int> >(); 783 784 // Read the owning host and PID out of the lock file. If it appears that the 785 // owning process is dead, the lock file is invalid. 786 int PID = 0; 787 std::string Hostname; 788 std::ifstream Input(LockFileName.str().c_str()); 789 if (Input >> Hostname >> PID && PID > 0 && 790 processStillExecuting(Hostname, PID)) 791 return std::make_pair(Hostname, PID); 792 793 // Delete the lock file. It's invalid anyway. 794 bool Existed; 795 llvm::sys::fs::remove(LockFileName, Existed); 796 return llvm::Optional<std::pair<std::string, int> >(); 797} 798 799bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) { 800#if LLVM_ON_UNIX 801 char MyHostname[256]; 802 MyHostname[255] = 0; 803 MyHostname[0] = 0; 804 gethostname(MyHostname, 255); 805 // Check whether the process is dead. If so, we're done. 806 if (MyHostname == Hostname && getsid(PID) == -1 && errno == ESRCH) 807 return false; 808#endif 809 810 return true; 811} 812 813LockFileManager::LockFileManager(StringRef FileName) 814{ 815 LockFileName = FileName; 816 LockFileName += ".lock"; 817 818 // If the lock file already exists, don't bother to try to create our own 819 // lock file; it won't work anyway. Just figure out who owns this lock file. 820 if ((Owner = readLockFile(LockFileName))) 821 return; 822 823 // Create a lock file that is unique to this instance. 824 UniqueLockFileName = LockFileName; 825 UniqueLockFileName += "-%%%%%%%%"; 826 int UniqueLockFileID; 827 if (llvm::error_code EC 828 = llvm::sys::fs::unique_file(UniqueLockFileName.str(), 829 UniqueLockFileID, 830 UniqueLockFileName, 831 /*makeAbsolute=*/false)) { 832 Error = EC; 833 return; 834 } 835 836 // Write our process ID to our unique lock file. 837 { 838 llvm::raw_fd_ostream Out(UniqueLockFileID, /*shouldClose=*/true); 839 840#if LLVM_ON_UNIX 841 // FIXME: move getpid() call into LLVM 842 char hostname[256]; 843 hostname[255] = 0; 844 hostname[0] = 0; 845 gethostname(hostname, 255); 846 Out << hostname << ' ' << getpid(); 847#else 848 Out << "localhost 1"; 849#endif 850 Out.close(); 851 852 if (Out.has_error()) { 853 // We failed to write out PID, so make up an excuse, remove the 854 // unique lock file, and fail. 855 Error = llvm::make_error_code(llvm::errc::no_space_on_device); 856 bool Existed; 857 llvm::sys::fs::remove(UniqueLockFileName.c_str(), Existed); 858 return; 859 } 860 } 861 862 // Create a hard link from the lock file name. If this succeeds, we're done. 863 llvm::error_code EC 864 = llvm::sys::fs::create_hard_link(UniqueLockFileName.str(), 865 LockFileName.str()); 866 if (EC == llvm::errc::success) 867 return; 868 869 // Creating the hard link failed. 870 871#ifdef LLVM_ON_UNIX 872 // The creation of the hard link may appear to fail, but if stat'ing the 873 // unique file returns a link count of 2, then we can still declare success. 874 struct stat StatBuf; 875 if (stat(UniqueLockFileName.c_str(), &StatBuf) == 0 && 876 StatBuf.st_nlink == 2) 877 return; 878#endif 879 880 // Someone else managed to create the lock file first. Wipe out our unique 881 // lock file (it's useless now) and read the process ID from the lock file. 882 bool Existed; 883 llvm::sys::fs::remove(UniqueLockFileName.str(), Existed); 884 if ((Owner = readLockFile(LockFileName))) 885 return; 886 887 // There is a lock file that nobody owns; try to clean it up and report 888 // an error. 889 llvm::sys::fs::remove(LockFileName.str(), Existed); 890 Error = EC; 891} 892 893LockFileManager::LockFileState LockFileManager::getState() const { 894 if (Owner) 895 return LFS_Shared; 896 897 if (Error) 898 return LFS_Error; 899 900 return LFS_Owned; 901} 902 903LockFileManager::~LockFileManager() { 904 if (getState() != LFS_Owned) 905 return; 906 907 // Since we own the lock, remove the lock file and our own unique lock file. 908 bool Existed; 909 llvm::sys::fs::remove(LockFileName.str(), Existed); 910 llvm::sys::fs::remove(UniqueLockFileName.str(), Existed); 911} 912 913void LockFileManager::waitForUnlock() { 914 if (getState() != LFS_Shared) 915 return; 916 917#if LLVM_ON_WIN32 918 unsigned long Interval = 1; 919#else 920 struct timespec Interval; 921 Interval.tv_sec = 0; 922 Interval.tv_nsec = 1000000; 923#endif 924 // Don't wait more than an hour for the file to appear. 925 const unsigned MaxSeconds = 3600; 926 do { 927 // Sleep for the designated interval, to allow the owning process time to 928 // finish up and 929 // FIXME: Should we hook in to system APIs to get a notification when the 930 // lock file is deleted? 931#if LLVM_ON_WIN32 932 Sleep(Interval); 933#else 934 nanosleep(&Interval, NULL); 935#endif 936 // If the file no longer exists, we're done. 937 bool Exists = false; 938 if (!llvm::sys::fs::exists(LockFileName.str(), Exists) && !Exists) 939 return; 940 941 if (!processStillExecuting((*Owner).first, (*Owner).second)) 942 return; 943 944 // Exponentially increase the time we wait for the lock to be removed. 945#if LLVM_ON_WIN32 946 Interval *= 2; 947#else 948 Interval.tv_sec *= 2; 949 Interval.tv_nsec *= 2; 950 if (Interval.tv_nsec >= 1000000000) { 951 ++Interval.tv_sec; 952 Interval.tv_nsec -= 1000000000; 953 } 954#endif 955 } while ( 956#if LLVM_ON_WIN32 957 Interval < MaxSeconds * 1000 958#else 959 Interval.tv_sec < (time_t)MaxSeconds 960#endif 961 ); 962 963 // Give up. 964} 965 966/// \brief Compile a module file for the given module, using the options 967/// provided by the importing compiler instance. 968static void compileModule(CompilerInstance &ImportingInstance, 969 Module *Module, 970 StringRef ModuleFileName) { 971 LockFileManager Locked(ModuleFileName); 972 switch (Locked) { 973 case LockFileManager::LFS_Error: 974 return; 975 976 case LockFileManager::LFS_Owned: 977 // We're responsible for building the module ourselves. Do so below. 978 break; 979 980 case LockFileManager::LFS_Shared: 981 // Someone else is responsible for building the module. Wait for them to 982 // finish. 983 Locked.waitForUnlock(); 984 break; 985 } 986 987 ModuleMap &ModMap 988 = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 989 990 // Construct a compiler invocation for creating this module. 991 llvm::IntrusiveRefCntPtr<CompilerInvocation> Invocation 992 (new CompilerInvocation(ImportingInstance.getInvocation())); 993 994 PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 995 996 // For any options that aren't intended to affect how a module is built, 997 // reset them to their default values. 998 Invocation->getLangOpts()->resetNonModularOptions(); 999 PPOpts.resetNonModularOptions(); 1000 1001 // Note the name of the module we're building. 1002 Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName(); 1003 1004 // Note that this module is part of the module build path, so that we 1005 // can detect cycles in the module graph. 1006 PPOpts.ModuleBuildPath.push_back(Module->getTopLevelModuleName()); 1007 1008 // If there is a module map file, build the module using the module map. 1009 // Set up the inputs/outputs so that we build the module from its umbrella 1010 // header. 1011 FrontendOptions &FrontendOpts = Invocation->getFrontendOpts(); 1012 FrontendOpts.OutputFile = ModuleFileName.str(); 1013 FrontendOpts.DisableFree = false; 1014 FrontendOpts.Inputs.clear(); 1015 InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts()); 1016 1017 // Get or create the module map that we'll use to build this module. 1018 llvm::SmallString<128> TempModuleMapFileName; 1019 if (const FileEntry *ModuleMapFile 1020 = ModMap.getContainingModuleMapFile(Module)) { 1021 // Use the module map where this module resides. 1022 FrontendOpts.Inputs.push_back(std::make_pair(IK, ModuleMapFile->getName())); 1023 } else { 1024 // Create a temporary module map file. 1025 TempModuleMapFileName = Module->Name; 1026 TempModuleMapFileName += "-%%%%%%%%.map"; 1027 int FD; 1028 if (llvm::sys::fs::unique_file(TempModuleMapFileName.str(), FD, 1029 TempModuleMapFileName, 1030 /*makeAbsolute=*/true) 1031 != llvm::errc::success) { 1032 ImportingInstance.getDiagnostics().Report(diag::err_module_map_temp_file) 1033 << TempModuleMapFileName; 1034 return; 1035 } 1036 // Print the module map to this file. 1037 llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true); 1038 Module->print(OS); 1039 FrontendOpts.Inputs.push_back( 1040 std::make_pair(IK, TempModuleMapFileName.str().str())); 1041 } 1042 1043 // Don't free the remapped file buffers; they are owned by our caller. 1044 PPOpts.RetainRemappedFileBuffers = true; 1045 1046 Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; 1047 assert(ImportingInstance.getInvocation().getModuleHash() == 1048 Invocation->getModuleHash() && "Module hash mismatch!"); 1049 1050 // Construct a compiler instance that will be used to actually create the 1051 // module. 1052 CompilerInstance Instance; 1053 Instance.setInvocation(&*Invocation); 1054 Instance.createDiagnostics(/*argc=*/0, /*argv=*/0, 1055 &ImportingInstance.getDiagnosticClient(), 1056 /*ShouldOwnClient=*/true, 1057 /*ShouldCloneClient=*/true); 1058 1059 // Construct a module-generating action. 1060 GenerateModuleAction CreateModuleAction; 1061 1062 // Execute the action to actually build the module in-place. Use a separate 1063 // thread so that we get a stack large enough. 1064 const unsigned ThreadStackSize = 8 << 20; 1065 llvm::CrashRecoveryContext CRC; 1066 CompileModuleMapData Data = { Instance, CreateModuleAction }; 1067 CRC.RunSafelyOnThread(&doCompileMapModule, &Data, ThreadStackSize); 1068 1069 // Delete the temporary module map file. 1070 // FIXME: Even though we're executing under crash protection, it would still 1071 // be nice to do this with RemoveFileOnSignal when we can. However, that 1072 // doesn't make sense for all clients, so clean this up manually. 1073 if (!TempModuleMapFileName.empty()) 1074 llvm::sys::Path(TempModuleMapFileName).eraseFromDisk(); 1075} 1076 1077Module *CompilerInstance::loadModule(SourceLocation ImportLoc, 1078 ModuleIdPath Path, 1079 Module::NameVisibilityKind Visibility, 1080 bool IsInclusionDirective) { 1081 // If we've already handled this import, just return the cached result. 1082 // This one-element cache is important to eliminate redundant diagnostics 1083 // when both the preprocessor and parser see the same import declaration. 1084 if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc) { 1085 // Make the named module visible. 1086 if (LastModuleImportResult) 1087 ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility); 1088 return LastModuleImportResult; 1089 } 1090 1091 // Determine what file we're searching from. 1092 SourceManager &SourceMgr = getSourceManager(); 1093 SourceLocation ExpandedImportLoc = SourceMgr.getExpansionLoc(ImportLoc); 1094 const FileEntry *CurFile 1095 = SourceMgr.getFileEntryForID(SourceMgr.getFileID(ExpandedImportLoc)); 1096 if (!CurFile) 1097 CurFile = SourceMgr.getFileEntryForID(SourceMgr.getMainFileID()); 1098 1099 StringRef ModuleName = Path[0].first->getName(); 1100 SourceLocation ModuleNameLoc = Path[0].second; 1101 1102 clang::Module *Module = 0; 1103 const FileEntry *ModuleFile = 0; 1104 1105 // If we don't already have information on this module, load the module now. 1106 llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known 1107 = KnownModules.find(Path[0].first); 1108 if (Known == KnownModules.end()) { 1109 // Search for a module with the given name. 1110 std::string ModuleFileName; 1111 ModuleFile 1112 = PP->getHeaderSearchInfo().lookupModule(ModuleName, Module, 1113 &ModuleFileName); 1114 1115 bool BuildingModule = false; 1116 if (!ModuleFile && Module) { 1117 // The module is not cached, but we have a module map from which we can 1118 // build the module. 1119 1120 // Check whether there is a cycle in the module graph. 1121 SmallVectorImpl<std::string> &ModuleBuildPath 1122 = getPreprocessorOpts().ModuleBuildPath; 1123 SmallVectorImpl<std::string>::iterator Pos 1124 = std::find(ModuleBuildPath.begin(), ModuleBuildPath.end(), ModuleName); 1125 if (Pos != ModuleBuildPath.end()) { 1126 llvm::SmallString<256> CyclePath; 1127 for (; Pos != ModuleBuildPath.end(); ++Pos) { 1128 CyclePath += *Pos; 1129 CyclePath += " -> "; 1130 } 1131 CyclePath += ModuleName; 1132 1133 getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle) 1134 << ModuleName << CyclePath; 1135 return 0; 1136 } 1137 1138 getDiagnostics().Report(ModuleNameLoc, diag::warn_module_build) 1139 << ModuleName; 1140 BuildingModule = true; 1141 compileModule(*this, Module, ModuleFileName); 1142 ModuleFile = FileMgr->getFile(ModuleFileName); 1143 } 1144 1145 if (!ModuleFile) { 1146 getDiagnostics().Report(ModuleNameLoc, 1147 BuildingModule? diag::err_module_not_built 1148 : diag::err_module_not_found) 1149 << ModuleName 1150 << SourceRange(ImportLoc, ModuleNameLoc); 1151 return 0; 1152 } 1153 1154 // If we don't already have an ASTReader, create one now. 1155 if (!ModuleManager) { 1156 if (!hasASTContext()) 1157 createASTContext(); 1158 1159 std::string Sysroot = getHeaderSearchOpts().Sysroot; 1160 const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 1161 ModuleManager = new ASTReader(getPreprocessor(), *Context, 1162 Sysroot.empty() ? "" : Sysroot.c_str(), 1163 PPOpts.DisablePCHValidation, 1164 PPOpts.DisableStatCache); 1165 if (hasASTConsumer()) { 1166 ModuleManager->setDeserializationListener( 1167 getASTConsumer().GetASTDeserializationListener()); 1168 getASTContext().setASTMutationListener( 1169 getASTConsumer().GetASTMutationListener()); 1170 } 1171 llvm::OwningPtr<ExternalASTSource> Source; 1172 Source.reset(ModuleManager); 1173 getASTContext().setExternalSource(Source); 1174 if (hasSema()) 1175 ModuleManager->InitializeSema(getSema()); 1176 if (hasASTConsumer()) 1177 ModuleManager->StartTranslationUnit(&getASTConsumer()); 1178 } 1179 1180 // Try to load the module we found. 1181 switch (ModuleManager->ReadAST(ModuleFile->getName(), 1182 serialization::MK_Module)) { 1183 case ASTReader::Success: 1184 break; 1185 1186 case ASTReader::IgnorePCH: 1187 // FIXME: The ASTReader will already have complained, but can we showhorn 1188 // that diagnostic information into a more useful form? 1189 KnownModules[Path[0].first] = 0; 1190 return 0; 1191 1192 case ASTReader::Failure: 1193 // Already complained, but note now that we failed. 1194 KnownModules[Path[0].first] = 0; 1195 return 0; 1196 } 1197 1198 if (!Module) { 1199 // If we loaded the module directly, without finding a module map first, 1200 // we'll have loaded the module's information from the module itself. 1201 Module = PP->getHeaderSearchInfo().getModuleMap() 1202 .findModule((Path[0].first->getName())); 1203 } 1204 1205 // Cache the result of this top-level module lookup for later. 1206 Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 1207 } else { 1208 // Retrieve the cached top-level module. 1209 Module = Known->second; 1210 } 1211 1212 // If we never found the module, fail. 1213 if (!Module) 1214 return 0; 1215 1216 // Verify that the rest of the module path actually corresponds to 1217 // a submodule. 1218 if (Path.size() > 1) { 1219 for (unsigned I = 1, N = Path.size(); I != N; ++I) { 1220 StringRef Name = Path[I].first->getName(); 1221 llvm::StringMap<clang::Module *>::iterator Pos 1222 = Module->SubModules.find(Name); 1223 1224 if (Pos == Module->SubModules.end()) { 1225 // Attempt to perform typo correction to find a module name that works. 1226 llvm::SmallVector<StringRef, 2> Best; 1227 unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)(); 1228 1229 for (llvm::StringMap<clang::Module *>::iterator 1230 J = Module->SubModules.begin(), 1231 JEnd = Module->SubModules.end(); 1232 J != JEnd; ++J) { 1233 unsigned ED = Name.edit_distance(J->getValue()->Name, 1234 /*AllowReplacements=*/true, 1235 BestEditDistance); 1236 if (ED <= BestEditDistance) { 1237 if (ED < BestEditDistance) 1238 Best.clear(); 1239 Best.push_back(J->getValue()->Name); 1240 } 1241 } 1242 1243 // If there was a clear winner, user it. 1244 if (Best.size() == 1) { 1245 getDiagnostics().Report(Path[I].second, 1246 diag::err_no_submodule_suggest) 1247 << Path[I].first << Module->getFullModuleName() << Best[0] 1248 << SourceRange(Path[0].second, Path[I-1].second) 1249 << FixItHint::CreateReplacement(SourceRange(Path[I].second), 1250 Best[0]); 1251 Pos = Module->SubModules.find(Best[0]); 1252 } 1253 } 1254 1255 if (Pos == Module->SubModules.end()) { 1256 // No submodule by this name. Complain, and don't look for further 1257 // submodules. 1258 getDiagnostics().Report(Path[I].second, diag::err_no_submodule) 1259 << Path[I].first << Module->getFullModuleName() 1260 << SourceRange(Path[0].second, Path[I-1].second); 1261 break; 1262 } 1263 1264 Module = Pos->getValue(); 1265 } 1266 } 1267 1268 // Make the named module visible. 1269 ModuleManager->makeModuleVisible(Module, Visibility); 1270 1271 // If this module import was due to an inclusion directive, create an 1272 // implicit import declaration to capture it in the AST. 1273 if (IsInclusionDirective && hasASTContext()) { 1274 TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl(); 1275 TU->addDecl(ImportDecl::CreateImplicit(getASTContext(), TU, 1276 ImportLoc, Module, 1277 Path.back().second)); 1278 } 1279 1280 LastModuleImportLoc = ImportLoc; 1281 LastModuleImportResult = Module; 1282 return Module; 1283} 1284