/* OS ABI variant handling for GDB.
- Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Copyright (C) 2001-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "arch-utils.h"
#include "gdbcmd.h"
#include "command.h"
+#include "gdb_bfd.h"
#include "elf-bfd.h"
#endif
/* State for the "set osabi" command. */
-static enum { osabi_auto, osabi_default, osabi_user } user_osabi_state;
+static enum gdb_osabi_mode user_osabi_state;
static enum gdb_osabi user_selected_osabi;
static const char *gdb_osabi_available_names[GDB_OSABI_INVALID + 3] = {
"auto",
{ "DJGPP", NULL },
{ "QNX-Neutrino", NULL },
{ "Cygwin", NULL },
+ { "Windows", NULL },
{ "AIX", NULL },
{ "DICOS", NULL },
{ "Darwin", NULL },
- { "Symbian", NULL },
{ "OpenVMS", NULL },
{ "LynxOS178", NULL },
{ "Newlib", NULL },
/* Generic sniffer for ELF flavoured files. */
void
-generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
+generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect,
+ enum gdb_osabi *osabi)
{
- enum gdb_osabi *osabi = (enum gdb_osabi *) obj;
const char *name;
unsigned int sectsize;
char *note;
/* And likewise ELFOSABI_HPUX. For some reason the default
value for the EI_OSABI field is ELFOSABI_HPUX for all PA-RISC
targets (with the exception of GNU/Linux). */
- bfd_map_over_sections (abfd,
- generic_elf_osabi_sniff_abi_tag_sections,
- &osabi);
+ for (asection *sect : gdb_bfd_sections (abfd))
+ generic_elf_osabi_sniff_abi_tag_sections (abfd, sect, &osabi);
break;
case ELFOSABI_FREEBSD:
return osabi;
}
\f
+/* See osabi.h. */
+
+void
+set_osabi (enum gdb_osabi_mode mode, enum gdb_osabi osabi)
+{
+ if (mode == osabi_auto)
+ user_osabi_state = osabi_auto;
+ else if (mode == osabi_default)
+ {
+ user_selected_osabi = GDB_OSABI_DEFAULT;
+ user_osabi_state = osabi_user;
+ }
+ else
+ {
+ user_selected_osabi = osabi;
+ user_osabi_state = osabi_user;
+ }
+
+ /* NOTE: At some point (true multiple architectures) we'll need to be more
+ graceful here. */
+ gdbarch_info info;
+ if (! gdbarch_update_p (info))
+ internal_error (__FILE__, __LINE__, _("Updating OS ABI failed."));
+}
+
+/* See osabi.h. */
+
+void
+get_osabi (enum gdb_osabi_mode &mode, enum gdb_osabi &osabi)
+{
+ mode = user_osabi_state;
+ osabi = user_selected_osabi;
+}
+
static void
set_osabi (const char *args, int from_tty, struct cmd_list_element *c)
{
- struct gdbarch_info info;
-
if (strcmp (set_osabi_string, "auto") == 0)
- user_osabi_state = osabi_auto;
+ set_osabi (osabi_auto, GDB_OSABI_INVALID);
else if (strcmp (set_osabi_string, "default") == 0)
{
- user_selected_osabi = GDB_OSABI_DEFAULT;
- user_osabi_state = osabi_user;
+ set_osabi (osabi_default, GDB_OSABI_INVALID);
}
else
{
int i;
for (i = 1; i < GDB_OSABI_INVALID; i++)
- {
+ {
enum gdb_osabi osabi = (enum gdb_osabi) i;
if (strcmp (set_osabi_string, gdbarch_osabi_name (osabi)) == 0)
{
- user_selected_osabi = osabi;
- user_osabi_state = osabi_user;
+ set_osabi (osabi_user, osabi);
break;
}
}
_("Invalid OS ABI \"%s\" passed to command handler."),
set_osabi_string);
}
-
- /* NOTE: At some point (true multiple architectures) we'll need to be more
- graceful here. */
- gdbarch_info_init (&info);
- if (! gdbarch_update_p (info))
- internal_error (__FILE__, __LINE__, _("Updating OS ABI failed."));
}
static void
const char *value)
{
if (user_osabi_state == osabi_auto)
- fprintf_filtered (file,
- _("The current OS ABI is \"auto\" "
- "(currently \"%s\").\n"),
- gdbarch_osabi_name (gdbarch_osabi (get_current_arch ())));
+ gdb_printf (file,
+ _("The current OS ABI is \"auto\" "
+ "(currently \"%s\").\n"),
+ gdbarch_osabi_name (gdbarch_osabi (get_current_arch ())));
else
- fprintf_filtered (file, _("The current OS ABI is \"%s\".\n"),
- gdbarch_osabi_name (user_selected_osabi));
+ gdb_printf (file, _("The current OS ABI is \"%s\".\n"),
+ gdbarch_osabi_name (user_selected_osabi));
if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
- fprintf_filtered (file, _("The default OS ABI is \"%s\".\n"),
- gdbarch_osabi_name (GDB_OSABI_DEFAULT));
+ gdb_printf (file, _("The default OS ABI is \"%s\".\n"),
+ gdbarch_osabi_name (GDB_OSABI_DEFAULT));
}
void _initialize_gdb_osabi ();
generic_elf_osabi_sniffer);
/* Register the "set osabi" command. */
+ user_osabi_state = osabi_auto;
+ set_osabi_string = gdb_osabi_available_names[0];
+ gdb_assert (strcmp (set_osabi_string, "auto") == 0);
add_setshow_enum_cmd ("osabi", class_support, gdb_osabi_available_names,
&set_osabi_string,
_("Set OS ABI of target."),
_("Show OS ABI of target."),
NULL, set_osabi, show_osabi,
&setlist, &showlist);
- user_osabi_state = osabi_auto;
}