From patchwork Thu May 4 14:21:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 68759 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A45F23851C31 for ; Thu, 4 May 2023 14:22:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A45F23851C31 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1683210169; bh=ZnLdxFXgcGMw1E6EAurgrwBsIdMWjK33duTnh8fJrh8=; h=Date:Subject:References:In-Reply-To:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=QDqOJixFXtSuNwO6j1koeIe0o+OHsxxVnDbz+hj6TJ1LoEgZ5tGG2RCm/o2yVT7Q4 epeNxVS2KLLBwDmPmzHoOxAWDdq6Bn0mIWI4Vi6dfPhUdVjUnN8p48f44ZQ1cDQSjH NqVY8APUzaMT4os3u9TswEvja12M5fnrAnhLubKM= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-il1-x129.google.com (mail-il1-x129.google.com [IPv6:2607:f8b0:4864:20::129]) by sourceware.org (Postfix) with ESMTPS id B07C33858C78 for ; Thu, 4 May 2023 14:21:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B07C33858C78 Received: by mail-il1-x129.google.com with SMTP id e9e14a558f8ab-33187944bc9so1133885ab.0 for ; Thu, 04 May 2023 07:21:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683210086; x=1685802086; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZnLdxFXgcGMw1E6EAurgrwBsIdMWjK33duTnh8fJrh8=; b=E5CFbVnGFDwB7Qz9v/31PgIkER/ixgxy0CRfOTsOcNorwrpRodTRoZxysvGUnBVfXs SkE2UokeObjcS43YQrWD/x4UqW5q8pnRwjlp/BG6GCLFnmvVdeLRtTWyO8iGFvlsIlku MVRmyOtU1/z29xnoQUudS+hzPPJl0SEzLf8xSMIm+1xTfmBbENxlXJ8ZfcUCZV5FN9dd DXkfMpYBhrEElPwkUkpx/OGj83Kj/4zyUiaOOFOHU1BYPd7zTc3VwUdkyHQDt1hVOUqJ MAQRSusrl2rxIytlpsaLnLQ4k1decNQpHyZ6g8yGvVeooD0Lsx8rksr+EWg2B2qSalwi ynxw== X-Gm-Message-State: AC+VfDyLBcKBmejS2NctR0W3epro4h42br2nJ5hEI0e7UfKPsAUEaHOn 9Ww87XyhpDsbyByTRx0Pe4F7ZIOAoJKq3QikmkQmHQ== X-Google-Smtp-Source: ACHHUZ6VGoO76nNernr89xJCVtRcafLataaUZfBcvX1xI5CCJHxtc98UpHX4CqfzqioGEJLG6kTOCw== X-Received: by 2002:a92:280d:0:b0:317:3f4:c06c with SMTP id l13-20020a92280d000000b0031703f4c06cmr2342ilf.20.1683210085921; Thu, 04 May 2023 07:21:25 -0700 (PDT) Received: from localhost.localdomain (71-211-191-82.hlrn.qwest.net. [71.211.191.82]) by smtp.gmail.com with ESMTPSA id r16-20020a6b4410000000b00760a07e4e09sm9983384ioa.5.2023.05.04.07.21.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 May 2023 07:21:25 -0700 (PDT) Date: Thu, 04 May 2023 08:21:24 -0600 Subject: [PATCH 03/11] Introduce and use parser flags MIME-Version: 1.0 Message-Id: <20230504-frameless-v1-3-4191201740b0@adacore.com> References: <20230504-frameless-v1-0-4191201740b0@adacore.com> In-Reply-To: <20230504-frameless-v1-0-4191201740b0@adacore.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.2 X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org 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: , X-Patchwork-Original-From: Tom Tromey via Gdb-patches From: Tom Tromey Reply-To: Tom Tromey Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" This patch adds a new parser_flags type and changes the parser APIs to use it rather than a collection of 'int' and 'bool'. More flags will be added in subsquent patches. --- gdb/ax-gdb.c | 3 ++- gdb/breakpoint.c | 3 ++- gdb/eval.c | 3 ++- gdb/expression.h | 21 +++++++++++++++++++-- gdb/parse.c | 29 +++++++++++++---------------- gdb/printcmd.c | 5 ++++- gdb/tracepoint.c | 10 ++++++---- 7 files changed, 48 insertions(+), 26 deletions(-) diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 528f45e19eb..927dfc6337e 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -2615,7 +2615,8 @@ maint_agent_printf_command (const char *cmdrest, int from_tty) const char *cmd1; cmd1 = cmdrest; - expression_up expr = parse_exp_1 (&cmd1, 0, (struct block *) 0, 1); + expression_up expr = parse_exp_1 (&cmd1, 0, (struct block *) 0, + PARSER_COMMA_TERMINATES); argvec.push_back (expr.release ()); cmdrest = cmd1; if (*cmdrest == ',') diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 30d438d06df..de3a7e9ef9c 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2526,7 +2526,8 @@ parse_cmd_to_aexpr (CORE_ADDR scope, char *cmd) const char *cmd1; cmd1 = cmdrest; - expression_up expr = parse_exp_1 (&cmd1, scope, block_for_pc (scope), 1); + expression_up expr = parse_exp_1 (&cmd1, scope, block_for_pc (scope), + PARSER_COMMA_TERMINATES); argvec.push_back (expr.release ()); cmdrest = cmd1; if (*cmdrest == ',') diff --git a/gdb/eval.c b/gdb/eval.c index 9d5ca0b47de..d8d53c28686 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -81,7 +81,8 @@ parse_and_eval (const char *exp) struct value * parse_to_comma_and_eval (const char **expp) { - expression_up expr = parse_exp_1 (expp, 0, nullptr, 1); + expression_up expr = parse_exp_1 (expp, 0, nullptr, + PARSER_COMMA_TERMINATES); return expr->evaluate (); } diff --git a/gdb/expression.h b/gdb/expression.h index 8d351b30a3a..2e2d2a090f9 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -283,11 +283,27 @@ class innermost_block_tracker const struct block *m_innermost_block; }; +/* Flags that can affect the parsers. */ + +enum parser_flag +{ + /* This flag is set if the expression is being evaluated in a + context where a 'void' result type is expected. Parsers are free + to ignore this, or to use it to help with overload resolution + decisions. */ + PARSER_VOID_CONTEXT = (1 << 0), + + /* This flag is set if a top-level comma terminates the + expression. */ + PARSER_COMMA_TERMINATES = (1 << 1), +}; +DEF_ENUM_FLAGS_TYPE (enum parser_flag, parser_flags); + /* From parse.c */ extern expression_up parse_expression (const char *, innermost_block_tracker * = nullptr, - bool void_context_p = false); + parser_flags flags = 0); extern expression_up parse_expression_with_language (const char *string, enum language lang); @@ -314,7 +330,8 @@ extern expression_up parse_expression_for_completion (const char *, std::unique_ptr *completer); extern expression_up parse_exp_1 (const char **, CORE_ADDR pc, - const struct block *, int, + const struct block *, + parser_flags flags, innermost_block_tracker * = nullptr); /* From eval.c */ diff --git a/gdb/parse.c b/gdb/parse.c index e4678e9c6e8..ed0d0b8a880 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -328,7 +328,7 @@ copy_name (struct stoken token) static expression_up parse_exp_in_context (const char **stringptr, CORE_ADDR pc, const struct block *block, - int comma, bool void_context_p, + parser_flags flags, innermost_block_tracker *tracker, std::unique_ptr *completer) { @@ -398,8 +398,11 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, to the value matching SELECTED_FRAME as set by get_current_arch. */ parser_state ps (lang, get_current_arch (), expression_context_block, - expression_context_pc, comma, *stringptr, - completer != nullptr, tracker, void_context_p); + expression_context_pc, + (flags & PARSER_COMMA_TERMINATES) != 0, + *stringptr, + completer != nullptr, tracker, + (flags & PARSER_VOID_CONTEXT) != 0); scoped_restore_current_language lang_saver; set_language (lang->la_language); @@ -435,31 +438,25 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, if BLOCK is zero, use the block of the selected stack frame. Meanwhile, advance *STRINGPTR to point after the expression, at the first nonwhite character that is not part of the expression - (possibly a null character). - - If COMMA is nonzero, stop if a comma is reached. */ + (possibly a null character). FLAGS are passed to the parser. */ expression_up parse_exp_1 (const char **stringptr, CORE_ADDR pc, const struct block *block, - int comma, innermost_block_tracker *tracker) + parser_flags flags, innermost_block_tracker *tracker) { - return parse_exp_in_context (stringptr, pc, block, comma, false, + return parse_exp_in_context (stringptr, pc, block, flags, tracker, nullptr); } /* Parse STRING as an expression, and complain if this fails to use up all of the contents of STRING. TRACKER, if non-null, will be - updated by the parser. VOID_CONTEXT_P should be true to indicate - that the expression may be expected to return a value with void - type. Parsers are free to ignore this, or to use it to help with - overload resolution decisions. */ + updated by the parser. FLAGS are passed to the parser. */ expression_up parse_expression (const char *string, innermost_block_tracker *tracker, - bool void_context_p) + parser_flags flags) { - expression_up exp = parse_exp_in_context (&string, 0, nullptr, 0, - void_context_p, + expression_up exp = parse_exp_in_context (&string, 0, nullptr, flags, tracker, nullptr); if (*string) error (_("Junk after end of expression.")); @@ -495,7 +492,7 @@ parse_expression_for_completion try { - exp = parse_exp_in_context (&string, 0, 0, 0, false, nullptr, completer); + exp = parse_exp_in_context (&string, 0, 0, 0, nullptr, completer); } catch (const gdb_exception_error &except) { diff --git a/gdb/printcmd.c b/gdb/printcmd.c index e903bf48fa5..e04a9c28739 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1315,7 +1315,10 @@ process_print_command_args (const char *args, value_print_options *print_opts, /* VOIDPRINT is true to indicate that we do want to print a void value, so invert it for parse_expression. */ - expression_up expr = parse_expression (exp, nullptr, !voidprint); + parser_flags flags = 0; + if (!voidprint) + flags = PARSER_VOID_CONTEXT; + expression_up expr = parse_expression (exp, nullptr, flags); return expr->evaluate (); } diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index ffda4a6439e..9e5ced1893e 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -680,7 +680,8 @@ validate_actionline (const char *line, struct breakpoint *b) { p = tmp_p; expression_up exp = parse_exp_1 (&p, loc->address, - block_for_pc (loc->address), 1); + block_for_pc (loc->address), + PARSER_COMMA_TERMINATES); if (exp->first_opcode () == OP_VAR_VALUE) { @@ -732,7 +733,8 @@ validate_actionline (const char *line, struct breakpoint *b) /* Only expressions are allowed for this action. */ expression_up exp = parse_exp_1 (&p, loc->address, - block_for_pc (loc->address), 1); + block_for_pc (loc->address), + PARSER_COMMA_TERMINATES); /* We have something to evaluate, make sure that the expr to bytecode translator can handle it and that it's not too @@ -1349,7 +1351,7 @@ encode_actions_1 (struct command_line *action, const char *exp_start = action_exp; expression_up exp = parse_exp_1 (&action_exp, tloc->address, block_for_pc (tloc->address), - 1); + PARSER_COMMA_TERMINATES); switch (exp->first_opcode ()) { @@ -1439,7 +1441,7 @@ encode_actions_1 (struct command_line *action, { expression_up exp = parse_exp_1 (&action_exp, tloc->address, block_for_pc (tloc->address), - 1); + PARSER_COMMA_TERMINATES); agent_expr_up aexpr = gen_eval_for_expr (tloc->address, exp.get ());