1 //===--- FrontendAction.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/FrontendAction.h" 11 #include "clang/AST/ASTConsumer.h" 12 #include "clang/AST/ASTContext.h" 13 #include "clang/AST/DeclGroup.h" 14 #include "clang/Frontend/ASTUnit.h" 15 #include "clang/Frontend/CompilerInstance.h" 16 #include "clang/Frontend/FrontendDiagnostic.h" 17 #include "clang/Frontend/FrontendPluginRegistry.h" 18 #include "clang/Frontend/LayoutOverrideSource.h" 19 #include "clang/Frontend/MultiplexConsumer.h" 20 #include "clang/Frontend/Utils.h" 21 #include "clang/Lex/HeaderSearch.h" 22 #include "clang/Lex/LiteralSupport.h" 23 #include "clang/Lex/Preprocessor.h" 24 #include "clang/Lex/PreprocessorOptions.h" 25 #include "clang/Parse/ParseAST.h" 26 #include "clang/Serialization/ASTDeserializationListener.h" 27 #include "clang/Serialization/ASTReader.h" 28 #include "clang/Serialization/GlobalModuleIndex.h" 29 #include "llvm/Support/ErrorHandling.h" 30 #include "llvm/Support/FileSystem.h" 31 #include "llvm/Support/Path.h" 32 #include "llvm/Support/Timer.h" 33 #include "llvm/Support/raw_ostream.h" 34 #include <system_error> 35 using namespace clang; 36 37 LLVM_INSTANTIATE_REGISTRY(FrontendPluginRegistry) 38 39 namespace { 40 41 class DelegatingDeserializationListener : public ASTDeserializationListener { 42 ASTDeserializationListener *Previous; 43 bool DeletePrevious; 44 45 public: 46 explicit DelegatingDeserializationListener( 47 ASTDeserializationListener *Previous, bool DeletePrevious) 48 : Previous(Previous), DeletePrevious(DeletePrevious) {} 49 ~DelegatingDeserializationListener() override { 50 if (DeletePrevious) 51 delete Previous; 52 } 53 54 void ReaderInitialized(ASTReader *Reader) override { 55 if (Previous) 56 Previous->ReaderInitialized(Reader); 57 } 58 void IdentifierRead(serialization::IdentID ID, 59 IdentifierInfo *II) override { 60 if (Previous) 61 Previous->IdentifierRead(ID, II); 62 } 63 void TypeRead(serialization::TypeIdx Idx, QualType T) override { 64 if (Previous) 65 Previous->TypeRead(Idx, T); 66 } 67 void DeclRead(serialization::DeclID ID, const Decl *D) override { 68 if (Previous) 69 Previous->DeclRead(ID, D); 70 } 71 void SelectorRead(serialization::SelectorID ID, Selector Sel) override { 72 if (Previous) 73 Previous->SelectorRead(ID, Sel); 74 } 75 void MacroDefinitionRead(serialization::PreprocessedEntityID PPID, 76 MacroDefinitionRecord *MD) override { 77 if (Previous) 78 Previous->MacroDefinitionRead(PPID, MD); 79 } 80 }; 81 82 /// \brief Dumps deserialized declarations. 83 class DeserializedDeclsDumper : public DelegatingDeserializationListener { 84 public: 85 explicit DeserializedDeclsDumper(ASTDeserializationListener *Previous, 86 bool DeletePrevious) 87 : DelegatingDeserializationListener(Previous, DeletePrevious) {} 88 89 void DeclRead(serialization::DeclID ID, const Decl *D) override { 90 llvm::outs() << "PCH DECL: " << D->getDeclKindName(); 91 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 92 llvm::outs() << " - " << *ND; 93 llvm::outs() << "\n"; 94 95 DelegatingDeserializationListener::DeclRead(ID, D); 96 } 97 }; 98 99 /// \brief Checks deserialized declarations and emits error if a name 100 /// matches one given in command-line using -error-on-deserialized-decl. 101 class DeserializedDeclsChecker : public DelegatingDeserializationListener { 102 ASTContext &Ctx; 103 std::set<std::string> NamesToCheck; 104 105 public: 106 DeserializedDeclsChecker(ASTContext &Ctx, 107 const std::set<std::string> &NamesToCheck, 108 ASTDeserializationListener *Previous, 109 bool DeletePrevious) 110 : DelegatingDeserializationListener(Previous, DeletePrevious), Ctx(Ctx), 111 NamesToCheck(NamesToCheck) {} 112 113 void DeclRead(serialization::DeclID ID, const Decl *D) override { 114 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 115 if (NamesToCheck.find(ND->getNameAsString()) != NamesToCheck.end()) { 116 unsigned DiagID 117 = Ctx.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, 118 "%0 was deserialized"); 119 Ctx.getDiagnostics().Report(Ctx.getFullLoc(D->getLocation()), DiagID) 120 << ND->getNameAsString(); 121 } 122 123 DelegatingDeserializationListener::DeclRead(ID, D); 124 } 125 }; 126 127 } // end anonymous namespace 128 129 FrontendAction::FrontendAction() : Instance(nullptr) {} 130 131 FrontendAction::~FrontendAction() {} 132 133 void FrontendAction::setCurrentInput(const FrontendInputFile &CurrentInput, 134 std::unique_ptr<ASTUnit> AST) { 135 this->CurrentInput = CurrentInput; 136 CurrentASTUnit = std::move(AST); 137 } 138 139 Module *FrontendAction::getCurrentModule() const { 140 CompilerInstance &CI = getCompilerInstance(); 141 return CI.getPreprocessor().getHeaderSearchInfo().lookupModule( 142 CI.getLangOpts().CurrentModule, /*AllowSearch*/false); 143 } 144 145 std::unique_ptr<ASTConsumer> 146 FrontendAction::CreateWrappedASTConsumer(CompilerInstance &CI, 147 StringRef InFile) { 148 std::unique_ptr<ASTConsumer> Consumer = CreateASTConsumer(CI, InFile); 149 if (!Consumer) 150 return nullptr; 151 152 // If there are no registered plugins we don't need to wrap the consumer 153 if (FrontendPluginRegistry::begin() == FrontendPluginRegistry::end()) 154 return Consumer; 155 156 // Collect the list of plugins that go before the main action (in Consumers) 157 // or after it (in AfterConsumers) 158 std::vector<std::unique_ptr<ASTConsumer>> Consumers; 159 std::vector<std::unique_ptr<ASTConsumer>> AfterConsumers; 160 for (FrontendPluginRegistry::iterator it = FrontendPluginRegistry::begin(), 161 ie = FrontendPluginRegistry::end(); 162 it != ie; ++it) { 163 std::unique_ptr<PluginASTAction> P = it->instantiate(); 164 PluginASTAction::ActionType ActionType = P->getActionType(); 165 if (ActionType == PluginASTAction::Cmdline) { 166 // This is O(|plugins| * |add_plugins|), but since both numbers are 167 // way below 50 in practice, that's ok. 168 for (size_t i = 0, e = CI.getFrontendOpts().AddPluginActions.size(); 169 i != e; ++i) { 170 if (it->getName() == CI.getFrontendOpts().AddPluginActions[i]) { 171 ActionType = PluginASTAction::AddAfterMainAction; 172 break; 173 } 174 } 175 } 176 if ((ActionType == PluginASTAction::AddBeforeMainAction || 177 ActionType == PluginASTAction::AddAfterMainAction) && 178 P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs[it->getName()])) { 179 std::unique_ptr<ASTConsumer> PluginConsumer = P->CreateASTConsumer(CI, InFile); 180 if (ActionType == PluginASTAction::AddBeforeMainAction) { 181 Consumers.push_back(std::move(PluginConsumer)); 182 } else { 183 AfterConsumers.push_back(std::move(PluginConsumer)); 184 } 185 } 186 } 187 188 // Add to Consumers the main consumer, then all the plugins that go after it 189 Consumers.push_back(std::move(Consumer)); 190 for (auto &C : AfterConsumers) { 191 Consumers.push_back(std::move(C)); 192 } 193 194 return llvm::make_unique<MultiplexConsumer>(std::move(Consumers)); 195 } 196 197 /// For preprocessed files, if the first line is the linemarker and specifies 198 /// the original source file name, use that name as the input file name. 199 /// Returns the location of the first token after the line marker directive. 200 /// 201 /// \param CI The compiler instance. 202 /// \param InputFile Populated with the filename from the line marker. 203 /// \param AddLineNote If \c true, add a line note corresponding to this line 204 /// directive. Only use this if the directive will not actually be 205 /// visited by the preprocessor. 206 static SourceLocation ReadOriginalFileName(CompilerInstance &CI, 207 std::string &InputFile, 208 bool AddLineNote = false) { 209 auto &SourceMgr = CI.getSourceManager(); 210 auto MainFileID = SourceMgr.getMainFileID(); 211 212 bool Invalid = false; 213 const auto *MainFileBuf = SourceMgr.getBuffer(MainFileID, &Invalid); 214 if (Invalid) 215 return SourceLocation(); 216 217 std::unique_ptr<Lexer> RawLexer( 218 new Lexer(MainFileID, MainFileBuf, SourceMgr, CI.getLangOpts())); 219 220 // If the first line has the syntax of 221 // 222 // # NUM "FILENAME" 223 // 224 // we use FILENAME as the input file name. 225 Token T; 226 if (RawLexer->LexFromRawLexer(T) || T.getKind() != tok::hash) 227 return SourceLocation(); 228 if (RawLexer->LexFromRawLexer(T) || T.isAtStartOfLine() || 229 T.getKind() != tok::numeric_constant) 230 return SourceLocation(); 231 232 unsigned LineNo; 233 SourceLocation LineNoLoc = T.getLocation(); 234 if (AddLineNote) { 235 llvm::SmallString<16> Buffer; 236 if (Lexer::getSpelling(LineNoLoc, Buffer, SourceMgr, CI.getLangOpts()) 237 .getAsInteger(10, LineNo)) 238 return SourceLocation(); 239 } 240 241 RawLexer->LexFromRawLexer(T); 242 if (T.isAtStartOfLine() || T.getKind() != tok::string_literal) 243 return SourceLocation(); 244 245 StringLiteralParser Literal(T, CI.getPreprocessor()); 246 if (Literal.hadError) 247 return SourceLocation(); 248 RawLexer->LexFromRawLexer(T); 249 if (T.isNot(tok::eof) && !T.isAtStartOfLine()) 250 return SourceLocation(); 251 InputFile = Literal.GetString().str(); 252 253 if (AddLineNote) 254 CI.getSourceManager().AddLineNote( 255 LineNoLoc, LineNo, SourceMgr.getLineTableFilenameID(InputFile), false, 256 false, SrcMgr::C_User); 257 258 return T.getLocation(); 259 } 260 261 static SmallVectorImpl<char> & 262 operator+=(SmallVectorImpl<char> &Includes, StringRef RHS) { 263 Includes.append(RHS.begin(), RHS.end()); 264 return Includes; 265 } 266 267 static void addHeaderInclude(StringRef HeaderName, 268 SmallVectorImpl<char> &Includes, 269 const LangOptions &LangOpts, 270 bool IsExternC) { 271 if (IsExternC && LangOpts.CPlusPlus) 272 Includes += "extern \"C\" {\n"; 273 if (LangOpts.ObjC1) 274 Includes += "#import \""; 275 else 276 Includes += "#include \""; 277 278 Includes += HeaderName; 279 280 Includes += "\"\n"; 281 if (IsExternC && LangOpts.CPlusPlus) 282 Includes += "}\n"; 283 } 284 285 /// \brief Collect the set of header includes needed to construct the given 286 /// module and update the TopHeaders file set of the module. 287 /// 288 /// \param Module The module we're collecting includes from. 289 /// 290 /// \param Includes Will be augmented with the set of \#includes or \#imports 291 /// needed to load all of the named headers. 292 static std::error_code 293 collectModuleHeaderIncludes(const LangOptions &LangOpts, FileManager &FileMgr, 294 ModuleMap &ModMap, clang::Module *Module, 295 SmallVectorImpl<char> &Includes) { 296 // Don't collect any headers for unavailable modules. 297 if (!Module->isAvailable()) 298 return std::error_code(); 299 300 // Add includes for each of these headers. 301 for (auto HK : {Module::HK_Normal, Module::HK_Private}) { 302 for (Module::Header &H : Module->Headers[HK]) { 303 Module->addTopHeader(H.Entry); 304 // Use the path as specified in the module map file. We'll look for this 305 // file relative to the module build directory (the directory containing 306 // the module map file) so this will find the same file that we found 307 // while parsing the module map. 308 addHeaderInclude(H.NameAsWritten, Includes, LangOpts, Module->IsExternC); 309 } 310 } 311 // Note that Module->PrivateHeaders will not be a TopHeader. 312 313 if (Module::Header UmbrellaHeader = Module->getUmbrellaHeader()) { 314 Module->addTopHeader(UmbrellaHeader.Entry); 315 if (Module->Parent) 316 // Include the umbrella header for submodules. 317 addHeaderInclude(UmbrellaHeader.NameAsWritten, Includes, LangOpts, 318 Module->IsExternC); 319 } else if (Module::DirectoryName UmbrellaDir = Module->getUmbrellaDir()) { 320 // Add all of the headers we find in this subdirectory. 321 std::error_code EC; 322 SmallString<128> DirNative; 323 llvm::sys::path::native(UmbrellaDir.Entry->getName(), DirNative); 324 325 vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem(); 326 for (vfs::recursive_directory_iterator Dir(FS, DirNative, EC), End; 327 Dir != End && !EC; Dir.increment(EC)) { 328 // Check whether this entry has an extension typically associated with 329 // headers. 330 if (!llvm::StringSwitch<bool>(llvm::sys::path::extension(Dir->getName())) 331 .Cases(".h", ".H", ".hh", ".hpp", true) 332 .Default(false)) 333 continue; 334 335 const FileEntry *Header = FileMgr.getFile(Dir->getName()); 336 // FIXME: This shouldn't happen unless there is a file system race. Is 337 // that worth diagnosing? 338 if (!Header) 339 continue; 340 341 // If this header is marked 'unavailable' in this module, don't include 342 // it. 343 if (ModMap.isHeaderUnavailableInModule(Header, Module)) 344 continue; 345 346 // Compute the relative path from the directory to this file. 347 SmallVector<StringRef, 16> Components; 348 auto PathIt = llvm::sys::path::rbegin(Dir->getName()); 349 for (int I = 0; I != Dir.level() + 1; ++I, ++PathIt) 350 Components.push_back(*PathIt); 351 SmallString<128> RelativeHeader(UmbrellaDir.NameAsWritten); 352 for (auto It = Components.rbegin(), End = Components.rend(); It != End; 353 ++It) 354 llvm::sys::path::append(RelativeHeader, *It); 355 356 // Include this header as part of the umbrella directory. 357 Module->addTopHeader(Header); 358 addHeaderInclude(RelativeHeader, Includes, LangOpts, Module->IsExternC); 359 } 360 361 if (EC) 362 return EC; 363 } 364 365 // Recurse into submodules. 366 for (clang::Module::submodule_iterator Sub = Module->submodule_begin(), 367 SubEnd = Module->submodule_end(); 368 Sub != SubEnd; ++Sub) 369 if (std::error_code Err = collectModuleHeaderIncludes( 370 LangOpts, FileMgr, ModMap, *Sub, Includes)) 371 return Err; 372 373 return std::error_code(); 374 } 375 376 static bool 377 loadModuleMapForModuleBuild(CompilerInstance &CI, StringRef Filename, 378 bool IsSystem, bool IsPreprocessed, 379 unsigned &Offset) { 380 auto &SrcMgr = CI.getSourceManager(); 381 HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo(); 382 383 // Map the current input to a file. 384 FileID ModuleMapID = SrcMgr.getMainFileID(); 385 const FileEntry *ModuleMap = SrcMgr.getFileEntryForID(ModuleMapID); 386 387 // If the module map is preprocessed, handle the initial line marker; 388 // line directives are not part of the module map syntax in general. 389 Offset = 0; 390 if (IsPreprocessed) { 391 std::string PresumedModuleMapFile; 392 SourceLocation EndOfLineMarker = 393 ReadOriginalFileName(CI, PresumedModuleMapFile, /*AddLineNote*/true); 394 if (EndOfLineMarker.isValid()) 395 Offset = CI.getSourceManager().getDecomposedLoc(EndOfLineMarker).second; 396 // FIXME: Use PresumedModuleMapFile as the MODULE_MAP_FILE in the PCM. 397 } 398 399 // Load the module map file. 400 if (HS.loadModuleMapFile(ModuleMap, IsSystem, ModuleMapID, &Offset)) 401 return true; 402 403 if (SrcMgr.getBuffer(ModuleMapID)->getBufferSize() == Offset) 404 Offset = 0; 405 406 return false; 407 } 408 409 static Module *prepareToBuildModule(CompilerInstance &CI, 410 StringRef ModuleMapFilename) { 411 if (CI.getLangOpts().CurrentModule.empty()) { 412 CI.getDiagnostics().Report(diag::err_missing_module_name); 413 414 // FIXME: Eventually, we could consider asking whether there was just 415 // a single module described in the module map, and use that as a 416 // default. Then it would be fairly trivial to just "compile" a module 417 // map with a single module (the common case). 418 return nullptr; 419 } 420 421 // Dig out the module definition. 422 HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo(); 423 Module *M = HS.lookupModule(CI.getLangOpts().CurrentModule, 424 /*AllowSearch=*/false); 425 if (!M) { 426 CI.getDiagnostics().Report(diag::err_missing_module) 427 << CI.getLangOpts().CurrentModule << ModuleMapFilename; 428 429 return nullptr; 430 } 431 432 // Check whether we can build this module at all. 433 clang::Module::Requirement Requirement; 434 clang::Module::UnresolvedHeaderDirective MissingHeader; 435 if (!M->isAvailable(CI.getLangOpts(), CI.getTarget(), Requirement, 436 MissingHeader)) { 437 if (MissingHeader.FileNameLoc.isValid()) { 438 CI.getDiagnostics().Report(MissingHeader.FileNameLoc, 439 diag::err_module_header_missing) 440 << MissingHeader.IsUmbrella << MissingHeader.FileName; 441 } else { 442 CI.getDiagnostics().Report(diag::err_module_unavailable) 443 << M->getFullModuleName() << Requirement.second << Requirement.first; 444 } 445 446 return nullptr; 447 } 448 449 // Inform the preprocessor that includes from within the input buffer should 450 // be resolved relative to the build directory of the module map file. 451 CI.getPreprocessor().setMainFileDir(M->Directory); 452 453 // If the module was inferred from a different module map (via an expanded 454 // umbrella module definition), track that fact. 455 // FIXME: It would be preferable to fill this in as part of processing 456 // the module map, rather than adding it after the fact. 457 StringRef OriginalModuleMapName = CI.getFrontendOpts().OriginalModuleMap; 458 if (!OriginalModuleMapName.empty()) { 459 auto *OriginalModuleMap = 460 CI.getFileManager().getFile(OriginalModuleMapName, 461 /*openFile*/ true); 462 if (!OriginalModuleMap) { 463 CI.getDiagnostics().Report(diag::err_module_map_not_found) 464 << OriginalModuleMapName; 465 return nullptr; 466 } 467 if (OriginalModuleMap != CI.getSourceManager().getFileEntryForID( 468 CI.getSourceManager().getMainFileID())) { 469 M->IsInferred = true; 470 CI.getPreprocessor().getHeaderSearchInfo().getModuleMap() 471 .setInferredModuleAllowedBy(M, OriginalModuleMap); 472 } 473 } 474 475 // If we're being run from the command-line, the module build stack will not 476 // have been filled in yet, so complete it now in order to allow us to detect 477 // module cycles. 478 SourceManager &SourceMgr = CI.getSourceManager(); 479 if (SourceMgr.getModuleBuildStack().empty()) 480 SourceMgr.pushModuleBuildStack(CI.getLangOpts().CurrentModule, 481 FullSourceLoc(SourceLocation(), SourceMgr)); 482 return M; 483 } 484 485 /// Compute the input buffer that should be used to build the specified module. 486 static std::unique_ptr<llvm::MemoryBuffer> 487 getInputBufferForModule(CompilerInstance &CI, Module *M) { 488 FileManager &FileMgr = CI.getFileManager(); 489 490 // Collect the set of #includes we need to build the module. 491 SmallString<256> HeaderContents; 492 std::error_code Err = std::error_code(); 493 if (Module::Header UmbrellaHeader = M->getUmbrellaHeader()) 494 addHeaderInclude(UmbrellaHeader.NameAsWritten, HeaderContents, 495 CI.getLangOpts(), M->IsExternC); 496 Err = collectModuleHeaderIncludes( 497 CI.getLangOpts(), FileMgr, 498 CI.getPreprocessor().getHeaderSearchInfo().getModuleMap(), M, 499 HeaderContents); 500 501 if (Err) { 502 CI.getDiagnostics().Report(diag::err_module_cannot_create_includes) 503 << M->getFullModuleName() << Err.message(); 504 return nullptr; 505 } 506 507 return llvm::MemoryBuffer::getMemBufferCopy( 508 HeaderContents, Module::getModuleInputBufferName()); 509 } 510 511 bool FrontendAction::BeginSourceFile(CompilerInstance &CI, 512 const FrontendInputFile &Input) { 513 assert(!Instance && "Already processing a source file!"); 514 assert(!Input.isEmpty() && "Unexpected empty filename!"); 515 setCurrentInput(Input); 516 setCompilerInstance(&CI); 517 518 StringRef InputFile = Input.getFile(); 519 bool HasBegunSourceFile = false; 520 if (!BeginInvocation(CI)) 521 goto failure; 522 523 // AST files follow a very different path, since they share objects via the 524 // AST unit. 525 if (Input.getKind().getFormat() == InputKind::Precompiled) { 526 // FIXME: We should not be asserting on bad command-line arguments. 527 assert(!usesPreprocessorOnly() && 528 "Attempt to pass AST file to preprocessor only action!"); 529 assert(hasASTFileSupport() && 530 "This action does not have AST file support!"); 531 532 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(&CI.getDiagnostics()); 533 534 std::unique_ptr<ASTUnit> AST = ASTUnit::LoadFromASTFile( 535 InputFile, CI.getPCHContainerReader(), Diags, CI.getFileSystemOpts(), 536 CI.getCodeGenOpts().DebugTypeExtRefs); 537 538 if (!AST) 539 goto failure; 540 541 // Inform the diagnostic client we are processing a source file. 542 CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), nullptr); 543 HasBegunSourceFile = true; 544 545 // Set the shared objects, these are reset when we finish processing the 546 // file, otherwise the CompilerInstance will happily destroy them. 547 CI.setFileManager(&AST->getFileManager()); 548 CI.setSourceManager(&AST->getSourceManager()); 549 CI.setPreprocessor(AST->getPreprocessorPtr()); 550 Preprocessor &PP = CI.getPreprocessor(); 551 PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(), 552 PP.getLangOpts()); 553 CI.setASTContext(&AST->getASTContext()); 554 555 setCurrentInput(Input, std::move(AST)); 556 557 // Initialize the action. 558 if (!BeginSourceFileAction(CI, InputFile)) 559 goto failure; 560 561 // Create the AST consumer. 562 CI.setASTConsumer(CreateWrappedASTConsumer(CI, InputFile)); 563 if (!CI.hasASTConsumer()) 564 goto failure; 565 566 return true; 567 } 568 569 if (!CI.hasVirtualFileSystem()) { 570 if (IntrusiveRefCntPtr<vfs::FileSystem> VFS = 571 createVFSFromCompilerInvocation(CI.getInvocation(), 572 CI.getDiagnostics())) 573 CI.setVirtualFileSystem(VFS); 574 else 575 goto failure; 576 } 577 578 // Set up the file and source managers, if needed. 579 if (!CI.hasFileManager()) 580 CI.createFileManager(); 581 if (!CI.hasSourceManager()) 582 CI.createSourceManager(CI.getFileManager()); 583 584 // Set up embedding for any specified files. Do this before we load any 585 // source files, including the primary module map for the compilation. 586 for (const auto &F : CI.getFrontendOpts().ModulesEmbedFiles) { 587 if (const auto *FE = CI.getFileManager().getFile(F, /*openFile*/true)) 588 CI.getSourceManager().setFileIsTransient(FE); 589 else 590 CI.getDiagnostics().Report(diag::err_modules_embed_file_not_found) << F; 591 } 592 if (CI.getFrontendOpts().ModulesEmbedAllFiles) 593 CI.getSourceManager().setAllFilesAreTransient(true); 594 595 // IR files bypass the rest of initialization. 596 if (Input.getKind().getLanguage() == InputKind::LLVM_IR) { 597 assert(hasIRSupport() && 598 "This action does not have IR file support!"); 599 600 // Inform the diagnostic client we are processing a source file. 601 CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), nullptr); 602 HasBegunSourceFile = true; 603 604 // Initialize the action. 605 if (!BeginSourceFileAction(CI, InputFile)) 606 goto failure; 607 608 // Initialize the main file entry. 609 if (!CI.InitializeSourceManager(CurrentInput)) 610 goto failure; 611 612 return true; 613 } 614 615 // If the implicit PCH include is actually a directory, rather than 616 // a single file, search for a suitable PCH file in that directory. 617 if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { 618 FileManager &FileMgr = CI.getFileManager(); 619 PreprocessorOptions &PPOpts = CI.getPreprocessorOpts(); 620 StringRef PCHInclude = PPOpts.ImplicitPCHInclude; 621 std::string SpecificModuleCachePath = CI.getSpecificModuleCachePath(); 622 if (const DirectoryEntry *PCHDir = FileMgr.getDirectory(PCHInclude)) { 623 std::error_code EC; 624 SmallString<128> DirNative; 625 llvm::sys::path::native(PCHDir->getName(), DirNative); 626 bool Found = false; 627 vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem(); 628 for (vfs::directory_iterator Dir = FS.dir_begin(DirNative, EC), DirEnd; 629 Dir != DirEnd && !EC; Dir.increment(EC)) { 630 // Check whether this is an acceptable AST file. 631 if (ASTReader::isAcceptableASTFile( 632 Dir->getName(), FileMgr, CI.getPCHContainerReader(), 633 CI.getLangOpts(), CI.getTargetOpts(), CI.getPreprocessorOpts(), 634 SpecificModuleCachePath)) { 635 PPOpts.ImplicitPCHInclude = Dir->getName(); 636 Found = true; 637 break; 638 } 639 } 640 641 if (!Found) { 642 CI.getDiagnostics().Report(diag::err_fe_no_pch_in_dir) << PCHInclude; 643 goto failure; 644 } 645 } 646 } 647 648 // Set up the preprocessor if needed. When parsing model files the 649 // preprocessor of the original source is reused. 650 if (!isModelParsingAction()) 651 CI.createPreprocessor(getTranslationUnitKind()); 652 653 // Inform the diagnostic client we are processing a source file. 654 CI.getDiagnosticClient().BeginSourceFile(CI.getLangOpts(), 655 &CI.getPreprocessor()); 656 HasBegunSourceFile = true; 657 658 // Initialize the main file entry. 659 if (!CI.InitializeSourceManager(Input)) 660 goto failure; 661 662 // For module map files, we first parse the module map and synthesize a 663 // "<module-includes>" buffer before more conventional processing. 664 if (Input.getKind().getFormat() == InputKind::ModuleMap) { 665 CI.getLangOpts().setCompilingModule(LangOptions::CMK_ModuleMap); 666 667 unsigned OffsetToContents; 668 if (loadModuleMapForModuleBuild(CI, Input.getFile(), Input.isSystem(), 669 Input.isPreprocessed(), OffsetToContents)) 670 goto failure; 671 672 auto *CurrentModule = prepareToBuildModule(CI, Input.getFile()); 673 if (!CurrentModule) 674 goto failure; 675 676 if (OffsetToContents) 677 // If the module contents are in the same file, skip to them. 678 CI.getPreprocessor().setSkipMainFilePreamble(OffsetToContents, true); 679 else { 680 // Otherwise, convert the module description to a suitable input buffer. 681 auto Buffer = getInputBufferForModule(CI, CurrentModule); 682 if (!Buffer) 683 goto failure; 684 685 // Reinitialize the main file entry to refer to the new input. 686 if (!CI.InitializeSourceManager(FrontendInputFile( 687 Buffer.release(), Input.getKind().withFormat(InputKind::Source), 688 CurrentModule->IsSystem))) 689 goto failure; 690 } 691 } 692 693 // Initialize the action. 694 if (!BeginSourceFileAction(CI, InputFile)) 695 goto failure; 696 697 // Create the AST context and consumer unless this is a preprocessor only 698 // action. 699 if (!usesPreprocessorOnly()) { 700 // Parsing a model file should reuse the existing ASTContext. 701 if (!isModelParsingAction()) 702 CI.createASTContext(); 703 704 // For preprocessed files, check if the first line specifies the original 705 // source file name with a linemarker. 706 std::string PresumedInputFile = InputFile; 707 if (Input.isPreprocessed()) 708 ReadOriginalFileName(CI, PresumedInputFile); 709 710 std::unique_ptr<ASTConsumer> Consumer = 711 CreateWrappedASTConsumer(CI, PresumedInputFile); 712 if (!Consumer) 713 goto failure; 714 715 // FIXME: should not overwrite ASTMutationListener when parsing model files? 716 if (!isModelParsingAction()) 717 CI.getASTContext().setASTMutationListener(Consumer->GetASTMutationListener()); 718 719 if (!CI.getPreprocessorOpts().ChainedIncludes.empty()) { 720 // Convert headers to PCH and chain them. 721 IntrusiveRefCntPtr<ExternalSemaSource> source, FinalReader; 722 source = createChainedIncludesSource(CI, FinalReader); 723 if (!source) 724 goto failure; 725 CI.setModuleManager(static_cast<ASTReader *>(FinalReader.get())); 726 CI.getASTContext().setExternalSource(source); 727 } else if (CI.getLangOpts().Modules || 728 !CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { 729 // Use PCM or PCH. 730 assert(hasPCHSupport() && "This action does not have PCH support!"); 731 ASTDeserializationListener *DeserialListener = 732 Consumer->GetASTDeserializationListener(); 733 bool DeleteDeserialListener = false; 734 if (CI.getPreprocessorOpts().DumpDeserializedPCHDecls) { 735 DeserialListener = new DeserializedDeclsDumper(DeserialListener, 736 DeleteDeserialListener); 737 DeleteDeserialListener = true; 738 } 739 if (!CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn.empty()) { 740 DeserialListener = new DeserializedDeclsChecker( 741 CI.getASTContext(), 742 CI.getPreprocessorOpts().DeserializedPCHDeclsToErrorOn, 743 DeserialListener, DeleteDeserialListener); 744 DeleteDeserialListener = true; 745 } 746 if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { 747 CI.createPCHExternalASTSource( 748 CI.getPreprocessorOpts().ImplicitPCHInclude, 749 CI.getPreprocessorOpts().DisablePCHValidation, 750 CI.getPreprocessorOpts().AllowPCHWithCompilerErrors, DeserialListener, 751 DeleteDeserialListener); 752 if (!CI.getASTContext().getExternalSource()) 753 goto failure; 754 } 755 // If modules are enabled, create the module manager before creating 756 // any builtins, so that all declarations know that they might be 757 // extended by an external source. 758 if (CI.getLangOpts().Modules || !CI.hasASTContext() || 759 !CI.getASTContext().getExternalSource()) { 760 CI.createModuleManager(); 761 CI.getModuleManager()->setDeserializationListener(DeserialListener, 762 DeleteDeserialListener); 763 } 764 } 765 766 CI.setASTConsumer(std::move(Consumer)); 767 if (!CI.hasASTConsumer()) 768 goto failure; 769 } 770 771 // Initialize built-in info as long as we aren't using an external AST 772 // source. 773 if (CI.getLangOpts().Modules || !CI.hasASTContext() || 774 !CI.getASTContext().getExternalSource()) { 775 Preprocessor &PP = CI.getPreprocessor(); 776 PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(), 777 PP.getLangOpts()); 778 } else { 779 // FIXME: If this is a problem, recover from it by creating a multiplex 780 // source. 781 assert((!CI.getLangOpts().Modules || CI.getModuleManager()) && 782 "modules enabled but created an external source that " 783 "doesn't support modules"); 784 } 785 786 // If we were asked to load any module map files, do so now. 787 for (const auto &Filename : CI.getFrontendOpts().ModuleMapFiles) { 788 if (auto *File = CI.getFileManager().getFile(Filename)) 789 CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile( 790 File, /*IsSystem*/false); 791 else 792 CI.getDiagnostics().Report(diag::err_module_map_not_found) << Filename; 793 } 794 795 // If we were asked to load any module files, do so now. 796 for (const auto &ModuleFile : CI.getFrontendOpts().ModuleFiles) 797 if (!CI.loadModuleFile(ModuleFile)) 798 goto failure; 799 800 // If there is a layout overrides file, attach an external AST source that 801 // provides the layouts from that file. 802 if (!CI.getFrontendOpts().OverrideRecordLayoutsFile.empty() && 803 CI.hasASTContext() && !CI.getASTContext().getExternalSource()) { 804 IntrusiveRefCntPtr<ExternalASTSource> 805 Override(new LayoutOverrideSource( 806 CI.getFrontendOpts().OverrideRecordLayoutsFile)); 807 CI.getASTContext().setExternalSource(Override); 808 } 809 810 return true; 811 812 // If we failed, reset state since the client will not end up calling the 813 // matching EndSourceFile(). 814 failure: 815 if (isCurrentFileAST()) { 816 CI.setASTContext(nullptr); 817 CI.setPreprocessor(nullptr); 818 CI.setSourceManager(nullptr); 819 CI.setFileManager(nullptr); 820 } 821 822 if (HasBegunSourceFile) 823 CI.getDiagnosticClient().EndSourceFile(); 824 CI.clearOutputFiles(/*EraseFiles=*/true); 825 CI.getLangOpts().setCompilingModule(LangOptions::CMK_None); 826 setCurrentInput(FrontendInputFile()); 827 setCompilerInstance(nullptr); 828 return false; 829 } 830 831 bool FrontendAction::Execute() { 832 CompilerInstance &CI = getCompilerInstance(); 833 834 if (CI.hasFrontendTimer()) { 835 llvm::TimeRegion Timer(CI.getFrontendTimer()); 836 ExecuteAction(); 837 } 838 else ExecuteAction(); 839 840 // If we are supposed to rebuild the global module index, do so now unless 841 // there were any module-build failures. 842 if (CI.shouldBuildGlobalModuleIndex() && CI.hasFileManager() && 843 CI.hasPreprocessor()) { 844 StringRef Cache = 845 CI.getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 846 if (!Cache.empty()) 847 GlobalModuleIndex::writeIndex(CI.getFileManager(), 848 CI.getPCHContainerReader(), Cache); 849 } 850 851 return true; 852 } 853 854 void FrontendAction::EndSourceFile() { 855 CompilerInstance &CI = getCompilerInstance(); 856 857 // Inform the diagnostic client we are done with this source file. 858 CI.getDiagnosticClient().EndSourceFile(); 859 860 // Inform the preprocessor we are done. 861 if (CI.hasPreprocessor()) 862 CI.getPreprocessor().EndSourceFile(); 863 864 // Finalize the action. 865 EndSourceFileAction(); 866 867 // Sema references the ast consumer, so reset sema first. 868 // 869 // FIXME: There is more per-file stuff we could just drop here? 870 bool DisableFree = CI.getFrontendOpts().DisableFree; 871 if (DisableFree) { 872 CI.resetAndLeakSema(); 873 CI.resetAndLeakASTContext(); 874 BuryPointer(CI.takeASTConsumer().get()); 875 } else { 876 CI.setSema(nullptr); 877 CI.setASTContext(nullptr); 878 CI.setASTConsumer(nullptr); 879 } 880 881 if (CI.getFrontendOpts().ShowStats) { 882 llvm::errs() << "\nSTATISTICS FOR '" << getCurrentFile() << "':\n"; 883 CI.getPreprocessor().PrintStats(); 884 CI.getPreprocessor().getIdentifierTable().PrintStats(); 885 CI.getPreprocessor().getHeaderSearchInfo().PrintStats(); 886 CI.getSourceManager().PrintStats(); 887 llvm::errs() << "\n"; 888 } 889 890 // Cleanup the output streams, and erase the output files if instructed by the 891 // FrontendAction. 892 CI.clearOutputFiles(/*EraseFiles=*/shouldEraseOutputFiles()); 893 894 if (isCurrentFileAST()) { 895 if (DisableFree) { 896 CI.resetAndLeakPreprocessor(); 897 CI.resetAndLeakSourceManager(); 898 CI.resetAndLeakFileManager(); 899 } else { 900 CI.setPreprocessor(nullptr); 901 CI.setSourceManager(nullptr); 902 CI.setFileManager(nullptr); 903 } 904 } 905 906 setCompilerInstance(nullptr); 907 setCurrentInput(FrontendInputFile()); 908 CI.getLangOpts().setCompilingModule(LangOptions::CMK_None); 909 } 910 911 bool FrontendAction::shouldEraseOutputFiles() { 912 return getCompilerInstance().getDiagnostics().hasErrorOccurred(); 913 } 914 915 //===----------------------------------------------------------------------===// 916 // Utility Actions 917 //===----------------------------------------------------------------------===// 918 919 void ASTFrontendAction::ExecuteAction() { 920 CompilerInstance &CI = getCompilerInstance(); 921 if (!CI.hasPreprocessor()) 922 return; 923 924 // FIXME: Move the truncation aspect of this into Sema, we delayed this till 925 // here so the source manager would be initialized. 926 if (hasCodeCompletionSupport() && 927 !CI.getFrontendOpts().CodeCompletionAt.FileName.empty()) 928 CI.createCodeCompletionConsumer(); 929 930 // Use a code completion consumer? 931 CodeCompleteConsumer *CompletionConsumer = nullptr; 932 if (CI.hasCodeCompletionConsumer()) 933 CompletionConsumer = &CI.getCodeCompletionConsumer(); 934 935 if (!CI.hasSema()) 936 CI.createSema(getTranslationUnitKind(), CompletionConsumer); 937 938 ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats, 939 CI.getFrontendOpts().SkipFunctionBodies); 940 } 941 942 void PluginASTAction::anchor() { } 943 944 std::unique_ptr<ASTConsumer> 945 PreprocessorFrontendAction::CreateASTConsumer(CompilerInstance &CI, 946 StringRef InFile) { 947 llvm_unreachable("Invalid CreateASTConsumer on preprocessor action!"); 948 } 949 950 std::unique_ptr<ASTConsumer> 951 WrapperFrontendAction::CreateASTConsumer(CompilerInstance &CI, 952 StringRef InFile) { 953 return WrappedAction->CreateASTConsumer(CI, InFile); 954 } 955 bool WrapperFrontendAction::BeginInvocation(CompilerInstance &CI) { 956 return WrappedAction->BeginInvocation(CI); 957 } 958 bool WrapperFrontendAction::BeginSourceFileAction(CompilerInstance &CI, 959 StringRef Filename) { 960 WrappedAction->setCurrentInput(getCurrentInput()); 961 WrappedAction->setCompilerInstance(&CI); 962 auto Ret = WrappedAction->BeginSourceFileAction(CI, Filename); 963 // BeginSourceFileAction may change CurrentInput, e.g. during module builds. 964 setCurrentInput(WrappedAction->getCurrentInput()); 965 return Ret; 966 } 967 void WrapperFrontendAction::ExecuteAction() { 968 WrappedAction->ExecuteAction(); 969 } 970 void WrapperFrontendAction::EndSourceFileAction() { 971 WrappedAction->EndSourceFileAction(); 972 } 973 974 bool WrapperFrontendAction::usesPreprocessorOnly() const { 975 return WrappedAction->usesPreprocessorOnly(); 976 } 977 TranslationUnitKind WrapperFrontendAction::getTranslationUnitKind() { 978 return WrappedAction->getTranslationUnitKind(); 979 } 980 bool WrapperFrontendAction::hasPCHSupport() const { 981 return WrappedAction->hasPCHSupport(); 982 } 983 bool WrapperFrontendAction::hasASTFileSupport() const { 984 return WrappedAction->hasASTFileSupport(); 985 } 986 bool WrapperFrontendAction::hasIRSupport() const { 987 return WrappedAction->hasIRSupport(); 988 } 989 bool WrapperFrontendAction::hasCodeCompletionSupport() const { 990 return WrappedAction->hasCodeCompletionSupport(); 991 } 992 993 WrapperFrontendAction::WrapperFrontendAction( 994 std::unique_ptr<FrontendAction> WrappedAction) 995 : WrappedAction(std::move(WrappedAction)) {} 996 997