From patchwork Thu Sep 21 16:19:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Walfred Tedeschi X-Patchwork-Id: 23062 Received: (qmail 15622 invoked by alias); 21 Sep 2017 16:19:16 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 15612 invoked by uid 89); 21 Sep 2017 16:19:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=bs, Bs, Preparing X-HELO: mga11.intel.com Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 21 Sep 2017 16:19:13 +0000 Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Sep 2017 09:19:12 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga005.fm.intel.com with ESMTP; 21 Sep 2017 09:19:11 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id v8LGJADW021027; Thu, 21 Sep 2017 17:19:10 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id v8LGJA2o019405; Thu, 21 Sep 2017 18:19:10 +0200 Received: (from wtedesch@localhost) by ulvlx001.iul.intel.com with LOCAL id v8LGJ9PO019401; Thu, 21 Sep 2017 18:19:09 +0200 From: Walfred Tedeschi To: palves@redhat.com, simon.marchi@polymtl.ca Cc: gdb-patches@sourceware.org, Walfred Tedeschi Subject: [PATCH] dwarf2read: move producers to producers.c/h file Date: Thu, 21 Sep 2017 18:19:03 +0200 Message-Id: <1506010743-19367-1-git-send-email-walfred.tedeschi@intel.com> X-IsSubscribed: yes 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 (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. --- gdb/Makefile.in | 2 + gdb/amd64-tdep.c | 1 + gdb/dwarf2read.c | 1 + gdb/producer.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/producer.h | 36 ++++++++++++++++ gdb/utils.c | 54 ------------------------ gdb/utils.h | 3 -- 7 files changed, 166 insertions(+), 57 deletions(-) create mode 100644 gdb/producer.c create mode 100644 gdb/producer.h 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 #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 #include #include diff --git a/gdb/producer.c b/gdb/producer.c new file mode 100644 index 0000000..bea0d7e --- /dev/null +++ b/gdb/producer.c @@ -0,0 +1,126 @@ +/* Producer 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 . */ + +#include "config.h" +#include "producer.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" + +/* See documentation in the producer.h file. */ + +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 documentation in the producer.h file. */ + +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; +} + +/* See documentation in the producer.h file. */ + +bool +producer_is_icc (const char *producer, int *major, int *minor) +{ + if (producer == NULL || !startswith (producer, "Intel(R)")) + return 0; + +/* Preparing the used fields. */ + int maj, min; + if (major == NULL) + major = &maj; + if (minor == NULL) + minor = &min; + + *minor = 0; + *major = 0; + + /* Consumes the string till a "Version" is found. */ + const char *cs = strstr (producer, "Version"); + cs = skip_to_space (cs); + + int intermediate = 0; + int nof = sscanf (cs, "%d.%d.%d.%*d", major, &intermediate, minor); + + /* Internal versions are represented only as MAJOR.MINOR, where + minor is usually 0. + Public versions have 3 fields as described with the command above. */ + if (nof == 3) + return TRUE; + + if (nof == 2) + { + *minor = intermediate; + return TRUE; + } + + static bool warning_printed = FALSE; + /* Not recognized as Intel, let user know. */ + if (warning_printed == FALSE) + { + warning (_("Could not recognize version of Intel Compiler in:%s"), producer); + warning_printed = TRUE; + } + return FALSE; +} diff --git a/gdb/producer.h b/gdb/producer.h new file mode 100644 index 0000000..961f958 --- /dev/null +++ b/gdb/producer.h @@ -0,0 +1,36 @@ +/* Producer 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 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 c660c6b..45373a0 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 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