CompilerInstance.cpp revision b934d248d001d1536e074e3e8da8f47db63d719f
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 262708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg 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 } 273708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg 274708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg if (DepOpts.PrintShowIncludes) { 275708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg AttachHeaderIncludeGen(*PP, /*ShowAllHeaders=*/false, /*OutputPath=*/"", 276708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg /*ShowDepth=*/true, /*MSStyle=*/true); 277708002ede3938256a6223d153a0c040f7a40f5ccHans Wennborg } 27822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 2795eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2805eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 2815eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2825eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 2835eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 2844f32786ac45210143654390177105eb749b614e9Ted Kremenek Context = new ASTContext(getLangOpts(), PP.getSourceManager(), 285bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor &getTarget(), PP.getIdentifierTable(), 2864f32786ac45210143654390177105eb749b614e9Ted Kremenek PP.getSelectorTable(), PP.getBuiltinInfo(), 2874f32786ac45210143654390177105eb749b614e9Ted Kremenek /*size_reserve=*/ 0); 2885eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 2890f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2900f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 2910f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CompilerInstance::createPCHExternalASTSource(StringRef Path, 293ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl bool DisablePCHValidation, 294bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 295ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl void *DeserializationListener){ 2966f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 2971d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; 2980f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 299a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi DisablePCHValidation, 300bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis AllowPCHWithCompilerErrors, 301ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl getPreprocessor(), getASTContext(), 3021d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl DeserializationListener, 303f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor Preamble, 304f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex)); 305f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor ModuleManager = static_cast<ASTReader*>(Source.get()); 3060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getASTContext().setExternalSource(Source); 3070f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 3080f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3090f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarExternalASTSource * 3105f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createPCHExternalASTSource(StringRef Path, 3110f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar const std::string &Sysroot, 312fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor bool DisablePCHValidation, 313bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 3140f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Preprocessor &PP, 315ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl ASTContext &Context, 3161d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl void *DeserializationListener, 317f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool Preamble, 318f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool UseGlobalModuleIndex) { 3196f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTReader> Reader; 320f8a1e51c48761ee1d7803c3fa35ac94f42ebb55eDouglas Gregor Reader.reset(new ASTReader(PP, Context, 321832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 3224182ed686283b72736b287cbe28583cb641f8934Argyrios Kyrtzidis DisablePCHValidation, 323f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor AllowPCHWithCompilerErrors, 324f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor UseGlobalModuleIndex)); 3250f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 326ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl Reader->setDeserializationListener( 327571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian Redl static_cast<ASTDeserializationListener *>(DeserializationListener)); 328a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi switch (Reader->ReadAST(Path, 329a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Preamble ? serialization::MK_Preamble 33038295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor : serialization::MK_PCH, 331958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis SourceLocation(), 33238295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor ASTReader::ARR_None)) { 333c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Success: 3340f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 3350f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 3360f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 3370f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return Reader.take(); 3380f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 339c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Failure: 3400f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 3410f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3420f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 343677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: 3444825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::OutOfDate: 3454825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 3464825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 3474825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 3480f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 3490f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3500f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 3510f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3520f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return 0; 3530f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 354c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 355c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 356c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 357a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool EnableCodeCompletion(Preprocessor &PP, 3581abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const std::string &Filename, 3591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Line, 3601abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Column) { 3611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Tell the source manager to chop off the given file at a specific 3621abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // line and column. 36339b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *Entry = PP.getFileManager().getFile(Filename); 3641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Entry) { 3651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 3661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor << Filename; 3671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return true; 3681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3701abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Truncate the named file at the given line/column. 3711abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.SetCodeCompletionPoint(Entry, Line, Column); 3721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return false; 3731abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 3741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 375c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 376c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 3771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) { 3789bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer( 3791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor createCodeCompletionConsumer(getPreprocessor(), 3801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.FileName, Loc.Line, Loc.Column, 381d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko getFrontendOpts().CodeCompleteOpts, 3821abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::outs())); 3831abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) 3841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return; 3851abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, 3861abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.Line, Loc.Column)) { 3879bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 388c3d43b783dfb1a1502aa8b31ab1985cf237b1f77Douglas Gregor return; 3891abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3912b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (CompletionConsumer->isOutputBinary() && 392a603569515eea06e54e6e041b1c690d33086f375Rafael Espindola llvm::sys::ChangeStdoutToBinary()) { 3932b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary); 3949bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 3952b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 396c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 397c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 398f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnamvoid CompilerInstance::createFrontendTimer() { 399f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam FrontendTimer.reset(new llvm::Timer("Clang front-end timer")); 400f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam} 401f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam 402c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 403c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 404c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const std::string &Filename, 405c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 406c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 407d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const CodeCompleteOptions &Opts, 4085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS) { 4091abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableCodeCompletion(PP, Filename, Line, Column)) 410c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return 0; 411c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 412c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 413d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return new PrintingCodeCompleteConsumer(Opts, OS); 414c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 415a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 416467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorvoid CompilerInstance::createSema(TranslationUnitKind TUKind, 417f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor CodeCompleteConsumer *CompletionConsumer) { 418f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(), 419467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUKind, CompletionConsumer)); 420f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 421f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 422a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files 423a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 424dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidisvoid CompilerInstance::addOutputFile(const OutputFile &OutFile) { 425dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis assert(OutFile.OS && "Attempt to add empty stream to output list!"); 426dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis OutputFiles.push_back(OutFile); 427a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 428a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 429e51dd7be67808d52c80c09b832d875e9655ce6e0Kovarththanan Rajaratnamvoid CompilerInstance::clearOutputFiles(bool EraseFiles) { 430dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis for (std::list<OutputFile>::iterator 431a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { 432dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis delete it->OS; 433dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (!it->TempFilename.empty()) { 434af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (EraseFiles) { 435af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 436af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 437af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson } else { 438f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> NewOutFile(it->Filename); 439af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 440389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // If '-working-directory' was passed, the output filename should be 441389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // relative to that. 4422e2468e2d2ccbb9a38fe3b6b754009af7e5d39a9Anders Carlsson FileMgr->FixupRelativePath(NewOutFile); 443af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (llvm::error_code ec = llvm::sys::fs::rename(it->TempFilename, 444af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson NewOutFile.str())) { 445832a2aac5766dd78f113e0f03a0c62fd0eacbc97Manuel Klimek getDiagnostics().Report(diag::err_unable_to_rename_temp) 446af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson << it->TempFilename << it->Filename << ec.message(); 447af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 448af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 449af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 450dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 451dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 452dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } else if (!it->Filename.empty() && EraseFiles) 45348955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(it->Filename); 454a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 455a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar } 456a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.clear(); 457a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 458a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 459f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 460f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createDefaultOutputFile(bool Binary, 4615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension) { 463f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return createOutputFile(getFrontendOpts().OutputFile, Binary, 464e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*RemoveFileOnSignal=*/true, InFile, Extension, 465e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*UseTemporary=*/true); 466f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 467f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 468f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4695f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 470ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool Binary, bool RemoveFileOnSignal, 4715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4727e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis StringRef Extension, 47312f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool UseTemporary, 47412f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories) { 475dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string Error, OutputPathName, TempPathName; 476f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, 477ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar RemoveFileOnSignal, 478f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar InFile, Extension, 4797e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis UseTemporary, 48012f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar CreateMissingDirectories, 481dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &OutputPathName, 482dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &TempPathName); 483f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) { 484360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar getDiagnostics().Report(diag::err_fe_unable_to_open_output) 485360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar << OutputPath << Error; 486360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar return 0; 487f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 488f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 489f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // Add the output file -- but don't try to remove "-", since this means we are 490f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // using stdin. 491dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", 492dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis TempPathName, OS)); 493f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 494f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return OS; 495f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 496f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 497f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4985f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 499f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string &Error, 500f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar bool Binary, 501ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool RemoveFileOnSignal, 5025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 5035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension, 5047e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis bool UseTemporary, 50512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories, 506dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *ResultPathName, 507dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *TempPathName) { 50812f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar assert((!CreateMissingDirectories || UseTemporary) && 50912f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar "CreateMissingDirectories is only allowed when using temporary files"); 51012f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar 511dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string OutFile, TempFile; 512f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OutputPath.empty()) { 513f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = OutputPath; 514f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (InFile == "-") { 515f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 516f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (!Extension.empty()) { 51748955f8119261c47cac564d1b6976c8f6441800aRafael Espindola SmallString<128> Path(InFile); 51848955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::path::replace_extension(Path, Extension); 519f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = Path.str(); 520f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else { 521f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 522f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 5237e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 5246f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::raw_fd_ostream> OS; 5257e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis std::string OSFile; 5267e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 527375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 528375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (OutFile == "-") 529375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 530375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola else { 531375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::file_status Status; 532375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::status(OutputPath, Status); 533375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (llvm::sys::fs::exists(Status)) { 534375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Fail early if we can't write to the final destination. 535375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::can_write(OutputPath)) 536375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola return 0; 537375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 538375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Don't use a temporary if the output is a special file. This handles 539375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // things like '-o /dev/null' 540375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::is_regular_file(Status)) 541375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 542375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 543375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 544375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 545375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 546375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 547375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Create a temporary file. 548375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola SmallString<128> TempPath; 549375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath = OutFile; 550375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath += "-%%%%%%%%"; 551375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola int fd; 55270e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola llvm::error_code EC = 55370e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola llvm::sys::fs::createUniqueFile(TempPath.str(), fd, TempPath); 5548ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5558ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (CreateMissingDirectories && 556abab18373808f2a179a97b00d574e306970934d7Rafael Espindola EC == llvm::errc::no_such_file_or_directory) { 5578ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Parent = llvm::sys::path::parent_path(OutputPath); 5588ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola EC = llvm::sys::fs::create_directories(Parent); 5598ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 56070e7aeccbf5856a84f81366c6c1a0c0c01e70063Rafael Espindola EC = llvm::sys::fs::createUniqueFile(TempPath.str(), fd, TempPath); 5618ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5628ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5638ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5648ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 565375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); 566375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OSFile = TempFile = TempPath.str(); 567dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 568375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // If we failed to create the temporary, fallback to writing to the file 569375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directly. This handles the corner case where we cannot write to the 570375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directory, but can write to the file. 571dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 572dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 5737e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!OS) { 5747e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis OSFile = OutFile; 575d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola OS.reset(new llvm::raw_fd_ostream( 576d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola OSFile.c_str(), Error, 577d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola (Binary ? llvm::sys::fs::F_Binary : llvm::sys::fs::F_None))); 5787e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!Error.empty()) 5797e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis return 0; 5807e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis } 581f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 582dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis // Make sure the out stream file gets removed if we crash. 583ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar if (RemoveFileOnSignal) 5846f2e23b25d9be365266be43ffa1cf6f850b6027eRafael Espindola llvm::sys::RemoveFileOnSignal(OSFile); 585dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 586f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (ResultPathName) 587f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar *ResultPathName = OutFile; 588dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (TempPathName) 589dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis *TempPathName = TempFile; 590f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 591fc97102a80bfe0afaa25883a2aa6b5e1d7307d0aDaniel Dunbar return OS.take(); 592f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 593ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 594ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar// Initialization Utilities 595ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 5968e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){ 5978e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis return InitializeSourceManager(Input, getDiagnostics(), 598a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFileManager(), getSourceManager(), 599a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFrontendOpts()); 600ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 601ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 6028e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, 603d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags, 604ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar FileManager &FileMgr, 605ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar SourceManager &SourceMgr, 606ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar const FrontendOptions &Opts) { 6078e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis SrcMgr::CharacteristicKind 6088616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User; 6098e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis 610ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis if (Input.isBuffer()) { 611ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis SourceMgr.createMainFileIDForMemBuffer(Input.getBuffer(), Kind); 612ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis assert(!SourceMgr.getMainFileID().isInvalid() && 613ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis "Couldn't establish MainFileID!"); 614ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis return true; 615ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis } 616ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 617ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis StringRef InputFile = Input.getFile(); 618ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 619507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis // Figure out where to get and map in the main file. 620507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis if (InputFile != "-") { 621a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer const FileEntry *File = FileMgr.getFile(InputFile, /*OpenFile=*/true); 622694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman if (!File) { 623ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading) << InputFile; 624ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 625ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 626ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar 627ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // The natural SourceManager infrastructure can't currently handle named 628ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // pipes, but we would at least like to accept them for the main 629a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // file. Detect them here, read them with the volatile flag so FileMgr will 630a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // pick up the correct size, and simply override their contents as we do for 631a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // STDIN. 632ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (File->isNamedPipe()) { 633a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer std::string ErrorStr; 634a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer if (llvm::MemoryBuffer *MB = 635a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer FileMgr.getBufferForFile(File, &ErrorStr, /*isVolatile=*/true)) { 636a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer // Create a new virtual file that will have the correct size. 637a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer File = FileMgr.getVirtualFile(InputFile, MB->getBufferSize(), 0); 638a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer SourceMgr.overrideFileContents(File, MB); 639a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer } else { 640a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer Diags.Report(diag::err_cannot_open_file) << InputFile << ErrorStr; 641ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar return false; 642ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 643ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 644acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 645acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar SourceMgr.createMainFileID(File, Kind); 646ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } else { 6476f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::MemoryBuffer> SB; 648a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer if (llvm::error_code ec = llvm::MemoryBuffer::getSTDIN(SB)) { 649a3bf897544692cf71e34f090f39b54f9adf5c8ccBenjamin Kramer Diags.Report(diag::err_fe_error_reading_stdin) << ec.message(); 650ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 651ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 65290d9081cacb4b0163f2c7527f666d6515257067cDan Gohman const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), 65339b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SB->getBufferSize(), 0); 654a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor SourceMgr.createMainFileID(File, Kind); 6554eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer SourceMgr.overrideFileContents(File, SB.take()); 656ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 657ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 658694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman assert(!SourceMgr.getMainFileID().isInvalid() && 659694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman "Couldn't establish MainFileID!"); 660ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return true; 661ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 6620397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6630397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar// High-Level Operations 6640397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6650397af277e3bba16da1fd125ddba07415686b429Daniel Dunbarbool CompilerInstance::ExecuteAction(FrontendAction &Act) { 6660397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(hasDiagnostics() && "Diagnostics engine is not initialized!"); 6670397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!"); 6680397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!"); 6690397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6700397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: Take this as an argument, once all the APIs we used have moved to 6710397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // taking it as an input instead of hard-coding llvm::errs. 6725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS = llvm::errs(); 6730397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6740397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Create the target instance. 67549a87549f4dc95ecb3d8a593b71df7c167a51f85Douglas Gregor setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), &getTargetOpts())); 6760397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (!hasTarget()) 6770397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar return false; 6780397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6790397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Inform the target of the language options. 6800397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // 6810397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: We shouldn't need to do this, the target should be immutable once 6820397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // created. This complexity should be lifted elsewhere. 6830397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getTarget().setForcedLangOptions(getLangOpts()); 6840397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 68593a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian // rewriter project will change target built-in bool type from its default. 68693a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian if (getFrontendOpts().ProgramAction == frontend::RewriteObjC) 68793a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian getTarget().noSignedCharForObjCBool(); 68893a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian 6890397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Validate/process some options. 6900397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getHeaderSearchOpts().Verbose) 6910397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "clang -cc1 version " CLANG_VERSION_STRING 6920397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar << " based upon " << PACKAGE_STRING 6935d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop << " default target " << llvm::sys::getDefaultTargetTriple() << "\n"; 6940397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6950397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getFrontendOpts().ShowTimers) 6960397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar createFrontendTimer(); 6970397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 69895dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor if (getFrontendOpts().ShowStats) 69995dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor llvm::EnableStatistics(); 700a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 7010397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) { 7022056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar // Reset the ID tables if we are reusing the SourceManager. 7032056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (hasSourceManager()) 7042056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar getSourceManager().clearIDTables(); 7050397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7061f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor if (Act.BeginSourceFile(*this, getFrontendOpts().Inputs[i])) { 7070397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.Execute(); 7080397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.EndSourceFile(); 7090397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7100397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7110397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 71229f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis // Notify the diagnostic client that all files were processed. 71329f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis getDiagnostics().getClient()->finish(); 71429f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis 71553eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (getDiagnosticOpts().ShowCarets) { 716f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // We can have multiple diagnostics sharing one diagnostic client. 717f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // Get the total number of warnings/errors from the client. 718f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings(); 719f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumErrors = getDiagnostics().getClient()->getNumErrors(); 720a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 72153eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings) 72253eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); 72353eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings && NumErrors) 72453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " and "; 72553eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumErrors) 72653eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s"); 72753eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings || NumErrors) 72853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " generated.\n"; 72953eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner } 7300397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7312056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (getFrontendOpts().ShowStats && hasFileManager()) { 7320397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getFileManager().PrintStats(); 7330397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "\n"; 7340397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7350397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 736ab41b97c3cddf1bcdd8bf82ab09ed3ceafcd05b1Argyrios Kyrtzidis return !getDiagnostics().getClient()->getNumErrors(); 7370397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar} 7380397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 73921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// \brief Determine the appropriate source input kind based on language 74021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// options. 74121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { 74221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.OpenCL) 74321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_OpenCL; 74421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.CUDA) 74521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_CUDA; 74621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.ObjC1) 74721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC; 74821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_CXX : IK_C; 74921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor} 75021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 7510ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregornamespace { 752f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor struct CompileModuleMapData { 753f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompilerInstance &Instance; 754f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor GenerateModuleAction &CreateModuleAction; 755f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor }; 756f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 757f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 758f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Helper function that executes the module-generating action under 759f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// a crash recovery context. 760f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorstatic void doCompileMapModule(void *UserData) { 761f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompileModuleMapData &Data 762f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = *reinterpret_cast<CompileModuleMapData *>(UserData); 763f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor Data.Instance.ExecuteAction(Data.CreateModuleAction); 764f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 765f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 7662a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregornamespace { 7672a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// \brief Function object that checks with the given macro definition should 7682a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// be removed, because it is one of the ignored macros. 7692a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor class RemoveIgnoredMacro { 7702a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts; 7712a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7722a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor public: 7732a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor explicit RemoveIgnoredMacro(const HeaderSearchOptions &HSOpts) 7742a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor : HSOpts(HSOpts) { } 7752a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7762a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor bool operator()(const std::pair<std::string, bool> &def) const { 777005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor StringRef MacroDef = def.first; 778005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0; 7792a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor } 7802a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor }; 7812a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor} 7822a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 783f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Compile a module file for the given module, using the options 784f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// provided by the importing compiler instance. 78521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic void compileModule(CompilerInstance &ImportingInstance, 786830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceLocation ImportLoc, 7871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *Module, 788933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor StringRef ModuleFileName) { 7898ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // FIXME: have LockFileManager return an error_code so that we can 7908ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // avoid the mkdir when the directory already exists. 7918ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); 7928ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola llvm::sys::fs::create_directories(Dir); 7938ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 79452f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor llvm::LockFileManager Locked(ModuleFileName); 7952bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor switch (Locked) { 79652f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Error: 7972bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor return; 798a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 79952f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Owned: 8002bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // We're responsible for building the module ourselves. Do so below. 8012bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor break; 802a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 80352f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Shared: 8042bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // Someone else is responsible for building the module. Wait for them to 8052bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // finish. 8062bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor Locked.waitForUnlock(); 8077cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor return; 8082bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor } 809a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 810f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor ModuleMap &ModMap 811f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 812f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 81321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler invocation for creating this module. 814c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<CompilerInvocation> Invocation 81521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor (new CompilerInvocation(ImportingInstance.getInvocation())); 816a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 81718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 81818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 819b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // For any options that aren't intended to affect how a module is built, 820b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // reset them to their default values. 821d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek Invocation->getLangOpts()->resetNonModularOptions(); 82218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.resetNonModularOptions(); 823a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 8242a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // Remove any macro definitions that are explicitly ignored by the module. 8252a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // They aren't supposed to affect how the module is built anyway. 8262a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts(); 8272a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.erase(std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(), 8282a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor RemoveIgnoredMacro(HSOpts)), 8292a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.end()); 8302a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 8312a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 832b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor // Note the name of the module we're building. 833933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName(); 834b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor 835463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Make sure that the failed-module structure has been allocated in 836463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // the importing instance, and propagate the pointer to the newly-created 837463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // instance. 838463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PreprocessorOptions &ImportingPPOpts 839463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor = ImportingInstance.getInvocation().getPreprocessorOpts(); 840463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (!ImportingPPOpts.FailedModules) 841463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet; 842463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PPOpts.FailedModules = ImportingPPOpts.FailedModules; 843463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 84418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // If there is a module map file, build the module using the module map. 845b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // Set up the inputs/outputs so that we build the module from its umbrella 846b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // header. 84721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOptions &FrontendOpts = Invocation->getFrontendOpts(); 8486e975c4517958bcc11c834336d340797356058dbDouglas Gregor FrontendOpts.OutputFile = ModuleFileName.str(); 84921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.DisableFree = false; 850f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor FrontendOpts.GenerateGlobalModuleIndex = false; 85121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.Inputs.clear(); 85218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts()); 853a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 85418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Get or create the module map that we'll use to build this module. 855f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> TempModuleMapFileName; 85618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (const FileEntry *ModuleMapFile 85718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor = ModMap.getContainingModuleMapFile(Module)) { 85818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Use the module map where this module resides. 8591f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendOpts.Inputs.push_back(FrontendInputFile(ModuleMapFile->getName(), 8601f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor IK)); 86118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } else { 86218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Create a temporary module map file. 86318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor int FD; 8641ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola if (llvm::sys::fs::createTemporaryFile(Module->Name, "map", FD, 8651ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola TempModuleMapFileName)) { 866f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor ImportingInstance.getDiagnostics().Report(diag::err_module_map_temp_file) 867f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor << TempModuleMapFileName; 86818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor return; 869e912029b914f263ec22cba6f1fb41ebebcdd844fDouglas Gregor } 87018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Print the module map to this file. 87118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true); 87218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Module->print(OS); 87318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor FrontendOpts.Inputs.push_back( 8741f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendInputFile(TempModuleMapFileName.str().str(), IK)); 87518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 876a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 87718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Don't free the remapped file buffers; they are owned by our caller. 87818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.RetainRemappedFileBuffers = true; 87918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 88018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; 88176d991ec6c5cd247ee18fe65c35d43c2d47cf094Douglas Gregor assert(ImportingInstance.getInvocation().getModuleHash() == 88218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getModuleHash() && "Module hash mismatch!"); 88318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 88421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler instance that will be used to actually create the 88521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // module. 88621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor CompilerInstance Instance; 88721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor Instance.setInvocation(&*Invocation); 888a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 889a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor Instance.createDiagnostics(new ForwardingDiagnosticConsumer( 890a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor ImportingInstance.getDiagnosticClient()), 891cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor /*ShouldOwnClient=*/true); 892830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 8934565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor // Note that this module is part of the module build stack, so that we 894830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor // can detect cycles in the module graph. 895830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createFileManager(); // FIXME: Adopt file manager from importer? 896830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createSourceManager(Instance.getFileManager()); 897830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceManager &SourceMgr = Instance.getSourceManager(); 8984565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.setModuleBuildStack( 8994565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor ImportingInstance.getSourceManager().getModuleBuildStack()); 9004565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(), 901830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager())); 902830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 903830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 90421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a module-generating action. 9058f5d7d1d1f990f174c7f2682271a83acf64dd93dDouglas Gregor GenerateModuleAction CreateModuleAction(Module->IsSystem); 90618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 9070ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // Execute the action to actually build the module in-place. Use a separate 9080ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // thread so that we get a stack large enough. 9090ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor const unsigned ThreadStackSize = 8 << 20; 9100ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor llvm::CrashRecoveryContext CRC; 91118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CompileModuleMapData Data = { Instance, CreateModuleAction }; 91218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CRC.RunSafelyOnThread(&doCompileMapModule, &Data, ThreadStackSize); 913a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 91418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 91518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Delete the temporary module map file. 91618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // FIXME: Even though we're executing under crash protection, it would still 91718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // be nice to do this with RemoveFileOnSignal when we can. However, that 91818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // doesn't make sense for all clients, so clean this up manually. 919a2e94892e273423e2f772f989921cda6442a66c4Benjamin Kramer Instance.clearOutputFiles(/*EraseFiles=*/true); 92018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (!TempModuleMapFileName.empty()) 92148955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(TempModuleMapFileName.str()); 922a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor 923a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // We've rebuilt a module. If we're allowed to generate or update the global 924a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // module index, record that fact in the importing compiler instance. 925f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) { 926a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ImportingInstance.setBuildGlobalModuleIndex(true); 927a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor } 928a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi} 92921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 93063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Diagnose differences between the current definition of the given 93163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// configuration macro and the definition provided on the command line. 93263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorstatic void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, 93363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module *Mod, SourceLocation ImportLoc) { 93463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro); 93563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor SourceManager &SourceMgr = PP.getSourceManager(); 93663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 93763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier has never had a macro definition, then it could 93863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // not have changed. 93963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hadMacroDefinition()) 94063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 94163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 94263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier does not currently have a macro definition, 94363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // check whether it had one on the command line. 94463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hasMacroDefinition()) { 945c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 946c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 947c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 948c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 949c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 95063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 95163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 95263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 95363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 954670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 95563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 95663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 95763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This macro was defined on the command line, then #undef'd later. 95863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Complain. 95963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 96063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true << ConfigMacro << Mod->getFullModuleName(); 961c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.isUndefined()) 962c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here) 96363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true; 96463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 96563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 96663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 96763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Okay: no definition in the predefines buffer. 96863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 96963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 97063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 97163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This identifier has a macro definition. Check whether we had a definition 97263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // on the command line. 973c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 974c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 975c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo PredefinedDef; 976c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 977c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 978c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 97963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 98063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 98163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 98263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 983670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 98463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 98563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 986c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef = Def; 98763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 98863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 98963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 99063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If there was no definition for this macro in the predefines buffer, 99163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // complain. 992c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (!PredefinedDef || 993c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis (!PredefinedDef.getLocation().isValid() && 994c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef.getUndefLocation().isValid())) { 99563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 99663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 997c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 99863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 99963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 100063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 100163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 100263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If the current macro definition is the same as the predefined macro 100363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // definition, it's okay. 1004c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.getMacroInfo() == PredefinedDef.getMacroInfo() || 1005bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis LatestDef.getMacroInfo()->isIdenticalTo(*PredefinedDef.getMacroInfo(),PP, 1006bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /*Syntactically=*/true)) 100763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 100863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 100963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // The macro definitions differ. 101063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 101163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 1012c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 101363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 101463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor} 101563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1016d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Write a new timestamp file with the given path. 1017d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void writeTimestampFile(StringRef TimestampFile) { 1018d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor std::string ErrorInfo; 1019d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::raw_fd_ostream Out(TimestampFile.str().c_str(), ErrorInfo, 1020d965f95daa97097c8ddc5e1165ceae585a888719Rafael Espindola llvm::sys::fs::F_Binary); 1021d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1022d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1023d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Prune the module cache of modules that haven't been accessed in 1024d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// a long time. 1025d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void pruneModuleCache(const HeaderSearchOptions &HSOpts) { 1026d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor struct stat StatBuf; 1027d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::SmallString<128> TimestampFile; 1028d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor TimestampFile = HSOpts.ModuleCachePath; 1029d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::append(TimestampFile, "modules.timestamp"); 1030d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1031d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Try to stat() the timestamp file. 1032d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(TimestampFile.c_str(), &StatBuf)) { 1033d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the timestamp file wasn't there, create one now. 1034d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (errno == ENOENT) { 1035d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1036d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1037d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1038d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1039d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1040d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Check whether the time stamp is older than our pruning interval. 1041d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If not, do nothing. 1042d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t TimeStampModTime = StatBuf.st_mtime; 1043d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t CurrentTime = time(0); 104493ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval)) 1045d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1046d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1047d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Write a new timestamp file so that nobody else attempts to prune. 1048d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // There is a benign race condition here, if two Clang instances happen to 1049d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // notice at the same time that the timestamp is out-of-date. 1050d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1051d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1052d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk the entire module cache, looking for unused module files and module 1053d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // indices. 1054d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::error_code EC; 1055d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor SmallString<128> ModuleCachePathNative; 1056d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative); 1057d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator 1058d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir(ModuleCachePathNative.str(), EC), DirEnd; 1059d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 1060d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we don't have a directory, there's nothing to look into. 1061b470d1a54877e7b3622e4cbdeae423c6d51be696Rafael Espindola if (!llvm::sys::fs::is_directory(Dir->path())) 1062d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1063d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1064d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk all of the files within this directory. 1065d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool RemovedAllFiles = true; 1066d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd; 1067d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor File != FileEnd && !EC; File.increment(EC)) { 1068d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // We only care about module and global module index files. 1069d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::path::extension(File->path()) != ".pcm" && 1070d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::filename(File->path()) != "modules.idx") { 1071d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1072d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1073d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1074d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1075d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Look at this file. If we can't stat it, there's nothing interesting 1076d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // there. 1077d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(File->path().c_str(), &StatBuf)) { 1078d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1079d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1080d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1081d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1082d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the file has been used recently enough, leave it there. 1083d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t FileAccessTime = StatBuf.st_atime; 108493ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - FileAccessTime <= 108593ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer time_t(HSOpts.ModuleCachePruneAfter)) { 108693ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer RemovedAllFiles = false; 1087d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1088d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1089d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1090d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Remove the file. 1091d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1092d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::fs::remove(File->path(), Existed) || !Existed) { 1093d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1094d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1095d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1096d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1097d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we removed all of the files in the directory, remove the directory 1098d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // itself. 1099d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (RemovedAllFiles) { 1100d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1101d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::fs::remove(Dir->path(), Existed); 1102d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1103d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1104d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1105d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1106463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorModuleLoadResult 1107463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorCompilerInstance::loadModule(SourceLocation ImportLoc, 1108463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ModuleIdPath Path, 1109463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor Module::NameVisibilityKind Visibility, 1110463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor bool IsInclusionDirective) { 1111b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith // Determine what file we're searching from. 1112b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith StringRef ModuleName = Path[0].first->getName(); 1113b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith SourceLocation ModuleNameLoc = Path[0].second; 1114b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith 1115b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // If we've already handled this import, just return the cached result. 1116b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // This one-element cache is important to eliminate redundant diagnostics 1117b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // when both the preprocessor and parser see the same import declaration. 11185e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc) { 11195e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor // Make the named module visible. 1120b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule) 11215ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, 1122906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ImportLoc, /*Complain=*/false); 1123392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return LastModuleImportResult; 11245e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor } 1125a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 11261a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor clang::Module *Module = 0; 1127b934d248d001d1536e074e3e8da8f47db63d719fRichard Smith 112849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have information on this module, load the module now. 11291a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known 1130392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor = KnownModules.find(Path[0].first); 11315e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor if (Known != KnownModules.end()) { 11325e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Retrieve the cached top-level module. 11335e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = Known->second; 11345e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else if (ModuleName == getLangOpts().CurrentModule) { 11355e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // This is the module we're building. 11365e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = PP->getHeaderSearchInfo().getModuleMap().findModule(ModuleName); 11375e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 11385e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else { 113949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Search for a module with the given name. 1140e434ec71fccfe078906403affd641f709702d598Douglas Gregor Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); 114149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string ModuleFileName; 11428bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (Module) { 1143e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(Module); 11448bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } else 1145e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(ModuleName); 1146463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 114749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have an ASTReader, create one now. 114849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!ModuleManager) { 114949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!hasASTContext()) 115049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor createASTContext(); 115149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1152d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we're not recursively building a module, check whether we 1153d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // need to prune the module cache. 1154d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (getSourceManager().getModuleBuildStack().empty() && 1155d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneInterval > 0 && 1156d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneAfter > 0) { 1157d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor pruneModuleCache(getHeaderSearchOpts()); 1158d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1159d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 116049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string Sysroot = getHeaderSearchOpts().Sysroot; 116149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 116249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager = new ASTReader(getPreprocessor(), *Context, 116349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 1164f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor PPOpts.DisablePCHValidation, 1165f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor /*AllowASTWithCompilerErrors=*/false, 1166f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex); 116749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) { 116849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->setDeserializationListener( 116949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTDeserializationListener()); 117049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setASTMutationListener( 117149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTMutationListener()); 117249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 11736f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 117449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Source.reset(ModuleManager); 117549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setExternalSource(Source); 117649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasSema()) 117749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->InitializeSema(getSema()); 117849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) 117949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->StartTranslationUnit(&getASTConsumer()); 1180de8a9050d79d66325a18168a0994fed125a7790dDouglas Gregor } 1181a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1182677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to load the module file. 1183677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing; 1184677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor switch (ModuleManager->ReadAST(ModuleFileName, serialization::MK_Module, 1185677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ImportLoc, ARRFlags)) { 118649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Success: 118749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 11886aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor 11890295c238f7b4329f86498055337f91f25465f836Eli Friedman case ASTReader::OutOfDate: 1190677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: { 11910295c238f7b4329f86498055337f91f25465f836Eli Friedman // The module file is missing or out-of-date. 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