From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH] Add some error checking to DWARF assembler
Date: Thu, 18 Mar 2021 09:58:26 -0600 [thread overview]
Message-ID: <20210318155826.3703918-1-tromey@adacore.com> (raw)
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
_op .byte [lindex $line 1]
}
DW_OP_bregx {
+ _check_n $line $opcode 2
_op .uleb128 [lindex $line 1]
_op .sleb128 [lindex $line 2]
}
--
2.26.2
next reply other threads:[~2021-03-18 15:58 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-18 15:58 Tom Tromey [this message]
2021-03-18 17:15 ` Andrew Burgess
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=20210318155826.3703918-1-tromey@adacore.com \
--to=tromey@adacore.com \
--cc=gdb-patches@sourceware.org \
/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).