Fix crash with DW_FORM_implicit_const
Jakub pointed out that using DW_FORM_implicit_const with DW_AT_bit_size would cause gdb to crash. This happened because DW_FORM_implicit_const is not an "unsigned" form, causing as_unsigned to assert. This patch fixes the problem. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30651 Approved-By: Andrew Burgess <aburgess@redhat.com>
This commit is contained in:
+17
-12
@@ -15420,20 +15420,25 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||
if (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_INT)
|
||||
{
|
||||
attr = dwarf2_attr (die, DW_AT_bit_size, cu);
|
||||
if (attr != nullptr && attr->as_unsigned () <= 8 * type->length ())
|
||||
if (attr != nullptr && attr->form_is_constant ())
|
||||
{
|
||||
unsigned real_bit_size = attr->as_unsigned ();
|
||||
attr = dwarf2_attr (die, DW_AT_data_bit_offset, cu);
|
||||
/* Only use the attributes if they make sense together. */
|
||||
if (attr == nullptr
|
||||
|| (attr->as_unsigned () + real_bit_size
|
||||
<= 8 * type->length ()))
|
||||
unsigned real_bit_size = attr->constant_value (0);
|
||||
if (real_bit_size >= 0 && real_bit_size <= 8 * type->length ())
|
||||
{
|
||||
TYPE_MAIN_TYPE (type)->type_specific.int_stuff.bit_size
|
||||
= real_bit_size;
|
||||
if (attr != nullptr)
|
||||
TYPE_MAIN_TYPE (type)->type_specific.int_stuff.bit_offset
|
||||
= attr->as_unsigned ();
|
||||
attr = dwarf2_attr (die, DW_AT_data_bit_offset, cu);
|
||||
/* Only use the attributes if they make sense together. */
|
||||
if (attr == nullptr
|
||||
|| (attr->form_is_constant ()
|
||||
&& attr->constant_value (0) >= 0
|
||||
&& (attr->constant_value (0) + real_bit_size
|
||||
<= 8 * type->length ())))
|
||||
{
|
||||
TYPE_MAIN_TYPE (type)->type_specific.int_stuff.bit_size
|
||||
= real_bit_size;
|
||||
if (attr != nullptr)
|
||||
TYPE_MAIN_TYPE (type)->type_specific.int_stuff.bit_offset
|
||||
= attr->constant_value (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ Dwarf::assemble ${asm_file} {
|
||||
{DW_AT_endianity @DW_END_little}
|
||||
{DW_AT_name "i7"}
|
||||
{DW_AT_byte_size 2 DW_FORM_udata}
|
||||
{DW_AT_bit_size 7 DW_FORM_udata}
|
||||
{DW_AT_bit_size 7 DW_FORM_implicit_const}
|
||||
}
|
||||
|
||||
DW_TAG_variable {
|
||||
|
||||
@@ -693,6 +693,7 @@ namespace eval Dwarf {
|
||||
_op .ascii [_quote $value]
|
||||
}
|
||||
|
||||
DW_FORM_implicit_const -
|
||||
DW_FORM_flag_present {
|
||||
# We don't need to emit anything.
|
||||
}
|
||||
@@ -917,6 +918,9 @@ namespace eval Dwarf {
|
||||
}
|
||||
_op .uleb128 $_constants($attr_name) $attr_name
|
||||
_op .uleb128 $_constants($attr_form) $attr_form_comment
|
||||
if {$attr_form eq "DW_FORM_implicit_const"} {
|
||||
_op .sleb128 $attr_value "the constant"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user