https://github.com/qiongsiwu created 
https://github.com/llvm/llvm-project/pull/140820

This reverts commit ea1bfbf3f6399b7d2d840722f0e87542d00f6a35.

The commit did not solve the fundamental issue we need to handle and is no 
longer necessary. 

rdar://144794793

>From 22c4747a1232756c672691a14ae2b72caa92b294 Mon Sep 17 00:00:00 2001
From: Qiongsi Wu <qiongsi...@apple.com>
Date: Tue, 20 May 2025 16:39:45 -0700
Subject: [PATCH] Revert "[clang][Dependency Scanning] Report What a Module
 Exports during Scanning (#137421)"

This reverts commit ea1bfbf3f6399b7d2d840722f0e87542d00f6a35.
---
 .../DependencyScanning/ModuleDepCollector.h   |  30 ++--
 .../DependencyScanning/ModuleDepCollector.cpp |  65 ++++-----
 clang/test/ClangScanDeps/export.c             | 133 ------------------
 clang/test/ClangScanDeps/optimize-vfs-pch.m   |   3 +-
 clang/tools/clang-scan-deps/ClangScanDeps.cpp |  26 +---
 5 files changed, 41 insertions(+), 216 deletions(-)
 delete mode 100644 clang/test/ClangScanDeps/export.c

diff --git 
a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h 
b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
index 06717a64c9a78..d2d0d56e5212c 100644
--- a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
+++ b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h
@@ -178,25 +178,12 @@ struct ModuleDeps {
   /// on, not including transitive dependencies.
   std::vector<PrebuiltModuleDep> PrebuiltModuleDeps;
 
-  /// This struct contains information about a single dependency.
-  struct DepInfo {
-    /// Identifies the dependency.
-    ModuleID ID;
-
-    /// Indicates if the module that has this dependency exports it or not.
-    bool Exported = false;
-
-    bool operator<(const DepInfo &Other) const {
-      return std::tie(ID, Exported) < std::tie(Other.ID, Other.Exported);
-    }
-  };
-
-  /// A list of DepsInfo containing information about modules this module
-  /// directly depends on, not including transitive dependencies.
+  /// A list of module identifiers this module directly depends on, not
+  /// including transitive dependencies.
   ///
   /// This may include modules with a different context hash when it can be
   /// determined that the differences are benign for this compilation.
-  std::vector<ModuleDeps::DepInfo> ClangModuleDeps;
+  std::vector<ModuleID> ClangModuleDeps;
 
   /// The set of libraries or frameworks to link against when
   /// an entity from this module is used.
@@ -283,8 +270,7 @@ class ModuleDepCollectorPP final : public PPCallbacks {
                           llvm::DenseSet<const Module *> &AddedModules);
 
   /// Add discovered module dependency for the given module.
-  void addOneModuleDep(const Module *M, bool Exported, const ModuleID ID,
-                       ModuleDeps &MD);
+  void addOneModuleDep(const Module *M, const ModuleID ID, ModuleDeps &MD);
 };
 
 /// Collects modular and non-modular dependencies of the main file by attaching
@@ -366,16 +352,16 @@ class ModuleDepCollector final : public 
DependencyCollector {
 
   /// Collect module map files for given modules.
   llvm::DenseSet<const FileEntry *>
-  collectModuleMapFiles(ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const;
+  collectModuleMapFiles(ArrayRef<ModuleID> ClangModuleDeps) const;
 
   /// Add module map files to the invocation, if needed.
   void addModuleMapFiles(CompilerInvocation &CI,
-                         ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const;
+                         ArrayRef<ModuleID> ClangModuleDeps) const;
   /// Add module files (pcm) to the invocation, if needed.
   void addModuleFiles(CompilerInvocation &CI,
-                      ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const;
+                      ArrayRef<ModuleID> ClangModuleDeps) const;
   void addModuleFiles(CowCompilerInvocation &CI,
-                      ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const;
+                      ArrayRef<ModuleID> ClangModuleDeps) const;
 
   /// Add paths that require looking up outputs to the given dependencies.
   void addOutputPaths(CowCompilerInvocation &CI, ModuleDeps &Deps);
diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp 
b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index 45901cbcedcb7..eb674246e2d51 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -389,10 +389,10 @@ 
ModuleDepCollector::getInvocationAdjustedForModuleBuildWithoutOutputs(
 }
 
 llvm::DenseSet<const FileEntry *> ModuleDepCollector::collectModuleMapFiles(
-    ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const {
+    ArrayRef<ModuleID> ClangModuleDeps) const {
   llvm::DenseSet<const FileEntry *> ModuleMapFiles;
-  for (const auto &Info : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(Info.ID);
+  for (const ModuleID &MID : ClangModuleDeps) {
+    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
     assert(MD && "Inconsistent dependency info");
     // TODO: Track ClangModuleMapFile as `FileEntryRef`.
     auto FE = ScanInstance.getFileManager().getOptionalFileRef(
@@ -404,23 +404,21 @@ llvm::DenseSet<const FileEntry *> 
ModuleDepCollector::collectModuleMapFiles(
 }
 
 void ModuleDepCollector::addModuleMapFiles(
-    CompilerInvocation &CI,
-    ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const {
+    CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
   if (Service.shouldEagerLoadModules())
     return; // Only pcm is needed for eager load.
 
-  for (const auto &Info : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(Info.ID);
+  for (const ModuleID &MID : ClangModuleDeps) {
+    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
     assert(MD && "Inconsistent dependency info");
     CI.getFrontendOpts().ModuleMapFiles.push_back(MD->ClangModuleMapFile);
   }
 }
 
 void ModuleDepCollector::addModuleFiles(
-    CompilerInvocation &CI,
-    ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const {
-  for (const auto &Info : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(Info.ID);
+    CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+  for (const ModuleID &MID : ClangModuleDeps) {
+    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
     std::string PCMPath =
         Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
 
@@ -428,15 +426,14 @@ void ModuleDepCollector::addModuleFiles(
       CI.getFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
     else
       CI.getHeaderSearchOpts().PrebuiltModuleFiles.insert(
-          {Info.ID.ModuleName, std::move(PCMPath)});
+          {MID.ModuleName, std::move(PCMPath)});
   }
 }
 
 void ModuleDepCollector::addModuleFiles(
-    CowCompilerInvocation &CI,
-    ArrayRef<ModuleDeps::DepInfo> ClangModuleDeps) const {
-  for (const auto &Info : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(Info.ID);
+    CowCompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+  for (const ModuleID &MID : ClangModuleDeps) {
+    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
     std::string PCMPath =
         Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
 
@@ -444,7 +441,7 @@ void ModuleDepCollector::addModuleFiles(
       CI.getMutFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
     else
       CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.insert(
-          {Info.ID.ModuleName, std::move(PCMPath)});
+          {MID.ModuleName, std::move(PCMPath)});
   }
 }
 
@@ -474,10 +471,10 @@ void 
ModuleDepCollector::applyDiscoveredDependencies(CompilerInvocation &CI) {
         CI.getFrontendOpts().ModuleMapFiles.emplace_back(
             CurrentModuleMap->getNameAsRequested());
 
-    SmallVector<ModuleDeps::DepInfo> DirectDeps;
+    SmallVector<ModuleID> DirectDeps;
     for (const auto &KV : ModularDeps)
       if (DirectModularDeps.contains(KV.first))
-        DirectDeps.push_back({KV.second->ID, /* Exported = */ false});
+        DirectDeps.push_back(KV.second->ID);
 
     // TODO: Report module maps the same way it's done for modular 
dependencies.
     addModuleMapFiles(CI, DirectDeps);
@@ -600,9 +597,9 @@ static std::string getModuleContextHash(const ModuleDeps 
&MD,
   // example, case-insensitive paths to modulemap files. Usually such a case
   // would indicate a missed optimization to canonicalize, but it may be
   // difficult to canonicalize all cases when there is a VFS.
-  for (const auto &Info : MD.ClangModuleDeps) {
-    HashBuilder.add(Info.ID.ModuleName);
-    HashBuilder.add(Info.ID.ContextHash);
+  for (const auto &ID : MD.ClangModuleDeps) {
+    HashBuilder.add(ID.ModuleName);
+    HashBuilder.add(ID.ContextHash);
   }
 
   HashBuilder.add(EagerLoadModules);
@@ -926,10 +923,9 @@ void ModuleDepCollectorPP::addAllSubmoduleDeps(
   });
 }
 
-void ModuleDepCollectorPP::addOneModuleDep(const Module *M, bool Exported,
-                                           const ModuleID ID, ModuleDeps &MD) {
-  MD.ClangModuleDeps.push_back({ID, Exported});
-
+void ModuleDepCollectorPP::addOneModuleDep(const Module *M, const ModuleID ID,
+                                           ModuleDeps &MD) {
+  MD.ClangModuleDeps.push_back(ID);
   if (MD.IsInStableDirectories)
     MD.IsInStableDirectories = MDC.ModularDeps[M]->IsInStableDirectories;
 }
@@ -937,19 +933,12 @@ void ModuleDepCollectorPP::addOneModuleDep(const Module 
*M, bool Exported,
 void ModuleDepCollectorPP::addModuleDep(
     const Module *M, ModuleDeps &MD,
     llvm::DenseSet<const Module *> &AddedModules) {
-  SmallVector<Module *> ExportedModulesVector;
-  M->getExportedModules(ExportedModulesVector);
-  llvm::DenseSet<const Module *> ExportedModulesSet(
-      ExportedModulesVector.begin(), ExportedModulesVector.end());
   for (const Module *Import : M->Imports) {
-    const Module *ImportedTopLevelModule = Import->getTopLevelModule();
-    if (ImportedTopLevelModule != M->getTopLevelModule() &&
+    if (Import->getTopLevelModule() != M->getTopLevelModule() &&
         !MDC.isPrebuiltModule(Import)) {
-      if (auto ImportID = handleTopLevelModule(ImportedTopLevelModule))
-        if (AddedModules.insert(ImportedTopLevelModule).second) {
-          bool Exported = ExportedModulesSet.contains(ImportedTopLevelModule);
-          addOneModuleDep(ImportedTopLevelModule, Exported, *ImportID, MD);
-        }
+      if (auto ImportID = handleTopLevelModule(Import->getTopLevelModule()))
+        if (AddedModules.insert(Import->getTopLevelModule()).second)
+          addOneModuleDep(Import->getTopLevelModule(), *ImportID, MD);
     }
   }
 }
@@ -973,7 +962,7 @@ void ModuleDepCollectorPP::addAffectingClangModule(
         !MDC.isPrebuiltModule(Affecting)) {
       if (auto ImportID = handleTopLevelModule(Affecting))
         if (AddedModules.insert(Affecting).second)
-          addOneModuleDep(Affecting, /* Exported = */ false, *ImportID, MD);
+          addOneModuleDep(Affecting, *ImportID, MD);
     }
   }
 }
diff --git a/clang/test/ClangScanDeps/export.c 
b/clang/test/ClangScanDeps/export.c
deleted file mode 100644
index a68747c9e6fe0..0000000000000
--- a/clang/test/ClangScanDeps/export.c
+++ /dev/null
@@ -1,133 +0,0 @@
-// Test correctly reporting what a module exports during dependency scanning.
-// Module A depends on modules B, C and D, but only exports B and C.
-// Module E depends on modules B, C and D, and exports all of them.
-
-// RUN: rm -rf %t
-// RUN: split-file %s %t
-// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json
-// RUN: clang-scan-deps -compilation-database \
-// RUN:   %t/cdb.json -format experimental-full > %t/deps.db
-// RUN: cat %t/deps.db | sed 's:\\\\\?:/:g' | FileCheck %s
-
-//--- cdb.json.template
-[
-    {
-      "directory": "DIR",
-      "command": "clang -c DIR/test.c -I DIR/AH -I DIR/BH -I DIR/CH -I DIR/DH 
-I DIR/EH -fmodules -fmodules-cache-path=DIR/cache",
-      "file": "DIR/test.c"
-    },
-]
-
-//--- AH/A.h
-#include "B.h"
-#include "C.h"
-#include "D.h"
-
-int funcA();
-
-//--- AH/module.modulemap
-module A {
-    header "A.h"
-
-    export B
-    export C
-}
-
-//--- BH/B.h
-//--- BH/module.modulemap
-module B {
-    header "B.h"
-}
-
-//--- CH/C.h
-//--- CH/module.modulemap
-module C {
-    header "C.h"
-}
-
-//--- DH/D.h
-//--- DH/module.modulemap
-module D {
-    header "D.h"
-}
-
-//--- EH/E.h
-#include "B.h"
-#include "C.h"
-#include "D.h"
-
-//--- EH/module.modulemap
-module E {
-    header "E.h"
-    export *
-}
-
-//--- test.c
-#include "A.h"
-#include "E.h"
-
-int test1() {
-  return funcA();
-}
-
-// CHECK:      {
-// CHECK-NEXT:   "modules": [
-// CHECK-NEXT:         {
-// CHECK-NEXT:           "clang-module-deps": [
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_B:.*]]",
-// CHECK-NEXT:               "module-name": "B",
-// CHECK-NEXT:               "exported": "true"
-// CHECK-NEXT:             },
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_C:.*]]",
-// CHECK-NEXT:               "module-name": "C",
-// CHECK-NEXT:               "exported": "true"
-// CHECK-NEXT:             },
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_D:.*]]",
-// CHECK-NEXT:               "module-name": "D"
-// CHECK-NEXT:             }
-// CHECK-NEXT:           ],
-// CHECK-NEXT:           "clang-modulemap-file":{{.*}},
-// CHECK-NEXT:           "command-line": [
-// CHECK:                 ],
-// CHECK:                "name": "A"
-// CHECK-NEXT:       }
-// CHECK:            {
-// CHECK:                 "name": "B"
-// CHECK:            }
-// CHECK:            {
-// CHECK:                 "name": "C"
-// CHECK:            }
-// CHECK:            {
-// CHECK:                 "name": "D"
-// CHECK:            }
-// CHECK:            {
-// CHECK-NEXT:           "clang-module-deps": [
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_B]]",
-// CHECK-NEXT:               "module-name": "B",
-// CHECK-NEXT:               "exported": "true"
-// CHECK-NEXT:             },
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_C]]",
-// CHECK-NEXT:               "module-name": "C",
-// CHECK-NEXT:               "exported": "true"
-// CHECK-NEXT:             },
-// CHECK-NEXT:             {
-// CHECK-NEXT:               "context-hash": "[[HASH_MOD_D]]",
-// CHECK-NEXT:               "module-name": "D",
-// CHECK-NEXT:               "exported": "true"
-// CHECK-NEXT:             }
-// CHECK-NEXT:           ],
-// CHECK-NEXT:           "clang-modulemap-file":{{.*}},
-// CHECK-NEXT:           "command-line": [
-// CHECK:                 ],
-// CHECK:                "name": "E"
-// CHECK-NEXT:       }
-// CHECK:   ]
-// CHECK:   }
-
-
-
diff --git a/clang/test/ClangScanDeps/optimize-vfs-pch.m 
b/clang/test/ClangScanDeps/optimize-vfs-pch.m
index 190a0509644ab..0b5cb08d365ee 100644
--- a/clang/test/ClangScanDeps/optimize-vfs-pch.m
+++ b/clang/test/ClangScanDeps/optimize-vfs-pch.m
@@ -54,8 +54,7 @@
 // CHECK-NEXT:       "clang-module-deps": [
 // CHECK-NEXT:         {
 // CHECK-NEXT:           "context-hash": "{{.*}}",
-// CHECK-NEXT:           "module-name": "E",
-// CHECK-NEXT:           "exported": "true"
+// CHECK-NEXT:           "module-name": "E"
 // CHECK-NEXT:         }
 // CHECK-NEXT:       ],
 // CHECK-NEXT:       "clang-modulemap-file": 
"[[PREFIX]]/modules/D/module.modulemap",
diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp 
b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index 3b42267f4d5f4..1ce466d99deaf 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -353,32 +353,16 @@ static auto toJSONStrings(llvm::json::OStream &JOS, 
Container &&Strings) {
   };
 }
 
-static auto toJSONModuleID(llvm::json::OStream &JOS, StringRef ContextHash,
-                           StringRef ModuleName, bool Exported) {
-  return JOS.object([&] {
-    JOS.attribute("context-hash", StringRef(ContextHash));
-    JOS.attribute("module-name", StringRef(ModuleName));
-    if (Exported)
-      JOS.attribute("exported", StringRef("true"));
-  });
-}
-
 // Technically, we don't need to sort the dependency list to get determinism.
 // Leaving these be will simply preserve the import order.
 static auto toJSONSorted(llvm::json::OStream &JOS, std::vector<ModuleID> V) {
   llvm::sort(V);
   return [&JOS, V = std::move(V)] {
-    for (const auto &MID : V)
-      toJSONModuleID(JOS, MID.ContextHash, MID.ModuleName, false);
-  };
-}
-
-static auto toJSONSorted(llvm::json::OStream &JOS,
-                         std::vector<ModuleDeps::DepInfo> V) {
-  llvm::sort(V);
-  return [&JOS, V = std::move(V)] {
-    for (const ModuleDeps::DepInfo &MID : V)
-      toJSONModuleID(JOS, MID.ID.ContextHash, MID.ID.ModuleName, MID.Exported);
+    for (const ModuleID &MID : V)
+      JOS.object([&] {
+        JOS.attribute("context-hash", StringRef(MID.ContextHash));
+        JOS.attribute("module-name", StringRef(MID.ModuleName));
+      });
   };
 }
 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to