This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] dtrace-probe: Handle error while parsing probe argument.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=429e1e811b400f07b5a514ea6b8a70b28e2d7ee9

commit 429e1e811b400f07b5a514ea6b8a70b28e2d7ee9
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Thu Mar 26 19:14:03 2015 +0100

    dtrace-probe: Handle error while parsing probe argument.
    
    The debugger on Solaris has been broken since the introduction of
    DTrace probe support:
    
        (gdb) start
        Temporary breakpoint 1 at 0x80593bc: file simple_main.adb, line 4.
        Starting program: /[...]/simple_main
        [Thread debugging using libthread_db enabled]
        No definition of "mutex_t" in current context.
    
    The problem occurs while trying to parse a probe's argument,
    and the exception propagates all the way to the top. This patch
    fixes the issue by containing the exception and falling back on
    using the "long" builtin type if the argument's type could not
    be determined.
    
    Also, the parsing should be done using the C language parser.
    
    gdb/ChangeLog:
    
            * dtrace-probe.c (dtrace_process_dof_probe): Contain any
            exception raised while parsing the probe arguments.
            Force parsing to be done using the C language parser.
            * expression.h (parse_expression_with_language): Declare.
            * parse.c (parse_expression_with_language): New function.

Diff:
---
 gdb/ChangeLog      |  8 ++++++++
 gdb/dtrace-probe.c | 14 ++++++++++++--
 gdb/expression.h   |  3 +++
 gdb/parse.c        | 22 ++++++++++++++++++++++
 4 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 70026d0..150b29a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2015-03-26  Joel Brobecker  <brobecker@adacore.com>
+
+	* dtrace-probe.c (dtrace_process_dof_probe): Contain any
+	exception raised while parsing the probe arguments.
+	Force parsing to be done using the C language parser.
+	* expression.h (parse_expression_with_language): Declare.
+	* parse.c (parse_expression_with_language): New function.
+
 2015-03-26  Jon Turney  <jon.turney@dronecode.org.uk>
 
 	* MAINTAINERS (Write After Approval): Add "Jon Turney".
diff --git a/gdb/dtrace-probe.c b/gdb/dtrace-probe.c
index 491d853..ff7ce7d 100644
--- a/gdb/dtrace-probe.c
+++ b/gdb/dtrace-probe.c
@@ -427,8 +427,18 @@ dtrace_process_dof_probe (struct objfile *objfile,
 	     this does not work then we set the type to `long
 	     int'.  */
           arg.type = builtin_type (gdbarch)->builtin_long;
-	  expr = parse_expression (arg.type_str);
-	  if (expr->elts[0].opcode == OP_TYPE)
+
+	  TRY
+	    {
+	      expr = parse_expression_with_language (arg.type_str, language_c);
+	    }
+	  CATCH (ex, RETURN_MASK_ERROR)
+	    {
+	      expr = NULL;
+	    }
+	  END_CATCH
+
+	  if (expr != NULL && expr->elts[0].opcode == OP_TYPE)
 	    arg.type = expr->elts[1].type;
 
 	  VEC_safe_push (dtrace_probe_arg_s, ret->args, &arg);
diff --git a/gdb/expression.h b/gdb/expression.h
index 15ed354..6af8331 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -97,6 +97,9 @@ struct expression
 
 extern struct expression *parse_expression (const char *);
 
+extern struct expression *parse_expression_with_language (const char *string,
+							  enum language lang);
+
 extern struct type *parse_expression_for_completion (const char *, char **,
 						     enum type_code *);
 
diff --git a/gdb/parse.c b/gdb/parse.c
index ec23dbb..6b59c4f 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -1268,6 +1268,28 @@ parse_expression (const char *string)
   return exp;
 }
 
+/* Same as parse_expression, but using the given language (LANG)
+   to parse the expression.  */
+
+struct expression *
+parse_expression_with_language (const char *string, enum language lang)
+{
+  struct cleanup *old_chain = NULL;
+  struct expression *expr;
+
+  if (current_language->la_language != lang)
+    {
+      old_chain = make_cleanup_restore_current_language ();
+      set_language (lang);
+    }
+
+  expr = parse_expression (string);
+
+  if (old_chain != NULL)
+    do_cleanups (old_chain);
+  return expr;
+}
+
 /* Parse STRING as an expression.  If parsing ends in the middle of a
    field reference, return the type of the left-hand-side of the
    reference; furthermore, if the parsing ends in the field name,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]