aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/amd64-tdep.c7
-rw-r--r--gdb/arm-tdep.c4
-rw-r--r--gdb/i386-tdep.c8
-rw-r--r--gdb/producer.c25
-rw-r--r--gdb/producer.h4
-rw-r--r--gdb/testsuite/ChangeLog5
-rwxr-xr-xgdb/testsuite/gdb.fortran/vla-type.exp8
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>" \