From patchwork Thu Sep 14 15:59:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 22885 Received: (qmail 91782 invoked by alias); 14 Sep 2017 15:59:37 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 91771 invoked by uid 89); 14 Sep 2017 15:59:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.3 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: sessmg22.ericsson.net Received: from sessmg22.ericsson.net (HELO sessmg22.ericsson.net) (193.180.251.58) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 14 Sep 2017 15:59:34 +0000 Received: from ESESSHC024.ericsson.se (Unknown_Domain [153.88.183.90]) by sessmg22.ericsson.net (Symantec Mail Security) with SMTP id 4E.17.20899.367AAB95; Thu, 14 Sep 2017 17:59:31 +0200 (CEST) Received: from EUR02-AM5-obe.outbound.protection.outlook.com (153.88.183.145) by oa.msg.ericsson.com (153.88.183.90) with Microsoft SMTP Server (TLS) id 14.3.352.0; Thu, 14 Sep 2017 17:59:30 +0200 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=simon.marchi@ericsson.com; Received: from elxacz23q12.ki.sw.ericsson.se (192.176.1.95) by DBXPR07MB318.eurprd07.prod.outlook.com (2a01:111:e400:941d::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.5; Thu, 14 Sep 2017 15:59:29 +0000 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH] Make dwarf_expr_context::stack an std::vector Date: Thu, 14 Sep 2017 17:59:20 +0200 Message-ID: <1505404760-11844-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-ClientProxiedBy: HE1PR0202CA0010.eurprd02.prod.outlook.com (2603:10a6:3:8c::20) To DBXPR07MB318.eurprd07.prod.outlook.com (2a01:111:e400:941d::12) X-MS-Office365-Filtering-Correlation-Id: 61f24853-8dc1-44cb-95fa-08d4fb899501 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:DBXPR07MB318; X-Microsoft-Exchange-Diagnostics: 1; DBXPR07MB318; 3:h7IkYBRYqoxvud78TchdSb7NZMNFB/a23d8Usfm+AdHWvJlN7Wvi6ef7pjkWx3PRbDX0N/bUD2Tt3oxHcQVJi1oScONjx27xfU7SxTPorvs6yrFU1adZGoQ5cYuJiOWNsXvczKPqyq9Pk0YLvJhZJ+567LEh0OcqgEm80h4pfe0x9eOWBbsDrsrKTz3YuhKQJpP9R8oSPopD495LwOEf8PF08QkzYo+3ZhD2U69vlUnj3dawEiF3jOsopOtmHOKz; 25:ZAibtBUBDISXuogL/eI8qLO/tBBQAJIPdQ5kiC0sDc8m+NUlP/0oFfExPEcNuZCt00YmgVyO1hFheRMxC2whQ84rHeTI3d/qN5Pjbhg0qB1k+T+L/5TSJIGxoZvsJICjySn/fAETNyQ3QI3ITu/UK//gEtrvh4djbil+zd6L95FVxE6J4k6pboSEC7Wlp1NVbHK1mmLvqXaM8XEpCDspe97FOeDJpxaQ79EA+hPeJtV7LUCH9xYZuJaH5InwdWayTaPUP1qG0pzvLwSjPnZ8prihcnKuaQR8B4kSli8a0wE+C2uDta/reaKBLPBdLMsAf10MzFQjfuoxh7IyEaSbzg==; 31:TdC7k3kXNcKiR3LXKiu3BY4aqVgDdEtD2yeCRj4RcPNzE+l9/LJKSWHdeHsoMae3PsJreP4XfTACTItA+YZNxA5ExGA9pBy+Hws/yTm1Bd+QhcjYvpi9xVTtx1MgGSaJZVSzsCYqPX6aK9CQCA/lOxRFwDO63TGh3n1X6kwcp+D/qQIZZSVu106YOmMaZdvaWSuO6N5OsS3QX8RwwZfRSDGMfgkZ99erl3CoQPyULIQ= X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DBXPR07MB318: X-Microsoft-Exchange-Diagnostics: 1; DBXPR07MB318; 20:XqanwSj1xwSFgAPI4W8VC43ZrNNWrlldE37LAgWGGDDAZ1RI7L7tVMXejJsHSEW8KkWAee5H9uYCQlHDoNnUgEWBZ8MPCqbqjsNlL6/woVvtgJJL09y8eSSGSGwV07EGjq/cw6U83ZMr4EviiUKNb0Zb80Q0Ech8abt6ddDVG4KocrR9r8ZvrMELI9oNR7g3cssTVQEBXqIyzyLqU/L9aLi1FP7TAotWKaYduu0ldubmffUqYi8hEDGgrpTa6sogvVWNFV9t0LlH1jT1jn+pQM29h9iLBZqjdDnVjG4jOEzxgUcVsK7UCD7EaPAzGHwu8wRM1p/iU1xYgDIs9vWJJWELsHRgYJcxUGXsRwPddEnQ5GusIPgUxFvJi2fmnj/RHByKXz6GBwvrmuE1/BuzS3GHJJgfDqfcb/FmfJZID6Om783zAFXmXTmPALe6rPmQlVBc9ic1SqNiMVQm7z6kj5kup9dqbn/+9DJAhlH+EWDI6zswNQV1X0Bdk1JoF+bR; 4:+N3o2qmjztKdr1mZOqWxs5bo/ZdHi2zqnQ0t5p0yUJBfCM6wUPIl9aQZufJJqGcO9BmQAcM3V7D16vhOu14vbrQ3J4wCwIyuKpUGvlVMqajD1gHiXulQUnXsDpVFQEjfBXn+GQATjywW9YZJsykrhtYD8AloKqlUKidrvj409du/W+X671n3+Kn40Lst4mFC3raCqte6yyCDNjST48CTCYnj4osjSAF0VoM6tARNPX18un9YqLlYyj3sdKcal3bGMeHFjXPqbNGWUTlXP7IjA8PWZPpYZe5OK5nEeLM5z06fMt4eS0IvPcFYK1fFTRD0QPYkHDWrEyZOIM7BsFRq8Q== X-Exchange-Antispam-Report-Test: UriScan:(131327999870524)(788757137089); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123558100)(20161123562025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DBXPR07MB318; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DBXPR07MB318; X-Forefront-PRVS: 0430FA5CB7 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(376002)(346002)(54534003)(199003)(189002)(105586002)(7736002)(107886003)(106356001)(53936002)(3846002)(575784001)(6116002)(305945005)(2906002)(86362001)(110136004)(47776003)(25786009)(36756003)(50226002)(101416001)(189998001)(50986999)(81166006)(8936002)(5003940100001)(81156014)(33646002)(8676002)(2351001)(66066001)(2361001)(4326008)(6506006)(5660300001)(478600001)(6916009)(97736004)(50466002)(48376002)(6486002)(68736007)(16526017)(6512007)(6666003)(316002)(16586007); DIR:OUT; SFP:1101; SCL:1; SRVR:DBXPR07MB318; H:elxacz23q12.ki.sw.ericsson.se; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: ericsson.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DBXPR07MB318; 23:XYHdSwLNCyWWMehaH98m/1+HmPIqL5lDg+QH0oLoNy?= =?us-ascii?Q?rkQNCr2tL6RQlnvAoATy26pziR0m96LfD3/jiIDrVuHsuv8H6zp+DTshh2v2?= =?us-ascii?Q?CBrDFpx7AenOMDLpokf7UE+jNHZrJVPNYMAREuFEXu364YPClvPBku+y44+8?= =?us-ascii?Q?ccxEsV9WXecvJ+5c1I1RAaSOeHQwVJRGKHejAspZcgcc2135nHmVQih6XH2h?= =?us-ascii?Q?eMeJdcTI9Begy3NGrpfQe8oI3HmeY+/iDjNSyu/MKTl+B/3EJZITBBbJ5br7?= =?us-ascii?Q?2lh26ZFipKdrMQLb5RNauXIYVaqmIg86Fcnl5qUjAJVVjWf4dSt5VHiJvgFR?= =?us-ascii?Q?8rrLFjSbtZKG1LW4EsoFVs6wBIqtS1fOOJ3MKPjETEHGUWIcDwLJ1lXu8R2e?= =?us-ascii?Q?NJdYs5XXfYw1nwTjTH/V0Xp0BnOXZKrIG6PFJZARGJ6LmXYvAOzq5O8JAVJb?= =?us-ascii?Q?jrNeYc2nLohUqhw+7y4SMxpkTa3k/FkJrLFXrPo6ar4k4m/VIkSrGPbmOQ95?= =?us-ascii?Q?4tmVGbcmq3tL5ZMK/Sje1hq5s4cy6if0mGC73JD2iOmB3NknjV2yuUo0bWX8?= =?us-ascii?Q?7b+5ugqnOMVib322vYRRJGJXGOjLnmwHBCrwbSsV6xnvkuag0490csx2pmDR?= =?us-ascii?Q?AxIQs58mUjNxKAHxZU0AGOuUXfRf2O0w7PxN7YCFZt6BNkU82MCcUfUftN+a?= =?us-ascii?Q?8E6+I0bhzD+qQzUxVPldirHRxxGGybidc4LnmumKmdzwdTPaRyIHy37VOb5e?= =?us-ascii?Q?xlXiapQpcUlQCl2eJxQZ8OwNjmP9lQSLwyViAerd2cEYp7H2sn5rvY+FpCgQ?= =?us-ascii?Q?uUhh0ju/IrRyBcuCEccCdTjuDcH5hYPDWer3iCw2qdgonyouqHHQ/HxmGtcy?= =?us-ascii?Q?dx4wnb4TI0vh96wixk2s0iw/usftsjP5dzqVNBPs+ZEEMXPZofjZ8iEuYpYC?= =?us-ascii?Q?oesGe7pubrDqa1O3Ja0oNj4cN33xeKpJ3GdIq2Ne4VDiAQPFiw+CeQdtiLyo?= =?us-ascii?Q?1pxt/+Ik6hFN+pBxDcl7MXm7wU3FaOcSY2uqzMS0e9rA0ihJLDeRqrcDz0Bq?= =?us-ascii?Q?wKpPRrU0JkAso+u489lZQipJERdg9ZB0YgqFQKO7lxhrUftRIjTPrXp+F1Bv?= =?us-ascii?Q?0J+tPK92V4ekIq2r8+dC7gwFKp8P4E?= X-Microsoft-Exchange-Diagnostics: 1; DBXPR07MB318; 6:2yhMROyM0Szf018DjyDDsNeoXvTAPKDhjCRtF3ulGRy4Eap2mF/6KKFB6hohPD2+i/8bEtL9BNiLf4ejPFVpCBJOawmHsEcWsMLzqlDd1qUKqWaGqOjGFYOlgwnlMmd5bS13MnFCCWmDGMakxyivhaJph2+zO3KP3SpqKuFgACQdMFbljGytma44telSJAtpxwnCaJWtAE14beg+3fovVmwjGJcftfjijgusz14LIJIxn59FdI/NXgVgr+4KTdtKh1awecwE1YcFGh8WwH2IKAFkQaSKJm3bGFxGYVs+/6Ecm+ciq9Z1v0NUrletlzM+b3jfZUeQMnj5QXPnmaYMLQ==; 5:dqQTysMQhKQI0cMiLTnZCcnldIsGdoNUBCurTL9WsQZ5lCq7/XaA4ebsiDMeyNRLWiGM31aDAr9IzoSdB4T4IYL9YjG7Cxq1QvjyPqRgoKvQPJfmT9neUZP505DS58+VFiIJPX7KPlvqQwpjalNddw==; 24:QI+X7hzLIppcyy5ld3yBDailLD206hzTYDr1k74m/wq5ED3AErQ5KxefRwknk5/4JkhF0HlZZQUx6u10AlFVjJ4cwwLAtyladFL2nFPawlk=; 7:rjXdTaoPkCFjyG94hTaxXrWxQlIjsOEQ74ydnjYAu7hTPSkisDBnCVguA59NK9XbIOyRRS9szkbjMIftZQVfjAw3lJv66Nymn8LCbazsplRe6SqoMf0hmcstpySRD0RDNsyJUENWNSjS7a/AUlb+MacATr7lS+jEDALHIJ2Iix/0lgP9TFMeCVu02zgEFQpaOS1VxD1rNf2F4WiXwktRN8EM7JxaDNO4sGoPQjkQa6o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2017 15:59:29.2582 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBXPR07MB318 X-OriginatorOrg: ericsson.com X-IsSubscribed: yes Replace the manually managed array with a vector. It is mostly straightforward, except maybe one thing in execute_stack_op, in the handling of DW_OP_fbreg. When the code stumbles on that opcode while evaluating an expression, it needs to evaluate a subexpression to find where the fb reg has been saved. Rather than creating a new context, it reuses the current context. It saves the size of the stack before and restores the stack to that size after. I think we can do a little bit better by saving the current stack locally and installing a new empty stack. This way, if the subexpression is malformed and underflows, we'll get an exception. Before, it would have overwitten the top elements of the top-level expression. The evaluation of the top-level expression would have then resumed with the same stack size, but possibly some corrupted elements. Regtested on the buildbot. gdb/ChangeLog: * dwarf2expr.h (dwarf_stack_value): Add constructor. (dwarf_expr_context) <~dwarf_expr_context>: Define as default. : Change type to std::vector. : Remove. : Remove. * dwarf2expr.c (dwarf_expr_context::dwarf_expr_context): Adjust. (dwarf_expr_context::~dwarf_expr_context): Remove. (dwarf_expr_context::grow_stack): Remove. (dwarf_expr_context::push): Adjust. (dwarf_expr_context::pop): Adjust. (dwarf_expr_context::fetch): Adjust. (dwarf_expr_context::fetch_in_stack_memory): Adjust. (dwarf_expr_context::stack_empty_p): Adjust. (dwarf_expr_context::execute_stack_op): Adjust. --- gdb/dwarf2expr.c | 110 ++++++++++++++++++++----------------------------------- gdb/dwarf2expr.h | 13 +++---- 2 files changed, 46 insertions(+), 77 deletions(-) diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c index 3a388ac..f5e0e4c 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c @@ -88,10 +88,7 @@ dwarf_expr_context::address_type () const /* Create a new context for the expression evaluator. */ dwarf_expr_context::dwarf_expr_context () -: stack (NULL), - stack_len (0), - stack_allocated (10), - gdbarch (NULL), +: gdbarch (NULL), addr_size (0), ref_addr_size (0), offset (0), @@ -102,29 +99,6 @@ dwarf_expr_context::dwarf_expr_context () data (NULL), initialized (0) { - this->stack = XNEWVEC (struct dwarf_stack_value, this->stack_allocated); -} - -/* Clean up a dwarf_expr_context. */ - -dwarf_expr_context::~dwarf_expr_context () -{ - xfree (this->stack); -} - -/* Expand the memory allocated stack to contain at least - NEED more elements than are currently used. */ - -void -dwarf_expr_context::grow_stack (size_t need) -{ - if (this->stack_len + need > this->stack_allocated) - { - size_t newlen = this->stack_len + need + 10; - - this->stack = XRESIZEVEC (struct dwarf_stack_value, this->stack, newlen); - this->stack_allocated = newlen; - } } /* Push VALUE onto the stack. */ @@ -132,12 +106,7 @@ dwarf_expr_context::grow_stack (size_t need) void dwarf_expr_context::push (struct value *value, bool in_stack_memory) { - struct dwarf_stack_value *v; - - grow_stack (1); - v = &this->stack[this->stack_len++]; - v->value = value; - v->in_stack_memory = in_stack_memory; + stack.emplace_back (value, in_stack_memory); } /* Push VALUE onto the stack. */ @@ -153,9 +122,10 @@ dwarf_expr_context::push_address (CORE_ADDR value, bool in_stack_memory) void dwarf_expr_context::pop () { - if (this->stack_len <= 0) + if (stack.empty ()) error (_("dwarf expression stack underflow")); - this->stack_len--; + + stack.pop_back (); } /* Retrieve the N'th item on the stack. */ @@ -163,11 +133,11 @@ dwarf_expr_context::pop () struct value * dwarf_expr_context::fetch (int n) { - if (this->stack_len <= n) + if (stack.size () <= n) error (_("Asked for position %d of stack, " - "stack only has %d elements on it."), - n, this->stack_len); - return this->stack[this->stack_len - (1 + n)].value; + "stack only has %zu elements on it."), + n, stack.size ()); + return stack[stack.size () - (1 + n)].value; } /* Require that TYPE be an integral type; throw an exception if not. */ @@ -263,11 +233,11 @@ dwarf_expr_context::fetch_address (int n) bool dwarf_expr_context::fetch_in_stack_memory (int n) { - if (this->stack_len <= n) + if (stack.size () <= n) error (_("Asked for position %d of stack, " - "stack only has %d elements on it."), - n, this->stack_len); - return this->stack[this->stack_len - (1 + n)].in_stack_memory; + "stack only has %zu elements on it."), + n, stack.size ()); + return stack[stack.size () - (1 + n)].in_stack_memory; } /* Return true if the expression stack is empty. */ @@ -275,7 +245,7 @@ dwarf_expr_context::fetch_in_stack_memory (int n) bool dwarf_expr_context::stack_empty_p () const { - return this->stack_len == 0; + return stack.empty (); } /* Add a new piece to the dwarf_expr_context's piece list. */ @@ -875,14 +845,16 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, { const gdb_byte *datastart; size_t datalen; - unsigned int before_stack_len; op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset); + /* Rather than create a whole new context, we simply - record the stack length before execution, then reset it - afterwards, effectively erasing whatever the recursive - call put there. */ - before_stack_len = this->stack_len; + backup the current stack locally and install a new empty stack, + then reset it afterwards, effectively erasing whatever the + recursive call put there. */ + std::vector saved_stack = std::move (stack); + stack.clear (); + /* FIXME: cagney/2003-03-26: This code should be using get_frame_base_address(), and then implement a dwarf2 specific this_base method. */ @@ -898,7 +870,10 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, result = result + offset; result_val = value_from_ulongest (address_type, result); in_stack_memory = true; - this->stack_len = before_stack_len; + + /* Restore the content of the original stack. */ + stack = std::move (saved_stack); + this->location = DWARF_VALUE_MEMORY; } break; @@ -920,16 +895,14 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, case DW_OP_swap: { - struct dwarf_stack_value t1, t2; - - if (this->stack_len < 2) + if (stack.size () < 2) error (_("Not enough elements for " - "DW_OP_swap. Need 2, have %d."), - this->stack_len); - t1 = this->stack[this->stack_len - 1]; - t2 = this->stack[this->stack_len - 2]; - this->stack[this->stack_len - 1] = t2; - this->stack[this->stack_len - 2] = t1; + "DW_OP_swap. Need 2, have %zu."), + stack.size ()); + + dwarf_stack_value &t1 = stack[stack.size () - 1]; + dwarf_stack_value &t2 = stack[stack.size () - 2]; + std::swap (t1, t2); goto no_push; } @@ -940,18 +913,15 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr, case DW_OP_rot: { - struct dwarf_stack_value t1, t2, t3; - - if (this->stack_len < 3) + if (stack.size () < 3) error (_("Not enough elements for " - "DW_OP_rot. Need 3, have %d."), - this->stack_len); - t1 = this->stack[this->stack_len - 1]; - t2 = this->stack[this->stack_len - 2]; - t3 = this->stack[this->stack_len - 3]; - this->stack[this->stack_len - 1] = t2; - this->stack[this->stack_len - 2] = t3; - this->stack[this->stack_len - 3] = t1; + "DW_OP_rot. Need 3, have %zu."), + stack.size ()); + + dwarf_stack_value temp = stack[stack.size () - 1]; + stack[stack.size () - 1] = stack[stack.size () - 2]; + stack[stack.size () - 2] = stack[stack.size () - 3]; + stack[stack.size () - 3] = temp; goto no_push; } diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h index 0a57bee..94056ae 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h @@ -100,6 +100,10 @@ struct dwarf_expr_piece struct dwarf_stack_value { + dwarf_stack_value (struct value *value_, int in_stack_memory_) + : value (value_), in_stack_memory (in_stack_memory_) + {} + struct value *value; /* True if the piece is in memory and is known to be on the program's stack. @@ -114,7 +118,7 @@ struct dwarf_stack_value struct dwarf_expr_context { dwarf_expr_context (); - virtual ~dwarf_expr_context (); + virtual ~dwarf_expr_context () = default; void push_address (CORE_ADDR value, bool in_stack_memory); void eval (const gdb_byte *addr, size_t len); @@ -123,11 +127,7 @@ struct dwarf_expr_context bool fetch_in_stack_memory (int n); /* The stack of values, allocated with xmalloc. */ - struct dwarf_stack_value *stack; - - /* The number of values currently pushed on the stack, and the - number of elements allocated to the stack. */ - int stack_len, stack_allocated; + std::vector stack; /* Target architecture to use for address operations. */ struct gdbarch *gdbarch; @@ -249,7 +249,6 @@ struct dwarf_expr_context private: struct type *address_type () const; - void grow_stack (size_t need); void push (struct value *value, bool in_stack_memory); bool stack_empty_p () const; void add_piece (ULONGEST size, ULONGEST offset);