diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 20 | ||||
-rw-r--r-- | gdb/utils.c | 60 | ||||
-rw-r--r-- | gdb/utils.h | 1 |
4 files changed, 43 insertions, 45 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d97aa03..f369364 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-01-25 Mark Wielaard <mjw@redhat.com> + + * dwarf2read.c (checkproducer): Call producer_is_gcc. + * utils.c (producer_is_gcc_ge_4): Likewise. + (producer_is_gcc): New function. + * utils.h (producer_is_gcc): New declaration. + 2015-01-29 Joel Brobecker <brobecker@adacore.com> * gdbtypes.h (struct dynamic_prop): New PROP_ADDR_OFFSET enum diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index ccbaede..89b8dfe 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -12266,7 +12266,7 @@ static void check_producer (struct dwarf2_cu *cu) { const char *cs; - int major, minor, release; + int major, minor; if (cu->producer == NULL) { @@ -12279,22 +12279,10 @@ check_producer (struct dwarf2_cu *cu) combination. gcc-4.5.x -gdwarf-4 binaries have DW_AT_accessibility interpreted incorrectly by GDB now - GCC PR debug/48229. */ } - else if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) == 0) + else if ((major = producer_is_gcc (cu->producer, &minor)) > 0) { - /* Skip any identifier after "GNU " - such as "C++" or "Java". */ - - cs = &cu->producer[strlen ("GNU ")]; - while (*cs && !isdigit (*cs)) - cs++; - if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3) - { - /* Not recognized as GCC. */ - } - else - { - cu->producer_is_gxx_lt_4_6 = major < 4 || (major == 4 && minor < 6); - cu->producer_is_gcc_lt_4_3 = major < 4 || (major == 4 && minor < 3); - } + cu->producer_is_gxx_lt_4_6 = major < 4 || (major == 4 && minor < 6); + cu->producer_is_gcc_lt_4_3 = major < 4 || (major == 4 && minor < 3); } else if (strncmp (cu->producer, "Intel(R) C", strlen ("Intel(R) C")) == 0) cu->producer_is_icc = 1; diff --git a/gdb/utils.c b/gdb/utils.c index a9a3082..909476b 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3258,36 +3258,8 @@ make_bpstat_clear_actions_cleanup (void) int producer_is_gcc_ge_4 (const char *producer) { - const char *cs; int major, minor; - - if (producer == NULL) - { - /* For unknown compilers expect their behavior is not compliant. For GCC - this case can also happen for -gdwarf-4 type units supported since - gcc-4.5. */ - - return -1; - } - - /* Skip any identifier after "GNU " - such as "C++" or "Java". */ - - if (strncmp (producer, "GNU ", strlen ("GNU ")) != 0) - { - /* For non-GCC compilers expect their behavior is not compliant. */ - - return -1; - } - cs = &producer[strlen ("GNU ")]; - while (*cs && !isdigit (*cs)) - cs++; - if (sscanf (cs, "%d.%d", &major, &minor) != 2) - { - /* Not recognized as GCC. */ - - return -1; - } - + major = producer_is_gcc (producer, &minor); if (major < 4) return -1; if (major > 4) @@ -3295,6 +3267,36 @@ producer_is_gcc_ge_4 (const char *producer) return minor; } +/* Returns the major version number if the given PRODUCER string is GCC and + sets the MINOR version. Returns -1 if the given PRODUCER is NULL or it + isn't GCC. */ +int +producer_is_gcc (const char *producer, int *minor) +{ + const char *cs; + int major; + + if (producer != NULL && strncmp (producer, "GNU ", strlen ("GNU ")) == 0) + { + /* 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 major; + } + + /* Not recognized as GCC. */ + return -1; +} + /* Helper for make_cleanup_free_char_ptr_vec. */ static void diff --git a/gdb/utils.h b/gdb/utils.h index e58260c..6724d7c 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -302,6 +302,7 @@ 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 *minor); extern int myread (int, char *, int); |