Re: add set cp-abi command

Jim Ingham
2002-03-21T03:02:03Z

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