12a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===--- CompilerInstance.cpp ---------------------------------------------===// 22a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 32a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// The LLVM Compiler Infrastructure 42a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 52a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// This file is distributed under the University of Illinois Open Source 62a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// License. See LICENSE.TXT for details. 72a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar// 82a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar//===----------------------------------------------------------------------===// 92a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 102a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Frontend/CompilerInstance.h" 1112ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar#include "clang/AST/ASTConsumer.h" 125eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar#include "clang/AST/ASTContext.h" 1393ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor#include "clang/AST/Decl.h" 142a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/Diagnostic.h" 1516b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/FileManager.h" 1616b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar#include "clang/Basic/SourceManager.h" 172a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar#include "clang/Basic/TargetInfo.h" 180397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar#include "clang/Basic/Version.h" 19c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "clang/Config/config.h" 204e85b8ae413fa00fa42aa3e625c2db3b1932f8d3David Blaikie#include "clang/Frontend/ChainedDiagnosticConsumer.h" 210397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar#include "clang/Frontend/FrontendAction.h" 2221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor#include "clang/Frontend/FrontendActions.h" 23c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 249df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar#include "clang/Frontend/LogDiagnosticPrinter.h" 257800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "clang/Frontend/SerializedDiagnosticPrinter.h" 260fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 2722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Frontend/Utils.h" 2855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/VerifyDiagnosticConsumer.h" 2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearch.h" 3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PTHManager.h" 3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 32c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Sema/CodeCompleteConsumer.h" 3355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h" 3455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Serialization/ASTReader.h" 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Serialization/GlobalModuleIndex.h" 3695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor#include "llvm/ADT/Statistic.h" 3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/CrashRecoveryContext.h" 38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/Support/Errc.h" 3955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/FileSystem.h" 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 4152f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor#include "llvm/Support/LockFileManager.h" 4255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MemoryBuffer.h" 4303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 4403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 4503013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Signals.h" 4655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Timer.h" 4755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 48d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor#include <sys/stat.h> 49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include <system_error> 5087ab066c70006d998a6d358d272e00c8345b0f26Douglas Gregor#include <time.h> 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility> 522bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor 532a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbarusing namespace clang; 542a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarCompilerInstance::CompilerInstance( 5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::shared_ptr<PCHContainerOperations> PCHContainerOps, 5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bool BuildingModule) 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : ModuleLoader(BuildingModule), Invocation(new CompilerInvocation()), 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleManager(nullptr), 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ThePCHContainerOperations(std::move(PCHContainerOps)), 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BuildGlobalModuleIndex(false), HaveFullGlobalModuleIndex(false), 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleBuildFailed(false) {} 632a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 642a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::~CompilerInstance() { 65ac447fce02d119fb70f0aab885d836dea43e7f26Benjamin Kramer assert(OutputFiles.empty() && "Still output files in flight?"); 6642e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar} 6742e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar 686228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbarvoid CompilerInstance::setInvocation(CompilerInvocation *Value) { 694f32786ac45210143654390177105eb749b614e9Ted Kremenek Invocation = Value; 706228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar} 716228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar 72f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregorbool CompilerInstance::shouldBuildGlobalModuleIndex() const { 731a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return (BuildGlobalModuleIndex || 74ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor (ModuleManager && ModuleManager->isGlobalIndexUnavailable() && 75ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor getFrontendOpts().GenerateGlobalModuleIndex)) && 761a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !ModuleBuildFailed; 77f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor} 78f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor 79d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikievoid CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) { 8028019772db70d4547be05a042eb950bc910f134fDouglas Gregor Diagnostics = Value; 818a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 828a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; } 8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; } 858a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 868a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setFileManager(FileManager *Value) { 874f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr = Value; 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Value) 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VirtualFileSystem = Value->getVirtualFileSystem(); 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VirtualFileSystem.reset(); 928a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 938a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 94a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumivoid CompilerInstance::setSourceManager(SourceManager *Value) { 954f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr = Value; 968a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 978a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 984f32786ac45210143654390177105eb749b614e9Ted Kremenekvoid CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; } 998a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid CompilerInstance::setASTContext(ASTContext *Value) { 10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Context = Value; 10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Context && Consumer) 10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getASTConsumer().Initialize(getASTContext()); 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 10612ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar 107f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregorvoid CompilerInstance::setSema(Sema *S) { 108f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(S); 109f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 110f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) { 112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Consumer = std::move(Value); 11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Context && Consumer) 11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getASTConsumer().Initialize(getASTContext()); 1168a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 1178a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 1188a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) { 1198a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar CompletionConsumer.reset(Value); 1208a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::unique_ptr<Sema> CompilerInstance::takeSema() { 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return std::move(TheSema); 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 126651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesIntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const { 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ModuleManager; 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) { 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleManager = std::move(Reader); 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1328a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 133c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstd::shared_ptr<ModuleDependencyCollector> 134c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesCompilerInstance::getModuleDepCollector() const { 135c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ModuleDepCollector; 136c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 137c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid CompilerInstance::setModuleDepCollector( 139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::shared_ptr<ModuleDependencyCollector> Collector) { 1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ModuleDepCollector = std::move(Collector); 141c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 142c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1430fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Diagnostics 14402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts, 145b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar const CodeGenOptions *CodeGenOpts, 146d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::error_code EC; 148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<raw_ostream> StreamOwner; 1495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream *OS = &llvm::errs(); 15002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (DiagOpts->DiagnosticLogFile != "-") { 1519df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Create the output stream. 152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto FileOS = llvm::make_unique<llvm::raw_fd_ostream>( 153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DiagOpts->DiagnosticLogFile, EC, 154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::fs::F_Append | llvm::sys::fs::F_Text); 155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (EC) { 1569df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar Diags.Report(diag::warn_fe_cc_log_diagnostics_failure) 157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << DiagOpts->DiagnosticLogFile << EC.message(); 1589df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } else { 1599df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar FileOS->SetUnbuffered(); 160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS = FileOS.get(); 161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StreamOwner = std::move(FileOS); 1629df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } 1639df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } 1649df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar 1659df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Chain in the diagnostic client which will log the diagnostics. 166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto Logger = llvm::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts, 167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::move(StreamOwner)); 168b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar if (CodeGenOpts) 169b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags); 170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(Diags.ownsClient()); 171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.setClient( 172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger))); 1739df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar} 1749df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar 17502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts, 1767800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek DiagnosticsEngine &Diags, 1777800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek StringRef OutputFile) { 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto SerializedConsumer = 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines clang::serialized_diags::create(OutputFile, DiagOpts); 180d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola 181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Diags.ownsClient()) { 182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.setClient(new ChainedDiagnosticConsumer( 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.takeClient(), std::move(SerializedConsumer))); 184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.setClient(new ChainedDiagnosticConsumer( 186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.getClient(), std::move(SerializedConsumer))); 1877800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek } 1887800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 1897800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 190d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silvavoid CompilerInstance::createDiagnostics(DiagnosticConsumer *Client, 191cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor bool ShouldOwnClient) { 192d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva Diagnostics = createDiagnostics(&getDiagnosticOpts(), Client, 193cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor ShouldOwnClient, &getCodeGenOpts()); 1940fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 1950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 196c93dc7889644293e318e19d82830ea2acc45b678Dylan NoblesmithIntrusiveRefCntPtr<DiagnosticsEngine> 19702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas GregorCompilerInstance::createDiagnostics(DiagnosticOptions *Opts, 19878ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie DiagnosticConsumer *Client, 19978243658c533168d51fd076fba328437932ba6f1Douglas Gregor bool ShouldOwnClient, 200b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar const CodeGenOptions *CodeGenOpts) { 201c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 202c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> 20302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Diags(new DiagnosticsEngine(DiagID, Opts)); 204221c7211c507482a91e97ede1bf6cf65a456ff67Daniel Dunbar 2050fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Create the diagnostic client for reporting errors or for 2060fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // implementing -verify. 207aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor if (Client) { 208cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor Diags->setClient(Client, ShouldOwnClient); 209aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor } else 210e47be3e9682e82da15059006f43c7f3c021e4fffDouglas Gregor Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); 211f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar 212f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar // Chain in -verify checker, if requested. 21302c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (Opts->VerifyDiagnostics) 214621bc69624599da62abd9bc9e5edd8a63ac99fe6David Blaikie Diags->setClient(new VerifyDiagnosticConsumer(*Diags)); 2150fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 2169df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Chain in -diagnostic-log-file dumper, if requested. 21702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticLogFile.empty()) 218b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags); 219a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 22002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticSerializationFile.empty()) 2217800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek SetupSerializedDiagnostics(Opts, *Diags, 22202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Opts->DiagnosticSerializationFile); 2237800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 2240fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Configure our handling of diagnostics. 22502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor ProcessWarningOptions(*Diags, *Opts); 2260fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 22728019772db70d4547be05a042eb950bc910f134fDouglas Gregor return Diags; 2280fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 2290fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 2300fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager 2310fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 23216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() { 233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!hasVirtualFileSystem()) { 234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // TODO: choose the virtual file system based on the CompilerInvocation. 235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines setVirtualFileSystem(vfs::getRealFileSystem()); 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FileMgr = new FileManager(getFileSystemOpts(), VirtualFileSystem); 23816b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 23916b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 2400fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager 2410fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 24239b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattnervoid CompilerInstance::createSourceManager(FileManager &FileMgr) { 2434f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr = new SourceManager(getDiagnostics(), FileMgr); 24416b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 24522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 246c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Initialize the remapping of files to alternative contents, e.g., 247c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// those specified through other files. 248c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic void InitializeFileRemapping(DiagnosticsEngine &Diags, 249c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceManager &SourceMgr, 250c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FileManager &FileMgr, 251c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const PreprocessorOptions &InitOpts) { 252c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Remap files in the source manager (with buffers). 253c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines for (const auto &RB : InitOpts.RemappedFileBuffers) { 254c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Create the file entry for the file that we're mapping from. 255c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const FileEntry *FromFile = 256c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FileMgr.getVirtualFile(RB.first, RB.second->getBufferSize(), 0); 257c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!FromFile) { 258c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(diag::err_fe_remap_missing_from_file) << RB.first; 259c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!InitOpts.RetainRemappedFileBuffers) 260c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines delete RB.second; 261c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines continue; 262c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 263c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 264c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Override the contents of the "from" file with the contents of 265c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // the "to" file. 266c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceMgr.overrideFileContents(FromFile, RB.second, 267c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitOpts.RetainRemappedFileBuffers); 268c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 269c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 270c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Remap files in the source manager (with other files). 271c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines for (const auto &RF : InitOpts.RemappedFiles) { 272c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Find the file that we're mapping to. 273c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const FileEntry *ToFile = FileMgr.getFile(RF.second); 274c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!ToFile) { 275c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(diag::err_fe_remap_missing_to_file) << RF.first << RF.second; 276c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines continue; 277c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 278c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 279c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Create the file entry for the file that we're mapping from. 280c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines const FileEntry *FromFile = 281c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines FileMgr.getVirtualFile(RF.first, ToFile->getSize(), 0); 282c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!FromFile) { 283c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(diag::err_fe_remap_missing_from_file) << RF.first; 284c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines continue; 285c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 286c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 287c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Override the contents of the "from" file with the contents of 288c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // the "to" file. 289c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceMgr.overrideFileContents(FromFile, ToFile); 290c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceMgr.setOverridenFilesKeepOriginalName( 293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitOpts.RemappedFilesKeepOriginalName); 294c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 295c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 2960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor 2970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { 2996aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 300a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 30122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create a PTH manager if we are using some form of a token cache. 3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PTHManager *PTHMgr = nullptr; 303049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar if (!PPOpts.TokenCache.empty()) 3046aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics()); 305a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 30622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create the Preprocessor. 307c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor HeaderSearch *HeaderInfo = new HeaderSearch(&getHeaderSearchOpts(), 308ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek getSourceManager(), 30951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor getDiagnostics(), 310dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor getLangOpts(), 311dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor &getTarget()); 3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PP = new Preprocessor(&getPreprocessorOpts(), getDiagnostics(), getLangOpts(), 3136aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor getSourceManager(), *HeaderInfo, *this, PTHMgr, 3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*OwnsHeaderSearch=*/true, TUKind); 31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP->Initialize(getTarget(), getAuxTarget()); 316a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 31722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Note that this is different then passing PTHMgr to Preprocessor's ctor. 31822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // That argument is used as the IdentifierInfoLookup argument to 31922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // IdentifierTable's ctor. 32022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (PTHMgr) { 3216aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr->setPreprocessor(&*PP); 32222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP->setPTHManager(PTHMgr); 32322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar } 324a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 32594dc8f640ebea52241412512ed48601626edbc58Douglas Gregor if (PPOpts.DetailedRecord) 32637ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis PP->createPreprocessingRecord(); 327a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Apply remappings to the source manager. 329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines InitializeFileRemapping(PP->getDiagnostics(), PP->getSourceManager(), 330c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines PP->getFileManager(), PPOpts); 331c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Predefine macros and configure the preprocessor. 33387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar InitializePreprocessor(*PP, PPOpts, getPCHContainerReader(), 33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFrontendOpts()); 335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Initialize the header search object. 337c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ApplyHeaderSearchOptions(PP->getHeaderSearchInfo(), getHeaderSearchOpts(), 338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines PP->getLangOpts(), PP->getTargetInfo().getTriple()); 339a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 34074c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP); 34174c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (PP->getLangOpts().Modules && PP->getLangOpts().ImplicitModules) 34358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar PP->getHeaderSearchInfo().setModuleCachePath(getSpecificModuleCachePath()); 344a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 34522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Handle generating dependencies, if requested. 3466aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const DependencyOutputOptions &DepOpts = getDependencyOutputOpts(); 34722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!DepOpts.OutputFile.empty()) 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheDependencyFileGenerator.reset( 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DependencyFileGenerator::CreateAndAttachToPreprocessor(*PP, DepOpts)); 350773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor if (!DepOpts.DOTOutputFile.empty()) 351773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile, 352c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor getHeaderSearchOpts().Sysroot); 353a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 354c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If we don't have a collector, but we are collecting module dependencies, 355c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // then we're the top level compiler instance and need to create one. 3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) { 357c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ModuleDepCollector = std::make_shared<ModuleDependencyCollector>( 358c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DepOpts.ModuleDependencyOutputDir); 3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ModuleDepCollector) 3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addDependencyCollector(ModuleDepCollector); 3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (auto &Listener : DependencyCollectors) 3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Listener->attachToPreprocessor(*PP); 366708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg 367eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar // Handle generating header include information, if requested. 368eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar if (DepOpts.ShowHeaderIncludes) 3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AttachHeaderIncludeGen(*PP, DepOpts); 370b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (!DepOpts.HeaderIncludeOutputFile.empty()) { 3715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef OutputPath = DepOpts.HeaderIncludeOutputFile; 372b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (OutputPath == "-") 373b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar OutputPath = ""; 3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AttachHeaderIncludeGen(*PP, DepOpts, 37587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*ShowAllHeaders=*/true, OutputPath, 376da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar /*ShowDepth=*/false); 377b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar } 378708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg 379708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg if (DepOpts.PrintShowIncludes) { 3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar AttachHeaderIncludeGen(*PP, DepOpts, 3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*ShowAllHeaders=*/true, /*OutputPath=*/"", 382708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg /*ShowDepth=*/true, /*MSStyle=*/true); 383708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg } 38422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 3855eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 3860e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstd::string CompilerInstance::getSpecificModuleCachePath() { 3870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Set up the module path, including the hash for the 3880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // module-creation options. 38987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SmallString<256> SpecificModuleCache(getHeaderSearchOpts().ModuleCachePath); 39087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!SpecificModuleCache.empty() && !getHeaderSearchOpts().DisableModuleHash) 3910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::sys::path::append(SpecificModuleCache, 3920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getInvocation().getModuleHash()); 3930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return SpecificModuleCache.str(); 3940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3965eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 3975eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 3985eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 3995eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 40087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *Context = new ASTContext(getLangOpts(), PP.getSourceManager(), 40187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP.getIdentifierTable(), PP.getSelectorTable(), 40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP.getBuiltinInfo()); 40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Context->InitBuiltinTypes(getTarget(), getAuxTarget()); 40487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar setASTContext(Context); 4055eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 4060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 4070f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 4080f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CompilerInstance::createPCHExternalASTSource( 4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Path, bool DisablePCHValidation, bool AllowPCHWithCompilerErrors, 4116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *DeserializationListener, bool OwnDeserializationListener) { 4121d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; 4130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ModuleManager = createPCHExternalASTSource( 4146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation, 4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AllowPCHWithCompilerErrors, getPreprocessor(), getASTContext(), 41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getPCHContainerReader(), 41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFrontendOpts().ModuleFileExtensions, 41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeserializationListener, 41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar OwnDeserializationListener, Preamble, 4206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getFrontendOpts().UseGlobalModuleIndex); 4210f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 4220f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 4230e2c34f92f00628d48968dfea096d36381f494cbStephen HinesIntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource( 42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef Path, StringRef Sysroot, bool DisablePCHValidation, 4256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context, 42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const PCHContainerReader &PCHContainerRdr, 42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *DeserializationListener, bool OwnDeserializationListener, 4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Preamble, bool UseGlobalModuleIndex) { 430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts(); 431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar IntrusiveRefCntPtr<ASTReader> Reader(new ASTReader( 43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP, Context, PCHContainerRdr, Extensions, 43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Sysroot.empty() ? "" : Sysroot.data(), DisablePCHValidation, 43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ false, 43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HSOpts.ModulesValidateSystemHeaders, UseGlobalModuleIndex)); 4370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 4380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // We need the external source to be set up before we read the AST, because 4390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // eagerly-deserialized declarations may use it. 4400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Context.setExternalSource(Reader.get()); 4410f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 442ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl Reader->setDeserializationListener( 4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static_cast<ASTDeserializationListener *>(DeserializationListener), 4446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*TakeOwnership=*/OwnDeserializationListener); 445a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi switch (Reader->ReadAST(Path, 446a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Preamble ? serialization::MK_Preamble 44738295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor : serialization::MK_PCH, 448958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis SourceLocation(), 44938295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor ASTReader::ARR_None)) { 450c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Success: 4510f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 4520f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 4530f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 4540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Reader; 4550f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 456c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Failure: 4570f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 4580f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 4590f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 460677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: 4614825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::OutOfDate: 4624825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 4634825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 4644825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 4650f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 4660f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 4670f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 4680f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 4690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Context.setExternalSource(nullptr); 4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 4710f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 472c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 473c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 474c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 475a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool EnableCodeCompletion(Preprocessor &PP, 4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StringRef Filename, 4771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Line, 4781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Column) { 4791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Tell the source manager to chop off the given file at a specific 4801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // line and column. 48139b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *Entry = PP.getFileManager().getFile(Filename); 4821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Entry) { 4831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 4841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor << Filename; 4851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return true; 4861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 4871abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 4881abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Truncate the named file at the given line/column. 4891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.SetCodeCompletionPoint(Entry, Line, Column); 4901abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return false; 4911abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 4921abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 493c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 494c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 4951abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) { 4969bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer( 4971abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor createCodeCompletionConsumer(getPreprocessor(), 4981abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.FileName, Loc.Line, Loc.Column, 499d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko getFrontendOpts().CodeCompleteOpts, 5001abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::outs())); 5011abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) 5021abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return; 5031abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, 5041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.Line, Loc.Column)) { 5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines setCodeCompletionConsumer(nullptr); 506c3d43b783dfb1a1502aa8b31ab1985cf237b1f77Douglas Gregor return; 5071abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 5082b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 5092b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (CompletionConsumer->isOutputBinary() && 510a603569515eea06e54e6e041b1c690d33086f375Rafael Espindola llvm::sys::ChangeStdoutToBinary()) { 5112b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary); 5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines setCodeCompletionConsumer(nullptr); 5132b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 514c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 515c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 516f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnamvoid CompilerInstance::createFrontendTimer() { 51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FrontendTimerGroup.reset(new llvm::TimerGroup("Clang front-end time report")); 51887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FrontendTimer.reset( 51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar new llvm::Timer("Clang front-end timer", *FrontendTimerGroup)); 520f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam} 521f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam 522c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 523c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 52487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar StringRef Filename, 525c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 526c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 527d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const CodeCompleteOptions &Opts, 5285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS) { 5291abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableCodeCompletion(PP, Filename, Line, Column)) 5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 531c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 532c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 533d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return new PrintingCodeCompleteConsumer(Opts, OS); 534c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 535a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 536467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorvoid CompilerInstance::createSema(TranslationUnitKind TUKind, 537f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor CodeCompleteConsumer *CompletionConsumer) { 538f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(), 539467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUKind, CompletionConsumer)); 540f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 541f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 542a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files 543a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 54458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid CompilerInstance::addOutputFile(OutputFile &&OutFile) { 545dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis assert(OutFile.OS && "Attempt to add empty stream to output list!"); 54658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar OutputFiles.push_back(std::move(OutFile)); 547a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 548a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 549e51dd7be67808d52c80c09b832d875e9655ce6e0Kovarththanan Rajaratnamvoid CompilerInstance::clearOutputFiles(bool EraseFiles) { 55058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar for (OutputFile &OF : OutputFiles) { 55158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // Manually close the stream before we rename it. 55258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar OF.OS.reset(); 55358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 55458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!OF.TempFilename.empty()) { 555af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (EraseFiles) { 55658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::sys::fs::remove(OF.TempFilename); 557af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson } else { 55858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar SmallString<128> NewOutFile(OF.Filename); 559af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 560389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // If '-working-directory' was passed, the output filename should be 561389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // relative to that. 5622e2468e2d2ccbb9a38fe3b6b754009af7e5d39a9Anders Carlsson FileMgr->FixupRelativePath(NewOutFile); 563c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (std::error_code ec = 56458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::sys::fs::rename(OF.TempFilename, NewOutFile)) { 565832a2aac5766dd78f113e0f03a0c62fd0eacbc97Manuel Klimek getDiagnostics().Report(diag::err_unable_to_rename_temp) 56658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar << OF.TempFilename << OF.Filename << ec.message(); 567af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 56858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::sys::fs::remove(OF.TempFilename); 569dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 570dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 57158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } else if (!OF.Filename.empty() && EraseFiles) 57258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::sys::fs::remove(OF.Filename); 573a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 574a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar } 575a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.clear(); 57658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar NonSeekStream.reset(); 577a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 578a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 57958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarraw_pwrite_stream * 58058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarCompilerInstance::createDefaultOutputFile(bool Binary, StringRef InFile, 5815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension) { 582f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return createOutputFile(getFrontendOpts().OutputFile, Binary, 583e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*RemoveFileOnSignal=*/true, InFile, Extension, 584e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*UseTemporary=*/true); 585f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 586f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesllvm::raw_null_ostream *CompilerInstance::createNullOutputFile() { 58858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar auto OS = llvm::make_unique<llvm::raw_null_ostream>(); 58958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar llvm::raw_null_ostream *Ret = OS.get(); 59058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar addOutputFile(OutputFile("", "", std::move(OS))); 59158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return Ret; 592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 593c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 59458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarraw_pwrite_stream * 59558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga NainarCompilerInstance::createOutputFile(StringRef OutputPath, bool Binary, 59658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar bool RemoveFileOnSignal, StringRef InFile, 59758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar StringRef Extension, bool UseTemporary, 59812f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories) { 599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string OutputPathName, TempPathName; 600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::error_code EC; 60158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar std::unique_ptr<raw_pwrite_stream> OS = createOutputFile( 602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OutputPath, EC, Binary, RemoveFileOnSignal, InFile, Extension, 603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines UseTemporary, CreateMissingDirectories, &OutputPathName, &TempPathName); 604f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) { 605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines getDiagnostics().Report(diag::err_fe_unable_to_open_output) << OutputPath 606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << EC.message(); 6076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 608f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 609f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 61058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar raw_pwrite_stream *Ret = OS.get(); 611f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // Add the output file -- but don't try to remove "-", since this means we are 612f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // using stdin. 613dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", 61458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar TempPathName, std::move(OS))); 615f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 61658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return Ret; 617f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 618f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 61958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstd::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile( 620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef OutputPath, std::error_code &Error, bool Binary, 621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool RemoveFileOnSignal, StringRef InFile, StringRef Extension, 622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool UseTemporary, bool CreateMissingDirectories, 623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::string *ResultPathName, std::string *TempPathName) { 62412f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar assert((!CreateMissingDirectories || UseTemporary) && 62512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar "CreateMissingDirectories is only allowed when using temporary files"); 62612f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar 627dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string OutFile, TempFile; 628f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OutputPath.empty()) { 629f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = OutputPath; 630f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (InFile == "-") { 631f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 632f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (!Extension.empty()) { 63348955f8119261c47cac564d1b6976c8f6441800aRafael Espindola SmallString<128> Path(InFile); 63448955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::path::replace_extension(Path, Extension); 635f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = Path.str(); 636f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else { 637f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 638f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 6397e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<llvm::raw_fd_ostream> OS; 6417e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis std::string OSFile; 6427e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 643375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 644375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (OutFile == "-") 645375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 646375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola else { 647375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::file_status Status; 648375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::status(OutputPath, Status); 649375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (llvm::sys::fs::exists(Status)) { 650375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Fail early if we can't write to the final destination. 65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!llvm::sys::fs::can_write(OutputPath)) { 65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Error = make_error_code(llvm::errc::operation_not_permitted); 6536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 655375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 656375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Don't use a temporary if the output is a special file. This handles 657375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // things like '-o /dev/null' 658375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::is_regular_file(Status)) 659375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 660375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 661375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 662375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 663375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 664375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 665375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Create a temporary file. 666375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola SmallString<128> TempPath; 667375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath = OutFile; 668375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath += "-%%%%%%%%"; 669375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola int fd; 670c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::error_code EC = 6713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath); 6728ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 6738ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (CreateMissingDirectories && 674abab18373808f2a179a97b00d574e306970934d7Rafael Espindola EC == llvm::errc::no_such_file_or_directory) { 6758ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Parent = llvm::sys::path::parent_path(OutputPath); 6768ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola EC = llvm::sys::fs::create_directories(Parent); 6778ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 6783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar EC = llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath); 6798ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 6808ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 6818ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 6828ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 683375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); 684375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OSFile = TempFile = TempPath.str(); 685dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 686375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // If we failed to create the temporary, fallback to writing to the file 687375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directly. This handles the corner case where we cannot write to the 688375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directory, but can write to the file. 689dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 690dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 6917e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!OS) { 6927e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis OSFile = OutFile; 693d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola OS.reset(new llvm::raw_fd_ostream( 694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OSFile, Error, 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Binary ? llvm::sys::fs::F_None : llvm::sys::fs::F_Text))); 696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Error) 6976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 6987e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis } 699f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 700dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis // Make sure the out stream file gets removed if we crash. 701ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar if (RemoveFileOnSignal) 7026f2e23b25d9be365266be43ffa1cf6f850b6027eRafael Espindola llvm::sys::RemoveFileOnSignal(OSFile); 703dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 704f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (ResultPathName) 705f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar *ResultPathName = OutFile; 706dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (TempPathName) 707dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis *TempPathName = TempFile; 708f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 70958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (!Binary || OS->supportsSeeking()) 71058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return std::move(OS); 71158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 71258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar auto B = llvm::make_unique<llvm::buffer_ostream>(*OS); 71358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar assert(!NonSeekStream); 71458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar NonSeekStream = std::move(OS); 71558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return std::move(B); 716f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 717ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 718ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar// Initialization Utilities 719ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 7208e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){ 7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return InitializeSourceManager( 7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Input, getDiagnostics(), getFileManager(), getSourceManager(), 7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar hasPreprocessor() ? &getPreprocessor().getHeaderSearchInfo() : nullptr, 7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getDependencyOutputOpts(), getFrontendOpts()); 725ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 726ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// static 7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool CompilerInstance::InitializeSourceManager( 7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FrontendInputFile &Input, DiagnosticsEngine &Diags, 7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FileManager &FileMgr, SourceManager &SourceMgr, HeaderSearch *HS, 7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DependencyOutputOptions &DepOpts, const FrontendOptions &Opts) { 7328e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis SrcMgr::CharacteristicKind 7338616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User; 7348e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis 735ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis if (Input.isBuffer()) { 736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceMgr.setMainFileID(SourceMgr.createFileID( 737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<llvm::MemoryBuffer>(Input.getBuffer()), Kind)); 73887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(SourceMgr.getMainFileID().isValid() && 739ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis "Couldn't establish MainFileID!"); 740ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis return true; 741ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis } 742ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 743ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis StringRef InputFile = Input.getFile(); 744ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 745507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis // Figure out where to get and map in the main file. 746507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis if (InputFile != "-") { 7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FileEntry *File; 7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Opts.FindPchSource.empty()) { 7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar File = FileMgr.getFile(InputFile, /*OpenFile=*/true); 7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // When building a pch file in clang-cl mode, the .h file is built as if 7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // it was included by a cc file. Since the driver doesn't know about 7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // all include search directories, the frontend must search the input 7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // file through HeaderSearch here, as if it had been included by the 7554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // cc file at Opts.FindPchSource. 7564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FileEntry *FindFile = FileMgr.getFile(Opts.FindPchSource); 7574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!FindFile) { 7584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Diags.Report(diag::err_fe_error_reading) << Opts.FindPchSource; 7594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 7604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 7614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const DirectoryLookup *UnusedCurDir; 7624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16> 7634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Includers; 7644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Includers.push_back(std::make_pair(FindFile, FindFile->getDir())); 7654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar File = HS->LookupFile(InputFile, SourceLocation(), /*isAngled=*/false, 7664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*FromDir=*/nullptr, 7674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*CurDir=*/UnusedCurDir, Includers, 7684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*SearchPath=*/nullptr, 7694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*RelativePath=*/nullptr, 7704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*RequestingModule=*/nullptr, 7714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*SuggestedModule=*/nullptr, /*SkipCache=*/true); 7724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Also add the header to /showIncludes output. 7734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (File) 7744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DepOpts.ShowIncludesPretendHeader = File->getName(); 7754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 776694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman if (!File) { 777ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading) << InputFile; 778ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 779ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 780ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar 781ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // The natural SourceManager infrastructure can't currently handle named 782ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // pipes, but we would at least like to accept them for the main 783a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // file. Detect them here, read them with the volatile flag so FileMgr will 784a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // pick up the correct size, and simply override their contents as we do for 785a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // STDIN. 786ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (File->isNamedPipe()) { 787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto MB = FileMgr.getBufferForFile(File, /*isVolatile=*/true); 788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (MB) { 789a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // Create a new virtual file that will have the correct size. 790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines File = FileMgr.getVirtualFile(InputFile, (*MB)->getBufferSize(), 0); 791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceMgr.overrideFileContents(File, std::move(*MB)); 792a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer } else { 793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.Report(diag::err_cannot_open_file) << InputFile 794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << MB.getError().message(); 795ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar return false; 796ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 797ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 798acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceMgr.setMainFileID( 8006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceMgr.createFileID(File, SourceLocation(), Kind)); 801ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } else { 802c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> SBOrErr = 803c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines llvm::MemoryBuffer::getSTDIN(); 804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (std::error_code EC = SBOrErr.getError()) { 805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Diags.Report(diag::err_fe_error_reading_stdin) << EC.message(); 806ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 807ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::unique_ptr<llvm::MemoryBuffer> SB = std::move(SBOrErr.get()); 809c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 81090d9081cacb4b0163f2c7527f666d6515257067cDan Gohman const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), 81139b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SB->getBufferSize(), 0); 8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceMgr.setMainFileID( 8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceMgr.createFileID(File, SourceLocation(), Kind)); 814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceMgr.overrideFileContents(File, std::move(SB)); 815ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 816ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 81787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(SourceMgr.getMainFileID().isValid() && 818694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman "Couldn't establish MainFileID!"); 819ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return true; 820ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 8210397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 8220397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar// High-Level Operations 8230397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 8240397af277e3bba16da1fd125ddba07415686b429Daniel Dunbarbool CompilerInstance::ExecuteAction(FrontendAction &Act) { 8250397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(hasDiagnostics() && "Diagnostics engine is not initialized!"); 8260397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!"); 8270397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!"); 8280397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 8290397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: Take this as an argument, once all the APIs we used have moved to 8300397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // taking it as an input instead of hard-coding llvm::errs. 8315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS = llvm::errs(); 8320397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 8330397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Create the target instance. 834c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), 835c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines getInvocation().TargetOpts)); 8360397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (!hasTarget()) 8370397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar return false; 8380397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 83987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Create TargetInfo for the other side of CUDA compilation. 84087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getLangOpts().CUDA && !getFrontendOpts().AuxTriple.empty()) { 8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto TO = std::make_shared<TargetOptions>(); 84287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TO->Triple = getFrontendOpts().AuxTriple; 8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TO->HostTriple = getTarget().getTriple().str(); 84487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar setAuxTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), TO)); 84587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 84687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 8470397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Inform the target of the language options. 8480397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // 8490397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: We shouldn't need to do this, the target should be immutable once 8500397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // created. This complexity should be lifted elsewhere. 851c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines getTarget().adjust(getLangOpts()); 8520397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 85393a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian // rewriter project will change target built-in bool type from its default. 85493a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian if (getFrontendOpts().ProgramAction == frontend::RewriteObjC) 85593a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian getTarget().noSignedCharForObjCBool(); 85693a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian 8570397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Validate/process some options. 8580397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getHeaderSearchOpts().Verbose) 8590397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "clang -cc1 version " CLANG_VERSION_STRING 860c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines << " based upon " << BACKEND_PACKAGE_STRING 8615d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop << " default target " << llvm::sys::getDefaultTargetTriple() << "\n"; 8620397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 8630397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getFrontendOpts().ShowTimers) 8640397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar createFrontendTimer(); 8650397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 86695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor if (getFrontendOpts().ShowStats) 86795dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor llvm::EnableStatistics(); 868a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 86987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (const FrontendInputFile &FIF : getFrontendOpts().Inputs) { 870176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Reset the ID tables if we are reusing the SourceManager and parsing 871176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // regular files. 872176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (hasSourceManager() && !Act.isModelParsingAction()) 8732056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar getSourceManager().clearIDTables(); 8740397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 87587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Act.BeginSourceFile(*this, FIF)) { 8760397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.Execute(); 8770397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.EndSourceFile(); 8780397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 8790397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 8800397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 88129f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis // Notify the diagnostic client that all files were processed. 88229f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis getDiagnostics().getClient()->finish(); 88329f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis 88453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (getDiagnosticOpts().ShowCarets) { 885f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // We can have multiple diagnostics sharing one diagnostic client. 886f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // Get the total number of warnings/errors from the client. 887f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings(); 888f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumErrors = getDiagnostics().getClient()->getNumErrors(); 889a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 89053eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings) 89153eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); 89253eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings && NumErrors) 89353eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " and "; 89453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumErrors) 89553eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s"); 89653eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings || NumErrors) 89753eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " generated.\n"; 89853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner } 8990397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 9002056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (getFrontendOpts().ShowStats && hasFileManager()) { 9010397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getFileManager().PrintStats(); 9020397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "\n"; 9030397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 9040397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 905ab41b97c3cddf1bcdd8bf82ab09ed3ceafcd05b1Argyrios Kyrtzidis return !getDiagnostics().getClient()->getNumErrors(); 9060397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar} 9070397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 90821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// \brief Determine the appropriate source input kind based on language 90921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// options. 91021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { 91121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.OpenCL) 91221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_OpenCL; 91321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.CUDA) 91421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_CUDA; 91521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.ObjC1) 91621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC; 91721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_CXX : IK_C; 91821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor} 91921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 920f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Compile a module file for the given module, using the options 921176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// provided by the importing compiler instance. Returns true if the module 922176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// was built without errors. 923176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool compileModuleImpl(CompilerInstance &ImportingInstance, 924176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation ImportLoc, 925176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Module *Module, 926176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines StringRef ModuleFileName) { 927f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor ModuleMap &ModMap 928f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 929f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 93021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler invocation for creating this module. 931c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<CompilerInvocation> Invocation 93221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor (new CompilerInvocation(ImportingInstance.getInvocation())); 933a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 93418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 93518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 936b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // For any options that aren't intended to affect how a module is built, 937b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // reset them to their default values. 938d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek Invocation->getLangOpts()->resetNonModularOptions(); 93918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.resetNonModularOptions(); 940a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 9412a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // Remove any macro definitions that are explicitly ignored by the module. 9422a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // They aren't supposed to affect how the module is built anyway. 9432a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts(); 944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PPOpts.Macros.erase( 945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(), 946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines [&HSOpts](const std::pair<std::string, bool> &def) { 947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef MacroDef = def.first; 948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0; 949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }), 950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PPOpts.Macros.end()); 9512a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 952b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor // Note the name of the module we're building. 953933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName(); 954b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor 955463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Make sure that the failed-module structure has been allocated in 956463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // the importing instance, and propagate the pointer to the newly-created 957463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // instance. 958463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PreprocessorOptions &ImportingPPOpts 959463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor = ImportingInstance.getInvocation().getPreprocessorOpts(); 960463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (!ImportingPPOpts.FailedModules) 961463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet; 962463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PPOpts.FailedModules = ImportingPPOpts.FailedModules; 963463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 96418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // If there is a module map file, build the module using the module map. 965b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // Set up the inputs/outputs so that we build the module from its umbrella 966b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // header. 96721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOptions &FrontendOpts = Invocation->getFrontendOpts(); 9686e975c4517958bcc11c834336d340797356058dbDouglas Gregor FrontendOpts.OutputFile = ModuleFileName.str(); 96921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.DisableFree = false; 970f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor FrontendOpts.GenerateGlobalModuleIndex = false; 97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FrontendOpts.BuildingImplicitModule = true; 97221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.Inputs.clear(); 97318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts()); 974a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 97518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Don't free the remapped file buffers; they are owned by our caller. 97618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.RetainRemappedFileBuffers = true; 97718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 97818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; 97976d991ec6c5cd247ee18fe65c35d43c2d47cf094Douglas Gregor assert(ImportingInstance.getInvocation().getModuleHash() == 98018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getModuleHash() && "Module hash mismatch!"); 98118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 98221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler instance that will be used to actually create the 98321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // module. 98487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CompilerInstance Instance(ImportingInstance.getPCHContainerOperations(), 98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*BuildingModule=*/true); 98621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor Instance.setInvocation(&*Invocation); 987a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 988a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor Instance.createDiagnostics(new ForwardingDiagnosticConsumer( 989a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor ImportingInstance.getDiagnosticClient()), 990cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor /*ShouldOwnClient=*/true); 991830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Instance.setVirtualFileSystem(&ImportingInstance.getVirtualFileSystem()); 993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 9944565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor // Note that this module is part of the module build stack, so that we 995830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor // can detect cycles in the module graph. 996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Instance.setFileManager(&ImportingInstance.getFileManager()); 997830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createSourceManager(Instance.getFileManager()); 998830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceManager &SourceMgr = Instance.getSourceManager(); 9994565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.setModuleBuildStack( 10004565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor ImportingInstance.getSourceManager().getModuleBuildStack()); 10014565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(), 1002830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager())); 1003830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 1004c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // If we're collecting module dependencies, we need to share a collector 100587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // between all of the module CompilerInstances. Other than that, we don't 100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // want to produce any dependency output from the module build. 1007c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Instance.setModuleDepCollector(ImportingInstance.getModuleDepCollector()); 100887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Invocation->getDependencyOutputOpts() = DependencyOutputOptions(); 1009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1010ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek // Get or create the module map that we'll use to build this module. 1011ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek std::string InferredModuleMapContent; 1012ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek if (const FileEntry *ModuleMapFile = 1013ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek ModMap.getContainingModuleMapFile(Module)) { 1014ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek // Use the module map where this module resides. 1015b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FrontendOpts.Inputs.emplace_back(ModuleMapFile->getName(), IK); 1016ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek } else { 1017b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SmallString<128> FakeModuleMapFile(Module->Directory->getName()); 1018b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar llvm::sys::path::append(FakeModuleMapFile, "__inferred_module.map"); 1019b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FrontendOpts.Inputs.emplace_back(FakeModuleMapFile, IK); 1020b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1021ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek llvm::raw_string_ostream OS(InferredModuleMapContent); 1022ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek Module->print(OS); 1023ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek OS.flush(); 1024ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek 1025176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<llvm::MemoryBuffer> ModuleMapBuffer = 1026ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek llvm::MemoryBuffer::getMemBuffer(InferredModuleMapContent); 1027ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek ModuleMapFile = Instance.getFileManager().getVirtualFile( 1028b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FakeModuleMapFile, InferredModuleMapContent.size(), 0); 1029176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceMgr.overrideFileContents(ModuleMapFile, std::move(ModuleMapBuffer)); 1030ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek } 1031830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 1032176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Construct a module-generating action. Passing through the module map is 10336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // safe because the FileManager is shared between the compiler instances. 1034176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GenerateModuleAction CreateModuleAction( 1035176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ModMap.getModuleMapFileForUniquing(Module), Module->IsSystem); 1036176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1037176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ImportingInstance.getDiagnostics().Report(ImportLoc, 1038176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::remark_module_build) 1039176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << Module->Name << ModuleFileName; 1040176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 10410ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // Execute the action to actually build the module in-place. Use a separate 10420ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // thread so that we get a stack large enough. 10430ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor const unsigned ThreadStackSize = 8 << 20; 10440ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor llvm::CrashRecoveryContext CRC; 1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CRC.RunSafelyOnThread([&]() { Instance.ExecuteAction(CreateModuleAction); }, 1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ThreadStackSize); 1047a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 1048176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ImportingInstance.getDiagnostics().Report(ImportLoc, 1049176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diag::remark_module_build_done) 1050176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << Module->Name; 1051176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 105218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Delete the temporary module map file. 105318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // FIXME: Even though we're executing under crash protection, it would still 105418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // be nice to do this with RemoveFileOnSignal when we can. However, that 105518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // doesn't make sense for all clients, so clean this up manually. 1056a2e94892e273423e2f772f989921cda6442a66c4Benjamin Kramer Instance.clearOutputFiles(/*EraseFiles=*/true); 1057a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor 1058a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // We've rebuilt a module. If we're allowed to generate or update the global 1059a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // module index, record that fact in the importing compiler instance. 1060f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) { 1061a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ImportingInstance.setBuildGlobalModuleIndex(true); 1062a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor } 1063176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1064176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return !Instance.getDiagnostics().hasErrorOccurred(); 1065a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi} 106621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 1067c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic bool compileAndLoadModule(CompilerInstance &ImportingInstance, 1068c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines SourceLocation ImportLoc, 1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines SourceLocation ModuleNameLoc, Module *Module, 1070c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines StringRef ModuleFileName) { 1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics(); 1072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1073176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines auto diagnoseBuildFailure = [&] { 1074176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.Report(ModuleNameLoc, diag::err_module_not_built) 1075176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines << Module->Name << SourceRange(ImportLoc, ModuleNameLoc); 1076176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 1077176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 10786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: have LockFileManager return an error_code so that we can 10796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // avoid the mkdir when the directory already exists. 10806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); 10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::sys::fs::create_directories(Dir); 10826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 10836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (1) { 1084c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing; 10856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::LockFileManager Locked(ModuleFileName); 10866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines switch (Locked) { 10876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::LockFileManager::LFS_Error: 1088176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Diags.Report(ModuleNameLoc, diag::err_module_lock_failure) 10894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar << Module->Name << Locked.getErrorMessage(); 1090c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return false; 10916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 10926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::LockFileManager::LFS_Owned: 1093c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // We're responsible for building the module ourselves. 1094176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!compileModuleImpl(ImportingInstance, ModuleNameLoc, Module, 1095176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ModuleFileName)) { 1096176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diagnoseBuildFailure(); 1097176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 1098176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 10996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 11006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 11016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::LockFileManager::LFS_Shared: 11026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Someone else is responsible for building the module. Wait for them to 11036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // finish. 11040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines switch (Locked.waitForUnlock()) { 11050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case llvm::LockFileManager::Res_Success: 11060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ModuleLoadCapabilities |= ASTReader::ARR_OutOfDate; 11070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 11080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case llvm::LockFileManager::Res_OwnerDied: 11096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; // try again to get the lock. 11100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case llvm::LockFileManager::Res_Timeout: 11110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Diags.Report(ModuleNameLoc, diag::err_module_lock_timeout) 11120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << Module->Name; 11130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Clear the lock file so that future invokations can make progress. 11140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Locked.unsafeRemoveLockFile(); 11150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return false; 11160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 1117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines break; 11186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 11196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1120c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Try to read the module file, now that we've compiled it. 1121c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ASTReader::ASTReadResult ReadResult = 1122c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ImportingInstance.getModuleManager()->ReadAST( 1123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ModuleFileName, serialization::MK_ImplicitModule, ImportLoc, 1124c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ModuleLoadCapabilities); 1125c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1126c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (ReadResult == ASTReader::OutOfDate && 1127c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Locked == llvm::LockFileManager::LFS_Shared) { 1128c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // The module may be out of date in the presence of file system races, 1129c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // or if one of its imports depends on header search paths that are not 1130c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // consistent with this ImportingInstance. Try again... 1131c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines continue; 1132c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } else if (ReadResult == ASTReader::Missing) { 1133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diagnoseBuildFailure(); 1134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (ReadResult != ASTReader::Success && 1135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines !Diags.hasErrorOccurred()) { 1136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // The ASTReader didn't diagnose the error, so conservatively report it. 1137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines diagnoseBuildFailure(); 1138c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines } 1139c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return ReadResult == ASTReader::Success; 11406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 11416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 114363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Diagnose differences between the current definition of the given 114463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// configuration macro and the definition provided on the command line. 114563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorstatic void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, 114663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module *Mod, SourceLocation ImportLoc) { 114763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro); 114863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor SourceManager &SourceMgr = PP.getSourceManager(); 114963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 115063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier has never had a macro definition, then it could 115163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // not have changed. 115263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hadMacroDefinition()) 115363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 1154b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id); 115563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1156b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Find the macro definition from the command line. 1157b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MacroInfo *CmdLineDefinition = nullptr; 1158b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) { 115963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 1160b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FileID FID = SourceMgr.getFileID(MD->getLocation()); 1161b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FID.isInvalid() || FID != PP.getPredefinesFileID()) 116263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 1163b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (auto *DMD = dyn_cast<DefMacroDirective>(MD)) 1164b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CmdLineDefinition = DMD->getMacroInfo(); 116563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 116663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 116763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1168b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto *CurrentDefinition = PP.getMacroInfo(Id); 1169b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (CurrentDefinition == CmdLineDefinition) { 1170b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Macro matches. Nothing to do. 1171b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (!CurrentDefinition) { 1172b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // This macro was defined on the command line, then #undef'd later. 1173b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Complain. 1174b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 1175b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << true << ConfigMacro << Mod->getFullModuleName(); 1176b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar auto LatestDef = LatestLocalMD->getDefinition(); 1177b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar assert(LatestDef.isUndefined() && 1178b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar "predefined macro went away with no #undef?"); 1179b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here) 1180b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << true; 1181b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return; 1182b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (!CmdLineDefinition) { 1183b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // There was no definition for this macro in the predefines buffer, 1184b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // but there was a local definition. Complain. 118563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 118663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 1187b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PP.Diag(CurrentDefinition->getDefinitionLoc(), 1188b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar diag::note_module_def_undef_here) 1189b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << false; 1190b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP, 1191b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar /*Syntactically=*/true)) { 1192b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // The macro definitions differ. 1193b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 1194b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar << false << ConfigMacro << Mod->getFullModuleName(); 1195b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar PP.Diag(CurrentDefinition->getDefinitionLoc(), 1196b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar diag::note_module_def_undef_here) 119763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 119863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 119963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor} 120063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1201d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Write a new timestamp file with the given path. 1202d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void writeTimestampFile(StringRef TimestampFile) { 1203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::error_code EC; 1204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::raw_fd_ostream Out(TimestampFile.str(), EC, llvm::sys::fs::F_None); 1205d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1206d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1207d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Prune the module cache of modules that haven't been accessed in 1208d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// a long time. 1209d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void pruneModuleCache(const HeaderSearchOptions &HSOpts) { 1210d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor struct stat StatBuf; 1211d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::SmallString<128> TimestampFile; 1212d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor TimestampFile = HSOpts.ModuleCachePath; 121387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(!TimestampFile.empty()); 1214d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::append(TimestampFile, "modules.timestamp"); 1215d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1216d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Try to stat() the timestamp file. 1217d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(TimestampFile.c_str(), &StatBuf)) { 1218d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the timestamp file wasn't there, create one now. 1219d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (errno == ENOENT) { 1220d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1221d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1222d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1223d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1224d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1225d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Check whether the time stamp is older than our pruning interval. 1226d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If not, do nothing. 1227d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t TimeStampModTime = StatBuf.st_mtime; 12286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines time_t CurrentTime = time(nullptr); 122993ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval)) 1230d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1231d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1232d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Write a new timestamp file so that nobody else attempts to prune. 1233d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // There is a benign race condition here, if two Clang instances happen to 1234d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // notice at the same time that the timestamp is out-of-date. 1235d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1236d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1237d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk the entire module cache, looking for unused module files and module 1238d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // indices. 1239c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::error_code EC; 1240d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor SmallString<128> ModuleCachePathNative; 1241d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative); 12423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar for (llvm::sys::fs::directory_iterator Dir(ModuleCachePathNative, EC), DirEnd; 1243d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 1244d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we don't have a directory, there's nothing to look into. 1245b470d1a54877e7b3622e4cbdeae423c6d51be696Rafael Espindola if (!llvm::sys::fs::is_directory(Dir->path())) 1246d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1247d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1248d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk all of the files within this directory. 1249d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd; 1250d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor File != FileEnd && !EC; File.increment(EC)) { 1251d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // We only care about module and global module index files. 1252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Extension = llvm::sys::path::extension(File->path()); 1253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Extension != ".pcm" && Extension != ".timestamp" && 1254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::path::filename(File->path()) != "modules.idx") 1255d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1256d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1257d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Look at this file. If we can't stat it, there's nothing interesting 1258d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // there. 1259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (::stat(File->path().c_str(), &StatBuf)) 1260d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1261d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1262d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the file has been used recently enough, leave it there. 1263d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t FileAccessTime = StatBuf.st_atime; 126493ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - FileAccessTime <= 126593ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer time_t(HSOpts.ModuleCachePruneAfter)) { 1266d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1267d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1268d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1269d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Remove the file. 1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::fs::remove(File->path()); 1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Remove the timestamp file. 1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string TimpestampFilename = File->path() + ".timestamp"; 1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::fs::remove(TimpestampFilename); 1275d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1276d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1277d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we removed all of the files in the directory, remove the directory 1278d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // itself. 1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (llvm::sys::fs::directory_iterator(Dir->path(), EC) == 1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::fs::directory_iterator() && !EC) 1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::fs::remove(Dir->path()); 1282d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1283d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1284d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 12856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CompilerInstance::createModuleManager() { 12866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ModuleManager) { 12876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!hasASTContext()) 12886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines createASTContext(); 12896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 12903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we're implicitly building modules but not currently recursively 12913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // building a module, check whether we need to prune the module cache. 129287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getSourceManager().getModuleBuildStack().empty() && 129387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar !getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty() && 12946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getHeaderSearchOpts().ModuleCachePruneInterval > 0 && 12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getHeaderSearchOpts().ModuleCachePruneAfter > 0) { 12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines pruneModuleCache(getHeaderSearchOpts()); 12976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 12986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 12996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines HeaderSearchOptions &HSOpts = getHeaderSearchOpts(); 13006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::string Sysroot = HSOpts.Sysroot; 13016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 130287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::unique_ptr<llvm::Timer> ReadTimer; 130387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FrontendTimerGroup) 130487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ReadTimer = llvm::make_unique<llvm::Timer>("Reading modules", 130587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar *FrontendTimerGroup); 130687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ModuleManager = new ASTReader( 130787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getPreprocessor(), getASTContext(), getPCHContainerReader(), 130887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFrontendOpts().ModuleFileExtensions, 130987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Sysroot.empty() ? "" : Sysroot.c_str(), PPOpts.DisablePCHValidation, 131087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*AllowASTWithCompilerErrors=*/false, 131187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*AllowConfigurationMismatch=*/false, 131287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar HSOpts.ModulesValidateSystemHeaders, 131387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFrontendOpts().UseGlobalModuleIndex, 131487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::move(ReadTimer)); 13156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (hasASTConsumer()) { 13166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->setDeserializationListener( 13176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getASTConsumer().GetASTDeserializationListener()); 13186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getASTContext().setASTMutationListener( 13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getASTConsumer().GetASTMutationListener()); 13206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 13216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getASTContext().setExternalSource(ModuleManager); 13226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (hasSema()) 13236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->InitializeSema(getSema()); 13246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (hasASTConsumer()) 13256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->StartTranslationUnit(&getASTConsumer()); 132687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 132787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (TheDependencyFileGenerator) 132887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TheDependencyFileGenerator->AttachToASTReader(*ModuleManager); 132987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto &Listener : DependencyCollectors) 133087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Listener->attachToASTReader(*ModuleManager); 13316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 13326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 13336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool CompilerInstance::loadModuleFile(StringRef FileName) { 133587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Timer Timer; 133687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FrontendTimerGroup) 133787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Timer.init("Preloading " + FileName.str(), *FrontendTimerGroup); 133887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr); 133987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Helper to recursively read the module names for all modules we're adding. 1341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // We mark these as known and redirect any attempt to load that module to 1342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // the files we were handed. 1343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct ReadModuleNames : ASTReaderListener { 1344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CompilerInstance &CI; 134587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::SmallVector<IdentifierInfo*, 8> LoadedModules; 1346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 134787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ReadModuleNames(CompilerInstance &CI) : CI(CI) {} 1348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 134987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void ReadModuleName(StringRef ModuleName) override { 135087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LoadedModules.push_back( 135187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CI.getPreprocessor().getIdentifierInfo(ModuleName)); 135287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 13530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 135487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void registerAll() { 135587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *II : LoadedModules) { 135687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar CI.KnownModules[II] = CI.getPreprocessor() 135787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .getHeaderSearchInfo() 135887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .getModuleMap() 135987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .findModule(II->getName()); 1360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 136187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LoadedModules.clear(); 1362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 136487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void markAllUnavailable() { 136587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar for (auto *II : LoadedModules) { 136687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Module *M = CI.getPreprocessor() 136787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .getHeaderSearchInfo() 136887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .getModuleMap() 136987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar .findModule(II->getName())) 137087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar M->HasIncompatibleModuleFile = true; 137187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 137287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar LoadedModules.clear(); 1373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 137487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar }; 1375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 13763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If we don't already have an ASTReader, create one now. 13773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (!ModuleManager) 13783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar createModuleManager(); 13793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 138087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto Listener = llvm::make_unique<ReadModuleNames>(*this); 138187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto &ListenerRef = *Listener; 138287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTReader::ListenerScope ReadModuleNamesListener(*ModuleManager, 138387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::move(Listener)); 13843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 138587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Try to load the module file. 138687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (ModuleManager->ReadAST(FileName, serialization::MK_ExplicitModule, 138787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar SourceLocation(), 138887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ASTReader::ARR_ConfigurationMismatch)) { 138987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case ASTReader::Success: 139087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We successfully loaded the module file; remember the set of provided 139187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // modules so that we don't try to load implicit modules for them. 139287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ListenerRef.registerAll(); 139387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 1394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 139587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case ASTReader::ConfigurationMismatch: 139687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Ignore unusable module files. 139787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getDiagnostics().Report(SourceLocation(), diag::warn_module_config_mismatch) 139887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar << FileName; 139987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // All modules provided by any files we tried and failed to load are now 140087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // unavailable; includes of those modules should now be handled textually. 140187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ListenerRef.markAllUnavailable(); 140287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return true; 1403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 140487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar default: 1405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 1406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 1408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1409463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorModuleLoadResult 1410463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorCompilerInstance::loadModule(SourceLocation ImportLoc, 1411463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ModuleIdPath Path, 1412463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor Module::NameVisibilityKind Visibility, 1413463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor bool IsInclusionDirective) { 1414b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith // Determine what file we're searching from. 1415b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith StringRef ModuleName = Path[0].first->getName(); 1416b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith SourceLocation ModuleNameLoc = Path[0].second; 1417b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith 1418b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // If we've already handled this import, just return the cached result. 1419b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // This one-element cache is important to eliminate redundant diagnostics 1420b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // when both the preprocessor and parser see the same import declaration. 142187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) { 14225e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor // Make the named module visible. 14234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule) 14245ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, 1425b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ImportLoc); 1426392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return LastModuleImportResult; 14275e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor } 1428a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 14296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines clang::Module *Module = nullptr; 1430b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith 143149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have information on this module, load the module now. 14321a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known 1433392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor = KnownModules.find(Path[0].first); 14345e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor if (Known != KnownModules.end()) { 14355e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Retrieve the cached top-level module. 14365e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = Known->second; 14374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (ModuleName == getLangOpts().CurrentModule) { 14385e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // This is the module we're building. 14396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); 14405e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 14415e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else { 144249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Search for a module with the given name. 1443e434ec71fccfe078906403affd641f709702d598Douglas Gregor Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); 1444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Module) { 1445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found) 1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << ModuleName 1447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << SourceRange(ImportLoc, ModuleNameLoc); 1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ModuleBuildFailed = true; 1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ModuleLoadResult(); 1450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 145287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar std::string ModuleFileName = 145387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar PP->getHeaderSearchInfo().getModuleFileName(Module); 145487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (ModuleFileName.empty()) { 145587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Module->HasIncompatibleModuleFile) { 145687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // We tried and failed to load a module file for this module. Fall 145787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // back to textual inclusion for its headers. 145887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return ModuleLoadResult(nullptr, /*missingExpected*/true); 145987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 146087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 14610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines getDiagnostics().Report(ModuleNameLoc, diag::err_module_build_disabled) 14620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines << ModuleName; 14630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ModuleBuildFailed = true; 14640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return ModuleLoadResult(); 14650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 1466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 146749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have an ASTReader, create one now. 14686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ModuleManager) 14696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines createModuleManager(); 1470a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 147187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::Timer Timer; 147287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FrontendTimerGroup) 147387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Timer.init("Loading " + ModuleFileName, *FrontendTimerGroup); 147487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::TimeRegion TimeLoading(FrontendTimerGroup ? &Timer : nullptr); 1475c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 1476677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to load the module file. 147787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing; 1478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (ModuleManager->ReadAST(ModuleFileName, 147987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar serialization::MK_ImplicitModule, 1480677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ImportLoc, ARRFlags)) { 148149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Success: 148249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 14836aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor 14840295c238f7b4329f86498055337f91f25465f836Eli Friedman case ASTReader::OutOfDate: 1485677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: { 14860295c238f7b4329f86498055337f91f25465f836Eli Friedman // The module file is missing or out-of-date. Build it. 1487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(Module && "missing module file"); 1488677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Check whether there is a cycle in the module graph. 1489677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack(); 1490677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end(); 1491677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1492677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos->first == ModuleName) 1493677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor break; 1494677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1495677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1496677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos != PosEnd) { 1497677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor SmallString<256> CyclePath; 1498677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1499677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += Pos->first; 1500677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += " -> "; 1501677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1502677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += ModuleName; 1503677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1504677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle) 1505677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName << CyclePath; 1506677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return ModuleLoadResult(); 1507677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1508463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1509463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Check whether we have already attempted to build this module (but 1510463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // failed). 1511463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (getPreprocessorOpts().FailedModules && 1512463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getPreprocessorOpts().FailedModules->hasAlreadyFailed(ModuleName)) { 1513463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built) 1514463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << ModuleName 1515463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1516f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1517463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1518463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor } 1519463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1520c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Try to compile and then load the module. 1521c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (!compileAndLoadModule(*this, ImportLoc, ModuleNameLoc, Module, 1522c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines ModuleFileName)) { 1523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(getDiagnostics().hasErrorOccurred() && 1524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "undiagnosed error in compileAndLoadModule"); 1525b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor if (getPreprocessorOpts().FailedModules) 1526b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor getPreprocessorOpts().FailedModules->addFailed(ModuleName); 15276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines KnownModules[Path[0].first] = nullptr; 1528f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1529463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 15307cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 15317cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 15327cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor // Okay, we've rebuilt and now loaded the module. 15337cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor break; 15347cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 15357cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 15364825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 15374825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 15384825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 15393b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 154087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // FIXME: The ASTReader will already have complained, but can we shoehorn 154149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // that diagnostic information into a more useful form? 15426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines KnownModules[Path[0].first] = nullptr; 1543463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1544a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 154549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Failure: 15463b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 1547392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Already complained, but note now that we failed. 15486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines KnownModules[Path[0].first] = nullptr; 1549f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1550463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 155149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 1552e2ac16b09ea66ad955752381b82fb8719d003e5eArgyrios Kyrtzidis 1553392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Cache the result of this top-level module lookup for later. 1554392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 15556aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor } 155649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1557392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // If we never found the module, fail. 1558392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (!Module) 1559463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1560392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 156149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Verify that the rest of the module path actually corresponds to 156249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // a submodule. 1563392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Path.size() > 1) { 156449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor for (unsigned I = 1, N = Path.size(); I != N; ++I) { 156549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor StringRef Name = Path[I].first->getName(); 1566b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor clang::Module *Sub = Module->findSubmodule(Name); 156749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1568b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 156949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Attempt to perform typo correction to find a module name that works. 1570cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<StringRef, 2> Best; 157149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)(); 157249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1573b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor for (clang::Module::submodule_iterator J = Module->submodule_begin(), 1574b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor JEnd = Module->submodule_end(); 1575e25633f777cfcaa564b4ed36cec37d6e6e1ecb04Matt Beaumont-Gay J != JEnd; ++J) { 1576b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor unsigned ED = Name.edit_distance((*J)->Name, 157749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor /*AllowReplacements=*/true, 157849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor BestEditDistance); 157949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (ED <= BestEditDistance) { 1580b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (ED < BestEditDistance) { 158149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best.clear(); 1582b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor BestEditDistance = ED; 1583b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor } 1584b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1585b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Best.push_back((*J)->Name); 158649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 158749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 158849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 158949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If there was a clear winner, user it. 159049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (Best.size() == 1) { 159149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, 159249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor diag::err_no_submodule_suggest) 1593392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() << Best[0] 159449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second) 159549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << FixItHint::CreateReplacement(SourceRange(Path[I].second), 159649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best[0]); 1597b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1598b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Sub = Module->findSubmodule(Best[0]); 159949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 160049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 160149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1602b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 160349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // No submodule by this name. Complain, and don't look for further 160449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // submodules. 160549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, diag::err_no_submodule) 1606392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() 160749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second); 160849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 160949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 161049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1611b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Module = Sub; 161249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 161349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 1614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 16155e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Make the named module visible, if it's not already part of the module 16165e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // we are parsing. 1617305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (ModuleName != getLangOpts().CurrentModule) { 1618305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (!Module->IsFromModuleFile) { 1619305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // We have an umbrella header or directory that doesn't actually include 1620305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // all of the headers within the directory it covers. Complain about 1621305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this missing submodule and recover by forgetting that we ever saw 1622305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this submodule. 1623305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // FIXME: Should we detect this at module load time? It seems fairly 1624305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // expensive (and rare). 1625305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule) 1626305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << Module->getFullModuleName() 1627305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << SourceRange(Path.front().second, Path.back().second); 16286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ModuleLoadResult(nullptr, true); 1630305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 163151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 163251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Check whether this module is available. 16335794b53ad5b38b53c9eaf3a172354e63081ceb2fRichard Smith clang::Module::Requirement Requirement; 16340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines clang::Module::UnresolvedHeaderDirective MissingHeader; 1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Module->isAvailable(getLangOpts(), getTarget(), Requirement, 1636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MissingHeader)) { 1637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (MissingHeader.FileNameLoc.isValid()) { 1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDiagnostics().Report(MissingHeader.FileNameLoc, 1639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines diag::err_module_header_missing) 1640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << MissingHeader.IsUmbrella << MissingHeader.FileName; 1641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDiagnostics().Report(ImportLoc, diag::err_module_unavailable) 1643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << Module->getFullModuleName() 1644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << Requirement.second << Requirement.first 1645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << SourceRange(Path.front().second, Path.back().second); 1646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 164751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor LastModuleImportLoc = ImportLoc; 1648463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(); 1649463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 165051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 165151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1652b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ModuleManager->makeModuleVisible(Module, Visibility, ImportLoc); 1653305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 165463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 165563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Check for any configuration macros that have changed. 165663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor clang::Module *TopModule = Module->getTopLevelModule(); 165763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor for (unsigned I = 0, N = TopModule->ConfigMacros.size(); I != N; ++I) { 165863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor checkConfigMacro(getPreprocessor(), TopModule->ConfigMacros[I], 165963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module, ImportLoc); 166063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 166163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1662b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor LastModuleImportLoc = ImportLoc; 1663463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(Module, false); 1664463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return LastModuleImportResult; 16656aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor} 1666ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 1667ca2ab45341c448284cf93770018c717810575f86Douglas Gregorvoid CompilerInstance::makeModuleVisible(Module *Mod, 16685ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis Module::NameVisibilityKind Visibility, 1669b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar SourceLocation ImportLoc) { 1670b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ModuleManager) 1671b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar createModuleManager(); 1672b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!ModuleManager) 1673b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return; 1674b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1675b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc); 1676ca2ab45341c448284cf93770018c717810575f86Douglas Gregor} 1677ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 16786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesGlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex( 16796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation TriggerLoc) { 168087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (getPreprocessor().getHeaderSearchInfo().getModuleCachePath().empty()) 168187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return nullptr; 16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ModuleManager) 16836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines createModuleManager(); 16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Can't do anything if we don't have the module manager. 16856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!ModuleManager) 16866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Get an existing global index. This loads it if not already 16886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // loaded. 16896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->loadGlobalIndex(); 16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex *GlobalIndex = ModuleManager->getGlobalIndex(); 16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If the global index doesn't exist, create it. 16926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!GlobalIndex && shouldBuildGlobalModuleIndex() && hasFileManager() && 16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines hasPreprocessor()) { 16946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::sys::fs::create_directories( 16956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); 16966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex::writeIndex( 169787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFileManager(), getPCHContainerReader(), 169887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); 16996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->resetForReload(); 17006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->loadGlobalIndex(); 17016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalIndex = ModuleManager->getGlobalIndex(); 17026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // For finding modules needing to be imported for fixit messages, 17046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // we need to make the global index cover all modules, so we do that here. 17056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!HaveFullGlobalModuleIndex && GlobalIndex && !buildingModule()) { 17066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleMap &MMap = getPreprocessor().getHeaderSearchInfo().getModuleMap(); 17076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool RecreateIndex = false; 17086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (ModuleMap::module_iterator I = MMap.module_begin(), 17096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E = MMap.module_end(); I != E; ++I) { 17106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *TheModule = I->second; 17116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const FileEntry *Entry = TheModule->getASTFile(); 17126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Entry) { 17136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path; 17146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Path.push_back(std::make_pair( 171587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getPreprocessor().getIdentifierInfo(TheModule->Name), TriggerLoc)); 17166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::reverse(Path.begin(), Path.end()); 171787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Load a module as hidden. This also adds it to the global index. 171887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar loadModule(TheModule->DefinitionLoc, Path, Module::Hidden, false); 17196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RecreateIndex = true; 17206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (RecreateIndex) { 17236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex::writeIndex( 172487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getFileManager(), getPCHContainerReader(), 172587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getPreprocessor().getHeaderSearchInfo().getModuleCachePath()); 17266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->resetForReload(); 17276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager->loadGlobalIndex(); 17286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalIndex = ModuleManager->getGlobalIndex(); 17296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines HaveFullGlobalModuleIndex = true; 17316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return GlobalIndex; 17336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 17346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Check global module index for missing imports. 17366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool 17376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesCompilerInstance::lookupMissingImports(StringRef Name, 17386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation TriggerLoc) { 17396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Look for the symbol in non-imported modules, but only if an error 17406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // actually occurred. 17416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!buildingModule()) { 17426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Load global module index, or retrieve a previously loaded one. 17436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex( 17446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TriggerLoc); 17456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Only if we have a global index. 17476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (GlobalIndex) { 17486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex::HitSet FoundModules; 17496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Find the modules that reference the identifier. 17516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Note that this only finds top-level modules. 17526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // We'll let diagnoseTypo find the actual declaration module. 17536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (GlobalIndex->lookupIdentifier(Name, FoundModules)) 17546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 17556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 17576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 17586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 17596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid CompilerInstance::resetAndLeakSema() { BuryPointer(takeSema()); } 1761