diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 58df0ca592..a23c2d880c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2015-02-04 Mark Wielaard + + * utils.h (producer_is_gcc): Change return type to bool. Add major + argument. + * utils.c (producer_is_gcc): Likewise. + (producer_is_gcc_ge_4): Adjust producer_is_gcc call. + * dwarf2read.c (check_producer): Likewise. + 2015-02-10 Pedro Alves * infrun.c (displaced_step_fixup): Switch to the event thread diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index db35e7e8f7..a7643896c7 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -12293,7 +12293,7 @@ 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 ((major = producer_is_gcc (cu->producer, &minor)) > 0) + else if (producer_is_gcc (cu->producer, &major, &minor)) { 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); diff --git a/gdb/utils.c b/gdb/utils.c index 909476bce2..2b5473947c 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3259,7 +3259,9 @@ int producer_is_gcc_ge_4 (const char *producer) { int major, minor; - major = producer_is_gcc (producer, &minor); + + if (! producer_is_gcc (producer, &major, &minor)) + return -1; if (major < 4) return -1; if (major > 4) @@ -3267,17 +3269,24 @@ 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) +/* Returns true if the given PRODUCER string is GCC and sets the MAJOR + and MINOR versions when not NULL. Returns false if the given PRODUCER + is NULL or it isn't GCC. */ + +bool +producer_is_gcc (const char *producer, int *major, int *minor) { const char *cs; - int major; if (producer != NULL && strncmp (producer, "GNU ", strlen ("GNU ")) == 0) { + 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" @@ -3289,7 +3298,7 @@ producer_is_gcc (const char *producer, int *minor) cs++; if (*cs && isspace (*cs)) cs++; - if (sscanf (cs, "%d.%d", &major, minor) == 2) + if (sscanf (cs, "%d.%d", major, minor) == 2) return major; } diff --git a/gdb/utils.h b/gdb/utils.h index 6724d7ce8d..d8afa79481 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -21,6 +21,8 @@ #ifndef UTILS_H #define UTILS_H +#include + #include "exceptions.h" extern void initialize_utils (void); @@ -302,7 +304,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 bool producer_is_gcc (const char *producer, int *major, int *minor); extern int myread (int, char *, int);