Re: add set cp-abi command

Daniel Jacobowitz
2002-03-13T20:11:31Z

On Wed, Mar 13, 2002 at 10:56:22AM -0800, Jim Ingham wrote:
> Hi, all...
>
> gdb assumes that it will never see a mix of gcc2 & gcc3 compiled C++
> code in a single executable. So it determines which abi to use by
> setting it to gnu-v2, and then if it EVER sees a v3 style mangled name,
> it switches it to v3. This breaks down in the case where you have some
> shared libraries compiled with gcc3, but the user code is compiled with
> gcc2. This is a perfectly okay thing to do if the libraries don't
> export any C++ symbols, but gdb will get the abi wrong, and you won't be
> able to print any C++ objects in the user code. Ouch!
>
> I am not currently proposing any fancy mechanism to try to switch on the
> fly between the two. The problem is temporary so I don't really think
> it is worth the effort to cook up such a scheme. Rather, I just added a
> "set cp-abi" command so that my users can fix the problem by hand when
> they notice it arising.

We could reasonably have an ABI per-objfile. In fact, we probably
should... it's not clear how that would interact with this patch. But
I'm not going to ask you to do that.

I think it might be wiser to have cp-abi default to "auto" and
condition the autoselection magic based on that. Otherwise, if you set
it to v2, it is likely to autorevert to v3 unexpectedly. Could you add
that change?

> 2002-03-12 James Ingham <jingham@apple.com>
>
> * cp-abi.c (set_cp_abi_cmd, show_cp_abi_cmd,
> show_cp_abis_cmd): New functions, allow you to set & show
> cplus abi's in case gdb gets it wrong.
> (_initialize_cp_abi): Define the cp-abi switching commands.

Also, a couple of small changes (below).

> ***************
> *** 103,109 ****
> --- 106,164 ----
> 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;
> + }

Indentation, of course.

> +
> + void
> + set_cp_abi_cmd (char *args, int from_tty)
> + {
> +
> + 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 current cplus abi is: ");

"currently selected C++ ABI", please.

> +
> + ui_out_field_string (uiout, "cp-abi", current_cp_abi.shortname);
> + ui_out_text (uiout, ".\n");
> + }
> +
> + void
> + show_cp_abis_cmd (char *args, int from_tty)
> + {
> + int i;
> + ui_out_text (uiout, "The valid cplus abi's are:\n");

"C++ ABIs" (or ABI's? ABIs, I think, if there isn't a precedent)

> +
> + 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 (uiout, "\n");
> + }
> + ui_out_tuple_end (uiout);
> +
> + }
> +
> + void
> + _initialize_cp_abi (void)
> + {
> + struct cmd_list_element *cmd;
> +
> + cmd = add_cmd ("cp-abi", class_obscure , set_cp_abi_cmd,
> + "Set the ABI used for inspecting C++ objects",
> &setlist);
> +
> + cmd = add_cmd ("cp-abi", class_obscure, show_cp_abi_cmd,
> + "Show the ABI used for inspecting C++ objects",
> &showlist);
> + cmd = add_cmd ("cp-abis", class_obscure, show_cp_abis_cmd,
> + "List the available ABIs for inspecting C++ objects",
> &showlist);

I believe 'show cp-abi' should show the available ABIs. That's more in
keeping with existing code.

--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer