Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jim Ingham <jingham@apple.com>
To: Daniel Jacobowitz <drow@mvista.com>
Cc: gdb-patches@sources.redhat.com
Subject: Re: add set cp-abi command
Date: Wed, 20 Mar 2002 19:02:00 -0000	[thread overview]
Message-ID: <FF6060F4-3C77-11D6-80F8-000393540DDC@apple.com> (raw)
In-Reply-To: <20020320181856.A17115@nevyn.them.org>

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

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


[-- Attachment #2: cp-abi.diff --]
[-- Type: application/octet-stream, Size: 8903 bytes --]

? .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;
  	      }
  	  }

[-- Attachment #3: Type: text/plain, Size: 105 bytes --]



--
Jim Ingham                                   jingham@apple.com
Developer Tools - gdb
Apple Computer

  reply	other threads:[~2002-03-21  3:02 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-13 10:56 Jim Ingham
2002-03-13 12:11 ` Eli Zaretskii
2002-03-13 12:11 ` Daniel Jacobowitz
2002-03-14 13:14   ` Jim Ingham
2002-03-14 13:26     ` Daniel Jacobowitz
2002-03-15 15:53       ` Jim Ingham
2002-03-15 19:41         ` Daniel Jacobowitz
2002-03-18 12:01           ` Jim Ingham
2002-03-20 15:19             ` Daniel Jacobowitz
2002-03-20 19:02               ` Jim Ingham [this message]
2002-03-22 10:34                 ` Daniel Jacobowitz
2002-03-22 11:04                   ` Andrew Cagney
2002-03-22 11:09                     ` Daniel Jacobowitz
2002-03-22 11:29                       ` Jim Ingham
2002-04-09 17:27                       ` Jim Ingham
2002-04-09 17:54                         ` Daniel Jacobowitz
2002-04-10 11:10                           ` Jim Ingham
2002-04-10 11:58                             ` Daniel Jacobowitz
2002-04-09 22:33                         ` Eli Zaretskii
2002-04-10 11:14                           ` Jim Ingham
2002-04-11 12:25                             ` Eli Zaretskii
2002-03-15 17:11       ` Jim Ingham
2002-03-14 15:29 ` Andrew Cagney
2002-03-15 10:33   ` Jim Ingham
2002-03-15 17:29     ` Andrew Cagney

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=FF6060F4-3C77-11D6-80F8-000393540DDC@apple.com \
    --to=jingham@apple.com \
    --cc=drow@mvista.com \
    --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