summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalfred Tedeschi <walfred.tedeschi@intel.com>2017-09-26 18:26:41 +0100
committerPedro Alves <palves@redhat.com>2017-09-26 18:26:41 +0100
commitb32b108aba2c0119d0e231d203d3284539da2379 (patch)
tree9c24604cc4997fcfe86628fb8a701bc8103f9a0f
parent75352e283fb2b265d14c750859156943f6eb2693 (diff)
downloadbinutils-gdb-b32b108aba2c0119d0e231d203d3284539da2379.tar.gz
Move GDB producer parsing routines to a separate file
gdb/ChangeLog: 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.
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/amd64-tdep.c1
-rw-r--r--gdb/dwarf2read.c1
-rw-r--r--gdb/producer.c73
-rw-r--r--gdb/producer.h33
-rw-r--r--gdb/utils.c54
-rw-r--r--gdb/utils.h3
8 files changed, 123 insertions, 57 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 68f4817837f..7f295e6359e 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 5740d43bb78..9004b350e4e 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 f1e2078ef55..e56c388b426 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 b1914cf8765..4083c6363c2 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 00000000000..3f9297ac1de
--- /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 00000000000..143d4e1b9a2
--- /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 41ad35f1470..24294be4f49 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 6d33e8d00db..7b45cc86963 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