diff --git a/gdb-6.3-dtorfix-20050121.patch b/gdb-6.3-dtorfix-20050121.patch new file mode 100644 index 0000000..8533d63 --- /dev/null +++ b/gdb-6.3-dtorfix-20050121.patch @@ -0,0 +1,235 @@ +2005-01-21 Jeff Johnston + + * linespec.c (collect_methods): Don't do special processing for + destructors as this will be handled in find_methods. + (find_methods): Fix ctor check to also check for dtor. + * testsuite/gdb.cp/constructortest.exp: New test. + * testsuite/gdb.cp/constructortest.cc: Ditto. + * testsuite/gdb.cp/templates.exp: Change break of dtor to + be fully quoted. + +--- gdb-6.3/gdb/testsuite/gdb.cp/constructortest.cc.fix Fri Jan 21 17:06:56 2005 ++++ gdb-6.3/gdb/testsuite/gdb.cp/constructortest.cc Fri Jan 21 17:05:18 2005 +@@ -0,0 +1,64 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++class A ++{ ++ public: ++ A(); ++ ~A(); ++ int k; ++ private: ++ int x; ++}; ++ ++class B: public A ++{ ++ public: ++ B(); ++ private: ++ int y; ++}; ++ ++int main(int argc, char *argv[]) ++{ ++ A* a = new A; ++ B* b = new B; ++ delete a; ++ delete b; ++ return 0; ++} ++ ++A::A() /* Constructor A */ ++{ ++ x = 1; /* First line A */ ++ k = 4; /* Second line A */ ++} ++ ++A::~A() /* Destructor A */ ++{ ++ x = 3; /* First line ~A */ ++ k = 6; /* Second line ~A */ ++} ++ ++B::B() ++{ ++ y = 2; /* First line B */ ++ k = 5; ++} ++ +--- gdb-6.3/gdb/testsuite/gdb.cp/constructortest.exp.fix Fri Jan 21 17:07:02 2005 ++++ gdb-6.3/gdb/testsuite/gdb.cp/constructortest.exp Fri Jan 21 17:05:29 2005 +@@ -0,0 +1,98 @@ ++# This testcase is part of GDB, the GNU debugger. ++ ++# Copyright 2005 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++# Check that GDB can break at multiple forms of constructors. ++ ++if $tracelevel { ++ strace $tracelevel ++} ++ ++set prms_id 0 ++set bug_id 0 ++ ++set testfile "constructortest" ++set srcfile ${testfile}.cc ++set binfile ${objdir}/${subdir}/${testfile} ++if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++# ++# Run to `main' where we begin our tests. ++# ++ ++if ![runto_main] then { ++ gdb_suppress_tests ++} ++ ++# Break on the various forms of the A::A constructor ++gdb_test_multiple "break A\:\:A" "breaking on A::A" { ++ -re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. A::A\\(\\) at .*\[\r\n\]*.3. A::A\\\$base\\(\\) at .*\[\r\n\]*> $" { ++ gdb_test "1" \ ++ ".*Multiple breakpoints were set.*" \ ++ "break on multiple constructors" ++ } ++} ++ ++# Verify that we break for the A constructor two times ++# Once for new A and once for new B ++gdb_continue_to_breakpoint "First line A" ++gdb_test "bt" "#0.*A.*#1.*main.*" "Verify in in-charge A::A" ++gdb_continue_to_breakpoint "First line A" ++gdb_test "bt" "#0.*A.*#1.*B.*#2.*main.*" "Verify in not-in-charge A::A" ++ ++# Now do the same for destructors ++gdb_test "break 'A::~A()'" "" ++gdb_test "break 'A::~A\$base()'" "" ++ ++# Verify that we break for the A destructor two times ++# Once for delete a and once for delete b ++gdb_continue_to_breakpoint "First line ~A" ++gdb_test "bt" "#0.*~A.*#1.*main.*" "Verify in in-charge A::~A" ++gdb_continue_to_breakpoint "First line ~A" ++gdb_test "bt" "#0.*~A.*#1.*~B.*#2.*main.*" "Verify in not-in-charge A::~A" ++ ++ ++# Verify that we can break by line number in a constructor and find ++# both occurrences ++runto_main ++gdb_test "break 'A::A()'" "" "break in constructor A 2" ++gdb_continue_to_breakpoint "First line A" ++set second_line [gdb_get_line_number "Second line A"] ++gdb_test "break $second_line" ".*$second_line.*$second_line.*Multiple breakpoints were set.*" "break by line in constructor" ++gdb_continue_to_breakpoint "Second line A" ++gdb_test "bt" "#0.*A.*#1.*main.*" "Verify in in-charge A::A second line" ++gdb_continue_to_breakpoint "Second line A" ++gdb_test "bt" "#0.*A.*#1.*B.*#2.*main.*" "Verify in not-in-charge A::A second line" ++ ++# Verify that we can break by line number in a destructor and find ++# both occurrences ++gdb_test "break 'A::~A()'" "" "break in constructor ~A 2" ++gdb_continue_to_breakpoint "First line ~A" ++set second_line_dtor [gdb_get_line_number "Second line ~A"] ++gdb_test "break $second_line_dtor" ".*$second_line_dtor.*$second_line_dtor.*Multiple breakpoints were set.*" "break by line in destructor" ++gdb_continue_to_breakpoint "Second line ~A" ++gdb_test "bt" "#0.*A.*#1.*main.*" "Verify in in-charge A::~A second line" ++gdb_continue_to_breakpoint "Second line ~A" ++gdb_test "bt" "#0.*A.*#1.*B.*#2.*main.*" "Verify in not-in-charge A::~A second line" ++ +--- gdb-6.3/gdb/testsuite/gdb.cp/templates.exp.fix Fri Jan 21 17:07:10 2005 ++++ gdb-6.3/gdb/testsuite/gdb.cp/templates.exp Fri Jan 21 17:09:09 2005 +@@ -1,4 +1,4 @@ +-# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2002, 2003, 2004 ++# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 + # Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify +@@ -142,7 +142,7 @@ proc test_template_breakpoints {} { + # See CLLbs14792 + if {$hp_aCC_compiler} {setup_xfail hppa*-*-* CLLbs14792} + +- gdb_test_multiple "break T5::~T5" "destructor_breakpoint" { ++ gdb_test_multiple "break 'T5::~T5()'" "destructor_breakpoint" { + -re "Breakpoint.*at.* file .*${testfile}.cc, line.*$gdb_prompt $" + { + pass "destructor breakpoint" +--- gdb-6.3/gdb/linespec.c.fix Fri Jan 21 17:03:18 2005 ++++ gdb-6.3/gdb/linespec.c Fri Jan 21 17:04:39 2005 +@@ -375,12 +375,14 @@ add_matching_methods (int method_counter + + /* Check for special case of looking for member that + doesn't have a mangled name provided. This will happen +- when we have in-charge and not-in-charge constructors. ++ when we have in-charge and not-in-charge ctors/dtors. + Since we don't have a mangled name to work with, if we +- look for the symbol, we can only find the class itself. ++ look for the symbol, we can at best find the class itself. + We can find the information we need in the minimal symbol + table which has the full member name information we need. */ +- if (strlen (phys_name) <= strlen (class_name)) ++ if (strlen (phys_name) <= strlen (class_name) ++ || (strlen (phys_name) == strlen (class_name) + 1 ++ && phys_name[0] == '~')) + return add_minsym_members (class_name, phys_name, msym_arr); + + /* Destructor is handled by caller, don't add it to +@@ -1707,6 +1709,11 @@ collect_methods (char *copy, struct type + { + int i1 = 0; /* Counter for the symbol array. */ + ++#if 0 ++ /* Ignore this special method for getting destructors because ++ find_methods is more robust and can handle multiple ++ destructors which is the case when gcc generates a not-in-charge ++ vs an in-charge destructor. */ + if (destructor_name_p (copy, t)) + { + /* Destructors are a special case. */ +@@ -1725,6 +1732,7 @@ collect_methods (char *copy, struct type + } + } + else ++#endif + i1 = find_methods (t, copy, sym_arr, msym_arr); + + return i1; diff --git a/gdb.spec b/gdb.spec index 77ffab1..e026394 100644 --- a/gdb.spec +++ b/gdb.spec @@ -11,7 +11,7 @@ Name: gdb Version: 6.3.0.0 # The release always contains a leading reserved number, start it at 0. -Release: 0.7 +Release: 0.8 License: GPL Group: Development/Debuggers @@ -157,6 +157,9 @@ Patch129: gdb-6.3-ppcdotsym-20050120.patch # Add PPC .symbols to min-symtable. Patch130: gdb-6.3-ctorline-20050120.patch +# Fix to support multiple destructors just like multiple constructors +Patch131: gdb-6.3-dtorfix-20050121.patch + %ifarch ia64 BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu libunwind >= 0.96-3 %else @@ -226,6 +229,7 @@ and printing their data. %patch128 -p1 %patch129 -p1 %patch130 -p1 +%patch131 -p1 # Change the version that gets printed at GDB startup, so it is RedHat # specific. @@ -394,6 +398,11 @@ fi # don't include the files in include, they are part of binutils %changelog +* Fri Jan 21 2005 Jeff Johnston 6.3.0.0-0.8 +- Support listing both in-charge and not-in-charge dtors when + just the dtor name is given. +- Add new test case for newly added ctor/dtor functionality. + * Thu Jan 20 2005 Jeff Johnston 6.3.0.0-0.7 - Fix to allow breaking by line in both the in-charge and not-in-charge ctor/dtor.