From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gateway32.websitewelcome.com (gateway32.websitewelcome.com [192.185.145.119]) by sourceware.org (Postfix) with ESMTPS id 6734C39484B8 for ; Fri, 20 Mar 2020 21:53:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6734C39484B8 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 gateway32.websitewelcome.com (Postfix) with ESMTP id 19557A8D2AE for ; Fri, 20 Mar 2020 16:53:43 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id FPaJjcP4BEfyqFPaJjcBys; Fri, 20 Mar 2020 16:53:43 -0500 X-Authority-Reason: nr=8 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: 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=benS10/1dGIiPiAQZmOr5FsK6BLjESTJF52dgmi93gc=; b=VjjTmiuZ96y1lKpd96jVfskdHr OlgrE9AvhltuXBmuva6ehc8qhvy7rMw+bqWJvzgWFdk5fWDrYy73P4DoV11OzJHH+vtTP6j/Q96WA BinpVs0atVg9zrVYj0ZmhTdhE; Received: from 97-118-117-21.hlrn.qwest.net ([97.118.117.21]:35792 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92) (envelope-from ) id 1jFPaI-003c6k-TF; Fri, 20 Mar 2020 15:53:42 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2 4/7] Change the C parser to allow complex constants Date: Fri, 20 Mar 2020 15:53:37 -0600 Message-Id: <20200320215340.16749-5-tom@tromey.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20200320215340.16749-1-tom@tromey.com> References: <20200320215340.16749-1-tom@tromey.com> 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.118.117.21 X-Source-L: No X-Exim-ID: 1jFPaI-003c6k-TF X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-118-117-21.hlrn.qwest.net (bapiya.Home) [97.118.117.21]:35792 X-Source-Auth: tom+tromey.com X-Email-Count: 6 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-19.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, JMQ_SPF_NEUTRAL, RCVD_IN_ABUSEAT, RCVD_IN_DNSWL_NONE, RCVD_IN_SBL_CSS, SPF_HELO_PASS, SPF_NEUTRAL, URIBL_CSS, URIBL_CSS_A autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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-List-Received-Date: Fri, 20 Mar 2020 21:53:45 -0000 This changes the C parser to allow complex constants. Now something like "print 23i" will work. There are no tests in this patch; they come later. gdb/ChangeLog 2020-03-20 Tom Tromey * c-exp.y (COMPLEX_INT, COMPLEX_FLOAT): New tokens. (exp) : New rules. (parse_number): Handle complex numbers. --- gdb/ChangeLog | 6 ++++ gdb/c-exp.y | 77 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/gdb/c-exp.y b/gdb/c-exp.y index a4efaab79c8..c2531b9bffc 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -54,6 +54,7 @@ #include "typeprint.h" #include "cp-abi.h" #include "type-stack.h" +#include "target-float.h" #define parse_type(ps) builtin_type (ps->gdbarch ()) @@ -185,8 +186,8 @@ static void c_print_token (FILE *file, int type, YYSTYPE value); %type ptr_operator_ts abs_decl direct_abs_decl -%token INT -%token FLOAT +%token INT COMPLEX_INT +%token FLOAT COMPLEX_FLOAT /* Both NAME and TYPENAME tokens represent symbols in the input, and both convey their data as strings. @@ -775,6 +776,22 @@ exp : INT write_exp_elt_opcode (pstate, OP_LONG); } ; +exp : COMPLEX_INT + { + write_exp_elt_opcode (pstate, OP_LONG); + write_exp_elt_type (pstate, TYPE_TARGET_TYPE ($1.type)); + write_exp_elt_longcst (pstate, 0); + write_exp_elt_opcode (pstate, OP_LONG); + write_exp_elt_opcode (pstate, OP_LONG); + write_exp_elt_type (pstate, TYPE_TARGET_TYPE ($1.type)); + write_exp_elt_longcst (pstate, (LONGEST) ($1.val)); + write_exp_elt_opcode (pstate, OP_LONG); + write_exp_elt_opcode (pstate, OP_COMPLEX); + write_exp_elt_type (pstate, $1.type); + write_exp_elt_opcode (pstate, OP_COMPLEX); + } + ; + exp : CHAR { struct stoken_vector vec; @@ -804,6 +821,27 @@ exp : FLOAT write_exp_elt_opcode (pstate, OP_FLOAT); } ; +exp : COMPLEX_FLOAT + { + struct type *underlying + = TYPE_TARGET_TYPE ($1.type); + + write_exp_elt_opcode (pstate, OP_FLOAT); + write_exp_elt_type (pstate, underlying); + gdb_byte val[16]; + target_float_from_host_double (val, underlying, 0); + write_exp_elt_floatcst (pstate, val); + write_exp_elt_opcode (pstate, OP_FLOAT); + write_exp_elt_opcode (pstate, OP_FLOAT); + write_exp_elt_type (pstate, underlying); + write_exp_elt_floatcst (pstate, $1.val); + write_exp_elt_opcode (pstate, OP_FLOAT); + write_exp_elt_opcode (pstate, OP_COMPLEX); + write_exp_elt_type (pstate, $1.type); + write_exp_elt_opcode (pstate, OP_COMPLEX); + } + ; + exp : variable ; @@ -1853,7 +1891,10 @@ parse_number (struct parser_state *par_state, /* Number of "L" suffixes encountered. */ int long_p = 0; - /* We have found a "L" or "U" suffix. */ + /* Imaginary number. */ + bool imaginary_p = false; + + /* We have found a "L" or "U" (or "i") suffix. */ int found_suffix = 0; ULONGEST high_bit; @@ -1866,6 +1907,12 @@ parse_number (struct parser_state *par_state, if (parsed_float) { + if (len >= 1 && p[len - 1] == 'i') + { + imaginary_p = true; + --len; + } + /* Handle suffixes for decimal floating-point: "df", "dd" or "dl". */ if (len >= 2 && p[len - 2] == 'd' && p[len - 1] == 'f') { @@ -1909,7 +1956,12 @@ parse_number (struct parser_state *par_state, putithere->typed_val_float.type, putithere->typed_val_float.val)) return ERROR; - return FLOAT; + + if (imaginary_p) + putithere->typed_val_float.type + = init_complex_type (nullptr, putithere->typed_val_float.type); + + return imaginary_p ? COMPLEX_FLOAT : FLOAT; } /* Handle base-switching prefixes 0x, 0t, 0d, 0 */ @@ -1958,7 +2010,7 @@ parse_number (struct parser_state *par_state, c = *p++; if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; - if (c != 'l' && c != 'u') + if (c != 'l' && c != 'u' && c != 'i') n *= base; if (c >= '0' && c <= '9') { @@ -1984,6 +2036,11 @@ parse_number (struct parser_state *par_state, unsigned_p = 1; found_suffix = 1; } + else if (c == 'i') + { + imaginary_p = true; + found_suffix = 1; + } else return ERROR; /* Char not a digit */ } @@ -1993,13 +2050,13 @@ parse_number (struct parser_state *par_state, /* Portably test for overflow (only works for nonzero values, so make a second check for zero). FIXME: Can't we just make n and prevn unsigned and avoid this? */ - if (c != 'l' && c != 'u' && (prevn >= n) && n != 0) + if (c != 'l' && c != 'u' && c != 'i' && (prevn >= n) && n != 0) unsigned_p = 1; /* Try something unsigned */ /* Portably test for unsigned overflow. FIXME: This check is wrong; for example it doesn't find overflow on 0x123456789 when LONGEST is 32 bits. */ - if (c != 'l' && c != 'u' && n != 0) + if (c != 'l' && c != 'u' && c != 'i' && n != 0) { if (unsigned_p && prevn >= n) error (_("Numeric constant too large.")); @@ -2071,7 +2128,11 @@ parse_number (struct parser_state *par_state, putithere->typed_val_int.type = signed_type; } - return INT; + if (imaginary_p) + putithere->typed_val_int.type + = init_complex_type (nullptr, putithere->typed_val_int.type); + + return imaginary_p ? COMPLEX_INT : INT; } /* Temporary obstack used for holding strings. */ -- 2.17.2