aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlok Kumar Sharma <AlokKumar.Sharma@amd.com>2020-08-20 10:35:27 +0530
committerAlok Kumar Sharma <AlokKumar.Sharma@amd.com>2020-08-20 10:38:59 +0530
commitc2fd7faea8f2c3a267f276ceb6a95f9f537ea7c1 (patch)
tree13ba6ecf6e6cb212269d5d01a0b97ea0112b307f
parenta0522545b6ef4dd43f976d6acb4fd2b0aa964b27 (diff)
downloadgdb-c2fd7faea8f2c3a267f276ceb6a95f9f537ea7c1.zip
gdb-c2fd7faea8f2c3a267f276ceb6a95f9f537ea7c1.tar.gz
gdb-c2fd7faea8f2c3a267f276ceb6a95f9f537ea7c1.tar.bz2
Fix for incorrect breakpoint set in case of flang compiled binary
Currently, GDB is not able to set a breakpoint at subprogram post prologue for flang generated binaries. This is due to clang having two line notes one before and another after the prologue. Now the end of prologue is determined using symbol table, which was the way for clang generated binaries already. Since clang and flang both share same back-end it is true for flang as well. gdb/ChangeLog * 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. gdb/testsuite/ChangeLog * gdb.fortran/vla-type.exp: Skip commands not required for the Flang compiled binaries after prologue fix.
-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>" \