From: Daniel Jacobowitz <drow@false.org>
To: Keith Seitz <keiths@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA 1/3] dwarf2_physname - cpexprs.exp
Date: Sat, 21 Nov 2009 17:12:00 -0000 [thread overview]
Message-ID: <20091121171137.GA23208@caradoc.them.org> (raw)
In-Reply-To: <4B070525.4030107@redhat.com>
On Fri, Nov 20, 2009 at 01:07:49PM -0800, Keith Seitz wrote:
> Running these tests on CVS HEAD currently gives (go ahead, try it: I
> dare you :-):
My previous test run I botched patch application and didn't have this
test. I ran it seperately and found some problems.
print base1::base1(int)
$2 = {base1 *(base1 * const, int)} 0x9944 <base1::base1(int)>
(gdb) FAIL: gdb.cp/cpexprs.exp: print base1::base1(int)
I know what this one is - constructors on ARM return "this". The test
expects void. So this one is just a pattern matching problem.
print base::operator/=
A syntax error in expression, near `'.
(gdb) FAIL: gdb.cp/cpexprs.exp: print base::operator/=
This one is caused by using gdb_load, but not running the test to
main. If you have debug info for your startup code, and gdb_load
connects to your target, you'll end up in the language (asm or C) of
your startup code. I suggest an additional runto_main at the start of
the test so that the parsing language is C++.
That yields the attached incremental patch. The ctor/dtor bits are an
interesting question; we could canonicalize the type, but I don't
think it's necessary (or clear what to canonicalize *to*).
All 18 of the other fails in the GCC multilibs are of the form:
list base::overload(base&) const
Junk at end of line specification.
(gdb) FAIL: gdb.cp/cpexprs.exp: list base::overload(base&) const
What might that be?
Each RealView multilib has 309 failures. A sample:
-$1 = {void (const base1 * const)} 0x999c <base1::a_function() const>
-(gdb) PASS: gdb.cp/cpexprs.exp: print base1::a_function
+$1 = {void (const base1 *)} 0x11614 <base1::a_function() const>
+(gdb) FAIL: gdb.cp/cpexprs.exp: print base1::a_function
This tests for exact output on something which is up to the vagaries
of the producer :-( So this will require even more similar hacks.
RealView is my example here, but expect similar changes between GCC
versions.
And there's:
print flubber<int, int, int, char, short>
-$64 = {void (void)} 0xa100 <flubber<int, int, int, char, short>()>
-(gdb) PASS: gdb.cp/cpexprs.exp: print flubber<int, int, int, char,
short>
+No symbol "flubber<int, int, int, char, short>" in current context.
+(gdb) FAIL: gdb.cp/cpexprs.exp: print flubber<int, int, int, char,
short>
Something seems to be broken in RealView templates, but that's not a
problem with the test. So with this incremental patch (or something
similar), and whatever the "Junk at end of arguments" issue turns out
to be, these new tests look OK.
--
Daniel Jacobowitz
CodeSourcery
2009-11-21 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.cp/cpexprs.exp (escape): Delete. Change all callers
to use string_to_regexp.
(ctor, dtor): New functions. Use them to match constructor
and destructor function types.
(Top level): Use runto_main.
---
gdb/testsuite/gdb.cp/cpexprs.exp | 117 +++++++++++++++++++++++----------------
1 file changed, 69 insertions(+), 48 deletions(-)
Index: gdb-mainline/gdb/testsuite/gdb.cp/cpexprs.exp
===================================================================
--- gdb-mainline.orig/gdb/testsuite/gdb.cp/cpexprs.exp 2009-11-21 08:16:14.000000000 -0800
+++ gdb-mainline/gdb/testsuite/gdb.cp/cpexprs.exp 2009-11-21 08:58:40.000000000 -0800
@@ -31,26 +31,13 @@ proc test_breakpoint {func} {
} else {
gdb_breakpoint "$func"
set i [expr {[string last : $func] + 1}]
- set efunc [escape [string range $func $i end]]
+ set efunc [string_to_regexp [string range $func $i end]]
gdb_test "continue" \
"Continuing.\r\n\r\nBreakpoint $DEC+,.*$efunc.*" \
"continue to $func"
}
}
-# Escape expect-reserved characters in the string
-proc escape {string} {
- regsub -all {\*} $string {\*} string
- regsub -all {\(} $string {\(} string
- regsub -all {\)} $string {\)} string
- regsub -all {\]} $string {\]} string
- regsub -all {\[} $string {\[} string
- regsub -all {\+} $string {\+} string
- regsub -all {\^} $string {\^} string
- regsub -all {\!} $string {\!} string
- return $string
-}
-
# Add a function to the list of tested functions
# FUNC is the name of the function (which will be passed to gdb commands)
# TYPE is the type of the function, as expected from the "print" command
@@ -76,11 +63,11 @@ proc add {func type print lst} {
set print [regsub {\(void\)} $print {()}]
set all_functions($func,print) \
- "$CONVAR = {[escape $type]} $ADDR <[escape $print].*>"
+ "$CONVAR = {[string_to_regexp $type]} $ADDR <[string_to_regexp $print].*>"
if {$lst == "-"} {
set lst "$func"
}
- set all_functions($func,list) ".*// [escape $lst]"
+ set all_functions($func,list) ".*// [string_to_regexp $lst]"
}
proc get {func cmd} {
@@ -145,34 +132,63 @@ add {base2::a_function} \
-
# Constructors
+
+# On targets using the ARM EABI, the constructor is expected to return
+# "this".
+proc ctor { type arglist } {
+ if { [istarget arm*-*eabi*] } {
+ set ret "$type *"
+ } else {
+ set ret "void "
+ }
+ if { $arglist != "" } {
+ set arglist ", $arglist"
+ }
+ return "${ret}($type * const$arglist)"
+}
+
add {derived::derived} \
- {void (derived * const)} \
+ [ctor derived ""] \
- \
-
add {base1::base1(void)} \
- {void (base1 * const, const void ** const)} \
+ [ctor base1 "const void ** const"] \
- \
-
add {base1::base1(int)} \
- {void (base1 * const, int)} \
+ [ctor base1 "int"] \
- \
-
add {base2::base2} \
- {void (base2 * const, const void ** const)} \
+ [ctor base2 "const void ** const"] \
- \
-
add {base::base(void)} \
- {void (base * const)} \
+ [ctor base ""] \
- \
-
add {base::base(int)} \
- {void (base * const, int)} \
- - \
+ [ctor base "int"] \
- \
+ -
# Destructors
+
+# On targets using the ARM EABI, some destructors are expected
+# to return "this". Others are void. For internal reasons,
+# GCC returns void * instead of $type *; RealView appears to do
+# the same.
+proc dtor { type } {
+ if { [istarget arm*-*eabi*] } {
+ set ret "void *"
+ } else {
+ set ret "void "
+ }
+ return "${ret}($type * const)"
+}
+
add {base::~base} \
- {void (base * const)} \
+ [dtor base] \
- \
-
@@ -499,19 +515,19 @@ add {tclass<base>::do_something} \
- \
{tclass<T>::do_something}
add {policy1::policy} \
- {void (policy<int, operation_1<void*> > * const, int)} \
+ [ctor "policy<int, operation_1<void*> >" "int"] \
{policy<int, operation_1<void*> >::policy} \
{policy<T, Policy>::policy}
add {policy2::policy} \
- {void (policy<int, operation_2<void*> > * const, int)} \
+ [ctor "policy<int, operation_2<void*> >" int] \
{policy<int, operation_2<void*> >::policy} \
{policy<T, Policy>::policy}
add {policy3::policy} \
- {void (policy<int, operation_3<void*> > * const, int)} \
+ [ctor "policy<int, operation_3<void*> >" "int"] \
{policy<int, operation_3<void*> >::policy} \
{policy<T, Policy>::policy}
add {policy4::policy} \
- {void (policy<int, operation_4<void*> > * const, int)} \
+ [ctor "policy<int, operation_4<void*> >" "int"] \
{policy<int, operation_4<void*> >::policy} \
{policy<T, Policy>::policy}
add {policy1::function} \
@@ -531,83 +547,83 @@ add {policy4::function} \
{operation_4<void*>::function} \
{operation_4<T>::function}
add {policyd<int, operation_1<int> >::policyd} \
- {void (policyd<int, operation_1<int> > * const, int)} \
+ [ctor "policyd<int, operation_1<int> >" "int"] \
- \
{policyd<T, Policy>::policyd}
add {policyd1::policyd} \
- {void (policyd<int, operation_1<int> > * const, int)} \
+ [ctor "policyd<int, operation_1<int> >" "int"] \
{policyd<int, operation_1<int> >::policyd} \
{policyd<T, Policy>::policyd}
add {policyd<int, operation_1<int> >::~policyd} \
- {void (policyd<int, operation_1<int> > * const)} \
+ [dtor "policyd<int, operation_1<int> >"] \
- \
{policyd<T, Policy>::~policyd}
add {policyd1::~policyd} \
- {void (policyd<int, operation_1<int> > * const)} \
+ [dtor "policyd<int, operation_1<int> >"] \
{policyd<int, operation_1<int> >::~policyd} \
{policyd<T, Policy>::~policyd}
add {policyd<long, operation_1<long> >::policyd} \
- {void (policyd<long, operation_1<long> > * const, long)} \
+ [ctor "policyd<long, operation_1<long> >" "long"] \
- \
{policyd<T, Policy>::policyd}
add {policyd2::policyd} \
- {void (policyd<long, operation_1<long> > * const, long)} \
+ [ctor "policyd<long, operation_1<long> >" "long"] \
{policyd<long, operation_1<long> >::policyd} \
{policyd<T, Policy>::policyd}
add {policyd<long, operation_1<long> >::~policyd} \
- {void (policyd<long, operation_1<long> > * const)} \
+ [dtor "policyd<long, operation_1<long> >"] \
- \
{policyd<T, Policy>::~policyd}
add {policyd2::~policyd} \
- {void (policyd<long, operation_1<long> > * const)} \
+ [dtor "policyd<long, operation_1<long> >"] \
{policyd<long, operation_1<long> >::~policyd} \
{policyd<T, Policy>::~policyd}
add {policyd<char, operation_1<char> >::policyd} \
- {void (policyd<char, operation_1<char> > * const, char)} \
+ [ctor "policyd<char, operation_1<char> >" "char"] \
- \
{policyd<T, Policy>::policyd}
add {policyd3::policyd} \
- {void (policyd<char, operation_1<char> > * const, char)} \
+ [ctor "policyd<char, operation_1<char> >" "char"] \
{policyd<char, operation_1<char> >::policyd} \
{policyd<T, Policy>::policyd}
add {policyd<char, operation_1<char> >::~policyd} \
- {void (policyd<char, operation_1<char> > * const)} \
+ [dtor "policyd<char, operation_1<char> >"] \
- \
{policyd<T, Policy>::~policyd}
add {policyd3::~policyd} \
- {void (policyd<char, operation_1<char> > * const)} \
+ [dtor "policyd<char, operation_1<char> >"] \
{policyd<char, operation_1<char> >::~policyd} \
{policyd<T, Policy>::~policyd}
add {policyd<base, operation_1<base> >::policyd} \
- {void (policyd<base, operation_1<base> > * const, base)} \
+ [ctor "policyd<base, operation_1<base> >" "base"] \
- \
{policyd<T, Policy>::policyd}
add {policyd4::policyd} \
- {void (policyd<base, operation_1<base> > * const, base)} \
+ [ctor "policyd<base, operation_1<base> >" "base"] \
{policyd<base, operation_1<base> >::policyd} \
{policyd<T, Policy>::policyd}
add {policyd<base, operation_1<base> >::~policyd} \
- {void (policyd<base, operation_1<base> > * const)} \
+ [dtor "policyd<base, operation_1<base> >"] \
- \
{policyd<T, Policy>::~policyd}
add {policyd4::~policyd} \
- {void (policyd<base, operation_1<base> > * const)} \
+ [dtor "policyd<base, operation_1<base> >"] \
{policyd<base, operation_1<base> >::~policyd} \
{policyd<T, Policy>::~policyd}
add {policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \
- {void (policyd<tclass<int>, operation_1<tclass<int> > > * const, tclass<int>)} \
+ [ctor "policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \
- \
{policyd<T, Policy>::policyd}
add {policyd5::policyd} \
- {void (policyd<tclass<int>, operation_1<tclass<int> > > * const, tclass<int>)} \
+ [ctor "policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \
{policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \
{policyd<T, Policy>::policyd}
add {policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \
- {void (policyd<tclass<int>, operation_1<tclass<int> > > * const)} \
+ [dtor "policyd<tclass<int>, operation_1<tclass<int> > >"] \
- \
{policyd<T, Policy>::~policyd}
add {policyd5::~policyd} \
- {void (policyd<tclass<int>, operation_1<tclass<int> > > * const)} \
+ [dtor "policyd<tclass<int>, operation_1<tclass<int> > >"] \
{policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \
{policyd<T, Policy>::~policyd}
add {policyd<int, operation_1<int> >::function} \
@@ -679,6 +695,11 @@ gdb_start
gdb_reinitialize_dir [file join $srcdir $subdir]
gdb_load $binfile
+if {![runto_main]} {
+ perror "couldn't run to breakpoint"
+ continue
+}
+
# Set the listsize to one. This will help with testing "list".
gdb_test "set listsize 1"
prev parent reply other threads:[~2009-11-21 17:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-20 21:08 Keith Seitz
2009-11-21 5:21 ` Pedro Alves
2009-12-08 21:27 ` Keith Seitz
2009-11-21 17:12 ` Daniel Jacobowitz [this message]
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=20091121171137.GA23208@caradoc.them.org \
--to=drow@false.org \
--cc=gdb-patches@sourceware.org \
--cc=keiths@redhat.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