diff options
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/amd64-tdep.c | 1 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 1 | ||||
-rw-r--r-- | gdb/producer.c | 73 | ||||
-rw-r--r-- | gdb/producer.h | 33 | ||||
-rw-r--r-- | gdb/utils.c | 54 | ||||
-rw-r--r-- | gdb/utils.h | 3 |
8 files changed, 123 insertions, 57 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 68f4817..7f295e6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2017-09-26 Walfred Tedeschi <walfred.tedeschi@intel.com> + + * Makefile.in (SFILES): Add producer.c. + (COMMON_OBS): Add producer.o + * amd64-tdep.c (producer.h): Add new include. + * dwarf2read.c (producer.h): Add new include. + * producer.c: New file. + * producer.h: New file. + * utils.c (producer_is_gcc, producer_is_gcc_ge_4): Move to + producer.c. + * utils.h (producer_is_gcc, producer_is_gcc_ge_4): Move to + producer.h. + 2017-09-26 Matthias Klose <doko@ubuntu.com> * configure.ac: Search ncursesw before ncurses. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 5740d43..9004b35 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1170,6 +1170,7 @@ SFILES = \ parse.c \ printcmd.c \ probe.c \ + producer.c \ proc-service.list \ progspace.c \ progspace-and-thread.c \ @@ -1792,6 +1793,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ print-utils.o \ printcmd.o \ probe.o \ + producer.o \ progspace.o \ progspace-and-thread.o \ prologue-value.o \ diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index f1e2078..e56c388 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -43,6 +43,7 @@ #include <algorithm> #include "target-descriptions.h" #include "arch/amd64.h" +#include "producer.h" #include "ax.h" #include "ax-gdb.h" diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index b1914cf..4083c63 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -75,6 +75,7 @@ #include "common/underlying.h" #include "common/byte-vector.h" #include "filename-seen-cache.h" +#include "producer.h" #include <fcntl.h> #include <sys/types.h> #include <algorithm> diff --git a/gdb/producer.c b/gdb/producer.c new file mode 100644 index 0000000..3f9297a --- /dev/null +++ b/gdb/producer.c @@ -0,0 +1,73 @@ +/* Producer string parsers for GDB. + + Copyright (C) 2012-2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "defs.h" +#include "producer.h" + +/* See producer.h. */ + +int +producer_is_gcc_ge_4 (const char *producer) +{ + int major, minor; + + if (! producer_is_gcc (producer, &major, &minor)) + return -1; + if (major < 4) + return -1; + if (major > 4) + return INT_MAX; + return minor; +} + +/* See producer.h. */ + +int +producer_is_gcc (const char *producer, int *major, int *minor) +{ + const char *cs; + + if (producer != NULL && startswith (producer, "GNU ")) + { + int maj, min; + + if (major == NULL) + major = &maj; + if (minor == NULL) + minor = &min; + + /* Skip any identifier after "GNU " - such as "C11" "C++" or "Java". + A full producer string might look like: + "GNU C 4.7.2" + "GNU Fortran 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic ..." + "GNU C++14 5.0.0 20150123 (experimental)" + */ + cs = &producer[strlen ("GNU ")]; + while (*cs && !isspace (*cs)) + cs++; + if (*cs && isspace (*cs)) + cs++; + if (sscanf (cs, "%d.%d", major, minor) == 2) + return 1; + } + + /* Not recognized as GCC. */ + return 0; +} + diff --git a/gdb/producer.h b/gdb/producer.h new file mode 100644 index 0000000..143d4e1 --- /dev/null +++ b/gdb/producer.h @@ -0,0 +1,33 @@ +/* Producer string parsers for GDB. + + Copyright (C) 2012-2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef PRODUCER_H +#define PRODUCER_H + +/* Check for GCC >= 4.x according to the symtab->producer string. Return minor + version (x) of 4.x in such case. If it is not GCC or it is GCC older than + 4.x return -1. If it is GCC 5.x or higher return INT_MAX. */ +extern int producer_is_gcc_ge_4 (const char *producer); + +/* Returns nonzero if the given PRODUCER string is GCC and sets the MAJOR + and MINOR versions when not NULL. Returns zero if the given PRODUCER + is NULL or it isn't GCC. */ +extern int producer_is_gcc (const char *producer, int *major, int *minor); + +#endif diff --git a/gdb/utils.c b/gdb/utils.c index 41ad35f..24294be 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2947,60 +2947,6 @@ make_bpstat_clear_actions_cleanup (void) return make_cleanup (do_bpstat_clear_actions_cleanup, NULL); } -/* Check for GCC >= 4.x according to the symtab->producer string. Return minor - version (x) of 4.x in such case. If it is not GCC or it is GCC older than - 4.x return -1. If it is GCC 5.x or higher return INT_MAX. */ - -int -producer_is_gcc_ge_4 (const char *producer) -{ - int major, minor; - - if (! producer_is_gcc (producer, &major, &minor)) - return -1; - if (major < 4) - return -1; - if (major > 4) - return INT_MAX; - return minor; -} - -/* Returns nonzero if the given PRODUCER string is GCC and sets the MAJOR - and MINOR versions when not NULL. Returns zero if the given PRODUCER - is NULL or it isn't GCC. */ - -int -producer_is_gcc (const char *producer, int *major, int *minor) -{ - const char *cs; - - if (producer != NULL && startswith (producer, "GNU ")) - { - int maj, min; - - if (major == NULL) - major = &maj; - if (minor == NULL) - minor = &min; - - /* Skip any identifier after "GNU " - such as "C11" or "C++". - A full producer string might look like: - "GNU C 4.7.2" - "GNU Fortran 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic ..." - "GNU C++14 5.0.0 20150123 (experimental)" - */ - cs = &producer[strlen ("GNU ")]; - while (*cs && !isspace (*cs)) - cs++; - if (*cs && isspace (*cs)) - cs++; - if (sscanf (cs, "%d.%d", major, minor) == 2) - return 1; - } - - /* Not recognized as GCC. */ - return 0; -} /* Helper for make_cleanup_free_char_ptr_vec. */ diff --git a/gdb/utils.h b/gdb/utils.h index 6d33e8d..7b45cc8 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -442,9 +442,6 @@ void dummy_obstack_deallocate (void *object, void *data); extern pid_t wait_to_die_with_timeout (pid_t pid, int *status, int timeout); #endif -extern int producer_is_gcc_ge_4 (const char *producer); -extern int producer_is_gcc (const char *producer, int *major, int *minor); - extern int myread (int, char *, int); /* Ensure that V is aligned to an N byte boundary (B's assumed to be a |