[rfc v2][5/6] Make "info proc" command generic

Ulrich Weigand uweigand@de.ibm.com
Fri Jan 13 18:16:00 GMT 2012


Hello,

this is mostly unchanged over the previous version:
http://sourceware.org/ml/gdb-patches/2011-12/msg00010.html

with the only difference being that this version now supports
current_inferior ()->fake_pid_p when determining the PID of
the current process.

There were no changes at all to the procfs.c part (which I cannot
test, but where Joel tested tested the previous patch on Irix). 

Bye,
Ulrich


ChangeLog:

	* defs.h (enum info_proc_what): Moved here from linux-nat.c
	* infcmd.c: Include "cli/cli-utils.h".
	(info_proc_cmd_1): New function.
	(info_proc_cmd): New function, moved here from equivalent routine
	orignally in linux-nat.c.
	(info_proc_cmd_mappings): Likewise.
	(info_proc_cmd_stat): Likewise.
	(info_proc_cmd_status): Likewise.
	(info_proc_cmd_cwd): Likewise.
	(info_proc_cmd_cmdline): Likewise.
	(info_proc_cmd_exe): Likewise.
	(info_proc_cmd_all): Likewise.
	(_initialize_infcmd): Install "info proc" command and subcommands.

	* target.h (struct target_ops): Add to_info_proc.
	(target_info_proc): Add prototype.
	* target.c (target_info_proc): New function.

	* procfs.c (procfs_info_proc): Add prototype.
	(info_proc_cmd): Rename into ...
	(procfs_info_proc): ... this.  Update argument types as appropriate
	for a to_info_proc implementation.  Remove argument parsing.
	(procfs_target): Install procfs_info_proc.
	(_initialize_procfs): No longer install "info proc" command.

	* linux-nat.c: Do not include "cli/cli-utils.h".
	(enum info_proc_what): Remove.
	(linux_nat_info_proc_cmd_1): Rename into ...
	(linux_nat_info_proc): ... this.  Update argument types as appropriate
	for a to_info_proc implementation.  Remove argument parsing.
	(linux_nat_info_proc_cmd): Remove.
	(linux_nat_info_proc_cmd_mappings): Likewise.
	(linux_nat_info_proc_cmd_stat): Likewise.
	(linux_nat_info_proc_cmd_status): Likewise.
	(linux_nat_info_proc_cmd_cwd): Likewise.
	(linux_nat_info_proc_cmd_cmdline): Likewise.
	(linux_nat_info_proc_cmd_exe): Likewise.
	(linux_nat_info_proc_cmd_all): Likewise.
	(linux_target_install_ops): Install linux_nat_info_proc.
	(_initialize_linux_nat): No longer install "info proc" command
	and subcommands.

testsuite/ChangeLog:

	* gdb.base/info-proc.exp: Also run on remote targets.  Main
	"info proc" command is now always present; whether target supports
	actual info proc operation is detected when attempting to issue
	the command.


Index: gdb-head/gdb/target.h
===================================================================
--- gdb-head.orig/gdb/target.h	2012-01-13 18:45:57.000000000 +0100
+++ gdb-head/gdb/target.h	2012-01-13 18:45:58.000000000 +0100
@@ -715,6 +715,9 @@ struct target_ops
     char *(*to_fileio_readlink) (const char *filename, int *remote_errno);
 
 
+    /* Show information about process PTID.  */
+    void (*to_info_proc) (struct target_ops *, ptid_t, enum info_proc_what);
+
     /* Tracepoint-related operations.  */
 
     /* Prepare the target for a tracing run.  */
@@ -942,6 +945,10 @@ extern void target_store_registers (stru
 
 struct address_space *target_thread_address_space (ptid_t);
 
+/* Show information about process PTID.  */
+
+void target_info_proc (ptid_t, enum info_proc_what);
+
 /* Returns true if this target can debug multiple processes
    simultaneously.  */
 
Index: gdb-head/gdb/procfs.c
===================================================================
--- gdb-head.orig/gdb/procfs.c	2012-01-13 18:36:34.000000000 +0100
+++ gdb-head/gdb/procfs.c	2012-01-13 18:45:58.000000000 +0100
@@ -151,6 +151,9 @@ static char * procfs_make_note_section (
 
 static int procfs_can_use_hw_breakpoint (int, int, int);
 
+static void procfs_info_proc (struct target_ops *, ptid_t,
+			      enum info_proc_what);
+
 #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
 /* When GDB is built as 64-bit application on Solaris, the auxv data
    is presented in 64-bit format.  We need to provide a custom parser
@@ -211,6 +214,7 @@ procfs_target (void)
   t->to_has_thread_control = tc_schedlock;
   t->to_find_memory_regions = proc_find_memory_regions;
   t->to_make_corefile_notes = procfs_make_note_section;
+  t->to_info_proc = procfs_info_proc;
 
 #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
   t->to_auxv_parse = procfs_auxv_parse;
@@ -5390,63 +5394,42 @@ info_proc_mappings (procinfo *pi, int su
 /* Implement the "info proc" command.  */
 
 static void
-info_proc_cmd (char *args, int from_tty)
+procfs_info_proc (struct target_ops *ops, ptid_t ptid,
+		  enum info_proc_what what)
 {
   struct cleanup *old_chain;
   procinfo *process  = NULL;
   procinfo *thread   = NULL;
-  char    **argv     = NULL;
-  char     *tmp      = NULL;
-  int       pid      = 0;
-  int       tid      = 0;
+  int       pid      = ptid_get_pid (ptid);
+  int       tid      = ptid_get_tid (ptid);
   int       mappings = 0;
 
-  old_chain = make_cleanup (null_cleanup, 0);
-  if (args)
+  switch (what)
     {
-      argv = gdb_buildargv (args);
-      make_cleanup_freeargv (argv);
-    }
-  while (argv != NULL && *argv != NULL)
-    {
-      if (isdigit (argv[0][0]))
-	{
-	  pid = strtoul (argv[0], &tmp, 10);
-	  if (*tmp == '/')
-	    tid = strtoul (++tmp, NULL, 10);
-	}
-      else if (argv[0][0] == '/')
-	{
-	  tid = strtoul (argv[0] + 1, NULL, 10);
-	}
-      else if (strncmp (argv[0], "mappings", strlen (argv[0])) == 0)
-	{
-	  mappings = 1;
-	}
-      else
-	{
-	  /* [...] */
-	}
-      argv++;
+    case IP_MINIMAL:
+      break;
+
+    case IP_MAPPINGS:
+    case IP_ALL:
+      mappings = 1;
+      break;
+
+    default:
+      error (_("Not supported on this target."));
     }
-  if (pid == 0)
-    pid = PIDGET (inferior_ptid);
-  if (pid == 0)
-    error (_("No current process: you must name one."));
-  else
-    {
-      /* Have pid, will travel.
-	 First see if it's a process we're already debugging.  */
-      process = find_procinfo (pid, 0);
-       if (process == NULL)
-	 {
-	   /* No.  So open a procinfo for it, but
-	      remember to close it again when finished.  */
-	   process = create_procinfo (pid, 0);
-	   make_cleanup (do_destroy_procinfo_cleanup, process);
-	   if (!open_procinfo_files (process, FD_CTL))
-	     proc_error (process, "info proc, open_procinfo_files", __LINE__);
-	 }
+
+  old_chain = make_cleanup (null_cleanup, 0);
+
+  /* First see if it's a process we're already debugging.  */
+  process = find_procinfo (pid, 0);
+  if (process == NULL)
+    {
+      /* No.  So open a procinfo for it, but
+	 remember to close it again when finished.  */
+      process = create_procinfo (pid, 0);
+      make_cleanup (do_destroy_procinfo_cleanup, process);
+      if (!open_procinfo_files (process, FD_CTL))
+	proc_error (process, "info proc, open_procinfo_files", __LINE__);
     }
   if (tid != 0)
     thread = create_procinfo (pid, tid);
@@ -5567,10 +5550,6 @@ _initialize_procfs (void)
 {
   observer_attach_inferior_created (procfs_inferior_created);
 
-  add_info ("proc", info_proc_cmd, _("\
-Show /proc process information about any running process.\n\
-Specify process id, or use the program being debugged by default.\n\
-Specify keyword 'mappings' for detailed info on memory mappings."));
   add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd,
 	   _("Give a trace of entries into the syscall."));
   add_com ("proc-trace-exit", no_class, proc_trace_sysexit_cmd,
Index: gdb-head/gdb/target.c
===================================================================
--- gdb-head.orig/gdb/target.c	2012-01-13 18:45:57.000000000 +0100
+++ gdb-head/gdb/target.c	2012-01-13 18:45:58.000000000 +0100
@@ -3088,6 +3088,31 @@ target_supports_non_stop (void)
   return 0;
 }
 
+/* Show information about process PTID.  */
+
+void
+target_info_proc (ptid_t ptid, enum info_proc_what what)
+{
+  struct target_ops *t;
+
+  for (t = current_target.beneath; t != NULL; t = t->beneath)
+    {
+      if (t->to_info_proc != NULL)
+	{
+	  t->to_info_proc (t, ptid, what);
+
+	  if (targetdebug)
+	    fprintf_unfiltered (gdb_stdlog,
+				"target_info_proc (%s, %d)\n",
+				target_pid_to_str (ptid), what);
+
+	  return;
+	}
+    }
+
+  error (_("Not supported on this target."));
+}
+
 static int
 find_default_supports_disable_randomization (void)
 {
Index: gdb-head/gdb/linux-nat.c
===================================================================
--- gdb-head.orig/gdb/linux-nat.c	2012-01-13 18:36:34.000000000 +0100
+++ gdb-head/gdb/linux-nat.c	2012-01-13 18:45:58.000000000 +0100
@@ -58,7 +58,6 @@
 #include <sys/vfs.h>
 #include "solib.h"
 #include "linux-osdata.h"
-#include "cli/cli-utils.h"
 
 #ifndef SPUFS_MAGIC
 #define SPUFS_MAGIC 0x23c9b64e
@@ -4803,39 +4802,11 @@ linux_nat_make_corefile_notes (bfd *obfd
 
 /* Implement the "info proc" command.  */
 
-enum info_proc_what
-  {
-    /* Display the default cmdline, cwd and exe outputs.  */
-    IP_MINIMAL,
-
-    /* Display `info proc mappings'.  */
-    IP_MAPPINGS,
-
-    /* Display `info proc status'.  */
-    IP_STATUS,
-
-    /* Display `info proc stat'.  */
-    IP_STAT,
-
-    /* Display `info proc cmdline'.  */
-    IP_CMDLINE,
-
-    /* Display `info proc exe'.  */
-    IP_EXE,
-
-    /* Display `info proc cwd'.  */
-    IP_CWD,
-
-    /* Display all of the above.  */
-    IP_ALL
-  };
-
 static void
-linux_nat_info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty)
+linux_nat_info_proc (struct target_ops *ops, ptid_t ptid,
+		     enum info_proc_what what)
 {
-  /* A long is used for pid instead of an int to avoid a loss of precision
-     compiler warning from the output of strtoul.  */
-  long pid = PIDGET (inferior_ptid);
+  long pid = ptid_get_pid (ptid);
   FILE *procfile;
   char buffer[MAXPATHLEN];
   char fname1[MAXPATHLEN], fname2[MAXPATHLEN];
@@ -4847,16 +4818,6 @@ linux_nat_info_proc_cmd_1 (char *args, e
   int stat_f = (what == IP_STAT || what == IP_ALL);
   struct stat dummy;
 
-  if (args && isdigit (args[0]))
-    pid = strtoul (args, &args, 10);
-
-  args = skip_spaces (args);
-  if (args && args[0])
-    error (_("Too many parameters: %s"), args);
-
-  if (pid == 0)
-    error (_("No current process: you must name one."));
-
   sprintf (fname1, "/proc/%ld", pid);
   if (stat (fname1, &dummy) != 0)
     error (_("No /proc directory: '%s'"), fname1);
@@ -5072,70 +5033,6 @@ linux_nat_info_proc_cmd_1 (char *args, e
     }
 }
 
-/* Implement `info proc' when given without any futher parameters.  */
-
-static void
-linux_nat_info_proc_cmd (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_MINIMAL, from_tty);
-}
-
-/* Implement `info proc mappings'.  */
-
-static void
-linux_nat_info_proc_cmd_mappings (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_MAPPINGS, from_tty);
-}
-
-/* Implement `info proc stat'.  */
-
-static void
-linux_nat_info_proc_cmd_stat (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_STAT, from_tty);
-}
-
-/* Implement `info proc status'.  */
-
-static void
-linux_nat_info_proc_cmd_status (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_STATUS, from_tty);
-}
-
-/* Implement `info proc cwd'.  */
-
-static void
-linux_nat_info_proc_cmd_cwd (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_CWD, from_tty);
-}
-
-/* Implement `info proc cmdline'.  */
-
-static void
-linux_nat_info_proc_cmd_cmdline (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_CMDLINE, from_tty);
-}
-
-/* Implement `info proc exe'.  */
-
-static void
-linux_nat_info_proc_cmd_exe (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_EXE, from_tty);
-}
-
-/* Implement `info proc all'.  */
-
-static void
-linux_nat_info_proc_cmd_all (char *args, int from_tty)
-{
-  linux_nat_info_proc_cmd_1 (args, IP_ALL, from_tty);
-}
-
 /* Implement the to_xfer_partial interface for memory reads using the /proc
    filesystem.  Because we can use a single read() call for /proc, this
    can be much more efficient than banging away at PTRACE_PEEKTEXT,
@@ -5430,6 +5327,7 @@ linux_target_install_ops (struct target_
   t->to_follow_fork = linux_child_follow_fork;
   t->to_find_memory_regions = linux_nat_find_memory_regions;
   t->to_make_corefile_notes = linux_nat_make_corefile_notes;
+  t->to_info_proc = linux_nat_info_proc;
 
   super_xfer_partial = t->to_xfer_partial;
   t->to_xfer_partial = linux_xfer_partial;
@@ -5940,43 +5838,6 @@ extern initialize_file_ftype _initialize
 void
 _initialize_linux_nat (void)
 {
-  static struct cmd_list_element *info_proc_cmdlist;
-
-  add_prefix_cmd ("proc", class_info, linux_nat_info_proc_cmd,
-		  _("\
-Show /proc process information about any running process.\n\
-Specify any process id, or use the program being debugged by default."),
-		  &info_proc_cmdlist, "info proc ",
-		  1/*allow-unknown*/, &infolist);
-
-  add_cmd ("mappings", class_info, linux_nat_info_proc_cmd_mappings, _("\
-List of mapped memory regions."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("stat", class_info, linux_nat_info_proc_cmd_stat, _("\
-List process info from /proc/PID/stat."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("status", class_info, linux_nat_info_proc_cmd_status, _("\
-List process info from /proc/PID/status."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("cwd", class_info, linux_nat_info_proc_cmd_cwd, _("\
-List current working directory of the process."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("cmdline", class_info, linux_nat_info_proc_cmd_cmdline, _("\
-List command line arguments of the process."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("exe", class_info, linux_nat_info_proc_cmd_exe, _("\
-List absolute filename for executable of the process."),
-	   &info_proc_cmdlist);
-
-  add_cmd ("all", class_info, linux_nat_info_proc_cmd_all, _("\
-List all available /proc info."),
-	   &info_proc_cmdlist);
-
   add_setshow_zinteger_cmd ("lin-lwp", class_maintenance,
 			    &debug_linux_nat, _("\
 Set debugging of GNU/Linux lwp module."), _("\
Index: gdb-head/gdb/infcmd.c
===================================================================
--- gdb-head.orig/gdb/infcmd.c	2012-01-13 18:36:34.000000000 +0100
+++ gdb-head/gdb/infcmd.c	2012-01-13 18:45:58.000000000 +0100
@@ -56,6 +56,8 @@
 #include "inf-loop.h"
 #include "continuations.h"
 #include "linespec.h"
+#include "cli/cli-utils.h"
+
 
 /* Functions exported for general use, in inferior.h: */
 
@@ -2805,9 +2807,105 @@ unset_command (char *args, int from_tty)
   help_list (unsetlist, "unset ", -1, gdb_stdout);
 }
 
+/* Implement `info proc' family of commands.  */
+
+static void
+info_proc_cmd_1 (char *args, enum info_proc_what what, int from_tty)
+{
+  long pid, tid;
+
+  if (args && isdigit (args[0]))
+    pid = strtoul (args, &args, 10);
+  else
+    {
+      if (!target_has_execution)
+	error (_("No current process: you must name one."));
+      if (current_inferior ()->fake_pid_p)
+	error (_("Can't determine the current process's PID: you must name one."));
+
+      pid = current_inferior ()->pid;
+    }
+
+  if (args && *args == '/')
+    tid = strtoul (args + 1, &args, 10);
+  else
+    tid = 0;
+
+  args = skip_spaces (args);
+  if (args && args[0])
+    error (_("Too many parameters: %s"), args);
+
+  target_info_proc (ptid_build (pid, 0, tid), what);
+}
+
+/* Implement `info proc' when given without any futher parameters.  */
+
+static void
+info_proc_cmd (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_MINIMAL, from_tty);
+}
+
+/* Implement `info proc mappings'.  */
+
+static void
+info_proc_cmd_mappings (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_MAPPINGS, from_tty);
+}
+
+/* Implement `info proc stat'.  */
+
+static void
+info_proc_cmd_stat (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_STAT, from_tty);
+}
+
+/* Implement `info proc status'.  */
+
+static void
+info_proc_cmd_status (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_STATUS, from_tty);
+}
+
+/* Implement `info proc cwd'.  */
+
+static void
+info_proc_cmd_cwd (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_CWD, from_tty);
+}
+
+/* Implement `info proc cmdline'.  */
+
+static void
+info_proc_cmd_cmdline (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_CMDLINE, from_tty);
+}
+
+/* Implement `info proc exe'.  */
+
+static void
+info_proc_cmd_exe (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_EXE, from_tty);
+}
+
+/* Implement `info proc all'.  */
+
+static void
+info_proc_cmd_all (char *args, int from_tty)
+{
+  info_proc_cmd_1 (args, IP_ALL, from_tty);
+}
+
 void
 _initialize_infcmd (void)
 {
+  static struct cmd_list_element *info_proc_cmdlist;
   struct cmd_list_element *c = NULL;
 
   /* Add the filename of the terminal connected to inferior I/O.  */
@@ -3034,4 +3132,39 @@ Register name as argument means describe
 
   add_info ("vector", vector_info,
 	    _("Print the status of the vector unit\n"));
+
+  add_prefix_cmd ("proc", class_info, info_proc_cmd,
+		  _("\
+Show /proc process information about any running process.\n\
+Specify any process id, or use the program being debugged by default."),
+		  &info_proc_cmdlist, "info proc ",
+		  1/*allow-unknown*/, &infolist);
+
+  add_cmd ("mappings", class_info, info_proc_cmd_mappings, _("\
+List of mapped memory regions."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("stat", class_info, info_proc_cmd_stat, _("\
+List process info from /proc/PID/stat."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("status", class_info, info_proc_cmd_status, _("\
+List process info from /proc/PID/status."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("cwd", class_info, info_proc_cmd_cwd, _("\
+List current working directory of the process."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("cmdline", class_info, info_proc_cmd_cmdline, _("\
+List command line arguments of the process."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("exe", class_info, info_proc_cmd_exe, _("\
+List absolute filename for executable of the process."),
+	   &info_proc_cmdlist);
+
+  add_cmd ("all", class_info, info_proc_cmd_all, _("\
+List all available /proc info."),
+	   &info_proc_cmdlist);
 }
Index: gdb-head/gdb/defs.h
===================================================================
--- gdb-head.orig/gdb/defs.h	2012-01-13 18:36:34.000000000 +0100
+++ gdb-head/gdb/defs.h	2012-01-13 18:45:58.000000000 +0100
@@ -752,6 +752,35 @@ extern struct command_line *read_command
 
 extern void free_command_lines (struct command_line **);
 
+/* Parameters of the "info proc" command.  */
+
+enum info_proc_what
+  {
+    /* Display the default cmdline, cwd and exe outputs.  */
+    IP_MINIMAL,
+
+    /* Display `info proc mappings'.  */
+    IP_MAPPINGS,
+
+    /* Display `info proc status'.  */
+    IP_STATUS,
+
+    /* Display `info proc stat'.  */
+    IP_STAT,
+
+    /* Display `info proc cmdline'.  */
+    IP_CMDLINE,
+
+    /* Display `info proc exe'.  */
+    IP_EXE,
+
+    /* Display `info proc cwd'.  */
+    IP_CWD,
+
+    /* Display all of the above.  */
+    IP_ALL
+  };
+
 /* String containing the current directory (what getwd would return).  */
 
 extern char *current_directory;
Index: gdb-head/gdb/testsuite/gdb.base/info-proc.exp
===================================================================
--- gdb-head.orig/gdb/testsuite/gdb.base/info-proc.exp	2012-01-13 18:36:34.000000000 +0100
+++ gdb-head/gdb/testsuite/gdb.base/info-proc.exp	2012-01-13 18:45:58.000000000 +0100
@@ -20,11 +20,6 @@ if $tracelevel then {
 	strace $tracelevel
 }
 
-if { [is_remote target] } then {
-  continue
-}
-
-
 set ws "\[ \t\]+"
 
 set testfile "break"
@@ -54,17 +49,7 @@ gdb_start
 gdb_reinitialize_dir $srcdir/$subdir
 gdb_load ${binfile}
 
-# Does this gdb support info proc?
-gdb_test_multiple "help info proc" "help info proc" {
-    -re "Undefined info command: .proc..  Try .help info.*$gdb_prompt $" {
-	# info proc command not supported -- nothing to test here.
-	unsupported "gdb does not support info proc on this target"
-	return -1;
-    }
-    -re "Show /proc process information about .*$gdb_prompt $" {
-	pass "help info proc"
-    }
-}
+gdb_test "help info proc" "Show /proc process information about .*"
 
 gdb_test "info proc" "No current process.*" "info proc without a process"
 
@@ -73,7 +58,17 @@ if { ! [ runto_main ] } then {
     return -1
 }
 
-gdb_test "info proc" "process ${decimal}.*" "info proc with process"
+# Does this gdb support info proc?
+gdb_test_multiple "info proc" "info proc" {
+    -re "Not supported on this target.*$gdb_prompt $" {
+	# info proc command not supported -- nothing to test here.
+	unsupported "gdb does not support info proc on this target"
+	return -1;
+    }
+    -re "process ${decimal}.*$gdb_prompt $" {
+	pass "info proc with process"
+    }
+}
 
 gdb_test "info proc mapping" \
 	".*Mapped address spaces:.*${hex}${ws}${hex}${ws}${hex}${ws}${hex}.*" \

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com



More information about the Gdb-patches mailing list