diff options
author | Tom Tromey <tromey@redhat.com> | 2014-06-13 09:28:24 -0600 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2014-12-12 22:26:11 +0100 |
commit | ac04f72bb4396a311ffc445710d4068c13fb0448 (patch) | |
tree | 4f83982f12355cab79a0f5cfbcb9011dcb8ecfc6 /gdb/osabi.c | |
parent | f208eee0f3a4f42a0bf20ab900eb36fbba8e4b9e (diff) | |
download | binutils-ac04f72bb4396a311ffc445710d4068c13fb0448.zip binutils-ac04f72bb4396a311ffc445710d4068c13fb0448.tar.gz binutils-ac04f72bb4396a311ffc445710d4068c13fb0448.tar.bz2 |
add gnu_triplet_regexp gdbarch method
gdb has to inform libcc1.so of the target being used, so that the
correct compiler can be invoked. The compiler is invoked using the
GNU configury triplet prefix, e.g., "x86_64-unknown-linux-gnu-gcc".
In order for this to work we need to map the gdbarch to the GNU
configury triplet arch. In most cases these are identical; however,
the x86 family poses some problems, as the BFD arch names are quite
different from the GNU triplet names. So, we introduce a new gdbarch
method for this. A regular expression is used because there are
various valid values for the arch prefix in the triplet.
This patch also updates the osabi code to associate a regular
expression with the OS ABI. I have only added a concrete value for
Linux. Note that the "-gnu" part is optional, at least on Fedora it
is omitted from the installed GCC executable's name.
gdb/ChangeLog
2014-12-12 Tom Tromey <tromey@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
* osabi.h (osabi_triplet_regexp): Declare.
* osabi.c (struct osabi_names): New.
(gdb_osabi_names): Change type to struct osabi_names. Update
values.
(gdbarch_osabi_name): Update.
(osabi_triplet_regexp): New function.
(osabi_from_tdesc_string, _initialize_gdb_osabi): Update.
* i386-tdep.c (i386_gnu_triplet_regexp): New method.
(i386_elf_init_abi, i386_go32_init_abi, i386_gdbarch_init): Call
set_gdbarch_gnu_triplet_regexp.
* gdbarch.sh (gnu_triplet_regexp): New method.
* gdbarch.c, gdbarch.h: Rebuild.
* arch-utils.h (default_gnu_triplet_regexp): Declare.
* arch-utils.c (default_gnu_triplet_regexp): New function.
Diffstat (limited to 'gdb/osabi.c')
-rw-r--r-- | gdb/osabi.c | 88 |
1 files changed, 56 insertions, 32 deletions
diff --git a/gdb/osabi.c b/gdb/osabi.c index d33ef9c..50d391a 100644 --- a/gdb/osabi.c +++ b/gdb/osabi.c @@ -41,46 +41,70 @@ static const char *gdb_osabi_available_names[GDB_OSABI_INVALID + 3] = { }; static const char *set_osabi_string; +/* Names associated with each osabi. */ + +struct osabi_names +{ + /* The "pretty" name. */ + + const char *pretty; + + /* The triplet regexp, or NULL if not known. */ + + const char *regexp; +}; + /* This table matches the indices assigned to enum gdb_osabi. Keep them in sync. */ -static const char * const gdb_osabi_names[] = +static const struct osabi_names gdb_osabi_names[] = { - "none", - - "SVR4", - "GNU/Hurd", - "Solaris", - "GNU/Linux", - "FreeBSD a.out", - "FreeBSD ELF", - "NetBSD a.out", - "NetBSD ELF", - "OpenBSD ELF", - "Windows CE", - "DJGPP", - "Irix", - "HP/UX ELF", - "HP/UX SOM", - "QNX Neutrino", - "Cygwin", - "AIX", - "DICOS", - "Darwin", - "Symbian", - "OpenVMS", - "LynxOS178", - "Newlib", - - "<invalid>" + { "none", NULL }, + + { "SVR4", NULL }, + { "GNU/Hurd", NULL }, + { "Solaris", NULL }, + { "GNU/Linux", "linux(-gnu)?" }, + { "FreeBSD a.out", NULL }, + { "FreeBSD ELF", NULL }, + { "NetBSD a.out", NULL }, + { "NetBSD ELF", NULL }, + { "OpenBSD ELF", NULL }, + { "Windows CE", NULL }, + { "DJGPP", NULL }, + { "Irix", NULL }, + { "HP/UX ELF", NULL }, + { "HP/UX SOM", NULL }, + { "QNX Neutrino", NULL }, + { "Cygwin", NULL }, + { "AIX", NULL }, + { "DICOS", NULL }, + { "Darwin", NULL }, + { "Symbian", NULL }, + { "OpenVMS", NULL }, + { "LynxOS178", NULL }, + { "Newlib", NULL }, + + { "<invalid>", NULL } }; const char * gdbarch_osabi_name (enum gdb_osabi osabi) { if (osabi >= GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID) - return gdb_osabi_names[osabi]; + return gdb_osabi_names[osabi].pretty; + + return gdb_osabi_names[GDB_OSABI_INVALID].pretty; +} + +/* See osabi.h. */ + +const char * +osabi_triplet_regexp (enum gdb_osabi osabi) +{ + if (osabi >= GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID) + return gdb_osabi_names[osabi].regexp; - return gdb_osabi_names[GDB_OSABI_INVALID]; + return gdb_osabi_names[GDB_OSABI_INVALID].regexp; } /* Lookup the OS ABI corresponding to the specified target description @@ -92,7 +116,7 @@ osabi_from_tdesc_string (const char *name) int i; for (i = 0; i < ARRAY_SIZE (gdb_osabi_names); i++) - if (strcmp (name, gdb_osabi_names[i]) == 0) + if (strcmp (name, gdb_osabi_names[i].pretty) == 0) { /* See note above: the name table matches the indices assigned to enum gdb_osabi. */ @@ -645,7 +669,7 @@ extern initialize_file_ftype _initialize_gdb_osabi; /* -Wmissing-prototype */ void _initialize_gdb_osabi (void) { - if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID], "<invalid>") != 0) + if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID].pretty, "<invalid>") != 0) internal_error (__FILE__, __LINE__, _("_initialize_gdb_osabi: gdb_osabi_names[] is inconsistent")); |