public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH][gdb/testsuite] Don't use default form in Dwarf::_guess_form
@ 2020-10-23 11:46 Tom de Vries
  2020-10-23 15:12 ` Simon Marchi
  0 siblings, 1 reply; 3+ messages in thread
From: Tom de Vries @ 2020-10-23 11:46 UTC (permalink / raw)
  To: gdb-patches

Hi,

The only possible form for a DW_AT_low_pc attribute is DW_FORM_addr.

When specifying in dwarf assembly a low_pc attribute without explicit form:
...
  {low_pc {main_label - 4}}
...
the resulting attribute uses DW_FORM_string, which is misinterpreted by gdb
when reading it as:
...
        cu->base_address = attr->as_address ();
...

Stop using DW_FORM_string as default form.  Instead, use a default form based
on the attribute name, if possible and unambiguous.  Otherwise, error out.

F.i.:
- for DW_AT_low_pc we use DW_FORM_addr.
- For DW_AT_high_pc, we don't specify a default form because it could be
  either address or constant class.
- For DW_AT_name, we use DW_FORM_string.  While we could encode with
  DW_FORM_strp instead, DW_FORM_string is always ok.

Tested on x86_64-linux.

Any comments?

Thanks,
- Tom

[gdb/testsuite] Don't use default form in Dwarf::_guess_form

gdb/testsuite/ChangeLog:

2020-10-23  Tom de Vries  <tdevries@suse.de>

	* lib/dwarf.exp (Dwarf::_guess_form): Return "" by default instead of
	DW_FORM_string.
	(Dwarf::_default_form): New proc.
	(Dwarf::_handle_DW_TAG): Use _default_form.  Error out if no form was
	guessed.

---
 gdb/testsuite/lib/dwarf.exp | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 5c84063105..b6b7844726 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -247,11 +247,13 @@ proc get_func_info { name {options {debug}} } {
 #   and DW_FORM_ref4 is used.  See 'new_label' and 'define_label'.
 # * If VALUE starts with the "%" character, then it is a label
 #   reference too, but DW_FORM_ref_addr is used.
-# * Otherwise, VALUE is taken to be a string and DW_FORM_string is
-#   used.  In order to prevent bugs where a numeric value is given but
+# * 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.
+# * Otherwise, if the attribute name has a default form (f.i. DW_FORM_addr for
+#   DW_AT_low_pc), then that one is used.
+# * Otherwise, an error is reported.  Either specify a form explicitly, or
+#   add a default for the the attribute name in _default_form.
 #
 # CHILDREN is just Tcl code that can be used to define child DIEs.  It
 # is evaluated in the caller's context.
@@ -590,9 +592,25 @@ namespace eval Dwarf {
 	    }
 
 	    default {
+		return ""
+	    }
+	}
+    }
+
+    proc _default_form { attr } {
+	switch -exact -- $attr {
+	    DW_AT_low_pc  {
+		return DW_FORM_addr
+	    }
+	    DW_AT_producer -
+	    DW_AT_comp_dir -
+	    DW_AT_linkage_name -
+	    DW_AT_MIPS_linkage_name -
+	    DW_AT_name {
 		return DW_FORM_string
 	    }
 	}
+	return ""
     }
 
     # Map NAME to its canonical form.
@@ -697,6 +715,12 @@ namespace eval Dwarf {
 			error "Integer value requires a form"
 		    }
 		    set attr_form [_guess_form $attr_value attr_value]
+		    if { $attr_form eq "" } {
+			set attr_form [_default_form $attr_name]
+		    }
+		    if { $attr_form eq "" } {
+			error "No form for $attr_name $attr_value"
+		    }
 		}
 		set attr_form [_map_name $attr_form _FORM]
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH][gdb/testsuite] Don't use default form in Dwarf::_guess_form
  2020-10-23 11:46 [PATCH][gdb/testsuite] Don't use default form in Dwarf::_guess_form Tom de Vries
@ 2020-10-23 15:12 ` Simon Marchi
  2020-10-23 16:55   ` Tom de Vries
  0 siblings, 1 reply; 3+ messages in thread
From: Simon Marchi @ 2020-10-23 15:12 UTC (permalink / raw)
  To: Tom de Vries, gdb-patches

On 2020-10-23 7:46 a.m., Tom de Vries wrote:
> Hi,
>
> The only possible form for a DW_AT_low_pc attribute is DW_FORM_addr.
>
> When specifying in dwarf assembly a low_pc attribute without explicit form:
> ...
>   {low_pc {main_label - 4}}
> ...
> the resulting attribute uses DW_FORM_string, which is misinterpreted by gdb
> when reading it as:
> ...
>         cu->base_address = attr->as_address ();
> ...
>
> Stop using DW_FORM_string as default form.  Instead, use a default form based
> on the attribute name, if possible and unambiguous.  Otherwise, error out.
>
> F.i.:
> - for DW_AT_low_pc we use DW_FORM_addr.
> - For DW_AT_high_pc, we don't specify a default form because it could be
>   either address or constant class.
> - For DW_AT_name, we use DW_FORM_string.  While we could encode with
>   DW_FORM_strp instead, DW_FORM_string is always ok.
>
> Tested on x86_64-linux.
>
> Any comments?
>
> Thanks,
> - Tom

I like it, I like specifying explicit forms in any case.

I think it makes the "If the value looks like an integer, a form is
required." redundant though.  You could remove it, in which case
specifying an integer attribute without a form would fall in the "No
form for..." error branch.

Simon

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH][gdb/testsuite] Don't use default form in Dwarf::_guess_form
  2020-10-23 15:12 ` Simon Marchi
@ 2020-10-23 16:55   ` Tom de Vries
  0 siblings, 0 replies; 3+ messages in thread
From: Tom de Vries @ 2020-10-23 16:55 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches

On 10/23/20 5:12 PM, Simon Marchi wrote:
> On 2020-10-23 7:46 a.m., Tom de Vries wrote:
>> Hi,
>>
>> The only possible form for a DW_AT_low_pc attribute is DW_FORM_addr.
>>
>> When specifying in dwarf assembly a low_pc attribute without explicit form:
>> ...
>>   {low_pc {main_label - 4}}
>> ...
>> the resulting attribute uses DW_FORM_string, which is misinterpreted by gdb
>> when reading it as:
>> ...
>>         cu->base_address = attr->as_address ();
>> ...
>>
>> Stop using DW_FORM_string as default form.  Instead, use a default form based
>> on the attribute name, if possible and unambiguous.  Otherwise, error out.
>>
>> F.i.:
>> - for DW_AT_low_pc we use DW_FORM_addr.
>> - For DW_AT_high_pc, we don't specify a default form because it could be
>>   either address or constant class.
>> - For DW_AT_name, we use DW_FORM_string.  While we could encode with
>>   DW_FORM_strp instead, DW_FORM_string is always ok.
>>
>> Tested on x86_64-linux.
>>
>> Any comments?
>>
>> Thanks,
>> - Tom
> 
> I like it, I like specifying explicit forms in any case.
> 
> I think it makes the "If the value looks like an integer, a form is
> required." redundant though.  You could remove it, in which case
> specifying an integer attribute without a form would fall in the "No
> form for..." error branch.

Done, and committed.

Thanks,
- Tom

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-23 16:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-23 11:46 [PATCH][gdb/testsuite] Don't use default form in Dwarf::_guess_form Tom de Vries
2020-10-23 15:12 ` Simon Marchi
2020-10-23 16:55   ` Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).