From: Walfred Tedeschi Date: Wed, 20 Sep 2017 14:15:02 +0000 (+0200) Subject: dwarf2read: move producers help functions to a dwarf specific file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8bf5d944716b1e13987e0e8cba1bcb5d7beea3b0;p=thirdparty%2Fbinutils-gdb.git dwarf2read: move producers help functions to a dwarf specific file This patch add new files to add dwarf reader utilities into it. It is also a preparation path to add functions to detect the icc version that produced a given compilation unit. 2017-09-18 Walfred Tedeschi * Makefile.in (SFILES): Add dwarf2utils.c. (COMMON_OBS): Add dwarf2utils.o * amd64-tdep.c (dwarf2utils.h): Add new header. * dwarf2read.c (dwarf2utils.h): Add new header. * dwarf2utils.c: New file. * dwarf2utils.h: New file. * utils.c (producer_is_gcc, producer_is_gcc_ge_4): Move to dwarf2utils.c. * utils.h (producer_is_gcc, producer_is_gcc_ge_4): Move to dwarf2utils.h. --- diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 5740d43bb78..99b17bf85f3 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1088,6 +1088,7 @@ SFILES = \ dtrace-probe.c \ dummy-frame.c \ dwarf2-frame.c \ + dwarf2utils.c \ dwarf2-frame-tailcall.c \ dwarf2expr.c \ dwarf2loc.c \ @@ -1707,6 +1708,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ dummy-frame.o \ dwarf2-frame.o \ dwarf2-frame-tailcall.o \ + dwarf2utils.o \ dwarf2expr.o \ dwarf2loc.o \ dwarf2read.o \ diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index f1e2078ef55..e2e7c620ef6 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -43,6 +43,7 @@ #include #include "target-descriptions.h" #include "arch/amd64.h" +#include "dwarf2utils.h" #include "ax.h" #include "ax-gdb.h" diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index b1914cf8765..dd28ff7dd92 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 "dwarf2utils.h" #include #include #include diff --git a/gdb/dwarf2utils.c b/gdb/dwarf2utils.c new file mode 100644 index 00000000000..9bb69f765bc --- /dev/null +++ b/gdb/dwarf2utils.c @@ -0,0 +1,86 @@ +/* DWARF 2 debugging format utils for GDB. + + 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 . */ + +/* 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. */ + +#include "config.h" +#include "dwarf2utils.h" +#include "stdio.h" +#include "string.h" +#include "defs.h" +#include "dyn-string.h" +#include + +#include "common/common-types.h" +#include "common/common-exceptions.h" +#include "common/common-utils.h" + + +#include "utils.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; +} + +/* 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" "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/dwarf2utils.h b/gdb/dwarf2utils.h new file mode 100644 index 00000000000..95d629d100e --- /dev/null +++ b/gdb/dwarf2utils.h @@ -0,0 +1,28 @@ +/* DWARF 2 debugging format utils for GDB. + + Copyright (C) 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 . */ +#ifndef DWARF2UTILS_H +#define DWARF2UTILS_H + +/* See documentation in the utils.c file. */ +extern int producer_is_gcc_ge_4 (const char *producer); + +/* See documentation in the utils.c file. */ +extern int producer_is_gcc (const char *producer, int *major, int *minor); + +#endif diff --git a/gdb/utils.c b/gdb/utils.c index c660c6bafc0..45373a04eb2 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2944,60 +2944,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