This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: RFA: Patch for SIGSEGV in evaluate_subexp_standard
- From: Fred Fish <fnf at gofish dot ninemoons dot com>
- To: jimb at cygnus dot com (Jim Blandy)
- Cc: fnf at redhat dot com, gdb-patches at sources dot redhat dot com
- Date: Mon, 10 Dec 2001 15:54:25 -0700 (MST)
- Subject: Re: RFA: Patch for SIGSEGV in evaluate_subexp_standard
- Reply-to: fnf at redhat dot com
> 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 */