aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2codeview.cc
diff options
context:
space:
mode:
authorMark Harmstone <mark@harmstone.com>2024-08-04 23:26:53 +0100
committerMark Harmstone <mark@harmstone.com>2024-08-05 18:24:26 +0100
commitb0e2ccef0b3c469d5d242766328a24a94990f83b (patch)
tree3429e4298fd2c65a9111c86170f27504c8c75d6b /gcc/dwarf2codeview.cc
parent5aa90b9db1cc27beef03411de05b87a257540d1c (diff)
downloadgcc-b0e2ccef0b3c469d5d242766328a24a94990f83b.zip
gcc-b0e2ccef0b3c469d5d242766328a24a94990f83b.tar.gz
gcc-b0e2ccef0b3c469d5d242766328a24a94990f83b.tar.bz2
Fix handling of const or volatile void pointers in CodeView
DWARF represents voids in DW_TAG_const_type and DW_TAG_volatile_type DIEs by the absence of a DW_AT_type attribute, which we weren't handling correctly. gcc/ * dwarf2codeview.cc (get_type_num_const_type): Handle missing DW_AT_type attribute. (get_type_num_volatile_type): Likewise.
Diffstat (limited to 'gcc/dwarf2codeview.cc')
-rw-r--r--gcc/dwarf2codeview.cc36
1 files changed, 24 insertions, 12 deletions
diff --git a/gcc/dwarf2codeview.cc b/gcc/dwarf2codeview.cc
index 470cbae..f710702 100644
--- a/gcc/dwarf2codeview.cc
+++ b/gcc/dwarf2codeview.cc
@@ -2344,23 +2344,26 @@ get_type_num_const_type (dw_die_ref type, bool in_struct)
bool is_volatile = false;
base_type = get_AT_ref (type, DW_AT_type);
- if (!base_type)
- return 0;
/* Handle case when this is a const volatile type - we only need one
LF_MODIFIER for this. */
- if (dw_get_die_tag (base_type) == DW_TAG_volatile_type)
+ if (base_type && dw_get_die_tag (base_type) == DW_TAG_volatile_type)
{
is_volatile = true;
base_type = get_AT_ref (base_type, DW_AT_type);
- if (!base_type)
- return 0;
}
- base_type_num = get_type_num (base_type, in_struct, false);
- if (base_type_num == 0)
- return 0;
+ if (!base_type)
+ {
+ base_type_num = T_VOID;
+ }
+ else
+ {
+ base_type_num = get_type_num (base_type, in_struct, false);
+ if (base_type_num == 0)
+ return 0;
+ }
ct = (codeview_custom_type *) xmalloc (sizeof (codeview_custom_type));
@@ -2383,13 +2386,22 @@ get_type_num_const_type (dw_die_ref type, bool in_struct)
static uint32_t
get_type_num_volatile_type (dw_die_ref type, bool in_struct)
{
+ dw_die_ref base_type;
uint32_t base_type_num;
codeview_custom_type *ct;
- base_type_num = get_type_num (get_AT_ref (type, DW_AT_type), in_struct,
- false);
- if (base_type_num == 0)
- return 0;
+ base_type = get_AT_ref (type, DW_AT_type);
+
+ if (base_type)
+ {
+ base_type_num = get_type_num (base_type, in_struct, false);
+ if (base_type_num == 0)
+ return 0;
+ }
+ else
+ {
+ base_type_num = T_VOID;
+ }
ct = (codeview_custom_type *) xmalloc (sizeof (codeview_custom_type));