rpms/gdb/devel gdb-7.0-upstream.patch, NONE, 1.1 gdb-archer-pie-addons-keep-disabled.patch, NONE, 1.1 gdb-archer-pie-addons.patch, NONE, 1.1 gdb-archer-pie.patch, NONE, 1.1 gdb-bitfield-check_typedef.patch, NONE, 1.1 gdb-bz528668-symfile-cleanup.patch, NONE, 1.1 gdb-bz528668-symfile-multi.patch, NONE, 1.1 gdb-bz528668-symfile-sepcrc.patch, NONE, 1.1 gdb-bz533176-fortran-omp-step.patch, NONE, 1.1 gdb-bz538626-bp_location-accel-bp-cond.patch, NONE, 1.1 gdb-bz539590-gnu-ifunc.patch, NONE, 1.1 gdb-core-open-vdso-warning.patch, NONE, 1.1 gdb-empty-namespace.patch, NONE, 1.1 gdb-follow-child-stale-parent.patch, NONE, 1.1 gdb-ppc-hw-watchpoint-twice.patch, NONE, 1.1 gdb-readline-6.0-signal.patch, NONE, 1.1 gdb-rhel5-compat.patch, NONE, 1.1 gdb-rhel5-gcc44.patch, NONE, 1.1 gdb-stabs-read_args.patch, NONE, 1.1 gdb-stale-related_breakpoint.patch, NONE, 1.1 gdb-testsuite-unknown-output.patch, NONE, 1.1 gdb-watchpoint-cond-gone.patch, NONE, 1.1 gdb-x86_64-i386-syscall-restart.patch, NONE, 1.1 .cvsignore, 1.42, 1.43 Makefile, 1.4, 1.5 gdb-6.3-ia64-info-frame-fix-20050725.patch, 1.2, 1.3 gdb-6.3-ia64-sigtramp-frame-20050708.patch, 1.4, 1.5 gdb-6.3-rh-testversion-20041202.patch, 1.3, 1.4 gdb-6.3-test-dtorfix-20050121.patch, 1.8, 1.9 gdb-6.3-test-pie-20050107.patch, 1.11, 1.12 gdb-6.5-bz216711-clone-is-outermost.patch, 1.5, 1.6 gdb-6.6-buildid-locate-rpm.patch, 1.6, 1.7 gdb-6.6-buildid-locate.patch, 1.27, 1.28 gdb-6.7-testsuite-stable-results.patch, 1.8, 1.9 gdb-6.8-inlining-addon.patch, 1.9, 1.10 gdb-archer.patch, 1.33, 1.34 gdb-orphanripper.c, 1.3, 1.4 gdb.spec, 1.390, 1.391 gdbcompare, 1.5, 1.6 gdbpatchno, 1.1, 1.2 sources, 1.41, 1.42 gdb-6.3-bz182116-exec-from-pthread.patch, 1.2, NONE gdb-6.3-ia64-corefile-fix-20050127.patch, 1.2, NONE gdb-6.3-nonthreaded-wp-20050117.patch, 1.8, NONE gdb-6.3-pie-20050110.patch, 1.25, NONE gdb-6.3-sepcrc-20050402.patch, 1.4, NONE gdb-6.3-test-sepcrc-20050402.patch, 1.3, NONE gdb-6.3-watchpoint-cond-gone-test.patch, 1.2, NONE

Jan Kratochvil jkratoch at fedoraproject.org
Tue Jan 12 22:15:58 UTC 2010


Author: jkratoch

Update of /cvs/pkgs/rpms/gdb/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv26797

Modified Files:
	.cvsignore Makefile gdb-6.3-ia64-info-frame-fix-20050725.patch 
	gdb-6.3-ia64-sigtramp-frame-20050708.patch 
	gdb-6.3-rh-testversion-20041202.patch 
	gdb-6.3-test-dtorfix-20050121.patch 
	gdb-6.3-test-pie-20050107.patch 
	gdb-6.5-bz216711-clone-is-outermost.patch 
	gdb-6.6-buildid-locate-rpm.patch gdb-6.6-buildid-locate.patch 
	gdb-6.7-testsuite-stable-results.patch 
	gdb-6.8-inlining-addon.patch gdb-archer.patch 
	gdb-orphanripper.c gdb.spec gdbcompare gdbpatchno sources 
Added Files:
	gdb-7.0-upstream.patch 
	gdb-archer-pie-addons-keep-disabled.patch 
	gdb-archer-pie-addons.patch gdb-archer-pie.patch 
	gdb-bitfield-check_typedef.patch 
	gdb-bz528668-symfile-cleanup.patch 
	gdb-bz528668-symfile-multi.patch 
	gdb-bz528668-symfile-sepcrc.patch 
	gdb-bz533176-fortran-omp-step.patch 
	gdb-bz538626-bp_location-accel-bp-cond.patch 
	gdb-bz539590-gnu-ifunc.patch gdb-core-open-vdso-warning.patch 
	gdb-empty-namespace.patch gdb-follow-child-stale-parent.patch 
	gdb-ppc-hw-watchpoint-twice.patch 
	gdb-readline-6.0-signal.patch gdb-rhel5-compat.patch 
	gdb-rhel5-gcc44.patch gdb-stabs-read_args.patch 
	gdb-stale-related_breakpoint.patch 
	gdb-testsuite-unknown-output.patch 
	gdb-watchpoint-cond-gone.patch 
	gdb-x86_64-i386-syscall-restart.patch 
Removed Files:
	gdb-6.3-bz182116-exec-from-pthread.patch 
	gdb-6.3-ia64-corefile-fix-20050127.patch 
	gdb-6.3-nonthreaded-wp-20050117.patch 
	gdb-6.3-pie-20050110.patch gdb-6.3-sepcrc-20050402.patch 
	gdb-6.3-test-sepcrc-20050402.patch 
	gdb-6.3-watchpoint-cond-gone-test.patch 
Log Message:
Rebase to: gdb-7.0.1-25.fc12


gdb-7.0-upstream.patch:
 gdb/dbxread.c                            |    9 +++++++--
 src/gdb/doc/gdb.texinfo                  |   13 +++++++++++--
 src/gdb/testsuite/gdb.base/condbreak.exp |    9 +++++++--
 src/gdb/testsuite/gdb.base/default.exp   |    7 ++++++-
 src/gdb/testsuite/gdb.cp/expand-sals.cc  |    2 +-
 src/gdb/testsuite/gdb.cp/expand-sals.exp |    6 ------
 src/gdb/top.c                            |    7 +++++--
 7 files changed, 37 insertions(+), 16 deletions(-)

--- NEW FILE gdb-7.0-upstream.patch ---



http://sourceware.org/ml/gdb-patches/2009-11/msg00388.html
http://sourceware.org/ml/gdb-cvs/2009-11/msg00156.html
Subject: [patch] Fix crash on reading stabs

Hi,

there is a crash on reading stabs fpc binary:
	https://bugzilla.redhat.com/show_bug.cgi?id=537837

Program received signal SIGSEGV, Segmentation fault.
0x000000000069db3d in read_dbx_symtab (objfile=0x1daf5f0) at dbxread.c:1369
1369              if ((namestring[0] == '-' && namestring[1] == 'l')

(gdb) p/x nlist.n_strx
$7 = 0xfffffff8
(gdb) p sizeof(nlist.n_strx)
$10 = 8

Below the patch context is:
    namestring = (nlist->n_strx + file_string_table_offset
                  + DBX_STRINGTAB (objfile));

so IMO the `(unsigned)' cast is excessive as it does not match the expression
below.  Such cast is there since the GDB "Initial revision" (1999).

`n_strx' type:
struct internal_nlist
{
  unsigned long n_strx;                 /* Index into string table of name.  */
...
};

Regression tested on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu which does not
mean anything with the default DWARF debug info.  It was hanging for stabs so
tried just a large part of gdb.base/*.exp on x86_64-m32 - `unix/-gstabs+/-m32'.

If it isn't obviously approved please feel free to drop it as one should not
use STABS in the first place.


Regards,
Jan


gdb/
2009-11-17  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* dbxread.c (set_namestring): Remove cast to unsigned.  Check N_STRX
	overflow.

--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -965,8 +965,9 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
 {
   char *namestring;
 
-  if (((unsigned) nlist->n_strx + file_string_table_offset)
-      >= DBX_STRINGTAB_SIZE (objfile))
+  if (nlist->n_strx + file_string_table_offset
+      >= DBX_STRINGTAB_SIZE (objfile)
+      || nlist->n_strx + file_string_table_offset < nlist->n_strx)
     {
       complaint (&symfile_complaints, _("bad string table offset in symbol %d"),
 		 symnum);



Re: [RFA] Fix "show convenience" test
http://sourceware.org/ml/gdb-patches/2009-09/msg00565.html
http://sourceware.org/ml/gdb-cvs/2009-09/msg00099.html

### src/gdb/testsuite/ChangeLog	2009/09/15 18:51:25	1.1960
### src/gdb/testsuite/ChangeLog	2009/09/17 17:49:46	1.1961
## -1,3 +1,7 @@
+2009-09-17  Paul Pluzhnikov  <ppluzhnikov at google.com>
+
+	* gdb.base/default.exp: Fix "show convenience".
+
 2009-09-15  Tom Tromey  <tromey at redhat.com>
 
 	* lib/mi-support.exp (mi_create_varobj): Update.
--- src/gdb/testsuite/gdb.base/default.exp	2009/08/13 14:58:27	1.31
+++ src/gdb/testsuite/gdb.base/default.exp	2009/09/17 17:49:46	1.32
@@ -598,7 +598,7 @@
 #test show confirm
 gdb_test "show confirm" "Whether to confirm potentially dangerous operations is o\[a-z\]*." "show confirm"
 #test show convenience
-gdb_test "show convenience" "No debugger convenience variables now defined.(\[^\r\n\]*\[\r\n\])+Convenience variables have names starting with \".\";(\[^\r\n\]*\[\r\n\])+use \"set\" as in \"set .foo = 5\" to define them." "show convenience"
+gdb_test "show convenience" "\\\$_siginfo = void" "show convenience"
 #test show directories
 gdb_test "show directories" "Source directories searched: .cdir\[:;\].cwd" "show directories"
 #test show editing
### src/gdb/doc/ChangeLog	2009/09/15 18:51:24	1.953
### src/gdb/doc/ChangeLog	2009/09/17 17:49:46	1.954
## -1,3 +1,8 @@
+2009-09-17  Paul Pluzhnikov  <ppluzhnikov at google.com>
+
+	* gdb.texinfo (convenince variables): Mention
+	$_siginfo could be empty.
+	
 2009-09-15  Tom Tromey  <tromey at redhat.com>
 
 	* gdb.texinfo (GDB/MI Variable Objects): Document
--- src/gdb/doc/gdb.texinfo	2009/09/15 18:51:25	1.624
+++ src/gdb/doc/gdb.texinfo	2009/09/17 17:49:46	1.625
@@ -7819,8 +7819,10 @@
 
 @item $_siginfo
 @vindex $_siginfo at r{, convenience variable}
-The variable @code{$_siginfo} is bound to extra signal information
-inspection (@pxref{extra signal information}).
+The variable @code{$_siginfo} contains extra signal information
+(@pxref{extra signal information}).  Note that @code{$_siginfo}
+could be empty, if the application has not yet received any signals.
+For example, it will be empty before you execute the @code{run} command.
 @end table
 
 On HP-UX systems, if you refer to a function or variable name that



http://sourceware.org/ml/gdb-cvs/2009-12/msg00128.html

### src/gdb/testsuite/ChangeLog	2009/12/23 23:18:08	1.2054
### src/gdb/testsuite/ChangeLog	2009/12/24 21:57:06	1.2055
## -1,3 +1,10 @@
+2009-12-24  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Fix compatibility with G++-4.5.
+	* gdb.cp/expand-sals.cc (main): Remove the "exit-line" comment.
+	* gdb.cp/expand-sals.exp: Remove breakpoint on "exit-line".
+	(uncaught return): Remove.
+
 2009-12-23  Jan Kratochvil  <jan.kratochvil at redhat.com>
 	    Phil Muldoon  <pmuldoon at redhat.com>
 
--- src/gdb/testsuite/gdb.cp/expand-sals.cc	2009/05/11 15:05:56	1.1
+++ src/gdb/testsuite/gdb.cp/expand-sals.cc	2009/12/24 21:57:06	1.2
@@ -49,5 +49,5 @@
   A a;
   B b;
 
-  return 0;	/* exit-line */
+  return 0;
 }
--- src/gdb/testsuite/gdb.cp/expand-sals.exp	2009/05/11 15:05:56	1.1
+++ src/gdb/testsuite/gdb.cp/expand-sals.exp	2009/12/24 21:57:06	1.2
@@ -23,8 +23,6 @@
     return -1
 }
 
-gdb_breakpoint [gdb_get_line_number "exit-line"]
-
 gdb_breakpoint [gdb_get_line_number "func-line"]
 gdb_continue_to_breakpoint "func" ".*func-line.*"
 
@@ -52,7 +50,3 @@
 	 "bt from A"
 
 gdb_continue_to_breakpoint "next caller func" ".*func-line.*"
-
-# Verify GDB really could not catch any other breakpoint location.
-
-gdb_continue_to_breakpoint "uncaught return" ".*exit-line.*"



http://sourceware.org/ml/gdb-cvs/2009-11/msg00213.html

[ cut ]

--- src/gdb/testsuite/gdb.base/condbreak.exp	2009/01/03 05:58:03	1.13
+++ src/gdb/testsuite/gdb.base/condbreak.exp	2009/11/25 20:43:29	1.14
@@ -207,10 +207,10 @@
 setup_xfail hppa2.0w-*-* 11512CLLbs
 send_gdb "continue\n"
 gdb_expect {
-    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
 	pass "run until breakpoint at marker2"
     }
-    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*" {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*($bp_location8|$bp_location9)\[\t \]+.*$gdb_prompt $" {
 	xfail "run until breakpoint at marker2"
     }
     -re "$gdb_prompt $" {



Fix for gfortran-4.1:
  -PASS: gdb.mi/mi-var-child-f.exp: mi runto MAIN__
  +FAIL: gdb.mi/mi-var-child-f.exp: mi runto MAIN__ (unknown output after running)

RFC: Move language-changed message to verbose
http://sourceware.org/ml/gdb-patches/2009-11/msg00031.html
http://sourceware.org/ml/gdb-cvs/2009-11/msg00034.html

### src/gdb/ChangeLog	2009/11/05 19:53:03	1.11030
### src/gdb/ChangeLog	2009/11/05 20:43:52	1.11031
## -1,3 +1,8 @@
+2009-11-05  Daniel Jacobowitz  <dan at codesourcery.com>
+
+	* top.c (execute_command): Select a frame before checking the current
+	language.  Only output a message if verbose.
+
 2009-11-05  Tom Tromey  <tromey at redhat.com>
 
 	* symtab.h (SYMBOL_SET_LINKAGE_NAME): Update comment.
--- src/gdb/top.c	2009/10/19 09:51:42	1.172
+++ src/gdb/top.c	2009/11/05 20:43:52	1.173
@@ -457,10 +457,13 @@
 
     }
 
-  /* Tell the user if the language has changed (except first time).  */
+  /* Tell the user if the language has changed (except first time).
+     First make sure that a new frame has been selected, in case this
+     command or the hooks changed the program state.  */
+  deprecated_safe_get_selected_frame ();
   if (current_language != expected_language)
     {
-      if (language_mode == language_mode_auto)
+      if (language_mode == language_mode_auto && info_verbose)
 	{
 	  language_info (1);	/* Print what changed.  */
 	}

gdb-archer-pie-addons-keep-disabled.patch:
 breakpoint.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 breakpoint.h |    3 +++
 objfiles.c   |   20 +++++++++++++++-----
 3 files changed, 61 insertions(+), 5 deletions(-)

--- NEW FILE gdb-archer-pie-addons-keep-disabled.patch ---
--- ./gdb/breakpoint.c	2009-12-18 00:13:49.000000000 +0100
+++ ./gdb/breakpoint.c	2009-12-18 00:13:16.000000000 +0100
@@ -8563,6 +8563,49 @@ update_breakpoint_locations (struct brea
   update_global_location_list (1);
 }
 
+void
+breakpoints_relocate (struct objfile *objfile, struct section_offsets *delta)
+{
+  struct bp_location *bl, **blp_tmp;
+  int changed = 0;
+
+  gdb_assert (objfile->separate_debug_objfile_backlink == NULL);
+
+  ALL_BP_LOCATIONS (bl, blp_tmp)
+    {
+      struct obj_section *osect;
+
+      /* BL->SECTION can be correctly NULL for breakpoints with multiple
+         locations expanded through symtab.  */
+
+      ALL_OBJFILE_OSECTIONS (objfile, osect)
+	{
+	  CORE_ADDR relocated_address;
+	  CORE_ADDR delta_offset;
+
+	  delta_offset = ANOFFSET (delta, osect->the_bfd_section->index);
+	  if (delta_offset == 0)
+	    continue;
+	  relocated_address = bl->address + delta_offset;
+
+	  if (obj_section_addr (osect) <= relocated_address
+	      && relocated_address < obj_section_endaddr (osect))
+	    {
+	      if (bl->inserted)
+		remove_breakpoint (bl, mark_uninserted);
+
+	      bl->address += delta_offset;
+	      bl->requested_address += delta_offset;
+
+	      changed = 1;
+	    }
+	}
+    }
+
+  if (changed)
+    qsort (bp_location, bp_location_count, sizeof (*bp_location),
+	   bp_location_compare_for_qsort);
+}
 
 /* Reset a breakpoint given it's struct breakpoint * BINT.
    The value we return ends up being the return value from catch_errors.
--- ./gdb/breakpoint.h	2009-12-18 00:13:48.000000000 +0100
+++ ./gdb/breakpoint.h	2009-12-17 22:11:10.000000000 +0100
@@ -970,4 +970,7 @@ extern struct breakpoint *get_tracepoint
    is newly allocated; the caller should free when done with it.  */
 extern VEC(breakpoint_p) *all_tracepoints (void);
 
+extern void breakpoints_relocate (struct objfile *objfile,
+				  struct section_offsets *delta);
+
 #endif /* !defined (BREAKPOINT_H) */
--- ./gdb/objfiles.c	2009-12-18 00:13:48.000000000 +0100
+++ ./gdb/objfiles.c	2009-12-17 23:19:22.000000000 +0100
@@ -546,7 +546,7 @@ free_all_objfiles (void)
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
    entries in new_offsets.  SEPARATE_DEBUG_OBJFILE is not touched here.  */
 
-static void
+static int
 objfile_relocate1 (struct objfile *objfile, struct section_offsets *new_offsets)
 {
   struct obj_section *s;
@@ -565,7 +565,7 @@ objfile_relocate1 (struct objfile *objfi
 	  something_changed = 1;
       }
     if (!something_changed)
-      return;
+      return 0;
   }
 
   /* OK, get all the symtabs.  */
@@ -706,6 +706,13 @@ objfile_relocate1 (struct objfile *objfi
       exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
 				obj_section_addr (s));
     }
+
+  /* Final call of breakpoint_re_set can keep breakpoint locations disabled if
+     their addresses match.  */
+  if (objfile->separate_debug_objfile_backlink == NULL)
+    breakpoints_relocate (objfile, delta);
+
+  return 1;
 }
 
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
@@ -720,7 +727,9 @@ objfile_relocate1 (struct objfile *objfi
 void
 objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
 {
-  objfile_relocate1 (objfile, new_offsets);
+  int changed = 0;
+
+  changed |= objfile_relocate1 (objfile, new_offsets);
 
   if (objfile->separate_debug_objfile != NULL)
     {
@@ -747,11 +756,12 @@ objfile_relocate (struct objfile *objfil
 					     objfile_addrs);
       do_cleanups (my_cleanups);
 
-      objfile_relocate1 (debug_objfile, new_debug_offsets);
+      changed |= objfile_relocate1 (debug_objfile, new_debug_offsets);
     }
 
   /* Relocate breakpoints as necessary, after things are relocated. */
-  breakpoint_re_set ();
+  if (changed)
+    breakpoint_re_set ();
 }
 
 /* Return non-zero if OBJFILE has partial symbols.  */

gdb-archer-pie-addons.patch:
 gdb-7.0/gdb/testsuite/gdb.base/valgrind-db-attach.exp |    2 +
 gdb/dwarf2read.c                                      |   17 ++++++--
 gdb/exec.c                                            |   20 +++++++++-
 gdb/gdbtypes.h                                        |    3 +
 gdb/jv-lang.c                                         |    6 ++-
 gdb/solib-svr4.c                                      |   12 ++++--
 gdb/solib.c                                           |   13 ++++++
 gdb/solib.h                                           |    2 +
 gdb/solist.h                                          |    3 +
 gdb/symfile.c                                         |   35 ++++++++++++++----
 gdb/value.c                                           |    6 ++-
 11 files changed, 99 insertions(+), 20 deletions(-)

--- NEW FILE gdb-archer-pie-addons.patch ---
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -5754,7 +5754,12 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
 {
   struct attribute *attr;
   struct symbol *sym;
-  CORE_ADDR base = (CORE_ADDR) 0;
+  struct objfile *objfile = cu->objfile;
+  CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+				 SECT_OFF_TEXT (objfile));
+  /* This is used only for DW_AT_data_member_location entries.  */
+  CORE_ADDR base = 0;
+  int base_p = 0;
 
   attr = dwarf2_attr (die, DW_AT_location, cu);
   if (attr)
@@ -5763,6 +5768,7 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
       if (attr_form_is_block (attr))
 	{
 	  base = decode_locdesc (DW_BLOCK (attr), cu);
+	  base_p = 1;
 	}
       else if (attr_form_is_section_offset (attr))
 	{
@@ -5824,12 +5830,15 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
 	      else
 		dwarf2_complex_location_expr_complaint ();
 
-	      SYMBOL_VALUE_ADDRESS (sym) = base + byte_offset;
+	      if (!base_p)
+		dwarf2_invalid_attrib_class_complaint
+		  ("DW_AT_data_member_location", "common block member");
+	      SYMBOL_VALUE_ADDRESS (sym) = base + byte_offset + baseaddr;
 	      add_symbol_to_list (sym, &global_symbols);
 	    }
 
 	  if (SYMBOL_CLASS (sym) == LOC_STATIC)
-	    SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym));
+	    SET_FIELD_PHYSADDR (*field, SYMBOL_VALUE_ADDRESS (sym) - baseaddr);
 	  else
 	    SET_FIELD_PHYSNAME (*field, SYMBOL_LINKAGE_NAME (sym));
 	  FIELD_TYPE (*field) = SYMBOL_TYPE (sym);
@@ -5843,7 +5852,7 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
 
       sym = new_symbol (die, type, cu);
       /* SYMBOL_VALUE_ADDRESS never gets used as all its fields are static.  */
-      SYMBOL_VALUE_ADDRESS (sym) = base;
+      SYMBOL_VALUE_ADDRESS (sym) = base + baseaddr;
 
       set_die_type (die, type, cu);
     }
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -32,6 +32,7 @@
 #include "exec.h"
 #include "observer.h"
 #include "arch-utils.h"
+#include "solib.h"
 
 #include <fcntl.h>
 #include "readline/readline.h"
@@ -220,6 +221,10 @@ exec_file_attach (char *filename, int from_tty)
       char *scratch_pathname;
       int scratch_chan;
       struct target_section *sections = NULL, *sections_end = NULL;
+      struct target_section *p;
+      int addr_bit;
+      CORE_ADDR mask = CORE_ADDR_MAX;
+      CORE_ADDR displacement;
 
       scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
 		   write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY,
@@ -288,12 +293,23 @@ exec_file_attach (char *filename, int from_tty)
 		 scratch_pathname, bfd_errmsg (bfd_get_error ()));
 	}
 
+      set_gdbarch_from_file (exec_bfd);
+
+      addr_bit = gdbarch_addr_bit (target_gdbarch);
+      if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
+	mask = ((CORE_ADDR) 1 << addr_bit) - 1;
+
+      displacement = solib_exec_displacement ();
+      for (p = sections; p < sections_end; p++)
+	{
+	  p->addr = (p->addr + displacement) & mask;
+	  p->endaddr = (p->endaddr + displacement) & mask;
+	}
+
       exec_bfd_mtime = bfd_get_mtime (exec_bfd);
 
       validate_files ();
 
-      set_gdbarch_from_file (exec_bfd);
-
       /* Add the executable's sections to the current address spaces'
 	 list of sections.  */
       add_target_sections (sections, sections_end);
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -966,6 +966,7 @@ extern void allocate_cplus_struct_type (struct type *);
 #define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind)
 #define FIELD_BITPOS(thisfld) ((thisfld).loc.bitpos)
 #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname)
+/* This address is unrelocated by the objfile's ANOFFSET.  */
 #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr)
 #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block)
 #define SET_FIELD_BITPOS(thisfld, bitpos)			\
@@ -974,6 +975,7 @@ extern void allocate_cplus_struct_type (struct type *);
 #define SET_FIELD_PHYSNAME(thisfld, name)			\
   (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME,		\
    FIELD_STATIC_PHYSNAME (thisfld) = (name))
+/* This address is unrelocated by the objfile's ANOFFSET.  */
 #define SET_FIELD_PHYSADDR(thisfld, addr)			\
   (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR,		\
    FIELD_STATIC_PHYSADDR (thisfld) = (addr))
@@ -989,6 +991,7 @@ extern void allocate_cplus_struct_type (struct type *);
 #define TYPE_FIELD_LOC_KIND(thistype, n) FIELD_LOC_KIND (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n))
+/* This address is unrelocated by the objfile's ANOFFSET.  */
 #define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_DWARF_BLOCK(thistype, n) FIELD_DWARF_BLOCK (TYPE_FIELD (thistype, n))
 #define TYPE_FIELD_ARTIFICIAL(thistype, n) FIELD_ARTIFICIAL(TYPE_FIELD(thistype,n))
--- a/gdb/jv-lang.c
+++ b/gdb/jv-lang.c
@@ -416,7 +416,8 @@ java_link_class_type (struct gdbarch *gdbarch,
 
   fields = NULL;
   nfields--;			/* First set up dummy "class" field. */
-  SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas));
+  SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas)
+    - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
   TYPE_FIELD_NAME (type, nfields) = "class";
   TYPE_FIELD_TYPE (type, nfields) = value_type (clas);
   SET_TYPE_FIELD_PRIVATE (type, nfields);
@@ -462,7 +463,8 @@ java_link_class_type (struct gdbarch *gdbarch,
 	  SET_TYPE_FIELD_PROTECTED (type, i);
 	}
       if (accflags & 0x0008)	/* ACC_STATIC */
-	SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset);
+	SET_FIELD_PHYSADDR (TYPE_FIELD (type, i), boffset
+	  - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
       else
 	TYPE_FIELD_BITPOS (type, i) = 8 * boffset;
       if (accflags & 0x8000)	/* FIELD_UNRESOLVED_FLAG */
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1672,15 +1672,20 @@ static CORE_ADDR
 svr4_exec_displacement (void)
 {
   int found;
+  /* ENTRY_POINT is a possible function descriptor - before
+     a call to gdbarch_convert_from_func_ptr_addr.  */
   CORE_ADDR entry_point;
 
   if (exec_bfd == NULL)
     return 0;
 
   if (target_auxv_search (&current_target, AT_ENTRY, &entry_point) == 1)
-    return entry_point - exec_entry_point (exec_bfd, &current_target);
+    return entry_point - bfd_get_start_address (exec_bfd);
 
-  return svr4_static_exec_displacement ();
+  if (!ptid_equal (inferior_ptid, null_ptid))
+    return svr4_static_exec_displacement ();
+
+  return 0;
 }
 
 /* Relocate the main executable.  This function should be called upon
@@ -1632,7 +1635,7 @@ svr4_exec_displacement (void)
 static void
 svr4_relocate_main_executable (void)
 {
-  CORE_ADDR displacement = svr4_exec_displacement ();
+  CORE_ADDR displacement = solib_exec_displacement ();
 
   /* Even if DISPLACEMENT is 0 still try to relocate it as this is a new
      difference of in-memory vs. in-file addresses and we could already
@@ -1975,6 +1978,7 @@ _initialize_svr4_solib (void)
   svr4_so_ops.free_so = svr4_free_so;
   svr4_so_ops.clear_solib = svr4_clear_solib;
   svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
+  svr4_so_ops.exec_displacement = svr4_exec_displacement;
   svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
   svr4_so_ops.current_sos = svr4_current_sos;
   svr4_so_ops.open_symbol_file_object = open_symbol_file_object;
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -1014,6 +1014,19 @@ solib_create_inferior_hook (int from_tty)
   ops->solib_create_inferior_hook (from_tty);
 }
 
+/* Query the difference of in-memory VMA addresses vs. exec_bfd VMAs.  */
+
+CORE_ADDR
+solib_exec_displacement (void)
+{
+  struct target_so_ops *ops = solib_ops (target_gdbarch);
+
+  if (ops->exec_displacement != NULL)
+    return (*ops->exec_displacement) ();
+  else
+    return 0;
+}
+
 /* GLOBAL FUNCTION
 
    in_solib_dynsym_resolve_code -- check to see if an address is in
--- a/gdb/solib.h
+++ b/gdb/solib.h
@@ -43,6 +43,8 @@ extern int solib_read_symbols (struct so_list *, int);
 
 extern void solib_create_inferior_hook (int from_tty);
 
+extern CORE_ADDR solib_exec_displacement (void);
+
 /* If ADDR lies in a shared library, return its name.  */
 
 extern char *solib_name_from_address (CORE_ADDR);
--- a/gdb/solist.h
+++ b/gdb/solist.h
@@ -89,6 +89,9 @@ struct target_so_ops
     /* Target dependent code to run after child process fork.  */
     void (*solib_create_inferior_hook) (int from_tty);
 
+    /* Query the difference of in-memory VMA addresses vs. exec_bfd VMAs.  */
+    CORE_ADDR (*exec_displacement) (void);
+
     /* Do additional symbol handling, lookup, etc. after symbols
        for a shared object have been loaded.  */
     void (*special_symbol_handling) (void);
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -873,15 +873,36 @@ syms_from_objfile (struct objfile *objfile,
      if an error occurs during symbol reading.  */
   old_chain = make_cleanup_free_objfile (objfile);
 
-  /* If ADDRS and OFFSETS are both NULL, put together a dummy address
-     list.  We now establish the convention that an addr of zero means
-     no load address was specified. */
+  /* If ADDRS and OFFSETS are both NULL, put together a dummy offset list.  */
+
   if (! addrs && ! offsets)
     {
-      local_addr
-	= alloc_section_addr_info (bfd_count_sections (objfile->obfd));
-      make_cleanup (xfree, local_addr);
-      addrs = local_addr;
+      /* Relocateble files have an exception in default_symfile_offsets which
+	 applies only for ADDRS.  But calling solib_exec_displacement is more
+	 suitable for OFFSETS.  Fortunately we never need the both
+	 functionalities simultaneously and in other cases zeroed ADDRS and
+	 zeroed OFFSETS are equivalent.  */
+
+      if ((bfd_get_file_flags (objfile->obfd) & (EXEC_P | DYNAMIC)) == 0)
+	{
+	  local_addr
+		 = alloc_section_addr_info (bfd_count_sections (objfile->obfd));
+	  make_cleanup (xfree, local_addr);
+	  addrs = local_addr;
+	}
+      else
+	{
+	  CORE_ADDR displacement = 0;
+	  int i;
+
+	  if (mainline)
+	    displacement = solib_exec_displacement ();
+
+	  num_offsets = bfd_count_sections (objfile->obfd);
+	  offsets = alloca (SIZEOF_N_SECTION_OFFSETS (num_offsets));
+	  for (i = 0; i < num_offsets; i++)
+	    offsets->offsets[i] = displacement;
+	}
     }
 
   /* Now either addrs or offsets is non-zero.  */
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1890,7 +1890,8 @@ value_static_field (struct type *type, int fieldno)
   if (TYPE_FIELD_LOC_KIND (type, fieldno) == FIELD_LOC_KIND_PHYSADDR)
     {
       retval = value_at (TYPE_FIELD_TYPE (type, fieldno),
-			 TYPE_FIELD_STATIC_PHYSADDR (type, fieldno));
+			 TYPE_FIELD_STATIC_PHYSADDR (type, fieldno)
+			   + (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
     }
   else
     {
@@ -1920,7 +1921,8 @@ value_static_field (struct type *type, int fieldno)
  	}
       if (retval && VALUE_LVAL (retval) == lval_memory)
 	SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno),
-			    value_address (retval));
+			    value_address (retval)
+			      - (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type)))));
     }
   return retval;
 }
--- gdb-7.0/gdb/testsuite/gdb.base/valgrind-db-attach.exp-orig	2009-12-21 16:50:42.000000000 +0100
+++ gdb-7.0/gdb/testsuite/gdb.base/valgrind-db-attach.exp	2009-12-21 16:51:24.000000000 +0100
@@ -67,6 +67,8 @@ gdb_test_multiple "" $test {
     }
 }
 
+gdb_test "" "" "eat first prompt"
+
 # Initialization from default_gdb_start.
 gdb_test "set height 0"
 gdb_test "set width 0"

gdb-archer-pie.patch:
 b/gdb/auxv.c                                    |  162 ++++++-
 b/gdb/auxv.h                                    |    6 
 b/gdb/breakpoint.c                              |    3 
 b/gdb/defs.h                                    |   15 
 b/gdb/exec.c                                    |   29 +
 b/gdb/infcmd.c                                  |   36 -
 b/gdb/infrun.c                                  |    2 
 b/gdb/linux-nat.c                               |    2 
 b/gdb/linux-tdep.c                              |   31 -
 b/gdb/nto-procfs.c                              |    4 
 b/gdb/objfiles.c                                |   54 ++
 b/gdb/procfs.c                                  |    2 
 b/gdb/solib-darwin.c                            |    2 
 b/gdb/solib-frv.c                               |    2 
 b/gdb/solib-irix.c                              |    4 
 b/gdb/solib-null.c                              |    2 
 b/gdb/solib-osf.c                               |    2 
 b/gdb/solib-pa64.c                              |    2 
 b/gdb/solib-som.c                               |    2 
 b/gdb/solib-spu.c                               |   26 -
 b/gdb/solib-sunos.c                             |    2 
 b/gdb/solib-svr4.c                              |  247 ++++++----
 b/gdb/solib-target.c                            |    2 
 b/gdb/solib.c                                   |   19 
 b/gdb/solib.h                                   |    2 
 b/gdb/solist.h                                  |    2 
 b/gdb/symfile.c                                 |  234 ++++++----
 b/gdb/symfile.h                                 |   10 
 b/gdb/symtab.c                                  |    7 
 b/gdb/testsuite/gdb.base/break-interp-lib.c     |   40 +
 b/gdb/testsuite/gdb.base/break-interp-main.c    |   30 +
 b/gdb/testsuite/gdb.base/break-interp.exp       |  545 ++++++++++++++++++++++++
 b/gdb/testsuite/gdb.base/corefile.exp           |   89 ---
 b/gdb/testsuite/gdb.base/valgrind-db-attach.c   |   30 +
 b/gdb/testsuite/gdb.base/valgrind-db-attach.exp |   74 +++
 b/gdb/testsuite/gdb.dwarf2/dw2-ranges.exp       |    6 
 b/gdb/testsuite/lib/gdb.exp                     |   79 +++
 gdb/testsuite/gdb.base/pie-support.c            |   34 -
 gdb/testsuite/gdb.base/pie-support.exp          |   58 --
 39 files changed, 1430 insertions(+), 468 deletions(-)

--- NEW FILE gdb-archer-pie.patch ---
http://sourceware.org/gdb/wiki/ProjectArcher
http://sourceware.org/gdb/wiki/ArcherBranchManagement

archer-jankratochvil-pie-fedora12
GIT snapshot:
commit 2ae60b5156d43aabfe5757940eaf7b4370fb05d2


diff --git a/gdb/auxv.c b/gdb/auxv.c
index 7b4ecbe..7df8eb5 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -25,6 +25,7 @@
 #include "inferior.h"
 #include "valprint.h"
 #include "gdb_assert.h"
+#include "gdbcore.h"
 
 #include "auxv.h"
 #include "elf/common.h"
@@ -33,15 +34,11 @@
 #include <fcntl.h>
 
 
-/* This function is called like a to_xfer_partial hook, but must be
-   called with TARGET_OBJECT_AUXV.  It handles access via
-   /proc/PID/auxv, which is a common method for native targets.  */
+/* This function handles access via /proc/PID/auxv, which is a common method
+   for native targets.  */
 
-LONGEST
-procfs_xfer_auxv (struct target_ops *ops,
-		  enum target_object object,
-		  const char *annex,
-		  gdb_byte *readbuf,
+static LONGEST
+procfs_xfer_auxv (gdb_byte *readbuf,
 		  const gdb_byte *writebuf,
 		  ULONGEST offset,
 		  LONGEST len)
@@ -50,9 +47,6 @@ procfs_xfer_auxv (struct target_ops *ops,
   int fd;
   LONGEST n;
 
-  gdb_assert (object == TARGET_OBJECT_AUXV);
-  gdb_assert (readbuf || writebuf);
-
   pathname = xstrprintf ("/proc/%d/auxv", PIDGET (inferior_ptid));
   fd = open (pathname, writebuf != NULL ? O_WRONLY : O_RDONLY);
   xfree (pathname);
@@ -72,6 +66,152 @@ procfs_xfer_auxv (struct target_ops *ops,
   return n;
 }
 
+/* This function handles access via ld.so's symbol `_dl_auxv'.  */
+
+static LONGEST
+ld_so_xfer_auxv (gdb_byte *readbuf,
+		 const gdb_byte *writebuf,
+		 ULONGEST offset,
+		 LONGEST len)
+{
+  struct minimal_symbol *msym;
+  CORE_ADDR data_address, pointer_address;
+  struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
+  size_t ptr_size = TYPE_LENGTH (ptr_type);
+  size_t auxv_pair_size = 2 * ptr_size;
+  gdb_byte *ptr_buf = alloca (ptr_size);
+  LONGEST retval;
+  size_t block;
+
+  msym = lookup_minimal_symbol ("_dl_auxv", NULL, NULL);
+  if (msym == NULL)
+    return -1;
+
+  if (MSYMBOL_SIZE (msym) != ptr_size)
+    return -1;
+
+  /* POINTER_ADDRESS is a location where the `_dl_auxv' variable resides.
+     DATA_ADDRESS is the inferior value present in `_dl_auxv', therefore the
+     real inferior AUXV address.  */
+
+  pointer_address = SYMBOL_VALUE_ADDRESS (msym);
+
+  data_address = read_memory_typed_address (pointer_address, ptr_type);
+
+  /* Possibly still not initialized such as during an inferior startup.  */
+  if (data_address == 0)
+    return -1;
+
+  data_address += offset;
+
+  if (writebuf != NULL)
+    {
+      if (target_write_memory (data_address, writebuf, len) == 0)
+	return len;
+      else
+	return -1;
+    }
+
+  /* Stop if trying to read past the existing AUXV block.  The final AT_NULL
+     was already returned before.  */
+
+  if (offset >= auxv_pair_size)
+    {
+      if (target_read_memory (data_address - auxv_pair_size, ptr_buf,
+			      ptr_size) != 0)
+	return -1;
+
+      if (extract_typed_address (ptr_buf, ptr_type) == AT_NULL)
+	return 0;
+    }
+
+  retval = 0;
+  block = 0x400;
+  gdb_assert (block % auxv_pair_size == 0);
+
+  while (len > 0)
+    {
+      if (block > len)
+	block = len;
+
+      /* Reading sizes smaller than AUXV_PAIR_SIZE is not supported.  Tails
+	 unaligned to AUXV_PAIR_SIZE will not be read during a call (they
+	 should be completed during next read with new/extended buffer).  */
+
+      block &= -auxv_pair_size;
+      if (block == 0)
+	return retval;
+
+      if (target_read_memory (data_address, readbuf, block) != 0)
+	{
+	  if (block <= auxv_pair_size)
+	    return retval;
+
+	  block = auxv_pair_size;
+	  continue;
+	}
+
+      data_address += block;
+      len -= block;
+
+      /* Check terminal AT_NULL.  This function is being called indefinitely
+         being extended its READBUF until it returns EOF (0).  */
+
+      while (block >= auxv_pair_size)
+	{
+	  retval += auxv_pair_size;
+
+	  if (extract_typed_address (readbuf, ptr_type) == AT_NULL)
+	    return retval;
+
+	  readbuf += auxv_pair_size;
+	  block -= auxv_pair_size;
+	}
+    }
+
+  return retval;
+}
+
+/* This function is called like a to_xfer_partial hook, but must be
+   called with TARGET_OBJECT_AUXV.  It handles access to AUXV.  */
+
+LONGEST
+memory_xfer_auxv (struct target_ops *ops,
+		  enum target_object object,
+		  const char *annex,
+		  gdb_byte *readbuf,
+		  const gdb_byte *writebuf,
+		  ULONGEST offset,
+		  LONGEST len)
+{
+  /* Workaround gdb-7.0 bug where linux_nat_xfer_partial() does
+       inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
+     and current_inferior() assertion fails not finding the LWP->PID.
+     It got fixed post-gdb-7.0 by:
+       Add base multi-executable/process support to GDB.
+       40ff0a289e6165aa930af284df5c52162cb0cd5f
+     by introducing `current_inferior_'.  */
+  struct inferior *inf = find_inferior_pid (ptid_get_pid (inferior_ptid));
+
+  gdb_assert (object == TARGET_OBJECT_AUXV);
+  gdb_assert (readbuf || writebuf);
+
+   /* ld_so_xfer_auxv is the only function safe for virtual executables being
+      executed by valgrind's memcheck.  As using ld_so_xfer_auxv is problematic
+      during inferior startup GDB does call it only for attached processes.  */
+
+  if (inf == NULL || inf->attach_flag != 0)
+    {
+      LONGEST retval;
+
+      retval = ld_so_xfer_auxv (readbuf, writebuf, offset, len);
+      if (retval != -1)
+	return retval;
+    }
+
+  return procfs_xfer_auxv (readbuf, writebuf, offset, len);
+}
[...2248 lines suppressed...]
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/valgrind-db-attach.exp b/gdb/testsuite/gdb.base/valgrind-db-attach.exp
new file mode 100644
index 0000000..ac06fd3
--- /dev/null
+++ b/gdb/testsuite/gdb.base/valgrind-db-attach.exp
@@ -0,0 +1,74 @@
+# Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+set test valgrind-db-attach
+set srcfile $test.c
+set executable $test
+set binfile ${objdir}/${subdir}/${executable}
+if {[build_executable $test.exp $executable $srcfile {debug}] == -1} {
+    return -1
+}
+
+gdb_exit
+
+# remote_spawn breaks the command on each whitespace despite possible quoting.
+# Use backslash-escaped whitespace there instead:
+
+set db_command "--db-command=$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts] %f %p"
+regsub -all " " $db_command "\\ " db_command
+
+set test "spawn valgrind"
+set cmd "valgrind --db-attach=yes $db_command $binfile"
+set res [remote_spawn host $cmd];
+if { $res < 0 || $res == "" } {
+    verbose -log "Spawning $cmd failed."
+    setup_xfail *-*-*
+    fail $test
+    return -1
+}
+pass $test
+# Declare GDB now as running.
+set gdb_spawn_id -1
+
+set test "valgrind started"
+# The trailing '.' differs for different memcheck versions.
+gdb_test_multiple "" $test {
+    -re "Memcheck, a memory error detector\\.?\r\n" {
+	pass $test
+    }
+    -re "valgrind: failed to start tool 'memcheck' for platform '.*': No such file or directory" {
+	setup_xfail *-*-*
+	fail $test
+	return -1
+    }
+}
+
+set double_free [gdb_get_line_number "double-free"]
+
+gdb_test_multiple "" $test {
+    -re "Invalid free\\(\\) / delete / delete\\\[\\\]\r\n.*: main \\(${srcfile}:$double_free\\)\r\n.*---- Attach to debugger \\? --- \[^\r\n\]* ---- " {
+	send_gdb "y\r"
+    }
+    -re "---- Attach to debugger \\? --- \[^\r\n\]* ---- " {
+	send_gdb "n\r"
+	exp_continue
+    }
+}
+
+# Initialization from default_gdb_start.
+gdb_test "set height 0"
+gdb_test "set width 0"
+
+gdb_test "bt" "in main \\(.*\\) at .*${srcfile}:$double_free"
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges.exp b/gdb/testsuite/gdb.dwarf2/dw2-ranges.exp
index 61e1fe4..9109030 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ranges.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges.exp
@@ -55,6 +55,12 @@ gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
 
+# Test also objfile->psymtabs_addrmap relocations for -fPIE -pie builds below.
+# On some targets it may possibly fail but the program is being started only
+# for the PIE build so try it anyway.
+
+runto_main
+
 # Correct output:
 # 	Line 39 of "../.././gdb/testsuite/gdb.dwarf2/dw2-ranges.S" starts at address 0x4 and ends at 0x8.
 # Wrong output:
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index d0c3493..fbf9124 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -2778,6 +2778,11 @@ proc gdb_gnu_strip_debug { dest args } {
       return 1
     }
 
+    # Workaround PR binutils/10802:
+    # Preserve the 'x' bit also for PIEs (Position Independent Executables).
+    set perm [file attributes ${dest} -permissions]
+    file attributes ${stripped_file} -permissions $perm
+
     # Get rid of everything but the debug info, and store result in debug_file
     # This will be in the .debug subdirectory, see above.
     set result [catch "exec $strip_to_file_program --only-keep-debug ${dest} -o ${debug_file}" output]
@@ -2814,7 +2819,12 @@ proc gdb_gnu_strip_debug { dest args } {
       return 1
     }
 
-   return 0
+    # Workaround PR binutils/10802:
+    # Preserve the 'x' bit also for PIEs (Position Independent Executables).
+    set perm [file attributes ${stripped_file} -permissions]
+    file attributes ${dest} -permissions $perm
+
+    return 0
 }
 
 # Test the output of GDB_COMMAND matches the pattern obtained
@@ -3043,3 +3053,70 @@ if {[info exists TRANSCRIPT]} {
     return [uplevel real_send_gdb $args]
   }
 }
+
+proc core_find {binfile {deletefiles {}} {arg ""}} {
+    global objdir subdir
+
+    set destcore "$binfile.core"
+    file delete $destcore
+
+    # Create a core file named "$destcore" rather than just "core", to
+    # avoid problems with sys admin types that like to regularly prune all
+    # files named "core" from the system.
+    #
+    # Arbitrarily try setting the core size limit to "unlimited" since
+    # this does not hurt on systems where the command does not work and
+    # allows us to generate a core on systems where it does.
+    #
+    # Some systems append "core" to the name of the program; others append
+    # the name of the program to "core"; still others (like Linux, as of
+    # May 2003) create cores named "core.PID".  In the latter case, we
+    # could have many core files lying around, and it may be difficult to
+    # tell which one is ours, so let's run the program in a subdirectory.
+    set found 0
+    set coredir "${objdir}/${subdir}/coredir.[getpid]"
+    file mkdir $coredir
+    catch "system \"(cd ${coredir}; ulimit -c unlimited; ${binfile} ${arg}; true) >/dev/null 2>&1\""
+    #      remote_exec host "${binfile}"
+    foreach i "${coredir}/core ${coredir}/core.coremaker.c ${binfile}.core" {
+	if [remote_file build exists $i] {
+	    remote_exec build "mv $i $destcore"
+	    set found 1
+	}
+    }
+    # Check for "core.PID".
+    if { $found == 0 } {
+	set names [glob -nocomplain -directory $coredir core.*]
+	if {[llength $names] == 1} {
+	    set corefile [file join $coredir [lindex $names 0]]
+	    remote_exec build "mv $corefile $destcore"
+	    set found 1
+	}
+    }
+    if { $found == 0 } {
+	# The braindamaged HPUX shell quits after the ulimit -c above
+	# without executing ${binfile}.  So we try again without the
+	# ulimit here if we didn't find a core file above.
+	# Oh, I should mention that any "braindamaged" non-Unix system has
+	# the same problem. I like the cd bit too, it's really neat'n stuff.
+	catch "system \"(cd ${objdir}/${subdir}; ${binfile}; true) >/dev/null 2>&1\""
+	foreach i "${objdir}/${subdir}/core ${objdir}/${subdir}/core.coremaker.c ${binfile}.core" {
+	    if [remote_file build exists $i] {
+		remote_exec build "mv $i $destcore"
+		set found 1
+	    }
+	}
+    }
+
+    # Try to clean up after ourselves. 
+    foreach deletefile $deletefiles {
+	remote_file build delete [file join $coredir $deletefile]
+    }
+    remote_exec build "rmdir $coredir"
+	
+    if { $found == 0  } {
+	warning "can't generate a core file - core tests suppressed - check ulimit -c"
+	return ""
+    }
+    return $destcore
+}

gdb-bitfield-check_typedef.patch:
 testsuite/gdb.mi/var-cmd.c |    2 +-
 value.c                    |   11 ++++++++---
 2 files changed, 9 insertions(+), 4 deletions(-)

--- NEW FILE gdb-bitfield-check_typedef.patch ---
http://sourceware.org/ml/gdb-patches/2010-01/msg00030.html
Subject: [patch] Re: Regression: field type preservation: 7.0 -> 7.0.1+HEAD

On Friday 01 January 2010 21:45:05 Jan Kratochvil wrote:
> -PASS: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
> +FAIL: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
> -PASS: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
> +FAIL: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
> -PASS: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
> +FAIL: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
> 
> due to:
> Re: RFA: unbreak typedefed bitfield
> http://sourceware.org/ml/gdb-patches/2009-12/msg00295.html
> commit fc85da4ee2a7c32afc53b1b334a4f84e2e9bd84e
> http://sourceware.org/ml/gdb-cvs/2009-12/msg00100.html

attached a fix on top of existing HEAD.

Original PR gdb/10884 was a regression 6.8 -> 7.0 due to:
RFC: Lazy bitfields
http://sourceware.org/ml/gdb-patches/2009-07/msg00437.html
http://sourceware.org/ml/gdb-cvs/2009-07/msg00143.html
07491b3409f6ace0b7a9a707775a56ce10fece1c

No regressions for HEAD on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.  Plus:
-FAIL: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
+PASS: gdb.mi/mi-var-child.exp: get children of struct_declarations.s2.u2.u1s1
-FAIL: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
+PASS: gdb.mi/mi2-var-child.exp: get children of struct_declarations.s2.u2.u1s1
-FAIL: gdb.python/py-mi.exp: examine container children=0, no pretty-printing
+PASS: gdb.python/py-mi.exp: examine container children=0, no pretty-printing

Going to check it in also for gdb_7_0-branch after an approval.


Thanks,
Jan


gdb/
2010-01-02  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* value.c (value_primitive_field): Remove one check_typedef call.
	Move bitpos and container_bitsize initialization after
	allocate_value_lazy.  New comment before accessing TYPE_LENGTH.

gdb/testsuite/
2010-01-02  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.mi/var-cmd.c (do_bitfield_tests): Change "V.sharable" type to
	"uint_for_mi_testing".

--- a/gdb/testsuite/gdb.mi/var-cmd.c
+++ b/gdb/testsuite/gdb.mi/var-cmd.c
@@ -494,7 +494,7 @@ void do_bitfield_tests ()
     mi_create_varobj V d "create varobj for Data"
     mi_list_varobj_children "V" {
         {"V.alloc" "alloc" "0" "int"}
-        {"V.sharable" "sharable" "0" "unsigned int"}
+        {"V.sharable" "sharable" "0" "uint_for_mi_testing"}
     } "list children of Data"
     mi_check_varobj_value V.sharable 3 "access bitfield"
     :*/
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1873,7 +1873,6 @@ value_primitive_field (struct value *arg1, int offset,
 
   CHECK_TYPEDEF (arg_type);
   type = TYPE_FIELD_TYPE (arg_type, fieldno);
-  type = check_typedef (type);
 
   /* Handle packed fields */
 
@@ -1885,10 +1884,14 @@ value_primitive_field (struct value *arg1, int offset,
 	 Otherwise, adjust offset to the byte containing the first
 	 bit.  Assume that the address, offset, and embedded offset
 	 are sufficiently aligned.  */
-      int bitpos = TYPE_FIELD_BITPOS (arg_type, fieldno);
-      int container_bitsize = TYPE_LENGTH (type) * 8;
+      int bitpos, container_bitsize;
 
       v = allocate_value_lazy (type);
+
+      /* TYPE_LENGTH of TYPE gets initialized by allocate_value_lazy.  */
+      bitpos = TYPE_FIELD_BITPOS (arg_type, fieldno);
+      container_bitsize = TYPE_LENGTH (type) * 8;
+
       v->bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno);
       if ((bitpos % container_bitsize) + v->bitsize <= container_bitsize
 	  && TYPE_LENGTH (type) <= (int) sizeof (LONGEST))
@@ -1939,6 +1942,8 @@ value_primitive_field (struct value *arg1, int offset,
       else
 	{
 	  v = allocate_value (type);
+
+	  /* TYPE_LENGTH of TYPE gets initialized by allocate_value.  */
 	  memcpy (value_contents_raw (v),
 		  value_contents_raw (arg1) + offset,
 		  TYPE_LENGTH (type));


gdb-bz528668-symfile-cleanup.patch:
 symfile.c |   59 ++++++++++++++++++++---------------------------------------
 1 file changed, 20 insertions(+), 39 deletions(-)

--- NEW FILE gdb-bz528668-symfile-cleanup.patch ---
http://sourceware.org/ml/gdb-patches/2009-10/msg00509.html
Subject: [patch 2/3] find_separate_debug_file cleanup

Hi,

current code was:
* difficult to maintain as a new variable required xfree on many places
* was causing memory corruptions due to silently misapplied 3rd party patches
  as the close code fragments unfortunately match patch context


Thanks,
Jan


gdb/
2009-10-21  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* symfile.c (find_separate_debug_file): Initialize dir, debugfile and
	canon_name to NULL.  Change alloca to xmalloc, newly call xfree for it.
	New label cleanup_return_debugfile, jump to it from the failure paths.

--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1333,11 +1333,10 @@ static char *
 find_separate_debug_file (struct objfile *objfile)
 {
   asection *sect;
-  char *basename;
-  char *dir;
-  char *debugfile;
-  char *name_copy;
-  char *canon_name;
+  char *basename, *name_copy;
+  char *dir = NULL;
+  char *debugfile = NULL;
+  char *canon_name = NULL;
   bfd_size_type debuglink_size;
   unsigned long crc32;
   int i;
@@ -1366,7 +1365,7 @@ find_separate_debug_file (struct objfile *objfile)
   if (basename == NULL)
     /* There's no separate debug info, hence there's no way we could
        load it => no warning.  */
-    return NULL;
+    goto cleanup_return_debugfile;
 
   dir = xstrdup (objfile->name);
 
@@ -1388,24 +1387,19 @@ find_separate_debug_file (struct objfile *objfile)
   if (canon_name && strlen (canon_name) > i)
     i = strlen (canon_name);
 
-  debugfile = alloca (strlen (debug_file_directory) + 1
-                      + i
-                      + strlen (DEBUG_SUBDIRECTORY)
-                      + strlen ("/")
-                      + strlen (basename)
-                      + 1);
+  debugfile = xmalloc (strlen (debug_file_directory) + 1
+		       + i
+		       + strlen (DEBUG_SUBDIRECTORY)
+		       + strlen ("/")
+		       + strlen (basename)
+		       + 1);
 
   /* First try in the same directory as the original file.  */
   strcpy (debugfile, dir);
   strcat (debugfile, basename);
 
   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-    {
-      xfree (basename);
-      xfree (dir);
-      xfree (canon_name);
-      return xstrdup (debugfile);
-    }
+    goto cleanup_return_debugfile;
 
   /* Then try in the subdirectory named DEBUG_SUBDIRECTORY.  */
   strcpy (debugfile, dir);
@@ -1414,12 +1408,7 @@ find_separate_debug_file (struct objfile *objfile)
   strcat (debugfile, basename);
 
   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-    {
-      xfree (basename);
-      xfree (dir);
-      xfree (canon_name);
-      return xstrdup (debugfile);
-    }
+    goto cleanup_return_debugfile;
 
   /* Then try in the global debugfile directory.  */
   strcpy (debugfile, debug_file_directory);
@@ -1428,12 +1417,7 @@ find_separate_debug_file (struct objfile *objfile)
   strcat (debugfile, basename);
 
   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-    {
-      xfree (basename);
-      xfree (dir);
-      xfree (canon_name);
-      return xstrdup (debugfile);
-    }
+    goto cleanup_return_debugfile;
 
   /* If the file is in the sysroot, try using its base path in the
      global debugfile directory.  */
@@ -1447,20 +1431,17 @@ find_separate_debug_file (struct objfile *objfile)
       strcat (debugfile, basename);
 
       if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-	{
-	  xfree (canon_name);
-	  xfree (basename);
-	  xfree (dir);
-	  return xstrdup (debugfile);
-	}
+	goto cleanup_return_debugfile;
     }
   
-  if (canon_name)
-    xfree (canon_name);
+  xfree (debugfile);
+  debugfile = NULL;
 
+cleanup_return_debugfile:
+  xfree (canon_name);
   xfree (basename);
   xfree (dir);
-  return NULL;
+  return debugfile;
 }
 
 


gdb-bz528668-symfile-multi.patch:
 doc/gdb.texinfo                 |   13 ++-
 symfile.c                       |  134 ++++++++++++++++++++++++++--------------
 testsuite/gdb.base/sepdebug.exp |    6 +
 3 files changed, 103 insertions(+), 50 deletions(-)

--- NEW FILE gdb-bz528668-symfile-multi.patch ---
http://sourceware.org/ml/gdb-patches/2009-10/msg00508.html
Subject: [patch 3/3] debug-file-directory with multiple components

Hi,

for various reasons `debug-file-directory' would be sometimes useful to have
multiple components such as `solib-search-path' has.

I found it useful myself during various separate debuginfo tests/scripts.

It was requested for the ABRT bugreporting project at the preceding mail of:
	https://fedorahosted.org/pipermail/crash-catcher/2009-October/000054.html

It should be a backward compatible extension as DIRNAME_SEPARATOR should never
be a valid part of a single DEBUG_FILE_DIRECTORY component.


Thanks,
Jan


gdb/doc/
2009-10-22  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.texinfo (set debug-file-directory, show debug-file-directory)
	(Auto-loading): Use plural and note one can use multiple components now.

gdb/
2009-10-22  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* symfile.c (build_id_to_debug_filename): New variable debugdir.  Move
	variables size, s and data into a new inner block.  Change xmalloc for
	alloca, use direct BUILDID->SIZE there now.  Loop for the
	DEBUG_FILE_DIRECTORY components.
	(find_separate_debug_file): New variable debugdir and debugdir_end.
	Loop for the DEBUG_FILE_DIRECTORY components.
	(_initialize_symfile): For "debug-file-directory" use plural and note
	one can use multiple components now.

gdb/testsuite/
2009-10-22  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.base/sepdebug.exp: New test_different_dir call for multiple-dirs.

--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -14066,13 +14066,14 @@ name @value{GDBN} is currently using.
 @table @code
 
 @kindex set debug-file-directory
- at item set debug-file-directory @var{directory}
-Set the directory which @value{GDBN} searches for separate debugging
-information files to @var{directory}.
+ at item set debug-file-directory @var{directories}
+Set the directories which @value{GDBN} searches for separate debugging
+information files to @var{directory}.  Multiple directory components can be set
+concatenating them by a directory separator.
 
 @kindex show debug-file-directory
 @item show debug-file-directory
-Show the directory @value{GDBN} searches for separate debugging
+Show the directories @value{GDBN} searches for separate debugging
 information files.
 
 @end table
@@ -19336,8 +19337,8 @@ readable, @value{GDBN} will evaluate it as a Python script.
 
 If this file does not exist, and if the parameter
 @code{debug-file-directory} is set (@pxref{Separate Debug Files}),
-then @value{GDBN} will use the file named
- at file{@var{debug-file-directory}/@var{real-name}}, where
+then @value{GDBN} will use for its each separated directory component
+ at code{component} the file named @file{@code{component}/@var{real-name}}, where
 @var{real-name} is the object file's real name, as described above.
 
 Finally, if this file does not exist, then @value{GDBN} will look for
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1218,35 +1218,59 @@ build_id_verify (const char *filename, struct build_id *check)
 static char *
 build_id_to_debug_filename (struct build_id *build_id)
 {
-  char *link, *s, *retval = NULL;
-  gdb_byte *data = build_id->data;
-  size_t size = build_id->size;
+  char *link, *debugdir, *retval = NULL;
 
   /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
-  link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
-		  + 2 * size + (sizeof ".debug" - 1) + 1);
-  s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
-  if (size > 0)
-    {
-      size--;
-      s += sprintf (s, "%02x", (unsigned) *data++);
-    }
-  if (size > 0)
-    *s++ = '/';
-  while (size-- > 0)
-    s += sprintf (s, "%02x", (unsigned) *data++);
-  strcpy (s, ".debug");
-
-  /* lrealpath() is expensive even for the usually non-existent files.  */
-  if (access (link, F_OK) == 0)
-    retval = lrealpath (link);
-  xfree (link);
-
-  if (retval != NULL && !build_id_verify (retval, build_id))
+  link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
+		 + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
+
+  /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
+     cause "/.build-id/..." lookups.  */
+
+  debugdir = debug_file_directory;
+  do
     {
-      xfree (retval);
-      retval = NULL;
+      char *s, *debugdir_end;
+      gdb_byte *data = build_id->data;
+      size_t size = build_id->size;
+
+      while (*debugdir == DIRNAME_SEPARATOR)
+	debugdir++;
+
+      debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
+      if (debugdir_end == NULL)
+	debugdir_end = &debugdir[strlen (debugdir)];
+
+      memcpy (link, debugdir, debugdir_end - debugdir);
+      s = &link[debugdir_end - debugdir];
+      s += sprintf (s, "/.build-id/");
+      if (size > 0)
+	{
+	  size--;
+	  s += sprintf (s, "%02x", (unsigned) *data++);
+	}
+      if (size > 0)
+	*s++ = '/';
+      while (size-- > 0)
+	s += sprintf (s, "%02x", (unsigned) *data++);
+      strcpy (s, ".debug");
+
+      /* lrealpath() is expensive even for the usually non-existent files.  */
+      if (access (link, F_OK) == 0)
+	retval = lrealpath (link);
+
+      if (retval != NULL && !build_id_verify (retval, build_id))
+	{
+	  xfree (retval);
+	  retval = NULL;
+	}
+
+      if (retval != NULL)
+	break;
+
+      debugdir = debugdir_end;
     }
+  while (*debugdir != 0);
 
   return retval;
 }
@@ -1333,7 +1357,7 @@ static char *
 find_separate_debug_file (struct objfile *objfile)
 {
   asection *sect;
-  char *basename, *name_copy;
+  char *basename, *name_copy, *debugdir;
   char *dir = NULL;
   char *debugfile = NULL;
   char *canon_name = NULL;
@@ -1410,29 +1434,51 @@ find_separate_debug_file (struct objfile *objfile)
   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
     goto cleanup_return_debugfile;
 
-  /* Then try in the global debugfile directory.  */
-  strcpy (debugfile, debug_file_directory);
-  strcat (debugfile, "/");
-  strcat (debugfile, dir);
-  strcat (debugfile, basename);
-
-  if (separate_debug_file_exists (debugfile, crc32, objfile->name))
-    goto cleanup_return_debugfile;
+  /* Then try in the global debugfile directories.
+ 
+     Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
+     cause "/..." lookups.  */
 
-  /* If the file is in the sysroot, try using its base path in the
-     global debugfile directory.  */
-  if (canon_name
-      && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0
-      && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)]))
+  debugdir = debug_file_directory;
+  do
     {
-      strcpy (debugfile, debug_file_directory);
-      strcat (debugfile, canon_name + strlen (gdb_sysroot));
+      char *debugdir_end;
+
+      while (*debugdir == DIRNAME_SEPARATOR)
+	debugdir++;
+
+      debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR);
+      if (debugdir_end == NULL)
+	debugdir_end = &debugdir[strlen (debugdir)];
+
+      memcpy (debugfile, debugdir, debugdir_end - debugdir);
+      debugfile[debugdir_end - debugdir] = 0;
       strcat (debugfile, "/");
+      strcat (debugfile, dir);
       strcat (debugfile, basename);
 
       if (separate_debug_file_exists (debugfile, crc32, objfile->name))
 	goto cleanup_return_debugfile;
+
+      /* If the file is in the sysroot, try using its base path in the
+	 global debugfile directory.  */
+      if (canon_name
+	  && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0
+	  && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)]))
+	{
+	  memcpy (debugfile, debugdir, debugdir_end - debugdir);
+	  debugfile[debugdir_end - debugdir] = 0;
+	  strcat (debugfile, canon_name + strlen (gdb_sysroot));
+	  strcat (debugfile, "/");
+	  strcat (debugfile, basename);
+
+	  if (separate_debug_file_exists (debugfile, crc32, objfile->name))
+	    goto cleanup_return_debugfile;
+	}
+
+      debugdir = debugdir_end;
     }
+  while (*debugdir != 0);
   
   xfree (debugfile);
   debugfile = NULL;
@@ -4173,12 +4219,12 @@ Usage: set extension-language .foo bar"),
 
   add_setshow_optional_filename_cmd ("debug-file-directory", class_support,
 				     &debug_file_directory, _("\
-Set the directory where separate debug symbols are searched for."), _("\
-Show the directory where separate debug symbols are searched for."), _("\
+Set the directories where separate debug symbols are searched for."), _("\
+Show the directories where separate debug symbols are searched for."), _("\
 Separate debug symbols are first searched for in the same\n\
 directory as the binary, then in the `" DEBUG_SUBDIRECTORY "' subdirectory,\n\
 and lastly at the path of the directory of the binary with\n\
-the global debug-file directory prepended."),
+each global debug-file-directory component prepended."),
 				     NULL,
 				     show_debug_file_directory,
 				     &setlist, &showlist);
--- a/gdb/testsuite/gdb.base/sepdebug.exp
+++ b/gdb/testsuite/gdb.base/sepdebug.exp
@@ -995,6 +995,12 @@ if ![string compare $build_id_debug_filename ""] then {
 
     test_different_dir build-id "${objdir}/${subdir}" $xfail
 
+    # Test also multiple directories can be specified.  Without the build-id
+    # reference GDB would find the separate debug info just at the same
+    # location as the executable file.
+
+    test_different_dir multiple-dirs "/doesnotexist:${objdir}/${subdir}" $xfail
+
     # Spare debug files may confuse testsuite runs in the future.
     remote_exec build "rm -f ${objdir}/${subdir}/${build_id_debug_filename}"
 }


gdb-bz528668-symfile-sepcrc.patch:
 b/gdb/testsuite/gdb.base/sepdebug2.c |   22 ++++++++++++++++++++++
 gdb/symfile.c                        |   23 +++++++++++++++++------
 gdb/testsuite/gdb.base/sepdebug.exp  |   17 +++++++++++++++++
 3 files changed, 56 insertions(+), 6 deletions(-)

--- NEW FILE gdb-bz528668-symfile-sepcrc.patch ---
http://sourceware.org/ml/gdb-patches/2009-10/msg00507.html
Subject: [patch 1/3] print the .debug file name having CRC mismatch

Hi,

this patch is left as is from Andrew Cagney.


Thanks,
Jan


gdb/
2005-04-02  Andrew Cagney  <cagney at gnu.org>

	* symfile.c (separate_debug_file_exists): When the CRCs mismatch
	print a warning.
	(find_separate_debug_file): Pass in the objfile's name.

gdb/testsuite/
2009-10-21  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.base/sepdebug.exp (CRC mismatch is reported): New test.
	* gdb.base/sepdebug2.c: New file.

--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1283,7 +1283,8 @@ get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
 }
 
 static int
-separate_debug_file_exists (const char *name, unsigned long crc)
+separate_debug_file_exists (const char *name, unsigned long crc,
+			    const char *parent_name)
 {
   unsigned long file_crc = 0;
   bfd *abfd;
@@ -1303,7 +1304,15 @@ separate_debug_file_exists (const char *name, unsigned long crc)
 
   bfd_close (abfd);
 
-  return crc == file_crc;
+  if (crc != file_crc)
+    {
+      warning (_("the debug information found in \"%s\""
+		 " does not match \"%s\" (CRC mismatch).\n"),
+	       name, parent_name);
+      return 0;
+    }
+
+  return 1;
 }
 
 char *debug_file_directory = NULL;
@@ -1355,6 +1364,8 @@ find_separate_debug_file (struct objfile *objfile)
   basename = get_debug_link_info (objfile, &crc32);
 
   if (basename == NULL)
+    /* There's no separate debug info, hence there's no way we could
+       load it => no warning.  */
     return NULL;
 
   dir = xstrdup (objfile->name);
@@ -1388,7 +1399,7 @@ find_separate_debug_file (struct objfile *objfile)
   strcpy (debugfile, dir);
   strcat (debugfile, basename);
 
-  if (separate_debug_file_exists (debugfile, crc32))
+  if (separate_debug_file_exists (debugfile, crc32, objfile->name))
     {
       xfree (basename);
       xfree (dir);
@@ -1402,7 +1413,7 @@ find_separate_debug_file (struct objfile *objfile)
   strcat (debugfile, "/");
   strcat (debugfile, basename);
 
-  if (separate_debug_file_exists (debugfile, crc32))
+  if (separate_debug_file_exists (debugfile, crc32, objfile->name))
     {
       xfree (basename);
       xfree (dir);
@@ -1416,7 +1427,7 @@ find_separate_debug_file (struct objfile *objfile)
   strcat (debugfile, dir);
   strcat (debugfile, basename);
 
-  if (separate_debug_file_exists (debugfile, crc32))
+  if (separate_debug_file_exists (debugfile, crc32, objfile->name))
     {
       xfree (basename);
       xfree (dir);
@@ -1435,7 +1446,7 @@ find_separate_debug_file (struct objfile *objfile)
       strcat (debugfile, "/");
       strcat (debugfile, basename);
 
-      if (separate_debug_file_exists (debugfile, crc32))
+      if (separate_debug_file_exists (debugfile, crc32, objfile->name))
 	{
 	  xfree (canon_name);
 	  xfree (basename);
--- a/gdb/testsuite/gdb.base/sepdebug.exp
+++ b/gdb/testsuite/gdb.base/sepdebug.exp
@@ -952,6 +952,23 @@ set debugfile "${objdir}/${subdir}/${testfile}.debug"
 test_different_dir debuglink "${objdir}/${subdir}" 0
 
 
+# Test CRC mismatch is reported.
+
+if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1
+    && ![gdb_gnu_strip_debug ${objdir}/${subdir}/sepdebug2]} {
+
+    remote_exec build "cp ${debugfile} ${objdir}/${subdir}/.debug/sepdebug2.debug"
+
+    gdb_exit
+    gdb_start
+    gdb_reinitialize_dir $srcdir/$subdir
+
+    set escapedobjdirsubdir [string_to_regexp ${objdir}/${subdir}]
+
+    gdb_test "file ${objdir}/${subdir}/sepdebug2" "warning: the debug information found in \"${escapedobjdirsubdir}/\\.debug/sepdebug2\\.debug\" does not match \"${escapedobjdirsubdir}/sepdebug2\" \\(CRC mismatch\\)\\..*\\(no debugging symbols found\\).*" "CRC mismatch is reported"
+}
+
+
 # NT_GNU_BUILD_ID / .note.gnu.build-id test:
 
 set build_id_debug_filename [build_id_debug_filename_get $binfile]
--- /dev/null
+++ b/gdb/testsuite/gdb.base/sepdebug2.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+int
+main (void)
+{
+  return 0;
+}


gdb-bz533176-fortran-omp-step.patch:
 infrun.c                           |    7 +++++++
 testsuite/gdb.fortran/omp-step.exp |   31 +++++++++++++++++++++++++++++++
 testsuite/gdb.fortran/omp-step.f90 |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+)

--- NEW FILE gdb-bz533176-fortran-omp-step.patch ---
https://bugzilla.redhat.com/show_bug.cgi?id=533176#c4

I find it a bug in DWARF and gdb behaves correctly according to it.  From the
current DWARF's point of view the is a function call which you skip by "next".

If you hide any /usr/lib/debug such as using:
gdb -nx -ex 'set debug-file-directory /qwe' -ex 'file ./tpcommon_gfortran44'
and use "step" command instead of "next" there it will work.
(You need to hide debuginfo from libgomp as you would step into libgomp sources
to maintain the threads for execution.)

There should be some DWARF extension for it, currently tried to detect
substring ".omp_fn." as this function is called "MAIN__.omp_fn.0" and do not
consider such sub-function as a skippable by "next".

Another problem is that with "set scheduler-locking" being "off" (default
upstream) or "step" (default in F/RHEL) the simultaneous execution of the
threads is inconvenient.  Setting it to "on" will lockup the debugging as the
threads need to get synchronized at some point.  This is a more general
debugging problem of GOMP outside of the scope of this Bug.



--- ./gdb/infrun.c	2009-12-09 22:03:33.000000000 +0100
+++ ./gdb/infrun.c	2009-12-09 22:29:56.000000000 +0100
@@ -3994,6 +3994,12 @@ infrun: not switching back to stepped th
 
       if (ecs->event_thread->step_over_calls == STEP_OVER_ALL)
 	{
+	  struct symbol *stop_fn = find_pc_function (stop_pc);
+
+	  if (stop_fn == NULL
+	      || strstr (SYMBOL_LINKAGE_NAME (stop_fn), ".omp_fn.") == NULL)
+{	/* ".omp_fn." */
+
 	  /* We're doing a "next".
 
 	     Normal (forward) execution: set a breakpoint at the
@@ -4020,6 +4026,7 @@ infrun: not switching back to stepped th
 
 	  keep_going (ecs);
 	  return;
+}	/* ".omp_fn." */
 	}
 
       /* If we are in a function call trampoline (a stub between the
--- ./gdb/testsuite/gdb.fortran/omp-step.exp	1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/omp-step.exp	2009-12-09 22:31:04.000000000 +0100
@@ -0,0 +1,31 @@
+# Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+set testfile "omp-step"
+set srcfile ${testfile}.f90
+if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77 additional_flags=-fopenmp}] } {
+    return -1
+}
+
+if ![runto [gdb_get_line_number "start-here"]] {
+    perror "Couldn't run to start-here"
+    return 0
+}
+
+gdb_test "next" {!\$omp parallel} "step closer"
+gdb_test "next" {a\(omp_get_thread_num\(\) \+ 1\) = 1} "step into omp"
+
+gdb_breakpoint [gdb_get_line_number "success"]
+gdb_continue_to_breakpoint "success" ".*success.*"
--- ./gdb/testsuite/gdb.fortran/omp-step.f90	1970-01-01 01:00:00.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/omp-step.f90	2009-12-09 22:25:35.000000000 +0100
@@ -0,0 +1,32 @@
+! Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+      use omp_lib
+      integer nthreads, i, a(1000)
+      nthreads = omp_get_num_threads()
+      if (nthreads .gt. 1000) call abort
+
+      do i = 1, nthreads
+          a(i) = 0
+      end do
+      print *, "start-here"
+!$omp parallel
+      a(omp_get_thread_num() + 1) = 1
+!$omp end parallel
+      do i = 1, nthreads
+          if (a(i) .ne. 1) call abort
+      end do
+      print *, "success"
+      end

gdb-bz538626-bp_location-accel-bp-cond.patch:
 breakpoint.c                     |  158 +++++++++++++++++++--------------------
 testsuite/gdb.base/condbreak.exp |   43 ++++++++++
 2 files changed, 121 insertions(+), 80 deletions(-)

--- NEW FILE gdb-bz538626-bp_location-accel-bp-cond.patch ---
http://sourceware.org/ml/gdb-patches/2009-12/msg00180.html
Subject: [patch] Fix a regression by me on breakpoint-cond-infcall

Hi,

GDB has now a regression since:
	Re: [patch] Performance optimize large bp_location count
	http://sourceware.org/ml/gdb-patches/2009-10/msg00632.html
	=
	2009-10-25  Jan Kratochvil  <jan.kratochvil at redhat.com>
	Performance optimize large bp_location count.

on breakpoints with conditions calling inferior.

Bringing the code back to the state before my acceleration patch.

The code before already assumed no breakpoints or their bp_locations can
change across the inferior call which should be true - trying to do some:
	break a if b()
	break b
	command 1
	delete 2
	end
or similar cannot work as inside "if b()" evaluation no breakpoints can be
added or removed.

update_global_location_list also does not removed/add `struct bp_location's
themselves but only pointers to them in the bp_location array.  As the new
iteration no longer uses the bp_location array it is no longer a problem.

Original problem was found by and fixed differently by Phil Muldoon.

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.


Thanks,
Jan


gdb/
2009-12-13  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* breakpoint.c (bpstat_stop_status): Iterate using ALL_BREAKPOINTS and
	the B->LOC list.  Remove gdb_assert on B.  Change bp_hardware_watchpoint
	continue to break.  Remove variable update_locations.  Remove HIT_COUNT
	increment protection by an ENABLE_STATE check.  Inline the delayed
	update_global_location_list call.

gdb/testsuite/
2009-12-13  Jan Kratochvil  <jan.kratochvil at redhat.com>
	    Phil Muldoon  <pmuldoon at redhat.com>

	* gdb.base/condbreak.exp: Put breakpoint on marker3 and marker4.
	(bp_location13, bp_location14, bp_location17, bp_location18)
	(marker3_proto, marker4_proto): New variables.
	(breakpoint info): Update output.
	(run until breakpoint at marker3, run until breakpoint at marker4): New
	tests.

[ Backported for F-12.  ]

--- ./gdb/breakpoint.c	2009-12-14 00:25:55.000000000 +0100
+++ ./gdb/breakpoint.c	2009-12-14 00:32:32.000000000 +0100
@@ -3298,93 +3298,93 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
   /* Pointer to the last thing in the chain currently.  */
   bpstat bs = root_bs;
   int ix;
-  int need_remove_insert, update_locations = 0;
+  int need_remove_insert;
 
-  ALL_BP_LOCATIONS (bl, blp_tmp)
-  {
-    bpstat bs_prev = bs;
+  /* ALL_BP_LOCATIONS iteration would break across
+     update_global_location_list possibly executed by
+     bpstat_check_breakpoint_conditions's inferior call.  */
 
-    b = bl->owner;
-    gdb_assert (b);
-    if (!breakpoint_enabled (b) && b->enable_state != bp_permanent)
-      continue;
-
-    /* For hardware watchpoints, we look only at the first location.
-       The watchpoint_check function will work on entire expression,
-       not the individual locations.  For read watchopints, the
-       watchpoints_triggered function have checked all locations
-       alrea
-     */
-    if (b->type == bp_hardware_watchpoint && bl != b->loc)
-      continue;
-
-    if (!bpstat_check_location (bl, bp_addr))
-      continue;
-
-    /* Come here if it's a watchpoint, or if the break address matches */
-
-    bs = bpstat_alloc (bl, bs);	/* Alloc a bpstat to explain stop */
-    gdb_assert (bs_prev->next == bs);
-
-    /* Assume we stop.  Should we find watchpoint that is not actually
-       triggered, or if condition of breakpoint is false, we'll reset
-       'stop' to 0.  */
-    bs->stop = 1;
-    bs->print = 1;
+  ALL_BREAKPOINTS (b)
+    {
+      if (!breakpoint_enabled (b) && b->enable_state != bp_permanent)
+	continue;
 
-    if (!bpstat_check_watchpoint (bs))
-      {
-	/* Ensure bpstat_explains_signal stays false if this BL could not be
-	   the cause of this trap.  */
+      for (bl = b->loc; bl != NULL; bl = bl->next)
+	{
+	  bpstat bs_prev = bs;
+
+	  /* For hardware watchpoints, we look only at the first location.
+	     The watchpoint_check function will work on entire expression,
+	     not the individual locations.  For read watchopints, the
+	     watchpoints_triggered function have checked all locations
+	     alrea
+	   */
+	  if (b->type == bp_hardware_watchpoint && bl != b->loc)
+	    break;
 
-	gdb_assert (bs->print_it == print_it_noop);
-	gdb_assert (!bs->stop);
-	xfree (bs);
-	bs = bs_prev;
-	bs->next = NULL;
-	continue;
-      }
+	  if (!bpstat_check_location (bl, bp_addr))
+	    continue;
 
-    if (b->type == bp_thread_event || b->type == bp_overlay_event
-	|| b->type == bp_longjmp_master || b->type == bp_exception_master)
-      /* We do not stop for these.  */
-      bs->stop = 0;
-    else
-      bpstat_check_breakpoint_conditions (bs, ptid);
-  
-    if (bs->stop)
-      {
-	if (b->enable_state != bp_disabled)
-	  ++(b->hit_count);
+	  /* Come here if it's a watchpoint, or if the break address matches */
 
-	/* We will stop here */
-	if (b->disposition == disp_disable)
-	  {
-	    if (b->enable_state != bp_permanent)
-	      b->enable_state = bp_disabled;
-	    update_locations = 1;
-	  }
-	if (b->silent)
-	  bs->print = 0;
-	bs->commands = b->commands;
-	if (bs->commands
-	    && (strcmp ("silent", bs->commands->line) == 0
-		|| (xdb_commands && strcmp ("Q", bs->commands->line) == 0)))
-	  {
-	    bs->commands = bs->commands->next;
-	    bs->print = 0;
-	  }
-	bs->commands = copy_command_lines (bs->commands);
-      }
+	  bs = bpstat_alloc (bl, bs);	/* Alloc a bpstat to explain stop */
+	  gdb_assert (bs_prev->next == bs);
 
-    /* Print nothing for this entry if we dont stop or if we dont print.  */
-    if (bs->stop == 0 || bs->print == 0)
-      bs->print_it = print_it_noop;
-  }
+	  /* Assume we stop.  Should we find watchpoint that is not actually
+	     triggered, or if condition of breakpoint is false, we'll reset
+	     'stop' to 0.  */
+	  bs->stop = 1;
+	  bs->print = 1;
 
-  /* Delay this call which would break the ALL_BP_LOCATIONS iteration above.  */
-  if (update_locations)
-    update_global_location_list (0);
+	  if (!bpstat_check_watchpoint (bs))
+	    {
+	      /* Ensure bpstat_explains_signal stays false if this BL could not be
+		 the cause of this trap.  */
+
+	      gdb_assert (bs->print_it == print_it_noop);
+	      gdb_assert (!bs->stop);
+	      xfree (bs);
+	      bs = bs_prev;
+	      bs->next = NULL;
+	      continue;
+	    }
+
+	  if (b->type == bp_thread_event || b->type == bp_overlay_event
+	      || b->type == bp_longjmp_master || b->type == bp_exception_master)
+	    /* We do not stop for these.  */
+	    bs->stop = 0;
+	  else
+	    bpstat_check_breakpoint_conditions (bs, ptid);
+	
+	  if (bs->stop)
+	    {
+	      ++(b->hit_count);
+
+	      /* We will stop here */
+	      if (b->disposition == disp_disable)
+		{
+		  if (b->enable_state != bp_permanent)
+		    b->enable_state = bp_disabled;
+		  update_global_location_list (0);
+		}
+	      if (b->silent)
+		bs->print = 0;
+	      bs->commands = b->commands;
+	      if (bs->commands
+		  && (strcmp ("silent", bs->commands->line) == 0
+		      || (xdb_commands && strcmp ("Q", bs->commands->line) == 0)))
+		{
+		  bs->commands = bs->commands->next;
+		  bs->print = 0;
+		}
+	      bs->commands = copy_command_lines (bs->commands);
+	    }
+
+	  /* Print nothing for this entry if we dont stop or if we dont print.  */
+	  if (bs->stop == 0 || bs->print == 0)
+	    bs->print_it = print_it_noop;
+	}
+    }
 
   for (ix = 0; VEC_iterate (bp_location_p, moribund_locations, ix, loc); ++ix)
     {
--- ./gdb/testsuite/gdb.base/condbreak.exp	2009-01-03 06:58:03.000000000 +0100
+++ ./gdb/testsuite/gdb.base/condbreak.exp	2009-12-14 00:27:21.000000000 +0100
@@ -68,8 +68,12 @@ set bp_location1  [gdb_get_line_number "
 set bp_location6  [gdb_get_line_number "set breakpoint 6 here"]
 set bp_location8  [gdb_get_line_number "set breakpoint 8 here" $srcfile1]
 set bp_location9  [gdb_get_line_number "set breakpoint 9 here" $srcfile1]
+set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile1]
+set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile1]
 set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile1]
 set bp_location16 [gdb_get_line_number "set breakpoint 16 here" $srcfile1]
+set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile1]
+set bp_location18 [gdb_get_line_number "set breakpoint 18 here" $srcfile1]
 
 #
 # test break at function
@@ -110,15 +114,29 @@ gdb_test "break marker2 if (a==43)" \
     "Breakpoint.*at.* file .*$srcfile1, line.*"
 
 #
+# Check break involving inferior function call.
+# Ensure there is at least one additional breakpoint with higher VMA.
+#
+gdb_test "break marker3 if (multi_line_if_conditional(1,1,1)==0)" \
+    "Breakpoint.*at.* file .*$srcfile1, line.*"
+gdb_test "break marker4" \
+    "Breakpoint.*at.* file .*$srcfile1, line.*"
+
+#
 # check to see what breakpoints are set
 #
 
 if {$hp_aCC_compiler} {
     set marker1_proto "\\(void\\)"
     set marker2_proto "\\(int\\)"
+    # Not checked.
+    set marker3_proto "\\(char \\*, char \\*\\)"
+    set marker4_proto "\\(long\\)"
 } else {
     set marker1_proto ""
     set marker2_proto ""
+    set marker3_proto ""
+    set marker4_proto ""
 }
 
 gdb_test "info break" \
@@ -129,7 +147,10 @@ gdb_test "info break" \
 \[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location1.*
 \[\t \]+stop only if \\(1==1\\).*
 \[0-9\]+\[\t \]+breakpoint     keep y.* in marker2$marker2_proto at .*$srcfile1:($bp_location8|$bp_location9).*
-\[\t \]+stop only if \\(a==43\\).*" \
+\[\t \]+stop only if \\(a==43\\).*
+\[0-9\]+\[\t \]+breakpoint     keep y.* in marker3$marker3_proto at .*$srcfile1:($bp_location17|$bp_location18).*
+\[\t \]+stop only if \\(multi_line_if_conditional\\(1,1,1\\)==0\\).*
+\[0-9\]+\[\t \]+breakpoint     keep y.* in marker4$marker4_proto at .*$srcfile1:($bp_location13|$bp_location14).*" \
     "breakpoint info"
 
 
@@ -220,3 +241,23 @@ gdb_expect {
 	fail "(timeout) run until breakpoint at marker2"
     }
 }
+
+set test "run until breakpoint at marker3"
+gdb_test_multiple "continue" $test {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile1:($bp_location17|$bp_location18).*($bp_location17|$bp_location18)\[\t \]+.*$gdb_prompt $" {
+	pass $test
+    }
+    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile1:($bp_location17|$bp_location18).*($bp_location17|$bp_location18)\[\t \]+.*$gdb_prompt $" {
+	xfail $test
+    }
+}
+
+set test "run until breakpoint at marker4"
+gdb_test_multiple "continue" $test {
+    -re "Continuing\\..*Breakpoint \[0-9\]+, marker4 \\(d=177601976\\) at .*$srcfile1:($bp_location13|$bp_location14).*($bp_location13|$bp_location14)\[\t \]+.*$gdb_prompt $" {
+	pass $test
+    }
+    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker4 \\(d=177601976\\) at .*$srcfile1:($bp_location13|$bp_location14).*($bp_location13|$bp_location14)\[\t \]+.*$gdb_prompt $" {
+	xfail $test
+    }
+}

gdb-bz539590-gnu-ifunc.patch:
 elfread.c                          |    8 +++-
 gdbtypes.c                         |    9 ++++
 gdbtypes.h                         |   13 ++++++
 infcall.c                          |   21 ++++++++++
 linespec.c                         |   17 ++++++++
 minsyms.c                          |   19 ++++++++-
 parse.c                            |    5 ++
 solib-svr4.c                       |    3 +
 symmisc.c                          |    3 +
 symtab.c                           |    2 -
 symtab.h                           |    4 ++
 testsuite/gdb.base/gnu-ifunc-lib.c |   45 +++++++++++++++++++++++
 testsuite/gdb.base/gnu-ifunc.c     |   36 ++++++++++++++++++
 testsuite/gdb.base/gnu-ifunc.exp   |   72 +++++++++++++++++++++++++++++++++++++
 14 files changed, 250 insertions(+), 7 deletions(-)

--- NEW FILE gdb-bz539590-gnu-ifunc.patch ---
gdb/
2009-11-24  Jan Kratochvil  <jan.kratochvil at redhat.com>

	Transparent GNU-IFUNCs support.
	* elfread.c (record_minimal_symbol): Apply also for mst_text_gnu_ifunc.
	(elf_symtab_read): Set also mst_text_gnu_ifunc.
	* gdbtypes.c (init_type): Support TYPE_FLAG_GNU_IFUNC.
	(gdbtypes_post_init): Initialize builtin_func_func_ptr.
	(objfile_type): Initialize nodebug_text_gnu_ifunc_symbol.
	* gdbtypes.h (enum type_flag_value <TYPE_FLAG_GNU_IFUNC>)
	(TYPE_GNU_IFUNC, struct main_type <flag_gnu_ifunc>)
	(struct builtin_type <builtin_func_func_ptr>)
	(struct objfile_type <nodebug_text_gnu_ifunc_symbol>): New.
	* infcall.c (find_function_addr <TYPE_GNU_IFUNC (ftype)>): New.
	* minsyms.c (lookup_minimal_symbol_text, prim_record_minimal_symbol)
	(find_solib_trampoline_target): Support also mst_text_gnu_ifunc.
	(in_gnu_ifunc_stub): New.
	* parse.c (write_exp_msymbol <mst_text_gnu_ifunc>): New.
	* solib-svr4.c (svr4_in_dynsym_resolve_code): Call also
	in_gnu_ifunc_stub.
	* symmisc.c (dump_msymbols <mst_text_gnu_ifunc>): New.
	* symtab.c (search_symbols): Support also mst_text_gnu_ifunc.
	* symtab.h (enum minimal_symbol_type <mst_text_gnu_ifunc>)
	(in_gnu_ifunc_stub): New.
	* linespec.c: Include infcall.h.
	(minsym_found <MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc>): New.

gdb/testsuite/
2009-11-24  Jan Kratochvil  <jan.kratochvil at redhat.com>

	Transparent GNU-IFUNCs support.
	* gdb.base/gnu-ifunc-lib.c, gdb.base/gnu-ifunc.c,
	gdb.base/gnu-ifunc.exp: New.

Index: gdb-7.0/gdb/elfread.c
===================================================================
--- gdb-7.0.orig/gdb/elfread.c	2009-11-25 10:24:45.000000000 +0100
+++ gdb-7.0/gdb/elfread.c	2009-11-25 10:25:50.000000000 +0100
@@ -168,7 +168,8 @@ record_minimal_symbol (char *name, CORE_
 {
   struct gdbarch *gdbarch = get_objfile_arch (objfile);
 
-  if (ms_type == mst_text || ms_type == mst_file_text)
+  if (ms_type == mst_text || ms_type == mst_file_text
+      || ms_type == mst_text_gnu_ifunc)
     address = gdbarch_smash_text_address (gdbarch, address);
 
   return prim_record_minimal_symbol_and_info
@@ -373,7 +374,10 @@ elf_symtab_read (struct objfile *objfile
 	    {
 	      if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
 		{
-		  ms_type = mst_text;
+		  if (sym->flags & BSF_GNU_INDIRECT_FUNCTION)
+		    ms_type = mst_text_gnu_ifunc;
+		  else
+		    ms_type = mst_text;
 		}
 	      else if ((sym->name[0] == '.' && sym->name[1] == 'L')
 		       || ((sym->flags & BSF_LOCAL)
Index: gdb-7.0/gdb/gdbtypes.c
===================================================================
--- gdb-7.0.orig/gdb/gdbtypes.c	2009-11-25 10:24:47.000000000 +0100
+++ gdb-7.0/gdb/gdbtypes.c	2009-11-25 10:24:56.000000000 +0100
@@ -1904,6 +1904,8 @@ init_type (enum type_code code, int leng
     TYPE_NOTTEXT (type) = 1;
   if (flags & TYPE_FLAG_FIXED_INSTANCE)
     TYPE_FIXED_INSTANCE (type) = 1;
+  if (flags & TYPE_FLAG_GNU_IFUNC)
+    TYPE_GNU_IFUNC (type) = 1;
 
   if (name)
     TYPE_NAME (type) = obsavestring (name, strlen (name),
@@ -3762,6 +3764,8 @@ gdbtypes_post_init (struct gdbarch *gdba
     = lookup_pointer_type (builtin_type->builtin_void);
   builtin_type->builtin_func_ptr
     = lookup_pointer_type (lookup_function_type (builtin_type->builtin_void));
+  builtin_type->builtin_func_func_ptr
+    = lookup_pointer_type (lookup_function_type (builtin_type->builtin_func_ptr));
 
   /* This type represents a GDB internal function.  */
   builtin_type->internal_fn
@@ -3878,6 +3882,11 @@ objfile_type (struct objfile *objfile)
 		 "<text variable, no debug info>", objfile);
   TYPE_TARGET_TYPE (objfile_type->nodebug_text_symbol)
     = objfile_type->builtin_int;
+  objfile_type->nodebug_text_gnu_ifunc_symbol
+    = init_type (TYPE_CODE_FUNC, 1, TYPE_FLAG_GNU_IFUNC,
+		 "<text gnu-ifunc variable, no debug info>", objfile);
+  TYPE_TARGET_TYPE (objfile_type->nodebug_text_gnu_ifunc_symbol)
+    = objfile_type->nodebug_text_symbol;
   objfile_type->nodebug_data_symbol
     = init_type (TYPE_CODE_INT,
 		 gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
Index: gdb-7.0/gdb/gdbtypes.h
===================================================================
--- gdb-7.0.orig/gdb/gdbtypes.h	2009-11-25 10:24:48.000000000 +0100
+++ gdb-7.0/gdb/gdbtypes.h	2009-11-25 10:25:17.000000000 +0100
@@ -187,6 +187,7 @@ enum type_flag_value
   TYPE_FLAG_FIXED_INSTANCE = (1 << 15),
   TYPE_FLAG_STUB_SUPPORTED = (1 << 16),
   TYPE_FLAG_NOTTEXT = (1 << 17),
+  TYPE_FLAG_GNU_IFUNC = (1 << 18),
 
   /* Used for error-checking.  */
   TYPE_FLAG_MIN = TYPE_FLAG_UNSIGNED
@@ -292,6 +293,12 @@ enum type_instance_flag_value
 
 #define TYPE_NOTTEXT(t)		(TYPE_MAIN_TYPE (t)->flag_nottext)
 
+/* Currently used only for TYPE_CODE_FUNC where specifies the real function
+   address is returned by this function call.  TYPE_TARGET_TYPE determines the
+   final returned function type to be presented to user.  */
+
+#define TYPE_GNU_IFUNC(t)	(TYPE_MAIN_TYPE (t)->flag_gnu_ifunc)
+
 /* Type owner.  If TYPE_OBJFILE_OWNED is true, the type is owned by
    the objfile retrieved as TYPE_OBJFILE.  Otherweise, the type is
    owned by an architecture; TYPE_OBJFILE is NULL in this case.  */
@@ -427,6 +434,7 @@ struct main_type
   unsigned int flag_vector : 1;
   unsigned int flag_stub_supported : 1;
   unsigned int flag_nottext : 1;
+  unsigned int flag_gnu_ifunc : 1;
   unsigned int flag_fixed_instance : 1;
   unsigned int flag_objfile_owned : 1;
   unsigned int flag_discardable : 1;
@@ -1144,6 +1152,10 @@ struct builtin_type
      (*) () can server as a generic function pointer.  */
   struct type *builtin_func_ptr;
 
+  /* `pointer to function returning pointer to function (returning void)' type.
+     The final void return type is not significant for it.  */
+  struct type *builtin_func_func_ptr;
+
 
   /* Special-purpose types.  */
 
@@ -1186,6 +1198,7 @@ struct objfile_type
 
   /* Types used for symbols with no debug information.  */
   struct type *nodebug_text_symbol;
+  struct type *nodebug_text_gnu_ifunc_symbol;
   struct type *nodebug_data_symbol;
   struct type *nodebug_unknown_symbol;
   struct type *nodebug_tls_symbol;
Index: gdb-7.0/gdb/infcall.c
===================================================================
--- gdb-7.0.orig/gdb/infcall.c	2009-11-25 10:24:45.000000000 +0100
+++ gdb-7.0/gdb/infcall.c	2009-11-25 10:24:56.000000000 +0100
@@ -286,6 +286,27 @@ find_function_addr (struct value *functi
   else
     error (_("Invalid data type for function to be called."));
 
+  if (TYPE_GNU_IFUNC (ftype))
+    {
+      struct type *func_func_ptr;
+
+      funaddr += gdbarch_deprecated_function_start_offset (gdbarch);
+
+      /* Cast FUNADDR to drop TYPE_GNU_IFUNC and being able to call gnu-ifunc
+	 FUNADDR without causing deadlock by this block of code.  */
+
+      func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
+      function = value_from_pointer (func_func_ptr, funaddr);
+
+      /* gnu-ifuncs have no arguments.  */
+      function = call_function_by_hand (function, 0, NULL);
+
+      funaddr = value_as_address (function);
+
+      /* This is `int' as the return type of the final function.  */
+      value_type = TYPE_TARGET_TYPE (value_type);
+    }
+
   if (retval_type != NULL)
     *retval_type = value_type;
   return funaddr + gdbarch_deprecated_function_start_offset (gdbarch);
Index: gdb-7.0/gdb/linespec.c
===================================================================
--- gdb-7.0.orig/gdb/linespec.c	2009-11-25 10:24:45.000000000 +0100
+++ gdb-7.0/gdb/linespec.c	2009-11-25 10:24:56.000000000 +0100
@@ -40,6 +40,7 @@
 #include "interps.h"
 #include "mi/mi-cmds.h"
 #include "target.h"
+#include "infcall.h"
 
 /* We share this one with symtab.c, but it is not exported widely. */
 
@@ -1875,6 +1876,22 @@ minsym_found (int funfirstline, struct m
   pc = gdbarch_convert_from_func_ptr_addr (gdbarch,
                                            values.sals[0].pc,
                                            &current_target);
+
+  /* Call gnu-ifunc to resolve breakpoint at its returned function.  */
+  if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
+    {
+      struct type *func_func_ptr;
+      struct value *function;
+
+      func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
+      function = value_from_pointer (func_func_ptr, pc);
+
+      /* gnu-ifuncs have no arguments.  */
+      function = call_function_by_hand (function, 0, NULL);
+
+      pc = value_as_address (function);
+    }
+
   if (pc != values.sals[0].pc)
     values.sals[0] = find_pc_sect_line (pc, NULL, 0);
 
Index: gdb-7.0/gdb/minsyms.c
===================================================================
--- gdb-7.0.orig/gdb/minsyms.c	2009-11-25 10:24:47.000000000 +0100
+++ gdb-7.0/gdb/minsyms.c	2009-11-25 10:24:56.000000000 +0100
@@ -331,8 +331,9 @@ lookup_minimal_symbol_text (const char *
 	       msymbol = msymbol->hash_next)
 	    {
 	      if (strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0 &&
-		  (MSYMBOL_TYPE (msymbol) == mst_text ||
-		   MSYMBOL_TYPE (msymbol) == mst_file_text))
+		  (MSYMBOL_TYPE (msymbol) == mst_text
+		   || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
+		   || MSYMBOL_TYPE (msymbol) == mst_file_text))
 		{
 		  switch (MSYMBOL_TYPE (msymbol))
 		    {
@@ -699,6 +700,16 @@ lookup_minimal_symbol_by_pc (CORE_ADDR p
 {
   return lookup_minimal_symbol_by_pc_section (pc, NULL);
 }
+
+/* Return non-zero iff PC is in function implementing gnu-ifunc selection.  */
+
+int
+in_gnu_ifunc_stub (CORE_ADDR pc)
+{
+  struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
+
+  return msymbol && MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc;
+}
 
 
 /* Return leading symbol character for a BFD. If BFD is NULL,
@@ -738,6 +749,7 @@ prim_record_minimal_symbol (const char *
   switch (ms_type)
     {
     case mst_text:
+    case mst_text_gnu_ifunc:
     case mst_file_text:
     case mst_solib_trampoline:
       section = SECT_OFF_TEXT (objfile);
@@ -1184,7 +1196,8 @@ find_solib_trampoline_target (struct fra
     {
       ALL_MSYMBOLS (objfile, msymbol)
       {
-	if (MSYMBOL_TYPE (msymbol) == mst_text
+	if ((MSYMBOL_TYPE (msymbol) == mst_text
+	    || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
 	    && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
 		       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
 	  return SYMBOL_VALUE_ADDRESS (msymbol);
Index: gdb-7.0/gdb/parse.c
===================================================================
--- gdb-7.0.orig/gdb/parse.c	2009-11-25 10:24:47.000000000 +0100
+++ gdb-7.0/gdb/parse.c	2009-11-25 10:26:16.000000000 +0100
@@ -517,6 +517,11 @@ write_exp_msymbol (struct minimal_symbol
 	write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol);
       break;
 
+    case mst_text_gnu_ifunc:
+      write_exp_elt_type (objfile_type (objfile)
+					       ->nodebug_text_gnu_ifunc_symbol);
+      break;
+
     case mst_data:
     case mst_file_data:
     case mst_bss:
Index: gdb-7.0/gdb/solib-svr4.c
===================================================================
--- gdb-7.0.orig/gdb/solib-svr4.c	2009-11-25 10:24:49.000000000 +0100
+++ gdb-7.0/gdb/solib-svr4.c	2009-11-25 10:26:41.000000000 +0100
@@ -1242,7 +1242,8 @@ svr4_in_dynsym_resolve_code (CORE_ADDR p
 {
   return ((pc >= interp_text_sect_low && pc < interp_text_sect_high)
 	  || (pc >= interp_plt_sect_low && pc < interp_plt_sect_high)
-	  || in_plt_section (pc, NULL));
+	  || in_plt_section (pc, NULL)
+	  || in_gnu_ifunc_stub (pc));
 }
 
 /* Given an executable's ABFD and target, compute the entry-point
Index: gdb-7.0/gdb/symmisc.c
===================================================================
--- gdb-7.0.orig/gdb/symmisc.c	2009-11-25 10:24:47.000000000 +0100
+++ gdb-7.0/gdb/symmisc.c	2009-11-25 10:24:56.000000000 +0100
@@ -287,6 +287,9 @@ dump_msymbols (struct objfile *objfile, 
 	case mst_text:
 	  ms_type = 'T';
 	  break;
+	case mst_text_gnu_ifunc:
+	  ms_type = 'i';
+	  break;
 	case mst_solib_trampoline:
 	  ms_type = 'S';
 	  break;
Index: gdb-7.0/gdb/symtab.c
===================================================================
--- gdb-7.0.orig/gdb/symtab.c	2009-11-25 10:24:47.000000000 +0100
+++ gdb-7.0/gdb/symtab.c	2009-11-25 10:24:56.000000000 +0100
@@ -3155,7 +3155,7 @@ search_symbols (char *regexp, domain_enu
   {mst_file_data, mst_solib_trampoline, mst_abs, mst_unknown};
   static enum minimal_symbol_type types4[]
   =
-  {mst_file_bss, mst_text, mst_abs, mst_unknown};
+  {mst_file_bss, mst_text_gnu_ifunc, mst_abs, mst_unknown};
   enum minimal_symbol_type ourtype;
   enum minimal_symbol_type ourtype2;
   enum minimal_symbol_type ourtype3;
Index: gdb-7.0/gdb/symtab.h
===================================================================
--- gdb-7.0.orig/gdb/symtab.h	2009-11-25 10:24:45.000000000 +0100
+++ gdb-7.0/gdb/symtab.h	2009-11-25 10:24:56.000000000 +0100
@@ -275,6 +275,8 @@ enum minimal_symbol_type
 {
   mst_unknown = 0,		/* Unknown type, the default */
   mst_text,			/* Generally executable instructions */
+  mst_text_gnu_ifunc,		/* Executable code returning address
+				   of executable code */
   mst_data,			/* Generally initialized data */
   mst_bss,			/* Generally uninitialized data */
   mst_abs,			/* Generally absolute (nonrelocatable) */
@@ -1149,6 +1151,8 @@ extern struct minimal_symbol *lookup_min
 
 extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
 
+extern int in_gnu_ifunc_stub (CORE_ADDR pc);
+
 extern struct minimal_symbol
   *lookup_minimal_symbol_by_pc_section (CORE_ADDR, struct obj_section *);
 
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc-lib.c	2009-11-25 10:24:56.000000000 +0100
@@ -0,0 +1,45 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+
+typedef int (*final_t) (int arg);
+
+static int
+final (int arg)
+{
+  return arg + 1;
+}
+
+static volatile int gnu_ifunc_initialized;
+
+void
+gnu_ifunc_pre (void)
+{
+  assert (!gnu_ifunc_initialized);
+}
+
+final_t gnu_ifuncX (void) asm ("gnu_ifunc");
+asm (".type gnu_ifunc, @gnu_indirect_function");
+
+final_t
+gnu_ifuncX (void)
+{
+  gnu_ifunc_initialized = 1;
+
+  return final;
+}
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.c	2009-11-25 10:24:56.000000000 +0100
@@ -0,0 +1,36 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+
+extern int gnu_ifunc (int arg);
+extern void gnu_ifunc_pre (void);
+
+int
+main (void)
+{
+  int i;
+
+  gnu_ifunc_pre ();
+  
+  i = gnu_ifunc (1);	/* break-at-call */
+  assert (i == 2);
+
+  gnu_ifunc (2);	/* break-at-nextcall */
+
+  return 0;	/* break-at-exit */
+}
Index: gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.exp
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.0/gdb/testsuite/gdb.base/gnu-ifunc.exp	2009-11-25 10:24:56.000000000 +0100
@@ -0,0 +1,72 @@
+# Copyright (C) 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+if {[skip_shlib_tests]} {
+    return 0
+}
+
+set testfile "gnu-ifunc"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+set libfile "${testfile}-lib"
+set libsrc ${libfile}.c
+set lib_so ${objdir}/${subdir}/${libfile}.so
+
+set lib_opts [list debug]
+set exec_opts [list debug shlib=$lib_so]
+
+if [get_compiler_info ${binfile}] {
+    return -1
+}
+
+if { [gdb_compile_shlib ${srcdir}/${subdir}/$libsrc $lib_so $lib_opts] != ""
+     || [gdb_compile ${srcdir}/${subdir}/$srcfile $binfile executable $exec_opts] != ""} {
+    untested "Could not compile either $libsrc or $srcfile."
+    return -1
+}
+
+# Start with a fresh gdb.
+
+clean_restart $testfile
+gdb_load_shlibs ${lib_so}
+
+if ![runto_main] then {
+    fail "Can't run to main"
+    return 1;
+}
+
+gdb_breakpoint [gdb_get_line_number "break-at-nextcall"]
+
+gdb_breakpoint [gdb_get_line_number "break-at-call"]
+gdb_continue_to_breakpoint "break-at-call" ".*break-at-call.*"
+
+# Test GDB will automatically indirect the call.
+
+gdb_test "p gnu_ifunc (3)" " = 4"
+
+# Test GDB will skip the gnu_ifunc resolver on first call.
+
+gdb_test "step" "\r\nfinal .*"
+
+# Test GDB will not break before the final chosen implementation.
+
+gdb_continue_to_breakpoint "break-at-nextcall" ".*break-at-nextcall.*"
+
+gdb_breakpoint "gnu_ifunc"
+
+gdb_continue_to_breakpoint "nextcall gnu_ifunc"
+
+gdb_test "frame" "#0 +final \\(.*" "nextcall gnu_ifunc skipped"

gdb-core-open-vdso-warning.patch:
 solib-svr4.c |   14 ++++++++++++--
 solib.c      |    7 +++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

--- NEW FILE gdb-core-open-vdso-warning.patch ---
http://sourceware.org/ml/gdb-patches/2009-10/msg00142.html
Subject: [patch] Fix GNU/Linux core open: Can't read pathname for load map:  Input/output error.

Hi,

GDB currently always prints on loading a core file:
	warning: Can't read pathname for load map: Input/output error.

The patch is not nice but it was WONTFIXed on the glibc side in:
	http://sourceware.org/ml/libc-alpha/2009-10/msg00001.html

The same message in GDB PR 8882 and glibc PR 387 was for ld-linux.so.2 l_name
but that one is now ignored thanks to IGNORE_FIRST_LINK_MAP_ENTRY.

This fix is intended for Linux system vDSO l_name which is a second entry in
the DSO list.

Regression tested on {x86_86,x86_64-m32,i686}-fedora11-linux-gnu.


Thanks,
Jan


gdb/
2009-10-06  Jan Kratochvil  <jan.kratochvil at redhat.com>

	Do not print false warning on reading core file with vDSO on GNU/Linux.
	* solib-svr4.c (svr4_current_sos): Suppress the warning if
	MASTER_SO_LIST is still NULL.
	* solib.c (update_solib_list): New variable saved_so_list_head.
	Conditionally restart the function.

[ Context backport.  ]

--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1097,8 +1097,18 @@ svr4_current_sos (void)
 	  target_read_string (LM_NAME (new), &buffer,
 			      SO_NAME_MAX_PATH_SIZE - 1, &errcode);
 	  if (errcode != 0)
-	    warning (_("Can't read pathname for load map: %s."),
-		     safe_strerror (errcode));
+	    {
+	      /* During the first ever DSO list reading some strings may be
+		 unreadable as residing in the ld.so readonly memory not being
+		 present in a dumped core file.  Delay the error check after
+		 the first pass of DSO list scanning when ld.so should be
+		 already mapped in and all the DSO list l_name memory gets
+		 readable.  */
+
+	      if (master_so_list () != NULL)
+		warning (_("Can't read pathname for load map: %s."),
+			 safe_strerror (errcode));
+	    }
 	  else
 	    {
 	      struct build_id *build_id;
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -538,6 +538,7 @@ update_solib_list (int from_tty, struct target_ops *target)
   struct target_so_ops *ops = solib_ops (target_gdbarch);
   struct so_list *inferior = ops->current_sos();
   struct so_list *gdb, **gdb_link;
+  struct so_list *saved_so_list_head = so_list_head;
 
   /* We can reach here due to changing solib-search-path or the
      sysroot, before having any inferior.  */
@@ -668,6 +669,12 @@ update_solib_list (int from_tty, struct target_ops *target)
 	  observer_notify_solib_loaded (i);
 	}
     }
+
+  /* If this was the very first DSO list scan and we possibly read in ld.so
+     recheck all the formerly unreadable DSO names strings.  */
+
+  if (saved_so_list_head == NULL && so_list_head != NULL)
+    update_solib_list (from_tty, target);
 }
 
 


gdb-empty-namespace.patch:
 b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S   |  108 +++++++++++++++++++++
 b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp |   43 ++++++++
 gdb/dwarf2read.c                                   |   14 ++
 3 files changed, 163 insertions(+), 2 deletions(-)

--- NEW FILE gdb-empty-namespace.patch ---
gdb/
2009-12-20  Jan Kratochvil  <jan.kratochvil at redhat.com>

	Fix compatibility with G++-4.1.
	* dwarf2read.c (partial_die_parent_scope): New variable PARENT_NAME.
	Ignore parent namespaces with name "::".
	(physname_prefix_1): Ignore namespaces with name "::".

gdb/testsuite/
2009-12-20  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.dwarf2/dw2-empty-namespace.exp, gdb.dwarf2/dw2-empty-namespace.S:
	New.

--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -2355,11 +2355,18 @@ partial_die_parent_scope (struct partial_die_info *pdi,
       || parent->tag == DW_TAG_interface_type
       || parent->tag == DW_TAG_union_type)
     {
+      char *parent_name = parent->name;
+
+      /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
+      if (parent->tag == DW_TAG_namespace && parent_name != NULL
+          && strcmp (parent_name, "::") == 0)
+	parent_name = NULL;
+
       if (grandparent_scope == NULL)
-	parent->scope = parent->name;
+	parent->scope = parent_name;
       else
 	parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope,
-					 parent->name, cu);
+					 parent_name, cu);
     }
   else if (parent->tag == DW_TAG_enumeration_type)
     /* Enumerators should not get the name of the enumeration as a prefix.  */
@@ -9008,6 +9015,9 @@ physname_prefix_1 (struct ui_file *buf, struct die_info *die,
 	  name = dwarf2_name (die, cu);
 	  if (name == NULL)
 	    name = "(anonymous namespace)";
+	  /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
+	  else if (strcmp (name, "::") == 0)
+	    name = NULL;
 	  break;
 
 	case DW_TAG_class_type:
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
@@ -0,0 +1,108 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".  */
+
+	.data
+var:	.4byte	1
+
+	.section .debug_info
+.Lcu1_begin:
+	/* CU header */
+	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
+.Lcu1_start:
+	.2byte	2				/* DWARF Version */
+	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
+	.byte	4				/* Pointer size */
+
+	/* CU die */
+	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
+	.ascii	"file1.txt\0"			/* DW_AT_name */
+	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
+	.byte	4				/* DW_LANG_C_plus_plus (C++) */
+
+.Ltype_int:
+	.uleb128	2			/* Abbrev: DW_TAG_base_type */
+	.ascii		"int\0"			/* DW_AT_name */
+	.byte		4			/* DW_AT_byte_size */
+	.byte		5			/* DW_AT_encoding */
+
+	.uleb128	3			/* Abbrev: DW_TAG_namespace */
+	.ascii		"::\0"			/* DW_AT_name */
+
+	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
+	.ascii		"var\0"			/* DW_AT_name */
+	.byte		2f - 1f			/* DW_AT_location */
+1:	.byte		3			/*   DW_OP_addr */
+	.4byte		var			/*   <addr> */
+2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
+
+	.byte		0			/* End of children of DW_TAG_namespace */
+
+	.byte		0			/* End of children of CU */
+
+.Lcu1_end:
+
+/* Abbrev table */
+	.section .debug_abbrev
+.Labbrev1_begin:
+	.uleb128	1			/* Abbrev code */
+	.uleb128	0x11			/* DW_TAG_compile_unit */
+	.byte		1			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x25			/* DW_AT_producer */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x13			/* DW_AT_language */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	2			/* Abbrev code */
+	.uleb128	0x24			/* DW_TAG_base_type */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0xb			/* DW_AT_byte_size */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.uleb128	0x3e			/* DW_AT_encoding */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	3			/* Abbrev code */
+	.uleb128	0x39			/* DW_TAG_namespace */
+	.byte		1			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	7			/* Abbrev code (location) */
+	.uleb128	0x34			/* DW_TAG_variable */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x2			/* DW_AT_location */
+	.uleb128	0xa			/* DW_FORM_block1 */
+	.uleb128	0x49			/* DW_AT_type */
+	.uleb128	0x13			/* DW_FORM_ref4 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
@@ -0,0 +1,43 @@
+# Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+# Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+# For now pick a sampling of likely targets.
+if {![istarget *-*-linux*]
+    && ![istarget *-*-gnu*]
+    && ![istarget *-*-elf*]
+    && ![istarget *-*-openbsd*]
+    && ![istarget arm-*-eabi*]
+    && ![istarget powerpc-*-eabi*]} {
+    return 0  
+}
+
+set testfile "dw2-empty-namespace"
+set srcfile ${testfile}.S
+set executable ${testfile}.x
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${executable}" object {nodebug}] != "" } {
+    return -1
+}
+
+clean_restart $executable
+
+# `p var' below can work without identified DWARF DIE just based on its ELF symbol.
+# Catch it here as `type = <data variable, no debug info>'.
+gdb_test "ptype var" "type = int"
+
+gdb_test "p var" " = 1"

gdb-follow-child-stale-parent.patch:
 infrun.c |    3 +++
 1 file changed, 3 insertions(+)

--- NEW FILE gdb-follow-child-stale-parent.patch ---
Problem occurs with python and its get_current_arch () as it selects
selected_frame and current_frame while still inferior_ptid is valid for the
original parent.  But since this place it is already attached and later
unwinders try to access it, breaking:
  -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork
  -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork
  -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork
  -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork
  -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish
  +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork
  +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork
  +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork
  +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork
  +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish

--- ./gdb/infrun.c	2009-12-21 20:26:30.000000000 +0100
+++ ./gdb/infrun.c	2009-12-21 20:26:11.000000000 +0100
@@ -375,6 +375,9 @@ follow_fork (void)
 	  }
 	else
 	  {
+	    /* Possibly referenced PARENT is no longer valid.  */
+	    reinit_frame_cache ();
+
 	    /* This pending follow fork event is now handled, one way
 	       or another.  The previous selected thread may be gone
 	       from the lists by now, but if it is still around, need

gdb-ppc-hw-watchpoint-twice.patch:
 breakpoint.c |    3 +++
 1 file changed, 3 insertions(+)

--- NEW FILE gdb-ppc-hw-watchpoint-twice.patch ---
pcc regression from:
http://sourceware.org/ml/gdb-patches/2008-12/msg00143.html

gdb/
2009-12-21  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* breakpoint.c (update_watchpoint): Set B->TYPE to bp_watchpoint before
	calling hw_watchpoint_used_count.

--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1152,6 +1152,9 @@ update_watchpoint (struct breakpoint *b, int reparse)
 	  {
 	    int i, mem_cnt, other_type_used;
 
+	    /* Do not count with B twice below.  */
+	    b->type = bp_watchpoint;
+
 	    i = hw_watchpoint_used_count (bp_hardware_watchpoint,
 					  &other_type_used);
 	    mem_cnt = can_use_hardware_watchpoint (val_chain);

gdb-readline-6.0-signal.patch:
 config.in                      |    3 +
 configure                      |   72 +++++++++++++++++++----------------------
 configure.ac                   |   12 +++++-
 event-loop.c                   |   14 +++++++
 testsuite/gdb.gdb/selftest.exp |   40 +++++++++++++---------
 5 files changed, 85 insertions(+), 56 deletions(-)

--- NEW FILE gdb-readline-6.0-signal.patch ---
http://sourceware.org/ml/gdb-patches/2009-11/msg00596.html
Subject: [gdb FYI-patch] callback-mode readline-6.0 regression

Hi Chet,

FSF GDB currently ships bundled with readline-5.2 which works fine.
But using --with-system-readline and readline-6.0-patchlevel4 has
a regression:

readline-5.2: Run `gdb -nx -q' and type CTRL-C:
(gdb) Quit
(gdb) _

readline-6.0: Run `gdb -nx -q' and type CTRL-C:
(gdb) _
 = nothing happens (it gets buffered and executed later)
	(It does also FAIL on gdb.gdb/selftest.exp.)

It is because GDB waits in its own poll() mainloop and readline uses via
rl_callback_handler_install and rl_callback_handler_remove.  This way the
readline internal variable _rl_interrupt_immediately remains 0 and CTRL-C gets
only stored to _rl_caught_signal but not executed.

Seen in rl_signal_handler even if _rl_interrupt_immediately is set and
_rl_handle_signal is called then the signal is still stored to
_rl_caught_signal.  In the _rl_interrupt_immediately case it should not be
stored when it was already processed.

rl_signal_handler does `_rl_interrupt_immediately = 0;' - while I am not aware
of its meaning it breaks the nest-counting of other routines which do
`_rl_interrupt_immediately++;' and `_rl_interrupt_immediately--;' possibly
creating problematic `_rl_interrupt_immediately == -1'.

`_rl_interrupt_immediately' is an internal variable, how it could be accessed
by a readline application? (OK, maybe it should not be used.)

Attaching a current GDB-side patch but it must access readline internal
variable _rl_caught_signal and it is generally just a workaround.  Could you
please include support for signals in this asynchronous mode in readline-6.1?
I find it would be enough to make RL_CHECK_SIGNALS public?


GDB: No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
But this is not a patch intended to be accepted.


Thanks,
Jan


gdb/
2009-11-29  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* config.in, configure: Regenerate.
	* configure.ac (for readline_echoing_p): Move inside $LIBS change.
	(for _rl_caught_signal): New.
	* event-loop.c: Include readline/readline.h.
	(gdb_do_one_event) [HAVE_READLINE_CAUGHT_SIGNAL]: New.

gdb/testsuite/
2009-11-29  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.gdb/selftest.exp (backtrace through signal handler): Move before
	SIGINT pass, drop the timeout case.
	(send SIGINT signal to child process): Use gdb_test.
	(backtrace through readline handler): New.

--- a/gdb/config.in
+++ b/gdb/config.in
@@ -351,6 +351,9 @@
 /* Define if Python interpreter is being linked in. */
 #undef HAVE_PYTHON
 
+/* readline-6.0 workaround of blocked signals. */
+#undef HAVE_READLINE_CAUGHT_SIGNAL
+
 /* Define to 1 if you have the `realpath' function. */
 #undef HAVE_REALPATH
 
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -539,17 +539,25 @@ if test "$with_system_readline" = yes; then
   # readline-6.0 started to use the name `_rl_echoing_p'.
   # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
 
-  AC_MSG_CHECKING([for readline_echoing_p])
   save_LIBS=$LIBS
   LIBS="$LIBS $READLINE"
+  AC_MSG_CHECKING([for readline_echoing_p])
   AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p;
 				    return readline_echoing_p;]]),
 		 [READLINE_ECHOING_P=yes],
 		 [READLINE_ECHOING_P=no
 		  AC_DEFINE([readline_echoing_p], [_rl_echoing_p],
 			    [readline-6.0 started to use different name.])])
-  LIBS="$save_LIBS"
   AC_MSG_RESULT([$READLINE_ECHOING_P])
+  AC_MSG_CHECKING([for _rl_caught_signal])
+  AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int volatile _rl_caught_signal;
+				    return _rl_caught_signal;]]),
+		 [READLINE_CAUGHT_SIGNAL=yes
+		  AC_DEFINE([HAVE_READLINE_CAUGHT_SIGNAL],,
+			    [readline-6.0 workaround of blocked signals.])],
+		 [READLINE_CAUGHT_SIGNAL=no])
+  AC_MSG_RESULT([$READLINE_CAUGHT_SIGNAL])
+  LIBS="$save_LIBS"
 else
   READLINE='$(READLINE_DIR)/libreadline.a'
   READLINE_DEPS='$(READLINE)'
--- a/gdb/event-loop.c
+++ b/gdb/event-loop.c
@@ -37,6 +37,7 @@
 #include "exceptions.h"
 #include "gdb_assert.h"
 #include "gdb_select.h"
+#include "readline/readline.h"
 
 /* Data point to pass to the event handler.  */
 typedef union event_data
@@ -411,6 +412,9 @@ gdb_do_one_event (void *data)
   static int event_source_head = 0;
   const int number_of_sources = 3;
   int current = 0;
+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
+  extern int volatile _rl_caught_signal;
+#endif
 
   /* Any events already waiting in the queue?  */
   if (process_event ())
@@ -455,6 +459,16 @@ gdb_do_one_event (void *data)
   if (gdb_wait_for_event (1) < 0)
     return -1;
 
+#ifdef HAVE_READLINE_CAUGHT_SIGNAL
+  if (async_command_editing_p && RL_ISSTATE (RL_STATE_CALLBACK)
+      && _rl_caught_signal)
+    {
+      /* Call RL_CHECK_SIGNALS this way.  */
+      rl_callback_handler_remove ();
+      rl_callback_handler_install (NULL, input_handler);
+    }
+#endif
+
   /* Handle any new events occurred while waiting.  */
   if (process_event ())
     return 1;
--- a/gdb/testsuite/gdb.gdb/selftest.exp
+++ b/gdb/testsuite/gdb.gdb/selftest.exp
@@ -464,31 +464,42 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
 	    fail "$description (timeout)"
 	}
     }
-    
-    set description "send SIGINT signal to child process"
-    send_gdb "signal SIGINT\n"
-    gdb_expect {
-	-re "Continuing with signal SIGINT.*$gdb_prompt $" {
+
+    # get a stack trace with the poll function
+    #
+    # This fails on some linux systems for unknown reasons.  On the
+    # systems where it fails, sometimes it works fine when run manually.
+    # The testsuite failures may not be limited to just aout systems.
+    setup_xfail "i*86-pc-linuxaout-gnu"
+    set description "backtrace through signal handler"
+    gdb_test_multiple "backtrace" $description {
+	-re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
 	    pass "$description"
 	}
 	-re ".*$gdb_prompt $" {
+	    # On the alpha, we hit the infamous problem about gdb
+	    # being unable to get the frame pointer (mentioned in
+	    # gdb/README).  As it is intermittent, there is no way to
+	    # XFAIL it which will give us an XPASS if the problem goes
+	    # away.
+	    setup_xfail "alpha*-*-osf*"
 	    fail "$description"
 	}
-	timeout {
-	    fail "$description (timeout)"
-	}
     }
     
-    # get a stack trace
+    gdb_test "signal SIGINT" "Continuing with signal SIGINT.*" \
+	     "send SIGINT signal to child process"
+    
+    # get a stack trace being redelivered by readline
     #
     # This fails on some linux systems for unknown reasons.  On the
     # systems where it fails, sometimes it works fine when run manually.
     # The testsuite failures may not be limited to just aout systems.
+    # Optional system readline may not have symbols to be shown.
     setup_xfail "i*86-pc-linuxaout-gnu"
-    set description "backtrace through signal handler"
-    send_gdb "backtrace\n"
-    gdb_expect {
-	-re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
+    set description "backtrace through readline handler"
+    gdb_test_multiple "backtrace" $description {
+	-re "#0.*gdb_do_one_event.*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
 	    pass "$description"
 	}
 	-re ".*$gdb_prompt $" {
@@ -500,9 +510,6 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
 	    setup_xfail "alpha*-*-osf*"
 	    fail "$description"
 	}
-	timeout {
-	    fail "$description (timeout)"
-	}
     }
 
 
--- gdb-7.0/gdb/configure	2009-12-07 18:53:30.000000000 +0100
+++ gdb-7.0-x/gdb/configure	2009-12-07 18:53:14.000000000 +0100
@@ -9201,15 +9201,11 @@ if test "$with_system_readline" = yes; t
   # readline-6.0 started to use the name `_rl_echoing_p'.
   # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
 
-  echo "$as_me:$LINENO: checking for readline_echoing_p" >&5
-echo $ECHO_N "checking for readline_echoing_p... $ECHO_C" >&6
   save_LIBS=$LIBS
   LIBS="$LIBS $READLINE"
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5
+$as_echo_n "checking for readline_echoing_p... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -9221,45 +9217,45 @@ extern int readline_echoing_p;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
+if ac_fn_c_try_link "$LINENO"; then :
   READLINE_ECHOING_P=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+  READLINE_ECHOING_P=no
 
-READLINE_ECHOING_P=no
+$as_echo "#define readline_echoing_p _rl_echoing_p" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5
+$as_echo "$READLINE_ECHOING_P" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rl_caught_signal" >&5
+$as_echo_n "checking for _rl_caught_signal... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-cat >>confdefs.h <<\_ACEOF
-#define readline_echoing_p _rl_echoing_p
+int
+main ()
+{
+extern int volatile _rl_caught_signal;
+				    return _rl_caught_signal;
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  READLINE_CAUGHT_SIGNAL=yes
+
+$as_echo "#define HAVE_READLINE_CAUGHT_SIGNAL /**/" >>confdefs.h
 
+else
+  READLINE_CAUGHT_SIGNAL=no
 fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_CAUGHT_SIGNAL" >&5
+$as_echo "$READLINE_CAUGHT_SIGNAL" >&6; }
   LIBS="$save_LIBS"
-  echo "$as_me:$LINENO: result: $READLINE_ECHOING_P" >&5
-echo "${ECHO_T}$READLINE_ECHOING_P" >&6
 else
   READLINE='$(READLINE_DIR)/libreadline.a'
   READLINE_DEPS='$(READLINE)'

gdb-rhel5-compat.patch:
 ./gdb/corelow.c |    2 +-
 ./gdb/symfile.c |    2 +-
 gdb/linux-nat.c |   18 ++++++++++++++++--
 symfile.c       |    2 ++
 4 files changed, 20 insertions(+), 4 deletions(-)

--- NEW FILE gdb-rhel5-compat.patch ---
gdb/linux-nat.c:
- Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).

--- gdb-6.8/gdb-orig/symfile.c	2008-08-21 00:06:50.000000000 +0200
+++ gdb-6.8/gdb/symfile.c	2008-08-21 22:31:00.000000000 +0200
@@ -1456,8 +1456,10 @@ find_separate_debug_file (struct objfile
       /* Prevent looping on a stripped .debug file.  */
       if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
         {
+#if 0 /* RHEL-5 backward behavior compatibility.  */
 	  warning (_("\"%s\": separate debug info file has no debug info"),
 		   build_id_name);
+#endif
 	  xfree (build_id_name);
 	}
       else if (build_id_name != NULL)
--- ./gdb/corelow.c	2010-01-01 16:04:34.000000000 +0100
+++ ./gdb/corelow.c	2010-01-01 16:06:26.000000000 +0100
@@ -277,7 +277,7 @@ add_to_thread_list (bfd *abfd, asection 
     inferior_ptid = ptid;			 /* Yes, make it current */
 }
 
-static int build_id_core_loads = 1;
+static int build_id_core_loads = 0;
 
 static void
 build_id_locate_exec (int from_tty)
--- ./gdb/symfile.c	2010-01-01 16:04:35.000000000 +0100
+++ ./gdb/symfile.c	2010-01-01 16:06:12.000000000 +0100
@@ -1249,7 +1249,7 @@ symbol_file_clear (int from_tty)
 #define BUILD_ID_VERBOSE_NONE 0
 #define BUILD_ID_VERBOSE_FILENAMES 1
 #define BUILD_ID_VERBOSE_BINARY_PARSE 2
-static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES;
+static int build_id_verbose = BUILD_ID_VERBOSE_NONE;
 static void
 show_build_id_verbose (struct ui_file *file, int from_tty,
 		       struct cmd_list_element *c, const char *value)
--- gdb-7.0-orig/gdb/linux-nat.c	2009-12-19 20:53:46.000000000 +0100
+++ gdb-7.0/gdb/linux-nat.c	2009-12-19 20:55:02.000000000 +0100
@@ -1604,8 +1604,22 @@ GPT: lwp %s had signal %s, but it is in 
 	*status = lp->status;
     }
 
-  if (*status == 0 && GET_PID (lp->ptid) == pid_was_stopped)
-    *status = W_STOPCODE (SIGSTOP);
+  /* Workaround RHEL-5 kernel which has unreliable PTRACE_DETACH, SIGSTOP (that
+     many TIDs are left unstopped).  See RH Bug 496732.  */
+  if (GET_PID (lp->ptid) == pid_was_stopped)
+    {
+      int err;
+
+      errno = 0;
+      err = kill_lwp (GET_LWP (lp->ptid), SIGSTOP);
+      if (debug_linux_nat)
+	{
+	  fprintf_unfiltered (gdb_stdlog,
+			      "SC:  lwp kill %d %s\n",
+			      err,
+			      errno ? safe_strerror (errno) : "ERRNO-OK");
+	}
+    }
 
   return 0;
 }

gdb-rhel5-gcc44.patch:
 ./gdb/testsuite/gdb.fortran/common-block.exp    |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/derived-type.exp    |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/dwarf-stride.exp    |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/dynamic.exp         |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/library-module.exp  |   26 ++++++++++--
 ./gdb/testsuite/gdb.fortran/module.exp          |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/string.exp          |   20 +++++++++
 ./gdb/testsuite/gdb.fortran/subarray.exp        |   20 +++++++++
 ./gdb/testsuite/gdb.threads/tls-sepdebug.exp    |   20 +++++++++
 gdb-7.0/gdb/testsuite/gdb.base/break-interp.exp |   50 ++++++++++++++++++++++--
 gdb-7.0/gdb/testsuite/gdb.base/vla.exp          |   20 +++++++++
 gdb-7.0/gdb/testsuite/gdb.fortran/omp-step.exp  |   21 +++++++++-
 12 files changed, 260 insertions(+), 17 deletions(-)

--- NEW FILE gdb-rhel5-gcc44.patch ---
Some functionality is available on RHEL-5.4+ only with gcc44 and gfortran44 as
the default gcc and gfortran binaries are from gcc-4.1.

--- gdb-7.0/gdb/testsuite/gdb.base/vla.exp-orig	2009-12-20 00:38:13.000000000 +0100
+++ gdb-7.0/gdb/testsuite/gdb.base/vla.exp	2009-12-20 00:54:19.000000000 +0100
@@ -16,7 +16,25 @@
 set testfile vla
 set srcfile ${testfile}.c
 set binfile ${objdir}/${subdir}/${testfile}
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+# Temporarily provide compiler=gcc44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists compiler] {
+    set old_compiler [board_info $board compiler]
+    unset_board_info compiler
+} elseif [info exists old_compiler] {
+    unset old_compiler
+}
+set_board_info compiler gcc44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug quiet}]
+
+unset_board_info compiler
+if [info exists old_compiler] {
+    set_board_info compiler $old_compiler
+}
+
+if  { $err != "" } {
     untested "Couldn't compile test program"
     return -1
 }
--- gdb-7.0/gdb/testsuite/gdb.base/break-interp.exp-orig	2009-12-20 00:38:13.000000000 +0100
+++ gdb-7.0/gdb/testsuite/gdb.base/break-interp.exp	2009-12-20 01:11:47.000000000 +0100
@@ -31,10 +31,30 @@ if [get_compiler_info ${binfile_lib}] {
     return -1
 }
 
+# Temporarily provide compiler=gcc44 saving the original value around.
+# RHEL-5 workaround of its:
+#   gcc: -soname: linker input file unused because linking not done
+
+set board [target_info name]
+if [board_info $board exists compiler] {
+    set old_compiler [board_info $board compiler]
+    unset_board_info compiler
+} elseif [info exists old_compiler] {
+    unset old_compiler
+}
+set_board_info compiler gcc44
+
 # Use -soname so that it is listed with " => " by ldd and this testcase makes
 # a copy of ${binfile_lib} for each prelink variant.
 
-if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-Wl,-soname,${test}.so]] != ""} {
+set err [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug additional_flags=-Wl,-soname,${test}.so]]
+
+unset_board_info compiler
+if [info exists old_compiler] {
+    set_board_info compiler $old_compiler
+}
+
+if { $err != "" } {
     return -1
 }
 
@@ -483,9 +503,33 @@ foreach ldprelink {NO YES} {
 		    if {$binpie == "YES"} {
 			lappend opts {additional_flags=-fPIE -pie}
 		    }
-		    if {[build_executable ${test}.exp [file tail $exec] $srcfile $opts] == -1} {
-			continue;
+
+
+		    # Temporarily provide compiler=gcc44 saving the original value around.
+		    # RHEL-5 workaround of its:
+		    #   gcc: -rpath: linker input file unused because linking not done
+		    #   gcc: --dynamic-linker: linker input file unused because linking not done
+
+		    set board [target_info name]
+		    if [board_info $board exists compiler] {
+			set old_compiler [board_info $board compiler]
+			unset_board_info compiler
+		    } elseif [info exists old_compiler] {
+			unset old_compiler
+		    }
+		    set_board_info compiler gcc44
+
+		    set err [build_executable ${test}.exp [file tail $exec] $srcfile $opts]
+
+		    unset_board_info compiler
+		    if [info exists old_compiler] {
+			set_board_info compiler $old_compiler
 		    }
+
+		    if { $err == -1 } {
+			continue
+		    }
+
 		    if {$binsepdebug == "SEP"} {
 			gdb_gnu_strip_debug $exec
 			# Just a sanity check.  As gdb_gnu_strip_debug uses the
--- ./gdb/testsuite/gdb.fortran/common-block.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/common-block.exp	2009-12-15 05:21:00.000000000 +0100
@@ -20,7 +20,25 @@ set testfile "common-block"
 set srcfile ${testfile}.f90
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if  { $err != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- ./gdb/testsuite/gdb.fortran/dwarf-stride.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/dwarf-stride.exp	2009-12-15 05:20:07.000000000 +0100
@@ -27,7 +27,25 @@
 set testfile dwarf-stride
 set srcfile ${testfile}.f90
 
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}] } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler 
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+} 
+set_board_info f77compiler gfortran44
+
+set err [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if $err {
     return -1
 }
 
--- ./gdb/testsuite/gdb.fortran/dynamic.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/dynamic.exp	2009-12-15 05:17:21.000000000 +0100
@@ -25,7 +25,25 @@ set testfile "dynamic"
 set srcfile ${testfile}.f90
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if  { $err != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- ./gdb/testsuite/gdb.fortran/library-module.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/library-module.exp	2009-12-15 05:22:37.000000000 +0100
@@ -25,16 +25,34 @@ if [get_compiler_info not-used] {
    return -1
 }
 
-if  { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}] != "" } {
-    untested "Couldn't compile ${srclibfile}"
-    return -1
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
 }
+set_board_info f77compiler gfortran44
 
 # prepare_for_testing cannot be used as linking with $libfile cannot be passed
 # just for the linking phase (and not the source compilation phase).  And any
 # warnings on ignored $libfile abort the process.
 
-if  { [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}] != "" } {
+set err1 [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}]
+set err2 [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if  { $err1 != "" } {
+    untested "Couldn't compile ${srclibfile}"
+    return -1
+}
+if  { $err2 != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- ./gdb/testsuite/gdb.fortran/module.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/module.exp	2009-12-15 05:28:49.000000000 +0100
@@ -16,7 +16,25 @@
 set testfile "module"
 set srcfile ${testfile}.f90
 
-if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77}] } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if $err {
     return -1
 }
 
--- ./gdb/testsuite/gdb.fortran/string.exp	2009-12-15 05:13:56.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/string.exp	2009-12-15 05:18:13.000000000 +0100
@@ -23,7 +23,25 @@ set testfile "string"
 set srcfile ${testfile}.f90
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if { $err != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- gdb-7.0/gdb/testsuite/gdb.fortran/omp-step.exp-orig	2009-12-20 09:47:04.000000000 +0100
+++ gdb-7.0/gdb/testsuite/gdb.fortran/omp-step.exp	2009-12-20 09:50:06.000000000 +0100
@@ -15,7 +15,26 @@
 
 set testfile "omp-step"
 set srcfile ${testfile}.f90
-if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f77 additional_flags=-fopenmp}] } {
+
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler 
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+} 
+set_board_info f77compiler gfortran44
+
+set err [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f77 additional_flags=-fopenmp}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if $err {
     return -1
 }
 
--- ./gdb/testsuite/gdb.fortran/derived-type.exp	2009-01-07 13:39:13.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/derived-type.exp	2009-12-20 12:37:12.000000000 +0100
@@ -26,7 +26,25 @@ set testfile "derived-type"
 set srcfile ${testfile}.f90
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if { $err != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- ./gdb/testsuite/gdb.fortran/subarray.exp	2009-01-07 13:39:13.000000000 +0100
+++ ./gdb/testsuite/gdb.fortran/subarray.exp	2009-12-20 12:38:00.000000000 +0100
@@ -26,7 +26,25 @@ set testfile "subarray"
 set srcfile ${testfile}.f
 set binfile ${objdir}/${subdir}/${testfile}
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}] != "" } {
+# Temporarily provide f77compiler=gfortran44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists f77compiler] {
+    set old_f77compiler [board_info $board f77compiler]
+    unset_board_info f77compiler
+} elseif [info exists old_f77compiler] {
+    unset old_f77compiler
+}
+set_board_info f77compiler gfortran44
+
+set err [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug f77 quiet}]
+
+unset_board_info f77compiler
+if [info exists old_f77compiler] {
+    set_board_info f77compiler $old_f77compiler
+}
+
+if { $err != "" } {
     untested "Couldn't compile ${srcfile}"
     return -1
 }
--- ./gdb/testsuite/gdb.threads/tls-sepdebug.exp	2009-12-20 12:22:18.000000000 +0100
+++ ./gdb/testsuite/gdb.threads/tls-sepdebug.exp	2009-12-20 12:39:53.000000000 +0100
@@ -32,7 +32,25 @@ set binshareddebugfile ${objdir}/${subdi
 
 # FIXME: gcc dependency (-Wl,-soname).
 
-if  { [gdb_compile_shlib "${srcdir}/${subdir}/${srcsharedfile}" "${binsharedfile}" [list debug additional_flags=-Wl,-soname=${binsharedbase}]] != "" } {
+# Temporarily provide compiler=gcc44 saving the original value around.
+
+set board [target_info name]
+if [board_info $board exists compiler] {
+    set old_compiler [board_info $board compiler]
+    unset_board_info compiler
+} elseif [info exists old_compiler] {
+    unset old_compiler
+}
+set_board_info compiler gcc44
+
+set err [gdb_compile_shlib "${srcdir}/${subdir}/${srcsharedfile}" "${binsharedfile}" [list debug additional_flags=-Wl,-soname=${binsharedbase}]]
+
+unset_board_info compiler
+if [info exists old_compiler] {
+    set_board_info compiler $old_compiler
+}
+
+if { $err != "" } {
     untested "Couldn't compile test library"
     return -1
 }

gdb-stabs-read_args.patch:
 stabsread.c                   |   12 +++++++++++-
 testsuite/gdb.stabs/weird.def |    3 +++
 2 files changed, 14 insertions(+), 1 deletion(-)

--- NEW FILE gdb-stabs-read_args.patch ---
http://sourceware.org/ml/gdb-patches/2010-01/msg00142.html
Subject: [patch] Fix crash reading broken stabs

Hi,

seen this stabs from unknown variant of gcc-4.1.2:

1176586 LSYM   0      154    00000000 16682076 basic_string<char,std::char_traits<char>,std::allocator<char> >::_Rep:Tt(0,34)=s12!1,020,(0,35)=xs_Rep_base:;_S_max_size:/2(0,36)=k(0,30):_ZNSs4_Rep11_S_max_sizeE;_S_terminal:/2(0,22):_ZNSs4_Rep11_S_terminalE;_S_empty_rep_storage:/2(0,37)=ar(0,38)=r(0,38);0;037777777777;;0;3;(0,30):_ZNSs4_Rep20_S_empty_rep_storageE;_S_empty_rep::(0,39)=f(0,40)=&(0,34):_ZNSs4_Rep12_S_empty_repEv;2A?;_M_is_leaked::(0,41)=#(0,34),(0,42)=@s8;-16;,(0,43)=*(0,44)=k(0,34),(0,1);:_ZNKSs4_Rep12_M_is_leakedEv;2B.;_M_is_shared::(0,41):_ZNKSs4_Rep12_M_is_sharedEv;2B.;_M_set_leaked::(0,45)=#(0,34),(0,1),(0,33),(0,1);:_ZNSs4_Rep13_M_set_leakedEv;2A.;_M_set_sharable::(0,45):_ZNSs4_Rep15_M_set_sharableEv;2A.;_M_set_length_and_sharable::(0,46)=#(0,34),(0,1),(0,33),(0,25),(0,1);:_ZNSs4_Rep26_M_set_length_and_sharableEj;2A.;_M_refdata::(0,47)=#(0,34),(0,3),(0,33),(0,1);:_ZNSs4_Rep10_M_refdataEv;2A.;_M_grab::(0,48)=#(0,34),(0,3),(0,33),(0,5),(0,5),(0,1);:_ZNSs4_Rep7
 _M_grabERKSaIcES2_;2A.;_S_create::(0,49)=f(0,33):_ZNSs4_Rep9_S_createEjjRKSaIcE;2A?;_M_dispose::(0,50)=#(0,34),(0,1),(0,33),(0,5),(0,1);:_ZNSs4_Rep10_M_disposeERKSaIcE;2A.;_M_destroy::(0,51)=#(0,34),(0,1),(0,33),(0,5),(0,1);:_ZNSs4_Rep10_M_destroyERKSaIcE;2A.;_M_refcopy::(0,47):_ZNSs4_Rep10_M_refcopyEv;2A.;_M_clone::(0,52)=#(0,34),(0,3),(0,33),(0,5),(0,25),(0,1);:_ZNSs4_Rep8_M_cloneERKSaIcEj;2A.;;

There is a GDB crash at:
_M_is_leaked::(0,41)=#(0,34),(0,42)=@s8;-16;,(0,43)=*(0,44)=k(0,34),(0,1);
                                           ^^
+ [...] Some broken stabs
+	 output contained `(0,41),(0,42)=@s8;-16;,(0,43),(0,1);' where should
+	 have been present ";-16,(0,43)" reference instead.  This way the
+	 excessive ";" marker prematurely stops the parameters parsing.  */

Still I was unable to reproduce producing such STABS output.

So this patch does not try to compensate the - presumably - buggy STABS output
and parses such record incorrectly.  But it no longer crashes.

No regressions on {x86_64-m32,i686}-fedora12-linux-gnu
using --target_board unix/-gstabs+/-m32.


Thanks,
Jan


gdb/
2010-01-07  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* stabsread.c (read_args): Handle zero arguments.

gdb/testsuite/
2010-01-07  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.stabs/weird.def (args93): New.

--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -4111,7 +4111,17 @@ read_args (char **pp, int end, struct objfile *objfile, int *nargsp,
     }
   (*pp)++;			/* get past `end' (the ':' character) */
 
-  if (TYPE_CODE (types[n - 1]) != TYPE_CODE_VOID)
+  if (n == 0)
+    {
+      /* We should read at least the THIS parameter here.  Some broken stabs
+	 output contained `(0,41),(0,42)=@s8;-16;,(0,43),(0,1);' where should
+	 have been present ";-16,(0,43)" reference instead.  This way the
+	 excessive ";" marker prematurely stops the parameters parsing.  */
+
+      complaint (&symfile_complaints, _("Invalid (empty) method arguments"));
+      *varargsp = 0;
+    }
+  else if (TYPE_CODE (types[n - 1]) != TYPE_CODE_VOID)
     *varargsp = 1;
   else
     {
--- a/gdb/testsuite/gdb.stabs/weird.def
+++ b/gdb/testsuite/gdb.stabs/weird.def
@@ -880,3 +880,6 @@ var3:
 .stabs "sym92:\ !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",N_LSYM,0,0,0
 .stabs "type92:t92=\ !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",N_LSYM,0,0,0
 .stabs "attr92:G392=@\ !#$%&'()*+,-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~;1",N_GSYM,0,0, 0
+
+# See read_args "Invalid (empty) method arguments" error.
+.stabs "args93:G93=#(0,93),(0,93)=@s8;-16;,(0,93),(0,93);",N_GSYM,0,0,0

gdb-stale-related_breakpoint.patch:
 breakpoint.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

--- NEW FILE gdb-stale-related_breakpoint.patch ---
http://sourceware.org/ml/gdb-patches/2009-12/msg00364.html
Subject: [patch] related_breakpoint stale ref crash fix

Hi,

getting occasional random:
 PASS: gdb.threads/local-watch-wrong-thread.exp: local watchpoint still triggers
 PASS: gdb.threads/local-watch-wrong-thread.exp: let thread_function0 return
 PASS: gdb.threads/local-watch-wrong-thread.exp: breakpoint on thread_function0's caller
-PASS: gdb.threads/local-watch-wrong-thread.exp: local watchpoint automatically deleted
+ERROR: Process no longer exists
+UNRESOLVED: gdb.threads/local-watch-wrong-thread.exp: local watchpoint automatically deleted

It is even reproducible on HEAD using "input" file below and:
	valgrind ../gdb -nx <input

(gdb) (gdb) Breakpoint 6 at 0x400685: file ./gdb.threads/local-watch-wrong-thread.c, line 47.
(gdb) ==31759== Invalid write of size 4
==31759==    at 0x601A11: bpstat_check_breakpoint_conditions (breakpoint.c:3482)
==31759==    by 0x601C70: bpstat_stop_status (breakpoint.c:3596)
==31759==    by 0x65D228: handle_inferior_event (infrun.c:3589)
==31759==    by 0x65A563: wait_for_inferior (infrun.c:2281)
==31759==    by 0x659AA0: proceed (infrun.c:1883)
==31759==    by 0x65300B: continue_1 (infcmd.c:668)
==31759==    by 0x653282: continue_command (infcmd.c:760)
==31759==    by 0x5C51D8: do_cfunc (cli-decode.c:67)
==31759==    by 0x5C824F: cmd_func (cli-decode.c:1738)
==31759==    by 0x48335A: execute_command (top.c:450)
==31759==    by 0x67273E: command_handler (event-top.c:511)
==31759==    by 0x672E53: command_line_handler (event-top.c:736)
==31759==  Address 0xbbdc950 is 240 bytes inside a block of size 336 free'd
==31759==    at 0x4A04D72: free (vg_replace_malloc.c:325)
==31759==    by 0x486E4B: xfree (utils.c:1286)
==31759==    by 0x60BC35: delete_breakpoint (breakpoint.c:8708)
==31759==    by 0x60BDAF: delete_command (breakpoint.c:8765)
==31759==    by 0x5C51D8: do_cfunc (cli-decode.c:67)
==31759==    by 0x5C824F: cmd_func (cli-decode.c:1738)
==31759==    by 0x48335A: execute_command (top.c:450)
==31759==    by 0x67273E: command_handler (event-top.c:511)
==31759==    by 0x672E53: command_line_handler (event-top.c:736)
==31759==    by 0x672FCF: gdb_readline2 (event-top.c:817)
==31759==    by 0x6725F7: stdin_event_handler (event-top.c:433)
==31759==    by 0x670CDE: handle_file_event (event-loop.c:812)
==31759== 

Watchpoint 4 deleted because the program has left the block in
which its expression is valid.


There is already automatic deletion of RELATED_BREAKPOINT in
map_breakpoint_numbers but "delete breakpoints" (for all the breakpoints)
calls delete_breakpoint from delete_command directly without calling
map_breakpoint_numbers and it does not delete the associated
bp_watchpoint_scope.

I find the attached patch is right for delete_breakpoint itself as such
function should not leave stale references in the leftover data structures.
How well could be other code cleaned up with this patch in place I have not
targeted by this patch.


The existing code expects accessibility of freed memory and discusses the
current stale references problem:

void
delete_breakpoint (struct breakpoint *bpt)
[...]
  /* Has this bp already been deleted?  This can happen because multiple
     lists can hold pointers to bp's.  bpstat lists are especial culprits.

     One example of this happening is a watchpoint's scope bp.  When the
     scope bp triggers, we notice that the watchpoint is out of scope, and
     delete it.  We also delete its scope bp.  But the scope bp is marked
     "auto-deleting", and is already on a bpstat.  That bpstat is then
     checked for auto-deleting bp's, which are deleted.

     A real solution to this problem might involve reference counts in bp's,
     and/or giving them pointers back to their referencing bpstat's, and
     teaching delete_breakpoint to only free a bp's storage when no more
     references were extent.  A cheaper bandaid was chosen.  */
  if (bpt->type == bp_none)
    return;
[...]
  bpt->type = bp_none;

  xfree (bpt);
}


While fixing this part may be difficult I find the attached patch easy enough
fixing the IMO currently most common crash due to it.

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.


Thanks,
Jan


"input":
set height 0
set width 0
set confirm no
file ../testsuite/gdb.threads/local-watch-wrong-thread
set can-use-hw-watchpoints 1
break main
run
break local-watch-wrong-thread.c:36
continue
delete breakpoints
watch *myp
continue
delete breakpoints
echo MAKE watch\n
watch *myp if trigger != 0
echo MAKE break\n
break local-watch-wrong-thread.c:60
info break
continue
echo DELETE five\n
delete 5
set trigger=1
continue
set *myp=0
break local-watch-wrong-thread.c:47
continue



2009-12-23  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* breakpoint.c (delete_breakpoint <bpt->related_breakpoint != NULL>):
	New.

--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -8649,6 +8649,16 @@ delete_breakpoint (struct breakpoint *bpt)
   if (bpt->type == bp_none)
     return;
 
+  /* At least avoid this stale reference until the reference counting of
+     breakpoints gets resolved.  */
+  if (bpt->related_breakpoint != NULL)
+    {
+      gdb_assert (bpt->related_breakpoint->related_breakpoint == bpt);
+      bpt->related_breakpoint->disposition = disp_del_at_next_stop;
+      bpt->related_breakpoint->related_breakpoint = NULL;
+      bpt->related_breakpoint = NULL;
+    }
+
   observer_notify_breakpoint_deleted (bpt->number);
 
   if (breakpoint_chain == bpt)


gdb-testsuite-unknown-output.patch:
 mi-support.exp |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE gdb-testsuite-unknown-output.patch ---
http://sourceware.org/ml/gdb-patches/2009-12/msg00473.html
Subject: [patch] testsuite: false MI "unknown output after running" regression

Hi,

the attached patch will turn the results this way:
-KFAIL: gdb.mi/mi-until.exp: until after while loop (unknown output after running) (PRMS: gdb/2104)
+KFAIL: gdb.mi/mi-until.exp: until after while loop (stopped at wrong place) (PRMS: gdb/2104)
-XFAIL: gdb.mi/mi-watch.exp: sw: watchpoint trigger (unknown output after running)
+XFAIL: gdb.mi/mi-watch.exp: sw: watchpoint trigger (stopped at wrong place)
-KFAIL: gdb.mi/mi2-until.exp: until after while loop (unknown output after running) (PRMS: gdb/2104)
+KFAIL: gdb.mi/mi2-until.exp: until after while loop (stopped at wrong place) (PRMS: gdb/2104)
-XFAIL: gdb.mi/mi2-watch.exp: sw: watchpoint trigger (unknown output after running)
+XFAIL: gdb.mi/mi2-watch.exp: sw: watchpoint trigger (stopped at wrong place)

This is a fix of KFAIL-kind regression due to:
commit 26d086d741fb1bb0eee9d50e0bafa7c5e388023f
Re: [RFA] fix *stopped for CLI commands
http://sourceware.org/ml/gdb-patches/2009-02/msg00278.html
http://sourceware.org/ml/gdb-cvs/2009-02/msg00084.html
part:
gdb/testsuite/
2009-02-14  Vladimir Prus  <vladimir at codesourcery.com>
	* lib/mi-support.exp (mi_expect_stop): Adjust the order of fields.
	(mi_expect_interrupt): Likewise.
	* gdb.mi/mi-cli.exp: Check that "step" results in proper *stopped
	response.

re-wdiff-ed for your convenience as:
    verbose -log "mi_expect_stop: expecting: \\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"$line\"\}$after_stopped{+,thread-id=\"$decimal\",stopped-threads=$any+}\r\n($thread_selected_re)?$prompt_re"
	-re "\\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$func\",args=$args,file=\"$any$file\",fullname=\"${fullname_syntax}$file\",line=\"($line)\"\}$after_stopped{+,thread-id=\"$decimal\",stopped-threads=$any+}\r\n($thread_selected_re)?$prompt_re" {
	-re "\\*stopped,${r}${a}${bn}[-thread-id=\"$decimal\",stopped-threads=$any,-]frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}[-$any-]{+thread-id=\"$decimal\",stopped-threads=$any+}\r\n$prompt_re" {

FYI there is: set any "\[^\n\]*"

"stopped at wrong place" is the right kind of KFAIL/XFAIL (tested
gcc-4.1.2-46.el5_4.1.x86_64 and gcc-4.4.2-20.fc12.x86_64) as discussed
in PR gdb/2104.

In the last case there is missing comma (,) after the former patch above.

$after_stopped was IMO missing there even before.  It is in use only by
gdb.mi/mi-simplerun.exp and gdb.mi/mi2-simplerun.exp.  Also fixed below.

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.


Thanks,
Jan


gdb/testsuite/
2009-12-31  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* lib/mi-support.exp (mi_expect_stop <stopped at wrong place>): Insert
	missing $after_stopped and comma (,) expectation.

--- a/gdb/testsuite/lib/mi-support.exp
+++ b/gdb/testsuite/lib/mi-support.exp
@@ -1038,7 +1038,7 @@ proc mi_expect_stop { reason func args file line extra test } {
 	    pass "$test"
             return $expect_out(2,string)
 	}
-	-re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
+	-re "\\*stopped,${r}${a}${bn}frame=\{addr=\"$hex\",func=\"$any\",args=\[\\\[\{\]$any\[\\\]\}\],file=\"$any\",fullname=\"${fullname_syntax}$any\",line=\"\[0-9\]*\"\}$after_stopped,thread-id=\"$decimal\",stopped-threads=$any\r\n$prompt_re" {
             verbose -log "got $expect_out(buffer)"
 	    fail "$test (stopped at wrong place)"
 	    return -1


gdb-watchpoint-cond-gone.patch:
 b/gdb/testsuite/gdb.base/watchpoint-cond-gone-stripped.c |   23 ++++++
 b/gdb/testsuite/gdb.base/watchpoint-cond-gone.c          |   37 ++++++++++
 b/gdb/testsuite/gdb.base/watchpoint-cond-gone.exp        |   51 +++++++++++++++
 gdb/breakpoint.c                                         |   22 +++---
 4 files changed, 122 insertions(+), 11 deletions(-)

--- NEW FILE gdb-watchpoint-cond-gone.patch ---
http://sourceware.org/ml/gdb-patches/2009-12/msg00394.html
Subject: [patch] Fix watchpoint-at-epilogue 7.0 regression (s390x)

Hi,

attached testcase regressed 6.8->7.0 on some s390x systems.

At the moment PC is at epilogue (after frame pointer got destroyed and PC is
still in the calleed function) we must not try any unwinding as it can try to
unwind a garbage.

Correct way would be to implement epilogue unwinder (such as
amd64_epilogue_frame_unwind or i386_epilogue_frame_unwind ones) but it would
not be so easy on s390x as it would need full prologue-analyzer: After SP gets
restored there can be various instructions before the last jump - GDB needs to
interpret the jump to find the register value where it is going to jump to.
00000048279aa09c <round_and_return>:
[...]
  48279aa1b8: eb 6f f0 d0 00 04 lmg  %r6,%r15,208(%r15)
  48279aa1be: 50 32 10 00       st   %r3,0(%r2,%r1)	# SP (%r15) is gone hone
  48279aa1c2: b3 74 00 00       lzer %r0
  48279aa1c6: 07 f4             br   %r4		# %r4 is the target
[...]

Just an easy fix is to be more careful and do not try any unwinding if we find
PC is in the epilogue (previous instruction modifies SP=%r15).

It is even a performance optimization and I see no regression risk there.

The specific s390x error is:
#0  throw_error (error=MEMORY_ERROR, fmt=0x8042676a "Cannot access memory at address %s") at exceptions.c:415
#1  in memory_error (status=5, memaddr=0) at corefile.c:220
#2  in read_memory (memaddr=0, myaddr=0x3ffffc7f7f0 "", len=8) at corefile.c:238
#3  in read_memory_unsigned_integer (memaddr=0, len=8, byte_order=BFD_ENDIAN_BIG) at corefile.c:321
#4  in s390_backchain_frame_unwind_cache (this_frame=0x80608958, info=0x80608a08) at s390-tdep.c:1525
#5  in s390_frame_unwind_cache (this_frame=0x80608958, this_prologue_cache=0x80608970) at s390-tdep.c:1572
#6  in s390_frame_this_id (this_frame=0x80608958, this_prologue_cache=0x80608970, this_id=0x806089b8) at s390-tdep.c:1583
#7  in get_frame_id (fi=0x80608958) at frame.c:335
#8  in frame_find_by_id (id={stack_addr = 4398044824952, code_addr = 2147484952, special_addr = 0, stack_addr_p = 1, code_addr_p = 1, special_addr_p = 0, inline_depth = 0}) at frame.c:587 
#9  in watchpoint_check (p=0x8095bbc0) at breakpoint.c:3203
#10 in catch_errors (func=0x801262c0 <watchpoint_check>, func_args=0x8095bbc0, errstring=0x80a26410 "Error evaluating expression for watchpoint 3\n", mask=6) at exceptions.c:510
#11 in bpstat_check_watchpoint (bs=0x8095bbc0) at breakpoint.c:3404
#12 in bpstat_stop_status (aspace=0x8061fcb0, bp_addr=2147485040, ptid={pid = 17372, lwp = 17372, tid = 0}) at breakpoint.c:3594
#13 in handle_inferior_event (ecs=0x3ffffc80520) at infrun.c:3588

I did not analyze why 6.8 did not error out, the GDB code is similar there.

No regressions on:
{x86_64,x86_64-m32,i686}-fedora12-linux-gnu (CVS HEAD GDB)
s390x-rhel48-linux-gnu (CVS HEAD GDB)
s390-rhel48-linux-gnu (CVS HEAD GDB)
s390x-rhel54-linux-gnu (Fedora 12 GDB)
s390-rhel54-linux-gnu (Fedora 12 GDB)


Thanks,
Jan


gdb/
2009-12-25  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* breakpoint.c (watchpoint_check): Check the call
	gdbarch_in_function_epilogue_p before calling frame_find_by_id.
	Extend the comment.

gdb/testsuite/
2009-12-25  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* gdb.base/watchpoint-cond-gone.exp, gdb.base/watchpoint-cond-gone.c,
	gdb.base/watchpoint-cond-gone-stripped.c: New.

--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3200,6 +3200,17 @@ watchpoint_check (void *p)
       struct gdbarch *frame_arch = get_frame_arch (frame);
       CORE_ADDR frame_pc = get_frame_pc (frame);
 
+      /* in_function_epilogue_p() returns a non-zero value if we're still
+	 in the function but the stack frame has already been invalidated.
+	 Since we can't rely on the values of local variables after the
+	 stack has been destroyed, we are treating the watchpoint in that
+	 state as `not changed' without further checking.  Don't mark
+	 watchpoints as changed if the current frame is in an epilogue -
+	 even if they are in some other frame, our view of the stack
+	 is likely to be wrong and frame_find_by_id could error out.  */
+      if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
+	return WP_VALUE_NOT_CHANGED;
+
       fr = frame_find_by_id (b->watchpoint_frame);
       within_current_scope = (fr != NULL);
 
@@ -3216,17 +3227,6 @@ watchpoint_check (void *p)
 	    within_current_scope = 0;
 	}
 
-      /* in_function_epilogue_p() returns a non-zero value if we're still
-	 in the function but the stack frame has already been invalidated.
-	 Since we can't rely on the values of local variables after the
-	 stack has been destroyed, we are treating the watchpoint in that
-	 state as `not changed' without further checking.  Don't mark
-	 watchpoints as changed if the current frame is in an epilogue -
-	 even if they are in some other frame, our view of the stack
-	 is likely to be wrong.  */
-      if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
-	return WP_VALUE_NOT_CHANGED;
-
       if (within_current_scope)
 	/* If we end up stopping, the current frame will get selected
 	   in normal_stop.  So this call to select_frame won't affect
--- /dev/null
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone-stripped.c
@@ -0,0 +1,23 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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. */
+
+void
+jumper (void (*jumpto) (void))
+{
+  (*jumpto) ();
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.c
@@ -0,0 +1,37 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2009 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. */
+
+extern void jumper (void (*jumpto) (void));
+
+static void
+func (void)
+{
+  volatile int c;
+
+  c = 5;
+  c = 10;	/* watchpoint-here */
+  c = 20;
+}
+
+int
+main (void)
+{
+  jumper (func);
+
+  return 0;
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.exp
@@ -0,0 +1,51 @@
+# Copyright 2009 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.
+
+set testfile "watchpoint-cond-gone"
+set srcfile ${testfile}.c
+set srcfilestripped ${testfile}-stripped.c
+set objfilestripped ${objdir}/${subdir}/${testfile}-stripped.o
+set binfile ${objdir}/${subdir}/${testfile}
+
+# We need to generate a function without DWARF to crash older GDB.
+# Stepping into a dynamic function trampoline or stepping out of MAIN may work
+# but it is not a reliable FAIL case.
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfilestripped}" "${objfilestripped}" object {}] != ""
+      || [gdb_compile "${srcdir}/${subdir}/${srcfile} ${objfilestripped}" "${binfile}" executable {debug}] != "" } {
+    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+clean_restart ${testfile}
+
+# Problem does not occur otherwise.
+gdb_test "set can-use-hw-watchpoints 0"
+
+if ![runto_main] {
+    return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "watchpoint-here"]
+gdb_continue_to_breakpoint "Place to set the watchpoint"
+
+# The condition `c == 30' is the subject being tested.
+gdb_test "watch c if c == 30" "" "Place the watchpoint"
+
+# We may stay either in the function itself or only at the first instruction of
+# its caller depending on the epilogue unwinder (or valid epilogue CFI) presence.
+gdb_test "finish" \
+	 "Watchpoint .* deleted because the program has left the block in.*which its expression is valid..*in (jumper|func).*" \
+	 "Catch the no longer valid watchpoint"


gdb-x86_64-i386-syscall-restart.patch:
 amd64-nat.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

--- NEW FILE gdb-x86_64-i386-syscall-restart.patch ---
http://sourceware.org/ml/gdb-patches/2009-11/msg00592.html
Subject: [patch] Fix syscall restarts for amd64->i386 biarch

Hi,

tested only on recent Linux kernels, it should apply also on vanilla ones.
There were various changes of the kernels behavior in the past.

FSF GDB HEAD state:
kernel debugger inferior state
x86_64 x86_64   x86_64   PASS
x86_64 x86_64   i386     FAIL without this patch, PASS with this patch
x86_64 i386     i386     PASS on recent kernels
                         (FAIL: kernel-2.6.31.5-127.fc12.x86_64 - Fedora 12)
                         (PASS: kernel-2.6.32-0.55.rc8.git1.fc13.x86_64)
i386   i386     i386     PASS


Currently gdb.base/interrupt.exp fails on amd64 host running under
--target_board unix/-m32 with:
	continue
	Continuing.
	Unknown error 512

<linux/errno.h>:
/*
 * These should never be seen by user programs.  To return one of ERESTART*
 * codes, signal_pending() MUST be set.  Note that ptrace can observe these
 * at syscall exit tracing, but they will never be left for the debugged user
 * process to see.
 */
#define ERESTARTSYS     512

"Unknown error 512" printed above is printed by the inferior itself, not by GDB.

It is because GDB reads it as 0xfffffffffffffe00 but writes it back as
0xfffffe00.
+      /* Sign-extend %eax as during return from a syscall it is being checked
+	 for -ERESTART* values -512 being above 0xfffffffffffffe00; tested by
+	 interrupt.exp.  */


Quote of Roland McGrath from IRC:

roland: in the user_regset model, there are 64-bit user_regset flavors and
32-bit user_regset flavors, so at the kabi level the (kernel) caller can say
what it means: calls on the 32-bit user_regset flavor will behave as if on
a 32-bit kernel/userland.  in ptrace, there is no way for x86_64 ptrace calls
to say "i think of the inferior as being 32 bits, so act accordingly" (tho ppc
and/or sparc have ptr
roland: ace requests that do that iirc)
roland: ergo 64-bit ptrace callers must either save/restore full 64-bits so
the kernel's sign-extension choices are preserved, or else grok magic ways to
expand stored 32-bit register contents to 64-bit values to stuff via 64-bit
ptrace
[...]
roland: there is a "32-bit-flavored task", but it's not really true that it
has 32-bit registers.  there is no 32-bit-only userland condition.  any task
can always ljmp to the 64-bit code segment and run 64-bit insns including
a 64-bit syscall
roland: so a 64-bit debugger should see and be able to fiddle the full
registers.  it can even change cs via ptrace to force the inferior into
running 32 or 64 bit code.


Saving whole 64bits for i386 targets on x86_64 hosts does not much match the
GDB architecture as `struct type' for these registers still should be 32bit
etc.   Therefore provided just this exception.

The problem is reproducible only if one does an inferior call during the
interruption to do full inferior save/restore from GDB regcache.

Regression tested on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.


Thanks,
Jan


gdb/
2009-11-29  Jan Kratochvil  <jan.kratochvil at redhat.com>

	* amd64-nat.c (amd64_collect_native_gregset): Do not pre-clear %eax.
	Sign extend it afterwards.

--- a/gdb/amd64-nat.c
+++ b/gdb/amd64-nat.c
@@ -131,9 +131,9 @@ amd64_collect_native_gregset (const struct regcache *regcache,
     {
       num_regs = amd64_native_gregset32_num_regs;
 
-      /* Make sure %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp and
+      /* Make sure %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp and
          %eip get zero-extended to 64 bits.  */
-      for (i = 0; i <= I386_EIP_REGNUM; i++)
+      for (i = I386_ECX_REGNUM; i <= I386_EIP_REGNUM; i++)
 	{
 	  if (regnum == -1 || regnum == i)
 	    memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8);
@@ -159,4 +159,20 @@ amd64_collect_native_gregset (const struct regcache *regcache,
 	    regcache_raw_collect (regcache, i, regs + offset);
 	}
     }
+
+  if (gdbarch_ptr_bit (gdbarch) == 32)
+    {
+      /* Sign-extend %eax as during return from a syscall it is being checked
+	 for -ERESTART* values -512 being above 0xfffffffffffffe00; tested by
+	 interrupt.exp.  */
+
+      int i = I386_EAX_REGNUM;
+
+      if (regnum == -1 || regnum == i)
+	{
+	  void *ptr = regs + amd64_native_gregset_reg_offset (gdbarch, i);
+
+	  *(int64_t *) ptr = *(int32_t *) ptr;
+	}
+    }
 }



Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/.cvsignore,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -p -r1.42 -r1.43
--- .cvsignore	30 Sep 2009 20:58:49 -0000	1.42
+++ .cvsignore	12 Jan 2010 22:15:54 -0000	1.43
@@ -1,2 +1,2 @@
-libstdc++-v3-python-r151798.tar.xz
-gdb-6.8.91.20090930.tar.bz2
+gdb-7.0.1.tar.bz2
+libstdc++-v3-python-r151798.tar.bz2



gdb-6.3-ia64-info-frame-fix-20050725.patch:
 ia64-sigtramp.c   |   23 +++++++++++++++++
 ia64-sigtramp.exp |   73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+)

Index: gdb-6.3-ia64-info-frame-fix-20050725.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.3-ia64-info-frame-fix-20050725.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- gdb-6.3-ia64-info-frame-fix-20050725.patch	3 Mar 2008 16:13:47 -0000	1.2
+++ gdb-6.3-ia64-info-frame-fix-20050725.patch	12 Jan 2010 22:15:54 -0000	1.3
@@ -41,7 +41,7 @@ testsuite:
 +
 --- gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.exp.fix	2005-07-25 16:42:50.000000000 -0400
 +++ gdb-6.3/gdb/testsuite/gdb.arch/ia64-sigtramp.exp	2005-07-25 16:42:01.000000000 -0400
-@@ -0,0 +1,66 @@
+@@ -0,0 +1,73 @@
 +#   Copyright 2005 Free Software Foundation, Inc.
 +
 +# This program is free software; you can redistribute it and/or modify
@@ -90,7 +90,10 @@ testsuite:
 +}
 +
 +gdb_exit
++set match_max_old [match_max]
++match_max -d 1000000
 +gdb_start
++match_max -d $match_max_old
 +gdb_reinitialize_dir $srcdir/$subdir
 +gdb_load ${binfile}
 +
@@ -106,5 +109,9 @@ testsuite:
 +gdb_test "continue" "Breakpoint.*x.*" "continue to x"
 +
 +gdb_test "f 1" ".*signal handler called.*" "frame 1"
-+gdb_test "info frame" "Stack level 1.*p63 at .*" "info sigtramp frame"
-+ 
++
++# gdb-7.0+ no longer prints the pseudo registers as they are computed.
++# frame_info says: /* For moment, only display registers that were saved on the
++#                     stack.  */
++gdb_test "set debug frame 1"
++gdb_test "info frame" "Stack level 1, .*frame_unwind_register_value \\(frame=1,regnum=750\\(p63\\),\[^\r\n\]*\r\n\[^\r\n\]*-> computed bytes=.*" "info sigtramp frame"

gdb-6.3-ia64-sigtramp-frame-20050708.patch:
 ia64-tdep.c |  125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 124 insertions(+), 1 deletion(-)

Index: gdb-6.3-ia64-sigtramp-frame-20050708.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.3-ia64-sigtramp-frame-20050708.patch,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -p -r1.4 -r1.5
--- gdb-6.3-ia64-sigtramp-frame-20050708.patch	14 Dec 2008 14:05:14 -0000	1.4
+++ gdb-6.3-ia64-sigtramp-frame-20050708.patch	12 Jan 2010 22:15:54 -0000	1.5
@@ -29,7 +29,7 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep
 +      ULONGEST unatN_val;
 +      ULONGEST unat;
 +      read_memory (cache->saved_regs[IA64_UNAT_REGNUM], (char *) &unat,
-+		   register_size (current_gdbarch, IA64_UNAT_REGNUM));
++		   register_size (target_gdbarch, IA64_UNAT_REGNUM));
 +      unatN_val = (unat & (1LL << (regnum - IA64_NAT0_REGNUM))) != 0;
 +      return frame_unwind_got_constant (this_frame, regnum, unatN_val);
 +    }
@@ -45,9 +45,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep
 +      CORE_ADDR gr_addr = 0, nat_addr = 0;
 +
 +      read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp,
-+		   register_size (current_gdbarch, IA64_BSP_REGNUM));
++		   register_size (target_gdbarch, IA64_BSP_REGNUM));
 +      read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
-+		   register_size (current_gdbarch, IA64_CFM_REGNUM));
++		   register_size (target_gdbarch, IA64_CFM_REGNUM));
 +
 +      /* The bsp points at the end of the register frame so we
 +	 subtract the size of frame from it to get start of register frame.  */
@@ -71,10 +71,10 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep
 +	      nat_addr = cache->saved_regs[IA64_RNAT_REGNUM];
 +	      if (nat_addr != 0)
 +		read_memory (nat_addr, (char *) &nat_collection,
-+			     register_size (current_gdbarch, IA64_RNAT_REGNUM));
++			     register_size (target_gdbarch, IA64_RNAT_REGNUM));
 +	    }
 +	  else
-+	    nat_collection = read_memory_integer (nat_addr, 8);
++	    nat_collection = read_memory_integer (nat_addr, 8, BFD_ENDIAN_LITTLE);
 +	  if (nat_addr != 0)
 +	    {
 +	      nat_bit = (gr_addr >> 3) & 0x3f;
@@ -97,9 +97,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep
 +      ULONGEST bof;
 +
 +      read_memory (cache->saved_regs[IA64_BSP_REGNUM], (char *) &bsp,
-+		   register_size (current_gdbarch, IA64_BSP_REGNUM));
++		   register_size (target_gdbarch, IA64_BSP_REGNUM));
 +      read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
-+		   register_size (current_gdbarch, IA64_CFM_REGNUM));
++		   register_size (target_gdbarch, IA64_CFM_REGNUM));
 +
 +      /* The bsp points at the end of the register frame so we
 +	 subtract the size of frame from it to get beginning of frame.  */
@@ -133,9 +133,9 @@ Index: gdb-6.8.50.20081128/gdb/ia64-tdep
 +	  ULONGEST cfm;
 +	  ULONGEST prN_val;
 +	  read_memory (pr_addr, (char *) &pr,
-+		       register_size (current_gdbarch, IA64_PR_REGNUM));
++		       register_size (target_gdbarch, IA64_PR_REGNUM));
 +	  read_memory (cache->saved_regs[IA64_CFM_REGNUM], (char *) &cfm,
-+		       register_size (current_gdbarch, IA64_CFM_REGNUM));
++		       register_size (target_gdbarch, IA64_CFM_REGNUM));
 +
 +	  /* Get the register rename base for this frame and adjust the
 +	   * register name to take rotation into account. */

gdb-6.3-rh-testversion-20041202.patch:
 selftest.exp |    3 +++
 1 file changed, 3 insertions(+)

Index: gdb-6.3-rh-testversion-20041202.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.3-rh-testversion-20041202.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -p -r1.3 -r1.4
--- gdb-6.3-rh-testversion-20041202.patch	14 Jul 2008 09:09:04 -0000	1.3
+++ gdb-6.3-rh-testversion-20041202.patch	12 Jan 2010 22:15:54 -0000	1.4
@@ -11,8 +11,8 @@ Index: gdb-6.8/gdb/testsuite/gdb.gdb/sel
  	-re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" {
  	    pass "printed version with cast"
  	}
-+	-re ".\[0-9\]+ = .Fedora \[\\(\\)0-9.a-z\\-\]+.*$gdb_prompt $" {
-+	    pass "printed version Fedora only"
++	-re ".\[0-9\]+ = .(Fedora|Red Hat Enterprise Linux) \[\\(\\)0-9.a-z\\-\]+.*$gdb_prompt $" {
++	    pass "printed version Fedora or Red Hat Enterprise Linux only"
 +	}
  	-re ".*$gdb_prompt $"	{ fail "printed version" }
  	timeout		{ fail "(timeout) printed version" }

gdb-6.3-test-dtorfix-20050121.patch:
 constructortest.cc  |   99 +++++++++++++++++++++++++++++++++++++
 constructortest.exp |  137 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 236 insertions(+)

Index: gdb-6.3-test-dtorfix-20050121.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.3-test-dtorfix-20050121.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -p -r1.8 -r1.9
--- gdb-6.3-test-dtorfix-20050121.patch	27 Aug 2008 11:07:47 -0000	1.8
+++ gdb-6.3-test-dtorfix-20050121.patch	12 Jan 2010 22:15:54 -0000	1.9
@@ -129,7 +129,7 @@ Index: gdb/testsuite/ChangeLog
 +}
 --- 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,131 @@
+@@ -0,0 +1,137 @@
 +# This testcase is part of GDB, the GNU debugger.
 +
 +# Copyright 2005, 2007 Free Software Foundation, Inc.
@@ -179,8 +179,9 @@ Index: gdb/testsuite/ChangeLog
 +    gdb_suppress_tests
 +}
 +
-+# Break on the various forms of the A::A constructor
-+gdb_test "break A\:\:A" "Breakpoint 2 at .* \\(2 locations\\)" "breaking on A::A"
++# Break on the various forms of the A::A constructor.
++# " (2 locations)" is displayed depending on G++ version.
++gdb_test "break A\:\:A" "Breakpoint 2 at .*" "breaking on A::A"
 +        
 +# Verify that we break for the A constructor two times
 +# Once for new A and once for new B
@@ -206,7 +207,8 @@ Index: gdb/testsuite/ChangeLog
 +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" "Breakpoint .*, line $second_line. \\(2 locations\\)" "break by line in constructor"
++# " (2 locations)" is displayed depending on G++ version.
++gdb_test "break $second_line" "Breakpoint .*, line $second_line\\..*" "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"
@@ -217,7 +219,8 @@ Index: gdb/testsuite/ChangeLog
 +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" "Breakpoint .*, line $second_line_dtor. \\(2 locations\\)" "break by line in destructor"
++# " (2 locations)" is displayed depending on G++ version.
++gdb_test "break $second_line_dtor" "Breakpoint .*, line $second_line_dtor\\..*" "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"
 +# FIXME: Analyse this case better.
@@ -232,8 +235,11 @@ Index: gdb/testsuite/ChangeLog
 +gdb_load ${binfile}
 +runto_main
 +
++set first_line_dtor [gdb_get_line_number "First line ~C"]
++set define_line_dtor [gdb_get_line_number "Destructor C"]
 +# Break on the various forms of the C::~C destructor
-+gdb_test "break C\:\:~C" "Breakpoint .* \\(3 locations\\)" "breaking on C::~C"
++# " ([23] locations)" is displayed depending on G++ version.
++gdb_test "break C\:\:~C" "Breakpoint .*, line ($define_line_dtor|$define_line_dtor)\\..*" "breaking on C::~C"
 +gdb_continue_to_breakpoint "First line ~C"
 +
 +# Verify that we can break by line number in a destructor and find
@@ -242,8 +248,8 @@ Index: gdb/testsuite/ChangeLog
 +gdb_load ${binfile}
 +delete_breakpoints
 +
-+set first_line_dtor [gdb_get_line_number "First line ~C"]
-+gdb_test "break $first_line_dtor" "Breakpoint .*, line $first_line_dtor. \\(3 locations\\)" "break by line in destructor"
++# " (3 locations)" is displayed depending on G++ version.
++gdb_test "break $first_line_dtor" "Breakpoint .*, line $first_line_dtor\\..*" "break by line in destructor"
 +
 +# Run to `main' where we begin our tests.
 +# Set the breakpoints first to test PIE multiple-PC BREAKPOINT_RE_SET.

gdb-6.3-test-pie-20050107.patch:
 configure            |    3 
 configure.ac         |    2 
 gdb.pie/Makefile.in  |   19 
 gdb.pie/attach.c     |   20 +
 gdb.pie/attach.exp   |  433 ++++++++++++++++++++++
 gdb.pie/attach2.c    |   24 +
 gdb.pie/break.c      |  146 +++++++
 gdb.pie/break.exp    |  977 +++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb.pie/break1.c     |   44 ++
 gdb.pie/corefile.exp |  243 ++++++++++++
 gdb.pie/coremaker.c  |  142 +++++++
 11 files changed, 2051 insertions(+), 2 deletions(-)

Index: gdb-6.3-test-pie-20050107.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.3-test-pie-20050107.patch,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -p -r1.11 -r1.12
--- gdb-6.3-test-pie-20050107.patch	10 Sep 2009 21:37:39 -0000	1.11
+++ gdb-6.3-test-pie-20050107.patch	12 Jan 2010 22:15:54 -0000	1.12
@@ -436,7 +436,7 @@ Index: gdb-6.8.50.20090909/gdb/testsuite
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
 +++ gdb-6.8.50.20090909/gdb/testsuite/gdb.pie/attach.exp	2009-09-09 19:06:01.000000000 +0200
-@@ -0,0 +1,432 @@
+@@ -0,0 +1,433 @@
 +#   Copyright 1997, 1999, 2002 Free Software Foundation, Inc.
 +
 +# This program is free software; you can redistribute it and/or modify
@@ -817,7 +817,8 @@ Index: gdb-6.8.50.20090909/gdb/testsuite
 +      -re ".*warning: reading register.*I.*O error.*$gdb_prompt $" {
 +         fail "attach call, read register 3 error"
 +     }
-+     -re "Attaching to.*process $testpid.*libc.*$gdb_prompt $" {
++     -re "Attaching to.*process $testpid.*$gdb_prompt $" {
++         # libc is relocated, not relocated, therefore not printed.
 +         pass "attach call"
 +     }
 +      -re "$gdb_prompt $" {fail "attach call"}

gdb-6.5-bz216711-clone-is-outermost.patch:
 gdb-6.8.50.20090802/gdb/amd64-linux-tdep.c                      |   76 +++++
 gdb-6.8.50.20090802/gdb/amd64-tdep.c                            |    5 
 gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.c   |   39 ++
 gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.exp |   61 ++++
 gdb-6.8.50.20090811/gdb/i386-tdep.c                             |    3 
 gdb-6.8.50.20090811/gdb/i386-tdep.h                             |    3 
 gdb/ia64-tdep.c                                                 |  132 ++++++++++
 7 files changed, 319 insertions(+)

Index: gdb-6.5-bz216711-clone-is-outermost.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.5-bz216711-clone-is-outermost.patch,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -p -r1.5 -r1.6
--- gdb-6.5-bz216711-clone-is-outermost.patch	11 Aug 2009 14:42:46 -0000	1.5
+++ gdb-6.5-bz216711-clone-is-outermost.patch	12 Jan 2010 22:15:55 -0000	1.6
@@ -162,6 +162,154 @@ Index: gdb-6.8.50.20090802/gdb/amd64-tde
  };
  
  /* Floating-point registers.  */
+--- a/gdb/ia64-tdep.c
++++ b/gdb/ia64-tdep.c
+@@ -2122,6 +2122,137 @@ static const struct frame_unwind ia64_frame_unwind =
+   default_frame_sniffer
+ };
+ 
++/* Detect the outermost frame; during unwind of
++   	#6  0x2000000000347100 in __clone2 () from /lib/libc.so.6.1
++   avoid the additional bogus frame
++   	#7  0x0000000000000000 in ?? ()  */
++
++static char linux_clone2_code[] =
++{
++/* libc/sysdeps/unix/sysv/linux/ia64/clone2.S */
++  0x09, 0x00, 0x20, 0x12, 0x90, 0x11, 0x00, 0x40,
++  0x28, 0x20, 0x23, 0x00, 0x00, 0x00, 0x04, 0x00,
++/*         st4 [r9]=r8 */
++/*         st4 [r10]=r8 */
++/*         ;; */
++/* #endif */
++  0x02, 0x50, 0x21, 0x40, 0x18, 0x14, 0x90, 0x02,
++  0x90, 0x00, 0x42, 0x00, 0x00, 0x00, 0x04, 0x00,
++/* 1:      ld8 out1=[in0],8        |* Retrieve code pointer.       *| */
++/*         mov out0=in4            |* Pass proper argument to fn *| */
++/*         ;; */
++  0x11, 0x08, 0x00, 0x40, 0x18, 0x10, 0x60, 0x50,
++  0x05, 0x80, 0x03, 0x00, 0x68, 0x00, 0x80, 0x12,
++/*         ld8 gp=[in0]            |* Load function gp.            *| */
++/*         mov b6=out1 */
++/*         br.call.dptk.many rp=b6 |* Call fn(arg) in the child    *| */
++/*         ;; */
++  0x10, 0x48, 0x01, 0x10, 0x00, 0x21, 0x10, 0x00,
++  0xa0, 0x00, 0x42, 0x00, 0x98, 0xdf, 0xf7, 0x5b,
++/*         mov out0=r8             |* Argument to _exit            *| */
++/*         mov gp=loc0 */
++/*         .globl HIDDEN_JUMPTARGET(_exit) */
++/*         br.call.dpnt.many rp=HIDDEN_JUMPTARGET(_exit) */
++/*                                 |* call _exit with result from fn.      *| */
++  0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
++  0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00
++/*         ret                     |* Not reached.         *| */
++};
++
++#define LINUX_CLONE_PRE_SLOTS 3	/* Number of slots before PC.  */
++#define LINUX_CLONE_LEN (sizeof linux_clone2_code)
++
++static int
++ia64_linux_clone2_running (struct frame_info *this_frame)
++{
++  CORE_ADDR pc = get_frame_pc (this_frame);
++  char buf[LINUX_CLONE_LEN];
++  struct minimal_symbol *minsym;
++  long long instr;
++
++  if (!safe_frame_unwind_memory (this_frame, pc - LINUX_CLONE_PRE_SLOTS * 16,
++				 buf, LINUX_CLONE_LEN))
++    return 0;
++
++  if (memcmp (buf, linux_clone2_code, LINUX_CLONE_PRE_SLOTS * 16) != 0)
++    return 0;
++
++  /* Adjust the expected "_exit" address.  */
++  minsym = lookup_minimal_symbol_text ("_exit", NULL);
++  if (minsym == NULL)
++    return 0;
++
++  instr = slotN_contents (&buf[LINUX_CLONE_PRE_SLOTS * 16], 2);
++  instr &= ~(((1L << 20) - 1) << 13);
++  /* Address is relative to the jump instruction slot, not the next one.  */
++  instr |= (((SYMBOL_VALUE_ADDRESS (minsym) - (pc & ~0xfL)) >> 4)
++	    & ((1L << 20) - 1)) << 13;
++  replace_slotN_contents (&buf[LINUX_CLONE_PRE_SLOTS * 16], instr, 2);
++
++  if (memcmp (&buf[LINUX_CLONE_PRE_SLOTS * 16],
++              &linux_clone2_code[LINUX_CLONE_PRE_SLOTS * 16],
++	      LINUX_CLONE_LEN - (LINUX_CLONE_PRE_SLOTS * 16)) != 0)
++    return 0;
++
++  return 1;
++}
++
++static int
++ia64_outermost_frame (struct frame_info *this_frame)
++{
++  CORE_ADDR pc = get_frame_pc (this_frame);
++  char *name;
++
++  find_pc_partial_function (pc, &name, NULL, NULL);
++
++  /* If we have NAME, we can optimize the search.
++     `clone' NAME still needs to have the code checked as its name may be
++     present in the user code.
++     `__clone' NAME should not be present in the user code but in the initial
++     parts of the `__clone' implementation the unwind still makes sense.
++     More detailed unwinding decision would be too much sensitive to possible
++     subtle changes in specific glibc revisions.  */
++  if (name == NULL || strcmp (name, "clone2") == 0
++      || strcmp ("__clone2", name) == 0)
++    return (ia64_linux_clone2_running (this_frame) != 0);
++
++  return 0;
++}
++
++static void
++ia64_clone2_frame_this_id (struct frame_info *this_frame, void **this_cache,
++			   struct frame_id *this_id)
++{
++  /* Leave the default outermost frame at *THIS_ID.  */
++}
++
++static struct value *
++ia64_clone2_frame_prev_register (struct frame_info *this_frame,
++				 void **this_cache, int regnum)
++{
++  return frame_unwind_got_register (this_frame, regnum, regnum);
++}
++
++static int
++ia64_clone2_frame_sniffer (const struct frame_unwind *self,
++			   struct frame_info *this_frame,
++			   void **this_prologue_cache)
++{
++  if (ia64_outermost_frame (this_frame))
++    return 1;
++
++  return 0;
++}
++
++static const struct frame_unwind ia64_clone2_frame_unwind =
++{
++  NORMAL_FRAME,
++  &ia64_clone2_frame_this_id,
++  &ia64_clone2_frame_prev_register,
++  NULL,
++  &ia64_clone2_frame_sniffer
++};
++
+ /* Signal trampolines.  */
+ 
+ static void
+@@ -3824,6 +3955,7 @@ ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+   set_gdbarch_dummy_id (gdbarch, ia64_dummy_id);
+ 
+   set_gdbarch_unwind_pc (gdbarch, ia64_unwind_pc);
++  frame_unwind_append_unwinder (gdbarch, &ia64_clone2_frame_unwind);
+ #ifdef HAVE_LIBUNWIND_IA64_H
+   frame_unwind_append_unwinder (gdbarch,
+                                 &ia64_libunwind_sigtramp_frame_unwind);
 Index: gdb-6.8.50.20090802/gdb/testsuite/gdb.threads/bt-clone-stop.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000

gdb-6.6-buildid-locate-rpm.patch:
 acinclude.m4                 |    4 
 aclocal.m4                   |  156 ++++++++
 config.in                    |    6 
 configure                    |  752 ++++++++++++++++++++++++++++---------------
 configure.ac                 |  193 +++++++++++
 event-top.c                  |    5 
 symfile.c                    |  389 +++++++++++++++++++++-
 symfile.h                    |    1 
 testsuite/lib/gdb.exp        |    2 
 testsuite/lib/mi-support.exp |    2 
 tui/tui-interp.c             |    3 
 11 files changed, 1251 insertions(+), 262 deletions(-)

Index: gdb-6.6-buildid-locate-rpm.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.6-buildid-locate-rpm.patch,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -p -r1.6 -r1.7
--- gdb-6.6-buildid-locate-rpm.patch	10 Sep 2009 21:37:39 -0000	1.6
+++ gdb-6.6-buildid-locate-rpm.patch	12 Jan 2010 22:15:55 -0000	1.7
@@ -48,7 +48,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
  
  
  int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num);
-@@ -1673,8 +1675,352 @@ build_id_to_filename (struct build_id *b
+@@ -1673,8 +1675,353 @@ build_id_to_filename (struct build_id *b
    return retval;
  }
  
@@ -258,7 +258,8 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
 +
 +	  /* Base package name for `debuginfo-install'.  We do not use the
 +	     `yum' command directly as the line
-+		 yum --enablerepo='*-debuginfo' install NAME-debuginfo.ARCH
++		 yum --disablerepo='*' --enablerepo='*-debuginfo' \
++		     install NAME-debuginfo.ARCH
 +	     would be more complicated than just:
 +		 debuginfo-install NAME-VERSION-RELEASE.ARCH
 +	     Do not supply the rpm base name (derived from .src.rpm name) as
@@ -398,7 +399,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
 +
  /* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
 -     Try to install the hash file ...
-+     yum --enablerepo='*-debuginfo' install ...
++     yum --disablerepo='*' --enablerepo='*-debuginfo' install ...
     avoidance.  */
  
  struct missing_filepair
@@ -420,7 +421,7 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
    missing_filepair_change ();
  }
  
-@@ -1799,14 +2151,33 @@ debug_print_missing (const char *binary,
+@@ -1799,14 +2151,34 @@ debug_print_missing (const char *binary,
  
    *slot = missing_filepair;
  
@@ -456,7 +457,8 @@ Index: gdb-6.8.50.20090909/gdb/symfile.c
 +			    _("Missing separate debuginfo for %s\n"), binary);
 +        if (debug != NULL)
 +	  fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
-+			      "yum --enablerepo='*-debuginfo' install", debug);
++			      "yum --disablerepo='*' --enablerepo='*-debuginfo'"
++			      " install", debug);
 +      }
  }
  

gdb-6.6-buildid-locate.patch:
 corelow.c                    |   63 ++++
 doc/gdb.texinfo              |   21 +
 objfiles.h                   |    4 
 solib-svr4.c                 |   46 +++
 symfile.c                    |  609 ++++++++++++++++++++++++++++++++++++++++++-
 symfile.h                    |    7 
 testsuite/lib/gdb.exp        |   10 
 testsuite/lib/mi-support.exp |   10 
 8 files changed, 755 insertions(+), 15 deletions(-)

Index: gdb-6.6-buildid-locate.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.6-buildid-locate.patch,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -p -r1.27 -r1.28
--- gdb-6.6-buildid-locate.patch	25 Sep 2009 11:06:47 -0000	1.27
+++ gdb-6.6-buildid-locate.patch	12 Jan 2010 22:15:55 -0000	1.28
@@ -1,7 +1,7 @@
-Index: gdb-6.8.91.20090925/gdb/corelow.c
+Index: gdb-7.0/gdb/corelow.c
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/corelow.c	2009-07-31 17:25:21.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/corelow.c	2009-09-25 09:39:09.000000000 +0200
+--- gdb-7.0.orig/gdb/corelow.c	2009-07-31 17:25:21.000000000 +0200
++++ gdb-7.0/gdb/corelow.c	2009-10-23 00:17:29.000000000 +0200
 @@ -45,6 +45,10 @@
  #include "exceptions.h"
  #include "solib.h"
@@ -91,11 +91,11 @@ Index: gdb-6.8.91.20090925/gdb/corelow.c
 +			   NULL, NULL, NULL,
 +			   &setlist, &showlist);
  }
-Index: gdb-6.8.91.20090925/gdb/doc/gdb.texinfo
+Index: gdb-7.0/gdb/doc/gdb.texinfo
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/doc/gdb.texinfo	2009-09-25 09:29:58.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/doc/gdb.texinfo	2009-09-25 09:29:58.000000000 +0200
-@@ -13895,6 +13895,27 @@ information files.
+--- gdb-7.0.orig/gdb/doc/gdb.texinfo	2009-10-23 00:12:39.000000000 +0200
++++ gdb-7.0/gdb/doc/gdb.texinfo	2009-10-23 00:17:29.000000000 +0200
+@@ -13896,6 +13896,27 @@ information files.
  
  @end table
  
@@ -123,10 +123,10 @@ Index: gdb-6.8.91.20090925/gdb/doc/gdb.t
  @cindex @code{.gnu_debuglink} sections
  @cindex debug link sections
  A debug link is a special section of the executable file named
-Index: gdb-6.8.91.20090925/gdb/solib-svr4.c
+Index: gdb-7.0/gdb/solib-svr4.c
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/solib-svr4.c	2009-09-25 09:29:57.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/solib-svr4.c	2009-09-25 09:43:14.000000000 +0200
+--- gdb-7.0.orig/gdb/solib-svr4.c	2009-10-23 00:12:38.000000000 +0200
++++ gdb-7.0/gdb/solib-svr4.c	2009-10-23 00:17:29.000000000 +0200
 @@ -1101,9 +1101,49 @@ svr4_current_sos (void)
  		     safe_strerror (errcode));
  	  else
@@ -180,10 +180,10 @@ Index: gdb-6.8.91.20090925/gdb/solib-svr
  	    }
  	  xfree (buffer);
  
-Index: gdb-6.8.91.20090925/gdb/symfile.c
+Index: gdb-7.0/gdb/symfile.c
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/symfile.c	2009-09-25 09:29:57.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/symfile.c	2009-09-25 09:29:58.000000000 +0200
+--- gdb-7.0.orig/gdb/symfile.c	2009-10-23 00:12:38.000000000 +0200
++++ gdb-7.0/gdb/symfile.c	2009-10-23 00:43:28.000000000 +0200
 @@ -56,6 +56,7 @@
  #include "elf-bfd.h"
  #include "solib.h"
@@ -618,7 +618,7 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
  
    if (found == NULL)
      warning (_("File \"%s\" has no build-id, file skipped"), filename);
-@@ -1234,8 +1626,9 @@ build_id_verify (const char *filename, s
+@@ -1234,14 +1626,16 @@ build_id_verify (const char *filename, s
    return retval;
  }
  
@@ -628,48 +628,77 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
 +build_id_to_filename (struct build_id *build_id, char **link_return,
 +		      int add_debug_suffix)
  {
-   char *link, *s, *retval = NULL;
-   gdb_byte *data = build_id->data;
-@@ -1243,7 +1636,9 @@ build_id_to_debug_filename (struct build
+   char *link, *debugdir, *retval = NULL;
++  char *link_all = NULL;
  
    /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */
-   link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
--		  + 2 * size + (sizeof ".debug" - 1) + 1);
-+		  + 2 * size
-+		  + (add_debug_suffix ? sizeof ".debug" - 1 : 0)
-+		  + 1);
-   s = link + sprintf (link, "%s/.build-id/", debug_file_directory);
-   if (size > 0)
-     {
-@@ -1254,12 +1649,14 @@ build_id_to_debug_filename (struct build
-     *s++ = '/';
-   while (size-- > 0)
-     s += sprintf (s, "%02x", (unsigned) *data++);
--  strcpy (s, ".debug");
-+  if (add_debug_suffix)
-+    strcpy (s, ".debug");
-+  else
-+    *s = 0;
+-  link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
+-		 + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
++  link = xmalloc (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
++		  + 2 * build_id->size + (sizeof ".debug" - 1) + 1);
+ 
+   /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
+      cause "/.build-id/..." lookups.  */
+@@ -1272,7 +1666,10 @@ build_id_to_debug_filename (struct build
+ 	*s++ = '/';
+       while (size-- > 0)
+ 	s += sprintf (s, "%02x", (unsigned) *data++);
+-      strcpy (s, ".debug");
++      if (add_debug_suffix)
++	strcpy (s, ".debug");
++      else
++	*s = 0;
+ 
+       /* lrealpath() is expensive even for the usually non-existent files.  */
+       if (access (link, F_OK) == 0)
+@@ -1285,15 +1682,185 @@ build_id_to_debug_filename (struct build
+ 	}
  
-   /* lrealpath() is expensive even for the usually non-existent files.  */
-   if (access (link, F_OK) == 0)
-     retval = lrealpath (link);
--  xfree (link);
+       if (retval != NULL)
+-	break;
++	{
++	  /* LINK_ALL is not used below in this non-NULL RETVAL case.  */
++	  break;
++	}
++
++	if (link_all == NULL)
++	  link_all = xstrdup (link);
++	else
++	  {
++	    size_t len_orig = strlen (link_all);
++
++	    link_all = xrealloc (link_all, len_orig + 1 + strlen (link) + 1);
++
++	    /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with
++	       its possible use as an argument for installation command.  */
++	    link_all[len_orig] = ' ';
++
++	    strcpy (&link_all[len_orig + 1], link);
++	  }
  
-   if (retval != NULL && !build_id_verify (retval, build_id))
-     {
-@@ -1267,9 +1664,150 @@ build_id_to_debug_filename (struct build
-       retval = NULL;
+       debugdir = debugdir_end;
      }
+   while (*debugdir != 0);
  
 +  if (link_return != NULL)
-+    *link_return = link;
-+  else
-+    xfree (link);
++    {
++      if (retval != NULL)
++       {
++         *link_return = link;
++         link = NULL;
++       }
++      else
++       {
++         *link_return = link_all;
++         link_all = NULL;
++       }
++    }
++  xfree (link);
++  xfree (link_all);
++
++  return retval;
++}
 +
-   return retval;
- }
- 
 +/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
 +     Try to install the hash file ...
 +   avoidance.  */
@@ -692,9 +721,9 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
 +
 +  retval = obstack_alloc (&missing_filepair_obstack, size);
 +  memset (retval, 0, size);
-+  return retval;
-+}
-+
+   return retval;
+ }
+ 
 +static hashval_t
 +missing_filepair_hash_func (const struct missing_filepair *elem)
 +{
@@ -809,20 +838,7 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
  static char *
  get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
  {
-@@ -1352,32 +1890,36 @@ static char *
- find_separate_debug_file (struct objfile *objfile)
- {
-   asection *sect;
--  char *basename;
--  char *dir;
--  char *debugfile;
-+  char *basename = NULL;
-+  char *dir = NULL;
-+  char *debugfile = NULL;
-   char *name_copy;
--  char *canon_name;
-+  char *canon_name = NULL;
-   bfd_size_type debuglink_size;
+@@ -1384,13 +1951,14 @@ find_separate_debug_file (struct objfile
    unsigned long crc32;
    int i;
    struct build_id *build_id;
@@ -839,123 +855,34 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
        xfree (build_id);
        /* Prevent looping on a stripped .debug file.  */
        if (build_id_name != NULL && strcmp (build_id_name, objfile->name) == 0)
-         {
--	  warning (_("\"%s\": separate debug info file has no debug info"),
-+	  warning (_("\"%s\": The separate debug info file has no debug info"),
- 		   build_id_name);
+@@ -1400,7 +1968,10 @@ find_separate_debug_file (struct objfile
  	  xfree (build_id_name);
  	}
        else if (build_id_name != NULL)
 -        return build_id_name;
-+        {
++	{
 +	  xfree (build_id_filename);
 +	  return build_id_name;
 +	}
      }
  
    basename = get_debug_link_info (objfile, &crc32);
-@@ -1385,7 +1927,7 @@ find_separate_debug_file (struct objfile
-   if (basename == NULL)
-     /* There's no separate debug info, hence there's no way we could
-        load it => no warning.  */
--    return NULL;
-+    goto cleanup_return_debugfile;
- 
-   dir = xstrdup (objfile->name);
- 
-@@ -1407,24 +1949,19 @@ find_separate_debug_file (struct objfile
-   if (canon_name && strlen (canon_name) > i)
-     i = strlen (canon_name);
- 
--  debugfile = alloca (strlen (debug_file_directory) + 1
--                      + i
--                      + strlen (DEBUG_SUBDIRECTORY)
--                      + strlen ("/")
--                      + strlen (basename)
--                      + 1);
-+  debugfile = xmalloc (strlen (debug_file_directory) + 1
-+		       + i
-+		       + strlen (DEBUG_SUBDIRECTORY)
-+		       + strlen ("/")
-+		       + strlen (basename)
-+		       + 1);
- 
-   /* First try in the same directory as the original file.  */
-   strcpy (debugfile, dir);
-   strcat (debugfile, basename);
- 
-   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
--    {
--      xfree (basename);
--      xfree (dir);
--      xfree (canon_name);
--      return xstrdup (debugfile);
--    }
-+    goto cleanup_return_debugfile;
- 
-   /* Then try in the subdirectory named DEBUG_SUBDIRECTORY.  */
-   strcpy (debugfile, dir);
-@@ -1433,12 +1970,7 @@ find_separate_debug_file (struct objfile
-   strcat (debugfile, basename);
- 
-   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
--    {
--      xfree (basename);
--      xfree (dir);
--      xfree (canon_name);
--      return xstrdup (debugfile);
--    }
-+    goto cleanup_return_debugfile;
- 
-   /* Then try in the global debugfile directory.  */
-   strcpy (debugfile, debug_file_directory);
-@@ -1447,12 +1979,7 @@ find_separate_debug_file (struct objfile
-   strcat (debugfile, basename);
- 
-   if (separate_debug_file_exists (debugfile, crc32, objfile->name))
--    {
--      xfree (basename);
--      xfree (dir);
--      xfree (canon_name);
--      return xstrdup (debugfile);
--    }
-+    goto cleanup_return_debugfile;
- 
-   /* If the file is in the sysroot, try using its base path in the
-      global debugfile directory.  */
-@@ -1466,20 +1993,18 @@ find_separate_debug_file (struct objfile
-       strcat (debugfile, basename);
- 
-       if (separate_debug_file_exists (debugfile, crc32, objfile->name))
--	{
--	  xfree (canon_name);
--	  xfree (basename);
--	  xfree (dir);
--	  return xstrdup (debugfile);
--	}
-+	goto cleanup_return_debugfile;
-     }
+@@ -1501,8 +2072,10 @@ find_separate_debug_file (struct objfile
    
--  if (canon_name)
--    xfree (canon_name);
-+  debugfile = NULL;
+   xfree (debugfile);
+   debugfile = NULL;
 +  debug_print_missing (objfile->name, build_id_filename);
  
-+cleanup_return_debugfile:
+ cleanup_return_debugfile:
 +  xfree (build_id_filename);
-+  xfree (canon_name);
+   xfree (canon_name);
    xfree (basename);
    xfree (dir);
--  return NULL;
-+  return debugfile;
- }
- 
- 
-@@ -4229,4 +4754,16 @@ the global debug-file directory prepende
+@@ -4256,4 +4829,16 @@ each global debug-file-directory compone
  				     NULL,
  				     show_debug_file_directory,
  				     &setlist, &showlist);
-+ 
++
 +   add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose,
 + 			    _("\
 + Set debugging level of the build-id locator."), _("\
@@ -965,13 +892,13 @@ Index: gdb-6.8.91.20090925/gdb/symfile.c
 + 			    NULL,
 + 			    show_build_id_verbose,
 + 			    &setlist, &showlist);
-+ 
++
 +   observer_attach_executable_changed (debug_print_executable_changed);
  }
-Index: gdb-6.8.91.20090925/gdb/symfile.h
+Index: gdb-7.0/gdb/symfile.h
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/symfile.h	2009-09-25 09:29:57.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/symfile.h	2009-09-25 09:29:58.000000000 +0200
+--- gdb-7.0.orig/gdb/symfile.h	2009-10-23 00:12:38.000000000 +0200
++++ gdb-7.0/gdb/symfile.h	2009-10-23 00:17:29.000000000 +0200
 @@ -381,6 +381,13 @@ extern int symfile_map_offsets_to_segmen
  struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
  void free_symfile_segment_data (struct symfile_segment_data *data);
@@ -986,10 +913,10 @@ Index: gdb-6.8.91.20090925/gdb/symfile.h
  /* From dwarf2read.c */
  
  extern int dwarf2_has_info (struct objfile *);
-Index: gdb-6.8.91.20090925/gdb/testsuite/lib/gdb.exp
+Index: gdb-7.0/gdb/testsuite/lib/gdb.exp
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/testsuite/lib/gdb.exp	2009-09-25 09:29:57.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/testsuite/lib/gdb.exp	2009-09-25 09:29:58.000000000 +0200
+--- gdb-7.0.orig/gdb/testsuite/lib/gdb.exp	2009-10-23 00:12:38.000000000 +0200
++++ gdb-7.0/gdb/testsuite/lib/gdb.exp	2009-10-23 00:17:29.000000000 +0200
 @@ -1248,6 +1248,16 @@ proc default_gdb_start { } {
  	    warning "Couldn't set the width to 0."
  	}
@@ -1007,10 +934,10 @@ Index: gdb-6.8.91.20090925/gdb/testsuite
      return 0;
  }
  
-Index: gdb-6.8.91.20090925/gdb/testsuite/lib/mi-support.exp
+Index: gdb-7.0/gdb/testsuite/lib/mi-support.exp
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/testsuite/lib/mi-support.exp	2009-09-15 20:51:26.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/testsuite/lib/mi-support.exp	2009-09-25 09:29:58.000000000 +0200
+--- gdb-7.0.orig/gdb/testsuite/lib/mi-support.exp	2009-09-15 20:51:26.000000000 +0200
++++ gdb-7.0/gdb/testsuite/lib/mi-support.exp	2009-10-23 00:17:29.000000000 +0200
 @@ -221,6 +221,16 @@ proc default_mi_gdb_start { args } {
  	    }
      	}
@@ -1028,10 +955,10 @@ Index: gdb-6.8.91.20090925/gdb/testsuite
  
      detect_async
  
-Index: gdb-6.8.91.20090925/gdb/objfiles.h
+Index: gdb-7.0/gdb/objfiles.h
 ===================================================================
---- gdb-6.8.91.20090925.orig/gdb/objfiles.h	2009-09-25 09:29:57.000000000 +0200
-+++ gdb-6.8.91.20090925/gdb/objfiles.h	2009-09-25 09:38:27.000000000 +0200
+--- gdb-7.0.orig/gdb/objfiles.h	2009-10-23 00:12:38.000000000 +0200
++++ gdb-7.0/gdb/objfiles.h	2009-10-23 00:17:29.000000000 +0200
 @@ -428,6 +428,10 @@ struct objfile
  
  #define OBJF_MAIN (1 << 7)

gdb-6.7-testsuite-stable-results.patch:
 ./gdb/testsuite/gdb.base/fileio.c                |   33 ++++++++++++++++
 ./gdb/testsuite/gdb.base/fileio.exp              |   10 ++---
 gdb/testsuite/gdb.threads/watchthreads-reorder.c |   46 ++++++++---------------
 3 files changed, 55 insertions(+), 34 deletions(-)

Index: gdb-6.7-testsuite-stable-results.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.7-testsuite-stable-results.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -p -r1.8 -r1.9
--- gdb-6.7-testsuite-stable-results.patch	30 Sep 2009 20:58:49 -0000	1.8
+++ gdb-6.7-testsuite-stable-results.patch	12 Jan 2010 22:15:55 -0000	1.9
@@ -102,3 +102,154 @@ frames-invalid can happen asynchronously
  
  set timeout $oldtimeout
  return 0
+
+
+
+http://sourceware.org/ml/gdb-patches/2009-12/msg00234.html
+Subject: [patch] testsuite: Fix a race by me - watchthreads-reorder.exp
+
+Hi,
+
+there is a bug explainable by man pthread_cond_signal:
+	The [...] pthread_cond_signal() functions shall have no effect if
+	there are no threads currently blocked on cond.
+
+meaning a race for the testcase.
+	+FAIL: gdb.threads/watchthreads-reorder.exp: reorder1: continue a (timeout)
+
+One can reproduce the race on CVS HEAD by:
+#	--- a/gdb/testsuite/gdb.threads/watchthreads-reorder.c
+#	+++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.c
+#	@@ -89,6 +89,7 @@ thread1_func (void *unused)
+#	   int i;
+#	   volatile int rwatch_store;
+#	 
+#	+sleep(1);
+#	   thread1_tid = gettid ();
+#	   i = pthread_cond_signal (&thread1_tid_cond);
+#	   assert (i == 0);
+#	@@ -317,6 +318,7 @@ main (int argc, char **argv)
+#	 
+#	   if (thread1_tid == 0)
+#	     {
+#	+sleep(2);
+#	       i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
+#	       assert (i == 0);
+#	 
+
+Fixed; gdbstop_mutex got removed as it became redundant there.
+
+Going to check it in as obvious in several days (code is by me + it is just
+a testcase).
+
+
+Sorry,
+Jan
+
+
+gdb/testsuite/
+2009-12-17  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* gdb.threads/watchthreads-reorder.c (gdbstop_mutex): Remove.
+	(thread1_func): Protect thread1_tid_cond by thread1_tid_mutex.  Remove
+	gdbstop_mutex handling.
+	(thread2_func): Protect thread2_tid_cond by thread2_tid_mutex.  Remove
+	gdbstop_mutex handling.
+	(main): Move thread1_tid_mutex and thread2_tid_mutex locks before
+	pthread_create.  Remove gdbstop_mutex handling.  New comment.  Remove
+	pthread_cond_wait conditionalizations.
+
+--- a/gdb/testsuite/gdb.threads/watchthreads-reorder.c
++++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.c
+@@ -34,8 +34,6 @@
+    otherwise.  */
+ #define TIMEOUT (gettid () == getpid() ? 10 : 15)
+ 
+-static pthread_mutex_t gdbstop_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+-
+ static pid_t thread1_tid;
+ static pthread_cond_t thread1_tid_cond = PTHREAD_COND_INITIALIZER;
+ static pthread_mutex_t thread1_tid_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
+@@ -90,12 +88,11 @@ thread1_func (void *unused)
+   volatile int rwatch_store;
+ 
+   thread1_tid = gettid ();
++
++  timed_mutex_lock (&thread1_tid_mutex);
+   i = pthread_cond_signal (&thread1_tid_cond);
+   assert (i == 0);
+-
+-  /* Be sure GDB is already stopped before continuing.  */
+-  timed_mutex_lock (&gdbstop_mutex);
+-  i = pthread_mutex_unlock (&gdbstop_mutex);
++  i = pthread_mutex_unlock (&thread1_tid_mutex);
+   assert (i == 0);
+ 
+   rwatch_store = thread1_rwatch;
+@@ -115,12 +112,11 @@ thread2_func (void *unused)
+   volatile int rwatch_store;
+ 
+   thread2_tid = gettid ();
++
++  timed_mutex_lock (&thread2_tid_mutex);
+   i = pthread_cond_signal (&thread2_tid_cond);
+   assert (i == 0);
+-
+-  /* Be sure GDB is already stopped before continuing.  */
+-  timed_mutex_lock (&gdbstop_mutex);
+-  i = pthread_mutex_unlock (&gdbstop_mutex);
++  i = pthread_mutex_unlock (&thread2_tid_mutex);
+   assert (i == 0);
+ 
+   rwatch_store = thread2_rwatch;
+@@ -267,7 +263,8 @@ main (int argc, char **argv)
+ 
+   setbuf (stdout, NULL);
+ 
+-  timed_mutex_lock (&gdbstop_mutex);
++  timed_mutex_lock (&thread1_tid_mutex);
++  timed_mutex_lock (&thread2_tid_mutex);
+ 
+   timed_mutex_lock (&terminate_mutex);
+ 
+@@ -306,30 +303,21 @@ main (int argc, char **argv)
+       state_wait (tracer, "T (stopped)");
+     }
+ 
+-  timed_mutex_lock (&thread1_tid_mutex);
+-  timed_mutex_lock (&thread2_tid_mutex);
+-
+-  /* Let the threads start.  */
+-  i = pthread_mutex_unlock (&gdbstop_mutex);
+-  assert (i == 0);
++  /* Threads are now waiting at timed_mutex_lock (thread1_tid_mutex) and so
++     they could not trigger the watchpoints before GDB gets unstopped later.
++     Threads get resumed at pthread_cond_wait below.  */
+ 
+   printf ("Waiting till the threads initialize their TIDs.\n");
+ 
+-  if (thread1_tid == 0)
+-    {
+-      i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
+-      assert (i == 0);
++  i = pthread_cond_wait (&thread1_tid_cond, &thread1_tid_mutex);
++  assert (i == 0);
+ 
+-      assert (thread1_tid > 0);
+-    }
++  assert (thread1_tid > 0);
+ 
+-  if (thread2_tid == 0)
+-    {
+-      i = pthread_cond_wait (&thread2_tid_cond, &thread2_tid_mutex);
+-      assert (i == 0);
++  i = pthread_cond_wait (&thread2_tid_cond, &thread2_tid_mutex);
++  assert (i == 0);
+ 
+-      assert (thread2_tid > 0);
+-    }
++  assert (thread2_tid > 0);
+ 
+   printf ("Thread 1 TID = %lu, thread 2 TID = %lu, PID = %lu.\n",
+ 	  (unsigned long) thread1_tid, (unsigned long) thread2_tid,
+

gdb-6.8-inlining-addon.patch:
 breakpoint.c                        |   35 +++++++++++++---
 dwarf2read.c                        |    6 ++
 frame.c                             |    8 ++-
 gdbthread.h                         |    6 ++
 infcmd.c                            |   76 ++++++++++++++++++++++++++----------
 inline-frame.c                      |   34 +++++++++++++---
 inline-frame.h                      |    4 +
 target.c                            |    1 
 testsuite/gdb.opt/inline-bt.c       |   10 +++-
 testsuite/gdb.opt/inline-cmds.c     |   10 +++-
 testsuite/gdb.opt/inline-cmds.exp   |   28 ++++++-------
 testsuite/gdb.opt/inline-locals.c   |    9 +++-
 testsuite/gdb.opt/inline-locals.exp |    6 ++
 testsuite/gdb.opt/inline-markers.c  |    5 --
 14 files changed, 176 insertions(+), 62 deletions(-)

Index: gdb-6.8-inlining-addon.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.8-inlining-addon.patch,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -p -r1.9 -r1.10
--- gdb-6.8-inlining-addon.patch	17 Sep 2009 12:15:41 -0000	1.9
+++ gdb-6.8-inlining-addon.patch	12 Jan 2010 22:15:55 -0000	1.10
@@ -236,19 +236,19 @@ Index: gdb-6.8.91.20090917/gdb/breakpoin
      {
        int value_is_zero = 0;
        
-@@ -3383,6 +3398,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
- 	    bs->print = 0;
- 	  }
- 	bs->commands = copy_command_lines (bs->commands);
-+
-+	/* Display the innermost inlined frame at a breakpont as it gives to
-+	   most of the available information.  */
-+	if (b->type != bp_until && b->type != bp_finish)
-+	  while (inline_skipped_frames (ptid))
-+	    step_into_inline_frame (ptid);
-       }
+@@ -3399,6 +3399,12 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
+ 		  bs->print = 0;
+ 		}
+ 	      bs->commands = copy_command_lines (bs->commands);
++
++	      /* Display the innermost inlined frame at a breakpont as it gives to
++		 most of the available information.  */
++	      if (b->type != bp_until && b->type != bp_finish)
++		while (inline_skipped_frames (ptid))
++		  step_into_inline_frame (ptid);
+ 	    }
  
-     /* Print nothing for this entry if we dont stop or if we dont print.  */
+ 	  /* Print nothing for this entry if we dont stop or if we dont print.  */
 @@ -5572,9 +5593,9 @@ set_momentary_breakpoint (struct gdbarch
  {
    struct breakpoint *b;

gdb-archer.patch:
 Makefile.in                                              |   92 
 NEWS                                                     |    7 
 ada-lang.c                                               |   43 
 amd64-linux-nat.c                                        |   45 
 block.c                                                  |   24 
 block.h                                                  |   12 
 breakpoint.c                                             |  773 ++++--
 breakpoint.h                                             |   21 
 c-exp.y                                                  |  240 ++
 c-lang.c                                                 |    6 
 c-typeprint.c                                            |   47 
 cli/cli-cmds.c                                           |   72 
 coffread.c                                               |    3 
 config.in                                                |    8 
 config/i386/nm-i386.h                                    |  125 +
 config/i386/nm-linux64.h                                 |   54 
 config/mips/nm-irix5.h                                   |   44 
 configure                                                |   76 
 configure.ac                                             |   47 
 cp-name-parser.y                                         |    5 
 cp-namespace.c                                           |  294 +-
 cp-support.c                                             |  123 +
 cp-support.h                                             |   50 
 dbxread.c                                                |    1 
 doc/gdb.texinfo                                          |  438 +++
 doc/gdbint.texinfo                                       |   62 
 doc/observer.texi                                        |    5 
 dwarf2-frame.c                                           |    9 
 dwarf2expr.c                                             |    7 
 dwarf2expr.h                                             |    2 
 dwarf2loc.c                                              |  227 +
 dwarf2loc.h                                              |    6 
 dwarf2read.c                                             | 1761 ++++++++++-----
 elfread.c                                                |   11 
 eval.c                                                   |  209 +
 expression.h                                             |   11 
 f-exp.y                                                  |    4 
 f-lang.c                                                 |  457 ---
 f-lang.h                                                 |   45 
 f-typeprint.c                                            |   36 
 f-valprint.c                                             |  267 --
 findcmd.c                                                |  111 
 findvar.c                                                |  126 -
 frame.c                                                  |    8 
 gdbinit.in                                               |   10 
 gdbserver/linux-i386-low.c                               |  210 +
 gdbserver/linux-x86-64-low.c                             |  184 +
 gdbthread.h                                              |    7 
 gdbtypes.c                                               |  599 ++++-
 gdbtypes.h                                               |  146 +
 gnu-v3-abi.c                                             |   18 
 i386-linux-nat.c                                         |   47 
 i386-nat.c                                               |   49 
 i386-nat.h                                               |   17 
 infcall.c                                                |    8 
 infcmd.c                                                 |   34 
 inferior.h                                               |    2 
 infrun.c                                                 |  190 +
 jv-lang.c                                                |    1 
 language.h                                               |    1 
 linespec.c                                               |   73 
 linux-nat.c                                              |   88 
 linux-nat.h                                              |    6 
 m2-lang.c                                                |    1 
 machoread.c                                              |    1 
 main.c                                                   |   80 
 maint.c                                                  |    8 
 mdebugread.c                                             |    2 
 mi/mi-cmd-var.c                                          |    1 
 mi/mi-main.c                                             |    2 
 mipsread.c                                               |    1 
 objfiles.c                                               |   19 
 objfiles.h                                               |   21 
 parse.c                                                  |  154 +
 parser-defs.h                                            |   25 
 ppc-linux-nat.c                                          |   19 
 printcmd.c                                               |   90 
 python/lib/gdb/FrameIterator.py                          |   33 
 python/lib/gdb/FrameWrapper.py                           |  112 
 python/lib/gdb/__init__.py                               |   19 
 python/lib/gdb/backtrace.py                              |   42 
 python/lib/gdb/command/__init__.py                       |    1 
 python/lib/gdb/command/alias.py                          |   59 
 python/lib/gdb/command/backtrace.py                      |  106 
 python/lib/gdb/command/ignore_errors.py                  |   37 
 python/lib/gdb/command/pahole.py                         |   75 
 python/lib/gdb/command/require.py                        |   57 
 python/lib/gdb/command/save_breakpoints.py               |   65 
 python/lib/gdb/command/upto.py                           |  129 +
 python/lib/gdb/function/__init__.py                      |    1 
 python/lib/gdb/function/caller_is.py                     |   58 
 python/lib/gdb/function/in_scope.py                      |   47 
 python/py-block.c                                        |  265 ++
 python/py-breakpoint.c                                   |  665 +++++
 python/py-cmd.c                                          |   17 
 python/py-frame.c                                        |  116 
 python/py-hooks.c                                        |   50 
 python/py-inferior.c                                     |  926 +++++++
 python/py-infthread.c                                    |  285 ++
 python/py-membuf.c                                       |  268 ++
 python/py-param.c                                        |  606 +++++
 python/py-prettyprint.c                                  |   21 
 python/py-symbol.c                                       |  336 ++
 python/py-symtab.c                                       |  322 ++
 python/py-type.c                                         |  170 +
 python/py-utils.c                                        |   46 
 python/py-value.c                                        |   55 
 python/python-internal.h                                 |   69 
 python/python.c                                          |  384 +++
 python/python.h                                          |    4 
 scm-lang.c                                               |    1 
 scm-valprint.c                                           |    4 
 solib-darwin.c                                           |    1 
 solib-spu.c                                              |    7 
 solib-svr4.c                                             |    4 
 solib.c                                                  |    3 
 solist.h                                                 |    2 
 somread.c                                                |    1 
 spu-tdep.c                                               |    2 
 stabsread.c                                              |    4 
 stack.c                                                  |   38 
 symfile.c                                                |   37 
 symfile.h                                                |   12 
 symmisc.c                                                |    4 
 symtab.c                                                 |  321 +-
 symtab.h                                                 |   20 
 target.c                                                 |   20 
 target.h                                                 |   41 
 testsuite/gdb.arch/powerpc-power7.exp                    |  175 +
 testsuite/gdb.arch/powerpc-power7.s                      |  107 
 testsuite/gdb.arch/x86_64-vla-pointer-foo.S              |  457 +++
 testsuite/gdb.arch/x86_64-vla-pointer.c                  |   43 
 testsuite/gdb.arch/x86_64-vla-pointer.exp                |   66 
 testsuite/gdb.arch/x86_64-vla-typedef-foo.S              |  455 +++
 testsuite/gdb.arch/x86_64-vla-typedef.c                  |   43 
 testsuite/gdb.arch/x86_64-vla-typedef.exp                |   64 
 testsuite/gdb.base/arrayidx.c                            |    7 
 testsuite/gdb.base/arrayidx.exp                          |   10 
 testsuite/gdb.base/help.exp                              |    2 
 testsuite/gdb.base/internal-var-field-address.c          |   20 
 testsuite/gdb.base/internal-var-field-address.exp        |   26 
 testsuite/gdb.base/lineno-makeup-func.c                  |   21 
 testsuite/gdb.base/lineno-makeup.c                       |   35 
 testsuite/gdb.base/lineno-makeup.exp                     |   78 
 testsuite/gdb.base/macscp.exp                            |    8 
 testsuite/gdb.base/radix.exp                             |    7 
 testsuite/gdb.base/valgrind-attach.c                     |   28 
 testsuite/gdb.base/valgrind-attach.exp                   |   94 
 testsuite/gdb.base/valgrind-attach.sh                    |   20 
 testsuite/gdb.base/vla-overflow.c                        |   30 
 testsuite/gdb.base/vla-overflow.exp                      |  108 
 testsuite/gdb.base/vla.c                                 |   55 
 testsuite/gdb.base/vla.exp                               |   62 
 testsuite/gdb.base/watchpoint-hw.c                       |    6 
 testsuite/gdb.base/watchpoint-hw.exp                     |   45 
 testsuite/gdb.cp/Makefile.in                             |    2 
 testsuite/gdb.cp/cp-relocate.exp                         |    6 
 testsuite/gdb.cp/cplusfuncs.cc                           |   10 
 testsuite/gdb.cp/cplusfuncs.exp                          |  225 +
 testsuite/gdb.cp/expand-sals.exp                         |    2 
 testsuite/gdb.cp/gdb9593.cc                              |  180 +
 testsuite/gdb.cp/gdb9593.exp                             |  185 +
 testsuite/gdb.cp/member-ptr.cc                           |   17 
 testsuite/gdb.cp/member-ptr.exp                          |   34 
 testsuite/gdb.cp/namespace-multiple-imports.cc           |   20 
 testsuite/gdb.cp/namespace-multiple-imports.exp          |   49 
 testsuite/gdb.cp/namespace-nested-imports.cc             |   36 
 testsuite/gdb.cp/namespace-nested-imports.exp            |   57 
 testsuite/gdb.cp/namespace-no-imports.cc                 |   37 
 testsuite/gdb.cp/namespace-no-imports.exp                |   76 
 testsuite/gdb.cp/namespace-recursive.cc                  |   47 
 testsuite/gdb.cp/namespace-recursive.exp                 |   75 
 testsuite/gdb.cp/namespace-stress-declarations.cc        |   93 
 testsuite/gdb.cp/namespace-stress-declarations.exp       |   50 
 testsuite/gdb.cp/namespace-stress.cc                     |   60 
 testsuite/gdb.cp/namespace-stress.exp                    |   50 
 testsuite/gdb.cp/namespace-using.cc                      |  128 -
 testsuite/gdb.cp/namespace-using.exp                     |  132 +
 testsuite/gdb.cp/namespace.exp                           |   23 
 testsuite/gdb.cp/overload.exp                            |    8 
 testsuite/gdb.cp/ovldbreak.exp                           |   46 
 testsuite/gdb.cp/shadowing.cc                            |   48 
 testsuite/gdb.cp/shadowing.exp                           |   91 
 testsuite/gdb.dwarf2/dw2-aranges.S                       |  140 +
 testsuite/gdb.dwarf2/dw2-aranges.exp                     |   40 
 testsuite/gdb.dwarf2/dw2-stripped.c                      |   42 
 testsuite/gdb.dwarf2/dw2-stripped.exp                    |   79 
 testsuite/gdb.dwarf2/dw2-struct-member-data-location.S   |   83 
 testsuite/gdb.dwarf2/dw2-struct-member-data-location.exp |   37 
 testsuite/gdb.fortran/common-block.exp                   |  101 
 testsuite/gdb.fortran/common-block.f90                   |   67 
 testsuite/gdb.fortran/dwarf-stride.exp                   |   42 
 testsuite/gdb.fortran/dwarf-stride.f90                   |   40 
 testsuite/gdb.fortran/dynamic.exp                        |  145 +
 testsuite/gdb.fortran/dynamic.f90                        |   98 
 testsuite/gdb.fortran/library-module-lib.f90             |   28 
 testsuite/gdb.fortran/library-module-main.f90            |   23 
 testsuite/gdb.fortran/library-module.exp                 |   53 
 testsuite/gdb.fortran/logical.exp                        |   44 
 testsuite/gdb.fortran/logical.f90                        |   33 
 testsuite/gdb.fortran/module.exp                         |   28 
 testsuite/gdb.fortran/module.f90                         |   37 
 testsuite/gdb.fortran/string.exp                         |   59 
 testsuite/gdb.fortran/string.f90                         |   37 
 testsuite/gdb.gdb/selftest.exp                           |    4 
 testsuite/gdb.java/jnpe.exp                              |   77 
 testsuite/gdb.java/jnpe.java                             |   38 
 testsuite/gdb.opt/array-from-register-func.c             |   22 
 testsuite/gdb.opt/array-from-register.c                  |   28 
 testsuite/gdb.opt/array-from-register.exp                |   33 
 testsuite/gdb.opt/fortran-string.exp                     |   41 
 testsuite/gdb.opt/fortran-string.f90                     |   28 
 testsuite/gdb.python/py-cmd.exp                          |   27 
 testsuite/gdb.python/py-frame.exp                        |   48 
 testsuite/gdb.python/py-function.exp                     |   27 
 testsuite/gdb.python/py-inferior.c                       |   49 
 testsuite/gdb.python/py-inferior.exp                     |  201 +
 testsuite/gdb.python/py-infthread.c                      |   14 
 testsuite/gdb.python/py-infthread.exp                    |   58 
 testsuite/gdb.python/py-prettyprint.exp                  |   22 
 testsuite/gdb.python/py-template.exp                     |   25 
 testsuite/gdb.python/py-value.exp                        |   31 
 testsuite/gdb.python/python.exp                          |   27 
 testsuite/gdb.threads/watchpoint-fork-forkoff.c          |  175 +
 testsuite/gdb.threads/watchpoint-fork-mt.c               |  157 +
 testsuite/gdb.threads/watchpoint-fork.c                  |   57 
 testsuite/gdb.threads/watchpoint-fork.exp                |  130 +
 testsuite/gdb.threads/watchthreads-reorder.c             |  366 +++
 testsuite/gdb.threads/watchthreads-reorder.exp           |  105 
 testsuite/lib/cp-support.exp                             |    3 
 testsuite/lib/gdb.exp                                    |    1 
 testsuite/lib/python-support.exp                         |   53 
 thread.c                                                 |   18 
 top.c                                                    |    1 
 typeprint.c                                              |   14 
 typeprint.h                                              |    3 
 ui-file.c                                                |   20 
 ui-file.h                                                |    6 
 utils.c                                                  |    7 
 valarith.c                                               |   45 
 valops.c                                                 |  258 +-
 valprint.c                                               |    4 
 value.c                                                  |  152 +
 value.h                                                  |    8 
 varobj.c                                                 |   76 
 xcoffread.c                                              |    1 
 246 files changed, 19221 insertions(+), 2450 deletions(-)

View full diff with command:
/usr/bin/cvs -n -f diff -kk -u -p -N -r 1.33 -r 1.34 gdb-archer.patchIndex: gdb-archer.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-archer.patch,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -p -r1.33 -r1.34
--- gdb-archer.patch	30 Sep 2009 20:58:49 -0000	1.33
+++ gdb-archer.patch	12 Jan 2010 22:15:55 -0000	1.34
@@ -2,7 +2,7 @@ http://sourceware.org/gdb/wiki/ProjectAr
 http://sourceware.org/gdb/wiki/ArcherBranchManagement
 
 GIT snapshot:
-commit 7cb860f03e2437c97239334ebe240d06f45723e0
+commit 6e73988f653ba986e8742f208f17ec084292cbd5
 
 branch `archer' - the merge of branches:
 archer-tromey-call-frame-cfa
@@ -19,12 +19,12 @@ archer-pmuldoon-next-over-throw
 
 
 diff --git a/gdb/Makefile.in b/gdb/Makefile.in
-index f5e1dde..73ee55c 100644
+index 7d53205..319fac4 100644
 --- a/gdb/Makefile.in
 +++ b/gdb/Makefile.in
 @@ -169,6 +169,10 @@ TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@
  # Did the user give us a --with-gdb-datadir option?
- GDB_DATADIR_PATH = @GDB_DATADIR_PATH@
+ GDB_DATADIR = @GDB_DATADIR@
  
 +# The argument to --with-pythondir.  If not given, this is
 +# GDB_DATADIR_PATH/python.
@@ -194,10 +194,10 @@ index f5e1dde..73ee55c 100644
  # Dependency tracking.  Most of this is conditional on GNU Make being
  # found by configure; if GNU Make is not found, we fall back to a
 diff --git a/gdb/NEWS b/gdb/NEWS
-index 4fc6dcd..6744b23 100644
+index 8d32c34..f7ea21b 100644
 --- a/gdb/NEWS
 +++ b/gdb/NEWS
-@@ -462,6 +462,13 @@ x86/x86_64 Darwin		i[34567]86-*-darwin*
+@@ -476,6 +476,13 @@ x86/x86_64 Darwin		i[34567]86-*-darwin*
  
  x86_64 MinGW			x86_64-*-mingw*
  
@@ -290,7 +290,7 @@ index 9b5d2c6..61676a9 100644
    ada_dump_subexp_body,
    ada_evaluate_subexp
 diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c
-index 7d8461c..a6d35d7 100644
+index 7d8461c..fc4b3e0 100644
 --- a/gdb/amd64-linux-nat.c
 +++ b/gdb/amd64-linux-nat.c
 @@ -270,6 +270,8 @@ amd64_linux_dr_get (ptid_t ptid, int regnum)
@@ -340,7 +340,7 @@ index 7d8461c..a6d35d7 100644
    return amd64_linux_dr_get (inferior_ptid, DR_STATUS);
  }
  
-+/* Unset VALUE bits in DR_STATUS in all LWPs of LWP_LIST.  */
++/* Unset MASK bits in DR_STATUS in all LWPs of LWP_LIST.  */
 +
 +static void
 +amd64_linux_dr_unset_status (unsigned long mask)
@@ -463,7 +463,7 @@ index 53e7371..d373f8a 100644
 +
  #endif /* BLOCK_H */
 diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
-index 811cdfb..b0bf314 100644
+index 811cdfb..0f35101 100644
 --- a/gdb/breakpoint.c
 +++ b/gdb/breakpoint.c
 @@ -61,6 +61,7 @@
@@ -684,14 +684,14 @@ index 811cdfb..b0bf314 100644
 +
 +  /* Find BC_L which is a leftmost element which may affect BUF content.  It is
 +     safe to report lower value but a failure to report higher one.  */
-+
+ 
+-  ALL_BP_LOCATIONS (b)
 +  bc_l = 0;
 +  bc_r = bp_location_count;
 +  while (bc_l + 1 < bc_r)
 +    {
 +      struct bp_location *b;
- 
--  ALL_BP_LOCATIONS (b)
++
 +      bc = (bc_l + bc_r) / 2;
 +      b = bp_location[bc];
 +
@@ -1553,7 +1553,7 @@ index 811cdfb..b0bf314 100644
  /* If SHOULD_INSERT is false, do not insert any breakpoint locations
     into the inferior, only remove already-inserted locations that no
     longer should be inserted.  Functions that delete a breakpoint or
-@@ -7777,49 +7951,66 @@ static void
+@@ -7777,49 +7951,78 @@ static void
  update_global_location_list (int should_insert)
  {
    struct breakpoint *b;
@@ -1625,11 +1625,11 @@ index 811cdfb..b0bf314 100644
      {
 -      /* Tells if 'loc' is found amoung the new locations.  If not, we
 +      struct bp_location *old_loc = *old_locp;
++      struct bp_location **loc2p;
 +
 +      /* Tells if 'old_loc' is found amoung the new locations.  If not, we
  	 have to free it.  */
--      int found_object = 0;
-+      int found_object;
+       int found_object = 0;
        /* Tells if the location should remain inserted in the target.  */
        int keep_in_target = 0;
        int removed = 0;
@@ -1643,13 +1643,24 @@ index 811cdfb..b0bf314 100644
 +      /* Skip LOCP entries which will definitely never be needed.  Stop either
 +	 at or being the one matching OLD_LOC.  */
 +      while (locp < bp_location + bp_location_count
-+	     && bp_location_compare (*locp, old_loc) < 0)
++	     && (*locp)->address < old_loc->address)
 +	locp++;
-+      found_object = locp < bp_location + bp_location_count && *locp == old_loc;
++
++      for (loc2p = locp;
++	   (loc2p < bp_location + bp_location_count
++	    && (*loc2p)->address == old_loc->address);
++	   loc2p++)
++	{
++	  if (*loc2p == old_loc)
++	    {
++	      found_object = 1;
++	      break;
++	    }
++	}
  
        /* If this location is no longer present, and inserted, look if there's
  	 maybe a new location at the same address.  If so, mark that one 
-@@ -7827,11 +8018,11 @@ update_global_location_list (int should_insert)
+@@ -7827,11 +8030,11 @@ update_global_location_list (int should_insert)
  	 don't have a time window where a breakpoint at certain location is not
  	 inserted.  */
  
@@ -1663,7 +1674,7 @@ index 811cdfb..b0bf314 100644
  	    {
  	      /* The location is still present in the location list, and still
  		 should be inserted.  Don't do anything.  */
-@@ -7842,37 +8033,46 @@ update_global_location_list (int should_insert)
+@@ -7842,37 +8045,46 @@ update_global_location_list (int should_insert)
  	      /* The location is either no longer present, or got disabled.
  		 See if there's another location at the same address, in which 
  		 case we don't need to remove this one from the target.  */
@@ -1685,24 +1696,24 @@ index 811cdfb..b0bf314 100644
 +
 +	      if (breakpoint_address_is_meaningful (old_loc->owner))
 +		{
-+		  struct bp_location **loc2p;
-+
 +		  for (loc2p = locp;
-+		       loc2p < bp_location + bp_location_count
-+		       && (*loc2p)->address == old_loc->address;
++		       (loc2p < bp_location + bp_location_count
++			&& (*loc2p)->address == old_loc->address);
 +		       loc2p++)
 +		    {
 +		      struct bp_location *loc2 = *loc2p;
 +
-+		      /* For the sake of should_be_inserted.
-+			 Duplicates check below will fix up this later.  */
-+		      loc2->duplicate = 0;
-+		      if (loc2 != old_loc && should_be_inserted (loc2))
-+			{		  
-+			  loc2->inserted = 1;
-+			  loc2->target_info = old_loc->target_info;
-+			  keep_in_target = 1;
-+			  break;
++			{
++			  /* For the sake of should_be_inserted.
++			     Duplicates check below will fix up this later.  */
++			  loc2->duplicate = 0;
++			  if (loc2 != old_loc && should_be_inserted (loc2))
++			    {
++			      loc2->inserted = 1;
++			      loc2->target_info = old_loc->target_info;
++			      keep_in_target = 1;
++			      break;
++			    }
 +			}
 +		    }
 +		}
@@ -1728,7 +1739,7 @@ index 811cdfb..b0bf314 100644
  		}
  	      removed = 1;
  	    }
-@@ -7894,19 +8094,59 @@ update_global_location_list (int should_insert)
+@@ -7894,19 +8106,59 @@ update_global_location_list (int should_insert)
  		 longer need to keep this breakpoint.  This is just a
  		 heuristic, but if it's wrong, we'll report unexpected SIGTRAP,
  		 which is usability issue, but not a correctness problem.  */
@@ -1794,7 +1805,7 @@ index 811cdfb..b0bf314 100644
      }
  
[...2856 lines suppressed...]
-@@ -1176,6 +1250,7 @@ struct value *
+@@ -1178,6 +1252,7 @@ struct value *
  value_coerce_array (struct value *arg1)
  {
    struct type *type = check_typedef (value_type (arg1));
@@ -27945,7 +28939,7 @@ index b64cb21..b7d31cc 100644
  
    /* If the user tries to do something requiring a pointer with an
       array that has not yet been pushed to the target, then this would
-@@ -1185,8 +1260,12 @@ value_coerce_array (struct value *arg1)
+@@ -1187,8 +1262,12 @@ value_coerce_array (struct value *arg1)
    if (VALUE_LVAL (arg1) != lval_memory)
      error (_("Attempt to take address of value not located in memory."));
  
@@ -27959,7 +28953,7 @@ index b64cb21..b7d31cc 100644
  }
  
  /* Given a value which is a function, return a value which is a pointer
-@@ -2069,12 +2148,25 @@ find_overload_match (struct type **arg_types, int nargs,
+@@ -2071,12 +2150,25 @@ find_overload_match (struct type **arg_types, int nargs,
    if (method)
      {
        gdb_assert (obj);
@@ -27990,7 +28984,7 @@ index b64cb21..b7d31cc 100644
  
        fns_ptr = value_find_oload_method_list (&temp, name, 
  					      0, &num_fns, 
-@@ -2094,16 +2186,29 @@ find_overload_match (struct type **arg_types, int nargs,
+@@ -2096,16 +2188,29 @@ find_overload_match (struct type **arg_types, int nargs,
      }
    else
      {
@@ -28028,7 +29022,7 @@ index b64cb21..b7d31cc 100644
        if (func_name == NULL)
          {
  	  *symp = fsym;
-@@ -2534,8 +2639,8 @@ check_field (struct type *type, const char *name)
+@@ -2536,8 +2641,8 @@ check_field (struct type *type, const char *name)
     the comment before value_struct_elt_for_reference.  */
  
  struct value *
@@ -28039,7 +29033,7 @@ index b64cb21..b7d31cc 100644
  		     enum noside noside)
  {
    switch (TYPE_CODE (curtype))
-@@ -2543,7 +2648,7 @@ value_aggregate_elt (struct type *curtype,
+@@ -2545,7 +2650,7 @@ value_aggregate_elt (struct type *curtype,
      case TYPE_CODE_STRUCT:
      case TYPE_CODE_UNION:
        return value_struct_elt_for_reference (curtype, 0, curtype, 
@@ -28048,7 +29042,7 @@ index b64cb21..b7d31cc 100644
  					     want_address, noside);
      case TYPE_CODE_NAMESPACE:
        return value_namespace_elt (curtype, name, 
-@@ -2554,6 +2659,56 @@ value_aggregate_elt (struct type *curtype,
+@@ -2556,6 +2661,56 @@ value_aggregate_elt (struct type *curtype,
      }
  }
  
@@ -28105,7 +29099,7 @@ index b64cb21..b7d31cc 100644
  /* C++: Given an aggregate type CURTYPE, and a member name NAME,
     return the address of this member as a "pointer to member" type.
     If INTYPE is non-null, then it will be the type of the member we
-@@ -2631,23 +2786,46 @@ value_struct_elt_for_reference (struct type *domain, int offset,
+@@ -2633,23 +2788,46 @@ value_struct_elt_for_reference (struct type *domain, int offset,
  	}
        if (t_field_name && strcmp (t_field_name, name) == 0)
  	{
@@ -28162,7 +29156,7 @@ index b64cb21..b7d31cc 100644
  
  	  if (TYPE_FN_FIELD_STATIC_P (f, j))
  	    {
-@@ -2761,7 +2939,7 @@ value_maybe_namespace_elt (const struct type *curtype,
+@@ -2763,7 +2941,7 @@ value_maybe_namespace_elt (const struct type *curtype,
    struct symbol *sym;
    struct value *result;
  
@@ -28171,7 +29165,7 @@ index b64cb21..b7d31cc 100644
  				    get_selected_block (0), 
  				    VAR_DOMAIN);
  
-@@ -2905,7 +3083,7 @@ value_of_local (const char *name, int complain)
+@@ -2907,7 +3085,7 @@ value_of_local (const char *name, int complain)
  
    /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
       symbol instead of the LOC_ARG one (if both exist).  */
@@ -28180,7 +29174,7 @@ index b64cb21..b7d31cc 100644
    if (sym == NULL)
      {
        if (complain)
-@@ -2959,8 +3137,6 @@ value_slice (struct value *array, int lowbound, int length)
+@@ -2961,8 +3139,6 @@ value_slice (struct value *array, int lowbound, int length)
        || lowbound + length - 1 > upperbound)
      error (_("slice out of range"));
  
@@ -28219,7 +29213,7 @@ index cbb5d94..f9634ea 100644
  	  ++reps;
  	  ++rep1;
 diff --git a/gdb/value.c b/gdb/value.c
-index 589e03b..66013b7 100644
+index 589e03b..62003fa 100644
 --- a/gdb/value.c
 +++ b/gdb/value.c
 @@ -37,8 +37,10 @@
@@ -28303,18 +29297,20 @@ index 589e03b..66013b7 100644
    if (VALUE_LVAL (whole) == lval_computed)
      {
        struct lval_funcs *funcs = whole->location.computed.funcs;
-@@ -776,6 +799,10 @@ set_value_component_location (struct value *component, struct value *whole)
+@@ -776,6 +799,12 @@ set_value_component_location (struct value *component, struct value *whole)
        if (funcs->copy_closure)
          component->location.computed.closure = funcs->copy_closure (whole);
      }
 +
 +  addr = value_raw_address (component);
 +  object_address_get_data (value_type (whole), &addr);
-+  set_value_address (component, addr);
++  if (component->lval != lval_internalvar
++      && component->lval != lval_internalvar_component)
++    set_value_address (component, addr);
  }
  
  
-@@ -906,6 +933,29 @@ show_values (char *num_exp, int from_tty)
+@@ -906,6 +935,29 @@ show_values (char *num_exp, int from_tty)
        num_exp[1] = '\0';
      }
  }
@@ -28344,7 +29340,7 @@ index 589e03b..66013b7 100644
  
  /* Internal variables.  These are variables within the debugger
     that hold values assigned by debugger commands.
-@@ -1381,6 +1431,40 @@ call_internal_function (struct gdbarch *gdbarch,
+@@ -1381,6 +1433,40 @@ call_internal_function (struct gdbarch *gdbarch,
    return (*ifn->handler) (gdbarch, language, ifn->cookie, argc, argv);
  }
  
@@ -28385,7 +29381,7 @@ index 589e03b..66013b7 100644
  /* The 'function' command.  This does nothing -- it is just a
     placeholder to let "help function NAME" work.  This is also used as
     the implementation of the sub-command that is created when
-@@ -1428,11 +1512,10 @@ preserve_one_value (struct value *value, struct objfile *objfile,
+@@ -1428,11 +1514,10 @@ preserve_one_value (struct value *value, struct objfile *objfile,
  		    htab_t copied_types)
  {
    if (TYPE_OBJFILE (value->type) == objfile)
@@ -28399,7 +29395,7 @@ index 589e03b..66013b7 100644
  						 copied_types);
  }
  
-@@ -1447,13 +1530,13 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile,
+@@ -1447,13 +1532,13 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile,
      case INTERNALVAR_INTEGER:
        if (var->u.integer.type && TYPE_OBJFILE (var->u.integer.type) == objfile)
  	var->u.integer.type
@@ -28415,7 +29411,7 @@ index 589e03b..66013b7 100644
        break;
  
      case INTERNALVAR_VALUE:
-@@ -1855,6 +1938,8 @@ value_change_enclosing_type (struct value *val, struct type *new_encl_type)
+@@ -1855,6 +1940,8 @@ value_change_enclosing_type (struct value *val, struct type *new_encl_type)
      val->contents =
        (gdb_byte *) xrealloc (val->contents, TYPE_LENGTH (new_encl_type));
  
@@ -28424,7 +29420,7 @@ index 589e03b..66013b7 100644
    val->enclosing_type = new_encl_type;
    return val;
  }
-@@ -1919,6 +2004,8 @@ value_primitive_field (struct value *arg1, int offset,
+@@ -1919,6 +2006,8 @@ value_primitive_field (struct value *arg1, int offset,
  	  memcpy (value_contents_all_raw (v), value_contents_all_raw (arg1),
  		  TYPE_LENGTH (value_enclosing_type (arg1)));
  	}
@@ -28433,7 +29429,7 @@ index 589e03b..66013b7 100644
        v->type = type;
        v->offset = value_offset (arg1);
        v->embedded_offset = (offset + value_embedded_offset (arg1)
-@@ -2177,6 +2264,42 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num)
+@@ -2177,6 +2266,42 @@ pack_long (gdb_byte *buf, struct type *type, LONGEST num)
  }
  
  
@@ -28476,7 +29472,7 @@ index 589e03b..66013b7 100644
  /* Convert C numbers into newly allocated values.  */
  
  struct value *
-@@ -2190,6 +2313,19 @@ value_from_longest (struct type *type, LONGEST num)
+@@ -2190,6 +2315,19 @@ value_from_longest (struct type *type, LONGEST num)
  }
  
  
@@ -28496,7 +29492,7 @@ index 589e03b..66013b7 100644
  /* Create a value representing a pointer of type TYPE to the address
     ADDR.  */
  struct value *
-@@ -2348,4 +2484,8 @@ VARIABLE is already initialized."));
+@@ -2348,4 +2486,8 @@ VARIABLE is already initialized."));
    add_prefix_cmd ("function", no_class, function_command, _("\
  Placeholder command for showing help on convenience functions."),
  		  &functionlist, "function ", 0, &cmdlist);


Index: gdb-orphanripper.c
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-orphanripper.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -p -r1.3 -r1.4
--- gdb-orphanripper.c	31 Jul 2009 08:36:06 -0000	1.3
+++ gdb-orphanripper.c	12 Jan 2010 22:15:56 -0000	1.4
@@ -276,12 +276,16 @@ static int spawn (char **argv, int timeo
 
   assert (signal_chld_hit != 0);
 
+  /* Do not unset O_NONBLOCK as a stale child (the whole purpose of this
+     program) having open its output pty would block us in read_out.  */
+#if 0
   i = fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */);
   if (i != 0)
     {
       perror ("fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */)");
       exit (EXIT_FAILURE);
     }
+#endif
 
   while (read_out (amaster));
 


Index: gdb.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb.spec,v
retrieving revision 1.390
retrieving revision 1.391
diff -u -p -r1.390 -r1.391
--- gdb.spec	30 Sep 2009 20:58:50 -0000	1.390
+++ gdb.spec	12 Jan 2010 22:15:57 -0000	1.391
@@ -4,21 +4,45 @@
 # --with upstream: No Fedora specific patches get applied.
 # --without python: No python support.
 
+# RHEL-5 was the last not providing `/etc/rpm/macros.dist'.
+%if 0%{!?dist:1}
+%define rhel 5
+%define dist .el5
+%define el5 1
+%endif
+# RHEL-5 Brew does not set %{el5}.
+%if "%{dist}" == ".el5"
+# RHEL-5 ppc* python .so files are shipped only as ppc but gdb is ppc64 there.
+# Brew builds it fine as its ppc64 buildroot has full ppc64 package set.
+# Make this conditional so that Brew-built GDB has no python on any arch but
+# GDB rebuilt on native non-ppc64 host does have it.
+%if 0%{!?el5:1}
+%define _without_python 1
+%else
+%ifarch ppc64
+%define _without_python 1
+%endif
+%endif
+%define el5 1
+%endif
+
 Summary: A GNU source-level debugger for C, C++, Java and other languages
 Name: gdb%{?_with_debug:-debug}
 
 # Set version to contents of gdb/version.in.
-# NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3 
+# NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3
 # and, since January 2005, X.Y.Z.date for daily snapshots, like 6.3.50.20050112 # (daily snapshot from mailine), or 6.3.0.20040112 (head of the release branch).
-Version: 6.8.91.20090930
+Version: 7.0.1
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 1%{?_with_upstream:.upstream}%{?dist}
+Release: 25%{?_with_upstream:.upstream}%{dist}
 
 License: GPLv3+
 Group: Development/Debuggers
-Source: ftp://sourceware.org/pub/gdb/snapshots/branch/gdb-%{version}.tar.bz2
+# ftp://sourceware.org/pub/gdb/snapshots/branch/gdb-%{version}.tar.bz2
+# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.bz2
+Source: ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.bz2
 Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
 URL: http://gnu.org/software/gdb/
 
@@ -39,11 +63,13 @@ URL: http://gnu.org/software/gdb/
 Obsoletes: gdb64 < 5.3.91
 %endif
 
+%if 0%{!?el5:1}
 %if 0%{!?_with_upstream:1}
 # The last Rawhide release was (no dist tag) pstack-1.2-7.2.2
 Obsoletes: pstack < 1.2-7.2.2.1
 Provides: pstack = 1.2-7.2.2.1
-%endif	# 0%{!?_with_upstream:1}
+%endif # 0%{!?_with_upstream:1}
+%endif # 0%{!?el5:1}
 
 # GDB patches have the format `gdb-<version>-bz<red-hat-bz-#>-<desc>.patch'.
 # They should be created using patch level 1: diff -up ./gdb (or gdb-6.3/gdb).
@@ -56,7 +82,7 @@ Source3: gdb-gstack.man
 
 # libstdc++ pretty printers from GCC SVN HEAD (4.5 experimental).
 %define libstdcxxpython libstdc++-v3-python-r151798
-Source4: %{libstdcxxpython}.tar.xz
+Source4: %{libstdcxxpython}.tar.bz2
 
 # Work around out-of-date dejagnu that does not have KFAIL
 Patch1: gdb-6.3-rh-dummykfail-20041202.patch
@@ -92,14 +118,13 @@ Patch118: gdb-6.3-gstack-20050411.patch
 
 # VSYSCALL and PIE
 Patch122: gdb-6.3-test-pie-20050107.patch
-Patch124: gdb-6.3-pie-20050110.patch
+Patch124: gdb-archer-pie.patch
+Patch389: gdb-archer-pie-addons.patch
+Patch394: gdb-archer-pie-addons-keep-disabled.patch
 
 # Get selftest working with sep-debug-info
 Patch125: gdb-6.3-test-self-20050110.patch
 
-# Fix for non-threaded watchpoints.
-Patch128: gdb-6.3-nonthreaded-wp-20050117.patch
-
 # Test support of multiple destructors just like multiple constructors
 Patch133: gdb-6.3-test-dtorfix-20050121.patch
 
@@ -125,10 +150,6 @@ Patch145: gdb-6.3-threaded-watchpoints2-
 # Fix printing of inherited members
 Patch148: gdb-6.3-inheritance-20050324.patch
 
-# Print a warning when the separate debug info's CRC doesn't match.
-Patch150: gdb-6.3-test-sepcrc-20050402.patch
-Patch151: gdb-6.3-sepcrc-20050402.patch
-
 # Do not issue warning message about first page of storage for ia64 gcore
 Patch153: gdb-6.3-ia64-gcore-page0-20050421.patch
 
@@ -219,8 +240,8 @@ Patch229: gdb-6.3-bz140532-ppc-unwinding
 # Testcase for exec() from threaded program (BZ 202689).
 Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
 
-# Backported post gdb-6.8.50.20090991 snapshot fixups.
-#Patch232: gdb-6.8.50.20090921-upstream.patch
+# Backported post gdb-7.0 fixups.
+Patch232: gdb-7.0-upstream.patch
 
 # Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
 Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch
@@ -301,8 +322,8 @@ Patch309: gdb-6.3-mapping-zero-inode-tes
 # Test a crash on `focus cmd', `focus prev' commands.
 Patch311: gdb-6.3-focus-cmd-prev-test.patch
 
-# Test crash on a sw watchpoint condition getting out of the scope.
-Patch314: gdb-6.3-watchpoint-cond-gone-test.patch
+# Fix error on a sw watchpoint active at function epilogue (hit on s390x).
+Patch314: gdb-watchpoint-cond-gone.patch
 
 # Test various forms of threads tracking across exec() (BZ 442765).
 Patch315: gdb-6.8-bz442765-threaded-exec-test.patch
@@ -367,54 +388,144 @@ Patch376: libstdc++-v3-python-common-pre
 # New test for step-resume breakpoint placed in multiple threads at once.
 Patch381: gdb-simultaneous-step-resume-breakpoint-test.patch
 
-BuildRequires: ncurses-devel texinfo gettext flex bison expat-devel
-Requires: readline
-BuildRequires: readline-devel
+# Fix GNU/Linux core open: Can't read pathname for load map: Input/output error.
+Patch382: gdb-core-open-vdso-warning.patch
+
+# Support multiple directories for `set debug-file-directory' (BZ 528668).
+Patch383: gdb-bz528668-symfile-sepcrc.patch
+Patch384: gdb-bz528668-symfile-cleanup.patch
+Patch385: gdb-bz528668-symfile-multi.patch
+
+# Support GNU IFUNCs - indirect functions (BZ 539590).
+Patch387: gdb-bz539590-gnu-ifunc.patch
+
+# Fix bp conditionals [bp_location-accel] regression (BZ 538626).
+Patch388: gdb-bz538626-bp_location-accel-bp-cond.patch
+
+# Fix callback-mode readline-6.0 regression for CTRL-C.
+Patch390: gdb-readline-6.0-signal.patch
+
+# Fix syscall restarts for amd64->i386 biarch.
+Patch391: gdb-x86_64-i386-syscall-restart.patch
+
+# Fix stepping with OMP parallel Fortran sections (BZ 533176).
+Patch392: gdb-bz533176-fortran-omp-step.patch
+
+# Use gfortran44 when running the testsuite on RHEL-5.
+Patch393: gdb-rhel5-gcc44.patch
+
+# Disable warning messages new for gdb-6.8+ for RHEL-5 backward compatibility.
+# Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
+Patch335: gdb-rhel5-compat.patch
+
+# Fix backward compatibility with G++ 4.1 namespaces "::".
+Patch395: gdb-empty-namespace.patch
+
+# Fix regression on re-setting the single ppc watchpoint slot.
+Patch396: gdb-ppc-hw-watchpoint-twice.patch
+
+# Fix regression by python on ia64 due to stale current frame.
+Patch397: gdb-follow-child-stale-parent.patch
+
+# testsuite: Fix false MI "unknown output after running" regression.
+Patch398: gdb-testsuite-unknown-output.patch
+
+# Fix regression of gdb-7.0.1 not preserving typedef of a field.
+Patch399: gdb-bitfield-check_typedef.patch
+
+# Fix related_breakpoint stale ref crash.
+Patch400: gdb-stale-related_breakpoint.patch
+
+# Fix crash reading broken stabs (it377671).
+Patch401: gdb-stabs-read_args.patch
+
+BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
+Requires: readline%{?_isa}
+BuildRequires: readline-devel%{?_isa}
+%if 0%{!?el5:1}
 # dlopen() no longer makes rpm-libs a mandatory dependency.
-#Requires: rpm-libs
-BuildRequires: rpm-devel
+#Requires: rpm-libs%{?_isa}
+BuildRequires: rpm-devel%{?_isa}
+%endif # 0%{!?el5:1}
+Requires: zlib%{?_isa}
+BuildRequires: zlib-devel%{?_isa}
 %if 0%{!?_without_python:1}
-Requires: python-libs
-BuildRequires: python-devel
-# Temporarily before it gets moved to libstdc++.rpm
-BuildRequires: libstdc++
-%endif	# 0%{!?_without_python:1}
+%if 0%{!?el5:1}
+Requires: python-libs%{?_isa}
+%else
+Requires: python%{?_isa}
+%endif
+BuildRequires: python-devel%{?_isa}
+# Temporarily before python files get moved to libstdc++.rpm
+# libstdc++%{bits_other} is not present in Koji, the .spec script generating
+# gdb/python/libstdcxx/ also does not depend on the %{bits_other} files.
+BuildRequires: libstdc++%{?_isa}
+%endif # 0%{!?_without_python:1}
 
 %if 0%{?_with_testsuite:1}
+
+# Ensure the devel libraries are installed for both multilib arches.
+%define bits_local %{?_isa}
+%define bits_other %{?_isa}
+%ifarch s390x
+%define bits_other (%{__isa_name}-31)
+%else #!s390x
+%ifarch ppc
+%define bits_other (%{__isa_name}-64)
+%else #!ppc
+%ifarch sparc64 ppc64 s390x x86_64
+%define bits_other (%{__isa_name}-32)
+%endif #sparc64 ppc64 s390x x86_64
+%endif #!ppc
+%endif #!s390x
+
 BuildRequires: sharutils dejagnu
 # gcc-objc++ is not covered by the GDB testsuite.
-BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc fpc glibc-static
-# Ensure the devel libraries are installed for both multilib arches.
-%define multilib_64_archs sparc64 ppc64 s390x x86_64
-# Copied from gcc-4.1.2-32
+BuildRequires: gcc gcc-c++ gcc-gfortran gcc-java gcc-objc
+# Copied from prelink-0.4.2-3.fc13.
+%ifarch %{ix86} alpha sparc sparcv9 sparc64 s390 s390x x86_64 ppc ppc64
+# Prelink is broken on sparcv9/sparc64.
+%ifnarch sparcv9 sparc64
+BuildRequires: prelink
+%endif
+%endif
+%if 0%{!?rhel:1}
+BuildRequires: fpc
+%endif
+%if 0%{?el5:1}
+BuildRequires: gcc44 gcc44-gfortran
+%endif
+# Copied from gcc-4.1.2-32.
 %ifarch %{ix86} x86_64 ia64 ppc alpha
 BuildRequires: gcc-gnat
-%ifarch %{multilib_64_archs} ppc
-BuildRequires: %{_exec_prefix}/lib64/libgnat-4.4.so %{_exec_prefix}/lib/libgnat-4.4.so
+BuildRequires: libgnat%{bits_local} libgnat%{bits_other}
 %endif
-%endif
-%ifarch %{multilib_64_archs} sparc sparcv9 ppc
-BuildRequires: /lib/libc.so.6 %{_exec_prefix}/lib/libc.so /lib64/libc.so.6 %{_exec_prefix}/lib64/libc.so
-BuildRequires: /lib/libgcc_s.so.1 /lib64/libgcc_s.so.1
-BuildRequires: %{_exec_prefix}/lib/libstdc++.so.6 %{_exec_prefix}/lib64/libstdc++.so.6
-BuildRequires: %{_exec_prefix}/lib64/libgcj.so.10 %{_exec_prefix}/lib/libgcj.so.10
+BuildRequires: glibc-devel%{bits_local} glibc-devel%{bits_other}
+BuildRequires: libgcc%{bits_local} libgcc%{bits_other}
+# libstdc++-devel of matching bits is required only for g++ -static.
+BuildRequires: libstdc++%{bits_local} libstdc++%{bits_other}
+BuildRequires: libgcj%{bits_local} libgcj%{bits_other}
+BuildRequires: glibc-static%{bits_local}
 # multilib glibc-static is open Bug 488472:
-#BuildRequires: %{_exec_prefix}/lib64/libc.a %{_exec_prefix}/lib/libc.a
-# for gcc-java:
-BuildRequires: %{_exec_prefix}/lib64/libz.so %{_exec_prefix}/lib/libz.so
-%endif
+%if 0%{?el5:1}
+BuildRequires: glibc-static%{bits_other}
 %endif
+# for gcc-java linkage:
+BuildRequires: zlib-devel%{bits_local} zlib-devel%{bits_other}
+BuildRequires: valgrind%{bits_local} valgrind%{bits_other}
+
+%endif # 0%{?_with_testsuite:1}
 
 %ifarch ia64
+%if 0%{!?el5:1}
 BuildRequires: libunwind-devel >= 0.99-0.1.frysk20070405cvs
 Requires: libunwind >= 0.99-0.1.frysk20070405cvs
 %else
-# Prelink is broken on sparcv9/sparc64
-%ifnarch sparcv9 sparc64
-BuildRequires: prelink
+BuildRequires: libunwind >= 0.96-3
+Requires: libunwind >= 0.96-3
 %endif
 %endif
- 
+
 Requires(post): /sbin/install-info
 Requires(preun): /sbin/install-info
 
@@ -423,6 +534,7 @@ GDB, the GNU debugger, allows you to deb
 Java, and other languages, by executing them in a controlled fashion
 and printing their data.
 
+%if 0%{!?el5:1}
 %package gdbserver
 Summary: A standalone server for GDB (the GNU source-level debugger)
 Group: Development/Debuggers
@@ -433,6 +545,7 @@ Java, and other languages, by executing 
 and printing their data.
 
 This package provides a program that allows you to run GDB on a different machine than the one which is running the program being debugged.
+%endif # 0%{!?el5:1}
 
 %prep
 
@@ -442,7 +555,7 @@ This package provides a program that all
 %setup -q -n %{gdb_src}
 
 # libstdc++ pretty printers.
-xz -dc %{SOURCE4} | tar xf -
+tar xjf %{SOURCE4}
 
 # Files have `# <number> <file>' statements breaking VPATH / find-debuginfo.sh .
 rm -f gdb/ada-exp.c gdb/ada-lex.c gdb/c-exp.c gdb/cp-name-parser.c gdb/f-exp.c
@@ -455,8 +568,13 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 
 %if 0%{!?_with_upstream:1}
 
-#patch232 -p1
+%patch232 -p1
 %patch349 -p1
+%patch383 -p1
+%patch384 -p1
+%patch385 -p1
+%patch388 -p1
+%patch124 -p1
 %patch1 -p1
 %patch3 -p1
 
@@ -468,7 +586,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 %patch118 -p1
 %patch122 -p1
 %patch125 -p1
-%patch128 -p1
 %patch133 -p1
 %patch136 -p1
 %patch140 -p1
@@ -477,8 +594,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 %patch142 -p1
 %patch145 -p1
 %patch148 -p1
-%patch150 -p1
-%patch151 -p1
 %patch153 -p1
 %patch157 -p1
 %patch158 -p1
@@ -560,15 +675,37 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc
 %patch375 -p1
 %patch376 -p1
 %patch381 -p1
-%patch124 -p1
+%patch382 -p1
+%patch387 -p1
+%patch389 -p1
+%patch390 -p1
+%patch391 -p1
+%patch392 -p1
+# Always verify its applicability.
+%patch393 -p1
+%patch335 -p1
+%if 0%{!?el5:1}
+%patch393 -p1 -R
+%patch335 -p1 -R
+%endif
+%patch394 -p1
+%patch395 -p1
+%patch396 -p1
+%patch397 -p1
+%patch398 -p1
+%patch399 -p1
+%patch400 -p1
+%patch401 -p1
 
 find -name "*.orig" | xargs rm -f
-! find -name "*.rej"	# Should not happen.
+! find -name "*.rej" # Should not happen.
 
-%endif	# 0%{!?_with_upstream:1}
+%endif # 0%{!?_with_upstream:1}
 
 # Change the version that gets printed at GDB startup, so it is Fedora
 # specific.
+# Fedora (%{version}-%{release})
+# Red Hat Enterprise Linux (%{version}-%{release})
 cat > gdb/version.in << _FOO
 Fedora (%{version}-%{release})
 _FOO
@@ -604,44 +741,52 @@ export CFLAGS="$RPM_OPT_FLAGS"
 CFLAGS="$CFLAGS -O0 -ggdb2"
 %endif
 
-../configure						\
-	--prefix=%{_prefix}				\
-	--libdir=%{_libdir}				\
-	--sysconfdir=%{_sysconfdir}			\
-	--mandir=%{_mandir}				\
-	--infodir=%{_infodir}				\
-	--with-gdb-datadir=%{_datadir}/gdb		\
-	--with-pythondir=%{_datadir}/gdb/python		\
-	--enable-gdb-build-warnings=,-Wno-unused	\
+../configure							\
+	--prefix=%{_prefix}					\
+	--libdir=%{_libdir}					\
+	--sysconfdir=%{_sysconfdir}				\
+	--mandir=%{_mandir}					\
+	--infodir=%{_infodir}					\
+	--with-gdb-datadir=%{_datadir}/gdb			\
+	--with-pythondir=%{_datadir}/gdb/python			\
+	--enable-gdb-build-warnings=,-Wno-unused		\
 %ifnarch %{ix86} alpha ia64 ppc s390 s390x x86_64 ppc64 sparcv9 sparc64
-	--disable-werror				\
-%else 
+	--disable-werror					\
+%else
 %if 0%{?_with_upstream:1}
-	--disable-werror				\
+	--disable-werror					\
 %else
-	--enable-werror					\
+	--enable-werror						\
 %endif
 %endif
-	--with-separate-debug-dir=/usr/lib/debug	\
-	--disable-sim					\
-	--disable-rpath					\
-	--with-system-readline				\
-	--with-expat					\
-	--enable-tui					\
+	--with-separate-debug-dir=/usr/lib/debug		\
+	--disable-sim						\
+	--disable-rpath						\
+	--with-system-readline					\
+	--with-expat						\
+$(: ppc64 host build crashes on ppc variant of libexpat.so )	\
+	--without-libexpat-prefix				\
+	--enable-tui						\
 %if 0%{!?_without_python:1}
-	--with-python					\
+	--with-python						\
+%else
+	--without-python					\
+%endif
+$(: Workaround rpm.org#76, BZ 508193 on recent OSes. )		\
+$(: RHEL-5 librpm has incompatible API. )			\
+%if 0%{?el5:1}
+	--without-rpm						\
 %else
-	--without-python				\
+	--with-rpm=librpm.so.0					\
 %endif
-	--with-rpm=librpm.so.0				\
 %ifarch ia64
-	--with-libunwind				\
+	--with-libunwind					\
 %else
-	--without-libunwind				\
+	--without-libunwind					\
 %endif
-	--enable-64-bit-bfd				\
+	--enable-64-bit-bfd					\
 %if 0%{?_with_debug:1}
-	--enable-static --disable-shared --enable-debug	\
+	--enable-static --disable-shared --enable-debug		\
 %endif
 %ifarch sparcv9
 	sparc-%{_vendor}-%{_target_os}%{?_gnu}
@@ -652,6 +797,8 @@ CFLAGS="$CFLAGS -O0 -ggdb2"
 make %{?_smp_mflags}
 make %{?_smp_mflags} info
 
+grep '#define HAVE_ZLIB_H 1' gdb/config.h
+
 # Copy the <sourcetree>/gdb/NEWS file to the directory above it.
 cp $RPM_BUILD_DIR/%{gdb_src}/gdb/NEWS $RPM_BUILD_DIR/%{gdb_src}
 
@@ -664,7 +811,7 @@ echo ====================TESTSUITE DISAB
 %else
 echo ====================TESTING=========================
 cd gdb
-gcc -o ./orphanripper %{SOURCE2} -Wall -lutil
+gcc -o ./orphanripper %{SOURCE2} -Wall -lutil -ggdb2
 # Need to use a single --ignore option, second use overrides first.
 # No `%{?_smp_mflags}' here as it may race.
 # WARNING: can't generate a core file - core tests suppressed - check ulimit
@@ -719,10 +866,14 @@ gcc -o ./orphanripper %{SOURCE2} -Wall -
   # Run all the scheduled testsuite runs also in the PIE mode.
   # Upstream GDB would lock up the testsuite run for too long on its failures.
   CHECK="$(echo $CHECK|sed 's#check//unix/[^ ]*#& &/-fPIE/-pie#g')"
-%endif	# 0%{!?_with_upstream:1}
+%endif # 0%{!?_with_upstream:1}
 
-  # FIXME: Temporary F12 disable: ./orphanripper
-  make %{?_smp_mflags} -k $CHECK || :
+  ./orphanripper make %{?_smp_mflags} -k $CHECK \
+$(: Serialize the output to keep the order for regression checks. ) \
+%if 0%{?el5:1}
+    RUNTESTFLAGS="--tool gdb" \
+%endif
+    || :
 )
 for t in sum log
 do
@@ -771,7 +922,7 @@ done
 test ! -e $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx
 cp -a $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/libstdcxx	\
       $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx
-%endif	# 0%{!?_without_python:1}
+%endif # 0%{!?_without_python:1}
 
 # Remove the files that are part of a gdb build but that are owned and
 # provided by other packages.
@@ -794,9 +945,11 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir
 # pstack obsoletion
 
 cp -p %{SOURCE3} $RPM_BUILD_ROOT%{_mandir}/man1/gstack.1
+%if 0%{!?el5:1}
 ln -s gstack.1.gz $RPM_BUILD_ROOT%{_mandir}/man1/pstack.1.gz
 ln -s gstack $RPM_BUILD_ROOT%{_bindir}/pstack
-%endif	# 0%{!?_with_upstream:1}
+%endif # 0%{!?el5:1}
+%endif # 0%{!?_with_upstream:1}
 
 %clean
 rm -rf $RPM_BUILD_ROOT
@@ -805,17 +958,26 @@ rm -rf $RPM_BUILD_ROOT
 # This step is part of the installation of the RPM. Not to be confused
 # with the 'make install ' of the build (rpmbuild) process.
 
-/sbin/install-info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
-/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
-/sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
-/sbin/install-info --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
+# For --excludedocs:
+if [ -e %{_infodir}/gdb.info.gz ]
+then
+  /sbin/install-info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
+  /sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
+  /sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
+  /sbin/install-info --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
+fi
 
 %preun
-if [ $1 = 0 ]; then
-	/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
-	/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
-	/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
-	/sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
+if [ $1 = 0 ]
+then
+  # For --excludedocs:
+  if [ -e %{_infodir}/gdb.info.gz ]
+  then
+    /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || :
+    /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || :
+    /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdbint.info.gz || :
+    /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/stabs.info.gz || :
+  fi
 fi
 
 %files
@@ -828,10 +990,12 @@ fi
 %{_mandir}/*/gdbtui.1*
 %if 0%{!?_with_upstream:1}
 %{_bindir}/gstack
-%{_bindir}/pstack
 %{_mandir}/*/gstack.1*
+%if 0%{!?el5:1}
+%{_bindir}/pstack
 %{_mandir}/*/pstack.1*
-%endif	# 0%{!?_with_upstream:1}
+%endif # 0%{!?el5:1}
+%endif # 0%{!?_with_upstream:1}
 %{_datadir}/gdb
 %{_infodir}/annotate.info*
 %{_infodir}/gdb.info*
@@ -840,13 +1004,148 @@ fi
 
 # don't include the files in include, they are part of binutils
 
-%ifnarch sparcv9 
+%ifnarch sparcv9
+%if 0%{!?el5:1}
 %files gdbserver
+%defattr(-,root,root)
+%endif
 %{_bindir}/gdbserver
 %{_mandir}/*/gdbserver.1*
 %endif
 
 %changelog
+* Tue Jan 12 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-25.fc12
+- non-librpm missing debuginfo yumcommand now prints also --disablerepo='*'
+  to save some bandwidth by yum (Robin Green, BZ 554152).
+
+* Sun Jan 10 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-24.fc12
+- testsuite: BuildRequires also valgrind.
+
+* Fri Jan  8 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-23.fc12
+- Workaround missing libstdc++%%{bits_other} in Koji.
+
+* Fri Jan  8 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-22.fc12
+- Comply with new package review:
+  - Fix .spec Source as this is not a snapshot now.
+  - Convert all spaces to tabs.
+  - Fix missing %%defattr at %%files for gdbserver.
+  - Replace all hardcoded-library-path by variants of %%{_isa}.
+- Include %%{_isa} for appropriate Requires and BuildRequires.
+
+* Thu Jan  7 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-21.fc12
+- [vla] Fix regression on fields of structs in internal vars (BZ 553338).
+- archer-jankratochvil-fedora12 commit: 6e73988f653ba986e8742f208f17ec084292cbd5
+
+* Thu Jan  7 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-20.fc12
+- Fix crash reading broken stabs (it377671).
+
+* Sun Jan  3 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-19.fc12
+- testsuite: Fixup false FAILs for gdb.cp/constructortest.exp.
+
+* Sat Jan  2 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-18.fc12
+- Fix regression of gdb-7.0 (from 6.8) crashing on typedefed bitfields.
+- Fix related_breakpoint stale ref crash.
+
+* Fri Jan  1 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0.1-17.fc12
+- Formal upgrade to the FSF GDB release gdb-7.0.1.
+  - Fix regression of gdb-7.0.1 not preserving typedef of a field.
+
+* Fri Jan  1 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-16.fc12
+- More RHEL-5 compatibility updates.
+  - Disable the build-id support by default.
+  - Bundle back gdbserver to the base gdb package.
+  - Remove bundled pstack.
+  - Drop the BuildRequires of rpm-devel.
+
+* Fri Jan  1 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-15.fc12
+- Fix error on a sw watchpoint active at function epilogue (hit on s390x).
+- testsuite: Fix false MI "unknown output after running" regression.
+- testsuite: Update ia64-sigtramp.exp for recent GDB.
+- Implement bt-clone-stop.exp fix also for ia64.
+- testsuite: Upstream condbreak.exp results stability fix (Daniel Jacobowitz).
+
+* Thu Dec 24 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-14.fc12
+- testsuite: Fix constructortest.exp and expand-sals.exp for gcc-4.4.2-20.fc12.
+
+* Mon Dec 21 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-13.fc12
+- [pie] Fix a race in testcase gdb.base/valgrind-db-attach.exp.
+- Fix regression by python on ia64 due to stale current frame.
+- Disable python iff RHEL-5 && (Brew || ppc64).
+
+* Mon Dec 21 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-12.fc12
+- Workaround build on native ppc64 host.
+- More RHEL-5 compatibility updates.
+  - Disable warning messages new for gdb-6.8+ for RHEL-5 backward compatibility.
+  - Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
+  - Serialize the testsuite output to keep the order for regression checks.
+  - Re-enable python for all non-ppc* arches.
+  - More gcc44 stack exceptions when running the testsuite on RHEL-5.
+- Fix backward compatibility with G++ 4.1 namespaces "::".
+- Fix regression on re-setting the single ppc watchpoint slot.
+- Update snapshot of FSF gdb-7.0.x branch.
+  - Backport fix of dcache invalidation locking up GDB on ppc64 targets.
+
+* Fri Dec 18 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-11.fc12
+- [pie] Fix general ppc64 regression due to a function descriptors bug.
+- [pie] Fix also keeping breakpoints disabled in PIE mode.
+- Import upstream <tab>-completion crash fix.
+- Drop some unused patches from the repository.
+- More RHEL-5 build compatibility updates.
+  - Use gfortran44 when running the testsuite on RHEL-5.
+  - Disable python there due to insufficient ppc multilib.
+- Fix orphanripper hangs and thus enable it again.
+
+* Mon Dec 14 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-10.fc12
+- Make gdb-6.3-rh-testversion-20041202.patch to accept both RHEL and Fedora GDB.
+- Adjust BuildRequires for Fedora-12, RHEL-6 and RHEL-5 builds.
+- [vla] Fix compatibility of dynamic arrays with iFort (BZ 514287).
+- Fix stepping through OMP parallel Fortran sections (BZ 533176).
+- New fix of bp conditionals [bp_location-accel] regression (BZ 538626).
+
+* Mon Dec  7 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-9.fc12
+- Replace the PIE (Position Indepdent Executable) support patch by a new one.
+- Drop gdb-6.3-nonthreaded-wp-20050117.patch as fuzzy + redundant.
+- Fix callback-mode readline-6.0 regression for CTRL-C.
+- Fix syscall restarts for amd64->i386 biarch.
+- Various testsuite results stability fixes.
+- Fix crash on reading stabs on 64bit (BZ 537837).
+- archer-jankratochvil-fedora12 commit: 16276c1aad1366b92e687c72cab30192280e1906
+- archer-jankratochvil-pie-fedora12 ct: 2ae60b5156d43aabfe5757940eaf7b4370fb05d2
+
+* Thu Dec  3 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-8.fc12
+- Fix slowness/hang when printing some variables (Sami Wagiaalla, BZ 541093).
+- archer-jankratochvil-fedora12 commit: 6817a81cd411acc9579f04dcc105e9bce72859ff
+
+* Wed Nov 25 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-7.fc12
+- Support GNU IFUNCs - indirect functions (BZ 539590).
+- Fix bp conditionals [bp_location-accel] regression (Phil Muldoon, BZ 538626).
+- Fix missed breakpoint location [bp_location-accel] regression (upstream).
+
+* Fri Oct 30 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-6
+- Fix missing zlib-devel BuildRequires to support compressed DWARF sections.
+- Include post-7.0 FSF GDB fixes.
+
+* Fri Oct 23 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-5
+- Make the package buildable on RHEL-5/CentOS-5 (without librpm there).
+- archer-jankratochvil-fedora12 commit: 5b73ea6a0f74e63db3b504792fc1d37f548bdf5c
+
+* Fri Oct 23 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-4
+- Fix rpm --excludedocs (BZ 515998).
+
+* Thu Oct 22 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-3
+- Support multiple directories for `set debug-file-directory' (BZ 528668).
+
+* Mon Oct 19 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-2
+- Sync the .spec with RHEL/CentOS without EPEL, do not BuildRequires: fpc there.
+
+* Wed Oct  7 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.0-1
+- Formal upgrade to the final FSF GDB release gdb-7.0.
+- Fix GNU/Linux core open: Can't read pathname for load map: Input/output error.
+- archer-jankratochvil-fedora12 commit: ce4ead356654b951a49ca78d81ebfff95e758bf5
+
+* Wed Sep 30 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8.91.20090930-2
+- Bump release.
+
 * Wed Sep 30 2009 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8.91.20090930-1
 - Fix broken python "help()" command "modules" (BZ 526552).
 - Upgrade to the FSF GDB gdb-7.0 snapshot: 6.8.91.20090930
@@ -1006,7 +1305,7 @@ fi
 - Archer backport: c2d5c4a39b10994d86d8f2f90dfed769e8f216f3
   - Fix parsing DW_AT_const_value using DW_FORM_string
 - Archer backport: 8d9ab68fc0955c9de6320bec2821a21e3244600d
-                 + db41e11ae0a3aec7120ad6ce86450d838af74dd6
+		 + db41e11ae0a3aec7120ad6ce86450d838af74dd6
   - Fix Fortran modules/namespaces parsing (but no change was visible in F11).
 - Archer backport: 000db8b7bfef8581ef099ccca8689cfddfea1be8
   - Fix "some Python error when displaying some C++ objects" (BZ 504356).
@@ -1014,7 +1313,7 @@ fi
 - testsuite: gdb-orphanripper.c: Fix uninitialized `termios.c_line'.
 - Fix crashes due to (missing) varobj revalidation, for VLA (for BZ 377541).
 - Archer backport: 58dcda94ac5d6398f47382505e9d3d9d866d79bf
-                 + f3de7bbd655337fe6705aeaafcc970deff3dd5d5
+		 + f3de7bbd655337fe6705aeaafcc970deff3dd5d5
   - Implement Fortran modules namespaces (BZ 466118).
 - Fix crash in the charset support.
 
@@ -1055,7 +1354,7 @@ fi
 - Archer backport: c14d9ab7eef43281b2052c885f89d2db96fb5f8e
   - Revert a change regressing: gdb.objc/basicclass.exp
 - Archer backport: ebd649b96e61a1fb481801b65d827bca998c6633
-                 + 1f080e897996d60ab7fde20423e2947512115667
+		 + 1f080e897996d60ab7fde20423e2947512115667
 		 + 1948198702b51b31d79793fc49434b529b4e245f
 		 + e107fb9687bb1e7f74170aa3d19c4a8f6edbb10f
 		 + 1e012c996e121cb35053d239a46bd5dc65b0ce60
@@ -1784,85 +2083,85 @@ prelink base addresses.  Fixes BZ 175075
 * Fri Dec 16 2005 Jesse Keating <jkeating at redhat.com>
 - rebuilt for new gcj
 
-* Thu Dec 01 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.93
+* Thu Dec 01 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.93
 - Bump up release number.
 
-* Thu Dec 01 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.90
+* Thu Dec 01 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.90
 - Add option to allow backtracing past zero pc value.
 - Bugzilla 170275
 
-* Tue Nov 15 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.89
+* Tue Nov 15 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.89
 - Bump up release number.
 
-* Tue Nov 15 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.86
+* Tue Nov 15 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.86
 - Fix ia64 user-specified SIGILL handling error.
 - Bugzilla 165038.
 
-* Tue Oct 18 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.85
+* Tue Oct 18 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.85
 - Bump up release number.
 
-* Tue Oct 18 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.82
+* Tue Oct 18 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.82
 - Modify attach patch to add missing fclose.
 - Bugzilla 166712
 
-* Tue Oct 11 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.81
+* Tue Oct 11 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.81
 - Bump up release number.
 
-* Tue Oct 11 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.78
+* Tue Oct 11 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.78
 - Support gdb attaching to a stopped process.
 
-* Thu Sep 29 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.77
+* Thu Sep 29 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.77
 - Bump up release number.
 
-* Thu Sep 29 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.74
+* Thu Sep 29 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.74
 - Fix up DSO read logic when process is attached.
 
-* Mon Sep 26 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.73
+* Mon Sep 26 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.73
 - Bump up release number.
 
-* Mon Sep 26 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.70
+* Mon Sep 26 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.70
 - Fix frame pointer calculation for ia64 sigtramp frame.
 
-* Thu Sep 22 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.69
+* Thu Sep 22 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.69
 - Bump up release number.
 
-* Thu Sep 22 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.66
+* Thu Sep 22 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.66
 - Remove extraneous xfree.
 
-* Wed Sep 07 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.65
+* Wed Sep 07 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.65
 - Bump up release number.
 
-* Wed Sep 07 2005 Jeff Johnston	<jjohnstn at redhat.com> - 6.3.0.0-1.62
+* Wed Sep 07 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.62
 - Readd readnever option
 
 * Wed Jul 27 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.61
 - Bump up release number.
-                                                                                
+
 * Tue Jul 26 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.57
 - Bump up release number.
-                                                                                
+
 * Tue Jul 26 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.54
 - Add testcase to verify printing of inherited members
 - Bugzilla 146835
-                                                                                
+
 * Mon Jul 25 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.53
 - Bump up release number.
-                                                                                
+
 * Mon Jul 25 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.50
 - Fix bug with info frame and cursor address on ia64.
 - Add testcase to verify pseudo-registers calculated for ia64 sigtramp.
 - Bugzilla 160339
-                                                                                
+
 * Fri Jul 22 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.49
 - Bump up release number.
-                                                                                
+
 * Fri Jul 22 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.46
 - Fix attaching to 32-bit processes on 64-bit systems.
 - Bugzilla 160254
-                                                                                
+
 * Thu Jul 14 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.45
 - Bump up release number.
-                                                                                
+
 * Thu Jul 14 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.42
 - Add work-around to make ia64 gcore work faster.
 - Bugzilla 147436
@@ -1893,7 +2192,7 @@ prelink base addresses.  Fixes BZ 175075
 
 * Fri Jun 10 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.28
 - Security errata for bfd and .gdbinit file usage
-- Bugzilla 158680 
+- Bugzilla 158680
 
 * Wed May 18 2005 Jeff Johnston <jjohnstn at redhat.com> - 6.3.0.0-1.24
 - Bump up release number.
@@ -2088,8 +2387,8 @@ prelink base addresses.  Fixes BZ 175075
 - Enable PPC CFI, remove merged ppc patches.
 
 * Wed Jan 12 2005 Elena Zannoni <ezannoni at redhat.com> - 6.3.0.0-0.1
-		  Andrew Cagney <cagney at redhat.com>	
-		  Jeff Johnston <jjohnstn at redhat.com>	
+		  Andrew Cagney <cagney at redhat.com>
+		  Jeff Johnston <jjohnstn at redhat.com>
 - Various fixes to complete the import and merge.
 
 * Wed Dec 01 2004 Andrew Cagney <cagney at redhat.com> - 6.3.0.0
@@ -2142,7 +2441,7 @@ prelink base addresses.  Fixes BZ 175075
 - Bump up release number
 
 * Thu Nov 11 2004 Elena Zannoni <ezannoni at redhat.com> - 1.200400607.51
-- Modify configure line to not use absolute paths. This was 
+- Modify configure line to not use absolute paths. This was
   creating problems with makeinfo/texinfo.
 - Get rid of makeinfo hack.
 Bugzilla 135633
@@ -2187,7 +2486,7 @@ Bugzilla 135633
 * Mon Oct 10 2004 Andrew Cagney <cagney at redhat.com> - 1.200400607.39
 - Fix comment bug in sigstep.exp.
 
-* Thu Oct 07 2004 Jeff Johnston	<jjohnstn at redhat.com> - 1.200400607.38
+* Thu Oct 07 2004 Jeff Johnston <jjohnstn at redhat.com> - 1.200400607.38
 - Do not invalidate cached thread info when resuming threads.
 - Bump up release number.
 
@@ -2438,7 +2737,7 @@ Bugzilla 135633
 
 * Tue Nov 18 2003 Elena Zannoni <ezannoni at redhat.com> - 0.20031117.1
 - Import new gdb snapshot from mainline FSF.
-- Fix some testfiles. 
+- Fix some testfiles.
 - Add fixes for gcore, and patch for libunwind support on ia64.
 - Add tests to see what versions of gcc, binutils, glibc and kernel we
   are running with.
@@ -2504,7 +2803,7 @@ to pointers when the address is in the "
 
 * Tue Aug 26 2003 Andrew Cagney <cagney at redhat.com> - 0.20030710.24
 - skip the ppc64 and x86-64 frame redzone.
- 
+
 * Fri Aug 22 2003 Elena Zannoni <ezannoni at redhat.com> - 0.20030710.23
 - Relax one testcase in selftest.exp a bit.
 - Accept different output as well in thread bt (platform dependent).
@@ -2529,10 +2828,10 @@ to pointers when the address is in the "
 
 * Tue Aug 19 2003 Jeff Johnston <jjohnstn at redhat.com> - 0.20030710.18
 - Fix ia64 pc unwinding to include psr slot.
- 
+
 * Mon Aug 18 2003 Elena Zannoni <ezannoni at redhat.com> - 0.20030710.17
 - Fix info installation for annotate.texi. (Bugzilla 102521)
- 
+
 * Fri Aug 15 2003 Elena Zannoni <ezannoni at redhat.com> - 0.20030710.16
 - revamp tls tests a bit.
 - Handle new output from gdb in relocate.exp
@@ -2743,7 +3042,7 @@ to pointers when the address is in the "
 - Add patch for --args with zero-length arguments. Fix for bug 79833.
 
 * Tue Dec 17 2002 Elliot Lee <sopwith at redhat.com> - 0.20021129.4
-- The define directive to rpm is significant even if the line it is 
+- The define directive to rpm is significant even if the line it is
   in happens to start with a '#' character. Fixed.
 
 * Fri Dec 13 2002 Elena Zannoni <ezannoni at redhat.com> - 0.20021129.3
@@ -2785,7 +3084,7 @@ to pointers when the address is in the "
 - Upgrade patches.
 - Build gdb/gdbserver as well.
 - Define and use 'cvsdate'.
-- Do %%setup specifying the source directory name. 
+- Do %%setup specifying the source directory name.
 - Don't cd up one dir before removing tcl and friends.
 - Change the configure command to allow for the new source tree name.
 - Ditto for the copy of NEWS.
@@ -2857,7 +3156,7 @@ General revamp.
 - Update to current
 
 * Wed Mar 13 2002 Trond Eivind Glomsrod <teg at redhat.com> 5.1.90CVS-1
-- Update to current 5.2 branch 
+- Update to current 5.2 branch
 
 * Thu Jan 24 2002 Trond Eivind Glomsrod <teg at redhat.com> 5.1.1-1
 - 5.1.1
@@ -2879,7 +3178,7 @@ General revamp.
 - Add patch from jakub at redhat.com to improve handling of DWARF
 
 * Mon Nov 12 2001 Trond Eivind Glomsrod <teg at redhat.com> 5.0.93-1
-- 5.0.93 
+- 5.0.93
 - handle missing info pages in post/pre scripts
 
 * Wed Oct 31 2001 Trond Eivind Glomsrod <teg at redhat.com> 5.0.92-1
@@ -2892,11 +3191,11 @@ General revamp.
 * Wed Oct 17 2001 Trond Eivind Glomsrod <teg at redhat.com> 5.0rh-17
 - New snapshot
 
-* Thu Sep 27 2001 Trond Eivind Glomsrod <teg at redhat.com> 
+* Thu Sep 27 2001 Trond Eivind Glomsrod <teg at redhat.com>
 - New snapshot
 
 * Wed Sep 12 2001 Trond Eivind Glomsrod <teg at redhat.com> 5.0rh-16
-- New snapshot 
+- New snapshot
 
 * Mon Aug 13 2001 Trond Eivind Glomsrod <teg at redhat.com> 5.0rh-15
 - Don't buildrequire compat-glibc (#51690)
@@ -2914,7 +3213,7 @@ General revamp.
 * Fri Jun 15 2001 Trond Eivind Glomsrod <teg at redhat.com>
 - New snapshot
 - Add ncurses-devel to buildprereq
-- Remove perl from buildprereq, as gdb changed the way 
+- Remove perl from buildprereq, as gdb changed the way
   version strings are generated
 
 * Thu Jun 14 2001 Trond Eivind Glomsrod <teg at redhat.com>
@@ -2929,7 +3228,7 @@ General revamp.
 - Kevin's patch is now part of gdb
 
 * Mon Apr  9 2001 Trond Eivind Glomsrod <teg at redhat.com>
-- Add patch from kevinb at redhat.com to fix floating point + thread 
+- Add patch from kevinb at redhat.com to fix floating point + thread
   problem (#24310)
 - remove old workarounds
 - new snapshot
@@ -3052,7 +3351,7 @@ from code fusion CD-ROM).
 * Thu Apr  1 1999 Jeff Johnson <jbj at redhat.com>
 - sparc with 2.2 kernels no longer uses sunos ptrace (davem)
 
-* Sun Mar 21 1999 Cristian Gafton <gafton at redhat.com> 
+* Sun Mar 21 1999 Cristian Gafton <gafton at redhat.com>
 - auto rebuild in the new build environment (release 3)
 
 * Mon Mar  8 1999 Jeff Johnson <jbj at redhat.com>






Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/sources,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -p -r1.41 -r1.42
--- sources	30 Sep 2009 20:58:50 -0000	1.41
+++ sources	12 Jan 2010 22:15:57 -0000	1.42
@@ -1,2 +1,2 @@
-1e3a26040dcdd3579d75967085eb92b9  libstdc++-v3-python-r151798.tar.xz
-729517cc8e6ca6e25cf4be343ffc4c3d  gdb-6.8.91.20090930.tar.bz2
+53ebade39bfdc1d06744e5188b6438b1  gdb-7.0.1.tar.bz2
+7507540c50a1edeb2fc22a37bc4a08b8  libstdc++-v3-python-r151798.tar.bz2


--- gdb-6.3-bz182116-exec-from-pthread.patch DELETED ---


--- gdb-6.3-ia64-corefile-fix-20050127.patch DELETED ---


--- gdb-6.3-nonthreaded-wp-20050117.patch DELETED ---


--- gdb-6.3-pie-20050110.patch DELETED ---


--- gdb-6.3-sepcrc-20050402.patch DELETED ---


--- gdb-6.3-test-sepcrc-20050402.patch DELETED ---


--- gdb-6.3-watchpoint-cond-gone-test.patch DELETED ---



More information about the scm-commits mailing list