teemperor created this revision. teemperor added a reviewer: Michael137. teemperor added a project: LLDB. Herald added a subscriber: JDevlieghere. Herald added a project: All. teemperor requested review of this revision. Herald added a subscriber: lldb-commits.
GCC emits macro definitions into debug info when compiling with `-g3`. LLDB is translating this information into `#define` directives which are injected into the source code of user expressions. While this mechanism itself works fine, it can lead to spurious "... macro redefined" warnings when the defined macro is also a builtin Clang macro: warning: <lldb wrapper prefix>:46:9: '__VERSION__' macro redefined #define __VERSION__ "12.1.0" ^ <built-in>:19:9: previous definition is here #define __VERSION__ "Clang 14.0.6" [repeated about a 100 more times for every builtin macro] This patch just disables the diagnostic when parsing LLDB's generated list of macros definitions. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D139740 Files: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp lldb/test/API/commands/expression/macros/TestMacros.py Index: lldb/test/API/commands/expression/macros/TestMacros.py =================================================================== --- lldb/test/API/commands/expression/macros/TestMacros.py +++ lldb/test/API/commands/expression/macros/TestMacros.py @@ -129,3 +129,8 @@ result = frame.EvaluateExpression("MACRO_2") self.assertTrue(result.GetError().Fail(), "Printing MACRO_2 fails in the header file") + + # Check that the macro definitions do not trigger bogus Clang + # diagnostics about macro redefinitions. + result = frame.EvaluateExpression("does_not_parse") + self.assertNotIn("macro redefined", str(result.GetError())) Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -14,6 +14,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringRef.h" #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h" @@ -141,6 +142,16 @@ if (dm == nullptr) return; + // The macros directives below can potentially redefine builtin macros of the + // Clang instance which parses the user expression. The Clang diagnostics + // caused by this are not useful for the user as the source code here is + // generated by LLDB. + stream << "#pragma clang diagnostic push\n"; + stream << "#pragma clang diagnostic ignored \"-Wmacro-redefined\"\n"; + auto pop_warning = llvm::make_scope_exit([&stream](){ + stream << "#pragma clang diagnostic pop\n"; + }); + for (size_t i = 0; i < dm->GetNumMacroEntries(); i++) { const DebugMacroEntry &entry = dm->GetMacroEntryAtIndex(i); uint32_t line;
Index: lldb/test/API/commands/expression/macros/TestMacros.py =================================================================== --- lldb/test/API/commands/expression/macros/TestMacros.py +++ lldb/test/API/commands/expression/macros/TestMacros.py @@ -129,3 +129,8 @@ result = frame.EvaluateExpression("MACRO_2") self.assertTrue(result.GetError().Fail(), "Printing MACRO_2 fails in the header file") + + # Check that the macro definitions do not trigger bogus Clang + # diagnostics about macro redefinitions. + result = frame.EvaluateExpression("does_not_parse") + self.assertNotIn("macro redefined", str(result.GetError())) Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -14,6 +14,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringRef.h" #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h" @@ -141,6 +142,16 @@ if (dm == nullptr) return; + // The macros directives below can potentially redefine builtin macros of the + // Clang instance which parses the user expression. The Clang diagnostics + // caused by this are not useful for the user as the source code here is + // generated by LLDB. + stream << "#pragma clang diagnostic push\n"; + stream << "#pragma clang diagnostic ignored \"-Wmacro-redefined\"\n"; + auto pop_warning = llvm::make_scope_exit([&stream](){ + stream << "#pragma clang diagnostic pop\n"; + }); + for (size_t i = 0; i < dm->GetNumMacroEntries(); i++) { const DebugMacroEntry &entry = dm->GetMacroEntryAtIndex(i); uint32_t line;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits