[clang] [clang] Add clang::debug_info_type attribute for bitfields (PR #69104)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 18 12:25:15 PDT 2023


================
@@ -7219,6 +7219,18 @@ its underlying representation to be a WebAssembly ``funcref``.
   }];
 }
 
+def DebugInfoTypeDocumentation : Documentation {
+  let Category = DocCatField;
+  let Content = [{
+This attribute allows to alter type of a bitfield in debug information.
+Such a need might arise when bitfield is intended to store an enumeration value,
+but has to be specified as having enumeration's underlying type, in order to
+facilitate compiler optimizations. But this also causes underlying type to be
+emitted in debug information, making it hard for debuggers to map bitfield's
+value back to enumeration. This attribute helps with this.
+  }];
----------------
AaronBallman wrote:

```suggestion
This attribute allows adjusting the type of a bit-field in debug information.
This can be helpful when a bit-field is intended to store an enumeration value,
but has to be specified as having the enumeration's underlying type in order to
facilitate compiler optimizations or bit-field packing behavior. Normally, the
underlying type is what is emitted in debug information, which can make it hard
for debuggers to know to map a bit-field's value back to a particular enumeration.

.. code-block:: c++

    enum Colors { Red, Green, Blue };

    struct S {
      [[clang::debug_info_type(Colors)]] unsigned ColorVal : 2;
      [[clang::debug_info_type(bool)]] unsigned UseAlternateColorSpace : 1;
    } s = { Green, false };

Without the attribute, a debugger is likely to display the value `1` for `ColorVal` and `0` for `UseAlternateColorSpace`. With the attribute, the debugger may now display `Green` and
`false` instead.
  }];
```
Maybe something like this (with better formatting)?

https://github.com/llvm/llvm-project/pull/69104


More information about the cfe-commits mailing list