[PATCH] D111520: [TypeSwitch/Compiler.h] Provide a LLVM_NODEBUG macro and use it in TypeSwitch.h

Chris Lattner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 10 21:21:35 PDT 2021


lattner created this revision.
Herald added subscribers: Chia-hungDuan, dexonsmith, rriddle.
lattner requested review of this revision.
Herald added subscribers: llvm-commits, stephenneuendorffer.
Herald added a project: LLVM.

TypeSwitch.h is used pervasively in MLIR and often has dozens of types switched
over.  It uses "zero cost" variadic templates to implement the dispatching
mechanism... which isn't zero cost in debug builds, and which causes a massive
problem for actually debugging things that use it - you get dozens of nonsense
frames in the debugger for simple things like a visitor.

Fix this by marking the key method in TypeSwitch as nodebug + alwaysinline.
This resolves LLVM PR49301


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111520

Files:
  llvm/include/llvm/ADT/TypeSwitch.h
  llvm/include/llvm/Support/Compiler.h


Index: llvm/include/llvm/Support/Compiler.h
===================================================================
--- llvm/include/llvm/Support/Compiler.h
+++ llvm/include/llvm/Support/Compiler.h
@@ -248,6 +248,15 @@
 #define LLVM_ATTRIBUTE_ALWAYS_INLINE inline
 #endif
 
+/// LLVM_ATTRIBUTE_NO_DEBUG - On compilers where we have a directive to do
+/// so, mark a method "no debug" because debug info makes the debugger
+/// experience worse.  GCC introduced this in GCC 4.0
+#if __has_attribute(nodebug) || LLVM_GNUC_PREREQ(4, 0, 0)
+#define LLVM_NODEBUG __attribute__((nodebug))
+#else
+#define LLVM_NODEBUG
+#endif
+
 #if __has_attribute(returns_nonnull) || LLVM_GNUC_PREREQ(4, 9, 0)
 #define LLVM_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull))
 #elif defined(_MSC_VER)
Index: llvm/include/llvm/ADT/TypeSwitch.h
===================================================================
--- llvm/include/llvm/ADT/TypeSwitch.h
+++ llvm/include/llvm/ADT/TypeSwitch.h
@@ -35,7 +35,11 @@
   /// Invoke a case on the derived class with multiple case types.
   template <typename CaseT, typename CaseT2, typename... CaseTs,
             typename CallableT>
-  DerivedT &Case(CallableT &&caseFn) {
+  // This is marked always_inline and nodebug so it doesn't show up in stack
+  // traces at -O0 (or other optimization levels).  Large TypeSwitch's are
+  // common, are equivalent to a switch, and don't add any value to stack
+  // traces.
+  LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_NODEBUG DerivedT &Case(CallableT &&caseFn) {
     DerivedT &derived = static_cast<DerivedT &>(*this);
     return derived.template Case<CaseT>(caseFn)
         .template Case<CaseT2, CaseTs...>(caseFn);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111520.378563.patch
Type: text/x-patch
Size: 1680 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211011/09616bf5/attachment.bin>


More information about the llvm-commits mailing list