diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp | 117 |
1 files changed, 68 insertions, 49 deletions
diff --git a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp index 3edcf5d..8b00a3d 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp @@ -48,6 +48,7 @@ #include <sys/stat.h> #include <system_error> #include <time.h> +#include <utility> using namespace clang; @@ -55,7 +56,8 @@ CompilerInstance::CompilerInstance( std::shared_ptr<PCHContainerOperations> PCHContainerOps, bool BuildingModule) : ModuleLoader(BuildingModule), Invocation(new CompilerInvocation()), - ModuleManager(nullptr), ThePCHContainerOperations(PCHContainerOps), + ModuleManager(nullptr), + ThePCHContainerOperations(std::move(PCHContainerOps)), BuildGlobalModuleIndex(false), HaveFullGlobalModuleIndex(false), ModuleBuildFailed(false) {} @@ -125,7 +127,7 @@ IntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const { return ModuleManager; } void CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) { - ModuleManager = Reader; + ModuleManager = std::move(Reader); } std::shared_ptr<ModuleDependencyCollector> @@ -135,7 +137,7 @@ CompilerInstance::getModuleDepCollector() const { void CompilerInstance::setModuleDepCollector( std::shared_ptr<ModuleDependencyCollector> Collector) { - ModuleDepCollector = Collector; + ModuleDepCollector = std::move(Collector); } // Diagnostics @@ -349,30 +351,34 @@ void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { AttachDependencyGraphGen(*PP, DepOpts.DOTOutputFile, getHeaderSearchOpts().Sysroot); - for (auto &Listener : DependencyCollectors) - Listener->attachToPreprocessor(*PP); - // If we don't have a collector, but we are collecting module dependencies, // then we're the top level compiler instance and need to create one. - if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) + if (!ModuleDepCollector && !DepOpts.ModuleDependencyOutputDir.empty()) { ModuleDepCollector = std::make_shared<ModuleDependencyCollector>( DepOpts.ModuleDependencyOutputDir); + } + + if (ModuleDepCollector) + addDependencyCollector(ModuleDepCollector); + + for (auto &Listener : DependencyCollectors) + Listener->attachToPreprocessor(*PP); // Handle generating header include information, if requested. if (DepOpts.ShowHeaderIncludes) - AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps); + AttachHeaderIncludeGen(*PP, DepOpts); if (!DepOpts.HeaderIncludeOutputFile.empty()) { StringRef OutputPath = DepOpts.HeaderIncludeOutputFile; if (OutputPath == "-") OutputPath = ""; - AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps, + AttachHeaderIncludeGen(*PP, DepOpts, /*ShowAllHeaders=*/true, OutputPath, /*ShowDepth=*/false); } if (DepOpts.PrintShowIncludes) { - AttachHeaderIncludeGen(*PP, DepOpts.ExtraDeps, - /*ShowAllHeaders=*/false, /*OutputPath=*/"", + AttachHeaderIncludeGen(*PP, DepOpts, + /*ShowAllHeaders=*/true, /*OutputPath=*/"", /*ShowDepth=*/true, /*MSStyle=*/true); } } @@ -467,7 +473,7 @@ IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource( // Code Completion static bool EnableCodeCompletion(Preprocessor &PP, - const std::string &Filename, + StringRef Filename, unsigned Line, unsigned Column) { // Tell the source manager to chop off the given file at a specific @@ -536,15 +542,11 @@ void CompilerInstance::createSema(TranslationUnitKind TUKind, // Output Files void CompilerInstance::addOutputFile(OutputFile &&OutFile) { - assert(OutFile.OS && "Attempt to add empty stream to output list!"); OutputFiles.push_back(std::move(OutFile)); } void CompilerInstance::clearOutputFiles(bool EraseFiles) { for (OutputFile &OF : OutputFiles) { - // Manually close the stream before we rename it. - OF.OS.reset(); - if (!OF.TempFilename.empty()) { if (EraseFiles) { llvm::sys::fs::remove(OF.TempFilename); @@ -564,13 +566,12 @@ void CompilerInstance::clearOutputFiles(bool EraseFiles) { } } else if (!OF.Filename.empty() && EraseFiles) llvm::sys::fs::remove(OF.Filename); - } OutputFiles.clear(); NonSeekStream.reset(); } -raw_pwrite_stream * +std::unique_ptr<raw_pwrite_stream> CompilerInstance::createDefaultOutputFile(bool Binary, StringRef InFile, StringRef Extension) { return createOutputFile(getFrontendOpts().OutputFile, Binary, @@ -578,14 +579,11 @@ CompilerInstance::createDefaultOutputFile(bool Binary, StringRef InFile, /*UseTemporary=*/true); } -llvm::raw_null_ostream *CompilerInstance::createNullOutputFile() { - auto OS = llvm::make_unique<llvm::raw_null_ostream>(); - llvm::raw_null_ostream *Ret = OS.get(); - addOutputFile(OutputFile("", "", std::move(OS))); - return Ret; +std::unique_ptr<raw_pwrite_stream> CompilerInstance::createNullOutputFile() { + return llvm::make_unique<llvm::raw_null_ostream>(); } -raw_pwrite_stream * +std::unique_ptr<raw_pwrite_stream> CompilerInstance::createOutputFile(StringRef OutputPath, bool Binary, bool RemoveFileOnSignal, StringRef InFile, StringRef Extension, bool UseTemporary, @@ -601,13 +599,12 @@ CompilerInstance::createOutputFile(StringRef OutputPath, bool Binary, return nullptr; } - raw_pwrite_stream *Ret = OS.get(); // Add the output file -- but don't try to remove "-", since this means we are // using stdin. - addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "", - TempPathName, std::move(OS))); + addOutputFile( + OutputFile((OutputPathName != "-") ? OutputPathName : "", TempPathName)); - return Ret; + return OS; } std::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile( @@ -712,16 +709,17 @@ std::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile( // Initialization Utilities bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){ - return InitializeSourceManager(Input, getDiagnostics(), - getFileManager(), getSourceManager(), - getFrontendOpts()); + return InitializeSourceManager( + Input, getDiagnostics(), getFileManager(), getSourceManager(), + hasPreprocessor() ? &getPreprocessor().getHeaderSearchInfo() : nullptr, + getDependencyOutputOpts(), getFrontendOpts()); } -bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, - DiagnosticsEngine &Diags, - FileManager &FileMgr, - SourceManager &SourceMgr, - const FrontendOptions &Opts) { +// static +bool CompilerInstance::InitializeSourceManager( + const FrontendInputFile &Input, DiagnosticsEngine &Diags, + FileManager &FileMgr, SourceManager &SourceMgr, HeaderSearch *HS, + DependencyOutputOptions &DepOpts, const FrontendOptions &Opts) { SrcMgr::CharacteristicKind Kind = Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User; @@ -737,7 +735,35 @@ bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, // Figure out where to get and map in the main file. if (InputFile != "-") { - const FileEntry *File = FileMgr.getFile(InputFile, /*OpenFile=*/true); + const FileEntry *File; + if (Opts.FindPchSource.empty()) { + File = FileMgr.getFile(InputFile, /*OpenFile=*/true); + } else { + // When building a pch file in clang-cl mode, the .h file is built as if + // it was included by a cc file. Since the driver doesn't know about + // all include search directories, the frontend must search the input + // file through HeaderSearch here, as if it had been included by the + // cc file at Opts.FindPchSource. + const FileEntry *FindFile = FileMgr.getFile(Opts.FindPchSource); + if (!FindFile) { + Diags.Report(diag::err_fe_error_reading) << Opts.FindPchSource; + return false; + } + const DirectoryLookup *UnusedCurDir; + SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16> + Includers; + Includers.push_back(std::make_pair(FindFile, FindFile->getDir())); + File = HS->LookupFile(InputFile, SourceLocation(), /*isAngled=*/false, + /*FromDir=*/nullptr, + /*CurDir=*/UnusedCurDir, Includers, + /*SearchPath=*/nullptr, + /*RelativePath=*/nullptr, + /*RequestingModule=*/nullptr, + /*SuggestedModule=*/nullptr, /*SkipCache=*/true); + // Also add the header to /showIncludes output. + if (File) + DepOpts.ShowIncludesPretendHeader = File->getName(); + } if (!File) { Diags.Report(diag::err_fe_error_reading) << InputFile; return false; @@ -803,8 +829,9 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) { // Create TargetInfo for the other side of CUDA compilation. if (getLangOpts().CUDA && !getFrontendOpts().AuxTriple.empty()) { - std::shared_ptr<TargetOptions> TO(new TargetOptions); + auto TO = std::make_shared<TargetOptions>(); TO->Triple = getFrontendOpts().AuxTriple; + TO->HostTriple = getTarget().getTriple().str(); setAuxTarget(TargetInfo::CreateTargetInfo(getDiagnostics(), TO)); } @@ -1050,7 +1077,7 @@ static bool compileAndLoadModule(CompilerInstance &ImportingInstance, switch (Locked) { case llvm::LockFileManager::LFS_Error: Diags.Report(ModuleNameLoc, diag::err_module_lock_failure) - << Module->Name; + << Module->Name << Locked.getErrorMessage(); return false; case llvm::LockFileManager::LFS_Owned: @@ -1290,8 +1317,6 @@ void CompilerInstance::createModuleManager() { if (TheDependencyFileGenerator) TheDependencyFileGenerator->AttachToASTReader(*ModuleManager); - if (ModuleDepCollector) - ModuleDepCollector->attachToASTReader(*ModuleManager); for (auto &Listener : DependencyCollectors) Listener->attachToASTReader(*ModuleManager); } @@ -1386,8 +1411,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, // when both the preprocessor and parser see the same import declaration. if (ImportLoc.isValid() && LastModuleImportLoc == ImportLoc) { // Make the named module visible. - if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule && - ModuleName != getLangOpts().ImplementationOfModule) + if (LastModuleImportResult && ModuleName != getLangOpts().CurrentModule) ModuleManager->makeModuleVisible(LastModuleImportResult, Visibility, ImportLoc); return LastModuleImportResult; @@ -1401,8 +1425,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, if (Known != KnownModules.end()) { // Retrieve the cached top-level module. Module = Known->second; - } else if (ModuleName == getLangOpts().CurrentModule || - ModuleName == getLangOpts().ImplementationOfModule) { + } else if (ModuleName == getLangOpts().CurrentModule) { // This is the module we're building. Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; @@ -1580,10 +1603,6 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, } } - // Don't make the module visible if we are in the implementation. - if (ModuleName == getLangOpts().ImplementationOfModule) - return ModuleLoadResult(Module, false); - // Make the named module visible, if it's not already part of the module // we are parsing. if (ModuleName != getLangOpts().CurrentModule) { |