Re: add set cp-abi command

Jim Ingham
2002-04-10T00:27:41Z

[-- 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