From patchwork Mon Sep 25 14:51:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Walfred Tedeschi X-Patchwork-Id: 23134 Received: (qmail 82322 invoked by alias); 25 Sep 2017 14:51:29 -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 82170 invoked by uid 89); 25 Sep 2017 14:51:28 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.7 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=MAJOR, bs X-HELO: mga01.intel.com Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 25 Sep 2017 14:51:26 +0000 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2017 07:51:24 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga003.jf.intel.com with ESMTP; 25 Sep 2017 07:51:22 -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 v8PEpMNp030925; Mon, 25 Sep 2017 15:51:22 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id v8PEpMe0005748; Mon, 25 Sep 2017 16:51:22 +0200 Received: (from wtedesch@localhost) by ulvlx001.iul.intel.com with LOCAL id v8PEpLZ5005744; Mon, 25 Sep 2017 16:51:21 +0200 From: Walfred Tedeschi To: palves@redhat.com, simon.marchi@polymtl.ca Cc: gdb-patches@sourceware.org, Walfred Tedeschi Subject: [PATCH V2] dwarf2read: move producers help functions to a dwarf specific file Date: Mon, 25 Sep 2017 16:51:18 +0200 Message-Id: <1506351078-5705-1-git-send-email-walfred.tedeschi@intel.com> X-IsSubscribed: yes This patch add new files for the dwarf producer checks. 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 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. --- gdb/Makefile.in | 2 ++ gdb/amd64-tdep.c | 1 + gdb/dwarf2read.c | 1 + gdb/producer.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/producer.h | 34 ++++++++++++++++++++++++ gdb/utils.c | 54 --------------------------------------- gdb/utils.h | 3 --- 7 files changed, 116 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..5417e52 --- /dev/null +++ b/gdb/producer.c @@ -0,0 +1,78 @@ +/* Producer string parser 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 . */ + +#include "defs.h" +#include "producer.h" +#include "utils.h" + +#if defined GDB_SELF_TEST +#include "selftest.h" +#endif + +/* 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; +} + diff --git a/gdb/producer.h b/gdb/producer.h new file mode 100644 index 0000000..cd27d8f --- /dev/null +++ b/gdb/producer.h @@ -0,0 +1,34 @@ +/* Producer string parser 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 . */ + +#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