aboutsummaryrefslogtreecommitdiff
path: root/gdb/producer.c
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 /gdb/producer.c
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.
Diffstat (limited to 'gdb/producer.c')
-rw-r--r--gdb/producer.c25
1 files changed, 25 insertions, 0 deletions
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));
+ }
}
}
}