Index: clang/include/clang/Frontend/CompilerInvocation.h =================================================================== --- clang/include/clang/Frontend/CompilerInvocation.h +++ clang/include/clang/Frontend/CompilerInvocation.h @@ -224,7 +224,7 @@ std::string getModuleHash() const; using StringAllocator = llvm::function_ref; - /// Generate a cc1-compatible command line arguments from this instance. + /// Generate cc1-compatible command line arguments from this instance. /// /// \param [out] Args - The generated arguments. Note that the caller is /// responsible for inserting the path to the clang executable and "-cc1" if @@ -235,6 +235,20 @@ void generateCC1CommandLine(llvm::SmallVectorImpl &Args, StringAllocator SA) const; + /// Generate cc1-compatible command line arguments from this instance, + /// wrapping the result as a std::vector. + /// + /// This is a (less-efficient) wrapper over generateCC1CommandLine(). + std::vector getCC1CommandLine() const; + + /// Reset all of the options that are not considered when building a + /// module. + void resetNonModularOptions(); + + /// Disable implicit modules and canonicalize options that are only used by + /// implicit modules. + void clearImplicitModuleBuildOptions(); + private: static bool CreateFromArgsImpl(CompilerInvocation &Res, ArrayRef CommandLineArgs, Index: clang/lib/Frontend/CompilerInstance.cpp =================================================================== --- clang/lib/Frontend/CompilerInstance.cpp +++ clang/lib/Frontend/CompilerInstance.cpp @@ -1150,8 +1150,7 @@ // For any options that aren't intended to affect how a module is built, // reset them to their default values. - Invocation->getLangOpts()->resetNonModularOptions(); - PPOpts.resetNonModularOptions(); + Invocation->resetNonModularOptions(); // Remove any macro definitions that are explicitly ignored by the module. // They aren't supposed to affect how the module is built anyway. Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -4672,6 +4672,37 @@ GenerateDependencyOutputArgs(DependencyOutputOpts, Args, SA); } +std::vector CompilerInvocation::getCC1CommandLine() const { + // Set up string allocator. + llvm::BumpPtrAllocator Alloc; + llvm::StringSaver Strings(Alloc); + auto SA = [&Strings](const Twine &Arg) { return Strings.save(Arg).data(); }; + + // Synthesize full command line from the CompilerInvocation, including "-cc1". + SmallVector Args{"-cc1"}; + generateCC1CommandLine(Args, SA); + + // Convert arguments to the return type. + return std::vector{Args.begin(), Args.end()}; +} + +void CompilerInvocation::resetNonModularOptions() { + getLangOpts()->resetNonModularOptions(); + getPreprocessorOpts().resetNonModularOptions(); +} + +void CompilerInvocation::clearImplicitModuleBuildOptions() { + getLangOpts()->ImplicitModules = false; + getHeaderSearchOpts().ImplicitModuleMaps = false; + getHeaderSearchOpts().ModuleCachePath.clear(); + getHeaderSearchOpts().ModulesValidateOncePerBuildSession = false; + getHeaderSearchOpts().BuildSessionTimestamp = 0; + // The specific values we canonicalize to for pruning don't affect behaviour, + /// so use the default values so they may be dropped from the command-line. + getHeaderSearchOpts().ModuleCachePruneInterval = 7 * 24 * 60 * 60; + getHeaderSearchOpts().ModuleCachePruneAfter = 31 * 24 * 60 * 60; +} + IntrusiveRefCntPtr clang::createVFSFromCompilerInvocation(const CompilerInvocation &CI, DiagnosticsEngine &Diags) { Index: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -88,8 +88,8 @@ // Make a deep copy of the original Clang invocation. CompilerInvocation CI(OriginalInvocation); - CI.getLangOpts()->resetNonModularOptions(); - CI.getPreprocessorOpts().resetNonModularOptions(); + CI.resetNonModularOptions(); + CI.clearImplicitModuleBuildOptions(); // Remove options incompatible with explicit module build or are likely to // differ between identical modules discovered from different translation @@ -110,18 +110,6 @@ CI.getLangOpts()->ModuleName = Deps.ID.ModuleName; CI.getFrontendOpts().IsSystemModule = Deps.IsSystem; - // Disable implicit modules and canonicalize options that are only used by - // implicit modules. - CI.getLangOpts()->ImplicitModules = false; - CI.getHeaderSearchOpts().ImplicitModuleMaps = false; - CI.getHeaderSearchOpts().ModuleCachePath.clear(); - CI.getHeaderSearchOpts().ModulesValidateOncePerBuildSession = false; - CI.getHeaderSearchOpts().BuildSessionTimestamp = 0; - // The specific values we canonicalize to for pruning don't affect behaviour, - /// so use the default values so they will be dropped from the command-line. - CI.getHeaderSearchOpts().ModuleCachePruneInterval = 7 * 24 * 60 * 60; - CI.getHeaderSearchOpts().ModuleCachePruneAfter = 31 * 24 * 60 * 60; - // Inputs InputKind ModuleMapInputKind(CI.getFrontendOpts().DashX.getLanguage(), InputKind::Format::ModuleMap); @@ -159,23 +147,8 @@ return CI; } -static std::vector -serializeCompilerInvocation(const CompilerInvocation &CI) { - // Set up string allocator. - llvm::BumpPtrAllocator Alloc; - llvm::StringSaver Strings(Alloc); - auto SA = [&Strings](const Twine &Arg) { return Strings.save(Arg).data(); }; - - // Synthesize full command line from the CompilerInvocation, including "-cc1". - SmallVector Args{"-cc1"}; - CI.generateCC1CommandLine(Args, SA); - - // Convert arguments to the return type. - return std::vector{Args.begin(), Args.end()}; -} - std::vector ModuleDeps::getCanonicalCommandLine() const { - return serializeCompilerInvocation(BuildInvocation); + return BuildInvocation.getCC1CommandLine(); } static std::string getModuleContextHash(const ModuleDeps &MD) {