Fix for incorrect breakpoint set in case of flang compiled binary
authorAlok Kumar Sharma <AlokKumar.Sharma@amd.com>
Thu, 20 Aug 2020 05:05:27 +0000 (10:35 +0530)
committerAlok Kumar Sharma <AlokKumar.Sharma@amd.com>
Thu, 20 Aug 2020 05:08:59 +0000 (10:38 +0530)
  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.

gdb/ChangeLog
gdb/amd64-tdep.c
gdb/arm-tdep.c
gdb/i386-tdep.c
gdb/producer.c
gdb/producer.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/vla-type.exp

index cd950287ec23b2263bec48ca7249925c20887fcf..aee25787b0fff2475c10b20d50d1baf70b68ef86 100644 (file)
@@ -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.
index 768fe63bdde7ddd331f724cce309840be57afb98..59f7c9f885f446cbc5ae6cec427bfcd5b524df36 100644 (file)
@@ -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);
     }
 
index 9cedcc8575544be5817c8b58f60e886ec279a066..074eedb48005829ba366802bdeda27571b922e49 100644 (file)
@@ -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)
index 9b905c1996afdebf6a9df34f8868e714e0c0122d..d9fa2b926499e4297a543d40177e5b5cddf8abc6 100644 (file)
@@ -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);
     }
  
index 735a928f335ad5e868eaf9278ae08cfc7e92aa2a..d25d93fcced4ee47857fa7738db01318a5e31163 100644 (file)
@@ -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));
+  }
 }
 }
 }
index d8974d3814e548790d8f75b5e96983cf8d72966f..e9bc309b0c8b88b662cfc30a7ae776aa6ed12c05 100644 (file)
@@ -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
index 7c624589de2d51128186d92390d7cc21387f44fa..0e4f6a5ce903fa3e14e9688194fd191528ca2029 100644 (file)
@@ -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>
 
index 925c583edcdd65565a9dcb662abc45c197374bba..e2b8d71b4cba8431c6fc61bfe4340cd6355cf8bd 100755 (executable)
@@ -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>" \