[RFC] Unset tcl variable addr to avoid clashing

Message ID 1428666671-12926-1-git-send-email-qiyaoltc@gmail.com
State New, archived
Headers

Commit Message

Yao Qi April 10, 2015, 11:51 a.m. UTC
  From: Yao Qi <yao.qi@linaro.org>

Hi,
I see some tcl ERRORs in gdb.sum recently:

ERROR: tcl error sourcing ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp.
ERROR: can't set "addr": variable is array
    while executing
"set addr "0x\[0-9a-zA-Z\]+""
    (file "../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp" line 45)
    invoked from within
"source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
    invoked from within
"catch "uplevel #0 source $test_file_name""

It is OK to run single dmsym.exp.  This error is caused by the name
clashing with coredump-filter.exp, and it can be reproduced,

 $ make check RUNTESTFLAGS='coredump-filter.exp dmsym.exp exception.exp stepi-random-signal.exp'

as variable addr is used in all of them.  This patch is to unset array
addr, but manually unset variables isn't good to me.  Is there any
approaches we can do to avoid name clashing?

gdb/testsuite:

2015-04-10  Yao Qi  <yao.qi@linaro.org>

	* gdb.base/coredump-filter.exp: Unset addr.
---
 gdb/testsuite/gdb.base/coredump-filter.exp | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Doug Evans April 10, 2015, 4:53 p.m. UTC | #1
On Fri, Apr 10, 2015 at 4:51 AM, Yao Qi <qiyaoltc@gmail.com> wrote:
> From: Yao Qi <yao.qi@linaro.org>
>
> Hi,
> I see some tcl ERRORs in gdb.sum recently:
>
> ERROR: tcl error sourcing ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp.
> ERROR: can't set "addr": variable is array
>     while executing
> "set addr "0x\[0-9a-zA-Z\]+""
>     (file "../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp" line 45)
>     invoked from within
> "source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
>     ("uplevel" body line 1)
>     invoked from within
> "uplevel #0 source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
>     invoked from within
> "catch "uplevel #0 source $test_file_name""
>
> It is OK to run single dmsym.exp.  This error is caused by the name
> clashing with coredump-filter.exp, and it can be reproduced,
>
>  $ make check RUNTESTFLAGS='coredump-filter.exp dmsym.exp exception.exp stepi-random-signal.exp'
>
> as variable addr is used in all of them.  This patch is to unset array
> addr, but manually unset variables isn't good to me.  Is there any
> approaches we can do to avoid name clashing?

Bleah. :-)
The first thing that comes to mind is of course a convention that
array globals must be prefixed with the name of the test.
OTOH gdb_base_coredump_filter_addr is painful.

>
> gdb/testsuite:
>
> 2015-04-10  Yao Qi  <yao.qi@linaro.org>
>
>         * gdb.base/coredump-filter.exp: Unset addr.
> ---
>  gdb/testsuite/gdb.base/coredump-filter.exp | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/gdb/testsuite/gdb.base/coredump-filter.exp b/gdb/testsuite/gdb.base/coredump-filter.exp
> index f3203be..2deb7b3 100644
> --- a/gdb/testsuite/gdb.base/coredump-filter.exp
> +++ b/gdb/testsuite/gdb.base/coredump-filter.exp
> @@ -196,3 +196,5 @@ foreach item $all_anon_corefiles {
>  with_test_prefix "loading and testing corefile for non-Private-Shared-Anon-File" {
>      test_disasm $non_private_shared_anon_file_core $main_addr 1
>  }
> +
> +unset addr

I'd prefer a comment explaining why that is there appear in the code
rather than having to go find it in commit logs or emails.
  
Keith Seitz April 10, 2015, 5:55 p.m. UTC | #2
On 04/10/2015 09:53 AM, Doug Evans wrote:
> Bleah. :-)
> The first thing that comes to mind is of course a convention that
> array globals must be prefixed with the name of the test.
> OTOH gdb_base_coredump_filter_addr is painful.

I've had to do this in several places, too, with my big locations patchset.

In the end, I felt the path-of-least-resistance was to encapsulate the 
whole test in its own namespace and then declare variables:

namespace eval $testfile {
     variable addr
     variable linespec
     variable location

     # do all test stuff
}

namespace delete $testfile

This is rather inconvenient, so I played for a short while with trying 
to automate this in some way. The only solution that I could devise that 
didn't involve modifying dejagnu was to track the global variable list 
in standard_testfile or prepare_for_testing, unset'ing "new" globals 
every time the procedure was called.

It proved a bit problematic, and I ended up with the namespace approach. 
It was far less risky/invasive. If there is any interest, I could dig 
that up and play with it some more.

Keith
  
Doug Evans April 10, 2015, 6:08 p.m. UTC | #3
On Fri, Apr 10, 2015 at 10:55 AM, Keith Seitz <keiths@redhat.com> wrote:
> On 04/10/2015 09:53 AM, Doug Evans wrote:
>>
>> Bleah. :-)
>> The first thing that comes to mind is of course a convention that
>> array globals must be prefixed with the name of the test.
>> OTOH gdb_base_coredump_filter_addr is painful.
>
>
> I've had to do this in several places, too, with my big locations patchset.
>
> In the end, I felt the path-of-least-resistance was to encapsulate the whole
> test in its own namespace and then declare variables:
>
> namespace eval $testfile {
>     variable addr
>     variable linespec
>     variable location
>
>     # do all test stuff
> }
>
> namespace delete $testfile
>
> This is rather inconvenient, so I played for a short while with trying to
> automate this in some way. The only solution that I could devise that didn't
> involve modifying dejagnu was to track the global variable list in
> standard_testfile or prepare_for_testing, unset'ing "new" globals every time
> the procedure was called.

Tucking the thing away in a namespace works too.

[for a definition of "works" that recognizes we have to be pragmatic here :-)]
  

Patch

diff --git a/gdb/testsuite/gdb.base/coredump-filter.exp b/gdb/testsuite/gdb.base/coredump-filter.exp
index f3203be..2deb7b3 100644
--- a/gdb/testsuite/gdb.base/coredump-filter.exp
+++ b/gdb/testsuite/gdb.base/coredump-filter.exp
@@ -196,3 +196,5 @@  foreach item $all_anon_corefiles {
 with_test_prefix "loading and testing corefile for non-Private-Shared-Anon-File" {
     test_disasm $non_private_shared_anon_file_core $main_addr 1
 }
+
+unset addr