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:
parent
75352e283f
commit
b32b108aba
8 changed files with 123 additions and 57 deletions
|
@ -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.
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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
73
gdb/producer.c
Normal 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
33
gdb/producer.h
Normal 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
|
54
gdb/utils.c
54
gdb/utils.c
|
@ -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. */
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue