From: Richard Smith Date: Thu, 18 Apr 2019 00:57:01 +0000 (+0000) Subject: Add '#pragma clang __debug module_map module.name' to dump the module X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=224f452d08c86330f1740dd4a2cf8f9c75413883;p=clang Add '#pragma clang __debug module_map module.name' to dump the module map being used for the module 'module.name'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358632 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index fa8a797366..5c567f2132 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -561,6 +561,8 @@ def warn_pragma_debug_unexpected_command : Warning< "unexpected debug command '%0'">, InGroup; def warn_pragma_debug_missing_argument : Warning< "missing argument to debug command '%0'">, InGroup; +def warn_pragma_debug_unknown_module : Warning< + "unknown module '%0'">, InGroup; // #pragma module def err_pp_expected_module_name : Error< "expected %select{identifier after '.' in |}0module name">; diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index 1c87f3ecc0..ba1b73e7f4 100644 --- a/lib/Lex/Pragma.cpp +++ b/lib/Lex/Pragma.cpp @@ -1010,7 +1010,7 @@ struct PragmaDebugHandler : public PragmaHandler { PragmaDebugHandler() : PragmaHandler("__debug") {} void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, - Token &DepToken) override { + Token &DebugToken) override { Token Tok; PP.LexUnexpandedToken(Tok); if (Tok.isNot(tok::identifier)) { @@ -1072,6 +1072,22 @@ struct PragmaDebugHandler : public PragmaHandler { else PP.Diag(MacroName, diag::warn_pragma_debug_missing_argument) << II->getName(); + } else if (II->isStr("module_map")) { + llvm::SmallVector, 8> + ModuleName; + if (LexModuleName(PP, Tok, ModuleName)) + return; + ModuleMap &MM = PP.getHeaderSearchInfo().getModuleMap(); + Module *M = nullptr; + for (auto IIAndLoc : ModuleName) { + M = MM.lookupModuleQualified(IIAndLoc.first->getName(), M); + if (!M) { + PP.Diag(IIAndLoc.second, diag::warn_pragma_debug_unknown_module) + << IIAndLoc.first; + return; + } + } + M->dump(); } else if (II->isStr("overflow_stack")) { DebugOverflowStack(); } else if (II->isStr("handle_crash")) {