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: Tue, 09 Apr 2002 17:27:00 -0000	[thread overview]
Message-ID: <B80D7663-4C19-11D6-B08E-000393540DDC@apple.com> (raw)
In-Reply-To: <20020322140939.A26911@nevyn.them.org>

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

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 <jingham@apple.com>

         * 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?


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

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
  

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



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

  parent reply	other threads:[~2002-04-10  0:27 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
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 [this message]
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=B80D7663-4C19-11D6-B08E-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