From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2247 invoked by alias); 11 Dec 2001 18:56:46 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 2220 invoked from network); 11 Dec 2001 18:56:44 -0000 Received: from unknown (HELO zwingli.cygnus.com) (208.245.165.35) by sources.redhat.com with SMTP; 11 Dec 2001 18:56:44 -0000 Received: by zwingli.cygnus.com (Postfix, from userid 442) id EEA4F5E9D8; Tue, 11 Dec 2001 13:58:02 -0500 (EST) To: fnf@redhat.com Cc: gdb-patches@sources.redhat.com Subject: Re: RFA: Patch for SIGSEGV in evaluate_subexp_standard References: <200112102254.fBAMsPw14998@gofish.ninemoons.com> From: Jim Blandy Date: Tue, 11 Dec 2001 10:56:00 -0000 In-Reply-To: Fred Fish's message of Mon, 10 Dec 2001 15:54:25 -0700 (MST) Message-ID: X-Mailer: Gnus v5.3/Emacs 19.34 X-SW-Source: 2001-12/txt/msg00307.txt.bz2 Okay, please commit this. Thanks! Fred Fish 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 > > * 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 */ > >