[PATCH][gdb/testsuite] Support .debug_aranges in dwarf assembly
Simon Marchi
simon.marchi@polymtl.ca
Sat Aug 28 21:28:02 GMT 2021
On 2021-08-28 4:29 p.m., Simon Marchi via Gdb-patches wrote:
>
>
> On 2021-08-28 11:31 a.m., Tom de Vries wrote:
>> On 8/27/21 5:09 PM, Simon Marchi via Gdb-patches wrote:
>>>
>>>
>>> On 2021-08-27 9:35 a.m., Tom Tromey wrote:
>>>>>>>>> "Tom" == Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> writes:
>>>>
>>>> Tom> + # arange [-c <comment>] [<segment selector>] <start> <length>
>>>> Tom> + # -- adds an address range.
>>>>
>>>> I wonder if there's a way to make this more tcl-ish, say by rearranging
>>>> the order of arguments so that things can be defaulted. I think the
>>>> "args"-parsing style should normally be a last resort.
>>>
>>> I personally don't like this style
>>>
>>> proc arange { arange_start arange_length {comment ""} {seg_sel ""} }
>>>
>>> ... because if you want to specify the last parameter, you need to give
>>> all the other optional ones before.
>>>
>>> I also agree that just having:
>>>
>>> proc arange { args }
>>>
>>> is not great, since we have to do the argument parsing by hand, and it's
>>> a bit opaque what the proc accepts. Could we consistently use the
>>> "options" pattern, such as the one used by aranges and cu?
>>>
>>> proc arange { options arange_start arange_length }
>>>
>>> The callers would look like:
>>>
>>> arange {} $start $length
>>> arange {
>>> comment $comment
>>> seg_sel $seg_sel
>>> } $start $length
>>>
>>> I think that's a good compromise. I could re-do the rnglists procs this
>>> way, if you'd like.
>>>
>>
>> This patch implements that approach, using a new proc parse_options
>> similar to parse_args.
>>
>> WDYT?
>
> Here:
>
> @@ -2354,9 +2350,9 @@ namespace eval Dwarf {
> # Terminator tuple.
> set comment "Terminator"
> if { $_seg_size == 0 } {
> - arange 0 0 $comment
> + arange [list comment $comment] 0 0
> } else {
> - arange 0 0 $comment 0
> + arange [list comment $comment seg_sel 0] 0 0
> }
>
>
> Could we apply some magic so that we are able to use { } instead of
> list?
>
> arange {
> comment $comment
> set_seg 0
> } { ... }
>
> ... instead of having to use [list ...]? I suppose doing an "eval" or
> something of the option value in the caller's context?
Here's a patch that does it using subst (as well as changes rnglists and
loclists to use parse_options, but that should be in a separate patch):
>From 3e841bf9351200980f004cdce40db7349095e558 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@polymtl.ca>
Date: Sat, 28 Aug 2021 16:53:04 -0400
Subject: [PATCH] hey
Change-Id: I63e60d17ae16a020ce4d6de44baf3d152ea42a1a
---
gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp | 2 +-
.../gdb.dwarf2/loclists-multiple-cus.exp | 2 +-
.../gdb.dwarf2/loclists-sec-offset.exp | 2 +-
.../gdb.dwarf2/loclists-start-end.exp | 2 +-
.../gdb.dwarf2/rnglists-multiple-cus.exp | 2 +-
.../gdb.dwarf2/rnglists-sec-offset.exp | 2 +-
gdb/testsuite/lib/dwarf.exp | 38 ++++++-------------
gdb/testsuite/lib/gdb.exp | 7 ++--
8 files changed, 22 insertions(+), 35 deletions(-)
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp
index e43f59ea1ad1..834e204237a7 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp
@@ -81,7 +81,7 @@ foreach_with_prefix ranges_sect {ranges rnglists} {
}
}
- rnglists {
+ rnglists {} {
table {
rnglists_label: list_ {
start_end 0 1
diff --git a/gdb/testsuite/gdb.dwarf2/loclists-multiple-cus.exp b/gdb/testsuite/gdb.dwarf2/loclists-multiple-cus.exp
index 6b4f5c8cbb87..4c09b779f8e9 100644
--- a/gdb/testsuite/gdb.dwarf2/loclists-multiple-cus.exp
+++ b/gdb/testsuite/gdb.dwarf2/loclists-multiple-cus.exp
@@ -87,7 +87,7 @@ foreach_with_prefix is_64 {false true} {
}
}
- loclists -is-64 $is_64 {
+ loclists { is-64 $is_64 } {
# This table is unused, but exists so that the used table is not at
# the beginning of the section.
table {
diff --git a/gdb/testsuite/gdb.dwarf2/loclists-sec-offset.exp b/gdb/testsuite/gdb.dwarf2/loclists-sec-offset.exp
index 573324af3d17..a34798c60a5f 100644
--- a/gdb/testsuite/gdb.dwarf2/loclists-sec-offset.exp
+++ b/gdb/testsuite/gdb.dwarf2/loclists-sec-offset.exp
@@ -165,7 +165,7 @@ foreach_with_prefix is_64 {false true} {
}
}
- loclists -is-64 $is_64 {
+ loclists { is-64 $is_64 } {
# The lists in this table are accessed by direct offset
# (DW_FORM_sec_offset).
table {
diff --git a/gdb/testsuite/gdb.dwarf2/loclists-start-end.exp b/gdb/testsuite/gdb.dwarf2/loclists-start-end.exp
index bce3fb239791..b28262a2c7d5 100644
--- a/gdb/testsuite/gdb.dwarf2/loclists-start-end.exp
+++ b/gdb/testsuite/gdb.dwarf2/loclists-start-end.exp
@@ -78,7 +78,7 @@ foreach_with_prefix is_64 {false true} {
}
}
- loclists -is-64 $is_64 {
+ loclists { is-64 $is_64 } {
# This table is unused, but exists so that the used table is not at
# the beginning of the section.
table {
diff --git a/gdb/testsuite/gdb.dwarf2/rnglists-multiple-cus.exp b/gdb/testsuite/gdb.dwarf2/rnglists-multiple-cus.exp
index e09cd4e8fe73..f5d6c82c9084 100644
--- a/gdb/testsuite/gdb.dwarf2/rnglists-multiple-cus.exp
+++ b/gdb/testsuite/gdb.dwarf2/rnglists-multiple-cus.exp
@@ -63,7 +63,7 @@ foreach_with_prefix is_64 {false true} {
}
}
- rnglists -is-64 $is_64 {
+ rnglists { is-64 $is_64 } {
# This table is unused, but exists so that the used table is not at
# the beginning of the section.
table {
diff --git a/gdb/testsuite/gdb.dwarf2/rnglists-sec-offset.exp b/gdb/testsuite/gdb.dwarf2/rnglists-sec-offset.exp
index 0733e90abc74..0f9490b05054 100644
--- a/gdb/testsuite/gdb.dwarf2/rnglists-sec-offset.exp
+++ b/gdb/testsuite/gdb.dwarf2/rnglists-sec-offset.exp
@@ -90,7 +90,7 @@ foreach_with_prefix is_64 {false true} {
}
}
- rnglists -is-64 $is_64 {
+ rnglists { is-64 $is_64 } {
# The lists in this table are accessed by direct offset
# (DW_FORM_sec_offset).
table {
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 48fcbb0af780..dafb4107e3e0 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -1542,27 +1542,20 @@ namespace eval Dwarf {
#
# The target address size is based on the current target's address size.
#
- # There is one mandatory positional argument, BODY, which must be Tcl code
- # that emits the content of the section. It is evaluated in the caller's
- # context.
+ # BODY must be Tcl code that emits the content of the section. It is
+ # evaluated in the caller's context.
#
# The following option can be used:
#
- # - -is-64 true|false: Whether to use 64-bit DWARF instead of 32-bit DWARF.
- # The default is 32-bit.
+ # - is-64 true|false: Whether to use 64-bit DWARF instead of 32-bit DWARF.
+ # The default is 32-bit.
- proc rnglists { args } {
+ proc rnglists { options body } {
variable _debug_rnglists_addr_size
variable _debug_rnglists_offset_size
variable _debug_rnglists_is_64_dwarf
- parse_args {{"is-64" "false"}}
-
- if { [llength $args] != 1 } {
- error "rnglists proc expects one positional argument (body)"
- }
-
- lassign $args body
+ parse_options {{"is-64" "false"}}
if [is_64_target] {
set _debug_rnglists_addr_size 8
@@ -1729,27 +1722,20 @@ namespace eval Dwarf {
#
# The target address size is based on the current target's address size.
#
- # There is one mandatory positional argument, BODY, which must be Tcl code
- # that emits the content of the section. It is evaluated in the caller's
- # context.
+ # BODY must be Tcl code that emits the content of the section. It is
+ # evaluated in the caller's context.
#
# The following option can be used:
#
- # - -is-64 true|false: Whether to use 64-bit DWARF instead of 32-bit DWARF.
- # The default is 32-bit.
+ # - is-64 true|false: Whether to use 64-bit DWARF instead of 32-bit DWARF.
+ # The default is 32-bit.
- proc loclists { args } {
+ proc loclists { options body } {
variable _debug_loclists_addr_size
variable _debug_loclists_offset_size
variable _debug_loclists_is_64_dwarf
- parse_args {{"is-64" "false"}}
-
- if { [llength $args] != 1 } {
- error "loclists proc expects one positional argument (body)"
- }
-
- lassign $args body
+ parse_options {{"is-64" "false"}}
if [is_64_target] {
set _debug_loclists_addr_size 8
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 4ea11d4fd3f6..3be0948d562b 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -7319,7 +7319,7 @@ proc using_fission { } {
# foo (=ABC), bar (=1), baz (=DEF), and qux (=0)
# args will be the list {peanut butter}
-proc parse_list { level listname argset prefix } {
+proc parse_list { level listname argset prefix eval } {
upvar $level $listname args
foreach argument $argset {
@@ -7346,6 +7346,7 @@ proc parse_list { level listname argset prefix } {
set result [lsearch -exact $args "$prefix[lindex $arg 0]"]
if {$result != -1} then {
set value [lindex $args [expr $result+1]]
+ set value [uplevel [expr $level + 1] [list subst $value]]
set args [lreplace $args $result [expr $result+1]]
} else {
set value [lindex $argument 1]
@@ -7364,14 +7365,14 @@ proc parse_list { level listname argset prefix } {
# valid options described by ARGSET.
proc parse_args { argset } {
- parse_list 2 args $argset "-"
+ parse_list 2 args $argset "-" false
}
# Process the caller's options variable and set variables according
# to the list of valid options described by OPTIONSET.
proc parse_options { optionset } {
- parse_list 2 options $optionset ""
+ parse_list 2 options $optionset "" true
upvar 1 options options
if { [llength $options] != 0 } {
error "Option left unparsed $options"
--
2.33.0
More information about the Gdb-patches
mailing list