From 6177b45fcdc4273c5e94e8032644ca5807e7e93b Mon Sep 17 00:00:00 2001 From: Mark Harmstone Date: Sat, 2 Nov 2024 15:31:12 +0000 Subject: [PATCH] Handle T_HRESULT types in CodeView records 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(-) 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