public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/gdb] fix-dup-patch: - Include the Archer Project: http://sourceware.org/gdb/wiki/ProjectArcher
@ 2026-07-23 18:29 Jan Kratochvil
  0 siblings, 0 replies; only message in thread
From: Jan Kratochvil @ 2026-07-23 18:29 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/gdb
            Branch : fix-dup-patch
            Commit : 36474ab6e819d8193f45b3d5a8770958abaf53f9
            Author : Jan Kratochvil <jkratoch@fedoraproject.org>
            Date   : 2009-03-02T23:14:15+00:00
            Stats  : +5013/-482 in 9 file(s)
            URL    : https://src.fedoraproject.org/rpms/gdb/c/36474ab6e819d8193f45b3d5a8770958abaf53f9?branch=fix-dup-patch

            Log:
            - Include the Archer Project: http://sourceware.org/gdb/wiki/ProjectArcher
http://sourceware.org/gdb/wiki/PythonGdb
[catch-syscall] Trap and display syscalls.
[delayed-symfile] Improve startup performance by lazily read psymtabs.
[exception-rewind] Fix fatal C++ exceptions in an inferior function call.
[expr] Expressions, single-quote elimination, C++ input canonicalization.
[using-directive] C++ namespaces.
[vla] C variable length arrays / DW_FORM_block / Fortran dynamic arrays.
[misc] Fix debuginfoless `return' (BZ 365111), fix command-line macros for
    expected GCC (BZ 479914), new testcase for valgrind (for BZ 483262),
    implement `info common' for Fortran, fix Fortran logical-kind=8 (BZ
    465310), fix static variable in C++ constructors (BZ 445912), fix
    power7 (BZ 485319).
- Upgrade to the FSF GDB gdb-6.8.50 snapshot.
- Fix parsing elf64-i386 files for kdump PAE vmcore dumps (BZ 457187).
- Turn on 64-bit BFD support, globally enable AC_SYS_LARGEFILE.

---
diff --git a/.cvsignore b/.cvsignore
index ade223c..d1d65dc 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1 +1 @@
-gdb-6.8.50.20090228.tar.bz2
+gdb-6.8.50.20090302.tar.bz2

diff --git a/gdb-6.3-readnever-20050907.patch b/gdb-6.3-readnever-20050907.patch
index 6c61c25..ab645b4 100644
--- a/gdb-6.3-readnever-20050907.patch
+++ b/gdb-6.3-readnever-20050907.patch
@@ -11,10 +11,10 @@
 
         * gdb.texinfo (File Options): Document --readnever.
 
-Index: gdb-6.8.50.20090226/gdb/doc/gdb.texinfo
+Index: gdb-6.8.50.20090228/gdb/doc/gdb.texinfo
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/doc/gdb.texinfo	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/doc/gdb.texinfo	2009-02-28 07:19:50.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/doc/gdb.texinfo	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/doc/gdb.texinfo	2009-03-02 01:01:23.000000000 +0100
 @@ -988,6 +988,12 @@ Read each symbol file's entire symbol ta
  the default, which is to read it incrementally as it is needed.
  This makes startup slower, but makes future operations faster.
@@ -28,10 +28,10 @@ Index: gdb-6.8.50.20090226/gdb/doc/gdb.texinfo
  @end table
  
  @node Mode Options
-Index: gdb-6.8.50.20090226/gdb/main.c
+Index: gdb-6.8.50.20090228/gdb/main.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/main.c	2009-02-28 07:15:57.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/main.c	2009-02-28 07:20:20.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/main.c	2009-03-02 01:01:17.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/main.c	2009-03-02 01:01:23.000000000 +0100
 @@ -427,6 +427,7 @@ captured_main (void *data)
        {"xdb", no_argument, &xdb_commands, 1},
        {"dbx", no_argument, &dbx_commands, 1},
@@ -48,10 +48,10 @@ Index: gdb-6.8.50.20090226/gdb/main.c
  "), stream);
    fputs_unfiltered (_("\
    --se=FILE          Use FILE as symbol file and executable file.\n\
-Index: gdb-6.8.50.20090226/gdb/symfile.c
+Index: gdb-6.8.50.20090228/gdb/symfile.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/symfile.c	2009-02-27 07:51:56.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/symfile.c	2009-02-28 07:19:50.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/symfile.c	2009-03-02 01:01:17.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/symfile.c	2009-03-02 01:01:23.000000000 +0100
 @@ -77,6 +77,7 @@ static void clear_symtab_users_cleanup (
  
  /* Global variables owned by this file */
@@ -60,19 +60,19 @@ Index: gdb-6.8.50.20090226/gdb/symfile.c
  
  /* External variables and functions referenced. */
  
-Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
+Index: gdb-6.8.50.20090228/gdb/dwarf2read.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/dwarf2read.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/dwarf2read.c	2009-02-28 07:21:27.000000000 +0100
-@@ -48,6 +48,7 @@
- #include "gdbcmd.h"
- #include "addrmap.h"
+--- gdb-6.8.50.20090228.orig/gdb/dwarf2read.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/dwarf2read.c	2009-03-02 01:01:36.000000000 +0100
+@@ -49,6 +49,7 @@
  #include "f-lang.h"
+ #include "c-lang.h"
+ #include "typeprint.h"
 +#include "top.h"
  
  #include <fcntl.h>
  #include "gdb_string.h"
-@@ -1169,7 +1170,8 @@ dwarf2_has_info (struct objfile *objfile
+@@ -1161,7 +1162,8 @@ dwarf2_has_info (struct objfile *objfile
    dwarf_aranges_section = 0;
    
    bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, &update_sizes);
@@ -82,10 +82,10 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
  }
  
  /* When loading sections, we can either look for ".<name>", or for
-Index: gdb-6.8.50.20090226/gdb/top.h
+Index: gdb-6.8.50.20090228/gdb/top.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/top.h	2009-01-03 06:57:53.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/top.h	2009-02-28 07:19:50.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/top.h	2009-01-03 06:57:53.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/top.h	2009-03-02 01:01:23.000000000 +0100
 @@ -59,6 +59,7 @@ extern void set_prompt (char *);
  
  /* From random places.  */

diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch
index e3487c1..f183f6d 100644
--- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch
+++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch
@@ -30,52 +30,11 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
   <81a2>     DW_AT_name        : (indirect string, offset: 0x280e): __errno_location
   <81a8>     DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location
 
-Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
+Index: gdb-6.8.50.20090228/gdb/gdbtypes.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/dwarf2read.c	2009-02-28 07:22:44.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/dwarf2read.c	2009-02-28 07:31:33.000000000 +0100
-@@ -6376,6 +6376,8 @@ read_partial_die (struct partial_die_inf
-       switch (attr.name)
- 	{
- 	case DW_AT_name:
-+	  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name for non-C.  */
-+if (cu->language == language_c || part_die->name == NULL)
- 	  switch (part_die->tag)
- 	    {
- 	    case DW_TAG_compile_unit:
-@@ -6399,7 +6401,9 @@ read_partial_die (struct partial_die_inf
- 	    part_die->dirname = DW_STRING (&attr);
- 	  break;
- 	case DW_AT_MIPS_linkage_name:
--	  part_die->name = DW_STRING (&attr);
-+	  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name for non-C.  */
-+	  if (cu->language != language_c || part_die->name == NULL)
-+	    part_die->name = DW_STRING (&attr);
- 	  break;
- 	case DW_AT_low_pc:
- 	  has_low_pc_attr = 1;
-@@ -8650,9 +8654,13 @@ dwarf2_linkage_name (struct die_info *di
- {
-   struct attribute *attr;
- 
--  attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
--  if (attr && DW_STRING (attr))
--    return DW_STRING (attr);
-+  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name for non-C.  */
-+  if (cu->language != language_c)
-+    {
-+      attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
-+      if (attr && DW_STRING (attr))
-+	return DW_STRING (attr);
-+    }
-   return dwarf2_name (die, cu);
- }
- 
-Index: gdb-6.8.50.20090226/gdb/gdbtypes.c
-===================================================================
---- gdb-6.8.50.20090226.orig/gdb/gdbtypes.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/gdbtypes.c	2009-02-28 07:22:55.000000000 +0100
-@@ -3643,6 +3643,8 @@ gdbtypes_post_init (struct gdbarch *gdba
+--- gdb-6.8.50.20090228.orig/gdb/gdbtypes.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/gdbtypes.c	2009-03-02 01:01:53.000000000 +0100
+@@ -3633,6 +3633,8 @@ gdbtypes_post_init (struct gdbarch *gdba
      init_type (TYPE_CODE_INT, 
  	       gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
  	       0, "int", OBJFILE_INTERNAL);
@@ -84,7 +43,7 @@ Index: gdb-6.8.50.20090226/gdb/gdbtypes.c
    builtin_type->builtin_unsigned_int =
      init_type (TYPE_CODE_INT, 
  	       gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
-@@ -3752,6 +3754,12 @@ gdbtypes_post_init (struct gdbarch *gdba
+@@ -3742,6 +3744,12 @@ gdbtypes_post_init (struct gdbarch *gdba
  	       "<text variable, no debug info>", OBJFILE_INTERNAL);
    TYPE_TARGET_TYPE (builtin_type->nodebug_text_symbol) =
      builtin_type->builtin_int;
@@ -97,10 +56,10 @@ Index: gdb-6.8.50.20090226/gdb/gdbtypes.c
    builtin_type->nodebug_data_symbol =
      init_type (TYPE_CODE_INT, 
  	       gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
-Index: gdb-6.8.50.20090226/gdb/gdbtypes.h
+Index: gdb-6.8.50.20090228/gdb/gdbtypes.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/gdbtypes.h	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/gdbtypes.h	2009-02-28 07:22:55.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/gdbtypes.h	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/gdbtypes.h	2009-03-02 01:01:53.000000000 +0100
 @@ -1053,6 +1053,7 @@ struct builtin_type
  
    /* Types used for symbols with no debug information.  */
@@ -117,10 +76,10 @@ Index: gdb-6.8.50.20090226/gdb/gdbtypes.h
    struct type *builtin_long;
    struct type *builtin_signed_char;
    struct type *builtin_unsigned_char;
-Index: gdb-6.8.50.20090226/gdb/parse.c
+Index: gdb-6.8.50.20090228/gdb/parse.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/parse.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/parse.c	2009-02-28 07:22:55.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/parse.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/parse.c	2009-03-02 01:01:53.000000000 +0100
 @@ -508,7 +508,12 @@ write_exp_msymbol (struct minimal_symbol
      case mst_text:
      case mst_file_text:
@@ -135,10 +94,10 @@ Index: gdb-6.8.50.20090226/gdb/parse.c
        break;
  
      case mst_data:
-Index: gdb-6.8.50.20090226/gdb/target.c
+Index: gdb-6.8.50.20090228/gdb/target.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/target.c	2009-02-28 07:22:09.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/target.c	2009-02-28 07:22:55.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/target.c	2009-03-02 01:01:44.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/target.c	2009-03-02 01:01:53.000000000 +0100
 @@ -827,6 +827,25 @@ pop_all_targets (int quitting)
    pop_all_targets_above (dummy_stratum, quitting);
  }
@@ -195,10 +154,10 @@ Index: gdb-6.8.50.20090226/gdb/target.c
  
    return addr;
  }
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.dwarf2/dw2-errno.c
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.dwarf2/dw2-errno.c	2009-02-28 07:22:55.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.c	2009-03-02 01:01:53.000000000 +0100
 @@ -0,0 +1,28 @@
 +/* This testcase is part of GDB, the GNU debugger.
 +
@@ -228,10 +187,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.dwarf2/dw2-errno.c
 +
 +  return 0;	/* breakpoint */
 +}
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.dwarf2/dw2-errno.exp	2009-02-28 07:22:55.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.dwarf2/dw2-errno.exp	2009-03-02 01:01:53.000000000 +0100
 @@ -0,0 +1,67 @@
 +# Copyright 2007 Free Software Foundation, Inc.
 +

diff --git a/gdb-6.8-bz457187-largefile.patch b/gdb-6.8-bz457187-largefile.patch
new file mode 100644
index 0000000..6e297d7
--- /dev/null
+++ b/gdb-6.8-bz457187-largefile.patch
@@ -0,0 +1,423 @@
+gdb/
+2009-03-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	* configure.ac: Call AC_SYS_LARGEFILE.
+	* config.in: Regenerate.
+	* configure: Regenerate.
+
+diff -up -rup gdb-orig/configure.ac gdb/configure.ac
+--- ./gdb-orig/configure.ac	2009-03-02 23:39:01.000000000 +0100
++++ ./gdb/configure.ac	2009-03-02 23:40:46.000000000 +0100
+@@ -30,6 +30,7 @@ AC_GNU_SOURCE
+ AC_AIX
+ AC_ISC_POSIX
+ gl_EARLY
++AC_SYS_LARGEFILE
+ AM_PROG_CC_STDC
+ 
+ AC_CONFIG_AUX_DIR(..)
+diff -up -rup gdb-orig/config.in gdb/config.in
+--- ./gdb-orig/config.in	2009-03-02 23:39:01.000000000 +0100
++++ ./gdb/config.in	2009-03-02 23:40:53.000000000 +0100
+@@ -725,6 +725,9 @@
+ # undef _ALL_SOURCE
+ #endif
+ 
++/* Number of bits in a file offset, on hosts where this is settable. */
++#undef _FILE_OFFSET_BITS
++
+ /* Enable GNU extensions on systems that have them.  */
+ #ifndef _GNU_SOURCE
+ # undef _GNU_SOURCE
+@@ -734,6 +737,9 @@
+    <sys/proc.h> problem on IRIX 5. */
+ #undef _KMEMUSER
+ 
++/* Define for large files, on AIX-style hosts. */
++#undef _LARGE_FILES
++
+ /* Define to 1 if on MINIX. */
+ #undef _MINIX
+ 
+diff -up -rup gdb-orig/configure gdb/configure
+--- ./gdb-orig/configure	2009-03-02 23:39:01.000000000 +0100
++++ ./gdb/configure	2009-03-02 23:40:49.000000000 +0100
+@@ -862,6 +862,7 @@ Optional Features:
+   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+   --enable-maintainer-mode  enable make rules and dependencies not useful
+ 			  (and sometimes confusing) to the casual installer
++  --disable-largefile     omit support for large files
+   --disable-dependency-tracking  speeds up one-time build
+   --enable-dependency-tracking   do not reject slow dependency extractors
+   --enable-targets        alternative target configurations
+@@ -3313,6 +3314,370 @@ _ACEOF
+ 
+ 
+ 
++# Check whether --enable-largefile or --disable-largefile was given.
++if test "${enable_largefile+set}" = set; then
++  enableval="$enable_largefile"
++
++fi;
++if test "$enable_largefile" != no; then
++
++  echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
++echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
++if test "${ac_cv_sys_largefile_CC+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  ac_cv_sys_largefile_CC=no
++     if test "$GCC" != yes; then
++       ac_save_CC=$CC
++       while :; do
++     	 # IRIX 6.2 and later do not support large files by default,
++     	 # so use the C compiler's -n32 option if that helps.
++	 cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <sys/types.h>
++ /* Check that off_t can represent 2**63 - 1 correctly.
++    We can't simply define LARGE_OFF_T to be 9223372036854775807,
++    since some C++ compilers masquerading as C compilers
++    incorrectly reject 9223372036854775807.  */
++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
++  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
++		       && LARGE_OFF_T % 2147483647 == 1)
++		      ? 1 : -1];
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++     	 rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext
++     	 CC="$CC -n32"
++     	 rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  ac_cv_sys_largefile_CC=' -n32'; break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext
++	 break
++       done
++       CC=$ac_save_CC
++       rm -f conftest.$ac_ext
++    fi
++fi
++echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
++echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
++  if test "$ac_cv_sys_largefile_CC" != no; then
++    CC=$CC$ac_cv_sys_largefile_CC
++  fi
++
++  echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
++echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
++if test "${ac_cv_sys_file_offset_bits+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  while :; do
++  ac_cv_sys_file_offset_bits=no
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <sys/types.h>
++ /* Check that off_t can represent 2**63 - 1 correctly.
++    We can't simply define LARGE_OFF_T to be 9223372036854775807,
++    since some C++ compilers masquerading as C compilers
++    incorrectly reject 9223372036854775807.  */
++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
++  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
++		       && LARGE_OFF_T % 2147483647 == 1)
++		      ? 1 : -1];
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#define _FILE_OFFSET_BITS 64
++#include <sys/types.h>
++ /* Check that off_t can represent 2**63 - 1 correctly.
++    We can't simply define LARGE_OFF_T to be 9223372036854775807,
++    since some C++ compilers masquerading as C compilers
++    incorrectly reject 9223372036854775807.  */
++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
++  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
++		       && LARGE_OFF_T % 2147483647 == 1)
++		      ? 1 : -1];
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  ac_cv_sys_file_offset_bits=64; break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++  break
++done
++fi
++echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
++echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
++if test "$ac_cv_sys_file_offset_bits" != no; then
++
++cat >>confdefs.h <<_ACEOF
++#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
++_ACEOF
++
++fi
++rm -f conftest*
++  echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
++echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
++if test "${ac_cv_sys_large_files+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  while :; do
++  ac_cv_sys_large_files=no
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#include <sys/types.h>
++ /* Check that off_t can represent 2**63 - 1 correctly.
++    We can't simply define LARGE_OFF_T to be 9223372036854775807,
++    since some C++ compilers masquerading as C compilers
++    incorrectly reject 9223372036854775807.  */
++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
++  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
++		       && LARGE_OFF_T % 2147483647 == 1)
++		      ? 1 : -1];
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++  cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h.  */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h.  */
++#define _LARGE_FILES 1
++#include <sys/types.h>
++ /* Check that off_t can represent 2**63 - 1 correctly.
++    We can't simply define LARGE_OFF_T to be 9223372036854775807,
++    since some C++ compilers masquerading as C compilers
++    incorrectly reject 9223372036854775807.  */
++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
++  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
++		       && LARGE_OFF_T % 2147483647 == 1)
++		      ? 1 : -1];
++int
++main ()
++{
++
++  ;
++  return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++  (eval $ac_compile) 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_objext'
++  { (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
++  ac_cv_sys_large_files=1; break
++else
++  echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++  break
++done
++fi
++echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
++echo "${ECHO_T}$ac_cv_sys_large_files" >&6
++if test "$ac_cv_sys_large_files" != no; then
++
++cat >>confdefs.h <<_ACEOF
++#define _LARGE_FILES $ac_cv_sys_large_files
++_ACEOF
++
++fi
++rm -f conftest*
++fi
++
+ 
+ 
+ 

diff --git a/gdb-6.8-fortran-tag-constant.patch b/gdb-6.8-fortran-tag-constant.patch
index a2a693e..5140d25 100644
--- a/gdb-6.8-fortran-tag-constant.patch
+++ b/gdb-6.8-fortran-tag-constant.patch
@@ -1,8 +1,8 @@
-Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
+Index: gdb-6.8.50.20090228/gdb/dwarf2read.c
 ===================================================================
---- gdb-6.8.50.20090210.orig/gdb/dwarf2read.c	2009-02-11 01:25:45.000000000 +0100
-+++ gdb-6.8.50.20090210/gdb/dwarf2read.c	2009-02-11 01:26:25.000000000 +0100
-@@ -1845,6 +1845,7 @@ scan_partial_symbols (struct partial_die
+--- gdb-6.8.50.20090228.orig/gdb/dwarf2read.c	2009-03-02 01:07:36.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/dwarf2read.c	2009-03-02 01:07:50.000000000 +0100
+@@ -1996,6 +1996,7 @@ scan_partial_symbols (struct partial_die
  	      add_partial_subprogram (pdi, lowpc, highpc, need_pc, cu);
  	      break;
  	    case DW_TAG_variable:
@@ -10,7 +10,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
  	    case DW_TAG_typedef:
  	    case DW_TAG_union_type:
  	      if (!pdi->is_declaration)
-@@ -2030,6 +2031,7 @@ add_partial_symbol (struct partial_die_i
+@@ -2211,6 +2212,7 @@ add_partial_symbol (struct partial_die_i
  	}
        break;
      case DW_TAG_variable:
@@ -18,15 +18,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
        if (pdi->is_external)
  	{
  	  /* Global Variable.
-@@ -2895,6 +2897,7 @@ dwarf2_full_name (struct die_info *die, 
-   if (!pdi_needs_namespace (die->tag)
-       && die->tag != DW_TAG_subprogram
-       && die->tag != DW_TAG_variable
-+      && die->tag != DW_TAG_constant
-       && die->tag != DW_TAG_member)
-     return name;
- 
-@@ -3735,7 +3738,8 @@ dwarf2_add_field (struct field_info *fip
+@@ -4213,7 +4215,8 @@ dwarf2_add_field (struct field_info *fip
  	  fip->non_public_fields = 1;
  	}
      }
@@ -36,7 +28,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
      {
        /* C++ static member.  */
  
-@@ -4213,7 +4217,8 @@ read_structure_type (struct die_info *di
+@@ -4703,7 +4706,8 @@ read_structure_type (struct die_info *di
        while (child_die && child_die->tag)
  	{
  	  if (child_die->tag == DW_TAG_member
@@ -46,7 +38,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
  	    {
  	      /* NOTE: carlton/2002-11-05: A C++ static data member
  		 should be a DW_TAG_member that is a declaration, but
-@@ -4332,6 +4337,7 @@ process_structure_scope (struct die_info
+@@ -4822,6 +4826,7 @@ process_structure_scope (struct die_info
      {
        if (child_die->tag == DW_TAG_member
  	  || child_die->tag == DW_TAG_variable
@@ -54,7 +46,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
  	  || child_die->tag == DW_TAG_inheritance)
  	{
  	  /* Do nothing.  */
-@@ -5862,6 +5868,7 @@ load_partial_dies (bfd *abfd, gdb_byte *
+@@ -6455,6 +6460,7 @@ load_partial_dies (bfd *abfd, gdb_byte *
  	  && abbrev->tag != DW_TAG_subprogram
  	  && abbrev->tag != DW_TAG_lexical_block
  	  && abbrev->tag != DW_TAG_variable
@@ -62,7 +54,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
  	  && abbrev->tag != DW_TAG_namespace
  	  && abbrev->tag != DW_TAG_member)
  	{
-@@ -5969,6 +5976,7 @@ load_partial_dies (bfd *abfd, gdb_byte *
+@@ -6562,6 +6568,7 @@ load_partial_dies (bfd *abfd, gdb_byte *
        if (load_all
  	  || abbrev->tag == DW_TAG_subprogram
  	  || abbrev->tag == DW_TAG_variable
@@ -70,7 +62,7 @@ Index: gdb-6.8.50.20090210/gdb/dwarf2read.c
  	  || abbrev->tag == DW_TAG_namespace
  	  || part_die->is_declaration)
  	{
-@@ -7759,6 +7767,11 @@ new_symbol (struct die_info *die, struct
+@@ -8341,6 +8348,11 @@ new_symbol (struct die_info *die, struct
  	  /* Do not add the symbol to any lists.  It will be found via
  	     BLOCK_FUNCTION from the blockvector.  */
  	  break;

diff --git a/gdb-6.8-inlining.patch b/gdb-6.8-inlining.patch
index 15df6d6..2e688ef 100644
--- a/gdb-6.8-inlining.patch
+++ b/gdb-6.8-inlining.patch
@@ -5,10 +5,10 @@ http://sourceware.org/ml/gdb-patches/2008-07/msg00317.html
 
 Removed dwarf_expr_frame_base NULL check duplicity with *-vla.patch.
 
-Index: gdb-6.8.50.20090226/gdb/NEWS
+Index: gdb-6.8.50.20090228/gdb/NEWS
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/NEWS	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/NEWS	2009-02-28 07:34:29.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/NEWS	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/NEWS	2009-03-02 01:04:45.000000000 +0100
 @@ -1,6 +1,11 @@
  		What has changed in GDB?
  	     (Organized release by release)
@@ -21,10 +21,10 @@ Index: gdb-6.8.50.20090226/gdb/NEWS
  *** Changes since GDB 6.8
  
  * GDB now has support for multi-byte and wide character sets on the
-Index: gdb-6.8.50.20090226/gdb/block.c
+Index: gdb-6.8.50.20090228/gdb/block.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/block.c	2009-01-03 06:57:50.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/block.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/block.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/block.c	2009-03-02 01:04:45.000000000 +0100
 @@ -47,8 +47,16 @@ contained_in (const struct block *a, con
  {
    if (!a || !b)
@@ -67,10 +67,10 @@ Index: gdb-6.8.50.20090226/gdb/block.c
  /* Return the blockvector immediately containing the innermost lexical
     block containing the specified pc value and section, or 0 if there
     is none.  PBLOCK is a pointer to the block.  If PBLOCK is NULL, we
-Index: gdb-6.8.50.20090226/gdb/block.h
+Index: gdb-6.8.50.20090228/gdb/block.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/block.h	2009-01-03 06:57:50.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/block.h	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/block.h	2009-01-03 06:57:50.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/block.h	2009-03-02 01:04:45.000000000 +0100
 @@ -65,7 +65,7 @@ struct block
    CORE_ADDR endaddr;
  
@@ -89,10 +89,10 @@ Index: gdb-6.8.50.20090226/gdb/block.h
  extern int contained_in (const struct block *, const struct block *);
  
  extern struct blockvector *blockvector_for_pc (CORE_ADDR, struct block **);
-Index: gdb-6.8.50.20090226/gdb/blockframe.c
+Index: gdb-6.8.50.20090228/gdb/blockframe.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/blockframe.c	2009-01-03 06:57:50.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/blockframe.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/blockframe.c	2009-01-03 06:57:50.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/blockframe.c	2009-03-02 01:04:45.000000000 +0100
 @@ -36,6 +36,7 @@
  #include "command.h"
  #include "gdbcmd.h"
@@ -161,10 +161,10 @@ Index: gdb-6.8.50.20090226/gdb/blockframe.c
  	return frame;
  
        frame = get_prev_frame (frame);
-Index: gdb-6.8.50.20090226/gdb/breakpoint.c
+Index: gdb-6.8.50.20090228/gdb/breakpoint.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/breakpoint.c	2009-02-28 07:33:47.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/breakpoint.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/breakpoint.c	2009-03-02 01:04:33.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/breakpoint.c	2009-03-02 01:04:45.000000000 +0100
 @@ -2641,19 +2641,21 @@ watchpoint_check (void *p)
      within_current_scope = 1;
    else
@@ -342,11 +342,11 @@ Index: gdb-6.8.50.20090226/gdb/breakpoint.c
  					      bp_until);
        make_cleanup_delete_breakpoint (breakpoint2);
      }
-Index: gdb-6.8.50.20090226/gdb/buildsym.c
+Index: gdb-6.8.50.20090228/gdb/buildsym.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/buildsym.c	2009-01-03 06:57:50.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/buildsym.c	2009-02-28 07:34:09.000000000 +0100
-@@ -1159,6 +1159,12 @@ end_symtab (CORE_ADDR end_addr, struct o
+--- gdb-6.8.50.20090228.orig/gdb/buildsym.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/buildsym.c	2009-03-02 01:04:45.000000000 +0100
+@@ -1155,6 +1155,12 @@ end_symtab (CORE_ADDR end_addr, struct o
  	  struct symbol *sym;
  	  struct dict_iterator iter;
  
@@ -359,10 +359,10 @@ Index: gdb-6.8.50.20090226/gdb/buildsym.c
  	  for (sym = dict_iterator_first (BLOCK_DICT (block), &iter);
  	       sym != NULL;
  	       sym = dict_iterator_next (&iter))
-Index: gdb-6.8.50.20090226/gdb/doc/gdb.texinfo
+Index: gdb-6.8.50.20090228/gdb/doc/gdb.texinfo
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/doc/gdb.texinfo	2009-02-28 07:33:47.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/doc/gdb.texinfo	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/doc/gdb.texinfo	2009-03-02 01:04:33.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/doc/gdb.texinfo	2009-03-02 01:04:45.000000000 +0100
 @@ -137,6 +137,7 @@ software in general.  We will miss him.
  * Stack::                       Examining the stack
  * Source::                      Examining source files
@@ -512,10 +512,10 @@ Index: gdb-6.8.50.20090226/gdb/doc/gdb.texinfo
  @node Macros
  @chapter C Preprocessor Macros
  
-Index: gdb-6.8.50.20090226/gdb/dwarf2loc.c
+Index: gdb-6.8.50.20090228/gdb/dwarf2loc.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/dwarf2loc.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/dwarf2loc.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/dwarf2loc.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/dwarf2loc.c	2009-03-02 01:04:45.000000000 +0100
 @@ -31,6 +31,7 @@
  #include "regcache.h"
  #include "objfiles.h"
@@ -536,19 +536,19 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2loc.c
  
    /* If we found a frame-relative symbol then it was certainly within
       some function associated with a frame. If we can't find the frame,
-Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
+Index: gdb-6.8.50.20090228/gdb/dwarf2read.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/dwarf2read.c	2009-02-28 07:33:47.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/dwarf2read.c	2009-02-28 07:36:45.000000000 +0100
-@@ -49,6 +49,7 @@
- #include "addrmap.h"
- #include "f-lang.h"
+--- gdb-6.8.50.20090228.orig/gdb/dwarf2read.c	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/dwarf2read.c	2009-03-02 01:07:36.000000000 +0100
+@@ -50,6 +50,7 @@
+ #include "c-lang.h"
+ #include "typeprint.h"
  #include "top.h"
 +#include "block.h"
  
  #include <fcntl.h>
  #include "gdb_string.h"
-@@ -2947,12 +2948,8 @@ process_die (struct die_info *die, struc
+@@ -2984,12 +2985,8 @@ process_die (struct die_info *die, struc
        read_file_scope (die, cu);
        break;
      case DW_TAG_subprogram:
@@ -562,10 +562,10 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
        break;
      case DW_TAG_lexical_block:
      case DW_TAG_try_block:
-@@ -3233,6 +3230,22 @@ read_func_scope (struct die_info *die, s
+@@ -3464,6 +3461,22 @@ read_func_scope (struct die_info *die, s
    CORE_ADDR baseaddr;
    struct block *block;
-   unsigned die_children;
+   unsigned die_children = 0;
 +  struct attribute *call_line, *call_file;
 +  int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
 +
@@ -585,7 +585,7 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
  
    baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
  
-@@ -7310,6 +7323,9 @@ die_specification (struct die_info *die,
+@@ -7526,6 +7539,9 @@ die_specification (struct die_info *die,
  					     *spec_cu);
  
    if (spec_attr == NULL)
@@ -595,7 +595,7 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
      return NULL;
    else
      return follow_die_ref (die, spec_attr, spec_cu);
-@@ -7993,6 +8009,7 @@ new_symbol (struct die_info *die, struct
+@@ -8209,6 +8225,7 @@ new_symbol (struct die_info *die, struct
    struct attribute *attr = NULL;
    struct attribute *attr2 = NULL;
    CORE_ADDR baseaddr;
@@ -603,7 +603,7 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
  
    baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
  
-@@ -8022,13 +8039,17 @@ new_symbol (struct die_info *die, struct
+@@ -8259,13 +8276,17 @@ new_symbol (struct die_info *die, struct
  	SYMBOL_TYPE (sym) = type;
        else
  	SYMBOL_TYPE (sym) = die_type (die, cu);
@@ -623,7 +623,7 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
        if (attr)
  	{
  	  int file_index = DW_UNSND (attr);
-@@ -8075,6 +8096,14 @@ new_symbol (struct die_info *die, struct
+@@ -8312,6 +8333,14 @@ new_symbol (struct die_info *die, struct
  	      add_symbol_to_list (sym, cu->list_in_scope);
  	    }
  	  break;
@@ -638,7 +638,7 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
  	case DW_TAG_variable:
  	  /* Compilation with minimal debug info may result in variables
  	     with missing type entries. Change the misleading `void' type
-@@ -8130,7 +8159,14 @@ new_symbol (struct die_info *die, struct
+@@ -8367,7 +8396,14 @@ new_symbol (struct die_info *die, struct
  	    }
  	  break;
  	case DW_TAG_formal_parameter:
@@ -654,10 +654,10 @@ Index: gdb-6.8.50.20090226/gdb/dwarf2read.c
  	  attr = dwarf2_attr (die, DW_AT_location, cu);
  	  if (attr)
  	    {
-Index: gdb-6.8.50.20090226/gdb/frame-unwind.c
+Index: gdb-6.8.50.20090228/gdb/frame-unwind.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/frame-unwind.c	2009-01-03 06:57:51.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/frame-unwind.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/frame-unwind.c	2009-01-03 06:57:51.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/frame-unwind.c	2009-03-02 01:04:45.000000000 +0100
 @@ -21,6 +21,7 @@
  #include "frame.h"
  #include "frame-unwind.h"
@@ -678,10 +678,10 @@ Index: gdb-6.8.50.20090226/gdb/frame-unwind.c
    return table;
  }
  
-Index: gdb-6.8.50.20090226/gdb/frame.c
+Index: gdb-6.8.50.20090228/gdb/frame.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/frame.c	2009-02-28 07:22:02.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/frame.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/frame.c	2009-03-02 01:01:44.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/frame.c	2009-03-02 01:04:45.000000000 +0100
 @@ -41,8 +41,14 @@
  #include "objfiles.h"
  #include "exceptions.h"
@@ -1038,10 +1038,10 @@ Index: gdb-6.8.50.20090226/gdb/frame.c
  }
  
  /* Per "frame.h", return the ``address'' of the frame.  Code should
-Index: gdb-6.8.50.20090226/gdb/frame.h
+Index: gdb-6.8.50.20090228/gdb/frame.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/frame.h	2009-02-05 18:28:20.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/frame.h	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/frame.h	2009-02-05 18:28:20.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/frame.h	2009-03-02 01:04:45.000000000 +0100
 @@ -34,6 +34,9 @@
     frame_unwind_WHAT...(): Unwind THIS frame's WHAT from the NEXT
     frame.
@@ -1103,10 +1103,10 @@ Index: gdb-6.8.50.20090226/gdb/frame.h
  extern struct frame_id frame_unwind_id (struct frame_info *next_frame);
  
  /* Assuming that a frame is `normal', return its base-address, or 0 if
-Index: gdb-6.8.50.20090226/gdb/gdbthread.h
+Index: gdb-6.8.50.20090228/gdb/gdbthread.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/gdbthread.h	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/gdbthread.h	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/gdbthread.h	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/gdbthread.h	2009-03-02 01:04:45.000000000 +0100
 @@ -83,6 +83,13 @@ struct thread_info
       This is how we know when we step into a subroutine call, and how
       to set the frame for the breakpoint used to step out.  */
@@ -1121,10 +1121,10 @@ Index: gdb-6.8.50.20090226/gdb/gdbthread.h
    int current_line;
    struct symtab *current_symtab;
  
-Index: gdb-6.8.50.20090226/gdb/infcall.c
+Index: gdb-6.8.50.20090228/gdb/infcall.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/infcall.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/infcall.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/infcall.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/infcall.c	2009-03-02 01:04:45.000000000 +0100
 @@ -898,15 +898,8 @@ The program being debugged exited while 
  
  	  if (unwind_on_signal_p)
@@ -1143,10 +1143,10 @@ Index: gdb-6.8.50.20090226/gdb/infcall.c
  
  	      /* FIXME: Insert a bunch of wrap_here; name can be very
  		 long if it's a C++ name with arguments and stuff.  */
-Index: gdb-6.8.50.20090226/gdb/infcmd.c
+Index: gdb-6.8.50.20090228/gdb/infcmd.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/infcmd.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/infcmd.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/infcmd.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/infcmd.c	2009-03-02 01:04:45.000000000 +0100
 @@ -52,6 +52,7 @@
  #include "cli/cli-decode.h"
  #include "gdbthread.h"
@@ -1248,10 +1248,10 @@ Index: gdb-6.8.50.20090226/gdb/infcmd.c
    /* Find the function we will return from.  */
  
    function = find_pc_function (get_frame_pc (get_selected_frame (NULL)));
-Index: gdb-6.8.50.20090226/gdb/inferior.h
+Index: gdb-6.8.50.20090228/gdb/inferior.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/inferior.h	2009-02-27 00:04:34.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/inferior.h	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/inferior.h	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/inferior.h	2009-03-02 01:04:45.000000000 +0100
 @@ -259,6 +259,9 @@ extern void error_is_running (void);
  /* Calls error_is_running if the current thread is running.  */
  extern void ensure_not_running (void);
@@ -1262,10 +1262,10 @@ Index: gdb-6.8.50.20090226/gdb/inferior.h
  /* From infcmd.c */
  
  extern void tty_command (char *, int);
-Index: gdb-6.8.50.20090226/gdb/infrun.c
+Index: gdb-6.8.50.20090228/gdb/infrun.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/infrun.c	2009-02-28 07:31:50.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/infrun.c	2009-02-28 07:37:36.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/infrun.c	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/infrun.c	2009-03-02 01:04:45.000000000 +0100
 @@ -48,6 +48,7 @@
  #include "gdb_assert.h"
  #include "mi/mi-common.h"
@@ -1538,10 +1538,10 @@ Index: gdb-6.8.50.20090226/gdb/infrun.c
    tp->step_over_calls = inf_status->step_over_calls;
    stop_after_trap = inf_status->stop_after_trap;
    inf->stop_soon = inf_status->stop_soon;
-Index: gdb-6.8.50.20090226/gdb/inline-frame.c
+Index: gdb-6.8.50.20090228/gdb/inline-frame.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/inline-frame.c	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/inline-frame.c	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,382 @@
 +/* Inline frame unwinder for GDB.
 +
@@ -1925,10 +1925,10 @@ Index: gdb-6.8.50.20090226/gdb/inline-frame.c
 +
 +  return inline_count;
 +}
-Index: gdb-6.8.50.20090226/gdb/inline-frame.h
+Index: gdb-6.8.50.20090228/gdb/inline-frame.h
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/inline-frame.h	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/inline-frame.h	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,62 @@
 +/* Definitions for inline frame support.
 +
@@ -1992,11 +1992,11 @@ Index: gdb-6.8.50.20090226/gdb/inline-frame.h
 +int frame_inlined_callees (struct frame_info *this_frame);
 +
 +#endif /* !defined (INLINE_FRAME_H) */
-Index: gdb-6.8.50.20090226/gdb/minsyms.c
+Index: gdb-6.8.50.20090228/gdb/minsyms.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/minsyms.c	2009-02-28 07:31:49.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/minsyms.c	2009-02-28 07:34:09.000000000 +0100
-@@ -767,7 +767,7 @@ prim_record_minimal_symbol_and_info (con
+--- gdb-6.8.50.20090228.orig/gdb/minsyms.c	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/minsyms.c	2009-03-02 01:04:45.000000000 +0100
+@@ -795,7 +795,7 @@ prim_record_minimal_symbol_and_info (con
  
    if (msym_bunch_index == BUNCH_SIZE)
      {
@@ -2005,10 +2005,10 @@ Index: gdb-6.8.50.20090226/gdb/minsyms.c
        msym_bunch_index = 0;
        new->next = msym_bunch;
        msym_bunch = new;
-Index: gdb-6.8.50.20090226/gdb/s390-tdep.c
+Index: gdb-6.8.50.20090228/gdb/s390-tdep.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/s390-tdep.c	2009-02-22 02:02:19.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/s390-tdep.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/s390-tdep.c	2009-02-22 02:02:19.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/s390-tdep.c	2009-03-02 01:04:45.000000000 +0100
 @@ -1182,6 +1182,7 @@ s390_prologue_frame_unwind_cache (struct
    CORE_ADDR prev_sp;
    int frame_pointer;
@@ -2042,10 +2042,10 @@ Index: gdb-6.8.50.20090226/gdb/s390-tdep.c
  	  || get_frame_type (get_next_frame (this_frame)) != NORMAL_FRAME))
      {
        /* See the comment in s390_in_function_epilogue_p on why this is
-Index: gdb-6.8.50.20090226/gdb/stack.c
+Index: gdb-6.8.50.20090228/gdb/stack.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/stack.c	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/stack.c	2009-02-28 07:35:20.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/stack.c	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/stack.c	2009-03-02 01:04:45.000000000 +0100
 @@ -45,6 +45,7 @@
  #include "valprint.h"
  #include "gdbthread.h"
@@ -2192,26 +2192,27 @@ Index: gdb-6.8.50.20090226/gdb/stack.c
    /* Compute the return value.  If the computation triggers an error,
       let it bail.  If the return type can't be handled, set
       RETURN_VALUE to NULL, and QUERY_PREFIX to an informational
-Index: gdb-6.8.50.20090226/gdb/symtab.c
+Index: gdb-6.8.50.20090228/gdb/symtab.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/symtab.c	2009-02-28 07:31:49.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/symtab.c	2009-02-28 07:34:09.000000000 +0100
-@@ -1408,10 +1408,13 @@ lookup_symbol_aux_local (const char *nam
+--- gdb-6.8.50.20090228.orig/gdb/symtab.c	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/symtab.c	2009-03-02 01:06:36.000000000 +0100
+@@ -1414,11 +1414,14 @@ lookup_symbol_aux_local (const char *nam
        sym = lookup_symbol_aux_block (name, linkage_name, block, domain);
        if (sym != NULL)
  	return sym;
 +
 +      if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block))
 +	break;
+     
        block = BLOCK_SUPERBLOCK (block);
      }
  
--  /* We've reached the static block without finding a result.  */
+-  /* We've reached the global block without finding a result.  */
 +  /* We've reached the edge of the function without finding a result.  */
  
    return NULL;
  }
-@@ -2668,6 +2671,7 @@ find_function_start_sal (struct symbol *
+@@ -2675,6 +2678,7 @@ find_function_start_sal (struct symbol *
  
    CORE_ADDR pc;
    struct symtab_and_line sal;
@@ -2219,7 +2220,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
  
    pc = BLOCK_START (block);
    fixup_symbol_section (sym, objfile);
-@@ -2706,6 +2710,25 @@ find_function_start_sal (struct symbol *
+@@ -2713,6 +2717,25 @@ find_function_start_sal (struct symbol *
  
    sal.pc = pc;
  
@@ -2245,7 +2246,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
    return sal;
  }
  
-@@ -3728,6 +3751,24 @@ add_macro_name (const char *name, const 
+@@ -3735,6 +3758,24 @@ add_macro_name (const char *name, const 
  			    datum->text, datum->word);
  }
  
@@ -2270,7 +2271,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
  char **
  default_make_symbol_completion_list (char *text, char *word)
  {
-@@ -3740,9 +3781,9 @@ default_make_symbol_completion_list (cha
+@@ -3747,9 +3788,9 @@ default_make_symbol_completion_list (cha
    struct partial_symtab *ps;
    struct minimal_symbol *msymbol;
    struct objfile *objfile;
@@ -2282,7 +2283,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
    struct partial_symbol **psym;
    /* The symbol we are completing on.  Points in same buffer as text.  */
    char *sym_text;
-@@ -3852,41 +3893,43 @@ default_make_symbol_completion_list (cha
+@@ -3859,41 +3900,43 @@ default_make_symbol_completion_list (cha
    }
  
    /* Search upwards from currently selected frame (so that we can
@@ -2357,7 +2358,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
  
    /* Go through the symtabs and check the externs and statics for
       symbols which match.  */
-@@ -3905,9 +3948,6 @@ default_make_symbol_completion_list (cha
+@@ -3912,9 +3955,6 @@ default_make_symbol_completion_list (cha
    {
      QUIT;
      b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
@@ -2367,7 +2368,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
      ALL_BLOCK_SYMBOLS (b, iter, sym)
        {
  	COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, word);
-@@ -4374,6 +4414,25 @@ skip_prologue_using_sal (CORE_ADDR func_
+@@ -4381,6 +4421,25 @@ skip_prologue_using_sal (CORE_ADDR func_
  	     line mark the prologue -> body transition.  */
  	  if (sal.line >= prologue_sal.line)
  	    break;
@@ -2393,11 +2394,11 @@ Index: gdb-6.8.50.20090226/gdb/symtab.c
  	  /* The case in which compiler's optimizer/scheduler has
  	     moved instructions into the prologue.  We look ahead in
  	     the function looking for address ranges whose
-Index: gdb-6.8.50.20090226/gdb/symtab.h
+Index: gdb-6.8.50.20090228/gdb/symtab.h
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/symtab.h	2009-02-27 00:04:32.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/symtab.h	2009-02-28 07:34:09.000000000 +0100
-@@ -559,9 +559,18 @@ struct symbol
+--- gdb-6.8.50.20090228.orig/gdb/symtab.h	2009-03-02 01:01:15.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/symtab.h	2009-03-02 01:04:45.000000000 +0100
+@@ -556,9 +556,18 @@ struct symbol
  
    unsigned is_argument : 1;
  
@@ -2419,7 +2420,7 @@ Index: gdb-6.8.50.20090226/gdb/symtab.h
  
    unsigned short line;
  
-@@ -592,6 +601,7 @@ struct symbol
+@@ -589,6 +598,7 @@ struct symbol
  #define SYMBOL_DOMAIN(symbol)	(symbol)->domain
  #define SYMBOL_CLASS(symbol)		(symbol)->aclass
  #define SYMBOL_IS_ARGUMENT(symbol)	(symbol)->is_argument
@@ -2427,10 +2428,10 @@ Index: gdb-6.8.50.20090226/gdb/symtab.h
  #define SYMBOL_TYPE(symbol)		(symbol)->type
  #define SYMBOL_LINE(symbol)		(symbol)->line
  #define SYMBOL_SYMTAB(symbol)		(symbol)->symtab
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.base/break.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.base/break.exp
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/testsuite/gdb.base/break.exp	2009-01-19 20:05:01.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.base/break.exp	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/testsuite/gdb.base/break.exp	2009-01-19 20:05:01.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.base/break.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -880,6 +880,13 @@ gdb_expect {
          # marker4() is defined at line 46 when compiled with -DPROTOTYPES
  	pass "run until breakpoint set at small function, optimized file (line bp_location14)"
@@ -2445,10 +2446,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.base/break.exp
      -re ".*$gdb_prompt " {
  	fail "run until breakpoint set at small function, optimized file"
      }
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.cp/annota2.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.cp/annota2.exp
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/testsuite/gdb.cp/annota2.exp	2009-01-03 06:58:04.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.cp/annota2.exp	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/testsuite/gdb.cp/annota2.exp	2009-01-03 06:58:04.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.cp/annota2.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -119,10 +119,11 @@ gdb_expect {
  # continue until exit
  # this will test:
@@ -2462,10 +2463,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.cp/annota2.exp
  	  { pass "continue until exit" }
    -re ".*$gdb_prompt$"     { fail "continue to exit" }
    timeout	            { fail "continue to exit (timeout)" }
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.c
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-bt.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.c	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-bt.c	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,47 @@
 +/* Copyright (C) 2008 Free Software Foundation, Inc.
 +
@@ -2514,10 +2515,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.c
 +
 +  return 0;
 +}
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-bt.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.exp	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-bt.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,63 @@
 +# Copyright 2008 Free Software Foundation, Inc.
 +
@@ -2582,10 +2583,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-bt.exp
 +gdb_test "info frame" ".*inlined into frame.*" "func1 inlined (3)"
 +gdb_test "up" "#2  .*func2.*" "up from func1 (3)"
 +gdb_test "info frame" ".*inlined into frame.*" "func2 inlined (3)"
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.c
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-cmds.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.c	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-cmds.c	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,85 @@
 +/* Copyright (C) 2008 Free Software Foundation, Inc.
 +
@@ -2672,10 +2673,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.c
 +
 +  return 0;
 +}
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-cmds.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.exp	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-cmds.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,279 @@
 +# Copyright 2008 Free Software Foundation, Inc.
 +
@@ -2956,10 +2957,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-cmds.exp
 +gdb_test "info frame" ".*inlined into frame.*" "outer_inline2 inlined"
 +gdb_test "up" "#4  main.*" "up from outer_inline2"
 +gdb_test "info frame" ".*\n caller of frame.*" "main not inlined"
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.c
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-locals.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.c	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-locals.c	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,52 @@
 +/* Copyright (C) 2008 Free Software Foundation, Inc.
 +
@@ -3013,10 +3014,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.c
 +
 +  return 0;
 +}
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-locals.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.exp	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-locals.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,118 @@
 +# Copyright 2008 Free Software Foundation, Inc.
 +
@@ -3136,10 +3137,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-locals.exp
 +}
 +
 +gdb_test "print array\[0\]" "\\\$$decimal = 184" "print local (3)"
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-markers.c
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-markers.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-markers.c	2009-02-28 07:34:09.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/inline-markers.c	2009-03-02 01:04:45.000000000 +0100
 @@ -0,0 +1,36 @@
 +/* Copyright (C) 2008 Free Software Foundation, Inc.
 +
@@ -3177,10 +3178,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/inline-markers.c
 +{
 +  inlined_fn (); /* inlined */
 +}
-Index: gdb-6.8.50.20090226/gdb/testsuite/lib/gdb.exp
+Index: gdb-6.8.50.20090228/gdb/testsuite/lib/gdb.exp
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/testsuite/lib/gdb.exp	2009-02-28 07:31:58.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/testsuite/lib/gdb.exp	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/testsuite/lib/gdb.exp	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/testsuite/lib/gdb.exp	2009-03-02 01:04:45.000000000 +0100
 @@ -1474,6 +1474,37 @@ proc skip_hp_tests {} {
      return $skip_hp
  }
@@ -3219,10 +3220,10 @@ Index: gdb-6.8.50.20090226/gdb/testsuite/lib/gdb.exp
  set compiler_info		"unknown"
  set gcc_compiled		0
  set hp_cc_compiler		0
-Index: gdb-6.8.50.20090226/gdb/valops.c
+Index: gdb-6.8.50.20090228/gdb/valops.c
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/valops.c	2009-02-27 07:51:56.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/valops.c	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/valops.c	2009-03-02 01:01:17.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/valops.c	2009-03-02 01:04:45.000000000 +0100
 @@ -1072,7 +1072,7 @@ value_of_variable (struct symbol *var, s
        frame = block_innermost_frame (b);
        if (!frame)
@@ -3232,11 +3233,11 @@ Index: gdb-6.8.50.20090226/gdb/valops.c
  	      && SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b)))
  	    error (_("No frame is currently executing in block %s."),
  		   SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b)));
-Index: gdb-6.8.50.20090226/gdb/Makefile.in
+Index: gdb-6.8.50.20090228/gdb/Makefile.in
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/Makefile.in	2009-02-28 07:31:58.000000000 +0100
-+++ gdb-6.8.50.20090226/gdb/Makefile.in	2009-02-28 07:34:09.000000000 +0100
-@@ -663,6 +663,7 @@ SFILES = ada-exp.y ada-lang.c ada-typepr
+--- gdb-6.8.50.20090228.orig/gdb/Makefile.in	2009-03-02 01:04:32.000000000 +0100
++++ gdb-6.8.50.20090228/gdb/Makefile.in	2009-03-02 01:04:45.000000000 +0100
+@@ -665,6 +665,7 @@ SFILES = ada-exp.y ada-lang.c ada-typepr
  	inf-loop.c \
  	infcall.c \
  	infcmd.c inflow.c infrun.c \
@@ -3244,7 +3245,7 @@ Index: gdb-6.8.50.20090226/gdb/Makefile.in
  	interps.c \
  	jv-exp.y jv-lang.c jv-valprint.c jv-typeprint.c \
  	language.c linespec.c \
-@@ -835,6 +836,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $
+@@ -837,6 +838,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $
  	user-regs.o \
  	frame.o frame-unwind.o doublest.o \
  	frame-base.o \
@@ -3252,10 +3253,10 @@ Index: gdb-6.8.50.20090226/gdb/Makefile.in
  	gnu-v2-abi.o gnu-v3-abi.o cp-abi.o cp-support.o \
  	cp-namespace.o \
  	reggroups.o regset.o \
-Index: gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/Makefile.in
+Index: gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/Makefile.in
 ===================================================================
---- gdb-6.8.50.20090226.orig/gdb/testsuite/gdb.opt/Makefile.in	2008-04-18 01:06:54.000000000 +0200
-+++ gdb-6.8.50.20090226/gdb/testsuite/gdb.opt/Makefile.in	2009-02-28 07:34:09.000000000 +0100
+--- gdb-6.8.50.20090228.orig/gdb/testsuite/gdb.opt/Makefile.in	2008-04-18 01:06:54.000000000 +0200
++++ gdb-6.8.50.20090228/gdb/testsuite/gdb.opt/Makefile.in	2009-03-02 01:04:45.000000000 +0100
 @@ -1,7 +1,7 @@
  VPATH = @srcdir@
  srcdir = @srcdir@

diff --git a/gdb-archer.patch b/gdb-archer.patch
index 56fcb11..c05498e 100644
--- a/gdb-archer.patch
+++ b/gdb-archer.patch
@@ -1,8 +1,30 @@
+http://sourceware.org/gdb/wiki/ProjectArcher
+http://sourceware.org/gdb/wiki/ArcherBranchManagement
+
+GIT snapshot:
+commit 8cc3753a9aad85bf53bef54c04334c60d16cb251
+
+branch `archer' - the merge of branches:
+archer-jankratochvil-merge-expr
+	archer-keiths-expr-cumulative
+		(archer-swagiaal-using-directive)
+archer-jankratochvil-misc
+archer-jankratochvil-python
+	archer-jankratochvil-type-refcount
+	archer-tromey-python
+archer-jankratochvil-vla
+	archer-jankratochvil-type-refcount
+archer-pmuldoon-exception-rewind-master
+archer-sergio-catch-syscall
+archer-tromey-charset
+archer-tromey-delayed-symfile
+
+
 diff --git a/gdb/Makefile.in b/gdb/Makefile.in
-index af3f534..716884d 100644
+index 74aa72e..fdb0582 100644
 --- a/gdb/Makefile.in
 +++ b/gdb/Makefile.in
-@@ -167,11 +167,16 @@ INTL_CFLAGS = @INCINTL@
+@@ -167,11 +167,18 @@ INTL_CFLAGS = @INCINTL@
  
  # Where is the ICONV library?  This can be empty if libc has iconv.
  LIBICONV = @LIBICONV@
@@ -16,10 +38,12 @@ index af3f534..716884d 100644
 +# Did the user give us a --with-gdb-datadir option?
 +GDB_DATADIR_PATH = @GDB_DATADIR_PATH@
 +
++GDB_PYTHONDIR_PATH = @GDB_PYTHONDIR_PATH@
++
  # Helper code from gnulib.
  LIBGNU = gnulib/libgnu.a
  INCGNU = -I$(srcdir)/gnulib -Ignulib
-@@ -270,12 +275,34 @@ SUBDIR_TUI_CFLAGS= \
+@@ -270,12 +277,34 @@ SUBDIR_TUI_CFLAGS= \
  #
  SUBDIR_PYTHON_OBS = \
  	python.o \
@@ -54,7 +78,7 @@ index af3f534..716884d 100644
  	python/python-utils.c \
  	python/python-value.c
  SUBDIR_PYTHON_DEPS =
-@@ -389,7 +416,8 @@ INTERNAL_CFLAGS_BASE = \
+@@ -390,7 +419,8 @@ INTERNAL_CFLAGS_BASE = \
  	$(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \
  	$(GDB_CFLAGS) $(OPCODES_CFLAGS) $(READLINE_CFLAGS) \
  	$(BFD_CFLAGS) $(INCLUDE_CFLAGS) $(LIBDECNUMBER_CFLAGS) \
@@ -64,7 +88,7 @@ index af3f534..716884d 100644
  INTERNAL_WARN_CFLAGS = $(INTERNAL_CFLAGS_BASE) $(GDB_WARN_CFLAGS)
  INTERNAL_CFLAGS = $(INTERNAL_WARN_CFLAGS) $(GDB_WERROR_CFLAGS)
  
-@@ -401,7 +429,7 @@ LDFLAGS = @LDFLAGS@
+@@ -402,7 +432,7 @@ LDFLAGS = @LDFLAGS@
  # I think it's perfectly reasonable for a user to set -pg in CFLAGS
  # and have it work; that's why CFLAGS is here.
  # PROFILE_CFLAGS is _not_ included, however, because we use monstartup.
@@ -73,7 +97,7 @@ index af3f534..716884d 100644
  
  # If your system is missing alloca(), or, more likely, it's there but
  # it doesn't work, then refer to libiberty.
-@@ -662,6 +690,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
+@@ -663,6 +693,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
  	valarith.c valops.c valprint.c value.c varobj.c vec.c \
  	wrapper.c \
  	xml-tdesc.c xml-support.c \
@@ -81,7 +105,7 @@ index af3f534..716884d 100644
  	inferior.c
  
  LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
-@@ -732,7 +761,8 @@ config/sparc/nm-sol2.h config/nm-linux.h config/mips/nm-irix5.h	\
+@@ -733,7 +764,8 @@ config/sparc/nm-sol2.h config/nm-linux.h config/mips/nm-irix5.h	\
  config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \
  annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h	\
  remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
@@ -91,7 +115,7 @@ index af3f534..716884d 100644
  
  # Header files that already have srcdir in them, or which are in objdir.
  
-@@ -811,10 +841,16 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
+@@ -812,10 +844,16 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
  	trad-frame.o \
  	tramp-frame.o \
  	solib.o solib-null.o \
@@ -109,7 +133,7 @@ index af3f534..716884d 100644
  TSOBS = inflow.o
  
  SUBDIRS = @subdirs@
-@@ -848,11 +884,38 @@ generated_files = config.h observer.h observer.inc ada-lex.c \
+@@ -849,11 +887,38 @@ generated_files = config.h observer.h observer.inc ada-lex.c \
  	$(COMPILE) $<
  	$(POSTCOMPILE)
  
@@ -149,7 +173,7 @@ index af3f534..716884d 100644
  installcheck:
  
  # The check target can not use subdir_do, because subdir_do does not
-@@ -906,8 +969,11 @@ gdb.z:gdb.1
+@@ -907,8 +972,11 @@ gdb.z:gdb.1
  # source file and doesn't care about rebuilding or just wants to save the
  # time it takes for make to check that all is up to date.
  # install-only is intended to address that need.
@@ -163,7 +187,7 @@ index af3f534..716884d 100644
  	transformed_name=`t='$(program_transform_name)'; \
  			  echo gdb | sed -e "$$t"` ; \
  		if test "x$$transformed_name" = x; then \
-@@ -1200,6 +1266,12 @@ stamp-h: config.in config.status
+@@ -1202,6 +1270,12 @@ stamp-h: config.in config.status
  	  CONFIG_LINKS= \
  	  $(SHELL) config.status
  
@@ -176,7 +200,7 @@ index af3f534..716884d 100644
  config.status: configure configure.tgt configure.host
  	$(SHELL) config.status --recheck
  
-@@ -1843,10 +1915,54 @@ python.o: $(srcdir)/python/python.c
+@@ -1845,10 +1919,54 @@ python.o: $(srcdir)/python/python.c
  	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python.c
  	$(POSTCOMPILE)
  
@@ -231,7 +255,7 @@ index af3f534..716884d 100644
  python-utils.o: $(srcdir)/python/python-utils.c
  	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-utils.c
  	$(POSTCOMPILE)
-@@ -1855,6 +1971,30 @@ python-value.o: $(srcdir)/python/python-value.c
+@@ -1857,6 +1975,39 @@ python-value.o: $(srcdir)/python/python-value.c
  	$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/python-value.c
  	$(POSTCOMPILE)
  
@@ -242,22 +266,31 @@ index af3f534..716884d 100644
 +    gdb/command/pahole.py gdb/command/__init__.py \
 +    gdb/command/ignore_errors.py gdb/command/save_breakpoints.py \
 +    gdb/libstdcxx/v6/printers.py gdb/libstdcxx/v6/__init__.py \
-+    gdb/libstdcxx/__init__.py gdb/function/caller_is.py	\
++    gdb/libstdcxx/__init__.py gdb/function/caller_is.py \
 +    gdb/function/in_scope.py gdb/function/__init__.py gdb/backtrace.py \
 +    gdb/__init__.py
 +
 +# Install the Python library.  Python library files go under
-+# $(GDB_DATADIR_PATH)/python.
++# $(GDB_PYTHONDIR_PATH)/python.
 +install-python:
 +	files='$(PY_FILES)'; for file in $$files; do \
 +	  dir=`echo "$$file" | sed 's,/[^/]*$$,,'`; \
-+	  $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR_PATH)/python/$$dir; \
-+	  $(INSTALL_DATA) $(srcdir)/python/lib/$$file $(DESTDIR)$(GDB_DATADIR_PATH)/python/$$file; \
++	  $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_PYTHONDIR_PATH)/$$dir; \
++	  $(INSTALL_DATA) $(srcdir)/python/lib/$$file $(DESTDIR)$(GDB_PYTHONDIR_PATH)/$$file; \
 +	done
 +
-+# Brute force.
++# Other packages may have their files installed in $(GDB_PYTHONDIR_PATH).
 +uninstall-python:
-+	rm -rf $(DESTDIR)/$(GDB_DATADIR_PATH)/python
++	rm -rf $(DESTDIR)/$(GDB_PYTHONDIR_PATH)/python
++	files='$(PY_FILES)'; for file in $$files; do \
++	  dir=`echo "$$file" | sed 's,/[^/]*$$,,'`; \
++	  rm -f $(DESTDIR)$(GDB_PYTHONDIR_PATH)/$$file; \
++	  while test "x$$file" != "x$$dir"; do \
++	    rmdir 2>/dev/null "$(DESTDIR)$(GDB_PYTHONDIR_PATH)/$$dir"; \
++	    file="$$dir"; \
++	    dir=`echo "$$file" | sed 's,/[^/]*$$,,'`; \
++	  done \
++	done
 +
  #
  # Dependency tracking.  Most of this is conditional on GNU Make being
@@ -798,6 +831,39 @@ index 5007cd0..241a6ac 100644
  	    fprintf_filtered (file, "\n");
  	  }
  	  break;
+diff --git a/gdb/block.c b/gdb/block.c
+index 8f0140c..d451769 100644
+--- a/gdb/block.c
++++ b/gdb/block.c
+@@ -207,24 +207,16 @@ block_set_scope (struct block *block, const char *scope,
+ }
+ 
+ /* This returns the first using directives associated to BLOCK, if
+-   any.  */
+-
+-/* FIXME: carlton/2003-04-23: This uses the fact that we currently
+-   only have using directives in static blocks, because we only
+-   generate using directives from anonymous namespaces.  Eventually,
+-   when we support using directives everywhere, we'll want to replace
+-   this by some iterator functions.  */
++   any.  Each BLOCK_NAMESPACE()->USING already contains all the namespaces
++   imported at that code point - even those from its parent blocks.  */
+ 
+ struct using_direct *
+ block_using (const struct block *block)
+ {
+-  const struct block *static_block = block_static_block (block);
+-
+-  if (static_block == NULL
+-      || BLOCK_NAMESPACE (static_block) == NULL)
++  if (block == NULL || BLOCK_NAMESPACE (block) == NULL)
+     return NULL;
+   else
+-    return BLOCK_NAMESPACE (static_block)->using;
++    return BLOCK_NAMESPACE (block)->using;
+ }
+ 
+ /* Set BLOCK's using member to USING; if needed, allocate memory via
 diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
 index b23b294..e9bc53f 100644
 --- a/gdb/breakpoint.c
@@ -1638,11 +1704,92 @@ index 94287de..8552e1b 100644
 +extern void set_breakpoint_condition (struct breakpoint *b, char *exp, int from_tty);
 +
  #endif /* !defined (BREAKPOINT_H) */
+diff --git a/gdb/buildsym.c b/gdb/buildsym.c
+index 55ace15..2722daa 100644
+--- a/gdb/buildsym.c
++++ b/gdb/buildsym.c
+@@ -384,6 +384,8 @@ finish_block (struct symbol *symbol, struct pending **listhead,
+       opblock = pblock;
+     }
+ 
++  block_set_using (block, using_directives, &objfile->objfile_obstack);
++
+   record_pending_block (objfile, block, opblock);
+ 
+   return block;
+@@ -815,10 +817,6 @@ start_symtab (char *name, char *dirname, CORE_ADDR start_addr)
+   /* We shouldn't have any address map at this point.  */
+   gdb_assert (! pending_addrmap);
+ 
+-  /* Set up support for C++ namespace support, in case we need it.  */
+-
+-  cp_initialize_namespace ();
+-
+   /* Initialize the list of sub source files with one entry for this
+      file (the top-level source file).  */
+ 
+@@ -1015,8 +1013,6 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
+       finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr,
+ 		    objfile);
+       blockvector = make_blockvector (objfile);
+-      cp_finalize_namespace (BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK),
+-			     &objfile->objfile_obstack);
+     }
+ 
+   /* Read the line table if it has to be read separately.  */
+@@ -1202,10 +1198,12 @@ push_context (int desc, CORE_ADDR valu)
+   new->params = param_symbols;
+   new->old_blocks = pending_blocks;
+   new->start_addr = valu;
++  new->using_directives = using_directives;
+   new->name = NULL;
+ 
+   local_symbols = NULL;
+   param_symbols = NULL;
++  using_directives = NULL;
+ 
+   return new;
+ }
+diff --git a/gdb/buildsym.h b/gdb/buildsym.h
+index bf23ecc..f542aca 100644
+--- a/gdb/buildsym.h
++++ b/gdb/buildsym.h
+@@ -125,6 +125,10 @@ EXTERN struct pending *local_symbols;
+ 
+ EXTERN struct pending *param_symbols;
+ 
++/* using directives local to lexical context */
++
++EXTERN struct using_direct *using_directives;
++
+ /* Stack representing unclosed lexical contexts (that will become
+    blocks, eventually).  */
+ 
+@@ -138,6 +142,10 @@ struct context_stack
+ 
+     struct pending *params;
+ 
++    /* Pending using directives at the time we entered */
++
++    struct using_direct *using_directives;
++
+     /* Pointer into blocklist as of entry */
+ 
+     struct pending_block *old_blocks;
 diff --git a/gdb/c-exp.y b/gdb/c-exp.y
-index d4bbbcc..45cd282 100644
+index d4bbbcc..107452a 100644
 --- a/gdb/c-exp.y
 +++ b/gdb/c-exp.y
-@@ -143,6 +143,7 @@ void yyerror (char *);
+@@ -119,6 +119,8 @@ static int yylex (void);
+ 
+ void yyerror (char *);
+ 
++/* Cleanup for 'nonempty_typelist' */
++static struct cleanup *typelist_cleanup;
+ %}
+ 
+ /* Although the yacc "value" of an expression is not used,
+@@ -143,6 +145,7 @@ void yyerror (char *);
      struct symbol *sym;
      struct type *tval;
      struct stoken sval;
@@ -1650,7 +1797,7 @@ index d4bbbcc..45cd282 100644
      struct ttype tsym;
      struct symtoken ssym;
      int voidval;
-@@ -150,6 +151,7 @@ void yyerror (char *);
+@@ -150,6 +153,7 @@ void yyerror (char *);
      enum exp_opcode opcode;
      struct internalvar *ivar;
  
@@ -1658,7 +1805,7 @@ index d4bbbcc..45cd282 100644
      struct type **tvec;
      int *ivec;
    }
-@@ -182,11 +184,13 @@ static int parse_number (char *, int, int, YYSTYPE *);
+@@ -182,11 +186,13 @@ static int parse_number (char *, int, int, YYSTYPE *);
     Contexts where this distinction is not important can use the
     nonterminal "name", which matches either NAME or TYPENAME.  */
  
@@ -1674,7 +1821,46 @@ index d4bbbcc..45cd282 100644
  %type <ssym> name_not_typename
  %type <tsym> typename
  
-@@ -524,6 +528,15 @@ exp	:	INT
+@@ -399,6 +405,38 @@ arglist	:	arglist ',' exp   %prec ABOVE_COMMA
+ 			{ arglist_len++; }
+ 	;
+ 
++exp     :       exp '(' nonempty_typelist ')'
++			{ int i;
++			  /* What to do about freeing memory if
++			     there is an error during parsing? */
++			  write_exp_elt_opcode (TYPE_INSTANCE);
++			  write_exp_elt_longcst ((LONGEST) $<ivec>3[0]);
++			  for (i = 0; i < $<ivec>3[0]; ++i)
++			    write_exp_elt_type ($<tvec>3[i + 1]);
++			  write_exp_elt_longcst((LONGEST) $<ivec>3[0]);
++			  write_exp_elt_opcode (TYPE_INSTANCE);
++			  do_cleanups (typelist_cleanup);
++			}
++	;
++
++/*
++exp     :       BLOCKNAME '(' nonempty_typelist ')'
++			{ int i;
++			  write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP);
++			  write_exp_elt_sym ($1.sym);
++			  write_exp_elt_opcode (TYPE_INSTANCE_LOOKUP);
++
++			  write_exp_elt_opcode (TYPE_INSTANCE);
++			  write_exp_elt_longcst ((LONGEST) $<ivec>3[0]);
++			  for (i = 0; i < $<ivec>3[0]; ++i)
++			    write_exp_elt_type ($<tvec>3[i + 1]);
++			  write_exp_elt_longcst((LONGEST) $<ivec>3[0]);
++			  write_exp_elt_opcode (TYPE_INSTANCE);
++			  do_cleanups (typelist_cleanup);
++			}
++	;
++*/
++
+ rcurly	:	'}'
+ 			{ $$ = end_arglist () - 1; }
+ 	;
+@@ -524,6 +562,15 @@ exp	:	INT
  			  write_exp_elt_opcode (OP_LONG); }
  	;
  
@@ -1690,7 +1876,7 @@ index d4bbbcc..45cd282 100644
  exp	:	NAME_OR_INT
  			{ YYSTYPE val;
  			  parse_number ($1.stoken.ptr, $1.stoken.length, 0, &val);
-@@ -572,48 +585,64 @@ string_exp:
+@@ -572,48 +619,64 @@ string_exp:
  			     string.  Note that we follow the
  			     NUL-termination convention of the
  			     lexer.  */
@@ -1785,7 +1971,47 @@ index d4bbbcc..45cd282 100644
  			}
  	;
  
-@@ -1361,6 +1390,263 @@ parse_number (p, len, parsed_float, putithere)
+@@ -713,12 +776,13 @@ qualified_name:	typebase COLONCOLON name
+ 	;
+ 
+ variable:	qualified_name
++	|	COLONCOLON qualified_name
+ 	|	COLONCOLON name
+ 			{
+ 			  char *name = copy_name ($2);
+ 			  struct symbol *sym;
+ 			  struct minimal_symbol *msymbol;
+-
++			  
+ 			  sym =
+ 			    lookup_symbol (name, (const struct block *) NULL,
+ 					   VAR_DOMAIN, (int *) NULL);
+@@ -856,7 +920,7 @@ array_mod:	'[' ']'
+ func_mod:	'(' ')'
+ 			{ $$ = 0; }
+ 	|	'(' nonempty_typelist ')'
+-			{ free ($2); $$ = 0; }
++			{ do_cleanups (typelist_cleanup); $$ = 0; }
+ 	;
+ 
+ /* We used to try to recognize pointer to member types here, but
+@@ -1057,12 +1121,15 @@ typename:	TYPENAME
+ nonempty_typelist
+ 	:	type
+ 		{ $$ = (struct type **) malloc (sizeof (struct type *) * 2);
++		  typelist_cleanup = make_cleanup (free, $$);
+ 		  $<ivec>$[0] = 1;	/* Number of types in vector */
+ 		  $$[1] = $1;
+ 		}
+ 	|	nonempty_typelist ',' type
+ 		{ int len = sizeof (struct type *) * (++($<ivec>1[0]) + 1);
+ 		  $$ = (struct type **) realloc ((char *) $1, len);
++		  discard_cleanups (typelist_cleanup);
++		  typelist_cleanup = make_cleanup (free, $$);
+ 		  $$[$<ivec>$[0]] = $3;
+ 		}
+ 	;
+@@ -1361,6 +1428,263 @@ parse_number (p, len, parsed_float, putithere)
     return INT;
  }
  
@@ -2049,7 +2275,18 @@ index d4bbbcc..45cd282 100644
  struct token
  {
    char *operator;
-@@ -1530,12 +1816,6 @@ yylex ()
+@@ -1526,23 +1850,33 @@ static int last_was_structop;
+ static int
+ yylex ()
+ {
++  /* name_prefix stores the full qualification of a variable that is
++     specified in the expression. It is used to eleminate confusion 
++     during lookup.*/
++  static char* name_prefix = NULL;
++  static int name_prefix_len = 0;
++  static int terminate_prefix = 0;
++  
+   int c;
    int namelen;
    unsigned int i;
    char *tokstart;
@@ -2062,7 +2299,52 @@ index d4bbbcc..45cd282 100644
    int saw_structop = last_was_structop;
    char *copy;
  
-@@ -1607,46 +1887,6 @@ yylex ()
+   last_was_structop = 0;
+-
++  
+  retry:
+-
++  
++  if(terminate_prefix ||
++     lexptr != name_prefix + name_prefix_len // Some token was skiped so clear name_prefix
++   ){
++    name_prefix = NULL;
++    name_prefix_len = 0;
++  }
++    
++  terminate_prefix = 1;
++  	  	  
+   /* Check if this is a macro invocation that we need to expand.  */
+   if (! scanning_macro_expansion ())
+     {
+@@ -1570,10 +1904,19 @@ yylex ()
+   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
+     if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
+       {
++	
++	if(tokentab2[i].token == COLONCOLON){
++	  name_prefix_len += 2;
++	  terminate_prefix = 0;
++	  if(name_prefix == NULL){
++   	    name_prefix = lexptr;
++          }
++	}
+ 	lexptr += 2;
+ 	yylval.opcode = tokentab2[i].opcode;
+ 	if (in_parse_field && tokentab2[i].token == ARROW)
+ 	  last_was_structop = 1;
++	
+ 	return tokentab2[i].token;
+       }
+ 
+@@ -1602,51 +1945,13 @@ yylex ()
+         return 0;
+ 
+     case ' ':
++      name_prefix_len++;
++      terminate_prefix = 0;
+     case '\t':
+     case '\n':
        lexptr++;
        goto retry;
  
@@ -2109,7 +2391,7 @@ index d4bbbcc..45cd282 100644
      case '(':
        paren_depth++;
        lexptr++;
-@@ -1764,70 +2004,33 @@ yylex ()
+@@ -1764,70 +2069,33 @@ yylex ()
        lexptr++;
        return c;
  
@@ -2202,6 +2484,59 @@ index d4bbbcc..45cd282 100644
      }
  
    if (!(c == '_' || c == '$'
+@@ -1836,11 +2104,13 @@ yylex ()
+     error ("Invalid character '%c' in expression.", c);
+ 
+   /* It's a name.  See how long it is.  */
++  
+   namelen = 0;
+   for (c = tokstart[namelen];
+        (c == '_' || c == '$' || (c >= '0' && c <= '9')
+ 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
+     {
++    
+       /* Template parameter lists are part of the name.
+ 	 FIXME: This mishandles `print $a<4&&$a>3'.  */
+ 
+@@ -1904,14 +2174,29 @@ yylex ()
+      currently as names of types; NAME for other symbols.
+      The caller is not constrained to care about the distinction.  */
+   {
++    char *tmp = copy;
+     struct symbol *sym;
+     int is_a_field_of_this = 0;
+     int hextype;
+ 
+-    sym = lookup_symbol (copy, expression_context_block,
++    if(name_prefix != NULL){
++      tmp = savestring (name_prefix, name_prefix_len+namelen);
++    }
++
++    sym = lookup_symbol (tmp, expression_context_block,
+ 			 VAR_DOMAIN,
+ 			 parse_language->la_language == language_cplus
+ 			 ? &is_a_field_of_this : (int *) NULL);
++			 
++    /* keep this name as prefix for the next name */
++    if(sym){
++      if(name_prefix == NULL){
++        name_prefix = tokstart;
++      }
++      name_prefix_len += namelen;
++      terminate_prefix = 0;
++    }
++
+     /* Call lookup_symtab, not lookup_partial_symtab, in case there are
+        no psymtabs (coff, xcoff, or some future change to blow away the
+        psymtabs once once symbols are read).  */
+@@ -1970,6 +2255,7 @@ yylex ()
+     yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+     if (in_parse_field && *lexptr == '\0')
+       saw_name_at_eof = 1;
++        
+     return NAME;
+   }
+ }
 diff --git a/gdb/c-lang.c b/gdb/c-lang.c
 index 8b5410f..188755b 100644
 --- a/gdb/c-lang.c
@@ -3213,10 +3548,69 @@ index 06c5767..ba9d996 100644
  			const struct value_print_options *options);
  
 diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
-index 0929516..2aaf9ad 100644
+index 0929516..c005fe4 100644
 --- a/gdb/c-typeprint.c
 +++ b/gdb/c-typeprint.c
-@@ -559,7 +559,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
+@@ -40,8 +40,6 @@ static void cp_type_print_method_args (struct type *mtype, char *prefix,
+ 				       char *varstring, int staticp,
+ 				       struct ui_file *stream);
+ 
+-static void c_type_print_args (struct type *, struct ui_file *);
+-
+ static void cp_type_print_derivation_info (struct ui_file *, struct type *);
+ 
+ static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
+@@ -199,6 +197,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring,
+     fprintf_filtered (stream, "void");
+ 
+   fprintf_filtered (stream, ")");
++
++  /* For non-static methods, read qualifiers from the type of
++     THIS.  */
++  if (!staticp)
++    {
++      struct type *domain;
++
++      gdb_assert (nargs > 0);
++      gdb_assert (TYPE_CODE (args[0].type) == TYPE_CODE_PTR);
++      domain = TYPE_TARGET_TYPE (args[0].type);
++
++      if (TYPE_CONST (domain))
++	fprintf_filtered (stream, " const");
++
++      if (TYPE_VOLATILE (domain))
++	fprintf_filtered (stream, " volatile");
++    }
+ }
+ 
+ 
+@@ -354,10 +369,12 @@ c_type_print_modifier (struct type *type, struct ui_file *stream,
+ 
+ /* Print out the arguments of TYPE, which should have TYPE_CODE_METHOD
+    or TYPE_CODE_FUNC, to STREAM.  Artificial arguments, such as "this"
+-   in non-static methods, are displayed.  */
++   in non-static methods, are displayed if SHOW_ARTIFICIAL is
++   non-zero.  */
+ 
+-static void
+-c_type_print_args (struct type *type, struct ui_file *stream)
++void
++c_type_print_args (struct type *type, struct ui_file *stream,
++		   int show_artificial)
+ {
+   int i, len;
+   struct field *args;
+@@ -369,6 +386,9 @@ c_type_print_args (struct type *type, struct ui_file *stream)
+ 
+   for (i = 0; i < TYPE_NFIELDS (type); i++)
+     {
++      if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial)
++	continue;
++
+       if (printed_any)
+ 	{
+ 	  fprintf_filtered (stream, ", ");
+@@ -559,7 +579,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
  	fprintf_filtered (stream, ")");
  
        fprintf_filtered (stream, "[");
@@ -3230,6 +3624,15 @@ index 0929516..2aaf9ad 100644
  	&& !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
  	fprintf_filtered (stream, "%d",
  			  (TYPE_LENGTH (type)
+@@ -592,7 +617,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
+       if (passed_a_ptr)
+ 	fprintf_filtered (stream, ")");
+       if (!demangled_args)
+-	c_type_print_args (type, stream);
++	c_type_print_args (type, stream, 1);
+       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ 				   passed_a_ptr, 0);
+       break;
 diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
 index 0b616f7..3433da2 100644
 --- a/gdb/c-valprint.c
@@ -6696,7 +7099,7 @@ index 6059d68..47ee601 100644
    default_symfile_offsets,	/* sym_offsets:  xlate external to internal form */
    default_symfile_segments,	/* sym_segments: Get segment information from
 diff --git a/gdb/config.in b/gdb/config.in
-index 6aaf77a..3ef5bbd 100644
+index 6aaf77a..1cfb12b 100644
 --- a/gdb/config.in
 +++ b/gdb/config.in
 @@ -42,6 +42,12 @@
@@ -6712,7 +7115,17 @@ index 6aaf77a..3ef5bbd 100644
  /* Define to be a string naming the default host character set. */
  #undef GDB_DEFAULT_HOST_CHARSET
  
-@@ -169,12 +175,18 @@
+@@ -60,6 +66,9 @@
+ /* Define to the default OS ABI for this configuration. */
+ #undef GDB_OSABI_DEFAULT
+ 
++/* Base directory for GDB Python modules. */
++#undef GDB_PYTHONDIR_PATH
++
+ /* Define to 1 if you have `alloca', as a function or macro. */
+ #undef HAVE_ALLOCA
+ 
+@@ -169,12 +178,18 @@
  /* Define if you have the iconv() function. */
  #undef HAVE_ICONV
  
@@ -6732,7 +7145,7 @@ index 6aaf77a..3ef5bbd 100644
  #undef HAVE_LC_MESSAGES
  
 diff --git a/gdb/configure b/gdb/configure
-index 7579c84..9eb9a8d 100755
+index 7579c84..aa1dd84 100755
 --- a/gdb/configure
 +++ b/gdb/configure
 @@ -314,7 +314,7 @@ ac_subdirs_all="$ac_subdirs_all doc testsuite"
@@ -6740,7 +7153,7 @@ index 7579c84..9eb9a8d 100755
  ac_subdirs_all="$ac_subdirs_all multi-ice"
  ac_subdirs_all="$ac_subdirs_all gdbserver"
 -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS'
-+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE GDB_DATADIR_PATH subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG LIBICONV LIBICONV_INCLUDE LIBICONV_LIBDIR READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os am__leading_dot DEPDIR CCDEPMODE MAKE GMAKE_TRUE GMAKE_FALSE SET_MAKE USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTOBJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY GNULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECMP GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GNULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GNULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTOK_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGNAL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE_UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTRDIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRDIFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WCHAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDINT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK AMTAR am__tar am__untar am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH am__fastdepCC_TRUE am__fastdepCC_FALSE GDB_DATADIR_PATH subdirs TARGET_OBS PKGVERSION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLLTOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG LIBICONV LIBICONV_INCLUDE LIBICONV_LIBDIR READLINE READLINE_DEPS READLINE_CFLAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT GDB_PYTHONDIR_PATH PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTLIBOBJS'
  ac_subst_files='host_makefile_frag'
  ac_pwd=`pwd`
  
@@ -7045,7 +7458,46 @@ index 7579c84..9eb9a8d 100755
  # On alpha-osf, it appears that libtermcap and libcurses are not compatible.
  # There is a very specific comment in /usr/include/curses.h explaining that
  # termcap routines built into libcurses must not be used.
-@@ -11418,6 +11686,8 @@ _ACEOF
+@@ -11156,6 +11424,7 @@ echo $ECHO_N "checking whether to use python... $ECHO_C" >&6
+ echo "$as_me:$LINENO: result: $with_python" >&5
+ echo "${ECHO_T}$with_python" >&6
+ 
++GDB_PYTHONDIR_PATH=
+ if test "${with_python}" = no; then
+   { echo "$as_me:$LINENO: WARNING: python support disabled; some features may be unavailable." >&5
+ echo "$as_me: WARNING: python support disabled; some features may be unavailable." >&2;}
+@@ -11387,7 +11656,20 @@ _ACEOF
+ 
+     fi
+   fi
+-  if test ${have_libpython} = no; then
++  if test ${have_libpython} != no; then
++    GDB_PYTHONDIR_PATH="`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib();"`"
++
++  test "x$prefix" = xNONE && prefix="$ac_default_prefix"
++  test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
++  ac_define_dir=`eval echo $GDB_PYTHONDIR_PATH`
++  ac_define_dir=`eval echo $ac_define_dir`
++
++cat >>confdefs.h <<_ACEOF
++#define GDB_PYTHONDIR_PATH "$ac_define_dir"
++_ACEOF
++
++
++  else
+     case "${with_python}" in
+     yes)
+       { { echo "$as_me:$LINENO: error: python is missing or unusable" >&5
+@@ -11409,6 +11691,8 @@ echo "$as_me: error: no usable python found at ${with_python}" >&2;}
+   fi
+ fi
+ 
++
++PYTHON_CFLAGS=
+ if test "${have_libpython}" = yes; then
+ 
+ cat >>confdefs.h <<\_ACEOF
+@@ -11418,6 +11702,8 @@ _ACEOF
    CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)"
    CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)"
    CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)"
@@ -7054,7 +7506,7 @@ index 7579c84..9eb9a8d 100755
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)"
  
    # Flags needed to compile Python code (taken from python-config --cflags).
-@@ -15445,10 +15715,11 @@ fi
+@@ -15445,10 +15731,11 @@ fi
  
  
  
@@ -7067,7 +7519,7 @@ index 7579c84..9eb9a8d 100755
  do
  as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
  echo "$as_me:$LINENO: checking for $ac_func" >&5
-@@ -15550,6 +15821,70 @@ fi
+@@ -15550,6 +15837,70 @@ fi
  done
  
  
@@ -7138,7 +7590,7 @@ index 7579c84..9eb9a8d 100755
  # Check the return and argument types of ptrace.  No canned test for
  # this, so roll our own.
  gdb_ptrace_headers='
-@@ -20776,230 +21111,11 @@ done
+@@ -20776,230 +21127,11 @@ done
  
  
  
@@ -7370,7 +7822,7 @@ index 7579c84..9eb9a8d 100755
                                ac_config_files="$ac_config_files Makefile .gdbinit:gdbinit.in gnulib/Makefile"
            ac_config_commands="$ac_config_commands default"
  cat >confcache <<\_ACEOF
-@@ -21865,6 +21981,7 @@ s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+@@ -21865,6 +21997,7 @@ s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
  s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
  s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
  s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
@@ -7378,7 +7830,7 @@ index 7579c84..9eb9a8d 100755
  s,@subdirs@,$subdirs,;t t
  s,@TARGET_OBS@,$TARGET_OBS,;t t
  s,@PKGVERSION@,$PKGVERSION,;t t
-@@ -21880,6 +21997,9 @@ s,@WINDRES@,$WINDRES,;t t
+@@ -21880,12 +22013,16 @@ s,@WINDRES@,$WINDRES,;t t
  s,@ac_ct_WINDRES@,$ac_ct_WINDRES,;t t
  s,@MIG@,$MIG,;t t
  s,@ac_ct_MIG@,$ac_ct_MIG,;t t
@@ -7388,7 +7840,14 @@ index 7579c84..9eb9a8d 100755
  s,@READLINE@,$READLINE,;t t
  s,@READLINE_DEPS@,$READLINE_DEPS,;t t
  s,@READLINE_CFLAGS@,$READLINE_CFLAGS,;t t
-@@ -21944,7 +22064,6 @@ s,@CONFIG_UNINSTALL@,$CONFIG_UNINSTALL,;t t
+ s,@HAVE_LIBEXPAT@,$HAVE_LIBEXPAT,;t t
+ s,@LIBEXPAT@,$LIBEXPAT,;t t
+ s,@LTLIBEXPAT@,$LTLIBEXPAT,;t t
++s,@GDB_PYTHONDIR_PATH@,$GDB_PYTHONDIR_PATH,;t t
+ s,@PYTHON_CFLAGS@,$PYTHON_CFLAGS,;t t
+ s,@ALLOCA@,$ALLOCA,;t t
+ s,@CONFIG_LDFLAGS@,$CONFIG_LDFLAGS,;t t
+@@ -21944,7 +22081,6 @@ s,@CONFIG_UNINSTALL@,$CONFIG_UNINSTALL,;t t
  s,@target_subdir@,$target_subdir,;t t
  s,@frags@,$frags,;t t
  s,@nm_h@,$nm_h,;t t
@@ -7397,7 +7856,7 @@ index 7579c84..9eb9a8d 100755
  s,@LTLIBOBJS@,$LTLIBOBJS,;t t
  s,@gl_LIBOBJS@,$gl_LIBOBJS,;t t
 diff --git a/gdb/configure.ac b/gdb/configure.ac
-index 3f81ff2..5892c59 100644
+index 3f81ff2..857a7cd 100644
 --- a/gdb/configure.ac
 +++ b/gdb/configure.ac
 @@ -1,6 +1,6 @@
@@ -7454,7 +7913,36 @@ index 3f81ff2..5892c59 100644
  # On alpha-osf, it appears that libtermcap and libcurses are not compatible.
  # There is a very specific comment in /usr/include/curses.h explaining that
  # termcap routines built into libcurses must not be used.
-@@ -649,6 +681,8 @@ if test "${have_libpython}" = yes; then
+@@ -585,6 +617,7 @@ AC_ARG_WITH(python,
+ AC_MSG_CHECKING([whether to use python])
+ AC_MSG_RESULT([$with_python])
+ 
++GDB_PYTHONDIR_PATH=
+ if test "${with_python}" = no; then
+   AC_MSG_WARN([python support disabled; some features may be unavailable.])
+   have_libpython=no
+@@ -627,7 +660,11 @@ else
+       AC_DEFINE(HAVE_LIBPYTHON2_4, 1, [Define if Python 2.4 is being used.])
+     fi
+   fi
+-  if test ${have_libpython} = no; then
++  if test ${have_libpython} != no; then
++    GDB_PYTHONDIR_PATH="`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib();"`"
++    AC_DEFINE_DIR(GDB_PYTHONDIR_PATH, GDB_PYTHONDIR_PATH, 
++		  [Base directory for GDB Python modules.])
++  else
+     case "${with_python}" in
+     yes)
+       AC_MSG_ERROR([python is missing or unusable])
+@@ -643,12 +680,16 @@ else
+     LIBS=$save_LIBS
+   fi
+ fi
++AC_SUBST(GDB_PYTHONDIR_PATH)
+ 
++PYTHON_CFLAGS=
+ if test "${have_libpython}" = yes; then
+   AC_DEFINE(HAVE_PYTHON, 1, [Define if Python interpreter is being linked in.])
    CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)"
    CONFIG_DEPS="$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)"
    CONFIG_SRCS="$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)"
@@ -7463,7 +7951,7 @@ index 3f81ff2..5892c59 100644
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)"
  
    # Flags needed to compile Python code (taken from python-config --cflags).
-@@ -776,7 +810,8 @@ AC_FUNC_VFORK
+@@ -776,7 +817,8 @@ AC_FUNC_VFORK
  AC_CHECK_FUNCS([canonicalize_file_name realpath getrusage getuid \
                  getgid poll pread64 sbrk setpgid setpgrp setsid \
  		sigaction sigprocmask sigsetmask socketpair syscall \
@@ -7473,7 +7961,7 @@ index 3f81ff2..5892c59 100644
  
  # Check the return and argument types of ptrace.  No canned test for
  # this, so roll our own.
-@@ -1930,17 +1965,10 @@ dnl Check for exe extension set on certain hosts (e.g. Win32)
+@@ -1930,17 +1972,10 @@ dnl Check for exe extension set on certain hosts (e.g. Win32)
  AC_EXEEXT
  
  dnl  Detect the character set used by this host.
@@ -7609,6 +8097,455 @@ index 65c3e25..f0cca7d 100644
  	build_gdbserver=yes
  	;;
  xtensa*)
+diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y
+index 5f5ee3a..a8f8f30 100644
+--- a/gdb/cp-name-parser.y
++++ b/gdb/cp-name-parser.y
+@@ -1,7 +1,6 @@
+ /* YACC parser for C++ names, for GDB.
+ 
+-   Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
+-   Free Software Foundation, Inc.
++   Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 
+    Parts of the lexer are based on c-exp.y from GDB.
+ 
+@@ -501,7 +500,7 @@ operator	:	OPERATOR NEW
+ 		|	OPERATOR ARROW
+ 			{ $$ = make_operator ("->", 2); }
+ 		|	OPERATOR '(' ')'
+-			{ $$ = make_operator ("()", 0); }
++			{ $$ = make_operator ("()", 2); }
+ 		|	OPERATOR '[' ']'
+ 			{ $$ = make_operator ("[]", 2); }
+ 		;
+diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
+index c6c5617..4b84348 100644
+--- a/gdb/cp-namespace.c
++++ b/gdb/cp-namespace.c
+@@ -30,26 +30,13 @@
+ #include "dictionary.h"
+ #include "command.h"
+ #include "frame.h"
++#include "buildsym.h"
+ 
+ /* List of using directives that are active in the current file.  */
+ 
+-static struct using_direct *using_list;
+-
+-static struct using_direct *cp_add_using (const char *name,
+-					  unsigned int inner_len,
+-					  unsigned int outer_len,
+-					  struct using_direct *next);
+-
+ static struct using_direct *cp_copy_usings (struct using_direct *using,
+ 					    struct obstack *obstack);
+ 
+-static struct symbol *lookup_namespace_scope (const char *name,
+-					      const char *linkage_name,
+-					      const struct block *block,
+-					      const domain_enum domain,
+-					      const char *scope,
+-					      int scope_len);
+-
+ static struct symbol *lookup_symbol_file (const char *name,
+ 					  const char *linkage_name,
+ 					  const struct block *block,
+@@ -78,31 +65,6 @@ static struct symbol *lookup_possible_namespace_symbol (const char *name);
+ 
+ static void maintenance_cplus_namespace (char *args, int from_tty);
+ 
+-/* Set up support for dealing with C++ namespace info in the current
+-   symtab.  */
+-
+-void cp_initialize_namespace ()
+-{
+-  using_list = NULL;
+-}
+-
+-/* Add all the using directives we've gathered to the current symtab.
+-   STATIC_BLOCK should be the symtab's static block; OBSTACK is used
+-   for allocation.  */
+-
+-void
+-cp_finalize_namespace (struct block *static_block,
+-		       struct obstack *obstack)
+-{
+-  if (using_list != NULL)
+-    {
+-      block_set_using (static_block,
+-		       cp_copy_usings (using_list, obstack),
+-		       obstack);
+-      using_list = NULL;
+-    }
+-}
+-
+ /* Check to see if SYMBOL refers to an object contained within an
+    anonymous namespace; if so, add an appropriate using directive.  */
+ 
+@@ -136,14 +98,17 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
+ 			  "(anonymous namespace)",
+ 			  ANONYMOUS_NAMESPACE_LEN) == 0)
+ 	    {
++	      int outer_len = (previous_component == 0 ? 0 : previous_component - 2);
++	      char outer[outer_len+1];
++	      
++	      strncpy(outer, name, outer_len);
++	      
++	      outer[outer_len] = '\0';
+ 	      /* We've found a component of the name that's an
+ 		 anonymous namespace.  So add symbols in it to the
+ 		 namespace given by the previous component if there is
+ 		 one, or to the global namespace if there isn't.  */
+-	      cp_add_using_directive (name,
+-				      previous_component == 0
+-				      ? 0 : previous_component - 2,
+-				      next_component);
++	      cp_add_using_directive (outer, name, "", "", 0);
+ 	    }
+ 	  /* The "+ 2" is for the "::".  */
+ 	  previous_component = next_component + 2;
+@@ -154,32 +119,27 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
+     }
+ }
+ 
+-/* Add a using directive to using_list.  NAME is the start of a string
+-   that should contain the namespaces we want to add as initial
+-   substrings, OUTER_LENGTH is the end of the outer namespace, and
+-   INNER_LENGTH is the end of the inner namespace.  If the using
+-   directive in question has already been added, don't add it
+-   twice.  */
++/* Add a using directive to using_list. If the using directive in question
++   has already been added, don't add it twice.  */
+ 
+ void
+-cp_add_using_directive (const char *name, unsigned int outer_length,
+-			unsigned int inner_length)
++cp_add_using_directive (const char *outer, const char *inner, const char* alias,
++    const char *declaration, const int line_number)
+ {
+   struct using_direct *current;
+   struct using_direct *new;
+ 
+   /* Has it already been added?  */
+ 
+-  for (current = using_list; current != NULL; current = current->next)
++  for (current = using_directives; current != NULL; current = current->next)
+     {
+-      if ((strncmp (current->inner, name, inner_length) == 0)
+-	  && (strlen (current->inner) == inner_length)
+-	  && (strlen (current->outer) == outer_length))
++      if (strcmp (current->inner, inner) == 0
++	  && strcmp (current->outer, outer) == 0)
+ 	return;
+     }
+ 
+-  using_list = cp_add_using (name, inner_length, outer_length,
+-			     using_list);
++  using_directives = cp_add_using (outer, inner, alias, declaration,
++      line_number,using_directives);
+ }
+ 
+ /* Record the namespace that the function defined by SYMBOL was
+@@ -230,26 +190,31 @@ cp_is_anonymous (const char *namespace)
+ 	  != NULL);
+ }
+ 
+-/* Create a new struct using direct whose inner namespace is the
+-   initial substring of NAME of leng INNER_LEN and whose outer
+-   namespace is the initial substring of NAME of length OUTER_LENGTH.
++/* Create a new struct using direct whose inner namespace is INNER 
++   and whose outer namespace is OUTER. ALIAS is the name of the imported
++   namespace in the current scope. If ALIAS is an empty string  then the
++   namespace is known by its original name.
+    Set its next member in the linked list to NEXT; allocate all memory
+    using xmalloc.  It copies the strings, so NAME can be a temporary
+    string.  */
+ 
+-static struct using_direct *
+-cp_add_using (const char *name,
+-	      unsigned int inner_len,
+-	      unsigned int outer_len,
++struct using_direct *
++cp_add_using (const char *outer,
++              const char *inner,
++              const char *alias,
++              const char *declaration,
++              const int line_number,
+ 	      struct using_direct *next)
+ {
+   struct using_direct *retval;
+ 
+-  gdb_assert (outer_len < inner_len);
+-
+   retval = xmalloc (sizeof (struct using_direct));
+-  retval->inner = savestring (name, inner_len);
+-  retval->outer = savestring (name, outer_len);
++  retval->inner = savestring (inner, strlen(inner));
++  retval->outer = savestring (outer, strlen(outer));
++  retval->alias = savestring (alias, strlen(alias));
++  retval->declaration = savestring (declaration, strlen(declaration));
++  retval->line_number = line_number;
++        
+   retval->next = next;
+ 
+   return retval;
+@@ -274,7 +239,11 @@ cp_copy_usings (struct using_direct *using,
+       retval->inner = obsavestring (using->inner, strlen (using->inner),
+ 				    obstack);
+       retval->outer = obsavestring (using->outer, strlen (using->outer),
+-				    obstack);
++                                    obstack);
++      retval->alias = obsavestring (using->alias, strlen (using->alias),
++                                    obstack);
++      retval->declaration = obsavestring (using->declaration, strlen (using->declaration),
++                                    obstack);
+       retval->next = cp_copy_usings (using->next, obstack);
+ 
+       xfree (using->inner);
+@@ -299,8 +268,14 @@ cp_lookup_symbol_nonlocal (const char *name,
+ 			   const struct block *block,
+ 			   const domain_enum domain)
+ {
+-  return lookup_namespace_scope (name, linkage_name, block, domain,
+-				 block_scope (block), 0);
++
++  struct symbol* sym = lookup_namespace_scope(name, linkage_name, block,
++      domain, block_scope(block), 0);
++
++  if (sym != NULL)
++    return sym;
++
++  return lookup_symbol_file(name, linkage_name, block, domain, 0);
+ }
+ 
+ /* Lookup NAME at namespace scope (or, in C terms, in static and
+@@ -318,7 +293,7 @@ cp_lookup_symbol_nonlocal (const char *name,
+    "A::x", and if that call fails, then the first call looks for
+    "x".  */
+ 
+-static struct symbol *
++struct symbol *
+ lookup_namespace_scope (const char *name,
+ 			const char *linkage_name,
+ 			const struct block *block,
+@@ -354,10 +329,43 @@ lookup_namespace_scope (const char *name,
+   namespace = alloca (scope_len + 1);
+   strncpy (namespace, scope, scope_len);
+   namespace[scope_len] = '\0';
+-  return cp_lookup_symbol_namespace (namespace, name, linkage_name,
++  return cp_lookup_symbol_namespace_incremental (namespace, name, linkage_name,
+ 				     block, domain);
+ }
+ 
++/* Searches the for the given NAME in the given NAMESPACE, using import 
++   statements implied by the given BLOCK, *and its' parents*. */
++struct symbol *
++cp_lookup_symbol_namespace_incremental (const char *namespace,
++                                        const char *name,
++                                        const char *linkage_name,
++                                        const struct block *block,
++                                        const domain_enum domain)
++{
++  struct symbol *sym;
++  const struct block *global_block = block_global_block (block);
++
++  /* Check if either no block is specified or it's a global block.  */
++
++  if (global_block == NULL)
++    return NULL;
++
++  while (block != global_block)
++    {
++      sym = cp_lookup_symbol_namespace (namespace, name, linkage_name, block, domain);
++
++      if (sym != NULL)
++        return sym;
++
++      block = BLOCK_SUPERBLOCK (block);
++    }
++
++  /* We've reached the global block without finding a result.  */
++
++  return NULL;
++}
++
++
+ /* Look up NAME in the C++ namespace NAMESPACE, applying the using
+    directives that are active in BLOCK.  Other arguments are as in
+    cp_lookup_symbol_nonlocal.  */
+@@ -370,7 +378,7 @@ cp_lookup_symbol_namespace (const char *namespace,
+ 			    const domain_enum domain)
+ {
+   const struct using_direct *current;
+-  struct symbol *sym;
++  struct symbol *sym = NULL;
+ 
+   /* First, go through the using directives.  If any of them add new
+      names to the namespace we're searching in, see if we can find a
+@@ -380,15 +388,42 @@ cp_lookup_symbol_namespace (const char *namespace,
+        current != NULL;
+        current = current->next)
+     {
+-      if (strcmp (namespace, current->outer) == 0)
++      
++      int current_line = find_pc_line (get_frame_pc (get_current_frame ()), 0).line;
++      
++      if (strcmp (namespace, current->outer) == 0 && current->line_number < current_line)
+ 	{
+-	  sym = cp_lookup_symbol_namespace (current->inner,
+-					    name,
+-					    linkage_name,
+-					    block,
+-					    domain);
+-	  if (sym != NULL)
++	  
++	  if(strcmp ("", current->declaration) != 0){
++	    if(strcmp (name, current->declaration) == 0){
++	      sym = cp_lookup_symbol_namespace (current->inner,
++	                                        name,
++	                                        linkage_name,
++	                                        block,
++	                                        domain);
++	    }
++	   
++	  }else{
++	  /* Check for aliases */
++	  if(strcmp (name, current->alias) == 0){
++	    sym = cp_lookup_symbol_namespace (namespace,
++	                                      current->inner,
++	                                      linkage_name,
++	                                      block,
++	                                      domain);
++	  }else{
++	    if(strcmp ("", current->alias) == 0){
++	      sym = cp_lookup_symbol_namespace (current->inner,
++		                                name,
++		                                linkage_name,
++		                                block,
++		                                domain);
++	    }
++	  }
++	  }
++	  if (sym != NULL){
+ 	    return sym;
++	  }
+ 	}
+     }
+ 
+@@ -398,8 +433,10 @@ cp_lookup_symbol_namespace (const char *namespace,
+   
+   if (namespace[0] == '\0')
+     {
+-      return lookup_symbol_file (name, linkage_name, block,
+-				 domain, 0);
++      sym = lookup_symbol_file (name, linkage_name,
++                                     block, domain, 
++                                     cp_is_anonymous (namespace));
++      return sym;
+     }
+   else
+     {
+diff --git a/gdb/cp-support.c b/gdb/cp-support.c
+index bf42636..9f04c86 100644
+--- a/gdb/cp-support.c
++++ b/gdb/cp-support.c
+@@ -175,7 +175,8 @@ mangled_name_to_comp (const char *mangled_name, int options,
+   return ret;
+ }
+ 
+-/* Return the name of the class containing method PHYSNAME.  */
++/* Return the name of the class or namespace containing
++   function, method, or variable PHYSNAME.  */
+ 
+ char *
+ cp_class_name_from_physname (const char *physname)
+diff --git a/gdb/cp-support.h b/gdb/cp-support.h
+index 837ca6c..23f8d5b 100644
+--- a/gdb/cp-support.h
++++ b/gdb/cp-support.h
+@@ -38,14 +38,28 @@ struct demangle_component;
+ 
+ /* This struct is designed to store data from using directives.  It
+    says that names from namespace INNER should be visible within
+-   namespace OUTER.  OUTER should always be a strict initial substring
+-   of INNER.  These form a linked list; NEXT is the next element of
+-   the list.  */
++   namespace OUTER These form a linked list; NEXT is the next element of
++   the list. ALIAS is set to a non empty string if the imported namespace
++   has been aliased.Eg:
++       namespace C=A::B;
++   ALIAS = "C"
++   DECLARATION is the name of the imported declaration, if this import 
++   statement represents one. Eg:
++       using A::x;
++   Where x is variable in namespace A. declaration is set to x.  
++*/
+ 
+ struct using_direct
+ {
+   char *inner;
+   char *outer;
++  
++  char *alias;
++  
++  char *declaration;
++  
++  int line_number;
++  
+   struct using_direct *next;
+ };
+ 
+@@ -54,6 +68,7 @@ struct using_direct
+ 
+ extern char *cp_canonicalize_string (const char *string);
+ 
++
+ extern char *cp_class_name_from_physname (const char *physname);
+ 
+ extern char *method_name_from_physname (const char *physname);
+@@ -76,9 +91,18 @@ extern struct type *cp_lookup_rtti_type (const char *name,
+ 
+ extern int cp_is_anonymous (const char *namespace);
+ 
+-extern void cp_add_using_directive (const char *name,
+-				    unsigned int outer_length,
+-				    unsigned int inner_length);
++extern void cp_add_using_directive (const char *outer,
++                                    const char *inner,
++                                    const char *alias,
++                                    const char *declaration,
++                                    const int line_number);
++
++extern struct using_direct *cp_add_using (const char *outer,
++                                          const char *inner,
++                                          const char *alias,
++                                          const char *declaration,
++                                          const int line_number,
++					  struct using_direct *next);
+ 
+ extern void cp_initialize_namespace (void);
+ 
+@@ -98,6 +122,19 @@ extern struct symbol *cp_lookup_symbol_nonlocal (const char *name,
+ 						 const struct block *block,
+ 						 const domain_enum domain);
+ 
++extern struct symbol *lookup_namespace_scope (const char *name,
++                                              const char *linkage_name,
++                                              const struct block *block,
++                                              const domain_enum domain,
++                                              const char *scope,
++                                              int scope_len);
++
++extern struct symbol *cp_lookup_symbol_namespace_incremental (const char *namespace,
++                                                              const char *name,
++                                                              const char *linkage_name,
++                                                              const struct block *block,
++                                                              const domain_enum domain);
++
+ extern struct symbol *cp_lookup_symbol_namespace (const char *namespace,
+ 						  const char *name,
+ 						  const char *linkage_name,
 diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
 index 8b7d868..dcd32cb 100644
 --- a/gdb/cp-valprint.c
@@ -7656,9 +8593,17 @@ index 8b7d868..dcd32cb 100644
  }
  
 diff --git a/gdb/dbxread.c b/gdb/dbxread.c
-index 115bdef..2d39ba0 100644
+index 115bdef..7f756af 100644
 --- a/gdb/dbxread.c
 +++ b/gdb/dbxread.c
+@@ -1,6 +1,6 @@
+ /* Read dbx symbol tables and convert to internal format, for GDB.
+    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008.
++   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008, 2009.
+    Free Software Foundation, Inc.
+ 
+    This file is part of GDB.
 @@ -1188,6 +1188,8 @@ read_dbx_symtab (struct objfile *objfile)
    struct internal_nlist nlist;
    CORE_ADDR text_addr;
@@ -7672,27 +8617,27 @@ index 115bdef..2d39ba0 100644
  	  if (!p)
  	    continue;			/* Not a debugging symbol.   */
  
-+ 	  sym_len = 0;
-+ 	  if (psymtab_language == language_cplus)
-+ 	    {
-+ 	      char *new_name, *name = alloca (p - namestring + 1);
-+ 	      memcpy (name, namestring, p - namestring);
-+ 	      name[p - namestring] = '\0';
-+ 	      new_name = cp_canonicalize_string (name);
-+ 	      if (new_name != NULL)
-+ 		{
-+ 		  sym_len = strlen (new_name);
-+ 		  sym_name = obsavestring (new_name, sym_len,
-+ 					   &objfile->objfile_obstack);
-+ 		  xfree (new_name);
-+ 		}
-+ 	    }
++	  sym_len = 0;
++	  if (psymtab_language == language_cplus)
++	    {
++	      char *new_name, *name = alloca (p - namestring + 1);
++	      memcpy (name, namestring, p - namestring);
++	      name[p - namestring] = '\0';
++	      new_name = cp_canonicalize_string (name);
++	      if (new_name != NULL)
++		{
++		  sym_len = strlen (new_name);
++		  sym_name = obsavestring (new_name, sym_len,
++					   &objfile->objfile_obstack);
++		  xfree (new_name);
++		}
++	    }
 +
-+ 	  if (sym_len == 0)
-+ 	    {
-+ 	      sym_name = namestring;
-+ 	      sym_len = p - namestring;
-+ 	    }
++	  if (sym_len == 0)
++	    {
++	      sym_name = namestring;
++	      sym_len = p - namestring;
++	    }
 +
  	  /* Main processing section for debugging symbols which
  	     the initial read through the symbol tables needs to worry
@@ -7802,7 +8747,7 @@ index 845b320..ad6e7d7 100644
  
  extern struct cleanup *make_final_cleanup (make_cleanup_ftype *, void *);
 diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
-index 10e7388..c506fb7 100644
+index 10e7388..ef41312 100644
 --- a/gdb/doc/gdb.texinfo
 +++ b/gdb/doc/gdb.texinfo
 @@ -955,8 +955,10 @@ Connect to process ID @var{number}, as with the @code{attach} command.
@@ -8224,7 +9169,7 @@ index 10e7388..c506fb7 100644
  @findex gdb.write
  @defun write string
  Print a string to @value{GDBN}'s paginated standard output stream.
-@@ -18193,6 +18382,61 @@ Flush @value{GDBN}'s paginated standard output stream.  Flushing
+@@ -18193,6 +18382,66 @@ Flush @value{GDBN}'s paginated standard output stream.  Flushing
  function.
  @end defun
  
@@ -8283,10 +9228,15 @@ index 10e7388..c506fb7 100644
 +to search for.
 +@end defun
 +
++@findex gdb.solib_address
++@defun solib_address @var{address}
++Return the name of the shared library holding the given address, or None.
++@end defun
++
  @node Exception Handling
  @subsubsection Exception Handling
  @cindex python exceptions
-@@ -18224,6 +18468,38 @@ message as its value, and the Python call stack backtrace at the
+@@ -18224,6 +18473,38 @@ message as its value, and the Python call stack backtrace at the
  Python statement closest to where the @value{GDBN} error occured as the
  traceback.
  
@@ -8325,7 +9275,7 @@ index 10e7388..c506fb7 100644
  @node Values From Inferior
  @subsubsection Values From Inferior
  @cindex values from inferior, with Python
-@@ -18258,8 +18534,21 @@ bar = some_val['foo']
+@@ -18258,8 +18539,21 @@ bar = some_val['foo']
  
  Again, @code{bar} will also be a @code{gdb.Value} object.
  
@@ -8349,7 +9299,7 @@ index 10e7388..c506fb7 100644
  
  @defmethod Value dereference
  This method returns a new @code{gdb.Value} object whose contents is
-@@ -18282,7 +18571,7 @@ The result @code{bar} will be a @code{gdb.Value} object holding the
+@@ -18282,7 +18576,7 @@ The result @code{bar} will be a @code{gdb.Value} object holding the
  value pointed to by @code{foo}.
  @end defmethod
  
@@ -8358,7 +9308,7 @@ index 10e7388..c506fb7 100644
  If this @code{gdb.Value} represents a string, then this method
  converts the contents to a Python string.  Otherwise, this method will
  throw an exception.
-@@ -18309,6 +18598,468 @@ The optional @var{errors} argument is the same as the corresponding
+@@ -18309,6 +18603,468 @@ The optional @var{errors} argument is the same as the corresponding
  argument to Python's @code{string.decode} method.
  @end defmethod
  
@@ -8827,7 +9777,7 @@ index 10e7388..c506fb7 100644
  @node Commands In Python
  @subsubsection Commands In Python
  
-@@ -18320,7 +19071,7 @@ You can implement new @value{GDBN} CLI commands in Python.  A CLI
+@@ -18320,7 +19076,7 @@ You can implement new @value{GDBN} CLI commands in Python.  A CLI
  command is implemented using an instance of the @code{gdb.Command}
  class, most commonly using a subclass.
  
@@ -8836,7 +9786,7 @@ index 10e7388..c506fb7 100644
  The object initializer for @code{Command} registers the new command
  with @value{GDBN}.  This initializer is normally invoked from the
  subclass' own @code{__init__} method.
-@@ -18332,11 +19083,11 @@ an exception is raised.
+@@ -18332,11 +19088,11 @@ an exception is raised.
  
  There is no support for multi-line commands.
  
@@ -8850,7 +9800,7 @@ index 10e7388..c506fb7 100644
  one of the @samp{COMPLETE_} constants defined below.  This argument
  tells @value{GDBN} how to perform completion for this command.  If not
  given, @value{GDBN} will attempt to complete using the object's
-@@ -18563,6 +19314,363 @@ registration of the command with @value{GDBN}.  Depending on how the
+@@ -18563,6 +19319,374 @@ registration of the command with @value{GDBN}.  Depending on how the
  Python code is read into @value{GDBN}, you may need to import the
  @code{gdb} module explicitly.
  
@@ -9186,10 +10136,20 @@ index 10e7388..c506fb7 100644
 +or @code{gdb.SENTINEL_FRAME}.
 +@end defmethod
 +
++@defmethod Frame unwind_stop_reason
++Return an integer representing the reason why it's not possible to find
++frames older than this.  Use @code{gdb.frame_stop_reason_string} to convert
++the value returned by this function to a string.
++@end defmethod
++
 +@defmethod Frame pc
 +Returns the frame's resume address.
 +@end defmethod
 +
++@defmethod Frame block
++Returns the frame's code block. @c (see @xref{Block,,Code Blocks and Scopes}).
++@end defmethod
++
 +@defmethod Frame address_in_block
 +Returns an address which falls within the frame's code block.
 +@end defmethod
@@ -9206,15 +10166,16 @@ index 10e7388..c506fb7 100644
 +Return the frame's symtab and line object. @c (see @xref{Symtab_and_line,, Symtab and line}).
 +@end defmethod
 +
-+@defmethod Frame read_var_value @var{symbol}
-+Return the value of the variable corresponding to the given symbol in this frame.
++@defmethod Frame read_var_value @var{variable}
++Return the value of the given variable in this frame.  @code{variable} can be
++either a string or a @code{gdb.Symbol} object. @c (@pxref{Symbols In Python}).
 +@end defmethod
 +@end table
 +
  @node Interpreters
  @chapter Command Interpreters
  @cindex command interpreters
-@@ -22273,6 +23381,103 @@ Unfreezing a variable does not update it, only subsequent
+@@ -22273,6 +23397,103 @@ Unfreezing a variable does not update it, only subsequent
  (gdb)
  @end smallexample
  
@@ -9318,7 +10279,7 @@ index 10e7388..c506fb7 100644
  
  @c %%%%%%%%%%%%%%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  @node GDB/MI Data Manipulation
-@@ -23832,6 +25037,10 @@ as possible presense of the @code{frozen} field in the output
+@@ -23832,6 +25053,10 @@ as possible presense of the @code{frozen} field in the output
  of @code{-varobj-create}.
  @item pending-breakpoints
  Indicates presence of the @option{-f} option to the @code{-break-insert} command.
@@ -9705,18 +10666,30 @@ index 76577f1..bf46761 100644
  
  #endif /* dwarf2loc.h */
 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
-index 55868da..8a39bcf 100644
+index 55868da..f9d1c41 100644
 --- a/gdb/dwarf2read.c
 +++ b/gdb/dwarf2read.c
-@@ -47,6 +47,7 @@
+@@ -1,8 +1,7 @@
+ /* DWARF 2 debugging format support for GDB.
+ 
+    Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+-                 2004, 2005, 2006, 2007, 2008, 2009
+-                 Free Software Foundation, Inc.
++   2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 
+    Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
+    Inc.  with support from Florida State University (under contract
+@@ -47,6 +46,9 @@
  #include "command.h"
  #include "gdbcmd.h"
  #include "addrmap.h"
 +#include "f-lang.h"
++#include "c-lang.h"
++#include "typeprint.h"
  
  #include <fcntl.h>
  #include "gdb_string.h"
-@@ -103,7 +104,7 @@ typedef struct pubnames_header
+@@ -103,7 +105,7 @@ typedef struct pubnames_header
  _PUBNAMES_HEADER;
  #define _ACTUAL_PUBNAMES_HEADER_SIZE 13
  
@@ -9725,7 +10698,71 @@ index 55868da..8a39bcf 100644
     Because of alignment constraints, this structure has padding and cannot
     be mapped directly onto the beginning of the .debug_info section.  */
  typedef struct aranges_header
-@@ -523,6 +524,15 @@ struct attr_abbrev
+@@ -299,9 +301,6 @@ struct dwarf2_cu
+   /* Hash table holding all the loaded partial DIEs.  */
+   htab_t partial_dies;
+ 
+-  /* `.debug_ranges' offset for this `DW_TAG_compile_unit' DIE.  */
+-  unsigned int ranges_offset;
+-
+   /* Storage for things with the same lifetime as this read-in compilation
+      unit, including partial DIEs.  */
+   struct obstack comp_unit_obstack;
+@@ -349,9 +348,6 @@ struct dwarf2_cu
+      DIEs for namespaces, we don't need to try to infer them
+      from mangled names.  */
+   unsigned int has_namespace_info : 1;
+-
+-  /* Field `ranges_offset' is filled in; flag as the value may be zero.  */
+-  unsigned int has_ranges_offset : 1;
+ };
+ 
+ /* Persistent data held for a compilation unit, even when not
+@@ -451,17 +447,12 @@ struct partial_die_info
+     /* DWARF-2 tag for this DIE.  */
+     ENUM_BITFIELD(dwarf_tag) tag : 16;
+ 
+-    /* Language code associated with this DIE.  This is only used
+-       for the compilation unit DIE.  */
+-    unsigned int language : 8;
+-
+     /* Assorted flags describing the data found in this DIE.  */
+     unsigned int has_children : 1;
+     unsigned int is_external : 1;
+     unsigned int is_declaration : 1;
+     unsigned int has_type : 1;
+     unsigned int has_specification : 1;
+-    unsigned int has_stmt_list : 1;
+     unsigned int has_pc_info : 1;
+ 
+     /* Flag set if the SCOPE field of this structure has been
+@@ -472,10 +463,12 @@ struct partial_die_info
+     unsigned int has_byte_size : 1;
+ 
+     /* The name of this DIE.  Normally the value of DW_AT_name, but
+-       sometimes DW_TAG_MIPS_linkage_name or a string computed in some
+-       other fashion.  */
++       sometimes a default name for unnamed DIEs.  */
+     char *name;
+-    char *dirname;
++
++    /* The linkage name of this DIE, from DW_AT_MIPS_linkage_name, or
++       NULL if no linkage name was present.  */
++    char *linkage_name;
+ 
+     /* The scope to prepend to our children.  This is generally
+        allocated on the comp_unit_obstack, so will disappear
+@@ -498,9 +491,6 @@ struct partial_die_info
+        DW_AT_extension).  */
+     unsigned int spec_offset;
+ 
+-    /* If HAS_STMT_LIST, the offset of the Line Number Information data.  */
+-    unsigned int line_offset;
+-
+     /* Pointers to this DIE's parent, first child, and next sibling,
+        if any.  */
+     struct partial_die_info *die_parent, *die_child, *die_sibling;
+@@ -523,6 +513,15 @@ struct attr_abbrev
      ENUM_BITFIELD(dwarf_form) form : 16;
    };
  
@@ -9741,7 +10778,16 @@ index 55868da..8a39bcf 100644
  /* Attributes have a name and a value */
  struct attribute
    {
-@@ -768,6 +778,9 @@ static void scan_partial_symbols (struct partial_die_info *,
+@@ -756,7 +755,7 @@ static void dwarf2_create_include_psymtab (char *, struct partial_symtab *,
+                                            struct objfile *);
+ 
+ static void dwarf2_build_include_psymtabs (struct dwarf2_cu *,
+-                                           struct partial_die_info *,
++                                           struct die_info *,
+                                            struct partial_symtab *);
+ 
+ static void dwarf2_build_psymtabs_hard (struct objfile *, int);
+@@ -768,6 +767,9 @@ static void scan_partial_symbols (struct partial_die_info *,
  static void add_partial_symbol (struct partial_die_info *,
  				struct dwarf2_cu *);
  
@@ -9751,7 +10797,7 @@ index 55868da..8a39bcf 100644
  static int pdi_needs_namespace (enum dwarf_tag tag);
  
  static void add_partial_namespace (struct partial_die_info *pdi,
-@@ -794,6 +807,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
+@@ -794,6 +796,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
  
  static void psymtab_to_symtab_1 (struct partial_symtab *);
  
@@ -9762,7 +10808,26 @@ index 55868da..8a39bcf 100644
  gdb_byte *dwarf2_read_section (struct objfile *, asection *);
  
  static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
-@@ -993,6 +1010,9 @@ static void process_die (struct die_info *, struct dwarf2_cu *);
+@@ -929,7 +935,8 @@ static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *,
+ 			       struct dwarf2_cu *, struct partial_symtab *);
+ 
+ static int dwarf2_get_pc_bounds (struct die_info *,
+-				 CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *);
++				 CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *,
++				 struct partial_symtab *pst);
+ 
+ static void get_scope_pc_bounds (struct die_info *,
+ 				 CORE_ADDR *, CORE_ADDR *,
+@@ -962,6 +969,8 @@ static void read_namespace (struct die_info *die, struct dwarf2_cu *);
+ 
+ static void read_module (struct die_info *die, struct dwarf2_cu *cu);
+ 
++static void read_import_statement (struct die_info *die, struct dwarf2_cu *);
++
+ static const char *namespace_name (struct die_info *die,
+ 				   int *is_anonymous, struct dwarf2_cu *);
+ 
+@@ -993,6 +1002,9 @@ static void process_die (struct die_info *, struct dwarf2_cu *);
  
  static char *dwarf2_linkage_name (struct die_info *, struct dwarf2_cu *);
  
@@ -9772,7 +10837,7 @@ index 55868da..8a39bcf 100644
  static char *dwarf2_name (struct die_info *die, struct dwarf2_cu *);
  
  static struct die_info *dwarf2_extension (struct die_info *die,
-@@ -1030,7 +1050,14 @@ static void store_in_ref_table (struct die_info *,
+@@ -1030,7 +1042,14 @@ static void store_in_ref_table (struct die_info *,
  
  static unsigned int dwarf2_get_ref_die_offset (struct attribute *);
  
@@ -9788,7 +10853,7 @@ index 55868da..8a39bcf 100644
  
  static struct die_info *follow_die_ref (struct die_info *,
  					struct attribute *,
-@@ -1085,6 +1112,9 @@ static void age_cached_comp_units (void);
+@@ -1085,6 +1104,9 @@ static void age_cached_comp_units (void);
  
  static void free_one_cached_comp_unit (void *);
  
@@ -9798,7 +10863,7 @@ index 55868da..8a39bcf 100644
  static struct type *set_die_type (struct die_info *, struct type *,
  				  struct dwarf2_cu *);
  
-@@ -1104,19 +1134,28 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *);
+@@ -1104,19 +1126,28 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *);
  
  static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu);
  
@@ -9832,7 +10897,7 @@ index 55868da..8a39bcf 100644
  
    dwarf_info_section = 0;
    dwarf_abbrev_section = 0;
-@@ -1127,8 +1166,9 @@ dwarf2_has_info (struct objfile *objfile)
+@@ -1127,8 +1158,9 @@ dwarf2_has_info (struct objfile *objfile)
    dwarf_eh_frame_section = 0;
    dwarf_ranges_section = 0;
    dwarf_loc_section = 0;
@@ -9843,7 +10908,7 @@ index 55868da..8a39bcf 100644
    return (dwarf_info_section != NULL && dwarf_abbrev_section != NULL);
  }
  
-@@ -1149,51 +1189,61 @@ section_is_p (asection *sectp, const char *name)
+@@ -1149,51 +1181,61 @@ section_is_p (asection *sectp, const char *name)
     in.  */
  
  static void
@@ -9915,7 +10980,7 @@ index 55868da..8a39bcf 100644
        dwarf_frame_section = sectp;
      }
    else if (section_is_p (sectp, EH_FRAME_SECTION))
-@@ -1201,13 +1251,15 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr)
+@@ -1201,13 +1243,15 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr)
        flagword aflag = bfd_get_section_flags (ignore_abfd, sectp);
        if (aflag & SEC_HAS_CONTENTS)
          {
@@ -9933,7 +10998,7 @@ index 55868da..8a39bcf 100644
        dwarf_ranges_section = sectp;
      }
    
-@@ -1250,6 +1302,86 @@ dwarf2_resize_section (asection *sectp, bfd_size_type new_size)
+@@ -1250,6 +1294,86 @@ dwarf2_resize_section (asection *sectp, bfd_size_type new_size)
                      sectp->name);
  }
  
@@ -10020,7 +11085,423 @@ index 55868da..8a39bcf 100644
  /* Build a partial symbol table.  */
  
  void
-@@ -2849,6 +2981,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
+@@ -1453,22 +1577,24 @@ dwarf2_create_include_psymtab (char *name, struct partial_symtab *pst,
+ 
+ /* Read the Line Number Program data and extract the list of files
+    included by the source file represented by PST.  Build an include
+-   partial symtab for each of these included files.
+-   
+-   This procedure assumes that there *is* a Line Number Program in
+-   the given CU.  Callers should check that PDI->HAS_STMT_LIST is set
+-   before calling this procedure.  */
++   partial symtab for each of these included files.  */
+ 
+ static void
+ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
+-                               struct partial_die_info *pdi,
++                               struct die_info *die,
+                                struct partial_symtab *pst)
+ {
+   struct objfile *objfile = cu->objfile;
+   bfd *abfd = objfile->obfd;
+-  struct line_header *lh;
++  struct line_header *lh = NULL;
++  struct attribute *attr;
+ 
+-  lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu);
++  attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
++  if (attr)
++    {
++      unsigned int line_offset = DW_UNSND (attr);
++      lh = dwarf_decode_line_header (line_offset, abfd, cu);
++    }
+   if (lh == NULL)
+     return;  /* No linetable, so no includes.  */
+ 
+@@ -1477,6 +1603,36 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
+   free_line_header (lh);
+ }
+ 
++/* Find the base address of the compilation unit for range lists and
++   location lists.  It will normally be specified by DW_AT_low_pc.
++   In DWARF-3 draft 4, the base address could be overridden by
++   DW_AT_entry_pc.  It's been removed, but GCC still uses this for
++   compilation units with discontinuous ranges.  */
++
++static void
++dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu)
++{
++  struct attribute *attr;
++
++  cu->base_known = 0;
++  cu->base_address = 0;
++
++  attr = dwarf2_attr (die, DW_AT_entry_pc, cu);
++  if (attr)
++    {
++      cu->base_address = DW_ADDR (attr);
++      cu->base_known = 1;
++    }
++  else
++    {
++      attr = dwarf2_attr (die, DW_AT_low_pc, cu);
++      if (attr)
++	{
++	  cu->base_address = DW_ADDR (attr);
++	  cu->base_known = 1;
++	}
++    }
++}
+ 
+ /* Build the partial symbol table by doing a quick pass through the
+    .debug_info and .debug_abbrev sections.  */
+@@ -1489,7 +1645,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+   bfd *abfd = objfile->obfd;
+   gdb_byte *info_ptr;
+   gdb_byte *beg_of_comp_unit;
+-  struct partial_die_info comp_unit_die;
++  struct die_info *comp_unit_die;
+   struct partial_symtab *pst;
+   struct cleanup *back_to;
+   CORE_ADDR baseaddr;
+@@ -1523,9 +1679,12 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+     {
+       struct cleanup *back_to_inner;
+       struct dwarf2_cu cu;
+-      struct abbrev_info *abbrev;
+       unsigned int bytes_read;
+       struct dwarf2_per_cu_data *this_cu;
++      int has_children, has_pc_info;
++      struct attribute *attr;
++      const char *name;
++      CORE_ADDR best_lowpc, best_highpc;
+ 
+       beg_of_comp_unit = info_ptr;
+ 
+@@ -1551,11 +1710,10 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+       this_cu = dwarf2_find_comp_unit (cu.header.offset, objfile);
+ 
+       /* Read the compilation unit die */
+-      abbrev = peek_die_abbrev (info_ptr, &bytes_read, &cu);
+-      info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read,
+-				   abfd, info_ptr, &cu);
++      info_ptr = read_full_die (&comp_unit_die, abfd, info_ptr, &cu,
++				&has_children);
+ 
+-      if (comp_unit_die.tag == DW_TAG_partial_unit)
++      if (comp_unit_die->tag == DW_TAG_partial_unit)
+ 	{
+ 	  info_ptr = (beg_of_comp_unit + cu.header.length
+ 		      + cu.header.initial_length_size);
+@@ -1564,20 +1722,27 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+ 	}
+ 
+       /* Set the language we're debugging */
+-      set_cu_language (comp_unit_die.language, &cu);
++      attr = dwarf2_attr (comp_unit_die, DW_AT_language, &cu);
++      if (attr != NULL)
++	set_cu_language (DW_UNSND (attr), &cu);
++      else
++	set_cu_language (language_minimal, &cu);
+ 
+       /* Allocate a new partial symbol table structure */
+-      pst = start_psymtab_common (objfile, objfile->section_offsets,
+-				  comp_unit_die.name ? comp_unit_die.name : "",
++      attr = dwarf2_attr (comp_unit_die, DW_AT_name, &cu);
++      if (attr != NULL)
++	name = DW_STRING (attr);
++      else
++	name = "";
++      pst = start_psymtab_common (objfile, objfile->section_offsets, name,
+ 				  /* TEXTLOW and TEXTHIGH are set below.  */
+ 				  0,
+ 				  objfile->global_psymbols.next,
+ 				  objfile->static_psymbols.next);
+ 
+-      if (comp_unit_die.dirname)
+-	pst->dirname = obsavestring (comp_unit_die.dirname,
+-				     strlen (comp_unit_die.dirname),
+-				     &objfile->objfile_obstack);
++      attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, &cu);
++      if (attr != NULL)
++	pst->dirname = xstrdup (DW_STRING (attr));
+ 
+       pst->read_symtab_private = (char *) this_cu;
+ 
+@@ -1607,24 +1772,17 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+ 
+       /* Possibly set the default values of LOWPC and HIGHPC from
+          `DW_AT_ranges'.  */
+-      if (cu.has_ranges_offset)
+-	{
+-	  if (dwarf2_ranges_read (cu.ranges_offset, &comp_unit_die.lowpc,
+-				  &comp_unit_die.highpc, &cu, pst))
+-	    comp_unit_die.has_pc_info = 1;
+-	}
+-      else if (comp_unit_die.has_pc_info
+-	       && comp_unit_die.lowpc < comp_unit_die.highpc)
+-	/* Store the contiguous range if it is not empty; it can be empty for
+-	   CUs with no code.  */
+-	addrmap_set_empty (objfile->psymtabs_addrmap,
+-			   comp_unit_die.lowpc + baseaddr,
+-			   comp_unit_die.highpc + baseaddr - 1, pst);
++      has_pc_info = 0;
++
++      if (dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, &best_highpc, &cu,
++				pst))
++	has_pc_info = 1;
++      dwarf2_find_base_address (comp_unit_die, &cu);
+ 
+       /* Check if comp unit has_children.
+          If so, read the rest of the partial symbols from this comp unit.
+          If not, there's no more debug_info for this comp unit. */
+-      if (comp_unit_die.has_children)
++      if (has_children)
+ 	{
+ 	  struct partial_die_info *first_die;
+ 	  CORE_ADDR lowpc, highpc;
+@@ -1634,8 +1792,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+ 
+ 	  first_die = load_partial_dies (abfd, info_ptr, 1, &cu);
+ 
+-	  scan_partial_symbols (first_die, &lowpc, &highpc,
+-				! comp_unit_die.has_pc_info, &cu);
++	  scan_partial_symbols (first_die, &lowpc, &highpc, ! has_pc_info, &cu);
+ 
+ 	  /* If we didn't find a lowpc, set it to highpc to avoid
+ 	     complaints from `maint check'.  */
+@@ -1644,14 +1801,14 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+ 
+ 	  /* If the compilation unit didn't have an explicit address range,
+ 	     then use the information extracted from its child dies.  */
+-	  if (! comp_unit_die.has_pc_info)
++	  if (! has_pc_info)
+ 	    {
+-	      comp_unit_die.lowpc = lowpc;
+-	      comp_unit_die.highpc = highpc;
++	      best_lowpc = lowpc;
++	      best_highpc = highpc;
+ 	    }
+ 	}
+-      pst->textlow = comp_unit_die.lowpc + baseaddr;
+-      pst->texthigh = comp_unit_die.highpc + baseaddr;
++      pst->textlow = best_lowpc + baseaddr;
++      pst->texthigh = best_highpc + baseaddr;
+ 
+       pst->n_global_syms = objfile->global_psymbols.next -
+ 	(objfile->global_psymbols.list + pst->globals_offset);
+@@ -1667,12 +1824,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
+       info_ptr = beg_of_comp_unit + cu.header.length
+                                   + cu.header.initial_length_size;
+ 
+-      if (comp_unit_die.has_stmt_list)
+-        {
+-          /* Get the list of files included in the current compilation unit,
+-             and build a psymtab for each of them.  */
+-          dwarf2_build_include_psymtabs (&cu, &comp_unit_die, pst);
+-        }
++      /* Get the list of files included in the current compilation unit,
++	 and build a psymtab for each of them.  */
++      dwarf2_build_include_psymtabs (&cu, comp_unit_die, pst);
+ 
+       do_cleanups (back_to_inner);
+     }
+@@ -1690,11 +1844,12 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile)
+ {
+   bfd *abfd = objfile->obfd;
+   gdb_byte *info_ptr, *beg_of_comp_unit;
+-  struct partial_die_info comp_unit_die;
++  struct die_info *comp_unit_die;
+   struct dwarf2_cu *cu;
+-  struct abbrev_info *abbrev;
+   unsigned int bytes_read;
+   struct cleanup *back_to;
++  struct attribute *attr;
++  int has_children;
+ 
+   info_ptr = dwarf2_per_objfile->info_buffer + this_cu->offset;
+   beg_of_comp_unit = info_ptr;
+@@ -1716,12 +1871,15 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile)
+   back_to = make_cleanup (dwarf2_free_abbrev_table, cu);
+ 
+   /* Read the compilation unit die.  */
+-  abbrev = peek_die_abbrev (info_ptr, &bytes_read, cu);
+-  info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read,
+-			       abfd, info_ptr, cu);
++  info_ptr = read_full_die (&comp_unit_die, abfd, info_ptr, cu,
++			    &has_children);
+ 
+   /* Set the language we're debugging.  */
+-  set_cu_language (comp_unit_die.language, cu);
++  attr = dwarf2_attr (comp_unit_die, DW_AT_language, cu);
++  if (attr)
++    set_cu_language (DW_UNSND (attr), cu);
++  else
++    set_cu_language (language_minimal, cu);
+ 
+   /* Link this compilation unit into the compilation unit tree.  */
+   this_cu->cu = cu;
+@@ -1731,7 +1889,7 @@ load_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile)
+   /* Check if comp unit has_children.
+      If so, read the rest of the partial symbols from this comp unit.
+      If not, there's no more debug_info for this comp unit. */
+-  if (comp_unit_die.has_children)
++  if (has_children)
+     load_partial_dies (abfd, info_ptr, 0, cu);
+ 
+   do_cleanups (back_to);
+@@ -1948,7 +2106,7 @@ partial_die_parent_scope (struct partial_die_info *pdi,
+ 	 ignoring them.  */
+       complaint (&symfile_complaints,
+ 		 _("unhandled containing DIE tag %d for DIE at %d"),
+-		 parent->tag, pdi->offset);
++		 parent->tag, real_pdi->offset);
+       parent->scope = grandparent_scope;
+     }
+ 
+@@ -1963,12 +2121,37 @@ partial_die_full_name (struct partial_die_info *pdi,
+ 		       struct dwarf2_cu *cu)
+ {
+   char *parent_scope;
++  struct partial_die_info *real_pdi;
+ 
+-  parent_scope = partial_die_parent_scope (pdi, cu);
+-  if (parent_scope == NULL)
+-    return NULL;
+-  else
++  /* We need to look at our parent DIE; if we have a DW_AT_specification,
++     then this means the parent of the specification DIE.
++     partial_die_parent_scope does this loop also, but we do it here
++     since we need to examine real_pdi->parent ourselves.  */
++
++  real_pdi = pdi;
++  while (real_pdi->has_specification)
++    real_pdi = find_partial_die (real_pdi->spec_offset, cu);
++
++  parent_scope = partial_die_parent_scope (real_pdi, cu);
++  if (parent_scope != NULL)
+     return typename_concat (NULL, parent_scope, pdi->name, cu);
++
++  if (!cu->has_namespace_info && pdi->linkage_name
++      && !real_pdi->die_parent)
++    {
++      char *actual_scope
++	= language_class_name_from_physname (cu->language_defn,
++					     pdi->linkage_name);
++      if (actual_scope != NULL)
++	{
++	  char *actual_name = typename_concat (NULL, actual_scope,
++					       pdi->name, cu);
++	  xfree (actual_scope);
++	  return actual_name;
++	}
++    }
++
++  return NULL;
+ }
+ 
+ static void
+@@ -1984,7 +2167,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
+ 
+   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ 
+-  if (pdi_needs_namespace (pdi->tag))
++  if (pdi->linkage_name != NULL)
++    actual_name = pdi->linkage_name;
++  else if (pdi_needs_namespace (pdi->tag))
+     {
+       actual_name = partial_die_full_name (pdi, cu);
+       if (actual_name)
+@@ -2133,9 +2318,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
+   if (cu->language == language_cplus
+       && cu->has_namespace_info == 0
+       && psym != NULL
+-      && SYMBOL_CPLUS_DEMANGLED_NAME (psym) != NULL)
+-    cp_check_possible_namespace_symbols (SYMBOL_CPLUS_DEMANGLED_NAME (psym),
+-					 objfile);
++      && pdi->linkage_name != NULL)
++    cp_check_possible_namespace_symbols (actual_name, objfile);
+ 
+   if (built_actual_name)
+     xfree (actual_name);
+@@ -2158,6 +2342,14 @@ pdi_needs_namespace (enum dwarf_tag tag)
+     case DW_TAG_union_type:
+     case DW_TAG_enumeration_type:
+     case DW_TAG_enumerator:
++    case DW_TAG_subprogram:
++    case DW_TAG_variable:
++      return 1;
++    case DW_TAG_member:
++      /* The only time we will encounter member variables in this
++	 function is when we are creating a "linkage" name for them;
++	 therefore they must be static members, so they do need a
++	 class prefix.  */
+       return 1;
+     default:
+       return 0;
+@@ -2290,11 +2482,11 @@ guess_structure_name (struct partial_die_info *struct_pdi,
+ 
+       while (child_pdi != NULL)
+ 	{
+-	  if (child_pdi->tag == DW_TAG_subprogram)
++	  if (child_pdi->tag == DW_TAG_subprogram && child_pdi->linkage_name)
+ 	    {
+ 	      char *actual_class_name
+ 		= language_class_name_from_physname (cu->language_defn,
+-						     child_pdi->name);
++						     child_pdi->linkage_name);
+ 	      if (actual_class_name != NULL)
+ 		{
+ 		  struct_pdi->name
+@@ -2741,7 +2933,6 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
+   CORE_ADDR lowpc, highpc;
+   struct symtab *symtab;
+   struct cleanup *back_to;
+-  struct attribute *attr;
+   CORE_ADDR baseaddr;
+ 
+   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+@@ -2751,30 +2942,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
+ 
+   cu->list_in_scope = &file_symbols;
+ 
+-  /* Find the base address of the compilation unit for range lists and
+-     location lists.  It will normally be specified by DW_AT_low_pc.
+-     In DWARF-3 draft 4, the base address could be overridden by
+-     DW_AT_entry_pc.  It's been removed, but GCC still uses this for
+-     compilation units with discontinuous ranges.  */
+-
+-  cu->base_known = 0;
+-  cu->base_address = 0;
+-
+-  attr = dwarf2_attr (cu->dies, DW_AT_entry_pc, cu);
+-  if (attr)
+-    {
+-      cu->base_address = DW_ADDR (attr);
+-      cu->base_known = 1;
+-    }
+-  else
+-    {
+-      attr = dwarf2_attr (cu->dies, DW_AT_low_pc, cu);
+-      if (attr)
+-	{
+-	  cu->base_address = DW_ADDR (attr);
+-	  cu->base_known = 1;
+-	}
+-    }
++  dwarf2_find_base_address (cu->dies, cu);
+ 
+   /* Do line number decoding in read_file_scope () */
+   process_die (cu->dies, cu);
+@@ -2805,6 +2973,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu)
+ static void
+ process_die (struct die_info *die, struct dwarf2_cu *cu)
+ {
++
+   switch (die->tag)
+     {
+     case DW_TAG_padding:
+@@ -2849,6 +3018,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
  
      case DW_TAG_base_type:
      case DW_TAG_subrange_type:
@@ -10028,7 +11509,166 @@ index 55868da..8a39bcf 100644
        /* Add a typedef symbol for the type definition, if it has a
           DW_AT_name.  */
        new_symbol (die, read_type_die (die, cu), cu);
-@@ -3076,6 +3209,15 @@ add_to_cu_func_list (const char *name, CORE_ADDR lowpc, CORE_ADDR highpc,
+@@ -2867,14 +3037,12 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
+       break;
+     case DW_TAG_imported_declaration:
+     case DW_TAG_imported_module:
+-      /* FIXME: carlton/2002-10-16: Eventually, we should use the
+-	 information contained in these.  DW_TAG_imported_declaration
+-	 dies shouldn't have children; DW_TAG_imported_module dies
+-	 shouldn't in the C++ case, but conceivably could in the
+-	 Fortran case.  */
+       processing_has_namespace_info = 1;
+-      complaint (&symfile_complaints, _("unsupported tag: '%s'"),
+-		 dwarf_tag_name (die->tag));
++      if (die->child != NULL && (die->tag == DW_TAG_imported_declaration
++				 || cu->language != language_fortran))
++	complaint (&symfile_complaints, _("Tag '%s' has unexpected children"),
++		   dwarf_tag_name (die->tag));
++      read_import_statement (die, cu);
+       break;
+     default:
+       new_symbol (die, NULL, cu);
+@@ -2904,22 +3072,130 @@ dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu)
+     return name;
+ 
+   /* If no prefix is necessary for this type of DIE, return the
+-     unqualified name.  The other three tags listed could be handled
+-     in pdi_needs_namespace, but that requires broader changes.  */
+-  if (!pdi_needs_namespace (die->tag)
+-      && die->tag != DW_TAG_subprogram
+-      && die->tag != DW_TAG_variable
+-      && die->tag != DW_TAG_member)
++     unqualified name.  */
++  if (!pdi_needs_namespace (die->tag))
+     return name;
+ 
+   prefix = determine_prefix (die, cu);
+   if (*prefix != '\0')
+-    name = typename_concat (&cu->objfile->objfile_obstack, prefix,
+-			    name, cu);
++    {
++      char *prefixed_name = typename_concat (NULL, prefix, name, cu);
++      buf = mem_fileopen ();
++      fputs_unfiltered (prefixed_name, buf);
++      xfree (prefixed_name);
++    }
++
++  if (cu->language == language_cplus && die->tag == DW_TAG_subprogram)
++    {
++      struct type *type = read_type_die (die, cu);
++
++      if (buf == NULL)
++	{
++	  buf = mem_fileopen ();
++	  fputs_unfiltered (name, buf);
++	}
++
++      c_type_print_args (type, buf, 0);
++    }
++
++  if (buf != NULL)
++    {
++      long length;
++      name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack,
++				   &length);
++      ui_file_delete (buf);
++    }
+ 
+   return name;
+ }
+ 
++/* read the given die's decl_line number. Return -1 if in case of an error */
++static const int dwarf2_read_decl_line (struct die_info *die, struct dwarf2_cu *cu){
++  struct attribute *line_attr;
++
++  line_attr = dwarf2_attr (die, DW_AT_decl_line, cu);
++  if (line_attr){
++    return  DW_UNSND (line_attr);
++  }
++
++  return -1;
++}
++
++/* Read the import statement specified by the given die and record it.  */ 
++
++static void
++read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
++{
++  struct attribute *import_attr;
++  struct die_info *imported_die;
++  const char *imported_name;
++  const char *imported_name_prefix;
++  char *canonical_name;
++  const char *import_alias;
++  const char *imported_declaration = "";
++  const char *import_prefix;
++  
++  int line_number = -1;
++  
++  int is_anonymous = 0;
++  
++  import_attr = dwarf2_attr (die, DW_AT_import, cu);
++  if (import_attr == NULL)
++    {
++      complaint (&symfile_complaints, _("Tag '%s' has no DW_AT_import"),
++		 dwarf_tag_name (die->tag));
++      return;
++    }
++
++  imported_die = follow_die_ref (die, import_attr, &cu);
++  imported_name = namespace_name (imported_die, &is_anonymous, cu);
++  if (imported_name == NULL)
++    {
++      /* C++ imports from std:: DW_TAG_base_type with no DW_AT_name - why?  */
++      return;
++    }
++
++  /* Figure out the local name after import.  */
++  import_alias = dwarf2_name(die, cu);
++  if(import_alias == NULL){
++    import_alias = "";
++  }
++  
++  /* Determine the line number at which the import was made */
++  line_number = dwarf2_read_decl_line(die, cu);
++  
++  /* Figure out where the statement is being imported to */
++  import_prefix = determine_prefix (die, cu);
++
++  /*
++   Figure out what the scope of the imported die is and prepend it
++   to the name of the imported die
++   */
++  imported_name_prefix = determine_prefix (imported_die, cu);
++  
++  if(imported_die->tag != DW_TAG_namespace){
++    imported_declaration = imported_name;
++    canonical_name = (char*)imported_name_prefix;
++  }else{
++    if(strlen (imported_name_prefix) > 0){
++      canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1);
++      strcpy (canonical_name, imported_name_prefix);
++      strcat (canonical_name, "::");
++      strcat (canonical_name, imported_name);
++    }else{
++      canonical_name = alloca (strlen (imported_name) + 1);
++      strcpy (canonical_name, imported_name);
++    }
++  }
++  
++  using_directives = cp_add_using (import_prefix,
++                                   canonical_name,
++                                   import_alias,
++                                   imported_declaration,
++                                   line_number,
++                                   using_directives);
++}
++
+ static void
+ initialize_cu_func_list (struct dwarf2_cu *cu)
+ {
+@@ -3076,6 +3352,103 @@ add_to_cu_func_list (const char *name, CORE_ADDR lowpc, CORE_ADDR highpc,
    cu->last_fn = thisfn;
  }
  
@@ -10041,18 +11681,129 @@ index 55868da..8a39bcf 100644
 +  return (a > b) - (b > a);
 +}
 +
++static void explore_abstract_origin(struct die_info *die, struct dwarf2_cu *cu, unsigned* die_children_p){
++  struct attribute *attr;
++  unsigned die_children = *die_children_p;
++  struct die_info *child_die;
++  
++  attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
++  
++  /* GCC currently uses DW_AT_specification to indicate die inheritence
++     in the case of import statements. The following is to accommodate that */
++  if(!attr){
++    attr = dwarf2_attr (die, DW_AT_specification, cu);
++  }
++  
++  if (attr)
++    {
++      /* For the list of CHILD_DIEs.  */
++      unsigned *offsets;
++      unsigned *offsets_end, *offsetp;
++      struct die_info *origin_die, *origin_child_die;
++      struct cleanup *cleanups;
++
++      origin_die = follow_die_ref (die, attr, &cu);
++      if (die->tag != origin_die->tag)
++        complaint (&symfile_complaints,
++                   _("DIE 0x%x and its abstract origin 0x%x have different "
++                     "tags"),
++                   die->offset, origin_die->offset);
++
++      offsets = xmalloc (sizeof (*offsets) * die_children);
++      cleanups = make_cleanup (xfree, offsets);
++
++      offsets_end = offsets;
++      child_die = die->child;
++      while (child_die && child_die->tag)
++        {
++          attr = dwarf2_attr (child_die, DW_AT_abstract_origin, cu);
++          if (!attr)
++            complaint (&symfile_complaints,
++                       _("Child DIE 0x%x of DIE 0x%x has missing "
++                         "DW_AT_abstract_origin"),
++                       child_die->offset, die->offset);
++          else
++            {
++              struct die_info *child_origin_die;
++
++              child_origin_die = follow_die_ref (child_die, attr, &cu);
++              if (child_die->tag != child_origin_die->tag)
++                complaint (&symfile_complaints,
++                           _("Child DIE 0x%x and its abstract origin 0x%x have "
++                             "different tags"),
++                           child_die->offset, child_origin_die->offset);
++              *offsets_end++ = child_origin_die->offset;
++            }
++          child_die = sibling_die (child_die);
++        }
++      qsort (offsets, offsets_end - offsets, sizeof (*offsets),
++             unsigned_int_compar);
++      /* Disabled as excessively expensive - check if we may ever complain.  */
++      if (0)
++        {
++          for (offsetp = offsets + 1; offsetp < offsets_end; offsetp++)
++            if (offsetp[-1] == *offsetp)
++              complaint (&symfile_complaints,
++                         _("Child DIEs of DIE 0x%x duplicitly abstract-origin "
++                           "referenced DIE 0x%x"),
++                         die->offset, *offsetp);
++        }
++
++      offsetp = offsets;
++      origin_child_die = origin_die->child;
++      while (origin_child_die && origin_child_die->tag)
++        {
++          /* Is origin_child_die referenced by any of the DIE children?  */
++          while (offsetp < offsets_end && *offsetp < origin_child_die->offset)
++            offsetp++;
++          if (offsetp >= offsets_end || *offsetp > origin_child_die->offset)
++            {
++              /* Found that origin_child_die is really not referenced.  */
++              process_die (origin_child_die, cu);
++            }
++          origin_child_die = sibling_die (origin_child_die);
++        }
++
++      do_cleanups (cleanups);
++    }
++  
++}
++
  static void
  read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
  {
-@@ -3088,6 +3230,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+@@ -3088,16 +3461,27 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
    char *name;
    CORE_ADDR baseaddr;
    struct block *block;
-+  unsigned die_children;
++  unsigned die_children = 0;
  
    baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
  
-@@ -3124,14 +3267,87 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+-  name = dwarf2_linkage_name (die, cu);
++  name = dwarf2_name (die, cu);
+ 
+   /* Ignore functions with missing or empty names and functions with
+      missing or invalid low and high pc attributes.  */
+-  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
++  if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL)){
++    /* explore abstract origins if present. They might contain useful information
++     such as import statements. */
++    child_die = die->child;
++    while (child_die && child_die->tag)
++      {
++	child_die = sibling_die (child_die);
++	die_children++;
++      }
++    explore_abstract_origin(die, cu, &die_children);
+     return;
+-
++  }
++  
+   lowpc += baseaddr;
+   highpc += baseaddr;
+ 
+@@ -3124,16 +3508,91 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
  
    cu->list_in_scope = &local_symbols;
  
@@ -10060,7 +11811,7 @@ index 55868da..8a39bcf 100644
 +  child_die = die->child;
 +  die_children = 0;
 +  while (child_die && child_die->tag)
-     {
++    {
 +      process_die (child_die, cu);
 +      child_die = sibling_die (child_die);
 +      die_children++;
@@ -10068,7 +11819,7 @@ index 55868da..8a39bcf 100644
 +
 +  attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
 +  if (attr)
-+    {
+     {
 +      /* For the list of CHILD_DIEs.  */
 +      unsigned *offsets;
 +      unsigned *offsets_end, *offsetp;
@@ -10141,8 +11892,106 @@ index 55868da..8a39bcf 100644
 +      do_cleanups (cleanups);
      }
  
++  explore_abstract_origin(die, cu, &die_children);
++
    new = pop_context ();
-@@ -3926,7 +4142,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
+   /* Make a block for the local symbols within.  */
+   block = finish_block (new->name, &local_symbols, new->old_blocks,
+@@ -3154,6 +3613,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+      back to building a containing block's symbol lists.  */
+   local_symbols = new->locals;
+   param_symbols = new->params;
++  using_directives = new->using_directives;
+ 
+   /* If we've finished processing a top-level function, subsequent
+      symbols go in the file symbol list.  */
+@@ -3180,7 +3640,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
+      as multiple lexical blocks?  Handling children in a sane way would
+      be nasty.  Might be easier to properly extend generic blocks to 
+      describe ranges.  */
+-  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu))
++  if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL))
+     return;
+   lowpc += baseaddr;
+   highpc += baseaddr;
+@@ -3216,6 +3676,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
+       dwarf2_record_block_ranges (die, block, baseaddr, cu);
+     }
+   local_symbols = new->locals;
++  using_directives = new->using_directives;
+ }
+ 
+ /* Get low and high pc attributes from DW_AT_ranges attribute value OFFSET.
+@@ -3351,7 +3812,8 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
+    discontinuous, i.e. derived from DW_AT_ranges information.  */
+ static int
+ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
+-		      CORE_ADDR *highpc, struct dwarf2_cu *cu)
++		      CORE_ADDR *highpc, struct dwarf2_cu *cu,
++		      struct partial_symtab *pst)
+ {
+   struct attribute *attr;
+   CORE_ADDR low = 0;
+@@ -3379,7 +3841,7 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
+ 	{
+ 	  /* Value of the DW_AT_ranges attribute is the offset in the
+ 	     .debug_ranges section.  */
+-	  if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, NULL))
++	  if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, pst))
+ 	    return 0;
+ 	  /* Found discontinuous range of addresses.  */
+ 	  ret = -1;
+@@ -3418,7 +3880,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die,
+   CORE_ADDR low, high;
+   struct die_info *child = die->child;
+ 
+-  if (dwarf2_get_pc_bounds (die, &low, &high, cu))
++  if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL))
+     {
+       *lowpc = min (*lowpc, low);
+       *highpc = max (*highpc, high);
+@@ -3455,7 +3917,7 @@ get_scope_pc_bounds (struct die_info *die,
+   CORE_ADDR best_high = (CORE_ADDR) 0;
+   CORE_ADDR current_low, current_high;
+ 
+-  if (dwarf2_get_pc_bounds (die, &current_low, &current_high, cu))
++  if (dwarf2_get_pc_bounds (die, &current_low, &current_high, cu, NULL))
+     {
+       best_low = current_low;
+       best_high = current_high;
+@@ -3750,8 +4212,14 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
+       if (fieldname == NULL)
+ 	return;
+ 
+-      /* Get physical name.  */
++      /* Get physical name.  We prefer the linkage name if one was specified,
++	 because this lets GDB find a non-debugging version of the symbol.
++	 Otherwise construct the full name from type information.  Ideally,
++	 when GDB supports canonicalization of C++ symbol names, we will not
++	 need the linkage name for anything.  */
+       physname = dwarf2_linkage_name (die, cu);
++      if (physname == NULL)
++	physname = (char *) dwarf2_full_name (die, cu);
+ 
+       /* The name is already allocated along with this objfile, so we don't
+ 	 need to duplicate it for the type.  */
+@@ -3881,8 +4349,14 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
+   if (fieldname == NULL)
+     return;
+ 
+-  /* Get the mangled name.  */
++  /* Get physical name.  We prefer the linkage name if one was specified,
++     because this lets GDB find a non-debugging version of the symbol.
++     Otherwise construct the full name from type information.  Ideally,
++     when GDB supports canonicalization of C++ symbol names, we will not
++     need the linkage name for anything.  */
+   physname = dwarf2_linkage_name (die, cu);
++  if (physname == NULL)
++    physname = (char *) dwarf2_full_name (die, cu);
+ 
+   /* Look up member function name in fieldlist.  */
+   for (i = 0; i < fip->nfnfields; i++)
+@@ -3926,7 +4400,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
    /* The name is already allocated along with this objfile, so we don't
       need to duplicate it for the type.  */
    fnp->physname = physname ? physname : "";
@@ -10151,7 +12000,7 @@ index 55868da..8a39bcf 100644
    this_type = read_type_die (die, cu);
    if (this_type && TYPE_CODE (this_type) == TYPE_CODE_FUNC)
      {
-@@ -4110,7 +4326,7 @@ quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4110,7 +4584,7 @@ quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu)
      return NULL;
  
    domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0));
@@ -10160,7 +12009,7 @@ index 55868da..8a39bcf 100644
    smash_to_method_type (type, domain_type, TYPE_TARGET_TYPE (pfn_type),
  			TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type),
  			TYPE_VARARGS (pfn_type));
-@@ -4147,7 +4363,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4147,7 +4621,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
    if (type)
      return type;
  
@@ -10169,7 +12018,7 @@ index 55868da..8a39bcf 100644
    INIT_CPLUS_SPECIFIC (type);
    name = dwarf2_name (die, cu);
    if (name != NULL)
-@@ -4360,7 +4576,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4360,7 +4834,7 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
    struct attribute *attr;
    const char *name;
  
@@ -10178,7 +12027,26 @@ index 55868da..8a39bcf 100644
  
    TYPE_CODE (type) = TYPE_CODE_ENUM;
    name = dwarf2_full_name (die, cu);
-@@ -4510,6 +4726,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4410,10 +4884,15 @@ determine_class_name (struct die_info *die, struct dwarf2_cu *cu)
+ 	{
+ 	  if (child->tag == DW_TAG_subprogram)
+ 	    {
+-	      char *phys_prefix
++	      char *phys_prefix;
++	      char *linkage_name = dwarf2_linkage_name (child, cu);
++
++	      if (linkage_name == NULL)
++		continue;
++
++	      phys_prefix
+ 		= language_class_name_from_physname (cu->language_defn,
+-						     dwarf2_linkage_name
+-						     (child, cu));
++						     linkage_name);
+ 
+ 	      if (phys_prefix != NULL)
+ 		{
+@@ -4510,6 +4989,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
    new_symbol (die, this_type, cu);
  }
  
@@ -10208,7 +12076,7 @@ index 55868da..8a39bcf 100644
  /* Extract all information from a DW_TAG_array_type DIE and put it in
     the DIE's type field.  For now, this only handles one dimensional
     arrays.  */
-@@ -4523,7 +4762,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4523,7 +5025,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
    struct type *element_type, *range_type, *index_type;
    struct type **range_types = NULL;
    struct attribute *attr;
@@ -10217,7 +12085,7 @@ index 55868da..8a39bcf 100644
    struct cleanup *back_to;
    char *name;
  
-@@ -4570,16 +4809,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4570,16 +5072,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
    type = element_type;
  
    if (read_array_order (die, cu) == DW_ORD_col_major)
@@ -10239,7 +12107,7 @@ index 55868da..8a39bcf 100644
  
    /* Understand Dwarf2 support for vector types (like they occur on
       the PowerPC w/ AltiVec).  Gcc just adds another attribute to the
-@@ -4646,12 +4880,14 @@ read_set_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4646,12 +5143,14 @@ read_set_type (struct die_info *die, struct dwarf2_cu *cu)
    return set_die_type (die, set_type, cu);
  }
  
@@ -10256,7 +12124,7 @@ index 55868da..8a39bcf 100644
    struct attribute *attr;
    struct symbol *sym;
    CORE_ADDR base = (CORE_ADDR) 0;
-@@ -4676,10 +4912,40 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4676,10 +5175,40 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
      }
    if (die->child != NULL)
      {
@@ -10297,7 +12165,7 @@ index 55868da..8a39bcf 100644
  	  attr = dwarf2_attr (child_die, DW_AT_data_member_location, cu);
  	  if (attr)
  	    {
-@@ -4687,8 +4953,25 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4687,8 +5216,25 @@ read_common_block (struct die_info *die, struct dwarf2_cu *cu)
  		base + decode_locdesc (DW_BLOCK (attr), cu);
  	      add_symbol_to_list (sym, &global_symbols);
  	    }
@@ -10323,7 +12191,18 @@ index 55868da..8a39bcf 100644
      }
  }
  
-@@ -4951,29 +5234,95 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -4756,9 +5302,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
+       if (is_anonymous)
+ 	{
+ 	  const char *previous_prefix = determine_prefix (die, cu);
+-	  cp_add_using_directive (TYPE_NAME (type),
+-				  strlen (previous_prefix),
+-				  strlen (TYPE_NAME (type)));
++	  cp_add_using_directive (previous_prefix, TYPE_NAME (type), "", "", dwarf2_read_decl_line(die, cu));
+ 	}
+     }
+ 
+@@ -4951,29 +5495,95 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
    struct objfile *objfile = cu->objfile;
    struct type *type, *range_type, *index_type, *char_type;
    struct attribute *attr;
@@ -10437,7 +12316,7 @@ index 55868da..8a39bcf 100644
    type = create_string_type (NULL, range_type);
  
    return set_die_type (die, type, cu);
-@@ -5067,7 +5416,6 @@ static struct type *
+@@ -5067,7 +5677,6 @@ static struct type *
  read_typedef (struct die_info *die, struct dwarf2_cu *cu)
  {
    struct objfile *objfile = cu->objfile;
@@ -10445,7 +12324,7 @@ index 55868da..8a39bcf 100644
    const char *name = NULL;
    struct type *this_type;
  
-@@ -5175,8 +5523,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5175,8 +5784,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
    struct type *base_type;
    struct type *range_type;
    struct attribute *attr;
@@ -10456,7 +12335,7 @@ index 55868da..8a39bcf 100644
    char *name;
    
    base_type = die_type (die, cu);
-@@ -5189,42 +5537,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5189,42 +5798,90 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
  		     0, NULL, cu->objfile);
      }
  
@@ -10577,7 +12456,7 @@ index 55868da..8a39bcf 100644
  
    name = dwarf2_name (die, cu);
    if (name)
-@@ -5386,10 +5782,13 @@ read_die_and_siblings (gdb_byte *info_ptr, bfd *abfd,
+@@ -5386,10 +6043,13 @@ read_die_and_siblings (gdb_byte *info_ptr, bfd *abfd,
  }
  
  /* Decompress a section that was compressed using zlib.  Store the
@@ -10593,7 +12472,7 @@ index 55868da..8a39bcf 100644
                           gdb_byte **outbuf, bfd_size_type *outsize)
  {
    bfd *abfd = objfile->obfd;
-@@ -5405,6 +5804,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -5405,6 +6065,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
    z_stream strm;
    int rc;
    int header_size = 12;
@@ -10601,7 +12480,7 @@ index 55868da..8a39bcf 100644
  
    if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
        || bfd_bread (compressed_buffer, compressed_size, abfd) != compressed_size)
-@@ -5434,8 +5834,13 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -5434,8 +6095,13 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
    strm.avail_in = compressed_size - header_size;
    strm.next_in = (Bytef*) compressed_buffer + header_size;
    strm.avail_out = uncompressed_size;
@@ -10617,7 +12496,7 @@ index 55868da..8a39bcf 100644
    rc = inflateInit (&strm);
    while (strm.avail_in > 0)
      {
-@@ -5456,6 +5861,8 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -5456,6 +6122,8 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
      error (_("Dwarf Error: concluding DWARF uncompression in '%s': %d"),
             bfd_get_filename (abfd), rc);
  
@@ -10626,7 +12505,7 @@ index 55868da..8a39bcf 100644
    xfree (compressed_buffer);
    *outbuf = uncompressed_buffer;
    *outsize = uncompressed_size;
-@@ -5463,17 +5870,20 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -5463,17 +6131,20 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
  }
  
  
@@ -10652,7 +12531,7 @@ index 55868da..8a39bcf 100644
  
    if (size == 0)
      return NULL;
-@@ -5486,30 +5896,49 @@ dwarf2_read_section (struct objfile *objfile, asection *sectp)
+@@ -5486,30 +6157,49 @@ dwarf2_read_section (struct objfile *objfile, asection *sectp)
        /* Upon decompression, update the buffer and its size.  */
        if (strncmp (header, "ZLIB", sizeof (header)) == 0)
          {
@@ -10705,7 +12584,23 @@ index 55868da..8a39bcf 100644
  /* In DWARF version 2, the description of the debugging information is
     stored in a separate .debug_abbrev section.  Before we read any
     dies from a section we read in all abbreviations and install them
-@@ -5945,10 +6374,23 @@ read_partial_die (struct partial_die_info *part_die,
+@@ -5914,15 +6604,6 @@ read_partial_die (struct partial_die_info *part_die,
+   struct attribute attr;
+   int has_low_pc_attr = 0;
+   int has_high_pc_attr = 0;
+-  CORE_ADDR base_address = 0;
+-  enum
+-    {
+-      base_address_none,
+-      base_address_low_pc,
+-      /* Overrides BASE_ADDRESS_LOW_PC.  */
+-      base_address_entry_pc
+-    }
+-  base_address_type = base_address_none;
+ 
+   memset (part_die, 0, sizeof (struct partial_die_info));
+ 
+@@ -5945,47 +6626,35 @@ read_partial_die (struct partial_die_info *part_die,
        switch (attr.name)
  	{
  	case DW_AT_name:
@@ -10713,6 +12608,10 @@ index 55868da..8a39bcf 100644
 -	  /* Prefer DW_AT_MIPS_linkage_name over DW_AT_name.  */
 -	  if (part_die->name == NULL)
 -	    part_die->name = DW_STRING (&attr);
+-	  break;
+-	case DW_AT_comp_dir:
+-	  if (part_die->dirname == NULL)
+-	    part_die->dirname = DW_STRING (&attr);
 +	  switch (part_die->tag)
 +	    {
 +	    case DW_TAG_compile_unit:
@@ -10731,9 +12630,99 @@ index 55868da..8a39bcf 100644
 +	      break;
 +	    }
  	  break;
- 	case DW_AT_comp_dir:
- 	  if (part_die->dirname == NULL)
-@@ -7512,10 +7954,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym,
+ 	case DW_AT_MIPS_linkage_name:
+-	  part_die->name = DW_STRING (&attr);
++	  part_die->linkage_name = DW_STRING (&attr);
+ 	  break;
+ 	case DW_AT_low_pc:
+ 	  has_low_pc_attr = 1;
+ 	  part_die->lowpc = DW_ADDR (&attr);
+-	  if (part_die->tag == DW_TAG_compile_unit
+-	      && base_address_type < base_address_low_pc)
+-	    {
+-	      base_address = DW_ADDR (&attr);
+-	      base_address_type = base_address_low_pc;
+-	    }
+ 	  break;
+ 	case DW_AT_high_pc:
+ 	  has_high_pc_attr = 1;
+ 	  part_die->highpc = DW_ADDR (&attr);
+ 	  break;
+-	case DW_AT_entry_pc:
+-	  if (part_die->tag == DW_TAG_compile_unit
+-	      && base_address_type < base_address_entry_pc)
+-	    {
+-	      base_address = DW_ADDR (&attr);
+-	      base_address_type = base_address_entry_pc;
+-	    }
+-	  break;
+-	case DW_AT_ranges:
+-	  if (part_die->tag == DW_TAG_compile_unit)
+-	    {
+-	      cu->ranges_offset = DW_UNSND (&attr);
+-	      cu->has_ranges_offset = 1;
+-	    }
+-	  break;
+ 	case DW_AT_location:
+           /* Support the .debug_loc offsets */
+           if (attr_form_is_block (&attr))
+@@ -6002,9 +6671,6 @@ read_partial_die (struct partial_die_info *part_die,
+ 						     "partial symbol information");
+             }
+ 	  break;
+-	case DW_AT_language:
+-	  part_die->language = DW_UNSND (&attr);
+-	  break;
+ 	case DW_AT_external:
+ 	  part_die->is_external = DW_UNSND (&attr);
+ 	  break;
+@@ -6029,10 +6695,6 @@ read_partial_die (struct partial_die_info *part_die,
+ 	    part_die->sibling = dwarf2_per_objfile->info_buffer
+ 	      + dwarf2_get_ref_die_offset (&attr);
+ 	  break;
+-        case DW_AT_stmt_list:
+-          part_die->has_stmt_list = 1;
+-          part_die->line_offset = DW_UNSND (&attr);
+-          break;
+         case DW_AT_byte_size:
+           part_die->has_byte_size = 1;
+           break;
+@@ -6074,13 +6736,6 @@ read_partial_die (struct partial_die_info *part_die,
+ 	  || dwarf2_per_objfile->has_section_at_zero))
+     part_die->has_pc_info = 1;
+ 
+-  if (base_address_type != base_address_none && !cu->base_known)
+-    {
+-      gdb_assert (part_die->tag == DW_TAG_compile_unit);
+-      cu->base_known = 1;
+-      cu->base_address = base_address;
+-    }
+-
+   return info_ptr;
+ }
+ 
+@@ -6173,7 +6828,9 @@ fixup_partial_die (struct partial_die_info *part_die,
+   /* If we found a reference attribute and the DIE has no name, try
+      to find a name in the referred to DIE.  */
+ 
+-  if (part_die->name == NULL && part_die->has_specification)
++  if (part_die->has_specification
++      && (part_die->name == NULL || part_die->linkage_name == NULL
++	  || !part_die->is_external))
+     {
+       struct partial_die_info *spec_die;
+ 
+@@ -6189,6 +6846,9 @@ fixup_partial_die (struct partial_die_info *part_die,
+ 	  if (spec_die->is_external)
+ 	    part_die->is_external = spec_die->is_external;
+ 	}
++
++      if (spec_die->linkage_name)
++	part_die->linkage_name = spec_die->linkage_name;
+     }
+ 
+   /* Set default names for some unnamed DIEs.  */
+@@ -7512,10 +8172,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym,
       (i.e. when the value of a register or memory location is
       referenced, or a thread-local block, etc.).  Then again, it might
       not be worthwhile.  I'm assuming that it isn't unless performance
@@ -10748,16 +12737,54 @@ index 55868da..8a39bcf 100644
  }
  
  /* Given a pointer to a DWARF information entry, figure out if we need
-@@ -7548,6 +7992,8 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -7538,20 +8200,43 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ 
+   if (die->tag != DW_TAG_namespace)
+-    name = dwarf2_linkage_name (die, cu);
++    name = dwarf2_name (die, cu);
+   else
+     name = TYPE_NAME (type);
+ 
+   if (name)
+     {
++      const char *linkagename;
++
+       sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
  					     sizeof (struct symbol));
        OBJSTAT (objfile, n_syms++);
        memset (sym, 0, sizeof (struct symbol));
 +      /* Some methods are called without checking SYMBOL_OPS validity.  */
 +      SYMBOL_OPS (sym) = &dwarf2_missing_funcs;
  
-       /* Cache this symbol's name and the name's demangled form (if any).  */
+-      /* Cache this symbol's name and the name's demangled form (if any).  */
        SYMBOL_LANGUAGE (sym) = cu->language;
-@@ -7637,7 +8083,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+-      SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
++
++      /* Cache this symbol's name and the name's demangled form (if any).  */
++
++      linkagename = dwarf2_linkage_name (die, cu);
++      if (linkagename)
++	/* We use the linkage name if available, for the same reason
++	   we used it for TYPE_FN_FIELD_PHYSNAME earlier in this file.
++	   This usage can be removed someday.  */
++	SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), objfile);
++      else if (die->tag == DW_TAG_namespace)
++	SYMBOL_SET_LINKAGE_NAME (sym, name);
++      else
++	{
++	  linkagename = dwarf2_full_name (die, cu);
++
++	  /* Set just the "linkage" name to the fully qualified name.
++	     While this is not really a linkage name, it should match
++	     the demangled version of the corresponding minimal symbol
++	     if there is one.  */
++	  SYMBOL_SET_LINKAGE_NAME (sym, (char *) linkagename);
++	}
+ 
+       /* Default assumptions.
+          Use the passed type or decode it from the die.  */
+@@ -7637,7 +8322,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  	  if (attr)
  	    {
  	      var_decode_location (attr, sym, cu);
@@ -10774,7 +12801,7 @@ index 55868da..8a39bcf 100644
  	      if (attr2 && (DW_UNSND (attr2) != 0))
  		add_symbol_to_list (sym, &global_symbols);
  	      else
-@@ -7780,6 +8234,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -7780,6 +8473,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  	  SYMBOL_CLASS (sym) = LOC_TYPEDEF;
  	  add_symbol_to_list (sym, &global_symbols);
  	  break;
@@ -10786,20 +12813,39 @@ index 55868da..8a39bcf 100644
  	default:
  	  /* Not a tag we recognize.  Hopefully we aren't processing
  	     trash data, but since we must specifically ignore things
-@@ -8192,10 +8651,29 @@ dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
+@@ -8128,6 +8826,19 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
+ 	     members; no typedefs, no member functions, et cetera.
+ 	     So it does not need a prefix.  */
+ 	  return "";
++
++      case DW_TAG_subprogram:
++	/* A class's symbol, or a variable's symbol, will live
++	   directly in a function's block, so no prefix is
++	   appropriate.  However, what about methods of a
++	   function-local class?  They end up in the global symbol
++	   table because they are separate functions... their mangling
++	   normally would make them inaccessible.  They'll show up
++	   wrong in breakpoints too.  This is a symptom of the
++	   inconsistent way we handle symbol tables.  Namespaces and
++	   classes should have dictionaries just like blocks do.  */
++	return "";
++
+       default:
+ 	return determine_prefix (parent, cu);
+       }
+@@ -8192,23 +8903,62 @@ dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
    attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
    if (attr && DW_STRING (attr))
      return DW_STRING (attr);
 -  attr = dwarf2_attr (die, DW_AT_name, cu);
 -  if (attr && DW_STRING (attr))
 -    return DW_STRING (attr);
--  return NULL;
-+  return dwarf2_name (die, cu);
-+}
-+
-+/* Get name of a die, return NULL if not found.  */
-+
-+static char *
+   return NULL;
+ }
+ 
+ /* Get name of a die, return NULL if not found.  */
+ 
+ static char *
 +dwarf2_canonicalize_name (char *name, struct dwarf2_cu *cu,
 +			  struct obstack *obstack)
 +{
@@ -10817,10 +12863,13 @@ index 55868da..8a39bcf 100644
 +    }
 +
 +  return name;
- }
- 
- /* Get name of a die, return NULL if not found.  */
-@@ -8206,9 +8684,29 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
++}
++
++/* Get name of a die, return NULL if not found.  */
++
++static char *
+ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
+ {
    struct attribute *attr;
  
    attr = dwarf2_attr (die, DW_AT_name, cu);
@@ -10853,7 +12902,7 @@ index 55868da..8a39bcf 100644
  }
  
  /* Return the die that this die in an extension of, or NULL if there
-@@ -8703,6 +9201,8 @@ dwarf_form_name (unsigned form)
+@@ -8703,6 +9453,8 @@ dwarf_form_name (unsigned form)
        return "DW_FORM_ref_udata";
      case DW_FORM_indirect:
        return "DW_FORM_indirect";
@@ -10862,7 +12911,7 @@ index 55868da..8a39bcf 100644
      default:
        return "DW_FORM_<unknown>";
      }
-@@ -9248,6 +9748,7 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
+@@ -9248,6 +10000,7 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
  	  break;
  	case DW_FORM_string:
  	case DW_FORM_strp:
@@ -10870,7 +12919,7 @@ index 55868da..8a39bcf 100644
  	  fprintf_unfiltered (f, "string: \"%s\"",
  		   DW_STRING (&die->attrs[i])
  		   ? DW_STRING (&die->attrs[i]) : "");
-@@ -9353,26 +9854,35 @@ dwarf2_get_ref_die_offset (struct attribute *attr)
+@@ -9353,26 +10106,35 @@ dwarf2_get_ref_die_offset (struct attribute *attr)
    return result;
  }
  
@@ -10900,7 +12949,7 @@ index 55868da..8a39bcf 100644
 -      return default_value;
 +      *val_return = DW_SND (attr);
 +      return dwarf2_attr_const;
-+    }
+     }
 +  if (attr->form == DW_FORM_udata
 +      || attr->form == DW_FORM_data1
 +      || attr->form == DW_FORM_data2
@@ -10909,7 +12958,7 @@ index 55868da..8a39bcf 100644
 +    {
 +      *val_return = DW_UNSND (attr);
 +      return dwarf2_attr_const;
-     }
++    }
 +  if (attr->form == DW_FORM_block
 +      || attr->form == DW_FORM_block1
 +      || attr->form == DW_FORM_block2
@@ -10921,7 +12970,7 @@ index 55868da..8a39bcf 100644
  }
  
  /* THIS_CU has a reference to PER_CU.  If necessary, load the new compilation
-@@ -9963,6 +10473,17 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -9963,6 +10725,17 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
  {
    gdb_byte *mac_ptr, *mac_end;
    struct macro_source_file *current_file = 0;
@@ -10939,7 +12988,7 @@ index 55868da..8a39bcf 100644
  
    if (dwarf2_per_objfile->macinfo_buffer == NULL)
      {
-@@ -9970,19 +10491,24 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -9970,19 +10743,24 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
        return;
      }
  
@@ -10968,7 +13017,7 @@ index 55868da..8a39bcf 100644
          }
  
        macinfo_type = read_1_byte (abfd, mac_ptr);
-@@ -9993,7 +10519,81 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -9993,7 +10771,81 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
            /* A zero macinfo type indicates the end of the macro
               information.  */
          case 0:
@@ -11051,7 +13100,7 @@ index 55868da..8a39bcf 100644
  
          case DW_MACINFO_define:
          case DW_MACINFO_undef:
-@@ -10008,19 +10608,31 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -10008,19 +10860,31 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
              mac_ptr += bytes_read;
  
              if (! current_file)
@@ -11094,7 +13143,7 @@ index 55868da..8a39bcf 100644
            }
            break;
  
-@@ -10034,9 +10646,22 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -10034,9 +10898,22 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
              file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
              mac_ptr += bytes_read;
  
@@ -11120,7 +13169,7 @@ index 55868da..8a39bcf 100644
            }
            break;
  
-@@ -10090,7 +10715,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+@@ -10090,7 +10967,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
            }
            break;
          }
@@ -11129,7 +13178,7 @@ index 55868da..8a39bcf 100644
  }
  
  /* Check if the attribute's form is a DW_FORM_block*
-@@ -10150,6 +10775,34 @@ attr_form_is_constant (struct attribute *attr)
+@@ -10150,6 +11027,34 @@ attr_form_is_constant (struct attribute *attr)
      }
  }
  
@@ -11164,7 +13213,7 @@ index 55868da..8a39bcf 100644
  static void
  dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
  			     struct dwarf2_cu *cu)
-@@ -10179,35 +10832,24 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
+@@ -10179,35 +11084,24 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
        SYMBOL_OPS (sym) = &dwarf2_loclist_funcs;
        SYMBOL_LOCATION_BATON (sym) = baton;
      }
@@ -11214,7 +13263,7 @@ index 55868da..8a39bcf 100644
      }
  }
  
-@@ -10482,6 +11124,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs)
+@@ -10482,6 +11376,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs)
    return ofs_lhs->offset == ofs_rhs->offset;
  }
  
@@ -11246,7 +13295,7 @@ index 55868da..8a39bcf 100644
  /* Set the type associated with DIE to TYPE.  Save it in CU's hash
     table if necessary.  For convenience, return TYPE.  */
  
-@@ -10490,6 +11157,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -10490,6 +11409,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  {
    struct dwarf2_offset_and_type **slot, ofs;
  
@@ -11288,16 +13337,18 @@ index ff220a2..13158f4 100644
    default_symfile_offsets,	/* sym_offsets:  Translate ext. to int. relocation */
    elf_symfile_segments,		/* sym_segments: Get segment information from
 diff --git a/gdb/eval.c b/gdb/eval.c
-index 1d35571..f3c9564 100644
+index 1d35571..b2a1931 100644
 --- a/gdb/eval.c
 +++ b/gdb/eval.c
-@@ -39,10 +39,14 @@
+@@ -39,10 +39,16 @@
  #include "exceptions.h"
  #include "regcache.h"
  #include "user-regs.h"
 +#include "python/python.h"
  #include "valprint.h"
 +#include "dwarf2loc.h"
++#include "gdb_obstack.h"
++#include "objfiles.h"
  
  #include "gdb_assert.h"
  
@@ -11306,7 +13357,72 @@ index 1d35571..f3c9564 100644
  /* This is defined in valops.c */
  extern int overload_resolution;
  
-@@ -671,6 +675,7 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -651,6 +657,64 @@ ptrmath_type_p (struct type *type)
+     }
+ }
+ 
++/* Compares the two method/function types T1 and T2 for "equality" 
++   with respect to the the methods' parameters. If the types of the
++   two parameter lists are the same, returns 1; 0 otherwise. This
++   comparison ignores any artificial this pointer. */
++int
++compare_parameters (struct type *t1, struct type *t2)
++{
++  int i, has_this;
++  /* Hacky: we don't know a priori whether or not t1 is a static
++     method, so we skip any artificial "this" pointer and hope
++     for the best. t2, which comes as user input, never contains a
++     "this" pointer (a user would never enter it into expressions. */
++  if (TYPE_NFIELDS (t1) > 0)
++    has_this = TYPE_FIELD_ARTIFICIAL (t1, 0) ? 1 : 0;
++  else
++    has_this = 0;
++
++  /* Special case: a method taking void. t1 will contain either
++     no fields or just "this". t2 will contain TYPE_CODE_VOID. */
++  if ((TYPE_NFIELDS (t1) - has_this) == 0 && TYPE_NFIELDS (t2) == 1
++      && TYPE_CODE (TYPE_FIELD_TYPE (t2, 0)) == TYPE_CODE_VOID)
++    return 1;
++
++  if ((TYPE_NFIELDS (t1) - has_this) == TYPE_NFIELDS (t2))
++    {
++      for (i = has_this; i < TYPE_NFIELDS (t1); ++i)
++	{
++	  if (rank_one_type (TYPE_FIELD_TYPE (t1, i),
++			     TYPE_FIELD_TYPE (t2, i - has_this))
++	      != 0)
++	    return 0;
++	}
++
++      return 1;
++    }
++
++  return 0;
++}
++
++/* Constructs a fake method with the given parameter types. */
++
++static struct type *
++make_params (int num_types, struct type **param_types)
++{
++  struct type *type = alloc_type (NULL, NULL);
++  TYPE_LENGTH (type) = 1;
++  TYPE_CODE (type) = TYPE_CODE_METHOD;
++  TYPE_NFIELDS (type) = num_types;
++  TYPE_FIELDS (type) = (struct field *)
++    TYPE_ALLOC (type, sizeof (struct field) * num_types);
++  memset (TYPE_FIELDS (type), 0, sizeof (struct field) * num_types);
++
++  while (num_types-- > 0)
++    TYPE_FIELD_TYPE (type, num_types) = param_types[num_types];
++
++  return type;
++}
++
+ struct value *
+ evaluate_subexp_standard (struct type *expect_type,
+ 			  struct expression *exp, int *pos,
+@@ -671,6 +735,7 @@ evaluate_subexp_standard (struct type *expect_type,
    long mem_offset;
    struct type **arg_types;
    int save_pos1;
@@ -11314,7 +13430,16 @@ index 1d35571..f3c9564 100644
  
    pc = (*pos)++;
    op = exp->elts[pc].opcode;
-@@ -1208,9 +1213,9 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -684,7 +749,7 @@ evaluate_subexp_standard (struct type *expect_type,
+ 	goto nosideret;
+       arg1 = value_aggregate_elt (exp->elts[pc + 1].type,
+ 				  &exp->elts[pc + 3].string,
+-				  0, noside);
++				  expect_type, 0, noside);
+       if (arg1 == NULL)
+ 	error (_("There is no field named %s"), &exp->elts[pc + 3].string);
+       return arg1;
+@@ -1208,9 +1273,9 @@ evaluate_subexp_standard (struct type *expect_type,
  	    if (TYPE_CODE (value_type (method)) != TYPE_CODE_FUNC)
  	      error (_("method address has symbol information with non-function type; skipping"));
  	    if (struct_return)
@@ -11326,7 +13451,68 @@ index 1d35571..f3c9564 100644
  	    called_method = method;
  	  }
  	else
-@@ -1434,7 +1439,7 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1284,7 +1349,6 @@ evaluate_subexp_standard (struct type *expect_type,
+       argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3));
+       if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
+ 	{
+-	  nargs++;
+ 	  /* First, evaluate the structure into arg2 */
+ 	  pc2 = (*pos)++;
+ 
+@@ -1308,21 +1372,40 @@ evaluate_subexp_standard (struct type *expect_type,
+ 
+ 	  arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
+ 
+-	  if (TYPE_CODE (check_typedef (value_type (arg1)))
+-	      != TYPE_CODE_METHODPTR)
+-	    error (_("Non-pointer-to-member value used in pointer-to-member "
+-		     "construct"));
+-
+-	  if (noside == EVAL_AVOID_SIDE_EFFECTS)
++	  type = check_typedef (value_type (arg1));
++	  switch (TYPE_CODE (type))
+ 	    {
+-	      struct type *method_type = check_typedef (value_type (arg1));
+-	      arg1 = value_zero (method_type, not_lval);
++	    case TYPE_CODE_METHODPTR:
++	      if (noside == EVAL_AVOID_SIDE_EFFECTS)
++		arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval);
++	      else
++		arg1 = cplus_method_ptr_to_value (&arg2, arg1);
++
++	      /* Now, say which argument to start evaluating from */
++	      nargs++;
++	      tem = 2;
++	      argvec[1] = arg2;
++	      break;
++
++	    case TYPE_CODE_MEMBERPTR:
++	      /* Now, convert these values to an address.  */
++	      arg2 = value_cast (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)),
++				 arg2);
++
++	      mem_offset = value_as_long (arg1);
++
++	      arg1 = value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
++					 value_as_long (arg2) + mem_offset);
++	      arg1 = value_ind (arg1);
++	      tem = 1;
++	      break;
++
++	    default:
++	      error (_("Non-pointer-to-member value used in pointer-to-member "
++		       "construct"));
+ 	    }
+-	  else
+-	    arg1 = cplus_method_ptr_to_value (&arg2, arg1);
+ 
+-	  /* Now, say which argument to start evaluating from */
+-	  tem = 2;
++	  argvec[0] = arg1;
+ 	}
+       else if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR)
+ 	{
+@@ -1434,7 +1517,7 @@ evaluate_subexp_standard (struct type *expect_type,
  	 	 of the ``this'' pointer if necessary, so modify argvec[1] to
  		 reflect any ``this'' changes.  */
  	      arg2 = value_from_longest (lookup_pointer_type(value_type (temp)),
@@ -11335,7 +13521,17 @@ index 1d35571..f3c9564 100644
  					 + value_embedded_offset (temp));
  	      argvec[1] = arg2;	/* the ``this'' pointer */
  	    }
-@@ -1512,6 +1517,9 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1448,8 +1531,7 @@ evaluate_subexp_standard (struct type *expect_type,
+ 	}
+       else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
+ 	{
+-	  argvec[1] = arg2;
+-	  argvec[0] = arg1;
++	  /* Pointer to member.  argvec is already set up.  */
+ 	}
+       else if (op == OP_VAR_VALUE)
+ 	{
+@@ -1512,6 +1594,9 @@ evaluate_subexp_standard (struct type *expect_type,
  	  else
  	    error (_("Expression of type other than \"Function returning ...\" used as function"));
  	}
@@ -11345,7 +13541,7 @@ index 1d35571..f3c9564 100644
        return call_function_by_hand (argvec[0], nargs, argvec + 1);
        /* pai: FIXME save value from call_function_by_hand, then adjust pc by adjust_fn_pc if +ve  */
  
-@@ -1529,7 +1537,10 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1529,7 +1614,10 @@ evaluate_subexp_standard (struct type *expect_type,
  
        /* First determine the type code we are dealing with.  */
        arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -11356,7 +13552,45 @@ index 1d35571..f3c9564 100644
        code = TYPE_CODE (type);
  
        if (code == TYPE_CODE_PTR)
-@@ -1963,13 +1974,19 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1696,6 +1784,37 @@ evaluate_subexp_standard (struct type *expect_type,
+ 	  error (_("non-pointer-to-member value used in pointer-to-member construct"));
+ 	}
+ 
++    case TYPE_INSTANCE:
++      nargs = longest_to_int (exp->elts[pc + 1].longconst);
++      arg_types = (struct type **) alloca (nargs * sizeof (struct type *));
++      for (ix = 0; ix < nargs; ++ix)
++	arg_types[ix] = exp->elts[pc + 1 + ix + 1].type;
++
++      expect_type = make_params (nargs, arg_types);
++      *(pos) += 3 + nargs;
++      return evaluate_subexp_standard (expect_type, exp, pos, noside);
++
++    case TYPE_INSTANCE_LOOKUP:
++      {
++	int i;
++	struct symbol *sym;
++	struct type **arg_types;
++	(*pos) += 3;
++	printf ("TYPE_INSTANCE_LOOKUP\n");
++	arg_types = (struct type **) alloca (TYPE_NFIELDS (expect_type)
++					     * sizeof (struct type *));
++	for (i = 0; i < TYPE_NFIELDS (expect_type); ++i)
++	  arg_types[i] = TYPE_FIELD_TYPE (expect_type, i);
++	(void) find_overload_match (arg_types, TYPE_NFIELDS (expect_type),
++				    NULL /* no need for name */,
++				    0 /* not method */,
++				    0 /* strict match */,
++				    NULL, exp->elts[pc + 1].symbol, NULL,
++				    &sym, NULL);
++	i = 0;
++      }
++      break;
++
+     case BINOP_CONCAT:
+       arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
+       arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
+@@ -1963,13 +2082,19 @@ evaluate_subexp_standard (struct type *expect_type,
        {
  	int subscript_array[MAX_FORTRAN_DIMS];
  	int array_size_array[MAX_FORTRAN_DIMS];
@@ -11376,7 +13610,7 @@ index 1d35571..f3c9564 100644
  	tmp_type = check_typedef (value_type (arg1));
  	ndimensions = calc_f77_array_dims (type);
  
-@@ -1999,6 +2016,9 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1999,6 +2124,9 @@ evaluate_subexp_standard (struct type *expect_type,
  	    upper = f77_get_upperbound (tmp_type);
  	    lower = f77_get_lowerbound (tmp_type);
  
@@ -11386,7 +13620,7 @@ index 1d35571..f3c9564 100644
  	    array_size_array[nargs - i - 1] = upper - lower + 1;
  
  	    /* Zero-normalize subscripts so that offsetting will work. */
-@@ -2017,17 +2037,25 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2017,17 +2145,25 @@ evaluate_subexp_standard (struct type *expect_type,
  	      tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type));
  	  }
  
@@ -11419,7 +13653,7 @@ index 1d35571..f3c9564 100644
  
  	/* Let us now play a dirty trick: we will take arg1 
  	   which is a value node pointing to the topmost level
-@@ -2037,7 +2065,7 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2037,7 +2173,7 @@ evaluate_subexp_standard (struct type *expect_type,
  	   returns the correct type value */
  
  	deprecated_set_value_type (arg1, tmp_type);
@@ -11428,7 +13662,7 @@ index 1d35571..f3c9564 100644
        }
  
      case BINOP_LOGICAL_AND:
-@@ -2475,7 +2503,17 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2475,7 +2611,17 @@ evaluate_subexp_standard (struct type *expect_type,
        if (noside == EVAL_SKIP)
          goto nosideret;
        else if (noside == EVAL_AVOID_SIDE_EFFECTS)
@@ -11447,7 +13681,16 @@ index 1d35571..f3c9564 100644
        else
          error (_("Attempt to use a type name as an expression"));
  
-@@ -2624,12 +2662,13 @@ evaluate_subexp_with_coercion (struct expression *exp,
+@@ -2568,7 +2714,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
+       (*pos) += 5 + BYTES_TO_EXP_ELEM (tem + 1);
+       x = value_aggregate_elt (exp->elts[pc + 1].type,
+ 			       &exp->elts[pc + 3].string,
+-			       1, noside);
++			       NULL, 1, noside);
+       if (x == NULL)
+ 	error (_("There is no field named %s"), &exp->elts[pc + 3].string);
+       return x;
+@@ -2624,12 +2770,13 @@ evaluate_subexp_with_coercion (struct expression *exp,
      {
      case OP_VAR_VALUE:
        var = exp->elts[pc + 2].symbol;
@@ -11462,7 +13705,7 @@ index 1d35571..f3c9564 100644
  	  return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
  			     val);
  	}
-@@ -2681,9 +2720,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
+@@ -2681,9 +2828,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
  
      case OP_VAR_VALUE:
        (*pos) += 4;
@@ -11517,10 +13760,36 @@ index 89bae03..f768940 100644
  	}
        else
 diff --git a/gdb/expression.h b/gdb/expression.h
-index 12163e3..978dc73 100644
+index 12163e3..789cb89 100644
 --- a/gdb/expression.h
 +++ b/gdb/expression.h
-@@ -435,4 +435,5 @@ extern char *op_string (enum exp_opcode);
+@@ -88,6 +88,16 @@ enum exp_opcode
+        when X is a pointer instead of an aggregate.  */
+     STRUCTOP_MPTR,
+ 
++    /* TYPE_INSTANCE is used when the user specifies a specific
++       type instantiation for overloaded methods/functions. The format
++       is: TYPE_INSTANCE num_types type0 ... typeN num_types TYPE_INSTANCE*/
++    TYPE_INSTANCE,
++
++    /* TYPE_INSTANCE_LOOKUP is used when the user specifies a specific
++       type instantiation of a function (not a method). In this case,
++       we must toss the results of the parser and manually do the lookup. */
++    TYPE_INSTANCE_LOOKUP,
++
+     /* end of C++.  */
+ 
+     /* For Modula-2 integer division DIV */
+@@ -426,6 +436,8 @@ enum noside
+ extern struct value *evaluate_subexp_standard
+   (struct type *, struct expression *, int *, enum noside);
+ 
++extern int compare_parameters (struct type *, struct type *);
++
+ /* From expprint.c */
+ 
+ extern void print_expression (struct expression *, struct ui_file *);
+@@ -435,4 +447,5 @@ extern char *op_string (enum exp_opcode);
  extern void dump_raw_expression (struct expression *, struct ui_file *, char *);
  extern void dump_prefix_expression (struct expression *, struct ui_file *);
  
@@ -14900,7 +17169,7 @@ index 7cacac1..a456228 100644
  
    vtbl = value_as_address (value_field (v, known_type_vptr_fieldno));
 diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
-index 3a52df3..ece910b 100644
+index 3a52df3..6cdf716 100644
 --- a/gdb/gnu-v3-abi.c
 +++ b/gdb/gnu-v3-abi.c
 @@ -269,8 +269,7 @@ gnuv3_rtti_type (struct value *value,
@@ -14913,6 +17182,36 @@ index 3a52df3..ece910b 100644
                                     + value_embedded_offset (vtable));
    if (! vtable_symbol)
      return NULL;
+@@ -487,10 +486,8 @@ gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset,
+ 		      LONGEST adjustment)
+ {
+   int i;
+-  const char *physname;
+ 
+   /* Search this class first.  */
+-  physname = NULL;
+   if (adjustment == 0)
+     {
+       int len;
+@@ -615,13 +612,15 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
+ 	{
+ 	  char *demangled_name = cplus_demangle (physname,
+ 						 DMGL_ANSI | DMGL_PARAMS);
+-	  if (demangled_name != NULL)
++	  fprintf_filtered (stream, "&virtual ");
++	  if (demangled_name == NULL)
++	    fputs_filtered (physname, stream);
++	  else
+ 	    {
+-	      fprintf_filtered (stream, "&virtual ");
+ 	      fputs_filtered (demangled_name, stream);
+ 	      xfree (demangled_name);
+-	      return;
+ 	    }
++	  return;
+ 	}
+     }
+ 
 diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c
 index 2366474..f83de32 100644
 --- a/gdb/i386-linux-nat.c
@@ -15223,7 +17522,7 @@ index 0a17dab..d48f4b1 100644
       this function should probably be moved into target_pre_inferior.  */
    target_pre_inferior (from_tty);
 diff --git a/gdb/infrun.c b/gdb/infrun.c
-index e5c2971..cdc4303 100644
+index ee5f987..2f627ea 100644
 --- a/gdb/infrun.c
 +++ b/gdb/infrun.c
 @@ -1046,7 +1046,7 @@ a command like `return' or `jump' to continue execution."));
@@ -15256,7 +17555,7 @@ index e5c2971..cdc4303 100644
    pending_follow.kind = TARGET_WAITKIND_SPURIOUS;	/* I.e., none. */
  
    clear_proceed_status ();
-@@ -2129,6 +2134,50 @@ ensure_not_running (void)
+@@ -2155,6 +2160,50 @@ ensure_not_running (void)
      error_is_running ();
  }
  
@@ -15307,7 +17606,7 @@ index e5c2971..cdc4303 100644
  /* Given an execution control state that has been freshly filled in
     by an event from the inferior, figure out what it means and take
     appropriate action.  */
-@@ -2423,9 +2472,11 @@ handle_inferior_event (struct execution_control_state *ecs)
+@@ -2449,9 +2498,11 @@ handle_inferior_event (struct execution_control_state *ecs)
      case TARGET_WAITKIND_SYSCALL_ENTRY:
        if (debug_infrun)
          fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_ENTRY\n");
@@ -15322,7 +17621,7 @@ index e5c2971..cdc4303 100644
  
        /* Before examining the threads further, step this thread to
           get it entirely out of the syscall.  (We get notice of the
-@@ -2435,9 +2486,10 @@ handle_inferior_event (struct execution_control_state *ecs)
+@@ -2461,9 +2512,10 @@ handle_inferior_event (struct execution_control_state *ecs)
      case TARGET_WAITKIND_SYSCALL_RETURN:
        if (debug_infrun)
          fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SYSCALL_RETURN\n");
@@ -15336,7 +17635,7 @@ index e5c2971..cdc4303 100644
  
      case TARGET_WAITKIND_STOPPED:
        if (debug_infrun)
-@@ -5140,6 +5192,25 @@ inferior_has_execd (ptid_t pid, char **execd_pathname)
+@@ -5166,6 +5218,25 @@ inferior_has_execd (ptid_t pid, char **execd_pathname)
    return 1;
  }
  
@@ -15575,6 +17874,45 @@ index 85826fd..e5f80ab 100644
  #define LA_GET_STRING(value, buffer, length, encoding) \
    (current_language->la_get_string(value, buffer, length, encoding))
  
+diff --git a/gdb/linespec.c b/gdb/linespec.c
+index 6579d42..b3ae6c0 100644
+--- a/gdb/linespec.c
++++ b/gdb/linespec.c
+@@ -842,13 +842,33 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+     }
+   else if (paren_pointer != NULL)
+     {
+-      p = paren_pointer + 1;
++      /* We need to deal with method and function overloads
++	 with no parameters. Gdb and gcc (and who knows about other
++	 compilers) are very inconsistent with the keyword "void".
++	 Canonicalizing C++ types is insufficient in this case, since
++	 we still need to enforce the presence (or lack thereof) of
++	 "void". For simplicity, omit the keyword "void" if present. */
++      if (strncmp (paren_pointer - 5, "(void)", 6) == 0)
++	{
++	  char *a, *b;
++	  a = paren_pointer - 4;
++	  b = paren_pointer;
++	  while ((*(a++) = *(b++)) != '\0') ;
++	  *a = '\0';
++	  p = paren_pointer - 3;
++	}
++      else
++	p = paren_pointer + 1;
+     }
+   else
+     {
+       p = skip_quoted (*argptr);
+     }
+ 
++  /* Make sure we keep important kewords like "const" */
++  if (strncmp (p, " const", 6) == 0)
++    p += 6;
++
+   copy = (char *) alloca (p - *argptr + 1);
+   memcpy (copy, *argptr, p - *argptr);
+   copy[p - *argptr] = '\0';
 diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
 index 12b786e..e30bf9a 100644
 --- a/gdb/linux-nat.c
@@ -16592,6 +18930,78 @@ index b905a9e..eaa5f12 100644
  
    current_token = xstrdup (parse->token);
    cleanup = make_cleanup (free_current_contents, &current_token);
+diff --git a/gdb/minsyms.c b/gdb/minsyms.c
+index bf776b3..e4b0f31 100644
+--- a/gdb/minsyms.c
++++ b/gdb/minsyms.c
+@@ -48,6 +48,8 @@
+ #include "value.h"
+ #include "cp-abi.h"
+ #include "target.h"
++#include "cp-support.h"
++#include "language.h"
+ 
+ /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE.
+    At the end, copy them all into one newly allocated location on an objfile's
+@@ -187,6 +189,9 @@ lookup_minimal_symbol (const char *name, const char *sfile,
+   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
+   unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
+ 
++  int needtofreename = 0;
++  const char *modified_name;
++
+   if (sfile != NULL)
+     {
+       char *p = strrchr (sfile, '/');
+@@ -194,6 +199,18 @@ lookup_minimal_symbol (const char *name, const char *sfile,
+ 	sfile = p + 1;
+     }
+ 
++  /* For C++, canonicalize the input name. */
++  modified_name = name;
++  if (current_language->la_language == language_cplus)
++    {
++      char *cname = cp_canonicalize_string (name);
++      if (cname)
++	{
++	  modified_name = cname;
++	  needtofreename = 1;
++	}
++    }
++
+   for (objfile = object_files;
+        objfile != NULL && found_symbol == NULL;
+        objfile = objfile->next)
+@@ -218,9 +235,16 @@ lookup_minimal_symbol (const char *name, const char *sfile,
+ 		  int match;
+ 
+ 		  if (pass == 1)
+-		    match = strcmp (SYMBOL_LINKAGE_NAME (msymbol), name) == 0;
++		    {
++		      match = strcmp (SYMBOL_LINKAGE_NAME (msymbol),
++				      modified_name) == 0;
++		    }
+ 		  else
+-		    match = SYMBOL_MATCHES_SEARCH_NAME (msymbol, name);
++		    {
++		      match = SYMBOL_MATCHES_SEARCH_NAME (msymbol,
++							  modified_name);
++		    }
++
+ 		  if (match)
+ 		    {
+                     switch (MSYMBOL_TYPE (msymbol))
+@@ -259,6 +283,10 @@ lookup_minimal_symbol (const char *name, const char *sfile,
+ 	    }
+ 	}
+     }
++
++  if (needtofreename)
++    xfree ((void *) modified_name);
++
+   /* External symbols are best.  */
+   if (found_symbol)
+     return found_symbol;
 diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
 index 6c8c4c0..7d283a4 100644
 --- a/gdb/mips-tdep.c
@@ -17001,7 +19411,7 @@ index 27ae619..29f0e6d 100644
        return;
      }
 diff --git a/gdb/parse.c b/gdb/parse.c
-index eee1f8e..96dc1c5 100644
+index eee1f8e..66aaf6a 100644
 --- a/gdb/parse.c
 +++ b/gdb/parse.c
 @@ -306,7 +306,7 @@ write_exp_elt_intern (struct internalvar *expelt)
@@ -17079,6 +19489,22 @@ index eee1f8e..96dc1c5 100644
  /* Add a bitstring constant to the end of the expression.
  
     Bitstring constants are stored by first writing an expression element
+@@ -777,6 +836,15 @@ operator_length_standard (struct expression *expr, int endpos,
+       args = 1 + longest_to_int (expr->elts[endpos - 2].longconst);
+       break;
+ 
++    case TYPE_INSTANCE:
++      oplen = 4 + longest_to_int (expr->elts[endpos - 2].longconst);
++      args = 1;
++      break;
++
++    case TYPE_INSTANCE_LOOKUP:
++      oplen = 3;
++      break;
++
+     case OP_OBJC_MSGCALL:	/* Objective C message (method) call */
+       oplen = 4;
+       args = 1 + longest_to_int (expr->elts[endpos - 2].longconst);
 diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
 index 2c4b755..cbda9c3 100644
 --- a/gdb/parser-defs.h
@@ -20013,10 +22439,10 @@ index 36cde34..e6e3ac0 100644
  
 diff --git a/gdb/python/python-frame.c b/gdb/python/python-frame.c
 new file mode 100644
-index 0000000..ef1c178
+index 0000000..7305199
 --- /dev/null
 +++ b/gdb/python/python-frame.c
-@@ -0,0 +1,656 @@
+@@ -0,0 +1,668 @@
 +/* Python interface to stack frames
 +
 +   Copyright (C) 2008, 2009 Free Software Foundation, Inc.
@@ -20420,7 +22846,7 @@ index 0000000..ef1c178
 +{
 +  struct frame_info *frame;
 +  PyObject *sym_obj;
-+  struct symbol *var;
++  struct symbol *var = NULL;	/* gcc-4.3.2 false warning.  */
 +  struct value *val = NULL;
 +  volatile struct gdb_exception except;
 +
@@ -20432,20 +22858,32 @@ index 0000000..ef1c178
 +  else if (gdbpy_is_string (sym_obj))
 +    {
 +      char *var_name;
-+      struct block *block;
++      struct block *block = NULL;
++      struct cleanup *cleanup;
 +      volatile struct gdb_exception except;
 +
++      var_name = python_string_to_target_string (sym_obj);
++      cleanup = make_cleanup (xfree, var_name);
++
 +      TRY_CATCH (except, RETURN_MASK_ALL)
 +	{
-+	  struct block *block;
-+
 +	  FRAPY_REQUIRE_VALID ((frame_object *) self, frame);
 +
 +	  block = block_for_pc (get_frame_address_in_block (frame));
-+	  var = lookup_symbol (python_string_to_target_string (sym_obj), block,
-+			       VAR_DOMAIN, NULL);
++	  var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL);
 +	}
 +      GDB_PY_HANDLE_EXCEPTION (except);
++
++      if (!var)
++	{
++	  PyErr_Format (PyExc_ValueError,
++			_("variable '%s' not found"), var_name);
++	  do_cleanups (cleanup);
++
++	  return NULL;
++	}
++
++      do_cleanups (cleanup);
 +    }
 +  else
 +    {
@@ -20592,7 +23030,7 @@ index 0000000..ef1c178
 +  if (PyType_Ready (&frame_object_type) < 0)
 +    return;
 +
-+  /* FIXME: These would probably be best exposed as class attributes of Frame,
++  /* Note: These would probably be best exposed as class attributes of Frame,
 +     but I don't know how to do it except by messing with the type's dictionary.
 +     That seems too messy.  */
 +  PyModule_AddIntConstant (gdb_module, "NORMAL_FRAME", NORMAL_FRAME);
@@ -21057,7 +23495,7 @@ index 02dbfc4..4aae0aa 100644
  #endif /* GDB_PYTHON_INTERNAL_H */
 diff --git a/gdb/python/python-membuf.c b/gdb/python/python-membuf.c
 new file mode 100644
-index 0000000..04bf3b4
+index 0000000..57836f9
 --- /dev/null
 +++ b/gdb/python/python-membuf.c
 @@ -0,0 +1,227 @@
@@ -21189,7 +23627,7 @@ index 0000000..04bf3b4
 +  membuf_object *membuf_obj = (membuf_object *) self;
 +
 +  return PyString_FromFormat ("memory buffer for address %p, %u bytes long",
-+			      (void *) membuf_obj->addr,
++			      (void *) (uintptr_t) membuf_obj->addr,
 +			      (unsigned int) membuf_obj->length);
 +}
 +
@@ -22789,7 +25227,7 @@ index 0000000..a48c38c
 +};
 diff --git a/gdb/python/python-type.c b/gdb/python/python-type.c
 new file mode 100644
-index 0000000..c39ff27
+index 0000000..772a011
 --- /dev/null
 +++ b/gdb/python/python-type.c
 @@ -0,0 +1,821 @@
@@ -23372,7 +25810,7 @@ index 0000000..c39ff27
 +  obj->type = type;
 +  type_incref (type);
 +  obj->prev = NULL;
-+  if (type && TYPE_OBJFILE (type))
++  if (type && !OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (type)))
 +    {
 +      struct objfile *objfile = TYPE_OBJFILE (type);
 +
@@ -23436,7 +25874,7 @@ index 0000000..c39ff27
 +
 +  if (type->prev)
 +    type->prev->next = type->next;
-+  else if (type->type && TYPE_OBJFILE (type->type))
++  else if (type->type && !OBJFILE_IS_VIRTUAL (TYPE_OBJFILE (type->type)))
 +    {
 +      /* Must reset head of list.  */
 +      struct objfile *objfile = TYPE_OBJFILE (type->type);
@@ -23869,7 +26307,7 @@ index bc077b6..de54b9d 100644
  };
  
 diff --git a/gdb/python/python.c b/gdb/python/python.c
-index b3a27d6..a38ea92 100644
+index b3a27d6..18578f0 100644
 --- a/gdb/python/python.c
 +++ b/gdb/python/python.c
 @@ -22,6 +22,12 @@
@@ -25402,12 +27840,8 @@ index b3a27d6..a38ea92 100644
  #ifdef HAVE_PYTHON
    Py_Initialize ();
    PyEval_InitThreads ();
-@@ -410,11 +1768,32 @@ Enables or disables printing of Python stack traces."),
-   PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
-   PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name);
+@@ -412,9 +1770,28 @@ Enables or disables printing of Python stack traces."),
    PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_name);
-+  if (gdb_datadir)
-+    PyModule_AddStringConstant (gdb_module, "datadir", gdb_datadir);
  
    gdbpy_initialize_values ();
 +  gdbpy_initialize_breakpoints ();
@@ -25435,22 +27869,21 @@ index b3a27d6..a38ea92 100644
  
    gdbpy_doc_cst = PyString_FromString ("__doc__");
  
-@@ -442,6 +1821,14 @@ class GdbOutputFile:\n\
+@@ -442,6 +1819,13 @@ class GdbOutputFile:\n\
  \n\
  sys.stderr = GdbOutputFile()\n\
  sys.stdout = GdbOutputFile()\n\
-+if hasattr (gdb, 'datadir'):\n\
-+  gdb.pythonlibdir = gdb.datadir + '/python'\n\
-+  sys.path.insert(0, gdb.pythonlibdir)\n\
-+  gdb.__path__ = [gdb.pythonlibdir + '/gdb']\n\
-+  from os.path import exists\n\
-+  ipy = gdb.pythonlibdir + '/gdb/__init__.py'\n\
-+  if exists (ipy):\n\
-+    execfile (ipy)\n\
++# FIXME: gdb.pythonlibdir is deprecated as it is just the standard libdir.\n\
++gdb.pythonlibdir = '" GDB_PYTHONDIR_PATH "'\n\
++gdb.__path__ = [gdb.pythonlibdir + '/gdb']\n\
++from os.path import exists\n\
++ipy = gdb.pythonlibdir + '/gdb/__init__.py'\n\
++if exists (ipy):\n\
++  execfile (ipy)\n\
  ");
  
    /* Release the GIL while gdb runs.  */
-@@ -461,9 +1848,74 @@ static PyMethodDef GdbMethods[] =
+@@ -461,9 +1845,74 @@ static PyMethodDef GdbMethods[] =
      "Get a value from history" },
    { "execute", execute_gdb_command, METH_VARARGS,
      "Execute a gdb command" },
@@ -25545,6 +27978,98 @@ index e63c447..767af86 100644
 +			      const struct language_defn *language);
 +
  #endif /* GDB_PYTHON_H */
+diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
+index 926d0b6..1c59a42 100644
+--- a/gdb/rs6000-tdep.c
++++ b/gdb/rs6000-tdep.c
+@@ -117,6 +117,9 @@ static const char *powerpc_vector_strings[] =
+   NULL
+ };
+ 
++/* The configurable `disassemble_info.disassembler_options' string.  */
++static char *disassembler_options;
++
+ /* A variable that can be configured by the user.  */
+ static enum powerpc_vector_abi powerpc_vector_abi_global = POWERPC_VEC_AUTO;
+ static const char *powerpc_vector_abi_string = "auto";
+@@ -2993,15 +2996,17 @@ find_variant_by_arch (enum bfd_architecture arch, unsigned long mach)
+ }
+ 
+ static int
+-gdb_print_insn_powerpc (bfd_vma memaddr, disassemble_info *info)
++gdb_print_insn_powerpc (bfd_vma memaddr, disassemble_info *info_pointer)
+ {
+-  if (!info->disassembler_options)
+-    info->disassembler_options = "any";
++  disassemble_info info = *info_pointer;
+ 
+-  if (info->endian == BFD_ENDIAN_BIG)
+-    return print_insn_big_powerpc (memaddr, info);
++  if (disassembler_options && disassembler_options[0])
++    info.disassembler_options = disassembler_options;
++    
++  if (info.endian == BFD_ENDIAN_BIG)
++    return print_insn_big_powerpc (memaddr, &info);
+   else
+-    return print_insn_little_powerpc (memaddr, info);
++    return print_insn_little_powerpc (memaddr, &info);
+ }
+ \f
+ static CORE_ADDR
+@@ -3326,7 +3331,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+   enum bfd_architecture arch;
+   unsigned long mach;
+   bfd abfd;
+-  asection *sect;
+   enum auto_boolean soft_float_flag = powerpc_soft_float_global;
+   int soft_float;
+   enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global;
+@@ -3375,26 +3379,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+   arch = info.bfd_arch_info->arch;
+   mach = info.bfd_arch_info->mach;
+ 
+-  /* For e500 executables, the apuinfo section is of help here.  Such
+-     section contains the identifier and revision number of each
+-     Application-specific Processing Unit that is present on the
+-     chip.  The content of the section is determined by the assembler
+-     which looks at each instruction and determines which unit (and
+-     which version of it) can execute it. In our case we just look for
+-     the existance of the section.  */
+-
+-  if (info.abfd)
+-    {
+-      sect = bfd_get_section_by_name (info.abfd, ".PPC.EMB.apuinfo");
+-      if (sect)
+-	{
+-	  arch = info.bfd_arch_info->arch;
+-	  mach = bfd_mach_ppc_e500;
+-	  bfd_default_set_arch_mach (&abfd, arch, mach);
+-	  info.bfd_arch_info = bfd_get_arch_info (&abfd);
+-	}
+-    }
+-
+   /* Find a default target description which describes our register
+      layout, if we do not already have one.  */
+   if (! tdesc_has_registers (tdesc))
+@@ -4058,4 +4042,18 @@ _initialize_rs6000_tdep (void)
+ 			_("Show the vector ABI."),
+ 			NULL, powerpc_set_vector_abi, NULL,
+ 			&setpowerpccmdlist, &showpowerpccmdlist);
++
++  /* Arches list is taken from opcodes/ppc-dis.c powerpc_init_dialect.  */
++  disassembler_options = xstrdup ("any");
++  add_setshow_string_cmd ("disassembler-options", class_support,
++			  &disassembler_options, _("\
++Pass the text on to disassembler."), _("\
++Show the text passed on to disassembler."), _("\
++This is the objdump option -M to specify the PowerPC model.  The possible\n\
++(sub)strings are: ppcps, booke, e500mc, e500, efs, e300, 440, 464, power4,\n\
++power5, cell, power6, power7, vsx, any, 32 and 64.  Unlike objdump GDB uses\n\
++the default value `any'."),
++			  NULL,
++			  NULL,
++			  &setpowerpccmdlist, &showpowerpccmdlist);
+ }
 diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c
 index 345befd..e2568c8 100644
 --- a/gdb/scm-lang.c
@@ -25595,7 +28120,7 @@ index f0a7642..a32add5 100644
  	}
        else if (SCM_IFLAGP (svalue)
 diff --git a/gdb/stabsread.c b/gdb/stabsread.c
-index 2d7eb15..4cd33ed 100644
+index 2d7eb15..7423b32 100644
 --- a/gdb/stabsread.c
 +++ b/gdb/stabsread.c
 @@ -322,7 +322,7 @@ dbx_alloc_type (int typenums[2], struct objfile *objfile)
@@ -25624,11 +28149,27 @@ index 2d7eb15..4cd33ed 100644
  
    /* We would like to eliminate nameless symbols, but keep their types.
       E.g. stab entry ":t10=*2" should produce a type 10, which is a pointer
-@@ -683,9 +684,21 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
+@@ -683,9 +684,37 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
      {
      normal:
        SYMBOL_LANGUAGE (sym) = current_subfile->language;
 -      SYMBOL_SET_NAMES (sym, string, p - string, objfile);
++      if (current_subfile->language == language_cplus)
++	{
++	  char *name = alloca (p - string + 1);
++	  memcpy (name, string, p - string);
++	  name[p - string] = '\0';
++	  new_name = cp_canonicalize_string (name);
++	}
++
++      if (new_name != NULL)
++	{
++	  SYMBOL_SET_NAMES (sym, new_name, strlen (new_name), objfile);
++	  xfree (new_name);
++	}
++      else
++	SYMBOL_SET_NAMES (sym, string, p - string, objfile);
++
        if (SYMBOL_LANGUAGE (sym) == language_cplus)
 -	cp_scan_for_anonymous_namespaces (sym);
 +	{
@@ -25648,7 +28189,7 @@ index 2d7eb15..4cd33ed 100644
      }
    p++;
  
-@@ -1519,18 +1532,35 @@ again:
+@@ -1519,18 +1548,35 @@ again:
  	      if (*p != ':')
  		return error_type (pp, objfile);
  	    }
@@ -25974,7 +28515,7 @@ index 973a57f..56b1d91 100644
 +
  #endif /* #ifndef STACK_H */
 diff --git a/gdb/symfile.c b/gdb/symfile.c
-index 63b5c1d..a95a8c1 100644
+index 63b5c1d..8ca5457 100644
 --- a/gdb/symfile.c
 +++ b/gdb/symfile.c
 @@ -929,6 +929,17 @@ new_symfile_objfile (struct objfile *objfile, int mainline, int verbo)
@@ -26060,8 +28601,27 @@ index 63b5c1d..a95a8c1 100644
  	      /* We're done reading the symbol file; finish off complaints.  */
  	      clear_complaints (&symfile_complaints, 0, 1);
  
+@@ -2726,7 +2744,7 @@ allocate_symtab (char *filename, struct objfile *objfile)
+ }
+ 
+ struct partial_symtab *
+-allocate_psymtab (char *filename, struct objfile *objfile)
++allocate_psymtab (const char *filename, struct objfile *objfile)
+ {
+   struct partial_symtab *psymtab;
+ 
+@@ -3040,7 +3058,8 @@ again2:
+ 
+ struct partial_symtab *
+ start_psymtab_common (struct objfile *objfile,
+-		      struct section_offsets *section_offsets, char *filename,
++		      struct section_offsets *section_offsets,
++		      const char *filename,
+ 		      CORE_ADDR textlow, struct partial_symbol **global_syms,
+ 		      struct partial_symbol **static_syms)
+ {
 diff --git a/gdb/symfile.h b/gdb/symfile.h
-index 88f8326..109fadc 100644
+index 88f8326..50671c1 100644
 --- a/gdb/symfile.h
 +++ b/gdb/symfile.h
 @@ -140,6 +140,12 @@ struct sym_fns
@@ -26077,6 +28637,24 @@ index 88f8326..109fadc 100644
    /* Called when we are finished with an objfile.  Should do all
       cleanup that is specific to the object file format for the
       particular objfile.  */
+@@ -250,7 +256,7 @@ extern void free_section_addr_info (struct section_addr_info *);
+ 
+ extern struct partial_symtab *start_psymtab_common (struct objfile *,
+ 						    struct section_offsets *,
+-						    char *, CORE_ADDR,
++						    const char *, CORE_ADDR,
+ 						    struct partial_symbol **,
+ 						    struct partial_symbol **);
+ 
+@@ -300,7 +306,7 @@ extern int auto_solib_limit;
+ 
+ extern void set_initial_language (void);
+ 
+-extern struct partial_symtab *allocate_psymtab (char *, struct objfile *);
++extern struct partial_symtab *allocate_psymtab (const char *, struct objfile *);
+ 
+ extern void discard_psymtab (struct partial_symtab *);
+ 
 @@ -369,7 +375,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data);
  /* From dwarf2read.c */
  
@@ -26087,10 +28665,18 @@ index 88f8326..109fadc 100644
  extern void dwarf2_build_frame_info (struct objfile *);
  
 diff --git a/gdb/symtab.c b/gdb/symtab.c
-index d51c7aa..559f436 100644
+index d2ba1f3..593cded 100644
 --- a/gdb/symtab.c
 +++ b/gdb/symtab.c
-@@ -55,6 +55,7 @@
+@@ -42,6 +42,7 @@
+ #include "ada-lang.h"
+ #include "p-lang.h"
+ #include "addrmap.h"
++#include "cp-support.h"
+ 
+ #include "hashtab.h"
+ 
+@@ -55,6 +56,7 @@
  #include "gdb_stat.h"
  #include <ctype.h>
  #include "cp-abi.h"
@@ -26098,7 +28684,7 @@ index d51c7aa..559f436 100644
  #include "observer.h"
  #include "gdb_assert.h"
  #include "solist.h"
-@@ -273,7 +274,7 @@ lookup_partial_symtab (const char *name)
+@@ -273,7 +275,7 @@ lookup_partial_symtab (const char *name)
        make_cleanup (xfree, real_path);
      }
  
@@ -26107,7 +28693,7 @@ index d51c7aa..559f436 100644
    {
      if (FILENAME_CMP (name, pst->filename) == 0)
        {
-@@ -870,7 +871,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
+@@ -870,7 +872,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
       than the later used TEXTLOW/TEXTHIGH one.  */
  
    ALL_OBJFILES (objfile)
@@ -26122,7 +28708,7 @@ index d51c7aa..559f436 100644
        {
  	struct partial_symtab *pst;
  
-@@ -903,6 +910,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
+@@ -903,6 +911,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
  	    return pst;
  	  }
        }
@@ -26130,7 +28716,7 @@ index d51c7aa..559f436 100644
  
    /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
       which still have no corresponding full SYMTABs read.  But it is not
-@@ -1170,6 +1178,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
+@@ -1170,6 +1179,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
    return psym;
  }
  
@@ -26153,7 +28739,19 @@ index d51c7aa..559f436 100644
  /* Find the definition for a specified symbol name NAME
     in domain DOMAIN, visible from lexical block BLOCK.
     Returns the struct symbol pointer, or zero if no symbol is found.
-@@ -1213,6 +1237,17 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+@@ -1200,6 +1225,11 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+   int needtofreename = 0;
+   struct symbol *returnval;
+ 
++  if(strncmp(name, "::", 2) == 0){/* this must be a global name */
++    name = name+2;
++    block = NULL;
++  }
++  
+   modified_name = name;
+ 
+   /* If we are using C++ or Java, demangle the name before doing a lookup, so
+@@ -1213,6 +1243,17 @@ lookup_symbol_in_language (const char *name, const struct block *block,
  	  modified_name = demangled_name;
  	  needtofreename = 1;
  	}
@@ -26171,7 +28769,35 @@ index d51c7aa..559f436 100644
      }
    else if (lang == language_java)
      {
-@@ -1450,6 +1485,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile,
+@@ -1361,22 +1402,23 @@ lookup_symbol_aux_local (const char *name, const char *linkage_name,
+ 			 const domain_enum domain)
+ {
+   struct symbol *sym;
+-  const struct block *static_block = block_static_block (block);
++  const struct block *global_block = block_global_block (block);
+ 
+   /* Check if either no block is specified or it's a global block.  */
+ 
+-  if (static_block == NULL)
++  if (global_block == NULL)
+     return NULL;
+ 
+-  while (block != static_block)
++  while (block != global_block)
+     {
+       sym = lookup_symbol_aux_block (name, linkage_name, block, domain);
+       if (sym != NULL)
+ 	return sym;
++    
+       block = BLOCK_SUPERBLOCK (block);
+     }
+ 
+-  /* We've reached the static block without finding a result.  */
++  /* We've reached the global block without finding a result.  */
+ 
+   return NULL;
+ }
+@@ -1450,6 +1492,7 @@ lookup_global_symbol_from_objfile (const struct objfile *objfile,
    }
  
    /* Now go through psymtabs.  */
@@ -26179,7 +28805,7 @@ index d51c7aa..559f436 100644
    ALL_OBJFILE_PSYMTABS (objfile, ps)
    {
      if (!ps->readin
-@@ -1520,7 +1556,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
+@@ -1520,7 +1563,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
    struct symtab *s;
    const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
  
@@ -26188,7 +28814,7 @@ index d51c7aa..559f436 100644
    {
      if (!ps->readin
  	&& lookup_partial_symbol (ps, name, linkage_name,
-@@ -1805,7 +1841,11 @@ basic_lookup_transparent_type (const char *name)
+@@ -1805,7 +1848,11 @@ basic_lookup_transparent_type (const char *name)
        }
    }
  
@@ -26201,7 +28827,7 @@ index d51c7aa..559f436 100644
    {
      if (!ps->readin && lookup_partial_symbol (ps, name, NULL,
  					      1, STRUCT_DOMAIN))
-@@ -1853,7 +1893,12 @@ basic_lookup_transparent_type (const char *name)
+@@ -1853,7 +1900,12 @@ basic_lookup_transparent_type (const char *name)
        }
    }
  
@@ -26215,7 +28841,7 @@ index d51c7aa..559f436 100644
    {
      if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN))
        {
-@@ -1894,7 +1939,21 @@ find_main_psymtab (void)
+@@ -1894,7 +1946,21 @@ find_main_psymtab (void)
    struct partial_symtab *pst;
    struct objfile *objfile;
  
@@ -26238,7 +28864,7 @@ index d51c7aa..559f436 100644
    {
      if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN))
        {
-@@ -3085,7 +3144,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
+@@ -3085,7 +3151,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
       matching the regexp.  That way we don't have to reproduce all of
       the machinery below. */
  
@@ -26248,10 +28874,20 @@ index d51c7aa..559f436 100644
      struct partial_symbol **bound, **gbound, **sbound;
      int keep_going = 1;
 diff --git a/gdb/symtab.h b/gdb/symtab.h
-index 8b086f3..e59d5c6 100644
+index 8b086f3..06bf7e8 100644
 --- a/gdb/symtab.h
 +++ b/gdb/symtab.h
-@@ -394,7 +394,10 @@ typedef enum domain_enum_tag
+@@ -171,9 +171,6 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
+ #define SYMBOL_SECTION(symbol)		(symbol)->ginfo.section
+ #define SYMBOL_OBJ_SECTION(symbol)	(symbol)->ginfo.obj_section
+ 
+-#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol)	\
+-  (symbol)->ginfo.language_specific.cplus_specific.demangled_name
+-
+ /* Initializes the language dependent portion of a symbol
+    depending upon the language for the symbol. */
+ #define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language) \
+@@ -394,7 +391,10 @@ typedef enum domain_enum_tag
    FUNCTIONS_DOMAIN,
  
    /* All defined types */
@@ -26263,7 +28899,7 @@ index 8b086f3..e59d5c6 100644
  }
  domain_enum;
  
-@@ -1027,6 +1030,8 @@ extern void clear_pc_function_cache (void);
+@@ -1027,6 +1027,8 @@ extern void clear_pc_function_cache (void);
  
  /* from symtab.c: */
  
@@ -27286,10 +29922,10 @@ index b89d551..831070c 100644
        return xstrprintf ("%sspurious", kind_str);
      case TARGET_WAITKIND_IGNORE:
 diff --git a/gdb/target.h b/gdb/target.h
-index 276af1d..9f37f16 100644
+index 7f4cd8f..8dcc3d6 100644
 --- a/gdb/target.h
 +++ b/gdb/target.h
-@@ -139,18 +139,34 @@ struct target_waitstatus
+@@ -140,18 +140,34 @@ struct target_waitstatus
    {
      enum target_waitkind kind;
  
@@ -27326,7 +29962,7 @@ index 276af1d..9f37f16 100644
  /* Return a pretty printed form of target_waitstatus.
     Space for the result is malloc'd, caller must free.  */
  extern char *target_waitstatus_to_string (const struct target_waitstatus *);
-@@ -400,6 +416,8 @@ struct target_ops
+@@ -392,6 +408,8 @@ struct target_ops
      int (*to_follow_fork) (struct target_ops *, int);
      void (*to_insert_exec_catchpoint) (int);
      int (*to_remove_exec_catchpoint) (int);
@@ -27335,7 +29971,7 @@ index 276af1d..9f37f16 100644
      int (*to_has_exited) (int, int, int *);
      void (*to_mourn_inferior) (struct target_ops *);
      int (*to_can_run) (void);
-@@ -731,6 +749,8 @@ extern int inferior_has_vforked (ptid_t pid, ptid_t *child_pid);
+@@ -723,6 +741,8 @@ extern int inferior_has_vforked (ptid_t pid, ptid_t *child_pid);
  
  extern int inferior_has_execd (ptid_t pid, char **execd_pathname);
  
@@ -27344,7 +29980,7 @@ index 276af1d..9f37f16 100644
  /* From exec.c */
  
  extern void print_section_info (struct target_ops *, bfd *);
-@@ -889,6 +909,21 @@ int target_follow_fork (int follow_child);
+@@ -881,6 +901,21 @@ int target_follow_fork (int follow_child);
  #define target_remove_exec_catchpoint(pid) \
       (*current_target.to_remove_exec_catchpoint) (pid)
  
@@ -27366,7 +30002,7 @@ index 276af1d..9f37f16 100644
  /* Returns TRUE if PID has exited.  And, also sets EXIT_STATUS to the
     exit code of PID, if any.  */
  
-@@ -1154,6 +1189,20 @@ extern int target_search_memory (CORE_ADDR start_addr,
+@@ -1146,6 +1181,20 @@ extern int target_search_memory (CORE_ADDR start_addr,
                                   ULONGEST pattern_len,
                                   CORE_ADDR *found_addrp);
  
@@ -27400,6 +30036,301 @@ index 3d8fae4..5fb9067 100644
  # Free Software Foundation, Inc.
  #
  # This program is free software; you can redistribute it and/or modify
+diff --git a/gdb/testsuite/gdb.arch/powerpc-power7.exp b/gdb/testsuite/gdb.arch/powerpc-power7.exp
+new file mode 100644
+index 0000000..e1fc23f
+--- /dev/null
++++ b/gdb/testsuite/gdb.arch/powerpc-power7.exp
+@@ -0,0 +1,176 @@
++# 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.  
++
++# Test PowerPC Power7 instructions disassembly.
++
++if {![istarget "powerpc*-*-*"]} then {
++    verbose "Skipping PowerPC Power7 instructions disassembly."
++    return
++}
++
++set testfile "powerpc-power7"
++set srcfile ${testfile}.s
++set objfile ${objdir}/${subdir}/${testfile}.o
++
++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" } {
++    untested "PowerPC Power7 instructions disassembly"
++    return -1
++}
++
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${objfile}
++ 
++
++# Setup the disassembler.  With the default `any' flavor the instruction:
++#   0x20: xxmrghd vs3,vs4,vs5
++# (incl. many others) would get disassembled as:
++#   0x20: stfq f3,10320(r4)
++
++gdb_test "set powerpc disassembler-options power7"
++gdb_test "show powerpc disassembler-options power7" \
++         "The text passed on to disassembler is \"power7\"."
++
++
++# Disassemble the function.
++
++set test "disass func"
++gdb_test_multiple $test $test {
++    -re "\r\nDump of assembler code for function func:(\r\n.*\r\n)End of assembler dump.\r\n$gdb_prompt $" {
++	set func $expect_out(1,string)
++	pass $test
++    }
++}
++
++proc func_check {offset instr} {
++    global func
++
++    # 0x0000000000000018 <func+24>:	stxvd2x vs43,r4,r5
++    set patt ".*\r\n[string map {0x 0x0*} $offset] <func\\+?\[0-9\]*>:\[ \t\]*[string map [list { } "\[ \t\]+" . {\.}] $instr]\[ \t\]*\r\n.*"
++    set test "Found $offset: $instr"
++    if [regexp -nocase -line $patt $func] {
++	pass $test
++    } else {
++	fail $test
++    }
++}
++
++func_check   0x0 "lxvd2x  vs3,r4,r5"
++func_check   0x4 "lxvd2ux vs3,r4,r5"
++func_check   0x8 "lxvd2x  vs43,r4,r5"
++func_check   0xc "lxvd2ux vs43,r4,r5"
++func_check  0x10 "stxvd2x vs3,r4,r5"
++func_check  0x14 "stxvd2ux vs3,r4,r5"
++func_check  0x18 "stxvd2x vs43,r4,r5"
++func_check  0x1c "stxvd2ux vs43,r4,r5"
++func_check  0x20 "xxmrghd vs3,vs4,vs5"
++func_check  0x24 "xxmrghd vs43,vs44,vs45"
++func_check  0x28 "xxmrgld vs3,vs4,vs5"
++func_check  0x2c "xxmrgld vs43,vs44,vs45"
++func_check  0x30 "xxmrghd vs3,vs4,vs5"
++func_check  0x34 "xxmrghd vs43,vs44,vs45"
++func_check  0x38 "xxmrgld vs3,vs4,vs5"
++func_check  0x3c "xxmrgld vs43,vs44,vs45"
++func_check  0x40 "xxpermdi vs3,vs4,vs5,1"
++func_check  0x44 "xxpermdi vs43,vs44,vs45,1"
++func_check  0x48 "xxpermdi vs3,vs4,vs5,2"
++func_check  0x4c "xxpermdi vs43,vs44,vs45,2"
++func_check  0x50 "xvmovdp vs3,vs4"
++func_check  0x54 "xvmovdp vs43,vs44"
++func_check  0x58 "xvmovdp vs3,vs4"
++func_check  0x5c "xvmovdp vs43,vs44"
++func_check  0x60 "xvcpsgndp vs3,vs4,vs5"
++func_check  0x64 "xvcpsgndp vs43,vs44,vs45"
++func_check  0x68 "wait"
++func_check  0x6c "wait"
++func_check  0x70 "waitrsv"
++func_check  0x74 "waitrsv"
++func_check  0x78 "waitimpl"
++func_check  0x7c "waitimpl"
++func_check  0x80 "doze"
++func_check  0x84 "nap"
++func_check  0x88 "sleep"
++func_check  0x8c "rvwinkle"
++func_check  0x90 "prtyw   r3,r4"
++func_check  0x94 "prtyd   r13,r14"
++func_check  0x98 "mfcfar  r10"
++func_check  0x9c "mtcfar  r11"
++func_check  0xa0 "cmpb    r3,r4,r5"
++func_check  0xa4 "lwzcix  r10,r11,r12"
++func_check  0xa8 "dadd    f16,f17,f18"
++func_check  0xac "daddq   f20,f22,f24"
++func_check  0xb0 "dss     3"
++func_check  0xb4 "dssall"
++func_check  0xb8 "dst     r5,r4,1"
++func_check  0xbc "dstt    r8,r7,0"
++func_check  0xc0 "dstst   r5,r6,3"
++func_check  0xc4 "dststt  r4,r5,2"
++func_check  0xc8 "divwe   r10,r11,r12"
++func_check  0xcc "divwe.  r11,r12,r13"
++func_check  0xd0 "divweo  r12,r13,r14"
++func_check  0xd4 "divweo. r13,r14,r15"
++func_check  0xd8 "divweu  r10,r11,r12"
++func_check  0xdc "divweu. r11,r12,r13"
++func_check  0xe0 "divweuo r12,r13,r14"
++func_check  0xe4 "divweuo. r13,r14,r15"
++func_check  0xe8 "bpermd  r7,r17,r27"
++func_check  0xec "popcntw r10,r20"
++func_check  0xf0 "popcntd r10,r20"
++func_check  0xf4 "ldbrx   r20,r21,r22"
++func_check  0xf8 "stdbrx  r20,r21,r22"
++func_check  0xfc "lfiwzx  f10,0,r10"
++func_check 0x100 "lfiwzx  f10,r9,r10"
++func_check 0x104 "fcfids  f4,f5"
++func_check 0x108 "fcfids. f4,f5"
++func_check 0x10c "fcfidus f4,f5"
++func_check 0x110 "fcfidus. f4,f5"
++func_check 0x114 "fctiwu  f4,f5"
++func_check 0x118 "fctiwu. f4,f5"
++func_check 0x11c "fctiwuz f4,f5"
++func_check 0x120 "fctiwuz. f4,f5"
++func_check 0x124 "fctidu  f4,f5"
++func_check 0x128 "fctidu. f4,f5"
++func_check 0x12c "fctiduz f4,f5"
++func_check 0x130 "fctiduz. f4,f5"
++func_check 0x134 "fcfidu  f4,f5"
++func_check 0x138 "fcfidu. f4,f5"
++func_check 0x13c "ftdiv   cr0,f10,f11"
++func_check 0x140 "ftdiv   cr7,f10,f11"
++func_check 0x144 "ftsqrt  cr0,f10"
++func_check 0x148 "ftsqrt  cr7,f10"
++func_check 0x14c "dcbtt   r8,r9"
++func_check 0x150 "dcbtstt r8,r9"
++func_check 0x154 "dcffix  f10,f12"
++func_check 0x158 "dcffix. f20,f22"
++func_check 0x15c "lbarx   r10,r11,r12"
++func_check 0x160 "lbarx   r10,r11,r12"
++func_check 0x164 "lbarx   r10,r11,r12,1"
++func_check 0x168 "lharx   r20,r21,r22"
++func_check 0x16c "lharx   r20,r21,r22"
++func_check 0x170 "lharx   r20,r21,r22,1"
++func_check 0x174 "stbcx.  r10,r11,r12"
++func_check 0x178 "sthcx.  r10,r11,r12"
++func_check 0x17c "fre     f14,f15"
++func_check 0x180 "fre.    f14,f15"
++func_check 0x184 "fres    f14,f15"
++func_check 0x188 "fres.   f14,f15"
++func_check 0x18c "frsqrte f14,f15"
++func_check 0x190 "frsqrte. f14,f15"
++func_check 0x194 "frsqrtes f14,f15"
++func_check 0x198 "frsqrtes. f14,f15"
++func_check 0x19c "isel    r2,r3,r4,28"
+diff --git a/gdb/testsuite/gdb.arch/powerpc-power7.s b/gdb/testsuite/gdb.arch/powerpc-power7.s
+new file mode 100644
+index 0000000..98b2e79
+--- /dev/null
++++ b/gdb/testsuite/gdb.arch/powerpc-power7.s
+@@ -0,0 +1,107 @@
++	.text
++	.globl	func
++func:
++	.long	0x7c642e98	/*   0: lxvd2x  vs3,r4,r5         */
++	.long	0x7c642ed8	/*   4: lxvd2ux vs3,r4,r5         */
++	.long	0x7d642e99	/*   8: lxvd2x  vs43,r4,r5        */
++	.long	0x7d642ed9	/*   c: lxvd2ux vs43,r4,r5        */
++	.long	0x7c642f98	/*  10: stxvd2x vs3,r4,r5         */
++	.long	0x7c642fd8	/*  14: stxvd2ux vs3,r4,r5        */
++	.long	0x7d642f99	/*  18: stxvd2x vs43,r4,r5        */
++	.long	0x7d642fd9	/*  1c: stxvd2ux vs43,r4,r5       */
++	.long	0xf0642850	/*  20: xxmrghd vs3,vs4,vs5       */
++	.long	0xf16c6857	/*  24: xxmrghd vs43,vs44,vs45    */
++	.long	0xf0642b50	/*  28: xxmrgld vs3,vs4,vs5       */
++	.long	0xf16c6b57	/*  2c: xxmrgld vs43,vs44,vs45    */
++	.long	0xf0642850	/*  30: xxmrghd vs3,vs4,vs5       */
++	.long	0xf16c6857	/*  34: xxmrghd vs43,vs44,vs45    */
++	.long	0xf0642b50	/*  38: xxmrgld vs3,vs4,vs5       */
++	.long	0xf16c6b57	/*  3c: xxmrgld vs43,vs44,vs45    */
++	.long	0xf0642950	/*  40: xxpermdi vs3,vs4,vs5,1    */
++	.long	0xf16c6957	/*  44: xxpermdi vs43,vs44,vs45,1 */
++	.long	0xf0642a50	/*  48: xxpermdi vs3,vs4,vs5,2    */
++	.long	0xf16c6a57	/*  4c: xxpermdi vs43,vs44,vs45,2 */
++	.long	0xf0642780	/*  50: xvmovdp vs3,vs4           */
++	.long	0xf16c6787	/*  54: xvmovdp vs43,vs44         */
++	.long	0xf0642780	/*  58: xvmovdp vs3,vs4           */
++	.long	0xf16c6787	/*  5c: xvmovdp vs43,vs44         */
++	.long	0xf0642f80	/*  60: xvcpsgndp vs3,vs4,vs5     */
++	.long	0xf16c6f87	/*  64: xvcpsgndp vs43,vs44,vs45  */
++	.long	0x7c00007c	/*  68: wait                      */
++	.long	0x7c00007c	/*  6c: wait                      */
++	.long	0x7c20007c	/*  70: waitrsv                   */
++	.long	0x7c20007c	/*  74: waitrsv                   */
++	.long	0x7c40007c	/*  78: waitimpl                  */
++	.long	0x7c40007c	/*  7c: waitimpl                  */
++	.long	0x4c000324	/*  80: doze                      */
++	.long	0x4c000364	/*  84: nap                       */
++	.long	0x4c0003a4	/*  88: sleep                     */
++	.long	0x4c0003e4	/*  8c: rvwinkle                  */
++	.long	0x7c830134	/*  90: prtyw   r3,r4             */
++	.long	0x7dcd0174	/*  94: prtyd   r13,r14           */
++	.long	0x7d5c02a6	/*  98: mfcfar  r10               */
++	.long	0x7d7c03a6	/*  9c: mtcfar  r11               */
++	.long	0x7c832bf8	/*  a0: cmpb    r3,r4,r5          */
++	.long	0x7d4b662a	/*  a4: lwzcix  r10,r11,r12       */
++	.long	0xee119004	/*  a8: dadd    f16,f17,f18       */
++	.long	0xfe96c004	/*  ac: daddq   f20,f22,f24       */
++	.long	0x7c60066c	/*  b0: dss     3                 */
++	.long	0x7e00066c	/*  b4: dssall                    */
++	.long	0x7c2522ac	/*  b8: dst     r5,r4,1           */
++	.long	0x7e083aac	/*  bc: dstt    r8,r7,0           */
++	.long	0x7c6532ec	/*  c0: dstst   r5,r6,3           */
++	.long	0x7e442aec	/*  c4: dststt  r4,r5,2           */
++	.long	0x7d4b6356	/*  c8: divwe   r10,r11,r12       */
++	.long	0x7d6c6b57	/*  cc: divwe.  r11,r12,r13       */
++	.long	0x7d8d7756	/*  d0: divweo  r12,r13,r14       */
++	.long	0x7dae7f57	/*  d4: divweo. r13,r14,r15       */
++	.long	0x7d4b6316	/*  d8: divweu  r10,r11,r12       */
++	.long	0x7d6c6b17	/*  dc: divweu. r11,r12,r13       */
++	.long	0x7d8d7716	/*  e0: divweuo r12,r13,r14       */
++	.long	0x7dae7f17	/*  e4: divweuo. r13,r14,r15      */
++	.long	0x7e27d9f8	/*  e8: bpermd  r7,r17,r27        */
++	.long	0x7e8a02f4	/*  ec: popcntw r10,r20           */
++	.long	0x7e8a03f4	/*  f0: popcntd r10,r20           */
++	.long	0x7e95b428	/*  f4: ldbrx   r20,r21,r22       */
++	.long	0x7e95b528	/*  f8: stdbrx  r20,r21,r22       */
++	.long	0x7d4056ee	/*  fc: lfiwzx  f10,0,r10         */
++	.long	0x7d4956ee	/* 100: lfiwzx  f10,r9,r10        */
++	.long	0xec802e9c	/* 104: fcfids  f4,f5             */
++	.long	0xec802e9d	/* 108: fcfids. f4,f5             */
++	.long	0xec802f9c	/* 10c: fcfidus f4,f5             */
++	.long	0xec802f9d	/* 110: fcfidus. f4,f5            */
++	.long	0xfc80291c	/* 114: fctiwu  f4,f5             */
++	.long	0xfc80291d	/* 118: fctiwu. f4,f5             */
++	.long	0xfc80291e	/* 11c: fctiwuz f4,f5             */
++	.long	0xfc80291f	/* 120: fctiwuz. f4,f5            */
++	.long	0xfc802f5c	/* 124: fctidu  f4,f5             */
++	.long	0xfc802f5d	/* 128: fctidu. f4,f5             */
++	.long	0xfc802f5e	/* 12c: fctiduz f4,f5             */
++	.long	0xfc802f5f	/* 130: fctiduz. f4,f5            */
++	.long	0xfc802f9c	/* 134: fcfidu  f4,f5             */
++	.long	0xfc802f9d	/* 138: fcfidu. f4,f5             */
++	.long	0xfc0a5900	/* 13c: ftdiv   cr0,f10,f11       */
++	.long	0xff8a5900	/* 140: ftdiv   cr7,f10,f11       */
++	.long	0xfc005140	/* 144: ftsqrt  cr0,f10           */
++	.long	0xff805140	/* 148: ftsqrt  cr7,f10           */
++	.long	0x7e084a2c	/* 14c: dcbtt   r8,r9             */
++	.long	0x7e0849ec	/* 150: dcbtstt r8,r9             */
++	.long	0xed406644	/* 154: dcffix  f10,f12           */
++	.long	0xee80b645	/* 158: dcffix. f20,f22           */
++	.long	0x7d4b6068	/* 15c: lbarx   r10,r11,r12       */
++	.long	0x7d4b6068	/* 160: lbarx   r10,r11,r12       */
++	.long	0x7d4b6069	/* 164: lbarx   r10,r11,r12,1     */
++	.long	0x7e95b0e8	/* 168: lharx   r20,r21,r22       */
++	.long	0x7e95b0e8	/* 16c: lharx   r20,r21,r22       */
++	.long	0x7e95b0e9	/* 170: lharx   r20,r21,r22,1     */
++	.long	0x7d4b656d	/* 174: stbcx.  r10,r11,r12       */
++	.long	0x7d4b65ad	/* 178: sthcx.  r10,r11,r12       */
++	.long	0xfdc07830	/* 17c: fre     f14,f15           */
++	.long	0xfdc07831	/* 180: fre.    f14,f15           */
++	.long	0xedc07830	/* 184: fres    f14,f15           */
++	.long	0xedc07831	/* 188: fres.   f14,f15           */
++	.long	0xfdc07834	/* 18c: frsqrte f14,f15           */
++	.long	0xfdc07835	/* 190: frsqrte. f14,f15          */
++	.long	0xedc07834	/* 194: frsqrtes f14,f15          */
++	.long	0xedc07835	/* 198: frsqrtes. f14,f15         */
++	.long	0x7c43271e	/* 19c: isel    r2,r3,r4,28       */
 diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S b/gdb/testsuite/gdb.arch/x86_64-vla-typedef-foo.S
 new file mode 100644
 index 0000000..66f7a39
@@ -30018,8 +32949,314 @@ index 0000000..92cc23c
 +
 +# The Bug was: No symbol "problem" in current context.
 +gdb_test "p problem" " = \\(int \\*\\) 0x.*"
+diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.cc b/gdb/testsuite/gdb.cp/cplusfuncs.cc
+index 7f033d6..1a50a32 100644
+--- a/gdb/testsuite/gdb.cp/cplusfuncs.cc
++++ b/gdb/testsuite/gdb.cp/cplusfuncs.cc
+@@ -191,6 +191,12 @@ char *	dm_type_char_star (char * p)		{ return p; }
+ int	dm_type_foo_ref (foo & foo)		{ return foo.ifoo; }
+ int *	dm_type_int_star (int * p)		{ return p; }
+ long *	dm_type_long_star (long * p)		{ return p; }
++int	dm_type_short (short i)			{ return i; }
++int	dm_type_long (long i)			{ return i; }
+ int	dm_type_unsigned_int (unsigned int i)	{ return i; }
++int	dm_type_unsigned_short (unsigned short i)	{ return i; }
++int	dm_type_unsigned_long (unsigned long i)	{ return i; }
+ int	dm_type_void (void)			{ return 0; }
+ void *	dm_type_void_star (void * p)		{ return p; }
++typedef int myint;
++int	dm_type_typedef (myint i)		{ return i; }
+diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.exp b/gdb/testsuite/gdb.cp/cplusfuncs.exp
+index 5e08768..8c8e038 100644
+--- a/gdb/testsuite/gdb.cp/cplusfuncs.exp
++++ b/gdb/testsuite/gdb.cp/cplusfuncs.exp
+@@ -66,9 +66,25 @@ set dm_type_unsigned_int	"unsigned"
+ set dm_type_void		""
+ set dm_type_void_star		"void*"
+ 
++# Some other vagaries of GDB's type printing machinery.  The integer types
++# may have unsigned before or after their length, and may have "int"
++# appended.  The char* conversion operator may have name "char*" even if
++# the type is "char *", because the name comes from the debug information
++# and the type from GDB.  Function types may not see through typedefs.
++
++set dm_type_short		"short"
++set dm_type_long		"long"
++set dm_type_unsigned_short	"unsigned short"
++set dm_type_unsigned_long	"unsigned long"
++set dm_operator_char_star	"char*"
++set dm_operator_char_star_quoted	"char\\*"
++set dm_type_typedef		0
++
+ proc probe_demangler { } {
+     global gdb_prompt
+     global dm_operator_comma
++    global dm_operator_char_star
++    global dm_operator_char_star_quoted
+     global dm_type_char_star
+     global dm_type_char_star_quoted
+     global dm_type_foo_ref
+@@ -77,6 +93,11 @@ proc probe_demangler { } {
+     global dm_type_unsigned_int
+     global dm_type_void
+     global dm_type_void_star
++    global dm_type_short
++    global dm_type_unsigned_short
++    global dm_type_long
++    global dm_type_unsigned_long
++    global dm_type_typedef
+ 
+     send_gdb "print &'foo::operator,(foo&)'\n"
+     gdb_expect {
+@@ -97,6 +118,26 @@ proc probe_demangler { } {
+ 	}
+     }
+ 
++    send_gdb "print &'foo::operator char*()'\n"
++    gdb_expect {
++	-re ".*foo::operator char \\*\\(void\\).*\r\n$gdb_prompt $" {
++	    # v2 demangler or GDB type printer
++	    set dm_operator_char_star "char *"
++	    set dm_operator_char_star_quoted "char \\*"
++	    pass "detect dm_operator_char_star"
++	}
++	-re ".*foo::operator char\\*\\(\\).*\r\n$gdb_prompt $" {
++	    # v3 demangler
++	    pass "detect dm_operator_char_star"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_operator_char_star"
++	}
++	timeout {
++	    fail "detect dm_operator_char_star"
++	}
++    }
++
+     send_gdb "print &'dm_type_char_star'\n"
+     gdb_expect {
+ 	-re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" {
+@@ -166,6 +207,11 @@ proc probe_demangler { } {
+ 	    # v3 demangler
+ 	    pass "detect dm_type_long_star"
+ 	}
++	-re ".*dm_type_long_star\\(long int \\*\\).*\r\n$gdb_prompt $" {
++	    # GCC v3 and GDB's type printer
++	    set dm_type_long_star "long int *"
++	    pass "detect dm_type_long_star"
++	}
+ 	-re ".*$gdb_prompt $" {
+ 	    fail "detect dm_type_long_star"
+ 	}
+@@ -230,6 +276,101 @@ proc probe_demangler { } {
+ 	    fail "detect dm_type_void_star (timeout)"
+ 	}
+     }
++
++    send_gdb "print &'dm_type_short'\n"
++    gdb_expect {
++	-re ".*dm_type_short\\(short\\).*\r\n$gdb_prompt $" {
++	    # v2 and v3 demanglers
++	    pass "detect dm_type_short"
++	}
++	-re ".*dm_type_short\\(short int\\).*\r\n$gdb_prompt $" {
++	    # GDB type printer
++	    set dm_type_short "short int"
++	    pass "detect dm_type_short"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_type_short"
++	}
++	timeout {
++	    fail "detect dm_type_short (timeout)"
++	}
++    }
++
++    send_gdb "print &'dm_type_unsigned_short'\n"
++    gdb_expect {
++	-re ".*dm_type_unsigned_short\\(unsigned short\\).*\r\n$gdb_prompt $" {
++	    # v2 and v3 demanglers
++	    pass "detect dm_type_unsigned_short"
++	}
++	-re ".*dm_type_unsigned_short\\(short unsigned int\\).*\r\n$gdb_prompt $" {
++	    # GDB type printer
++	    set dm_type_unsigned_short "short unsigned int"
++	    pass "detect dm_type_unsigned_short"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_type_unsigned_short"
++	}
++	timeout {
++	    fail "detect dm_type_unsigned_short (timeout)"
++	}
++    }
++
++    send_gdb "print &'dm_type_long'\n"
++    gdb_expect {
++	-re ".*dm_type_long\\(long\\).*\r\n$gdb_prompt $" {
++	    # v2 and v3 demanglers
++	    pass "detect dm_type_long"
++	}
++	-re ".*dm_type_long\\(long int\\).*\r\n$gdb_prompt $" {
++	    # GDB type printer
++	    set dm_type_long "long int"
++	    pass "detect dm_type_long"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_type_long"
++	}
++	timeout {
++	    fail "detect dm_type_long (timeout)"
++	}
++    }
++
++    send_gdb "print &'dm_type_unsigned_long'\n"
++    gdb_expect {
++	-re ".*dm_type_unsigned_long\\(unsigned long\\).*\r\n$gdb_prompt $" {
++	    # v2 and v3 demanglers
++	    pass "detect dm_type_unsigned_long"
++	}
++	-re ".*dm_type_unsigned_long\\(long unsigned int\\).*\r\n$gdb_prompt $" {
++	    # GDB type printer
++	    set dm_type_unsigned_long "long unsigned int"
++	    pass "detect dm_type_unsigned_long"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_type_unsigned_long"
++	}
++	timeout {
++	    fail "detect dm_type_unsigned_long (timeout)"
++	}
++    }
++
++    send_gdb "print &'dm_type_typedef'\n"
++    gdb_expect {
++	-re ".*dm_type_typedef\\(int\\).*\r\n$gdb_prompt $" {
++	    # v2 and v3 demanglers
++	    pass "detect dm_type_typedef"
++	}
++	-re ".*dm_type_typedef\\(myint\\).*\r\n$gdb_prompt $" {
++	    # GDB type printer
++	    set dm_type_typedef 1
++	    pass "detect dm_type_typedef"
++	}
++	-re ".*$gdb_prompt $" {
++	    fail "detect dm_type_typedef"
++	}
++	timeout {
++	    fail "detect dm_type_typedef (timeout)"
++	}
++    }
+ }
+ 
+ #
+@@ -345,8 +486,9 @@ proc print_addr { name } {
+ 
+ proc test_lookup_operator_functions {} {
+     global dm_operator_comma
++    global dm_operator_char_star
+     global dm_type_char_star
+-    global dm_type_char_star_quoted
++    global dm_operator_char_star_quoted
+     global dm_type_foo_ref
+     global dm_type_void
+     global dm_type_void_star
+@@ -404,8 +546,8 @@ proc test_lookup_operator_functions {} {
+ 
+     info_func "operator int("	"int foo::operator int($dm_type_void);"
+     info_func "operator()("	"void foo::operator()($dm_type_foo_ref);"
+-    info_func "operator $dm_type_char_star_quoted\(" \
+-				"char *foo::operator $dm_type_char_star\($dm_type_void);"
++    info_func "operator $dm_operator_char_star_quoted\(" \
++				"char *foo::operator $dm_operator_char_star\($dm_type_void);"
+ 
+ }
+ 
+@@ -420,6 +562,7 @@ proc test_paddr_operator_functions {} {
+     global dm_type_unsigned_int
+     global dm_type_void
+     global dm_type_void_star
++    global dm_operator_char_star
+ 
+     print_addr "foo::operator*($dm_type_foo_ref)"
+     print_addr "foo::operator%($dm_type_foo_ref)"
+@@ -470,7 +613,7 @@ proc test_paddr_operator_functions {} {
+     }
+ 
+     print_addr "foo::operator int($dm_type_void)"
+-    print_addr "foo::operator $dm_type_char_star\($dm_type_void)"
++    print_addr "foo::operator $dm_operator_char_star\($dm_type_void)"
+ }
+ 
+ #
+@@ -480,17 +623,21 @@ proc test_paddr_operator_functions {} {
+ proc test_paddr_overloaded_functions {} {
+     global dm_type_unsigned_int
+     global dm_type_void
++    global dm_type_short
++    global dm_type_unsigned_short
++    global dm_type_long
++    global dm_type_unsigned_long
+ 
+     print_addr "overload1arg($dm_type_void)"
+     print_addr "overload1arg(char)"
+     print_addr "overload1arg(signed char)"
+     print_addr "overload1arg(unsigned char)"
+-    print_addr "overload1arg(short)"
+-    print_addr "overload1arg(unsigned short)"
++    print_addr "overload1arg($dm_type_short)"
++    print_addr "overload1arg($dm_type_unsigned_short)"
+     print_addr "overload1arg(int)"
+     print_addr "overload1arg($dm_type_unsigned_int)"
+-    print_addr "overload1arg(long)"
+-    print_addr "overload1arg(unsigned long)"
++    print_addr "overload1arg($dm_type_long)"
++    print_addr "overload1arg($dm_type_unsigned_long)"
+     print_addr "overload1arg(float)"
+     print_addr "overload1arg(double)"
+ 
+@@ -513,17 +660,31 @@ proc test_paddr_hairy_functions {} {
+     global dm_type_char_star
+     global dm_type_int_star
+     global dm_type_long_star
++    global dm_type_typedef
+ 
+     print_addr_2 "hairyfunc1" "hairyfunc1(int)"
+-    print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))"
+-    print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))"
+-    print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))"
+-
+-    # gdb-gnats bug gdb/19:
+-    # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7"
+-    print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19"
+-    print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19"
+-    print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19"
++
++    if {$dm_type_typedef == 0} {
++	print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))"
++	print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))"
++	print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))"
++
++	# gdb-gnats bug gdb/19:
++	# "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7"
++	print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19"
++	print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19"
++	print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19"
++    } else {
++	print_addr_2 "hairyfunc2" "hairyfunc2(PFPc_i)"
++	print_addr_2 "hairyfunc3" "hairyfunc3(PFPFPl_s_i)"
++	print_addr_2 "hairyfunc4" "hairyfunc4(PFPFPc_s_i)"
++
++	# gdb-gnats bug gdb/19:
++	# "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7"
++	print_addr_2 "hairyfunc5" "hairyfunc5(PFPc_PFl_i)"
++	print_addr_2 "hairyfunc6" "hairyfunc6(PFPi_PFl_i)"
++	print_addr_2 "hairyfunc7" "hairyfunc7(PFPFPc_i_PFl_i)"
++    }
+ }
+ 
+ proc do_tests {} {
 diff --git a/gdb/testsuite/gdb.cp/gdb1355.exp b/gdb/testsuite/gdb.cp/gdb1355.exp
-index 77687a6..8028bce 100644
+index 77687a6..66d16cf 100644
 --- a/gdb/testsuite/gdb.cp/gdb1355.exp
 +++ b/gdb/testsuite/gdb.cp/gdb1355.exp
 @@ -68,11 +68,11 @@ set s_tail  ".*"
@@ -30027,14 +33264,14 @@ index 77687a6..8028bce 100644
  set f_i     "${ws}int m_int;"
  set f_c     "${ws}char m_char;"
 -set f_li    "${ws}long int m_long_int;"
-+set f_li    "${ws}long( int)? m_long_int;"
++set f_li    "${ws}long m_long_int;"
  set f_ui    "${ws}unsigned int m_unsigned_int;"
 -set f_lui   "${ws}long unsigned int m_long_unsigned_int;"
 -set f_si    "${ws}short int m_short_int;"
 -set f_sui   "${ws}short unsigned int m_short_unsigned_int;"
-+set f_lui   "${ws}(long unsigned int|unsigned long) m_long_unsigned_int;"
-+set f_si    "${ws}short( int)? m_short_int;"
-+set f_sui   "${ws}(short unsigned int|unsigned short) m_short_unsigned_int;"
++set f_lui   "${ws}unsigned long m_long_unsigned_int;"
++set f_si    "${ws}short m_short_int;"
++set f_sui   "${ws}unsigned short m_short_unsigned_int;"
  set f_uc    "${ws}unsigned char m_unsigned_char;"
  set f_f     "${ws}float m_float;"
  set f_d     "${ws}double m_double;"
@@ -30300,6 +33537,688 @@ index 0000000..62c09c2
 +# normal signal handling in inferior function calls.
 +gdb_test "p exceptions.raise_signal(1)" \
 +    "To change this behavior use \"set unwindonsignal on\".*"
+diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc
+index 1dff70a..648b2af 100644
+--- a/gdb/testsuite/gdb.cp/member-ptr.cc
++++ b/gdb/testsuite/gdb.cp/member-ptr.cc
+@@ -138,6 +138,7 @@ class Diamond : public Padding, public Left, public Right
+ {
+ public:
+   virtual int vget_base ();
++  int (*func_ptr) (int);
+ };
+ 
+ int Diamond::vget_base ()
+@@ -145,6 +146,12 @@ int Diamond::vget_base ()
+   return this->Left::x + 2000;
+ }
+ 
++int
++func (int x)
++{
++  return 19 + x;
++}
++
+ int main ()
+ {
+   A a;
+@@ -162,6 +169,7 @@ int main ()
+   int (Diamond::*right_vpmf) ();
+   int (Base::*base_vpmf) ();
+   int Diamond::*diamond_pmi;
++  int (* Diamond::*diamond_pfunc_ptr) (int);
+ 
+   PMI null_pmi;
+   PMF null_pmf;
+@@ -179,6 +187,7 @@ int main ()
+ 
+   diamond.Left::x = 77;
+   diamond.Right::x = 88;
++  diamond.func_ptr = func;
+ 
+   /* Some valid pointer to members from a base class.  */
+   left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x);
+@@ -193,11 +202,19 @@ int main ()
+   /* A pointer to data member from a base class.  */
+   diamond_pmi = (int Diamond::*) (int Left::*) &Base::x;
+ 
++  /* A pointer to data member, where the member is itself a pointer to
++     a function.  */
++  diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr;
++
+   null_pmi = NULL;
+   null_pmf = NULL;
+ 
+   pmi = NULL; /* Breakpoint 1 here.  */
+ 
++  // Invalid (uses diamond_pfunc_ptr as a function):
++  // diamond.*diamond_pfunc_ptr (20);
++  (diamond.*diamond_pfunc_ptr) (20);
++
+   k = (a.*pmf)(3);
+ 
+   pmi = &A::jj;
+diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp
+index b69d4ad..476711f 100644
+--- a/gdb/testsuite/gdb.cp/member-ptr.exp
++++ b/gdb/testsuite/gdb.cp/member-ptr.exp
+@@ -390,6 +390,33 @@ gdb_test_multiple "print ((int) pmi) == ((char *) &a.j - (char *) & a)" $name {
+     }
+ }
+ 
++# Check pointers to data members, which are themselves pointers to
++# functions.  These behave like data members, not like pointers to
++# member functions.
++
++gdb_test "ptype diamond_pfunc_ptr" \
++    "type = int \\(\\*Diamond::\\*\\)\\(int\\)"
++
++gdb_test "ptype diamond.*diamond_pfunc_ptr" \
++    "type = int \\(\\*\\)\\(int\\)"
++
++# This one is invalid; () binds more tightly than .*, so it tries to
++# call the member pointer as a normal pointer-to-function.
++
++gdb_test "print diamond.*diamond_pfunc_ptr (20)" \
++    "Invalid data type for function to be called."
++
++# With parentheses, it is valid.
++
++gdb_test "print (diamond.*diamond_pfunc_ptr) (20)" \
++    "$vhn = 39"
++
++# Make sure that we do not interpret this as either a member pointer
++# call or a member function call.
++
++gdb_test "print diamond.func_ptr (20)" \
++    "$vhn = 39"
++
+ # ==========================
+ # pointer to member function
+ # ==========================
+@@ -608,6 +635,9 @@ gdb_test_multiple "print (a.*pmf)(3)" $name {
+     }
+ }
+ 
++gdb_test "ptype a.*pmf" "type = int \\(A \\*, int\\)"
++gdb_test "ptype (a.*pmf)(3)" "type = int"
++
+ # Print out a pointer to data member which requires looking into
+ # a base class.
+ gdb_test "print diamond_pmi" "$vhn = &Base::x"
+diff --git a/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc b/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc
+new file mode 100644
+index 0000000..6b180d6
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.cc
+@@ -0,0 +1,20 @@
++namespace A {
++  int x = 11;
++  namespace{
++    int xx = 22;
++  }
++}
++
++using namespace A;
++
++namespace{
++  int xxx = 33;
++};
++
++int main()
++{
++  x;
++  xx;
++  xxx;
++  return 0;
++}
+diff --git a/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp
+new file mode 100644
+index 0000000..e4bb9f8
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-multiple-imports.exp
+@@ -0,0 +1,49 @@
++# Copyright 2008 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 $tracelevel then {
++    strace $tracelevel
++}
++
++set prms_id 0
++set bug_id 0
++
++set testfile namespace-multiple-imports
++set srcfile ${testfile}.cc
++set binfile ${objdir}/${subdir}/${testfile}
++if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
++    untested "Couldn't compile test program"
++    return -1
++}
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++############################################
++# test printing of namespace imported within
++# the function.
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_test "print x" "\\$\[0-9\].* = 11"
++gdb_test "print xx" "\\$\[0-9\].* = 22"
++gdb_test "print xxx" "\\$\[0-9\].* = 33"
+diff --git a/gdb/testsuite/gdb.cp/namespace-using.cc b/gdb/testsuite/gdb.cp/namespace-using.cc
+new file mode 100644
+index 0000000..97af850
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-using.cc
+@@ -0,0 +1,131 @@
++//--------------------------
++namespace M{
++  int x = 911;
++}
++
++namespace N{
++  int x = 912;
++}
++
++int marker10(){
++  using namespace M;
++  int y = x+1;       // marker10 stop
++  using namespace N;
++  return y;
++}
++//--------------------------
++namespace J {
++    int jx = 44;
++}
++
++namespace K{
++  int marker9(){
++    //x;
++    return marker10();
++  }
++}
++
++namespace L{
++  using namespace J;
++  int marker8(){
++    jx;
++    return K::marker9();
++  }
++}
++//--------------------------
++
++//--------------------------
++namespace G{
++  namespace H  {
++    int ghx = 6;
++  }
++}
++
++namespace I{
++  
++  int marker7(){
++    using namespace G::H;
++    ghx;
++    return L::marker8();
++  }
++}
++//--------------------------
++
++//--------------------------
++namespace E{
++  namespace F{
++    int efx = 5;
++  }
++}
++using namespace E::F;
++int marker6(){
++  efx;
++  return I::marker7();
++}
++//--------------------------
++
++namespace A
++{
++  int _a = 1;
++  int x = 2;
++    
++}
++
++namespace C
++{
++  int cc = 3;
++}
++
++namespace D
++{
++  int dx = 4;
++}
++
++using namespace C;
++int marker5()
++{
++  cc;
++  return marker6();
++}
++
++int marker4()
++{
++  using D::dx;
++  return marker5();
++}
++
++int marker3()
++{
++  return marker4();
++}
++
++int marker2()
++{
++  namespace B = A;
++  B::_a;
++  return marker3();
++}
++
++int marker1()
++{
++  int total = 0;
++    {
++      int b = 1;
++        {
++          using namespace A;
++          int c = 2;
++            {
++              int d = 3;
++              total = _a + b + c + d + marker2(); // marker1 stop
++            }
++        }
++    }
++  return total;
++}
++
++int main()
++{
++  using namespace A;
++  _a;
++  return marker1();
++}
+diff --git a/gdb/testsuite/gdb.cp/namespace-using.exp b/gdb/testsuite/gdb.cp/namespace-using.exp
+new file mode 100644
+index 0000000..f73fa67
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-using.exp
+@@ -0,0 +1,186 @@
++# Copyright 2008 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 $tracelevel then {
++    strace $tracelevel
++}
++
++set prms_id 0
++set bug_id 0
++
++set testfile namespace-using
++set srcfile ${testfile}.cc
++set binfile ${objdir}/${subdir}/${testfile}
++if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
++    untested "Couldn't compile test program"
++    return -1
++}
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++############################################
++# test printing of namespace imported within
++# the function.
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_test "print _a" "= 1"
++
++# Test that names are not printed when they 
++# are not imported
++
++gdb_breakpoint marker3
++gdb_continue_to_breakpoint "marker3"
++
++#send_gdb "break marker3\n"
++#send_gdb "continue\n"
++
++gdb_test "print _a" "No symbol \"_a\" in current context." "Print _a without import"
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++
++############################################
++# test printing of namespace imported into 
++# a scope containing the pc.
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_breakpoint [gdb_get_line_number "marker1 stop"]
++gdb_continue_to_breakpoint "marker1 stop"
++
++gdb_test "print _a" "= 1" "print _a in a nested scope"
++
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++############################################
++# test printing of namespace imported into 
++# file scope.
++
++
++if ![runto marker5] then {
++    perror "couldn't run to breakpoint marker5"
++    continue
++}
++
++gdb_test "print cc" "= 3"
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++
++############################################
++# Test printing of namespace aliases
++
++if ![runto marker2] then {
++    perror "couldn't run to breakpoint marker2"
++    continue
++}
++
++gdb_test "print B::_a" "= 1"
++
++gdb_test "print _a" "No symbol \"_a\" in current context." "print _a in namespace alias scope"
++gdb_test "print x" "No symbol \"x\" in current context." "print x in namespace alias scope"
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++
++############################################
++# Test printing of namespace aliases
++
++if ![runto marker4] then {
++    perror "couldn't run to breakpoint marker4"
++    continue
++}
++
++gdb_test "print dx" "= 4"
++
++############################################
++# Test printing of namespace aliases
++
++if ![runto marker6] then {
++    perror "couldn't run to breakpoint marker6"
++    continue
++}
++
++gdb_test "print efx" "= 5"
++
++############################################
++# Test printing of variables imported from
++# nested namespaces
++
++if ![runto I::marker7] then {
++    perror "couldn't run to breakpoint I::marker7"
++    continue
++}
++
++gdb_test "print ghx" "= 6"
++
++############################################
++# Test that variables are not printed in a namespace
++# that is sibling to the namespace containing an import
++
++if ![runto L::marker8] then {
++    perror "couldn't run to breakpoint L::marker8"
++    continue
++}
++
++gdb_test "print jx" "= 44"
++
++gdb_breakpoint "K::marker9"
++gdb_continue_to_breakpoint "K::marker9"
++
++gdb_test "print jx" "No symbol \"jx\" in current context."
++
++############################################
++# Test that variables are only printed after the line
++# containing the import
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_breakpoint [gdb_get_line_number "marker10 stop"]
++gdb_continue_to_breakpoint "marker10 stop"
++
++gdb_test "print x" "= 911" "print x (from M::x)"
++
++gdb_test "next" ""
++
++gdb_test "print x" "= 912" "print x (from M::x)"
+diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp
+index 76b1b82..2042db2 100644
+--- a/gdb/testsuite/gdb.cp/namespace.exp
++++ b/gdb/testsuite/gdb.cp/namespace.exp
+@@ -24,6 +24,7 @@
+ # for namespaces.
+ # Note: As of 2000-06-03, they passed under g++ - djb
+ 
++load_lib "cp-support.exp"
+ 
+ if $tracelevel then {
+         strace $tracelevel
+@@ -259,11 +260,16 @@ gdb_test "ptype E" "type = namespace C::D::E"
+ gdb_test "ptype CClass" "type = (class C::CClass \{\r\n  public:|struct C::CClass \{)\r\n    int x;\r\n\}"
+ gdb_test "ptype CClass::NestedClass" "type = (class C::CClass::NestedClass \{\r\n  public:|struct C::CClass::NestedClass \{)\r\n    int y;\r\n\}"
+ gdb_test "ptype NestedClass" "No symbol \"NestedClass\" in current context."
+-setup_kfail "gdb/1448" "*-*-*"
+-gdb_test "ptype ::C::CClass" "type = class C::CClass \{\r\n  public:\r\n    int x;\r\n\}"
+-setup_kfail "gdb/1448" "*-*-*"
+-gdb_test "ptype ::C::CClass::NestedClass" "type = class C::CClass::NestedClass \{\r\n  public:\r\n    int y;\r\n\}"
+-setup_kfail "gdb/1448" "*-*-*"
++cp_test_ptype_class \
++	"ptype ::C::CClass" "" "class" "C::CClass" \
++	{
++	    { field public "int x;" }
++	}
++cp_test_ptype_class \
++	"ptype ::C::CClass::NestedClass" "" "class" "C::CClass::NestedClass" \
++	{
++	    { field public "int y;" }
++	}
+ gdb_test "ptype ::C::NestedClass" "No symbol \"NestedClass\" in namespace \"C\"."
+ gdb_test "ptype C::CClass" "No symbol \"CClass\" in namespace \"C::C\"."
+ gdb_test "ptype C::CClass::NestedClass" "No type \"CClass\" within class or namespace \"C::C\"."
+@@ -273,8 +279,11 @@ gdb_test "ptype C::NestedClass" "No symbol \"NestedClass\" in namespace \"C::C\"
+ 
+ gdb_test "print cOtherFile" "\\$\[0-9\].* = 316"
+ gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n  public:|struct C::OtherFileClass \{)\r\n    int z;\r\n\}"
+-setup_kfail "gdb/1448" "*-*-*"
+-gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n  public:\r\n    int z;\r\n\}"
++cp_test_ptype_class \
++	"ptype ::C::OtherFileClass" "" "class" "C::OtherFileClass" \
++	{
++	    { field public "int z;" }
++	}
+ gdb_test "ptype C::OtherFileClass" "No symbol \"OtherFileClass\" in namespace \"C::C\"."
+ 
+ # Some anonymous namespace tests.
+diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp
+index 24025a2..a72932e 100644
+--- a/gdb/testsuite/gdb.cp/overload.exp
++++ b/gdb/testsuite/gdb.cp/overload.exp
+@@ -74,12 +74,12 @@ set re_methods	"${re_methods}${ws}int overload1arg\\((void|)\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(char\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(signed char\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(unsigned char\\);"
+-set re_methods	"${re_methods}${ws}int overload1arg\\(short\\);"
+-set re_methods	"${re_methods}${ws}int overload1arg\\(unsigned short\\);"
++set re_methods	"${re_methods}${ws}int overload1arg\\(short( int)?\\);"
++set re_methods	"${re_methods}${ws}int overload1arg\\((unsigned short|short unsigned)( int)?\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(int\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(unsigned int\\);"
+-set re_methods	"${re_methods}${ws}int overload1arg\\(long\\);"
+-set re_methods	"${re_methods}${ws}int overload1arg\\(unsigned long\\);"
++set re_methods	"${re_methods}${ws}int overload1arg\\(long( int)?\\);"
++set re_methods	"${re_methods}${ws}int overload1arg\\((unsigned long|long unsigned)( int)?\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(float\\);"
+ set re_methods	"${re_methods}${ws}int overload1arg\\(double\\);"
+ set re_methods	"${re_methods}${ws}int overloadfnarg\\((void|)\\);"
+diff --git a/gdb/testsuite/gdb.cp/ovldbreak.exp b/gdb/testsuite/gdb.cp/ovldbreak.exp
+index 8a6b795..897171c 100644
+--- a/gdb/testsuite/gdb.cp/ovldbreak.exp
++++ b/gdb/testsuite/gdb.cp/ovldbreak.exp
+@@ -127,10 +127,24 @@ proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumber} {
+ }
+ 
+ # This is the expected menu for overload1arg.
+-# Note the arg type variations on lines 6 and 13.
++# Note the arg type variations for void and integer types.
+ # This accommodates different versions of g++.
+ 
+-set menu_overload1arg "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n\\\[4\\\] foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r\n\\\[5\\\] foo::overload1arg\\(long\\) at.*$srcfile:118\r\n\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n\\\[8\\\] foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r\n\\\[9\\\] foo::overload1arg\\(short\\) at.*$srcfile:114\r\n\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n> $"
++set    menu_overload1arg "\\\[0\\\] cancel\r\n"
++append menu_overload1arg "\\\[1\\\] all\r\n"
++append menu_overload1arg "\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n"
++append menu_overload1arg "\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n"
++append menu_overload1arg "\\\[4\\\] foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r\n"
++append menu_overload1arg "\\\[5\\\] foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r\n"
++append menu_overload1arg "\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n"
++append menu_overload1arg "\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n"
++append menu_overload1arg "\\\[8\\\] foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r\n"
++append menu_overload1arg "\\\[9\\\] foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r\n"
++append menu_overload1arg "\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n"
++append menu_overload1arg "\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n"
++append menu_overload1arg "\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n"
++append menu_overload1arg "\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n"
++append menu_overload1arg "> $"
+ 
+ # Set multiple-symbols to "ask", to allow us to test the use
+ # of the multiple-choice menu when breaking on an overloaded method.
+@@ -157,17 +171,17 @@ set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 13   13 110
+ 
+ gdb_test "info break" \
+     "Num     Type\[\t \]+Disp Enb Address\[\t \]+What.*
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in main(\\(void\\))? at.*$srcfile:49\r
+ \[\t \]+breakpoint already hit 1 time\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \
+@@ -215,17 +229,17 @@ gdb_expect {
+ 
+ gdb_test "info break" \
+     "Num     Type\[\t \]+Disp Enb Address\[\t \]+What.*
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in main(\\(void\\))? at.*$srcfile:49\r
+ \[\t \]+breakpoint already hit 1 time\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \
+@@ -296,12 +310,12 @@ gdb_test "info break" \
+     "Num     Type\[\t \]+Disp Enb Address\[\t \]+What.*
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:119\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:118\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r
+-\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:115\r
++\[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:114\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r
+ \[0-9\]+\[\t \]+breakpoint     keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r
 diff --git a/gdb/testsuite/gdb.cp/ref-types.exp b/gdb/testsuite/gdb.cp/ref-types.exp
 index 4784cb2..b2e55cf 100644
 --- a/gdb/testsuite/gdb.cp/ref-types.exp
@@ -31524,10 +35443,10 @@ index 0000000..22eb9f2
 +}
 diff --git a/gdb/testsuite/gdb.python/python-frame.exp b/gdb/testsuite/gdb.python/python-frame.exp
 new file mode 100644
-index 0000000..cfa2226
+index 0000000..f62f63d
 --- /dev/null
 +++ b/gdb/testsuite/gdb.python/python-frame.exp
-@@ -0,0 +1,83 @@
+@@ -0,0 +1,92 @@
 +# Copyright (C) 2009 Free Software Foundation, Inc.
 +
 +# This program is free software; you can redistribute it and/or modify
@@ -31593,6 +35512,7 @@ index 0000000..cfa2226
 +
 +gdb_breakpoint "f2"
 +gdb_continue_to_breakpoint "breakpoint at f2"
++gdb_test "up" "" ""
 +
 +gdb_py_test_silent_cmd "python frames = gdb.frames ()" "get frames list" 1
 +gdb_test "python print frames" "\\(<gdb.Frame object at 0x\[\[:xdigit:\]\]+>, <gdb.Frame object at 0x\[\[:xdigit:\]\]+>, <gdb.Frame object at 0x\[\[:xdigit:\]\]+>\\)" "verify frames list"
@@ -31605,10 +35525,18 @@ index 0000000..cfa2226
 +gdb_test "python print 'result =', f0.name ()" " = f2" "test Frame.name"
 +gdb_test "python print 'result =', f0.type () == gdb.NORMAL_FRAME" " = True" "test Frame.type"
 +gdb_test "python print 'result =', f0.unwind_stop_reason () == gdb.FRAME_UNWIND_NO_REASON" " = True" "test Frame.type"
++gdb_test "python print 'result =', gdb.frame_stop_reason_string (gdb.FRAME_UNWIND_INNER_ID)" " = previous frame inner to this frame \\(corrupt stack\\?\\)" "test gdb.frame_stop_reason_string"
 +gdb_test "python print 'result =', f0.pc ()" " = \[0-9\]+" "test Frame.pc"
 +gdb_test "python print 'result =', f0.addr_in_block ()" " = \[0-9\]+" "test Frame.addr_in_block"
 +gdb_test "python print 'result =', f0.older ().equals (f1)" " = True" "test Frame.older"
 +gdb_test "python print 'result =', f1.newer ().equals (f0)" " = True" "test Frame.newer"
++gdb_test "python print 'result =', f0.read_var_value ('b')" \
++  "ValueError: variable 'b' not found.*Error while executing Python code." \
++  "test Frame.read_var_value - error"
++gdb_test "python print 'result =', f0.read_var_value ('a')" " = 1" "test Frame.read_var_value - success"
++
++gdb_test "python print 'result =', gdb.newest_frame ().equals (f0)" " = True" "test gdb.newest_frame"
++gdb_test "python print 'result =', gdb.selected_frame ().equals (f1)" " = True" "test gdb.selected_frame"
 +
 +gdb_test "python print 'result =', f0.block ()" "<gdb.Block object at 0x\[\[:xdigit:\]\]+>" "test Frame.block"
 diff --git a/gdb/testsuite/gdb.python/python-function.exp b/gdb/testsuite/gdb.python/python-function.exp
@@ -32413,6 +36341,27 @@ index 8f5e0ab..9ca9593 100644
  
  test_value_in_inferior
 +test_value_after_death
+diff --git a/gdb/testsuite/lib/cp-support.exp b/gdb/testsuite/lib/cp-support.exp
+index dbd2f59..44e1b51 100644
+--- a/gdb/testsuite/lib/cp-support.exp
++++ b/gdb/testsuite/lib/cp-support.exp
+@@ -222,7 +222,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
+ 
+     set parse_okay 0
+     gdb_test_multiple "$in_command" "$in_testname // parse failed" {
+-	-re "type = (struct|class)${wsopt}(\[A-Za-z0-9_\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" {
++	-re "type = (struct|class)${wsopt}(\[A-Za-z0-9_:\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" {
+ 	    set parse_okay          1
+ 	    set actual_key          $expect_out(1,string)
+ 	    set actual_tag          $expect_out(2,string)
+@@ -231,6 +231,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
+ 	    set actual_tail         $expect_out(6,string)
+ 	}
+     }
++    
+     if { ! $parse_okay } then { return }
+ 
+     # Check the actual key.  It would be nice to require that it match
 diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
 index 820ab20..8b8e7c6 100644
 --- a/gdb/testsuite/lib/gdb.exp
@@ -32705,6 +36654,86 @@ index 1f824fa..4a92a13 100644
        break;
  
      case TYPE_CODE_BOOL:
+diff --git a/gdb/typeprint.h b/gdb/typeprint.h
+index f561310..b39fd17 100644
+--- a/gdb/typeprint.h
++++ b/gdb/typeprint.h
+@@ -26,4 +26,6 @@ void print_type_scalar (struct type * type, LONGEST, struct ui_file *);
+ 
+ void c_type_print_varspec_suffix (struct type *, struct ui_file *, int,
+ 				  int, int);
++
++void c_type_print_args (struct type *, struct ui_file *, int);
+ #endif
+diff --git a/gdb/ui-file.c b/gdb/ui-file.c
+index 02a0314..5c8c96e 100644
+--- a/gdb/ui-file.c
++++ b/gdb/ui-file.c
+@@ -22,6 +22,7 @@
+ 
+ #include "defs.h"
+ #include "ui-file.h"
++#include "gdb_obstack.h"
+ #include "gdb_string.h"
+ 
+ #include <errno.h>
+@@ -263,7 +264,7 @@ set_ui_file_data (struct ui_file *file, void *data,
+ }
+ 
+ /* ui_file utility function for converting a ``struct ui_file'' into
+-   a memory buffer''. */
++   a memory buffer. */
+ 
+ struct accumulated_ui_file
+ {
+@@ -297,6 +298,23 @@ ui_file_xstrdup (struct ui_file *file,
+   *length = acc.length;
+   return acc.buffer;
+ }
++
++static void
++do_ui_file_obsavestring (void *context, const char *buffer, long length)
++{
++  struct obstack *obstack = (struct obstack *) context;
++  obstack_grow (obstack, buffer, length);
++}
++
++char *
++ui_file_obsavestring (struct ui_file *file, struct obstack *obstack,
++		      long *length)
++{
++  ui_file_put (file, do_ui_file_obsavestring, obstack);
++  *length = obstack_object_size (obstack);
++  obstack_1grow (obstack, '\0');
++  return obstack_finish (obstack);
++}
+ \f
+ /* A pure memory based ``struct ui_file'' that can be used an output
+    buffer. The buffers accumulated contents are available via
+diff --git a/gdb/ui-file.h b/gdb/ui-file.h
+index 1562d5a..d86a7eb 100644
+--- a/gdb/ui-file.h
++++ b/gdb/ui-file.h
+@@ -19,6 +19,7 @@
+ #ifndef UI_FILE_H
+ #define UI_FILE_H
+ 
++struct obstack;
+ struct ui_file;
+ 
+ /* Create a generic ui_file object with null methods. */
+@@ -77,7 +78,10 @@ extern void ui_file_put (struct ui_file *src, ui_file_put_method_ftype *write, v
+    appended NUL. */
+ extern char *ui_file_xstrdup (struct ui_file *file, long *length);
+ 
+-
++/* Similar to ui_file_xstrdup, but return a new string allocated on
++   OBSTACK.  */
++extern char *ui_file_obsavestring (struct ui_file *file,
++				   struct obstack *obstack, long *length);
+ 
+ extern long ui_file_read (struct ui_file *file, char *buf, long length_buf);
+ 
 diff --git a/gdb/utils.c b/gdb/utils.c
 index 9224839..88a9a39 100644
 --- a/gdb/utils.c
@@ -33030,7 +37059,7 @@ index f38cdb8..8e103cf 100644
  }
  
 diff --git a/gdb/valops.c b/gdb/valops.c
-index 9810f2b..3f8d92c 100644
+index 9810f2b..14c562e 100644
 --- a/gdb/valops.c
 +++ b/gdb/valops.c
 @@ -38,6 +38,7 @@
@@ -33356,7 +37385,105 @@ index 9810f2b..3f8d92c 100644
  	  if (base_offset == -1)
  	    error (_("virtual baseclass botch"));
  	}
-@@ -2725,7 +2808,7 @@ value_struct_elt_for_reference (struct type *domain, int offset,
+@@ -2083,12 +2166,25 @@ find_overload_match (struct type **arg_types, int nargs,
+   if (method)
+     {
+       gdb_assert (obj);
++
++      /* OBJ may be a pointer value rather than the object itself.  */
++      obj = coerce_ref (obj);
++      while (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_PTR)
++	obj = coerce_ref (value_ind (obj));
+       obj_type_name = TYPE_NAME (value_type (obj));
+-      /* Hack: evaluate_subexp_standard often passes in a pointer
+-         value rather than the object itself, so try again.  */
+-      if ((!obj_type_name || !*obj_type_name) 
+-	  && (TYPE_CODE (value_type (obj)) == TYPE_CODE_PTR))
+-	obj_type_name = TYPE_NAME (TYPE_TARGET_TYPE (value_type (obj)));
++
++      /* First check whether this is a data member, e.g. a pointer to
++	 a function.  */
++      if (TYPE_CODE (check_typedef (value_type (obj))) == TYPE_CODE_STRUCT)
++	{
++	  *valp = search_struct_field (name, obj, 0,
++				       check_typedef (value_type (obj)), 0);
++	  if (*valp)
++	    {
++	      *staticp = 1;
++	      return 0;
++	    }
++	}
+ 
+       fns_ptr = value_find_oload_method_list (&temp, name, 
+ 					      0, &num_fns, 
+@@ -2108,16 +2204,29 @@ find_overload_match (struct type **arg_types, int nargs,
+     }
+   else
+     {
+-      const char *qualified_name = SYMBOL_CPLUS_DEMANGLED_NAME (fsym);
++      const char *qualified_name = SYMBOL_NATURAL_NAME (fsym);
+ 
+-      /* If we have a C++ name, try to extract just the function
+-	 part.  */
+-      if (qualified_name)
+-	func_name = cp_func_name (qualified_name);
++      /* If we have a function with a C++ name, try to extract just
++	 the function part.  Do not try this for non-functions (e.g.
++	 function pointers).  */
++      if (qualified_name
++	  && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym))) == TYPE_CODE_FUNC)
++	{
++	  func_name = cp_func_name (qualified_name);
++
++	  /* If cp_func_name did not remove anything, the name of the
++	     symbol did not include scope or argument types - it was
++	     probably a C-style function.  */
++	  if (func_name && strcmp (func_name, qualified_name) == 0)
++	    {
++	      xfree (func_name);
++	      func_name = NULL;
++	    }
++	}
+ 
+-      /* If there was no C++ name, this must be a C-style function.
+-	 Just return the same symbol.  Do the same if cp_func_name
+-	 fails for some reason.  */
++      /* If there was no C++ name, this must be a C-style function or
++	 not a function at all.  Just return the same symbol.  Do the
++	 same if cp_func_name fails for some reason.  */
+       if (func_name == NULL)
+         {
+ 	  *symp = fsym;
+@@ -2558,8 +2667,8 @@ check_field (struct type *type, const char *name)
+    the comment before value_struct_elt_for_reference.  */
+ 
+ struct value *
+-value_aggregate_elt (struct type *curtype,
+-		     char *name, int want_address,
++value_aggregate_elt (struct type *curtype, char *name,
++		     struct type *expect_type, int want_address,
+ 		     enum noside noside)
+ {
+   switch (TYPE_CODE (curtype))
+@@ -2567,7 +2676,7 @@ value_aggregate_elt (struct type *curtype,
+     case TYPE_CODE_STRUCT:
+     case TYPE_CODE_UNION:
+       return value_struct_elt_for_reference (curtype, 0, curtype, 
+-					     name, NULL,
++					     name, expect_type,
+ 					     want_address, noside);
+     case TYPE_CODE_NAMESPACE:
+       return value_namespace_elt (curtype, name, 
+@@ -2671,7 +2780,7 @@ value_struct_elt_for_reference (struct type *domain, int offset,
+ 	  if (intype)
+ 	    {
+ 	      while (j--)
+-		if (TYPE_FN_FIELD_TYPE (f, j) == intype)
++		if (compare_parameters (TYPE_FN_FIELD_TYPE (f, j), intype))
+ 		  break;
+ 	      if (j < 0)
+ 		error (_("no member function matches that type instantiation"));
+@@ -2725,7 +2834,7 @@ value_struct_elt_for_reference (struct type *domain, int offset,
  		  result = allocate_value (lookup_methodptr_type (TYPE_FN_FIELD_TYPE (f, j)));
  		  cplus_make_method_ptr (value_type (result),
  					 value_contents_writeable (result),
@@ -33365,7 +37492,16 @@ index 9810f2b..3f8d92c 100644
  		}
  	    }
  	  return result;
-@@ -2884,7 +2967,7 @@ value_full_object (struct value *argp,
+@@ -2791,7 +2900,7 @@ value_maybe_namespace_elt (const struct type *curtype,
+   struct symbol *sym;
+   struct value *result;
+ 
+-  sym = cp_lookup_symbol_namespace (namespace_name, name, NULL,
++  sym = cp_lookup_symbol_namespace_incremental (namespace_name, name, NULL,
+ 				    get_selected_block (0), 
+ 				    VAR_DOMAIN);
+ 
+@@ -2884,7 +2993,7 @@ value_full_object (struct value *argp,
    /* Go back by the computed top_offset from the beginning of the
       object, adjusting for the embedded offset of argp if that's what
       value_rtti_type used for its computation.  */
@@ -33374,7 +37510,7 @@ index 9810f2b..3f8d92c 100644
  			   (using_enc ? 0 : value_embedded_offset (argp)));
    deprecated_set_value_type (new_val, value_type (argp));
    set_value_embedded_offset (new_val, (using_enc
-@@ -2989,8 +3072,6 @@ value_slice (struct value *array, int lowbound, int length)
+@@ -2989,8 +3098,6 @@ value_slice (struct value *array, int lowbound, int length)
        || lowbound + length - 1 > upperbound)
      error (_("slice out of range"));
  
@@ -34079,7 +38215,7 @@ index 4d4329e..9312468 100644
 +  make_final_cleanup (value_history_cleanup, NULL);
  }
 diff --git a/gdb/value.h b/gdb/value.h
-index aa43365..fdb22d2 100644
+index aa43365..f41def9 100644
 --- a/gdb/value.h
 +++ b/gdb/value.h
 @@ -272,12 +272,23 @@ extern void set_value_component_location (struct value *component,
@@ -34136,7 +38272,15 @@ index aa43365..fdb22d2 100644
  extern struct value *value_string (char *ptr, int len);
  extern struct value *value_bitstring (char *ptr, int len);
  
-@@ -533,14 +551,14 @@ extern void set_internalvar_component (struct internalvar *var,
+@@ -435,6 +453,7 @@ extern struct value *value_struct_elt (struct value **argp,
+ 
+ extern struct value *value_aggregate_elt (struct type *curtype,
+ 					  char *name,
++					  struct type *expect_type,
+ 					  int want_address,
+ 					  enum noside noside);
+ 
+@@ -533,14 +552,14 @@ extern void set_internalvar_component (struct internalvar *var,
  				       int bitpos, int bitsize,
  				       struct value *newvalue);
  
@@ -34154,7 +38298,7 @@ index aa43365..fdb22d2 100644
  
  extern int value_equal (struct value *arg1, struct value *arg2);
  
-@@ -619,7 +637,7 @@ extern int common_val_print (struct value *val,
+@@ -619,7 +638,7 @@ extern int common_val_print (struct value *val,
  			     const struct value_print_options *options,
  			     const struct language_defn *language);
  
@@ -34163,7 +38307,7 @@ index aa43365..fdb22d2 100644
  			     struct ui_file *stream,
  			     const struct value_print_options *options);
  
-@@ -658,5 +676,22 @@ extern struct value *value_allocate_space_in_inferior (int);
+@@ -658,5 +677,22 @@ extern struct value *value_allocate_space_in_inferior (int);
  
  extern struct value *value_of_local (const char *name, int complain);
  

diff --git a/gdb.spec b/gdb.spec
index 8708894..beb4c12 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -9,7 +9,7 @@ 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 
 # 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.50.20090228
+Version: 6.8.50.20090302
 
 # 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.
@@ -370,11 +370,16 @@ Patch348: gdb-6.8-bz466901-backtrace-full-prelinked.patch
 # The merged branch `archer' of: http://sourceware.org/gdb/wiki/ProjectArcher
 Patch349: gdb-archer.patch
 
+# Fix parsing elf64-i386 files for kdump PAE vmcore dumps (BZ 457187).
+# - Turn on 64-bit BFD support, globally enable AC_SYS_LARGEFILE.
+Patch352: gdb-6.8-bz457187-largefile.patch
+
 BuildRequires: ncurses-devel texinfo gettext flex bison expat-devel
 Requires: readline
 BuildRequires: readline-devel
 Requires: rpm-libs
 BuildRequires: rpm-devel
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
 Requires: python-libs
 BuildRequires: python-devel
 
@@ -556,6 +561,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch337 -p1
 %patch343 -p1
 %patch348 -p1
+%patch352 -p1
 %patch124 -p1
 
 find -name "*.orig" | xargs rm -f
@@ -629,6 +635,7 @@ CFLAGS="$CFLAGS -O0 -ggdb2"
 %else
 	--without-libunwind				\
 %endif
+	--enable-64-bit-bfd				\
 %if 0%{?_with_debug:1}
 	--enable-static --disable-shared --enable-debug	\
 %endif
@@ -806,7 +813,8 @@ fi
 %{_bindir}/pstack
 %{_mandir}/*/gstack.1*
 %{_mandir}/*/pstack.1*
-%{_datadir}/%{name}
+%{python_sitelib}/gdb
+%{_datadir}/gdb
 %endif	# 0%{!?_with_upstream:1}
 %{_infodir}/annotate.info*
 %{_infodir}/gdb.info*
@@ -822,18 +830,22 @@ fi
 %endif
 
 %changelog
-* Sat Feb 28 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.50.20090228-1
+* Mon Mar  2 2009 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.8.50.20090302-1
 - Include the Archer Project: http://sourceware.org/gdb/wiki/ProjectArcher
   * [python] Python scripting support: http://sourceware.org/gdb/wiki/PythonGdb
   * [catch-syscall] Trap and display syscalls.
   * [delayed-symfile] Improve startup performance by lazily read psymtabs.
   * [exception-rewind] Fix fatal C++ exceptions in an inferior function call.
+  * [expr] Expressions, single-quote elimination, C++ input canonicalization.
+  * [using-directive] C++ namespaces.
   * [vla] C variable length arrays / DW_FORM_block / Fortran dynamic arrays.
   * [misc] Fix debuginfoless `return' (BZ 365111), fix command-line macros for
     expected GCC (BZ 479914), new testcase for valgrind (for BZ 483262),
     implement `info common' for Fortran, fix Fortran logical-kind=8 (BZ 465310),
-    fix static variable in C++ constructors (BZ 445912)
+    fix static variable in C++ constructors (BZ 445912), fix power7 (BZ 485319).
 - Upgrade to the FSF GDB gdb-6.8.50 snapshot.
+- Fix parsing elf64-i386 files for kdump PAE vmcore dumps (BZ 457187).
+  - Turn on 64-bit BFD support, globally enable AC_SYS_LARGEFILE.
 
 * Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 6.8.50.20090210-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild

diff --git a/sources b/sources
index 9222445..d211e26 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-4cde9c3dd1df54ec819af6407ec9d61b  gdb-6.8.50.20090228.tar.bz2
+a8eae0d4ef955ebcecfc7511af31070a  gdb-6.8.50.20090302.tar.bz2

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-07-23 18:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-23 18:29 [rpms/gdb] fix-dup-patch: - Include the Archer Project: http://sourceware.org/gdb/wiki/ProjectArcher Jan Kratochvil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox