[lldb] Disable macro redefinition warnings in expression wrapper
authorRaphael Isemann <teemperor@gmail.com>
Tue, 14 Feb 2023 21:55:46 +0000 (22:55 +0100)
committerRaphael Isemann <teemperor@gmail.com>
Tue, 14 Feb 2023 22:20:56 +0000 (23:20 +0100)
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
        ^
<built-in>: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

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
lldb/test/API/commands/expression/macros/TestMacros.py

index 56c00b3..cc3abfd 100644 (file)
@@ -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;
index 3e5d720..b39572b 100644 (file)
@@ -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()))