Skip to content

Commit 4194317

Browse files
dkorpelclaude
andcommitted
Fix #20004 - generate DW_TAG_enumerator for enum members in DWARF debug info
Previously, D enum types were emitted as DWARF forward references with no children. The backend's SEenumlist was never populated and SENforward was never cleared for D enums. Populate the SEenumlist with enum member symbols and clear SENforward in visitEnum for all integer-based enums, so that ubyte, ulong, etc. enum base types also get correct DWARF output with member names and values. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a84051c commit 4194317

4 files changed

Lines changed: 39 additions & 1 deletion

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
DWARF debug info now includes enum members
2+
3+
The DMD compiler now generates `DW_TAG_enumerator` entries for D enum members in DWARF debug info.
4+
Previously, enum types were always emitted as forward references with no member information.
5+
6+
Debuggers can now inspect enum member names and values for `int`-based enums.

compiler/src/dmd/glue/toctype.d

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ module dmd.glue.toctype;
1414
import core.stdc.stdio;
1515
import core.stdc.stdlib;
1616

17-
import dmd.backend.cc : Classsym, Symbol;
17+
import dmd.backend.cc : Classsym, SENforward, Symbol;
18+
import dmd.backend.cdef : SC;
19+
import dmd.backend.dlist : list_append;
20+
import dmd.backend.el : el_long;
21+
import dmd.backend.symbol : symbol_name;
1822
import dmd.backend.ty;
1923
import dmd.backend.type;
2024

@@ -256,6 +260,21 @@ type* Type_toCtype(Type t)
256260
else if (symMemtype.toBasetype().ty == Tint32)
257261
{
258262
t.ctype = type_enum(sym.toPrettyChars(true), Type_toCtype(symMemtype));
263+
if (driverParams.symdebug && sym.members)
264+
{
265+
Symbol* s = cast(Symbol*)(cast(type*)t.ctype).Ttag;
266+
s.Senum.SEflags &= ~SENforward;
267+
type* memctype = Type_toCtype(symMemtype);
268+
foreach (m; *sym.members)
269+
{
270+
EnumMember em = m.isEnumMember();
271+
if (!em)
272+
continue;
273+
Symbol* sf = symbol_name(em.ident.toString(), SC.enum_, memctype);
274+
sf.Svalue = el_long(totym(symMemtype.toBasetype()), em.value().toInteger());
275+
list_append(&s.Senum.SEenumlist, sf);
276+
}
277+
}
259278
}
260279
else
261280
{
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
DW_TAG_enumeration_type
2+
DW_AT_name : issue20004.Color
3+
DW_TAG_enumerator
4+
DW_AT_name : red
5+
DW_AT_const_value : 0
6+
DW_AT_name : green
7+
DW_AT_const_value : 1
8+
DW_AT_name : blue
9+
DW_AT_const_value : 2
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
enum Color { red, green, blue }
2+
void main() {
3+
Color c = Color.red;
4+
}

0 commit comments

Comments
 (0)