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]
Other format: [Raw text]

Re: RFA: Patch for SIGSEGV in evaluate_subexp_standard



Okay, please commit this.  Thanks!

Fred Fish <fnf@ns1.ninemoons.com> writes:
> > Approved, if you address Daniel's suggestion somehow.
> 
> OK, I've tweaked the call site to handle a NULL return, which is a
> normal result and tested for by other callers.  There was already a
> test present, it was just not in the right place and needed to be
> moved up a couple lines.  Here is the updated patch and ChangeLog
> entry.
> 
> -Fred
> 
> 2001-12-10  Fred Fish  <fnf@redhat.com>
>  
> 	* values.c (value_fn_field): Add physname variable.  Use a minimal
> 	symbol if we don't find a full symbol.  Remove setting of the new
> 	value's type since that was already done by allocate_value().
> 	Remove obsolete commented out error call since callees need to
> 	handle a NULL return, which is possible result not an error.
> 	* eval.c (evaluate_subexp_standard): Move check for inlined
> 	functions to precede attempt to dereference a NULL argvec[0].
> 
> Index: values.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/values.c,v
> retrieving revision 1.29
> diff -u -p -r1.29 values.c
> --- values.c	2001/11/30 17:47:51	1.29
> +++ values.c	2001/12/10 22:50:01
> @@ -954,28 +954,40 @@ value_field (register value_ptr arg1, re
>  
>  /* Return a non-virtual function as a value.
>     F is the list of member functions which contains the desired method.
> -   J is an index into F which provides the desired method. */
> +   J is an index into F which provides the desired method.
>  
> +   We only use the symbol for its address, so be happy with either a
> +   full symbol or a minimal symbol.
> + */
> +
>  value_ptr
>  value_fn_field (value_ptr *arg1p, struct fn_field *f, int j, struct type *type,
>  		int offset)
>  {
>    register value_ptr v;
>    register struct type *ftype = TYPE_FN_FIELD_TYPE (f, j);
> +  char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
>    struct symbol *sym;
> +  struct minimal_symbol *msym;
>  
> -  sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, j),
> -		       0, VAR_NAMESPACE, 0, NULL);
> +  sym = lookup_symbol (physname, 0, VAR_NAMESPACE, 0, NULL);
>    if (!sym)
> +    {
> +      msym = lookup_minimal_symbol (physname, NULL, NULL);
> +    }
> +
> +  if (!sym && !msym)
>      return NULL;
> -/*
> -   error ("Internal error: could not find physical method named %s",
> -   TYPE_FN_FIELD_PHYSNAME (f, j));
> - */
>  
>    v = allocate_value (ftype);
> -  VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
> -  VALUE_TYPE (v) = ftype;
> +  if (sym)
> +    {
> +      VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
> +    }
> +  else
> +    {
> +      VALUE_ADDRESS (v) = SYMBOL_VALUE_ADDRESS (msym);
> +    }
>  
>    if (arg1p)
>      {
> 
> Index: eval.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/eval.c,v
> retrieving revision 1.16
> diff -u -p -r1.16 eval.c
> --- eval.c	2001/11/12 21:20:18	1.16
> +++ eval.c	2001/12/10 22:49:57
> @@ -917,6 +917,8 @@ evaluate_subexp_standard (struct type *e
>  
>        if (noside == EVAL_SKIP)
>  	goto nosideret;
> +      if (argvec[0] == NULL)
> +	error ("Cannot evaluate function -- may be inlined");
>        if (noside == EVAL_AVOID_SIDE_EFFECTS)
>  	{
>  	  /* If the return type doesn't look like a function type, call an
> @@ -934,8 +936,6 @@ evaluate_subexp_standard (struct type *e
>  	  else
>  	    error ("Expression of type other than \"Function returning ...\" used as function");
>  	}
> -      if (argvec[0] == NULL)
> -	error ("Cannot evaluate function -- may be inlined");
>        return call_function_by_hand (argvec[0], nargs, argvec + 1);
>        /* pai: FIXME save value from call_function_by_hand, then adjust pc by adjust_fn_pc if +ve  */
>  
> 


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