Author: Michael Spencer Date: 2025-03-03T13:28:10-08:00 New Revision: 1c4e0f6a54538972741ab1c7a5fcc5e5efd3d90c
URL: https://github.com/llvm/llvm-project/commit/1c4e0f6a54538972741ab1c7a5fcc5e5efd3d90c DIFF: https://github.com/llvm/llvm-project/commit/1c4e0f6a54538972741ab1c7a5fcc5e5efd3d90c.diff LOG: [clang] Add #pragma clang __debug module_lookup (#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. Added: clang/test/Modules/clang-pragmas.c Modified: clang/include/clang/Basic/DiagnosticLexKinds.td clang/lib/Lex/Pragma.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 8daf3602450f0..0e5592d65669b 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -718,6 +718,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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits