Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: ludo@gnu.org (Ludovic Courtès)
To: gdb-patches@sources.redhat.com
Subject: [PATCH] Allow printing of Guile values
Date: Fri, 20 Jul 2007 15:19:00 -0000	[thread overview]
Message-ID: <87ir8f2lrh.fsf@chbouib.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 1736 bytes --]

Hi,

The attached patch fixes printing of Guile objects.  It does so by
querying the inferior Guile process for a textual representation of the
values.

Actually, support routines (namely `gdb_print ()') have been in Guile
for a long time, but have never been used by GDB.  I tested it with
Guile 1.8, but it should also work with 1.6, and perhaps even with older
versions.

Example:

  Breakpoint 4, scm_sum (x=0xf2, y=0x6) at numbers.c:3953
  3953      if (SCM_UNBNDP (y))
  (gdb) set language scheme
  Warning: the current language does not match this frame.
  (gdb) frame
  #0  scm_sum (x=60, y=1) at numbers.c:3953
  3953      if (SCM_UNBNDP (y))

Same with non-immediate values:

  Breakpoint 3, deval (x=0xb7c38978, env=0xb7bc7370) at eval.i.c:215
  215   debug.prev = scm_i_last_debug_frame ();
  (gdb) set language scheme
  (gdb) frame
  #0  deval (
      x=(#<variable b7c3dbc0 value: #<primitive-procedure copy-tree>> (#<variable b7c3e5b0 value: #<procedure apply (fun . args)>> #@1+0 (#<variable b7c094c0 value: #<primitive-procedure cdr>> #@0+0))), env=(((exp env) (false-if-exception (stat str)) (((str) "/home/ludo/.guile"))) ((f) #<procedure #f (expr)>))) at eval.i.c:215
  215   debug.prev = scm_i_last_debug_frame ();


It's my first time hacking GDB, so please don't hesitate to correct me
if the patch looks bad.

I have not yet signed copyright assignment papers for GDB.  I will do it
if deemed necessary.

Thanks,
Ludovic.


gdb/ChangeLog

2007-07-20  Ludovic Courtès  <ludo@gnu.org>

	* scm-lang.c (is_scmvalue_type): Don't check for `TYPE_CODE' of
	TYPE since it may lead to wrong results.
	* scm-valprint.c (scm_inferior_print): Use facilities provided
	by the inferior Guile process, namely `gdb_print ()'.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: The patch --]
[-- Type: text/x-patch, Size: 3051 bytes --]

--- scm-lang.c.orig	2007-07-20 10:04:20.000000000 +0200
+++ scm-lang.c	2007-07-20 16:12:47.000000000 +0200
@@ -1,6 +1,6 @@
 /* Scheme/Guile language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 Free
+   Copyright (C) 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free
    Software Foundation, Inc.
 
    This file is part of GDB.
@@ -59,8 +59,7 @@
 int
 is_scmvalue_type (struct type *type)
 {
-  if (TYPE_CODE (type) == TYPE_CODE_INT
-      && TYPE_NAME (type) && strcmp (TYPE_NAME (type), "SCM") == 0)
+  if (TYPE_NAME (type) && strcmp (TYPE_NAME (type), "SCM") == 0)
     {
       return 1;
     }

--- scm-valprint.c.orig	2007-07-20 16:07:11.000000000 +0200
+++ scm-valprint.c	2007-07-20 16:08:13.000000000 +0200
@@ -1,6 +1,6 @@
 /* Scheme/Guile language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2005 Free Software
+   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2005, 2007 Free Software
    Foundation, Inc.
 
    This file is part of GDB.
@@ -31,6 +31,7 @@
 #include "valprint.h"
 #include "gdbcore.h"
 #include "c-lang.h"
+#include "infcall.h"
 
 static void scm_ipruk (char *, LONGEST, struct ui_file *);
 static void scm_scmlist_print (LONGEST, struct ui_file *, int, int,
@@ -39,14 +40,53 @@
 			       int, enum val_prettyprint);
 
 /* Prints the SCM value VALUE by invoking the inferior, if appropraite.
-   Returns >= 0 on succes;  retunr -1 if the inferior cannot/should not
+   Returns >= 0 on success;  return -1 if the inferior cannot/should not
    print VALUE. */
 
 static int
 scm_inferior_print (LONGEST value, struct ui_file *stream, int format,
 		    int deref_ref, int recurse, enum val_prettyprint pretty)
 {
-  return -1;
+  struct value *func, *arg, *result;
+  struct symbol *gdb_output_sym, *gdb_output_len_sym;
+  char *output;
+  int ret, output_len;
+
+  func = find_function_in_inferior ("gdb_print");
+  arg = value_from_longest (builtin_type_CORE_ADDR, value);
+
+  result = call_function_by_hand (func, 1, &arg);
+  ret = (int) value_as_long (result);
+  if (ret == 0)
+    {
+      /* XXX: Should we cache these symbols?  */
+      gdb_output_sym =
+	lookup_symbol_global ("gdb_output", NULL, VAR_DOMAIN,
+			      (struct symtab **) NULL);
+      gdb_output_len_sym =
+	lookup_symbol_global ("gdb_output_length", NULL, VAR_DOMAIN,
+			      (struct symtab **) NULL);
+
+      if ((gdb_output_sym == NULL) || (gdb_output_len_sym == NULL))
+	ret = -1;
+      else
+	{
+	  struct value *remote_buffer;
+
+	  read_memory (SYMBOL_VALUE_ADDRESS (gdb_output_len_sym),
+		       (char *) &output_len, sizeof (output_len));
+
+	  output = (char *) alloca (output_len);
+	  remote_buffer = value_at (builtin_type_CORE_ADDR,
+				    SYMBOL_VALUE_ADDRESS (gdb_output_sym));
+	  read_memory (value_as_address (remote_buffer),
+		       output, output_len);
+
+	  ui_file_write (stream, output, output_len);
+	}
+    }
+
+  return ret;
 }
 
 /* {Names of immediate symbols}

             reply	other threads:[~2007-07-20 14:35 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-20 15:19 Ludovic Courtès [this message]
2007-07-20 15:57 ` Daniel Jacobowitz
2007-07-20 16:49   ` Ludovic Courtès
2007-07-20 18:22     ` Jim Blandy
2007-07-20 19:37       ` Ludovic Courtès
2007-07-20 20:12         ` Jim Blandy
2007-07-20 21:18           ` Ludovic Courtès
2007-07-28  1:17 ` Jim Blandy
2007-07-28 16:48   ` Ludovic Courtès
2007-08-07 18:50     ` Jim Blandy
2007-08-09 21:54       ` Ludovic Courtès
2007-08-09 22:30         ` Eli Zaretskii
2007-08-09 23:03       ` Ludovic Courtès
2007-08-03 21:38 ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ir8f2lrh.fsf@chbouib.org \
    --to=ludo@gnu.org \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox