From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22745 invoked by alias); 21 Mar 2002 03:02:03 -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 22352 invoked from network); 21 Mar 2002 03:01:56 -0000 Received: from unknown (HELO mail-out2.apple.com) (17.254.0.51) by sources.redhat.com with SMTP; 21 Mar 2002 03:01:56 -0000 Received: from mailgate2.apple.com (A17-129-100-225.apple.com [17.129.100.225]) by mail-out2.apple.com (8.11.3/8.11.3) with ESMTP id g2L31sa28605 for ; Wed, 20 Mar 2002 19:01:55 -0800 (PST) Received: from scv2.apple.com (scv2.apple.com) by mailgate2.apple.com (Content Technologies SMTPRS 4.2.1) with ESMTP id ; Wed, 20 Mar 2002 19:01:54 -0800 Received: from inghji (inghji.apple.com [17.202.40.220]) by scv2.apple.com (8.11.3/8.11.3) with ESMTP id g2L31sb14843; Wed, 20 Mar 2002 19:01:54 -0800 (PST) Date: Wed, 20 Mar 2002 19:02:00 -0000 Subject: Re: add set cp-abi command Content-Type: multipart/mixed; boundary=Apple-Mail-1--282191916 Mime-Version: 1.0 (Apple Message framework v481) Cc: gdb-patches@sources.redhat.com To: Daniel Jacobowitz From: Jim Ingham In-Reply-To: <20020320181856.A17115@nevyn.them.org> Message-Id: X-Mailer: Apple Mail (2.481) X-SW-Source: 2002-03/txt/msg00405.txt.bz2 --Apple-Mail-1--282191916 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Content-length: 3400 Daniel, On Wednesday, March 20, 2002, at 03:18 PM, Daniel Jacobowitz wrote: > On Mon, Mar 18, 2002 at 12:01:04PM -0800, Jim Ingham wrote: >> In fact, since the ABI's are all added in _initialize functions, it >> would be >> even simpler just to fix the size of the array. When somebody adds the >> "last straw" ABI to gdb, we can just spit out a message saying >> increase this >> number, and that developer can do so and recompile. This is safe >> since I >> don't think we really have the intention that we are adding these >> things >> dynamically at runtime... > > Definitely not as GDB stands, and I don't see a point. This bit is > fine. Groovy. > >>> >>>> const char *name = SYMBOL_NAME (&objfile->msymbols[i]); >>>> if (name[0] == '_' && name[1] == 'Z') >>>> { >>>> + if (cp_abi_is_auto_p ()) >>>> switch_to_cp_abi ("gnu-v3"); >>>> break; >>>> } >>> >>> This bit, of course, is great :) >> >> Way too much work to get there, however. Another point that is >> unclear to >> me, should this instead be: >> >> if (cp_abi_is_auto_p ()) >> set_cp_abi_as_auto_default ("gnu_v3"); >> break; >> >> I would have to change set_... to take the name rather than a >> structure, and >> look it up (and add a lookup_cp_abi to be nice). But it fits with the >> set >> lang more. OTOH, I have already spent more time on this that it >> deserves by >> a long shot, so... > > I suppose that this would be best; if we set cp-abi to auto it should > remain v3. I can't tell which option you mean here, but I think you mean we should register v3 as auto. Assuming that is true, I fixed the code to do that. I also changed the "show cp-abi" output to also put out the doc string, since in the auto case this is much more helpful. Now you see, for instance: (gdb) show cp-abi The currently selected C++ ABI is: auto - currently gnu-v3. which is more informative. > >> I am including a new patch, with just the cp-abi.c bits to keep it >> smaller, >> and I didn't edit this one to change the indentation goofs that the >> mailer >> added (I did with the last patch, oh fun...). > > Mangled patches are a pain to read. If you can't get a mailer that > won't mangle it inline, can you at least get them attached in some > vaguely sane MIME-ish way? > > Other than set_cp_abi_as_auto_default, my only remaining nits are > grammatical again: > ! error ("Too many CP ABI's, please increase CP_ABI_MAX in cp- > abi.c"); > > internal_error(), and "C++ ABIs". Yeah, I figured this out about 5 seconds after hitting send. > > + if (!switch_to_cp_abi (args)) > + error ("Could not find ABI: \"%s\" in ABI list\n", args); > > "Could not find \"%s\" in ABI list" (and no \n) > > + ui_out_text (uiout, "The currently selected C++ abi is: "); > > "ABI", not "abi". Okay. > > And show_cp_abis should probably mention "auto". It does viz: (gdb) set cp-abi The available C++ ABIs are: gnu-v2 - G++ Version 2 ABI gnu-v3 - G++ Version 3 ABI hpaCC - HP aCC ABI auto - currently gnu-v2 That is part of the point of adding a real auto to the ABI list... > > With the above changes it should be OK, although I would like to see > it. Thanks for following this through. Okay, let's see what Mail.app thinks is an attachment... Jim --Apple-Mail-1--282191916 Content-Disposition: attachment; filename=cp-abi.diff Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="cp-abi.diff" Content-length: 8903 ? .gdb_history 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 2002/01/04 18:20:19 1.3 --- cp-abi.c 2002/03/21 02:56:50 *************** *** 21,33 **** #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,41 ---- #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,240 ---- } 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 2002/01/04 18:20:19 1.4 --- cp-abi.h 2002/03/21 02:56:50 *************** 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 2002/01/04 18:20:19 1.6 --- gnu-v2-abi.c 2002/03/21 02:56:50 *************** 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 2002/02/02 00:04:46 1.8 --- gnu-v3-abi.c 2002/03/21 02:56:50 *************** _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 2002/01/04 18:20:19 1.3 --- hpacc-abi.c 2002/03/21 02:56:50 *************** _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.19 diff -c -w -p -r1.19 minsyms.c *** minsyms.c 2001/12/10 22:04:10 1.19 --- minsyms.c 2002/03/21 02:56:50 *************** install_minimal_symbols (struct objfile *** 970,976 **** const char *name = SYMBOL_NAME (&objfile->msymbols[i]); if (name[0] == '_' && name[1] == 'Z') { ! switch_to_cp_abi ("gnu-v3"); break; } } --- 970,977 ---- 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; } } --Apple-Mail-1--282191916 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Content-length: 105 -- Jim Ingham jingham@apple.com Developer Tools - gdb Apple Computer --Apple-Mail-1--282191916--