aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2codeview.cc
diff options
context:
space:
mode:
authorMark Harmstone <mark@harmstone.com>2024-11-02 15:31:12 +0000
committerMark Harmstone <mark@harmstone.com>2024-11-05 00:47:41 +0000
commit6177b45fcdc4273c5e94e8032644ca5807e7e93b (patch)
treef1dc6eca34d466a1a621b37a0685630679463584 /gcc/dwarf2codeview.cc
parentb0f4f556ea9f07d0b6fb6407ab25a193d27c806e (diff)
downloadgcc-6177b45fcdc4273c5e94e8032644ca5807e7e93b.zip
gcc-6177b45fcdc4273c5e94e8032644ca5807e7e93b.tar.gz
gcc-6177b45fcdc4273c5e94e8032644ca5807e7e93b.tar.bz2
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.
Diffstat (limited to 'gcc/dwarf2codeview.cc')
-rw-r--r--gcc/dwarf2codeview.cc27
1 files changed, 24 insertions, 3 deletions
diff --git a/gcc/dwarf2codeview.cc b/gcc/dwarf2codeview.cc
index 876057b..5e8a4ab 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: