dwarf.exp: All numeric attributes require a form
Commit Message
Hi.
As a followup to this patch:
https://sourceware.org/ml/gdb-patches/2015-01/msg00020.html
this patch flags as an error any numeric attribute that doesn't
specify a form. And lo and behold I found more bugs. :-)
Regression tested on amd64-linux.
2015-01-03 Doug Evans <xdje42@gmail.com>
* lib/dwarf.exp (Dwarf): Flag an error if a numeric attribute value
is given without an explicit form.
* gdb.dwarf2/arr-subrange.exp: Specify forms for all numeric
attributes.
* gdb.dwarf/corrupt.exp: Ditto.
* gdb.dwarf2/enum-type.exp: Ditto.
* gdb.trace/entry-values.exp: Ditto.
* gdb.trace/unavailable-dwarf-piece.exp: Ditto.
Comments
On Sat, Jan 3, 2015 at 11:21 AM, Doug Evans <xdje42@gmail.com> wrote:
> Hi.
>
> As a followup to this patch:
> https://sourceware.org/ml/gdb-patches/2015-01/msg00020.html
>
> this patch flags as an error any numeric attribute that doesn't
> specify a form. And lo and behold I found more bugs. :-)
>
> Regression tested on amd64-linux.
>
> 2015-01-03 Doug Evans <xdje42@gmail.com>
>
> * lib/dwarf.exp (Dwarf): Flag an error if a numeric attribute value
> is given without an explicit form.
> * gdb.dwarf2/arr-subrange.exp: Specify forms for all numeric
> attributes.
> * gdb.dwarf/corrupt.exp: Ditto.
> * gdb.dwarf2/enum-type.exp: Ditto.
> * gdb.trace/entry-values.exp: Ditto.
> * gdb.trace/unavailable-dwarf-piece.exp: Ditto.
btw,
I did think of using a more complete test than just "string is integer".
I'm happy with whatever y'all decide.
I decided against trying to guess the form for numeric attributes,
there's just too many to choose from.
On Sat, Jan 3, 2015 at 11:25 AM, Doug Evans <xdje42@gmail.com> wrote:
> On Sat, Jan 3, 2015 at 11:21 AM, Doug Evans <xdje42@gmail.com> wrote:
>> Hi.
>>
>> As a followup to this patch:
>> https://sourceware.org/ml/gdb-patches/2015-01/msg00020.html
>>
>> this patch flags as an error any numeric attribute that doesn't
>> specify a form. And lo and behold I found more bugs. :-)
>>
>> Regression tested on amd64-linux.
>>
>> 2015-01-03 Doug Evans <xdje42@gmail.com>
>>
>> * lib/dwarf.exp (Dwarf): Flag an error if a numeric attribute value
>> is given without an explicit form.
>> * gdb.dwarf2/arr-subrange.exp: Specify forms for all numeric
>> attributes.
>> * gdb.dwarf/corrupt.exp: Ditto.
>> * gdb.dwarf2/enum-type.exp: Ditto.
>> * gdb.trace/entry-values.exp: Ditto.
>> * gdb.trace/unavailable-dwarf-piece.exp: Ditto.
>
> btw,
> I did think of using a more complete test than just "string is integer".
> I'm happy with whatever y'all decide.
>
> I decided against trying to guess the form for numeric attributes,
> there's just too many to choose from.
fyi, I committed this.
@@ -225,7 +225,9 @@ proc function_range { func src } {
# reference. The rest of VALUE is taken to be the name of a label,
# and DW_FORM_ref4 is used. See 'new_label' and 'define_label'.
# * Otherwise, VALUE is taken to be a string and DW_FORM_string is
-# used.
+# used. In order to prevent bugs where a numeric value is given but
+# no form is specified, it is an error if the value looks like a number
+# (using Tcl's "string is integer") and no form is provided.
# More form-guessing functionality may be added.
#
# CHILDREN is just Tcl code that can be used to define child DIEs. It
@@ -614,6 +616,10 @@ namespace eval Dwarf {
if {[llength $attr] > 2} {
set attr_form [lindex $attr 2]
} else {
+ # If the value looks like an integer, a form is required.
+ if [string is integer $attr_value] {
+ error "Integer value requires a form"
+ }
set attr_form [_guess_form $attr_value attr_value]
}
set attr_form [_map_name $attr_form _FORM]
@@ -29,8 +29,8 @@ Dwarf::assemble $asm_file {
{DW_AT_language @DW_LANG_Ada95}
{DW_AT_name foo.adb}
{DW_AT_comp_dir /tmp}
- {DW_AT_low_pc 0x1000}
- {DW_AT_high_pc 0x2000}
+ {DW_AT_low_pc 0x1000 addr}
+ {DW_AT_high_pc 0x2000 addr}
} {
declare_labels boolean_label typedef_label array_label enum_label
@@ -38,25 +38,25 @@ Dwarf::assemble $asm_file {
declare_labels int_label
int_label: base_type {
- {byte_size 4}
+ {byte_size 4 sdata}
{name "int"}
}
enumeration_type {
{name "ENUM"}
- {byte_size 4}
+ {byte_size 4 sdata}
} {
enumerator {
{name "A"}
- {const_value 0}
+ {const_value 0 sdata}
}
enumerator {
{name "B"}
- {const_value 1}
+ {const_value 1 sdata}
{sibling 12345678 DW_FORM_ref4}
} {
base_type {
- {byte_size 1}
+ {byte_size 1 sdata}
{name "char"}
}
}
@@ -50,7 +50,7 @@ Dwarf::assemble $asm_file {
} {
DW_TAG_enumerator {
{DW_AT_name ONE}
- {DW_AT_const_value 1}
+ {DW_AT_const_value 1 DW_FORM_sdata}
}
}
@@ -88,7 +88,7 @@ Dwarf::assemble $asm_file {
}
foo_label: subprogram {
- {decl_file 1}
+ {decl_file 1 sdata}
{MACRO_AT_func { foo ${srcdir}/${subdir}/${srcfile} }}
} {
formal_parameter {
@@ -105,10 +105,10 @@ Dwarf::assemble $asm_file {
subprogram {
{name bar}
- {decl_file 1}
+ {decl_file 1 sdata}
{low_pc $bar_start addr}
{high_pc "$bar_start + $bar_length" addr}
- {GNU_all_call_sites 1}
+ {GNU_all_call_sites 1 sdata}
} {
formal_parameter {
{type :$int_label}
@@ -44,8 +44,8 @@ Dwarf::assemble $asm_file {
struct_s_label: DW_TAG_structure_type {
{name s}
{byte_size 3 DW_FORM_sdata}
- {decl_file 1}
- {decl_line 1}
+ {decl_file 1 DW_FORM_sdata}
+ {decl_line 1 DW_FORM_sdata}
} {
DW_TAG_member {
{name a}
@@ -73,8 +73,8 @@ Dwarf::assemble $asm_file {
struct_t_label: DW_TAG_structure_type {
{name t}
{byte_size 3 DW_FORM_sdata}
- {decl_file 1}
- {decl_line 1}
+ {decl_file 1 DW_FORM_sdata}
+ {decl_line 1 DW_FORM_sdata}
} {
DW_TAG_member {
{name a}
@@ -174,7 +174,7 @@ Dwarf::assemble $asm_file {
DW_TAG_subprogram {
{name foo}
- {decl_file 1}
+ {decl_file 1 sdata}
{low_pc foo addr}
{high_pc foo_end_lbl addr}
} {
@@ -219,7 +219,7 @@ Dwarf::assemble $asm_file {
DW_TAG_subprogram {
{name bar}
- {decl_file 1}
+ {decl_file 1 sdata}
{low_pc bar addr}
{high_pc bar_end_lbl addr}
} {