From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id CNByKPWY71/aTQAAWB0awg (envelope-from ) for ; Fri, 01 Jan 2021 16:49:41 -0500 Received: by simark.ca (Postfix, from userid 112) id A09161F0BE; Fri, 1 Jan 2021 16:49:41 -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.4 required=5.0 tests=DKIM_SIGNED,MAILING_LIST_MULTI, RDNS_NONE,T_DKIM_INVALID,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 B91701F0BA for ; Fri, 1 Jan 2021 16:49:35 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 22DD93939C26; Fri, 1 Jan 2021 21:49:04 +0000 (GMT) Received: from gateway30.websitewelcome.com (gateway30.websitewelcome.com [192.185.152.11]) by sourceware.org (Postfix) with ESMTPS id 93F483938C39 for ; Fri, 1 Jan 2021 21:48:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 93F483938C39 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=tom@tromey.com Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway30.websitewelcome.com (Postfix) with ESMTP id 3EE8A26B6 for ; Fri, 1 Jan 2021 15:48:58 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id vSI6kJAvhuDoAvSI6kccqp; Fri, 01 Jan 2021 15:48:58 -0600 X-Authority-Reason: nr=8 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Sender:Reply-To:Cc:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=CEb18NNRW389YauYTR1AKCIpIi4uHKoCGoS1UYjvQDY=; b=hjyW0bk53KRtPvRZ3RtPcV12zc Hc1h3TJ9zbLLZSbpiqMw2fqwFCIDzJHdBndXfa9TVmkTjNxBoXKWYv9cWL6zGyM7CpTOIXowq/uO4 h1qpNlgDV9iPJ8zUG1JDLR67q; Received: from 97-122-81-39.hlrn.qwest.net ([97.122.81.39]:60426 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1kvSI6-0029zC-1K for gdb-patches@sourceware.org; Fri, 01 Jan 2021 14:48:58 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Subject: [PATCH 181/203] Convert p-exp.y to use operations Date: Fri, 1 Jan 2021 14:47:01 -0700 Message-Id: <20210101214723.1784144-182-tom@tromey.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210101214723.1784144-1-tom@tromey.com> References: <20210101214723.1784144-1-tom@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.81.39 X-Source-L: No X-Exim-ID: 1kvSI6-0029zC-1K X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-81-39.hlrn.qwest.net (localhost.localdomain) [97.122.81.39]:60426 X-Source-Auth: tom+tromey.com X-Email-Count: 182 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes 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: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" This converts the Pascal parser to generate operations rather than exp_elements. gdb/ChangeLog 2021-01-01 Tom Tromey * p-exp.y: Create operations. (pascal_language::parser): Update. --- gdb/ChangeLog | 5 + gdb/p-exp.y | 267 +++++++++++++++++++++++--------------------------- 2 files changed, 130 insertions(+), 142 deletions(-) diff --git a/gdb/p-exp.y b/gdb/p-exp.y index 637369e0404..87fabc2ec11 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -55,6 +55,7 @@ #include "objfiles.h" /* For have_full_symbols and have_partial_symbols. */ #include "block.h" #include "completer.h" +#include "expop.h" #define parse_type(ps) builtin_type (ps->gdbarch ()) @@ -78,6 +79,8 @@ static int yylex (void); static void yyerror (const char *); static char *uptok (const char *, int); + +using namespace expr; %} /* Although the yacc "value" of an expression is not used, @@ -203,44 +206,43 @@ normal_start : ; type_exp: type - { write_exp_elt_opcode (pstate, OP_TYPE); - write_exp_elt_type (pstate, $1); - write_exp_elt_opcode (pstate, OP_TYPE); + { + pstate->push_new ($1); current_type = $1; } ; /* Expressions, including the comma operator. */ exp1 : exp | exp1 ',' exp - { write_exp_elt_opcode (pstate, BINOP_COMMA); } + { pstate->wrap2 (); } ; /* Expressions, not including the comma operator. */ exp : exp '^' %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_IND); + { pstate->wrap (); if (current_type) current_type = TYPE_TARGET_TYPE (current_type); } ; exp : '@' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_ADDR); + { pstate->wrap (); if (current_type) current_type = TYPE_POINTER_TYPE (current_type); } ; exp : '-' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_NEG); } + { pstate->wrap (); } ; exp : NOT exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); } + { pstate->wrap (); } ; exp : INCREMENT '(' exp ')' %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_PREINCREMENT); } + { pstate->wrap (); } ; exp : DECREMENT '(' exp ')' %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_PREDECREMENT); } + { pstate->wrap (); } ; @@ -249,9 +251,9 @@ field_exp : exp '.' %prec UNARY ; exp : field_exp FIELDNAME - { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, $2); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); + { + pstate->push_new + (pstate->pop (), copy_name ($2)); search_field = 0; if (current_type) { @@ -267,9 +269,9 @@ exp : field_exp FIELDNAME exp : field_exp name - { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, $2); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); + { + pstate->push_new + (pstate->pop (), copy_name ($2)); search_field = 0; if (current_type) { @@ -283,19 +285,21 @@ exp : field_exp name } ; exp : field_exp name COMPLETE - { pstate->mark_struct_expression (); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, $2); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } + { + structop_base_operation *op + = new structop_ptr_operation (pstate->pop (), + copy_name ($2)); + pstate->mark_struct_expression (op); + pstate->push (operation_up (op)); + } ; exp : field_exp COMPLETE - { struct stoken s; - pstate->mark_struct_expression (); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - s.ptr = ""; - s.length = 0; - write_exp_string (pstate, s); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } + { + structop_base_operation *op + = new structop_ptr_operation (pstate->pop (), ""); + pstate->mark_struct_expression (op); + pstate->push (operation_up (op)); + } ; exp : exp '[' @@ -306,24 +310,16 @@ exp : exp '[' NULL, NULL, &arrayname); if (arrayfieldindex) { - struct stoken stringsval; - char *buf; - - buf = (char *) alloca (strlen (arrayname) + 1); - stringsval.ptr = buf; - stringsval.length = strlen (arrayname); - strcpy (buf, arrayname); current_type = (current_type ->field (arrayfieldindex - 1).type ()); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, stringsval); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); + pstate->push_new + (pstate->pop (), arrayname); } push_current_type (); } exp1 ']' { pop_current_type (); - write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); + pstate->wrap2 (); if (current_type) current_type = TYPE_TARGET_TYPE (current_type); } ; @@ -334,10 +330,11 @@ exp : exp '(' { push_current_type (); pstate->start_arglist (); } arglist ')' %prec ARROW - { write_exp_elt_opcode (pstate, OP_FUNCALL); - write_exp_elt_longcst (pstate, - pstate->end_arglist ()); - write_exp_elt_opcode (pstate, OP_FUNCALL); + { + std::vector args + = pstate->pop_vector (pstate->end_arglist ()); + pstate->push_new + (pstate->pop (), std::move (args)); pop_current_type (); if (current_type) current_type = TYPE_TARGET_TYPE (current_type); @@ -358,11 +355,10 @@ exp : type '(' exp ')' %prec UNARY if ((current_type->code () == TYPE_CODE_PTR) && (TYPE_TARGET_TYPE (current_type)->code () == TYPE_CODE_STRUCT) && (($1)->code () == TYPE_CODE_STRUCT)) - write_exp_elt_opcode (pstate, UNOP_IND); + pstate->wrap (); } - write_exp_elt_opcode (pstate, UNOP_CAST); - write_exp_elt_type (pstate, $1); - write_exp_elt_opcode (pstate, UNOP_CAST); + pstate->push_new + (pstate->pop (), $1); current_type = $1; } ; @@ -373,7 +369,7 @@ exp : '(' exp1 ')' /* Binary operators in order of decreasing precedence. */ exp : exp '*' exp - { write_exp_elt_opcode (pstate, BINOP_MUL); } + { pstate->wrap2 (); } ; exp : exp '/' { @@ -385,138 +381,141 @@ exp : exp '/' { if (leftdiv_is_integer && current_type && is_integral_type (current_type)) { - write_exp_elt_opcode (pstate, UNOP_CAST); - write_exp_elt_type (pstate, - parse_type (pstate) - ->builtin_long_double); + pstate->push_new + (pstate->pop (), + parse_type (pstate)->builtin_long_double); current_type = parse_type (pstate)->builtin_long_double; - write_exp_elt_opcode (pstate, UNOP_CAST); leftdiv_is_integer = 0; } - write_exp_elt_opcode (pstate, BINOP_DIV); + pstate->wrap2 (); } ; exp : exp DIV exp - { write_exp_elt_opcode (pstate, BINOP_INTDIV); } + { pstate->wrap2 (); } ; exp : exp MOD exp - { write_exp_elt_opcode (pstate, BINOP_REM); } + { pstate->wrap2 (); } ; exp : exp '+' exp - { write_exp_elt_opcode (pstate, BINOP_ADD); } + { pstate->wrap2 (); } ; exp : exp '-' exp - { write_exp_elt_opcode (pstate, BINOP_SUB); } + { pstate->wrap2 (); } ; exp : exp LSH exp - { write_exp_elt_opcode (pstate, BINOP_LSH); } + { pstate->wrap2 (); } ; exp : exp RSH exp - { write_exp_elt_opcode (pstate, BINOP_RSH); } + { pstate->wrap2 (); } ; exp : exp '=' exp - { write_exp_elt_opcode (pstate, BINOP_EQUAL); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp NOTEQUAL exp - { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp LEQ exp - { write_exp_elt_opcode (pstate, BINOP_LEQ); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp GEQ exp - { write_exp_elt_opcode (pstate, BINOP_GEQ); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp '<' exp - { write_exp_elt_opcode (pstate, BINOP_LESS); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp '>' exp - { write_exp_elt_opcode (pstate, BINOP_GTR); + { + pstate->wrap2 (); current_type = parse_type (pstate)->builtin_bool; } ; exp : exp ANDAND exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); } + { pstate->wrap2 (); } ; exp : exp XOR exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); } + { pstate->wrap2 (); } ; exp : exp OR exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); } + { pstate->wrap2 (); } ; exp : exp ASSIGN exp - { write_exp_elt_opcode (pstate, BINOP_ASSIGN); } + { pstate->wrap2 (); } ; exp : TRUEKEYWORD - { write_exp_elt_opcode (pstate, OP_BOOL); - write_exp_elt_longcst (pstate, (LONGEST) $1); + { + pstate->push_new ($1); current_type = parse_type (pstate)->builtin_bool; - write_exp_elt_opcode (pstate, OP_BOOL); } + } ; exp : FALSEKEYWORD - { write_exp_elt_opcode (pstate, OP_BOOL); - write_exp_elt_longcst (pstate, (LONGEST) $1); + { + pstate->push_new ($1); current_type = parse_type (pstate)->builtin_bool; - write_exp_elt_opcode (pstate, OP_BOOL); } + } ; exp : INT - { write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, $1.type); + { + pstate->push_new + ($1.type, $1.val); current_type = $1.type; - write_exp_elt_longcst (pstate, (LONGEST)($1.val)); - write_exp_elt_opcode (pstate, OP_LONG); } + } ; exp : NAME_OR_INT { YYSTYPE val; parse_number (pstate, $1.stoken.ptr, $1.stoken.length, 0, &val); - write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, val.typed_val_int.type); + pstate->push_new + (val.typed_val_int.type, + val.typed_val_int.val); current_type = val.typed_val_int.type; - write_exp_elt_longcst (pstate, (LONGEST) - val.typed_val_int.val); - write_exp_elt_opcode (pstate, OP_LONG); } ; exp : FLOAT - { write_exp_elt_opcode (pstate, OP_FLOAT); - write_exp_elt_type (pstate, $1.type); - current_type = $1.type; - write_exp_elt_floatcst (pstate, $1.val); - write_exp_elt_opcode (pstate, OP_FLOAT); } + { + float_data data; + std::copy (std::begin ($1.val), std::end ($1.val), + std::begin (data)); + pstate->push_new ($1.type, data); + } ; exp : variable @@ -524,7 +523,7 @@ exp : variable exp : DOLLAR_VARIABLE { - write_dollar_variable (pstate, $1); + pstate->push_dollar ($1); /* $ is the normal prefix for pascal hexadecimal values but this conflicts @@ -549,18 +548,16 @@ exp : DOLLAR_VARIABLE ; exp : SIZEOF '(' type ')' %prec UNARY - { write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, - parse_type (pstate)->builtin_int); + { current_type = parse_type (pstate)->builtin_int; $3 = check_typedef ($3); - write_exp_elt_longcst (pstate, - (LONGEST) TYPE_LENGTH ($3)); - write_exp_elt_opcode (pstate, OP_LONG); } + pstate->push_new + (parse_type (pstate)->builtin_int, + TYPE_LENGTH ($3)); } ; exp : SIZEOF '(' exp ')' %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_SIZEOF); + { pstate->wrap (); current_type = parse_type (pstate)->builtin_int; } exp : STRING @@ -571,27 +568,17 @@ exp : STRING string. */ const char *sp = $1.ptr; int count = $1.length; - while (count-- > 0) - { - write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, - parse_type (pstate) - ->builtin_char); - write_exp_elt_longcst (pstate, - (LONGEST) (*sp++)); - write_exp_elt_opcode (pstate, OP_LONG); - } - write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, - parse_type (pstate) - ->builtin_char); - write_exp_elt_longcst (pstate, (LONGEST)'\0'); - write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_opcode (pstate, OP_ARRAY); - write_exp_elt_longcst (pstate, (LONGEST) 0); - write_exp_elt_longcst (pstate, - (LONGEST) ($1.length)); - write_exp_elt_opcode (pstate, OP_ARRAY); } + std::vector args (count + 1); + for (int i = 0; i < count; ++i) + args[i] = (make_operation + (parse_type (pstate)->builtin_char, + *sp++)); + args[count] = (make_operation + (parse_type (pstate)->builtin_char, + '\0')); + pstate->push_new + (0, $1.length, std::move (args)); + } ; /* Object pascal */ @@ -599,8 +586,7 @@ exp : THIS { struct value * this_val; struct type * this_type; - write_exp_elt_opcode (pstate, OP_THIS); - write_exp_elt_opcode (pstate, OP_THIS); + pstate->push_new (); /* We need type of this. */ this_val = value_of_this_silent (pstate->language ()); @@ -613,7 +599,7 @@ exp : THIS if (this_type->code () == TYPE_CODE_PTR) { this_type = TYPE_TARGET_TYPE (this_type); - write_exp_elt_opcode (pstate, UNOP_IND); + pstate->wrap (); } } @@ -665,10 +651,9 @@ variable: block COLONCOLON name error (_("No symbol \"%s\" in specified context."), copy.c_str ()); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); - write_exp_elt_block (pstate, sym.block); - write_exp_elt_sym (pstate, sym.symbol); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); } + pstate->push_new + (sym.symbol, sym.block); + } ; qualified_name: typebase COLONCOLON name @@ -680,10 +665,8 @@ qualified_name: typebase COLONCOLON name error (_("`%s' is not defined as an aggregate type."), type->name ()); - write_exp_elt_opcode (pstate, OP_SCOPE); - write_exp_elt_type (pstate, type); - write_exp_string (pstate, $3); - write_exp_elt_opcode (pstate, OP_SCOPE); + pstate->push_new + (type, copy_name ($3)); } ; @@ -697,8 +680,7 @@ variable: qualified_name lookup_symbol (name.c_str (), (const struct block *) NULL, VAR_DOMAIN, NULL).symbol; - write_exp_symbol_reference (pstate, name.c_str (), - sym); + pstate->push_symbol (name.c_str (), sym); } ; @@ -710,10 +692,8 @@ variable: name_not_typename if (symbol_read_needs_frame (sym.symbol)) pstate->block_tracker->update (sym); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); - write_exp_elt_block (pstate, sym.block); - write_exp_elt_sym (pstate, sym.symbol); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); + pstate->push_new + (sym.symbol, sym.block); current_type = sym.symbol->type; } else if ($1.is_a_field_of_this) { @@ -723,11 +703,10 @@ variable: name_not_typename not inadvertently convert from a method call to data ref. */ pstate->block_tracker->update (sym); - write_exp_elt_opcode (pstate, OP_THIS); - write_exp_elt_opcode (pstate, OP_THIS); - write_exp_elt_opcode (pstate, STRUCTOP_PTR); - write_exp_string (pstate, $1.stoken); - write_exp_elt_opcode (pstate, STRUCTOP_PTR); + operation_up thisop + = make_operation (); + pstate->push_new + (std::move (thisop), copy_name ($1.stoken)); /* We need type of this. */ this_val = value_of_this_silent (pstate->language ()); @@ -750,7 +729,8 @@ variable: name_not_typename msymbol = lookup_bound_minimal_symbol (arg.c_str ()); if (msymbol.minsym != NULL) - write_exp_msymbol (pstate, msymbol); + pstate->push_new + (msymbol.minsym, msymbol.objfile); else if (!have_full_symbols () && !have_partial_symbols ()) error (_("No symbol table is loaded. " @@ -1718,7 +1698,10 @@ pascal_language::parser (struct parser_state *par_state) const pstate = par_state; paren_depth = 0; - return yyparse (); + int result = yyparse (); + if (!result) + pstate->set_operation (pstate->pop ()); + return result; } static void -- 2.26.2