1c82289
From 3bd7e5b7ee5ea0b3bbb4030ca841f66faad74f0f Mon Sep 17 00:00:00 2001
1c82289
From: Sergio Durigan Junior <sergiodj@redhat.com>
1c82289
Date: Fri, 21 Aug 2015 18:28:07 -0400
1c82289
Subject: [PATCH 2/4] Catching errors on probes-based dynamic linker interface
1c82289
1c82289
This patch is intended to make the interaction between the
1c82289
probes-based dynamic linker interface and the SystemTap SDT probe code
1c82289
on GDB more robust.  It does that by wrapping the calls to the probe
1c82289
API with TRY...CATCH'es, so that any exception thrown will be caught
1c82289
and handled properly.
1c82289
1c82289
The idea for this patch came from
1c82289
<https://bugzilla.redhat.com/show_bug.cgi?id=1196181>, which is a bug
1c82289
initially filed against Fedora GDB (but now under Fedora GLIBC).  This
1c82289
bug happens on armhfp (although it could happen on other targets as
1c82289
well), and is triggered because GCC generates a strange argument for
1c82289
one of the probes used by GDB in the dynamic linker interface.  As can
1c82289
be seen in the bug, this argument is "-4@.L1052".
1c82289
1c82289
I don't want to discuss the reasons for this argument to be there
1c82289
(this discussion belongs to the bug, or to another thread), but GDB
1c82289
could definitely do a better error handling here.  Currently, one sees
1c82289
the following message when there is an error in the probes-based
1c82289
dynamic linker interface:
1c82289
1c82289
  (gdb) run
1c82289
  Starting program: /bin/inferior
1c82289
  warning: Probes-based dynamic linker interface failed.
1c82289
  Reverting to original interface.
1c82289
1c82289
  Cannot parse expression `.L976 4@r4'.
1c82289
  (gdb)
1c82289
1c82289
Which means that one needs to explicitly issue a "continue" command to
1c82289
make GDB continue running the inferior, even though this error is not
1c82289
fatal and GDB will fallback to the old interface automatically.
1c82289
1c82289
This is where this patch helps: it makes GDB still print the necessary
1c82289
warnings or error messages, but it *also* does not stop the inferior
1c82289
unnecessarily.
1c82289
1c82289
I have tested this patch on the systems where this error happens, but
1c82289
I could not come up with a way to create a testcase for it.
1c82289
Nevertheless, it should be straightforward to see that this patch does
1c82289
improve the current situation.
1c82289
1c82289
gdb/ChangeLog:
1c82289
2015-09-01  Sergio Durigan Junior  <sergiodj@redhat.com>
1c82289
1c82289
	* solib-svr4.c (solib_event_probe_action): Call
1c82289
	get_probe_argument_count using TRY...CATCH.
1c82289
	(svr4_handle_solib_event): Likewise, for evaluate_probe_argument.
1c82289
---
1c82289
 gdb/ChangeLog    |  6 ++++++
1c82289
 gdb/solib-svr4.c | 43 ++++++++++++++++++++++++++++++++++++++++---
1c82289
 2 files changed, 46 insertions(+), 3 deletions(-)
1c82289
1c82289
Index: gdb-7.10/gdb/solib-svr4.c
1c82289
===================================================================
1c82289
--- gdb-7.10.orig/gdb/solib-svr4.c
1c82289
+++ gdb-7.10/gdb/solib-svr4.c
1c82289
@@ -1796,7 +1796,23 @@ solib_event_probe_action (struct probe_a
1c82289
        arg0: Lmid_t lmid (mandatory)
1c82289
        arg1: struct r_debug *debug_base (mandatory)
1c82289
        arg2: struct link_map *new (optional, for incremental updates)  */
1c82289
-  probe_argc = get_probe_argument_count (pa->probe, frame);
1c82289
+  TRY
1c82289
+    {
1c82289
+      probe_argc = get_probe_argument_count (pa->probe, frame);
1c82289
+    }
1c82289
+  CATCH (ex, RETURN_MASK_ERROR)
1c82289
+    {
1c82289
+      exception_print (gdb_stderr, ex);
1c82289
+      probe_argc = 0;
1c82289
+    }
1c82289
+  END_CATCH
1c82289
+
1c82289
+  /* If get_probe_argument_count throws an exception, probe_argc will
1c82289
+     be set to zero.  However, if pa->probe does not have arguments,
1c82289
+     then get_probe_argument_count will succeed but probe_argc will
1c82289
+     also be zero.  Both cases happen because of different things, but
1c82289
+     they are treated equally here: action will be set to
1c82289
+     PROBES_INTERFACE_FAILED.  */
1c82289
   if (probe_argc == 2)
1c82289
     action = FULL_RELOAD;
1c82289
   else if (probe_argc < 2)
1c82289
@@ -1950,7 +1966,17 @@ svr4_handle_solib_event (void)
1c82289
   usm_chain = make_cleanup (resume_section_map_updates_cleanup,
1c82289
 			    current_program_space);
1c82289
 
1c82289
-  val = evaluate_probe_argument (pa->probe, 1, frame);
1c82289
+  TRY
1c82289
+    {
1c82289
+      val = evaluate_probe_argument (pa->probe, 1, frame);
1c82289
+    }
1c82289
+  CATCH (ex, RETURN_MASK_ERROR)
1c82289
+    {
1c82289
+      exception_print (gdb_stderr, ex);
1c82289
+      val = NULL;
1c82289
+    }
1c82289
+  END_CATCH
1c82289
+
1c82289
   if (val == NULL)
1c82289
     {
1c82289
       do_cleanups (old_chain);
1c82289
@@ -1981,7 +2007,18 @@ svr4_handle_solib_event (void)
1c82289
 
1c82289
   if (action == UPDATE_OR_RELOAD)
1c82289
     {
1c82289
-      val = evaluate_probe_argument (pa->probe, 2, frame);
1c82289
+      TRY
1c82289
+	{
1c82289
+	  val = evaluate_probe_argument (pa->probe, 2, frame);
1c82289
+	}
1c82289
+      CATCH (ex, RETURN_MASK_ERROR)
1c82289
+	{
1c82289
+	  exception_print (gdb_stderr, ex);
1c82289
+	  do_cleanups (old_chain);
1c82289
+	  return;
1c82289
+	}
1c82289
+      END_CATCH
1c82289
+
1c82289
       if (val != NULL)
1c82289
 	lm = value_as_address (val);
1c82289
 
1c82289
From ad1c917a79e8c5aa67657f148415c1bee01b240f Mon Sep 17 00:00:00 2001
1c82289
From: Sergio Durigan Junior <sergiodj@redhat.com>
1c82289
Date: Wed, 2 Sep 2015 00:34:22 -0400
1c82289
Subject: [PATCH 3/4] Initialize variable and silence GCC warning from last
1c82289
 commit
1c82289
1c82289
BuildBot e-mailed me to let me know that my last commit broke GDB on
1c82289
RHEL-7.1 s390x.  On solib-svr4.c:svr4_handle_solib_event, 'val' now
1c82289
needs to be initialized as NULL because it is inside a TRY..CATCH
1c82289
block.  This patch does that.  Pushed as obvious.
1c82289
1c82289
gdb/ChangeLog:
1c82289
2015-09-01  Sergio Durigan Junior  <sergiodj@redhat.com>
1c82289
1c82289
	* solib-svr4.c (svr4_handle_solib_event): Initialize 'val' as NULL
1c82289
---
1c82289
 gdb/ChangeLog    | 4 ++++
1c82289
 gdb/solib-svr4.c | 2 +-
1c82289
 2 files changed, 5 insertions(+), 1 deletion(-)
1c82289
1c82289
Index: gdb-7.10/gdb/solib-svr4.c
1c82289
===================================================================
1c82289
--- gdb-7.10.orig/gdb/solib-svr4.c
1c82289
+++ gdb-7.10/gdb/solib-svr4.c
1c82289
@@ -1918,7 +1918,7 @@ svr4_handle_solib_event (void)
1c82289
   struct probe_and_action *pa;
1c82289
   enum probe_action action;
1c82289
   struct cleanup *old_chain, *usm_chain;
1c82289
-  struct value *val;
1c82289
+  struct value *val = NULL;
1c82289
   CORE_ADDR pc, debug_base, lm = 0;
1c82289
   int is_initial_ns;
1c82289
   struct frame_info *frame = get_current_frame ();
1c82289
From 73c6b4756a7cee53c274ed05fddcd079b8b7e57c Mon Sep 17 00:00:00 2001
1c82289
From: Sergio Durigan Junior <sergiodj@redhat.com>
1c82289
Date: Wed, 2 Sep 2015 00:46:43 -0400
1c82289
Subject: [PATCH 4/4] Initialize yet another variable to silence GCC warning
1c82289
 from last-but-one commit
1c82289
1c82289
Yet another BuildBot e-mail, yet another breakage on RHEL-7.1 s390x
1c82289
(which uses an older GCC).  This time,
1c82289
solib-svr4.c:solib_event_probe_action has the probe_argc variable,
1c82289
which is now inside a TRY..CATCH and therefore needs to be
1c82289
initialized.  Pushed as obvious.
1c82289
1c82289
gdb/ChangeLog:
1c82289
2015-09-01  Sergio Durigan Junior  <sergiodj@redhat.com>
1c82289
1c82289
	* solib-svr4.c (solib_event_probe_action): Initialize 'probe_argc'
1c82289
	as zero.
1c82289
---
1c82289
 gdb/ChangeLog    | 5 +++++
1c82289
 gdb/solib-svr4.c | 2 +-
1c82289
 2 files changed, 6 insertions(+), 1 deletion(-)
1c82289
1c82289
 2015-09-01  Sergio Durigan Junior  <sergiodj@redhat.com>
1c82289
Index: gdb-7.10/gdb/solib-svr4.c
1c82289
===================================================================
1c82289
--- gdb-7.10.orig/gdb/solib-svr4.c
1c82289
+++ gdb-7.10/gdb/solib-svr4.c
1c82289
@@ -1782,7 +1782,7 @@ static enum probe_action
1c82289
 solib_event_probe_action (struct probe_and_action *pa)
1c82289
 {
1c82289
   enum probe_action action;
1c82289
-  unsigned probe_argc;
1c82289
+  unsigned probe_argc = 0;
1c82289
   struct frame_info *frame = get_current_frame ();
1c82289
 
1c82289
   action = pa->action;