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" 194e85b8ae413fa00fa42aa3e625c2db3b1932f8d3David Blaikie#include "clang/Frontend/ChainedDiagnosticConsumer.h" 200397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar#include "clang/Frontend/FrontendAction.h" 2121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor#include "clang/Frontend/FrontendActions.h" 22c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 239df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar#include "clang/Frontend/LogDiagnosticPrinter.h" 247800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek#include "clang/Frontend/SerializedDiagnosticPrinter.h" 250fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 2622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar#include "clang/Frontend/Utils.h" 2755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/VerifyDiagnosticConsumer.h" 2855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/HeaderSearch.h" 2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/PTHManager.h" 3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h" 31c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar#include "clang/Sema/CodeCompleteConsumer.h" 3255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h" 3355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Serialization/ASTReader.h" 3495dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor#include "llvm/ADT/Statistic.h" 3555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Config/config.h" 3655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/CrashRecoveryContext.h" 3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/FileSystem.h" 3803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 3952f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor#include "llvm/Support/LockFileManager.h" 4055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MemoryBuffer.h" 4103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 4203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 4303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Signals.h" 4455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/Timer.h" 4555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 463a321e23f66128dbb986343927456ff6702af617Michael J. Spencer#include "llvm/Support/system_error.h" 47d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor#include <sys/stat.h> 4887ab066c70006d998a6d358d272e00c8345b0f26Douglas Gregor#include <time.h> 492bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor 502a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbarusing namespace clang; 512a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 5242e9f8e4983d50f896ec716207817b9d96e7e79cDaniel DunbarCompilerInstance::CompilerInstance() 53a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor : Invocation(new CompilerInvocation()), ModuleManager(0), 54f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor BuildGlobalModuleIndex(false), ModuleBuildFailed(false) { 556228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar} 562a79e162a3fde25c1941151a67966830d873f2dbDaniel Dunbar 572a79e162a3fde25c1941151a67966830d873f2dbDaniel DunbarCompilerInstance::~CompilerInstance() { 58ac447fce02d119fb70f0aab885d836dea43e7f26Benjamin Kramer assert(OutputFiles.empty() && "Still output files in flight?"); 5942e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar} 6042e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar 616228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbarvoid CompilerInstance::setInvocation(CompilerInvocation *Value) { 624f32786ac45210143654390177105eb749b614e9Ted Kremenek Invocation = Value; 636228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar} 646228ca00121669ec06a19df4fad87d5049c097cfDaniel Dunbar 65f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregorbool CompilerInstance::shouldBuildGlobalModuleIndex() const { 661a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return (BuildGlobalModuleIndex || 67ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor (ModuleManager && ModuleManager->isGlobalIndexUnavailable() && 68ed2fc2a311065ee5f6c20adb1655702aff86ae8aDouglas Gregor getFrontendOpts().GenerateGlobalModuleIndex)) && 691a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !ModuleBuildFailed; 70f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor} 71f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor 72d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikievoid CompilerInstance::setDiagnostics(DiagnosticsEngine *Value) { 7328019772db70d4547be05a042eb950bc910f134fDouglas Gregor Diagnostics = Value; 748a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 758a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 768a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setTarget(TargetInfo *Value) { 774f32786ac45210143654390177105eb749b614e9Ted Kremenek Target = Value; 788a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 798a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 808a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setFileManager(FileManager *Value) { 814f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr = Value; 828a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 838a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 84a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumivoid CompilerInstance::setSourceManager(SourceManager *Value) { 854f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr = Value; 868a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 878a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 884f32786ac45210143654390177105eb749b614e9Ted Kremenekvoid CompilerInstance::setPreprocessor(Preprocessor *Value) { PP = Value; } 898a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 904f32786ac45210143654390177105eb749b614e9Ted Kremenekvoid CompilerInstance::setASTContext(ASTContext *Value) { Context = Value; } 9112ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar 92f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregorvoid CompilerInstance::setSema(Sema *S) { 93f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(S); 94f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 95f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 9612ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbarvoid CompilerInstance::setASTConsumer(ASTConsumer *Value) { 9712ce6943aae499225708ecf364c5a8b0a3269c87Daniel Dunbar Consumer.reset(Value); 988a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 998a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 1008a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbarvoid CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) { 1018a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar CompletionConsumer.reset(Value); 1028a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar} 1038a9f569262860b8d03203327afd6047be2a9b5a6Daniel Dunbar 1040fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Diagnostics 10502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts, 106b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar const CodeGenOptions *CodeGenOpts, 107d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 1089df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar std::string ErrorInfo; 1099df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar bool OwnsStream = false; 1105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream *OS = &llvm::errs(); 11102c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (DiagOpts->DiagnosticLogFile != "-") { 1129df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Create the output stream. 1139df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar llvm::raw_fd_ostream *FileOS( 114d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola new llvm::raw_fd_ostream(DiagOpts->DiagnosticLogFile.c_str(), ErrorInfo, 115d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola llvm::sys::fs::F_Append)); 1169df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar if (!ErrorInfo.empty()) { 1179df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar Diags.Report(diag::warn_fe_cc_log_diagnostics_failure) 118d2ff76b84c2f018f438eac2c2dd8b82bde441468Sean Silva << DiagOpts->DiagnosticLogFile << ErrorInfo; 1199df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } else { 1209df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar FileOS->SetUnbuffered(); 1219df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar FileOS->SetUseAtomicWrites(true); 1229df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar OS = FileOS; 1239df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar OwnsStream = true; 1249df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } 1259df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar } 1269df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar 1279df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Chain in the diagnostic client which will log the diagnostics. 128b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar LogDiagnosticPrinter *Logger = new LogDiagnosticPrinter(*OS, DiagOpts, 129b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar OwnsStream); 130b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar if (CodeGenOpts) 131b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags); 1324e85b8ae413fa00fa42aa3e625c2db3b1932f8d3David Blaikie Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), Logger)); 1339df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar} 1349df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar 13502c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregorstatic void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts, 1367800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek DiagnosticsEngine &Diags, 1377800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek StringRef OutputFile) { 1387800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek std::string ErrorInfo; 1396f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::raw_fd_ostream> OS; 1407800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek OS.reset(new llvm::raw_fd_ostream(OutputFile.str().c_str(), ErrorInfo, 141d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola llvm::sys::fs::F_Binary)); 142d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola 1437800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek if (!ErrorInfo.empty()) { 1447800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Diags.Report(diag::warn_fe_serialized_diag_failure) 1457800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek << OutputFile << ErrorInfo; 1467800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek return; 1477800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek } 1487800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1497800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek DiagnosticConsumer *SerializedConsumer = 1502a76410c0a23a6feb98d0f13e9c8bfa0638d3adfTed Kremenek clang::serialized_diags::create(OS.take(), DiagOpts); 1517800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1527800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1537800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), 1547800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek SerializedConsumer)); 1557800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 1567800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 157d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silvavoid CompilerInstance::createDiagnostics(DiagnosticConsumer *Client, 158cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor bool ShouldOwnClient) { 159d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva Diagnostics = createDiagnostics(&getDiagnosticOpts(), Client, 160cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor ShouldOwnClient, &getCodeGenOpts()); 1610fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 1620fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 163c93dc7889644293e318e19d82830ea2acc45b678Dylan NoblesmithIntrusiveRefCntPtr<DiagnosticsEngine> 16402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas GregorCompilerInstance::createDiagnostics(DiagnosticOptions *Opts, 16578ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie DiagnosticConsumer *Client, 16678243658c533168d51fd076fba328437932ba6f1Douglas Gregor bool ShouldOwnClient, 167b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar const CodeGenOptions *CodeGenOpts) { 168c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 169c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> 17002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Diags(new DiagnosticsEngine(DiagID, Opts)); 171221c7211c507482a91e97ede1bf6cf65a456ff67Daniel Dunbar 1720fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Create the diagnostic client for reporting errors or for 1730fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // implementing -verify. 174aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor if (Client) { 175cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor Diags->setClient(Client, ShouldOwnClient); 176aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor } else 177e47be3e9682e82da15059006f43c7f3c021e4fffDouglas Gregor Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); 178f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar 179f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar // Chain in -verify checker, if requested. 18002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (Opts->VerifyDiagnostics) 181621bc69624599da62abd9bc9e5edd8a63ac99fe6David Blaikie Diags->setClient(new VerifyDiagnosticConsumer(*Diags)); 1820fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 1839df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Chain in -diagnostic-log-file dumper, if requested. 18402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticLogFile.empty()) 185b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags); 186a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 18702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticSerializationFile.empty()) 1887800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek SetupSerializedDiagnostics(Opts, *Diags, 18902c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Opts->DiagnosticSerializationFile); 1907800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1910fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Configure our handling of diagnostics. 19202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor ProcessWarningOptions(*Diags, *Opts); 1930fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 19428019772db70d4547be05a042eb950bc910f134fDouglas Gregor return Diags; 1950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 1960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 1970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager 1980fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 19916b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() { 2004f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr = new FileManager(getFileSystemOpts()); 20116b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 20216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 2030fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager 2040fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 20539b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattnervoid CompilerInstance::createSourceManager(FileManager &FileMgr) { 2064f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr = new SourceManager(getDiagnostics(), FileMgr); 20716b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 20822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 2090fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor 2100fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 21122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbarvoid CompilerInstance::createPreprocessor() { 2126aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 213a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 21422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create a PTH manager if we are using some form of a token cache. 21522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHManager *PTHMgr = 0; 216049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar if (!PPOpts.TokenCache.empty()) 2176aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics()); 218a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 21922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create the Preprocessor. 220c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor HeaderSearch *HeaderInfo = new HeaderSearch(&getHeaderSearchOpts(), 221c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor getFileManager(), 22251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor getDiagnostics(), 223dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor getLangOpts(), 224dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor &getTarget()); 22536a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor PP = new Preprocessor(&getPreprocessorOpts(), 22636a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor getDiagnostics(), getLangOpts(), &getTarget(), 2276aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor getSourceManager(), *HeaderInfo, *this, PTHMgr, 2286aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor /*OwnsHeaderSearch=*/true); 229a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 23022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Note that this is different then passing PTHMgr to Preprocessor's ctor. 23122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // That argument is used as the IdentifierInfoLookup argument to 23222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // IdentifierTable's ctor. 23322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (PTHMgr) { 2346aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr->setPreprocessor(&*PP); 23522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP->setPTHManager(PTHMgr); 23622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar } 237a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 23894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor if (PPOpts.DetailedRecord) 23937ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis PP->createPreprocessingRecord(); 240a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2416aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor InitializePreprocessor(*PP, PPOpts, getHeaderSearchOpts(), getFrontendOpts()); 242a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 24374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP); 24474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 2456e975c4517958bcc11c834336d340797356058dbDouglas Gregor // Set up the module path, including the hash for the 2466e975c4517958bcc11c834336d340797356058dbDouglas Gregor // module-creation options. 247f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> SpecificModuleCache( 2486e975c4517958bcc11c834336d340797356058dbDouglas Gregor getHeaderSearchOpts().ModuleCachePath); 2496e975c4517958bcc11c834336d340797356058dbDouglas Gregor if (!getHeaderSearchOpts().DisableModuleHash) 250a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi llvm::sys::path::append(SpecificModuleCache, 2516e975c4517958bcc11c834336d340797356058dbDouglas Gregor getInvocation().getModuleHash()); 2525e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor PP->getHeaderSearchInfo().setModuleCachePath(SpecificModuleCache); 253a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 25422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Handle generating dependencies, if requested. 2556aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const DependencyOutputOptions &DepOpts = getDependencyOutputOpts(); 25622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!DepOpts.OutputFile.empty()) 25722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar AttachDependencyFileGen(*PP, DepOpts); 258773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor if (!DepOpts.DOTOutputFile.empty()) 259773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile, 260c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor getHeaderSearchOpts().Sysroot); 261a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 262c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor 263eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar // Handle generating header include information, if requested. 264eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar if (DepOpts.ShowHeaderIncludes) 265eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar AttachHeaderIncludeGen(*PP); 266b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (!DepOpts.HeaderIncludeOutputFile.empty()) { 2675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef OutputPath = DepOpts.HeaderIncludeOutputFile; 268b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (OutputPath == "-") 269b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar OutputPath = ""; 270da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar AttachHeaderIncludeGen(*PP, /*ShowAllHeaders=*/true, OutputPath, 271da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar /*ShowDepth=*/false); 272b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar } 27322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 2745eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2755eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 2765eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2775eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 2785eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 2794f32786ac45210143654390177105eb749b614e9Ted Kremenek Context = new ASTContext(getLangOpts(), PP.getSourceManager(), 280bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor &getTarget(), PP.getIdentifierTable(), 2814f32786ac45210143654390177105eb749b614e9Ted Kremenek PP.getSelectorTable(), PP.getBuiltinInfo(), 2824f32786ac45210143654390177105eb749b614e9Ted Kremenek /*size_reserve=*/ 0); 2835eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 2840f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2850f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 2860f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CompilerInstance::createPCHExternalASTSource(StringRef Path, 288ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl bool DisablePCHValidation, 289bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 290ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl void *DeserializationListener){ 2916f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 2921d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; 2930f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 294a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi DisablePCHValidation, 295bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis AllowPCHWithCompilerErrors, 296ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl getPreprocessor(), getASTContext(), 2971d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl DeserializationListener, 298f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor Preamble, 299f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex)); 300f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor ModuleManager = static_cast<ASTReader*>(Source.get()); 3010f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getASTContext().setExternalSource(Source); 3020f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 3030f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3040f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarExternalASTSource * 3055f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createPCHExternalASTSource(StringRef Path, 3060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar const std::string &Sysroot, 307fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor bool DisablePCHValidation, 308bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 3090f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Preprocessor &PP, 310ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl ASTContext &Context, 3111d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl void *DeserializationListener, 312f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool Preamble, 313f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool UseGlobalModuleIndex) { 3146f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTReader> Reader; 315f8a1e51c48761ee1d7803c3fa35ac94f42ebb55eDouglas Gregor Reader.reset(new ASTReader(PP, Context, 316832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 3174182ed686283b72736b287cbe28583cb641f8934Argyrios Kyrtzidis DisablePCHValidation, 318f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor AllowPCHWithCompilerErrors, 319f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor UseGlobalModuleIndex)); 3200f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 321ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl Reader->setDeserializationListener( 322571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian Redl static_cast<ASTDeserializationListener *>(DeserializationListener)); 323a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi switch (Reader->ReadAST(Path, 324a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Preamble ? serialization::MK_Preamble 32538295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor : serialization::MK_PCH, 326958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis SourceLocation(), 32738295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor ASTReader::ARR_None)) { 328c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Success: 3290f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 3300f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 3310f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 3320f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return Reader.take(); 3330f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 334c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Failure: 3350f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 3360f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3370f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 338677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: 3394825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::OutOfDate: 3404825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 3414825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 3424825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 3430f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 3440f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3450f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 3460f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3470f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return 0; 3480f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 349c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 350c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 351c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 352a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool EnableCodeCompletion(Preprocessor &PP, 3531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const std::string &Filename, 3541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Line, 3551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Column) { 3561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Tell the source manager to chop off the given file at a specific 3571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // line and column. 35839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *Entry = PP.getFileManager().getFile(Filename); 3591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Entry) { 3601abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 3611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor << Filename; 3621abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return true; 3631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Truncate the named file at the given line/column. 3661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.SetCodeCompletionPoint(Entry, Line, Column); 3671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return false; 3681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 3691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 370c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 371c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 3721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) { 3739bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer( 3741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor createCodeCompletionConsumer(getPreprocessor(), 3751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.FileName, Loc.Line, Loc.Column, 376d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko getFrontendOpts().CodeCompleteOpts, 3771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::outs())); 3781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) 3791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return; 3801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, 3811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.Line, Loc.Column)) { 3829bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 383c3d43b783dfb1a1502aa8b31ab1985cf237b1f77Douglas Gregor return; 3841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (CompletionConsumer->isOutputBinary() && 387a603569515eea06e54e6e041b1c690d33086f375Rafael Espindola llvm::sys::ChangeStdoutToBinary()) { 3882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary); 3899bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 3902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 391c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 392c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 393f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnamvoid CompilerInstance::createFrontendTimer() { 394f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam FrontendTimer.reset(new llvm::Timer("Clang front-end timer")); 395f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam} 396f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam 397c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 398c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 399c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const std::string &Filename, 400c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 401c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 402d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const CodeCompleteOptions &Opts, 4035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS) { 4041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableCodeCompletion(PP, Filename, Line, Column)) 405c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return 0; 406c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 407c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 408d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return new PrintingCodeCompleteConsumer(Opts, OS); 409c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 410a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 411467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorvoid CompilerInstance::createSema(TranslationUnitKind TUKind, 412f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor CodeCompleteConsumer *CompletionConsumer) { 413f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(), 414467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUKind, CompletionConsumer)); 415f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 416f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 417a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files 418a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 419dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidisvoid CompilerInstance::addOutputFile(const OutputFile &OutFile) { 420dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis assert(OutFile.OS && "Attempt to add empty stream to output list!"); 421dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis OutputFiles.push_back(OutFile); 422a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 423a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 424e51dd7be67808d52c80c09b832d875e9655ce6e0Kovarththanan Rajaratnamvoid CompilerInstance::clearOutputFiles(bool EraseFiles) { 425dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis for (std::list<OutputFile>::iterator 426a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { 427dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis delete it->OS; 428dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (!it->TempFilename.empty()) { 429af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (EraseFiles) { 430af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 431af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 432af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson } else { 433f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> NewOutFile(it->Filename); 434af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 435389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // If '-working-directory' was passed, the output filename should be 436389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // relative to that. 4372e2468e2d2ccbb9a38fe3b6b754009af7e5d39a9Anders Carlsson FileMgr->FixupRelativePath(NewOutFile); 438af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (llvm::error_code ec = llvm::sys::fs::rename(it->TempFilename, 439af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson NewOutFile.str())) { 440832a2aac5766dd78f113e0f03a0c62fd0eacbc97Manuel Klimek getDiagnostics().Report(diag::err_unable_to_rename_temp) 441af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson << it->TempFilename << it->Filename << ec.message(); 442af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 443af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 444af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 445dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 446dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 447dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } else if (!it->Filename.empty() && EraseFiles) 44848955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(it->Filename); 449a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 450a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar } 451a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.clear(); 452a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 453a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 454f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 455f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createDefaultOutputFile(bool Binary, 4565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension) { 458f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return createOutputFile(getFrontendOpts().OutputFile, Binary, 459e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*RemoveFileOnSignal=*/true, InFile, Extension, 460e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*UseTemporary=*/true); 461f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 462f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 463f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4645f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 465ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool Binary, bool RemoveFileOnSignal, 4665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4677e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis StringRef Extension, 46812f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool UseTemporary, 46912f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories) { 470dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string Error, OutputPathName, TempPathName; 471f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, 472ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar RemoveFileOnSignal, 473f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar InFile, Extension, 4747e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis UseTemporary, 47512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar CreateMissingDirectories, 476dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &OutputPathName, 477dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &TempPathName); 478f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) { 479360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar getDiagnostics().Report(diag::err_fe_unable_to_open_output) 480360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar << OutputPath << Error; 481360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar return 0; 482f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 483f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 484f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // Add the output file -- but don't try to remove "-", since this means we are 485f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // using stdin. 486dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", 487dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis TempPathName, OS)); 488f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 489f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return OS; 490f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 491f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 492f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4935f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 494f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string &Error, 495f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar bool Binary, 496ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool RemoveFileOnSignal, 4975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension, 4997e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis bool UseTemporary, 50012f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories, 501dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *ResultPathName, 502dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *TempPathName) { 50312f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar assert((!CreateMissingDirectories || UseTemporary) && 50412f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar "CreateMissingDirectories is only allowed when using temporary files"); 50512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar 506dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string OutFile, TempFile; 507f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OutputPath.empty()) { 508f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = OutputPath; 509f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (InFile == "-") { 510f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 511f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (!Extension.empty()) { 51248955f8119261c47cac564d1b6976c8f6441800aRafael Espindola SmallString<128> Path(InFile); 51348955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::path::replace_extension(Path, Extension); 514f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = Path.str(); 515f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else { 516f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 517f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 5187e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 5196f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::raw_fd_ostream> OS; 5207e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis std::string OSFile; 5217e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 522375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 523375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (OutFile == "-") 524375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 525375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola else { 526375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::file_status Status; 527375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::status(OutputPath, Status); 528375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (llvm::sys::fs::exists(Status)) { 529375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Fail early if we can't write to the final destination. 530375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::can_write(OutputPath)) 531375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola return 0; 532375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 533375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Don't use a temporary if the output is a special file. This handles 534375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // things like '-o /dev/null' 535375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::is_regular_file(Status)) 536375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 537375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 538375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 539375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 540375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 541375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 542375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Create a temporary file. 543375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola SmallString<128> TempPath; 544375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath = OutFile; 545375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath += "-%%%%%%%%"; 546375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola int fd; 54770e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola llvm::error_code EC = 54870e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola llvm::sys::fs::createUniqueFile(TempPath.str(), fd, TempPath); 5498ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5508ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (CreateMissingDirectories && 551abab18373808f2a179a97b00d574e306970934d7Rafael Espindola EC == llvm::errc::no_such_file_or_directory) { 5528ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Parent = llvm::sys::path::parent_path(OutputPath); 5538ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola EC = llvm::sys::fs::create_directories(Parent); 5548ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 55570e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola EC = llvm::sys::fs::createUniqueFile(TempPath.str(), fd, TempPath); 5568ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5578ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5588ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5598ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 560375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); 561375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OSFile = TempFile = TempPath.str(); 562dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 563375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // If we failed to create the temporary, fallback to writing to the file 564375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directly. This handles the corner case where we cannot write to the 565375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directory, but can write to the file. 566dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 567dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 5687e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!OS) { 5697e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis OSFile = OutFile; 570d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola OS.reset(new llvm::raw_fd_ostream( 571d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola OSFile.c_str(), Error, 572d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola (Binary ? llvm::sys::fs::F_Binary : llvm::sys::fs::F_None))); 5737e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!Error.empty()) 5747e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis return 0; 5757e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis } 576f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 577dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis // Make sure the out stream file gets removed if we crash. 578ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar if (RemoveFileOnSignal) 5796f2e23b25d9be365266be43ffa1cf6f850b6027eRafael Espindola llvm::sys::RemoveFileOnSignal(OSFile); 580dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 581f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (ResultPathName) 582f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar *ResultPathName = OutFile; 583dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (TempPathName) 584dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis *TempPathName = TempFile; 585f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 586fc97102a80bfe0afaa25883a2aa6b5e1d7307d0aDaniel Dunbar return OS.take(); 587f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 588ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 589ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar// Initialization Utilities 590ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 5918e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){ 5928e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis return InitializeSourceManager(Input, getDiagnostics(), 593a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFileManager(), getSourceManager(), 594a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFrontendOpts()); 595ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 596ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 5978e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, 598d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags, 599ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar FileManager &FileMgr, 600ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar SourceManager &SourceMgr, 601ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar const FrontendOptions &Opts) { 6028e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis SrcMgr::CharacteristicKind 6038616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User; 6048e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis 605ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis if (Input.isBuffer()) { 606ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis SourceMgr.createMainFileIDForMemBuffer(Input.getBuffer(), Kind); 607ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis assert(!SourceMgr.getMainFileID().isInvalid() && 608ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis "Couldn't establish MainFileID!"); 609ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis return true; 610ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis } 611ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 612ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis StringRef InputFile = Input.getFile(); 613ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 614507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis // Figure out where to get and map in the main file. 615507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis if (InputFile != "-") { 61639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *File = FileMgr.getFile(InputFile); 617694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman if (!File) { 618ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading) << InputFile; 619ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 620ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 621ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar 622ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // The natural SourceManager infrastructure can't currently handle named 623ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // pipes, but we would at least like to accept them for the main 624ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // file. Detect them here, read them with the more generic MemoryBuffer 625ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // function, and simply override their contents as we do for STDIN. 626ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (File->isNamedPipe()) { 627ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar OwningPtr<llvm::MemoryBuffer> MB; 628ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (llvm::error_code ec = llvm::MemoryBuffer::getFile(InputFile, MB)) { 629ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar Diags.Report(diag::err_cannot_open_file) << InputFile << ec.message(); 630ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar return false; 631ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 632acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 633acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar // Create a new virtual file that will have the correct size. 634acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar File = FileMgr.getVirtualFile(InputFile, MB->getBufferSize(), 0); 635ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar SourceMgr.overrideFileContents(File, MB.take()); 636ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 637acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 638acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar SourceMgr.createMainFileID(File, Kind); 639ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } else { 6406f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::MemoryBuffer> SB; 6414eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer if (llvm::MemoryBuffer::getSTDIN(SB)) { 6423a321e23f66128dbb986343927456ff6702af617Michael J. Spencer // FIXME: Give ec.message() in this diag. 643ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading_stdin); 644ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 645ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 64690d9081cacb4b0163f2c7527f666d6515257067cDan Gohman const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), 64739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SB->getBufferSize(), 0); 648a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor SourceMgr.createMainFileID(File, Kind); 6494eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer SourceMgr.overrideFileContents(File, SB.take()); 650ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 651ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 652694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman assert(!SourceMgr.getMainFileID().isInvalid() && 653694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman "Couldn't establish MainFileID!"); 654ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return true; 655ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 6560397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6570397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar// High-Level Operations 6580397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6590397af277e3bba16da1fd125ddba07415686b429Daniel Dunbarbool CompilerInstance::ExecuteAction(FrontendAction &Act) { 6600397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(hasDiagnostics() && "Diagnostics engine is not initialized!"); 6610397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!"); 6620397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!"); 6630397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6640397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: Take this as an argument, once all the APIs we used have moved to 6650397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // taking it as an input instead of hard-coding llvm::errs. 6665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS = llvm::errs(); 6670397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6680397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Create the target instance. 66949a87549f4dc95ecb3d8a593b71df7c167a51f85Douglas Gregor setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), &getTargetOpts())); 6700397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (!hasTarget()) 6710397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar return false; 6720397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6730397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Inform the target of the language options. 6740397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // 6750397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: We shouldn't need to do this, the target should be immutable once 6760397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // created. This complexity should be lifted elsewhere. 6770397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getTarget().setForcedLangOptions(getLangOpts()); 6780397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 67993a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian // rewriter project will change target built-in bool type from its default. 68093a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian if (getFrontendOpts().ProgramAction == frontend::RewriteObjC) 68193a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian getTarget().noSignedCharForObjCBool(); 68293a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian 6830397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Validate/process some options. 6840397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getHeaderSearchOpts().Verbose) 6850397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "clang -cc1 version " CLANG_VERSION_STRING 6860397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar << " based upon " << PACKAGE_STRING 6875d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop << " default target " << llvm::sys::getDefaultTargetTriple() << "\n"; 6880397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6890397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getFrontendOpts().ShowTimers) 6900397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar createFrontendTimer(); 6910397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 69295dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor if (getFrontendOpts().ShowStats) 69395dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor llvm::EnableStatistics(); 694a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 6950397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) { 6962056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar // Reset the ID tables if we are reusing the SourceManager. 6972056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (hasSourceManager()) 6982056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar getSourceManager().clearIDTables(); 6990397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7001f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor if (Act.BeginSourceFile(*this, getFrontendOpts().Inputs[i])) { 7010397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.Execute(); 7020397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.EndSourceFile(); 7030397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7040397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7050397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 70629f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis // Notify the diagnostic client that all files were processed. 70729f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis getDiagnostics().getClient()->finish(); 70829f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis 70953eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (getDiagnosticOpts().ShowCarets) { 710f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // We can have multiple diagnostics sharing one diagnostic client. 711f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // Get the total number of warnings/errors from the client. 712f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings(); 713f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumErrors = getDiagnostics().getClient()->getNumErrors(); 714a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 71553eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings) 71653eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); 71753eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings && NumErrors) 71853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " and "; 71953eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumErrors) 72053eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s"); 72153eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings || NumErrors) 72253eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " generated.\n"; 72353eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner } 7240397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7252056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (getFrontendOpts().ShowStats && hasFileManager()) { 7260397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getFileManager().PrintStats(); 7270397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "\n"; 7280397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7290397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 730ab41b97c3cddf1bcdd8bf82ab09ed3ceafcd05b1Argyrios Kyrtzidis return !getDiagnostics().getClient()->getNumErrors(); 7310397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar} 7320397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 73321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// \brief Determine the appropriate source input kind based on language 73421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// options. 73521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { 73621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.OpenCL) 73721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_OpenCL; 73821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.CUDA) 73921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_CUDA; 74021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.ObjC1) 74121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC; 74221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_CXX : IK_C; 74321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor} 74421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 7450ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregornamespace { 746f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor struct CompileModuleMapData { 747f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompilerInstance &Instance; 748f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor GenerateModuleAction &CreateModuleAction; 749f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor }; 750f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 751f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 752f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Helper function that executes the module-generating action under 753f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// a crash recovery context. 754f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorstatic void doCompileMapModule(void *UserData) { 755f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompileModuleMapData &Data 756f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = *reinterpret_cast<CompileModuleMapData *>(UserData); 757f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor Data.Instance.ExecuteAction(Data.CreateModuleAction); 758f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 759f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 7602a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregornamespace { 7612a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// \brief Function object that checks with the given macro definition should 7622a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// be removed, because it is one of the ignored macros. 7632a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor class RemoveIgnoredMacro { 7642a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts; 7652a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7662a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor public: 7672a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor explicit RemoveIgnoredMacro(const HeaderSearchOptions &HSOpts) 7682a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor : HSOpts(HSOpts) { } 7692a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7702a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor bool operator()(const std::pair<std::string, bool> &def) const { 771005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor StringRef MacroDef = def.first; 772005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0; 7732a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor } 7742a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor }; 7752a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor} 7762a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 777f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Compile a module file for the given module, using the options 778f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// provided by the importing compiler instance. 77921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic void compileModule(CompilerInstance &ImportingInstance, 780830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceLocation ImportLoc, 7811a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *Module, 782933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor StringRef ModuleFileName) { 7838ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // FIXME: have LockFileManager return an error_code so that we can 7848ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // avoid the mkdir when the directory already exists. 7858ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); 7868ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola llvm::sys::fs::create_directories(Dir); 7878ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 78852f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor llvm::LockFileManager Locked(ModuleFileName); 7892bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor switch (Locked) { 79052f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Error: 7912bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor return; 792a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 79352f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Owned: 7942bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // We're responsible for building the module ourselves. Do so below. 7952bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor break; 796a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 79752f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Shared: 7982bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // Someone else is responsible for building the module. Wait for them to 7992bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // finish. 8002bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor Locked.waitForUnlock(); 8017cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor return; 8022bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor } 803a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 804f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor ModuleMap &ModMap 805f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 806f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 80721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler invocation for creating this module. 808c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<CompilerInvocation> Invocation 80921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor (new CompilerInvocation(ImportingInstance.getInvocation())); 810a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 81118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 81218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 813b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // For any options that aren't intended to affect how a module is built, 814b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // reset them to their default values. 815d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek Invocation->getLangOpts()->resetNonModularOptions(); 81618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.resetNonModularOptions(); 817a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 8182a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // Remove any macro definitions that are explicitly ignored by the module. 8192a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // They aren't supposed to affect how the module is built anyway. 8202a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts(); 8212a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.erase(std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(), 8222a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor RemoveIgnoredMacro(HSOpts)), 8232a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.end()); 8242a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 8252a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 826b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor // Note the name of the module we're building. 827933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName(); 828b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor 829463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Make sure that the failed-module structure has been allocated in 830463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // the importing instance, and propagate the pointer to the newly-created 831463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // instance. 832463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PreprocessorOptions &ImportingPPOpts 833463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor = ImportingInstance.getInvocation().getPreprocessorOpts(); 834463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (!ImportingPPOpts.FailedModules) 835463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet; 836463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PPOpts.FailedModules = ImportingPPOpts.FailedModules; 837463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 83818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // If there is a module map file, build the module using the module map. 839b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // Set up the inputs/outputs so that we build the module from its umbrella 840b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // header. 84121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOptions &FrontendOpts = Invocation->getFrontendOpts(); 8426e975c4517958bcc11c834336d340797356058dbDouglas Gregor FrontendOpts.OutputFile = ModuleFileName.str(); 84321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.DisableFree = false; 844f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor FrontendOpts.GenerateGlobalModuleIndex = false; 84521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.Inputs.clear(); 84618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts()); 847a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 84818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Get or create the module map that we'll use to build this module. 849f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> TempModuleMapFileName; 85018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (const FileEntry *ModuleMapFile 85118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor = ModMap.getContainingModuleMapFile(Module)) { 85218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Use the module map where this module resides. 8531f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendOpts.Inputs.push_back(FrontendInputFile(ModuleMapFile->getName(), 8541f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor IK)); 85518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } else { 85618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Create a temporary module map file. 85718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor int FD; 8581ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola if (llvm::sys::fs::createTemporaryFile(Module->Name, "map", FD, 8591ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola TempModuleMapFileName)) { 860f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor ImportingInstance.getDiagnostics().Report(diag::err_module_map_temp_file) 861f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor << TempModuleMapFileName; 86218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor return; 863e912029b914f263ec22cba6f1fb41ebebcdd844fDouglas Gregor } 86418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Print the module map to this file. 86518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true); 86618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Module->print(OS); 86718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor FrontendOpts.Inputs.push_back( 8681f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendInputFile(TempModuleMapFileName.str().str(), IK)); 86918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 870a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 87118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Don't free the remapped file buffers; they are owned by our caller. 87218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.RetainRemappedFileBuffers = true; 87318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 87418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; 87576d991ec6c5cd247ee18fe65c35d43c2d47cf094Douglas Gregor assert(ImportingInstance.getInvocation().getModuleHash() == 87618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getModuleHash() && "Module hash mismatch!"); 87718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 87821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler instance that will be used to actually create the 87921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // module. 88021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor CompilerInstance Instance; 88121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor Instance.setInvocation(&*Invocation); 882a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 883a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor Instance.createDiagnostics(new ForwardingDiagnosticConsumer( 884a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor ImportingInstance.getDiagnosticClient()), 885cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor /*ShouldOwnClient=*/true); 886830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 8874565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor // Note that this module is part of the module build stack, so that we 888830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor // can detect cycles in the module graph. 889830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createFileManager(); // FIXME: Adopt file manager from importer? 890830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createSourceManager(Instance.getFileManager()); 891830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceManager &SourceMgr = Instance.getSourceManager(); 8924565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.setModuleBuildStack( 8934565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor ImportingInstance.getSourceManager().getModuleBuildStack()); 8944565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(), 895830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager())); 896830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 897830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 89821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a module-generating action. 8998f5d7d1d1f990f174c7f2682271a83acf64dd93dDouglas Gregor GenerateModuleAction CreateModuleAction(Module->IsSystem); 90018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 9010ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // Execute the action to actually build the module in-place. Use a separate 9020ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // thread so that we get a stack large enough. 9030ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor const unsigned ThreadStackSize = 8 << 20; 9040ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor llvm::CrashRecoveryContext CRC; 90518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CompileModuleMapData Data = { Instance, CreateModuleAction }; 90618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CRC.RunSafelyOnThread(&doCompileMapModule, &Data, ThreadStackSize); 907a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 90818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 90918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Delete the temporary module map file. 91018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // FIXME: Even though we're executing under crash protection, it would still 91118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // be nice to do this with RemoveFileOnSignal when we can. However, that 91218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // doesn't make sense for all clients, so clean this up manually. 913a2e94892e273423e2f772f989921cda6442a66c4Benjamin Kramer Instance.clearOutputFiles(/*EraseFiles=*/true); 91418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (!TempModuleMapFileName.empty()) 91548955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(TempModuleMapFileName.str()); 916a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor 917a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // We've rebuilt a module. If we're allowed to generate or update the global 918a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // module index, record that fact in the importing compiler instance. 919f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) { 920a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ImportingInstance.setBuildGlobalModuleIndex(true); 921a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor } 922a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi} 92321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 92463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Diagnose differences between the current definition of the given 92563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// configuration macro and the definition provided on the command line. 92663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorstatic void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, 92763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module *Mod, SourceLocation ImportLoc) { 92863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro); 92963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor SourceManager &SourceMgr = PP.getSourceManager(); 93063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 93163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier has never had a macro definition, then it could 93263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // not have changed. 93363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hadMacroDefinition()) 93463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 93563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 93663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier does not currently have a macro definition, 93763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // check whether it had one on the command line. 93863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hasMacroDefinition()) { 939c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 940c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 941c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 942c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 943c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 94463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 94563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 94663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 94763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 948670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 94963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 95063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 95163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This macro was defined on the command line, then #undef'd later. 95263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Complain. 95363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 95463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true << ConfigMacro << Mod->getFullModuleName(); 955c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.isUndefined()) 956c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here) 95763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true; 95863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 95963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 96063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 96163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Okay: no definition in the predefines buffer. 96263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 96363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 96463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 96563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This identifier has a macro definition. Check whether we had a definition 96663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // on the command line. 967c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 968c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 969c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo PredefinedDef; 970c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 971c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 972c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 97363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 97463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 97563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 97663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 977670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 97863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 97963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 980c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef = Def; 98163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 98263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 98363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 98463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If there was no definition for this macro in the predefines buffer, 98563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // complain. 986c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (!PredefinedDef || 987c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis (!PredefinedDef.getLocation().isValid() && 988c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef.getUndefLocation().isValid())) { 98963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 99063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 991c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 99263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 99363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 99463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 99563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 99663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If the current macro definition is the same as the predefined macro 99763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // definition, it's okay. 998c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.getMacroInfo() == PredefinedDef.getMacroInfo() || 999bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis LatestDef.getMacroInfo()->isIdenticalTo(*PredefinedDef.getMacroInfo(),PP, 1000bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /*Syntactically=*/true)) 100163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 100263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 100363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // The macro definitions differ. 100463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 100563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 1006c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 100763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 100863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor} 100963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1010d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Write a new timestamp file with the given path. 1011d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void writeTimestampFile(StringRef TimestampFile) { 1012d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor std::string ErrorInfo; 1013d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::raw_fd_ostream Out(TimestampFile.str().c_str(), ErrorInfo, 1014d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola llvm::sys::fs::F_Binary); 1015d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1016d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1017d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Prune the module cache of modules that haven't been accessed in 1018d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// a long time. 1019d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void pruneModuleCache(const HeaderSearchOptions &HSOpts) { 1020d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor struct stat StatBuf; 1021d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::SmallString<128> TimestampFile; 1022d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor TimestampFile = HSOpts.ModuleCachePath; 1023d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::append(TimestampFile, "modules.timestamp"); 1024d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1025d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Try to stat() the timestamp file. 1026d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(TimestampFile.c_str(), &StatBuf)) { 1027d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the timestamp file wasn't there, create one now. 1028d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (errno == ENOENT) { 1029d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1030d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1031d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1032d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1033d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1034d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Check whether the time stamp is older than our pruning interval. 1035d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If not, do nothing. 1036d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t TimeStampModTime = StatBuf.st_mtime; 1037d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t CurrentTime = time(0); 103893ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval)) 1039d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1040d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1041d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Write a new timestamp file so that nobody else attempts to prune. 1042d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // There is a benign race condition here, if two Clang instances happen to 1043d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // notice at the same time that the timestamp is out-of-date. 1044d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1045d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1046d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk the entire module cache, looking for unused module files and module 1047d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // indices. 1048d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::error_code EC; 1049d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor SmallString<128> ModuleCachePathNative; 1050d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative); 1051d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator 1052d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir(ModuleCachePathNative.str(), EC), DirEnd; 1053d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 1054d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we don't have a directory, there's nothing to look into. 1055b470d1a54877e7b3622e4cbdeae423c6d51be696Rafael Espindola if (!llvm::sys::fs::is_directory(Dir->path())) 1056d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1057d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1058d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk all of the files within this directory. 1059d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool RemovedAllFiles = true; 1060d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd; 1061d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor File != FileEnd && !EC; File.increment(EC)) { 1062d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // We only care about module and global module index files. 1063d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::path::extension(File->path()) != ".pcm" && 1064d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::filename(File->path()) != "modules.idx") { 1065d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1066d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1067d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1068d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1069d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Look at this file. If we can't stat it, there's nothing interesting 1070d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // there. 1071d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(File->path().c_str(), &StatBuf)) { 1072d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1073d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1074d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1075d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1076d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the file has been used recently enough, leave it there. 1077d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t FileAccessTime = StatBuf.st_atime; 107893ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - FileAccessTime <= 107993ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer time_t(HSOpts.ModuleCachePruneAfter)) { 108093ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer RemovedAllFiles = false; 1081d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1082d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1083d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1084d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Remove the file. 1085d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1086d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::fs::remove(File->path(), Existed) || !Existed) { 1087d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1088d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1089d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1090d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1091d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we removed all of the files in the directory, remove the directory 1092d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // itself. 1093d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (RemovedAllFiles) { 1094d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1095d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::fs::remove(Dir->path(), Existed); 1096d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1097d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1098d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1099d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1100463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorModuleLoadResult 1101463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorCompilerInstance::loadModule(SourceLocation ImportLoc, 1102463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ModuleIdPath Path, 1103463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor Module::NameVisibilityKind Visibility, 1104463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor bool IsInclusionDirective) { 1105b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // If we've already handled this import, just return the cached result. 1106b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // This one-element cache is important to eliminate redundant diagnostics 1107b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // when both the preprocessor and parser see the same import declaration. 11085e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc) { 11095e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor // Make the named module visible. 11105e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor if (LastModuleImportResult) 11115ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, 1112906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ImportLoc, /*Complain=*/false); 1113392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return LastModuleImportResult; 11145e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor } 1115b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor 11166aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor // Determine what file we're searching from. 11173d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor StringRef ModuleName = Path[0].first->getName(); 11183d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor SourceLocation ModuleNameLoc = Path[0].second; 1119a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 11201a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor clang::Module *Module = 0; 11213d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor 112249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have information on this module, load the module now. 11231a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known 1124392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor = KnownModules.find(Path[0].first); 11255e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor if (Known != KnownModules.end()) { 11265e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Retrieve the cached top-level module. 11275e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = Known->second; 11285e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else if (ModuleName == getLangOpts().CurrentModule) { 11295e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // This is the module we're building. 11305e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = PP->getHeaderSearchInfo().getModuleMap().findModule(ModuleName); 11315e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 11325e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else { 113349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Search for a module with the given name. 1134e434ec71fccfe078906403affd641f709702d598Douglas Gregor Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); 113549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string ModuleFileName; 11368bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (Module) { 1137e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(Module); 11388bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } else 1139e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(ModuleName); 1140463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 114149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have an ASTReader, create one now. 114249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!ModuleManager) { 114349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!hasASTContext()) 114449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor createASTContext(); 114549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1146d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we're not recursively building a module, check whether we 1147d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // need to prune the module cache. 1148d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (getSourceManager().getModuleBuildStack().empty() && 1149d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneInterval > 0 && 1150d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneAfter > 0) { 1151d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor pruneModuleCache(getHeaderSearchOpts()); 1152d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1153d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 115449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string Sysroot = getHeaderSearchOpts().Sysroot; 115549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 115649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager = new ASTReader(getPreprocessor(), *Context, 115749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 1158f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor PPOpts.DisablePCHValidation, 1159f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor /*AllowASTWithCompilerErrors=*/false, 1160f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex); 116149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) { 116249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->setDeserializationListener( 116349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTDeserializationListener()); 116449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setASTMutationListener( 116549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTMutationListener()); 116649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 11676f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 116849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Source.reset(ModuleManager); 116949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setExternalSource(Source); 117049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasSema()) 117149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->InitializeSema(getSema()); 117249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) 117349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->StartTranslationUnit(&getASTConsumer()); 1174de8a9050d79d66325a18168a0994fed125a7790dDouglas Gregor } 1175a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1176677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to load the module file. 1177677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing; 1178677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor switch (ModuleManager->ReadAST(ModuleFileName, serialization::MK_Module, 1179677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ImportLoc, ARRFlags)) { 118049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Success: 118149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 11826aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor 11837cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor case ASTReader::OutOfDate: { 1184677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // The module file is out-of-date. Remove it, then rebuild it. 11857cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor bool Existed; 11867cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor llvm::sys::fs::remove(ModuleFileName, Existed); 1187677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1188677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Fall through to build the module again. 1189677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1190677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: { 1191677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // The module file is (now) missing. Build it. 1192677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1193677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // If we don't have a module, we don't know how to build the module file. 1194677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Complain and return. 1195677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (!Module) { 1196677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found) 1197677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName 1198677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1199677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildFailed = true; 1200677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return ModuleLoadResult(); 1201677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1202677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1203677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Check whether there is a cycle in the module graph. 1204677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack(); 1205677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end(); 1206677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1207677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos->first == ModuleName) 1208677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor break; 1209677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1210677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1211677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos != PosEnd) { 1212677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor SmallString<256> CyclePath; 1213677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1214677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += Pos->first; 1215677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += " -> "; 1216677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1217677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += ModuleName; 1218677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1219677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle) 1220677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName << CyclePath; 1221677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return ModuleLoadResult(); 1222677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1223463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1224463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Check whether we have already attempted to build this module (but 1225463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // failed). 1226463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (getPreprocessorOpts().FailedModules && 1227463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getPreprocessorOpts().FailedModules->hasAlreadyFailed(ModuleName)) { 1228463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built) 1229463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << ModuleName 1230463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1231f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1232463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1233463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor } 1234463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1235677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to compile the module. 1236830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor compileModule(*this, ModuleNameLoc, Module, ModuleFileName); 12377cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 1238677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to read the module file, now that we've compiled it. 1239677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ASTReader::ASTReadResult ReadResult 1240677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor = ModuleManager->ReadAST(ModuleFileName, 1241958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis serialization::MK_Module, ImportLoc, 1242677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ASTReader::ARR_Missing); 1243677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ReadResult != ASTReader::Success) { 1244677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ReadResult == ASTReader::Missing) { 1245677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, 1246677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Module? diag::err_module_not_built 1247677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor : diag::err_module_not_found) 1248677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName 1249677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1250677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1251677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1252b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor if (getPreprocessorOpts().FailedModules) 1253b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor getPreprocessorOpts().FailedModules->addFailed(ModuleName); 12547cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor KnownModules[Path[0].first] = 0; 1255f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1256463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 12577cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 12587cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 12597cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor // Okay, we've rebuilt and now loaded the module. 12607cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor break; 12617cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 12627cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 12634825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 12644825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 12654825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 12663b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 126749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // FIXME: The ASTReader will already have complained, but can we showhorn 126849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // that diagnostic information into a more useful form? 1269392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor KnownModules[Path[0].first] = 0; 1270463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1271a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 127249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Failure: 12733b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 1274392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Already complained, but note now that we failed. 1275392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor KnownModules[Path[0].first] = 0; 1276f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1277463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 127849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 127949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1280392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (!Module) { 1281392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // If we loaded the module directly, without finding a module map first, 1282392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // we'll have loaded the module's information from the module itself. 1283392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module = PP->getHeaderSearchInfo().getModuleMap() 1284392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor .findModule((Path[0].first->getName())); 1285392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 1286e2ac16b09ea66ad955752381b82fb8719d003e5eArgyrios Kyrtzidis 1287392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Cache the result of this top-level module lookup for later. 1288392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 12896aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor } 129049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1291392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // If we never found the module, fail. 1292392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (!Module) 1293463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1294392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 129549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Verify that the rest of the module path actually corresponds to 129649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // a submodule. 1297392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Path.size() > 1) { 129849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor for (unsigned I = 1, N = Path.size(); I != N; ++I) { 129949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor StringRef Name = Path[I].first->getName(); 1300b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor clang::Module *Sub = Module->findSubmodule(Name); 130149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1302b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 130349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Attempt to perform typo correction to find a module name that works. 1304cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<StringRef, 2> Best; 130549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)(); 130649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1307b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor for (clang::Module::submodule_iterator J = Module->submodule_begin(), 1308b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor JEnd = Module->submodule_end(); 1309e25633f777cfcaa564b4ed36cec37d6e6e1ecb04Matt Beaumont-Gay J != JEnd; ++J) { 1310b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor unsigned ED = Name.edit_distance((*J)->Name, 131149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor /*AllowReplacements=*/true, 131249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor BestEditDistance); 131349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (ED <= BestEditDistance) { 1314b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (ED < BestEditDistance) { 131549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best.clear(); 1316b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor BestEditDistance = ED; 1317b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor } 1318b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1319b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Best.push_back((*J)->Name); 132049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 132149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 132249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 132349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If there was a clear winner, user it. 132449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (Best.size() == 1) { 132549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, 132649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor diag::err_no_submodule_suggest) 1327392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() << Best[0] 132849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second) 132949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << FixItHint::CreateReplacement(SourceRange(Path[I].second), 133049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best[0]); 1331b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1332b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Sub = Module->findSubmodule(Best[0]); 133349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 133449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 133549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1336b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 133749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // No submodule by this name. Complain, and don't look for further 133849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // submodules. 133949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, diag::err_no_submodule) 1340392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() 134149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second); 134249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 134349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 134449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1345b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Module = Sub; 134649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 134749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 134849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 13495e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Make the named module visible, if it's not already part of the module 13505e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // we are parsing. 1351305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (ModuleName != getLangOpts().CurrentModule) { 1352305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (!Module->IsFromModuleFile) { 1353305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // We have an umbrella header or directory that doesn't actually include 1354305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // all of the headers within the directory it covers. Complain about 1355305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this missing submodule and recover by forgetting that we ever saw 1356305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this submodule. 1357305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // FIXME: Should we detect this at module load time? It seems fairly 1358305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // expensive (and rare). 1359305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule) 1360305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << Module->getFullModuleName() 1361305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << SourceRange(Path.front().second, Path.back().second); 1362305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor 1363463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(0, true); 1364305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 136551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 136651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Check whether this module is available. 136751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef Feature; 1368dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor if (!Module->isAvailable(getLangOpts(), getTarget(), Feature)) { 136951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor getDiagnostics().Report(ImportLoc, diag::err_module_unavailable) 137051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << Module->getFullModuleName() 137151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << Feature 137251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << SourceRange(Path.front().second, Path.back().second); 137351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor LastModuleImportLoc = ImportLoc; 1374463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(); 1375463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 137651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 137751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1378906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ModuleManager->makeModuleVisible(Module, Visibility, ImportLoc, 1379906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor /*Complain=*/true); 1380305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 138163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 138263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Check for any configuration macros that have changed. 138363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor clang::Module *TopModule = Module->getTopLevelModule(); 138463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor for (unsigned I = 0, N = TopModule->ConfigMacros.size(); I != N; ++I) { 138563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor checkConfigMacro(getPreprocessor(), TopModule->ConfigMacros[I], 138663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module, ImportLoc); 138763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 138863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 138993ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor // If this module import was due to an inclusion directive, create an 139093ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor // implicit import declaration to capture it in the AST. 139193ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor if (IsInclusionDirective && hasASTContext()) { 139293ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl(); 1393d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis ImportDecl *ImportD = ImportDecl::CreateImplicit(getASTContext(), TU, 1394d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis ImportLoc, Module, 1395d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis Path.back().second); 1396d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis TU->addDecl(ImportD); 1397d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis if (Consumer) 1398d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis Consumer->HandleImplicitImportDecl(ImportD); 139993ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor } 140049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1401b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor LastModuleImportLoc = ImportLoc; 1402463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(Module, false); 1403463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return LastModuleImportResult; 14046aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor} 1405ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 1406ca2ab45341c448284cf93770018c717810575f86Douglas Gregorvoid CompilerInstance::makeModuleVisible(Module *Mod, 14075ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis Module::NameVisibilityKind Visibility, 1408906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor SourceLocation ImportLoc, 1409906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor bool Complain){ 1410906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc, Complain); 1411ca2ab45341c448284cf93770018c717810575f86Douglas Gregor} 1412ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 1413