public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <andrew.burgess@embecosm.com>
To: Tom Tromey <tromey@adacore.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] Add some error checking to DWARF assembler
Date: Thu, 18 Mar 2021 17:15:55 +0000	[thread overview]
Message-ID: <20210318171555.GF5520@embecosm.com> (raw)
In-Reply-To: <20210318155826.3703918-1-tromey@adacore.com>

* Tom Tromey <tromey@adacore.com> [2021-03-18 09:58:26 -0600]:

> I had written a DWARF location expression like
> 
>     DW_OP_const1u
>     DW_OP_stack_value
> 
> ... and was surprised to see that the DW_OP_stack_value didn't appear
> in the "readelf" output.
> 
> The problem here is that DW_OP_const1u requires an operand, but
> neither the DWARF assembler nor gas diagnosed this problem.
> 
> This patch adds some checking to Dwarf::_location to try to avoid this
> in the future.  I removed some existing checks in the name of
> normalization; while the new messages are a bit worse (being
> one-size-fits-all), I think this doesn't matter hugely, since this
> should only be seen for test suite bugs.
> 
> gdb/testsuite/ChangeLog
> 2021-03-18  Tom Tromey  <tromey@adacore.com>
> 
> 	* lib/dwarf.exp (Dwarf::_check_n): New proc.
> 	(Dwarf::_location): Use it.
> ---
>  gdb/testsuite/ChangeLog     |  5 +++++
>  gdb/testsuite/lib/dwarf.exp | 33 +++++++++++++++++++++++----------
>  2 files changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
> index f8fbd381810..64b9e263f10 100644
> --- a/gdb/testsuite/lib/dwarf.exp
> +++ b/gdb/testsuite/lib/dwarf.exp
> @@ -890,6 +890,13 @@ namespace eval Dwarf {
>  	}
>      }
>  
> +    # Require N arguments for the opcode.
> +    proc _check_n {line op n} {
> +	if {[llength $line] != $n + 1} {
> +	    error "$op requires $n arguments"
> +	}
> +    }
> +
>      # This is a miniature assembler for location expressions.  It is
>      # suitable for use in the attributes to a DIE.  Its output is
>      # prefixed with "=" to make it automatically use DW_FORM_block.
> @@ -926,56 +933,68 @@ namespace eval Dwarf {
>  
>  	    switch -exact -- $opcode {
>  		DW_OP_addr {
> +		    _check_n $line $opcode 1
>  		    _op .${addr_size}byte [lindex $line 1]
>  		}
>  
>  		DW_OP_regx {
> +		    _check_n $line $opcode 1
>  		    _op .uleb128 [lindex $line 1]
>  		}
>  
>  		DW_OP_pick -
>  		DW_OP_const1u -
>  		DW_OP_const1s {
> +		    _check_n $line $opcode 1
>  		    _op .byte [lindex $line 1]
>  		}
>  
>  		DW_OP_const2u -
>  		DW_OP_const2s {
> +		    _check_n $line $opcode 1
>  		    _op .2byte [lindex $line 1]
>  		}
>  
>  		DW_OP_const4u -
>  		DW_OP_const4s {
> +		    _check_n $line $opcode 1
>  		    _op .4byte [lindex $line 1]
>  		}
>  
>  		DW_OP_const8u -
>  		DW_OP_const8s {
> +		    _check_n $line $opcode 1
>  		    _op .8byte [lindex $line 1]
>  		}
>  
>  		DW_OP_constu {
> +		    _check_n $line $opcode 1
>  		    _op .uleb128 [lindex $line 1]
>  		}
>  		DW_OP_consts {
> +		    _check_n $line $opcode 1
>  		    _op .sleb128 [lindex $line 1]
>  		}
>  
>  		DW_OP_plus_uconst {
> +		    _check_n $line $opcode 1
>  		    _op .uleb128 [lindex $line 1]
>  		}
>  
>  		DW_OP_piece {
> +		    _check_n $line $opcode 1
>  		    _op .uleb128 [lindex $line 1]
>  		}
>  
>  		DW_OP_bit_piece {
> +		    _check_n $line $opcode 2
>  		    _op .uleb128 [lindex $line 1]
>  		    _op .uleb128 [lindex $line 2]
>  		}
>  
>  		DW_OP_skip -
>  		DW_OP_bra {
> +		    _check_n $line $opcode 1
>  		    _op .2byte [lindex $line 1]
>  		}
>  
> @@ -1000,9 +1019,7 @@ namespace eval Dwarf {
>  
>  		DW_OP_implicit_pointer -
>  		DW_OP_GNU_implicit_pointer {
> -		    if {[llength $line] != 3} {
> -			error "usage: $opcode LABEL OFFSET"
> -		    }
> +		    _check_n $line $opcode 2
>  
>  		    # Here label is a section offset.
>  		    set label [lindex $line 1]
> @@ -1015,9 +1032,7 @@ namespace eval Dwarf {
>  		}
>  
>  		DW_OP_GNU_variable_value {
> -		    if {[llength $line] != 2} {
> -			error "usage: $opcode LABEL"
> -		    }
> +		    _check_n $line $opcode 1
>  
>  		    # Here label is a section offset.
>  		    set label [lindex $line 1]
> @@ -1029,14 +1044,12 @@ namespace eval Dwarf {
>  		}
>  
>  		DW_OP_deref_size {
> -		    if {[llength $line] != 2} {
> -			error "usage: DW_OP_deref_size SIZE"
> -		    }
> -
> +		    _check_n $line $opcode 1

Maybe I'm over thinking this, but you could change this to:

	_check_n $line $opcode { SIZE }

And for DW_OP_implicit_pointer above you would do:

        _check_n $line $opcode { LABEL OFFSET }

Then in _check_n you can use the length of the final list to validate
the argument count, and if its wrong you can still print the helpful
text....

Just a thought.

Either way, more error checking is good.

Thanks,
Andrew

  reply	other threads:[~2021-03-18 17:15 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 15:58 Tom Tromey
2021-03-18 17:15 ` Andrew Burgess [this message]
2021-03-18 18:22   ` Tom Tromey
2021-03-18 21:15     ` Tom Tromey
2021-03-31 15:24       ` Tom Tromey
2021-03-31 20:07         ` Andrew Burgess

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210318171555.GF5520@embecosm.com \
    --to=andrew.burgess@embecosm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@adacore.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).