[ resending. It seems this did not get through to the mail archive. ]
On Thu, Jun 28, 2018 at 07:49:30PM +0200, Tom de Vries wrote: > Hi, > > I played around with pr45882.c and ran into FAILs. It took me a while to > realize that the FAILs where due to the gdb-test (a dg-final action) using > absolute line numbers, and me adding lines before the gdb-test lines. > > I've written this patch, which factors out the handling of relative line > numbers as well as line number variables from process-message, and reuses the > functionality in gdb-test. > > This enables the line number variables functionality in gdb-test. [ There's > one quirk: line number variables have a define-before-use semantics (with > matching used-before-defined error) but in the test-case the use in gdb-test > preceeds the definition in gdb-line. This doesn't cause errors, because > the dg-final actions are executed after the definition has taken effect. ] > > [ Relative line numbers still don't work in gdb-test, but that's due to an > orthogonal issue: gdb-test is a dg-final action, and while dg-final receives > the line number on which it occurred as it's first argument, it doesn't pass > on this line number to the argument list of the action. I'll submit a > follow-on rfc patch for this. ] > > Tested pr45882.c. Tested one test-case with relative line numbers, and > one with line number variables to make sure I didn't break process-message. > > OK for trunk if bootstrap and reg-test succeeds? > > Thanks, > - Tom > > [testsuite/guality] Use line number vars in gdb-test > > 2018-06-28 Tom de Vries <tdevr...@suse.de> > > * gcc.dg/guality/pr45882.c (foo): Add line number var for breakpoint > line, and use it. > * lib/gcc-dg.exp (get-absolute-line): Factor out of ... > (process-message): ... here. > * lib/gcc-gdb-test.exp (gdb-test): Use get-absolute-line. > > --- > gcc/testsuite/gcc.dg/guality/pr45882.c | 10 ++--- > gcc/testsuite/lib/gcc-dg.exp | 73 > +++++++++++++++++++++------------- > gcc/testsuite/lib/gcc-gdb-test.exp | 3 +- > 3 files changed, 52 insertions(+), 34 deletions(-) > > diff --git a/gcc/testsuite/gcc.dg/guality/pr45882.c > b/gcc/testsuite/gcc.dg/guality/pr45882.c > index ece35238a30..da9e2755590 100644 > --- a/gcc/testsuite/gcc.dg/guality/pr45882.c > +++ b/gcc/testsuite/gcc.dg/guality/pr45882.c > @@ -9,11 +9,11 @@ volatile short int v; > __attribute__((noinline,noclone,used)) int > foo (int i, int j) > { > - int b = i; /* { dg-final { gdb-test 16 "b" "7" } } */ > - int c = i + 4; /* { dg-final { gdb-test 16 "c" "11" } } */ > - int d = a[i]; /* { dg-final { gdb-test 16 "d" "112" } } */ > - int e = a[i + 6]; /* { dg-final { gdb-test 16 "e" "142" } } */ > - ++v; > + int b = i; /* { dg-final { gdb-test bpline "b" "7" } } */ > + int c = i + 4; /* { dg-final { gdb-test bpline "c" "11" } } */ > + int d = a[i]; /* { dg-final { gdb-test bpline "d" "112" } } */ > + int e = a[i + 6]; /* { dg-final { gdb-test bpline "e" "142" } } */ > + ++v; /* { dg-line bpline } */ > return ++j; > } > > diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp > index a15c5d5e2a6..22065c7e3fe 100644 > --- a/gcc/testsuite/lib/gcc-dg.exp > +++ b/gcc/testsuite/lib/gcc-dg.exp > @@ -1039,6 +1039,49 @@ proc dg-line { linenr varname } { > } > } > > +# Get the absolute line number corresponding to: > +# - a relative line number (a non-null useline is required), or > +# - a line number variable reference. > +# Argument 0 is the line number on which line was used > +# Argument 1 is the relative line number or line number variable reference > +# > +proc get-absolute-line { useline line } { > + if { [regsub "^\.\[+-\](\[0-9\]+)$" $line "\\1" num] && $useline != "" } > { > + # Handle relative line specification, .+1 or .-1 etc. > + set num [expr $useline [string index $line 1] $num] > + return $num > + } > + > + if { ! [regsub "^(\[a-zA-Z\]\[a-zA-Z0-9_\]*)$" $line "\\1" varname] } { > + return $line > + } > + > + # Handle linenr variable defined by dg-line > + set org_varname $varname > + set varname "saved_linenr_$varname" > + eval global $varname > + > + # Generate used-but-not-defined error. > + eval set var_defined [info exists $varname] > + if { ! $var_defined } { > + if { "$useline" != "" } { > + error "dg-line var $org_varname used at line $uselinenr, but not > defined" > + } else { > + error "dg-line var $org_varname used, but not defined" > + } > + return > + } > + > + # Note that varname has been used. > + set varname_used "used_$varname" > + eval global $varname_used > + eval set $varname_used 1 > + > + # Get line number from var and use it. > + eval set num \$$varname > + set line $num > +} > + > # Modify the regular expression saved by a DejaGnu message directive to > # include a prefix and to force the expression to match a single line. > # MSGPROC is the procedure to call. > @@ -1049,34 +1092,8 @@ proc process-message { msgproc msgprefix dgargs } { > upvar dg-messages dg-messages > > if { [llength $dgargs] == 5 } { > - if { [regsub "^\.\[+-\](\[0-9\]+)$" [lindex $dgargs 4] "\\1" num] } { > - # Handle relative line specification, .+1 or .-1 etc. > - set num [expr [lindex $dgargs 0] [string index [lindex $dgargs 4] > 1] $num] > - set dgargs [lreplace $dgargs 4 4 $num] > - } elseif { [regsub "^(\[a-zA-Z\]\[a-zA-Z0-9_\]*)$" [lindex $dgargs 4] > "\\1" varname] } { > - # Handle linenr variable defined by dg-line > - > - set org_varname $varname > - set varname "saved_linenr_$varname" > - eval global $varname > - > - # Generate used-but-not-defined error. > - eval set var_defined [info exists $varname] > - if { ! $var_defined } { > - set linenr [expr [lindex $dgargs 0]] > - error "dg-line var $org_varname used at line $linenr, but not > defined" > - return > - } > - > - # Note that varname has been used. > - set varname_used "used_$varname" > - eval global $varname_used > - eval set $varname_used 1 > - > - # Get line number from var and use it. > - eval set num \$$varname > - set dgargs [lreplace $dgargs 4 4 $num] > - } > + set num [get-absolute-line [lindex $dgargs 0] [lindex $dgargs 4]] > + set dgargs [lreplace $dgargs 4 4 $num] > } > > # Process the dg- directive, including adding the regular expression > diff --git a/gcc/testsuite/lib/gcc-gdb-test.exp > b/gcc/testsuite/lib/gcc-gdb-test.exp > index 2ef9ca15c12..5457e7a793e 100644 > --- a/gcc/testsuite/lib/gcc-gdb-test.exp > +++ b/gcc/testsuite/lib/gcc-gdb-test.exp > @@ -60,7 +60,8 @@ proc gdb-test { args } { > set cmd_file "[file rootname [file tail $prog]].gdb" > > set fd [open $cmd_file "w"] > - puts $fd "break [lindex $args 0]" > + set line [get-absolute-line "" [lindex $args 0]] > + puts $fd "break $line" > puts $fd "run" > puts $fd "$command $var" > if { $command == "print" } {