From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1537 invoked by alias); 4 Mar 2003 19:50:43 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 1515 invoked from network); 4 Mar 2003 19:50:42 -0000 Received: from unknown (HELO crack.them.org) (65.125.64.184) by 172.16.49.205 with SMTP; 4 Mar 2003 19:50:42 -0000 Received: from nevyn.them.org ([66.93.61.169] ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 18qKKI-0001wX-00; Tue, 04 Mar 2003 15:51:54 -0600 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 18qIQy-00085Q-00; Tue, 04 Mar 2003 14:50:40 -0500 Date: Tue, 04 Mar 2003 19:50:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com, Eli Zaretskii Subject: Re: [RFA:doc] Add "set cp-abi" command. Message-ID: <20030304195040.GA31068@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, Eli Zaretskii References: <20030303015636.GA2976@nevyn.them.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030303015636.GA2976@nevyn.them.org> User-Agent: Mutt/1.5.1i X-SW-Source: 2003-03/txt/msg00111.txt.bz2 Eli, apologies if you'd already seen this. Are the docs below OK? On Sun, Mar 02, 2003 at 08:56:36PM -0500, Daniel Jacobowitz wrote: > I was in the middle of adding a comment referencing "set cp-abi", and > discovered the command had never gotten checked in. I updated Jim's patch > to current CVS, rewrote the documentation, and moved it to the new > "Configuring the current ABI" section of the manual. Eli, are the updated > docs OK? I think I've addressed all your concerns with the original patch. > > Here's the patch I've tested (no surprises in the results). Jim, the MI > output has changed a bit since you posted it. > > -- > Daniel Jacobowitz > MontaVista Software Debian GNU/Linux Developer > > 2003-03-02 James Ingham > Daniel Jacobowitz > > * cp-abi.c: Include "command.h", "gdbcmd.h", and "ui-out.h". > (auto_cp_abi): New variable. > (current_cp_abi, num_cp_abis): Make static. > (CP_ABI_MAX): Define. > (cp_abis): Turn into an array. > (value_virtual_fn_field): Fix formatting. > (switch_to_cp_abi, register_cp_abi): Update. register_cp_abi now > takes a pointer. > (set_cp_abi_as_auto_default, set_cp_abi_cmd, show_cp_abi_cmd) > (list_cp_abis, _initialize_cp_abi): New functions. > * cp-abi.h: Add prototype for set_cp_abi_as_auto_default. Remove > declarations for cp_abis, num_cp_abis, current_cp_abi, and > switch_to_cp_abi. Update prototype for register_cp_abi. > * Makefile.in (cp-abi.o): Update dependencies. > * minsyms.c (install_minimal_symbols): Call set_cp_abi_as_auto_default > instead of switch_to_cp_abi. > * gnu-v2-abi.c (_initialize_gnu_v2_abi): Likewise. Update call to > register_cp_abi. > * gnu-v3-abi.c (_initialize_gnu_v3_abi): Update call to > register_cp_abi. > * hpacc-abi.c (_initialize_hpacc_abi): Likewise. > > 2003-03-02 James Ingham > Daniel Jacobowitz > > * gdb.texinfo (Configuring the current ABI): Document "set cp-abi" > and "show cp-abi". > > Index: cp-abi.c > =================================================================== > RCS file: /cvs/src/src/gdb/cp-abi.c,v > retrieving revision 1.4 > diff -u -p -r1.4 cp-abi.c > --- cp-abi.c 27 Aug 2002 22:37:06 -0000 1.4 > +++ cp-abi.c 3 Mar 2003 00:21:00 -0000 > @@ -21,13 +21,20 @@ > #include "defs.h" > #include "value.h" > #include "cp-abi.h" > +#include "command.h" > +#include "gdbcmd.h" > +#include "ui-out.h" > + > #include "gdb_string.h" > > -struct cp_abi_ops current_cp_abi; > +static struct cp_abi_ops *find_cp_abi (const char *short_name); > > -struct cp_abi_ops *cp_abis; > +static struct cp_abi_ops current_cp_abi = { "", NULL }; > +static struct cp_abi_ops auto_cp_abi = { "auto", NULL }; > > -int num_cp_abis = 0; > +#define CP_ABI_MAX 8 > +static struct cp_abi_ops *cp_abis[CP_ABI_MAX]; > +static int num_cp_abis = 0; > > enum ctor_kinds > is_constructor_name (const char *name) > @@ -71,8 +78,8 @@ baseclass_offset (struct type *type, int > } > > struct value * > -value_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, > - struct type * type, int offset) > +value_virtual_fn_field (struct value **arg1p, struct fn_field *f, int j, > + struct type *type, int offset) > { > if ((current_cp_abi.virtual_fn_field) == NULL) > return NULL; > @@ -87,24 +94,157 @@ value_rtti_type (struct value *v, int *f > return (*current_cp_abi.rtti_type) (v, full, top, using_enc); > } > > +/* Set the current C++ ABI to SHORT_NAME. */ > + > +static int > +switch_to_cp_abi (const char *short_name) > +{ > + struct cp_abi_ops *abi; > + > + abi = find_cp_abi (short_name); > + if (abi == NULL) > + return 0; > + > + current_cp_abi = *abi; > + return 1; > +} > + > +/* Add ABI to the list of supported C++ ABI's. */ > + > int > -register_cp_abi (struct cp_abi_ops abi) > +register_cp_abi (struct cp_abi_ops *abi) > { > - cp_abis = > - xrealloc (cp_abis, (num_cp_abis + 1) * sizeof (struct cp_abi_ops)); > + if (num_cp_abis == CP_ABI_MAX) > + internal_error (__FILE__, __LINE__, > + "Too many C++ ABIs, please increase CP_ABI_MAX in cp-abi.c"); > + > cp_abis[num_cp_abis++] = abi; > > return 1; > +} > + > +/* Set the ABI to use in "auto" mode to SHORT_NAME. */ > > +void > +set_cp_abi_as_auto_default (const char *short_name) > +{ > + char *new_longname, *new_doc; > + struct cp_abi_ops *abi = find_cp_abi (short_name); > + > + if (abi == NULL) > + internal_error (__FILE__, __LINE__, > + "Cannot find C++ ABI \"%s\" to set it as auto default.", > + short_name); > + > + if (auto_cp_abi.longname != NULL) > + xfree ((char *) auto_cp_abi.longname); > + if (auto_cp_abi.doc != NULL) > + xfree ((char *) auto_cp_abi.doc); > + > + auto_cp_abi = *abi; > + > + auto_cp_abi.shortname = "auto"; > + new_longname = xmalloc (strlen ("currently ") + 1 + strlen (abi->shortname) > + + 1 + 1); > + sprintf (new_longname, "currently \"%s\"", abi->shortname); > + auto_cp_abi.longname = new_longname; > + > + new_doc = xmalloc (strlen ("Automatically selected; currently ") > + + 1 + strlen (abi->shortname) + 1 + 1); > + sprintf (new_doc, "Automatically selected; currently \"%s\"", abi->shortname); > + auto_cp_abi.doc = new_doc; > + > + /* Since we copy the current ABI into current_cp_abi instead of > + using a pointer, if auto is currently the default, we need to > + reset it. */ > + if (strcmp (current_cp_abi.shortname, "auto") == 0) > + switch_to_cp_abi ("auto"); > } > > -int > -switch_to_cp_abi (const char *short_name) > +/* Return the ABI operations associated with SHORT_NAME. */ > + > +static struct cp_abi_ops * > +find_cp_abi (const char *short_name) > { > int i; > + > for (i = 0; i < num_cp_abis; i++) > - if (strcmp (cp_abis[i].shortname, short_name) == 0) > - current_cp_abi = cp_abis[i]; > - return 1; > + if (strcmp (cp_abis[i]->shortname, short_name) == 0) > + return cp_abis[i]; > + > + return NULL; > } > > +/* Display the list of registered C++ ABIs. */ > + > +static void > +list_cp_abis (int from_tty) > +{ > + struct cleanup *cleanup_chain; > + int i; > + ui_out_text (uiout, "The available C++ ABIs are:\n"); > + > + cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "cp-abi-list"); > + for (i = 0; i < num_cp_abis; i++) > + { > + char pad[14]; > + int padcount; > + > + ui_out_text (uiout, " "); > + ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname); > + > + padcount = 16 - 2 - strlen (cp_abis[i]->shortname); > + pad[padcount] = 0; > + while (padcount > 0) > + pad[--padcount] = ' '; > + ui_out_text (uiout, pad); > + > + ui_out_field_string (uiout, "doc", cp_abis[i]->doc); > + ui_out_text (uiout, "\n"); > + } > + do_cleanups (cleanup_chain); > +} > + > +/* Set the current C++ ABI, or display the list of options if no > + argument is given. */ > + > +static void > +set_cp_abi_cmd (char *args, int from_tty) > +{ > + if (args == NULL) > + { > + list_cp_abis (from_tty); > + return; > + } > + > + if (!switch_to_cp_abi (args)) > + error ("Could not find \"%s\" in ABI list", args); > +} > + > +/* Show the currently selected C++ ABI. */ > + > +static void > +show_cp_abi_cmd (char *args, int from_tty) > +{ > + ui_out_text (uiout, "The currently selected C++ ABI is \""); > + > + ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname); > + ui_out_text (uiout, "\" ("); > + ui_out_field_string (uiout, "longname", current_cp_abi.longname); > + ui_out_text (uiout, ").\n"); > +} > + > +void > +_initialize_cp_abi (void) > +{ > + register_cp_abi (&auto_cp_abi); > + switch_to_cp_abi ("auto"); > + > + add_cmd ("cp-abi", class_obscure, set_cp_abi_cmd, > + "Set the ABI used for inspecting C++ objects.\n" > + "\"set cp-abi\" with no arguments will list the available ABIs.", > + &setlist); > + > + add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd, > + "Show the ABI used for inspecting C++ objects.", &showlist); > +} > Index: cp-abi.h > =================================================================== > RCS file: /cvs/src/src/gdb/cp-abi.h,v > retrieving revision 1.4 > diff -u -p -r1.4 cp-abi.h > --- cp-abi.h 4 Jan 2002 18:20:19 -0000 1.4 > +++ cp-abi.h 3 Mar 2003 00:21:00 -0000 > @@ -163,11 +163,8 @@ struct cp_abi_ops > }; > > > -extern struct cp_abi_ops *cp_abis; > -extern int num_cp_abis; > -extern struct cp_abi_ops current_cp_abi; > -extern int register_cp_abi (struct cp_abi_ops abi); > -extern int switch_to_cp_abi (const char *short_name); > +extern int register_cp_abi (struct cp_abi_ops *abi); > +extern void set_cp_abi_as_auto_default (const char *short_name); > > #endif > > Index: gnu-v2-abi.c > =================================================================== > RCS file: /cvs/src/src/gdb/gnu-v2-abi.c,v > retrieving revision 1.10 > diff -u -p -r1.10 gnu-v2-abi.c > --- gnu-v2-abi.c 25 Feb 2003 21:36:17 -0000 1.10 > +++ gnu-v2-abi.c 3 Mar 2003 00:21:00 -0000 > @@ -405,6 +405,6 @@ void > _initialize_gnu_v2_abi (void) > { > init_gnuv2_ops (); > - register_cp_abi (gnu_v2_abi_ops); > - switch_to_cp_abi ("gnu-v2"); > + register_cp_abi (&gnu_v2_abi_ops); > + set_cp_abi_as_auto_default (gnu_v2_abi_ops.shortname); > } > Index: gnu-v3-abi.c > =================================================================== > RCS file: /cvs/src/src/gdb/gnu-v3-abi.c,v > retrieving revision 1.14 > diff -u -p -r1.14 gnu-v3-abi.c > --- gnu-v3-abi.c 2 Oct 2002 22:01:53 -0000 1.14 > +++ gnu-v3-abi.c 3 Mar 2003 00:21:00 -0000 > @@ -453,5 +453,5 @@ _initialize_gnu_v3_abi (void) > { > init_gnuv3_ops (); > > - register_cp_abi (gnu_v3_abi_ops); > + register_cp_abi (&gnu_v3_abi_ops); > } > Index: hpacc-abi.c > =================================================================== > RCS file: /cvs/src/src/gdb/hpacc-abi.c,v > retrieving revision 1.3 > diff -u -p -r1.3 hpacc-abi.c > --- hpacc-abi.c 4 Jan 2002 18:20:19 -0000 1.3 > +++ hpacc-abi.c 3 Mar 2003 00:21:00 -0000 > @@ -324,5 +324,5 @@ _initialize_hpacc_abi (void) > regcomp (&operator_pattern, > "^This will never match anything, please fill it in$", REG_NOSUB); > > - register_cp_abi (hpacc_abi_ops); > + register_cp_abi (&hpacc_abi_ops); > } > Index: minsyms.c > =================================================================== > RCS file: /cvs/src/src/gdb/minsyms.c,v > retrieving revision 1.26 > diff -u -p -r1.26 minsyms.c > --- minsyms.c 25 Feb 2003 21:36:18 -0000 1.26 > +++ minsyms.c 3 Mar 2003 00:21:01 -0000 > @@ -921,7 +921,7 @@ install_minimal_symbols (struct objfile > const char *name = DEPRECATED_SYMBOL_NAME (&objfile->msymbols[i]); > if (name[0] == '_' && name[1] == 'Z') > { > - switch_to_cp_abi ("gnu-v3"); > + set_cp_abi_as_auto_default ("gnu-v3"); > break; > } > } > Index: doc/gdb.texinfo > =================================================================== > RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v > retrieving revision 1.149 > diff -u -p -r1.149 gdb.texinfo > --- doc/gdb.texinfo 23 Feb 2003 22:19:48 -0000 1.149 > +++ doc/gdb.texinfo 3 Mar 2003 00:21:05 -0000 > @@ -12846,6 +12846,32 @@ Arguments of type @code{float} will be p > functions. > @end table > > +@kindex set cp-abi > +@kindex show cp-abi > +@value{GDBN} needs to know the ABI used for your program's C@t{++} > +objects. The correct C@t{++} ABI depends on which C@t{++} compiler was > +used to build your application. @value{GDBN} only fully supports > +programs with a single C@t{++} ABI; if your program contains code using > +multiple C@t{++} ABI's or if @value{GDBN} can not identify your > +program's ABI correctly, you can tell @value{GDBN} which ABI to use. > +Currently supported ABI's include ``gnu-v2'', for @code{g++} versions > +before 3.0, ``gnu-v3'', for @code{g++} versions 3.0 and later, and > +``hpaCC'' for the HP ANSI C@t{++} compiler. Other C@t{++} compilers may > +use the ``gnu-v2'' or ``gnu-v3'' ABI's as well. The default setting is > +``auto''. > + > +@table @code > +@item show cp-abi > +Show the C@t{++} ABI currently in use. > + > +@item set cp-abi > +With no argument, show the list of supported C@t{++} ABI's. > + > +@item set cp-abi @var{abi} > +@itemx set cp-abi auto > +Set the current C@t{++} ABI to @var{abi}, or return to automatic detection. > +@end table > + > @node Messages/Warnings > @section Optional warnings and messages > > Index: Makefile.in > =================================================================== > RCS file: /cvs/src/src/gdb/Makefile.in,v > retrieving revision 1.338 > diff -u -p -r1.338 Makefile.in > --- Makefile.in 1 Mar 2003 17:03:19 -0000 1.338 > +++ Makefile.in 3 Mar 2003 00:22:39 -0000 > @@ -1593,7 +1593,8 @@ corefile.o: corefile.c $(defs_h) $(gdb_s > corelow.o: corelow.c $(defs_h) $(gdb_string_h) $(frame_h) $(inferior_h) \ > $(symtab_h) $(command_h) $(bfd_h) $(target_h) $(gdbcore_h) \ > $(gdbthread_h) $(regcache_h) $(symfile_h) $(readline_h) > -cp-abi.o: cp-abi.c $(defs_h) $(value_h) $(cp_abi_h) $(gdb_string_h) > +cp-abi.o: cp-abi.c $(defs_h) $(value_h) $(cp_abi_h) $(command_h) \ > + $(gdbcmd_h) $(ui_out_h) $(gdb_string_h) > cp-support.o: cp-support.c $(defs_h) $(cp_support_h) > cp-valprint.o: cp-valprint.c $(defs_h) $(gdb_obstack_h) $(symtab_h) \ > $(gdbtypes_h) $(expression_h) $(value_h) $(command_h) $(gdbcmd_h) \ > -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer