Skip to content

Revert "[clang][ModulesDriver] Add support for Clang modules to -fmodules-driver" due to memory leak - #191122

Merged
naveen-seth merged 1 commit into
mainfrom
revert-187606-modules-driver-clang-modules-only
Apr 9, 2026
Merged

Revert "[clang][ModulesDriver] Add support for Clang modules to -fmodules-driver" due to memory leak#191122
naveen-seth merged 1 commit into
mainfrom
revert-187606-modules-driver-clang-modules-only

Conversation

@naveen-seth

Copy link
Copy Markdown
Contributor

Reverts #187606 due to a memory leak.
See #187606 (comment)

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' labels Apr 9, 2026
@naveen-seth
naveen-seth merged commit 87491a4 into main Apr 9, 2026
8 of 13 checks passed
@naveen-seth
naveen-seth deleted the revert-187606-modules-driver-clang-modules-only branch April 9, 2026 07:11
@llvmbot

llvmbot commented Apr 9, 2026

Copy link
Copy Markdown
Member

@llvm/pr-subscribers-clang

Author: Naveen Seth Hanig (naveen-seth)

Changes

Reverts llvm/llvm-project#187606 due to a memory leak.
See #187606 (comment)


Full diff: https://github.com/llvm/llvm-project/pull/191122.diff

3 Files Affected:

  • (modified) clang/lib/Driver/ModulesDriver.cpp (+21-51)
  • (removed) clang/test/Driver/modules-driver-clang-modules-only.cpp (-127)
  • (modified) clang/test/Driver/modules-driver-manifest-input-args.cpp (+9-7)
diff --git a/clang/lib/Driver/ModulesDriver.cpp b/clang/lib/Driver/ModulesDriver.cpp
index 2df40f761680f..2cd274a1f3099 100644
--- a/clang/lib/Driver/ModulesDriver.cpp
+++ b/clang/lib/Driver/ModulesDriver.cpp
@@ -25,12 +25,10 @@
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/DepthFirstIterator.h"
 #include "llvm/ADT/DirectedGraph.h"
-#include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVectorExtras.h"
 #include "llvm/ADT/TypeSwitch.h"
 #include "llvm/ADT/iterator_range.h"
-#include "llvm/Option/ArgList.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/GraphWriter.h"
 #include "llvm/Support/JSON.h"
@@ -1250,20 +1248,20 @@ createClangModulePrecompileJob(Compilation &C, const Command &ImportingJob,
       /*Outputs=*/ArrayRef<InputInfo>{});
 }
 
-/// Creates a \c ClangModuleJobNode with associated job for each unique Clang
-/// module in \p ModuleDepGraphsForScannedJobs.
+/// Creates a ClangModuleJobNode and its job for each unique Clang module
+/// in \p ModuleDepGraphsForScannedJobs.
 ///
-/// \param ImportingJobs Jobs whose module dependencies were scanned.
-/// \param ModuleDepGraphsForScannedJobs Full Clang module dependency graphs
-/// corresponding to \p ImportingJobs, in order.
+/// Only the jobs at indices \p ScannedJobIndices in \p Jobs are expected to be
+/// non-null.
 static void createClangModuleJobsAndNodes(
     CompilationGraph &Graph, Compilation &C,
-    ArrayRef<std::unique_ptr<Command>> ImportingJobs,
+    ArrayRef<std::unique_ptr<Command>> Jobs, ArrayRef<size_t> ScannedJobIndices,
     SmallVectorImpl<deps::ModuleDepsGraph> &&ModuleDepGraphsForScannedJobs) {
   llvm::DenseSet<deps::ModuleID> AlreadySeen;
-  for (auto &&[ImportingJob, ModuleDepsGraph] :
-       llvm::zip_equal(llvm::make_pointee_range(ImportingJobs),
-                       ModuleDepGraphsForScannedJobs)) {
+  for (auto &&[ScanIndex, ModuleDepsGraph] :
+       llvm::enumerate(ModuleDepGraphsForScannedJobs)) {
+    const auto &ImportingJob = *Jobs[ScannedJobIndices[ScanIndex]];
+
     for (auto &MD : ModuleDepsGraph) {
       const auto Inserted = AlreadySeen.insert(MD.ID).second;
       if (!Inserted)
@@ -1276,31 +1274,6 @@ static void createClangModuleJobsAndNodes(
   }
 }
 
-/// Installs the command lines produced by the dependency scan into
-/// \p ScannedJobs.
-static void
-installScanCommandLines(Compilation &C,
-                        MutableArrayRef<std::unique_ptr<Command>> ScannedJobs,
-                        ArrayRef<InputDependencies> InputDepsForScannedJobs) {
-  for (auto &&[Job, InputDeps] : llvm::zip_equal(
-           llvm::make_pointee_range(ScannedJobs), InputDepsForScannedJobs)) {
-    const auto &BuildArgs = InputDeps.BuildArgs;
-    ArgStringList JobArgs;
-    JobArgs.reserve(BuildArgs.size());
-
-    const auto &SourceAction = Job.getSource();
-    const auto &TC = Job.getCreator().getToolChain();
-    auto &TCArgs =
-        C.getArgsForToolChain(&TC, SourceAction.getOffloadingArch(),
-                              SourceAction.getOffloadingDeviceKind());
-
-    for (const auto &Arg : BuildArgs)
-      JobArgs.push_back(TCArgs.MakeArgString(Arg));
-
-    Job.replaceArguments(std::move(JobArgs));
-  }
-}
-
 /// Creates nodes for all jobs which were scanned for dependencies.
 ///
 /// The updated command lines produced by the dependency scan are installed at a
@@ -1533,17 +1506,16 @@ void driver::modules::runModulesDriver(
       Graph, takeJobsAtIndices(Jobs, ScanResult.NonScannableJobIndices));
   auto UnusedStdlibModuleJobNodes = createNodesForUnusedStdlibModuleJobs(
       Graph, takeJobsAtIndices(Jobs, ScanResult.UnusedStdlibModuleJobIndices));
-
-  auto ScannedJobs = takeJobsAtIndices(Jobs, ScanResult.ScannedJobIndices);
   createClangModuleJobsAndNodes(
-      Graph, C, /*ImportingJobs*/ ScannedJobs,
+      Graph, C, Jobs, ScanResult.ScannedJobIndices,
       std::move(ScanResult.ModuleDepGraphsForScannedJobs));
-  installScanCommandLines(C, ScannedJobs, ScanResult.InputDepsForScannedJobs);
-  createNodesForScannedJobs(Graph, std::move(ScannedJobs),
-                            std::move(ScanResult.InputDepsForScannedJobs));
-
+  createNodesForScannedJobs(
+      Graph, takeJobsAtIndices(Jobs, ScanResult.ScannedJobIndices),
+      std::move(ScanResult.InputDepsForScannedJobs));
   createRegularEdges(Graph);
+
   pruneUnusedStdlibModuleJobs(Graph, UnusedStdlibModuleJobNodes);
+
   if (!createModuleDependencyEdges(Graph, Diags))
     return;
   createAndConnectRoot(Graph);
@@ -1552,14 +1524,12 @@ void driver::modules::runModulesDriver(
   if (!Diags.isLastDiagnosticIgnored())
     llvm::WriteGraph<const CompilationGraph *>(llvm::errs(), &Graph);
 
+  // TODO: Install all updated command-lines produced by the dependency scan.
   // TODO: Fix-up command-lines for named module imports.
 
-  llvm::ReversePostOrderTraversal<CompilationGraph *> TopologicallySortedNodes(
-      &Graph);
-  assert(isa<RootNode>(*TopologicallySortedNodes.begin()) &&
-         "First node in topological order must be the root!");
-  auto TopologicallySortedJobNodes = llvm::map_range(
-      llvm::drop_begin(TopologicallySortedNodes), llvm::CastTo<JobNode>);
-  for (auto *JN : TopologicallySortedJobNodes)
-    C.addCommand(std::move(JN->Job));
+  // TODO: Sort the graph topologically before adding jobs back to the
+  // Compilation being built.
+  for (auto *N : Graph)
+    if (auto *JN = dyn_cast<JobNode>(N))
+      C.addCommand(std::move(JN->Job));
 }
diff --git a/clang/test/Driver/modules-driver-clang-modules-only.cpp b/clang/test/Driver/modules-driver-clang-modules-only.cpp
deleted file mode 100644
index 37a803f9b6fc0..0000000000000
--- a/clang/test/Driver/modules-driver-clang-modules-only.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-// Checks that -fmodules-driver correctly handles compilations using Clang modules.
-
-// RUN: split-file %s %t
-// RUN: rm -rf %t/modules-cache
-
-// RUN: %clang -std=c++23 \
-// RUN:   -fmodules-driver -Rmodules-driver \
-// RUN:   -fmodules -Rmodule-import \
-// RUN:   -fmodule-map-file=%t/module.modulemap \
-// RUN:   -fmodules-cache-path=%t/modules-cache \
-// RUN:   -fsyntax-only %t/main.cpp 2>&1 \
-// RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck -DPREFIX=%/t --check-prefix=CHECK-REMARKS %s
-
-// RUN: rm -rf %t/modules-cache
-// RUN: %clang -std=c++23 \
-// RUN:   -fmodules-driver \
-// RUN:   -fmodules \
-// RUN:   -fmodule-map-file=%t/module.modulemap \
-// RUN:   -fmodules-cache-path=%t/modules-cache \
-// RUN:   -fsyntax-only %t/main.cpp \
-// RUN:   -### 2>&1 \
-// RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck --check-prefix=CHECK-CC1 %s
-
-// The scan itself will also produce [-Rmodule-import] remarks.
-// Let's skip past them, we only care about the final -cc1 commands.
-// CHECK-REMARKS:       clang: remark: printing module dependency graph [-Rmodules-driver]
-// CHECK-REMARKS-NEXT:  digraph "Module Dependency Graph" {
-// CHECK-REMARKS:       }
-
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'root' from
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'direct1' into 'root'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive1' into 'direct1'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive2' into 'direct1'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'direct2' into 'root'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive2' into 'direct2'
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[TRANSITIVE2PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-name=transitive2"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[DIRECT2PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=transitive2=[[TRANSITIVE2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=direct2"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[TRANSITIVE1PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-name=transitive1"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[DIRECT1PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=transitive1=[[TRANSITIVE1PCM]]"
-// CHECK-CC1-SAME: "-fmodule-file=transitive2=[[TRANSITIVE2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=direct1"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[ROOTPCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=direct1=[[DIRECT1PCM]]"
-// CHECK-CC1-SAME: "-fmodule-file=direct2=[[DIRECT2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=root"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-fsyntax-only"
-// CHECK-CC1-SAME: "{{.*}}/main.cpp"
-// CHECK-CC1-SAME: "-fmodule-file=root=[[ROOTPCM]]"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// (Because of missing include guards, this example would also run into
-// redefinition errors when compiling without modules.)
-
-/--- module.modulemap
-module root { header "root.h"}
-module transitive1 { header "transitive1.h" }
-module transitive2 { header "transitive2.h" }
-module direct1 { header "direct1.h" }
-module direct2 { header "direct2.h" }
-
-//--- root.h
-#include "direct1.h"
-#include "direct2.h"
-int fromRoot() {
-  return fromDirect1() + fromDirect2();
-}
-
-//--- direct1.h
-#include "transitive1.h"
-#include "transitive2.h"
-
-int fromDirect1() {
-  return fromTransitive1() + fromTransitive2();
-}
-
-//--- direct2.h
-#include "transitive2.h"
-
-int fromDirect2() {
-  return fromTransitive2() + 2;
-}
-
-//--- transitive1.h
-int fromTransitive1() {
-    return 20;
-}
-
-//--- transitive2.h
-int fromTransitive2() {
-    return 10;
-}
-
-//--- main.cpp
-#include "root.h"
-
-int main() {
- fromRoot();
-}
diff --git a/clang/test/Driver/modules-driver-manifest-input-args.cpp b/clang/test/Driver/modules-driver-manifest-input-args.cpp
index 726fe03e27840..99765a1943faf 100644
--- a/clang/test/Driver/modules-driver-manifest-input-args.cpp
+++ b/clang/test/Driver/modules-driver-manifest-input-args.cpp
@@ -26,15 +26,17 @@
 // RUN:   %t/main.cpp \
 // RUN:   -### 2>&1 \
 // RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck %s -DPREFIX=%/t
+// RUN:   | FileCheck %s -check-prefix=MAIN-CC1 -check-prefix=STDLIB-MOD-CC1 -DPREFIX=%/t
 
-// CHECK: "-cc1" {{.*}} "-Wno-reserved-module-identifier" {{.*}} "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/std.cppm" {{.*}} "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
+// MAIN-CC1: "-cc1"
+// MAIN-CC1-SAME: "main.cpp"
+// MAIN-CC1-NOT: "-Wno-reserved-module-identifier"
+// MAIN-CC1-NOT: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
 
-// The adjustments should only be made for inputs from the Standard Library module manifest:
-// Check that the -cc1 command line does not contain those adjustments!
-// CHECK: "-cc1" {{.*}}main
-// CHECK-NOT: "-Wno-reserved-module-identifier"
-// CHECK-NOT: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
+// STDLIB-MOD-CC1: "-cc1"
+// STDLIB-MOD-CC1-SAME: "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/std.cppm"
+// STDLIB-MOD-CC1-SAME: "-Wno-reserved-module-identifier"
+// STDLIB-MOD-CC1-SAME: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
 
 //--- main.cpp
 import std;

@llvmbot

llvmbot commented Apr 9, 2026

Copy link
Copy Markdown
Member

@llvm/pr-subscribers-clang-driver

Author: Naveen Seth Hanig (naveen-seth)

Changes

Reverts llvm/llvm-project#187606 due to a memory leak.
See #187606 (comment)


Full diff: https://github.com/llvm/llvm-project/pull/191122.diff

3 Files Affected:

  • (modified) clang/lib/Driver/ModulesDriver.cpp (+21-51)
  • (removed) clang/test/Driver/modules-driver-clang-modules-only.cpp (-127)
  • (modified) clang/test/Driver/modules-driver-manifest-input-args.cpp (+9-7)
diff --git a/clang/lib/Driver/ModulesDriver.cpp b/clang/lib/Driver/ModulesDriver.cpp
index 2df40f761680f..2cd274a1f3099 100644
--- a/clang/lib/Driver/ModulesDriver.cpp
+++ b/clang/lib/Driver/ModulesDriver.cpp
@@ -25,12 +25,10 @@
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/DepthFirstIterator.h"
 #include "llvm/ADT/DirectedGraph.h"
-#include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVectorExtras.h"
 #include "llvm/ADT/TypeSwitch.h"
 #include "llvm/ADT/iterator_range.h"
-#include "llvm/Option/ArgList.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/GraphWriter.h"
 #include "llvm/Support/JSON.h"
@@ -1250,20 +1248,20 @@ createClangModulePrecompileJob(Compilation &C, const Command &ImportingJob,
       /*Outputs=*/ArrayRef<InputInfo>{});
 }
 
-/// Creates a \c ClangModuleJobNode with associated job for each unique Clang
-/// module in \p ModuleDepGraphsForScannedJobs.
+/// Creates a ClangModuleJobNode and its job for each unique Clang module
+/// in \p ModuleDepGraphsForScannedJobs.
 ///
-/// \param ImportingJobs Jobs whose module dependencies were scanned.
-/// \param ModuleDepGraphsForScannedJobs Full Clang module dependency graphs
-/// corresponding to \p ImportingJobs, in order.
+/// Only the jobs at indices \p ScannedJobIndices in \p Jobs are expected to be
+/// non-null.
 static void createClangModuleJobsAndNodes(
     CompilationGraph &Graph, Compilation &C,
-    ArrayRef<std::unique_ptr<Command>> ImportingJobs,
+    ArrayRef<std::unique_ptr<Command>> Jobs, ArrayRef<size_t> ScannedJobIndices,
     SmallVectorImpl<deps::ModuleDepsGraph> &&ModuleDepGraphsForScannedJobs) {
   llvm::DenseSet<deps::ModuleID> AlreadySeen;
-  for (auto &&[ImportingJob, ModuleDepsGraph] :
-       llvm::zip_equal(llvm::make_pointee_range(ImportingJobs),
-                       ModuleDepGraphsForScannedJobs)) {
+  for (auto &&[ScanIndex, ModuleDepsGraph] :
+       llvm::enumerate(ModuleDepGraphsForScannedJobs)) {
+    const auto &ImportingJob = *Jobs[ScannedJobIndices[ScanIndex]];
+
     for (auto &MD : ModuleDepsGraph) {
       const auto Inserted = AlreadySeen.insert(MD.ID).second;
       if (!Inserted)
@@ -1276,31 +1274,6 @@ static void createClangModuleJobsAndNodes(
   }
 }
 
-/// Installs the command lines produced by the dependency scan into
-/// \p ScannedJobs.
-static void
-installScanCommandLines(Compilation &C,
-                        MutableArrayRef<std::unique_ptr<Command>> ScannedJobs,
-                        ArrayRef<InputDependencies> InputDepsForScannedJobs) {
-  for (auto &&[Job, InputDeps] : llvm::zip_equal(
-           llvm::make_pointee_range(ScannedJobs), InputDepsForScannedJobs)) {
-    const auto &BuildArgs = InputDeps.BuildArgs;
-    ArgStringList JobArgs;
-    JobArgs.reserve(BuildArgs.size());
-
-    const auto &SourceAction = Job.getSource();
-    const auto &TC = Job.getCreator().getToolChain();
-    auto &TCArgs =
-        C.getArgsForToolChain(&TC, SourceAction.getOffloadingArch(),
-                              SourceAction.getOffloadingDeviceKind());
-
-    for (const auto &Arg : BuildArgs)
-      JobArgs.push_back(TCArgs.MakeArgString(Arg));
-
-    Job.replaceArguments(std::move(JobArgs));
-  }
-}
-
 /// Creates nodes for all jobs which were scanned for dependencies.
 ///
 /// The updated command lines produced by the dependency scan are installed at a
@@ -1533,17 +1506,16 @@ void driver::modules::runModulesDriver(
       Graph, takeJobsAtIndices(Jobs, ScanResult.NonScannableJobIndices));
   auto UnusedStdlibModuleJobNodes = createNodesForUnusedStdlibModuleJobs(
       Graph, takeJobsAtIndices(Jobs, ScanResult.UnusedStdlibModuleJobIndices));
-
-  auto ScannedJobs = takeJobsAtIndices(Jobs, ScanResult.ScannedJobIndices);
   createClangModuleJobsAndNodes(
-      Graph, C, /*ImportingJobs*/ ScannedJobs,
+      Graph, C, Jobs, ScanResult.ScannedJobIndices,
       std::move(ScanResult.ModuleDepGraphsForScannedJobs));
-  installScanCommandLines(C, ScannedJobs, ScanResult.InputDepsForScannedJobs);
-  createNodesForScannedJobs(Graph, std::move(ScannedJobs),
-                            std::move(ScanResult.InputDepsForScannedJobs));
-
+  createNodesForScannedJobs(
+      Graph, takeJobsAtIndices(Jobs, ScanResult.ScannedJobIndices),
+      std::move(ScanResult.InputDepsForScannedJobs));
   createRegularEdges(Graph);
+
   pruneUnusedStdlibModuleJobs(Graph, UnusedStdlibModuleJobNodes);
+
   if (!createModuleDependencyEdges(Graph, Diags))
     return;
   createAndConnectRoot(Graph);
@@ -1552,14 +1524,12 @@ void driver::modules::runModulesDriver(
   if (!Diags.isLastDiagnosticIgnored())
     llvm::WriteGraph<const CompilationGraph *>(llvm::errs(), &Graph);
 
+  // TODO: Install all updated command-lines produced by the dependency scan.
   // TODO: Fix-up command-lines for named module imports.
 
-  llvm::ReversePostOrderTraversal<CompilationGraph *> TopologicallySortedNodes(
-      &Graph);
-  assert(isa<RootNode>(*TopologicallySortedNodes.begin()) &&
-         "First node in topological order must be the root!");
-  auto TopologicallySortedJobNodes = llvm::map_range(
-      llvm::drop_begin(TopologicallySortedNodes), llvm::CastTo<JobNode>);
-  for (auto *JN : TopologicallySortedJobNodes)
-    C.addCommand(std::move(JN->Job));
+  // TODO: Sort the graph topologically before adding jobs back to the
+  // Compilation being built.
+  for (auto *N : Graph)
+    if (auto *JN = dyn_cast<JobNode>(N))
+      C.addCommand(std::move(JN->Job));
 }
diff --git a/clang/test/Driver/modules-driver-clang-modules-only.cpp b/clang/test/Driver/modules-driver-clang-modules-only.cpp
deleted file mode 100644
index 37a803f9b6fc0..0000000000000
--- a/clang/test/Driver/modules-driver-clang-modules-only.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-// Checks that -fmodules-driver correctly handles compilations using Clang modules.
-
-// RUN: split-file %s %t
-// RUN: rm -rf %t/modules-cache
-
-// RUN: %clang -std=c++23 \
-// RUN:   -fmodules-driver -Rmodules-driver \
-// RUN:   -fmodules -Rmodule-import \
-// RUN:   -fmodule-map-file=%t/module.modulemap \
-// RUN:   -fmodules-cache-path=%t/modules-cache \
-// RUN:   -fsyntax-only %t/main.cpp 2>&1 \
-// RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck -DPREFIX=%/t --check-prefix=CHECK-REMARKS %s
-
-// RUN: rm -rf %t/modules-cache
-// RUN: %clang -std=c++23 \
-// RUN:   -fmodules-driver \
-// RUN:   -fmodules \
-// RUN:   -fmodule-map-file=%t/module.modulemap \
-// RUN:   -fmodules-cache-path=%t/modules-cache \
-// RUN:   -fsyntax-only %t/main.cpp \
-// RUN:   -### 2>&1 \
-// RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck --check-prefix=CHECK-CC1 %s
-
-// The scan itself will also produce [-Rmodule-import] remarks.
-// Let's skip past them, we only care about the final -cc1 commands.
-// CHECK-REMARKS:       clang: remark: printing module dependency graph [-Rmodules-driver]
-// CHECK-REMARKS-NEXT:  digraph "Module Dependency Graph" {
-// CHECK-REMARKS:       }
-
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'root' from
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'direct1' into 'root'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive1' into 'direct1'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive2' into 'direct1'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'direct2' into 'root'
-// CHECK-REMARKS: [[PREFIX]]/main.cpp:1:2: remark: importing module 'transitive2' into 'direct2'
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[TRANSITIVE2PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-name=transitive2"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[DIRECT2PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=transitive2=[[TRANSITIVE2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=direct2"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[TRANSITIVE1PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-name=transitive1"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[DIRECT1PCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=transitive1=[[TRANSITIVE1PCM]]"
-// CHECK-CC1-SAME: "-fmodule-file=transitive2=[[TRANSITIVE2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=direct1"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-o" "[[ROOTPCM:[^"]+]]"
-// CHECK-CC1-SAME: "-emit-module"
-// CHECK-CC1-SAME: "-fmodule-file=direct1=[[DIRECT1PCM]]"
-// CHECK-CC1-SAME: "-fmodule-file=direct2=[[DIRECT2PCM]]"
-// CHECK-CC1-SAME: "-fmodule-name=root"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// CHECK-CC1: "-cc1"
-// CHECK-CC1-SAME: "-fsyntax-only"
-// CHECK-CC1-SAME: "{{.*}}/main.cpp"
-// CHECK-CC1-SAME: "-fmodule-file=root=[[ROOTPCM]]"
-// CHECK-CC1-SAME: "-fno-implicit-modules"
-
-// (Because of missing include guards, this example would also run into
-// redefinition errors when compiling without modules.)
-
-/--- module.modulemap
-module root { header "root.h"}
-module transitive1 { header "transitive1.h" }
-module transitive2 { header "transitive2.h" }
-module direct1 { header "direct1.h" }
-module direct2 { header "direct2.h" }
-
-//--- root.h
-#include "direct1.h"
-#include "direct2.h"
-int fromRoot() {
-  return fromDirect1() + fromDirect2();
-}
-
-//--- direct1.h
-#include "transitive1.h"
-#include "transitive2.h"
-
-int fromDirect1() {
-  return fromTransitive1() + fromTransitive2();
-}
-
-//--- direct2.h
-#include "transitive2.h"
-
-int fromDirect2() {
-  return fromTransitive2() + 2;
-}
-
-//--- transitive1.h
-int fromTransitive1() {
-    return 20;
-}
-
-//--- transitive2.h
-int fromTransitive2() {
-    return 10;
-}
-
-//--- main.cpp
-#include "root.h"
-
-int main() {
- fromRoot();
-}
diff --git a/clang/test/Driver/modules-driver-manifest-input-args.cpp b/clang/test/Driver/modules-driver-manifest-input-args.cpp
index 726fe03e27840..99765a1943faf 100644
--- a/clang/test/Driver/modules-driver-manifest-input-args.cpp
+++ b/clang/test/Driver/modules-driver-manifest-input-args.cpp
@@ -26,15 +26,17 @@
 // RUN:   %t/main.cpp \
 // RUN:   -### 2>&1 \
 // RUN:   | sed 's:\\\\\?:/:g' \
-// RUN:   | FileCheck %s -DPREFIX=%/t
+// RUN:   | FileCheck %s -check-prefix=MAIN-CC1 -check-prefix=STDLIB-MOD-CC1 -DPREFIX=%/t
 
-// CHECK: "-cc1" {{.*}} "-Wno-reserved-module-identifier" {{.*}} "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/std.cppm" {{.*}} "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
+// MAIN-CC1: "-cc1"
+// MAIN-CC1-SAME: "main.cpp"
+// MAIN-CC1-NOT: "-Wno-reserved-module-identifier"
+// MAIN-CC1-NOT: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
 
-// The adjustments should only be made for inputs from the Standard Library module manifest:
-// Check that the -cc1 command line does not contain those adjustments!
-// CHECK: "-cc1" {{.*}}main
-// CHECK-NOT: "-Wno-reserved-module-identifier"
-// CHECK-NOT: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
+// STDLIB-MOD-CC1: "-cc1"
+// STDLIB-MOD-CC1-SAME: "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/std.cppm"
+// STDLIB-MOD-CC1-SAME: "-Wno-reserved-module-identifier"
+// STDLIB-MOD-CC1-SAME: "-internal-isystem" "[[PREFIX]]/Inputs/usr/lib/x86_64-linux-gnu/../share/libc++/v1/"
 
 //--- main.cpp
 import std;

naveen-seth added a commit to naveen-seth/llvm-project that referenced this pull request Apr 9, 2026
…dules-driver" (llvm#191122)

This reverts commit 87491a4.
The original commit created Clang module precompile jobs as
CC1Command objects instead of regular Command objects, which
introduced a memory leak.
This has been fixed in this reland.
naveen-seth added a commit that referenced this pull request Apr 9, 2026
…dules-driver" (#191258)

This relands #187606 (reverted with #191122).

In the initial PR, the Clang module precompile jobs were created as
`CC1Command` objects instead of regular `Command` objects, which
introduced a memory leak.
(See discussion in https://reviews.llvm.org/D74447)

This has been fixed in this reland.
YonahGoldberg pushed a commit to YonahGoldberg/llvm-project that referenced this pull request Apr 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants