This is the mail archive of the gdb-patches@sources.redhat.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]

[RFA] Better parsing of const/volatile types


These changes greatly increase GDB's ability to parse type expressions
containg 'const' and/or 'volatile'.  For instance, we can now parse the
expression (const int * volatile * const *) foo.

I'm working on a new test script, which I'll submit separately.

Michael
Index: parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.15
diff -c -3 -p -r1.15 parse.c
*** parse.c	2001/08/01 18:39:23	1.15
--- parse.c	2001/09/21 01:41:31
*************** struct type *
*** 1255,1260 ****
--- 1256,1263 ----
  follow_types (struct type *follow_type)
  {
    int done = 0;
+   int make_const = 0;
+   int make_volatile = 0;
    int array_size;
    struct type *range_type;
  
*************** follow_types (struct type *follow_type)
*** 1263,1274 ****
--- 1266,1305 ----
        {
        case tp_end:
  	done = 1;
+ 	if (make_const)
+ 	  follow_type = make_cv_type (make_const, 
+ 				      TYPE_VOLATILE (follow_type), 
+ 				      follow_type, 0);
+ 	if (make_volatile)
+ 	  follow_type = make_cv_type (TYPE_CONST (follow_type), 
+ 				      make_volatile, 
+ 				      follow_type, 0);
  	break;
+       case tp_const:
+ 	make_const = 1;
+ 	break;
+       case tp_volatile:
+ 	make_volatile = 1;
+ 	break;
        case tp_pointer:
  	follow_type = lookup_pointer_type (follow_type);
+ 	if (make_const)
+ 	  follow_type = make_cv_type (make_const, 
+ 				      TYPE_VOLATILE (follow_type), 
+ 				      follow_type, 0);
+ 	if (make_volatile)
+ 	  follow_type = make_cv_type (TYPE_CONST (follow_type), 
+ 				      make_volatile, 
+ 				      follow_type, 0);
+ 	make_const = make_volatile = 0;
  	break;
        case tp_reference:
  	follow_type = lookup_reference_type (follow_type);
+ 	if (make_const)
+ 	  follow_type = make_cv_type (make_const, TYPE_VOLATILE (follow_type), follow_type, 0);
+ 	if (make_volatile)
+ 	  follow_type = make_cv_type (TYPE_CONST (follow_type), make_volatile, follow_type, 0);
+ 	make_const = make_volatile = 0;
  	break;
        case tp_array:
  	array_size = pop_type_int ();
2001-09-20  Michael Snyder  <msnyder@redhat.com>
	Changes by Daniel Berlin  <dan@cgsoftware.com>, to support
	better parsing of const and volatile type expressions.
	* c-exp.y (const_and_volatile, const_or_volatile_noopt, 
	const_or_volatile): New non-terminals.
	(ptype): Use new rule for const_or_volatile.
	(typebase): Use new rule for const_or_volatile_noopt.
	* parser-defs.h (enum type_pieces): New values tp_const, tp_volatile.
	* parse.c (follow_types): Handle tp_const and tp_volatile on the
	type stack: call make_cv_type to create new const/volatile type.

Index: parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.4
diff -c -3 -p -r1.4 parser-defs.h
*** parser-defs.h	2001/08/01 18:39:23	1.4
--- parser-defs.h	2001/09/21 01:41:31
*************** struct symtoken
*** 84,90 ****
     An array should be preceded in the list by the size of the array.  */
  enum type_pieces
    {
!     tp_end = -1, tp_pointer, tp_reference, tp_array, tp_function
    };
  /* The stack can contain either an enum type_pieces or an int.  */
  union type_stack_elt
--- 84,96 ----
     An array should be preceded in the list by the size of the array.  */
  enum type_pieces
    {
!     tp_end = -1, 
!     tp_pointer, 
!     tp_reference, 
!     tp_array, 
!     tp_function, 
!     tp_const, 
!     tp_volatile
    };
  /* The stack can contain either an enum type_pieces or an int.  */
  union type_stack_elt
Index: c-exp.y
===================================================================
RCS file: /cvs/src/src/gdb/c-exp.y,v
retrieving revision 1.4
diff -c -3 -p -r1.4 c-exp.y
*** c-exp.y	2001/03/06 08:21:06	1.4
--- c-exp.y	2001/09/21 01:41:31
*************** variable:	name_not_typename
*** 720,740 ****
  
  
  ptype	:	typebase
! 	/* "const" and "volatile" are curently ignored.  A type qualifier
! 	   before the type is currently handled in the typebase rule.
! 	   The reason for recognizing these here (shift/reduce conflicts)
! 	   might be obsolete now that some pointer to member rules have
! 	   been deleted.  */
! 	|	typebase CONST_KEYWORD
! 	|	typebase VOLATILE_KEYWORD
! 	|	typebase abs_decl
  		{ $$ = follow_types ($1); }
- 	|	typebase CONST_KEYWORD abs_decl
- 		{ $$ = follow_types ($1); }
- 	|	typebase VOLATILE_KEYWORD abs_decl
- 		{ $$ = follow_types ($1); }
  	;
! 
  abs_decl:	'*'
  			{ push_type (tp_pointer); $$ = 0; }
  	|	'*' abs_decl
--- 720,741 ----
  
  
  ptype	:	typebase
! 	|	ptype const_or_volatile abs_decl const_or_volatile
  		{ $$ = follow_types ($1); }
  	;
! const_and_volatile: 	CONST_KEYWORD VOLATILE_KEYWORD
! 	| 		VOLATILE_KEYWORD CONST_KEYWORD
! 	;
! const_or_volatile_noopt:  	const_and_volatile 
! 			{ push_type (tp_const); push_type (tp_volatile);}
! 	| 		CONST_KEYWORD
! 			{ push_type (tp_const);}
! 	| 		VOLATILE_KEYWORD
! 			{ push_type (tp_volatile); }
! 	;
! const_or_volatile: const_or_volatile_noopt
! 	| 
! 	;
  abs_decl:	'*'
  			{ push_type (tp_pointer); $$ = 0; }
  	|	'*' abs_decl
*************** typebase  /* Implements (approximately):
*** 847,857 ****
  			{ $$ = lookup_template_type(copy_name($2), $4,
  						    expression_context_block);
  			}
! 	/* "const" and "volatile" are curently ignored.  A type qualifier
! 	   after the type is handled in the ptype rule.  I think these could
! 	   be too.  */
! 	|	CONST_KEYWORD typebase { $$ = $2; }
! 	|	VOLATILE_KEYWORD typebase { $$ = $2; }
  	;
  
  typename:	TYPENAME
--- 848,855 ----
  			{ $$ = lookup_template_type(copy_name($2), $4,
  						    expression_context_block);
  			}
! 	| const_or_volatile_noopt typebase { $$ = follow_types ($2); }
! 	| typebase const_or_volatile_noopt { $$ = follow_types ($1); }
  	;
  
  typename:	TYPENAME

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