merge from gcc
[external/binutils.git] / gdb / interps.c
index d65a0ff..f142e5a 100644 (file)
@@ -1,6 +1,7 @@
 /* Manages interpreters for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002, 2003, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
    Written by Jim Ingham <jingham@apple.com> of Apple Computer, Inc.
 
@@ -8,7 +9,7 @@
 
    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
+   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,
@@ -17,9 +18,7 @@
    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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA. */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 /* This is just a first cut at separating out the "interpreter"
    functions of gdb into self-contained modules.  There are a couple
@@ -39,7 +38,6 @@
 #include "interps.h"
 #include "completer.h"
 #include "gdb_string.h"
-#include "gdb-events.h"
 #include "gdb_assert.h"
 #include "top.h"               /* For command_loop.  */
 #include "exceptions.h"
@@ -73,7 +71,8 @@ struct interp
 
 /* Functions local to this file. */
 static void initialize_interps (void);
-static char **interpreter_completer (char *text, char *word);
+static char **interpreter_completer (struct cmd_list_element *cmd,
+                                    char *text, char *word);
 
 /* The magic initialization routine for this module. */
 
@@ -83,6 +82,7 @@ void _initialize_interpreter (void);
 
 static struct interp *interp_list = NULL;
 static struct interp *current_interpreter = NULL;
+static struct interp *top_level_interpreter_ptr = NULL;
 
 static int interpreter_initialized = 0;
 
@@ -126,16 +126,27 @@ interp_add (struct interp *interp)
    init proc is successful, return 1, if it fails, set the old
    interpreter back in place and return 0.  If we can't restore the
    old interpreter, then raise an internal error, since we are in
-   pretty bad shape at this point. */
+   pretty bad shape at this point. 
+
+   The TOP_LEVEL parameter tells if this new interpreter is
+   the top-level one.  The top-level is what is requested
+   on the command line, and is responsible for reporting general
+   notification about target state changes.  For example, if
+   MI is the top-level interpreter, then it will always report
+   events such as target stops and new thread creation, even if they
+   are caused by CLI commands.  */
 int
-interp_set (struct interp *interp)
+interp_set (struct interp *interp, int top_level)
 {
   struct interp *old_interp = current_interpreter;
   int first_time = 0;
-
-
   char buffer[64];
 
+  /* If we already have an interpreter, then trying to
+     set top level interpreter is kinda pointless.  */
+  gdb_assert (!top_level || !current_interpreter);
+  gdb_assert (!top_level || !top_level_interpreter_ptr);
+
   if (current_interpreter != NULL)
     {
       do_all_continuations ();
@@ -154,6 +165,8 @@ interp_set (struct interp *interp)
     }
 
   current_interpreter = interp;
+  if (top_level)
+    top_level_interpreter_ptr = interp;
 
   /* We use interpreter_p for the "set interpreter" variable, so we need
      to make sure we have a malloc'ed copy for the set command to free. */
@@ -173,7 +186,7 @@ interp_set (struct interp *interp)
     {
       if (interp->procs->init_proc != NULL)
        {
-         interp->data = interp->procs->init_proc ();
+         interp->data = interp->procs->init_proc (top_level);
        }
       interp->inited = 1;
     }
@@ -184,7 +197,7 @@ interp_set (struct interp *interp)
   if (interp->procs->resume_proc != NULL
       && (!interp->procs->resume_proc (interp->data)))
     {
-      if (old_interp == NULL || !interp_set (old_interp))
+      if (old_interp == NULL || !interp_set (old_interp, 0))
        internal_error (__FILE__, __LINE__,
                        _("Failed to initialize new interp \"%s\" %s"),
                        interp->name, "and could not restore old interp!\n");
@@ -325,23 +338,16 @@ clear_interpreter_hooks (void)
   /*print_frame_more_info_hook = 0; */
   deprecated_query_hook = 0;
   deprecated_warning_hook = 0;
-  deprecated_create_breakpoint_hook = 0;
-  deprecated_delete_breakpoint_hook = 0;
-  deprecated_modify_breakpoint_hook = 0;
   deprecated_interactive_hook = 0;
-  deprecated_registers_changed_hook = 0;
   deprecated_readline_begin_hook = 0;
   deprecated_readline_hook = 0;
   deprecated_readline_end_hook = 0;
   deprecated_register_changed_hook = 0;
-  deprecated_memory_changed_hook = 0;
   deprecated_context_hook = 0;
   deprecated_target_wait_hook = 0;
   deprecated_call_command_hook = 0;
-  deprecated_error_hook = 0;
   deprecated_error_begin_hook = 0;
   deprecated_command_loop_hook = 0;
-  clear_gdb_event_hooks ();
 }
 
 /* This is a lazy init routine, called the first time the interpreter
@@ -365,20 +371,15 @@ interpreter_exec_cmd (char *args, int from_tty)
   unsigned int i;
   int old_quiet, use_quiet;
 
-  prules = buildargv (args);
-  if (prules == NULL)
-    {
-      error (_("unable to parse arguments"));
-    }
+  if (args == NULL)
+    error_no_arg (_("interpreter-exec command"));
+
+  prules = gdb_buildargv (args);
+  make_cleanup_freeargv (prules);
 
   nrules = 0;
-  if (prules != NULL)
-    {
-      for (trule = prules; *trule != NULL; trule++)
-       {
-         nrules++;
-       }
-    }
+  for (trule = prules; *trule != NULL; trule++)
+    nrules++;
 
   if (nrules < 2)
     error (_("usage: interpreter-exec <interpreter> [ <command> ... ]"));
@@ -393,7 +394,7 @@ interpreter_exec_cmd (char *args, int from_tty)
   old_quiet = interp_set_quiet (old_interp, 1);
   use_quiet = interp_set_quiet (interp_to_use, 1);
 
-  if (!interp_set (interp_to_use))
+  if (!interp_set (interp_to_use, 0))
     error (_("Could not switch to interpreter \"%s\"."), prules[0]);
 
   for (i = 1; i < nrules; i++)
@@ -401,21 +402,21 @@ interpreter_exec_cmd (char *args, int from_tty)
       struct gdb_exception e = interp_exec (interp_to_use, prules[i]);
       if (e.reason < 0)
        {
-         interp_set (old_interp);
+         interp_set (old_interp, 0);
          interp_set_quiet (interp_to_use, use_quiet);
          interp_set_quiet (old_interp, old_quiet);
          error (_("error in command: \"%s\"."), prules[i]);
        }
     }
 
-  interp_set (old_interp);
+  interp_set (old_interp, 0);
   interp_set_quiet (interp_to_use, use_quiet);
   interp_set_quiet (old_interp, old_quiet);
 }
 
 /* List the possible interpreters which could complete the given text. */
 static char **
-interpreter_completer (char *text, char *word)
+interpreter_completer (struct cmd_list_element *ignore, char *text, char *word)
 {
   int alloced = 0;
   int textlen;
@@ -465,6 +466,19 @@ interpreter_completer (char *text, char *word)
   return matches;
 }
 
+struct interp *
+top_level_interpreter (void)
+{
+  return top_level_interpreter_ptr;  
+}
+
+void *
+top_level_interpreter_data (void)
+{
+  gdb_assert (top_level_interpreter_ptr);
+  return top_level_interpreter_ptr->data;  
+}
+
 /* This just adds the "interpreter-exec" command.  */
 void
 _initialize_interpreter (void)