diff mbox series

[2/2] Output CodeView type information for rvalue references

Message ID 20240720193120.19722-2-mark@harmstone.com
State New
Headers show
Series [1/2] Output CodeView type information for references | expand

Commit Message

Mark Harmstone July 20, 2024, 7:31 p.m. UTC
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.
---
 gcc/dwarf2codeview.cc | 15 ++++++++++-----
 gcc/dwarf2codeview.h  |  1 +
 2 files changed, 11 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/gcc/dwarf2codeview.cc b/gcc/dwarf2codeview.cc
index 23175204acd..9f446cb9cbb 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