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

            Bug ID: 92418
           Summary: g++ does not produce the DW_AT_calling_convention
                    attribute for types
           Product: gcc
           Version: 9.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tankut.baris.aktemur at intel dot com
  Target Milestone: ---

DWARF5 introduced the DW_AT_calling_convention attribute for *types*.  Below is
the related section from the DWARF5 spec:

  A structure type, union type or class type entry may have a 
  DW_AT_calling_convention attribute, whose value indicates whether a value 
  of the type is passed by reference or passed by value. The set of calling 
  convention codes for use with types is given in Table 5.5 following.

  Table 5.5: Calling convention codes for types
    DW_CC_normal
    DW_CC_pass_by_value
    DW_CC_pass_by_reference

GCC does not emit the DW_AT_calling_convention attribute for types.  For
example, given the following C++ program, the DIE for the ByVal class could
include the 'DW_CC_pass_by_value' value in a DW_AT_calling_convention
attribute, whereas the type information for the ByRef class could include
'DW_CC_pass_by_reference'.

Tested with GCC 9.2.1.

~~~
class ByVal {
public:
  ByVal () { x = 2; }

  int x;
};

class ByRef {
public:
  ByRef () { x = 2; }

  ByRef (const ByRef &rhs) { x = 3; }

  int x;
};

int
cbv1 (ByVal arg)
{
  return arg.x;
}

int
cbv2 (ByRef arg)
{
  return arg.x;
}

int
main ()
{
  ByVal val;
  ByRef ref;

  return cbv1 (val) + cbv2 (ref);
}
~~~

Reply via email to