[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.
This commit is contained in:
Michael Spencer
2025-03-03 13:28:10 -08:00
committed by GitHub
parent eee3db5421
commit 1c4e0f6a54
3 changed files with 41 additions and 1 deletions

View File

@@ -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">;

View File

@@ -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();

View File

@@ -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