[3/3] Handle T_HRESULT types in CodeView records

Message ID 20241102223625.22493-3-mark@harmstone.com
State Committed
Commit 6177b45fcdc4273c5e94e8032644ca5807e7e93b
Headers
Series [1/3] Write LF_BCLASS records in CodeView struct definitions |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed

Commit Message

Mark Harmstone Nov. 2, 2024, 10:36 p.m. UTC
  Follow MSVC in having a special type value, T_HRESULT, for (signed)
longs that have been typedef'd with the name "HRESULT". This is so that
the debugger can display user-friendly constant names when debugging COM
code.

gcc/
	* dwarf2codeview.cc (get_type_num_typedef): New function.
	(get_type_num): Call get_type_num_typedef.
	* dwarf2codeview.h (T_HRESULT): Define.
---
 gcc/dwarf2codeview.cc | 27 ++++++++++++++++++++++++---
 gcc/dwarf2codeview.h  |  1 +
 2 files changed, 25 insertions(+), 3 deletions(-)
  

Patch

diff --git a/gcc/dwarf2codeview.cc b/gcc/dwarf2codeview.cc
index 876057b5a8c..5e8a4ab39e7 100644
--- a/gcc/dwarf2codeview.cc
+++ b/gcc/dwarf2codeview.cc
@@ -6220,6 +6220,29 @@  get_type_num_ptr_to_member_type (dw_die_ref type, bool in_struct)
   return ct->num;
 }
 
+/* Return the type number that corresponds to a DW_TAG_typedef DIE: either the
+   type number of the base type, or follow MSVC in having a special value
+   for the HRESULT used by COM.  */
+
+static uint32_t
+get_type_num_typedef (dw_die_ref type, bool in_struct)
+{
+  uint32_t num;
+
+  num = get_type_num (get_AT_ref (type, DW_AT_type), in_struct, false);
+
+  if (num == T_LONG)
+    {
+      const char *name = get_AT_string (type, DW_AT_name);
+
+      /* longs typedef'd as "HRESULT" get their own type */
+      if (name && !strcmp (name, "HRESULT"))
+	num = T_HRESULT;
+    }
+
+  return num;
+}
+
 /* Process a DIE representing a type definition, add a CodeView type if
    necessary, and return its number.  If it's something we can't handle, return
    0.  We keep a hash table so that we're not adding the same type multiple
@@ -6254,9 +6277,7 @@  get_type_num (dw_die_ref type, bool in_struct, bool no_fwd_ref)
       break;
 
     case DW_TAG_typedef:
-      /* FIXME - signed longs typedef'd as "HRESULT" should get their
-		 own type (T_HRESULT) */
-      num = get_type_num (get_AT_ref (type, DW_AT_type), in_struct, false);
+      num = get_type_num_typedef (type, in_struct);
       break;
 
     case DW_TAG_pointer_type:
diff --git a/gcc/dwarf2codeview.h b/gcc/dwarf2codeview.h
index c895ef3e04c..52ffc6cfb99 100644
--- a/gcc/dwarf2codeview.h
+++ b/gcc/dwarf2codeview.h
@@ -26,6 +26,7 @@  along with GCC; see the file COPYING3.  If not see
 /* Constants for in-built types.  */
 
 #define T_VOID			0x0003
+#define T_HRESULT		0x0008
 #define T_CHAR			0x0010
 #define T_SHORT			0x0011
 #define T_LONG			0x0012