[clang] [llvm] [WIP][clang][DebugInfo] Add new DW_AT_APPLE_enum_kind to encode enum_extensibility (PR #124752)

Michael Buch via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 29 03:07:42 PST 2025


Michael137 wrote:

> (hmm, can't use the foundation library on godbolt/compiler explorer) Can you show a small example of the code you're interested in and the DWARF it produces? The documentation I can find seems to suggest that the extensible enums have ctors that take the underlying integer type, but the non-extensible ones don't, so I'd have thought that might be adequate to differentiate without an extra attribute?

`NS_ENUM` is just a `#define` that adds the `enum_extensibility(open)` attribute to a plain C enum. Given following example:
```
#import <Foundation/Foundation.h>

enum Enum {
    e1
} e;

enum class EnumClass : unsigned {
    ec1
} ec;

enum __attribute__((enum_extensibility(open))) OpenEnum {
  oe1
} oe;

enum __attribute__((enum_extensibility(open))) OpenEnumClass : unsigned {
  oec1
} oec;

typedef NS_ENUM(unsigned, ns_enum) {
  ns1
} ns;
```

Here are all the `DW_TAG_enumeration_type`s:
```
0x0000002c:   DW_TAG_enumeration_type
                DW_AT_type	(0x00000039 "unsigned int")
                DW_AT_name	("Enum")
                DW_AT_byte_size	(0x04)
                DW_AT_decl_file	("/Users/michaelbuch/ns_enum.m")
                DW_AT_decl_line	(3)

0x00000035:     DW_TAG_enumerator
                  DW_AT_name	("e1")
                  DW_AT_const_value	(0)

0x00000048:   DW_TAG_enumeration_type
                DW_AT_type	(0x00000039 "unsigned int")
                DW_AT_enum_class	(true)
                DW_AT_name	("EnumClass")
                DW_AT_byte_size	(0x04)
                DW_AT_decl_file	("/Users/michaelbuch/ns_enum.m")
                DW_AT_decl_line	(7)

0x00000051:     DW_TAG_enumerator
                  DW_AT_name	("ec1")
                  DW_AT_const_value	(0)

0x00000060:   DW_TAG_enumeration_type
                DW_AT_type	(0x00000039 "unsigned int")
                DW_AT_name	("OpenEnum")
                DW_AT_byte_size	(0x04)
                DW_AT_decl_file	("/Users/michaelbuch/ns_enum.m")
                DW_AT_decl_line	(11)

0x00000069:     DW_TAG_enumerator
                  DW_AT_name	("oe1")
                  DW_AT_const_value	(0)

0x00000078:   DW_TAG_enumeration_type
                DW_AT_type	(0x00000039 "unsigned int")
                DW_AT_enum_class	(true)
                DW_AT_name	("OpenEnumClass")
                DW_AT_byte_size	(0x04)
                DW_AT_decl_file	("/Users/michaelbuch/ns_enum.m")
                DW_AT_decl_line	(15)

0x00000081:     DW_TAG_enumerator
                  DW_AT_name	("oec1")
                  DW_AT_const_value	(0)

0x00000090:   DW_TAG_enumeration_type
                DW_AT_type	(0x00000039 "unsigned int")
                DW_AT_name	("ns_enum")
                DW_AT_byte_size	(0x04)
                DW_AT_decl_file	("/Users/michaelbuch/ns_enum.m")
                DW_AT_decl_line	(19)

0x00000099:     DW_TAG_enumerator
                  DW_AT_name	("ns1")
                  DW_AT_const_value	(0)
```

So nothing about the extensibility is reflected here

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


More information about the llvm-commits mailing list