From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id zHFoKHN28V+8eQAAWB0awg (envelope-from ) for ; Sun, 03 Jan 2021 02:46:59 -0500 Received: by simark.ca (Postfix, from userid 112) id 9A3E61F0AA; Sun, 3 Jan 2021 02:46:59 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=MAILING_LIST_MULTI,RDNS_NONE, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 198BF1E965 for ; Sun, 3 Jan 2021 02:46:59 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 93DA13857004; Sun, 3 Jan 2021 07:46:58 +0000 (GMT) Received: from rock.gnat.com (rock.gnat.com [IPv6:2620:20:4000:0:a9e:1ff:fe9b:1d1]) by sourceware.org (Postfix) with ESMTP id 0F43B3857004 for ; Sun, 3 Jan 2021 07:46:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0F43B3857004 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=brobecker@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id C68D1117214; Sun, 3 Jan 2021 02:46:54 -0500 (EST) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id LMX1agVxJL4k; Sun, 3 Jan 2021 02:46:54 -0500 (EST) Received: from float.home (localhost.localdomain [127.0.0.1]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPS id 66B31117203; Sun, 3 Jan 2021 02:46:54 -0500 (EST) Received: by float.home (Postfix, from userid 1000) id 8192DA1608; Sun, 3 Jan 2021 11:46:49 +0400 (+04) Date: Sun, 3 Jan 2021 11:46:49 +0400 From: Joel Brobecker To: Tom Tromey Subject: Re: [PATCH 151/203] Split out some Ada type resolution code Message-ID: <20210103074649.GB363503@adacore.com> References: <20210101214723.1784144-1-tom@tromey.com> <20210101214723.1784144-152-tom@tromey.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210101214723.1784144-152-tom@tromey.com> X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gdb-patches@sourceware.org Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Hi Tom, On Fri, Jan 01, 2021 at 02:46:31PM -0700, Tom Tromey wrote: > This splits some Ada type resolution code out of resolve_subexp into > new functions that can be reused. > > gdb/ChangeLog > 2021-01-01 Tom Tromey > > * ada-lang.h (ada_find_operator_symbol, ada_resolve_funcall) > (ada_resolve_variable): Declare. > * ada-lang.c (ada_find_operator_symbol, ada_resolve_funcall) > (ada_resolve_variable): New functions. > (resolve_subexp): Update. Could this patch go in early, and independently of this patch series (or perhaps right after the first third of the patches splitting the various eval routines go in)? As far as I can tell, all it needs is documentation of the new routines in ada-lang.h. Other than that, this patch looks like a nice little improvement of the code's organization. Thanks! > --- > gdb/ChangeLog | 8 ++ > gdb/ada-lang.c | 266 ++++++++++++++++++++++++++++--------------------- > gdb/ada-lang.h | 18 ++++ > 3 files changed, 176 insertions(+), 116 deletions(-) > > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c > index e2c9de69b65..50b82e6bcf9 100644 > --- a/gdb/ada-lang.c > +++ b/gdb/ada-lang.c > @@ -3452,6 +3452,132 @@ See set/show multiple-symbol.")); > return n_chosen; > } > > +/* See ada-lang.h. */ > + > +block_symbol > +ada_find_operator_symbol (enum exp_opcode op, int parse_completion, > + int nargs, value *argvec[]) > +{ > + if (possible_user_operator_p (op, argvec)) > + { > + std::vector candidates; > + int n_candidates = ada_lookup_symbol_list (ada_decoded_op_name (op), > + NULL, VAR_DOMAIN, > + &candidates); > + int i = ada_resolve_function (candidates.data (), n_candidates, argvec, > + nargs, ada_decoded_op_name (op), NULL, > + parse_completion); > + if (i >= 0) > + return candidates[i]; > + } > + return {}; > +} > + > +/* See ada-lang.h. */ > + > +block_symbol > +ada_resolve_funcall (struct symbol *sym, const struct block *block, > + struct type *context_type, > + int parse_completion, > + int nargs, value *argvec[], > + innermost_block_tracker *tracker) > +{ > + std::vector candidates; > + int n_candidates = ada_lookup_symbol_list (sym->linkage_name (), block, > + VAR_DOMAIN, &candidates); > + > + int i; > + if (n_candidates == 1) > + i = 0; > + else > + { > + i = ada_resolve_function (candidates.data (), n_candidates, > + argvec, nargs, > + sym->linkage_name (), > + context_type, parse_completion); > + if (i < 0) > + error (_("Could not find a match for %s"), sym->print_name ()); > + } > + > + tracker->update (candidates[i]); > + return candidates[i]; > +} > + > +/* See ada-lang.h. */ > + > +block_symbol > +ada_resolve_variable (struct symbol *sym, const struct block *block, > + struct type *context_type, > + int parse_completion, > + int deprocedure_p, > + innermost_block_tracker *tracker) > +{ > + std::vector candidates; > + int n_candidates = ada_lookup_symbol_list (sym->linkage_name (), > + block, VAR_DOMAIN, > + &candidates); > + > + if (n_candidates > 1) > + { > + /* Types tend to get re-introduced locally, so if there are any > + local symbols that are not types, first filter out all > + types. */ > + int j; > + for (j = 0; j < n_candidates; j += 1) > + switch (SYMBOL_CLASS (candidates[j].symbol)) > + { > + case LOC_REGISTER: > + case LOC_ARG: > + case LOC_REF_ARG: > + case LOC_REGPARM_ADDR: > + case LOC_LOCAL: > + case LOC_COMPUTED: > + goto FoundNonType; > + default: > + break; > + } > + FoundNonType: > + if (j < n_candidates) > + { > + j = 0; > + while (j < n_candidates) > + { > + if (SYMBOL_CLASS (candidates[j].symbol) == LOC_TYPEDEF) > + { > + candidates[j] = candidates[n_candidates - 1]; > + n_candidates -= 1; > + } > + else > + j += 1; > + } > + } > + } > + > + int i; > + if (n_candidates == 0) > + error (_("No definition found for %s"), sym->print_name ()); > + else if (n_candidates == 1) > + i = 0; > + else if (deprocedure_p > + && !is_nonfunction (candidates.data (), n_candidates)) > + { > + i = ada_resolve_function (candidates.data (), n_candidates, NULL, 0, > + sym->linkage_name (), > + context_type, parse_completion); > + if (i < 0) > + error (_("Could not find a match for %s"), sym->print_name ()); > + } > + else > + { > + printf_filtered (_("Multiple matches for %s\n"), sym->print_name ()); > + user_select_syms (candidates.data (), n_candidates, 1); > + i = 0; > + } > + > + tracker->update (candidates[i]); > + return candidates[i]; > +} > + > /* Resolve the operator of the subexpression beginning at > position *POS of *EXPP. "Resolving" consists of replacing > the symbols that have undefined namespaces in OP_VAR_VALUE nodes > @@ -3640,77 +3766,13 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p, > case OP_VAR_VALUE: > if (SYMBOL_DOMAIN (exp->elts[pc + 2].symbol) == UNDEF_DOMAIN) > { > - std::vector candidates; > - int n_candidates; > - > - n_candidates = > - ada_lookup_symbol_list (exp->elts[pc + 2].symbol->linkage_name (), > - exp->elts[pc + 1].block, VAR_DOMAIN, > - &candidates); > - > - if (n_candidates > 1) > - { > - /* Types tend to get re-introduced locally, so if there > - are any local symbols that are not types, first filter > - out all types. */ > - int j; > - for (j = 0; j < n_candidates; j += 1) > - switch (SYMBOL_CLASS (candidates[j].symbol)) > - { > - case LOC_REGISTER: > - case LOC_ARG: > - case LOC_REF_ARG: > - case LOC_REGPARM_ADDR: > - case LOC_LOCAL: > - case LOC_COMPUTED: > - goto FoundNonType; > - default: > - break; > - } > - FoundNonType: > - if (j < n_candidates) > - { > - j = 0; > - while (j < n_candidates) > - { > - if (SYMBOL_CLASS (candidates[j].symbol) == LOC_TYPEDEF) > - { > - candidates[j] = candidates[n_candidates - 1]; > - n_candidates -= 1; > - } > - else > - j += 1; > - } > - } > - } > - > - if (n_candidates == 0) > - error (_("No definition found for %s"), > - exp->elts[pc + 2].symbol->print_name ()); > - else if (n_candidates == 1) > - i = 0; > - else if (deprocedure_p > - && !is_nonfunction (candidates.data (), n_candidates)) > - { > - i = ada_resolve_function > - (candidates.data (), n_candidates, NULL, 0, > - exp->elts[pc + 2].symbol->linkage_name (), > - context_type, parse_completion); > - if (i < 0) > - error (_("Could not find a match for %s"), > - exp->elts[pc + 2].symbol->print_name ()); > - } > - else > - { > - printf_filtered (_("Multiple matches for %s\n"), > - exp->elts[pc + 2].symbol->print_name ()); > - user_select_syms (candidates.data (), n_candidates, 1); > - i = 0; > - } > - > - exp->elts[pc + 1].block = candidates[i].block; > - exp->elts[pc + 2].symbol = candidates[i].symbol; > - tracker->update (candidates[i]); > + block_symbol resolved > + = ada_resolve_variable (exp->elts[pc + 2].symbol, > + exp->elts[pc + 1].block, > + context_type, parse_completion, > + deprocedure_p, tracker); > + exp->elts[pc + 1].block = resolved.block; > + exp->elts[pc + 2].symbol = resolved.symbol; > } > > if (deprocedure_p > @@ -3729,31 +3791,14 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p, > if (exp->elts[pc + 3].opcode == OP_VAR_VALUE > && SYMBOL_DOMAIN (exp->elts[pc + 5].symbol) == UNDEF_DOMAIN) > { > - std::vector candidates; > - int n_candidates; > - > - n_candidates = > - ada_lookup_symbol_list (exp->elts[pc + 5].symbol->linkage_name (), > - exp->elts[pc + 4].block, VAR_DOMAIN, > - &candidates); > - > - if (n_candidates == 1) > - i = 0; > - else > - { > - i = ada_resolve_function > - (candidates.data (), n_candidates, > - argvec, nargs, > - exp->elts[pc + 5].symbol->linkage_name (), > - context_type, parse_completion); > - if (i < 0) > - error (_("Could not find a match for %s"), > - exp->elts[pc + 5].symbol->print_name ()); > - } > - > - exp->elts[pc + 4].block = candidates[i].block; > - exp->elts[pc + 5].symbol = candidates[i].symbol; > - tracker->update (candidates[i]); > + block_symbol resolved > + = ada_resolve_funcall (exp->elts[pc + 5].symbol, > + exp->elts[pc + 4].block, > + context_type, parse_completion, > + nargs, argvec, > + tracker); > + exp->elts[pc + 4].block = resolved.block; > + exp->elts[pc + 5].symbol = resolved.symbol; > } > } > break; > @@ -3778,27 +3823,16 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p, > case UNOP_PLUS: > case UNOP_LOGICAL_NOT: > case UNOP_ABS: > - if (possible_user_operator_p (op, argvec)) > - { > - std::vector candidates; > - int n_candidates; > - > - n_candidates = > - ada_lookup_symbol_list (ada_decoded_op_name (op), > - NULL, VAR_DOMAIN, > - &candidates); > - > - i = ada_resolve_function (candidates.data (), n_candidates, argvec, > - nargs, ada_decoded_op_name (op), NULL, > - parse_completion); > - if (i < 0) > - break; > + { > + block_symbol found = ada_find_operator_symbol (op, parse_completion, > + nargs, argvec); > + if (found.symbol == nullptr) > + break; > > - replace_operator_with_call (expp, pc, nargs, 1, > - candidates[i].symbol, > - candidates[i].block); > - exp = expp->get (); > - } > + replace_operator_with_call (expp, pc, nargs, 1, > + found.symbol, found.block); > + exp = expp->get (); > + } > break; > > case OP_TYPE: > diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h > index dbf45a84928..8333def6280 100644 > --- a/gdb/ada-lang.h > +++ b/gdb/ada-lang.h > @@ -386,4 +386,22 @@ extern void print_ada_task_info (struct ui_out *uiout, > const char *taskno_str, > struct inferior *inf); > > +extern block_symbol ada_find_operator_symbol (enum exp_opcode op, > + int parse_completion, > + int nargs, value *argvec[]); > + > +extern block_symbol ada_resolve_funcall (struct symbol *sym, > + const struct block *block, > + struct type *context_type, > + int parse_completion, > + int nargs, value *argvec[], > + innermost_block_tracker *tracker); > + > +extern block_symbol ada_resolve_variable (struct symbol *sym, > + const struct block *block, > + struct type *context_type, > + int parse_completion, > + int deprocedure_p, > + innermost_block_tracker *tracker); > + > #endif > -- > 2.26.2 -- Joel