[clang] [clang] Add #pragma clang __debug module_lookup (PR #129158)

Michael Spencer via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 27 16:10:18 PST 2025


https://github.com/Bigcheese created https://github.com/llvm/llvm-project/pull/129158

This can be used to trigger implicit module map lookup without also importing the module. This can be useful for debugging as it avoids loading the module map from the AST file, which has slightly different semantics.

>From 6af663811f85836e6482de8fdab1e8597989e893 Mon Sep 17 00:00:00 2001
From: Michael Spencer <bigcheesegs at gmail.com>
Date: Tue, 4 Feb 2025 16:09:54 -0800
Subject: [PATCH] [clang] Add #pragma clang __debug module_lookup

This can be used to trigger implicit modulemap lookup without also
importing the module. This can be useful for debugging as it avoids
loading the module map from the AST file.
---
 .../include/clang/Basic/DiagnosticLexKinds.td |  2 ++
 clang/lib/Lex/Pragma.cpp                      | 18 ++++++++++++++-
 clang/test/Modules/clang-pragmas.c            | 22 +++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Modules/clang-pragmas.c

diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index 2b1cc81677b08..0ae4f871288cb 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -715,6 +715,8 @@ def warn_pragma_debug_unexpected_command : Warning<
   "unexpected debug command '%0'">, InGroup<IgnoredPragmas>;
 def warn_pragma_debug_unknown_module : Warning<
   "unknown module '%0'">, InGroup<IgnoredPragmas>;
+def warn_pragma_debug_unable_to_find_module : Warning<
+  "unable to find module '%0'">, InGroup<IgnoredPragmas>;
 // #pragma module
 def err_pp_expected_module_name : Error<
   "expected %select{identifier after '.' in |}0module name">;
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index e339ca8422278..91c1619e35623 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -1119,11 +1119,27 @@ struct PragmaDebugHandler : public PragmaHandler {
         M = MM.lookupModuleQualified(IIAndLoc.first->getName(), M);
         if (!M) {
           PP.Diag(IIAndLoc.second, diag::warn_pragma_debug_unknown_module)
-              << IIAndLoc.first;
+              << IIAndLoc.first->getName();
           return;
         }
       }
       M->dump();
+    } else if (II->isStr("module_lookup")) {
+      Token MName;
+      PP.LexUnexpandedToken(MName);
+      auto *MNameII = MName.getIdentifierInfo();
+      if (!MNameII) {
+        PP.Diag(MName, diag::warn_pragma_debug_missing_argument)
+            << II->getName();
+        return;
+      }
+      Module *M = PP.getHeaderSearchInfo().lookupModule(MNameII->getName());
+      if (!M) {
+        PP.Diag(MName, diag::warn_pragma_debug_unable_to_find_module)
+            << MNameII->getName();
+        return;
+      }
+      M->dump();
     } else if (II->isStr("overflow_stack")) {
       if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash)
         DebugOverflowStack();
diff --git a/clang/test/Modules/clang-pragmas.c b/clang/test/Modules/clang-pragmas.c
new file mode 100644
index 0000000000000..22ead7279f84f
--- /dev/null
+++ b/clang/test/Modules/clang-pragmas.c
@@ -0,0 +1,22 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -I%t %t/tu.c -fsyntax-only \
+// RUN:   -verify 2>&1 | FileCheck %s
+
+//--- module.modulemap
+
+module A {
+  header "A.h"
+}
+
+//--- A.h
+
+//--- tu.c
+
+#pragma clang __debug module_map A // expected-warning{{unknown module 'A'}}
+#pragma clang __debug module_lookup B // expected-warning{{unable to find module 'B'}}
+#pragma clang __debug module_lookup A // does header search for A
+#pragma clang __debug module_map A // now finds module A
+
+// CHECK: module A
+// CHECK: module A



More information about the cfe-commits mailing list