[PATCH 1/2] gdb: Update producer check for Intel compilers.
Andrew Burgess
andrew.burgess@embecosm.com
Wed Apr 7 20:25:02 GMT 2021
* Felix Willgerodt via Gdb-patches <gdb-patches@sourceware.org> [2021-04-07 17:12:08 +0200]:
> The main goal of this patch is to get rid of a warning for the new Fortran
> compiler:
>
> (gdb) b 9
> warning: Could not recognize version of Intel Compiler in: "Intel(R) Fortran 21.0-2087b"
> Breakpoint 1 at 0x4048cf: file comp.f90, line 9.
>
> While trying to fix this I analyzed DW_AT_producer of all latest Intel
> compilers for C, C++ and Fortran. They do no longer necessarily start with
> "Intel (R)" nor do they follow the internal and external version number
> scheme that the original patch for this check assumed. Some newer compilers
> even contradict the "intermediate" digit in the old version scheme and have
> the MINOR number as the second digit, even when having 3 or 4 digits overall.
>
> Therefore I rewrote the check to consider the first MAJOR.MINOR string found
> as the version number. This might not be 100% correct for some older
> internal compilers, but the only current user of this function is only
> checking for the major version anyway. Hence this should be reliable enough
> and extendable enough going forward.
>
> gdb/Changelog:
> 2021-03-12 Felix Willgerodt <felix.willgerodt@intel.com>
>
> * producer.c: (producer_is_icc): Update for new version scheme.
> (producer_parsing_tests): Update names and expected results.
> * producer.h: (producer_is_icc): Update comment accordingly.
LGTM.
Thanks,
Andrew
> ---
> gdb/producer.c | 51 ++++++++++++++++----------------------------------
> gdb/producer.h | 20 +-------------------
> 2 files changed, 17 insertions(+), 54 deletions(-)
>
> diff --git a/gdb/producer.c b/gdb/producer.c
> index fcfd7b9b807..1cda48c204a 100644
> --- a/gdb/producer.c
> +++ b/gdb/producer.c
> @@ -20,6 +20,7 @@
> #include "defs.h"
> #include "producer.h"
> #include "gdbsupport/selftest.h"
> +#include <regex>
>
> /* See producer.h. */
>
> @@ -78,50 +79,30 @@ producer_is_gcc (const char *producer, int *major, int *minor)
> bool
> producer_is_icc (const char *producer, int *major, int *minor)
> {
> - if (producer == NULL || !startswith (producer, "Intel(R)"))
> + std::regex i_re ("Intel\\(R\\)");
> + std::cmatch i_m;
> + if ((producer == nullptr) || !std::regex_search (producer, i_m, i_re))
> return false;
>
> /* Prepare the used fields. */
> int maj, min;
> - if (major == NULL)
> + if (major == nullptr)
> major = &maj;
> - if (minor == NULL)
> + if (minor == nullptr)
> minor = &min;
>
> *minor = 0;
> *major = 0;
>
> - /* Consumes the string till a "Version" is found. */
> - const char *cs = strstr (producer, "Version");
> - if (cs != NULL)
> - {
> - 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;
> - }
> - }
> + std::regex re ("[0-9]+\\.[0-9]+");
> + std::cmatch version;
>
> - static bool warning_printed = false;
> - /* Not recognized as Intel, let the user know. */
> - if (!warning_printed)
> + if (std::regex_search (producer, version, re))
> {
> - warning (_("Could not recognize version of Intel Compiler in: \"%s\""),
> - producer);
> - warning_printed = true;
> + sscanf (version.str ().c_str (), "%d.%d", major, minor);
> + return true;
> }
> +
> return false;
> }
>
> @@ -152,15 +133,15 @@ producer_parsing_tests ()
> }
>
> {
> - static const char extern_f_14_1[] = "\
> + static const char extern_f_14_0[] = "\
> Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on \
> Intel(R) 64, \
> Version 14.0.1.074 Build 20130716";
>
> int major = 0, minor = 0;
> - SELF_CHECK (producer_is_icc (extern_f_14_1, &major, &minor)
> - && major == 14 && minor == 1);
> - SELF_CHECK (!producer_is_gcc (extern_f_14_1, &major, &minor));
> + SELF_CHECK (producer_is_icc (extern_f_14_0, &major, &minor)
> + && major == 14 && minor == 0);
> + SELF_CHECK (!producer_is_gcc (extern_f_14_0, &major, &minor));
> }
>
> {
> diff --git a/gdb/producer.h b/gdb/producer.h
> index 15a60dc0ab5..9cfccd63371 100644
> --- a/gdb/producer.h
> +++ b/gdb/producer.h
> @@ -31,25 +31,7 @@ extern int producer_is_gcc_ge_4 (const char *producer);
> extern int producer_is_gcc (const char *producer, int *major, int *minor);
>
> /* Returns true if the given PRODUCER string is Intel or false
> - otherwise. Sets the MAJOR and MINOR versions when not NULL.
> -
> - Internal and external ICC versions have to be taken into account.
> - PRODUCER strings for internal releases are slightly different than
> - for public ones. Internal releases have a major release number and
> - 0 as minor release. External releases have 4 fields, 3 of them are
> - not 0 and only two are of interest, major and update.
> -
> - Examples are:
> -
> - Public release:
> - "Intel(R) Fortran Intel(R) 64 Compiler XE for applications
> - running on Intel(R) 64, Version 14.0.1.074 Build 20130716";
> - "Intel(R) C++ Intel(R) 64 Compiler XE for applications
> - running on Intel(R) 64, Version 14.0.1.074 Build 20130716";
> -
> - Internal releases:
> - "Intel(R) C++ Intel(R) 64 Compiler for applications
> - running on Intel(R) 64, Version 18.0 Beta ....". */
> + otherwise. Sets the MAJOR and MINOR versions when not NULL. */
> extern bool producer_is_icc (const char *producer, int *major, int *minor);
>
> /* Returns true if the given PRODUCER string is LLVM (clang/flang) or
> --
> 2.25.4
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
More information about the Gdb-patches
mailing list