public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/gdb] gdb-17.2-rebase-f44: - Upgrade to the FSF GDB snapshot: 7.0.50.20100121
@ 2026-06-27 23:54 Jan Kratochvil
  0 siblings, 0 replies; only message in thread
From: Jan Kratochvil @ 2026-06-27 23:54 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/gdb
            Branch : gdb-17.2-rebase-f44
            Commit : 79563d6f81f0d52d39f1d87f28aef92e56be9188
            Author : Jan Kratochvil <jkratoch@fedoraproject.org>
            Date   : 2010-01-21T16:09:11+00:00
            Stats  : +7841/-2449 in 14 file(s)
            URL    : https://src.fedoraproject.org/rpms/gdb/c/79563d6f81f0d52d39f1d87f28aef92e56be9188?branch=gdb-17.2-rebase-f44

            Log:
            - Upgrade to the FSF GDB snapshot: 7.0.50.20100121
- archer-jankratochvil-fedora13 commit:
    ccde1530479cc966374351038057b9dda90aa251
- [expr-cumulative] Archer branch is now included.

---
diff --git a/.cvsignore b/.cvsignore
index a5c3915..1caffd4 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1,2 +1,2 @@
-gdb-7.0.50.20100118.tar.bz2
+gdb-7.0.50.20100121.tar.bz2
 libstdc++-v3-python-r155978.tar.bz2

diff --git a/gdb-6.3-readnever-20050907.patch b/gdb-6.3-readnever-20050907.patch
index 433944d..bd89dd5 100644
--- a/gdb-6.3-readnever-20050907.patch
+++ b/gdb-6.3-readnever-20050907.patch
@@ -11,11 +11,11 @@
 
         * gdb.texinfo (File Options): Document --readnever.
 
-Index: gdb-7.0.50.20100115/gdb/doc/gdb.texinfo
+Index: gdb-7.0.50.20100121/gdb/doc/gdb.texinfo
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/doc/gdb.texinfo	2010-01-15 03:16:43.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/doc/gdb.texinfo	2010-01-15 03:20:04.000000000 +0100
-@@ -995,6 +995,12 @@ Read each symbol file's entire symbol ta
+--- gdb-7.0.50.20100121.orig/gdb/doc/gdb.texinfo	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/doc/gdb.texinfo	2010-01-21 15:13:02.000000000 +0100
+@@ -997,6 +997,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-7.0.50.20100115/gdb/doc/gdb.texinfo
  @end table
  
  @node Mode Options
-Index: gdb-7.0.50.20100115/gdb/main.c
+Index: gdb-7.0.50.20100121/gdb/main.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/main.c	2010-01-15 03:18:23.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/main.c	2010-01-15 03:20:04.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/main.c	2010-01-21 15:11:18.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/main.c	2010-01-21 15:13:02.000000000 +0100
 @@ -382,6 +382,7 @@ captured_main (void *data)
        {"xdb", no_argument, &xdb_commands, 1},
        {"dbx", no_argument, &dbx_commands, 1},
@@ -40,7 +40,7 @@ Index: gdb-7.0.50.20100115/gdb/main.c
        {"r", no_argument, &readnow_symbol_files, 1},
        {"quiet", no_argument, &quiet, 1},
        {"q", no_argument, &quiet, 1},
-@@ -1030,6 +1031,7 @@ Options:\n\n\
+@@ -1033,6 +1034,7 @@ Options:\n\n\
    fputs_unfiltered (_("\
    --quiet            Do not print version number on startup.\n\
    --readnow          Fully read symbol files on first access.\n\
@@ -48,10 +48,10 @@ Index: gdb-7.0.50.20100115/gdb/main.c
  "), stream);
    fputs_unfiltered (_("\
    --se=FILE          Use FILE as symbol file and executable file.\n\
-Index: gdb-7.0.50.20100115/gdb/symfile.c
+Index: gdb-7.0.50.20100121/gdb/symfile.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/symfile.c	2010-01-15 03:16:43.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/symfile.c	2010-01-15 03:20:04.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/symfile.c	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/symfile.c	2010-01-21 15:13:02.000000000 +0100
 @@ -79,6 +79,7 @@ static void clear_symtab_users_cleanup (
  
  /* Global variables owned by this file */
@@ -60,19 +60,19 @@ Index: gdb-7.0.50.20100115/gdb/symfile.c
  
  /* External variables and functions referenced. */
  
-Index: gdb-7.0.50.20100115/gdb/dwarf2read.c
+Index: gdb-7.0.50.20100121/gdb/dwarf2read.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/dwarf2read.c	2010-01-15 03:16:43.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/dwarf2read.c	2010-01-15 03:20:18.000000000 +0100
-@@ -50,6 +50,7 @@
- #include "addrmap.h"
- #include "block.h"
- #include "f-lang.h"
+--- gdb-7.0.50.20100121.orig/gdb/dwarf2read.c	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/dwarf2read.c	2010-01-21 15:13:15.000000000 +0100
+@@ -53,6 +53,7 @@
+ #include "typeprint.h"
+ #include "jv-lang.h"
+ #include "vec.h"
 +#include "top.h"
  
  #include <fcntl.h>
  #include "gdb_string.h"
-@@ -1226,7 +1227,8 @@ dwarf2_has_info (struct objfile *objfile
+@@ -1237,7 +1238,8 @@ dwarf2_has_info (struct objfile *objfile
  
        bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL);
      }
@@ -82,10 +82,10 @@ Index: gdb-7.0.50.20100115/gdb/dwarf2read.c
  	  && dwarf2_per_objfile->abbrev.asection != NULL);
  }
  
-Index: gdb-7.0.50.20100115/gdb/top.h
+Index: gdb-7.0.50.20100121/gdb/top.h
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/top.h	2010-01-01 08:31:42.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/top.h	2010-01-15 03:20:04.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/top.h	2010-01-01 08:31:42.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/top.h	2010-01-21 15:13:02.000000000 +0100
 @@ -63,6 +63,7 @@ extern void set_prompt (char *);
  
  /* From random places.  */

diff --git a/gdb-6.3-security-errata-20050610.patch b/gdb-6.3-security-errata-20050610.patch
index 56d75b9..5578570 100644
--- a/gdb-6.3-security-errata-20050610.patch
+++ b/gdb-6.3-security-errata-20050610.patch
@@ -19,11 +19,11 @@ Proposed upstream but never committed upstream.
         (source_command): Update documentation.  Check permissions if
         FROM_TTY is -1.
 
-Index: gdb-7.0.50.20100115/gdb/cli/cli-cmds.c
+Index: gdb-7.0.50.20100121/gdb/cli/cli-cmds.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/cli/cli-cmds.c	2010-01-15 03:16:43.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/cli/cli-cmds.c	2010-01-15 03:19:13.000000000 +0100
-@@ -37,6 +37,7 @@
+--- gdb-7.0.50.20100121.orig/gdb/cli/cli-cmds.c	2010-01-18 07:25:22.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/cli/cli-cmds.c	2010-01-21 15:12:28.000000000 +0100
+@@ -38,6 +38,7 @@
  #include "objfiles.h"
  #include "source.h"
  #include "disasm.h"
@@ -31,18 +31,9 @@ Index: gdb-7.0.50.20100115/gdb/cli/cli-cmds.c
  extern void disconnect_or_stop_tracing (int from_tty);
  
  #include "ui-out.h"
-@@ -475,7 +476,7 @@ source_script (char *file, int from_tty)
- 
-   if (fd == -1)
-     {
--      if (from_tty)
-+      if (from_tty > 0)
- 	perror_with_name (file);
-       else
- 	{
-@@ -484,6 +485,29 @@ source_script (char *file, int from_tty)
- 	}
-     }
+@@ -488,6 +489,29 @@ find_and_open_script (int from_tty, char
+ 	      file, O_RDONLY, &full_pathname);
+   make_cleanup (xfree, full_pathname);
  
 +#ifdef HAVE_GETUID
 +  if (from_tty == -1)
@@ -62,15 +53,24 @@ Index: gdb-7.0.50.20100115/gdb/cli/cli-cmds.c
 +	  warning (_("not using untrusted file \"%s\""), file);
 +	  close (fd);
 +	  do_cleanups (old_cleanups);
-+	  return;
++	  return 0;
 +	}
 +    }
 +#endif
 +
-   is_python = source_python;
-   if (strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py"))
-     is_python = 1;
-@@ -495,6 +519,7 @@ source_script (char *file, int from_tty)
+   /* Use the full path name, if it is found.  */
+   if (full_pathname != NULL && fd != -1)
+     {
+@@ -496,7 +520,7 @@ find_and_open_script (int from_tty, char
+ 
+   if (fd == -1)
+     {
+-      if (from_tty)
++      if (from_tty > 0)
+ 	perror_with_name (file);
+       else
+ 	{
+@@ -554,6 +578,7 @@ source_script (char *file, int from_tty)
    else
      script_from_file (stream, file);
  
@@ -78,10 +78,10 @@ Index: gdb-7.0.50.20100115/gdb/cli/cli-cmds.c
    do_cleanups (old_cleanups);
  }
  
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gdbinit.exp
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gdbinit.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gdbinit.exp	2010-01-15 03:18:23.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gdbinit.exp	2010-01-21 15:11:18.000000000 +0100
 @@ -0,0 +1,98 @@
 +#   Copyright 2005
 +#   Free Software Foundation, Inc.
@@ -181,17 +181,17 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gdbinit.exp
 +}
 +
 +remote_exec build "rm .gdbinit"
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gdbinit.sample
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gdbinit.sample
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gdbinit.sample	2010-01-15 03:18:23.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gdbinit.sample	2010-01-21 15:11:18.000000000 +0100
 @@ -0,0 +1 @@
 +echo "\nin gdbinit"
-Index: gdb-7.0.50.20100115/gdb/main.c
+Index: gdb-7.0.50.20100121/gdb/main.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/main.c	2010-01-15 03:16:43.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/main.c	2010-01-15 03:18:23.000000000 +0100
-@@ -815,7 +815,7 @@ Excess command line arguments ignored. (
+--- gdb-7.0.50.20100121.orig/gdb/main.c	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/main.c	2010-01-21 15:11:18.000000000 +0100
+@@ -818,7 +818,7 @@ Excess command line arguments ignored. (
       debugging or what directory you are in.  */
  
    if (home_gdbinit && !inhibit_gdbinit)
@@ -200,7 +200,7 @@ Index: gdb-7.0.50.20100115/gdb/main.c
  
    /* Now perform all the actions indicated by the arguments.  */
    if (cdarg != NULL)
-@@ -884,7 +884,7 @@ Can't attach to process and specify a co
+@@ -887,7 +887,7 @@ Can't attach to process and specify a co
    /* Read the .gdbinit file in the current directory, *if* it isn't
       the same as the $HOME/.gdbinit file (it should exist, also).  */
    if (local_gdbinit && !inhibit_gdbinit)

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

diff --git a/gdb-6.8-inlining-addon.patch b/gdb-6.8-inlining-addon.patch
index b41b807..7b84ef9 100644
--- a/gdb-6.8-inlining-addon.patch
+++ b/gdb-6.8-inlining-addon.patch
@@ -5,10 +5,10 @@ causing: FAIL: gdb.base/unwindonsignal.exp: unwindonsignal, stack unwound
 resume() -> target_resume() move of clear_inline_frame_state() is for:
 gdb.mi/mi-nsmoribund.exp
 
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-bt.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-bt.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-bt.c	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-bt.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-bt.c	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-bt.c	2010-01-21 15:14:47.000000000 +0100
 @@ -13,10 +13,16 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
@@ -28,10 +28,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-bt.c
  
  inline int func1(void)
  {
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-cmds.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-cmds.c	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-cmds.c	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-cmds.c	2010-01-21 15:14:47.000000000 +0100
 @@ -13,13 +13,19 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
@@ -54,10 +54,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.c
  inline int func1(void)
  {
    bar ();
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.exp
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-cmds.exp
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-cmds.exp	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.exp	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-cmds.exp	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-cmds.exp	2010-01-21 15:14:47.000000000 +0100
 @@ -230,7 +230,7 @@ set line3 [gdb_get_line_number "set brea
  gdb_breakpoint $line3
  gdb_continue_to_breakpoint "consecutive func1"
@@ -110,10 +110,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-cmds.exp
 +gdb_test "info frame" "inlined into frame.*" "outer_inline2 inlined"
 +gdb_test "fini" "" "up from outer_inline2"
 +gdb_test "info frame" " in main \[^\n\]*\n source language.*" "main not inlined"
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-locals.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-locals.c	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-locals.c	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-locals.c	2010-01-21 15:14:47.000000000 +0100
 @@ -13,11 +13,16 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
@@ -133,10 +133,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.c
  
  inline int func1(int arg1)
  {
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.exp
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-locals.exp
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-locals.exp	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.exp	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-locals.exp	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-locals.exp	2010-01-21 15:14:47.000000000 +0100
 @@ -77,6 +77,9 @@ if { ! $no_frames } {
  
  # Make sure that locals on the stack are found.  This is an array to
@@ -155,10 +155,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-locals.exp
 +    setup_kfail *-*-* "gcc/debug.optimization"
 +}
  gdb_test "print array\[0\]" "\\\$$decimal = 184" "print local (3)"
-Index: gdb-7.0.50.20100115/gdb/frame.c
+Index: gdb-7.0.50.20100121/gdb/frame.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/frame.c	2010-01-15 03:22:14.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/frame.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/frame.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/frame.c	2010-01-21 15:14:47.000000000 +0100
 @@ -316,7 +316,7 @@ fprint_frame (struct ui_file *file, stru
  static struct frame_info *
  skip_inlined_frames (struct frame_info *frame)
@@ -195,10 +195,10 @@ Index: gdb-7.0.50.20100115/gdb/frame.c
  	{
  	  sal->symtab = SYMBOL_SYMTAB (sym);
  	  sal->line = SYMBOL_LINE (sym);
-Index: gdb-7.0.50.20100115/gdb/breakpoint.c
+Index: gdb-7.0.50.20100121/gdb/breakpoint.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/breakpoint.c	2010-01-15 11:49:49.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/breakpoint.c	2010-01-15 11:52:20.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/breakpoint.c	2010-01-21 15:14:41.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/breakpoint.c	2010-01-21 15:14:47.000000000 +0100
 @@ -62,6 +62,7 @@
  #include "jit.h"
  #include "xml-syscall.h"
@@ -207,7 +207,7 @@ Index: gdb-7.0.50.20100115/gdb/breakpoint.c
  
  /* readline include files */
  #include "readline/readline.h"
-@@ -3560,10 +3561,24 @@ bpstat_check_breakpoint_conditions (bpst
+@@ -3558,10 +3559,24 @@ bpstat_check_breakpoint_conditions (bpst
    const struct bp_location *bl = bs->breakpoint_at;
    struct breakpoint *b = bl->owner;
  
@@ -236,7 +236,7 @@ Index: gdb-7.0.50.20100115/gdb/breakpoint.c
      {
        int value_is_zero = 0;
        
-@@ -3731,6 +3746,12 @@ bpstat_stop_status (struct address_space
+@@ -3729,6 +3744,12 @@ bpstat_stop_status (struct address_space
  		  bs->print = 0;
  		}
  	      bs->commands = copy_command_lines (bs->commands);
@@ -249,7 +249,7 @@ Index: gdb-7.0.50.20100115/gdb/breakpoint.c
  	    }
  
  	  /* Print nothing for this entry if we dont stop or dont print.  */
-@@ -6039,9 +6060,9 @@ set_momentary_breakpoint (struct gdbarch
+@@ -6043,9 +6064,9 @@ set_momentary_breakpoint (struct gdbarch
  {
    struct breakpoint *b;
  
@@ -262,10 +262,10 @@ Index: gdb-7.0.50.20100115/gdb/breakpoint.c
  
    b = set_raw_breakpoint (gdbarch, sal, type);
    b->enable_state = bp_enabled;
-Index: gdb-7.0.50.20100115/gdb/inline-frame.c
+Index: gdb-7.0.50.20100121/gdb/inline-frame.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/inline-frame.c	2010-01-01 08:31:36.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/inline-frame.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/inline-frame.c	2010-01-01 08:31:36.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/inline-frame.c	2010-01-21 15:14:47.000000000 +0100
 @@ -213,6 +213,12 @@ inline_frame_sniffer (const struct frame
    if (frame_block == NULL)
      return 0;
@@ -342,10 +342,10 @@ Index: gdb-7.0.50.20100115/gdb/inline-frame.c
  /* Return the number of hidden functions inlined into the current
     frame.  */
  
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-markers.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-markers.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/testsuite/gdb.opt/inline-markers.c	2010-01-01 08:32:04.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-markers.c	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/testsuite/gdb.opt/inline-markers.c	2010-01-01 08:32:04.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.opt/inline-markers.c	2010-01-21 15:14:47.000000000 +0100
 @@ -15,11 +15,6 @@
  
  extern int x, y;
@@ -358,10 +358,10 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.opt/inline-markers.c
  void marker(void)
  {
    x += y; /* set breakpoint 2 here */
-Index: gdb-7.0.50.20100115/gdb/gdbthread.h
+Index: gdb-7.0.50.20100121/gdb/gdbthread.h
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/gdbthread.h	2010-01-15 03:22:13.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/gdbthread.h	2010-01-15 11:51:19.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/gdbthread.h	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/gdbthread.h	2010-01-21 15:14:47.000000000 +0100
 @@ -195,6 +195,12 @@ struct thread_info
    /* Function that is called to free PRIVATE.  If this is NULL, then
       xfree will be called on PRIVATE.  */
@@ -375,11 +375,11 @@ Index: gdb-7.0.50.20100115/gdb/gdbthread.h
  };
  
  /* Create an empty thread list, or empty the existing one.  */
-Index: gdb-7.0.50.20100115/gdb/infcmd.c
+Index: gdb-7.0.50.20100121/gdb/infcmd.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/infcmd.c	2010-01-15 03:22:13.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/infcmd.c	2010-01-15 11:51:53.000000000 +0100
-@@ -1438,11 +1438,11 @@ finish_command_continuation (void *arg)
+--- gdb-7.0.50.20100121.orig/gdb/infcmd.c	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/infcmd.c	2010-01-21 15:14:47.000000000 +0100
+@@ -1439,11 +1439,11 @@ finish_command_continuation (void *arg)
        struct type *value_type;
  
        value_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (a->function));
@@ -393,7 +393,7 @@ Index: gdb-7.0.50.20100115/gdb/infcmd.c
  	print_return_value (SYMBOL_TYPE (a->function), value_type);
      }
  
-@@ -1550,6 +1550,16 @@ finish_forward (struct symbol *function,
+@@ -1551,6 +1551,16 @@ finish_forward (struct symbol *function,
    tp->initiating_frame = get_frame_id (frame);
    make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
  
@@ -410,7 +410,7 @@ Index: gdb-7.0.50.20100115/gdb/infcmd.c
    tp->proceed_to_finish = 1;    /* We want stop_registers, please...  */
    cargs = xmalloc (sizeof (*cargs));
  
-@@ -1570,7 +1580,9 @@ finish_forward (struct symbol *function,
+@@ -1571,7 +1581,9 @@ finish_forward (struct symbol *function,
  static void
  finish_command (char *arg, int from_tty)
  {
@@ -421,7 +421,7 @@ Index: gdb-7.0.50.20100115/gdb/infcmd.c
    struct symbol *function;
  
    int async_exec = 0;
-@@ -1601,45 +1613,63 @@ finish_command (char *arg, int from_tty)
+@@ -1602,45 +1614,63 @@ finish_command (char *arg, int from_tty)
    if (!target_has_execution)
      error (_("The program is not running."));
  
@@ -502,7 +502,7 @@ Index: gdb-7.0.50.20100115/gdb/infcmd.c
  
    /* Print info on the selected frame, including level number but not
       source.  */
-@@ -1653,10 +1683,14 @@ finish_command (char *arg, int from_tty)
+@@ -1654,10 +1684,14 @@ finish_command (char *arg, int from_tty)
        print_stack_frame (get_selected_frame (NULL), 1, LOCATION);
      }
  
@@ -518,11 +518,11 @@ Index: gdb-7.0.50.20100115/gdb/infcmd.c
  }
  \f
  
-Index: gdb-7.0.50.20100115/gdb/target.c
+Index: gdb-7.0.50.20100121/gdb/target.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/target.c	2010-01-15 03:22:31.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/target.c	2010-01-15 11:50:59.000000000 +0100
-@@ -2241,6 +2241,7 @@ target_resume (ptid_t ptid, int step, en
+--- gdb-7.0.50.20100121.orig/gdb/target.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/target.c	2010-01-21 15:14:47.000000000 +0100
+@@ -2216,6 +2216,7 @@ target_resume (ptid_t ptid, int step, en
  {
    struct target_ops *t;
  
@@ -530,10 +530,10 @@ Index: gdb-7.0.50.20100115/gdb/target.c
    target_dcache_invalidate ();
  
    for (t = current_target.beneath; t != NULL; t = t->beneath)
-Index: gdb-7.0.50.20100115/gdb/inline-frame.h
+Index: gdb-7.0.50.20100121/gdb/inline-frame.h
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/inline-frame.h	2010-01-01 08:31:36.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/inline-frame.h	2010-01-15 11:50:59.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/inline-frame.h	2010-01-01 08:31:36.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/inline-frame.h	2010-01-21 15:14:47.000000000 +0100
 @@ -43,6 +43,10 @@ void clear_inline_frame_state (ptid_t pt
  
  void step_into_inline_frame (ptid_t ptid);
@@ -545,19 +545,19 @@ Index: gdb-7.0.50.20100115/gdb/inline-frame.h
  /* Return the number of hidden functions inlined into the current
     frame.  */
  
-Index: gdb-7.0.50.20100115/gdb/dwarf2read.c
+Index: gdb-7.0.50.20100121/gdb/dwarf2read.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/dwarf2read.c	2010-01-15 11:46:29.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/dwarf2read.c	2010-01-15 11:52:59.000000000 +0100
-@@ -4078,6 +4078,7 @@ read_func_scope (struct die_info *die, s
-   CORE_ADDR baseaddr;
+--- gdb-7.0.50.20100121.orig/gdb/dwarf2read.c	2010-01-21 15:14:41.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/dwarf2read.c	2010-01-21 15:15:09.000000000 +0100
+@@ -4137,6 +4137,7 @@ read_func_scope (struct die_info *die, s
    struct block *block;
+   unsigned die_children = 0;
    int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
 +  struct type *type;
  
    if (inlined_func)
      {
-@@ -4109,7 +4110,10 @@ read_func_scope (struct die_info *die, s
+@@ -4178,7 +4179,10 @@ read_func_scope (struct die_info *die, s
    add_to_cu_func_list (name, lowpc, highpc, cu);
  
    new = push_context (0, lowpc);

diff --git a/gdb-archer.patch b/gdb-archer.patch
index 67e6510..2e89450 100644
--- a/gdb-archer.patch
+++ b/gdb-archer.patch
@@ -2,7 +2,7 @@ http://sourceware.org/gdb/wiki/ProjectArcher
 http://sourceware.org/gdb/wiki/ArcherBranchManagement
 
 GIT snapshot:
-commit 81810a20b2d2c3bf18e151de3cddfc96445b3c46
+commit ccde1530479cc966374351038057b9dda90aa251
 
 branch `archer' - the merge of branches:
 archer-tromey-delayed-symfile
@@ -11,7 +11,7 @@ archer-pmuldoon-next-over-throw
 archer-jankratochvil-fortran-module
 archer-jankratochvil-watchpoint
 archer-jankratochvil-vla
-TODO:archer-keiths-expr-cumulative
+archer-keiths-expr-cumulative
 
 
 diff --git a/gdb/Makefile.in b/gdb/Makefile.in
@@ -188,38 +188,27 @@ index ff8b86e..f450a7b 100644
  #
  # Dependency tracking.  Most of this is conditional on GNU Make being
  # found by configure; if GNU Make is not found, we fall back to a
-diff --git a/gdb/NEWS b/gdb/NEWS
-index 17d64fb..e0eb160 100644
---- a/gdb/NEWS
-+++ b/gdb/NEWS
-@@ -669,6 +669,13 @@ x86/x86_64 Darwin		i[34567]86-*-darwin*
- 
- x86_64 MinGW			x86_64-*-mingw*
- 
-+* New native configurations
-+
-+x86/x86_64 Darwin		i[34567]86-*-darwin*
-+
-+info os processes
-+  Show operating system information about processes.
-+
- * New targets
- 
- Lattice Mico32                  lm32-*
 diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
-index 24def95..4682045 100644
+index 40b70ab..b291d40 100644
 --- a/gdb/ada-lang.c
 +++ b/gdb/ada-lang.c
-@@ -1644,7 +1644,7 @@ ada_type_of_array (struct value *arr, int bounds)
-         return NULL;
-       while (arity > 0)
-         {
--          struct type *range_type = alloc_type_copy (value_type (arr));
-+	  struct type *range_type = alloc_type_copy (value_type (arr));
-           struct type *array_type = alloc_type_copy (value_type (arr));
-           struct value *low = desc_one_bound (descriptor, arity, 0);
-           struct value *high = desc_one_bound (descriptor, arity, 1);
-@@ -10937,6 +10937,40 @@ ada_operator_length (struct expression *exp, int pc, int *oplenp, int *argsp)
+@@ -4781,14 +4781,10 @@ ada_lookup_symbol (const char *name, const struct block *block0,
+ 
+ static struct symbol *
+ ada_lookup_symbol_nonlocal (const char *name,
+-                            const char *linkage_name,
+                             const struct block *block,
+                             const domain_enum domain)
+ {
+-  if (linkage_name == NULL)
+-    linkage_name = name;
+-  return ada_lookup_symbol (linkage_name, block_static_block (block), domain,
+-                            NULL);
++  return ada_lookup_symbol (name, block_static_block (block), domain, NULL);
+ }
+ 
+ 
+@@ -10931,6 +10927,40 @@ ada_operator_length (struct expression *exp, int pc, int *oplenp, int *argsp)
      }
  }
  
@@ -260,7 +249,7 @@ index 24def95..4682045 100644
  static char *
  ada_op_name (enum exp_opcode opcode)
  {
-@@ -11325,6 +11359,7 @@ parse (void)
+@@ -11319,6 +11349,7 @@ parse (void)
  static const struct exp_descriptor ada_exp_descriptor = {
    ada_print_subexp,
    ada_operator_length,
@@ -301,11 +290,36 @@ index 5c9e558..55a1873 100644
    i386_set_debug_register_length (8);
  
    /* Override the GNU/Linux inferior startup hook.  */
+diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
+index 5776bb0..6099e99 100644
+--- a/gdb/ax-gdb.c
++++ b/gdb/ax-gdb.c
+@@ -1810,7 +1810,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
+ 
+ 	/* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
+ 	   symbol instead of the LOC_ARG one (if both exist).  */
+-	sym = lookup_block_symbol (b, this_name, NULL, VAR_DOMAIN);
++	sym = lookup_block_symbol (b, this_name, VAR_DOMAIN);
+ 	if (!sym)
+ 	  error (_("no `%s' found"), this_name);
+ 
 diff --git a/gdb/block.c b/gdb/block.c
-index 48ac21b..80003b8 100644
+index 48ac21b..0eccecb 100644
 --- a/gdb/block.c
 +++ b/gdb/block.c
-@@ -318,6 +318,25 @@ allocate_block (struct obstack *obstack)
+@@ -227,8 +227,9 @@ block_set_scope (struct block *block, const char *scope,
+   BLOCK_NAMESPACE (block)->scope = scope;
+ }
+ 
+-/* This returns the using directives list associated with BLOCK, if
+-   any.  */
++/* This returns the first using directives associated with BLOCK, if
++   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)
+@@ -318,6 +319,25 @@ allocate_block (struct obstack *obstack)
    BLOCK_SUPERBLOCK (bl) = NULL;
    BLOCK_DICT (bl) = NULL;
    BLOCK_NAMESPACE (bl) = NULL;
@@ -367,7 +381,7 @@ index 7eedb6c..b147826 100644
 +
  #endif /* BLOCK_H */
 diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
-index 0dc8474..1a309b5 100644
+index d404ee7..2be397f 100644
 --- a/gdb/breakpoint.c
 +++ b/gdb/breakpoint.c
 @@ -61,6 +61,7 @@
@@ -378,7 +392,7 @@ index 0dc8474..1a309b5 100644
  
  /* readline include files */
  #include "readline/readline.h"
-@@ -616,6 +617,53 @@ get_breakpoint (int num)
+@@ -614,6 +615,53 @@ get_breakpoint (int num)
  }
  
  \f
@@ -432,7 +446,7 @@ index 0dc8474..1a309b5 100644
  /* condition N EXP -- set break condition of breakpoint N to EXP.  */
  
  static void
-@@ -636,42 +684,7 @@ condition_command (char *arg, int from_tty)
+@@ -634,42 +682,7 @@ condition_command (char *arg, int from_tty)
    ALL_BREAKPOINTS (b)
      if (b->number == bnum)
        {
@@ -476,7 +490,7 @@ index 0dc8474..1a309b5 100644
  	return;
        }
  
-@@ -1870,6 +1883,36 @@ create_longjmp_master_breakpoint (char *func_name)
+@@ -1868,6 +1881,36 @@ create_longjmp_master_breakpoint (char *func_name)
    do_cleanups (old_chain);
  }
  
@@ -513,7 +527,7 @@ index 0dc8474..1a309b5 100644
  void
  update_breakpoints_after_exec (void)
  {
-@@ -1911,7 +1954,7 @@ update_breakpoints_after_exec (void)
+@@ -1909,7 +1952,7 @@ update_breakpoints_after_exec (void)
      /* Thread event breakpoints must be set anew after an exec(),
         as must overlay event and longjmp master breakpoints.  */
      if (b->type == bp_thread_event || b->type == bp_overlay_event
@@ -522,7 +536,7 @@ index 0dc8474..1a309b5 100644
        {
  	delete_breakpoint (b);
  	continue;
-@@ -1926,7 +1969,8 @@ update_breakpoints_after_exec (void)
+@@ -1924,7 +1967,8 @@ update_breakpoints_after_exec (void)
  
      /* Longjmp and longjmp-resume breakpoints are also meaningless
         after an exec.  */
@@ -532,7 +546,7 @@ index 0dc8474..1a309b5 100644
        {
  	delete_breakpoint (b);
  	continue;
-@@ -1987,6 +2031,7 @@ update_breakpoints_after_exec (void)
+@@ -1985,6 +2029,7 @@ update_breakpoints_after_exec (void)
    create_longjmp_master_breakpoint ("_longjmp");
    create_longjmp_master_breakpoint ("siglongjmp");
    create_longjmp_master_breakpoint ("_siglongjmp");
@@ -540,7 +554,7 @@ index 0dc8474..1a309b5 100644
  }
  
  int
-@@ -2010,6 +2055,7 @@ detach_breakpoints (int pid)
+@@ -2008,6 +2053,7 @@ detach_breakpoints (int pid)
      if (b->inserted)
        val |= remove_breakpoint_1 (b, mark_inserted);
    }
@@ -548,7 +562,7 @@ index 0dc8474..1a309b5 100644
    do_cleanups (old_chain);
    return val;
  }
-@@ -2109,12 +2155,14 @@ remove_breakpoint_1 (struct bp_location *b, insertion_state_t is)
+@@ -2107,12 +2153,14 @@ remove_breakpoint_1 (struct bp_location *b, insertion_state_t is)
  	return val;
        b->inserted = (is == mark_inserted);
      }
@@ -565,7 +579,7 @@ index 0dc8474..1a309b5 100644
        val = target_remove_watchpoint (b->address, b->length, 
  				      b->watchpoint_type);
  
-@@ -2894,6 +2942,12 @@ print_it_typical (bpstat bs)
+@@ -2892,6 +2940,12 @@ print_it_typical (bpstat bs)
        result = PRINT_NOTHING;
        break;
  
@@ -578,7 +592,7 @@ index 0dc8474..1a309b5 100644
      case bp_watchpoint:
      case bp_hardware_watchpoint:
        annotate_watchpoint (b->number);
-@@ -2981,6 +3035,8 @@ print_it_typical (bpstat bs)
+@@ -2979,6 +3033,8 @@ print_it_typical (bpstat bs)
      case bp_none:
      case bp_longjmp:
      case bp_longjmp_resume:
@@ -587,7 +601,7 @@ index 0dc8474..1a309b5 100644
      case bp_step_resume:
      case bp_watchpoint_scope:
      case bp_call_dummy:
-@@ -3385,8 +3441,12 @@ bpstat_check_location (const struct bp_location *bl,
+@@ -3383,8 +3439,12 @@ bpstat_check_location (const struct bp_location *bl,
  
  /* If BS refers to a watchpoint, determine if the watched values
     has actually changed, and we should stop.  If not, set BS->stop
@@ -602,7 +616,7 @@ index 0dc8474..1a309b5 100644
  bpstat_check_watchpoint (bpstat bs)
  {
    const struct bp_location *bl = bs->breakpoint_at;
-@@ -3475,8 +3535,10 @@ bpstat_check_watchpoint (bpstat bs)
+@@ -3473,8 +3533,10 @@ bpstat_check_watchpoint (bpstat bs)
  	     anything for this watchpoint.  */
  	  bs->print_it = print_it_noop;
  	  bs->stop = 0;
@@ -613,7 +627,7 @@ index 0dc8474..1a309b5 100644
  }
  
  
-@@ -3590,6 +3652,8 @@ bpstat_stop_status (struct address_space *aspace,
+@@ -3588,6 +3650,8 @@ bpstat_stop_status (struct address_space *aspace,
  
        for (bl = b->loc; bl != NULL; bl = bl->next)
  	{
@@ -622,7 +636,7 @@ index 0dc8474..1a309b5 100644
  	  /* For hardware watchpoints, we look only at the first location.
  	     The watchpoint_check function will work on entire expression,
  	     not the individual locations.  For read watchopints, the
-@@ -3607,6 +3671,7 @@ bpstat_stop_status (struct address_space *aspace,
+@@ -3605,6 +3669,7 @@ bpstat_stop_status (struct address_space *aspace,
  	  /* Come here if it's a watchpoint, or if the break address matches */
  
  	  bs = bpstat_alloc (bl, bs);	/* Alloc a bpstat to explain stop */
@@ -630,7 +644,7 @@ index 0dc8474..1a309b5 100644
  
  	  /* Assume we stop.  Should we find watchpoint that is not actually
  	     triggered, or if condition of breakpoint is false, we'll reset
-@@ -3614,12 +3679,22 @@ bpstat_stop_status (struct address_space *aspace,
+@@ -3612,12 +3677,22 @@ bpstat_stop_status (struct address_space *aspace,
  	  bs->stop = 1;
  	  bs->print = 1;
  
@@ -657,7 +671,7 @@ index 0dc8474..1a309b5 100644
  	    /* We do not stop for these.  */
  	    bs->stop = 0;
  	  else
-@@ -3829,6 +3904,7 @@ bpstat_what (bpstat bs)
+@@ -3827,6 +3902,7 @@ bpstat_what (bpstat bs)
    struct bpstat_what retval;
  
    retval.call_dummy = 0;
@@ -665,7 +679,7 @@ index 0dc8474..1a309b5 100644
    for (; bs != NULL; bs = bs->next)
      {
        enum class bs_class = no_effect;
-@@ -3875,10 +3951,15 @@ bpstat_what (bpstat bs)
+@@ -3873,10 +3949,15 @@ bpstat_what (bpstat bs)
  	    bs_class = no_effect;
  	  break;
  	case bp_longjmp:
@@ -681,7 +695,7 @@ index 0dc8474..1a309b5 100644
  	  break;
  	case bp_step_resume:
  	  if (bs->stop)
-@@ -3901,6 +3982,7 @@ bpstat_what (bpstat bs)
+@@ -3899,6 +3980,7 @@ bpstat_what (bpstat bs)
  	case bp_thread_event:
  	case bp_overlay_event:
  	case bp_longjmp_master:
@@ -689,7 +703,7 @@ index 0dc8474..1a309b5 100644
  	  bs_class = bp_nostop;
  	  break;
  	case bp_catchpoint:
-@@ -4045,6 +4127,8 @@ print_one_breakpoint_location (struct breakpoint *b,
+@@ -4043,6 +4125,8 @@ print_one_breakpoint_location (struct breakpoint *b,
      {bp_access_watchpoint, "acc watchpoint"},
      {bp_longjmp, "longjmp"},
      {bp_longjmp_resume, "longjmp resume"},
@@ -698,7 +712,7 @@ index 0dc8474..1a309b5 100644
      {bp_step_resume, "step resume"},
      {bp_watchpoint_scope, "watchpoint scope"},
      {bp_call_dummy, "call dummy"},
-@@ -4052,6 +4136,7 @@ print_one_breakpoint_location (struct breakpoint *b,
+@@ -4050,6 +4134,7 @@ print_one_breakpoint_location (struct breakpoint *b,
      {bp_thread_event, "thread events"},
      {bp_overlay_event, "overlay events"},
      {bp_longjmp_master, "longjmp master"},
@@ -706,7 +720,7 @@ index 0dc8474..1a309b5 100644
      {bp_catchpoint, "catchpoint"},
      {bp_tracepoint, "tracepoint"},
      {bp_fast_tracepoint, "fast tracepoint"},
-@@ -4176,6 +4261,8 @@ print_one_breakpoint_location (struct breakpoint *b,
+@@ -4174,6 +4259,8 @@ print_one_breakpoint_location (struct breakpoint *b,
        case bp_finish:
        case bp_longjmp:
        case bp_longjmp_resume:
@@ -715,7 +729,7 @@ index 0dc8474..1a309b5 100644
        case bp_step_resume:
        case bp_watchpoint_scope:
        case bp_call_dummy:
-@@ -4183,6 +4270,7 @@ print_one_breakpoint_location (struct breakpoint *b,
+@@ -4181,6 +4268,7 @@ print_one_breakpoint_location (struct breakpoint *b,
        case bp_thread_event:
        case bp_overlay_event:
        case bp_longjmp_master:
@@ -723,7 +737,7 @@ index 0dc8474..1a309b5 100644
        case bp_tracepoint:
        case bp_fast_tracepoint:
        case bp_jit_event:
-@@ -4821,6 +4909,8 @@ allocate_bp_location (struct breakpoint *bpt)
+@@ -4819,6 +4907,8 @@ allocate_bp_location (struct breakpoint *bpt)
      case bp_finish:
      case bp_longjmp:
      case bp_longjmp_resume:
@@ -732,7 +746,7 @@ index 0dc8474..1a309b5 100644
      case bp_step_resume:
      case bp_watchpoint_scope:
      case bp_call_dummy:
-@@ -4829,6 +4919,7 @@ allocate_bp_location (struct breakpoint *bpt)
+@@ -4827,6 +4917,7 @@ allocate_bp_location (struct breakpoint *bpt)
      case bp_overlay_event:
      case bp_jit_event:
      case bp_longjmp_master:
@@ -740,7 +754,7 @@ index 0dc8474..1a309b5 100644
        loc->loc_type = bp_loc_software_breakpoint;
        break;
      case bp_hardware_breakpoint:
-@@ -5015,8 +5106,7 @@ make_breakpoint_permanent (struct breakpoint *b)
+@@ -5013,8 +5104,7 @@ make_breakpoint_permanent (struct breakpoint *b)
  }
  
  /* Call this routine when stepping and nexting to enable a breakpoint
@@ -750,7 +764,7 @@ index 0dc8474..1a309b5 100644
  
  void
  set_longjmp_breakpoint (int thread)
-@@ -5029,10 +5119,11 @@ set_longjmp_breakpoint (int thread)
+@@ -5027,10 +5117,11 @@ set_longjmp_breakpoint (int thread)
       clones of those and enable them for the requested thread.  */
    ALL_BREAKPOINTS_SAFE (b, temp)
      if (b->pspace == current_program_space
@@ -764,7 +778,7 @@ index 0dc8474..1a309b5 100644
  	clone->thread = thread;
        }
  }
-@@ -5044,7 +5135,7 @@ delete_longjmp_breakpoint (int thread)
+@@ -5042,7 +5133,7 @@ delete_longjmp_breakpoint (int thread)
    struct breakpoint *b, *temp;
  
    ALL_BREAKPOINTS_SAFE (b, temp)
@@ -773,7 +787,7 @@ index 0dc8474..1a309b5 100644
        {
  	if (b->thread == thread)
  	  delete_breakpoint (b);
-@@ -6119,6 +6210,8 @@ mention (struct breakpoint *b)
+@@ -6117,6 +6208,8 @@ mention (struct breakpoint *b)
        case bp_finish:
        case bp_longjmp:
        case bp_longjmp_resume:
@@ -782,7 +796,7 @@ index 0dc8474..1a309b5 100644
        case bp_step_resume:
        case bp_call_dummy:
        case bp_watchpoint_scope:
-@@ -6127,6 +6220,7 @@ mention (struct breakpoint *b)
+@@ -6125,6 +6218,7 @@ mention (struct breakpoint *b)
        case bp_overlay_event:
        case bp_jit_event:
        case bp_longjmp_master:
@@ -790,7 +804,7 @@ index 0dc8474..1a309b5 100644
  	break;
        }
  
-@@ -7511,6 +7605,7 @@ struct until_break_command_continuation_args
+@@ -7509,6 +7603,7 @@ struct until_break_command_continuation_args
  {
    struct breakpoint *breakpoint;
    struct breakpoint *breakpoint2;
@@ -798,7 +812,7 @@ index 0dc8474..1a309b5 100644
  };
  
  /* This function is called by fetch_inferior_event via the
-@@ -7525,6 +7620,7 @@ until_break_command_continuation (void *arg)
+@@ -7523,6 +7618,7 @@ until_break_command_continuation (void *arg)
    delete_breakpoint (a->breakpoint);
    if (a->breakpoint2)
      delete_breakpoint (a->breakpoint2);
@@ -806,7 +820,7 @@ index 0dc8474..1a309b5 100644
  }
  
  void
-@@ -7536,6 +7632,8 @@ until_break_command (char *arg, int from_tty, int anywhere)
+@@ -7534,6 +7630,8 @@ until_break_command (char *arg, int from_tty, int anywhere)
    struct breakpoint *breakpoint;
    struct breakpoint *breakpoint2 = NULL;
    struct cleanup *old_chain;
@@ -815,7 +829,7 @@ index 0dc8474..1a309b5 100644
  
    clear_proceed_status ();
  
-@@ -7574,6 +7672,9 @@ until_break_command (char *arg, int from_tty, int anywhere)
+@@ -7572,6 +7670,9 @@ until_break_command (char *arg, int from_tty, int anywhere)
  
    old_chain = make_cleanup_delete_breakpoint (breakpoint);
  
@@ -825,7 +839,7 @@ index 0dc8474..1a309b5 100644
    /* Keep within the current frame, or in frames called by the current
       one.  */
  
-@@ -7586,6 +7687,10 @@ until_break_command (char *arg, int from_tty, int anywhere)
+@@ -7584,6 +7685,10 @@ until_break_command (char *arg, int from_tty, int anywhere)
  					      frame_unwind_caller_id (frame),
  					      bp_until);
        make_cleanup_delete_breakpoint (breakpoint2);
@@ -836,7 +850,7 @@ index 0dc8474..1a309b5 100644
      }
  
    proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
-@@ -7602,6 +7707,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
+@@ -7600,6 +7705,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
  
        args->breakpoint = breakpoint;
        args->breakpoint2 = breakpoint2;
@@ -844,7 +858,7 @@ index 0dc8474..1a309b5 100644
  
        discard_cleanups (old_chain);
        add_continuation (inferior_thread (),
-@@ -8823,6 +8929,7 @@ delete_command (char *arg, int from_tty)
+@@ -8785,6 +8891,7 @@ delete_command (char *arg, int from_tty)
  	    && b->type != bp_thread_event
  	    && b->type != bp_overlay_event
  	    && b->type != bp_longjmp_master
@@ -852,7 +866,7 @@ index 0dc8474..1a309b5 100644
  	    && b->number >= 0)
  	  {
  	    breaks_to_delete = 1;
-@@ -8842,6 +8949,7 @@ delete_command (char *arg, int from_tty)
+@@ -8804,6 +8911,7 @@ delete_command (char *arg, int from_tty)
  		&& b->type != bp_jit_event
  		&& b->type != bp_overlay_event
  		&& b->type != bp_longjmp_master
@@ -860,7 +874,7 @@ index 0dc8474..1a309b5 100644
  		&& b->number >= 0)
  	      delete_breakpoint (b);
  	  }
-@@ -9152,6 +9260,7 @@ breakpoint_re_set_one (void *bint)
+@@ -9114,6 +9222,7 @@ breakpoint_re_set_one (void *bint)
  	 reset later by breakpoint_re_set.  */
      case bp_overlay_event:
      case bp_longjmp_master:
@@ -868,7 +882,7 @@ index 0dc8474..1a309b5 100644
        delete_breakpoint (b);
        break;
  
-@@ -9174,6 +9283,8 @@ breakpoint_re_set_one (void *bint)
+@@ -9136,6 +9245,8 @@ breakpoint_re_set_one (void *bint)
      case bp_step_resume:
      case bp_longjmp:
      case bp_longjmp_resume:
@@ -877,7 +891,7 @@ index 0dc8474..1a309b5 100644
      case bp_jit_event:
        break;
      }
-@@ -9216,6 +9327,7 @@ breakpoint_re_set (void)
+@@ -9178,6 +9289,7 @@ breakpoint_re_set (void)
    create_longjmp_master_breakpoint ("_longjmp");
    create_longjmp_master_breakpoint ("siglongjmp");
    create_longjmp_master_breakpoint ("_siglongjmp");
@@ -885,7 +899,7 @@ index 0dc8474..1a309b5 100644
  }
  \f
  /* Reset the thread number of this breakpoint:
-@@ -10177,6 +10289,22 @@ all_tracepoints ()
+@@ -10173,6 +10285,22 @@ all_tracepoints ()
    return tp_vec;
  }
  
@@ -908,7 +922,7 @@ index 0dc8474..1a309b5 100644
  \f
  /* This help string is used for the break, hbreak, tbreak and thbreak commands.
     It is defined as a macro to prevent duplication.
-@@ -10721,4 +10849,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."),
+@@ -10717,4 +10845,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."),
    automatic_hardware_breakpoints = 1;
  
    observer_attach_about_to_proceed (breakpoint_about_to_proceed);
@@ -963,30 +977,173 @@ index 6b373a3..59aa412 100644
  /* Return a tracepoint with the given number if found.  */
  extern struct breakpoint *get_tracepoint (int num);
  
-diff --git a/gdb/c-lang.c b/gdb/c-lang.c
-index d620881..d4a229d 100644
---- a/gdb/c-lang.c
-+++ b/gdb/c-lang.c
-@@ -717,7 +717,7 @@ c_get_string (struct value *value, gdb_byte **buffer, int *length,
-      If length returned from read_string was > 0, return the number of
-      characters read by dividing the number of bytes by width.  */
-   if (*length != 0)
--     *length = *length / width;
-+    *length = *length / width;
- 
-   *char_type = element_type;
+diff --git a/gdb/c-exp.y b/gdb/c-exp.y
+index 8e00979..92efb39 100644
+--- a/gdb/c-exp.y
++++ b/gdb/c-exp.y
+@@ -418,6 +418,24 @@ exp     :       exp '(' nonempty_typelist ')' const_or_volatile
+ 			}
+ 	;
+ 
++/*
++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; }
+ 	;
+@@ -785,12 +803,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);
+@@ -2033,6 +2052,13 @@ static int last_was_structop;
+ static int
+ yylex (void)
+ {
++  /* 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;
+@@ -2041,9 +2067,19 @@ yylex (void)
+   char *copy;
  
-@@ -1040,6 +1040,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
-   return evaluate_subexp_standard (expect_type, exp, pos, noside);
- }
+   last_was_structop = 0;
+-
++  
+  retry:
+-
++  
++  if (terminate_prefix
++      || lexptr != name_prefix + name_prefix_len)
++    {
++      /* Some token was skipped, 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 ())
+     {
+@@ -2079,10 +2115,19 @@ yylex (void)
+ 	    && parse_language->la_language != language_cplus)
+ 	  break;
  
-+\f
-+/* Preprocessing and parsing C and C++ expressions.  */
++	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;
+       }
  
- \f
- /* Table mapping opcodes into strings for printing operators
-@@ -1140,6 +1143,7 @@ static const struct exp_descriptor exp_descriptor_c =
+@@ -2111,6 +2156,8 @@ yylex (void)
+         return 0;
+ 
+     case ' ':
++      name_prefix_len++;
++      terminate_prefix = 0;
+     case '\t':
+     case '\n':
+       lexptr++;
+@@ -2268,11 +2315,13 @@ yylex (void)
+     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'.  */
+ 
+@@ -2357,14 +2406,29 @@ yylex (void)
+      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 the 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).  */
+@@ -2423,6 +2487,7 @@ yylex (void)
+     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 d620881..34cb34a 100644
+--- a/gdb/c-lang.c
++++ b/gdb/c-lang.c
+@@ -1140,6 +1140,7 @@ static const struct exp_descriptor exp_descriptor_c =
  {
    print_subexp_standard,
    operator_length_standard,
@@ -995,163 +1152,117 @@ index d620881..d4a229d 100644
    dump_subexp_body_standard,
    evaluate_subexp_c
 diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
-index d1af481..1c930b5 100644
+index d1af481..96b0705 100644
 --- a/gdb/c-typeprint.c
 +++ b/gdb/c-typeprint.c
-@@ -558,7 +558,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
- 	fprintf_filtered (stream, ")");
- 
-       fprintf_filtered (stream, "[");
--      if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
-+      if (TYPE_ARRAY_UPPER_BOUND_IS_DWARF_BLOCK (type))
-+	{
-+	  /* No _() - printed sources should not be locale dependent.  */
-+	  fprintf_filtered (stream, "variable");
-+	}
-+      else if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
- 	&& !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
- 	fprintf_filtered (stream, "%d",
- 			  (TYPE_LENGTH (type)
-diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
-index 4833898..992c46f 100644
---- a/gdb/cli/cli-cmds.c
-+++ b/gdb/cli/cli-cmds.c
-@@ -47,6 +47,8 @@ extern void disconnect_or_stop_tracing (int from_tty);
- #include "cli/cli-setshow.h"
- #include "cli/cli-cmds.h"
- 
-+#include "python/python.h"
-+
- #ifdef TUI
- #include "tui/tui.h"		/* For tui_active et.al.   */
- #endif
-@@ -184,6 +186,7 @@ struct cmd_list_element *showchecklist;
+@@ -32,6 +32,7 @@
+ #include "c-lang.h"
+ #include "typeprint.h"
+ #include "cp-abi.h"
++#include "jv-lang.h"
  
- /* Command tracing state.  */
+ #include "gdb_string.h"
+ #include <errno.h>
+@@ -40,8 +41,6 @@ static void cp_type_print_method_args (struct type *mtype, char *prefix,
+ 				       char *varstring, int staticp,
+ 				       struct ui_file *stream);
  
-+static int source_python = 0;
- int source_verbose = 0;
- int trace_commands = 0;
- \f
-@@ -448,6 +451,7 @@ source_script (char *file, int from_tty)
-   struct cleanup *old_cleanups;
-   char *full_pathname = NULL;
-   int fd;
-+  int is_python;
+-static void c_type_print_args (struct type *, struct ui_file *);
+-
+ static void cp_type_print_derivation_info (struct ui_file *, struct type *);
  
-   if (file == NULL || *file == 0)
-     {
-@@ -480,8 +484,16 @@ source_script (char *file, int from_tty)
- 	}
-     }
+ static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
+@@ -197,6 +196,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring,
+     fprintf_filtered (stream, "void");
  
-+  is_python = source_python;
-+  if (strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py"))
-+    is_python = 1;
+   fprintf_filtered (stream, ")");
 +
-   stream = fdopen (fd, FOPEN_RT);
--  script_from_file (stream, file);
++  /* For non-static methods, read qualifiers from the type of
++     THIS.  */
++  if (!staticp)
++    {
++      struct type *domain;
 +
-+  if (is_python)
-+    source_python_script (stream, file);
-+  else
-+    script_from_file (stream, file);
- 
-   do_cleanups (old_cleanups);
- }
-@@ -495,15 +507,30 @@ source_verbose_cleanup (void *old_value)
-   xfree (old_value);
++      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");
++    }
  }
  
-+/* A helper for source_command.  Look for an argument in *ARGS.
-+   Update *ARGS by stripping leading whitespace.  If an argument is
-+   found, return it (a character).  Otherwise, return 0.  */
-+static int
-+find_argument (char **args)
-+{
-+  int result = 0;
-+  while (isspace ((*args)[0]))
-+    ++*args;
-+  if ((*args)[0] == '-' && isalpha ((*args)[1]))
-+    {
-+      result = (*args)[1];
-+      *args += 3;
-+    }
-+  return result;
-+}
-+
- static void
- source_command (char *args, int from_tty)
- {
-   struct cleanup *old_cleanups;
--  char *file = args;
--  int *old_source_verbose = xmalloc (sizeof(int));
  
--  *old_source_verbose = source_verbose;
--  old_cleanups = make_cleanup (source_verbose_cleanup, old_source_verbose);
-+  old_cleanups = make_cleanup_restore_integer (&source_verbose);
-+  make_cleanup_restore_integer (&source_python);
+@@ -353,10 +369,14 @@ 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. LANGUAGE is the language in which TYPE was defined.  This is
++   a necessary evil since this code is used by the C, C++, and Java
++   backends. */
  
-   /* -v causes the source command to run in verbose mode.
-      We still have to be able to handle filenames with spaces in a
-@@ -511,23 +538,28 @@ source_command (char *args, int from_tty)
+-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, enum language language)
+ {
+   int i, len;
+   struct field *args;
+@@ -368,13 +388,19 @@ c_type_print_args (struct type *type, struct ui_file *stream)
  
-   if (args)
+   for (i = 0; i < TYPE_NFIELDS (type); i++)
      {
--      /* Make sure leading white space does not break the comparisons.  */
--      while (isspace(args[0]))
--	args++;
--
--      /* Is -v the first thing in the string?  */
--      if (args[0] == '-' && args[1] == 'v' && isspace (args[2]))
-+      while (1)
++      if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial)
++	continue;
++
+       if (printed_any)
  	{
--	  source_verbose = 1;
--
--	  /* Trim -v and whitespace from the filename.  */
--	  file = &args[3];
--	  while (isspace (file[0]))
--	    file++;
-+	  int arg = find_argument (&args);
-+	  if (!arg)
-+	    break;
-+	  switch (arg)
-+	    {
-+	    case 'v':
-+	      source_verbose = 1;
-+	      break;
-+	    case 'p':
-+	      source_python = 1;
-+	      break;
-+	    default:
-+	      error (_("unrecognized option -%c"), arg);
-+	    }
+ 	  fprintf_filtered (stream, ", ");
+ 	  wrap_here ("    ");
  	}
-     }
  
--  source_script (file, from_tty);
-+  source_script (args, from_tty);
-+
-+  do_cleanups (old_cleanups);
- }
+-      c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
++      if (language == language_java)
++	java_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
++      else
++	c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
+       printed_any = 1;
+     }
  
+@@ -558,7 +584,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
+ 	fprintf_filtered (stream, ")");
  
-@@ -1309,7 +1341,9 @@ Read commands from a file named FILE.\n\
- Optional -v switch (before the filename) causes each command in\n\
- FILE to be echoed as it is executed.\n\
- Note that the file \"%s\" is read automatically in this way\n\
--when GDB is started."), gdbinit);
-+when GDB is started.\n\
-+Optional -p switch (before the filename) causes FILE to be evaluated\n\
-+as Python code."), gdbinit);
-   c = add_cmd ("source", class_support, source_command,
- 	       source_help_text, &cmdlist);
-   set_cmd_completer (c, filename_completer);
+       fprintf_filtered (stream, "[");
+-      if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
++      if (TYPE_ARRAY_UPPER_BOUND_IS_DWARF_BLOCK (type))
++	{
++	  /* No _() - printed sources should not be locale dependent.  */
++	  fprintf_filtered (stream, "variable");
++	}
++      else if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
+ 	&& !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
+ 	fprintf_filtered (stream, "%d",
+ 			  (TYPE_LENGTH (type)
+@@ -591,7 +622,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, language_c);
+       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ 				   passed_a_ptr, 0);
+       break;
 diff --git a/gdb/coffread.c b/gdb/coffread.c
-index eca6618..0579ce6 100644
+index 8e5dca9..7e7fb8b 100644
 --- a/gdb/coffread.c
 +++ b/gdb/coffread.c
-@@ -2126,6 +2126,7 @@ static struct sym_fns coff_sym_fns =
+@@ -2123,6 +2123,7 @@ static struct sym_fns coff_sym_fns =
    coff_new_init,		/* sym_new_init: init anything gbl to entire symtab */
    coff_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
    coff_symfile_read,		/* sym_read: read a symbol file into symtab */
@@ -1187,249 +1298,8 @@ index ebde876..907b275 100644
  /* Relocated directory for source files. */
  #undef RELOC_SRCDIR
  
-diff --git a/gdb/config/i386/nm-i386.h b/gdb/config/i386/nm-i386.h
-new file mode 100644
-index 0000000..5f237cc
---- /dev/null
-+++ b/gdb/config/i386/nm-i386.h
-@@ -0,0 +1,125 @@
-+/* Native macro definitions for GDB on an Intel i[3456]86.
-+   Copyright 2001, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
-+
-+   This file is part of GDB.
-+
-+   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/>.  */
-+
-+#ifndef NM_I386_H
-+#define NM_I386_H 1
-+
-+/* Hardware-assisted breakpoints and watchpoints.  */
-+
-+/* Targets should define this to use the generic x86 watchpoint support.  */
-+#ifdef I386_USE_GENERIC_WATCHPOINTS
-+
-+/* Add watchpoint methods to the provided target_ops.  Targets which call
-+   this should also define I386_WATCHPOINTS_IN_TARGET_VECTOR.  */
-+struct target_ops;
-+void i386_use_watchpoints (struct target_ops *);
-+
-+/* Clear the reference counts and forget everything we knew about DRi.  */
-+extern void i386_cleanup_dregs (void);
-+
-+/* Insert a watchpoint to watch a memory region which starts at
-+   address ADDR and whose length is LEN bytes.  Watch memory accesses
-+   of the type TYPE.  Return 0 on success, -1 on failure.  */
-+extern int i386_insert_watchpoint (CORE_ADDR addr, int len, int type);
-+
-+/* Remove a watchpoint that watched the memory region which starts at
-+   address ADDR, whose length is LEN bytes, and for accesses of the
-+   type TYPE.  Return 0 on success, -1 on failure.  */
-+extern int i386_remove_watchpoint (CORE_ADDR addr, int len, int type);
-+
-+/* Return non-zero if we can watch a memory region that starts at
-+   address ADDR and whose length is LEN bytes.  */
-+extern int i386_region_ok_for_watchpoint (CORE_ADDR addr, int len);
-+
-+/* Return non-zero if the inferior has some break/watchpoint that
-+   triggered.  */
-+extern int i386_stopped_by_hwbp (void);
-+
-+/* If the inferior has some break/watchpoint that triggered, set
-+   the address associated with that break/watchpoint and return
-+   true.  Otherwise, return false.  */
-+extern int i386_stopped_data_address (struct target_ops *, CORE_ADDR *);
-+
-+/* Insert a hardware-assisted breakpoint at BP_TGT->placed_address.
-+   Return 0 on success, EBUSY on failure.  */
-+struct bp_target_info;
-+extern int i386_insert_hw_breakpoint (struct bp_target_info *bp_tgt);
-+
-+/* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
-+   Return 0 on success, -1 on failure.  */
-+extern int  i386_remove_hw_breakpoint (struct bp_target_info *bp_tgt);
-+
-+extern int i386_stopped_by_watchpoint (void);
-+
-+#ifndef I386_WATCHPOINTS_IN_TARGET_VECTOR
-+
-+/* Returns the number of hardware watchpoints of type TYPE that we can
-+   set.  Value is positive if we can set CNT watchpoints, zero if
-+   setting watchpoints of type TYPE is not supported, and negative if
-+   CNT is more than the maximum number of watchpoints of type TYPE
-+   that we can support.  TYPE is one of bp_hardware_watchpoint,
-+   bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
-+   CNT is the number of such watchpoints used so far (including this
-+   one).  OTHERTYPE is non-zero if other types of watchpoints are
-+   currently enabled.
-+
-+   We always return 1 here because we don't have enough information
-+   about possible overlap of addresses that they want to watch.  As an
-+   extreme example, consider the case where all the watchpoints watch
-+   the same address and the same region length: then we can handle a
-+   virtually unlimited number of watchpoints, due to debug register
-+   sharing implemented via reference counts in i386-nat.c.  */
-+
-+#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1
-+
-+/* Returns non-zero if we can use hardware watchpoints to watch a
-+   region whose address is ADDR and whose length is LEN.  */
-+
-+#define TARGET_REGION_OK_FOR_HW_WATCHPOINT(addr, len) \
-+  i386_region_ok_for_watchpoint (addr, len)
-+
-+/* After a watchpoint trap, the PC points to the instruction after the
-+   one that caused the trap.  Therefore we don't need to step over it.
-+   But we do need to reset the status register to avoid another trap.  */
-+
-+#define HAVE_CONTINUABLE_WATCHPOINT 1
-+
-+#define STOPPED_BY_WATCHPOINT(W)       (i386_stopped_by_watchpoint () != 0)
-+
-+#define target_stopped_data_address(target, x) \
-+  i386_stopped_data_address(target, x)
-+
-+/* Use these macros for watchpoint insertion/removal.  */
-+
-+#define target_insert_watchpoint(addr, len, type) \
-+  i386_insert_watchpoint (addr, len, type)
-+
-+#define target_remove_watchpoint(addr, len, type) \
-+  i386_remove_watchpoint (addr, len, type)
-+
-+#define target_insert_hw_breakpoint(bp_tgt) \
-+  i386_insert_hw_breakpoint (bp_tgt)
-+
-+#define target_remove_hw_breakpoint(bp_tgt) \
-+  i386_remove_hw_breakpoint (bp_tgt)
-+
-+#endif /* I386_WATCHPOINTS_IN_TARGET_VECTOR */
-+
-+#endif /* I386_USE_GENERIC_WATCHPOINTS */
-+
-+#endif /* NM_I386_H */
-diff --git a/gdb/config/i386/nm-linux64.h b/gdb/config/i386/nm-linux64.h
-new file mode 100644
-index 0000000..19d710a
---- /dev/null
-+++ b/gdb/config/i386/nm-linux64.h
-@@ -0,0 +1,54 @@
-+/* Native support for GNU/Linux x86-64.
-+
-+   Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
-+   Free Software Foundation, Inc.
-+
-+   Contributed by Jiri Smid, SuSE Labs.
-+
-+   This file is part of GDB.
-+
-+   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/>.  */
-+
-+#ifndef NM_LINUX64_H
-+#define NM_LINUX64_H
-+
-+/* GNU/Linux supports the i386 hardware debugging registers.  */
-+#define I386_USE_GENERIC_WATCHPOINTS
-+#define I386_WATCHPOINTS_IN_TARGET_VECTOR
-+
-+#include "i386/nm-i386.h"
-+#include "config/nm-linux.h"
-+
-+/* Support for 8-byte wide hardware watchpoints.  */
-+#define TARGET_HAS_DR_LEN_8 1
-+
-+/* Provide access to the i386 hardware debugging registers.  */
-+
-+extern void amd64_linux_dr_set_control (unsigned long control);
-+#define I386_DR_LOW_SET_CONTROL(control) \
-+  amd64_linux_dr_set_control (control)
-+
-+extern void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr);
-+#define I386_DR_LOW_SET_ADDR(regnum, addr) \
-+  amd64_linux_dr_set_addr (regnum, addr)
-+
-+extern void amd64_linux_dr_reset_addr (int regnum);
-+#define I386_DR_LOW_RESET_ADDR(regnum) \
-+  amd64_linux_dr_reset_addr (regnum)
-+
-+extern unsigned long amd64_linux_dr_get_status (void);
-+#define I386_DR_LOW_GET_STATUS() \
-+  amd64_linux_dr_get_status ()
-+
-+#endif /* nm-linux64.h */
-diff --git a/gdb/config/mips/nm-irix5.h b/gdb/config/mips/nm-irix5.h
-new file mode 100644
-index 0000000..49ac420
---- /dev/null
-+++ b/gdb/config/mips/nm-irix5.h
-@@ -0,0 +1,44 @@
-+/* Definitions for native support of irix5.
-+
-+   Copyright 1993, 1996, 1998, 1999, 2000, 2007, 2008, 2009
-+   Free Software Foundation, Inc.
-+
-+   This file is part of GDB.
-+
-+   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/>.  */
-+
-+#define TARGET_HAS_HARDWARE_WATCHPOINTS
-+
-+/* TARGET_CAN_USE_HARDWARE_WATCHPOINT is now defined to go through
-+   the target vector.  For Irix5, procfs_can_use_hw_watchpoint()
-+   should be invoked.  */
-+
-+/* When a hardware watchpoint fires off the PC will be left at the
-+   instruction which caused the watchpoint.  It will be necessary for
-+   GDB to step over the watchpoint. */
-+
-+#define STOPPED_BY_WATCHPOINT(W) \
-+     procfs_stopped_by_watchpoint(inferior_ptid)
-+extern int procfs_stopped_by_watchpoint (ptid_t);
-+
-+/* Use these macros for watchpoint insertion/deletion.  */
-+/* type can be 0: write watch, 1: read watch, 2: access watch (read/write) */
-+#define target_insert_watchpoint(ADDR, LEN, TYPE) \
-+     procfs_set_watchpoint (inferior_ptid, ADDR, LEN, TYPE, 0)
-+#define target_remove_watchpoint(ADDR, LEN, TYPE) \
-+     procfs_set_watchpoint (inferior_ptid, ADDR, 0, 0, 0)
-+extern int procfs_set_watchpoint (ptid_t, CORE_ADDR, int, int, int);
-+
-+#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(SIZE) 1
-+
 diff --git a/gdb/configure b/gdb/configure
-index 7f26c64..0542f7e 100755
+index 4980106..be69488 100755
 --- a/gdb/configure
 +++ b/gdb/configure
 @@ -676,6 +676,8 @@ REPORT_BUGS_TO
@@ -1544,7 +1414,7 @@ index 7f26c64..0542f7e 100755
  
    # Flags needed to compile Python code (taken from python-config --cflags).
 diff --git a/gdb/configure.ac b/gdb/configure.ac
-index ebb0a95..c8ebafe 100644
+index a756a2d..b44e21d 100644
 --- a/gdb/configure.ac
 +++ b/gdb/configure.ac
 @@ -108,6 +108,51 @@ AS_HELP_STRING([--with-relocated-sources=PATH], [automatically relocate this pat
@@ -1608,42 +1478,611 @@ index ebb0a95..c8ebafe 100644
    ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)"
  
    # Flags needed to compile Python code (taken from python-config --cflags).
-diff --git a/gdb/dbxread.c b/gdb/dbxread.c
-index 816a355..e9f56f9 100644
---- a/gdb/dbxread.c
-+++ b/gdb/dbxread.c
-@@ -3570,6 +3570,7 @@ static struct sym_fns aout_sym_fns =
-   dbx_new_init,		/* sym_new_init: init anything gbl to entire symtab */
-   dbx_symfile_init,	/* sym_init: read initial info, setup for sym_read() */
-   dbx_symfile_read,		/* sym_read: read a symbol file into symtab */
-+  NULL,				/* sym_read_psymbols */
-   dbx_symfile_finish,		/* sym_finish: finished with file, cleanup */
-   default_symfile_offsets, /* sym_offsets: parse user's offsets to
- 			      internal form */
-diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
-index 253e251..6d73fc5 100644
---- a/gdb/doc/gdb.texinfo
-+++ b/gdb/doc/gdb.texinfo
-@@ -962,8 +962,10 @@ Connect to process ID @var{number}, as with the @code{attach} command.
- @itemx -x @var{file}
- @cindex @code{--command}
- @cindex @code{-x}
--Execute @value{GDBN} commands from file @var{file}.  @xref{Command
--Files,, Command files}.
-+Execute commands from file @var{file}.  If @var{file} ends in
-+@samp{.py}, then the file is evaluated as Python code.  If Python
-+support is not enabled in this @value{GDBN}, then an error occurs.
-+@xref{Command Files,, Command files}.
- 
- @item -eval-command @var{command}
- @itemx -ex @var{command}
-@@ -1155,6 +1157,16 @@ for remote debugging.
- Run using @var{device} for your program's standard input and output.
- @c FIXME: kingdon thinks there is more to -tty.  Investigate.
+diff --git a/gdb/cp-name-parser.y b/gdb/cp-name-parser.y
+index 81f6a5d..097db65 100644
+--- a/gdb/cp-name-parser.y
++++ b/gdb/cp-name-parser.y
+@@ -389,7 +389,7 @@ function
+ 		|	colon_ext_only function_arglist start_opt
+ 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
+ 			  if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
+-
++		|	colon_ext_only
+ 		|	conversion_op_name start_opt
+ 			{ $$ = $1.comp;
+ 			  if ($2) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2); }
+diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
+index 04b665b..21e013a 100644
+--- a/gdb/cp-namespace.c
++++ b/gdb/cp-namespace.c
+@@ -34,14 +34,17 @@
+ #include "buildsym.h"
+ 
+ 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 *cp_lookup_symbol_in_namespace (const char *namespace,
++                                                     const char *name,
++                                                     const struct block *block,
++                                                     const domain_enum domain);
++
+ static struct symbol *lookup_symbol_file (const char *name,
+-					  const char *linkage_name,
+ 					  const struct block *block,
+ 					  const domain_enum domain,
+ 					  int anonymous_namespace);
+@@ -117,7 +120,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
+ 		 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 (dest, src);
++	      cp_add_using_directive (dest, src, "", "", 0);
+ 	    }
+ 	  /* The "+ 2" is for the "::".  */
+ 	  previous_component = next_component + 2;
+@@ -132,7 +135,8 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
+    has already been added, don't add it twice.  */
  
-+@item -P
-+@cindex @code{-P}
-+@itemx --python
+ void
+-cp_add_using_directive (const char *dest, const char *src)
++cp_add_using_directive (const char *dest, const char *src, const char* alias,
++			const char *declaration, const int line_number)
+ {
+   struct using_direct *current;
+   struct using_direct *new;
+@@ -146,7 +150,8 @@ cp_add_using_directive (const char *dest, const char *src)
+ 	return;
+     }
+ 
+-  using_directives = cp_add_using (dest, src, using_directives);
++  using_directives = cp_add_using (dest, src, alias, declaration,
++				   line_number, using_directives);
+ 
+ }
+ 
+@@ -199,7 +204,10 @@ cp_is_anonymous (const char *namespace)
+ }
+ 
+ /* Create a new struct using direct which imports the namespace SRC
+-   into the scope DEST.
++   into the scope DEST.  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.  */
+@@ -207,14 +215,21 @@ cp_is_anonymous (const char *namespace)
+ struct using_direct *
+ cp_add_using (const char *dest,
+               const char *src,
++              const char *alias,
++              const char *declaration,
++              const int line_number,
+ 	      struct using_direct *next)
+ {
+   struct using_direct *retval;
+ 
+   retval = xmalloc (sizeof (struct using_direct));
+-  retval->import_src = savestring (src, strlen(src));
+-  retval->import_dest = savestring (dest, strlen(dest));
++  retval->import_src = savestring (src, strlen (src));
++  retval->import_dest = savestring (dest, strlen (dest));
++  retval->alias = savestring (alias, strlen (alias));
++  retval->declaration = savestring (declaration, strlen (declaration));
++  retval->line_number = line_number;
+   retval->next = next;
++  retval->searched = 0;
+ 
+   return retval;
+ }
+@@ -229,12 +244,48 @@ cp_add_using (const char *dest,
+ 
+ struct symbol *
+ cp_lookup_symbol_nonlocal (const char *name,
+-			   const char *linkage_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; 
++  const char *scope = block_scope (block);
++
++  sym = lookup_namespace_scope (name, block, domain, scope, 0);
++  if (sym != NULL)
++    return sym;
++
++  return cp_lookup_symbol_namespace(scope, name, block, domain);
++}
++
++/* Searches for NAME in the current namespace, and by applying relevant import
++   statements belonging to BLOCK and its parents.  SCOPE is the namespace
++   scope of the context in which the search is being evaluated.  */
++
++struct symbol*
++cp_lookup_symbol_namespace (const char *scope,
++                            const char *name,
++                            const struct block *block,
++                            const domain_enum domain)
++{
++  struct symbol *sym;
++
++  /* First, try to find the symbol in the given namespace.  */
++  sym = cp_lookup_symbol_in_namespace (scope, name, block, domain);
++  if ( sym != NULL)
++    return sym;
++    
++  /* Search for name in namespaces imported to this and parent blocks.  */
++  while (block != NULL)
++    {
++      sym = cp_lookup_symbol_imports(scope,name, block, domain,0,1);
++
++      if (sym)
++        return sym;
++
++      block = BLOCK_SUPERBLOCK(block);
++    }
++
++  return NULL;
+ }
+ 
+ /* Lookup NAME at namespace scope (or, in C terms, in static and
+@@ -252,9 +303,8 @@ 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,
+ 			const domain_enum domain,
+ 			const char *scope,
+@@ -276,8 +326,7 @@ lookup_namespace_scope (const char *name,
+ 	  new_scope_len += 2;
+ 	}
+       new_scope_len += cp_find_first_component (scope + new_scope_len);
+-      sym = lookup_namespace_scope (name, linkage_name, block,
+-				    domain, scope, new_scope_len);
++      sym = lookup_namespace_scope (name, block, domain, scope, new_scope_len);
+       if (sym != NULL)
+ 	return sym;
+     }
+@@ -288,25 +337,98 @@ 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,
+-				     block, domain);
++  return cp_lookup_symbol_in_namespace (namespace, name,block, domain);
+ }
+ 
+-/* Look up NAME in the C++ namespace NAMESPACE, applying the using
+-   directives that are active in BLOCK.  Other arguments are as in
++/* Look up NAME in the C++ namespace NAMESPACE. Other arguments are as in
+    cp_lookup_symbol_nonlocal.  */
+ 
++static struct symbol *
++cp_lookup_symbol_in_namespace (const char *namespace,
++			       const char *name,
++			       const struct block *block,
++			       const domain_enum domain)
++{
++
++  if (namespace[0] == '\0')
++    {
++      return lookup_symbol_file (name, block,domain, 0);
++    }
++  else
++    {
++      char *concatenated_name
++	= alloca (strlen (namespace) + 2 + strlen (name) + 1);
++      strcpy (concatenated_name, namespace);
++      strcat (concatenated_name, "::");
++      strcat (concatenated_name, name);
++      return lookup_symbol_file (concatenated_name, block, domain,
++				cp_is_anonymous (namespace));
++    }
++}
++
++/* Used for cleanups to reset the "searched" flag incase
++   of an error.  */
++
++static void
++reset_directive_searched (void *data)
++{
++  struct using_direct *direct = data;
++  direct->searched = 0;
++}
++
++/* Search for NAME by applying all import statements belonging
++   to BLOCK which are applicable in SCOPE. If DECLARATION_ONLY the search
++   is restricted to using declarations.
++   Example:
++
++     namespace A{
++       int x;
++     }
++     using A::x;
++
++   If SEARCH_PARENTS the search will include imports which are applicable in
++   parents of scopes.
++   Example:
++
++     namespace A{
++       using namespace X;
++       namespace B{
++         using namespace Y;
++       }
++     }
++
++   If SCOPE is "A::B" and SEARCH_PARENTS is true the imports of namespaces X
++   and Y will be considered. If SEARCH_PARENTS is false only the import of Y
++   is considered.  */
++
+ struct symbol *
+-cp_lookup_symbol_namespace (const char *namespace,
+-			    const char *name,
+-			    const char *linkage_name,
+-			    const struct block *block,
+-			    const domain_enum domain)
++cp_lookup_symbol_imports (const char *scope,
++                          const char *name,
++                          const struct block *block,
++                          const domain_enum domain,
++                          int declaration_only,
++                          int search_parents)
+ {
+-  const struct using_direct *current;
+-  struct symbol *sym;
++  struct using_direct *current;
++  struct symbol *sym = NULL;
++  int directive_match;
++  int current_line;
++  struct cleanup *searched_cleanup;
++
++  if(!declaration_only)
++    /* First, try to find the symbol in the given namespace.  */
++    sym = cp_lookup_symbol_in_namespace (scope, name, block, domain);
+ 
+-  /* First, go through the using directives.  If any of them add new
++  if ( sym != NULL)
++    return sym;
++
++  if (has_stack_frames ())
++    current_line = find_pc_line (get_frame_pc (get_selected_frame (NULL)),
++                                              0).line;
++  else
++    current_line = 0;
++
++  /* 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
+      match by applying them.  */
+ 
+@@ -314,39 +436,78 @@ cp_lookup_symbol_namespace (const char *namespace,
+        current != NULL;
+        current = current->next)
+     {
+-      if (strcmp (namespace, current->import_dest) == 0)
++  
++      /* If the import destination is the current scope or one of its ancestors then
++         it is applicable.  */
++      directive_match = search_parents ?
++                        strncmp (scope, current->import_dest,
++                                 strlen(current->import_dest)) == 0 :
++                        strcmp (scope, current->import_dest) == 0;
++
++      if (directive_match &&
++          current->line_number < current_line &&
++          !current->searched)
+ 	{
+-	  sym = cp_lookup_symbol_namespace (current->import_src,
+-					    name,
+-					    linkage_name,
+-					    block,
+-					    domain);
++	  current->searched = 1;
++	  searched_cleanup = make_cleanup (reset_directive_searched, current);
++
++	  /* If there is an import of a single declaration, compare the imported
++	     declaration with the sought out name. If there is a match pass
++	     current->import_src as NAMESPACE to direct the search towards the
++	     imported namespace.  */
++	  if (strcmp ("", current->declaration) != 0)
++	    {
++	    if (strcmp (name, current->declaration) == 0)
++	      {
++	      sym = cp_lookup_symbol_in_namespace (current->import_src,
++	                                           name,
++	                                           block,
++	                                           domain);
++	      }
++
++	    current->searched = 0;
++	    if (sym)
++	      return sym;
++
++	    continue;
++	    }
++	   
++	  if (declaration_only)
++	    {
++	    current->searched = 0;
++	    discard_cleanups (searched_cleanup);
++	    continue;
++	    }
++
++	  if (strcmp (name, current->alias) == 0)
++	    /* If the import is creating an alias and the alias matches the
++	       sought name. Pass current->inner as the NAME to direct the
++	       search towards the aliased namespace */
++	    {
++	    sym = cp_lookup_symbol_in_namespace (scope,
++	                                         current->import_src,
++	                                         block,
++	                                         domain);
++	    } else if (strcmp ("", current->alias) == 0){
++	    /* If this import statement creates no alias, pass current->inner as
++	       NAMESPACE to direct the search towards the imported namespace. */
++	      sym = cp_lookup_symbol_imports (current->import_src,
++	                                      name,
++	                                      block,
++	                                      domain,
++	                                      0,
++	                                      0);
++	    }
++
++	  current->searched = 0;
++	  discard_cleanups (searched_cleanup);
++
+ 	  if (sym != NULL)
+ 	    return sym;
+ 	}
+     }
+ 
+-  /* We didn't find anything by applying any of the using directives
+-     that are still applicable; so let's see if we've got a match
+-     using the current namespace.  */
+-  
+-  if (namespace[0] == '\0')
+-    {
+-      return lookup_symbol_file (name, linkage_name, block,
+-				 domain, 0);
+-    }
+-  else
+-    {
+-      char *concatenated_name
+-	= alloca (strlen (namespace) + 2 + strlen (name) + 1);
+-      strcpy (concatenated_name, namespace);
+-      strcat (concatenated_name, "::");
+-      strcat (concatenated_name, name);
+-      sym = lookup_symbol_file (concatenated_name, linkage_name,
+-				block, domain, 
+-				cp_is_anonymous (namespace));
+-      return sym;
+-    }
++  return NULL;
+ }
+ 
+ /* Look up NAME in BLOCK's static block and in global blocks.  If
+@@ -356,17 +517,15 @@ cp_lookup_symbol_namespace (const char *namespace,
+ 
+ static struct symbol *
+ lookup_symbol_file (const char *name,
+-		    const char *linkage_name,
+ 		    const struct block *block,
+ 		    const domain_enum domain,
+ 		    int anonymous_namespace)
+ {
+   struct symbol *sym = NULL;
+ 
+-  sym = lookup_symbol_static (name, linkage_name, block, domain);
++  sym = lookup_symbol_static (name, block, domain);
+   if (sym != NULL)
+     return sym;
+-
+   if (anonymous_namespace)
+     {
+       /* Symbols defined in anonymous namespaces have external linkage
+@@ -376,12 +535,11 @@ lookup_symbol_file (const char *name,
+       const struct block *global_block = block_global_block (block);
+       
+       if (global_block != NULL)
+-	sym = lookup_symbol_aux_block (name, linkage_name, global_block,
+-				       domain);
++	sym = lookup_symbol_aux_block (name, global_block, domain);
+     }
+   else
+     {
+-      sym = lookup_symbol_global (name, linkage_name, block, domain);
++      sym = lookup_symbol_global (name, block, domain);
+     }
+ 
+   if (sym != NULL)
+@@ -402,6 +560,7 @@ lookup_symbol_file (const char *name,
+       sym = lookup_possible_namespace_symbol (name);
+       if (sym != NULL)
+ 	return sym;
++
+     }
+ 
+   return NULL;
+@@ -429,9 +588,8 @@ cp_lookup_nested_type (struct type *parent_type,
+ 	   lookup_symbol_namespace works when looking them up.  */
+ 
+ 	const char *parent_name = TYPE_TAG_NAME (parent_type);
+-	struct symbol *sym = cp_lookup_symbol_namespace (parent_name,
++	struct symbol *sym = cp_lookup_symbol_in_namespace (parent_name,
+ 							 nested_name,
+-							 NULL,
+ 							 block,
+ 							 VAR_DOMAIN);
+ 	if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
+@@ -677,7 +835,7 @@ check_one_possible_namespace_symbol (const char *name, int len,
+ 
+   memcpy (name_copy, name, len);
+   name_copy[len] = '\0';
+-  sym = lookup_block_symbol (block, name_copy, NULL, VAR_DOMAIN);
++  sym = lookup_block_symbol (block, name_copy, VAR_DOMAIN);
+ 
+   if (sym == NULL)
+     {
+@@ -718,7 +876,7 @@ lookup_possible_namespace_symbol (const char *name)
+       struct symbol *sym;
+ 
+       sym = lookup_block_symbol (get_possible_namespace_block (objfile),
+-				 name, NULL, VAR_DOMAIN);
++				 name, VAR_DOMAIN);
+ 
+       if (sym != NULL)
+ 	return sym;
+diff --git a/gdb/cp-support.c b/gdb/cp-support.c
+index c31fcff..fc294ae 100644
+--- a/gdb/cp-support.c
++++ b/gdb/cp-support.c
+@@ -190,7 +190,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)
+@@ -840,9 +841,9 @@ read_in_psymtabs (const char *func_name)
+     if (ps->readin)
+       continue;
+ 
+-    if ((lookup_partial_symbol (ps, func_name, NULL, 1, VAR_DOMAIN)
++    if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
+ 	 != NULL)
+-	|| (lookup_partial_symbol (ps, func_name, NULL, 0, VAR_DOMAIN)
++	|| (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
+ 	    != NULL))
+       psymtab_to_symtab (ps);
+   }
+diff --git a/gdb/cp-support.h b/gdb/cp-support.h
+index a629955..2afdb48 100644
+--- a/gdb/cp-support.h
++++ b/gdb/cp-support.h
+@@ -38,15 +38,33 @@ struct demangle_component;
+ 
+ /* This struct is designed to store data from using directives.  It
+    says that names from namespace IMPORT_SRC should be visible within
+-   namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial
+-   substring of IMPORT_SRC. These form a linked list; NEXT is the next element
+-   of the list.  */
++   namespace IMPORT_DEST.  IMPORT_DEST should always be a strict initial
++   substring of IMPORT_SRC.  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 *import_src;
+   char *import_dest;
++
++  char *alias;
++
++  char *declaration;
++
++  int line_number;
++
+   struct using_direct *next;
++
++  /* Used during import search to temporarly mark this node as searced.  */
++  int searched;
+ };
+ 
+ 
+@@ -54,6 +72,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);
+@@ -79,10 +98,16 @@ extern int cp_validate_operator (const char *input);
+ extern int cp_is_anonymous (const char *namespace);
+ 
+ extern void cp_add_using_directive (const char *dest,
+-                                    const char *src);
++                                    const char *src,
++                                    const char *alias,
++                                    const char *declaration,
++                                    const int line_number);
+ 
+ extern struct using_direct *cp_add_using (const char *dest,
+                                           const char *src,
++                                          const char *alias,
++                                          const char *declaration,
++                                          const int line_number,
+ 					  struct using_direct *next);
+ 
+ extern void cp_initialize_namespace (void);
+@@ -99,15 +124,20 @@ extern void cp_set_block_scope (const struct symbol *symbol,
+ extern void cp_scan_for_anonymous_namespaces (const struct symbol *symbol);
+ 
+ extern struct symbol *cp_lookup_symbol_nonlocal (const char *name,
+-						 const char *linkage_name,
+ 						 const struct block *block,
+ 						 const domain_enum domain);
+ 
++struct symbol *cp_lookup_symbol_imports (const char *scope,
++                                         const char *name,
++                                         const struct block *block,
++                                         const domain_enum domain,
++                                         int declaration_only,
++                                         int search_parents);
++
+ extern struct symbol *cp_lookup_symbol_namespace (const char *namespace,
+-						  const char *name,
+-						  const char *linkage_name,
+-						  const struct block *block,
+-						  const domain_enum domain);
++                                                  const char *name,
++                                                  const struct block *block,
++                                                  const domain_enum domain);
+ 
+ extern struct type *cp_lookup_nested_type (struct type *parent_type,
+ 					   const char *nested_name,
+diff --git a/gdb/dbxread.c b/gdb/dbxread.c
+index 6ef6767..5f4825c 100644
+--- a/gdb/dbxread.c
++++ b/gdb/dbxread.c
+@@ -3565,6 +3565,7 @@ static struct sym_fns aout_sym_fns =
+   dbx_new_init,		/* sym_new_init: init anything gbl to entire symtab */
+   dbx_symfile_init,	/* sym_init: read initial info, setup for sym_read() */
+   dbx_symfile_read,		/* sym_read: read a symbol file into symtab */
++  NULL,				/* sym_read_psymbols */
+   dbx_symfile_finish,		/* sym_finish: finished with file, cleanup */
+   default_symfile_offsets, /* sym_offsets: parse user's offsets to
+ 			      internal form */
+diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
+index d716d0d..35dc185 100644
+--- a/gdb/doc/gdb.texinfo
++++ b/gdb/doc/gdb.texinfo
+@@ -1159,6 +1159,16 @@ for remote debugging.
+ Run using @var{device} for your program's standard input and output.
+ @c FIXME: kingdon thinks there is more to -tty.  Investigate.
+ 
++@item -P
++@cindex @code{-P}
++@itemx --python
 +@cindex @code{--python}
 +Change interpretation of command line so that the argument immediately
 +following this switch is taken to be the name of a Python script file.
@@ -1654,7 +2093,7 @@ index 253e251..6d73fc5 100644
  @c resolve the situation of these eventually
  @item -tui
  @cindex @code{--tui}
-@@ -19101,7 +19113,7 @@ command:
+@@ -19145,7 +19155,7 @@ command:
  @table @code
  @kindex source
  @cindex execute commands from a file
@@ -1663,19 +2102,7 @@ index 253e251..6d73fc5 100644
  Execute the command file @var{filename}.
  @end table
  
-@@ -19118,6 +19130,11 @@ If @code{-v}, for verbose mode, is given then @value{GDBN} displays
- each command as it is executed.  The option must be given before
- @var{filename}, and is interpreted as part of the filename anywhere else.
- 
-+If @var{filename} ends in @samp{.py}, or if @code{-p}, for Python, is
-+given then @value{GDBN} evaluates the contents of the file as Python
-+code.  If Python support is not compiled in to @value{GDBN}, then an
-+error occurs.
-+
- Commands that would ask for confirmation if used interactively proceed
- without asking when used in a command file.  Many @value{GDBN} commands that
- normally print messages to say what they are doing omit the messages
-@@ -19379,8 +19396,6 @@ containing @code{end}.  For example:
+@@ -19428,8 +19438,6 @@ containing @code{end}.  For example:
  
  @smallexample
  (@value{GDBP}) python
@@ -1684,7 +2111,7 @@ index 253e251..6d73fc5 100644
  >print 23
  >end
  23
-@@ -19393,6 +19408,14 @@ in a Python script.  This can be controlled using @code{maint set
+@@ -19442,6 +19450,14 @@ in a Python script.  This can be controlled using @code{maint set
  python print-stack}: if @code{on}, the default, then Python stack
  printing is enabled; if @code{off}, then Python stack printing is
  disabled.
@@ -1699,7 +2126,7 @@ index 253e251..6d73fc5 100644
  @end table
  
  @node Python API
-@@ -19400,6 +19423,14 @@ disabled.
+@@ -19449,6 +19465,14 @@ disabled.
  @cindex python api
  @cindex programming in python
  
@@ -1714,7 +2141,7 @@ index 253e251..6d73fc5 100644
  @cindex python stdout
  @cindex python pagination
  At startup, @value{GDBN} overrides Python's @code{sys.stdout} and
-@@ -19412,13 +19443,17 @@ situation, a Python @code{KeyboardInterrupt} exception is thrown.
+@@ -19461,13 +19485,17 @@ situation, a Python @code{KeyboardInterrupt} exception is thrown.
  * Basic Python::                Basic Python Functions.
  * Exception Handling::
  * Auto-loading::                Automatically loading Python code.
@@ -1733,7 +2160,7 @@ index 253e251..6d73fc5 100644
  * Frames In Python::            Acessing inferior stack frames from Python.
  * Lazy Strings In Python::      Python representation of lazy strings.
  @end menu
-@@ -19446,6 +19481,12 @@ command as having originated from the user invoking it interactively.
+@@ -19495,6 +19523,12 @@ command as having originated from the user invoking it interactively.
  It must be a boolean value.  If omitted, it defaults to @code{False}.
  @end defun
  
@@ -1746,7 +2173,7 @@ index 253e251..6d73fc5 100644
  @findex gdb.parameter
  @defun parameter parameter
  Return the value of a @value{GDBN} parameter.  @var{parameter} is a
-@@ -19462,6 +19503,7 @@ a Python value of the appropriate type, and returned.
+@@ -19511,6 +19545,7 @@ a Python value of the appropriate type, and returned.
  @defun history number
  Return a value from @value{GDBN}'s value history (@pxref{Value
  History}).  @var{number} indicates which history element to return.
@@ -1754,7 +2181,7 @@ index 253e251..6d73fc5 100644
  If @var{number} is negative, then @value{GDBN} will take its absolute value
  and count backward from the last element (i.e., the most recent element) to
  find the value to return.  If @var{number} is zero, then @value{GDBN} will
-@@ -19486,6 +19528,21 @@ compute values, for example, it is the only way to get the value of a
+@@ -19535,6 +19570,21 @@ compute values, for example, it is the only way to get the value of a
  convenience variable (@pxref{Convenience Vars}) as a @code{gdb.Value}.
  @end defun
  
@@ -1776,7 +2203,7 @@ index 253e251..6d73fc5 100644
  @findex gdb.write
  @defun write string
  Print a string to @value{GDBN}'s paginated standard output stream.
-@@ -19500,6 +19557,11 @@ Flush @value{GDBN}'s paginated standard output stream.  Flushing
+@@ -19549,6 +19599,11 @@ Flush @value{GDBN}'s paginated standard output stream.  Flushing
  function.
  @end defun
  
@@ -1788,7 +2215,7 @@ index 253e251..6d73fc5 100644
  @node Exception Handling
  @subsubsection Exception Handling
  @cindex python exceptions
-@@ -19738,6 +19800,9 @@ module:
+@@ -19787,6 +19842,9 @@ module:
  This function looks up a type by name.  @var{name} is the name of the
  type to look up.  It must be a string.
  
@@ -1798,7 +2225,7 @@ index 253e251..6d73fc5 100644
  Ordinarily, this function will return an instance of @code{gdb.Type}.
  If the named type cannot be found, it will throw an exception.
  @end defun
-@@ -19860,7 +19925,7 @@ If the type does not have a target, this method will throw an
+@@ -19909,7 +19967,7 @@ If the type does not have a target, this method will throw an
  exception.
  @end defmethod
  
@@ -1807,7 +2234,7 @@ index 253e251..6d73fc5 100644
  If this @code{gdb.Type} is an instantiation of a template, this will
  return a new @code{gdb.Type} which represents the type of the
  @var{n}th template argument.
-@@ -19868,7 +19933,8 @@ return a new @code{gdb.Type} which represents the type of the
+@@ -19917,7 +19975,8 @@ return a new @code{gdb.Type} which represents the type of the
  If this @code{gdb.Type} is not a template type, this will throw an
  exception.  Ordinarily, only C@t{++} code will have template types.
  
@@ -1817,7 +2244,7 @@ index 253e251..6d73fc5 100644
  @end defmethod
  @end table
  
-@@ -20222,6 +20288,121 @@ import gdb.libstdcxx.v6
+@@ -20271,6 +20330,121 @@ import gdb.libstdcxx.v6
  gdb.libstdcxx.v6.register_printers (gdb.current_objfile ())
  @end smallexample
  
@@ -1939,7 +2366,7 @@ index 253e251..6d73fc5 100644
  @node Commands In Python
  @subsubsection Commands In Python
  
-@@ -20474,6 +20655,135 @@ registration of the command with @value{GDBN}.  Depending on how the
+@@ -20523,6 +20697,135 @@ 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.
  
@@ -2075,7 +2502,7 @@ index 253e251..6d73fc5 100644
  @node Functions In Python
  @subsubsection Writing new convenience functions
  
-@@ -20578,6 +20888,82 @@ which is used to format the value.  @xref{Pretty Printing}, for more
+@@ -20627,6 +20930,82 @@ which is used to format the value.  @xref{Pretty Printing}, for more
  information.
  @end defivar
  
@@ -2158,7 +2585,7 @@ index 253e251..6d73fc5 100644
  @node Frames In Python
  @subsubsection Acessing inferior stack frames from Python.
  
-@@ -20642,6 +21028,14 @@ function to a string.
+@@ -20691,6 +21070,14 @@ function to a string.
  Returns the frame's resume address.
  @end defmethod
  
@@ -2173,7 +2600,7 @@ index 253e251..6d73fc5 100644
  @defmethod Frame older
  Return the frame that called this frame.
  @end defmethod
-@@ -20650,10 +21044,18 @@ Return the frame that called this frame.
+@@ -20699,10 +21086,18 @@ Return the frame that called this frame.
  Return the frame called by this frame.
  @end defmethod
  
@@ -2365,10 +2792,10 @@ index 99100d7..5915249 100644
        if (fde_table == NULL)
  	continue;
 diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c
-index 5e27d38..628ba88 100644
+index ed21edf..1b10cb7 100644
 --- a/gdb/dwarf2expr.c
 +++ b/gdb/dwarf2expr.c
-@@ -848,6 +848,13 @@ execute_stack_op (struct dwarf_expr_context *ctx,
+@@ -868,6 +868,13 @@ execute_stack_op (struct dwarf_expr_context *ctx,
  	  ctx->initialized = 0;
  	  goto no_push;
  
@@ -2718,19 +3145,22 @@ index fa0bd11..fdea2b4 100644
  
  #endif /* dwarf2loc.h */
 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
-index 243859c..2fccec5 100644
+index 15ef3e9..99f729b 100644
 --- a/gdb/dwarf2read.c
 +++ b/gdb/dwarf2read.c
-@@ -48,6 +48,8 @@
+@@ -48,6 +48,11 @@
  #include "gdbcmd.h"
  #include "block.h"
  #include "addrmap.h"
 +#include "block.h"
 +#include "f-lang.h"
++#include "typeprint.h"
++#include "jv-lang.h"
++#include "vec.h"
  
  #include <fcntl.h>
  #include "gdb_string.h"
-@@ -96,7 +98,7 @@ typedef struct pubnames_header
+@@ -96,7 +101,7 @@ typedef struct pubnames_header
  _PUBNAMES_HEADER;
  #define _ACTUAL_PUBNAMES_HEADER_SIZE 13
  
@@ -2739,7 +3169,7 @@ index 243859c..2fccec5 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
-@@ -153,7 +155,10 @@ struct dwarf2_section_info
+@@ -153,7 +158,10 @@ struct dwarf2_section_info
    asection *asection;
    gdb_byte *buffer;
    bfd_size_type size;
@@ -2751,7 +3181,7 @@ index 243859c..2fccec5 100644
  };
  
  struct dwarf2_per_objfile
-@@ -333,6 +338,19 @@ struct dwarf2_cu
+@@ -333,6 +341,19 @@ struct dwarf2_cu
       DIEs for namespaces, we don't need to try to infer them
       from mangled names.  */
    unsigned int has_namespace_info : 1;
@@ -2771,17 +3201,41 @@ index 243859c..2fccec5 100644
  };
  
  /* Persistent data held for a compilation unit, even when not
-@@ -788,6 +806,9 @@ static void scan_partial_symbols (struct partial_die_info *,
+@@ -487,8 +508,7 @@ 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;
+ 
+     /* The scope to prepend to our children.  This is generally
+@@ -677,6 +697,11 @@ struct field_info
+     int nfnfields;
+   };
+ 
++/* A vector used during linkage name generation.  */
++typedef struct die_info *die_info_p;
++DEF_VEC_P (die_info_p);
++static VEC(die_info_p) *die_list;
++
+ /* One item on the queue of compilation units to read in full symbols
+    for.  */
+ struct dwarf2_queue_item
+@@ -788,7 +813,10 @@ static void scan_partial_symbols (struct partial_die_info *,
  static void add_partial_symbol (struct partial_die_info *,
  				struct dwarf2_cu *);
  
+-static int pdi_needs_namespace (enum dwarf_tag tag);
 +static gdb_byte *read_comp_unit_head (struct comp_unit_head *, gdb_byte *,
 +				      bfd *);
 +
- static int pdi_needs_namespace (enum dwarf_tag tag);
++static int die_needs_namespace (struct die_info *, struct dwarf2_cu *);
  
  static void add_partial_namespace (struct partial_die_info *pdi,
-@@ -813,6 +834,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
+ 				   CORE_ADDR *lowpc, CORE_ADDR *highpc,
+@@ -813,6 +841,10 @@ static void dwarf2_psymtab_to_symtab (struct partial_symtab *);
  
  static void psymtab_to_symtab_1 (struct partial_symtab *);
  
@@ -2792,7 +3246,32 @@ index 243859c..2fccec5 100644
  static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
  
  static void dwarf2_free_abbrev_table (void *);
-@@ -995,6 +1020,15 @@ static void read_module (struct die_info *die, struct dwarf2_cu *cu);
+@@ -940,6 +972,11 @@ static struct type *tag_type_to_type (struct die_info *, struct dwarf2_cu *);
+ 
+ static struct type *read_type_die (struct die_info *, struct dwarf2_cu *);
+ 
++static char *physname_prefix (struct die_info *die, struct dwarf2_cu *);
++
++static void physname_prefix_1 (struct ui_file *, struct die_info *,
++			       struct dwarf2_cu *);
++
+ static char *determine_prefix (struct die_info *die, struct dwarf2_cu *);
+ 
+ static char *typename_concat (struct obstack *,
+@@ -984,17 +1021,25 @@ static void dwarf2_attach_fn_fields_to_type (struct field_info *,
+ 
+ static void process_structure_scope (struct die_info *, struct dwarf2_cu *);
+ 
+-static const char *determine_class_name (struct die_info *die,
+-					 struct dwarf2_cu *cu);
+-
+ static void read_common_block (struct die_info *, struct dwarf2_cu *);
+ 
+ static void read_namespace (struct die_info *die, struct dwarf2_cu *);
+ 
++static void read_import_statement (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 *);
  
@@ -2808,17 +3287,19 @@ index 243859c..2fccec5 100644
  static const char *namespace_name (struct die_info *die,
  				   int *is_anonymous, struct dwarf2_cu *);
  
-@@ -1030,6 +1064,9 @@ static void process_die (struct die_info *, struct dwarf2_cu *);
+@@ -1028,7 +1073,10 @@ static gdb_byte *read_full_die (const struct die_reader_specs *reader,
  
- static char *dwarf2_linkage_name (struct die_info *, struct dwarf2_cu *);
+ static void process_die (struct die_info *, struct dwarf2_cu *);
  
+-static char *dwarf2_linkage_name (struct die_info *, struct dwarf2_cu *);
++static char *dwarf2_physname (struct die_info *, struct dwarf2_cu *);
++
 +static char *fortran_module_linkage_name (struct die_info *die,
 +					  struct dwarf2_cu *cu);
-+
+ 
  static char *dwarf2_canonicalize_name (char *, struct dwarf2_cu *,
  				       struct obstack *);
- 
-@@ -1144,6 +1181,9 @@ static void age_cached_comp_units (void);
+@@ -1144,6 +1192,9 @@ static void age_cached_comp_units (void);
  
  static void free_one_cached_comp_unit (void *);
  
@@ -2828,7 +3309,7 @@ index 243859c..2fccec5 100644
  static struct type *set_die_type (struct die_info *, struct type *,
  				  struct dwarf2_cu *);
  
-@@ -1163,22 +1203,31 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *);
+@@ -1163,22 +1214,31 @@ static void dwarf2_clear_marks (struct dwarf2_per_cu_data *);
  
  static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu);
  
@@ -2869,7 +3350,7 @@ index 243859c..2fccec5 100644
  }
  
  /* When loading sections, we can either look for ".<name>", or for
-@@ -1271,10 +1320,13 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr)
+@@ -1271,10 +1331,13 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr)
  }
  
  /* Decompress a section that was compressed using zlib.  Store the
@@ -2885,7 +3366,7 @@ index 243859c..2fccec5 100644
                           gdb_byte **outbuf, bfd_size_type *outsize)
  {
    bfd *abfd = objfile->obfd;
-@@ -1291,6 +1343,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -1291,6 +1354,7 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
    z_stream strm;
    int rc;
    int header_size = 12;
@@ -2893,7 +3374,7 @@ index 243859c..2fccec5 100644
  
    if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
        || bfd_bread (compressed_buffer, compressed_size, abfd) != compressed_size)
-@@ -1320,8 +1373,13 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -1320,8 +1384,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;
@@ -2909,7 +3390,7 @@ index 243859c..2fccec5 100644
    rc = inflateInit (&strm);
    while (strm.avail_in > 0)
      {
-@@ -1342,26 +1400,176 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
+@@ -1342,26 +1411,176 @@ zlib_decompress_section (struct objfile *objfile, asection *sectp,
      error (_("Dwarf Error: concluding DWARF uncompression in '%s': %d"),
             bfd_get_filename (abfd), rc);
  
@@ -3091,7 +3572,7 @@ index 243859c..2fccec5 100644
  
    if (info->asection == NULL || info->size == 0)
      return;
-@@ -1374,7 +1582,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
+@@ -1374,7 +1593,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
        /* Upon decompression, update the buffer and its size.  */
        if (strncmp (header, "ZLIB", sizeof (header)) == 0)
          {
@@ -3100,7 +3581,7 @@ index 243859c..2fccec5 100644
  				   &info->size);
            return;
          }
-@@ -1397,7 +1605,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
+@@ -1397,7 +1616,7 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
  
        if (retbuf != MAP_FAILED)
  	{
@@ -3109,7 +3590,7 @@ index 243859c..2fccec5 100644
  	  info->buffer = retbuf + (sectp->filepos & (pagesize - 1)) ;
  	  return;
  	}
-@@ -1405,8 +1613,15 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
+@@ -1405,8 +1624,15 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
  #endif
  
    /* If we get here, we are a normal, not-compressed section.  */
@@ -3127,7 +3608,7 @@ index 243859c..2fccec5 100644
  
    /* When debugging .o files, we may need to apply relocations; see
       http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html .
-@@ -1415,6 +1630,8 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
+@@ -1415,6 +1641,8 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
    retbuf = symfile_relocate_debug_section (abfd, sectp, buf);
    if (retbuf != NULL)
      {
@@ -3136,7 +3617,7 @@ index 243859c..2fccec5 100644
        info->buffer = retbuf;
        return;
      }
-@@ -1423,6 +1640,19 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
+@@ -1423,6 +1651,19 @@ dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
        || bfd_bread (buf, info->size, abfd) != info->size)
      error (_("Dwarf Error: Can't read DWARF data from '%s'"),
  	   bfd_get_filename (abfd));
@@ -3156,7 +3637,80 @@ index 243859c..2fccec5 100644
  }
  
  /* Fill in SECTP, BUFP and SIZEP with section info, given OBJFILE and
-@@ -2548,6 +2778,13 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
+@@ -2389,11 +2630,18 @@ partial_die_parent_scope (struct partial_die_info *pdi,
+       || parent->tag == DW_TAG_union_type
+       || parent->tag == DW_TAG_enumeration_type)
+     {
++      char *parent_name = parent->name;
++
++      /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
++      if (parent->tag == DW_TAG_namespace && parent_name != NULL
++          && strcmp (parent_name, "::") == 0)
++	parent_name = NULL;
++
+       if (grandparent_scope == NULL)
+-	parent->scope = parent->name;
++	parent->scope = parent_name;
+       else
+ 	parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope,
+-					 parent->name, cu);
++					 parent_name, cu);
+     }
+   else if (parent->tag == DW_TAG_enumerator)
+     /* Enumerators should not get the name of the enumeration as a prefix.  */
+@@ -2405,7 +2653,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;
+     }
+ 
+@@ -2420,12 +2668,22 @@ 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);
++
++  return NULL;
+ }
+ 
+ static void
+@@ -2441,12 +2699,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))
+-    {
+-      actual_name = partial_die_full_name (pdi, cu);
+-      if (actual_name)
+-	built_actual_name = 1;
+-    }
++  actual_name = partial_die_full_name (pdi, cu);
++  if (actual_name)
++    built_actual_name = 1;
+ 
+   if (actual_name == NULL)
+     actual_name = pdi->name;
+@@ -2543,6 +2798,13 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
  			   &objfile->global_psymbols,
  			   0, (CORE_ADDR) 0, cu->language, objfile);
        break;
@@ -3170,7 +3724,70 @@ index 243859c..2fccec5 100644
      case DW_TAG_class_type:
      case DW_TAG_interface_type:
      case DW_TAG_structure_type:
-@@ -2661,12 +2898,12 @@ static void
+@@ -2586,34 +2848,17 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
+       break;
+     }
+ 
+-  /* Check to see if we should scan the name for possible namespace
+-     info.  Only do this if this is C++, if we don't have namespace
+-     debugging info in the file, if the psym is of an appropriate type
+-     (otherwise we'll have psym == NULL), and if we actually had a
+-     mangled name to begin with.  */
+-
+-  /* FIXME drow/2004-02-22: Why don't we do this for classes, i.e. the
+-     cases which do not set PSYM above?  */
+-
+-  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);
+-
+   if (built_actual_name)
+     xfree (actual_name);
+ }
+ 
+-/* Determine whether a die of type TAG living in a C++ class or
+-   namespace needs to have the name of the scope prepended to the
+-   name listed in the die.  */
++/* Determine whether DIE needs to have the name of the scope prepended
++   to the name listed in the die.  */
+ 
+ static int
+-pdi_needs_namespace (enum dwarf_tag tag)
++die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu)
+ {
+-  switch (tag)
++  switch (die->tag)
+     {
+     case DW_TAG_namespace:
+     case DW_TAG_typedef:
+@@ -2623,7 +2868,23 @@ 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_member:
+       return 1;
++
++    case DW_TAG_variable:
++      {
++	struct attribute *attr;
++	attr = dwarf2_attr (die, DW_AT_specification, cu);
++	if (attr)
++	  return 1;
++	attr = dwarf2_attr (die, DW_AT_external, cu);
++	if (attr == NULL && die->parent->tag != DW_TAG_namespace)
++	  return 0;
++	return 1;
++      }
++      break;
++
+     default:
+       return 0;
+     }
+@@ -2656,12 +2917,12 @@ static void
  add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc,
  		    CORE_ADDR *highpc, int need_pc, struct dwarf2_cu *cu)
  {
@@ -3187,7 +3804,35 @@ index 243859c..2fccec5 100644
  }
  
  /* Read a partial die corresponding to a subprogram and create a partial
-@@ -3330,6 +3567,14 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
+@@ -2752,27 +3013,6 @@ guess_structure_name (struct partial_die_info *struct_pdi,
+ 
+       if (real_pdi->die_parent != NULL)
+ 	return;
+-
+-      while (child_pdi != NULL)
+-	{
+-	  if (child_pdi->tag == DW_TAG_subprogram)
+-	    {
+-	      char *actual_class_name
+-		= language_class_name_from_physname (cu->language_defn,
+-						     child_pdi->name);
+-	      if (actual_class_name != NULL)
+-		{
+-		  struct_pdi->name
+-		    = obsavestring (actual_class_name,
+-				    strlen (actual_class_name),
+-				    &cu->comp_unit_obstack);
+-		  xfree (actual_class_name);
+-		}
+-	      break;
+-	    }
+-
+-	  child_pdi = child_pdi->die_sibling;
+-	}
+     }
+ }
+ 
+@@ -3325,6 +3565,14 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
      case DW_TAG_imported_declaration:
      case DW_TAG_imported_module:
        processing_has_namespace_info = 1;
@@ -3202,38 +3847,365 @@ index 243859c..2fccec5 100644
        if (die->child != NULL && (die->tag == DW_TAG_imported_declaration
  				 || cu->language != language_fortran))
  	complaint (&symfile_complaints, _("Tag '%s' has unexpected children"),
-@@ -3881,6 +4126,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+@@ -3340,41 +3588,71 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
+ /* Return the fully qualified name of DIE, based on its DW_AT_name.
+    If scope qualifiers are appropriate they will be added.  The result
+    will be allocated on the objfile_obstack, or NULL if the DIE does
+-   not have a name.  */
++   not have a name.
++
++   The output string will be canonicalized (if C++/Java). */
  
-   cu->list_in_scope = &local_symbols;
+ static const char *
+ dwarf2_full_name (struct die_info *die, struct dwarf2_cu *cu)
+ {
+-  struct attribute *attr;
+-  char *prefix, *name;
+-  struct ui_file *buf = NULL;
++  char *name;
  
-+  switch (cu->language)
+   name = dwarf2_name (die, cu);
+-  if (!name)
+-    return NULL;
+ 
+   /* These are the only languages we know how to qualify names in.  */
+-  if (cu->language != language_cplus
+-      && cu->language != language_java)
+-    return name;
++  if (name != NULL
++      && (cu->language == language_cplus || cu->language == language_java))
 +    {
-+    case language_fortran:
-+      cu->language_specific.fortran.use = NULL;
-+      break;
-+    }
-+
-   if (die->child != NULL)
-     {
-       child_die = die->child;
-@@ -3904,6 +4156,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
- 			determine_prefix (die, cu),
- 			processing_has_namespace_info);
++      if (die_needs_namespace (die, cu))
++	{
++	  long length;
++	  char *prefix;
++	  struct ui_file *buf;
+ 
+-  /* 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)
+-    return name;
++	  buf = mem_fileopen ();
++	  prefix = determine_prefix (die, cu);
++	  if (*prefix != '\0')
++	    {
++	      char *prefixed_name = typename_concat (NULL, prefix, name, cu);
++	      fputs_unfiltered (prefixed_name, buf);
++	      xfree (prefixed_name);
++	    }
++	  else
++	    fputs_unfiltered (name, buf);
  
-+  switch (cu->language)
-+    {
-+    case language_fortran:
-+      BLOCK_FORTRAN_USE (block) = cu->language_specific.fortran.use;
-+      break;
-+    }
+-  prefix = determine_prefix (die, cu);
+-  if (*prefix != '\0')
+-    name = typename_concat (&cu->objfile->objfile_obstack, prefix,
+-			    name, cu);
++	  name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack,
++				       &length);
++	  ui_file_delete (buf);
 +
-   /* If we have address ranges, record them.  */
-   dwarf2_record_block_ranges (die, block, baseaddr, cu);
-   
-@@ -5385,6 +5644,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
-   new_symbol (die, this_type, cu);
- }
- 
++	  if (cu->language == language_cplus)
++	    {
++	      char *cname
++		= dwarf2_canonicalize_name (name, cu,
++					    &cu->objfile->objfile_obstack);
++	      if (cname != NULL)
++		name = cname;
++	    }
++	}
++    }
+ 
+   return name;
+ }
+ 
++/* Read the given DIE's DW_AT_decl_line number.  Return -1 if in case of an
++   error.  */
++
++static 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
+@@ -3385,9 +3663,15 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
+   struct dwarf2_cu *imported_cu;
+   const char *imported_name;
+   const char *imported_name_prefix;
+-  const char *import_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)
+     {
+@@ -3436,17 +3720,27 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
+       return;
+     }
+ 
+-  /* FIXME: dwarf2_name (die); for the local name after import.  */
+-
+-  /* Figure out where the statement is being imported to.  */
++  /* 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, imported_cu);
+-
+-  if (strlen (imported_name_prefix) > 0)
+-    {
++  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, "::");
+@@ -3457,8 +3751,14 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
+       canonical_name = alloca (strlen (imported_name) + 1);
+       strcpy (canonical_name, imported_name);
+     }
+-
+-  using_directives = cp_add_using (import_prefix,canonical_name, using_directives);
++  }
++  
++  using_directives = cp_add_using (import_prefix,
++                                   canonical_name,
++                                   import_alias,
++                                   imported_declaration,
++                                   line_number,
++                                   using_directives);
+ }
+ 
+ static void
+@@ -3727,6 +4027,14 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu)
+   struct attribute *attr;
+ 
+   attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
++  
++  /* GCC 4.3 incorrectly 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)
+     return;
+ 
+@@ -3825,6 +4133,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+   char *name;
+   CORE_ADDR baseaddr;
+   struct block *block;
++  unsigned die_children = 0;
+   int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
+ 
+   if (inlined_func)
+@@ -3843,13 +4152,23 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+ 
+   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ 
+-  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, NULL))
++  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++;
++      }
++    inherit_abstract_dies(die, cu);
+     return;
+-
++  }
++  
+   lowpc += baseaddr;
+   highpc += baseaddr;
+ 
+@@ -3876,14 +4195,19 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+ 
+   cu->list_in_scope = &local_symbols;
+ 
+-  if (die->child != NULL)
++  switch (cu->language)
+     {
+-      child_die = die->child;
+-      while (child_die && child_die->tag)
+-	{
+-	  process_die (child_die, cu);
+-	  child_die = sibling_die (child_die);
+-	}
++    case language_fortran:
++      cu->language_specific.fortran.use = NULL;
++      break;
++    }
++
++  child_die = die->child;
++  while (child_die && child_die->tag)
++    {
++      process_die (child_die, cu);
++      child_die = sibling_die (child_die);
++      die_children++;
+     }
+ 
+   inherit_abstract_dies (die, cu);
+@@ -3899,6 +4223,13 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
+ 			determine_prefix (die, cu),
+ 			processing_has_namespace_info);
+ 
++  switch (cu->language)
++    {
++    case language_fortran:
++      BLOCK_FORTRAN_USE (block) = cu->language_specific.fortran.use;
++      break;
++    }
++
+   /* If we have address ranges, record them.  */
+   dwarf2_record_block_ranges (die, block, baseaddr, cu);
+   
+@@ -3952,7 +4283,7 @@ read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
+     }
+   new = pop_context ();
+ 
+-  if (local_symbols != NULL)
++  if (local_symbols != NULL || using_directives != NULL)
+     {
+       struct block *block
+         = finish_block (0, &local_symbols, new->old_blocks, new->start_addr,
+@@ -4517,7 +4848,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
+ 	return;
+ 
+       /* Get physical name.  */
+-      physname = dwarf2_linkage_name (die, cu);
++      physname = dwarf2_physname (die, cu);
+ 
+       /* The name is already allocated along with this objfile, so we don't
+ 	 need to duplicate it for the type.  */
+@@ -4679,7 +5010,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
+     return;
+ 
+   /* Get the mangled name.  */
+-  physname = dwarf2_linkage_name (die, cu);
++  physname = dwarf2_physname (die, cu);
+ 
+   /* Look up member function name in fieldlist.  */
+   for (i = 0; i < fip->nfnfields; i++)
+@@ -5010,14 +5341,18 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
+       if (cu->language == language_cplus
+ 	  || cu->language == language_java)
+ 	{
+-	  const char *new_prefix = determine_class_name (die, cu);
+-	  TYPE_TAG_NAME (type) = (char *) new_prefix;
++	  TYPE_TAG_NAME (type) = (char *) dwarf2_full_name (die, cu);
++	  if (die->tag == DW_TAG_structure_type
++	      || die->tag == DW_TAG_class_type)
++	    TYPE_NAME (type) = TYPE_TAG_NAME (type);
+ 	}
+       else
+ 	{
+ 	  /* The name is already allocated along with this objfile, so
+ 	     we don't need to duplicate it for the type.  */
+-	  TYPE_TAG_NAME (type) = name;
++	  TYPE_TAG_NAME (type) = (char *) name;
++	  if (die->tag == DW_TAG_class_type)
++	    TYPE_NAME (type) = TYPE_TAG_NAME (type);
+ 	}
+     }
+ 
+@@ -5258,51 +5593,6 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
+   return set_die_type (die, type, cu);
+ }
+ 
+-/* Determine the name of the type represented by DIE, which should be
+-   a named C++ or Java compound type.  Return the name in question,
+-   allocated on the objfile obstack.  */
+-
+-static const char *
+-determine_class_name (struct die_info *die, struct dwarf2_cu *cu)
+-{
+-  const char *new_prefix = NULL;
+-
+-  /* If we don't have namespace debug info, guess the name by trying
+-     to demangle the names of members, just like we did in
+-     guess_structure_name.  */
+-  if (!processing_has_namespace_info)
+-    {
+-      struct die_info *child;
+-
+-      for (child = die->child;
+-	   child != NULL && child->tag != 0;
+-	   child = sibling_die (child))
+-	{
+-	  if (child->tag == DW_TAG_subprogram)
+-	    {
+-	      char *phys_prefix
+-		= language_class_name_from_physname (cu->language_defn,
+-						     dwarf2_linkage_name
+-						     (child, cu));
+-
+-	      if (phys_prefix != NULL)
+-		{
+-		  new_prefix
+-		    = obsavestring (phys_prefix, strlen (phys_prefix),
+-				    &cu->objfile->objfile_obstack);
+-		  xfree (phys_prefix);
+-		  break;
+-		}
+-	    }
+-	}
+-    }
+-
+-  if (new_prefix == NULL)
+-    new_prefix = dwarf2_full_name (die, cu);
+-
+-  return new_prefix;
+-}
+-
+ /* Given a pointer to a die which begins an enumeration, process all
+    the dies that define the members of the enumeration, and create the
+    symbol for the enumeration type.
+@@ -5380,6 +5670,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
+   new_symbol (die, this_type, cu);
+ }
+ 
 +/* Create a new array dimension referencing its target type TYPE.
 +
 +   Multidimensional arrays are internally represented as a stack of
@@ -3260,7 +4232,7 @@ index 243859c..2fccec5 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.  */
-@@ -5398,7 +5680,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5393,7 +5706,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;
@@ -3269,7 +4241,7 @@ index 243859c..2fccec5 100644
    struct cleanup *back_to;
    char *name;
  
-@@ -5445,16 +5727,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5440,16 +5753,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)
@@ -3291,7 +4263,16 @@ index 243859c..2fccec5 100644
  
    /* Understand Dwarf2 support for vector types (like they occur on
       the PowerPC w/ AltiVec).  Gcc just adds another attribute to the
-@@ -5659,20 +5936,155 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5638,7 +5946,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 (previous_prefix, TYPE_NAME (type));
++	  cp_add_using_directive (previous_prefix, TYPE_NAME (type), "", "", dwarf2_read_decl_line(die, cu));
+ 	}
+     }
+ 
+@@ -5654,20 +5962,155 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
      }
  }
  
@@ -3304,14 +4285,13 @@ index 243859c..2fccec5 100644
  {
 -  struct die_info *child_die = die->child;
 +  struct type *type;
- 
--  /* FIXME: Support the separate Fortran module namespaces.  */
++
 +  type = read_module_type (die, cu);
 +
 +  if (type)
 +    new_symbol (die, type, cu);
 +}
- 
++
 +/* Read a Fortran module as type.
 +
 +   Modules present only as declarations - being used only for DW_AT_import of
@@ -3340,9 +4320,10 @@ index 243859c..2fccec5 100644
 +  type = init_type (TYPE_CODE_MODULE, 0, 0, module_name, objfile);
 +
 +  /* Create a context for reading the module variables.  */
-+
+ 
+-  /* FIXME: Support the separate Fortran module namespaces.  */
 +  new = push_context (0, 0);
-+
+ 
 +  save_file_symbols = file_symbols;
 +  file_symbols = NULL;
 +  save_global_symbols = global_symbols;
@@ -3450,7 +4431,7 @@ index 243859c..2fccec5 100644
  }
  
  /* Return the name of the namespace represented by DIE.  Set
-@@ -5837,29 +6249,113 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -5832,29 +6275,113 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
    struct gdbarch *gdbarch = get_objfile_arch (objfile);
    struct type *type, *range_type, *index_type, *char_type;
    struct attribute *attr;
@@ -3578,7 +4559,7 @@ index 243859c..2fccec5 100644
    char_type = language_string_char_type (cu->language_defn, gdbarch);
    type = create_string_type (NULL, char_type, range_type);
  
-@@ -5959,7 +6455,6 @@ static struct type *
+@@ -5954,7 +6481,6 @@ static struct type *
  read_typedef (struct die_info *die, struct dwarf2_cu *cu)
  {
    struct objfile *objfile = cu->objfile;
@@ -3586,7 +4567,7 @@ index 243859c..2fccec5 100644
    const char *name = NULL;
    struct type *this_type;
  
-@@ -6067,8 +6562,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -6062,8 +6588,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
    struct type *base_type;
    struct type *range_type;
    struct attribute *attr;
@@ -3596,7 +4577,7 @@ index 243859c..2fccec5 100644
    char *name;
    LONGEST negative_mask;
    
-@@ -6082,49 +6576,101 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -6077,49 +6602,101 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
  		     0, NULL, cu->objfile);
      }
  
@@ -3734,7 +4715,7 @@ index 243859c..2fccec5 100644
  
    name = dwarf2_name (die, cu);
    if (name)
-@@ -6583,6 +7129,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
+@@ -6578,6 +7155,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
  	  && abbrev->tag != DW_TAG_lexical_block
  	  && abbrev->tag != DW_TAG_variable
  	  && abbrev->tag != DW_TAG_namespace
@@ -3742,7 +4723,28 @@ index 243859c..2fccec5 100644
  	  && abbrev->tag != DW_TAG_member)
  	{
  	  /* Otherwise we skip to the next sibling, if any.  */
-@@ -8331,10 +8878,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym,
+@@ -6786,8 +7364,8 @@ read_partial_die (struct partial_die_info *part_die,
+ 	    }
+ 	  break;
+ 	case DW_AT_MIPS_linkage_name:
+-	  part_die->name = DW_STRING (&attr);
+-	  break;
++	  if (cu->language == language_ada)
++	    part_die->name = DW_STRING (&attr);
+ 	case DW_AT_low_pc:
+ 	  has_low_pc_attr = 1;
+ 	  part_die->lowpc = DW_ADDR (&attr);
+@@ -6984,7 +7562,8 @@ 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->is_external))
+     {
+       struct partial_die_info *spec_die;
+ 
+@@ -8326,10 +8905,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
@@ -3757,16 +4759,35 @@ index 243859c..2fccec5 100644
  }
  
  /* Given a pointer to a DWARF information entry, figure out if we need
-@@ -8367,10 +8916,17 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -8351,21 +8932,29 @@ 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);
+-  else
+-    name = TYPE_NAME (type);
+-
++  name = dwarf2_name (die, cu);
+   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 w/o checking SYMBOL_COMPUTED_OPS validity.  */
 +      SYMBOL_COMPUTED_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;
-       SYMBOL_SET_NAMES (sym, name, strlen (name), 0, objfile);
+-      SYMBOL_SET_NAMES (sym, name, strlen (name), 0, objfile);
++
++      /* Cache this symbol's name and the name's demangled form (if any).  */
++
++      linkagename = dwarf2_physname (die, cu);
++      SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), 0, objfile);
 +      if (cu->language == language_fortran)
 +	{
 +	  SYMBOL_CPLUS_DEMANGLED_NAME (sym) = SYMBOL_LINKAGE_NAME (sym);
@@ -3775,7 +4796,7 @@ index 243859c..2fccec5 100644
  
        /* Default assumptions.
           Use the passed type or decode it from the die.  */
-@@ -8470,7 +9026,18 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -8465,7 +9054,18 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  	      var_decode_location (attr, sym, cu);
  	      attr2 = dwarf2_attr (die, DW_AT_external, cu);
  	      if (attr2 && (DW_UNSND (attr2) != 0))
@@ -3795,7 +4816,16 @@ index 243859c..2fccec5 100644
  	      else
  		add_symbol_to_list (sym, cu->list_in_scope);
  	    }
-@@ -8631,6 +9198,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -8602,7 +9202,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+ 	  add_symbol_to_list (sym, cu->list_in_scope);
+ 	  break;
+ 	case DW_TAG_enumerator:
+-	  SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_full_name (die, cu);
++	  SYMBOL_LINKAGE_NAME (sym) = (char *) dwarf2_name (die, cu);
+ 	  attr = dwarf2_attr (die, DW_AT_const_value, cu);
+ 	  if (attr)
+ 	    {
+@@ -8626,6 +9226,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;
@@ -3807,7 +4837,17 @@ index 243859c..2fccec5 100644
  	default:
  	  /* Not a tag we recognize.  Hopefully we aren't processing
  	     trash data, but since we must specifically ignore things
-@@ -8957,12 +9529,18 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu)
+@@ -8639,8 +9244,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+       /* For the benefit of old versions of GCC, check for anonymous
+ 	 namespaces based on the demangled name.  */
+       if (!processing_has_namespace_info
+-	  && cu->language == language_cplus
+-	  && dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu) != NULL)
++	  && cu->language == language_cplus)
+ 	cp_scan_for_anonymous_namespaces (sym);
+     }
+   return (sym);
+@@ -8952,12 +9556,18 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu)
      case DW_TAG_namespace:
        this_type = read_namespace_type (die, cu);
        break;
@@ -3826,10 +4866,195 @@ index 243859c..2fccec5 100644
    return this_type;
  }
  
-@@ -9110,6 +9688,39 @@ dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
-   return dwarf2_name (die, cu);
+@@ -9039,10 +9649,103 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
+ 	     So it does not need a prefix.  */
+ 	  return "";
+       default:
+-	return determine_prefix (parent, cu);
++        return determine_prefix (parent, cu);
+       }
+ }
+ 
++/* Determines the prefix for a symbol's physname.  Unlike determine_prefix,
++   this method does not simply look at the DIE's immediate parent.
++   It will compute the symbol's physname by scanning through all parent
++   DIEs until it gets to the compilation unit's DIE.  */
++
++static char *
++physname_prefix (struct die_info *die, struct dwarf2_cu *cu)
++{
++  long length;
++  struct ui_file *buf;
++  struct die_info *d, *spec_die;
++  struct dwarf2_cu *spec_cu;
++  char *name;
++
++  /* Construct a stack containing all of the DIE's parents.  Caution
++     must be observed for dealing with DW_AT_specification. */
++  spec_cu = cu;
++  spec_die = die_specification (die, &spec_cu);
++  if (spec_die != NULL)
++    d = spec_die->parent;
++  else
++    d = die->parent;
++  while (d != NULL && d->tag != DW_TAG_compile_unit)
++    {
++      struct attribute *attr;
++
++      spec_die = die_specification (d, &spec_cu);
++      if (spec_die != NULL)
++	d = spec_die;
++
++      VEC_quick_push (die_info_p, die_list, d);
++      d = d->parent;
++    }
++
++  /* Now pop all the elements, printing their names as we go.  */
++  buf = mem_fileopen ();
++  while (!VEC_empty (die_info_p, die_list))
++    {
++      d = VEC_pop (die_info_p, die_list);
++      physname_prefix_1 (buf, d, cu);
++
++      if (!VEC_empty (die_info_p, die_list))
++	{
++	  if (cu->language == language_cplus)
++	    fputs_unfiltered ("::", buf);
++	  else
++	    fputs_unfiltered (".", buf);
++	}
++    }
++
++  name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack, &length);
++  ui_file_delete (buf);
++  return name;
++}
++
++static void
++physname_prefix_1 (struct ui_file *buf, struct die_info *die,
++		   struct dwarf2_cu *cu)
++{
++  const char *name = NULL;
++  gdb_assert (buf != NULL);
++
++  if (die != NULL)
++    {
++      switch (die->tag)
++	{
++	case DW_TAG_namespace:
++	  name = dwarf2_name (die, cu);
++	  if (name == NULL)
++	    name = "(anonymous namespace)";
++	  /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
++	  else if (strcmp (name, "::") == 0)
++	    name = NULL;
++	  break;
++
++	case DW_TAG_class_type:
++	case DW_TAG_structure_type:
++	case DW_TAG_union_type:
++	case DW_TAG_enumeration_type:
++	case DW_TAG_interface_type:
++	case DW_TAG_subprogram:
++	  name = dwarf2_name (die, cu);
++	  break;
++
++	default:
++	  break;
++	}
++    }
++
++  if (name != NULL)
++    fputs_unfiltered (name, buf);
++}
++
+ /* Return a newly-allocated string formed by concatenating PREFIX and
+    SUFFIX with appropriate separator.  If PREFIX or SUFFIX is NULL or empty, then
+    simply copy the SUFFIX or PREFIX, respectively.  If OBS is non-null,
+@@ -9092,17 +9795,111 @@ sibling_die (struct die_info *die)
+   return die->sibling;
  }
  
+-/* Get linkage name of a die, return NULL if not found.  */
++/* Construct a physname for the given DIE in CU. */
+ 
+ static char *
+-dwarf2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
++dwarf2_physname (struct die_info *die, struct dwarf2_cu *cu)
+ {
+   struct attribute *attr;
++  char *name;
++
++  name = dwarf2_name (die, cu);
++
++  /* These are the only languages we know how to qualify names in.  */
++  if (cu->language != language_cplus
++      && cu->language != language_java)
++    return name;
++
++  if (die_needs_namespace (die, cu))
++    {
++      long length;
++      char *prefix;
++      struct ui_file *buf;
++
++      prefix = physname_prefix (die, cu);
++      buf = mem_fileopen ();
++      if (*prefix != '\0')
++	{
++	  char *prefixed_name = typename_concat (NULL, prefix, name, cu);
++	  fputs_unfiltered (prefixed_name, buf);
++	  xfree (prefixed_name);
++	}
++      else
++	fputs_unfiltered (name ? name : "", buf);
++
++      /* For Java and C++ methods, append formal parameter type
++	 information. */
++      if ((cu->language == language_cplus || cu->language == language_java)
++	  && die->tag == DW_TAG_subprogram)
++	{
++	  struct type *type = read_type_die (die, cu);
++
++	  c_type_print_args (type, buf, 0, cu->language);
++
++	  if (cu->language == language_java)
++	    {
++	      /* For java, we must append the return type to method names. */
++	      if (die->tag == DW_TAG_subprogram)
++		java_print_type (TYPE_TARGET_TYPE (type), "", buf, 0, 0);
++	    }
++	  else if (cu->language == language_cplus)
++	    {
++	      /* c_type_print_args adds argument types, but it does
++		 not add any necessary "const". */
++	      if (TYPE_NFIELDS (type) > 0 && TYPE_FIELD_ARTIFICIAL (type, 0)
++		  && TYPE_CONST (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0))))
++		fputs_unfiltered (" const", buf);
++	    }
++	}
++
++      name = ui_file_obsavestring (buf, &cu->objfile->objfile_obstack,
++				   &length);
++      ui_file_delete (buf);
++
++      if (cu->language == language_cplus)
++	{
++	  char *cname
++	    = dwarf2_canonicalize_name (name, cu,
++					&cu->objfile->objfile_obstack);
++	  if (cname != NULL)
++	    name = cname;
++	}
++    }
+ 
+-  attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
+-  if (attr && DW_STRING (attr))
+-    return DW_STRING (attr);
+-  return dwarf2_name (die, cu);
++  return name;
++}
++
 +/* Return the fully qualified .symtab name for symbols contained in Fortran
 +   modules.  Return DWARF2_NAME otherwise.  */
 +
@@ -3861,12 +5086,10 @@ index 243859c..2fccec5 100644
 +    }
 +
 +  return name;
-+}
-+
- /* Get name of a die, return NULL if not found.  */
+ }
  
- static char *
-@@ -11455,6 +12066,34 @@ attr_form_is_constant (struct attribute *attr)
+ /* Get name of a die, return NULL if not found.  */
+@@ -11450,6 +12247,34 @@ attr_form_is_constant (struct attribute *attr)
      }
  }
  
@@ -3901,7 +5124,7 @@ index 243859c..2fccec5 100644
  static void
  dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
  			     struct dwarf2_cu *cu)
-@@ -11484,35 +12123,25 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
+@@ -11479,35 +12304,25 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
        SYMBOL_COMPUTED_OPS (sym) = &dwarf2_loclist_funcs;
        SYMBOL_LOCATION_BATON (sym) = baton;
      }
@@ -3952,7 +5175,7 @@ index 243859c..2fccec5 100644
      }
  }
  
-@@ -11800,6 +12429,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs)
+@@ -11795,6 +12610,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs)
    return ofs_lhs->offset == ofs_rhs->offset;
  }
  
@@ -3984,7 +5207,7 @@ index 243859c..2fccec5 100644
  /* Set the type associated with DIE to TYPE.  Save it in CU's hash
     table if necessary.  For convenience, return TYPE.  */
  
-@@ -11808,6 +12462,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -11803,6 +12643,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  {
    struct dwarf2_offset_and_type **slot, ofs;
  
@@ -3993,7 +5216,7 @@ index 243859c..2fccec5 100644
    /* For Ada types, make sure that the gnat-specific data is always
       initialized (if not already set).  There are a few types where
       we should not be doing so, because the type-specific area is
-@@ -11963,23 +12619,13 @@ show_dwarf2_cmd (char *args, int from_tty)
+@@ -11958,23 +12800,13 @@ show_dwarf2_cmd (char *args, int from_tty)
    cmd_show_list (show_dwarf2_cmdlist, from_tty, "");
  }
  
@@ -4021,7 +5244,7 @@ index 243859c..2fccec5 100644
  }
  
  /* munmap debug sections for OBJFILE, if necessary.  */
-@@ -11988,15 +12634,15 @@ static void
+@@ -11983,15 +12815,15 @@ static void
  dwarf2_per_objfile_free (struct objfile *objfile, void *d)
  {
    struct dwarf2_per_objfile *data = d;
@@ -4046,6 +5269,14 @@ index 243859c..2fccec5 100644
  }
  
  void _initialize_dwarf2_read (void);
+@@ -11999,6 +12831,7 @@ void _initialize_dwarf2_read (void);
+ void
+ _initialize_dwarf2_read (void)
+ {
++  die_list = VEC_alloc (die_info_p, 32);
+   dwarf2_objfile_data_key
+     = register_objfile_data_with_cleanup (NULL, dwarf2_per_objfile_free);
+ 
 diff --git a/gdb/elfread.c b/gdb/elfread.c
 index 78e9163..4e208d1 100644
 --- a/gdb/elfread.c
@@ -4104,15 +5335,10 @@ index 78e9163..4e208d1 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 3dbbc8b..4deb82d 100644
+index 27b7895..90c29a3 100644
 --- a/gdb/eval.c
 +++ b/gdb/eval.c
-@@ -39,10 +39,12 @@
- #include "exceptions.h"
- #include "regcache.h"
- #include "user-regs.h"
-+#include "python/python.h"
- #include "valprint.h"
+@@ -43,6 +43,7 @@
  #include "gdb_obstack.h"
  #include "objfiles.h"
  #include "python/python.h"
@@ -4120,7 +5346,7 @@ index 3dbbc8b..4deb82d 100644
  
  #include "gdb_assert.h"
  
-@@ -696,6 +698,7 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -696,6 +697,7 @@ evaluate_subexp_standard (struct type *expect_type,
    long mem_offset;
    struct type **arg_types;
    int save_pos1;
@@ -4128,27 +5354,126 @@ index 3dbbc8b..4deb82d 100644
  
    pc = (*pos)++;
    op = exp->elts[pc].opcode;
-@@ -1588,6 +1591,8 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -1332,7 +1334,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)++;
  
-       /* First determine the type code we are dealing with.  */
-       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
-+      old_chain = make_cleanup (null_cleanup, 0);
-+      object_address_set (value_raw_address (arg1));
-       type = check_typedef (value_type (arg1));
-       code = TYPE_CODE (type);
+@@ -1356,21 +1357,40 @@ evaluate_subexp_standard (struct type *expect_type,
  
-@@ -1608,6 +1613,7 @@ evaluate_subexp_standard (struct type *expect_type,
- 	      code = TYPE_CODE (type);
- 	    }
- 	} 
-+      do_cleanups (old_chain);
+ 	  arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
  
-       switch (code)
- 	{
-@@ -2040,13 +2046,19 @@ evaluate_subexp_standard (struct type *expect_type,
-       {
- 	int subscript_array[MAX_FORTRAN_DIMS];
- 	int array_size_array[MAX_FORTRAN_DIMS];
+-	  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)
+ 	{
+@@ -1496,8 +1516,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)
+ 	{
+@@ -1588,6 +1607,8 @@ evaluate_subexp_standard (struct type *expect_type,
+ 
+       /* First determine the type code we are dealing with.  */
+       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
++      old_chain = make_cleanup (null_cleanup, 0);
++      object_address_set (value_raw_address (arg1));
+       type = check_typedef (value_type (arg1));
+       code = TYPE_CODE (type);
+ 
+@@ -1608,6 +1629,7 @@ evaluate_subexp_standard (struct type *expect_type,
+ 	      code = TYPE_CODE (type);
+ 	    }
+ 	} 
++      do_cleanups (old_chain);
+ 
+       switch (code)
+ 	{
+@@ -1769,6 +1791,27 @@ evaluate_subexp_standard (struct type *expect_type,
+       xfree (expect_type);
+       return arg1;
+ 
++    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);
+@@ -2040,13 +2083,19 @@ evaluate_subexp_standard (struct type *expect_type,
+       {
+ 	int subscript_array[MAX_FORTRAN_DIMS];
+ 	int array_size_array[MAX_FORTRAN_DIMS];
 +	int byte_stride_array[MAX_FORTRAN_DIMS];
  	int ndimensions = 1, i;
  	struct type *tmp_type;
@@ -4165,7 +5490,7 @@ index 3dbbc8b..4deb82d 100644
  	tmp_type = check_typedef (value_type (arg1));
  	ndimensions = calc_f77_array_dims (type);
  
-@@ -2076,6 +2088,9 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2076,6 +2125,9 @@ evaluate_subexp_standard (struct type *expect_type,
  	    upper = f77_get_upperbound (tmp_type);
  	    lower = f77_get_lowerbound (tmp_type);
  
@@ -4175,7 +5500,7 @@ index 3dbbc8b..4deb82d 100644
  	    array_size_array[nargs - i - 1] = upper - lower + 1;
  
  	    /* Zero-normalize subscripts so that offsetting will work. */
-@@ -2094,13 +2109,25 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2094,13 +2146,25 @@ evaluate_subexp_standard (struct type *expect_type,
  	      tmp_type = check_typedef (TYPE_TARGET_TYPE (tmp_type));
  	  }
  
@@ -4205,7 +5530,7 @@ index 3dbbc8b..4deb82d 100644
  
  	/* Let us now play a dirty trick: we will take arg1 
  	   which is a value node pointing to the topmost level
-@@ -2110,7 +2137,7 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2110,7 +2174,7 @@ evaluate_subexp_standard (struct type *expect_type,
  	   returns the correct type value */
  
  	deprecated_set_value_type (arg1, tmp_type);
@@ -4214,7 +5539,7 @@ index 3dbbc8b..4deb82d 100644
        }
  
      case BINOP_LOGICAL_AND:
-@@ -2344,14 +2371,22 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2344,14 +2408,22 @@ evaluate_subexp_standard (struct type *expect_type,
        if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_PTR)
  	expect_type = TYPE_TARGET_TYPE (check_typedef (expect_type));
        arg1 = evaluate_subexp (expect_type, exp, pos, noside);
@@ -4239,7 +5564,7 @@ index 3dbbc8b..4deb82d 100644
        else if (noside == EVAL_AVOID_SIDE_EFFECTS)
  	{
  	  type = check_typedef (value_type (arg1));
-@@ -2360,12 +2395,18 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2360,12 +2432,18 @@ evaluate_subexp_standard (struct type *expect_type,
  	  /* In C you can dereference an array to get the 1st elt.  */
  	      || TYPE_CODE (type) == TYPE_CODE_ARRAY
  	    )
@@ -4263,7 +5588,7 @@ index 3dbbc8b..4deb82d 100644
  	  else
  	    error (_("Attempt to take contents of a non-pointer value."));
  	}
-@@ -2375,9 +2416,14 @@ evaluate_subexp_standard (struct type *expect_type,
+@@ -2375,9 +2453,14 @@ evaluate_subexp_standard (struct type *expect_type,
  	 do.  "long long" variables are rare enough that
  	 BUILTIN_TYPE_LONGEST would seem to be a mistake.  */
        if (TYPE_CODE (type) == TYPE_CODE_INT)
@@ -4281,7 +5606,7 @@ index 3dbbc8b..4deb82d 100644
  
      case UNOP_ADDR:
        /* C++: check for and handle pointer to members.  */
-@@ -2696,7 +2742,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
+@@ -2712,7 +2795,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
  {
    enum exp_opcode op;
    int pc;
@@ -4290,7 +5615,7 @@ index 3dbbc8b..4deb82d 100644
    struct symbol *var;
    struct type *type;
  
-@@ -2707,12 +2753,17 @@ evaluate_subexp_with_coercion (struct expression *exp,
+@@ -2723,12 +2806,17 @@ evaluate_subexp_with_coercion (struct expression *exp,
      {
      case OP_VAR_VALUE:
        var = exp->elts[pc + 2].symbol;
@@ -4309,7 +5634,7 @@ index 3dbbc8b..4deb82d 100644
  	  return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
  			     val);
  	}
-@@ -2764,9 +2815,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
+@@ -2780,9 +2868,13 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
  
      case OP_VAR_VALUE:
        (*pos) += 4;
@@ -4327,17 +5652,29 @@ index 3dbbc8b..4deb82d 100644
      default:
        val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
 diff --git a/gdb/expression.h b/gdb/expression.h
-index e4e8598..ca96b9b 100644
+index ca216cf..2195fef 100644
 --- a/gdb/expression.h
 +++ b/gdb/expression.h
-@@ -445,4 +445,5 @@ extern char *op_string (enum exp_opcode);
+@@ -95,6 +95,11 @@ enum exp_opcode
+        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 */
+@@ -451,4 +456,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 *);
  
 +
  #endif /* !defined (EXPRESSION_H) */
 diff --git a/gdb/f-lang.c b/gdb/f-lang.c
-index b914b49..79b46d2 100644
+index b914b49..67c7232 100644
 --- a/gdb/f-lang.c
 +++ b/gdb/f-lang.c
 @@ -31,6 +31,8 @@
@@ -4349,7 +5686,7 @@ index b914b49..79b46d2 100644
  
  
  /* Following is dubious stuff that had been in the xcoff reader. */
-@@ -306,6 +308,48 @@ f_language_arch_info (struct gdbarch *gdbarch,
+@@ -306,6 +308,46 @@ f_language_arch_info (struct gdbarch *gdbarch,
    lai->bool_type_default = builtin->builtin_logical_s2;
  }
  
@@ -4361,7 +5698,6 @@ index b914b49..79b46d2 100644
 +
 +static struct symbol *
 +f_lookup_symbol_nonlocal (const char *name,
-+			  const char *linkage_name,
 +			  const struct block *block,
 +			  const domain_enum domain)
 +{
@@ -4376,7 +5712,7 @@ index b914b49..79b46d2 100644
 +      struct type *type;
 +      struct symbol *retval;
 +
-+      sym = lookup_symbol_global (use->module_name, NULL, block, MODULE_DOMAIN);
++      sym = lookup_symbol_global (use->module_name, block, MODULE_DOMAIN);
 +
 +      /* Module name lookup should not fail with correct debug info.  */
 +      if (sym == NULL)
@@ -4386,8 +5722,7 @@ index b914b49..79b46d2 100644
 +      gdb_assert (TYPE_CODE (type) == TYPE_CODE_MODULE);
 +      gdb_assert (TYPE_MODULE_BLOCK (type) != NULL);
 +
-+      retval = lookup_block_symbol (TYPE_MODULE_BLOCK (type), name,
-+				    linkage_name, domain);
++      retval = lookup_block_symbol (TYPE_MODULE_BLOCK (type), name, domain);
 +      if (retval)
 +	return retval;
 +    }
@@ -4398,7 +5733,7 @@ index b914b49..79b46d2 100644
  /* This is declared in c-lang.h but it is silly to import that file for what
     is already just a hack. */
  extern int c_value_print (struct value *, struct ui_file *,
-@@ -333,7 +377,7 @@ const struct language_defn f_language_defn =
+@@ -333,7 +375,7 @@ const struct language_defn f_language_defn =
    c_value_print,		/* FIXME */
    NULL,				/* Language specific skip_trampoline */
    NULL,                    	/* name_of_this */
@@ -5038,412 +6373,6 @@ index ffb7f53..a2e7e94 100644
  set complaints 1
  
  b internal_error
-diff --git a/gdb/gdbserver/linux-i386-low.c b/gdb/gdbserver/linux-i386-low.c
-new file mode 100644
-index 0000000..b95c1b1
---- /dev/null
-+++ b/gdb/gdbserver/linux-i386-low.c
-@@ -0,0 +1,210 @@
-+/* GNU/Linux/i386 specific low level interface, for the remote server for GDB.
-+   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006,
-+   2007, 2008, 2009 Free Software Foundation, Inc.
-+
-+   This file is part of GDB.
-+
-+   This program is free software; you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation; either version 3 of the License, or
-+   (at your option) any later version.
-+
-+   This program is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+
-+   You should have received a copy of the GNU General Public License
-+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-+
-+#include "server.h"
-+#include "linux-low.h"
-+#include "i387-fp.h"
-+
-+#include "gdb_proc_service.h"
-+
-+#include <sys/ptrace.h>
-+
-+#ifdef HAVE_SYS_REG_H
-+#include <sys/reg.h>
-+#endif
-+
-+#ifndef PTRACE_GET_THREAD_AREA
-+#define PTRACE_GET_THREAD_AREA 25
-+#endif
-+
-+/* Defined in auto-generated file reg-i386-linux.c.  */
-+void init_registers_i386_linux (void);
-+
-+
-+/* This module only supports access to the general purpose registers.  */
-+
-+#define i386_num_regs 16
-+
-+/* This stuff comes from i386-linux-nat.c.  */
-+
-+/* Mapping between the general-purpose registers in `struct user'
-+   format and GDB's register array layout.  */
-+static int i386_regmap[] = 
-+{
-+  EAX * 4, ECX * 4, EDX * 4, EBX * 4,
-+  UESP * 4, EBP * 4, ESI * 4, EDI * 4,
-+  EIP * 4, EFL * 4, CS * 4, SS * 4,
-+  DS * 4, ES * 4, FS * 4, GS * 4
-+};
-+
-+/* Called by libthread_db.  */
-+
-+ps_err_e
-+ps_get_thread_area (const struct ps_prochandle *ph, 
-+		    lwpid_t lwpid, int idx, void **base)
-+{
-+  unsigned int desc[4];
-+
-+  if (ptrace (PTRACE_GET_THREAD_AREA, lwpid,
-+	      (void *) idx, (unsigned long) &desc) < 0)
-+    return PS_ERR;
-+
-+  *(int *)base = desc[1];
-+  return PS_OK;
-+}
-+
-+static int
-+i386_cannot_store_register (int regno)
-+{
-+  return (regno >= i386_num_regs);
-+}
-+
-+static int
-+i386_cannot_fetch_register (int regno)
-+{
-+  return (regno >= i386_num_regs);
-+}
-+
-+
-+#ifdef HAVE_PTRACE_GETREGS
-+#include <sys/procfs.h>
-+#include <sys/ptrace.h>
-+
-+static void
-+i386_fill_gregset (void *buf)
-+{
-+  int i;
-+
-+  for (i = 0; i < i386_num_regs; i++)
-+    collect_register (i, ((char *) buf) + i386_regmap[i]);
-+
-+  collect_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
-+}
-+
-+static void
-+i386_store_gregset (const void *buf)
-+{
-+  int i;
-+
-+  for (i = 0; i < i386_num_regs; i++)
-+    supply_register (i, ((char *) buf) + i386_regmap[i]);
-+
-+  supply_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
-+}
-+
-+static void
-+i386_fill_fpregset (void *buf)
-+{
-+  i387_cache_to_fsave (buf);
-+}
-+
-+static void
-+i386_store_fpregset (const void *buf)
-+{
-+  i387_fsave_to_cache (buf);
-+}
-+
-+static void
-+i386_fill_fpxregset (void *buf)
-+{
-+  i387_cache_to_fxsave (buf);
-+}
-+
-+static void
-+i386_store_fpxregset (const void *buf)
-+{
-+  i387_fxsave_to_cache (buf);
-+}
-+
-+#endif /* HAVE_PTRACE_GETREGS */
-+
-+struct regset_info target_regsets[] = {
-+#ifdef HAVE_PTRACE_GETREGS
-+  { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
-+    GENERAL_REGS,
-+    i386_fill_gregset, i386_store_gregset },
-+# ifdef HAVE_PTRACE_GETFPXREGS
-+  { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, sizeof (elf_fpxregset_t),
-+    EXTENDED_REGS,
-+    i386_fill_fpxregset, i386_store_fpxregset },
-+# endif
-+  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
-+    FP_REGS,
-+    i386_fill_fpregset, i386_store_fpregset },
-+#endif /* HAVE_PTRACE_GETREGS */
-+  { 0, 0, -1, -1, NULL, NULL }
-+};
-+
-+static const unsigned char i386_breakpoint[] = { 0xCC };
-+#define i386_breakpoint_len 1
-+
-+extern int debug_threads;
-+
-+static CORE_ADDR
-+i386_get_pc ()
-+{
-+  unsigned long pc;
-+
-+  collect_register_by_name ("eip", &pc);
-+
-+  if (debug_threads)
-+    fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc);
-+  return pc;
-+}
-+
-+static void
-+i386_set_pc (CORE_ADDR newpc)
-+{
-+  if (debug_threads)
-+    fprintf (stderr, "set pc to %08lx\n", (long) newpc);
-+  supply_register_by_name ("eip", &newpc);
-+}
-+
-+static int
-+i386_breakpoint_at (CORE_ADDR pc)
-+{
-+  unsigned char c;
-+
-+  read_inferior_memory (pc, &c, 1);
-+  if (c == 0xCC)
-+    return 1;
-+
-+  return 0;
-+}
-+
-+struct linux_target_ops the_low_target = {
-+  init_registers_i386_linux,
-+  i386_num_regs,
-+  i386_regmap,
-+  i386_cannot_fetch_register,
-+  i386_cannot_store_register,
-+  i386_get_pc,
-+  i386_set_pc,
-+  i386_breakpoint,
-+  i386_breakpoint_len,
-+  NULL,
-+  1,
-+  i386_breakpoint_at,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+};
-diff --git a/gdb/gdbserver/linux-x86-64-low.c b/gdb/gdbserver/linux-x86-64-low.c
-new file mode 100644
-index 0000000..b8213f5
---- /dev/null
-+++ b/gdb/gdbserver/linux-x86-64-low.c
-@@ -0,0 +1,184 @@
-+/* GNU/Linux/x86-64 specific low level interface, for the remote server
-+   for GDB.
-+   Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009
-+   Free Software Foundation, Inc.
-+
-+   This file is part of GDB.
-+
-+   This program is free software; you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation; either version 3 of the License, or
-+   (at your option) any later version.
-+
-+   This program is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+
-+   You should have received a copy of the GNU General Public License
-+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-+
-+#include "server.h"
-+#include "linux-low.h"
-+#include "i387-fp.h"
-+
-+#include "gdb_proc_service.h"
-+
-+/* Defined in auto-generated file reg-x86-64-linux.c.  */
-+void init_registers_x86_64_linux (void);
-+
-+#include <sys/reg.h>
-+#include <sys/procfs.h>
-+#include <sys/ptrace.h>
-+
-+/* This definition comes from prctl.h, but some kernels may not have it.  */
-+#ifndef PTRACE_ARCH_PRCTL
-+#define PTRACE_ARCH_PRCTL      30
-+#endif
-+
-+/* The following definitions come from prctl.h, but may be absent
-+   for certain configurations.  */
-+#ifndef ARCH_GET_FS
-+#define ARCH_SET_GS 0x1001
-+#define ARCH_SET_FS 0x1002
-+#define ARCH_GET_FS 0x1003
-+#define ARCH_GET_GS 0x1004
-+#endif
-+
-+static int x86_64_regmap[] = {
-+  RAX * 8, RBX * 8, RCX * 8, RDX * 8,
-+  RSI * 8, RDI * 8, RBP * 8, RSP * 8,
-+  R8 * 8, R9 * 8, R10 * 8, R11 * 8,
-+  R12 * 8, R13 * 8, R14 * 8, R15 * 8,
-+  RIP * 8, EFLAGS * 8, CS * 8, SS * 8, 
-+  DS * 8, ES * 8, FS * 8, GS * 8,
-+  -1, -1, -1, -1, -1, -1, -1, -1,
-+  -1, -1, -1, -1, -1, -1, -1, -1,
-+  -1, -1, -1, -1, -1, -1, -1, -1,
-+  -1, -1, -1, -1, -1, -1, -1, -1, -1,
-+  ORIG_RAX * 8
-+};
-+
-+#define X86_64_NUM_GREGS (sizeof(x86_64_regmap)/sizeof(int))
-+
-+/* Called by libthread_db.  */
-+
-+ps_err_e
-+ps_get_thread_area (const struct ps_prochandle *ph,
-+                    lwpid_t lwpid, int idx, void **base)
-+{
-+  switch (idx)
-+    {
-+    case FS:
-+      if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
-+	return PS_OK;
-+      break;
-+    case GS:
-+      if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
-+	return PS_OK;
-+      break;
-+    default:
-+      return PS_BADADDR;
-+    }
-+  return PS_ERR;
-+}
-+
-+static void
-+x86_64_fill_gregset (void *buf)
-+{
-+  int i;
-+
-+  for (i = 0; i < X86_64_NUM_GREGS; i++)
-+    if (x86_64_regmap[i] != -1)
-+      collect_register (i, ((char *) buf) + x86_64_regmap[i]);
-+}
-+
-+static void
-+x86_64_store_gregset (const void *buf)
-+{
-+  int i;
-+
-+  for (i = 0; i < X86_64_NUM_GREGS; i++)
-+    if (x86_64_regmap[i] != -1)
-+      supply_register (i, ((char *) buf) + x86_64_regmap[i]);
-+}
-+
-+static void
-+x86_64_fill_fpregset (void *buf)
-+{
-+  i387_cache_to_fxsave (buf);
-+}
-+
-+static void
-+x86_64_store_fpregset (const void *buf)
-+{
-+  i387_fxsave_to_cache (buf);
-+}
-+
-+struct regset_info target_regsets[] = {
-+  { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
-+    GENERAL_REGS,
-+    x86_64_fill_gregset, x86_64_store_gregset },
-+  { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
-+    FP_REGS,
-+    x86_64_fill_fpregset, x86_64_store_fpregset },
-+  { 0, 0, -1, -1, NULL, NULL }
-+};
-+
-+static const unsigned char x86_64_breakpoint[] = { 0xCC };
-+#define x86_64_breakpoint_len 1
-+                
-+extern int debug_threads;
-+
-+static CORE_ADDR
-+x86_64_get_pc ()
-+{
-+  unsigned long pc;
-+
-+  collect_register_by_name ("rip", &pc);
-+
-+  if (debug_threads)
-+    fprintf (stderr, "stop pc (before any decrement) is %08lx\n", pc);
-+  return pc;
-+}
-+
-+static void
-+x86_64_set_pc (CORE_ADDR newpc)
-+{
-+  if (debug_threads)
-+    fprintf (stderr, "set pc to %08lx\n", (long) newpc);
-+  supply_register_by_name ("rip", &newpc);
-+}
-+
-+static int
-+x86_64_breakpoint_at (CORE_ADDR pc)
-+{
-+  unsigned char c;
-+
-+  read_inferior_memory (pc, &c, 1);
-+  if (c == 0xCC)
-+    return 1;
-+
-+  return 0;
-+}
-+
-+struct linux_target_ops the_low_target = {
-+  init_registers_x86_64_linux,
-+  -1,
-+  NULL,
-+  NULL,
-+  NULL,
-+  x86_64_get_pc,
-+  x86_64_set_pc,
-+  x86_64_breakpoint,  
-+  x86_64_breakpoint_len,
-+  NULL,                                 
-+  1,
-+  x86_64_breakpoint_at,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+  NULL,
-+};
 diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h
 index cd24eaf..119af7d 100644
 --- a/gdb/gdbthread.h
@@ -5470,7 +6399,7 @@ index cd24eaf..119af7d 100644
     once for each known thread.  */
  typedef int (*thread_callback_func) (struct thread_info *, void *);
 diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
-index 16b34ca..b5e6110 100644
+index 117606a..536bee2 100644
 --- a/gdb/gdbtypes.c
 +++ b/gdb/gdbtypes.c
 @@ -39,6 +39,9 @@
@@ -5832,7 +6761,7 @@ index 16b34ca..b5e6110 100644
    return type;
  }
  
-@@ -2889,33 +3051,42 @@ type_pair_eq (const void *item_lhs, const void *item_rhs)
+@@ -2986,33 +3148,42 @@ type_pair_eq (const void *item_lhs, const void *item_rhs)
  }
  
  /* Allocate the hash table used by copy_type_recursive to walk
@@ -5890,7 +6819,7 @@ index 16b34ca..b5e6110 100644
      return type;
  
    /* This type shouldn't be pointing to any types in other objfiles;
-@@ -2930,8 +3101,10 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3027,8 +3198,10 @@ copy_type_recursive (struct objfile *objfile,
    new_type = alloc_type_arch (get_type_arch (type));
  
    /* We must add the new type to the hash table immediately, in case
@@ -5903,7 +6832,7 @@ index 16b34ca..b5e6110 100644
    stored->old = type;
    stored->new = new_type;
    *slot = stored;
-@@ -2942,6 +3115,19 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3039,6 +3212,19 @@ copy_type_recursive (struct objfile *objfile,
    TYPE_OBJFILE_OWNED (new_type) = 0;
    TYPE_OWNER (new_type).gdbarch = get_type_arch (type);
  
@@ -5923,7 +6852,7 @@ index 16b34ca..b5e6110 100644
    if (TYPE_NAME (type))
      TYPE_NAME (new_type) = xstrdup (TYPE_NAME (type));
    if (TYPE_TAG_NAME (type))
-@@ -2950,12 +3136,45 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3047,12 +3233,45 @@ copy_type_recursive (struct objfile *objfile,
    TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
    TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
  
@@ -5969,7 +6898,7 @@ index 16b34ca..b5e6110 100644
        TYPE_FIELDS (new_type) = XCALLOC (nfields, struct field);
        for (i = 0; i < nfields; i++)
  	{
-@@ -2964,8 +3183,8 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3061,8 +3280,8 @@ copy_type_recursive (struct objfile *objfile,
  	  TYPE_FIELD_BITSIZE (new_type, i) = TYPE_FIELD_BITSIZE (type, i);
  	  if (TYPE_FIELD_TYPE (type, i))
  	    TYPE_FIELD_TYPE (new_type, i)
@@ -5980,7 +6909,7 @@ index 16b34ca..b5e6110 100644
  	  if (TYPE_FIELD_NAME (type, i))
  	    TYPE_FIELD_NAME (new_type, i) = 
  	      xstrdup (TYPE_FIELD_NAME (type, i));
-@@ -2992,24 +3211,75 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3089,24 +3308,75 @@ copy_type_recursive (struct objfile *objfile,
  	}
      }
  
@@ -6062,7 +6991,7 @@ index 16b34ca..b5e6110 100644
    /* Maybe copy the type_specific bits.
  
       NOTE drow/2005-12-09: We do not copy the C++-specific bits like
-@@ -3027,6 +3297,17 @@ copy_type_recursive (struct objfile *objfile,
+@@ -3124,6 +3394,17 @@ copy_type_recursive (struct objfile *objfile,
    return new_type;
  }
  
@@ -6080,13 +7009,25 @@ index 16b34ca..b5e6110 100644
  /* Make a copy of the given TYPE, except that the pointer & reference
     types are not preserved.
     
-@@ -3049,6 +3330,199 @@ copy_type (const struct type *type)
+@@ -3146,6 +3427,211 @@ copy_type (const struct type *type)
    return new_type;
  }
  
 +/* Callback type for main_type_crawl.  */
 +typedef int (*main_type_crawl_iter) (struct type *type, void *data);
 +
++#if 0
++
++/* Allocate a hash table which is used when freeing a struct type.  */
++
++static htab_t
++create_deleted_types_hash (void)
++{
++  return htab_create (1, htab_hash_pointer, htab_eq_pointer, NULL);
++}
++
++#endif
++
 +/* Iterate all main_type structures reachable through any `struct type *' from
 +   TYPE.  ITER will be called only for one type of each main_type, use
 +   TYPE_CHAIN traversal to find all the type instances.  ITER is being called
@@ -6280,7 +7221,7 @@ index 16b34ca..b5e6110 100644
  
  /* Helper functions to initialize architecture-specific types.  */
  
-@@ -3539,6 +4013,11 @@ void
+@@ -3636,6 +4122,11 @@ void
  _initialize_gdbtypes (void)
  {
    gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
@@ -6293,7 +7234,7 @@ index 16b34ca..b5e6110 100644
  
    add_setshow_zinteger_cmd ("overload", no_class, &overload_debug, _("\
 diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
-index 8e73ca0..85888e1 100644
+index 380f72a..54c8739 100644
 --- a/gdb/gdbtypes.h
 +++ b/gdb/gdbtypes.h
 @@ -138,6 +138,8 @@ enum type_code
@@ -6462,7 +7403,21 @@ index 8e73ca0..85888e1 100644
    } type_specific;
  };
  
-@@ -900,9 +975,9 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -839,13 +914,6 @@ struct cplus_struct_type
+     int is_dynamic : 2;
+   };
+ 
+-/* Struct used in computing virtual base list */
+-struct vbase
+-  {
+-    struct type *vbasetype;	/* pointer to virtual base */
+-    struct vbase *next;		/* next in chain */
+-  };
+-
+ /* Struct used for ranking a function for overload resolution */
+ struct badness_vector
+   {
+@@ -900,9 +968,9 @@ extern void allocate_gnat_aux_type (struct type *);
  #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type
  #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type
  #define TYPE_CHAIN(thistype) (thistype)->chain
@@ -6475,7 +7430,7 @@ index 8e73ca0..85888e1 100644
     calls check_typedef, TYPE_LENGTH (VALUE_TYPE (X)) is safe.  */
  #define TYPE_LENGTH(thistype) (thistype)->length
  /* Note that TYPE_CODE can be TYPE_CODE_TYPEDEF, so if you want the real
-@@ -911,15 +986,26 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -911,15 +979,26 @@ extern void allocate_gnat_aux_type (struct type *);
  #define TYPE_NFIELDS(thistype) TYPE_MAIN_TYPE(thistype)->nfields
  #define TYPE_FIELDS(thistype) TYPE_MAIN_TYPE(thistype)->flds_bnds.fields
  #define TYPE_TEMPLATE_ARGS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->template_args
@@ -6504,7 +7459,7 @@ index 8e73ca0..85888e1 100644
  
  /* Moto-specific stuff for FORTRAN arrays */
  
-@@ -928,11 +1014,23 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -928,11 +1007,23 @@ extern void allocate_gnat_aux_type (struct type *);
  #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \
     TYPE_LOW_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype))
  
@@ -6529,7 +7484,7 @@ index 8e73ca0..85888e1 100644
  
  /* C++ */
  
-@@ -961,6 +1059,7 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -961,6 +1052,7 @@ extern void allocate_gnat_aux_type (struct type *);
  #define TYPE_GNAT_SPECIFIC(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.gnat_stuff
  #define TYPE_DESCRIPTIVE_TYPE(thistype) TYPE_GNAT_SPECIFIC(thistype)->descriptive_type
  #define TYPE_CALLING_CONVENTION(thistype) TYPE_MAIN_TYPE(thistype)->type_specific.calling_convention
@@ -6537,7 +7492,7 @@ index 8e73ca0..85888e1 100644
  #define TYPE_BASECLASS(thistype,index) TYPE_FIELD_TYPE(thistype, index)
  #define TYPE_N_BASECLASSES(thistype) TYPE_CPLUS_SPECIFIC(thistype)->n_baseclasses
  #define TYPE_BASECLASS_NAME(thistype,index) TYPE_FIELD_NAME(thistype, index)
-@@ -979,7 +1078,6 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -979,7 +1071,6 @@ extern void allocate_gnat_aux_type (struct type *);
  #define FIELD_BITPOS(thisfld) ((thisfld).loc.bitpos)
  #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname)
  #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr)
@@ -6545,7 +7500,7 @@ index 8e73ca0..85888e1 100644
  #define SET_FIELD_BITPOS(thisfld, bitpos)			\
    (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_BITPOS,		\
     FIELD_BITPOS (thisfld) = (bitpos))
-@@ -989,9 +1087,6 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -989,9 +1080,6 @@ extern void allocate_gnat_aux_type (struct type *);
  #define SET_FIELD_PHYSADDR(thisfld, addr)			\
    (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR,		\
     FIELD_STATIC_PHYSADDR (thisfld) = (addr))
@@ -6555,7 +7510,7 @@ index 8e73ca0..85888e1 100644
  #define FIELD_ARTIFICIAL(thisfld) ((thisfld).artificial)
  #define FIELD_BITSIZE(thisfld) ((thisfld).bitsize)
  
-@@ -1002,7 +1097,6 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -1002,7 +1090,6 @@ extern void allocate_gnat_aux_type (struct type *);
  #define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n))
  #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n))
  #define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n))
@@ -6563,7 +7518,7 @@ index 8e73ca0..85888e1 100644
  #define TYPE_FIELD_ARTIFICIAL(thistype, n) FIELD_ARTIFICIAL(TYPE_FIELD(thistype,n))
  #define TYPE_FIELD_BITSIZE(thistype, n) FIELD_BITSIZE(TYPE_FIELD(thistype,n))
  #define TYPE_FIELD_PACKED(thistype, n) (FIELD_BITSIZE(TYPE_FIELD(thistype,n))!=0)
-@@ -1333,6 +1427,18 @@ extern struct type *create_array_type (struct type *, struct type *,
+@@ -1333,6 +1420,18 @@ extern struct type *create_array_type (struct type *, struct type *,
  				       struct type *);
  extern struct type *lookup_array_range_type (struct type *, int, int);
  
@@ -6582,16 +7537,16 @@ index 8e73ca0..85888e1 100644
  extern struct type *create_string_type (struct type *, struct type *,
  					struct type *);
  extern struct type *lookup_string_range_type (struct type *, int, int);
-@@ -1369,6 +1475,8 @@ extern int get_discrete_bounds (struct type *, LONGEST *, LONGEST *);
+@@ -1375,6 +1474,8 @@ extern int is_public_ancestor (struct type *, struct type *);
  
- extern int is_ancestor (struct type *, struct type *);
+ extern int is_unique_ancestor (struct type *, struct value *);
  
 +extern void type_mark_used (struct type *type);
 +
  /* Overload resolution */
  
  #define LENGTH_MATCH(bv) ((bv)->rank[0])
-@@ -1431,10 +1539,11 @@ extern void maintenance_print_type (char *, int);
+@@ -1437,10 +1538,11 @@ extern void maintenance_print_type (char *, int);
  
  extern htab_t create_copied_types_hash (struct objfile *objfile);
  
@@ -6605,21 +7560,72 @@ index 8e73ca0..85888e1 100644
 +extern void free_all_types (void);
 +
  #endif /* GDBTYPES_H */
-diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c
-index ff837f2..1710487 100644
---- a/gdb/i386-linux-nat.c
-+++ b/gdb/i386-linux-nat.c
-@@ -696,6 +696,21 @@ i386_linux_dr_unset_status (unsigned long mask)
-     }
- }
+diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
+index 5321401..b1882a2 100644
+--- a/gdb/gnu-v3-abi.c
++++ b/gdb/gnu-v3-abi.c
+@@ -26,6 +26,7 @@
+ #include "demangle.h"
+ #include "objfiles.h"
+ #include "valprint.h"
++#include "c-lang.h"
  
-+/* See i386_dr_low_type.detach.  Do not use wrappers i386_linux_dr_set_control
-+   or i386_linux_dr_reset_addr as they would modify the register cache
-+   (i386_linux_dr).  */
-+
-+static void
-+i386_linux_dr_detach (void)
-+{
+ #include "gdb_assert.h"
+ #include "gdb_string.h"
+@@ -456,10 +457,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;
+@@ -587,15 +586,24 @@ 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;
+ 	}
+     }
++  else if (ptr_value != 0)
++    {
++      /* Found a non-virtual function: print out the type.  */
++      fputs_filtered ("(", stream);
++      c_print_type (type, "", stream, -1, 0);
++      fputs_filtered (") ", stream);
++    }
+ 
+   /* We didn't find it; print the raw data.  */
+   if (vbit)
+diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c
+index ff837f2..1710487 100644
+--- a/gdb/i386-linux-nat.c
++++ b/gdb/i386-linux-nat.c
+@@ -696,6 +696,21 @@ i386_linux_dr_unset_status (unsigned long mask)
+     }
+ }
+ 
++/* See i386_dr_low_type.detach.  Do not use wrappers i386_linux_dr_set_control
++   or i386_linux_dr_reset_addr as they would modify the register cache
++   (i386_linux_dr).  */
++
++static void
++i386_linux_dr_detach (void)
++{
 +  int regnum;
 +
 +  i386_linux_dr_set (inferior_ptid, DR_CONTROL, 0);
@@ -6693,10 +7699,10 @@ index 7317e7d..ea914a5 100644
    };
  
 diff --git a/gdb/infcmd.c b/gdb/infcmd.c
-index 21a2233..34a3718 100644
+index f99a4ae..5599908 100644
 --- a/gdb/infcmd.c
 +++ b/gdb/infcmd.c
-@@ -805,7 +805,7 @@ nexti_command (char *count_string, int from_tty)
+@@ -806,7 +806,7 @@ nexti_command (char *count_string, int from_tty)
    step_1 (1, 1, count_string);
  }
  
@@ -6705,7 +7711,7 @@ index 21a2233..34a3718 100644
  delete_longjmp_breakpoint_cleanup (void *arg)
  {
    int thread = * (int *) arg;
-@@ -845,10 +845,13 @@ step_1 (int skip_subroutines, int single_inst, char *count_string)
+@@ -846,10 +846,13 @@ step_1 (int skip_subroutines, int single_inst, char *count_string)
  
    if (!single_inst || skip_subroutines)		/* leave si command alone */
      {
@@ -6719,7 +7725,7 @@ index 21a2233..34a3718 100644
  
        make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
      }
-@@ -1197,6 +1200,15 @@ signal_command (char *signum_exp, int from_tty)
+@@ -1198,6 +1201,15 @@ signal_command (char *signum_exp, int from_tty)
    proceed ((CORE_ADDR) -1, oursig, 0);
  }
  
@@ -6735,7 +7741,7 @@ index 21a2233..34a3718 100644
  /* Proceed until we reach a different source line with pc greater than
     our current one or exit the function.  We skip calls in both cases.
  
-@@ -1213,6 +1225,8 @@ until_next_command (int from_tty)
+@@ -1214,6 +1226,8 @@ until_next_command (int from_tty)
    struct symbol *func;
    struct symtab_and_line sal;
    struct thread_info *tp = inferior_thread ();
@@ -6744,7 +7750,7 @@ index 21a2233..34a3718 100644
  
    clear_proceed_status ();
    set_step_frame ();
-@@ -1248,7 +1262,19 @@ until_next_command (int from_tty)
+@@ -1249,7 +1263,19 @@ until_next_command (int from_tty)
  
    tp->step_multi = 0;		/* Only one call to proceed */
  
@@ -6764,7 +7770,7 @@ index 21a2233..34a3718 100644
  }
  
  static void
-@@ -1425,6 +1451,7 @@ finish_command_continuation (void *arg)
+@@ -1426,6 +1452,7 @@ finish_command_continuation (void *arg)
    if (bs != NULL && tp->proceed_to_finish)
      observer_notify_normal_stop (bs, 1 /* print frame */);
    delete_breakpoint (a->breakpoint);
@@ -6772,7 +7778,7 @@ index 21a2233..34a3718 100644
  }
  
  static void
-@@ -1508,6 +1535,7 @@ finish_forward (struct symbol *function, struct frame_info *frame)
+@@ -1509,6 +1536,7 @@ finish_forward (struct symbol *function, struct frame_info *frame)
    struct breakpoint *breakpoint;
    struct cleanup *old_chain;
    struct finish_command_continuation_args *cargs;
@@ -6780,7 +7786,7 @@ index 21a2233..34a3718 100644
  
    sal = find_pc_line (get_frame_pc (frame), 0);
    sal.pc = get_frame_pc (frame);
-@@ -1518,6 +1546,10 @@ finish_forward (struct symbol *function, struct frame_info *frame)
+@@ -1519,6 +1547,10 @@ finish_forward (struct symbol *function, struct frame_info *frame)
  
    old_chain = make_cleanup_delete_breakpoint (breakpoint);
  
@@ -6792,10 +7798,10 @@ index 21a2233..34a3718 100644
    cargs = xmalloc (sizeof (*cargs));
  
 diff --git a/gdb/inferior.h b/gdb/inferior.h
-index 9798ef1..e9783fb 100644
+index e557d6c..d4ae1df 100644
 --- a/gdb/inferior.h
 +++ b/gdb/inferior.h
-@@ -279,6 +279,8 @@ extern void interrupt_target_command (char *args, int from_tty);
+@@ -275,6 +275,8 @@ extern void interrupt_target_command (char *args, int from_tty);
  
  extern void interrupt_target_1 (int all_threads);
  
@@ -6805,7 +7811,7 @@ index 9798ef1..e9783fb 100644
  
  extern void notice_new_inferior (ptid_t, int, int);
 diff --git a/gdb/infrun.c b/gdb/infrun.c
-index 426b816..bd65258 100644
+index 06f3ea0..fe3719e 100644
 --- a/gdb/infrun.c
 +++ b/gdb/infrun.c
 @@ -45,6 +45,8 @@
@@ -6817,7 +7823,7 @@ index 426b816..bd65258 100644
  #include "gdb_assert.h"
  #include "mi/mi-common.h"
  #include "event-top.h"
-@@ -2013,6 +2015,8 @@ static void insert_step_resume_breakpoint_at_sal (struct gdbarch *gdbarch,
+@@ -2010,6 +2012,8 @@ static void insert_step_resume_breakpoint_at_sal (struct gdbarch *gdbarch,
  						  struct symtab_and_line sr_sal,
  						  struct frame_id sr_id);
  static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR);
@@ -6826,7 +7832,7 @@ index 426b816..bd65258 100644
  
  static void stop_stepping (struct execution_control_state *ecs);
  static void prepare_to_wait (struct execution_control_state *ecs);
-@@ -2942,6 +2946,10 @@ handle_inferior_event (struct execution_control_state *ecs)
+@@ -2930,6 +2934,10 @@ handle_inferior_event (struct execution_control_state *ecs)
  
        stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid));
  
@@ -6837,7 +7843,7 @@ index 426b816..bd65258 100644
        ecs->event_thread->stop_bpstat
  	= bpstat_stop_status (get_regcache_aspace (get_current_regcache ()),
  			      stop_pc, ecs->ptid);
-@@ -3026,6 +3034,10 @@ handle_inferior_event (struct execution_control_state *ecs)
+@@ -3014,6 +3022,10 @@ handle_inferior_event (struct execution_control_state *ecs)
  
        stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid));
  
@@ -6848,7 +7854,7 @@ index 426b816..bd65258 100644
        /* Do whatever is necessary to the parent branch of the vfork.  */
        handle_vfork_child_exec_or_exit (1);
  
-@@ -3784,23 +3796,33 @@ process_event_stop_test:
+@@ -3772,23 +3784,33 @@ process_event_stop_test:
  
  	ecs->event_thread->stepping_over_breakpoint = 1;
  
@@ -6894,7 +7900,7 @@ index 426b816..bd65258 100644
  	keep_going (ecs);
  	return;
  
-@@ -3812,6 +3834,53 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
+@@ -3800,6 +3822,53 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
  	gdb_assert (ecs->event_thread->step_resume_breakpoint != NULL);
  	delete_step_resume_breakpoint (ecs->event_thread);
  
@@ -6948,7 +7954,7 @@ index 426b816..bd65258 100644
  	ecs->event_thread->stop_step = 1;
  	print_stop_reason (END_STEPPING_RANGE, 0);
  	stop_stepping (ecs);
-@@ -4831,6 +4900,96 @@ insert_longjmp_resume_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc)
+@@ -4819,6 +4888,96 @@ insert_longjmp_resume_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc)
      set_momentary_breakpoint_at_pc (gdbarch, pc, bp_longjmp_resume);
  }
  
@@ -7057,11 +8063,318 @@ index 24b6673..22ed960 100644
    op_name_standard,
    dump_subexp_body_standard,
    evaluate_subexp_java
+diff --git a/gdb/language.h b/gdb/language.h
+index aaefb03..c274572 100644
+--- a/gdb/language.h
++++ b/gdb/language.h
+@@ -237,7 +237,6 @@ struct language_defn
+        variables.  */
+ 
+     struct symbol *(*la_lookup_symbol_nonlocal) (const char *,
+-						 const char *,
+ 						 const struct block *,
+ 						 const domain_enum);
+ 
+diff --git a/gdb/linespec.c b/gdb/linespec.c
+index 74902b6..a9b4f1e 100644
+--- a/gdb/linespec.c
++++ b/gdb/linespec.c
+@@ -50,8 +50,6 @@ extern char *operator_chars (char *, char **);
+ static void initialize_defaults (struct symtab **default_symtab,
+ 				 int *default_line);
+ 
+-static void set_flags (char *arg, int *is_quoted, char **paren_pointer);
+-
+ static struct symtabs_and_lines decode_indirect (char **argptr);
+ 
+ static char *locate_first_half (char **argptr, int *is_quote_enclosed);
+@@ -688,9 +686,6 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+   struct symtab *file_symtab = NULL;
+ 
+   char *copy;
+-  /* This is NULL if there are no parens in *ARGPTR, or a pointer to
+-     the closing parenthesis if there are parens.  */
+-  char *paren_pointer;
+   /* This says whether or not something in *ARGPTR is quoted with
+      completer_quotes (i.e. with single quotes).  */
+   int is_quoted;
+@@ -711,12 +706,9 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+   if (**argptr == '*')
+     return decode_indirect (argptr);
+ 
+-  /* Set various flags.  'paren_pointer' is important for overload
+-     checking, where we allow things like:
+-        (gdb) break c::f(int)
+-  */
+-
+-  set_flags (*argptr, &is_quoted, &paren_pointer);
++  is_quoted = (*argptr
++	       && strchr (get_gdb_completer_quote_characters (),
++			  **argptr) != NULL);
+ 
+   /* Check to see if it's a multipart linespec (with colons or
+      periods).  */
+@@ -732,10 +724,7 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+   /* Check if this is an Objective-C method (anything that starts with
+      a '+' or '-' and a '[').  */
+   if (is_objc_method_format (p))
+-    {
+-      is_objc_method = 1;
+-      paren_pointer  = NULL; /* Just a category name.  Ignore it.  */
+-    }
++    is_objc_method = 1;
+ 
+   /* Check if the symbol could be an Objective-C selector.  */
+ 
+@@ -749,11 +738,11 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+ 
+   /* Does it look like there actually were two parts?  */
+ 
+-  if ((p[0] == ':' || p[0] == '.') && paren_pointer == NULL)
++  if (p[0] == ':' || p[0] == '.')
+     {
+       if (is_quoted)
+ 	*argptr = *argptr + 1;
+-      
++
+       /* Is it a C++ or Java compound data structure?
+ 	 The check on p[1] == ':' is capturing the case of "::",
+ 	 since p[0]==':' was checked above.  
+@@ -762,48 +751,31 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+ 	 can return now. */
+ 	
+       if (p[0] == '.' || p[1] == ':')
+-	return decode_compound (argptr, funfirstline, canonical,
+-				saved_arg, p, not_found_ptr);
++	{
++	  struct symtabs_and_lines values;
++
++	  if (is_quote_enclosed)
++	    ++saved_arg;
++	  values = decode_compound (argptr, funfirstline, canonical,
++				    saved_arg, p, not_found_ptr);
++	  if (is_quoted && **argptr == '\'')
++	    *argptr = *argptr + 1;
++	  return values;
++	}
+ 
+       /* No, the first part is a filename; set file_symtab to be that file's
+ 	 symtab.  Also, move argptr past the filename.  */
+ 
+       file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed, 
+ 		      			  not_found_ptr);
+-    }
+-#if 0
+-  /* No one really seems to know why this was added. It certainly
+-     breaks the command line, though, whenever the passed
+-     name is of the form ClassName::Method. This bit of code
+-     singles out the class name, and if funfirstline is set (for
+-     example, you are setting a breakpoint at this function),
+-     you get an error. This did not occur with earlier
+-     verions, so I am ifdef'ing this out. 3/29/99 */
+-  else
+-    {
+-      /* Check if what we have till now is a symbol name */
+-
+-      /* We may be looking at a template instantiation such
+-         as "foo<int>".  Check here whether we know about it,
+-         instead of falling through to the code below which
+-         handles ordinary function names, because that code
+-         doesn't like seeing '<' and '>' in a name -- the
+-         skip_quoted call doesn't go past them.  So see if we
+-         can figure it out right now. */
+-
+-      copy = (char *) alloca (p - *argptr + 1);
+-      memcpy (copy, *argptr, p - *argptr);
+-      copy[p - *argptr] = '\000';
+-      sym = lookup_symbol (copy, 0, VAR_DOMAIN, 0);
+-      if (sym)
++      if (file_symtab != NULL)
+ 	{
+-	  *argptr = (*p == '\'') ? p + 1 : p;
+-	  return symbol_found (funfirstline, canonical, copy, sym, NULL);
++	  /* Double-check if the remainder of the argument is quoted.
++	     The rbreak command uses syntax like this.  */
++	  if (**argptr == '\'')
++	    is_quoted = 1;
+ 	}
+-      /* Otherwise fall out from here and go to file/line spec
+-         processing, etc. */
+     }
+-#endif
+ 
+   /* file_symtab is specified file's symtab, or 0 if no file specified.
+      arg no longer contains the file name.  */
+@@ -838,10 +810,6 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+       /* allow word separators in method names for Obj-C */
+       p = skip_quoted_chars (*argptr, NULL, "");
+     }
+-  else if (paren_pointer != NULL)
+-    {
+-      p = paren_pointer + 1;
+-    }
+   else
+     {
+       p = skip_quoted (*argptr);
+@@ -851,6 +819,15 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
+   if (*p == '<')
+     p = find_template_name_end (p);
+ 
++  /* Keep method overload information.  */
++  q = strchr (p, '(');
++  if (q != NULL)
++    p = strrchr (q, ')') + 1;
++
++  /* 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';
+@@ -926,44 +903,6 @@ initialize_defaults (struct symtab **default_symtab, int *default_line)
+     }
+ }
+ 
+-static void
+-set_flags (char *arg, int *is_quoted, char **paren_pointer)
+-{
+-  char *ii;
+-  int has_if = 0;
+-
+-  /* 'has_if' is for the syntax:
+-        (gdb) break foo if (a==b)
+-  */
+-  if ((ii = strstr (arg, " if ")) != NULL ||
+-      (ii = strstr (arg, "\tif ")) != NULL ||
+-      (ii = strstr (arg, " if\t")) != NULL ||
+-      (ii = strstr (arg, "\tif\t")) != NULL ||
+-      (ii = strstr (arg, " if(")) != NULL ||
+-      (ii = strstr (arg, "\tif( ")) != NULL)
+-    has_if = 1;
+-  /* Temporarily zap out "if (condition)" to not confuse the
+-     parenthesis-checking code below.  This is undone below. Do not
+-     change ii!!  */
+-  if (has_if)
+-    {
+-      *ii = '\0';
+-    }
+-
+-  *is_quoted = (*arg
+-		&& strchr (get_gdb_completer_quote_characters (),
+-			   *arg) != NULL);
+-
+-  *paren_pointer = strchr (arg, '(');
+-  if (*paren_pointer != NULL)
+-    *paren_pointer = strrchr (*paren_pointer, ')');
+-
+-  /* Now that we're safely past the paren_pointer check, put back " if
+-     (condition)" so outer layers can see it.  */
+-  if (has_if)
+-    *ii = ' ';
+-}
+-
+ \f
+ 
+ /* Decode arg of the form *PC.  */
+@@ -1264,7 +1203,8 @@ decode_compound (char **argptr, int funfirstline, char ***canonical,
+       /* PASS2: p2->"::fun", p->":fun" */
+ 
+       /* Move pointer ahead to next double-colon.  */
+-      while (*p && (p[0] != ' ') && (p[0] != '\t') && (p[0] != '\''))
++      while (*p && (p[0] != ' ') && (p[0] != '\t') && (p[0] != '\'')
++	     && (*p != '('))
+ 	{
+ 	  if (current_language->la_language == language_cplus)
+ 	    p += cp_validate_operator (p);
+@@ -1342,8 +1282,10 @@ decode_compound (char **argptr, int funfirstline, char ***canonical,
+       else
+ 	{
+ 	  /* At this point argptr->"fun".  */
++	  char *a;
+ 	  p = *argptr;
+-	  while (*p && *p != ' ' && *p != '\t' && *p != ',' && *p != ':')
++	  while (*p && *p != ' ' && *p != '\t' && *p != ',' && *p != ':'
++		 && *p != '(')
+ 	    p++;
+ 	  /* At this point p->"".  String ended.  */
+ 	  /* Nope, C++ operators could have spaces in them
+@@ -1355,6 +1297,19 @@ decode_compound (char **argptr, int funfirstline, char ***canonical,
+ 	      /* The above loop has already swallowed "operator".  */
+ 	      p += cp_validate_operator (p - 8) - 8;
+ 	    }
++
++	  /* Keep any template parameters */
++	  if (*p == '<')
++	    p = find_template_name_end (p);
++
++	  /* Keep method overload information.  */
++	  a = strchr (p, '(');
++	  if (a != NULL)
++	    p = strrchr (a, ')') + 1;
++
++	  /* Make sure we keep important kewords like "const" */
++	  if (strncmp (p, " const", 6) == 0)
++	    p += 6;
+ 	}
+ 
+       /* Allocate our own copy of the substring between argptr and
+@@ -1509,8 +1464,39 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
+     }
+   if (i1 > 0)
+     {
+-      /* There is more than one field with that name
+-	 (overloaded).  Ask the user which one to use.  */
++      /* If we were given a specific overload instance, use that
++	 (or error if no matches were found).  Otherwise ask the user
++	 which one to use.  */
++      if (strchr (saved_arg, '(') != NULL)
++	{
++	  int i;
++	  for (i = 0; i < i1; ++i)
++	    {
++	      char *name = saved_arg;
++	      char *canon = cp_canonicalize_string (name);
++	      if (canon != NULL)
++		name = canon;
++
++	      if (strcmp_iw (name, SYMBOL_LINKAGE_NAME (sym_arr[i])) == 0)
++		{
++		  values.sals = (struct symtab_and_line *)
++		    xmalloc (sizeof (struct symtab_and_line));
++		  values.nelts = 1;
++		  values.sals[0] = find_function_start_sal (sym_arr[i],
++							    funfirstline);
++		  if (canon)
++		    xfree (canon);
++		  return values;
++		}
++
++	      if (canon)
++		xfree (canon);
++	    }
++
++	  error (_("the class `%s' does not have any method instance named %s\n"),
++		   SYMBOL_PRINT_NAME (sym_class), copy);
++	}
++
+       return decode_line_2 (sym_arr, i1, funfirstline, canonical);
+     }
+   else
+@@ -1815,7 +1801,7 @@ symbol_found (int funfirstline, char ***canonical, char *copy,
+ 	{
+ 	  struct blockvector *bv = BLOCKVECTOR (SYMBOL_SYMTAB (sym));
+ 	  struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+-	  if (lookup_block_symbol (b, copy, NULL, VAR_DOMAIN) != NULL)
++	  if (lookup_block_symbol (b, copy, VAR_DOMAIN) != NULL)
+ 	    build_canonical_line_spec (values.sals, copy, canonical);
+ 	}
+       return values;
 diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
-index 03563cd..8145629 100644
+index 7fc9584..b286dfd 100644
 --- a/gdb/linux-nat.c
 +++ b/gdb/linux-nat.c
-@@ -2643,6 +2643,39 @@ linux_nat_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
+@@ -2624,6 +2624,39 @@ linux_nat_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
    return lp->stopped_data_address_p;
  }
  
@@ -7101,7 +8414,7 @@ index 03563cd..8145629 100644
  /* Wait until LP is stopped.  */
  
  static int
-@@ -5519,6 +5552,8 @@ linux_nat_add_target (struct target_ops *t)
+@@ -5500,6 +5533,8 @@ linux_nat_add_target (struct target_ops *t)
    t->to_thread_address_space = linux_nat_thread_address_space;
    t->to_stopped_by_watchpoint = linux_nat_stopped_by_watchpoint;
    t->to_stopped_data_address = linux_nat_stopped_data_address;
@@ -7135,7 +8448,7 @@ index 02b61d3..13ab595 100644
    macho_symfile_offsets,        /* sym_offsets:  xlate external to internal form */
    default_symfile_segments,	/* sym_segments: Get segment information from
 diff --git a/gdb/main.c b/gdb/main.c
-index 0cc0f75..e3fc2e6 100644
+index e261348..92c63a7 100644
 --- a/gdb/main.c
 +++ b/gdb/main.c
 @@ -40,6 +40,7 @@
@@ -7181,40 +8494,40 @@ index 0cc0f75..e3fc2e6 100644
  	  case OPT_SE:
  	    symarg = optarg;
  	    execarg = optarg;
-@@ -631,7 +641,31 @@ extern int gdbtk_test (char *);
- 	use_windows = 0;
-       }
+@@ -641,7 +651,31 @@ extern int gdbtk_test (char *);
  
--    if (set_args)
-+    if (python_script)
-+      {
-+	/* The first argument is a python script to evaluate, and
-+	   subsequent arguments are passed to the script for
-+	   processing there.  */
-+	if (optind >= argc)
-+	  {
-+	    fprintf_unfiltered (gdb_stderr,
-+				_("%s: Python script file name required\n"),
-+				argv[0]);
-+	    exit (1);
-+	  }
+   /* Now that gdb_init has created the initial inferior, we're in position
+      to set args for that inferior.  */
+-  if (set_args)
++  if (python_script)
++    {
++      /* The first argument is a python script to evaluate, and
++	 subsequent arguments are passed to the script for
++	 processing there.  */
++      if (optind >= argc)
++	{
++	  fprintf_unfiltered (gdb_stderr,
++			      _("%s: Python script file name required\n"),
++			      argv[0]);
++	  exit (1);
++	}
 +
-+	/* FIXME: should handle inferior I/O intelligently here.
-+	   E.g., should be possible to run gdb in pipeline and have
-+	   Python (and gdb) output go to stderr or file; and if a
-+	   prompt is needed, open the tty.  */
-+	quiet = 1;
-+	/* FIXME: should read .gdbinit if, and only if, a prompt is
-+	   requested by the script.  Though... maybe this is not
-+	   ideal?  */
-+	/* FIXME: likewise, reading in history.  */
-+	inhibit_gdbinit = 1;
-+      }
-+    else if (set_args)
-       {
- 	/* The remaining options are the command-line options for the
- 	   inferior.  The first one is the sym/exec file, and the rest
-@@ -864,7 +898,8 @@ Can't attach to process and specify a core file at the same time."));
++      /* FIXME: should handle inferior I/O intelligently here.
++	 E.g., should be possible to run gdb in pipeline and have
++	 Python (and gdb) output go to stderr or file; and if a
++	 prompt is needed, open the tty.  */
++      quiet = 1;
++      /* FIXME: should read .gdbinit if, and only if, a prompt is
++	 requested by the script.  Though... maybe this is not
++	 ideal?  */
++      /* FIXME: likewise, reading in history.  */
++      inhibit_gdbinit = 1;
++    }
++  else if (set_args)
+     {
+       /* The remaining options are the command-line options for the
+ 	 inferior.  The first one is the sym/exec file, and the rest
+@@ -867,7 +901,8 @@ Can't attach to process and specify a core file at the same time."));
    xfree (cmdarg);
  
    /* Read in the old history after all the command files have been read. */
@@ -7224,7 +8537,7 @@ index 0cc0f75..e3fc2e6 100644
  
    if (batch)
      {
-@@ -893,13 +928,25 @@ Can't attach to process and specify a core file at the same time."));
+@@ -896,13 +931,25 @@ Can't attach to process and specify a core file at the same time."));
  #endif
      }
  
@@ -7256,7 +8569,7 @@ index 0cc0f75..e3fc2e6 100644
      }
    /* No exit -- exit is through quit_command.  */
  }
-@@ -931,7 +978,12 @@ print_gdb_help (struct ui_file *stream)
+@@ -934,7 +981,12 @@ print_gdb_help (struct ui_file *stream)
    fputs_unfiltered (_("\
  This is the GNU debugger.  Usage:\n\n\
      gdb [options] [executable-file [core-file or process-id]]\n\
@@ -7270,7 +8583,7 @@ index 0cc0f75..e3fc2e6 100644
  Options:\n\n\
  "), stream);
    fputs_unfiltered (_("\
-@@ -969,7 +1021,13 @@ Options:\n\n\
+@@ -972,7 +1024,13 @@ Options:\n\n\
    --nw		     Do not use a window interface.\n\
    --nx               Do not read "), stream);
    fputs_unfiltered (gdbinit, stream);
@@ -7314,19 +8627,6 @@ index b227411..3b932f0 100644
        struct varobj *var = varobj_get_handle (name);
  
        varobj_update_one (var, print_values, 1 /* explicit */);
-diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
-index dde0062..832cfcc 100644
---- a/gdb/mi/mi-main.c
-+++ b/gdb/mi/mi-main.c
-@@ -1400,7 +1400,7 @@ mi_cmd_list_features (char *command, char **argv, int argc)
-       ui_out_field_string (uiout, NULL, "frozen-varobjs");
-       ui_out_field_string (uiout, NULL, "pending-breakpoints");
-       ui_out_field_string (uiout, NULL, "thread-info");
--      
-+
- #if HAVE_PYTHON
-       ui_out_field_string (uiout, NULL, "python");
- #endif
 diff --git a/gdb/mipsread.c b/gdb/mipsread.c
 index 4ef817e..1c53574 100644
 --- a/gdb/mipsread.c
@@ -7431,7 +8731,7 @@ index c689622..eb3ae10 100644
    ALL_PSPACE_OBJFILES (ss, objfile)			\
      ALL_OBJFILE_PSYMTABS (objfile, p)
 diff --git a/gdb/parse.c b/gdb/parse.c
-index 2885506..779b819 100644
+index d5a199b..d2a04c3 100644
 --- a/gdb/parse.c
 +++ b/gdb/parse.c
 @@ -62,6 +62,7 @@ const struct exp_descriptor exp_descriptor_standard =
@@ -7442,7 +8742,18 @@ index 2885506..779b819 100644
      op_name_standard,
      dump_subexp_body_standard,
      evaluate_subexp_standard
-@@ -1359,6 +1360,150 @@ parser_fprintf (FILE *x, const char *y, ...)
+@@ -841,6 +842,10 @@ operator_length_standard (struct expression *expr, int endpos,
+       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);
+@@ -1361,6 +1366,150 @@ parser_fprintf (FILE *x, const char *y, ...)
    va_end (args);
  }
  
@@ -9691,7 +11002,7 @@ index 0000000..783385e
 +  breakpoint_object_getset	  /* tp_getset */
 +};
 diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c
-index ae462d9..22d1405 100644
+index ae462d9..dd364df 100644
 --- a/gdb/python/py-cmd.c
 +++ b/gdb/python/py-cmd.c
 @@ -49,8 +49,7 @@ static struct cmdpy_completer completers[] =
@@ -9704,15 +11015,7 @@ index ae462d9..22d1405 100644
  struct cmdpy_object
  {
    PyObject_HEAD
-@@ -70,7 +69,6 @@ typedef struct cmdpy_object cmdpy_object;
- 
- static PyTypeObject cmdpy_object_type;
- 
--
- /* Constants used by this module.  */
- static PyObject *invoke_cst;
- static PyObject *complete_cst;
-@@ -263,10 +261,13 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
+@@ -263,10 +262,13 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
     *BASE_LIST is set to the final prefix command's list of
     *sub-commands.
     
@@ -9728,7 +11031,7 @@ index ae462d9..22d1405 100644
  {
    struct cmd_list_element *elt;
    int len = strlen (text);
-@@ -299,7 +300,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list)
+@@ -299,7 +301,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list)
      ;
    if (i < 0)
      {
@@ -9737,7 +11040,7 @@ index ae462d9..22d1405 100644
        return result;
      }
  
-@@ -308,7 +309,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list)
+@@ -308,7 +310,7 @@ parse_command_name (char *text, struct cmd_list_element ***base_list)
    prefix_text[i + 1] = '\0';
  
    text = prefix_text;
@@ -9746,7 +11049,7 @@ index ae462d9..22d1405 100644
    if (!elt || elt == (struct cmd_list_element *) -1)
      {
        PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"),
-@@ -399,7 +400,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
+@@ -399,7 +401,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
        return -1;
      }
  
@@ -13419,23 +14722,22 @@ index 9196f08..5230a8c 100644
  
  #endif /* GDB_PYTHON_INTERNAL_H */
 diff --git a/gdb/python/python.c b/gdb/python/python.c
-index 827372c..171cd5b 100644
+index 29386c9..195dace 100644
 --- a/gdb/python/python.c
 +++ b/gdb/python/python.c
-@@ -27,6 +27,7 @@
- #include "observer.h"
+@@ -28,6 +28,7 @@
  #include "value.h"
  #include "language.h"
+ #include "exceptions.h"
 +#include "event-loop.h"
  
  #include <ctype.h>
  
-@@ -45,11 +46,18 @@ static int gdbpy_auto_load = 1;
+@@ -46,10 +47,17 @@ static int gdbpy_auto_load = 1;
  #include "cli/cli-decode.h"
  #include "charset.h"
  #include "top.h"
 +#include "solib.h"
- #include "exceptions.h"
  #include "python-internal.h"
 +#include "linespec.h"
 +#include "symtab.h"
@@ -13624,7 +14926,7 @@ index 827372c..171cd5b 100644
  /* Parse a string and evaluate it as an expression.  */
  static PyObject *
  gdbpy_parse_and_eval (PyObject *self, PyObject *args)
-@@ -345,6 +452,114 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args)
+@@ -361,6 +468,114 @@ source_python_script (FILE *stream, char *file)
  
  \f
  
@@ -13739,7 +15041,7 @@ index 827372c..171cd5b 100644
  /* Printing.  */
  
  /* A python function to write a single string using gdb's filtered
-@@ -381,6 +596,67 @@ gdbpy_print_stack (void)
+@@ -397,6 +612,55 @@ gdbpy_print_stack (void)
  
  \f
  
@@ -13790,38 +15092,12 @@ index 827372c..171cd5b 100644
 +  exit (0);
 +}
 +
-+void
-+source_python_script (FILE *stream, char *file)
-+{
-+  struct cleanup *cleanup;
-+
-+  cleanup = ensure_python_env (get_current_arch (), current_language);
-+  PyRun_SimpleFile (stream, file);
-+
-+  fclose (stream);
-+  do_cleanups (cleanup);
-+}
-+
 +\f
 +
  /* The "current" objfile.  This is set when gdb detects that a new
     objfile has been loaded.  It is only set for the duration of a call
     to gdbpy_new_objfile; it is NULL at other times.  */
-@@ -525,6 +801,13 @@ eval_python_from_control_command (struct command_line *cmd)
-   error (_("Python scripting is not supported in this copy of GDB."));
- }
- 
-+void
-+source_python_script (FILE *stream)
-+{
-+  fclose (stream);
-+  error (_("Python scripting is not supported in this copy of GDB."));
-+}
-+
- #endif /* HAVE_PYTHON */
- 
- \f
-@@ -616,14 +899,28 @@ Enables or disables auto-loading of Python code when an object is opened."),
+@@ -640,14 +904,28 @@ Enables or disables auto-loading of Python code when an object is opened."),
    PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
    PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name);
    PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_name);
@@ -13850,7 +15126,7 @@ index 827372c..171cd5b 100644
  
    PyRun_SimpleString ("import gdb");
    PyRun_SimpleString ("gdb.pretty_printers = []");
-@@ -659,6 +956,15 @@ class GdbOutputFile:\n\
+@@ -683,6 +961,15 @@ class GdbOutputFile:\n\
  \n\
  sys.stderr = GdbOutputFile()\n\
  sys.stdout = GdbOutputFile()\n\
@@ -13866,7 +15142,7 @@ index 827372c..171cd5b 100644
  ");
  
    /* Release the GIL while gdb runs.  */
-@@ -678,9 +984,14 @@ static PyMethodDef GdbMethods[] =
+@@ -702,9 +989,14 @@ static PyMethodDef GdbMethods[] =
      "Get a value from history" },
    { "execute", execute_gdb_command, METH_VARARGS,
      "Execute a gdb command" },
@@ -13881,7 +15157,7 @@ index 827372c..171cd5b 100644
    { "default_visualizer", gdbpy_default_visualizer, METH_VARARGS,
      "Find the default visualizer for a Value." },
  
-@@ -701,11 +1012,39 @@ Return a string explaining unwind stop reason." },
+@@ -725,11 +1017,39 @@ Return a string explaining unwind stop reason." },
      "lookup_type (name [, block]) -> type\n\
  Return a Type corresponding to the given name." },
  
@@ -13922,25 +15198,23 @@ index 827372c..171cd5b 100644
      "Write a string using gdb's filtered stream." },
    { "flush", gdbpy_flush, METH_NOARGS,
 diff --git a/gdb/python/python.h b/gdb/python/python.h
-index f35827b..1a5b9a8 100644
+index 5d93f67..1a5b9a8 100644
 --- a/gdb/python/python.h
 +++ b/gdb/python/python.h
-@@ -24,6 +24,10 @@
+@@ -26,6 +26,8 @@ void eval_python_from_control_command (struct command_line *);
  
- void eval_python_from_control_command (struct command_line *);
+ void source_python_script (FILE *stream, char *file);
  
-+void source_python_script (FILE *stream, char *file);
-+
 +void run_python_script (int argc, char **argv);
 +
  int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
  			      int embedded_offset, CORE_ADDR address,
  			      struct ui_file *stream, int recurse,
 diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c
-index 1d05f8a..e2015c4 100644
+index 5898aad..23e5f22 100644
 --- a/gdb/scm-lang.c
 +++ b/gdb/scm-lang.c
-@@ -233,6 +233,7 @@ const struct exp_descriptor exp_descriptor_scm =
+@@ -231,6 +231,7 @@ const struct exp_descriptor exp_descriptor_scm =
  {
    print_subexp_standard,
    operator_length_standard,
@@ -13948,6 +15222,118 @@ index 1d05f8a..e2015c4 100644
    op_name_standard,
    dump_subexp_body_standard,
    evaluate_exp
+diff --git a/gdb/scm-valprint.c b/gdb/scm-valprint.c
+index 1e8d48e..95185d4 100644
+--- a/gdb/scm-valprint.c
++++ b/gdb/scm-valprint.c
+@@ -62,9 +62,9 @@ scm_inferior_print (struct type *type, LONGEST value, struct ui_file *stream,
+     {
+       /* XXX: Should we cache these symbols?  */
+       gdb_output_sym =
+-	lookup_symbol_global ("gdb_output", NULL, NULL, VAR_DOMAIN);
++	lookup_symbol_global ("gdb_output", NULL, VAR_DOMAIN);
+       gdb_output_len_sym =
+-	lookup_symbol_global ("gdb_output_length", NULL, NULL, VAR_DOMAIN);
++	lookup_symbol_global ("gdb_output_length", NULL, VAR_DOMAIN);
+ 
+       if ((gdb_output_sym == NULL) || (gdb_output_len_sym == NULL))
+ 	ret = -1;
+diff --git a/gdb/solib-darwin.c b/gdb/solib-darwin.c
+index 3c70089..0ee7d85 100644
+--- a/gdb/solib-darwin.c
++++ b/gdb/solib-darwin.c
+@@ -408,7 +408,6 @@ darwin_relocate_section_addresses (struct so_list *so,
+ static struct symbol *
+ darwin_lookup_lib_symbol (const struct objfile *objfile,
+ 			  const char *name,
+-			  const char *linkage_name,
+ 			  const domain_enum domain)
+ {
+   return NULL;
+diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
+index 94a77fb..7ea68d2 100644
+--- a/gdb/solib-spu.c
++++ b/gdb/solib-spu.c
+@@ -326,16 +326,13 @@ spu_bfd_open (char *pathname)
+ static struct symbol *
+ spu_lookup_lib_symbol (const struct objfile *objfile,
+ 		       const char *name,
+-		       const char *linkage_name,
+ 		       const domain_enum domain)
+ {
+   if (bfd_get_arch (objfile->obfd) == bfd_arch_spu)
+-    return lookup_global_symbol_from_objfile (objfile, name, linkage_name,
+-					      domain);
++    return lookup_global_symbol_from_objfile (objfile, name, domain);
+ 
+   if (svr4_so_ops.lookup_lib_global_symbol != NULL)
+-    return svr4_so_ops.lookup_lib_global_symbol (objfile, name, linkage_name,
+-						 domain);
++    return svr4_so_ops.lookup_lib_global_symbol (objfile, name, domain);
+   return NULL;
+ }
+ 
+diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
+index 826f8bf..4def88d 100644
+--- a/gdb/solib-svr4.c
++++ b/gdb/solib-svr4.c
+@@ -1960,7 +1960,6 @@ struct target_so_ops svr4_so_ops;
+ static struct symbol *
+ elf_lookup_lib_symbol (const struct objfile *objfile,
+ 		       const char *name,
+-		       const char *linkage_name,
+ 		       const domain_enum domain)
+ {
+   bfd *abfd;
+@@ -1978,8 +1977,7 @@ elf_lookup_lib_symbol (const struct objfile *objfile,
+   if (abfd == NULL || scan_dyntag (DT_SYMBOLIC, abfd, NULL) != 1)
+     return NULL;
+ 
+-  return lookup_global_symbol_from_objfile
+-		(objfile, name, linkage_name, domain);
++  return lookup_global_symbol_from_objfile (objfile, name, domain);
+ }
+ 
+ extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */
+diff --git a/gdb/solib.c b/gdb/solib.c
+index 842b27c..ac1c407 100644
+--- a/gdb/solib.c
++++ b/gdb/solib.c
+@@ -1154,13 +1154,12 @@ show_auto_solib_add (struct ui_file *file, int from_tty,
+ struct symbol *
+ solib_global_lookup (const struct objfile *objfile,
+ 		     const char *name,
+-		     const char *linkage_name,
+ 		     const domain_enum domain)
+ {
+   struct target_so_ops *ops = solib_ops (target_gdbarch);
+ 
+   if (ops->lookup_lib_global_symbol != NULL)
+-    return ops->lookup_lib_global_symbol (objfile, name, linkage_name, domain);
++    return ops->lookup_lib_global_symbol (objfile, name, domain);
+   return NULL;
+ }
+ 
+diff --git a/gdb/solist.h b/gdb/solist.h
+index 573f736..51bfce9 100644
+--- a/gdb/solist.h
++++ b/gdb/solist.h
+@@ -117,7 +117,6 @@ struct target_so_ops
+     /* Hook for looking up global symbols in a library-specific way.  */
+     struct symbol * (*lookup_lib_global_symbol) (const struct objfile *objfile,
+ 						 const char *name,
+-						 const char *linkage_name,
+ 						 const domain_enum domain);
+ 
+     /* Given two so_list objects, one from the GDB thread list
+@@ -157,7 +156,6 @@ extern struct target_so_ops *current_target_so_ops;
+ /* Handler for library-specific global symbol lookup in solib.c.  */
+ struct symbol *solib_global_lookup (const struct objfile *objfile,
+ 				    const char *name,
+-				    const char *linkage_name,
+ 				    const domain_enum domain);
+ 
+ #endif
 diff --git a/gdb/somread.c b/gdb/somread.c
 index c7beaba..e31164c 100644
 --- a/gdb/somread.c
@@ -13960,8 +15346,21 @@ index c7beaba..e31164c 100644
    som_symfile_finish,		/* sym_finish: finished with file, cleanup */
    som_symfile_offsets,		/* sym_offsets:  Translate ext. to int. relocation */
    default_symfile_segments,	/* sym_segments: Get segment information from
+diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
+index c6db8dc..7359b50 100644
+--- a/gdb/spu-tdep.c
++++ b/gdb/spu-tdep.c
+@@ -1841,7 +1841,7 @@ spu_catch_start (struct objfile *objfile)
+       struct symbol *sym;
+       struct symtab_and_line sal;
+ 
+-      sym = lookup_block_symbol (block, "main", NULL, VAR_DOMAIN);
++      sym = lookup_block_symbol (block, "main", VAR_DOMAIN);
+       if (sym)
+ 	{
+ 	  fixup_symbol_section (sym, objfile);
 diff --git a/gdb/stack.c b/gdb/stack.c
-index 6e198e0..94a3ef9 100644
+index 2caf9d2..7adc399 100644
 --- a/gdb/stack.c
 +++ b/gdb/stack.c
 @@ -1309,24 +1309,24 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
@@ -14008,10 +15407,10 @@ index 6e198e0..94a3ef9 100644
    for (i = 0, fi = trailing; fi && count--; i++, fi = get_prev_frame (fi))
      {
 diff --git a/gdb/symfile.c b/gdb/symfile.c
-index 89cc07c..b759f10 100644
+index bc52406..5d5d83f 100644
 --- a/gdb/symfile.c
 +++ b/gdb/symfile.c
-@@ -968,13 +968,16 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
+@@ -966,13 +966,16 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
    /* Give user a chance to burp if we'd be
       interactively wiping out any existing symbols.  */
  
@@ -14030,7 +15429,7 @@ index 89cc07c..b759f10 100644
    discard_cleanups (my_cleanups);
  
    /* We either created a new mapped symbol table, mapped an existing
-@@ -1001,6 +1004,8 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
+@@ -999,6 +1002,8 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
  
    if ((flags & OBJF_READNOW) || readnow_symbol_files)
      {
@@ -14039,7 +15438,7 @@ index 89cc07c..b759f10 100644
        if (from_tty || info_verbose)
  	{
  	  printf_unfiltered (_("expanding to full symbols..."));
-@@ -2323,6 +2328,7 @@ reread_symbols (void)
+@@ -2321,6 +2326,7 @@ reread_symbols (void)
  	  objfile->symtabs = NULL;
  	  objfile->psymtabs = NULL;
  	  objfile->psymtabs_addrmap = NULL;
@@ -14047,7 +15446,7 @@ index 89cc07c..b759f10 100644
  	  objfile->free_psymtabs = NULL;
  	  objfile->cp_namespace_symtab = NULL;
  	  objfile->msymbols = NULL;
-@@ -2333,6 +2339,8 @@ reread_symbols (void)
+@@ -2331,6 +2337,8 @@ reread_symbols (void)
  	  memset (&objfile->msymbol_demangled_hash, 0,
  		  sizeof (objfile->msymbol_demangled_hash));
  
@@ -14057,7 +15456,7 @@ index 89cc07c..b759f10 100644
  	  objfile->macro_cache = bcache_xmalloc ();
  	  objfile->filename_cache = bcache_xmalloc ();
 diff --git a/gdb/symfile.h b/gdb/symfile.h
-index 7ae819c..f3f6eb3 100644
+index efa069e..b520b93 100644
 --- a/gdb/symfile.h
 +++ b/gdb/symfile.h
 @@ -139,6 +139,12 @@ struct sym_fns
@@ -14073,7 +15472,17 @@ index 7ae819c..f3f6eb3 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.  */
-@@ -389,7 +395,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data);
+@@ -315,8 +321,7 @@ extern int auto_solib_limit;
+ 
+ extern void set_initial_language (void);
+ 
+-extern struct partial_symtab *allocate_psymtab (const char *,
+-						struct objfile *);
++extern struct partial_symtab *allocate_psymtab (const char *, struct objfile *);
+ 
+ extern void discard_psymtab (struct partial_symtab *);
+ 
+@@ -387,7 +392,7 @@ void free_symfile_segment_data (struct symfile_segment_data *data);
  /* From dwarf2read.c */
  
  extern int dwarf2_has_info (struct objfile *);
@@ -14082,11 +15491,73 @@ index 7ae819c..f3f6eb3 100644
  extern void dwarf2_build_psymtabs (struct objfile *);
  extern void dwarf2_build_frame_info (struct objfile *);
  
+diff --git a/gdb/symmisc.c b/gdb/symmisc.c
+index 1f3eb9e..d096d5c 100644
+--- a/gdb/symmisc.c
++++ b/gdb/symmisc.c
+@@ -1143,7 +1143,7 @@ maintenance_check_symtabs (char *ignore, int from_tty)
+     while (length--)
+       {
+ 	sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
+-				   NULL, SYMBOL_DOMAIN (*psym));
++				   SYMBOL_DOMAIN (*psym));
+ 	if (!sym)
+ 	  {
+ 	    printf_filtered ("Static symbol `");
+@@ -1160,7 +1160,7 @@ maintenance_check_symtabs (char *ignore, int from_tty)
+     while (length--)
+       {
+ 	sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
+-				   NULL, SYMBOL_DOMAIN (*psym));
++				   SYMBOL_DOMAIN (*psym));
+ 	if (!sym)
+ 	  {
+ 	    printf_filtered ("Global symbol `");
 diff --git a/gdb/symtab.c b/gdb/symtab.c
-index 426326d..bac4ca3 100644
+index 426326d..20d90de 100644
 --- a/gdb/symtab.c
 +++ b/gdb/symtab.c
-@@ -271,7 +271,7 @@ lookup_partial_symtab (const char *name)
+@@ -42,6 +42,7 @@
+ #include "ada-lang.h"
+ #include "p-lang.h"
+ #include "addrmap.h"
++#include "cp-support.h"
+ 
+ #include "hashtab.h"
+ 
+@@ -85,7 +86,6 @@ static int find_line_common (struct linetable *, int, int *);
+ char *operator_chars (char *p, char **end);
+ 
+ static struct symbol *lookup_symbol_aux (const char *name,
+-					 const char *linkage_name,
+ 					 const struct block *block,
+ 					 const domain_enum domain,
+ 					 enum language language,
+@@ -93,20 +93,19 @@ static struct symbol *lookup_symbol_aux (const char *name,
+ 
+ static
+ struct symbol *lookup_symbol_aux_local (const char *name,
+-					const char *linkage_name,
+ 					const struct block *block,
+-					const domain_enum domain);
++					const domain_enum domain,
++					enum language language,
++					int *is_a_field_of_this);
+ 
+ static
+ struct symbol *lookup_symbol_aux_symtabs (int block_index,
+ 					  const char *name,
+-					  const char *linkage_name,
+ 					  const domain_enum domain);
+ 
+ static
+ struct symbol *lookup_symbol_aux_psymtabs (int block_index,
+ 					   const char *name,
+-					   const char *linkage_name,
+ 					   const domain_enum domain);
+ 
+ static int file_matches (char *, char **, int);
+@@ -271,7 +270,7 @@ lookup_partial_symtab (const char *name)
        make_cleanup (xfree, real_path);
      }
  
@@ -14095,7 +15566,7 @@ index 426326d..bac4ca3 100644
    {
      if (FILENAME_CMP (name, pst->filename) == 0)
        {
-@@ -414,7 +414,8 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
+@@ -414,7 +413,8 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
    gsymbol->language = language;
    if (gsymbol->language == language_cplus
        || gsymbol->language == language_java
@@ -14105,7 +15576,16 @@ index 426326d..bac4ca3 100644
      {
        gsymbol->language_specific.cplus_specific.demangled_name = NULL;
      }
-@@ -695,6 +696,7 @@ symbol_natural_name (const struct general_symbol_info *gsymbol)
+@@ -498,7 +498,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
+       || gsymbol->language == language_auto)
+     {
+       demangled =
+-        cplus_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
++        cplus_demangle (mangled, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
+       if (demangled != NULL)
+ 	{
+ 	  gsymbol->language = language_cplus;
+@@ -695,6 +695,7 @@ symbol_natural_name (const struct general_symbol_info *gsymbol)
      case language_cplus:
      case language_java:
      case language_objc:
@@ -14113,7 +15593,7 @@ index 426326d..bac4ca3 100644
        if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
  	return gsymbol->language_specific.cplus_specific.demangled_name;
        break;
-@@ -720,6 +722,7 @@ symbol_demangled_name (const struct general_symbol_info *gsymbol)
+@@ -720,6 +721,7 @@ symbol_demangled_name (const struct general_symbol_info *gsymbol)
      case language_cplus:
      case language_java:
      case language_objc:
@@ -14121,7 +15601,7 @@ index 426326d..bac4ca3 100644
        if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
  	return gsymbol->language_specific.cplus_specific.demangled_name;
        break;
-@@ -931,7 +934,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
+@@ -931,7 +933,13 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
       than the later used TEXTLOW/TEXTHIGH one.  */
  
    ALL_OBJFILES (objfile)
@@ -14136,7 +15616,7 @@ index 426326d..bac4ca3 100644
        {
  	struct partial_symtab *pst;
  
-@@ -964,6 +973,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
+@@ -964,6 +972,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, struct obj_section *section)
  	    return pst;
  	  }
        }
@@ -14144,7 +15624,7 @@ index 426326d..bac4ca3 100644
  
    /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
       which still have no corresponding full SYMTABs read.  But it is not
-@@ -1231,6 +1241,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
+@@ -1231,6 +1240,22 @@ fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
    return psym;
  }
  
@@ -14167,7 +15647,266 @@ index 426326d..bac4ca3 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.
-@@ -1534,6 +1560,7 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
+@@ -1257,10 +1282,14 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+ {
+   char *demangled_name = NULL;
+   const char *modified_name = NULL;
+-  const char *mangled_name = NULL;
+   struct symbol *returnval;
+   struct cleanup *cleanup = make_cleanup (null_cleanup, 0);
+ 
++  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
+@@ -1270,7 +1299,6 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+       demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
+       if (demangled_name)
+ 	{
+-	  mangled_name = name;
+ 	  modified_name = demangled_name;
+ 	  make_cleanup (xfree, demangled_name);
+ 	}
+@@ -1292,7 +1320,6 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+ 		      		       DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
+       if (demangled_name)
+ 	{
+-	  mangled_name = name;
+ 	  modified_name = demangled_name;
+ 	  make_cleanup (xfree, demangled_name);
+ 	}
+@@ -1311,8 +1338,8 @@ lookup_symbol_in_language (const char *name, const struct block *block,
+       modified_name = copy;
+     }
+ 
+-  returnval = lookup_symbol_aux (modified_name, mangled_name, block,
+-				 domain, lang, is_a_field_of_this);
++  returnval = lookup_symbol_aux (modified_name, block, domain, lang,
++				 is_a_field_of_this);
+   do_cleanups (cleanup);
+ 
+   return returnval;
+@@ -1336,9 +1363,9 @@ lookup_symbol (const char *name, const struct block *block,
+    well.  */
+ 
+ static struct symbol *
+-lookup_symbol_aux (const char *name, const char *linkage_name,
+-		   const struct block *block, const domain_enum domain,
+-		   enum language language, int *is_a_field_of_this)
++lookup_symbol_aux (const char *name, const struct block *block,
++		   const domain_enum domain, enum language language,
++		   int *is_a_field_of_this)
+ {
+   struct symbol *sym;
+   const struct language_defn *langdef;
+@@ -1354,55 +1381,19 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
+   /* Search specified block and its superiors.  Don't search
+      STATIC_BLOCK or GLOBAL_BLOCK.  */
+ 
+-  sym = lookup_symbol_aux_local (name, linkage_name, block, domain);
++  sym = lookup_symbol_aux_local (name, block, domain, language, is_a_field_of_this);
+   if (sym != NULL)
+     return sym;
+ 
+-  /* If requested to do so by the caller and if appropriate for LANGUAGE,
+-     check to see if NAME is a field of `this'. */
+-
+-  langdef = language_def (language);
+-
+-  if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL
+-      && block != NULL)
+-    {
+-      struct symbol *sym = NULL;
+-      /* 'this' is only defined in the function's block, so find the
+-	 enclosing function block.  */
+-      for (; block && !BLOCK_FUNCTION (block);
+-	   block = BLOCK_SUPERBLOCK (block));
+-
+-      if (block && !dict_empty (BLOCK_DICT (block)))
+-	sym = lookup_block_symbol (block, langdef->la_name_of_this,
+-				   NULL, VAR_DOMAIN);
+-      if (sym)
+-	{
+-	  struct type *t = sym->type;
+-
+-	  /* I'm not really sure that type of this can ever
+-	     be typedefed; just be safe.  */
+-	  CHECK_TYPEDEF (t);
+-	  if (TYPE_CODE (t) == TYPE_CODE_PTR
+-	      || TYPE_CODE (t) == TYPE_CODE_REF)
+-	    t = TYPE_TARGET_TYPE (t);
+-
+-	  if (TYPE_CODE (t) != TYPE_CODE_STRUCT
+-	      && TYPE_CODE (t) != TYPE_CODE_UNION)
+-	    error (_("Internal error: `%s' is not an aggregate"),
+-		   langdef->la_name_of_this);
+-
+-	  if (check_field (t, name))
+-	    {
+-	      *is_a_field_of_this = 1;
+-	      return NULL;
+-	    }
+-	}
+-    }
++  /* this symbol was found to be a member variable
++     do not perform the global search. */
++  if (is_a_field_of_this && *is_a_field_of_this)
++    return NULL;
+ 
+   /* Now do whatever is appropriate for LANGUAGE to look
+      up static and global variables.  */
+-
+-  sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name, block, domain);
++  langdef = language_def (language);
++  sym = langdef->la_lookup_symbol_nonlocal (name, block, domain);
+   if (sym != NULL)
+     return sym;
+ 
+@@ -1412,11 +1403,11 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
+      desired name as a file-level static, then do psymtab-to-symtab
+      conversion on the fly and return the found symbol. */
+ 
+-  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, linkage_name, domain);
++  sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain);
+   if (sym != NULL)
+     return sym;
+ 
+-  sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, linkage_name, domain);
++  sym = lookup_symbol_aux_psymtabs (STATIC_BLOCK, name, domain);
+   if (sym != NULL)
+     return sym;
+ 
+@@ -1427,30 +1418,81 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
+    Don't search STATIC_BLOCK or GLOBAL_BLOCK.  */
+ 
+ static struct symbol *
+-lookup_symbol_aux_local (const char *name, const char *linkage_name,
+-			 const struct block *block,
+-			 const domain_enum domain)
++lookup_symbol_aux_local (const char *name, const struct block *block,
++			 const domain_enum domain, enum language language,
++			 int *is_a_field_of_this)
+ {
+   struct symbol *sym;
+-  const struct block *static_block = block_static_block (block);
++  const struct block *global_block = block_global_block (block);
++  const struct block *block_iterator = block;
++  const struct language_defn *langdef;
++
++  langdef = language_def (language);
+ 
+   /* 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_iterator != global_block)
+     {
+-      sym = lookup_symbol_aux_block (name, linkage_name, block, domain);
++
++      sym = lookup_symbol_aux_block (name, block_iterator, domain);
++
+       if (sym != NULL)
+ 	return sym;
++    
++      if (language == language_cplus )
++        {
++          sym = cp_lookup_symbol_imports (block_scope (block_iterator), name,
++                                          block_iterator, domain, 1, 1);
+ 
+-      if (BLOCK_FUNCTION (block) != NULL && block_inlined_p (block))
+-	break;
+-      block = BLOCK_SUPERBLOCK (block);
++          if (sym != NULL)
++            return sym;
++        }
++
++      if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL
++	  && BLOCK_FUNCTION (block_iterator))
++        {
++          if (!dict_empty (BLOCK_DICT (block_iterator)))
++            {
++              sym = lookup_block_symbol (block_iterator,
++					 langdef->la_name_of_this,
++					 VAR_DOMAIN);
++
++
++              if (sym)
++                {
++                  struct type *t = sym->type;
++
++                  /* I'm not really sure that type of this can ever
++                     be typedefed; just be safe.  */
++                  CHECK_TYPEDEF (t);
++                  if (TYPE_CODE (t) == TYPE_CODE_PTR
++                      || TYPE_CODE (t) == TYPE_CODE_REF)
++                      t = TYPE_TARGET_TYPE (t);
++
++                  if (TYPE_CODE (t) != TYPE_CODE_STRUCT
++                      && TYPE_CODE (t) != TYPE_CODE_UNION)
++                    error (_("Internal error: `%s' is not an aggregate"),
++                        langdef->la_name_of_this);
++
++                  if (check_field (t, name))
++                    {
++                      *is_a_field_of_this = 1;
++                      return NULL;
++                    }
++                }
++            }
++        }
++
++      if (BLOCK_FUNCTION (block_iterator) != NULL && block_inlined_p (block_iterator))
++        break;
++
++      block_iterator = BLOCK_SUPERBLOCK (block_iterator);
+     }
+ 
+-  /* We've reached the edge of the function without finding a result.  */
++  /* We've reached the global block without finding a result.  */
+ 
+   return NULL;
+ }
+@@ -1484,13 +1526,12 @@ lookup_objfile_from_block (const struct block *block)
+    block_found appropriately.  */
+ 
+ struct symbol *
+-lookup_symbol_aux_block (const char *name, const char *linkage_name,
+-			 const struct block *block,
++lookup_symbol_aux_block (const char *name, const struct block *block,
+ 			 const domain_enum domain)
+ {
+   struct symbol *sym;
+ 
+-  sym = lookup_block_symbol (block, name, linkage_name, domain);
++  sym = lookup_block_symbol (block, name, domain);
+   if (sym)
+     {
+       block_found = block;
+@@ -1506,7 +1547,6 @@ lookup_symbol_aux_block (const char *name, const char *linkage_name,
+ struct symbol *
+ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
+ 				   const char *name,
+-				   const char *linkage_name,
+ 				   const domain_enum domain)
+ {
+   const struct objfile *objfile;
+@@ -1525,7 +1565,7 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
+         {
+           bv = BLOCKVECTOR (s);
+           block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+-          sym = lookup_block_symbol (block, name, linkage_name, domain);
++          sym = lookup_block_symbol (block, name, domain);
+           if (sym)
+             {
+               block_found = block;
+@@ -1534,16 +1574,16 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
          }
  
        /* Now go through psymtabs.  */
@@ -14175,7 +15914,46 @@ index 426326d..bac4ca3 100644
        ALL_OBJFILE_PSYMTABS (objfile, ps)
          {
            if (!ps->readin
-@@ -1601,7 +1628,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
+-              && lookup_partial_symbol (ps, name, linkage_name,
+-                                        1, domain))
++              && lookup_partial_symbol (ps, name, 1, domain))
+             {
+               s = PSYMTAB_TO_SYMTAB (ps);
+               bv = BLOCKVECTOR (s);
+               block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+-              sym = lookup_block_symbol (block, name, linkage_name, domain);
++              sym = lookup_block_symbol (block, name, domain);
+               return fixup_symbol_section (sym, (struct objfile *)objfile);
+             }
+         }
+@@ -1558,8 +1598,7 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile,
+    static symbols.  */
+ 
+ static struct symbol *
+-lookup_symbol_aux_symtabs (int block_index,
+-			   const char *name, const char *linkage_name,
++lookup_symbol_aux_symtabs (int block_index, const char *name,
+ 			   const domain_enum domain)
+ {
+   struct symbol *sym;
+@@ -1572,7 +1611,7 @@ lookup_symbol_aux_symtabs (int block_index,
+   {
+     bv = BLOCKVECTOR (s);
+     block = BLOCKVECTOR_BLOCK (bv, block_index);
+-    sym = lookup_block_symbol (block, name, linkage_name, domain);
++    sym = lookup_block_symbol (block, name, domain);
+     if (sym)
+       {
+ 	block_found = block;
+@@ -1590,7 +1629,6 @@ lookup_symbol_aux_symtabs (int block_index,
+ 
+ static struct symbol *
+ lookup_symbol_aux_psymtabs (int block_index, const char *name,
+-			    const char *linkage_name,
+ 			    const domain_enum domain)
+ {
+   struct symbol *sym;
+@@ -1601,16 +1639,15 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
    struct symtab *s;
    const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
  
@@ -14183,37 +15961,222 @@ index 426326d..bac4ca3 100644
 +  ALL_PSYMTABS_REQUIRED (objfile, ps)
    {
      if (!ps->readin
- 	&& lookup_partial_symbol (ps, name, linkage_name,
-@@ -1886,7 +1913,11 @@ basic_lookup_transparent_type (const char *name)
-       }
-   }
+-	&& lookup_partial_symbol (ps, name, linkage_name,
+-				  psymtab_index, domain))
++	&& lookup_partial_symbol (ps, name, psymtab_index, domain))
+       {
+ 	s = PSYMTAB_TO_SYMTAB (ps);
+ 	bv = BLOCKVECTOR (s);
+ 	block = BLOCKVECTOR_BLOCK (bv, block_index);
+-	sym = lookup_block_symbol (block, name, linkage_name, domain);
++	sym = lookup_block_symbol (block, name, domain);
+ 	if (!sym)
+ 	  {
+ 	    /* This shouldn't be necessary, but as a last resort try
+@@ -1627,7 +1664,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
+ 	    block = BLOCKVECTOR_BLOCK (bv,
+ 				       block_index == GLOBAL_BLOCK ?
+ 				       STATIC_BLOCK : GLOBAL_BLOCK);
+-	    sym = lookup_block_symbol (block, name, linkage_name, domain);
++	    sym = lookup_block_symbol (block, name, domain);
+ 	    if (!sym)
+ 	      error (_("Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n%s may be an inlined function, or may be a template function\n(if a template, try specifying an instantiation: %s<type>)."),
+ 		     block_index == GLOBAL_BLOCK ? "global" : "static",
+@@ -1646,7 +1683,6 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
+ 
+ struct symbol *
+ basic_lookup_symbol_nonlocal (const char *name,
+-			      const char *linkage_name,
+ 			      const struct block *block,
+ 			      const domain_enum domain)
+ {
+@@ -1680,11 +1716,11 @@ basic_lookup_symbol_nonlocal (const char *name,
+      than that one, so I don't think we should worry about that for
+      now.  */
  
--  ALL_PSYMTABS (objfile, ps)
-+  /* FIXME: .debug_pubnames should be read in.
-+     
-+     One may also try to the first pass without the require_partial_symbols
-+     call but that would behave nondeterministically.  */
-+  ALL_PSYMTABS_REQUIRED (objfile, ps)
-   {
-     if (!ps->readin && lookup_partial_symbol (ps, name, NULL,
- 					      1, STRUCT_DOMAIN))
-@@ -1934,7 +1965,12 @@ basic_lookup_transparent_type (const char *name)
-       }
-   }
+-  sym = lookup_symbol_static (name, linkage_name, block, domain);
++  sym = lookup_symbol_static (name, block, domain);
+   if (sym != NULL)
+     return sym;
  
--  ALL_PSYMTABS (objfile, ps)
-+  /* FIXME: Something like .debug_pubnames containing also static symbols
-+     should be read in.  Compiler needs to be taught to generate it first.
-+     
-+     One may also try to the first pass without the require_partial_symbols
-+     call but that would behave nondeterministically.  */
-+  ALL_PSYMTABS_REQUIRED (objfile, ps)
-   {
-     if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN))
-       {
-@@ -1975,7 +2011,21 @@ find_main_psymtab (void)
-   struct partial_symtab *pst;
-   struct objfile *objfile;
+-  return lookup_symbol_global (name, linkage_name, block, domain);
++  return lookup_symbol_global (name, block, domain);
+ }
+ 
+ /* Lookup a symbol in the static block associated to BLOCK, if there
+@@ -1692,14 +1728,13 @@ basic_lookup_symbol_nonlocal (const char *name,
+ 
+ struct symbol *
+ lookup_symbol_static (const char *name,
+-		      const char *linkage_name,
+ 		      const struct block *block,
+ 		      const domain_enum domain)
+ {
+   const struct block *static_block = block_static_block (block);
+ 
+   if (static_block != NULL)
+-    return lookup_symbol_aux_block (name, linkage_name, static_block, domain);
++    return lookup_symbol_aux_block (name, static_block, domain);
+   else
+     return NULL;
+ }
+@@ -1709,7 +1744,6 @@ lookup_symbol_static (const char *name,
+ 
+ struct symbol *
+ lookup_symbol_global (const char *name,
+-		      const char *linkage_name,
+ 		      const struct block *block,
+ 		      const domain_enum domain)
+ {
+@@ -1719,15 +1753,15 @@ lookup_symbol_global (const char *name,
+   /* Call library-specific lookup procedure.  */
+   objfile = lookup_objfile_from_block (block);
+   if (objfile != NULL)
+-    sym = solib_global_lookup (objfile, name, linkage_name, domain);
++    sym = solib_global_lookup (objfile, name, domain);
+   if (sym != NULL)
+     return sym;
+ 
+-  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, linkage_name, domain);
++  sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain);
+   if (sym != NULL)
+     return sym;
+ 
+-  return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, linkage_name, domain);
++  return lookup_symbol_aux_psymtabs (GLOBAL_BLOCK, name, domain);
+ }
+ 
+ int
+@@ -1751,14 +1785,11 @@ symbol_matches_domain (enum language symbol_language,
+ }
+ 
+ /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
+-   If LINKAGE_NAME is non-NULL, check in addition that the symbol's
+-   linkage name matches it.  Check the global symbols if GLOBAL, the
+-   static symbols if not */
++   Check the global symbols if GLOBAL, the static symbols if not. */
+ 
+ struct partial_symbol *
+ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
+-		       const char *linkage_name, int global,
+-		       domain_enum domain)
++		       int global, domain_enum domain)
+ {
+   struct partial_symbol *temp;
+   struct partial_symbol **start, **psym;
+@@ -1810,9 +1841,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
+ 	internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+ 
+       while (top <= real_top
+-	     && (linkage_name != NULL
+-		 ? strcmp (SYMBOL_LINKAGE_NAME (*top), linkage_name) == 0
+-		 : SYMBOL_MATCHES_SEARCH_NAME (*top,name)))
++	     && SYMBOL_MATCHES_SEARCH_NAME (*top, name))
+ 	{
+ 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
+ 				     SYMBOL_DOMAIN (*top), domain))
+@@ -1829,15 +1858,9 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
+       for (psym = start; psym < start + length; psym++)
+ 	{
+ 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
+-				     SYMBOL_DOMAIN (*psym), domain))
+-	    {
+-	      if (linkage_name != NULL
+-		  ? strcmp (SYMBOL_LINKAGE_NAME (*psym), linkage_name) == 0
+-		  : SYMBOL_MATCHES_SEARCH_NAME (*psym, name))
+-		{
+-		  return (*psym);
+-		}
+-	    }
++				     SYMBOL_DOMAIN (*psym), domain)
++	      && SYMBOL_MATCHES_SEARCH_NAME (*psym, name))
++	    return (*psym);
+ 	}
+     }
+ 
+@@ -1879,22 +1902,25 @@ basic_lookup_transparent_type (const char *name)
+   {
+     bv = BLOCKVECTOR (s);
+     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+-    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++    sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+     if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
+       {
+ 	return SYMBOL_TYPE (sym);
+       }
+   }
+ 
+-  ALL_PSYMTABS (objfile, ps)
++  /* FIXME: .debug_pubnames should be read in.
++     
++     One may also try to the first pass without the require_partial_symbols
++     call but that would behave nondeterministically.  */
++  ALL_PSYMTABS_REQUIRED (objfile, ps)
+   {
+-    if (!ps->readin && lookup_partial_symbol (ps, name, NULL,
+-					      1, STRUCT_DOMAIN))
++    if (!ps->readin && lookup_partial_symbol (ps, name, 1, STRUCT_DOMAIN))
+       {
+ 	s = PSYMTAB_TO_SYMTAB (ps);
+ 	bv = BLOCKVECTOR (s);
+ 	block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+-	sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++	sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+ 	if (!sym)
+ 	  {
+ 	    /* This shouldn't be necessary, but as a last resort
+@@ -1903,7 +1929,7 @@ basic_lookup_transparent_type (const char *name)
+ 	     * the psymtab gets it wrong in some cases.
+ 	     */
+ 	    block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+-	    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++	    sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+ 	    if (!sym)
+ 	      error (_("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
+ %s may be an inlined function, or may be a template function\n\
+@@ -1927,21 +1953,26 @@ basic_lookup_transparent_type (const char *name)
+   {
+     bv = BLOCKVECTOR (s);
+     block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+-    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++    sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+     if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
+       {
+ 	return SYMBOL_TYPE (sym);
+       }
+   }
+ 
+-  ALL_PSYMTABS (objfile, ps)
++  /* FIXME: Something like .debug_pubnames containing also static symbols
++     should be read in.  Compiler needs to be taught to generate it first.
++     
++     One may also try to the first pass without the require_partial_symbols
++     call but that would behave nondeterministically.  */
++  ALL_PSYMTABS_REQUIRED (objfile, ps)
+   {
+-    if (!ps->readin && lookup_partial_symbol (ps, name, NULL, 0, STRUCT_DOMAIN))
++    if (!ps->readin && lookup_partial_symbol (ps, name, 0, STRUCT_DOMAIN))
+       {
+ 	s = PSYMTAB_TO_SYMTAB (ps);
+ 	bv = BLOCKVECTOR (s);
+ 	block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
+-	sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++	sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+ 	if (!sym)
+ 	  {
+ 	    /* This shouldn't be necessary, but as a last resort
+@@ -1950,7 +1981,7 @@ basic_lookup_transparent_type (const char *name)
+ 	     * the psymtab gets it wrong in some cases.
+ 	     */
+ 	    block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+-	    sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
++	    sym = lookup_block_symbol (block, name, STRUCT_DOMAIN);
+ 	    if (!sym)
+ 	      error (_("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
+ %s may be an inlined function, or may be a template function\n\
+@@ -1975,9 +2006,23 @@ find_main_psymtab (void)
+   struct partial_symtab *pst;
+   struct objfile *objfile;
  
 -  ALL_PSYMTABS (objfile, pst)
 +  ALL_OBJFILES (objfile)
@@ -14223,7 +16186,7 @@ index 426326d..bac4ca3 100644
 +    require_partial_symbols (objfile);
 +    ALL_OBJFILE_PSYMTABS (objfile, pst)
 +    {
-+      if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN))
++      if (lookup_partial_symbol (pst, main_name (), 1, VAR_DOMAIN))
 +	{
 +	  return pst;
 +	}
@@ -14232,9 +16195,49 @@ index 426326d..bac4ca3 100644
 +
 +  ALL_PSYMTABS_REQUIRED (objfile, pst)
    {
-     if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN))
+-    if (lookup_partial_symbol (pst, main_name (), NULL, 1, VAR_DOMAIN))
++    if (lookup_partial_symbol (pst, main_name (), 1, VAR_DOMAIN))
        {
-@@ -3261,7 +3311,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
+ 	return (pst);
+       }
+@@ -1995,14 +2040,10 @@ find_main_psymtab (void)
+    search on the symbols.  Each symbol which is marked as being a ObjC/C++
+    symbol (language_cplus or language_objc set) has both the encoded and
+    non-encoded names tested for a match.
+-
+-   If LINKAGE_NAME is non-NULL, verify that any symbol we find has this
+-   particular mangled name.
+ */
+ 
+ struct symbol *
+ lookup_block_symbol (const struct block *block, const char *name,
+-		     const char *linkage_name,
+ 		     const domain_enum domain)
+ {
+   struct dict_iterator iter;
+@@ -2015,9 +2056,7 @@ lookup_block_symbol (const struct block *block, const char *name,
+ 	   sym = dict_iter_name_next (name, &iter))
+ 	{
+ 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+-				     SYMBOL_DOMAIN (sym), domain)
+-	      && (linkage_name != NULL
+-		  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
++				     SYMBOL_DOMAIN (sym), domain))
+ 	    return sym;
+ 	}
+       return NULL;
+@@ -2037,9 +2076,7 @@ lookup_block_symbol (const struct block *block, const char *name,
+ 	   sym = dict_iter_name_next (name, &iter))
+ 	{
+ 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+-				     SYMBOL_DOMAIN (sym), domain)
+-	      && (linkage_name != NULL
+-		  ? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
++				     SYMBOL_DOMAIN (sym), domain))
+ 	    {
+ 	      sym_found = sym;
+ 	      if (!SYMBOL_IS_ARGUMENT (sym))
+@@ -3261,7 +3298,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. */
  
@@ -14244,7 +16247,7 @@ index 426326d..bac4ca3 100644
      struct partial_symbol **bound, **gbound, **sbound;
      int keep_going = 1;
 diff --git a/gdb/symtab.h b/gdb/symtab.h
-index 800ffd8..3ed6947 100644
+index 800ffd8..4253f9d 100644
 --- a/gdb/symtab.h
 +++ b/gdb/symtab.h
 @@ -396,7 +396,10 @@ typedef enum domain_enum_tag
@@ -14259,7 +16262,53 @@ index 800ffd8..3ed6947 100644
  }
  domain_enum;
  
-@@ -1065,6 +1068,8 @@ extern void clear_pc_function_cache (void);
+@@ -993,7 +996,6 @@ extern struct symbol *lookup_symbol (const char *, const struct block *,
+    that can't think of anything better to do.  */
+ 
+ extern struct symbol *basic_lookup_symbol_nonlocal (const char *,
+-						    const char *,
+ 						    const struct block *,
+ 						    const domain_enum);
+ 
+@@ -1004,7 +1006,6 @@ extern struct symbol *basic_lookup_symbol_nonlocal (const char *,
+    is one; do nothing if BLOCK is NULL or a global block.  */
+ 
+ extern struct symbol *lookup_symbol_static (const char *name,
+-					    const char *linkage_name,
+ 					    const struct block *block,
+ 					    const domain_enum domain);
+ 
+@@ -1012,7 +1013,6 @@ extern struct symbol *lookup_symbol_static (const char *name,
+    necessary).  */
+ 
+ extern struct symbol *lookup_symbol_global (const char *name,
+-					    const char *linkage_name,
+ 					    const struct block *block,
+ 					    const domain_enum domain);
+ 
+@@ -1021,21 +1021,18 @@ extern struct symbol *lookup_symbol_global (const char *name,
+    will fix up the symbol if necessary.  */
+ 
+ extern struct symbol *lookup_symbol_aux_block (const char *name,
+-					       const char *linkage_name,
+ 					       const struct block *block,
+ 					       const domain_enum domain);
+ 
+ /* Lookup a partial symbol.  */
+ 
+ extern struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
+-						     const char *,
+ 						     const char *, int,
+ 						     domain_enum);
+ 
+ /* lookup a symbol by name, within a specified block */
+ 
+ extern struct symbol *lookup_block_symbol (const struct block *, const char *,
+-					   const char *,
+ 					   const domain_enum);
+ 
+ /* lookup a [struct, union, enum] by name, within a specified block */
+@@ -1065,6 +1062,8 @@ extern void clear_pc_function_cache (void);
  
  /* from symtab.c: */
  
@@ -14268,11 +16317,19 @@ index 800ffd8..3ed6947 100644
  /* lookup partial symbol table by filename */
  
  extern struct partial_symtab *lookup_partial_symtab (const char *);
+@@ -1367,7 +1366,6 @@ extern /*const */ char *main_name (void);
+ /* Check global symbols in objfile.  */
+ struct symbol *lookup_global_symbol_from_objfile (const struct objfile *objfile,
+ 						  const char *name,
+-						  const char *linkage_name,
+ 						  const domain_enum domain);
+ 
+ extern struct symtabs_and_lines
 diff --git a/gdb/target.c b/gdb/target.c
-index edf8697..a7ed206 100644
+index e6659c9..eabd9fc 100644
 --- a/gdb/target.c
 +++ b/gdb/target.c
-@@ -124,6 +124,8 @@ static int debug_to_insert_watchpoint (CORE_ADDR, int, int);
+@@ -120,6 +120,8 @@ static int debug_to_insert_watchpoint (CORE_ADDR, int, int);
  
  static int debug_to_remove_watchpoint (CORE_ADDR, int, int);
  
@@ -14281,7 +16338,7 @@ index edf8697..a7ed206 100644
  static int debug_to_stopped_by_watchpoint (void);
  
  static int debug_to_stopped_data_address (struct target_ops *, CORE_ADDR *);
-@@ -624,6 +626,7 @@ update_current_target (void)
+@@ -583,6 +585,7 @@ update_current_target (void)
        INHERIT (to_remove_hw_breakpoint, t);
        INHERIT (to_insert_watchpoint, t);
        INHERIT (to_remove_watchpoint, t);
@@ -14289,7 +16346,7 @@ index edf8697..a7ed206 100644
        INHERIT (to_stopped_data_address, t);
        INHERIT (to_have_steppable_watchpoint, t);
        INHERIT (to_have_continuable_watchpoint, t);
-@@ -747,6 +750,9 @@ update_current_target (void)
+@@ -710,6 +713,9 @@ update_current_target (void)
    de_fault (to_remove_watchpoint,
  	    (int (*) (CORE_ADDR, int, int))
  	    return_minus_one);
@@ -14299,7 +16356,7 @@ index edf8697..a7ed206 100644
    de_fault (to_stopped_by_watchpoint,
  	    (int (*) (void))
  	    return_zero);
-@@ -3302,6 +3308,19 @@ debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type)
+@@ -3277,6 +3283,19 @@ debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type)
    return retval;
  }
  
@@ -14319,7 +16376,7 @@ index edf8697..a7ed206 100644
  static void
  debug_to_terminal_init (void)
  {
-@@ -3549,6 +3568,7 @@ setup_target_debug (void)
+@@ -3524,6 +3543,7 @@ setup_target_debug (void)
    current_target.to_remove_hw_breakpoint = debug_to_remove_hw_breakpoint;
    current_target.to_insert_watchpoint = debug_to_insert_watchpoint;
    current_target.to_remove_watchpoint = debug_to_remove_watchpoint;
@@ -14328,10 +16385,10 @@ index edf8697..a7ed206 100644
    current_target.to_stopped_data_address = debug_to_stopped_data_address;
    current_target.to_watchpoint_addr_within_range = debug_to_watchpoint_addr_within_range;
 diff --git a/gdb/target.h b/gdb/target.h
-index a020bf7..2c5e58e 100644
+index 7103ab2..741b2e5 100644
 --- a/gdb/target.h
 +++ b/gdb/target.h
-@@ -419,6 +419,7 @@ struct target_ops
+@@ -422,6 +422,7 @@ struct target_ops
      int (*to_remove_hw_breakpoint) (struct gdbarch *, struct bp_target_info *);
      int (*to_remove_watchpoint) (CORE_ADDR, int, int);
      int (*to_insert_watchpoint) (CORE_ADDR, int, int);
@@ -14339,7 +16396,7 @@ index a020bf7..2c5e58e 100644
      int (*to_stopped_by_watchpoint) (void);
      int to_have_steppable_watchpoint;
      int to_have_continuable_watchpoint;
-@@ -1262,6 +1263,15 @@ extern char *normal_pid_to_str (ptid_t ptid);
+@@ -1274,6 +1275,15 @@ extern char *normal_pid_to_str (ptid_t ptid);
  #define	target_remove_watchpoint(addr, len, type)	\
       (*current_target.to_remove_watchpoint) (addr, len, type)
  
@@ -14355,7 +16412,7 @@ index a020bf7..2c5e58e 100644
  #define target_insert_hw_breakpoint(gdbarch, bp_tgt) \
       (*current_target.to_insert_hw_breakpoint) (gdbarch, bp_tgt)
  
-@@ -1302,6 +1312,20 @@ extern int target_search_memory (CORE_ADDR start_addr,
+@@ -1314,6 +1324,20 @@ extern int target_search_memory (CORE_ADDR start_addr,
                                   ULONGEST pattern_len,
                                   CORE_ADDR *found_addrp);
  
@@ -15576,19 +17633,6 @@ index 0ef6c4b..330ed87 100644
 +	unsupported "$test (no GCC)"
 +    }
 +}
-diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp
-index d71641b..dbe86eb 100644
---- a/gdb/testsuite/gdb.base/help.exp
-+++ b/gdb/testsuite/gdb.base/help.exp
-@@ -606,7 +606,7 @@ gdb_test "help stepi" "Step one instruction exactly\.\[\r\n\]+Argument N means d
- gdb_test "help signal" "Continue program giving it signal.*" "help signal"
- # test help source
- # vxgdb reads .vxgdbinit
--gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\." "help source"
-+gdb_test "help source" "Read commands from a file named FILE\.\[\r\n\]+Optional -v switch \\(before the filename\\) causes each command in\[\r\n\]+FILE to be echoed as it is executed\.\[\r\n\]+Note that the file \"\[^\"\]*\" is read automatically in this way\[\r\n\]+when GDB is started\.\[\r\n\]+Optional -p switch \\(before the filename\\) causes FILE to be evaluated\[\r\n\]+as Python code\." "help source"
- # test help stack
- test_class_help "stack" {
-     "Examining the stack\..*\[\r\n\]+"
 diff --git a/gdb/testsuite/gdb.base/internal-var-field-address.c b/gdb/testsuite/gdb.base/internal-var-field-address.c
 new file mode 100644
 index 0000000..eeb7b85
@@ -15647,24 +17691,6 @@ index 0000000..6d82e73
 +
 +gdb_test {set $varstruct = staticstruct}
 +gdb_test {p $varstruct.field} " = 1"
-diff --git a/gdb/testsuite/gdb.base/radix.exp b/gdb/testsuite/gdb.base/radix.exp
-index 9fd6cb5..93aa142 100644
---- a/gdb/testsuite/gdb.base/radix.exp
-+++ b/gdb/testsuite/gdb.base/radix.exp
-@@ -163,13 +163,6 @@ gdb_test "set radix" \
-     "Input and output radices now set to decimal 10, hex a, octal 12\." \
-     "Reset radices"
- 
--gdb_test "set input-radix 0" \
--    "Nonsense input radix ``decimal 0''; input radix unchanged\\." \
--    "Reject input-radix 0"
--gdb_test "show input-radix" \
--    "Default input radix for entering numbers is 10\\." \
--    "Input radix unchanged after rejecting 0"
--
- gdb_test "set input-radix 1" \
-     "Nonsense input radix ``decimal 1''; input radix unchanged\\." \
-     "Reject input-radix 1"
 diff --git a/gdb/testsuite/gdb.base/vla-overflow.c b/gdb/testsuite/gdb.base/vla-overflow.c
 new file mode 100644
 index 0000000..c5d5ee0
@@ -15957,6 +17983,364 @@ index c990a64..c964db9 100644
  
  all info install-info dvi install uninstall installcheck check:
  	@echo "Nothing to be done for $@..."
+diff --git a/gdb/testsuite/gdb.cp/cp-relocate.exp b/gdb/testsuite/gdb.cp/cp-relocate.exp
+index f81a212..30d362a 100644
+--- a/gdb/testsuite/gdb.cp/cp-relocate.exp
++++ b/gdb/testsuite/gdb.cp/cp-relocate.exp
+@@ -30,7 +30,7 @@ proc get_func_address { func } {
+     global gdb_prompt hex
+ 
+     set rfunc [string_to_regexp $func]
+-    gdb_test_multiple "print '${func}'" "get address of ${func}" {
++    gdb_test_multiple "print ${func}" "get address of ${func}" {
+ 	-re "\\\$\[0-9\]+ = \\{.*\\} (0|($hex) <${rfunc}>)\[\r\n\]+${gdb_prompt} $" {
+ 	    # $1 = {int ()} 0x24 <function_bar>
+ 	    # But if the function is at zero, the name may be omitted.
+@@ -130,7 +130,7 @@ gdb_test "add-symbol-file ${binfile} 0 -s ${func1_sec} 0x10000 -s ${func2_sec} 0
+ 	"y"
+ 
+ # Make sure the function addresses were updated.
+-gdb_test "break *'$func1_name'" \
++gdb_test "break *$func1_name" \
+     "Breakpoint $decimal at 0x1....: file .*"
+-gdb_test "break *'$func2_name'" \
++gdb_test "break *$func2_name" \
+     "Breakpoint $decimal at 0x2....: file .*"
+diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.cc b/gdb/testsuite/gdb.cp/cplusfuncs.cc
+index f4f78a6..11dba06 100644
+--- a/gdb/testsuite/gdb.cp/cplusfuncs.cc
++++ b/gdb/testsuite/gdb.cp/cplusfuncs.cc
+@@ -195,6 +195,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 f322586..443af7a 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		"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*($dm_type_void)\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)"
++	}
++    }
+ }
+ 
+ #
+@@ -351,8 +492,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
+@@ -410,8 +552,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);"
+ 
+ }
+ 
+@@ -426,6 +568,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)"
+@@ -479,7 +622,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)"
+ }
+ 
+ #
+@@ -489,17 +632,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)"
+ 
+@@ -522,17 +669,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/ctti.exp b/gdb/testsuite/gdb.cp/ctti.exp
+index 454c6f4..8f88ad7 100644
+--- a/gdb/testsuite/gdb.cp/ctti.exp
++++ b/gdb/testsuite/gdb.cp/ctti.exp
+@@ -85,11 +85,6 @@ gdb_test "print c" "\\$\[0-9\]+ = 194 .*"
+ gdb_test "print f" "\\$\[0-9\]+ = 9"
+ gdb_test "print i" "\\$\[0-9\]+ = 4"
+ 
+-# TODO: this needs more work before actually deploying it.
+-# So bail out here.
+-
+-if { [ test_compiler_info gcc-*] } then { continue }
+-
+ gdb_test_multiple "print add<int>(2,2)" "print add<int>(2,2)" {
+     -re "\\$\[0-9\]+ = 4\r\n$gdb_prompt $" {
+ 	pass "print add<int>(2,2)"
+diff --git a/gdb/testsuite/gdb.cp/expand-sals.exp b/gdb/testsuite/gdb.cp/expand-sals.exp
+index 25ec4a9..e4fd59b 100644
+--- a/gdb/testsuite/gdb.cp/expand-sals.exp
++++ b/gdb/testsuite/gdb.cp/expand-sals.exp
+@@ -46,7 +46,7 @@ gdb_continue_to_breakpoint "caller" ".*caller-line.*"
+ 
+ # Test GDB caught this return call and not the next one through B::B()
+ gdb_test "bt" \
+-	 "#0 \[^\r\n\]* A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \
++	 "#0 \[^\r\n\]* (A::)?A \[^\r\n\]*\r\n#1 \[^\r\n\]* main \[^\r\n\]*" \
+ 	 "bt from A"
+ 
+ gdb_continue_to_breakpoint "next caller func" ".*func-line.*"
 diff --git a/gdb/testsuite/gdb.cp/gdb9593.cc b/gdb/testsuite/gdb.cp/gdb9593.cc
 new file mode 100644
 index 0000000..783c962
@@ -16315,25 +18699,2844 @@ index 0000000..ee9aeff
 +  ".*next_cases.until ().*" \
 +  "next past catch 6"
 +
-+gdb_test "step" \
-+  ".*function1 ().*" \
-+  "step into until"
++gdb_test "step" \
++  ".*function1 ().*" \
++  "step into until"
++
++gdb_test "until $line" \
++  ".*catch (...).*" \
++  "until-over-throw"
++
++gdb_test "next" \
++  ".*next_cases.until ().*" \
++  "next past catch 7"
++
++gdb_test "step" \
++  ".*function1 ().*" \
++  "step into until, for advance"
++
++gdb_test "advance $line" \
++  ".*catch (...).*" \
++  "advance-over-throw"
+diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc
+index ffffb4c..b406a59 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 6832f3b..baf08d7 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
+ # ==========================
+@@ -420,7 +447,7 @@ gdb_test_multiple "ptype pmf" $name {
+ 
+ set name "print pmf"
+ gdb_test_multiple "print pmf" $name {
+-    -re "$vhn = $hex <A::bar\\(int\\)>\r\n$gdb_prompt $" {
++    -re "$vhn = \\(int \\(A::\\*\\)\\(A \\*, int\\)\\) $hex <A::bar\\(int\\)>\r\n$gdb_prompt $" {
+ 	pass $name
+     }
+     -re "$vhn = .*not supported with HP aCC.*\r\n$gdb_prompt $" {
+@@ -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"
+@@ -658,5 +688,5 @@ gdb_test "print null_pmi = &A::j" "$vhn = &A::j"
+ gdb_test "print null_pmi = 0" "$vhn = NULL"
+ 
+ gdb_test "print null_pmf" "$vhn = NULL"
+-gdb_test "print null_pmf = &A::foo" "$vhn = $hex <A::foo ?\\(int\\)>"
++gdb_test "print null_pmf = &A::foo" "$vhn = \\(int \\(A::\\*\\)\\(A \\*, int\\)\\) $hex <A::foo ?\\(int\\)>"
+ gdb_test "print null_pmf = 0" "$vhn = NULL"
+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-nested-imports.cc b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc
+new file mode 100644
+index 0000000..9723f87
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-nested-imports.cc
+@@ -0,0 +1,36 @@
++namespace A
++{
++  namespace B
++  {
++    int ab = 11;
++  }
++}
++
++namespace C
++{
++  namespace D
++  {
++    using namespace A::B;
++
++    int
++    second()
++    {
++      ab;
++      return 0;
++    }
++  }
++
++  int
++  first()
++  {
++    //ab;
++    return D::second();
++  }
++}
++
++int
++main()
++{
++  //ab;
++  return C::first();
++}
+diff --git a/gdb/testsuite/gdb.cp/namespace-nested-imports.exp b/gdb/testsuite/gdb.cp/namespace-nested-imports.exp
+new file mode 100644
+index 0000000..d279fb5
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-nested-imports.exp
+@@ -0,0 +1,57 @@
++# 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-nested-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}
++
++############################################
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_test "print ab" "No symbol .* in current context."
++
++############################################
++gdb_breakpoint C::first
++gdb_continue_to_breakpoint "C::first"
++
++gdb_test "print ab" "No symbol .* in current context."
++gdb_test "print C::D::ab" "= 11"
++
++############################################
++gdb_breakpoint C::D::second
++gdb_continue_to_breakpoint "C::D::second"
++
++gdb_test "print ab" "= 11"
+diff --git a/gdb/testsuite/gdb.cp/namespace-no-imports.cc b/gdb/testsuite/gdb.cp/namespace-no-imports.cc
+new file mode 100644
+index 0000000..d1c68ab
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-no-imports.cc
+@@ -0,0 +1,37 @@
++
++namespace A
++{
++  int _a = 11;
++
++  namespace B{
++
++    int ab = 22;
++
++    namespace C{
++
++      int abc = 33;
++
++      int second(){
++        return 0;
++      }
++
++    }
++
++    int first(){
++      _a;
++      ab;
++      C::abc;
++      return C::second();
++    }
++  }
++}
++
++
++int
++main()
++{
++  A::_a;
++  A::B::ab;
++  A::B::C::abc;
++  return A::B::first();
++}
+diff --git a/gdb/testsuite/gdb.cp/namespace-no-imports.exp b/gdb/testsuite/gdb.cp/namespace-no-imports.exp
+new file mode 100644
+index 0000000..e508103
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-no-imports.exp
+@@ -0,0 +1,76 @@
++# 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-no-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}
++
++############################################
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++gdb_test "print A::_a" "= 11"
++gdb_test "print A::B::ab" "= 22"
++gdb_test "print A::B::C::abc" "= 33"
++
++gdb_test "print _a" "No symbol .* in current context."
++gdb_test "print ab" "No symbol .* in current context."
++gdb_test "print abc" "No symbol .* in current context."
++
++############################################
++gdb_breakpoint A::B::first
++gdb_continue_to_breakpoint "A::B::first"
++
++gdb_test "print A::_a" "= 11"
++gdb_test "print A::B::ab" "= 22"
++gdb_test "print A::B::C::abc" "= 33"
++
++gdb_test "print _a" "= 11"
++gdb_test "print ab" "= 22"
++gdb_test "print C::abc" "= 33"
++
++gdb_test "print abc" "No symbol .* in current context."
++
++############################################
++gdb_breakpoint A::B::C::second
++gdb_continue_to_breakpoint "A::B::C::second"
++
++gdb_test "print A::_a" "= 11"
++gdb_test "print A::B::ab" "= 22"
++gdb_test "print A::B::C::abc" "= 33"
++
++gdb_test "print _a" "= 11"
++gdb_test "print ab" "= 22"
++gdb_test "print abc" "= 33"
+diff --git a/gdb/testsuite/gdb.cp/namespace-recursive.cc b/gdb/testsuite/gdb.cp/namespace-recursive.cc
+new file mode 100644
+index 0000000..46d4c18
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-recursive.cc
+@@ -0,0 +1,47 @@
++namespace A{
++  int ax = 9;
++}
++
++namespace B{
++  using namespace A;
++}
++
++namespace C{
++  using namespace B;
++}
++
++using namespace C;
++
++//---------------
++namespace D{
++  using namespace D;
++  int dx = 99;
++}
++using namespace D;
++
++//---------------
++namespace{
++  namespace{
++    int xx = 999;
++  }
++}
++
++//---------------
++namespace E{
++  int ex = 9999;
++}
++
++namespace F{
++  namespace FE = E;
++}
++
++namespace G{
++  namespace GF = F;
++}
++
++//----------------
++int main(){
++  using namespace D;
++  namespace GX = G;
++  return ax + dx + xx + G::GF::FE::ex;
++}
+diff --git a/gdb/testsuite/gdb.cp/namespace-recursive.exp b/gdb/testsuite/gdb.cp/namespace-recursive.exp
+new file mode 100644
+index 0000000..5543757
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-recursive.exp
+@@ -0,0 +1,75 @@
++# 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-recursive
++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
++}
++
++if [get_compiler_info ${binfile}] {
++    return -1;
++}
++
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++############################################
++# test printing from namespace imported into
++# imported namespace
++
++gdb_test "print ax" "= 9"
++
++############################################
++# test that gdb can print without falling 
++# into search loop
++
++gdb_test "print dx" "= 99"
++
++############################################
++# test printing from namespace imported into
++# imported namespace where imports are implicit
++# anonymous namespace imports.
++
++gdb_test "print xx" "= 999"
++
++############################################
++# Test printing using recursive namespace
++# aliases.
++
++setup_kfail "gdb/10541" "*-*-*"
++gdb_test "ptype G::GF" "= namespace F"
++
++setup_kfail "gdb/10541" "*-*-*"
++gdb_test "print G::GF::FE::ex" "= 9999"
+diff --git a/gdb/testsuite/gdb.cp/namespace-stress-declarations.cc b/gdb/testsuite/gdb.cp/namespace-stress-declarations.cc
+new file mode 100644
+index 0000000..173e49b
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-stress-declarations.cc
+@@ -0,0 +1,93 @@
++int a;
++int b;
++int c;
++int d;
++int e;
++int f;
++int g;
++int h;
++int i;
++int j;
++int k;
++int l;
++int m;
++int n;
++int o;
++int p;
++int q;
++int r;
++int s;
++int t;
++int u;
++int v;
++int w;
++int x;
++int y;
++int z;
++
++namespace A
++{
++  int xyz;
++
++  using ::a;
++  using ::b;
++  using ::c;
++  using ::d;
++  using ::e;
++  using ::f;
++  using ::g;
++  using ::h;
++  using ::i;
++  using ::j;
++  using ::k;
++  using ::l;
++  using ::m;
++  using ::n;
++  using ::o;
++  using ::p;
++  using ::q;
++  using ::r;
++  using ::s;
++  using ::t;
++  using ::u;
++  using ::v;
++  using ::w;
++  using ::x;
++  using ::y;
++  using ::z;
++
++}
++
++using A::a;
++using A::b;
++using A::c;
++using A::d;
++using A::e;
++using A::f;
++using A::g;
++using A::h;
++using A::i;
++using A::j;
++using A::k;
++using A::l;
++using A::m;
++using A::n;
++using A::o;
++using A::p;
++using A::q;
++using A::r;
++using A::s;
++using A::t;
++using A::u;
++using A::v;
++using A::w;
++using A::x;
++using A::y;
++using A::z;
++
++using namespace A;
++
++int main ()
++{
++  return 0;
++}
+\ No newline at end of file
+diff --git a/gdb/testsuite/gdb.cp/namespace-stress-declarations.exp b/gdb/testsuite/gdb.cp/namespace-stress-declarations.exp
+new file mode 100644
+index 0000000..f22a14e
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-stress-declarations.exp
+@@ -0,0 +1,50 @@
++# 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-stress-declarations
++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
++}
++
++if [get_compiler_info ${binfile}] {
++    return -1;
++}
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++############################################
++# Test that the search can fail efficiently 
++
++gdb_test "print fakex" "No symbol \"fakex\" in current context."
+diff --git a/gdb/testsuite/gdb.cp/namespace-stress.cc b/gdb/testsuite/gdb.cp/namespace-stress.cc
+new file mode 100644
+index 0000000..f34083e
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-stress.cc
+@@ -0,0 +1,60 @@
++
++namespace A{ int x; }
++namespace B{ int x; }
++namespace C{ int x; }
++namespace D{ int x; }
++namespace E{ int x; }
++namespace F{ int x; }
++namespace G{ int x; }
++namespace H{ int x; }
++namespace I{ int x; }
++namespace J{ int x; }
++namespace K{ int x; }
++namespace L{ int x; }
++namespace M{ int x; }
++namespace N{ int x; }
++namespace O{ int x; }
++namespace P{ int x; }
++namespace Q{ int x; }
++namespace R{ int x; }
++namespace S{ int x; }
++namespace T{ int x; }
++namespace U{ int x; }
++namespace V{ int x; }
++namespace W{ int x; }
++namespace X{ int x; }
++namespace Y{ int x; }
++namespace Z{ int x; }
++
++
++int main(){
++
++  using namespace A;
++  using namespace B;
++  using namespace C;
++  using namespace D;
++  using namespace E;
++  using namespace F;
++  using namespace G;
++  using namespace H;
++  using namespace I;
++  using namespace J;
++  using namespace K;
++  using namespace L;
++  using namespace M;
++  using namespace N;
++  using namespace O;
++  using namespace P;
++  using namespace Q;
++  using namespace R;
++  using namespace S;
++  using namespace T;
++  using namespace U;
++  using namespace V;
++  using namespace W;
++  using namespace X;
++  using namespace Y;
++  using namespace Z;
++
++  return 0;
++}
+\ No newline at end of file
+diff --git a/gdb/testsuite/gdb.cp/namespace-stress.exp b/gdb/testsuite/gdb.cp/namespace-stress.exp
+new file mode 100644
+index 0000000..1806523
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/namespace-stress.exp
+@@ -0,0 +1,50 @@
++# 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-stress
++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
++}
++
++if [get_compiler_info ${binfile}] {
++    return -1;
++}
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++############################################
++# Test that the search can fail efficiently 
++
++gdb_test "print y" "No symbol \"y\" in current context."
+diff --git a/gdb/testsuite/gdb.cp/namespace-using.cc b/gdb/testsuite/gdb.cp/namespace-using.cc
+index 4786fd5..8ff5622 100644
+--- a/gdb/testsuite/gdb.cp/namespace-using.cc
++++ b/gdb/testsuite/gdb.cp/namespace-using.cc
+@@ -1,26 +1,129 @@
++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;
+ }
+ 
+-int marker4(){
+-	using A::x;
+-	return 0;
++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
++marker3 ()
++{
++  return marker4 ();
+ }
+ 
+-int marker2()
++int
++marker2 ()
+ {
+   namespace B = A;
+   B::_a;
+-  return marker3();
++  return marker3 ();
+ }
+ 
+-int marker1()
++int
++marker1 ()
+ {
+   int total = 0;
+   {
+@@ -29,17 +132,18 @@ int marker1()
+       using namespace A;
+       int c = 2;
+       {
+-        int d = 3;
+-        total = _a + b + c + d + marker2(); // marker1 stop
++	int d = 3;
++	total = _a + b + c + d + marker2 (); // marker1 stop
+       }
+     }
+   }
+   return total;
+ }
+ 
+-int main()
++int
++main ()
+ {
+   using namespace A;
+   _a;
+-  return marker1();
++  return marker1 ();
+ }
+diff --git a/gdb/testsuite/gdb.cp/namespace-using.exp b/gdb/testsuite/gdb.cp/namespace-using.exp
+index 319552b..0673088 100644
+--- a/gdb/testsuite/gdb.cp/namespace-using.exp
++++ b/gdb/testsuite/gdb.cp/namespace-using.exp
+@@ -28,6 +28,11 @@ if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb
+     return -1
+ }
+ 
++if [get_compiler_info ${binfile}] {
++    return -1;
++}
++
++
+ # Get things started.
+ 
+ gdb_exit
+@@ -46,42 +51,155 @@ if ![runto_main] then {
+ 
+ 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
+ 
+-setup_kfail "gdb/7935" "*-*-*"
+ if ![runto marker2] then {
+     perror "couldn't run to breakpoint marker2"
+     continue
+ }
+ 
+-gdb_test "print B::a" "= 1"
++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 that names are not printed when they 
+ # are not imported
+ 
+-gdb_breakpoint "marker3"
+-gdb_continue_to_breakpoint "marker3"
++if {![runto marker3]} {
++    perror "couldn't run to breakpoint marker3"
++}
+ 
+-gdb_test "print _a" "No symbol \"_a\" in current context." "Print a without import"
++# gcc-4-3 puts import statements for aliases in
++# the global scope instead of the corresponding
++# function scope. These wrong import statements throw
++# this test off. This is fixed in gcc-4-4.
++if [test_compiler_info gcc-4-3-*] then { setup_xfail *-*-* }
++
++gdb_test "print _a" "No symbol \"_a\" in current context." "Print _a without import"
+ 
+ ############################################
+ # Test printing of individually imported elements
+ 
+-setup_kfail "gdb/7936" "*-*-*"
+ if ![runto marker4] then {
+     perror "couldn't run to breakpoint marker4"
+     continue
+ }
+ 
+-gdb_test "print x" "= 2"
++gdb_test "print dx" "= 4"
++
++############################################
++# Test printing of namespace aliases
++
++if ![runto marker5] then {
++    perror "couldn't run to marker5"
++    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"
++
++# Assert that M::x is printed and not N::x
++gdb_test "print x" "= 911" "print x (from M::x)"
++
+diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp
+index 4362fd8..f7cfd57 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
+@@ -241,11 +242,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\"."
+@@ -255,8 +261,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 1bfa0f3..9fd31a8 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 5b06b31..3e47c77 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/realcpp.cc b/gdb/testsuite/gdb.cp/realcpp.cc
+new file mode 100644
+index 0000000..8e4f72a
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/realcpp.cc
+@@ -0,0 +1,409 @@
++#include <stdlib.h>
++#include <iostream>
++
++// Forward decls
++class base;
++class derived;
++
++// A simple template with specializations
++template <typename T>
++class tclass
++{
++public:
++  void do_something () { } // tclass<T>::do_something
++};
++
++template <>
++void tclass<char>::do_something () { } // tclass<char>::do_something
++
++template <>
++void tclass<int>::do_something () { } // tclass<int>::do_something
++
++template<>
++void tclass<long>::do_something () { } // tclass<long>::do_something
++
++template<>
++void tclass<short>::do_something () { } // tclass<short>::do_something
++
++// A simple template with multiple template parameters
++template <class A, class B, class C, class D, class E>
++void flubber (void) // flubber
++{
++  A a;
++  B b;
++  C c;
++  D d;
++  E e;
++
++  ++a;
++  ++b;
++  ++c;
++  ++d;
++  ++e;
++}
++
++// Some contrived policies
++template <class T>
++struct operation_1
++{
++  static void function (void) { } // operation_1<T>::function
++};
++
++template <class T>
++struct operation_2
++{
++  static void function (void) { } // operation_2<T>::function
++};
++
++template <class T>
++struct operation_3
++{
++  static void function (void) { } // operation_3<T>::function
++};
++
++template <class T>
++struct operation_4
++{
++  static void function (void) { } // operation_4<T>::function
++};
++
++// A policy-based class w/ and w/o default policy
++template <class T, class Policy>
++class policy : public Policy
++{
++public:
++  policy (T obj) : obj_ (obj) { } // policy<T, Policy>::policy
++
++private:
++  T obj_;
++};
++
++template <class T, class Policy = operation_1<T> >
++class policyd : public Policy
++{
++public:
++  policyd (T obj) : obj_ (obj) { } // policyd<T, Policy>::policyd
++  ~policyd (void) { } // policyd<T, Policy>::~policyd
++
++private:
++  T obj_;
++};
++
++typedef policy<int, operation_1<void*> > policy1;
++typedef policy<int, operation_2<void*> > policy2;
++typedef policy<int, operation_3<void*> > policy3;
++typedef policy<int, operation_4<void*> > policy4;
++
++typedef policyd<int> policyd1;
++typedef policyd<long> policyd2;
++typedef policyd<char> policyd3;
++typedef policyd<base> policyd4;
++typedef policyd<tclass<int> > policyd5;
++
++class fluff { };
++static fluff *g_fluff = new fluff ();
++
++class base
++{
++protected:
++  int foo_;
++
++public:
++  base (void) : foo_ (42) { } // base::base(void)
++  base (int foo) : foo_ (foo) { } // base::base(int)
++  ~base (void) { } // base::~base
++
++  // Some overloaded methods
++  int overload (void) const { return 0; } // base::overload(void) const
++  int overload (int i) const { return 1; } // base::overload(int) const
++  int overload (short s) const { return 2; } // base::overload(short) const
++  int overload (long l) const { return 3; } // base::overload(long) const
++  int overload (char* a) const { return 4; } // base::overload(char*) const
++  int overload (base& b) const { return 5; } // base::overload(base&) const
++
++  // Operators
++  int operator+ (base const& o) const // base::operator+
++  { return foo_ + o.foo_; }
++
++  base operator++ (void) // base::operator++
++  { ++foo_; return *this; }
++
++  base operator+=(base const& o) // base::operator+=
++  { foo_ += o.foo_; return *this; }
++
++  int operator- (base const& o) const // base::operator-
++  { return foo_ - o.foo_; }
++
++  base operator-- (void) // base::operator--
++  { --foo_; return *this; }
++
++  base operator-= (base const& o) // base::operator-=
++  { foo_ -= o.foo_; return *this; }
++
++  int operator* (base const& o) const // base::operator*
++  { return foo_ * o.foo_; }
++
++  base operator*= (base const& o) // base::operator*=
++  { foo_ *= o.foo_; return *this; }
++
++  int operator/ (base const& o) const // base::operator/
++  { return foo_ / o.foo_; }
++
++  base operator/= (base const& o) // base::operator/=
++  { foo_ /= o.foo_; return *this; }
++
++  int operator% (base const& o) const // base::operator%
++  { return foo_ % o.foo_; }
++  
++  base operator%= (base const& o) // base::operator%=
++  { foo_ %= o.foo_; return *this; }
++
++  bool operator< (base const& o) const // base::operator<
++  { return foo_ < o.foo_; }
++
++  bool operator<= (base const& o) const // base::operator<=
++  { return foo_ <= o.foo_; }
++
++  bool operator> (base const& o) const // base::operator>
++  { return foo_ > o.foo_; }
++
++  bool operator>= (base const& o) const // base::operator>=
++  { return foo_ >= o.foo_; }
++
++  bool operator!= (base const& o) const // base::operator!=
++  { return foo_ != o.foo_; }
++
++  bool operator== (base const& o) const // base::operator==
++  { return foo_ == o.foo_; }
++
++  bool operator! (void) const // base::operator!
++  { return !foo_; }
++
++  bool operator&& (base const& o) const // base::operator&&
++  { return foo_ && o.foo_; }
++
++  bool operator|| (base const& o) const // base::operator||
++  { return foo_ || o.foo_; }
++
++  int operator<< (int value) const // base::operator<<
++  { return foo_  << value; }
++
++  base operator<<= (int value) // base::operator<<=
++  { foo_ <<= value; return *this; }
++
++  int operator>> (int value) const // base::operator>>
++  { return foo_  >> value; }
++
++  base operator>>= (int value) // base::operator>>=
++  { foo_ >>= value; return *this; }
++
++  int operator~ (void) const // base::operator~
++  { return ~foo_; }
++
++  int operator& (base const& o) const // base::operator&
++  { return foo_ & o.foo_; }
++
++  base operator&= (base const& o) // base::operator&=
++  { foo_ &= o.foo_; return *this; }
++
++  int operator| (base const& o) const // base::operator|
++  { return foo_ | o.foo_; }
++
++  base operator|= (base const& o) // base::operator|=
++  { foo_ |= o.foo_; return *this; }
++  
++  int operator^ (base const& o) const // base::operator^
++  { return foo_ ^ o.foo_; }
++
++  base operator^= (base const& o) // base::operator^=
++  { foo_ ^= o.foo_; return *this; }
++
++  base operator= (base const& o) // base::operator=
++  { foo_ = o.foo_; return *this; }
++
++  void operator() (void) const // base::operator()
++  { return; }
++
++  int operator[] (int idx) const // base::operator[]
++  { return idx; }
++
++  void* operator new (size_t size) throw () // base::operator new
++  { return malloc (size); }
++
++  void operator delete (void* ptr) // base::operator delete
++  { free (ptr); }
++
++  void* operator new[] (size_t size) throw () // base::operator new[]
++  { return malloc (size); }
++
++  void operator delete[] (void* ptr) // base::operator delete[]
++  { free (ptr); }
++
++  base const* operator-> (void) const // base::opeartor->
++  { return this; }
++
++  int operator->* (base const& b) const // base::operator->*
++  {  return foo_ * b.foo_; }
++
++  operator char* () const { return const_cast<char*> ("hello"); } // base::operator char*
++  operator int () const { return 21; } // base::operator int
++  operator fluff* () const { return new fluff (); } // base::operator fluff*
++  operator fluff** () const { return &g_fluff; } // base::operator fluff**
++};
++
++class base1 : public virtual base
++{
++public:
++  base1 (void) : foo_ (21) { } // base1::base1(void)
++  base1 (int a) : foo_(a) { } // base1::base1(int)
++  void a_function (void) const { } // base1::a_function
++
++protected:
++  int foo_;
++};
++
++class base2 : public virtual base
++{
++public:
++  base2 () : foo_ (3) { } // base2::base2
++
++protected:
++  void a_function (void) const { } // base2::a_function
++  int foo_;
++};
++
++class derived : public base1, public base2
++{
++  public:
++  derived(void) : foo_ (4) { } // derived::derived
++  void a_function (void) const // derived::a_function
++  { 
++    this->base1::a_function ();
++    this->base2::a_function ();
++  }
++
++  protected:
++  int foo_;
++};
++
++int
++main (int argc, char* argv[]) // main
++{ // main
++  derived d;
++  void (derived::*pfunc) (void) const = &derived::a_function;
++  (d.*pfunc) ();
++
++  base a (1), b (3), c (8);
++  (void) a.overload ();
++  (void) a.overload (static_cast<int> (0));
++  (void) a.overload (static_cast<short> (0));
++  (void) a.overload (static_cast<long> (0));
++  (void) a.overload (static_cast<char*> (0));
++  (void) a.overload (a);
++
++  int r;
++  r = b + c;
++  ++a;
++  a += b;
++  r = b - c;
++  --a;
++  a -= b;
++  r = b * c;
++  a *= b;
++  r = b / c;
++  a /= b;
++  r = b % c;
++  a %= b;
++  bool x = (b < c);
++  x = (b <= c);
++  x = (b > c);
++  x = (b >= c);
++  x = (b != c);
++  x = (b == c);
++  x = (!b);
++  x = (b && c);
++  x = (b || c);
++  r = b << 2;
++  a <<= 1;
++  r = b >> 2;
++  a >>= 1;
++  r = ~b;
++  r = b & c;
++  a &= c;
++  r = b | c;
++  a |= c;
++  r = b ^ c;
++  a ^= c;
++  a = c;
++  a ();
++  int i = a[3];
++  derived* f = new derived ();
++  derived* g = new derived[3];
++  delete f;
++  delete[] g;
++  a->overload ();
++  r = a->*b;
++
++  tclass<char> char_tclass;
++  tclass<int> int_tclass;
++  tclass<short> short_tclass;
++  tclass<long> long_tclass;
++  tclass<base> base_tclass;
++  char_tclass.do_something ();
++  int_tclass.do_something ();
++  short_tclass.do_something ();
++  long_tclass.do_something ();
++  base_tclass.do_something ();
++
++  flubber<int, int, int, int, int> ();
++  flubber<int, int, int, int, short> ();
++  flubber<int, int, int, int, long> ();
++  flubber<int, int, int, int, char> ();
++  flubber<int, int, int, short, int> ();
++  flubber<int, int, int, short, short> ();
++  flubber<int, int, int, short, long> ();
++  flubber<int, int, int, short, char> ();
++  flubber<int, int, int, long, int> ();
++  flubber<int, int, int, long, short> ();
++  flubber<int, int, int, long, long> ();
++  flubber<int, int, int, long, char> ();
++  flubber<int, int, int, char, int> ();
++  flubber<int, int, int, char, short> ();
++  flubber<int, int, int, char, long> ();
++  flubber<int, int, int, char, char> ();
++  flubber<int, int, short, int, int> ();
++  flubber<int, int, short, int, short> ();
++  flubber<int, int, short, int, long> ();
++  flubber<int, int, short, int, char> ();
++  flubber<int, int, short, short, int> ();
++  flubber<short, int, short, int, short> ();
++  flubber<long, short, long, short, long> ();
++
++  policy1 p1 (1);
++  p1.function ();
++  policy2 p2 (2);
++  p2.function ();
++  policy3 p3 (3);
++  p3.function ();
++  policy4 p4 (4);
++  p4.function ();
++
++  policyd1 pd1 (5);
++  pd1.function ();
++  policyd2 pd2 (6);
++  pd2.function ();
++  policyd3 pd3 (7);
++  pd3.function ();
++  policyd4 pd4 (d);
++  pd4.function ();
++  policyd5 pd5 (int_tclass);
++  pd5.function ();
++
++  base1 b1 (3);
++
++  r = a;
++  char* str = a;
++  fluff* flp = a;
++  fluff** flpp = a;
++}
++
+diff --git a/gdb/testsuite/gdb.cp/realcpp.exp b/gdb/testsuite/gdb.cp/realcpp.exp
+new file mode 100644
+index 0000000..4e92e75
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/realcpp.exp
+@@ -0,0 +1,891 @@
++# 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/>.
++
++# This file is part of the gdb testsuite.
++
++###
++#
++# SOME IMPORTANT NOTES
++#
++###
++
++# The "info func" tests here aren't complete. I've commented them
++# out for now.
++
++# A helper proc which sets a breakpoint at FUNC and attempts to
++# run to the breakpoint.
++proc test_breakpoint {func} {
++    global DEC
++
++    # Restart every time
++    if {![runto_main]} {
++	perror "could not run to main when attempting to break at $func"
++	continue
++    } else {
++	gdb_breakpoint "$func"
++	set i [expr {[string last : $func] + 1}]
++	set efunc [escape [string range $func $i end]]
++	gdb_test "continue" \
++	    "Continuing.\r\n\r\nBreakpoint $DEC+,.*$efunc.*" \
++	    "continue to $func"
++    }
++}
++
++# Escape expect-reserved characters in the string
++proc escape {string} {
++    regsub -all {\*} $string {\*} string
++    regsub -all {\(} $string {\(} string
++    regsub -all {\)} $string {\)} string
++    regsub -all {\]} $string {\]} string
++    regsub -all {\[} $string {\[} string
++    regsub -all {\+} $string {\+} string
++    regsub -all {\^} $string {\^} string
++    regsub -all {\!} $string {\!} string
++    return $string
++}
++
++# Add a function to the list of tested functions
++# FUNC is the name of the function (which will be passed to gdb commands)
++# TYPE is the type of the function, as expected from the "print" command
++# PRINT is the name of the function, as expected result of the print command
++#  *OR* "-", indicating that FUNC should be used (needed for virtual/inherited
++#   funcs)
++# LST is either the expected result of the list command (the comment from
++#  the source code) *OR* "-", in which case FUNC will be used
++# INF is the expected result of "info func"
++#
++# If any of PRINT, LST, or INF is "", the test will be skipped
++#
++# Usage:
++# add NAME TYPE PRINT LST INFO
++# add NAME TYPE PRINT - INFO
++proc add {func type print lst inf} {
++    global all_functions CONVAR ADDR
++
++    set all_functions($func,type) $type
++    if {$print == "-"} {
++	set print $func
++    }
++
++    # An exception: since gdb canonicalizes C++ output,
++    # "(void)" must be mutated to "()".
++    set print [regsub {\(void\)} $print {()}]
++
++    set all_functions($func,print) \
++	"$CONVAR = {[escape $type]} $ADDR <[escape $print].*>"
++    if {$lst == "-"} {
++	set lst "$func"
++    }
++    set all_functions($func,list) ".*// [escape $lst]"
++    set all_functions($func,info_func) $inf
++}
++
++proc get {func cmd} {
++    global all_functions
++    return $all_functions($func,$cmd)
++}
++
++# Returns a list of function names for a given command
++proc get_functions {cmd} {
++    global all_functions
++    set result {}
++    foreach i [array names all_functions *,$cmd] {
++	if {$all_functions($i) != ""} {
++	    set idx [string last , $i]
++	    if {$idx != -1} {
++		lappend result [string range $i 0 [expr {$idx - 1}]]
++	    }
++	}
++    }
++
++    return [lsort $result]
++}
++
++# Some convenience variables for this test
++set DEC {[0-9]}; # a decimal number
++set HEX {[0-9a-fA-F]}; # a hexidecimal number
++set CONVAR "\\\$$DEC+"; # convenience variable regexp
++set ADDR "0x$HEX+"; # address
++
++# An array of functions/methods that we are testing...
++# Each element consists is indexed by NAME,COMMAND, where
++# NAME is the function name and COMMAND is the gdb command that
++# we are testing. The value of the array for any index pair is
++# the expected result of running COMMAND with the NAME as argument.
++# If the value is blank, the test will be skipped for the given function.
++
++# The array holding all functions/methods to test. Valid subindexes
++# are (none need character escaping -- "add" will take care of that):
++
++# add name type print_name list info_func
++# NAME,type: value is type of function 
++# NAME,print: value is print name of function (careful w/inherited/virtual!)
++# NAME,list: value is comment in source code on first line of function
++#   (without the leading "//")
++# NAME,info_func: value is the expected result of "info func"
++array set all_functions {}
++
++# "Normal" functions/methods
++add {main} \
++    {int (int, char **)} \
++    - \
++    - \
++    {int main(int, char **);}
++add {derived::a_function} \
++    {void (const derived * const)} \
++    - \
++    - \
++    {void derived::a_function();}
++add {base1::a_function} \
++    {void (const base1 * const)} \
++    - \
++    - \
++    {void base1::a_function();}
++add {base2::a_function} \
++    {void (const base2 * const)} \
++    - \
++    - \
++    {void base2::a_function();}
++
++# Constructors
++add {derived::derived} \
++    {void (derived * const)} \
++    - \
++    - \
++    {void derived::derived();}
++add {base1::base1(void)} \
++    {void (base1 * const, const void ** const)} \
++    - \
++    - \
++    {void base1::base1();}
++add {base1::base1(int)} \
++    {void (base1 * const, int)} \
++    - \
++    - \
++    {void base1::base1(int);}
++add {base2::base2} \
++    {void (base2 * const, const void ** const)} \
++    - \
++    - \
++    {void base2::base2();}
++add {base::base(void)} \
++    {void (base * const)} \
++    - \
++    - \
++    {void base::base();}
++add {base::base(int)} \
++    {void (base * const, int)} \
++    - \
++    - \
++    {void base::base();}
++
++# Destructors
++add {base::~base} \
++    {void (base * const)} \
++    - \
++    - \
++    {void base::~base();}
++
++# Overloaded methods (all are const -- we try to use the void
++# method with and without specifying "const")
++add {base::overload(void)} \
++    {int (const base * const)} \
++    - \
++    {base::overload(void) const} \
++    {int base::overload() const;}
++add {base::overload(void) const} \
++    {int (const base * const)} \
++    - \
++    {base::overload(void) const} \
++    {int base::overload() const;}
++add {base::overload(int) const} \
++    {int (const base * const, int)} \
++    - \
++    - \
++    {int base::overload(int) const;}
++add {base::overload(short) const} \
++    {int (const base * const, short)} \
++    - \
++    - \
++    {int base::overload(short) const;}
++add {base::overload(long) const} \
++    {int (const base * const, long)} \
++    - \
++    - \
++    {int base::overload(long) const;}
++add {base::overload(char*) const} \
++    {int (const base * const, char *)} \
++    - \
++    - \
++    {int base::overload(char *) const;}
++add {base::overload(base&) const} \
++    {int (const base * const, base &)} \
++    - \
++    - \
++    {int base::overload(base &) const;}
++
++# Operators
++add {base::operator+} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator++} \
++    {base (base * const)} \
++    - \
++    - \
++    -
++add {base::operator+=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator-} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator--} \
++    {base (base * const)} \
++    - \
++    - \
++    -
++add {base::operator-=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator*} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator*=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator/} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator/=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator%} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator%=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator<} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator<=} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator>} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator>=} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator!=} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator==} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator!} \
++    {bool (const base * const)} \
++    - \
++    - \
++    -
++add {base::operator&&} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator||} \
++    {bool (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator<<} \
++    {int (const base * const, int)} \
++    - \
++    - \
++    -
++add {base::operator<<=} \
++    {base (base * const, int)} \
++    - \
++    - \
++    -
++add {base::operator>>} \
++    {int (const base * const, int)} \
++    - \
++    - \
++    -
++add {base::operator>>=} \
++    {base (base * const, int)} \
++    - \
++    - \
++    -
++add {base::operator~} \
++    {int (const base * const)} \
++    - \
++    - \
++    -
++add {base::operator&} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator&=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator|} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator|=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator^} \
++    {int (const base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator^=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator=} \
++    {base (base * const, const base &)} \
++    - \
++    - \
++    -
++add {base::operator()} \
++    {void (const base * const)} \
++    - \
++    - \
++    -
++add {base::operator[]} \
++    {int (const base * const, int)} \
++    - \
++    - \
++    -
++add {base::operator new} \
++    {void *(size_t)} \
++    - \
++    - \
++    -
++add {base::operator delete} \
++    {void (void *)} \
++    - \
++    - \
++    -
++add {base::operator new[]} \
++    {void *(size_t)} \
++    - \
++    - \
++    -
++add {base::operator delete[]} \
++    {void (void *)} \
++    - \
++    - \
++    -
++add {base::operator char*} \
++    {char *(const base * const)} \
++    - \
++    - \
++    -
++add {base::operator fluff*} \
++    {fluff *(const base * const)} \
++    - \
++    - \
++    -
++add {base::operator fluff**} \
++    {fluff **(const base * const)} \
++    - \
++    - \
++    -
++add {base::operator int} \
++    {int (const base * const)} \
++    - \
++    - \
++    -
++
++# Templates
++add {tclass<char>::do_something} \
++    {void (tclass<char> * const)} \
++    - \
++    - \
++    -
++add {tclass<int>::do_something} \
++    {void (tclass<int> * const)} \
++    - \
++    - \
++    -
++add {tclass<long>::do_something} \
++    {void (tclass<long> * const)} \
++    - \
++    - \
++    -
++add {tclass<short>::do_something} \
++    {void (tclass<short> * const)} \
++    - \
++    - \
++    -
++add {tclass<base>::do_something} \
++    {void (tclass<base> * const)} \
++    - \
++    - \
++    -
++add {flubber<int, int, int, int, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, int, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, int, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, int, char>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, short, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, short, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, short, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, short, char>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, long, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, long, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, long, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, long, char>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, char, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, char, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, char, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, int, char, char>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, short, int, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, short, int, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, short, int, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, short, int, char>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<int, int, short, short, int>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<short, int, short, int, short>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {flubber<long, short, long, short, long>} \
++    {void (void)} \
++    - \
++    flubber \
++    -
++add {tclass<base>::do_something} \
++    {void (tclass<base> * const)} \
++    - \
++    {tclass<T>::do_something} \
++    -
++add {policy1::policy} \
++    {void (policy<int, operation_1<void*> > * const, int)} \
++    {policy<int, operation_1<void*> >::policy} \
++    {policy<T, Policy>::policy} \
++    -
++add {policy2::policy} \
++    {void (policy<int, operation_2<void*> > * const, int)} \
++    {policy<int, operation_2<void*> >::policy} \
++    {policy<T, Policy>::policy} \
++    -
++add {policy3::policy} \
++    {void (policy<int, operation_3<void*> > * const, int)} \
++    {policy<int, operation_3<void*> >::policy} \
++    {policy<T, Policy>::policy} \
++    -
++add {policy4::policy} \
++    {void (policy<int, operation_4<void*> > * const, int)} \
++    {policy<int, operation_4<void*> >::policy} \
++    {policy<T, Policy>::policy} \
++    -
++add {policy1::function} \
++    {void (void)} \
++    {operation_1<void*>::function} \
++    {operation_1<T>::function} \
++    -
++add {policy2::function} \
++    {void (void)} \
++    {operation_2<void*>::function} \
++    {operation_2<T>::function} \
++    -
++add {policy3::function} \
++    {void (void)} \
++    {operation_3<void*>::function} \
++    {operation_3<T>::function} \
++    -
++add {policy4::function} \
++    {void (void)} \
++    {operation_4<void*>::function} \
++    {operation_4<T>::function} \
++    -
++add {policyd<int, operation_1<int> >::policyd} \
++    {void (policyd<int, operation_1<int> > * const, int)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd1::policyd} \
++    {void (policyd<int, operation_1<int> > * const, int)} \
++    {policyd<int, operation_1<int> >::policyd} \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<int, operation_1<int> >::~policyd} \
++    {void (policyd<int, operation_1<int> > * const)} \
++    - \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd1::~policyd} \
++    {void (policyd<int, operation_1<int> > * const)} \
++    {policyd<int, operation_1<int> >::~policyd} \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd<long, operation_1<long> >::policyd} \
++    {void (policyd<long, operation_1<long> > * const, long)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd2::policyd} \
++    {void (policyd<long, operation_1<long> > * const, long)} \
++    {policyd<long, operation_1<long> >::policyd} \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<long, operation_1<long> >::~policyd} \
++    {void (policyd<long, operation_1<long> > * const)} \
++    - \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd2::~policyd} \
++    {void (policyd<long, operation_1<long> > * const)} \
++    {policyd<long, operation_1<long> >::~policyd} \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd<char, operation_1<char> >::policyd} \
++    {void (policyd<char, operation_1<char> > * const, char)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd3::policyd} \
++    {void (policyd<char, operation_1<char> > * const, char)} \
++    {policyd<char, operation_1<char> >::policyd} \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<char, operation_1<char> >::~policyd} \
++    {void (policyd<char, operation_1<char> > * const)} \
++    - \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd3::~policyd} \
++    {void (policyd<char, operation_1<char> > * const)} \
++    {policyd<char, operation_1<char> >::~policyd} \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd<base, operation_1<base> >::policyd} \
++    {void (policyd<base, operation_1<base> > * const, base)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd4::policyd} \
++    {void (policyd<base, operation_1<base> > * const, base)} \
++    {policyd<base, operation_1<base> >::policyd} \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<base, operation_1<base> >::~policyd} \
++    {void (policyd<base, operation_1<base> > * const)} \
++    - \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd4::~policyd} \
++    {void (policyd<base, operation_1<base> > * const)} \
++    {policyd<base, operation_1<base> >::~policyd} \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \
++    {void (policyd<tclass<int>, operation_1<tclass<int> > > * const, tclass<int>)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd5::policyd} \
++    {void (policyd<tclass<int>, operation_1<tclass<int> > > * const, tclass<int>)} \
++    {policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \
++    {void (policyd<tclass<int>, operation_1<tclass<int> > > * const)} \
++    - \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd5::~policyd} \
++    {void (policyd<tclass<int>, operation_1<tclass<int> > > * const)} \
++    {policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \
++    {policyd<T, Policy>::~policyd} \
++    -
++add {policyd<int, operation_1<int> >::function} \
++    {void (void)} \
++    {operation_1<int>::function}\
++    {operation_1<T>::function} \
++    -
++add {policyd1::function} \
++    {void (void)} \
++    {operation_1<int>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd2::function} \
++    {void (void)} \
++    {operation_1<long>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd<char, operation_1<char> >::function} \
++    {void (void)} \
++    {operation_1<char>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd3::function} \
++    {void (void)} \
++    {operation_1<char>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd<base, operation_1<base> >::function} \
++    {void (void)} \
++    {operation_1<base>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd4::function} \
++    {void (void)} \
++    {operation_1<base>::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd<tclass<int>, operation_1<tclass<int> > >::function} \
++    {void (void)} \
++    {operation_1<tclass<int> >::function} \
++    {operation_1<T>::function} \
++    -
++add {policyd5::function} \
++    {void (void)} \
++    {operation_1<tclass<int> >::function} \
++    {operation_1<T>::function} \
++    -
++# The below test default template arguments
++add {policyd<int>::policyd} \
++    {void (policyd<int, operation_1<int> > * const, int)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<long>::policyd} \
++    {void (policyd<long, operation_1<long> > * const, long)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<char>::policyd} \
++    {void (policyd<char, operation_1<char> > * const, char)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<base>::policyd} \
++    {void (policyd<base, operation_1<base> > * const, base)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++add {policyd<tclass<int> >::policyd} \
++    {void (policyd<tclass<int> >, operation_1<tclass<int> > > * const, int)} \
++    - \
++    {policyd<T, Policy>::policyd} \
++    -
++
++# Start the test
++if {$tracelevel} {
++    strace $tracelevel
++}
++
++if {[skip_cplus_tests]} { continue }
++
++#
++# test running programs
++#
++set prms_id 0
++set bug_id 0
++
++set testfile "realcpp"
++set srcfile "${testfile}.cc"
++set binfile [file join $objdir $subdir $testfile]
++
++if  {[gdb_compile [file join $srcdir $subdir $srcfile] $binfile \
++	  executable {debug c++}] != "" } {
++    untested "$testfile.exp"
++    return -1
++}
++
++if {[get_compiler_info $binfile "c++"]} {
++    return -1
++}
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir [file join $srcdir $subdir]
++gdb_load $binfile
++
++# Set the listsize to one. This will help with testing "list".
++gdb_test "set listsize 1"
++
++# "print METHOD"
++foreach name [get_functions print] {
++    gdb_test "print $name" [get $name print] "print $name"
++}
++
++# "list METHOD"
++foreach name [get_functions list] {
++    gdb_test "list $name" [get $name list] "list $name"
++}
++
++# Running to breakpoint -- use any function we can "list"
++foreach name [get_functions list] {
++    # Skip "main", since test_breakpoint uses it
++    if {[string compare $name "main"] != 0} {
++	test_breakpoint $name
++    }
++}
++
++# "info func METHOD"
++if {false} {
++foreach name [get_functions "info_func"] {
++    regsub -all {\*} $name {\*} n
++    regsub -all {\^} $n {\^} n
++    regsub -all {\]} $n {\]} n
++    regsub -all {\[} $n {\[} n
++    gdb_test "info func $n" [get $name info_func] "info func $name"
++}
++}
++
++# What of these is not covered by above?
++# operator-specific tests ('p a + b', 'print cout << "hello"', etc)
++# overloaded operators & ctors
++# operator names with spaces in them (other than delete and new)
++# ptype of classes/templates
++# backtraces
++# printing data members
++# catching, throwing exceptions
++# STL (esp containers and iterators)
++# inheritance tests
++# completion scoping
++
++gdb_exit
++return 0
+diff --git a/gdb/testsuite/gdb.cp/shadowing.cc b/gdb/testsuite/gdb.cp/shadowing.cc
+new file mode 100644
+index 0000000..6d9c2f1
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/shadowing.cc
+@@ -0,0 +1,48 @@
++namespace A
++{
++  int x = 11;
++}
++
++int x = 22;
++int y = 0;
++
++class B
++{
++public:
++  int x;
++
++  int
++  func()
++  {
++    x = 33;
++    y+=x; // marker1
++
++      {
++        int x = 44;
++        y+=x; // marker2
++
++          {
++            int x = 55;
++            y+=x; // marker3
++
++              {
++                int z = x; //prevent gcc from optimizing away this scope
++                using namespace A;
++                y+=x; // marker4
++
++                using A::x;
++                y+=x; // marker5
++                
++                return this->x;
++              }
++          }
++      }
++  }
++};
++
++int
++main()
++{
++  B theB;
++  return theB.func();
++}
+diff --git a/gdb/testsuite/gdb.cp/shadowing.exp b/gdb/testsuite/gdb.cp/shadowing.exp
+new file mode 100644
+index 0000000..6922eed
+--- /dev/null
++++ b/gdb/testsuite/gdb.cp/shadowing.exp
+@@ -0,0 +1,91 @@
++# 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 shadowing
++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
++}
++
++if [get_compiler_info ${binfile}] {
++    return -1;
++}
++
++# Get things started.
++
++gdb_exit
++gdb_start
++gdb_reinitialize_dir $srcdir/$subdir
++gdb_load ${binfile}
++
++if ![runto_main] then {
++    perror "couldn't run to breakpoint main"
++    continue
++}
++
++############################################
++# Test printing of class variable is not shadowed
++# by global variable
++
++gdb_breakpoint [gdb_get_line_number "marker1"]
++gdb_continue_to_breakpoint "marker1"
++
++gdb_test "print x" "= 33" "Print class x shadowing global x"
++
++
++############################################
++# Test printing local variable is not shadowed
++# by class variable
++
++gdb_breakpoint [gdb_get_line_number "marker2"]
++gdb_continue_to_breakpoint "marker2"
++
++gdb_test "print x" "= 44" "Print local x shadowing class x"
++
++############################################
++# Test inner scope x is printed not outer scope
++
++gdb_breakpoint [gdb_get_line_number "marker3"]
++gdb_continue_to_breakpoint "marker3"
++
++gdb_test "print x" "= 55" "Print inner scope x"
++
++############################################
++# Test printing local variable is not shadowed
++# by namespace variable
++
++gdb_breakpoint [gdb_get_line_number "marker4"]
++gdb_continue_to_breakpoint "marker4"
 +
-+gdb_test "until $line" \
-+  ".*catch (...).*" \
-+  "until-over-throw"
++gdb_test "print x" "= 55" "Print local x not namespace x"
 +
-+gdb_test "next" \
-+  ".*next_cases.until ().*" \
-+  "next past catch 7"
++############################################
++# Test imported namespace element is printed
 +
-+gdb_test "step" \
-+  ".*function1 ().*" \
-+  "step into until, for advance"
++gdb_breakpoint [gdb_get_line_number "marker5"]
++gdb_continue_to_breakpoint "marker5"
 +
-+gdb_test "advance $line" \
-+  ".*catch (...).*" \
-+  "advance-over-throw"
++if [test_compiler_info gcc-4-3-*] then { setup_xfail *-*-* }
++
++gdb_test "print x" "= 11" "Print imported namespace x"
 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.S b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S
 new file mode 100644
 index 0000000..d5b9ca5
@@ -16526,6 +21729,169 @@ index 0000000..39632d5
 +
 +# Failed gdb_load would abort the testcase execution earlier.
 +pass "file loaded"
+diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
+new file mode 100644
+index 0000000..7b03ff1
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
+@@ -0,0 +1,108 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++   Copyright 2009 Free Software Foundation, Inc.
++
++   This program is free software; you can redistribute it and/or modify
++   it under the terms of the GNU General Public License as published by
++   the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++/* Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".  */
++
++	.data
++var:	.4byte	1
++
++	.section .debug_info
++.Lcu1_begin:
++	/* CU header */
++	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
++.Lcu1_start:
++	.2byte	2				/* DWARF Version */
++	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
++	.byte	4				/* Pointer size */
++
++	/* CU die */
++	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
++	.ascii	"file1.txt\0"			/* DW_AT_name */
++	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
++	.byte	4				/* DW_LANG_C_plus_plus (C++) */
++
++.Ltype_int:
++	.uleb128	2			/* Abbrev: DW_TAG_base_type */
++	.ascii		"int\0"			/* DW_AT_name */
++	.byte		4			/* DW_AT_byte_size */
++	.byte		5			/* DW_AT_encoding */
++
++	.uleb128	3			/* Abbrev: DW_TAG_namespace */
++	.ascii		"::\0"			/* DW_AT_name */
++
++	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
++	.ascii		"var\0"			/* DW_AT_name */
++	.byte		2f - 1f			/* DW_AT_location */
++1:	.byte		3			/*   DW_OP_addr */
++	.4byte		var			/*   <addr> */
++2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
++
++	.byte		0			/* End of children of DW_TAG_namespace */
++
++	.byte		0			/* End of children of CU */
++
++.Lcu1_end:
++
++/* Abbrev table */
++	.section .debug_abbrev
++.Labbrev1_begin:
++	.uleb128	1			/* Abbrev code */
++	.uleb128	0x11			/* DW_TAG_compile_unit */
++	.byte		1			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x25			/* DW_AT_producer */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x13			/* DW_AT_language */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	2			/* Abbrev code */
++	.uleb128	0x24			/* DW_TAG_base_type */
++	.byte		0			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0xb			/* DW_AT_byte_size */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.uleb128	0x3e			/* DW_AT_encoding */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	3			/* Abbrev code */
++	.uleb128	0x39			/* DW_TAG_namespace */
++	.byte		1			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	7			/* Abbrev code (location) */
++	.uleb128	0x34			/* DW_TAG_variable */
++	.byte		0			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x2			/* DW_AT_location */
++	.uleb128	0xa			/* DW_FORM_block1 */
++	.uleb128	0x49			/* DW_AT_type */
++	.uleb128	0x13			/* DW_FORM_ref4 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
+diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
+new file mode 100644
+index 0000000..1a8da16
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
+@@ -0,0 +1,43 @@
++# Copyright 2009 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program.  If not, see <http://www.gnu.org/licenses/>.
++
++# Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".
++
++# This test can only be run on targets which support DWARF-2 and use gas.
++# For now pick a sampling of likely targets.
++if {![istarget *-*-linux*]
++    && ![istarget *-*-gnu*]
++    && ![istarget *-*-elf*]
++    && ![istarget *-*-openbsd*]
++    && ![istarget arm-*-eabi*]
++    && ![istarget powerpc-*-eabi*]} {
++    return 0  
++}
++
++set testfile "dw2-empty-namespace"
++set srcfile ${testfile}.S
++set executable ${testfile}.x
++
++if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${executable}" object {nodebug}] != "" } {
++    return -1
++}
++
++clean_restart $executable
++
++# `p var' below can work without identified DWARF DIE just based on its ELF symbol.
++# Catch it here as `type = <data variable, no debug info>'.
++gdb_test "ptype var" "type = int"
++
++gdb_test "p var" " = 1"
 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-stripped.c b/gdb/testsuite/gdb.dwarf2/dw2-stripped.c
 new file mode 100644
 index 0000000..1f02d90
@@ -18452,44 +23818,6 @@ index aa4e519..f87277d 100644
  
  # The following test recompiles the binary to test either C or C++
  # values. 
-diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp
-index 951c295..9dd0c12 100644
---- a/gdb/testsuite/gdb.python/python.exp
-+++ b/gdb/testsuite/gdb.python/python.exp
-@@ -26,30 +26,9 @@ gdb_exit
- gdb_start
- gdb_reinitialize_dir $srcdir/$subdir
- 
--gdb_test_multiple "python print 23" "verify python support" {
--    -re "not supported.*$gdb_prompt $"	{
--      unsupported "python support is disabled"
--      return -1
--    }
--    -re "$gdb_prompt $"	{}
--}
--
--# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
--# Run a test named NAME, consisting of multiple lines of input.
--# After each input line INPUT, search for result line RESULT.
--# Succeed if all results are seen; fail otherwise.
--proc gdb_py_test_multiple {name args} {
--    global gdb_prompt
--    foreach {input result} $args {
--	if {[gdb_test_multiple $input "$name - $input" {
--	    -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
--		pass "$name - $input"
--	    }
--	}]} {
--	    return 1
--	}
--    }
--    return 0
-+if ![python_supported] then {
-+  unsupported "python support is disabled"
-+  return -1
- }
- 
- gdb_py_test_multiple "multi-line python command" \
 diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c b/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c
 new file mode 100644
 index 0000000..4dc308b
@@ -19033,6 +24361,27 @@ index 0000000..1dc93ab
 +if {[istarget "*-*-linux*"]} {
 +    test child FOLLOW_CHILD
 +}
+diff --git a/gdb/testsuite/lib/cp-support.exp b/gdb/testsuite/lib/cp-support.exp
+index 6fbee84..1189cfd 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 9b06a2f..419d5a9 100644
 --- a/gdb/testsuite/lib/gdb.exp
@@ -19126,10 +24475,10 @@ index 16a207c..c3cff06 100644
  {
    struct thread_info *tp, *next;
 diff --git a/gdb/top.c b/gdb/top.c
-index 85e7b62..b4f0bf7 100644
+index 90e8f1e..489e24a 100644
 --- a/gdb/top.c
 +++ b/gdb/top.c
-@@ -346,6 +346,7 @@ void
+@@ -337,6 +337,7 @@ void
  prepare_execute_command (void)
  {
    free_all_values ();
@@ -19194,8 +24543,120 @@ index ce9f551..5f9d739 100644
  }
  
  static void
+diff --git a/gdb/typeprint.h b/gdb/typeprint.h
+index 7d7e6bc..6ee65cf 100644
+--- a/gdb/typeprint.h
++++ b/gdb/typeprint.h
+@@ -20,10 +20,13 @@
+ #ifndef TYPEPRINT_H
+ #define TYPEPRINT_H
+ 
++enum language;
+ struct ui_file;
+ 
+ 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, enum language);
+ #endif
+diff --git a/gdb/ui-file.c b/gdb/ui-file.c
+index e6aaf93..1760b4c 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 "gdb_select.h"
+ 
+@@ -264,7 +265,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
+ {
+@@ -298,6 +299,23 @@ ui_file_xstrdup (struct ui_file *file, long *length)
+     *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 6155699..bb94f4b 100644
+--- a/gdb/ui-file.h
++++ b/gdb/ui-file.h
+@@ -20,6 +20,7 @@
+ #ifndef UI_FILE_H
+ #define UI_FILE_H
+ 
++struct obstack;
+ struct ui_file;
+ 
+ /* Create a generic ui_file object with null methods. */
+@@ -78,7 +79,10 @@ extern void ui_file_put (struct ui_file *src, ui_file_put_method_ftype *write, v
+    minus that 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 82a66a1..c305506 100644
+--- a/gdb/utils.c
++++ b/gdb/utils.c
+@@ -2656,7 +2656,10 @@ fprintf_symbol_filtered (struct ui_file *stream, char *name,
+    As an extra hack, string1=="FOO(ARGS)" matches string2=="FOO".
+    This "feature" is useful when searching for matching C++ function names
+    (such as if the user types 'break FOO', where FOO is a mangled C++
+-   function). */
++   function).
++
++   As an extra-special hack, we do the same with ' ', so that
++   "FOO(ARGS) const" can match "FOO", too.  */
+ 
+ int
+ strcmp_iw (const char *string1, const char *string2)
+@@ -2681,7 +2684,7 @@ strcmp_iw (const char *string1, const char *string2)
+ 	  string2++;
+ 	}
+     }
+-  return (*string1 != '\0' && *string1 != '(') || (*string2 != '\0');
++  return (*string1 != ' ' && *string1 != '\0' && *string1 != '(') || (*string2 != '\0' && *string2 != '(');
+ }
+ 
+ /* This is like strcmp except that it ignores whitespace and treats
 diff --git a/gdb/valarith.c b/gdb/valarith.c
-index 2b66f85..9c36e56 100644
+index ed76b09..8bf3634 100644
 --- a/gdb/valarith.c
 +++ b/gdb/valarith.c
 @@ -139,7 +139,6 @@ an integer nor a pointer of the same type."));
@@ -19285,7 +24746,7 @@ index 2b66f85..9c36e56 100644
  }
  
 diff --git a/gdb/valops.c b/gdb/valops.c
-index 1667368..e1a6bef 100644
+index ca34083..c23fd68 100644
 --- a/gdb/valops.c
 +++ b/gdb/valops.c
 @@ -38,6 +38,7 @@
@@ -19305,7 +24766,7 @@ index 1667368..e1a6bef 100644
  	  range_type = create_range_type ((struct type *) NULL,
  					  TYPE_TARGET_TYPE (range_type),
  					  low_bound,
-@@ -570,6 +569,64 @@ value_one (struct type *type, enum lval_type lv)
+@@ -822,6 +821,64 @@ value_one (struct type *type, enum lval_type lv)
    return val;
  }
  
@@ -19370,7 +24831,7 @@ index 1667368..e1a6bef 100644
  /* Helper function for value_at, value_at_lazy, and value_at_lazy_stack.  */
  
  static struct value *
-@@ -661,15 +718,21 @@ value_fetch_lazy (struct value *val)
+@@ -913,15 +970,21 @@ value_fetch_lazy (struct value *val)
      }
    else if (VALUE_LVAL (val) == lval_memory)
      {
@@ -19399,7 +24860,7 @@ index 1667368..e1a6bef 100644
  	}
      }
    else if (VALUE_LVAL (val) == lval_register)
-@@ -1077,7 +1140,18 @@ address_of_variable (struct symbol *var, struct block *b)
+@@ -1329,7 +1392,18 @@ address_of_variable (struct symbol *var, struct block *b)
    if ((VALUE_LVAL (val) == lval_memory && value_lazy (val))
        || TYPE_CODE (type) == TYPE_CODE_FUNC)
      {
@@ -19419,7 +24880,7 @@ index 1667368..e1a6bef 100644
        return value_from_pointer (lookup_pointer_type (type), addr);
      }
  
-@@ -1183,6 +1257,7 @@ struct value *
+@@ -1435,6 +1509,7 @@ struct value *
  value_coerce_array (struct value *arg1)
  {
    struct type *type = check_typedef (value_type (arg1));
@@ -19427,7 +24888,7 @@ index 1667368..e1a6bef 100644
  
    /* If the user tries to do something requiring a pointer with an
       array that has not yet been pushed to the target, then this would
-@@ -1192,8 +1267,12 @@ value_coerce_array (struct value *arg1)
+@@ -1444,8 +1519,12 @@ value_coerce_array (struct value *arg1)
    if (VALUE_LVAL (arg1) != lval_memory)
      error (_("Attempt to take address of value not located in memory."));
  
@@ -19441,7 +24902,94 @@ index 1667368..e1a6bef 100644
  }
  
  /* Given a value which is a function, return a value which is a pointer
-@@ -3042,8 +3121,6 @@ value_slice (struct value *array, int lowbound, int length)
+@@ -2328,12 +2407,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, 
+@@ -2353,16 +2445,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;
+@@ -3096,7 +3201,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(namespace_name, name,
+ 				    get_selected_block (0), 
+ 				    VAR_DOMAIN);
+ 
+@@ -3240,7 +3345,7 @@ value_of_local (const char *name, int complain)
+ 
+   /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
+      symbol instead of the LOC_ARG one (if both exist).  */
+-  sym = lookup_block_symbol (b, name, NULL, VAR_DOMAIN);
++  sym = lookup_block_symbol (b, name, VAR_DOMAIN);
+   if (sym == NULL)
+     {
+       if (complain)
+@@ -3294,8 +3399,6 @@ value_slice (struct value *array, int lowbound, int length)
        || lowbound + length - 1 > upperbound)
      error (_("slice out of range"));
  
@@ -19734,7 +25282,7 @@ index a462ee4..968cdf4 100644
 +  observer_attach_mark_used (value_types_mark_used);
  }
 diff --git a/gdb/value.h b/gdb/value.h
-index 8ac62b8..051c8c5 100644
+index 42b4497..6f9923c 100644
 --- a/gdb/value.h
 +++ b/gdb/value.h
 @@ -342,11 +342,16 @@ extern LONGEST unpack_field_as_long (struct type *type,
@@ -19754,7 +25302,7 @@ index 8ac62b8..051c8c5 100644
  extern struct value *value_at (struct type *type, CORE_ADDR addr);
  extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr);
  
-@@ -684,7 +689,7 @@ extern struct value *value_allocate_space_in_inferior (int);
+@@ -689,7 +694,7 @@ extern struct value *value_allocate_space_in_inferior (int);
  extern struct value *value_of_local (const char *name, int complain);
  
  extern struct value *value_subscripted_rvalue (struct value *array,
@@ -19764,7 +25312,7 @@ index 8ac62b8..051c8c5 100644
  /* User function handler.  */
  
 diff --git a/gdb/varobj.c b/gdb/varobj.c
-index 46d6b34..0536753 100644
+index 6ec87b3..b274ade 100644
 --- a/gdb/varobj.c
 +++ b/gdb/varobj.c
 @@ -26,6 +26,8 @@
@@ -19776,75 +25324,20 @@ index 46d6b34..0536753 100644
  
  #include "gdb_assert.h"
  #include "gdb_string.h"
-@@ -3468,6 +3470,19 @@ java_value_of_variable (struct varobj *var, enum varobj_display_formats format)
-   return cplus_value_of_variable (var, format);
- }
- 
-+/* Iterate all the existing VAROBJs and call the FUNC callback for them with an
-+   arbitrary caller supplied DATA pointer.  */
-+
-+static void
-+all_varobjs (void (*func) (struct varobj *var, void *data), void *data)
-+{
-+  struct vlist **vlp, *vl;
-+
-+  for (vlp = varobj_table; vlp < varobj_table + VAROBJ_TABLE_SIZE; vlp++)
-+    for (vl = *vlp; vl != NULL; vl = vl->next)
-+      (*func) (vl->var, data);
-+}
-+
- /* Iterate all the existing _root_ VAROBJs and call the FUNC callback for them
-    with an arbitrary caller supplied DATA pointer.  */
- 
-@@ -3485,6 +3500,43 @@ all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data)
+@@ -3495,7 +3497,7 @@ all_root_varobjs (void (*func) (struct varobj *var, void *data), void *data)
        (*func) (var_root->rootvar, data);
      }
  }
+-\f
 +
-+/* Helper for varobj_types_mark_used.  Call type_mark_used for any TYPEs
-+   referenced from this VAR.  */
-+
-+static void
-+varobj_types_mark_used_iter (struct varobj *var, void *unused)
-+{
-+  /* Even FLOATING or IS_INVALID VARs with non-NULL TYPE references will
-+     free them in free_variable.  Still EXP may also reference TYPEs
-+     but these belong to SYMBOLs which should be always associated with
-+     an OBJFILE (and therefore not useful to be type_mark_used).  */
-+
-+  type_mark_used (var->type);
-+  if (var->value)
-+    type_mark_used (value_type (var->value));
-+
-+  /* Check VAROBJROOTs only once during the varobj_types_mark_used pass.  */
-+
-+  if (var->root->rootvar == var)
-+    {
-+      if (var->root->exp)
-+	exp_types_mark_used (var->root->exp);
-+    }
-+}
-+
-+/* Call type_mark_used for any TYPEs referenced from this GDB source file.  */
-+
-+static void
-+varobj_types_mark_used (void)
-+{
-+  /* Check all the VAROBJs, even non-root ones.  Child VAROBJs can reference
-+     types from other OBJFILEs through TYPE_IS_OPAQUE resolutions by
-+     check_typedef.  Such types references will not be interconnected into the
-+     same TYPE_GROUP.  */
-+
-+  all_varobjs (varobj_types_mark_used_iter, NULL);
-+}
- \f
  extern void _initialize_varobj (void);
  void
+ _initialize_varobj (void)
 diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
-index 6301b61..47c2acb 100644
+index 25cc2d9..6784654 100644
 --- a/gdb/xcoffread.c
 +++ b/gdb/xcoffread.c
-@@ -3035,6 +3035,7 @@ static struct sym_fns xcoff_sym_fns =
+@@ -3030,6 +3030,7 @@ static struct sym_fns xcoff_sym_fns =
    xcoff_new_init,		/* sym_new_init: init anything gbl to entire symtab */
    xcoff_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
    xcoff_initial_scan,		/* sym_read: read a symbol file into symtab */

diff --git a/gdb-bz539590-gnu-ifunc.patch b/gdb-bz539590-gnu-ifunc.patch
index fb4f56d..a5ce160 100644
--- a/gdb-bz539590-gnu-ifunc.patch
+++ b/gdb-bz539590-gnu-ifunc.patch
@@ -1,41 +1,65 @@
-gdb/
-2009-11-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
+http://sourceware.org/gdb/wiki/ProjectArcher
+http://sourceware.org/gdb/wiki/ArcherBranchManagement
 
-	Transparent GNU-IFUNCs support.
-	* elfread.c (record_minimal_symbol): Apply also for mst_text_gnu_ifunc.
-	(elf_symtab_read): Set also mst_text_gnu_ifunc.
-	* gdbtypes.c (init_type): Support TYPE_FLAG_GNU_IFUNC.
-	(gdbtypes_post_init): Initialize builtin_func_func_ptr.
-	(objfile_type): Initialize nodebug_text_gnu_ifunc_symbol.
-	* gdbtypes.h (enum type_flag_value <TYPE_FLAG_GNU_IFUNC>)
-	(TYPE_GNU_IFUNC, struct main_type <flag_gnu_ifunc>)
-	(struct builtin_type <builtin_func_func_ptr>)
-	(struct objfile_type <nodebug_text_gnu_ifunc_symbol>): New.
-	* infcall.c (find_function_addr <TYPE_GNU_IFUNC (ftype)>): New.
-	* minsyms.c (lookup_minimal_symbol_text, prim_record_minimal_symbol)
-	(find_solib_trampoline_target): Support also mst_text_gnu_ifunc.
-	(in_gnu_ifunc_stub): New.
-	* parse.c (write_exp_msymbol <mst_text_gnu_ifunc>): New.
-	* solib-svr4.c (svr4_in_dynsym_resolve_code): Call also
-	in_gnu_ifunc_stub.
-	* symmisc.c (dump_msymbols <mst_text_gnu_ifunc>): New.
-	* symtab.c (search_symbols): Support also mst_text_gnu_ifunc.
-	* symtab.h (enum minimal_symbol_type <mst_text_gnu_ifunc>)
-	(in_gnu_ifunc_stub): New.
-	* linespec.c: Include infcall.h.
-	(minsym_found <MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc>): New.
+GIT snapshot:
+commit 791165df07fd22d381def1318954c389a606f81a
 
-gdb/testsuite/
-2009-11-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
+archer-jankratochvil-ifunc
 
-	Transparent GNU-IFUNCs support.
-	* gdb.base/gnu-ifunc-lib.c, gdb.base/gnu-ifunc.c,
-	gdb.base/gnu-ifunc.exp: New.
-
-Index: gdb-7.0.50.20100115/gdb/elfread.c
+Index: gdb-7.0.50.20100121/gdb/alpha-linux-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/elfread.c	2010-01-15 11:45:34.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/elfread.c	2010-01-15 12:17:16.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/alpha-linux-tdep.c	2010-01-01 08:31:29.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/alpha-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -26,6 +26,7 @@
+ #include "symtab.h"
+ #include "regset.h"
+ #include "regcache.h"
++#include "linux-tdep.h"
+ 
+ #include "alpha-tdep.h"
+ 
+@@ -236,6 +237,9 @@ alpha_linux_init_abi (struct gdbarch_inf
+ 
+   set_gdbarch_regset_from_core_section
+     (gdbarch, alpha_linux_regset_from_core_section);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/amd64-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/amd64-linux-tdep.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/amd64-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -1557,6 +1557,9 @@ amd64_linux_init_abi (struct gdbarch_inf
+   amd64_linux_record_tdep.arg6 = AMD64_R9_REGNUM;
+ 
+   tdep->i386_syscall_record = amd64_linux_syscall_record;
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ \f
+ 
+Index: gdb-7.0.50.20100121/gdb/arm-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/arm-linux-tdep.c	2010-01-01 08:31:29.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/arm-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -907,6 +907,9 @@ arm_linux_init_abi (struct gdbarch_info 
+   set_gdbarch_displaced_step_free_closure (gdbarch,
+ 					   simple_displaced_step_free_closure);
+   set_gdbarch_displaced_step_location (gdbarch, displaced_step_at_entry_point);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/elfread.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/elfread.c	2010-01-21 15:13:27.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/elfread.c	2010-01-21 15:15:41.000000000 +0100
 @@ -184,7 +184,8 @@ record_minimal_symbol (const char *name,
  {
    struct gdbarch *gdbarch = get_objfile_arch (objfile);
@@ -58,10 +82,80 @@ Index: gdb-7.0.50.20100115/gdb/elfread.c
  		}
  	      else if ((sym->name[0] == '.' && sym->name[1] == 'L')
  		       || ((sym->flags & BSF_LOCAL)
-Index: gdb-7.0.50.20100115/gdb/gdbtypes.c
+Index: gdb-7.0.50.20100121/gdb/frv-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/frv-linux-tdep.c	2010-01-01 08:31:32.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/frv-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -32,6 +32,7 @@
+ #include "frame-unwind.h"
+ #include "regset.h"
+ #include "gdb_string.h"
++#include "linux-tdep.h"
+ 
+ /* Define the size (in bytes) of an FR-V instruction.  */
+ static const int frv_instr_size = 4;
+@@ -486,7 +487,21 @@ frv_linux_regset_from_core_section (stru
+   return NULL;
+ }
+ 
+-\f
++static CORE_ADDR
++frv_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++				      CORE_ADDR addr,
++				      struct target_ops *targ)
++{
++  CORE_ADDR pc = frv_convert_from_func_ptr_addr (gdbarch, addr, targ);
++  CORE_ADDR resolved;
++
++  resolved = linux_convert_from_func_and_ptr (gdbarch, addr, pc);
++  if (resolved != pc)
++    pc = frv_convert_from_func_ptr_addr (gdbarch, resolved, targ);
++
++  return pc;
++}
++
+ static void
+ frv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+ {
+@@ -494,6 +509,10 @@ frv_linux_init_abi (struct gdbarch_info 
+   frame_unwind_append_unwinder (gdbarch, &frv_linux_sigtramp_frame_unwind); 
+   set_gdbarch_regset_from_core_section (gdbarch,
+                                         frv_linux_regset_from_core_section);
++
++  if (frv_abi (gdbarch) == FRV_ABI_FDPIC)
++    set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  frv_linux_convert_from_func_ptr_addr);
+ }
+ 
+ static enum gdb_osabi
+Index: gdb-7.0.50.20100121/gdb/frv-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/gdbtypes.c	2010-01-15 03:22:31.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/gdbtypes.c	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/frv-tdep.c	2010-01-01 08:31:32.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/frv-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -1169,7 +1169,7 @@ find_func_descr (struct gdbarch *gdbarch
+   return descr;
+ }
+ 
+-static CORE_ADDR
++CORE_ADDR
+ frv_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
+                                 struct target_ops *targ)
+ {
+Index: gdb-7.0.50.20100121/gdb/frv-tdep.h
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/frv-tdep.h	2010-01-01 08:31:32.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/frv-tdep.h	2010-01-21 15:15:41.000000000 +0100
+@@ -118,3 +118,6 @@ CORE_ADDR frv_fetch_objfile_link_map (st
+ struct target_so_ops;
+ extern struct target_so_ops frv_so_ops;
+ 
++CORE_ADDR frv_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++					  CORE_ADDR addr,
++					  struct target_ops *targ);
+Index: gdb-7.0.50.20100121/gdb/gdbtypes.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/gdbtypes.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/gdbtypes.c	2010-01-21 15:15:41.000000000 +0100
 @@ -1946,6 +1946,8 @@ init_type (enum type_code code, int leng
      TYPE_NOTTEXT (type) = 1;
    if (flags & TYPE_FLAG_FIXED_INSTANCE)
@@ -71,16 +165,16 @@ Index: gdb-7.0.50.20100115/gdb/gdbtypes.c
  
    if (name)
      TYPE_NAME (type) = obsavestring (name, strlen (name),
-@@ -3846,6 +3848,8 @@ gdbtypes_post_init (struct gdbarch *gdba
+@@ -3955,6 +3957,8 @@ gdbtypes_post_init (struct gdbarch *gdba
      = lookup_pointer_type (builtin_type->builtin_void);
    builtin_type->builtin_func_ptr
      = lookup_pointer_type (lookup_function_type (builtin_type->builtin_void));
-+  builtin_type->builtin_func_func_ptr
-+    = lookup_pointer_type (lookup_function_type (builtin_type->builtin_func_ptr));
++  builtin_type->builtin_func_func
++    = lookup_function_type (builtin_type->builtin_func_ptr);
  
    /* This type represents a GDB internal function.  */
    builtin_type->internal_fn
-@@ -3962,6 +3966,11 @@ objfile_type (struct objfile *objfile)
+@@ -4071,6 +4075,11 @@ objfile_type (struct objfile *objfile)
  		 "<text variable, no debug info>", objfile);
    TYPE_TARGET_TYPE (objfile_type->nodebug_text_symbol)
      = objfile_type->builtin_int;
@@ -92,10 +186,10 @@ Index: gdb-7.0.50.20100115/gdb/gdbtypes.c
    objfile_type->nodebug_data_symbol
      = init_type (TYPE_CODE_INT,
  		 gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT, 0,
-Index: gdb-7.0.50.20100115/gdb/gdbtypes.h
+Index: gdb-7.0.50.20100121/gdb/gdbtypes.h
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/gdbtypes.h	2010-01-15 11:49:26.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/gdbtypes.h	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/gdbtypes.h	2010-01-21 15:14:41.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/gdbtypes.h	2010-01-21 15:16:39.000000000 +0100
 @@ -188,6 +188,7 @@ enum type_flag_value
    TYPE_FLAG_FIXED_INSTANCE = (1 << 15),
    TYPE_FLAG_STUB_SUPPORTED = (1 << 16),
@@ -125,18 +219,18 @@ Index: gdb-7.0.50.20100115/gdb/gdbtypes.h
    unsigned int flag_fixed_instance : 1;
    unsigned int flag_objfile_owned : 1;
    unsigned int flag_discardable : 1;
-@@ -1250,6 +1258,10 @@ struct builtin_type
+@@ -1243,6 +1251,10 @@ struct builtin_type
       (*) () can server as a generic function pointer.  */
    struct type *builtin_func_ptr;
  
-+  /* `pointer to function returning pointer to function (returning void)' type.
++  /* `function returning pointer to function (returning void)' type.
 +     The final void return type is not significant for it.  */
-+  struct type *builtin_func_func_ptr;
++  struct type *builtin_func_func;
 +
  
    /* Special-purpose types.  */
  
-@@ -1292,6 +1304,7 @@ struct objfile_type
+@@ -1285,6 +1297,7 @@ struct objfile_type
  
    /* Types used for symbols with no debug information.  */
    struct type *nodebug_text_symbol;
@@ -144,77 +238,260 @@ Index: gdb-7.0.50.20100115/gdb/gdbtypes.h
    struct type *nodebug_data_symbol;
    struct type *nodebug_unknown_symbol;
    struct type *nodebug_tls_symbol;
-Index: gdb-7.0.50.20100115/gdb/infcall.c
+Index: gdb-7.0.50.20100121/gdb/hppa-linux-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/infcall.c	2010-01-01 08:31:36.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/infcall.c	2010-01-15 12:16:49.000000000 +0100
-@@ -286,6 +286,27 @@ find_function_addr (struct value *functi
-   else
-     error (_("Invalid data type for function to be called."));
+--- gdb-7.0.50.20100121.orig/gdb/hppa-linux-tdep.c	2010-01-01 08:31:33.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/hppa-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -32,6 +32,7 @@
+ #include "regset.h"
+ #include "regcache.h"
+ #include "hppa-tdep.h"
++#include "linux-tdep.h"
  
-+  if (TYPE_GNU_IFUNC (ftype))
-+    {
-+      struct type *func_func_ptr;
+ #include "elf/common.h"
+ 
+@@ -513,7 +514,21 @@ hppa_linux_regset_from_core_section (str
+ 
+   return NULL;
+ }
+-\f
 +
-+      funaddr += gdbarch_deprecated_function_start_offset (gdbarch);
++static CORE_ADDR
++hppa32_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++					 CORE_ADDR addr,
++					 struct target_ops *targ)
++{
++  CORE_ADDR pc = hppa32_convert_from_func_ptr_addr (gdbarch, addr, targ);
++  CORE_ADDR resolved;
 +
-+      /* Cast FUNADDR to drop TYPE_GNU_IFUNC and being able to call gnu-ifunc
-+	 FUNADDR without causing deadlock by this block of code.  */
++  resolved = linux_convert_from_func_and_ptr (gdbarch, addr, pc);
++  if (resolved != pc)
++    pc = hppa32_convert_from_func_ptr_addr (gdbarch, resolved, targ);
 +
-+      func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
-+      function = value_from_pointer (func_func_ptr, funaddr);
++  return pc;
++}
+ 
+ /* Forward declarations.  */
+ extern initialize_file_ftype _initialize_hppa_linux_tdep;
+@@ -555,6 +570,10 @@ hppa_linux_init_abi (struct gdbarch_info
+   /* Enable TLS support.  */
+   set_gdbarch_fetch_tls_load_module_address (gdbarch,
+                                              svr4_fetch_objfile_link_map);
 +
-+      /* gnu-ifuncs have no arguments.  */
-+      function = call_function_by_hand (function, 0, NULL);
++  if (tdep->bytes_per_address == 4)
++    set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++				       hppa32_linux_convert_from_func_ptr_addr);
+ }
+ 
+ void
+Index: gdb-7.0.50.20100121/gdb/hppa-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/hppa-tdep.c	2010-01-19 10:39:12.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/hppa-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -1247,7 +1247,7 @@ hppa64_return_value (struct gdbarch *gdb
+ }
+ \f
+ 
+-static CORE_ADDR
++CORE_ADDR
+ hppa32_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
+ 				   struct target_ops *targ)
+ {
+Index: gdb-7.0.50.20100121/gdb/hppa-tdep.h
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/hppa-tdep.h	2010-01-01 08:31:33.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/hppa-tdep.h	2010-01-21 15:15:41.000000000 +0100
+@@ -246,4 +246,8 @@ extern int hppa_in_solib_call_trampoline
+ 					  CORE_ADDR pc, char *name);
+ extern CORE_ADDR hppa_skip_trampoline_code (struct frame_info *, CORE_ADDR pc);
+ 
++extern CORE_ADDR hppa32_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++						    CORE_ADDR addr,
++						    struct target_ops *targ);
 +
-+      funaddr = value_as_address (function);
+ #endif  /* hppa-tdep.h */
+Index: gdb-7.0.50.20100121/gdb/i386-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/i386-linux-tdep.c	2010-01-04 15:57:43.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/i386-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -798,6 +798,9 @@ i386_linux_init_abi (struct gdbarch_info
+                                   i386_linux_get_syscall_number);
+ 
+   set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
 +
-+      /* This is `int' as the return type of the final function.  */
-+      value_type = TYPE_TARGET_TYPE (value_type);
-+    }
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/ia64-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/ia64-linux-tdep.c	2010-01-01 08:31:36.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/ia64-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -26,6 +26,7 @@
+ #include "osabi.h"
+ #include "solib-svr4.h"
+ #include "symtab.h"
++#include "linux-tdep.h"
+ 
+ /* The sigtramp code is in a non-readable (executable-only) region
+    of memory called the ``gate page''.  The addresses in question
+@@ -139,6 +140,9 @@ ia64_linux_init_abi (struct gdbarch_info
+   /* Enable TLS support.  */
+   set_gdbarch_fetch_tls_load_module_address (gdbarch,
+                                              svr4_fetch_objfile_link_map);
 +
-   if (retval_type != NULL)
-     *retval_type = value_type;
-   return funaddr + gdbarch_deprecated_function_start_offset (gdbarch);
-Index: gdb-7.0.50.20100115/gdb/linespec.c
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/infcall.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/linespec.c	2010-01-12 06:48:56.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/linespec.c	2010-01-15 12:16:49.000000000 +0100
-@@ -40,6 +40,7 @@
- #include "interps.h"
- #include "mi/mi-cmds.h"
+--- gdb-7.0.50.20100121.orig/gdb/infcall.c	2010-01-01 08:31:36.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/infcall.c	2010-01-21 15:15:41.000000000 +0100
+@@ -252,9 +252,17 @@ find_function_addr (struct value *functi
+       if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
+ 	  || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
+ 	{
+-	  funaddr = gdbarch_convert_from_func_ptr_addr (gdbarch, funaddr,
+-							&current_target);
+-	  value_type = TYPE_TARGET_TYPE (ftype);
++	  CORE_ADDR funaddr2;
++
++	  funaddr2 = gdbarch_convert_from_func_ptr_addr (gdbarch, funaddr,
++							 &current_target);
++
++	  /* If TYPE_GNU_IFUNC is currently not resolvable keep its type.  */
++	  if (funaddr2 != funaddr || !TYPE_GNU_IFUNC (ftype))
++	    {
++	      funaddr = funaddr2;
++	      value_type = TYPE_TARGET_TYPE (ftype);
++	    }
+ 	}
+     }
+   else if (code == TYPE_CODE_INT)
+Index: gdb-7.0.50.20100121/gdb/linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/linux-tdep.c	2010-01-14 22:20:11.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -23,6 +23,8 @@
+ #include "auxv.h"
  #include "target.h"
+ #include "elf/common.h"
++#include "value.h"
 +#include "infcall.h"
  
- /* We share this one with symtab.c, but it is not exported widely. */
+ /* This function is suitable for architectures that don't
+    extend/override the standard siginfo structure.  */
+@@ -152,3 +154,43 @@ linux_has_shared_address_space (void)
  
-@@ -1867,6 +1868,22 @@ minsym_found (int funfirstline, struct m
-   pc = gdbarch_convert_from_func_ptr_addr (gdbarch,
-                                            values.sals[0].pc,
-                                            &current_target);
+   return target_is_uclinux;
+ }
 +
-+  /* Call gnu-ifunc to resolve breakpoint at its returned function.  */
-+  if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc)
-+    {
-+      struct type *func_func_ptr;
-+      struct value *function;
++/* Call gnu-ifunc to resolve breakpoint at its returned function.  */
 +
-+      func_func_ptr = builtin_type (gdbarch)->builtin_func_func_ptr;
-+      function = value_from_pointer (func_func_ptr, pc);
++CORE_ADDR
++linux_convert_from_func_and_ptr (struct gdbarch *gdbarch, CORE_ADDR func_ptr,
++                                 CORE_ADDR pc)
++{
++  struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func;
++  struct minimal_symbol *msymbol;
++  struct value *function, *address;
 +
-+      /* gnu-ifuncs have no arguments.  */
-+      function = call_function_by_hand (function, 0, NULL);
++  if (!target_has_execution)
++    return pc;
 +
-+      pc = value_as_address (function);
-+    }
++  msymbol = lookup_minimal_symbol_by_pc (func_ptr);
++  if (msymbol == NULL)
++    return pc;
++  if (MSYMBOL_TYPE (msymbol) != mst_text_gnu_ifunc)
++    return pc;
++
++  /* Not at the gnu-ifunc entry point?  */
++  if (SYMBOL_VALUE_ADDRESS (msymbol) != func_ptr)
++    return pc;
++
++  function = allocate_value (func_func_type);
++  set_value_address (function, pc);
++
++  /* gnu-ifuncs have no arguments.  FUNCTION is the code instruction address
++     while ADDRESS is a function descriptor.  */
++  address = call_function_by_hand (function, 0, NULL);
++
++  return value_as_address (address);
++}
++
++CORE_ADDR
++linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
++				  struct target_ops *targ)
++{
++  return linux_convert_from_func_and_ptr (gdbarch, addr, addr);
++}
+Index: gdb-7.0.50.20100121/gdb/linux-tdep.h
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/linux-tdep.h	2010-01-01 08:31:37.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/linux-tdep.h	2010-01-21 15:15:41.000000000 +0100
+@@ -22,4 +22,11 @@
+ 
+ struct type *linux_get_siginfo_type (struct gdbarch *);
+ 
++CORE_ADDR linux_convert_from_func_and_ptr (struct gdbarch *gdbarch,
++					   CORE_ADDR func_ptr, CORE_ADDR pc);
++
++CORE_ADDR linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++					    CORE_ADDR addr,
++					    struct target_ops *targ);
++
+ #endif /* linux-tdep.h */
+Index: gdb-7.0.50.20100121/gdb/m32r-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/m32r-linux-tdep.c	2010-01-01 08:31:37.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/m32r-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -30,6 +30,7 @@
+ #include "gdb_string.h"
+ 
+ #include "glibc-tdep.h"
++#include "linux-tdep.h"
+ #include "solib-svr4.h"
+ #include "symtab.h"
+ 
+@@ -422,6 +423,9 @@ m32r_linux_init_abi (struct gdbarch_info
+   /* Enable TLS support.  */
+   set_gdbarch_fetch_tls_load_module_address (gdbarch,
+                                              svr4_fetch_objfile_link_map);
 +
-   if (pc != values.sals[0].pc)
-     values.sals[0] = find_pc_sect_line (pc, NULL, 0);
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
  
-Index: gdb-7.0.50.20100115/gdb/minsyms.c
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/microblaze-linux-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/minsyms.c	2010-01-15 03:22:31.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/minsyms.c	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/microblaze-linux-tdep.c	2010-01-01 08:31:37.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/microblaze-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -35,6 +35,7 @@
+ #include "trad-frame.h"
+ #include "frame-unwind.h"
+ #include "tramp-frame.h"
++#include "linux-tdep.h"
+ 
+ 
+ static int
+@@ -133,6 +134,9 @@ microblaze_linux_init_abi (struct gdbarc
+   /* Trampolines.  */
+   tramp_frame_prepend_unwinder (gdbarch,
+ 				&microblaze_linux_sighandler_tramp_frame);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ void
+Index: gdb-7.0.50.20100121/gdb/minsyms.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/minsyms.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/minsyms.c	2010-01-21 15:15:41.000000000 +0100
 @@ -331,8 +331,9 @@ lookup_minimal_symbol_text (const char *
  	       msymbol = msymbol->hash_next)
  	    {
@@ -262,10 +539,93 @@ Index: gdb-7.0.50.20100115/gdb/minsyms.c
  	    && strcmp (SYMBOL_LINKAGE_NAME (msymbol),
  		       SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
  	  return SYMBOL_VALUE_ADDRESS (msymbol);
-Index: gdb-7.0.50.20100115/gdb/parse.c
+Index: gdb-7.0.50.20100121/gdb/mips-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/mips-linux-tdep.c	2010-01-01 08:31:37.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/mips-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -38,6 +38,7 @@
+ #include "target-descriptions.h"
+ #include "mips-linux-tdep.h"
+ #include "glibc-tdep.h"
++#include "linux-tdep.h"
+ 
+ static struct target_so_ops mips_svr4_so_ops;
+ 
+@@ -1225,6 +1226,9 @@ mips_linux_init_abi (struct gdbarch_info
+ 	tdesc_numbered_register (feature, tdesc_data, MIPS_RESTART_REGNUM,
+ 				 "restart");
+     }
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/mn10300-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/mn10300-linux-tdep.c	2010-01-01 08:31:37.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/mn10300-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -32,6 +32,7 @@
+ #include "frame.h"
+ #include "trad-frame.h"
+ #include "tramp-frame.h"
++#include "linux-tdep.h"
+ 
+ #include <stdlib.h>
+ 
+@@ -718,6 +719,9 @@ am33_linux_init_osabi (struct gdbarch_in
+ 
+   tramp_frame_prepend_unwinder (gdbarch, &am33_linux_sigframe);
+   tramp_frame_prepend_unwinder (gdbarch, &am33_linux_rt_sigframe);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/objc-lang.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/objc-lang.c	2010-01-14 09:03:36.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/objc-lang.c	2010-01-21 15:15:41.000000000 +0100
+@@ -1178,16 +1178,6 @@ find_methods (struct symtab *symtab, cha
+ 
+ 	  QUIT;
+ 
+-	  /* The minimal symbol might point to a function descriptor;
+-	     resolve it to the actual code address instead.  */
+-	  pc = gdbarch_convert_from_func_ptr_addr (gdbarch, pc,
+-						   &current_target);
+-
+-	  if (symtab)
+-	    if (pc < BLOCK_START (block) || pc >= BLOCK_END (block))
+-	      /* Not in the specified symtab.  */
+-	      continue;
+-
+ 	  symname = SYMBOL_NATURAL_NAME (msymbol);
+ 	  if (symname == NULL)
+ 	    continue;
+@@ -1223,6 +1213,17 @@ find_methods (struct symtab *symtab, cha
+ 	      ((nselector == NULL) || (strcmp (selector, nselector) != 0)))
+ 	    continue;
+ 
++	  /* The minimal symbol might point to a function descriptor;
++	     resolve it to the actual code address instead.  Delay the call as
++	     its resolution may be expensive.  */
++	  pc = gdbarch_convert_from_func_ptr_addr (gdbarch, pc,
++						   &current_target);
++
++	  if (symtab)
++	    if (pc < BLOCK_START (block) || pc >= BLOCK_END (block))
++	      /* Not in the specified symtab.  */
++	      continue;
++
+ 	  sym = find_pc_function (pc);
+ 	  if (sym != NULL)
+ 	    {
+Index: gdb-7.0.50.20100121/gdb/parse.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/parse.c	2010-01-15 03:22:31.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/parse.c	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/parse.c	2010-01-21 15:13:26.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/parse.c	2010-01-21 15:16:15.000000000 +0100
 @@ -516,6 +516,11 @@ write_exp_msymbol (struct minimal_symbol
  	write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol);
        break;
@@ -278,10 +638,66 @@ Index: gdb-7.0.50.20100115/gdb/parse.c
      case mst_data:
      case mst_file_data:
      case mst_bss:
-Index: gdb-7.0.50.20100115/gdb/solib-svr4.c
+Index: gdb-7.0.50.20100121/gdb/ppc-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/ppc-linux-tdep.c	2010-01-04 15:57:44.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/ppc-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -48,6 +48,7 @@
+ #include "arch-utils.h"
+ #include "spu-tdep.h"
+ #include "xml-syscall.h"
++#include "linux-tdep.h"
+ 
+ #include "features/rs6000/powerpc-32l.c"
+ #include "features/rs6000/powerpc-altivec32l.c"
+@@ -672,8 +673,19 @@ ppc64_linux_convert_from_func_ptr_addr (
+       res = bfd_get_section_contents (s->bfd, s->the_bfd_section,
+ 				      &buf, addr - s->addr, 8);
+       if (res != 0)
+-	return extract_unsigned_integer (buf, 8, byte_order)
+-		- bfd_section_vma (s->bfd, s->the_bfd_section) + s->addr;
++	{
++	  CORE_ADDR pc, resolved;
++	  
++	  pc = extract_unsigned_integer (buf, 8, byte_order)
++	       - bfd_section_vma (s->bfd, s->the_bfd_section) + s->addr;
++
++	  resolved = linux_convert_from_func_and_ptr (gdbarch, addr, pc);
++	  if (resolved != pc)
++	    pc = ppc64_linux_convert_from_func_ptr_addr (gdbarch, resolved,
++							 targ);
++
++	  return pc;
++	}
+    }
+ 
+   return addr;
+Index: gdb-7.0.50.20100121/gdb/sh-linux-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/solib-svr4.c	2010-01-15 12:16:41.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/solib-svr4.c	2010-01-15 12:17:40.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/sh-linux-tdep.c	2010-01-01 08:31:41.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/sh-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -25,6 +25,7 @@
+ 
+ #include "glibc-tdep.h"
+ #include "sh-tdep.h"
++#include "linux-tdep.h"
+ 
+ #define REGSx16(base) \
+   {(base),      0}, \
+@@ -89,6 +90,9 @@ sh_linux_init_abi (struct gdbarch_info i
+       tdep->core_gregmap = (struct sh_corefile_regmap *)gregs_table;
+       tdep->core_fpregmap = (struct sh_corefile_regmap *)fpregs_table;
+     }
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/solib-svr4.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/solib-svr4.c	2010-01-21 15:15:22.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/solib-svr4.c	2010-01-21 15:15:41.000000000 +0100
 @@ -1257,7 +1257,8 @@ svr4_in_dynsym_resolve_code (CORE_ADDR p
  	   && pc < info->interp_text_sect_high)
  	  || (pc >= info->interp_plt_sect_low
@@ -292,10 +708,54 @@ Index: gdb-7.0.50.20100115/gdb/solib-svr4.c
  }
  
  /* Given an executable's ABFD and target, compute the entry-point
-Index: gdb-7.0.50.20100115/gdb/symmisc.c
+Index: gdb-7.0.50.20100121/gdb/sparc-linux-tdep.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/symmisc.c	2010-01-15 03:22:32.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/symmisc.c	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/sparc-linux-tdep.c	2010-01-01 08:31:42.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/sparc-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -32,6 +32,7 @@
+ #include "symtab.h"
+ #include "trad-frame.h"
+ #include "tramp-frame.h"
++#include "linux-tdep.h"
+ 
+ #include "sparc-tdep.h"
+ 
+@@ -279,6 +280,9 @@ sparc32_linux_init_abi (struct gdbarch_i
+   dwarf2_append_unwinders (gdbarch);
+ 
+   set_gdbarch_write_pc (gdbarch, sparc_linux_write_pc);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */
+Index: gdb-7.0.50.20100121/gdb/sparc64-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/sparc64-linux-tdep.c	2010-01-01 08:31:42.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/sparc64-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -31,6 +31,7 @@
+ #include "symtab.h"
+ #include "trad-frame.h"
+ #include "tramp-frame.h"
++#include "linux-tdep.h"
+ 
+ #include "sparc64-tdep.h"
+ 
+@@ -244,6 +245,9 @@ sparc64_linux_init_abi (struct gdbarch_i
+   tdep->step_trap = sparc64_linux_step_trap;
+ 
+   set_gdbarch_write_pc (gdbarch, sparc64_linux_write_pc);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ \f
+ 
+Index: gdb-7.0.50.20100121/gdb/symmisc.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/symmisc.c	2010-01-21 15:13:27.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/symmisc.c	2010-01-21 15:15:41.000000000 +0100
 @@ -294,6 +294,9 @@ dump_msymbols (struct objfile *objfile, 
  	case mst_text:
  	  ms_type = 'T';
@@ -306,11 +766,11 @@ Index: gdb-7.0.50.20100115/gdb/symmisc.c
  	case mst_solib_trampoline:
  	  ms_type = 'S';
  	  break;
-Index: gdb-7.0.50.20100115/gdb/symtab.c
+Index: gdb-7.0.50.20100121/gdb/symtab.c
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/symtab.c	2010-01-15 03:22:31.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/symtab.c	2010-01-15 12:16:49.000000000 +0100
-@@ -3257,7 +3257,7 @@ search_symbols (char *regexp, domain_enu
+--- gdb-7.0.50.20100121.orig/gdb/symtab.c	2010-01-21 15:13:27.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/symtab.c	2010-01-21 15:15:41.000000000 +0100
+@@ -3244,7 +3244,7 @@ search_symbols (char *regexp, domain_enu
    {mst_file_data, mst_solib_trampoline, mst_abs, mst_unknown};
    static enum minimal_symbol_type types4[]
    =
@@ -319,10 +779,10 @@ Index: gdb-7.0.50.20100115/gdb/symtab.c
    enum minimal_symbol_type ourtype;
    enum minimal_symbol_type ourtype2;
    enum minimal_symbol_type ourtype3;
-Index: gdb-7.0.50.20100115/gdb/symtab.h
+Index: gdb-7.0.50.20100121/gdb/symtab.h
 ===================================================================
---- gdb-7.0.50.20100115.orig/gdb/symtab.h	2010-01-15 03:22:13.000000000 +0100
-+++ gdb-7.0.50.20100115/gdb/symtab.h	2010-01-15 12:16:49.000000000 +0100
+--- gdb-7.0.50.20100121.orig/gdb/symtab.h	2010-01-21 15:11:09.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/symtab.h	2010-01-21 15:15:41.000000000 +0100
 @@ -280,6 +280,8 @@ enum minimal_symbol_type
  {
    mst_unknown = 0,		/* Unknown type, the default */
@@ -332,7 +792,7 @@ Index: gdb-7.0.50.20100115/gdb/symtab.h
    mst_data,			/* Generally initialized data */
    mst_bss,			/* Generally uninitialized data */
    mst_abs,			/* Generally absolute (nonrelocatable) */
-@@ -1163,6 +1165,8 @@ extern struct minimal_symbol *lookup_min
+@@ -1157,6 +1159,8 @@ extern struct minimal_symbol *lookup_min
  
  extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
  
@@ -341,11 +801,11 @@ Index: gdb-7.0.50.20100115/gdb/symtab.h
  extern struct minimal_symbol
    *lookup_minimal_symbol_by_pc_section (CORE_ADDR, struct obj_section *);
  
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc-lib.c	2010-01-15 12:16:49.000000000 +0100
-@@ -0,0 +1,45 @@
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc-lib.c	2010-01-21 15:15:41.000000000 +0100
+@@ -0,0 +1,54 @@
 +/* This testcase is part of GDB, the GNU debugger.
 +
 +   Copyright 2009 Free Software Foundation, Inc.
@@ -368,6 +828,12 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
 +typedef int (*final_t) (int arg);
 +
 +static int
++init_stub (int arg)
++{
++  return 0;
++}
++
++static int
 +final (int arg)
 +{
 +  return arg + 1;
@@ -379,6 +845,8 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
 +gnu_ifunc_pre (void)
 +{
 +  assert (!gnu_ifunc_initialized);
++
++  gnu_ifunc_initialized = 1;
 +}
 +
 +final_t gnu_ifuncX (void) asm ("gnu_ifunc");
@@ -387,14 +855,15 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc-lib.c
 +final_t
 +gnu_ifuncX (void)
 +{
-+  gnu_ifunc_initialized = 1;
-+
-+  return final;
++  if (!gnu_ifunc_initialized)
++    return init_stub;
++  else
++    return final;
 +}
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.c
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.c	2010-01-15 12:16:49.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc.c	2010-01-21 15:15:41.000000000 +0100
 @@ -0,0 +1,36 @@
 +/* This testcase is part of GDB, the GNU debugger.
 +
@@ -432,11 +901,11 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.c
 +
 +  return 0;	/* break-at-exit */
 +}
-Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.exp
+Index: gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc.exp
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.exp	2010-01-15 12:16:49.000000000 +0100
-@@ -0,0 +1,72 @@
++++ gdb-7.0.50.20100121/gdb/testsuite/gdb.base/gnu-ifunc.exp	2010-01-21 15:15:41.000000000 +0100
+@@ -0,0 +1,115 @@
 +# Copyright (C) 2009 Free Software Foundation, Inc.
 +
 +# This program is free software; you can redistribute it and/or modify
@@ -464,7 +933,14 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.exp
 +set libsrc ${libfile}.c
 +set lib_so ${objdir}/${subdir}/${libfile}.so
 +
++set lib_nodebug_so_base ${libfile}-nodebug.so
++set lib_nodebug_so ${objdir}/${subdir}/${lib_nodebug_so_base}
++
++# {debug} provides DWARF symbol gnu_ifuncX confusing the ELF symbol
++# gnu_ifunc during address->symbol resolution for printing the symbol.
++# Still we need it here for "step"ping into the function.
 +set lib_opts [list debug]
++set lib_nodebug_opts [list]
 +set exec_opts [list debug shlib=$lib_so]
 +
 +if [get_compiler_info ${binfile}] {
@@ -487,7 +963,8 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.exp
 +    return 1;
 +}
 +
-+gdb_breakpoint [gdb_get_line_number "break-at-nextcall"]
++# The "if" condition is artifical to test regression of a format patch.
++gdb_breakpoint "[gdb_get_line_number "break-at-nextcall"] if i && gnu_ifunc (i) != 42"
 +
 +gdb_breakpoint [gdb_get_line_number "break-at-call"]
 +gdb_continue_to_breakpoint "break-at-call" ".*break-at-call.*"
@@ -502,10 +979,67 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/gnu-ifunc.exp
 +
 +# Test GDB will not break before the final chosen implementation.
 +
-+gdb_continue_to_breakpoint "break-at-nextcall" ".*break-at-nextcall.*"
++# Also test a format patch regression:
++# Continuing.
++# Error in testing breakpoint condition:
++# Attempt to take address of value not located in memory.
++# 
++# Breakpoint 2, main () at ./gdb.base/gnu-ifunc.c:33
++
++gdb_test "continue" "Continuing.\r\n\r\nBreakpoint .* (at|in) .*break-at-nextcall.*" \
++	 "continue to break-at-nextcall"
 +
 +gdb_breakpoint "gnu_ifunc"
 +
 +gdb_continue_to_breakpoint "nextcall gnu_ifunc"
 +
-+gdb_test "frame" "#0 +final \\(.*" "nextcall gnu_ifunc skipped"
++gdb_test "frame" "#0 +(0x\[0-9a-f\]+ in +)?final \\(.*" "nextcall gnu_ifunc skipped"
++
++
++# Compare the two different addresses:
++
++gdb_test "p gnu_ifunc" " = {<text variable, no debug info>} 0x\[0-9a-f\]+ <final>" "p gnu_ifunc executing"
++gdb_test "info sym gnu_ifunc" "final in section .*" "info sym gnu_ifunc executing"
++
++set test "info addr gnu_ifunc"
++gdb_test_multiple $test $test {
++    -re "Symbol \"gnu_ifunc\" is at (0x\[0-9a-f\]+) in .*$gdb_prompt $" {
++	pass $test
++    }
++}
++gdb_test "info sym $expect_out(1,string)" "gnu_ifunc in section .*" "info sym <gnu_ifunc-address>"
++
++# <*gnu_ifunc> would be an incorrect resolution from DW_AT_MIPS_linkage_name.
++# We do not use {debug} build option for this purpose.
++
++if { [gdb_compile_shlib ${srcdir}/${subdir}/$libsrc $lib_nodebug_so $lib_nodebug_opts] != ""} {
++    untested "Could not compile either $libsrc."
++    return -1
++}
++
++clean_restart $lib_nodebug_so_base
++
++gdb_test "p gnu_ifunc" " = {<text gnu-ifunc variable, no debug info>} 0x\[0-9a-f\]+ <gnu_ifunc>" "p gnu_ifunc not executing without debug"
++gdb_test "info sym gnu_ifunc" "gnu_ifunc in section .*" "info sym gnu_ifunc not executing without debug"
+Index: gdb-7.0.50.20100121/gdb/xtensa-linux-tdep.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/xtensa-linux-tdep.c	2010-01-01 08:31:46.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/xtensa-linux-tdep.c	2010-01-21 15:15:41.000000000 +0100
+@@ -22,6 +22,7 @@
+ 
+ #include "solib-svr4.h"
+ #include "symtab.h"
++#include "linux-tdep.h"
+ 
+ /* OS specific initialization of gdbarch.  */
+ 
+@@ -30,6 +31,9 @@ xtensa_linux_init_abi (struct gdbarch_in
+ {
+   set_solib_svr4_fetch_link_map_offsets
+     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
++
++  set_gdbarch_convert_from_func_ptr_addr (gdbarch,
++					  linux_convert_from_func_ptr_addr);
+ }
+ 
+ /* Provide a prototype to silence -Wmissing-prototypes.  */

diff --git a/gdb-empty-namespace.patch b/gdb-empty-namespace.patch
deleted file mode 100644
index 1aa7654..0000000
--- a/gdb-empty-namespace.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-###gdb/
-###2009-12-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
-###
-###	Fix compatibility with G++-4.1.
-###	* dwarf2read.c (partial_die_parent_scope): New variable PARENT_NAME.
-###	Ignore parent namespaces with name "::".
-###	(physname_prefix_1): Ignore namespaces with name "::".
-
-gdb/testsuite/
-2009-12-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* gdb.dwarf2/dw2-empty-namespace.exp, gdb.dwarf2/dw2-empty-namespace.S:
-	New.
-
-###--- a/gdb/dwarf2read.c
-###+++ b/gdb/dwarf2read.c
-###@@ -2355,11 +2355,18 @@ partial_die_parent_scope (struct partial_die_info *pdi,
-###       || parent->tag == DW_TAG_interface_type
-###       || parent->tag == DW_TAG_union_type)
-###     {
-###+      char *parent_name = parent->name;
-###+
-###+      /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
-###+      if (parent->tag == DW_TAG_namespace && parent_name != NULL
-###+          && strcmp (parent_name, "::") == 0)
-###+	parent_name = NULL;
-###+
-###       if (grandparent_scope == NULL)
-###-	parent->scope = parent->name;
-###+	parent->scope = parent_name;
-###       else
-### 	parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope,
-###-					 parent->name, cu);
-###+					 parent_name, cu);
-###     }
-###   else if (parent->tag == DW_TAG_enumeration_type)
-###     /* Enumerators should not get the name of the enumeration as a prefix.  */
-###@@ -9008,6 +9015,9 @@ physname_prefix_1 (struct ui_file *buf, struct die_info *die,
-### 	  name = dwarf2_name (die, cu);
-### 	  if (name == NULL)
-### 	    name = "(anonymous namespace)";
-###+	  /* G++ 4.1 produced DW_TAG_namespace with DW_AT_name "::".  */
-###+	  else if (strcmp (name, "::") == 0)
-###+	    name = NULL;
-### 	  break;
-### 
-### 	case DW_TAG_class_type:
---- /dev/null
-+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S
-@@ -0,0 +1,108 @@
-+/* This testcase is part of GDB, the GNU debugger.
-+
-+   Copyright 2009 Free Software Foundation, Inc.
-+
-+   This program is free software; you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation; either version 3 of the License, or
-+   (at your option) any later version.
-+
-+   This program is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+
-+   You should have received a copy of the GNU General Public License
-+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-+
-+/* Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".  */
-+
-+	.data
-+var:	.4byte	1
-+
-+	.section .debug_info
-+.Lcu1_begin:
-+	/* CU header */
-+	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
-+.Lcu1_start:
-+	.2byte	2				/* DWARF Version */
-+	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
-+	.byte	4				/* Pointer size */
-+
-+	/* CU die */
-+	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
-+	.ascii	"file1.txt\0"			/* DW_AT_name */
-+	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
-+	.byte	4				/* DW_LANG_C_plus_plus (C++) */
-+
-+.Ltype_int:
-+	.uleb128	2			/* Abbrev: DW_TAG_base_type */
-+	.ascii		"int\0"			/* DW_AT_name */
-+	.byte		4			/* DW_AT_byte_size */
-+	.byte		5			/* DW_AT_encoding */
-+
-+	.uleb128	3			/* Abbrev: DW_TAG_namespace */
-+	.ascii		"::\0"			/* DW_AT_name */
-+
-+	.uleb128	7			/* Abbrev: DW_TAG_variable (location) */
-+	.ascii		"var\0"			/* DW_AT_name */
-+	.byte		2f - 1f			/* DW_AT_location */
-+1:	.byte		3			/*   DW_OP_addr */
-+	.4byte		var			/*   <addr> */
-+2:	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
-+
-+	.byte		0			/* End of children of DW_TAG_namespace */
-+
-+	.byte		0			/* End of children of CU */
-+
-+.Lcu1_end:
-+
-+/* Abbrev table */
-+	.section .debug_abbrev
-+.Labbrev1_begin:
-+	.uleb128	1			/* Abbrev code */
-+	.uleb128	0x11			/* DW_TAG_compile_unit */
-+	.byte		1			/* has_children */
-+	.uleb128	0x3			/* DW_AT_name */
-+	.uleb128	0x8			/* DW_FORM_string */
-+	.uleb128	0x25			/* DW_AT_producer */
-+	.uleb128	0x8			/* DW_FORM_string */
-+	.uleb128	0x13			/* DW_AT_language */
-+	.uleb128	0xb			/* DW_FORM_data1 */
-+	.byte		0x0			/* Terminator */
-+	.byte		0x0			/* Terminator */
-+
-+	.uleb128	2			/* Abbrev code */
-+	.uleb128	0x24			/* DW_TAG_base_type */
-+	.byte		0			/* has_children */
-+	.uleb128	0x3			/* DW_AT_name */
-+	.uleb128	0x8			/* DW_FORM_string */
-+	.uleb128	0xb			/* DW_AT_byte_size */
-+	.uleb128	0xb			/* DW_FORM_data1 */
-+	.uleb128	0x3e			/* DW_AT_encoding */
-+	.uleb128	0xb			/* DW_FORM_data1 */
-+	.byte		0x0			/* Terminator */
-+	.byte		0x0			/* Terminator */
-+
-+	.uleb128	3			/* Abbrev code */
-+	.uleb128	0x39			/* DW_TAG_namespace */
-+	.byte		1			/* has_children */
-+	.uleb128	0x3			/* DW_AT_name */
-+	.uleb128	0x8			/* DW_FORM_string */
-+	.byte		0x0			/* Terminator */
-+	.byte		0x0			/* Terminator */
-+
-+	.uleb128	7			/* Abbrev code (location) */
-+	.uleb128	0x34			/* DW_TAG_variable */
-+	.byte		0			/* has_children */
-+	.uleb128	0x3			/* DW_AT_name */
-+	.uleb128	0x8			/* DW_FORM_string */
-+	.uleb128	0x2			/* DW_AT_location */
-+	.uleb128	0xa			/* DW_FORM_block1 */
-+	.uleb128	0x49			/* DW_AT_type */
-+	.uleb128	0x13			/* DW_FORM_ref4 */
-+	.byte		0x0			/* Terminator */
-+	.byte		0x0			/* Terminator */
-+
-+	.byte		0x0			/* Terminator */
-+	.byte		0x0			/* Terminator */
---- /dev/null
-+++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.exp
-@@ -0,0 +1,43 @@
-+# Copyright 2009 Free Software Foundation, Inc.
-+
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 3 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-+
-+# Test G++ 4.1 producing DW_TAG_namespace with DW_AT_name "::".
-+
-+# This test can only be run on targets which support DWARF-2 and use gas.
-+# For now pick a sampling of likely targets.
-+if {![istarget *-*-linux*]
-+    && ![istarget *-*-gnu*]
-+    && ![istarget *-*-elf*]
-+    && ![istarget *-*-openbsd*]
-+    && ![istarget arm-*-eabi*]
-+    && ![istarget powerpc-*-eabi*]} {
-+    return 0  
-+}
-+
-+set testfile "dw2-empty-namespace"
-+set srcfile ${testfile}.S
-+set executable ${testfile}.x
-+
-+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objdir}/${subdir}/${executable}" object {nodebug}] != "" } {
-+    return -1
-+}
-+
-+clean_restart $executable
-+
-+# `p var' below can work without identified DWARF DIE just based on its ELF symbol.
-+# Catch it here as `type = <data variable, no debug info>'.
-+gdb_test "ptype var" "type = int"
-+
-+gdb_test "p var" " = 1"

diff --git a/gdb-solib-display.patch b/gdb-solib-display.patch
new file mode 100644
index 0000000..dac3420
--- /dev/null
+++ b/gdb-solib-display.patch
@@ -0,0 +1,58 @@
+http://sourceware.org/ml/gdb-patches/2010-01/msg00485.html
+Subject: [patch] Fix solib-display.exp crash
+
+[ Made more safe for downstream patch + ported for VLA.  ]
+
+Hi,
+
+it is a testsuite regression against gdb-7.0 although the bug was probably
+present even in gdb-7.0 (it started to reproduce since one completely
+unrelated Daniel J.'s patch).  This patch fixes (-lmcheck may be required):
+
+ PASS: gdb.base/solib-display.exp: display a_global
+ PASS: gdb.base/solib-display.exp: display b_global
+ PASS: gdb.base/solib-display.exp: display c_global
+-ERROR: Process no longer exists
+-UNRESOLVED: gdb.base/solib-display.exp: after rerun
+-WARNING: remote_expect statement without a default case?!
+-FAIL: gdb.base/solib-display.exp: Can't run to main (3)
++PASS: gdb.base/solib-display.exp: after rerun
++PASS: gdb.base/solib-display.exp: after rerun
++PASS: gdb.base/solib-display.exp: break 25
++PASS: gdb.base/solib-display.exp: continue
++PASS: gdb.base/solib-display.exp: display main_global
++PASS: gdb.base/solib-display.exp: display a_local
++PASS: gdb.base/solib-display.exp: display a_static
++PASS: gdb.base/solib-display.exp: break 25
++PASS: gdb.base/solib-display.exp: continue
+
+No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
+
+The question is whether SYMBOL_SYMTAB (symbol) can be ever NULL at this point.
+IMO not, it can be NULL only temporarily during reading symbols.
+
+
+Thanks,
+Jan
+
+
+2010-01-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+	* printcmd.c (display_uses_solib_p): Remove variable section.  Access
+	objfile via SYMBOL_SYMTAB.
+
+Index: gdb-7.0.50.20100121/gdb/parse.c
+===================================================================
+--- gdb-7.0.50.20100121.orig/gdb/parse.c	2010-01-21 15:16:15.000000000 +0100
++++ gdb-7.0.50.20100121/gdb/parse.c	2010-01-21 15:21:45.000000000 +0100
+@@ -1425,6 +1425,10 @@ operator_check_standard (struct expressi
+ 	if (section && objfile_func && (*objfile_func) (section->objfile, data))
+ 	  return 1;
+ 
++	/* SYMBOL_OBJ_SECTION (symbol) may be NULL.  */
++	if (SYMBOL_SYMTAB (symbol) && objfile_func && (*objfile_func) (SYMBOL_SYMTAB (symbol)->objfile, data))
++	  return 1;
++
+ 	/* Check objfile where is placed the code touching the variable.  */
+ 	objfile = block_objfile (block);
+ 

diff --git a/gdb-testsuite-lineno.patch b/gdb-testsuite-lineno.patch
deleted file mode 100644
index 4ebc827..0000000
--- a/gdb-testsuite-lineno.patch
+++ /dev/null
@@ -1,152 +0,0 @@
-http://sourceware.org/ml/gdb-patches/2010-01/msg00461.html
-Subject: [patch] testsuite: Fix misplaced line numbers
-
-Hi,
-
-commit 7a82dfb2a9be66f0230229642cbee54ebda3b0da
-Author: Joel Brobecker <brobecker@gnat.com>
-Date:   Fri Jan 1 07:31:28 2010 +0000
-
-    Update copyright year in most headers.
-    
-    Automatic update by copyright.sh.
-
-regressed:
-
--PASS: gdb.mi/mi-break.exp: run to breakpoint with ignore count
-+FAIL: gdb.mi/mi-break.exp: run to breakpoint with ignore count (stopped at wrong place)
--PASS: gdb.mi/mi-cli.exp: continue to callee4
-+FAIL: gdb.mi/mi-cli.exp: continue to callee4 (stopped at wrong place)
--PASS: gdb.mi/mi-cli.exp: check *stopped from CLI command
-+FAIL: gdb.mi/mi-cli.exp: check *stopped from CLI command (stopped at wrong place)
--PASS: gdb.mi/mi2-cli.exp: continue to callee4
-+FAIL: gdb.mi/mi2-cli.exp: continue to callee4 (stopped at wrong place)
-
-due to:
-
-#--- a/gdb/testsuite/gdb.mi/basics.c
-#+++ b/gdb/testsuite/gdb.mi/basics.c
-#@@ -1,4 +1,5 @@
-#-/* Copyright 1999, 2000, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
-#+/* Copyright 1999, 2000, 2004, 2007, 2008, 2009, 2010
-#+Free Software Foundation, Inc.
-
-
-Tested on x86_64-fedora12-linux-gnu.
-
-
-Thanks,
-Jan
-
-
-2010-01-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* gdb.mi/mi-break.exp (set line_callme_head, set line_callme_body): New.
-	(test_ignore_count): Declare line_callme_body global.
-	(run to breakpoint with ignore count): Use line_callme_body.
-	* gdb.mi/mi-cli.exp (set line_main_head, set line_main_body)
-	(set line_main_hello, set line_main_return): Reindent.
-	(set line_callee4_head, set line_callee4_body, set line_callee4_next):
-	New.
-	(continue to callee4): Use line_callee4_body.
-	(check *stopped from CLI command): Use line_callee4_next.
-	* gdb.mi/mi2-cli.exp (set line_main_head, set line_main_body)
-	(set line_main_hello, set line_main_return): Reindent.
-	(set line_callee4_head, set line_callee4_body): New.
-	(continue to callee4): Use line_callee4_body.
-
---- a/gdb/testsuite/gdb.mi/mi-break.exp
-+++ b/gdb/testsuite/gdb.mi/mi-break.exp
-@@ -56,6 +56,8 @@ set line_callee1_head  [gdb_get_line_number "callee1 ("]
- set line_callee1_body  [expr $line_callee1_head + 2]
- set line_main_head     [gdb_get_line_number "main ("]
- set line_main_body     [expr $line_main_head + 2]
-+set line_callme_head   [gdb_get_line_number "callme ("]
-+set line_callme_body   [expr $line_callme_head + 2]
- 
- set fullname "fullname=\"${fullname_syntax}${srcfile}\""
- 
-@@ -152,6 +154,7 @@ proc test_rbreak_creation_and_listing {} {
- 
- proc test_ignore_count {} {
-     global mi_gdb_prompt
-+    global line_callme_body
- 
-     mi_gdb_test "-break-insert -i 1 callme" \
-         "\\^done.*ignore=\"1\".*" \
-@@ -159,7 +162,7 @@ proc test_ignore_count {} {
- 
-     mi_run_cmd
- 
--    mi_expect_stop "breakpoint-hit" "callme" "\{name=\"i\",value=\"2\"\}" ".*basics.c" "52" \
-+    mi_expect_stop "breakpoint-hit" "callme" "\{name=\"i\",value=\"2\"\}" ".*basics.c" $line_callme_body \
-         {"" "disp=\"keep\"" } "run to breakpoint with ignore count"
- }
- 
---- a/gdb/testsuite/gdb.mi/mi-cli.exp
-+++ b/gdb/testsuite/gdb.mi/mi-cli.exp
-@@ -63,10 +63,13 @@ mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
- 
- mi_run_to_main
- 
--set line_main_head   [gdb_get_line_number "main ("]
--set line_main_body   [expr $line_main_head + 2]
--set line_main_hello  [gdb_get_line_number "Hello, World!"]
--set line_main_return [expr $line_main_hello + 2]
-+set line_main_head    [gdb_get_line_number "main ("]
-+set line_main_body    [expr $line_main_head + 2]
-+set line_main_hello   [gdb_get_line_number "Hello, World!"]
-+set line_main_return  [expr $line_main_hello + 2]
-+set line_callee4_head [gdb_get_line_number "callee4 ("]
-+set line_callee4_body [expr $line_callee4_head + 2]
-+set line_callee4_next [expr $line_callee4_body + 1]
- 
- mi_gdb_test "-interpreter-exec console \"set args foobar\"" \
-   {\^done} \
-@@ -97,7 +100,7 @@ mi_gdb_test "-interpreter-exec console \"list\"" \
-   ".*\~\"$line_main_body\[\\\\t \]*callee1.*;\\\\n\".*\\^done" \
-   "-interpreter-exec console \"list\""
- 
--mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" "28" \
-+mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" $line_callee4_body \
-     { "" "disp=\"keep\"" } "continue to callee4"
- 
- # NOTE: cagney/2003-02-03: Not yet.
-@@ -155,7 +158,7 @@ if {$async} {
-     set reason ""
- }
- 
--mi_execute_to "interpreter-exec console step" $reason "callee4" "" ".*basics.c" "29" \
-+mi_execute_to "interpreter-exec console step" $reason "callee4" "" ".*basics.c" $line_callee4_next \
-     "" "check *stopped from CLI command"
- 
- # NOTE: cagney/2003-02-03: Not yet.
---- a/gdb/testsuite/gdb.mi/mi2-cli.exp
-+++ b/gdb/testsuite/gdb.mi/mi2-cli.exp
-@@ -63,10 +63,12 @@ mi_gdb_test "-interpreter-exec console \"file $binfile\"" \
- 
- mi_run_to_main
- 
--set line_main_head   [gdb_get_line_number "main ("]
--set line_main_body   [expr $line_main_head + 2]
--set line_main_hello  [gdb_get_line_number "Hello, World!"]
--set line_main_return [expr $line_main_hello + 2]
-+set line_main_head    [gdb_get_line_number "main ("]
-+set line_main_body    [expr $line_main_head + 2]
-+set line_main_hello   [gdb_get_line_number "Hello, World!"]
-+set line_main_return  [expr $line_main_hello + 2]
-+set line_callee4_head [gdb_get_line_number "callee4 ("]
-+set line_callee4_body [expr $line_callee4_head + 2]
- 
- mi_gdb_test "-interpreter-exec console \"set args foobar\"" \
-   {\^done} \
-@@ -97,7 +100,7 @@ mi_gdb_test "-interpreter-exec console \"list\"" \
-   ".*\~\"$line_main_body\[\\\\t \]*callee1.*;\\\\n\".*\\^done" \
-   "-interpreter-exec console \"list\""
- 
--mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" "28" \
-+mi_execute_to "exec-continue" "breakpoint-hit" "callee4" "" ".*basics.c" $line_callee4_body \
-     { "" "disp=\"keep\"" } \
-     "continue to callee4"
- 
-

diff --git a/gdb-unused-revert.patch b/gdb-unused-revert.patch
new file mode 100644
index 0000000..2abe3cf
--- /dev/null
+++ b/gdb-unused-revert.patch
@@ -0,0 +1,44 @@
+[RFA/commit 5/5] Add -Wunused-function to compile flags.
+http://sourceware.org/ml/gdb-patches/2010-01/msg00371.html
+http://sourceware.org/ml/gdb-cvs/2010-01/msg00163.html
+
+REVERTED
+
+--- src/gdb/configure.ac	2010/01/15 00:34:37	1.112
++++ src/gdb/configure.ac	2010/01/19 09:52:31	1.113
+@@ -1544,8 +1544,7 @@
+ # gdb/doc/gdbint.texinfo.
+ build_warnings="-Wall -Wdeclaration-after-statement -Wpointer-arith \
+ -Wformat-nonliteral -Wno-pointer-sign \
+--Wno-unused -Wunused-value -Wunused-function \
+--Wno-switch -Wno-char-subscripts"
++-Wno-unused -Wunused-value -Wno-switch -Wno-char-subscripts"
+ 
+ # Enable -Wno-format by default when using gcc on mingw since many
+ # GCC versions complain about %I64.
+--- src/gdb/configure	2010/01/15 00:34:37	1.297
++++ src/gdb/configure	2010/01/19 09:52:32	1.298
+@@ -13435,8 +13435,7 @@
+ # gdb/doc/gdbint.texinfo.
+ build_warnings="-Wall -Wdeclaration-after-statement -Wpointer-arith \
+ -Wformat-nonliteral -Wno-pointer-sign \
+--Wno-unused -Wunused-value -Wunused-function \
+--Wno-switch -Wno-char-subscripts"
++-Wno-unused -Wunused-value -Wno-switch -Wno-char-subscripts"
+ 
+ # Enable -Wno-format by default when using gcc on mingw since many
+ # GCC versions complain about %I64.
+### src/gdb/ChangeLog	2010/01/19 09:50:48	1.11271
+### src/gdb/ChangeLog	2010/01/19 09:52:33	1.11272
+## -1,11 +1,5 @@
+ 2010-01-19  Joel Brobecker  <brobecker@adacore.com>
+ 
+-	Add -Wunused-function to compile flags.
+-	* configure.ac: Add -Wunused-function to build_warnings.
+-	* configure: Regenerate.
+-
+-2010-01-19  Joel Brobecker  <brobecker@adacore.com>
+-
+ 	"delete" ada-lex.c:input function, not used.
+ 	* ada-lex.l: #define YY_NO_INPUT.
+ 

diff --git a/gdb-watchpoint-cond-gone.patch b/gdb-watchpoint-cond-gone.patch
deleted file mode 100644
index 12a4c76..0000000
--- a/gdb-watchpoint-cond-gone.patch
+++ /dev/null
@@ -1,231 +0,0 @@
-http://sourceware.org/ml/gdb-patches/2009-12/msg00394.html
-Subject: [patch] Fix watchpoint-at-epilogue 7.0 regression (s390x)
-
-Hi,
-
-attached testcase regressed 6.8->7.0 on some s390x systems.
-
-At the moment PC is at epilogue (after frame pointer got destroyed and PC is
-still in the calleed function) we must not try any unwinding as it can try to
-unwind a garbage.
-
-Correct way would be to implement epilogue unwinder (such as
-amd64_epilogue_frame_unwind or i386_epilogue_frame_unwind ones) but it would
-not be so easy on s390x as it would need full prologue-analyzer: After SP gets
-restored there can be various instructions before the last jump - GDB needs to
-interpret the jump to find the register value where it is going to jump to.
-00000048279aa09c <round_and_return>:
-[...]
-  48279aa1b8: eb 6f f0 d0 00 04 lmg  %r6,%r15,208(%r15)
-  48279aa1be: 50 32 10 00       st   %r3,0(%r2,%r1)	# SP (%r15) is gone hone
-  48279aa1c2: b3 74 00 00       lzer %r0
-  48279aa1c6: 07 f4             br   %r4		# %r4 is the target
-[...]
-
-Just an easy fix is to be more careful and do not try any unwinding if we find
-PC is in the epilogue (previous instruction modifies SP=%r15).
-
-It is even a performance optimization and I see no regression risk there.
-
-The specific s390x error is:
-#0  throw_error (error=MEMORY_ERROR, fmt=0x8042676a "Cannot access memory at address %s") at exceptions.c:415
-#1  in memory_error (status=5, memaddr=0) at corefile.c:220
-#2  in read_memory (memaddr=0, myaddr=0x3ffffc7f7f0 "", len=8) at corefile.c:238
-#3  in read_memory_unsigned_integer (memaddr=0, len=8, byte_order=BFD_ENDIAN_BIG) at corefile.c:321
-#4  in s390_backchain_frame_unwind_cache (this_frame=0x80608958, info=0x80608a08) at s390-tdep.c:1525
-#5  in s390_frame_unwind_cache (this_frame=0x80608958, this_prologue_cache=0x80608970) at s390-tdep.c:1572
-#6  in s390_frame_this_id (this_frame=0x80608958, this_prologue_cache=0x80608970, this_id=0x806089b8) at s390-tdep.c:1583
-#7  in get_frame_id (fi=0x80608958) at frame.c:335
-#8  in frame_find_by_id (id={stack_addr = 4398044824952, code_addr = 2147484952, special_addr = 0, stack_addr_p = 1, code_addr_p = 1, special_addr_p = 0, inline_depth = 0}) at frame.c:587 
-#9  in watchpoint_check (p=0x8095bbc0) at breakpoint.c:3203
-#10 in catch_errors (func=0x801262c0 <watchpoint_check>, func_args=0x8095bbc0, errstring=0x80a26410 "Error evaluating expression for watchpoint 3\n", mask=6) at exceptions.c:510
-#11 in bpstat_check_watchpoint (bs=0x8095bbc0) at breakpoint.c:3404
-#12 in bpstat_stop_status (aspace=0x8061fcb0, bp_addr=2147485040, ptid={pid = 17372, lwp = 17372, tid = 0}) at breakpoint.c:3594
-#13 in handle_inferior_event (ecs=0x3ffffc80520) at infrun.c:3588
-
-I did not analyze why 6.8 did not error out, the GDB code is similar there.
-
-No regressions on:
-{x86_64,x86_64-m32,i686}-fedora12-linux-gnu (CVS HEAD GDB)
-s390x-rhel48-linux-gnu (CVS HEAD GDB)
-s390-rhel48-linux-gnu (CVS HEAD GDB)
-s390x-rhel54-linux-gnu (Fedora 12 GDB)
-s390-rhel54-linux-gnu (Fedora 12 GDB)
-
-
-Thanks,
-Jan
-
-
-gdb/
-2009-12-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* breakpoint.c (watchpoint_check): Check the call
-	gdbarch_in_function_epilogue_p before calling frame_find_by_id.
-	Extend the comment.
-
-gdb/testsuite/
-2009-12-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
-
-	* gdb.base/watchpoint-cond-gone.exp, gdb.base/watchpoint-cond-gone.c,
-	gdb.base/watchpoint-cond-gone-stripped.c: New.
-
---- a/gdb/breakpoint.c
-+++ b/gdb/breakpoint.c
-@@ -3200,6 +3200,17 @@ watchpoint_check (void *p)
-       struct gdbarch *frame_arch = get_frame_arch (frame);
-       CORE_ADDR frame_pc = get_frame_pc (frame);
- 
-+      /* in_function_epilogue_p() returns a non-zero value if we're still
-+	 in the function but the stack frame has already been invalidated.
-+	 Since we can't rely on the values of local variables after the
-+	 stack has been destroyed, we are treating the watchpoint in that
-+	 state as `not changed' without further checking.  Don't mark
-+	 watchpoints as changed if the current frame is in an epilogue -
-+	 even if they are in some other frame, our view of the stack
-+	 is likely to be wrong and frame_find_by_id could error out.  */
-+      if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
-+	return WP_VALUE_NOT_CHANGED;
-+
-       fr = frame_find_by_id (b->watchpoint_frame);
-       within_current_scope = (fr != NULL);
- 
-@@ -3216,17 +3227,6 @@ watchpoint_check (void *p)
- 	    within_current_scope = 0;
- 	}
- 
--      /* in_function_epilogue_p() returns a non-zero value if we're still
--	 in the function but the stack frame has already been invalidated.
--	 Since we can't rely on the values of local variables after the
--	 stack has been destroyed, we are treating the watchpoint in that
--	 state as `not changed' without further checking.  Don't mark
--	 watchpoints as changed if the current frame is in an epilogue -
--	 even if they are in some other frame, our view of the stack
--	 is likely to be wrong.  */
--      if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
--	return WP_VALUE_NOT_CHANGED;
--
-       if (within_current_scope)
- 	/* If we end up stopping, the current frame will get selected
- 	   in normal_stop.  So this call to select_frame won't affect
---- /dev/null
-+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone-stripped.c
-@@ -0,0 +1,23 @@
-+/* This testcase is part of GDB, the GNU debugger.
-+
-+   Copyright 2009 Free Software Foundation, Inc.
-+
-+   This program is free software; you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation; either version 2 of the License, or
-+   (at your option) any later version.
-+
-+   This program is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+ 
-+   You should have received a copy of the GNU General Public License
-+   along with this program; if not, write to the Free Software
-+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-+
-+void
-+jumper (void (*jumpto) (void))
-+{
-+  (*jumpto) ();
-+}
---- /dev/null
-+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.c
-@@ -0,0 +1,37 @@
-+/* This testcase is part of GDB, the GNU debugger.
-+
-+   Copyright 2009 Free Software Foundation, Inc.
-+
-+   This program is free software; you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation; either version 2 of the License, or
-+   (at your option) any later version.
-+
-+   This program is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+ 
-+   You should have received a copy of the GNU General Public License
-+   along with this program; if not, write to the Free Software
-+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-+
-+extern void jumper (void (*jumpto) (void));
-+
-+static void
-+func (void)
-+{
-+  volatile int c;
-+
-+  c = 5;
-+  c = 10;	/* watchpoint-here */
-+  c = 20;
-+}
-+
-+int
-+main (void)
-+{
-+  jumper (func);
-+
-+  return 0;
-+}
---- /dev/null
-+++ b/gdb/testsuite/gdb.base/watchpoint-cond-gone.exp
-@@ -0,0 +1,51 @@
-+# Copyright 2009 Free Software Foundation, Inc.
-+
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+
-+set testfile "watchpoint-cond-gone"
-+set srcfile ${testfile}.c
-+set srcfilestripped ${testfile}-stripped.c
-+set objfilestripped ${objdir}/${subdir}/${testfile}-stripped.o
-+set binfile ${objdir}/${subdir}/${testfile}
-+
-+# We need to generate a function without DWARF to crash older GDB.
-+# Stepping into a dynamic function trampoline or stepping out of MAIN may work
-+# but it is not a reliable FAIL case.
-+
-+if  { [gdb_compile "${srcdir}/${subdir}/${srcfilestripped}" "${objfilestripped}" object {}] != ""
-+      || [gdb_compile "${srcdir}/${subdir}/${srcfile} ${objfilestripped}" "${binfile}" executable {debug}] != "" } {
-+    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-+}
-+
-+clean_restart ${testfile}
-+
-+# Problem does not occur otherwise.
-+gdb_test "set can-use-hw-watchpoints 0"
-+
-+if ![runto_main] {
-+    return -1
-+}
-+
-+gdb_breakpoint [gdb_get_line_number "watchpoint-here"]
-+gdb_continue_to_breakpoint "Place to set the watchpoint"
-+
-+# The condition `c == 30' is the subject being tested.
-+gdb_test "watch c if c == 30" "" "Place the watchpoint"
-+
-+# We may stay either in the function itself or only at the first instruction of
-+# its caller depending on the epilogue unwinder (or valid epilogue CFI) presence.
-+gdb_test "finish" \
-+	 "Watchpoint .* deleted because the program has left the block in.*which its expression is valid..*in (jumper|func).*" \
-+	 "Catch the no longer valid watchpoint"
-

diff --git a/gdb.spec b/gdb.spec
index 3d59fcd..228d484 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -32,11 +32,11 @@ 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: 7.0.50.20100118
+Version: 7.0.50.20100121
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 2%{?_with_upstream:.upstream}%{dist}
+Release: 1%{?_with_upstream:.upstream}%{dist}
 
 License: GPLv3+
 Group: Development/Debuggers
@@ -322,9 +322,6 @@ Patch309: gdb-6.3-mapping-zero-inode-test.patch
 # Test a crash on `focus cmd', `focus prev' commands.
 Patch311: gdb-6.3-focus-cmd-prev-test.patch
 
-# Fix error on a sw watchpoint active at function epilogue (hit on s390x).
-Patch314: gdb-watchpoint-cond-gone.patch
-
 # Test various forms of threads tracking across exec() (BZ 442765).
 Patch315: gdb-6.8-bz442765-threaded-exec-test.patch
 
@@ -403,9 +400,6 @@ Patch393: gdb-rhel5-gcc44.patch
 # Workaround RHEL-5 kernels for detaching SIGSTOPped processes (BZ 498595).
 Patch335: gdb-rhel5-compat.patch
 
-# Fix backward compatibility with G++ 4.1 namespaces "::".
-Patch395: gdb-empty-namespace.patch
-
 # Fix regression by python on ia64 due to stale current frame.
 Patch397: gdb-follow-child-stale-parent.patch
 
@@ -428,8 +422,11 @@ Patch407: gdb-lineno-makeup-test.patch
 # Test power7 ppc disassembly.
 Patch408: gdb-ppc-power7-test.patch
 
-# [patch] testsuite: Fix misplaced line numbers
-Patch410: gdb-testsuite-lineno.patch
+# Fix solib-display.exp crash
+Patch411: gdb-solib-display.patch
+
+# Revert: Add -Wunused-function to compile flags.
+Patch412: gdb-unused-revert.patch
 
 BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
 Requires: readline%{?_isa}
@@ -641,7 +638,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch304 -p1
 %patch309 -p1
 %patch311 -p1
-%patch314 -p1
 %patch315 -p1
 %patch317 -p1
 %patch318 -p1
@@ -665,7 +661,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch390 -p1
 %patch391 -p1
 %patch392 -p1
-%patch395 -p1
 %patch397 -p1
 %patch400 -p1
 %patch403 -p1
@@ -676,7 +671,8 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch406 -p1
 %patch407 -p1
 %patch408 -p1
-%patch410 -p1
+%patch411 -p1
+%patch412 -p1
 # Always verify its applicability.
 %patch393 -p1
 %patch335 -p1
@@ -1002,6 +998,11 @@ fi
 %endif
 
 %changelog
+* Thu Jan 21 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.50.20100121-1.fc13
+- Upgrade to the FSF GDB snapshot: 7.0.50.20100121
+- archer-jankratochvil-fedora13 commit: ccde1530479cc966374351038057b9dda90aa251
+- [expr-cumulative] Archer branch is now included.
+
 * Tue Jan 19 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.0.50.20100118-2.fc13
 - Fix false PASS->FAIL of gdb.arch/i386-biarch-core.exp.
 

diff --git a/sources b/sources
index 2221761..7fa6a44 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-2fb1a2ac78b3bdc495bbabd85e310a5d  gdb-7.0.50.20100118.tar.bz2
+fcfbe6ccb36d86bc06891fbd70f1664d  gdb-7.0.50.20100121.tar.bz2
 04e5c4b1b9e633422cc48990fe61958d  libstdc++-v3-python-r155978.tar.bz2

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

only message in thread, other threads:[~2026-06-27 23:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-27 23:54 [rpms/gdb] gdb-17.2-rebase-f44: - Upgrade to the FSF GDB snapshot: 7.0.50.20100121 Jan Kratochvil

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