https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93988

            Bug ID: 93988
           Summary: invalid DWARF emitted for complex integer
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tromey at gcc dot gnu.org
  Target Milestone: ---

Consider this test case:

_Complex int x = 23i;


Compile with -g and examine the resulting DWARF:

 <1><31>: Abbrev Number: 3 (DW_TAG_base_type)
    <32>   DW_AT_byte_size   : 8
    <33>   DW_AT_encoding    : 128      (HP_float80)
    <34>   DW_AT_name        : (indirect string, offset: 0x0): complex int


I was surprised to see that "HP_float80" here, but it turns out
that this is just an artifact of dwarf.def claiming:

/* HP extensions.  */
DW_ATE (DW_ATE_HP_float80, 0x80) /* Floating-point (80 bit).  */


In reality what gcc is doing is just returning:

      /* Dwarf2 doesn't know anything about complex ints, so use
         a user defined type for it.  */
    case COMPLEX_TYPE:
      if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
        encoding = DW_ATE_complex_float;
      else
        encoding = DW_ATE_lo_user;
      break;


There are a couple of ways this could be replaced.  One would be to
give a complex base type its own DW_AT_type, holding the underlying
element type.

Another would be to pick a range, like 0xa0-0xaf, and emit
a value like 0xa0 | DW_ATE_signed.

I see in base_type_die that there are other cases that return
DW_ATE_lo_user.  These are probably also bugs.

Reply via email to