From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2056.outbound.protection.outlook.com [40.107.244.56]) by sourceware.org (Postfix) with ESMTPS id 419C3393D02B for ; Mon, 7 Dec 2020 19:01:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 419C3393D02B ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Go1cfjIxyXvsMCquZzeLYGvtLJjtE31VeutcVC0ka5fiv6vxoVzE80U2PiJPkaIQCydDn606j+Gcp+vF499Tr/5RYA+Sy6tL6ClP6ka2qVncJy9J987EXG71TkC66P7OrrEAjCm+afztkzlZaxPSZx8ozYPyr+wFtvlaWMMZY6TTxuTIawfsRAPQyuY5MzXOh3sADPlElSV0v0KF4jjLVmKnlPE7qBJZpgPWFJnC92O6pVJWUX3LRIx7Aso4CMoycNMj8eXr2odkyT9hKuN/D+2l0YcmTWl806hIdXRG0CDhS0Zp8FYrT1uyE1uW3qODuf4nMcwh+pbWsYwgVjsbjw== 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=dLM1sVaxd+p7Jehp3cZSvkyy6oWPcjWCFpY+GTc6TJg=; b=YC4m6dSCWuCoFmAO9yVc/MxAY9IwwN+xQR4njJ3wTF7O4c6cdb602g8yFbRVTv6P4WIL4DcDLHBVPxL6mnZEHmChASddFoJxlvSlVBuKEOPYRMKS3s78glK9tLiLGpE1x0L0+BbOTJggCNvpW7luD6K27K//psfX3TR1U/pM4uC38AIJddpOoBiX13dbMuHHPYmu4XiSIIZOrhKTGZ+sFxtfSdX7J1DgVRTwhucWGOmj6qyyWRK09JHbKSZdq8M33gY5ATBRCqQ08FyX1uvxPVLDJS4fshSvp7r7qrtI6hwpofY9vnhSs3A619bZ2JVkZF7m45vv3iNAi+6FA1FVpw== 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 DM6PR12MB4561.namprd12.prod.outlook.com (2603:10b6:5:2ac::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3632.18; Mon, 7 Dec 2020 19:01:35 +0000 Received: from DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::6841:61df:984b:b3c]) by DM6PR12MB2762.namprd12.prod.outlook.com ([fe80::6841:61df:984b:b3c%3]) with mapi id 15.20.3632.021; Mon, 7 Dec 2020 19:01:35 +0000 From: Zoran Zaric To: gdb-patches@sourceware.org Cc: Zoran Zaric Subject: [PATCH 27/30] Add support for any location description in CFI Date: Mon, 7 Dec 2020 19:00:28 +0000 Message-Id: <20201207190031.13341-28-Zoran.Zaric@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201207190031.13341-1-Zoran.Zaric@amd.com> References: <20201207190031.13341-1-Zoran.Zaric@amd.com> Content-Type: text/plain X-Originating-IP: [2a00:23c7:5a85:6801:5c7:2db6:d2c2:ae4e] X-ClientProxiedBy: AM4PR0101CA0053.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::21) 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:5c7:2db6:d2c2:ae4e) by AM4PR0101CA0053.eurprd01.prod.exchangelabs.com (2603:10a6:200:41::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3632.17 via Frontend Transport; Mon, 7 Dec 2020 19:01:34 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 239cb763-c0a6-4e9a-b0e1-08d89ae28497 X-MS-TrafficTypeDiagnostic: DM6PR12MB4561: 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: RFYzBLkg+YDgmy43bzXfDjoAnrSjmSqQdZ1PJsi+sSP+GocCZKgvI2OsnhavyVuByzb/8hz1YgN1+uc2Oc7FKkl303VZrz8o+YWOK5S541uSENuWLmZp99Dgk6Esf5jWEqoHxlPc13eEaUH7Nrq3sjNVq0njh4ucNCnkuR8cOWAwr0p31W6GLBlu79NKvZaqTcWbnFn6d0KF087XcAt+eGnQ5OnuuqD0RGtXdvnFRSuwTs6dHdcoSeQNQvDYA40JnMtUHUa8uTvII2dfIdaKht7Q0RV5k0AZMmO2HifsYlilVAg+MzypkNNJT37FHqB511dqTn1gxx6kmn9iQ9iuq+gLQB5h7rfGY/t7UywNIbAQojemYUe5BVcaBbx99D1G 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)(376002)(346002)(39860400002)(366004)(136003)(396003)(1076003)(83380400001)(86362001)(6506007)(4326008)(69590400008)(52116002)(36756003)(2906002)(6512007)(8676002)(6486002)(16526019)(2616005)(66946007)(66476007)(66556008)(6916009)(5660300002)(186003)(8936002)(478600001)(6666004)(316002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?/waOaHLtw2wceOlgflD5+vAbf3Ug+/W4jIx9xJqqGSGQusuWpziUGVAh6Sfu?= =?us-ascii?Q?d1tLBdp+xZbAFiFovlx7jnNP67jJktfJHv12Q5KlXfL4Vhm3FqAmwTikmDyj?= =?us-ascii?Q?EznVkiHp7DHcyuhQvzboZg1cMKyutMLCGooHvk7LVRLxk40yLWQOhVUWLieh?= =?us-ascii?Q?74jwOg7W9ctLLUIG42O2XBPi982ayPvmx6i1RhLhKwGpMkyq/GowlpROExKg?= =?us-ascii?Q?1swanoW1Y+eOnoT64Lg0o9+Rk3tTGQPe5/BVeEDR5tv3C/thfvu2oX7s3ftQ?= =?us-ascii?Q?1znmINUqZZ/GJdc6qPyA01fMlJUY6a0rJ8pRfAzN81GLnUBlxm1eMsDYGet2?= =?us-ascii?Q?u6b3XJy/YXT7C3L8MHiz+CE9X2lQKDALeb5+tknALMCI4zjgMtQ1/oUQWjy9?= =?us-ascii?Q?Z3k1VtWBrJOVw2/5w1fpyyRF4LxwY1rhBNQoc+bVfzx7G0dEV/jPTKqtqRAl?= =?us-ascii?Q?GRlhP0uS7641L+bdL4ALhTmRYEHp+r0k7OqKrDLKuzbkZz3K5uF3D58QmeOP?= =?us-ascii?Q?kGmneSMJOKMH9+VU43DsrdRuvBDkZDx8owiL2aULqGDQ37Vwac8H0VF3rKp6?= =?us-ascii?Q?ZKPzkkyX1OMH3glgsMtDcLNJO/8JLcudLHe4I0JhYJ1+iNrpxmpctgcpSDUb?= =?us-ascii?Q?1kpxzFJ8Wr1Ik7Pf9/95jS51f3e2tBmfMlQ98zfoOLyAg2VMAl/50LfvxLLo?= =?us-ascii?Q?JGbH7FAcsB5B4VJl6h6wKzq2vM7kTW3D2v5nVsFjRrVhOD+p7bU9UiVaExrD?= =?us-ascii?Q?QabYCdX4BZTZxB9Er3E/G0/8yFyDGB4bvmdW3BqI4zz5J/TDiUa6KuEA+lsl?= =?us-ascii?Q?FofaqQHaSnGpbuLbVXdmYblddI9uWV4WDl05jY6ePK+actFCzz1cw1WiLhbP?= =?us-ascii?Q?LIr/qrVybF7o6LOp41rQHhh3KfqsJe5DqjoIw9u6uQJW15dcJoepZYrlKd+M?= =?us-ascii?Q?KpASmHcAHbxXE+xonXQzmFALqOZQ0lYrUjk0mF5Bb9EGq17MgDnerSGWbigh?= =?us-ascii?Q?8dHzUYnAPDi+ryghNt4PflN+iR/ZMfmIZ7yPHd6ZVzf1R8SrumWORssXJLun?= =?us-ascii?Q?3rUmryf+?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2762.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Dec 2020 19:01:34.9685 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-Network-Message-Id: 239cb763-c0a6-4e9a-b0e1-08d89ae28497 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yaotWAxwo/6MkcvnkOeb51XEuHg3XBmi37nhua4LJnecWbFt6m4d5a1tUb7+pnnUHr+/Nxg5WsGQQjutsakpOw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4561 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, MSGID_FROM_MTA_HEADER, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP 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: Mon, 07 Dec 2020 19:01:46 -0000 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 | 36 +++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c index 1469621133..e83031d1a5 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_eval_exp (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 4618da6c81..0068bf8455 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1567,25 +1567,49 @@ 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; - 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