This is the mail archive of the gdb-patches@sourceware.cygnus.com 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]

Re: [PATCH]: Allow struct compare in expressions.


    From: Michael Snyder <msnyder@cygnus.com>
    Date: Wed, 22 Mar 2000 12:43:56 -0800 (PST)

    The following change allows GDB to evaluate (and set watchpoints on)
    expressions of the form (a == b) and (a != b), where a and b are
    simple C structs or unions.  It would be possible to extend this
    further by allowing simple binary comparison for classes that don't
    have an operator== method: I leave that as an exercise for someone
    else.

    Jim Blandy, David Taylor, I think both of your approvals is required.

    2000-03-22  Michael Snyder  <msnyder@cleaver.cygnus.com>

	    * eval.c (evaluate_subexp_standard): allow for simple comparison
	    of structures, in the absense of C++ method symbols.
	    * symtab.c (total_number_of_methods): make public, for use above.
	    * symtab.h (total_number_of_methods): publish prototype.

Approved.

    Index: ChangeLog
    ===================================================================
    RCS file: /cvs/src/src/gdb/ChangeLog,v
    retrieving revision 1.163
    diff -c -r1.163 ChangeLog
    *** ChangeLog   2000/03/22 09:45:01     1.163
    --- ChangeLog   2000/03/22 20:38:33
    ***************
    *** 1,3 ****
    --- 1,10 ----
    + 2000-03-22  Michael Snyder  <msnyder@cleaver.cygnus.com>
    + 
    +       * eval.c (evaluate_subexp_standard): allow for simple comparison
    +       of structures, in the absense of C++ method symbols.
    +       * symtab.c (total_number_of_methods): make public, for use above.
    +       * symtab.h (total_number_of_methods): publish prototype.
    + 
      2000-03-22  Mark Kettenis  <kettenis@gnu.org>

	    * config/i386/tm-i386aix.h (I386_AIX_TARGET): Remove.
    Index: eval.c
    ===================================================================
    RCS file: /cvs/src/src/gdb/eval.c,v
    retrieving revision 1.2
    diff -c -r1.2 eval.c
    *** eval.c      2000/03/14 17:01:04     1.2
    --- eval.c      2000/03/22 20:38:34
    ***************
    *** 1448,1454 ****
	    arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
	    if (noside == EVAL_SKIP)
	    goto nosideret;
    !       if (binop_user_defined_p (op, arg1, arg2))
	    {
	      return value_x_binop (arg1, arg2, op, OP_NULL, noside);
	    }
    --- 1448,1459 ----
	    arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
	    if (noside == EVAL_SKIP)
	    goto nosideret;
    ! 
    !       /* NOTE: because BINOP_EQUAL is a legal operaton for 
    !        C structs (as opposed to C++ classes), revert to 
    !        simple value comparison if the type has no methods.  */
    !       if (binop_user_defined_p (op, arg1, arg2) &&
    !         total_number_of_methods (arg1->type) > 0)
	    {
	      return value_x_binop (arg1, arg2, op, OP_NULL, noside);
	    }
    ***************
    *** 1463,1469 ****
	    arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
	    if (noside == EVAL_SKIP)
	    goto nosideret;
    !       if (binop_user_defined_p (op, arg1, arg2))
	    {
	      return value_x_binop (arg1, arg2, op, OP_NULL, noside);
	    }
    --- 1468,1479 ----
	    arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
	    if (noside == EVAL_SKIP)
	    goto nosideret;
    ! 
    !       /* NOTE: because BINOP_NOTEQUAL is a legal operaton for 
    !        C structs (as opposed to C++ classes), revert to 
    !        simple value comparison if the type has no methods.  */
    !       if (binop_user_defined_p (op, arg1, arg2) &&
    !         total_number_of_methods (arg1->type) > 0)
	    {
	      return value_x_binop (arg1, arg2, op, OP_NULL, noside);
	    }
    Index: symtab.c
    ===================================================================
    RCS file: /cvs/src/src/gdb/symtab.c,v
    retrieving revision 1.2
    diff -c -r1.2 symtab.c
    *** symtab.c    2000/02/08 04:39:02     1.2
    --- symtab.c    2000/03/22 20:38:34
    ***************
    *** 2217,2225 ****
	 reader because the type of the baseclass might still be stubbed
	 when the definition of the derived class is parsed.  */

    ! static int total_number_of_methods PARAMS ((struct type * type));
    ! 
    ! static int
      total_number_of_methods (type)
	   struct type *type;
      {
    --- 2217,2223 ----
	 reader because the type of the baseclass might still be stubbed
	 when the definition of the derived class is parsed.  */

    ! int
      total_number_of_methods (type)
	   struct type *type;
      {
    Index: symtab.h
    ===================================================================
    RCS file: /cvs/src/src/gdb/symtab.h,v
    retrieving revision 1.4
    diff -c -r1.4 symtab.h
    *** symtab.h    2000/03/21 22:37:42     1.4
    --- symtab.h    2000/03/22 20:38:34
    ***************
    *** 1462,1467 ****
    --- 1462,1472 ----
      extern int
      in_prologue PARAMS ((CORE_ADDR pc, CORE_ADDR func_start));

    + /* Number of method symbols for TYPE
    +    (and all its base classes) */
    + extern int 
    + total_number_of_methods PARAMS ((struct type * type));
    + 
      extern struct symbol *
	fixup_symbol_section PARAMS ((struct symbol *, struct objfile *));


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