From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13485 invoked by alias); 20 Jul 2007 14:35:59 -0000 Received: (qmail 13473 invoked by uid 22791); 20 Jul 2007 14:35:58 -0000 X-Spam-Check-By: sourceware.org Received: from main.gmane.org (HELO ciao.gmane.org) (80.91.229.2) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 20 Jul 2007 14:35:50 +0000 Received: from root by ciao.gmane.org with local (Exim 4.43) id 1IBtZO-0003D2-32 for gdb-patches@sources.redhat.com; Fri, 20 Jul 2007 16:35:02 +0200 Received: from adh419.fdn.fr ([80.67.176.9]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 20 Jul 2007 16:35:02 +0200 Received: from ludo by adh419.fdn.fr with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 20 Jul 2007 16:35:02 +0200 To: gdb-patches@sources.redhat.com From: ludo@gnu.org (Ludovic =?iso-8859-1?Q?Court=E8s?=) Subject: [PATCH] Allow printing of Guile values Date: Fri, 20 Jul 2007 15:19:00 -0000 Message-ID: <87ir8f2lrh.fsf@chbouib.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-URL: http://www.laas.fr/~lcourtes/ X-PGP-Key-ID: 0xEB1F5364 X-PGP-Key: http://www.laas.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 821D 815D 902A 7EAB 5CEE D120 7FBA 3D4F EB1F 5364 X-OS: i486-pc-linux-gnu User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-07/txt/msg00232.txt.bz2 --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Content-length: 1735 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=(#> (#> #@1+0 (#> #@0+0))), env=(((exp env) (false-if-exception (stat str)) (((str) "/home/ludo/.guile"))) ((f) #))) 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 * 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 ()'. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename*=us-ascii''%2c%2cguile-1.diff Content-Description: The patch Content-length: 3051 --- 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} --=-=-=--