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: Fri, 15 Mar 2002 15:53:00 -0000	[thread overview]
Message-ID: <C077653E-386F-11D6-8354-000393540DDC@apple.com> (raw)
In-Reply-To: <20020314162627.A9503@nevyn.them.org>

Daniel,

Okay, how about this.

I changed the set/show as per set language.

I added an "auto" abi.  This ended up being a little tricky because I 
don't know the order in which the initializers get run, but this works.

In the process of doing this I got really annoyed that EVERYTHING was 
done by copying structures around.  If we think that it is really 
important to have the current_cp_abi be a structure rather than a 
pointer to a structure so there was one less level of indirection, 
that's fine.  But there is no reason to manage the internal list this 
way as well.  So I changed cp_abis to be an array of pointers to 
cp_abi_ops structures, and had to change the auto-grow mechanism to 
account for it.

I also took out the extern def'ns of num_cp_abis, cp_abis and 
current_cp_abi out of cp-abi.h.  They weren't currently used outside the 
module, and if we end up needing to use them, we should provide 
interfaces, rather than just poking around at the data.

I haven't written a doc note for this, I have run out of time for this 
today, but thought I would give you a look before the day is out...

What do you think of this:

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/15 23:46:26
***************
*** 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 current_cp_abi;
! static struct cp_abi_ops auto_cp_abi = {"auto", NULL};

! #define INITIAL_CP_ABI_MAX 8

! static struct cp_abi_ops *orig_cp_abis[INITIAL_CP_ABI_MAX];
! static struct cp_abi_ops **cp_abis = orig_cp_abis;
! static int max_cp_abis = INITIAL_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,231 ----
   }

   int
! register_cp_abi (struct cp_abi_ops *abi)
! {
!   if (num_cp_abis == max_cp_abis)
       {
!       struct cp_abi_ops **new_abi_list;
!       int i;
!
!       max_cp_abis *= 2;
!       new_abi_list = (struct cp_abi_ops **) xmalloc (max_cp_abis * 
sizeof (struct cp_abi_ops *));
!       for (i = 0; i < num_cp_abis; i++)
!         new_abi_list[i] = cp_abis[i];
!
!       if (cp_abis != orig_cp_abis)
!       xfree (cp_abis);
!
!       cp_abis = new_abi_list;
!     }
!
     cp_abis[num_cp_abis++] = abi;

     return 1;

   }

+ void
+ set_cp_abi_as_auto_default (struct cp_abi_ops *abi)
+ {
+
+   if (auto_cp_abi.longname != NULL)
+     xfree (auto_cp_abi.longname);
+   auto_cp_abi.longname = (char *) xmalloc (11 + strlen 
(abi->shortname));
+   sprintf (auto_cp_abi.longname, "currently %s",
+          abi->shortname);
+
+   if (auto_cp_abi.doc != NULL)
+     xfree (auto_cp_abi.doc);
+   auto_cp_abi.doc = (char *) xmalloc (11 + strlen (abi->shortname));
+   sprintf (auto_cp_abi.doc, "currently %s",
+          abi->shortname);
+
+   auto_cp_abi.is_destructor_name = abi->is_destructor_name;
+   auto_cp_abi.is_constructor_name = abi->is_constructor_name;
+   auto_cp_abi.is_vtable_name = abi->is_vtable_name;
+   auto_cp_abi.is_operator_name = abi->is_operator_name;
+   auto_cp_abi.virtual_fn_field = abi->virtual_fn_field;
+   auto_cp_abi.rtti_type = abi->rtti_type;
+   auto_cp_abi.baseclass_offset = abi->baseclass_offset;
+
+   /* 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;
+ }
+
   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;
         }

+   return 0;
+ }
+
+ 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 ABI: \"%s\" in ABI list\n", 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, ".\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/15 23:46:28
*************** 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 (struct cp_abi_ops *abi);
+ 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/15 23:46:28
*************** 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);
   }
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/15 23:46:28
*************** _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/15 23:46:28
*************** _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/15 23:46:28
*************** install_minimal_symbols (struct objfile
*** 970,975 ****
--- 970,976 ----
             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;
               }

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


  reply	other threads:[~2002-03-15 23:53 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 ` Daniel Jacobowitz
2002-03-14 13:14   ` Jim Ingham
2002-03-14 13:26     ` Daniel Jacobowitz
2002-03-15 15:53       ` Jim Ingham [this message]
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
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-13 12:11 ` Eli Zaretskii
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=C077653E-386F-11D6-8354-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