From: Mark Harmstone Date: Sat, 20 Jul 2024 19:18:14 +0000 (+0100) Subject: Output CodeView type information for rvalue references X-Git-Tag: basepoints/gcc-16~7315 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1ca7a12807a7fa0d9c27a5c8c45fa99ac9e7e027;p=thirdparty%2Fgcc.git Output CodeView type information for rvalue references Translates DW_TAG_rvalue_reference_type DIEs into LF_POINTER types. gcc/ * dwarf2codeview.cc (get_type_num_reference_type): Handle rvalue refs. (get_type_num_array_type): Add DW_TAG_rvalue_reference_type to switch. (get_type_num): Handle DW_TAG_rvalue_reference_type DIEs. * dwarf2codeview.h (CV_PTR_MODE_RVREF): Define. --- diff --git a/gcc/dwarf2codeview.cc b/gcc/dwarf2codeview.cc index 23175204acd..b16c6960f63 100644 --- a/gcc/dwarf2codeview.cc +++ b/gcc/dwarf2codeview.cc @@ -2293,11 +2293,11 @@ get_type_num_pointer_type (dw_die_ref type, bool in_struct) return ct->num; } -/* Process a DW_TAG_reference_type DIE, add a new LF_POINTER type, and return - its number. */ +/* Process a DW_TAG_reference_type or DW_TAG_rvalue_reference_type DIE, add a + new LF_POINTER type, and return its number. */ static uint32_t -get_type_num_reference_type (dw_die_ref type, bool in_struct) +get_type_num_reference_type (dw_die_ref type, bool in_struct, bool rvref) { uint32_t base_type_num, byte_size; dw_die_ref base_type; @@ -2318,7 +2318,7 @@ get_type_num_reference_type (dw_die_ref type, bool in_struct) ct->next = NULL; ct->kind = LF_POINTER; ct->lf_pointer.base_type = base_type_num; - ct->lf_pointer.attributes = CV_PTR_MODE_LVREF; + ct->lf_pointer.attributes = rvref ? CV_PTR_MODE_RVREF : CV_PTR_MODE_LVREF; if (byte_size == 4) ct->lf_pointer.attributes |= CV_PTR_NEAR32; @@ -3064,6 +3064,7 @@ get_type_num_array_type (dw_die_ref type, bool in_struct) case DW_TAG_union_type: case DW_TAG_pointer_type: case DW_TAG_reference_type: + case DW_TAG_rvalue_reference_type: size = get_AT_unsigned (t, DW_AT_byte_size); break; @@ -3192,7 +3193,11 @@ get_type_num (dw_die_ref type, bool in_struct, bool no_fwd_ref) break; case DW_TAG_reference_type: - num = get_type_num_reference_type (type, in_struct); + num = get_type_num_reference_type (type, in_struct, false); + break; + + case DW_TAG_rvalue_reference_type: + num = get_type_num_reference_type (type, in_struct, true); break; case DW_TAG_const_type: diff --git a/gcc/dwarf2codeview.h b/gcc/dwarf2codeview.h index 7d4e3ab1db4..8ede1b29529 100644 --- a/gcc/dwarf2codeview.h +++ b/gcc/dwarf2codeview.h @@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see #define CV_PTR_NEAR32 0x0a #define CV_PTR_64 0x0c #define CV_PTR_MODE_LVREF 0x20 +#define CV_PTR_MODE_RVREF 0x80 /* LF_MODIFIER values. */ #define MOD_const 0x1