Skip to content

Commit

Permalink
Handle T_HRESULT types in CodeView records
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
maharmstone committed Nov 5, 2024
1 parent b0f4f55 commit 6177b45
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
27 changes: 24 additions & 3 deletions gcc/dwarf2codeview.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions gcc/dwarf2codeview.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 6177b45

Please sign in to comment.