CompilerInstance.cpp revision 1ec4a86a867fc04f35d13bc9e33b04cf2171fe41
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( 11402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor new llvm::raw_fd_ostream(DiagOpts->DiagnosticLogFile.c_str(), 115e01eceb54c9235a41675bfd9f32c50bd005fb8d0Daniel Dunbar ErrorInfo, llvm::raw_fd_ostream::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, 1417800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek llvm::raw_fd_ostream::F_Binary)); 1427800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1437800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek if (!ErrorInfo.empty()) { 1447800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Diags.Report(diag::warn_fe_serialized_diag_failure) 1457800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek << OutputFile << ErrorInfo; 1467800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek return; 1477800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek } 1487800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1497800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek DiagnosticConsumer *SerializedConsumer = 1502a76410c0a23a6feb98d0f13e9c8bfa0638d3adfTed Kremenek clang::serialized_diags::create(OS.take(), DiagOpts); 1517800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1527800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1537800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek Diags.setClient(new ChainedDiagnosticConsumer(Diags.takeClient(), 1547800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek SerializedConsumer)); 1557800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek} 1567800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 157d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silvavoid CompilerInstance::createDiagnostics(DiagnosticConsumer *Client, 158cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor bool ShouldOwnClient) { 159d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva Diagnostics = createDiagnostics(&getDiagnosticOpts(), Client, 160cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor ShouldOwnClient, &getCodeGenOpts()); 1610fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 1620fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 163c93dc7889644293e318e19d82830ea2acc45b678Dylan NoblesmithIntrusiveRefCntPtr<DiagnosticsEngine> 16402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas GregorCompilerInstance::createDiagnostics(DiagnosticOptions *Opts, 16578ad0b98848c17a0a11847fa1d456e2dfec8aa2fDavid Blaikie DiagnosticConsumer *Client, 16678243658c533168d51fd076fba328437932ba6f1Douglas Gregor bool ShouldOwnClient, 167b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar const CodeGenOptions *CodeGenOpts) { 168c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 169c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticsEngine> 17002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Diags(new DiagnosticsEngine(DiagID, Opts)); 171221c7211c507482a91e97ede1bf6cf65a456ff67Daniel Dunbar 1720fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Create the diagnostic client for reporting errors or for 1730fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // implementing -verify. 174aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor if (Client) { 175cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor Diags->setClient(Client, ShouldOwnClient); 176aee526e77657afd1600276450e9c346953ad51d7Douglas Gregor } else 177e47be3e9682e82da15059006f43c7f3c021e4fffDouglas Gregor Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); 178f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar 179f79dced038c63572965c016b969cfa870670d16eDaniel Dunbar // Chain in -verify checker, if requested. 18002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (Opts->VerifyDiagnostics) 181621bc69624599da62abd9bc9e5edd8a63ac99fe6David Blaikie Diags->setClient(new VerifyDiagnosticConsumer(*Diags)); 1820fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 1839df23493f5b8a223dfbc491e4b7de3850797c2e7Daniel Dunbar // Chain in -diagnostic-log-file dumper, if requested. 18402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticLogFile.empty()) 185b6534bbee90bf73f364072051d10b60352d43c3eDaniel Dunbar SetUpDiagnosticLog(Opts, CodeGenOpts, *Diags); 186a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 18702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor if (!Opts->DiagnosticSerializationFile.empty()) 1887800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek SetupSerializedDiagnostics(Opts, *Diags, 18902c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor Opts->DiagnosticSerializationFile); 1907800212ef29be314d55814e8dcc568ff8beed106Ted Kremenek 1910fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar // Configure our handling of diagnostics. 19202c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor ProcessWarningOptions(*Diags, *Opts); 1930fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 19428019772db70d4547be05a042eb950bc910f134fDouglas Gregor return Diags; 1950fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar} 1960fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 1970fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// File Manager 1980fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 19916b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbarvoid CompilerInstance::createFileManager() { 2004f32786ac45210143654390177105eb749b614e9Ted Kremenek FileMgr = new FileManager(getFileSystemOpts()); 20116b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 20216b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar 2030fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Source Manager 2040fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 20539b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattnervoid CompilerInstance::createSourceManager(FileManager &FileMgr) { 2064f32786ac45210143654390177105eb749b614e9Ted Kremenek SourceMgr = new SourceManager(getDiagnostics(), FileMgr); 20716b7449d86b843d0926b04f87104cf3fff7149feDaniel Dunbar} 20822dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar 2090fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar// Preprocessor 2100fbb3d9a9cdd2201848be9eb017c54cd78538122Daniel Dunbar 21122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbarvoid CompilerInstance::createPreprocessor() { 2126aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 213a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 21422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create a PTH manager if we are using some form of a token cache. 21522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PTHManager *PTHMgr = 0; 216049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar if (!PPOpts.TokenCache.empty()) 2176aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr = PTHManager::Create(PPOpts.TokenCache, getDiagnostics()); 218a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 21922dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Create the Preprocessor. 220c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor HeaderSearch *HeaderInfo = new HeaderSearch(&getHeaderSearchOpts(), 221c042edd54face617a3b9d0b4b9d5a3ff229d0f48Douglas Gregor getFileManager(), 22251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor getDiagnostics(), 223dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor getLangOpts(), 224dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor &getTarget()); 22536a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor PP = new Preprocessor(&getPreprocessorOpts(), 22636a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor getDiagnostics(), getLangOpts(), &getTarget(), 2276aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor getSourceManager(), *HeaderInfo, *this, PTHMgr, 2286aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor /*OwnsHeaderSearch=*/true); 229a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 23022dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Note that this is different then passing PTHMgr to Preprocessor's ctor. 23122dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // That argument is used as the IdentifierInfoLookup argument to 23222dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // IdentifierTable's ctor. 23322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (PTHMgr) { 2346aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor PTHMgr->setPreprocessor(&*PP); 23522dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar PP->setPTHManager(PTHMgr); 23622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar } 237a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 23894dc8f640ebea52241412512ed48601626edbc58Douglas Gregor if (PPOpts.DetailedRecord) 23937ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis PP->createPreprocessingRecord(); 240a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2416aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor InitializePreprocessor(*PP, PPOpts, getHeaderSearchOpts(), getFrontendOpts()); 242a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 24374c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose PP->setPreprocessedOutput(getPreprocessorOutputOpts().ShowCPP); 24474c2498bb9e339345ee32bdd095e76157cec3b86Jordan Rose 2456e975c4517958bcc11c834336d340797356058dbDouglas Gregor // Set up the module path, including the hash for the 2466e975c4517958bcc11c834336d340797356058dbDouglas Gregor // module-creation options. 247f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> SpecificModuleCache( 2486e975c4517958bcc11c834336d340797356058dbDouglas Gregor getHeaderSearchOpts().ModuleCachePath); 2496e975c4517958bcc11c834336d340797356058dbDouglas Gregor if (!getHeaderSearchOpts().DisableModuleHash) 250a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi llvm::sys::path::append(SpecificModuleCache, 2516e975c4517958bcc11c834336d340797356058dbDouglas Gregor getInvocation().getModuleHash()); 2525e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor PP->getHeaderSearchInfo().setModuleCachePath(SpecificModuleCache); 253a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 25422dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar // Handle generating dependencies, if requested. 2556aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor const DependencyOutputOptions &DepOpts = getDependencyOutputOpts(); 25622dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar if (!DepOpts.OutputFile.empty()) 25722dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar AttachDependencyFileGen(*PP, DepOpts); 258773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor if (!DepOpts.DOTOutputFile.empty()) 259773303a505c23d73da624f1e6abcf41a393dad2bDouglas Gregor AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile, 260c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor getHeaderSearchOpts().Sysroot); 261a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 262c69a181049ab52da29f8f69316a34c90c3ea3b8eDouglas Gregor 263eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar // Handle generating header include information, if requested. 264eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar if (DepOpts.ShowHeaderIncludes) 265eef63e0997e0f6d6436736ea919b851cfe34955aDaniel Dunbar AttachHeaderIncludeGen(*PP); 266b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (!DepOpts.HeaderIncludeOutputFile.empty()) { 2675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef OutputPath = DepOpts.HeaderIncludeOutputFile; 268b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar if (OutputPath == "-") 269b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar OutputPath = ""; 270da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar AttachHeaderIncludeGen(*PP, /*ShowAllHeaders=*/true, OutputPath, 271da60885cb4ee85d167cf704061f10b758067cf5aDaniel Dunbar /*ShowDepth=*/false); 272b34d69b9292534c1c574f168f0ac10aea652adcaDaniel Dunbar } 27322dacfacacf5559028550ba6ddfbaa4ea6cb3944Daniel Dunbar} 2745eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2755eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar// ASTContext 2765eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar 2775eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbarvoid CompilerInstance::createASTContext() { 2785eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar Preprocessor &PP = getPreprocessor(); 2794f32786ac45210143654390177105eb749b614e9Ted Kremenek Context = new ASTContext(getLangOpts(), PP.getSourceManager(), 280bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor &getTarget(), PP.getIdentifierTable(), 2814f32786ac45210143654390177105eb749b614e9Ted Kremenek PP.getSelectorTable(), PP.getBuiltinInfo(), 2824f32786ac45210143654390177105eb749b614e9Ted Kremenek /*size_reserve=*/ 0); 2835eb810024dc8a1d12d5f066c02c978f07c4fcb00Daniel Dunbar} 2840f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2850f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar// ExternalASTSource 2860f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 2875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid CompilerInstance::createPCHExternalASTSource(StringRef Path, 288ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl bool DisablePCHValidation, 289bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 290ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl void *DeserializationListener){ 2916f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 2921d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0; 2930f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot, 294a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi DisablePCHValidation, 295bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis AllowPCHWithCompilerErrors, 296ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl getPreprocessor(), getASTContext(), 2971d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl DeserializationListener, 298f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor Preamble, 299f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex)); 300f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor ModuleManager = static_cast<ASTReader*>(Source.get()); 3010f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar getASTContext().setExternalSource(Source); 3020f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 3030f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3040f800391ffbfe3820e1c60246a09a97e5f065179Daniel DunbarExternalASTSource * 3055f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createPCHExternalASTSource(StringRef Path, 3060f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar const std::string &Sysroot, 307fae3b2f4743dad616623c4df2fdb0f5128bd36d9Douglas Gregor bool DisablePCHValidation, 308bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis bool AllowPCHWithCompilerErrors, 3090f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar Preprocessor &PP, 310ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl ASTContext &Context, 3111d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl void *DeserializationListener, 312f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool Preamble, 313f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool UseGlobalModuleIndex) { 3146f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ASTReader> Reader; 315f8a1e51c48761ee1d7803c3fa35ac94f42ebb55eDouglas Gregor Reader.reset(new ASTReader(PP, Context, 316832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 3174182ed686283b72736b287cbe28583cb641f8934Argyrios Kyrtzidis DisablePCHValidation, 318f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor AllowPCHWithCompilerErrors, 319f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor UseGlobalModuleIndex)); 3200f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 321ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl Reader->setDeserializationListener( 322571db7f0cb31789737be92fce1c1b738e6dbe795Sebastian Redl static_cast<ASTDeserializationListener *>(DeserializationListener)); 323a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi switch (Reader->ReadAST(Path, 324a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Preamble ? serialization::MK_Preamble 32538295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor : serialization::MK_PCH, 326958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis SourceLocation(), 32738295beb73db5f90bfcf31625fb81dbc3b96290aDouglas Gregor ASTReader::ARR_None)) { 328c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Success: 3290f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Set the predefines buffer as suggested by the PCH reader. Typically, the 3300f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // predefines buffer will be empty. 3310f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar PP.setPredefines(Reader->getSuggestedPredefines()); 3320f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return Reader.take(); 3330f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 334c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl case ASTReader::Failure: 3350f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // Unrecoverable failure: don't even try to process the input file. 3360f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3370f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 338677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: 3394825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::OutOfDate: 3404825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 3414825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 3424825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 3430f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar // No suitable PCH file could be found. Return an error. 3440f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar break; 3450f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar } 3460f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar 3470f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar return 0; 3480f800391ffbfe3820e1c60246a09a97e5f065179Daniel Dunbar} 349c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 350c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar// Code Completion 351c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 352a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool EnableCodeCompletion(Preprocessor &PP, 3531abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor const std::string &Filename, 3541abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Line, 3551abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor unsigned Column) { 3561abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Tell the source manager to chop off the given file at a specific 3571abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // line and column. 35839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *Entry = PP.getFileManager().getFile(Filename); 3591abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!Entry) { 3601abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file) 3611abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor << Filename; 3621abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return true; 3631abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3641abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 3651abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor // Truncate the named file at the given line/column. 3661abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor PP.SetCodeCompletionPoint(Entry, Line, Column); 3671abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return false; 3681abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor} 3691abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor 370c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbarvoid CompilerInstance::createCodeCompletionConsumer() { 371c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const ParsedSourceLocation &Loc = getFrontendOpts().CodeCompletionAt; 3721abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) { 3739bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer( 3741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor createCodeCompletionConsumer(getPreprocessor(), 3751abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.FileName, Loc.Line, Loc.Column, 376d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko getFrontendOpts().CodeCompleteOpts, 3771abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor llvm::outs())); 3781abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (!CompletionConsumer) 3791abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor return; 3801abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, 3811abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor Loc.Line, Loc.Column)) { 3829bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 383c3d43b783dfb1a1502aa8b31ab1985cf237b1f77Douglas Gregor return; 3841abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor } 3852b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor 3862b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor if (CompletionConsumer->isOutputBinary() && 387a603569515eea06e54e6e041b1c690d33086f375Rafael Espindola llvm::sys::ChangeStdoutToBinary()) { 3882b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor getPreprocessor().getDiagnostics().Report(diag::err_fe_stdout_binary); 3899bc0c290a79a6aca46367626e3463077147e7e76Erik Verbruggen setCodeCompletionConsumer(0); 3902b4074f1d3919e77cb33ca49c960521dea27afabDouglas Gregor } 391c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 392c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 393f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnamvoid CompilerInstance::createFrontendTimer() { 394f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam FrontendTimer.reset(new llvm::Timer("Clang front-end timer")); 395f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam} 396f79bafa608a5d7c49ec40ad199af5e32f3038b47Kovarththanan Rajaratnam 397c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCodeCompleteConsumer * 398c2f484f1f05216a9a427ac84b5773789a4661111Daniel DunbarCompilerInstance::createCodeCompletionConsumer(Preprocessor &PP, 399c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar const std::string &Filename, 400c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Line, 401c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar unsigned Column, 402d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko const CodeCompleteOptions &Opts, 4035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS) { 4041abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor if (EnableCodeCompletion(PP, Filename, Line, Column)) 405c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar return 0; 406c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar 407c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar // Set up the creation routine for code-completion. 408d99ef536b241071b6f4c01db6525dc03242ac30bDmitri Gribenko return new PrintingCodeCompleteConsumer(Opts, OS); 409c2f484f1f05216a9a427ac84b5773789a4661111Daniel Dunbar} 410a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 411467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregorvoid CompilerInstance::createSema(TranslationUnitKind TUKind, 412f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor CodeCompleteConsumer *CompletionConsumer) { 413f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor TheSema.reset(new Sema(getPreprocessor(), getASTContext(), getASTConsumer(), 414467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUKind, CompletionConsumer)); 415f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor} 416f18d0d8b39e891460d50f8a8b85029885b264986Douglas Gregor 417a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar// Output Files 418a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 419dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidisvoid CompilerInstance::addOutputFile(const OutputFile &OutFile) { 420dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis assert(OutFile.OS && "Attempt to add empty stream to output list!"); 421dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis OutputFiles.push_back(OutFile); 422a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 423a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 424e51dd7be67808d52c80c09b832d875e9655ce6e0Kovarththanan Rajaratnamvoid CompilerInstance::clearOutputFiles(bool EraseFiles) { 425dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis for (std::list<OutputFile>::iterator 426a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { 427dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis delete it->OS; 428dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (!it->TempFilename.empty()) { 429af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (EraseFiles) { 430af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 431af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 432af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson } else { 433f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> NewOutFile(it->Filename); 434af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 435389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // If '-working-directory' was passed, the output filename should be 436389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis // relative to that. 4372e2468e2d2ccbb9a38fe3b6b754009af7e5d39a9Anders Carlsson FileMgr->FixupRelativePath(NewOutFile); 438af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson if (llvm::error_code ec = llvm::sys::fs::rename(it->TempFilename, 439af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson NewOutFile.str())) { 440832a2aac5766dd78f113e0f03a0c62fd0eacbc97Manuel Klimek getDiagnostics().Report(diag::err_unable_to_rename_temp) 441af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson << it->TempFilename << it->Filename << ec.message(); 442af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson 443af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson bool existed; 444af036a6c25f540a9daf51e721485ae6d0e645bd8Anders Carlsson llvm::sys::fs::remove(it->TempFilename, existed); 445dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 446dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 447dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } else if (!it->Filename.empty() && EraseFiles) 44848955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(it->Filename); 449a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 450a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar } 451a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar OutputFiles.clear(); 452a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar} 453a9204831639e31474b927681b97c46781b758a1aDaniel Dunbar 454f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 455f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel DunbarCompilerInstance::createDefaultOutputFile(bool Binary, 4565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension) { 458f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return createOutputFile(getFrontendOpts().OutputFile, Binary, 459e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*RemoveFileOnSignal=*/true, InFile, Extension, 460e21dd284d8209a89137a03a0d63f2bd57be9e660Daniel Dunbar /*UseTemporary=*/true); 461f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 462f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 463f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4645f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 465ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool Binary, bool RemoveFileOnSignal, 4665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4677e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis StringRef Extension, 46812f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool UseTemporary, 46912f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories) { 470dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string Error, OutputPathName, TempPathName; 471f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, 472ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar RemoveFileOnSignal, 473f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar InFile, Extension, 4747e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis UseTemporary, 47512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar CreateMissingDirectories, 476dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &OutputPathName, 477dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis &TempPathName); 478f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OS) { 479360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar getDiagnostics().Report(diag::err_fe_unable_to_open_output) 480360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar << OutputPath << Error; 481360435908c9b90429cfe192fab22854af1d4497cDaniel Dunbar return 0; 482f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 483f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 484f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // Add the output file -- but don't try to remove "-", since this means we are 485f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar // using stdin. 486dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", 487dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis TempPathName, OS)); 488f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 489f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar return OS; 490f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 491f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 492f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbarllvm::raw_fd_ostream * 4935f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerCompilerInstance::createOutputFile(StringRef OutputPath, 494f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar std::string &Error, 495f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar bool Binary, 496ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar bool RemoveFileOnSignal, 4975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef InFile, 4985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Extension, 4997e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis bool UseTemporary, 50012f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar bool CreateMissingDirectories, 501dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *ResultPathName, 502dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string *TempPathName) { 50312f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar assert((!CreateMissingDirectories || UseTemporary) && 50412f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar "CreateMissingDirectories is only allowed when using temporary files"); 50512f28ab8a53d7743081d607617309891fa8156f3Daniel Dunbar 506dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis std::string OutFile, TempFile; 507f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (!OutputPath.empty()) { 508f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = OutputPath; 509f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (InFile == "-") { 510f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 511f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else if (!Extension.empty()) { 51248955f8119261c47cac564d1b6976c8f6441800aRafael Espindola SmallString<128> Path(InFile); 51348955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::path::replace_extension(Path, Extension); 514f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = Path.str(); 515f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } else { 516f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar OutFile = "-"; 517f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar } 5187e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 5196f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::raw_fd_ostream> OS; 5207e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis std::string OSFile; 5217e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis 522375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 523375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (OutFile == "-") 524375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 525375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola else { 526375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::file_status Status; 527375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola llvm::sys::fs::status(OutputPath, Status); 528375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (llvm::sys::fs::exists(Status)) { 529375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Fail early if we can't write to the final destination. 530375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::can_write(OutputPath)) 531375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola return 0; 532375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 533375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Don't use a temporary if the output is a special file. This handles 534375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // things like '-o /dev/null' 535375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (!llvm::sys::fs::is_regular_file(Status)) 536375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola UseTemporary = false; 537375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 538375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 539375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola } 540375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola 541375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola if (UseTemporary) { 542375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // Create a temporary file. 543375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola SmallString<128> TempPath; 544375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath = OutFile; 545375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola TempPath += "-%%%%%%%%"; 546375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola int fd; 5478ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola llvm::error_code EC = llvm::sys::fs::unique_file( 5488ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola TempPath.str(), fd, TempPath, /*makeAbsolute=*/ false, 0664); 5498ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5508ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (CreateMissingDirectories && 551abab18373808f2a179a97b00d574e306970934d7Rafael Espindola EC == llvm::errc::no_such_file_or_directory) { 5528ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Parent = llvm::sys::path::parent_path(OutputPath); 5538ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola EC = llvm::sys::fs::create_directories(Parent); 5548ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 5558ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola EC = llvm::sys::fs::unique_file(TempPath.str(), fd, TempPath, 5568ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola /*makeAbsolute=*/ false, 0664); 5578ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5588ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola } 5598ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 5608ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola if (!EC) { 561375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OS.reset(new llvm::raw_fd_ostream(fd, /*shouldClose=*/true)); 562375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola OSFile = TempFile = TempPath.str(); 563dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 564375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // If we failed to create the temporary, fallback to writing to the file 565375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directly. This handles the corner case where we cannot write to the 566375a4f519eb85d37e702c90498ef9816aeda4c3eRafael Espindola // directory, but can write to the file. 567dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis } 568dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 5697e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!OS) { 5707e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis OSFile = OutFile; 5717e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis OS.reset( 5727e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis new llvm::raw_fd_ostream(OSFile.c_str(), Error, 5737e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis (Binary ? llvm::raw_fd_ostream::F_Binary : 0))); 5747e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis if (!Error.empty()) 5757e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis return 0; 5767e90985df09855dc309ed888a5b16a0ae684f8e3Argyrios Kyrtzidis } 577f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 578dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis // Make sure the out stream file gets removed if we crash. 579ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79Daniel Dunbar if (RemoveFileOnSignal) 5806f2e23b25d9be365266be43ffa1cf6f850b6027eRafael Espindola llvm::sys::RemoveFileOnSignal(OSFile); 581dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis 582f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar if (ResultPathName) 583f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar *ResultPathName = OutFile; 584dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis if (TempPathName) 585dc24572a44575e07a5d8bb6de52641a69f1bab27Argyrios Kyrtzidis *TempPathName = TempFile; 586f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar 587fc97102a80bfe0afaa25883a2aa6b5e1d7307d0aDaniel Dunbar return OS.take(); 588f482d59386dbc70716f7a5f65adb37ff86b501e6Daniel Dunbar} 589ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 590ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar// Initialization Utilities 591ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 5928e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){ 5938e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis return InitializeSourceManager(Input, getDiagnostics(), 594a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFileManager(), getSourceManager(), 595a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor getFrontendOpts()); 596ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 597ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 5988e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidisbool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, 599d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags, 600ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar FileManager &FileMgr, 601ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar SourceManager &SourceMgr, 602ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar const FrontendOptions &Opts) { 6038e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis SrcMgr::CharacteristicKind 6048616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User; 6058e1fbbc492bc1f4833136d9b55e1aaf478565d32Argyrios Kyrtzidis 606ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis if (Input.isBuffer()) { 607ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis SourceMgr.createMainFileIDForMemBuffer(Input.getBuffer(), Kind); 608ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis assert(!SourceMgr.getMainFileID().isInvalid() && 609ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis "Couldn't establish MainFileID!"); 610ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis return true; 611ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis } 612ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 613ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis StringRef InputFile = Input.getFile(); 614ecd27bf256c92f56c7c7ede6f40ec5d31a40b35eArgyrios Kyrtzidis 615507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis // Figure out where to get and map in the main file. 616507097ec40105ed927cb5a744fad98f5875aacacArgyrios Kyrtzidis if (InputFile != "-") { 61739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *File = FileMgr.getFile(InputFile); 618694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman if (!File) { 619ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading) << InputFile; 620ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 621ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 622ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar 623ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // The natural SourceManager infrastructure can't currently handle named 624ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // pipes, but we would at least like to accept them for the main 625ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // file. Detect them here, read them with the more generic MemoryBuffer 626ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar // function, and simply override their contents as we do for STDIN. 627ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (File->isNamedPipe()) { 628ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar OwningPtr<llvm::MemoryBuffer> MB; 629ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar if (llvm::error_code ec = llvm::MemoryBuffer::getFile(InputFile, MB)) { 630ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar Diags.Report(diag::err_cannot_open_file) << InputFile << ec.message(); 631ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar return false; 632ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 633acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 634acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar // Create a new virtual file that will have the correct size. 635acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar File = FileMgr.getVirtualFile(InputFile, MB->getBufferSize(), 0); 636ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar SourceMgr.overrideFileContents(File, MB.take()); 637ce36ecd5a509af8fc5924d21694df36e8bc94a95Daniel Dunbar } 638acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar 639acf36129fa7ff2abef80d38ab6901a50b044c7d1Daniel Dunbar SourceMgr.createMainFileID(File, Kind); 640ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } else { 6416f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<llvm::MemoryBuffer> SB; 6424eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer if (llvm::MemoryBuffer::getSTDIN(SB)) { 6433a321e23f66128dbb986343927456ff6702af617Michael J. Spencer // FIXME: Give ec.message() in this diag. 644ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar Diags.Report(diag::err_fe_error_reading_stdin); 645ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return false; 646ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 64790d9081cacb4b0163f2c7527f666d6515257067cDan Gohman const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), 64839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner SB->getBufferSize(), 0); 649a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor SourceMgr.createMainFileID(File, Kind); 6504eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer SourceMgr.overrideFileContents(File, SB.take()); 651ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar } 652ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar 653694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman assert(!SourceMgr.getMainFileID().isInvalid() && 654694137c54c79a33c9ac6c07e68327750dcd5adf7Dan Gohman "Couldn't establish MainFileID!"); 655ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar return true; 656ccb6cb6fd9e48697564d536b07397b95dfc28d5bDaniel Dunbar} 6570397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6580397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar// High-Level Operations 6590397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6600397af277e3bba16da1fd125ddba07415686b429Daniel Dunbarbool CompilerInstance::ExecuteAction(FrontendAction &Act) { 6610397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(hasDiagnostics() && "Diagnostics engine is not initialized!"); 6620397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowHelp && "Client must handle '-help'!"); 6630397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar assert(!getFrontendOpts().ShowVersion && "Client must handle '-version'!"); 6640397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6650397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: Take this as an argument, once all the APIs we used have moved to 6660397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // taking it as an input instead of hard-coding llvm::errs. 6675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS = llvm::errs(); 6680397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6690397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Create the target instance. 67049a87549f4dc95ecb3d8a593b71df7c167a51f85Douglas Gregor setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), &getTargetOpts())); 6710397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (!hasTarget()) 6720397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar return false; 6730397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6740397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Inform the target of the language options. 6750397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // 6760397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // FIXME: We shouldn't need to do this, the target should be immutable once 6770397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // created. This complexity should be lifted elsewhere. 6780397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getTarget().setForcedLangOptions(getLangOpts()); 6790397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 68093a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian // rewriter project will change target built-in bool type from its default. 68193a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian if (getFrontendOpts().ProgramAction == frontend::RewriteObjC) 68293a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian getTarget().noSignedCharForObjCBool(); 68393a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian 6840397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar // Validate/process some options. 6850397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getHeaderSearchOpts().Verbose) 6860397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "clang -cc1 version " CLANG_VERSION_STRING 6870397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar << " based upon " << PACKAGE_STRING 6885d8b9548420e67f1bf45b7bbc1cf9fb86e9e4505Sebastian Pop << " default target " << llvm::sys::getDefaultTargetTriple() << "\n"; 6890397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 6900397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar if (getFrontendOpts().ShowTimers) 6910397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar createFrontendTimer(); 6920397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 69395dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor if (getFrontendOpts().ShowStats) 69495dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor llvm::EnableStatistics(); 695a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 6960397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) { 6972056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar // Reset the ID tables if we are reusing the SourceManager. 6982056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (hasSourceManager()) 6992056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar getSourceManager().clearIDTables(); 7000397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7011f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor if (Act.BeginSourceFile(*this, getFrontendOpts().Inputs[i])) { 7020397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.Execute(); 7030397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar Act.EndSourceFile(); 7040397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7050397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7060397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 70729f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis // Notify the diagnostic client that all files were processed. 70829f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis getDiagnostics().getClient()->finish(); 70929f2787b6da552018a7716f18f5bd8f67bd6edb5Argyrios Kyrtzidis 71053eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (getDiagnosticOpts().ShowCarets) { 711f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // We can have multiple diagnostics sharing one diagnostic client. 712f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis // Get the total number of warnings/errors from the client. 713f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumWarnings = getDiagnostics().getClient()->getNumWarnings(); 714f2224d89a6ae65a3839529e26d0f6d025d83d6bbArgyrios Kyrtzidis unsigned NumErrors = getDiagnostics().getClient()->getNumErrors(); 715a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 71653eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings) 71753eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumWarnings << " warning" << (NumWarnings == 1 ? "" : "s"); 71853eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings && NumErrors) 71953eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " and "; 72053eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumErrors) 72153eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << NumErrors << " error" << (NumErrors == 1 ? "" : "s"); 72253eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner if (NumWarnings || NumErrors) 72353eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner OS << " generated.\n"; 72453eee7ba970d21ff15bbd4334164037a3b4cc4b8Chris Lattner } 7250397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 7262056048f0f619adadc9a5416a2c4cdf95c58eef7Daniel Dunbar if (getFrontendOpts().ShowStats && hasFileManager()) { 7270397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar getFileManager().PrintStats(); 7280397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar OS << "\n"; 7290397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar } 7300397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 731ab41b97c3cddf1bcdd8bf82ab09ed3ceafcd05b1Argyrios Kyrtzidis return !getDiagnostics().getClient()->getNumErrors(); 7320397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar} 7330397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar 73421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// \brief Determine the appropriate source input kind based on language 73521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor/// options. 73621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { 73721cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.OpenCL) 73821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_OpenCL; 73921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.CUDA) 74021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return IK_CUDA; 74121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor if (LangOpts.ObjC1) 74221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_ObjCXX : IK_ObjC; 74321cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor return LangOpts.CPlusPlus? IK_CXX : IK_C; 74421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor} 74521cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 7460ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregornamespace { 747f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor struct CompileModuleMapData { 748f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompilerInstance &Instance; 749f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor GenerateModuleAction &CreateModuleAction; 750f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor }; 751f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 752f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 753f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Helper function that executes the module-generating action under 754f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// a crash recovery context. 755f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorstatic void doCompileMapModule(void *UserData) { 756f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor CompileModuleMapData &Data 757f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = *reinterpret_cast<CompileModuleMapData *>(UserData); 758f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor Data.Instance.ExecuteAction(Data.CreateModuleAction); 759f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 760f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 7612a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregornamespace { 7622a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// \brief Function object that checks with the given macro definition should 7632a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor /// be removed, because it is one of the ignored macros. 7642a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor class RemoveIgnoredMacro { 7652a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts; 7662a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7672a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor public: 7682a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor explicit RemoveIgnoredMacro(const HeaderSearchOptions &HSOpts) 7692a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor : HSOpts(HSOpts) { } 7702a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 7712a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor bool operator()(const std::pair<std::string, bool> &def) const { 772005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor StringRef MacroDef = def.first; 773005d51bc4f16a7b330e13082d186b72953bde581Douglas Gregor return HSOpts.ModulesIgnoreMacros.count(MacroDef.split('=').first) > 0; 7742a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor } 7752a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor }; 7762a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor} 7772a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 778f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// \brief Compile a module file for the given module, using the options 779f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor/// provided by the importing compiler instance. 78021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregorstatic void compileModule(CompilerInstance &ImportingInstance, 781830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceLocation ImportLoc, 7821a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *Module, 783933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor StringRef ModuleFileName) { 7848ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // FIXME: have LockFileManager return an error_code so that we can 7858ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola // avoid the mkdir when the directory already exists. 7868ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola StringRef Dir = llvm::sys::path::parent_path(ModuleFileName); 7878ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola llvm::sys::fs::create_directories(Dir); 7888ffd0a4eb8875f452e407effe49d86d1620a4499Rafael Espindola 78952f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor llvm::LockFileManager Locked(ModuleFileName); 7902bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor switch (Locked) { 79152f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Error: 7922bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor return; 793a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 79452f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Owned: 7952bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // We're responsible for building the module ourselves. Do so below. 7962bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor break; 797a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 79852f127297c9dca0f8fbb3a28144de4db1d1db9e2Douglas Gregor case llvm::LockFileManager::LFS_Shared: 7992bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // Someone else is responsible for building the module. Wait for them to 8002bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor // finish. 8012bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor Locked.waitForUnlock(); 8027cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor return; 8032bc750700487163e31e4f67cd0e0886868209e3cDouglas Gregor } 804a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 805f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor ModuleMap &ModMap 806f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor = ImportingInstance.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 807f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 80821cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler invocation for creating this module. 809c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<CompilerInvocation> Invocation 81021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor (new CompilerInvocation(ImportingInstance.getInvocation())); 811a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 81218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PreprocessorOptions &PPOpts = Invocation->getPreprocessorOpts(); 81318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 814b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // For any options that aren't intended to affect how a module is built, 815b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // reset them to their default values. 816d3b74d9ca4f239a7a90ad193378c494306c57352Ted Kremenek Invocation->getLangOpts()->resetNonModularOptions(); 81718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.resetNonModularOptions(); 818a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 8192a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // Remove any macro definitions that are explicitly ignored by the module. 8202a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor // They aren't supposed to affect how the module is built anyway. 8212a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor const HeaderSearchOptions &HSOpts = Invocation->getHeaderSearchOpts(); 8222a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.erase(std::remove_if(PPOpts.Macros.begin(), PPOpts.Macros.end(), 8232a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor RemoveIgnoredMacro(HSOpts)), 8242a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor PPOpts.Macros.end()); 8252a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 8262a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 827b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor // Note the name of the module we're building. 828933e7a61da12400d8971890719cb03d68c1b02ebDouglas Gregor Invocation->getLangOpts()->CurrentModule = Module->getTopLevelModuleName(); 829b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor 830463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Make sure that the failed-module structure has been allocated in 831463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // the importing instance, and propagate the pointer to the newly-created 832463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // instance. 833463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PreprocessorOptions &ImportingPPOpts 834463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor = ImportingInstance.getInvocation().getPreprocessorOpts(); 835463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (!ImportingPPOpts.FailedModules) 836463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ImportingPPOpts.FailedModules = new PreprocessorOptions::FailedModulesSet; 837463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor PPOpts.FailedModules = ImportingPPOpts.FailedModules; 838463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 83918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // If there is a module map file, build the module using the module map. 840b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // Set up the inputs/outputs so that we build the module from its umbrella 841b2d39c217b2cfe87cbe69f25df83869940d8adcdDouglas Gregor // header. 84221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOptions &FrontendOpts = Invocation->getFrontendOpts(); 8436e975c4517958bcc11c834336d340797356058dbDouglas Gregor FrontendOpts.OutputFile = ModuleFileName.str(); 84421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.DisableFree = false; 845f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor FrontendOpts.GenerateGlobalModuleIndex = false; 84621cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor FrontendOpts.Inputs.clear(); 84718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor InputKind IK = getSourceInputKindFromOptions(*Invocation->getLangOpts()); 848a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 84918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Get or create the module map that we'll use to build this module. 850f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> TempModuleMapFileName; 85118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (const FileEntry *ModuleMapFile 85218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor = ModMap.getContainingModuleMapFile(Module)) { 85318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Use the module map where this module resides. 8541f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendOpts.Inputs.push_back(FrontendInputFile(ModuleMapFile->getName(), 8551f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor IK)); 85618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } else { 85718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Create a temporary module map file. 85818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor int FD; 8591ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola if (llvm::sys::fs::createTemporaryFile(Module->Name, "map", FD, 8601ec4a86a867fc04f35d13bc9e33b04cf2171fe41Rafael Espindola TempModuleMapFileName)) { 861f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor ImportingInstance.getDiagnostics().Report(diag::err_module_map_temp_file) 862f64114b2aa611a66fc97e6bd8f35b0b039a4500aDouglas Gregor << TempModuleMapFileName; 86318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor return; 864e912029b914f263ec22cba6f1fb41ebebcdd844fDouglas Gregor } 86518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Print the module map to this file. 86618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true); 86718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Module->print(OS); 86818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor FrontendOpts.Inputs.push_back( 8691f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendInputFile(TempModuleMapFileName.str().str(), IK)); 87018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 871a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 87218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Don't free the remapped file buffers; they are owned by our caller. 87318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PPOpts.RetainRemappedFileBuffers = true; 87418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 87518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; 87676d991ec6c5cd247ee18fe65c35d43c2d47cf094Douglas Gregor assert(ImportingInstance.getInvocation().getModuleHash() == 87718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor Invocation->getModuleHash() && "Module hash mismatch!"); 87818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 87921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a compiler instance that will be used to actually create the 88021cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // module. 88121cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor CompilerInstance Instance; 88221cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor Instance.setInvocation(&*Invocation); 883a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 884a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor Instance.createDiagnostics(new ForwardingDiagnosticConsumer( 885a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor ImportingInstance.getDiagnosticClient()), 886cc2b653c319599f502425d2c3de29865d47bb9e4Douglas Gregor /*ShouldOwnClient=*/true); 887830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 8884565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor // Note that this module is part of the module build stack, so that we 889830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor // can detect cycles in the module graph. 890830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createFileManager(); // FIXME: Adopt file manager from importer? 891830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor Instance.createSourceManager(Instance.getFileManager()); 892830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor SourceManager &SourceMgr = Instance.getSourceManager(); 8934565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.setModuleBuildStack( 8944565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor ImportingInstance.getSourceManager().getModuleBuildStack()); 8954565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor SourceMgr.pushModuleBuildStack(Module->getTopLevelModuleName(), 896830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor FullSourceLoc(ImportLoc, ImportingInstance.getSourceManager())); 897830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 898830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor 89921cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor // Construct a module-generating action. 9008f5d7d1d1f990f174c7f2682271a83acf64dd93dDouglas Gregor GenerateModuleAction CreateModuleAction(Module->IsSystem); 90118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 9020ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // Execute the action to actually build the module in-place. Use a separate 9030ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor // thread so that we get a stack large enough. 9040ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor const unsigned ThreadStackSize = 8 << 20; 9050ced799878d1beb8f0fa1cc31fa6d2e4229c217cDouglas Gregor llvm::CrashRecoveryContext CRC; 90618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CompileModuleMapData Data = { Instance, CreateModuleAction }; 90718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor CRC.RunSafelyOnThread(&doCompileMapModule, &Data, ThreadStackSize); 908a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor 90918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 91018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // Delete the temporary module map file. 91118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // FIXME: Even though we're executing under crash protection, it would still 91218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // be nice to do this with RemoveFileOnSignal when we can. However, that 91318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor // doesn't make sense for all clients, so clean this up manually. 914a2e94892e273423e2f772f989921cda6442a66c4Benjamin Kramer Instance.clearOutputFiles(/*EraseFiles=*/true); 91518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor if (!TempModuleMapFileName.empty()) 91648955f8119261c47cac564d1b6976c8f6441800aRafael Espindola llvm::sys::fs::remove(TempModuleMapFileName.str()); 917a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor 918a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // We've rebuilt a module. If we're allowed to generate or update the global 919a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor // module index, record that fact in the importing compiler instance. 920f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor if (ImportingInstance.getFrontendOpts().GenerateGlobalModuleIndex) { 921a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ImportingInstance.setBuildGlobalModuleIndex(true); 922a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor } 923a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi} 92421cae2059a06f7d89eee169409c9266def1b1acaDouglas Gregor 92563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Diagnose differences between the current definition of the given 92663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// configuration macro and the definition provided on the command line. 92763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorstatic void checkConfigMacro(Preprocessor &PP, StringRef ConfigMacro, 92863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module *Mod, SourceLocation ImportLoc) { 92963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor IdentifierInfo *Id = PP.getIdentifierInfo(ConfigMacro); 93063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor SourceManager &SourceMgr = PP.getSourceManager(); 93163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 93263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier has never had a macro definition, then it could 93363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // not have changed. 93463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hadMacroDefinition()) 93563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 93663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 93763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If this identifier does not currently have a macro definition, 93863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // check whether it had one on the command line. 93963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Id->hasMacroDefinition()) { 940c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 941c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 942c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 943c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 944c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 94563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 94663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 94763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 94863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 949670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 95063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 95163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 95263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This macro was defined on the command line, then #undef'd later. 95363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Complain. 95463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 95563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true << ConfigMacro << Mod->getFullModuleName(); 956c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.isUndefined()) 957c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here) 95863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << true; 95963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 96063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 96163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 96263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Okay: no definition in the predefines buffer. 96363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 96463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 96563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 96663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // This identifier has a macro definition. Check whether we had a definition 96763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // on the command line. 968c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo LatestDef = 969c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.getMacroDirectiveHistory(Id)->getDefinition(); 970c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::DefInfo PredefinedDef; 971c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis for (MacroDirective::DefInfo Def = LatestDef; Def; 972c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis Def = Def.getPreviousDefinition()) { 973c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis FileID FID = SourceMgr.getFileID(Def.getLocation()); 97463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (FID.isInvalid()) 97563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 97663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 97763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We only care about the predefines buffer. 978670b2e6e9e75ca5d816899f6c1ac97137ba6f206Douglas Gregor if (FID != PP.getPredefinesFileID()) 97963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor continue; 98063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 981c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef = Def; 98263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 98363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 98463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 98563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If there was no definition for this macro in the predefines buffer, 98663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // complain. 987c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (!PredefinedDef || 988c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis (!PredefinedDef.getLocation().isValid() && 989c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PredefinedDef.getUndefLocation().isValid())) { 99063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 99163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 992c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 99363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 99463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 99563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 99663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 99763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If the current macro definition is the same as the predefined macro 99863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // definition, it's okay. 999c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis if (LatestDef.getMacroInfo() == PredefinedDef.getMacroInfo() || 1000bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis LatestDef.getMacroInfo()->isIdenticalTo(*PredefinedDef.getMacroInfo(),PP, 1001bd25ff8632e18bb3af761369fd3b0f1b48fdf061Argyrios Kyrtzidis /*Syntactically=*/true)) 100263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 100363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 100463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // The macro definitions differ. 100563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) 100663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false << ConfigMacro << Mod->getFullModuleName(); 1007c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) 100863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor << false; 100963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor} 101063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1011d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Write a new timestamp file with the given path. 1012d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void writeTimestampFile(StringRef TimestampFile) { 1013d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor std::string ErrorInfo; 1014d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::raw_fd_ostream Out(TimestampFile.str().c_str(), ErrorInfo, 1015d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::raw_fd_ostream::F_Binary); 1016d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1017d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1018d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// \brief Prune the module cache of modules that haven't been accessed in 1019d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor/// a long time. 1020d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregorstatic void pruneModuleCache(const HeaderSearchOptions &HSOpts) { 1021d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor struct stat StatBuf; 1022d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::SmallString<128> TimestampFile; 1023d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor TimestampFile = HSOpts.ModuleCachePath; 1024d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::append(TimestampFile, "modules.timestamp"); 1025d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1026d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Try to stat() the timestamp file. 1027d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(TimestampFile.c_str(), &StatBuf)) { 1028d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the timestamp file wasn't there, create one now. 1029d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (errno == ENOENT) { 1030d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1031d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1032d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1033d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1034d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1035d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Check whether the time stamp is older than our pruning interval. 1036d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If not, do nothing. 1037d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t TimeStampModTime = StatBuf.st_mtime; 1038d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t CurrentTime = time(0); 103993ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - TimeStampModTime <= time_t(HSOpts.ModuleCachePruneInterval)) 1040d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor return; 1041d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1042d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Write a new timestamp file so that nobody else attempts to prune. 1043d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // There is a benign race condition here, if two Clang instances happen to 1044d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // notice at the same time that the timestamp is out-of-date. 1045d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor writeTimestampFile(TimestampFile); 1046d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1047d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk the entire module cache, looking for unused module files and module 1048d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // indices. 1049d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::error_code EC; 1050d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor SmallString<128> ModuleCachePathNative; 1051d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::native(HSOpts.ModuleCachePath, ModuleCachePathNative); 1052d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator 1053d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir(ModuleCachePathNative.str(), EC), DirEnd; 1054d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 1055d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we don't have a directory, there's nothing to look into. 1056d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool IsDirectory; 1057d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::fs::is_directory(Dir->path(), IsDirectory) || !IsDirectory) 1058d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1059d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1060d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Walk all of the files within this directory. 1061d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool RemovedAllFiles = true; 1062d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor for (llvm::sys::fs::directory_iterator File(Dir->path(), EC), FileEnd; 1063d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor File != FileEnd && !EC; File.increment(EC)) { 1064d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // We only care about module and global module index files. 1065d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::path::extension(File->path()) != ".pcm" && 1066d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::path::filename(File->path()) != "modules.idx") { 1067d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1068d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1069d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1070d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1071d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Look at this file. If we can't stat it, there's nothing interesting 1072d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // there. 1073d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (::stat(File->path().c_str(), &StatBuf)) { 1074d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1075d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1076d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1077d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1078d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If the file has been used recently enough, leave it there. 1079d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor time_t FileAccessTime = StatBuf.st_atime; 108093ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer if (CurrentTime - FileAccessTime <= 108193ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer time_t(HSOpts.ModuleCachePruneAfter)) { 108293ce7d59f0ce9d85301cbad96a71694e4f345fcdBenjamin Kramer RemovedAllFiles = false; 1083d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor continue; 1084d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1085d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1086d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // Remove the file. 1087d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1088d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (llvm::sys::fs::remove(File->path(), Existed) || !Existed) { 1089d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor RemovedAllFiles = false; 1090d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1091d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1092d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1093d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we removed all of the files in the directory, remove the directory 1094d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // itself. 1095d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (RemovedAllFiles) { 1096d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor bool Existed; 1097d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor llvm::sys::fs::remove(Dir->path(), Existed); 1098d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1099d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1100d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor} 1101d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 1102463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorModuleLoadResult 1103463d90986ec54c62bf8fe31193ef5db701db48a5Douglas GregorCompilerInstance::loadModule(SourceLocation ImportLoc, 1104463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor ModuleIdPath Path, 1105463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor Module::NameVisibilityKind Visibility, 1106463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor bool IsInclusionDirective) { 1107b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // If we've already handled this import, just return the cached result. 1108b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // This one-element cache is important to eliminate redundant diagnostics 1109b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor // when both the preprocessor and parser see the same import declaration. 11105e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc) { 11115e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor // Make the named module visible. 11125e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor if (LastModuleImportResult) 11135ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, 1114906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ImportLoc, /*Complain=*/false); 1115392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return LastModuleImportResult; 11165e35693721364673f8196e4f5a370f56b92e6053Douglas Gregor } 1117b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor 11186aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor // Determine what file we're searching from. 11193d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor StringRef ModuleName = Path[0].first->getName(); 11203d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor SourceLocation ModuleNameLoc = Path[0].second; 1121a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 11221a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor clang::Module *Module = 0; 11233d3589db579f7695667b913c5043dd264ebe546fDouglas Gregor 112449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have information on this module, load the module now. 11251a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor llvm::DenseMap<const IdentifierInfo *, clang::Module *>::iterator Known 1126392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor = KnownModules.find(Path[0].first); 11275e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor if (Known != KnownModules.end()) { 11285e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Retrieve the cached top-level module. 11295e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = Known->second; 11305e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else if (ModuleName == getLangOpts().CurrentModule) { 11315e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // This is the module we're building. 11325e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Module = PP->getHeaderSearchInfo().getModuleMap().findModule(ModuleName); 11335e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 11345e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor } else { 113549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Search for a module with the given name. 1136e434ec71fccfe078906403affd641f709702d598Douglas Gregor Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); 113749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string ModuleFileName; 11388bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (Module) { 1139e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(Module); 11408bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } else 1141e434ec71fccfe078906403affd641f709702d598Douglas Gregor ModuleFileName = PP->getHeaderSearchInfo().getModuleFileName(ModuleName); 1142463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 114349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If we don't already have an ASTReader, create one now. 114449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!ModuleManager) { 114549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (!hasASTContext()) 114649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor createASTContext(); 114749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1148d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // If we're not recursively building a module, check whether we 1149d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor // need to prune the module cache. 1150d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor if (getSourceManager().getModuleBuildStack().empty() && 1151d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneInterval > 0 && 1152d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor getHeaderSearchOpts().ModuleCachePruneAfter > 0) { 1153d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor pruneModuleCache(getHeaderSearchOpts()); 1154d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor } 1155d44d2872b2ebe58237de4dbc350b82cab944ccc5Douglas Gregor 115649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor std::string Sysroot = getHeaderSearchOpts().Sysroot; 115749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor const PreprocessorOptions &PPOpts = getPreprocessorOpts(); 115849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager = new ASTReader(getPreprocessor(), *Context, 115949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Sysroot.empty() ? "" : Sysroot.c_str(), 1160f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor PPOpts.DisablePCHValidation, 1161f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor /*AllowASTWithCompilerErrors=*/false, 1162f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor getFrontendOpts().UseGlobalModuleIndex); 116349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) { 116449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->setDeserializationListener( 116549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTDeserializationListener()); 116649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setASTMutationListener( 116749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTConsumer().GetASTMutationListener()); 116849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 11696f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ExternalASTSource> Source; 117049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Source.reset(ModuleManager); 117149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getASTContext().setExternalSource(Source); 117249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasSema()) 117349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->InitializeSema(getSema()); 117449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (hasASTConsumer()) 117549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor ModuleManager->StartTranslationUnit(&getASTConsumer()); 1176de8a9050d79d66325a18168a0994fed125a7790dDouglas Gregor } 1177a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1178677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to load the module file. 1179677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor unsigned ARRFlags = ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing; 1180677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor switch (ModuleManager->ReadAST(ModuleFileName, serialization::MK_Module, 1181677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ImportLoc, ARRFlags)) { 118249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Success: 118349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 11846aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor 11857cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor case ASTReader::OutOfDate: { 1186677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // The module file is out-of-date. Remove it, then rebuild it. 11877cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor bool Existed; 11887cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor llvm::sys::fs::remove(ModuleFileName, Existed); 1189677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1190677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Fall through to build the module again. 1191677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1192677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ASTReader::Missing: { 1193677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // The module file is (now) missing. Build it. 1194677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1195677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // If we don't have a module, we don't know how to build the module file. 1196677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Complain and return. 1197677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (!Module) { 1198677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_found) 1199677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName 1200677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1201677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildFailed = true; 1202677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return ModuleLoadResult(); 1203677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1204677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1205677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Check whether there is a cycle in the module graph. 1206677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack ModPath = getSourceManager().getModuleBuildStack(); 1207677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleBuildStack::iterator Pos = ModPath.begin(), PosEnd = ModPath.end(); 1208677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1209677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos->first == ModuleName) 1210677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor break; 1211677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1212677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1213677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (Pos != PosEnd) { 1214677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor SmallString<256> CyclePath; 1215677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor for (; Pos != PosEnd; ++Pos) { 1216677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += Pos->first; 1217677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += " -> "; 1218677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1219677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CyclePath += ModuleName; 1220677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1221677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_cycle) 1222677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName << CyclePath; 1223677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return ModuleLoadResult(); 1224677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1225463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1226463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // Check whether we have already attempted to build this module (but 1227463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor // failed). 1228463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor if (getPreprocessorOpts().FailedModules && 1229463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getPreprocessorOpts().FailedModules->hasAlreadyFailed(ModuleName)) { 1230463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor getDiagnostics().Report(ModuleNameLoc, diag::err_module_not_built) 1231463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << ModuleName 1232463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1233f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1234463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1235463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor } 1236463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor 1237677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to compile the module. 1238830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor compileModule(*this, ModuleNameLoc, Module, ModuleFileName); 12397cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 1240677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Try to read the module file, now that we've compiled it. 1241677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ASTReader::ASTReadResult ReadResult 1242677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor = ModuleManager->ReadAST(ModuleFileName, 1243958bcaf3d4e0c1ae46de3e84e7c2a7638c3c5286Argyrios Kyrtzidis serialization::MK_Module, ImportLoc, 1244677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ASTReader::ARR_Missing); 1245677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ReadResult != ASTReader::Success) { 1246677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ReadResult == ASTReader::Missing) { 1247677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor getDiagnostics().Report(ModuleNameLoc, 1248677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Module? diag::err_module_not_built 1249677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor : diag::err_module_not_found) 1250677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << ModuleName 1251677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << SourceRange(ImportLoc, ModuleNameLoc); 1252677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 1253677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 1254b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor if (getPreprocessorOpts().FailedModules) 1255b8a8be10038edd1454156d4c25cc86d4e93b6623Douglas Gregor getPreprocessorOpts().FailedModules->addFailed(ModuleName); 12567cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor KnownModules[Path[0].first] = 0; 1257f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1258463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 12597cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 12607cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 12617cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor // Okay, we've rebuilt and now loaded the module. 12627cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor break; 12637cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor } 12647cdd28162dc7ade4b14bf237e87b4bbc17b2f023Douglas Gregor 12654825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::VersionMismatch: 12664825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::ConfigurationMismatch: 12674825fd7fbb3fe87cdf8da9bccc1361fac45bdf2dDouglas Gregor case ASTReader::HadErrors: 12683b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 126949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // FIXME: The ASTReader will already have complained, but can we showhorn 127049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // that diagnostic information into a more useful form? 1271392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor KnownModules[Path[0].first] = 0; 1272463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1273a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 127449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor case ASTReader::Failure: 12753b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis ModuleLoader::HadFatalFailure = true; 1276392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Already complained, but note now that we failed. 1277392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor KnownModules[Path[0].first] = 0; 1278f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor ModuleBuildFailed = true; 1279463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 128049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 128149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1282392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (!Module) { 1283392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // If we loaded the module directly, without finding a module map first, 1284392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // we'll have loaded the module's information from the module itself. 1285392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module = PP->getHeaderSearchInfo().getModuleMap() 1286392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor .findModule((Path[0].first->getName())); 1287392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 1288e2ac16b09ea66ad955752381b82fb8719d003e5eArgyrios Kyrtzidis 1289392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Cache the result of this top-level module lookup for later. 1290392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; 12916aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor } 129249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1293392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // If we never found the module, fail. 1294392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (!Module) 1295463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 1296392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 129749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Verify that the rest of the module path actually corresponds to 129849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // a submodule. 1299392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Path.size() > 1) { 130049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor for (unsigned I = 1, N = Path.size(); I != N; ++I) { 130149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor StringRef Name = Path[I].first->getName(); 1302b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor clang::Module *Sub = Module->findSubmodule(Name); 130349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1304b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 130549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // Attempt to perform typo correction to find a module name that works. 1306cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<StringRef, 2> Best; 130749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor unsigned BestEditDistance = (std::numeric_limits<unsigned>::max)(); 130849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1309b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor for (clang::Module::submodule_iterator J = Module->submodule_begin(), 1310b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor JEnd = Module->submodule_end(); 1311e25633f777cfcaa564b4ed36cec37d6e6e1ecb04Matt Beaumont-Gay J != JEnd; ++J) { 1312b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor unsigned ED = Name.edit_distance((*J)->Name, 131349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor /*AllowReplacements=*/true, 131449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor BestEditDistance); 131549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (ED <= BestEditDistance) { 1316b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (ED < BestEditDistance) { 131749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best.clear(); 1318b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor BestEditDistance = ED; 1319b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor } 1320b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1321b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Best.push_back((*J)->Name); 132249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 132349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 132449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 132549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // If there was a clear winner, user it. 132649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor if (Best.size() == 1) { 132749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, 132849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor diag::err_no_submodule_suggest) 1329392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() << Best[0] 133049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second) 133149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << FixItHint::CreateReplacement(SourceRange(Path[I].second), 133249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor Best[0]); 1333b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 1334b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Sub = Module->findSubmodule(Best[0]); 133549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 133649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 133749009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1338b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Sub) { 133949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // No submodule by this name. Complain, and don't look for further 134049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor // submodules. 134149009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor getDiagnostics().Report(Path[I].second, diag::err_no_submodule) 1342392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor << Path[I].first << Module->getFullModuleName() 134349009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor << SourceRange(Path[0].second, Path[I-1].second); 134449009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor break; 134549009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 134649009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1347b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Module = Sub; 134849009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 134949009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor } 135049009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 13515e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // Make the named module visible, if it's not already part of the module 13525e3f9223db88227d6d21679c613b139d8160186dDouglas Gregor // we are parsing. 1353305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (ModuleName != getLangOpts().CurrentModule) { 1354305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor if (!Module->IsFromModuleFile) { 1355305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // We have an umbrella header or directory that doesn't actually include 1356305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // all of the headers within the directory it covers. Complain about 1357305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this missing submodule and recover by forgetting that we ever saw 1358305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // this submodule. 1359305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // FIXME: Should we detect this at module load time? It seems fairly 1360305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor // expensive (and rare). 1361305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor getDiagnostics().Report(ImportLoc, diag::warn_missing_submodule) 1362305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << Module->getFullModuleName() 1363305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor << SourceRange(Path.front().second, Path.back().second); 1364305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor 1365463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(0, true); 1366305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 136751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 136851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Check whether this module is available. 136951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef Feature; 1370dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor if (!Module->isAvailable(getLangOpts(), getTarget(), Feature)) { 137151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor getDiagnostics().Report(ImportLoc, diag::err_module_unavailable) 137251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << Module->getFullModuleName() 137351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << Feature 137451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor << SourceRange(Path.front().second, Path.back().second); 137551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor LastModuleImportLoc = ImportLoc; 1376463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(); 1377463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return ModuleLoadResult(); 137851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 137951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1380906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ModuleManager->makeModuleVisible(Module, Visibility, ImportLoc, 1381906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor /*Complain=*/true); 1382305dc3ebaa0bea5f3b789e4b54afc79c25907615Douglas Gregor } 138363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 138463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Check for any configuration macros that have changed. 138563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor clang::Module *TopModule = Module->getTopLevelModule(); 138663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor for (unsigned I = 0, N = TopModule->ConfigMacros.size(); I != N; ++I) { 138763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor checkConfigMacro(getPreprocessor(), TopModule->ConfigMacros[I], 138863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Module, ImportLoc); 138963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 139063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 139193ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor // If this module import was due to an inclusion directive, create an 139293ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor // implicit import declaration to capture it in the AST. 139393ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor if (IsInclusionDirective && hasASTContext()) { 139493ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl(); 1395d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis ImportDecl *ImportD = ImportDecl::CreateImplicit(getASTContext(), TU, 1396d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis ImportLoc, Module, 1397d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis Path.back().second); 1398d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis TU->addDecl(ImportD); 1399d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis if (Consumer) 1400d3d981627c375b187f33cc92a034a77ac329ec47Argyrios Kyrtzidis Consumer->HandleImplicitImportDecl(ImportD); 140193ebfa6139bbca4d446c7343e3afc8e5ec777484Douglas Gregor } 140249009ec701feb3009450e57e40c656e2ad7c1f41Douglas Gregor 1403b514c792821a8f053027d88444e13bfaa8efef76Douglas Gregor LastModuleImportLoc = ImportLoc; 1404463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor LastModuleImportResult = ModuleLoadResult(Module, false); 1405463d90986ec54c62bf8fe31193ef5db701db48a5Douglas Gregor return LastModuleImportResult; 14066aa52ec6b969faabf3764baf79d89810b8249a7eDouglas Gregor} 1407ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 1408ca2ab45341c448284cf93770018c717810575f86Douglas Gregorvoid CompilerInstance::makeModuleVisible(Module *Mod, 14095ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis Module::NameVisibilityKind Visibility, 1410906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor SourceLocation ImportLoc, 1411906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor bool Complain){ 1412906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ModuleManager->makeModuleVisible(Mod, Visibility, ImportLoc, Complain); 1413ca2ab45341c448284cf93770018c717810575f86Douglas Gregor} 1414ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 1415