www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 21153] New: DWARF: DMD emits the mangled name for DW_AT_name

https://issues.dlang.org/show_bug.cgi?id=21153

          Issue ID: 21153
           Summary: DWARF: DMD emits the mangled name for DW_AT_name
           Product: D
           Version: D2
          Hardware: All
                OS: Linux
            Status: NEW
          Severity: trivial
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: lucien.perregaux gmail.com

Consider the following program:

---
module bar;

int x = 9;

void main(string[] args)
{
    int i = 5;
    bar(i);
}

void bar(int i)
{
    i = x;
    x += i;
}
---

DMD will emit this:

---
.debug_info contents:
0x00000000: Compile Unit: length = 0x000001ee version = 0x0003 abbr_offset =
0x0000 addr_size = 0x08 (next unit at 0x000001f2)

0x0000000b: DW_TAG_compile_unit
              DW_AT_producer    ("Digital Mars D v2.093.0\n")
              DW_AT_language    (DW_LANG_D)
              DW_AT_name        ("src/main.d")
              DW_AT_comp_dir   
("/home/lucien/Documents/Programmation/D/b9800")
              DW_AT_low_pc      (0x0000000000000000)
              DW_AT_entry_pc    (0x0000000000000000)
              DW_AT_ranges      (0x00000000
                 [0x000000000003f69c, 0x000000000003f6bf)
                 [0x000000000003f6c0, 0x000000000003f6fb)
                 [0x000000000003f6fc, 0x000000000003f720))
              DW_AT_stmt_list   (0x00000000)

0x00000076:   DW_TAG_module
                DW_AT_name      ("bar")

0x0000007b:   DW_TAG_base_type
                DW_AT_name      ("int")
                DW_AT_byte_size (0x04)
                DW_AT_encoding  (DW_ATE_signed)

0x00000082:   DW_TAG_variable
                DW_AT_name      ("_D3bar1xi")
                DW_AT_type      (0x0000007b "int")
                DW_AT_external  (0x01)
                DW_AT_location  (DW_OP_const8u 0x0, DW_OP_GNU_push_tls_address)

0x0000009d:   DW_TAG_base_type
                DW_AT_name      ("uint long")
                DW_AT_byte_size (0x04)
                DW_AT_encoding  (DW_ATE_unsigned)

0x000000aa:   DW_TAG_base_type
                DW_AT_name      ("char")
                DW_AT_byte_size (0x01)
                DW_AT_encoding  (DW_ATE_unsigned_char)

0x000000b2:   DW_TAG_pointer_type
                DW_AT_type      (0x000000aa "char")

0x000000b7:   DW_TAG_structure_type
                DW_AT_name      ("_Array_char")
                DW_AT_byte_size (0x10)

0x000000c5:     DW_TAG_member
                  DW_AT_name    ("length")
                  DW_AT_type    (0x0000009d "uint long")
                  DW_AT_data_member_location    (DW_OP_plus_uconst 0x0)

0x000000d4:     DW_TAG_member
                  DW_AT_name    ("ptr")
                  DW_AT_type    (0x000000b2 "char*")
                  DW_AT_data_member_location    (DW_OP_plus_uconst 0x8)

0x000000e0:     NULL

0x000000e1:   DW_TAG_pointer_type
                DW_AT_type      (0x000000b7 "_Array_char")

0x000000e6:   DW_TAG_structure_type
                DW_AT_name      ("_Array_ucent")
                DW_AT_byte_size (0x10)

0x000000f5:     DW_TAG_member
                  DW_AT_name    ("length")
                  DW_AT_type    (0x0000009d "uint long")
                  DW_AT_data_member_location    (DW_OP_plus_uconst 0x0)

0x00000104:     DW_TAG_member
                  DW_AT_name    ("ptr")
                  DW_AT_type    (0x000000e1 "_Array_char*")
                  DW_AT_data_member_location    (DW_OP_plus_uconst 0x8)

0x00000110:     NULL

0x00000111:   DW_TAG_subprogram
                DW_AT_sibling   (0x00000156)
                DW_AT_name      ("D main")
                DW_AT_MIPS_linkage_name ("_Dmain")
                DW_AT_decl_file ("src/main.d")
                DW_AT_decl_line (5)
                DW_AT_external  (0x01)
                DW_AT_low_pc    (0x000000000003f69c)
                DW_AT_high_pc   (0x000000000003f6bf)
                DW_AT_frame_base        (0x00000000: 
                   [0x000000000003f69c, 0x000000000003f69d): DW_OP_breg7 RSP+8
                   [0x000000000003f69d, 0x000000000003f69f): DW_OP_breg7 RSP+16
                   [0x000000000003f69f, 0x000000000003f6bf): DW_OP_breg6
RBP+16)

0x0000013c:     DW_TAG_formal_parameter
                  DW_AT_name    ("args")
                  DW_AT_type    (0x000000e6 "_Array_ucent")
                  DW_AT_artificial      (0x00)
                  DW_AT_location        (DW_OP_fbreg -32)

0x0000014a:     DW_TAG_variable
                  DW_AT_name    ("i")
                  DW_AT_type    (0x0000007b "int")
                  DW_AT_artificial      (0x00)
                  DW_AT_location        (DW_OP_fbreg -40)

0x00000155:     NULL

0x00000156:   DW_TAG_subprogram
                DW_AT_sibling   (0x00000194)
                DW_AT_name      ("bar.bar")
                DW_AT_MIPS_linkage_name ("_D3barQeFiZv")
                DW_AT_decl_file ("src/main.d")
                DW_AT_decl_line (11)
                DW_AT_external  (0x01)
                DW_AT_low_pc    (0x000000000003f6c0)
                DW_AT_high_pc   (0x000000000003f6fb)
                DW_AT_frame_base        (0x0000004c: 
                   [0x000000000003f6c0, 0x000000000003f6c1): DW_OP_breg7 RSP+8
                   [0x000000000003f6c1, 0x000000000003f6c3): DW_OP_breg7 RSP+16
                   [0x000000000003f6c3, 0x000000000003f6fb): DW_OP_breg6
RBP+16)

0x00000188:     DW_TAG_formal_parameter
                  DW_AT_name    ("i")
                  DW_AT_type    (0x0000007b "int")
                  DW_AT_artificial      (0x00)
                  DW_AT_location        (DW_OP_fbreg -24)

0x00000193:     NULL

0x00000194:   DW_TAG_pointer_type
                DW_AT_type      (0x000000b2 "char*")

0x00000199:   DW_TAG_subprogram
                DW_AT_sibling   (0x000001f1)
                DW_AT_name      ("bar._d_cmain!().main")
                DW_AT_MIPS_linkage_name ("main")
                DW_AT_decl_file
("/usr/include/dlang/dmd/core/internal/entrypoint.d")
                DW_AT_decl_line (27)
                DW_AT_type      (0x0000007b "int")
                DW_AT_external  (0x01)
                DW_AT_low_pc    (0x000000000003f6fc)
                DW_AT_high_pc   (0x000000000003f720)
                DW_AT_frame_base        (0x00000098: 
                   [0x000000000003f6fc, 0x000000000003f6fd): DW_OP_breg7 RSP+8
                   [0x000000000003f6fd, 0x000000000003f6ff): DW_OP_breg7 RSP+16
                   [0x000000000003f6ff, 0x000000000003f720): DW_OP_breg6
RBP+16)

0x000001d4:     DW_TAG_formal_parameter
                  DW_AT_name    ("argc")
                  DW_AT_type    (0x0000007b "int")
                  DW_AT_artificial      (0x00)
                  DW_AT_location        (DW_OP_fbreg -32)

0x000001e2:     DW_TAG_formal_parameter
                  DW_AT_name    ("argv")
                  DW_AT_type    (0x00000194 "char**")
                  DW_AT_artificial      (0x00)
                  DW_AT_location        (DW_OP_fbreg -24)

0x000001f0:     NULL

0x000001f1:   NULL

.debug_pubnames contents:
length = 0x00000033 version = 0x0002 unit_offset = 0x00000000 unit_size =
0x000001f2
Offset     Name
0x00000111 "_Dmain"
0x00000156 "_D3barQeFiZv"
0x00000199 "main"
---

`DW_AT_name` should contain the plain variable name, because the mangled name
is for the `DW_AT_linkage_name` attribute.
In `debug_pubnames`, the names should also be plain.

LDC emits correctly these names.

--
Aug 13 2020