From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id ILHTI6r+PGA3JAAAWB0awg (envelope-from ) for ; Mon, 01 Mar 2021 09:48:10 -0500 Received: by simark.ca (Postfix, from userid 112) id 8955D1F0BD; Mon, 1 Mar 2021 09:48:09 -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.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,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 F0F561EF64 for ; Mon, 1 Mar 2021 09:48:03 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A138A393C85F; Mon, 1 Mar 2021 14:48:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A138A393C85F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1614610082; bh=x++J6Qer5o8Z7eXYv5Hg1DeXj+mrTCuSdXGXWCxBCUU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=wN6WYRVFbqfcrnp/rXLGLmCN1B6iEo2zZeTpblFEZezybs4MU/zHMgdSRlgpaL3l9 eTBse7u3i62ugT0kjHiZzP6GVTb3lXnMjfchVFtgpTg2kO2+X4893eQMVmfokrQyJR wRVfkbtZszmBCT9eTynKNxhuJcsY+HBKGn3yZQuo= Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam08on2076.outbound.protection.outlook.com [40.107.102.76]) by sourceware.org (Postfix) with ESMTPS id F0B9B393C038 for ; Mon, 1 Mar 2021 14:47:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org F0B9B393C038 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SFtuVys828+WxMYwsXkJKCbFlFTPQ/7WQCA2JvSUnXkkdlMgXFmplQIesgv227BP5eDv7kDEmHl9A7PXDNSrvTEUNwvWTCu3var/fwdhme5jvJ9BP2h4Iy+1uRVlUhamNZpmzpnGhuRWPbfebivmHA1rjEmcxQGNQdP4Rk+28OHPYrTRdz5DcdWYQIyMIRqi+AC5gJxy/mvsrfRYoUpbAzZolzhfIyaHZTRApbKiRI2cQebA6GqR47cRS8ionv2IJ9TnzDRfU0g9XZ16yctrVcHCKkHq0n08zjtcN5h/N/NesiKaG9arrRWrg7gzwBAxtEtJ/8Vf59N276lcIA8ksg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=x++J6Qer5o8Z7eXYv5Hg1DeXj+mrTCuSdXGXWCxBCUU=; b=O8EwxnRC1/xf3vw83bAB+Q9xAhhHffpOhlFKk3Qbau8SatiR0TbsOU06+JKd27iovAHVXslULAgpHfyI9W/867KYMkTC6a12+2QCZ/4dFFSZxZVL4S0djmRN0D0deH3lxi2sgmxJHeC/kGO63vBW34kSyOg93qcvpaeyvSdt5YZ+WyGUzstk0ySG7PwAlWtXrswtDBaAKAE2YukEO6Rh9bztIpcmqbZoH4yMUIRkIAyh1G/ARRXJP7Ed5zp4ldL2LvbKi8FzG2AIpMAnTZ89xv9vle04nbdgPPOIvEdvwRNKSwNds0WSGC2JvBAGQg4jaNCR53YYJquRiWYJdzNnuw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none Received: from DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) by DM5PR12MB2342.namprd12.prod.outlook.com (2603:10b6:4:ba::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.28; Mon, 1 Mar 2021 14:47:50 +0000 Received: from DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44]) by DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::31d8:f503:f7b2:f44%3]) with mapi id 15.20.3868.033; Mon, 1 Mar 2021 14:47:49 +0000 To: gdb-patches@sourceware.org Subject: [PATCH 40/43] Add support for any location description in CFI Date: Mon, 1 Mar 2021 14:46:17 +0000 Message-Id: <20210301144620.103016-41-Zoran.Zaric@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301144620.103016-1-Zoran.Zaric@amd.com> References: <20210301144620.103016-1-Zoran.Zaric@amd.com> Content-Type: text/plain X-Originating-IP: [2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d] X-ClientProxiedBy: AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) To DM6PR12MB2762.namprd12.prod.outlook.com (2603:10b6:5:45::15) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (2a00:23c7:5a85:6801:b4ed:fe7b:8064:d4d) by AM0PR04CA0073.eurprd04.prod.outlook.com (2603:10a6:208:be::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3890.19 via Frontend Transport; Mon, 1 Mar 2021 14:47:25 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 3209f881-c58b-4414-6867-08d8dcc0ede9 X-MS-TrafficTypeDiagnostic: DM5PR12MB2342: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HHTBt/0nl0nQp3Mn1XK+Okgasd5rySik5NNZDduGkUJQGv8pM5I388nFQRDVV+3lD1twU2iAMN22tpiu9wsNnAn4AkwizCghJo5scVCIfeDSkBZl/QicZI84VKS7hsg0UT9654XEmVApGRoMYT1094LA8Dwm8tb8T1gaqtHvGgWJs6HS8GeWv+rnsfzXcEUripjTi1tPu6CF61Ra1bNTlMhtmst5llfsGLlPTXmvlAenzwZnJHjo8t9J1xuL2I/JaJmqUuZzJkxsHWOAyl3WJ7cU1juEKLA36gDASN3FUFulZzzLdwOJDk/n5UY+oh5XZSbEhoOI7SeAlw1uOS3F8A/pGE8z7dpm1Qjg6Y4+y51CySxVxGnbFfBzcS3Ar0gva8TxBypzVTUQGjK2YE57LgD5HIof/bghQFXgq7QWdLY16K5ZcHUrz/psNo7cQrehWI6DwEeOwWl0MBt7XOtc1VBl6xMEJGyAVFA1S8L2gEyLLeCpmLl43tlYM7gncFulvyntk6oWhS7auYVZBNBBOpGTXxOuJPwRy/MCch35M93laDD7HGxQiCQlqqNGfMmhiQGWt/iRKt/goWrp+0iwnA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB2762.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(346002)(396003)(376002)(39860400002)(136003)(6486002)(66476007)(4326008)(478600001)(66556008)(2906002)(66946007)(69590400012)(316002)(52116002)(6666004)(6916009)(2616005)(86362001)(16526019)(6512007)(36756003)(8676002)(8936002)(6506007)(5660300002)(186003)(1076003)(83380400001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?NC5Sax7lO+RH+MVxACOqAyFOs2+v1VMFlt0jAi4IAfQc1DIrbCOWzEM5q9b/?= =?us-ascii?Q?oeOlm21bB+UYCjccWV4Sv0+BWLH6b7rtDsYhnmryRqnYlRilrZOwmYm0gh8k?= =?us-ascii?Q?PNIm6b4gwfJIBmJmq4UrAINl+VxZs/GjA5iZIFIC+iBzlFsCHgpd6x+vHSeA?= =?us-ascii?Q?SR23pFqMhzxZEDLsRx+/O2xuqwDKCh4u4h7G3alPLrXH6Bd6GCMWCdVmJ8HD?= =?us-ascii?Q?U/2e9NVRQ1lhaHDTtz/+Da2LSFo9QgGYTdPsd2jzDhaYD1gJ/DIb75srjZ2c?= =?us-ascii?Q?pUEzSOdmMwEEbRjMXVTiBMJhDfVEPm4+RvgtMGc+LSth9Y29dCHOegVA8siA?= =?us-ascii?Q?2l5h8OF4sEGqn5IIkSQMrjJ7HlrRx4ZyCHdWPucyhYnNgP+34QAPipE6DXvr?= =?us-ascii?Q?Fjiwo+aZqtsBRJHS3fLthBPn3F+ujOn26ienwcf6ar3v5cf78A1lpTMlAe8r?= =?us-ascii?Q?SHZTw1SMHKUSoTONkSQLoOSEwhykElIMg0DEIfj65pIj3VcP034r7u/SKj0C?= =?us-ascii?Q?ZMfojbWkJg0BO+uxVmE5WKmCUhUMxU4n1+Ba610lsljiHUl+srJelcdbWUT8?= =?us-ascii?Q?5M9KUx2040Q2ghvQ/IXPj9dNy9/9TRzr8CaybXFJFKZNDwerK8ao1AOR5AQM?= =?us-ascii?Q?rkxzm1qg703OnCltNxnrCeZXB3fRZpWViJhs8Q8ECLHQddeBsv0mxHk8wWz8?= =?us-ascii?Q?cvHR8ihZ+LeFBnmoQ1FvcyljfCxrvAoaaEUl5OCrZJEbmQzM/lxO46pPNc2x?= =?us-ascii?Q?+iKZUvGCOHhSI8pJofQmueT5xS+3SpGpLewNlmke8vW2f2R0JgzL1PwQdZmy?= =?us-ascii?Q?smJbK1cc05Kjmu2klfOHECuO7YJ2GYuOHTXPMNwugMtq3PGzsX3FWurY7K6e?= =?us-ascii?Q?uEZeVcMERNwxWrDxe4/g/CfDiqaOGjHKysc7VqBMKKh0nCjK3LhZ+vx8mC5p?= =?us-ascii?Q?YzgROSp2UomRf/7UJOxzWjXxFoDV+yEde+OhgW87BEiRtuZXP/Q49e/hsALJ?= =?us-ascii?Q?KK4Sf1i5nKGbeiJJGsG4BrrO3HbJcRS3ACuJftxhKchXGOsPCbnv/dPlofU6?= =?us-ascii?Q?x+7J5Vf6jCpOV9kzfJbsKOU1S6y6OV5KagTJAzyU7UXhjrlMtz6GLLD1zxms?= =?us-ascii?Q?pIzXLANPyyzV9JAqC9JtYkx5bGy0rGjOZSsNNwprxSF1puOwffh8YF1Ixl4F?= =?us-ascii?Q?eJ9ifP8sWFbWlds/6dESRLWjSn537xD4kWY6bQJu24+34PlBP78hq8R7m3F1?= =?us-ascii?Q?/AJQ0TDi587JUlDi9G5t28G2olqFnwypA9tiSG8BjxGsl4WIf76Ruq9iD11g?= =?us-ascii?Q?izfFsrXkrbHG1DI1ay+DohVWTzaijPtfJr8eTLZg/VS4QSdxz4ooHtWAgbei?= =?us-ascii?Q?Th9GEKVXI4s+qs2X8P3G3410gqJm?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3209f881-c58b-4414-6867-08d8dcc0ede9 X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2762.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2021 14:47:25.7712 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: srJKzVFtG2/mXUvG87tfrZi3sKrdRjPwspEEQbrKGHc3IdOHxsh9RZ2CZ0hm6VeNH4APLwdPh7QwJKq200/5pA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB2342 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: , From: Zoran Zaric via Gdb-patches Reply-To: Zoran Zaric Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" One of the main benefits of allowing location description to be on the DWARF stack is that now CFI expression based register rules can be defined using a location description operations. This allows a register of one frame to be saved in any location, including any composite location. To fully support this feature, the execute_stack_op function in dwarf2/frame.c needs to return a single struct value object instead of just an address. Function put_frame_register_bytes also needs to change to support any location description. This support is a one of the key features to truly support optimized code. gdb/ChangeLog: * dwarf2/frame.c (execute_stack_op): Change to return a struct value object. (dwarf2_frame_cache): Change to call new execute_stack_op definition. (dwarf2_frame_prev_register): Change to call new execute_stack_op definition. * frame.c (put_frame_register_bytes): Add support for writing to composite location description. --- gdb/dwarf2/frame.c | 54 ++++++++++++++++++++++++++-------------------- gdb/frame.c | 37 +++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c index 46cbf7016c2..88f118d6374 100644 --- a/gdb/dwarf2/frame.c +++ b/gdb/dwarf2/frame.c @@ -235,16 +235,17 @@ register %s (#%d) at %s"), } } -static CORE_ADDR +static value * execute_stack_op (const gdb_byte *exp, ULONGEST len, int addr_size, struct frame_info *this_frame, CORE_ADDR initial, - int initial_in_stack_memory, dwarf2_per_objfile *per_objfile) + int initial_in_stack_memory, dwarf2_per_objfile *per_objfile, + struct type* type = nullptr, bool as_lval = true) { scoped_value_mark free_values; - struct type *type = address_type (per_objfile->objfile->arch (), - addr_size); + struct type *init_type = address_type (per_objfile->objfile->arch (), + addr_size); - struct value *init_value = value_at_lazy (type, initial); + struct value *init_value = value_at_lazy (init_type, initial); std::vector init_values; set_value_stack (init_value, initial_in_stack_memory); @@ -254,10 +255,15 @@ execute_stack_op (const gdb_byte *exp, ULONGEST len, int addr_size, = dwarf2_evaluate (exp, len, true, per_objfile, nullptr, this_frame, addr_size, &init_values, nullptr); - if (VALUE_LVAL (result_val) == lval_memory) - return value_address (result_val); - else - return value_as_address (result_val); + /* We need to clean up all the values that are not needed any more. + The problem with a value_ref_ptr class is that it disconnects the + RETVAL from the value garbage collection, so we need to make + a copy of that value on the stack to keep everything consistent. + The value_ref_ptr will clean up after itself at the end of this block. */ + value_ref_ptr value_holder = value_ref_ptr::new_reference (result_val); + free_values.free_to_mark (); + + return value_copy(result_val); } @@ -988,10 +994,14 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) break; case CFA_EXP: - cache->cfa = - execute_stack_op (fs.regs.cfa_exp, fs.regs.cfa_exp_len, - cache->addr_size, this_frame, 0, 0, - cache->per_objfile); + { + struct value *value + = execute_stack_op (fs.regs.cfa_exp, fs.regs.cfa_exp_len, + cache->addr_size, this_frame, 0, 0, + cache->per_objfile); + cache->cfa = value_address (value); + } + break; default: @@ -1189,24 +1199,22 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, realnum); case DWARF2_FRAME_REG_SAVED_EXP: - addr = execute_stack_op (cache->reg[regnum].loc.exp.start, + return execute_stack_op (cache->reg[regnum].loc.exp.start, cache->reg[regnum].loc.exp.len, - cache->addr_size, - this_frame, cache->cfa, 1, - cache->per_objfile); - return frame_unwind_got_memory (this_frame, regnum, addr); + cache->addr_size, this_frame, + cache->cfa, 1, cache->per_objfile, + register_type (gdbarch, regnum)); case DWARF2_FRAME_REG_SAVED_VAL_OFFSET: addr = cache->cfa + cache->reg[regnum].loc.offset; return frame_unwind_got_constant (this_frame, regnum, addr); case DWARF2_FRAME_REG_SAVED_VAL_EXP: - addr = execute_stack_op (cache->reg[regnum].loc.exp.start, + return execute_stack_op (cache->reg[regnum].loc.exp.start, cache->reg[regnum].loc.exp.len, - cache->addr_size, - this_frame, cache->cfa, 1, - cache->per_objfile); - return frame_unwind_got_constant (this_frame, regnum, addr); + cache->addr_size, this_frame, + cache->cfa, 1, cache->per_objfile, + register_type (gdbarch, regnum), false); case DWARF2_FRAME_REG_UNSPECIFIED: /* GCC, in its infinite wisdom decided to not provide unwind diff --git a/gdb/frame.c b/gdb/frame.c index 4578b1acab3..c0d749094ac 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1574,26 +1574,51 @@ put_frame_register_bytes (struct frame_info *frame, int regnum, { int curr_len = register_size (gdbarch, regnum) - offset; + struct value *value = frame_unwind_register_value (frame->next, + regnum); + if (curr_len > len) curr_len = len; const gdb_byte *myaddr = buffer.data (); - if (curr_len == register_size (gdbarch, regnum)) + + /* Compute value is a special new case. The problem is that + the computed callback mechanism only supports a struct + value arguments, so we need to make one. */ + if (value != NULL && VALUE_LVAL (value) == lval_computed) + { + struct value *from_value; + const struct lval_funcs *funcs = value_computed_funcs (value); + struct type * reg_type = register_type (gdbarch, regnum); + + if (funcs->write == NULL) + error (_("Attempt to assign to an unmodifiable value.")); + + from_value = allocate_value (reg_type); + memcpy (value_contents_raw (from_value), myaddr, + TYPE_LENGTH (reg_type)); + + set_value_offset (value, offset); + + funcs->write (value, from_value); + release_value (from_value); + } + else if (curr_len == register_size (gdbarch, regnum)) { put_frame_register (frame, regnum, myaddr); } else { - struct value *value = frame_unwind_register_value (frame->next, - regnum); gdb_assert (value != NULL); - memcpy ((char *) value_contents_writeable (value) + offset, myaddr, - curr_len); + memcpy ((char *) value_contents_writeable (value) + offset, + myaddr, curr_len); put_frame_register (frame, regnum, value_contents_raw (value)); - release_value (value); } + if (value != NULL) + release_value (value); + myaddr += curr_len; len -= curr_len; offset = 0; -- 2.17.1