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.
This commit is contained in:
Walfred Tedeschi 2017-09-26 18:26:41 +01:00 committed by Pedro Alves
parent 75352e283f
commit b32b108aba
8 changed files with 123 additions and 57 deletions

View file

@ -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> 2017-09-26 Matthias Klose <doko@ubuntu.com>
* configure.ac: Search ncursesw before ncurses. * configure.ac: Search ncursesw before ncurses.

View file

@ -1170,6 +1170,7 @@ SFILES = \
parse.c \ parse.c \
printcmd.c \ printcmd.c \
probe.c \ probe.c \
producer.c \
proc-service.list \ proc-service.list \
progspace.c \ progspace.c \
progspace-and-thread.c \ progspace-and-thread.c \
@ -1792,6 +1793,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
print-utils.o \ print-utils.o \
printcmd.o \ printcmd.o \
probe.o \ probe.o \
producer.o \
progspace.o \ progspace.o \
progspace-and-thread.o \ progspace-and-thread.o \
prologue-value.o \ prologue-value.o \

View file

@ -43,6 +43,7 @@
#include <algorithm> #include <algorithm>
#include "target-descriptions.h" #include "target-descriptions.h"
#include "arch/amd64.h" #include "arch/amd64.h"
#include "producer.h"
#include "ax.h" #include "ax.h"
#include "ax-gdb.h" #include "ax-gdb.h"

View file

@ -75,6 +75,7 @@
#include "common/underlying.h" #include "common/underlying.h"
#include "common/byte-vector.h" #include "common/byte-vector.h"
#include "filename-seen-cache.h" #include "filename-seen-cache.h"
#include "producer.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <algorithm> #include <algorithm>

73
gdb/producer.c Normal file
View file

@ -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;
}

33
gdb/producer.h Normal file
View file

@ -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

View file

@ -2947,60 +2947,6 @@ make_bpstat_clear_actions_cleanup (void)
return make_cleanup (do_bpstat_clear_actions_cleanup, NULL); 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. */ /* Helper for make_cleanup_free_char_ptr_vec. */

View file

@ -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); extern pid_t wait_to_die_with_timeout (pid_t pid, int *status, int timeout);
#endif #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); extern int myread (int, char *, int);
/* Ensure that V is aligned to an N byte boundary (B's assumed to be a /* Ensure that V is aligned to an N byte boundary (B's assumed to be a