Blame SOURCES/gdb-bz533176-fortran-omp-step.patch

861f93
https://bugzilla.redhat.com/show_bug.cgi?id=533176#c4
861f93
861f93
I find it a bug in DWARF and gdb behaves correctly according to it.  From the
861f93
current DWARF's point of view the is a function call which you skip by "next".
861f93
861f93
If you hide any /usr/lib/debug such as using:
861f93
gdb -nx -ex 'set debug-file-directory /qwe' -ex 'file ./tpcommon_gfortran44'
861f93
and use "step" command instead of "next" there it will work.
861f93
(You need to hide debuginfo from libgomp as you would step into libgomp sources
861f93
to maintain the threads for execution.)
861f93
861f93
There should be some DWARF extension for it, currently tried to detect
861f93
substring ".omp_fn." as this function is called "MAIN__.omp_fn.0" and do not
861f93
consider such sub-function as a skippable by "next".
861f93
861f93
Another problem is that with "set scheduler-locking" being "off" (default
861f93
upstream) or "step" (default in F/RHEL) the simultaneous execution of the
861f93
threads is inconvenient.  Setting it to "on" will lockup the debugging as the
861f93
threads need to get synchronized at some point.  This is a more general
861f93
debugging problem of GOMP outside of the scope of this Bug.
861f93
861f93
861f93
861f93
Index: gdb-7.5.50.20130118/gdb/infrun.c
861f93
===================================================================
861f93
--- gdb-7.5.50.20130118.orig/gdb/infrun.c	2013-01-19 23:38:22.329371410 +0100
861f93
+++ gdb-7.5.50.20130118/gdb/infrun.c	2013-01-19 23:39:03.322429041 +0100
861f93
@@ -4918,6 +4918,16 @@ process_event_stop_test:
861f93
 
861f93
       if (ecs->event_thread->control.step_over_calls == STEP_OVER_ALL)
861f93
 	{
861f93
+	  struct symbol *stop_fn = find_pc_function (stop_pc);
861f93
+	  struct minimal_symbol *stopf = lookup_minimal_symbol_by_pc (stop_pc);
861f93
+
861f93
+	  if ((stop_fn == NULL
861f93
+	       || strstr (SYMBOL_LINKAGE_NAME (stop_fn), ".omp_fn.") == NULL)
861f93
+	      /* gcc-4.7.2-9.fc19.x86_64 uses a new format.  */
861f93
+	      && (stopf == NULL
861f93
+		  || strstr (SYMBOL_LINKAGE_NAME (stopf), "._omp_fn.") == NULL))
861f93
+{	/* ".omp_fn." */
861f93
+
861f93
 	  /* We're doing a "next".
861f93
 
861f93
 	     Normal (forward) execution: set a breakpoint at the
861f93
@@ -4953,6 +4963,7 @@ process_event_stop_test:
861f93
 
861f93
 	  keep_going (ecs);
861f93
 	  return;
861f93
+}	/* ".omp_fn." */
861f93
 	}
861f93
 
861f93
       /* If we are in a function call trampoline (a stub between the
861f93
Index: gdb-7.5.50.20130118/gdb/testsuite/gdb.fortran/omp-step.exp
861f93
===================================================================
861f93
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
861f93
+++ gdb-7.5.50.20130118/gdb/testsuite/gdb.fortran/omp-step.exp	2013-01-19 23:38:23.213372622 +0100
861f93
@@ -0,0 +1,31 @@
861f93
+# Copyright 2009 Free Software Foundation, Inc.
861f93
+
861f93
+# This program is free software; you can redistribute it and/or modify
861f93
+# it under the terms of the GNU General Public License as published by
861f93
+# the Free Software Foundation; either version 3 of the License, or
861f93
+# (at your option) any later version.
861f93
+#
861f93
+# This program is distributed in the hope that it will be useful,
861f93
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
861f93
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
861f93
+# GNU General Public License for more details.
861f93
+#
861f93
+# You should have received a copy of the GNU General Public License
861f93
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
861f93
+
861f93
+set testfile "omp-step"
861f93
+set srcfile ${testfile}.f90
861f93
+if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug f90 additional_flags=-fopenmp}] } {
861f93
+    return -1
861f93
+}
861f93
+
861f93
+if ![runto [gdb_get_line_number "start-here"]] {
861f93
+    perror "Couldn't run to start-here"
861f93
+    return 0
861f93
+}
861f93
+
861f93
+gdb_test "next" {!\$omp parallel} "step closer"
861f93
+gdb_test "next" {a\(omp_get_thread_num\(\) \+ 1\) = 1} "step into omp"
861f93
+
861f93
+gdb_breakpoint [gdb_get_line_number "success"]
861f93
+gdb_continue_to_breakpoint "success" ".*success.*"
861f93
Index: gdb-7.5.50.20130118/gdb/testsuite/gdb.fortran/omp-step.f90
861f93
===================================================================
861f93
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
861f93
+++ gdb-7.5.50.20130118/gdb/testsuite/gdb.fortran/omp-step.f90	2013-01-19 23:38:23.213372622 +0100
861f93
@@ -0,0 +1,32 @@
861f93
+! Copyright 2009 Free Software Foundation, Inc.
861f93
+
861f93
+! This program is free software; you can redistribute it and/or modify
861f93
+! it under the terms of the GNU General Public License as published by
861f93
+! the Free Software Foundation; either version 3 of the License, or
861f93
+! (at your option) any later version.
861f93
+!
861f93
+! This program is distributed in the hope that it will be useful,
861f93
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
861f93
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
861f93
+! GNU General Public License for more details.
861f93
+!
861f93
+! You should have received a copy of the GNU General Public License
861f93
+! along with this program.  If not, see <http://www.gnu.org/licenses/>.
861f93
+
861f93
+      use omp_lib
861f93
+      integer nthreads, i, a(1000)
861f93
+      nthreads = omp_get_num_threads()
861f93
+      if (nthreads .gt. 1000) call abort
861f93
+
861f93
+      do i = 1, nthreads
861f93
+          a(i) = 0
861f93
+      end do
861f93
+      print *, "start-here"
861f93
+!$omp parallel
861f93
+      a(omp_get_thread_num() + 1) = 1
861f93
+!$omp end parallel
861f93
+      do i = 1, nthreads
861f93
+          if (a(i) .ne. 1) call abort
861f93
+      end do
861f93
+      print *, "success"
861f93
+      end