From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15309 invoked by alias); 10 Apr 2002 00:27:41 -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 15271 invoked from network); 10 Apr 2002 00:27:27 -0000 Received: from unknown (HELO mail-out1.apple.com) (17.254.0.52) by sources.redhat.com with SMTP; 10 Apr 2002 00:27:27 -0000 Received: from mailgate2.apple.com (A17-129-100-225.apple.com [17.129.100.225]) by mail-out1.apple.com (8.11.3/8.11.3) with ESMTP id g3A0RPt02469 for ; Tue, 9 Apr 2002 17:27:26 -0700 (PDT) Received: from scv2.apple.com (scv2.apple.com) by mailgate2.apple.com (Content Technologies SMTPRS 4.2.1) with ESMTP id ; Tue, 9 Apr 2002 17:27:21 -0700 Received: from inghji (inghji.apple.com [17.202.40.220]) by scv2.apple.com (8.11.3/8.11.3) with ESMTP id g3A0RKi19717; Tue, 9 Apr 2002 17:27:20 -0700 (PDT) Date: Tue, 09 Apr 2002 17:27:00 -0000 Subject: Re: add set cp-abi command Content-Type: multipart/mixed; boundary=Apple-Mail-2--710949309 Mime-Version: 1.0 (Apple Message framework v481) Cc: gdb-patches@sources.redhat.com To: Daniel Jacobowitz From: Jim Ingham In-Reply-To: <20020322140939.A26911@nevyn.them.org> Message-Id: X-SW-Source: 2002-04/txt/msg00389.txt.bz2 --Apple-Mail-2--710949309 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Content-length: 891 I got distracted from this for a little while... Here is a final version with something in the texi file as well. ChangeLog: 2002-03-12 James Ingham * cp-abi.c (set_cp_abi_cmd, show_cp_abi_cmd,): New functions, allow you to set & show cplus abi's in case gdb gets it wrong. (set_cp_abi_as_auto_default): New function, set the "auto" abi to be this abi. (is_cp_abi_auto_p): New function, say whether the current abi is the default or not. (_initialize_cp_abi): Define the cp-abi switching commands. * cp-abi.h: declare the new functions. * minsyms.c (install_minimal_symbols): don't switch the cp_abi unless the current abi is auto. * gnu-v2-abi.c (_initialize_gnu_v2_abi): don't switch to gnu-v2, but set it as the auto_default instead. Okay to check in? --Apple-Mail-2--710949309 Content-Disposition: attachment; filename=cp-abi.patch Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="cp-abi.patch" Content-length: 9940 Index: cp-abi.c =================================================================== RCS file: /cvs/src/src/gdb/cp-abi.c,v retrieving revision 1.3 diff -c -w -p -r1.3 cp-abi.c *** cp-abi.c 4 Jan 2002 18:20:19 -0000 1.3 --- cp-abi.c 10 Apr 2002 00:23:40 -0000 *************** *** 21,32 **** #include "defs.h" #include "value.h" #include "cp-abi.h" ! struct cp_abi_ops current_cp_abi; ! struct cp_abi_ops *cp_abis; ! int num_cp_abis = 0; enum ctor_kinds is_constructor_name (const char *name) --- 21,40 ---- #include "defs.h" #include "value.h" #include "cp-abi.h" + #include "command.h" + #include "ui-out.h" + #include "gdbcmd.h" ! static struct cp_abi_ops *find_cp_abi (const char *short_name); ! static struct cp_abi_ops current_cp_abi = {"", NULL}; ! static struct cp_abi_ops auto_cp_abi = {"auto", NULL}; ! #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) *************** value_rtti_type (struct value *v, int *f *** 87,109 **** } int ! register_cp_abi (struct cp_abi_ops abi) { ! cp_abis = ! xrealloc (cp_abis, (num_cp_abis + 1) * sizeof (struct cp_abi_ops)); cp_abis[num_cp_abis++] = abi; return 1; } int ! switch_to_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; } --- 95,242 ---- } int ! register_cp_abi (struct cp_abi_ops *abi) { ! if (num_cp_abis == CP_ABI_MAX) ! { ! internal_error (__FILE__, __LINE__, ! "Too many CP ABIs, please increase CP_ABI_MAX in cp-abi.c"); ! } ! cp_abis[num_cp_abis++] = abi; return 1; } + void + set_cp_abi_as_auto_default (const char *short_name) + { + 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 (auto_cp_abi.longname); + + if (auto_cp_abi.doc != NULL) + xfree (auto_cp_abi.doc); + + auto_cp_abi = *abi; + + auto_cp_abi.shortname = "auto"; + auto_cp_abi.longname = (char *) xmalloc (strlen ("currently ") + + strlen (abi->shortname)); + sprintf (auto_cp_abi.longname, "currently %s", + abi->shortname); + + auto_cp_abi.doc = (char *) xmalloc (strlen ("currently ") + + strlen (abi->shortname)); + sprintf (auto_cp_abi.doc, "currently %s", + abi->shortname); + + /* 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 (cp_abi_is_auto_p ()) + switch_to_cp_abi ("auto"); + } + int ! cp_abi_is_auto_p () ! { ! if (strcmp (current_cp_abi.shortname, "auto") == 0) ! return 1; ! else ! return 0; ! } ! ! 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) ! { ! return cp_abis[i]; ! } ! ! return NULL; ! } ! ! 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; + + } + + void + show_cp_abis (int from_tty) + { + int i; + ui_out_text (uiout, "The available C++ ABIs are:\n"); + + ui_out_tuple_begin (uiout, "cp-abi-list"); + for (i = 0; i < num_cp_abis; i++) + { + ui_out_field_string (uiout, "cp-abi", cp_abis[i]->shortname); + ui_out_text_fmt (uiout, " - %s\n", cp_abis[i]->doc); + } + ui_out_tuple_end (uiout); + } + void + set_cp_abi_cmd (char *args, int from_tty) + { + + if (args == NULL) + { + show_cp_abis (from_tty); + return; + } + + if (!switch_to_cp_abi (args)) + error ("Could not find \"%s\" in ABI list", args); + } + + 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, "doc", current_cp_abi.doc); + ui_out_text (uiout, ".\n"); + } + + void + _initialize_cp_abi (void) + { + struct cmd_list_element *cmd; + + register_cp_abi (&auto_cp_abi); + switch_to_cp_abi ("auto"); + + cmd = 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); + + cmd = 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 -c -w -p -r1.4 cp-abi.h *** cp-abi.h 4 Jan 2002 18:20:19 -0000 1.4 --- cp-abi.h 10 Apr 2002 00:23:40 -0000 *************** extern int baseclass_offset (struct type *** 146,153 **** struct cp_abi_ops { const char *shortname; ! const char *longname; ! const char *doc; /* ABI-specific implementations for the functions declared above. */ enum ctor_kinds (*is_constructor_name) (const char *name); --- 146,153 ---- struct cp_abi_ops { const char *shortname; ! char *longname; /* These two can't be const, because I need to */ ! char *doc; /* change the name for the auto abi. */ /* ABI-specific implementations for the functions declared above. */ enum ctor_kinds (*is_constructor_name) (const char *name); *************** struct cp_abi_ops *** 163,173 **** }; ! 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); #endif --- 163,172 ---- }; ! extern int register_cp_abi (struct cp_abi_ops *abi); extern int switch_to_cp_abi (const char *short_name); + extern void set_cp_abi_as_auto_default (const char *short_name); + extern int cp_abi_is_auto_p (); #endif Index: gnu-v2-abi.c =================================================================== RCS file: /cvs/src/src/gdb/gnu-v2-abi.c,v retrieving revision 1.6 diff -c -w -p -r1.6 gnu-v2-abi.c *** gnu-v2-abi.c 4 Jan 2002 18:20:19 -0000 1.6 --- gnu-v2-abi.c 10 Apr 2002 00:23:40 -0000 *************** void *** 424,429 **** _initialize_gnu_v2_abi (void) { init_gnuv2_ops (); ! register_cp_abi (gnu_v2_abi_ops); ! switch_to_cp_abi ("gnu-v2"); } --- 424,429 ---- _initialize_gnu_v2_abi (void) { init_gnuv2_ops (); ! 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.8 diff -c -w -p -r1.8 gnu-v3-abi.c *** gnu-v3-abi.c 2 Feb 2002 00:04:46 -0000 1.8 --- gnu-v3-abi.c 10 Apr 2002 00:23:40 -0000 *************** _initialize_gnu_v3_abi (void) *** 430,434 **** { init_gnuv3_ops (); ! register_cp_abi (gnu_v3_abi_ops); } --- 430,434 ---- { init_gnuv3_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 -c -w -p -r1.3 hpacc-abi.c *** hpacc-abi.c 4 Jan 2002 18:20:19 -0000 1.3 --- hpacc-abi.c 10 Apr 2002 00:23:40 -0000 *************** _initialize_hpacc_abi (void) *** 324,328 **** regcomp (&operator_pattern, "^This will never match anything, please fill it in$", REG_NOSUB); ! register_cp_abi (hpacc_abi_ops); } --- 324,328 ---- regcomp (&operator_pattern, "^This will never match anything, please fill it in$", REG_NOSUB); ! register_cp_abi (&hpacc_abi_ops); } Index: minsyms.c =================================================================== RCS file: /cvs/src/src/gdb/minsyms.c,v retrieving revision 1.20 diff -c -w -p -r1.20 minsyms.c *** minsyms.c 19 Mar 2002 19:00:04 -0000 1.20 --- minsyms.c 10 Apr 2002 00:23:40 -0000 *************** install_minimal_symbols (struct objfile *** 960,966 **** const char *name = SYMBOL_NAME (&objfile->msymbols[i]); if (name[0] == '_' && name[1] == 'Z') { ! switch_to_cp_abi ("gnu-v3"); break; } } --- 960,967 ---- const char *name = SYMBOL_NAME (&objfile->msymbols[i]); if (name[0] == '_' && name[1] == 'Z') { ! if (cp_abi_is_auto_p ()) ! 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.95 diff -c -w -p -r1.95 gdb.texinfo *** doc/gdb.texinfo 7 Apr 2002 19:09:58 -0000 1.95 --- doc/gdb.texinfo 10 Apr 2002 00:23:40 -0000 *************** Do not pretty print C@t{++} virtual func *** 5289,5294 **** --- 5289,5308 ---- Show whether C@t{++} virtual function tables are pretty printed, or not. @end table + @kindex set cp-abi + @item set cp-abi + @itemx set cp-abi auto + Set the C++ ABI that gdb will use to decode C++ objects. The default is "auto" + which means gdb will assume the gnu-v2 ABI unless it sees symbols that + look like the gnu-v3 ABI, in which case it will switch to the gnu-v3 ABI. With + no arguments, list the available C++ ABIs. + + + @kindex show cp-abi + @item show cp-abi + Show which C++ ABI gdb uses to decode C++ objects. + + @node Value History @section Value history --Apple-Mail-2--710949309 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Content-length: 808 Jim On Friday, March 22, 2002, at 11:09 AM, Daniel Jacobowitz wrote: > On Fri, Mar 22, 2002 at 02:04:08PM -0500, Andrew Cagney wrote: >> >>> (or something like that; eliminating the \-return, which gcc3 I >>> thought >>> would warn about...) >> >> FYI, gcc has problems with: >> >> this is a string >> that goes across several lines. >> >> but not: >> >> this is a string\n\ >> that goes across several lines > > Oh, that was it. In any case, I prefer using implicit string > concatenation, since it doesn't mess up indentation as much. > > -- > Daniel Jacobowitz Carnegie Mellon University > MontaVista Software Debian GNU/Linux Developer > > -- Jim Ingham jingham@apple.com Developer Tools - gdb Apple Computer --Apple-Mail-2--710949309--