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]

[PATCH]: Allow struct compare in expressions.



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.

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]