Bug 18285 - ptype expr-with-xmethod -> SEGV
Summary: ptype expr-with-xmethod -> SEGV
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: exp (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-04-20 22:04 UTC by dje
Modified: 2015-05-12 17:28 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description dje 2015-04-20 22:04:24 UTC
gdb unique-ptr
(gdb) start
(gdb) pt *foo # foo is a std::unique_ptr<> object
-> segv

The problem, I think, is in value_x_unop:

      if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
          struct type *return_type;

          return_type
            = TYPE_TARGET_TYPE (check_typedef (value_type (argvec[0])));
=>        return value_zero (return_type, VALUE_LVAL (arg1));
        }
      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_XMETHOD)
        {
          /* Static xmethods are not supported yet.  */
          gdb_assert (static_memfuncp == 0);
          return call_xmethod (argvec[0], 1, argvec + 1);
        }
      else
        return call_function_by_hand (argvec[0], nargs, argvec + 1);

(top-gdb) p argvec[0]->type->main_type->code
$6 = TYPE_CODE_XMETHOD
xmethods don't have TYPE_TARGET_TYPE, it's NULL.

The user would want the result of the ptype command to be the type of the result of the xmethod, not the type of the xmethod.
Check for xmethods before EVAL_AVOID_SIDE_EFFECTS?
OTOH, the xmethod may well have side effects.
Propagate EVAL_AVOID_SIDE_EFFECTS into the xmethod?
Comment 1 Siva Chandra 2015-04-20 22:21:02 UTC
Could we extend the xmethod API to add a method XMethodWorker.return_type() and use the returned gdb.Type object to evaluate TYPE_TARGET_TYPE of an xmethod value?
Comment 2 dje 2015-04-20 23:23:54 UTC
A return_type method sounds good to me.
Comment 3 Sourceware Commits 2015-04-29 20:25:52 UTC
The master branch has been updated by Doug Evans <devans@sourceware.org>:

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

commit 2ce1cdbf84ce883b992bc8ffec3d29b4da229b72
Author: Doug Evans <dje@google.com>
Date:   Wed Apr 29 13:24:21 2015 -0700

    PR python/18285
    
    gdb/ChangeLog:
    
    	PR python/18285
    	* NEWS: Document new gdb.XMethodWorker.get_result_type method.
    	* eval.c (evaluate_subexp_standard) <OP_FUNCALL>: Handle
    	EVAL_AVOID_SIDE_EFFECTS for xmethods.
    	* extension-priv.h (struct extension_language_ops)
    	<get_xmethod_result_type>: New member.
    	* extension.c (get_xmethod_result_type): New function.
    	* extension.h (get_xmethod_result_type): Declare.
    	* python/py-xmethods.c (get_result_type_method_name): New static
    	global.
    	(py_get_result_type_method_name): Ditto.
    	(gdbpy_get_xmethod_result_type): New function.
    	(gdbpy_initialize_xmethods): Initialize py_get_result_type_method_name.
    	* python/python-internal.h (gdbpy_get_xmethod_result_type): Declare.
    	* python/python.c (python_extension_ops): Add
    	gdbpy_get_xmethod_result_type.
    	* python/lib/gdb/xmethod.py (XMethodWorker): Add get_result_type.
    	* valarith.c (value_x_binop): Handle EVAL_AVOID_SIDE_EFFECTS for
    	xmethods.
    	(value_x_unop): Ditto.
    	* value.c (result_type_of_xmethod): New function.
    	* value.h (result_type_of_xmethod): Declare.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.python/py-xmethods.exp: Add ptype tests.
    	* gdb.python/py-xmethods.py (E_method_char_worker): Add
    	get_result_type method.
    
    gdb/doc/ChangeLog:
    
    	* python.texi (Xmethod API) <gdb.XMethodWorker.get_result_type>:
    	Document.
    	(Writing an Xmethod): Add get_result_type to example.
Comment 4 Sourceware Commits 2015-05-12 16:19:59 UTC
The gdb-7.9-branch branch has been updated by Doug Evans <devans@sourceware.org>:

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

commit 6b2a76d583a91ae9dad0653c60c91b72f07ff941
Author: Doug Evans <dje@google.com>
Date:   Tue May 12 09:18:06 2015 -0700

    PR python/18285
    
    gdb/ChangeLog:
    
    	PR python/18285
    	* NEWS: Document new gdb.XMethodWorker.get_result_type method.
    	* eval.c (evaluate_subexp_standard) <OP_FUNCALL>: Handle
    	EVAL_AVOID_SIDE_EFFECTS for xmethods.
    	* extension-priv.h (struct extension_language_ops)
    	<get_xmethod_result_type>: New member.
    	* extension.c (get_xmethod_result_type): New function.
    	* extension.h (get_xmethod_result_type): Declare.
    	* python/py-xmethods.c (get_result_type_method_name): New static
    	global.
    	(py_get_result_type_method_name): Ditto.
    	(gdbpy_get_xmethod_result_type): New function.
    	(gdbpy_initialize_xmethods): Initialize py_get_result_type_method_name.
    	* python/python-internal.h (gdbpy_get_xmethod_result_type): Declare.
    	* python/python.c (python_extension_ops): Add
    	gdbpy_get_xmethod_result_type.
    	* python/lib/gdb/xmethod.py (XMethodWorker): Add get_result_type.
    	* valarith.c (value_x_binop): Handle EVAL_AVOID_SIDE_EFFECTS for
    	xmethods.
    	(value_x_unop): Ditto.
    	* value.c (result_type_of_xmethod): New function.
    	* value.h (result_type_of_xmethod): Declare.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.python/py-xmethods.exp: Add ptype tests.
    	* gdb.python/py-xmethods.py (E_method_char_worker): Add
    	get_result_type method.
    
    gdb/doc/ChangeLog:
    
    	* python.texi (Xmethod API) <gdb.XMethodWorker.get_result_type>:
    	Document.
    	(Writing an Xmethod): Add get_result_type to example.
Comment 5 dje 2015-05-12 17:28:53 UTC
patch committed.