From 9f3a3e1f3f9767ae52c492d20d63f65e82319ed2 Mon Sep 17 00:00:00 2001 From: Raphael Isemann Date: Tue, 14 Feb 2023 22:55:46 +0100 Subject: [PATCH] [lldb] Disable macro redefinition warnings in expression wrapper 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: :46:9: '__VERSION__' macro redefined ^ :19:9: previous definition is here [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. Reviewed By: Michael137 Differential Revision: https://reviews.llvm.org/D139740 --- .../ExpressionParser/Clang/ClangExpressionSourceCode.cpp | 12 ++++++++++++ lldb/test/API/commands/expression/macros/TestMacros.py | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp index 56c00b3..cc3abfd 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ b/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,17 @@ static void AddMacros(const DebugMacros *dm, CompileUnit *comp_unit, 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"; + stream << "#pragma clang diagnostic ignored \"-Wbuiltin-macro-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; diff --git a/lldb/test/API/commands/expression/macros/TestMacros.py b/lldb/test/API/commands/expression/macros/TestMacros.py index 3e5d720a..b39572b 100644 --- a/lldb/test/API/commands/expression/macros/TestMacros.py +++ b/lldb/test/API/commands/expression/macros/TestMacros.py @@ -129,3 +129,9 @@ class TestMacros(TestBase): 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())) + self.assertNotIn("redefining builtin macro", str(result.GetError())) -- 2.7.4