diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/amd64-tdep.c | 7 | ||||
-rw-r--r-- | gdb/arm-tdep.c | 4 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 8 | ||||
-rw-r--r-- | gdb/producer.c | 25 | ||||
-rw-r--r-- | gdb/producer.h | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rwxr-xr-x | gdb/testsuite/gdb.fortran/vla-type.exp | 8 |
8 files changed, 62 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cd95028..aee2578 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2020-08-19 Alok Kumar Sharma <AlokKumar.Sharma@amd.com> + + * amd64-tdep.c (amd64_skip_prologue): Using symbol table + to find the end of prologue for flang compiled binaries. + * arm-tdep.c (arm_skip_prologue): Likewise. + * i386-tdep.c (i386_skip_prologue): Likewise. + * producer.c (producer_is_llvm): New function. + (producer_parsing_tests): Added new tests for clang/flang. + * producer.h (producer_is_llvm): New declaration. + 2020-08-18 Simon Marchi <simon.marchi@efficios.com> * linux-nat.c (linux_nat_debug_printf): New function. diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 768fe63..59f7c9f 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2547,12 +2547,13 @@ amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) = skip_prologue_using_sal (gdbarch, func_addr); struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr); - /* Clang always emits a line note before the prologue and another - one after. We trust clang to emit usable line notes. */ + /* LLVM backend (Clang/Flang) always emits a line note before the + prologue and another one after. We trust clang to emit usable + line notes. */ if (post_prologue_pc && (cust != NULL && COMPUNIT_PRODUCER (cust) != NULL - && startswith (COMPUNIT_PRODUCER (cust), "clang "))) + && producer_is_llvm (COMPUNIT_PRODUCER (cust)))) return std::max (start_pc, post_prologue_pc); } diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 9cedcc8..074eedb 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -60,6 +60,8 @@ #include "record-full.h" #include <algorithm> +#include "producer.h" + #if GDB_SELF_TEST #include "gdbsupport/selftest.h" #endif @@ -1351,7 +1353,7 @@ arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) && (cust == NULL || COMPUNIT_PRODUCER (cust) == NULL || startswith (COMPUNIT_PRODUCER (cust), "GNU ") - || startswith (COMPUNIT_PRODUCER (cust), "clang "))) + || producer_is_llvm (COMPUNIT_PRODUCER (cust)))) return post_prologue_pc; if (post_prologue_pc != 0) diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 9b905c1..d9fa2b9 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -65,6 +65,7 @@ #include <ctype.h> #include <algorithm> #include <unordered_set> +#include "producer.h" /* Register names. */ @@ -1847,12 +1848,13 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) = skip_prologue_using_sal (gdbarch, func_addr); struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr); - /* Clang always emits a line note before the prologue and another - one after. We trust clang to emit usable line notes. */ + /* LLVM backend (Clang/Flang) always emits a line note before the + prologue and another one after. We trust clang to emit usable + line notes. */ if (post_prologue_pc && (cust != NULL && COMPUNIT_PRODUCER (cust) != NULL - && startswith (COMPUNIT_PRODUCER (cust), "clang "))) + && producer_is_llvm (COMPUNIT_PRODUCER (cust)))) return std::max (start_pc, post_prologue_pc); } diff --git a/gdb/producer.c b/gdb/producer.c index 735a928..d25d93f 100644 --- a/gdb/producer.c +++ b/gdb/producer.c @@ -125,6 +125,15 @@ producer_is_icc (const char *producer, int *major, int *minor) return false; } +/* See producer.h. */ + +bool +producer_is_llvm (const char *producer) +{ + return ((producer != NULL) && (startswith (producer, "clang ") + || startswith (producer, " F90 Flang "))); +} + #if defined GDB_SELF_TEST namespace selftests { namespace producer { @@ -203,6 +212,22 @@ Version 18.0 Beta"; SELF_CHECK (producer_is_gcc (gnu_exp, &major, &minor) && major == 5 && minor == 0); } + + { + static const char clang_llvm_exp[] = "clang version 12.0.0 (CLANG: bld#8)"; + int major = 0, minor = 0; + SELF_CHECK (!producer_is_icc (clang_llvm_exp, NULL, NULL)); + SELF_CHECK (!producer_is_gcc (clang_llvm_exp, &major, &minor)); + SELF_CHECK (producer_is_llvm (clang_llvm_exp)); + } + + { + static const char flang_llvm_exp[] = " F90 Flang - 1.5 2017-05-01"; + int major = 0, minor = 0; + SELF_CHECK (!producer_is_icc (flang_llvm_exp, NULL, NULL)); + SELF_CHECK (!producer_is_gcc (flang_llvm_exp, &major, &minor)); + SELF_CHECK (producer_is_llvm (flang_llvm_exp)); + } } } } diff --git a/gdb/producer.h b/gdb/producer.h index d8974d3..e9bc309 100644 --- a/gdb/producer.h +++ b/gdb/producer.h @@ -52,4 +52,8 @@ extern int producer_is_gcc (const char *producer, int *major, int *minor); running on Intel(R) 64, Version 18.0 Beta ....". */ extern bool producer_is_icc (const char *producer, int *major, int *minor); +/* Returns true if the given PRODUCER string is LLVM (clang/flang) or + false otherwise.*/ +extern bool producer_is_llvm (const char *producer); + #endif diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7c62458..0e4f6a5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-08-19 Alok Kumar Sharma <AlokKumar.Sharma@amd.com> + + * gdb.fortran/vla-type.exp: Skip commands not required for + the Flang compiled binaries after prologue fix. + 2020-08-17 Tom de Vries <tdevries@suse.de> Tom Tromey <tromey@adacore.com> diff --git a/gdb/testsuite/gdb.fortran/vla-type.exp b/gdb/testsuite/gdb.fortran/vla-type.exp index 925c583..e2b8d71 100755 --- a/gdb/testsuite/gdb.fortran/vla-type.exp +++ b/gdb/testsuite/gdb.fortran/vla-type.exp @@ -33,8 +33,12 @@ set int [fortran_int4] # Check if not allocated VLA in type does not break # the debugger when accessing it. -gdb_breakpoint [gdb_get_line_number "before-allocated"] -gdb_continue_to_breakpoint "before-allocated" +# break main for Flang compiler already breaks here +if ![test_compiler_info "clang-*"] { + gdb_breakpoint [gdb_get_line_number "before-allocated"] + gdb_continue_to_breakpoint "before-allocated" +} + gdb_test "print twov" " = \\\( ivla1 = <not allocated>, ivla2 = <not allocated> \\\)" \ "print twov before allocated" gdb_test "print twov%ivla1" " = <not allocated>" \ |