From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2060.outbound.protection.outlook.com [40.107.237.60]) by sourceware.org (Postfix) with ESMTPS id 204D03858D35 for ; Thu, 4 Nov 2021 15:09:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 204D03858D35 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BVBd5C7do1GM2nxAZHXR7nvjEaglXVu4G7c3AEJztRLoBlVOiIMPoheJfFmY4rnzL8QHYLSKdJJ9tp7ynRaqqh2fvjwlqZ2wbgaPVCHMS77eNv1jISbkuk7e9D2QpDlZDMuGHLDXLKn/j+xNYtUFwuQvFcBCV/LfIyC/U16K9E/JFLPUfr++Ft4PyCqWi45lWX43GENOZAGsbvBYBP5BRrUkiXCKaUbxlZNOPKYJyyw9wE2RBVc3vJzg8NRm7SE0Y6NJ3CZYz9Pzscf7FlBvlGxYK18ceEWnh/+3VhxCoB5e4/uCdBKUm2umuOwKeS2AkLHnULh5u+txzQz30pPTfQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=gM9jhme/ZSzWfKTF0nDuDt9CJcQLdkStuR0Kyf+mM1Q=; b=C+gXRENygOY4PdOqOEr8h0Km3p5ImvE47daibyA+z1MZ4Ul7eEQLiK9G9UpP+kbXFxrN+qKyzHWbalAowkZbF1wLc3i7Y/DslnodoCYHUdOGqSc49HH4D4FVzYLnSx0zsshMEbUMUxzNRVlwIZqH0IfY6KW6qNHefck458HYFyzaP4q0i3CDM0SCBITneEKKuAp7eBh2yDk74dnPQ5UYtvUD6nZJZYPwB0Gfnyqfl0T/pxLfz4/Y2wilKMFAM1kz0gFDVDPC+DwwbC9SUELn195rUvGTwhgTf7+eVh1/IBerXvukhKnYDHJ2NuCcKn15/z4AVygsUF5X9zaovXz2VA== 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 BN9PR12MB5065.namprd12.prod.outlook.com (2603:10b6:408:132::12) by BN9PR12MB5257.namprd12.prod.outlook.com (2603:10b6:408:11e::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4649.14; Thu, 4 Nov 2021 15:09:37 +0000 Received: from BN9PR12MB5065.namprd12.prod.outlook.com ([fe80::f908:e014:a94:a35]) by BN9PR12MB5065.namprd12.prod.outlook.com ([fe80::f908:e014:a94:a35%5]) with mapi id 15.20.4649.021; Thu, 4 Nov 2021 15:09:37 +0000 Subject: Re: [PATCH v3 23/28] Add support for any location description in CFI To: Lancelot SIX Cc: gdb-patches@sourceware.org References: <20211014093235.69756-1-zoran.zaric@amd.com> <20211014093235.69756-24-zoran.zaric@amd.com> <20211031225757.3kvczlsig7lfyzvu@ubuntu.lan> From: Zoran Zaric Message-ID: <393c6248-113a-cd26-e00b-c02fa10ab82a@amd.com> Date: Thu, 4 Nov 2021 15:09:31 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 In-Reply-To: <20211031225757.3kvczlsig7lfyzvu@ubuntu.lan> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO2P265CA0216.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9e::36) To BN9PR12MB5065.namprd12.prod.outlook.com (2603:10b6:408:132::12) MIME-Version: 1.0 Received: from [IPv6:2a00:23c7:1093:6301:5176:73b0:d1d0:121d] (2a00:23c7:1093:6301:5176:73b0:d1d0:121d) by LO2P265CA0216.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9e::36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.10 via Frontend Transport; Thu, 4 Nov 2021 15:09:35 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 068ad6a4-e5cf-4838-1bd8-08d99fa51d6c X-MS-TrafficTypeDiagnostic: BN9PR12MB5257: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5236; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: oa5kTSasdOzd1IqSiHT3oMvgSmkkuRVKwfcOrM5dU/msrTxRqF8ndRjAl3UdiCShk4+NXrFX3+8UjsSqvmsC0vkkODBmQmJ8P5xCxB8xgzbRJbwRQzWu7Uo6ugYd/d1gzne0wpXCbQ8XThLeB7fBrINFhsKt4gLB9GQntHutERmdfrJ2F6j+1O9db6vJWa0n+La7Y187zgP/OriuEtFmxbvO0seucuBk6glgsaljdptSKD6HtylpUo/XYv4SUk5TANpoAaQ1TKsl9MeKm1UHfsJjj4Su3zJCa/inWSIx4jZ3BvKlJEI+QgN/WD5Tk3H2Yyy/YznxkNN0v55EOtUa1JYa+Fjcz4vzZSxDSxLFrCo8PoQ0MiqWax6B0FsezLzNGCeH34FTEv/3yEJYZYlGwHF3qjeuiMzoXZ3IhtqREIRIiIiwsCcTF0iHs0gaICoDfuSzSjhhazvoLG+Aq7Up+++Jn/ZwkIjY26xEPAAxrj6/Pb2CP53TFAQpDXoE60ne3wg8ypTJS5tzWqc1ZCF3H/eFE4SLDTa+ne83IleXcWfMjFhQqp+62iyLn77dTcPC/oQFNC1b/a2HIJRC56nD72Dji+6+wpBu1r35Z5uhrH9aJEXUWQCioCIcYXlYEzFZv2N3uPEAPNIochi3VYRJOmg/bSHhdZGzPVUxjmCBNrPCNJOjYGhJsu3u0bL7tpqyBxmlI3Pl7CwQLV5OxM2ij9pgRk+kCw6CR83DPXoYBTY6Zmi9jGSu6GQh+CHjoupA X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BN9PR12MB5065.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(8936002)(316002)(6666004)(2906002)(508600001)(36756003)(5660300002)(38100700002)(44832011)(2616005)(186003)(8676002)(31686004)(4326008)(66946007)(31696002)(66476007)(53546011)(86362001)(66556008)(6486002)(83380400001)(6916009)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cjNLM3I5b2QxZElJWFZsbEM0N3k1SmliZUVOVnFkWWFoSm1YQ0RETFhUL2Jx?= =?utf-8?B?YUl4NUo1dWZxS1dJMHowQ2xEVER2T1Q1elFHVkFQSk9Pc2ttMS9JZVZobFN3?= =?utf-8?B?T00xMjJMQkN1elVSNWhuc29peGxEL0U1blRXVmRMbmxEZmV6dHN2ZnI1UjlM?= =?utf-8?B?U3BMcTFoNm9QRDQyOWlCUkNsNllqdy9MNlY2aStvcTdxMTc5a0tkd2JOQi9q?= =?utf-8?B?MjMzcFRSOHlwMTloL2JFeHc0dUtrVTRiUDAybGpGd3RQeWZ6QjB6ZUFJNHpS?= =?utf-8?B?NXVSWGZVdHpwYllVVWUzRFNFcjZxa0VNci9ha0QvNncvL2p3dWhxUkZpUWJ5?= =?utf-8?B?ME5LQXBSTTEyVmMrU3hVdFZQVVNmNTQzem05R2EwcGFpczkrYjFhS2Y0QWFD?= =?utf-8?B?WENHMCtJMysycDd3ZFZlTERVOWgrUXdaMmZwZnRZNXg2aG8rUTNyb3F6bTdh?= =?utf-8?B?YzhQamxpWXZZWVpWWlR0WEhDek13VmFDSUpMa3p3Vmd5amxYVmp5QkEwdmZu?= =?utf-8?B?WjF3N3BkbkpHTDlubHRHY1ovRVBhZEZnVzJJTTJYcEkzQ2kzRXU0UmJvSW5t?= =?utf-8?B?aU1jWG00UnY1aTJBWjNkZEY3aDRGUGlvSS9zMGRtWHhtM1BNZHRWK3RuWnBC?= =?utf-8?B?S05pNUlCanpWOHVWTzBJUXJJdXdzUXFlNFVUcEVYd21kZE81LzZJMjY3ZFJa?= =?utf-8?B?SFlIdHlteXNDL0pCVitqc1dzaUJ6N1M3clI5Z3pvUWlmbTQ2N0loMTVPVEtv?= =?utf-8?B?SElsbGdHeFBsSzJ4V0ZnTFJ1QklGVlVMUzN5N3NuV09EMHY4S0dHYTFsd2RZ?= =?utf-8?B?R0gyaHpNTjIzd0xIdEtobDNPRWZLMDFOQnBRUGx5Z056L2IvQWEwZVVjcHN3?= =?utf-8?B?bmhmd0c2T2FnL2xzcnhmNnNhOVhkS2pNK2dkbUgwbU1qOWo2dnNvcWpmVFhT?= =?utf-8?B?bXo2MUt2NkRaMnVLYWk4V1RmSEd0M1o5UzgzYy95ckVWaGN6NEJsZzhpZ2ZC?= =?utf-8?B?cURBYmVaM09TTm5GNlM4WjJ0cGJIRmtRVVIyN2MvMHQxZXREVnlZQXk5KytD?= =?utf-8?B?WG1LcGRBWkpwOGR1SU9PM3hJQmIycURJNUE4Rm5pck5UOXM5NU8vREk2Z1A3?= =?utf-8?B?aC9PeUorOU5YYjZaL3pGWG9DZzhJbnFEbUVJSmxIMklraTkyWXpISFM1bUZH?= =?utf-8?B?NEtIdzUyRG9xNkQ3WEpieGFndkQ0K1laaVRPUVB3TGlvdzFtaThhM0FOei96?= =?utf-8?B?TDQwT283cVRpZkQwUTRNOW9jblpzUFVpemtEUGdBT2h3enRCMER5UjZGSGJl?= =?utf-8?B?UGJxN2hKWFhXekRYN1I3WHJNbW1uVytIVjZkSkx2bC92VWlRSVllL3QwQlp2?= =?utf-8?B?MGFiTmdMWm5yR0t1eGtvRDVEY3o2OVM5TFIzVTNQSVllQ0JoR1pPd0NaV1Js?= =?utf-8?B?c0lEM1IzcFNvUlBJS2hLVzQyNXd4QnlvNU5FaitWSDJlRDVpRU5VZWdYR1JV?= =?utf-8?B?RjMyekxZdjVuRjFGOXBjNmhYQ2VhOW1pbkdsUGxLejVFTndCeFByVnVRa2FN?= =?utf-8?B?WEV6ZmYrakZjZWtLbkt1T3BaMjhkVkJWbENBVEZEeTdEd08ybEJWNm5zQ1hU?= =?utf-8?B?NVZzdFh2cWN3b1RXTmFJbVJOQjJKQjh6ZXdLUGE4M1VoYi9qUEMwbHRmeHVK?= =?utf-8?B?QVkzR09iODdtM3JTSG91R1J2UndsKzF1OWNDSms4bGtGMUNxakN1TzNkMHdF?= =?utf-8?B?Z29iN1MxcmtYOFV6WXV2NGtuUWhMWkFkMFR1MzAvcGJsS2gyMUY0dHNPMmVI?= =?utf-8?B?KzBwblJmQnpNbEFHNEc1RURHVTFabmJqcmJmSUxRNDFiR3J3NEZJaTZoY2hX?= =?utf-8?B?eUtvY0twT2piMDBhZFpLejRTaXRxRkRBU1VKdktNMFQxcmEvdnJkb0hYdVNm?= =?utf-8?B?UkhqMlhCUEdaT1NHenY1NVphRkVzQ0IrWkJpdVZlS2JWR0xZZWIrQ0ZXRTU2?= =?utf-8?B?MkRORXVNTXpZMUpYdHFxQjkxMjZJeTMwYnFHMndVbEdhck5qTGtMZzAvY2xl?= =?utf-8?B?TmR4c2xPaDFCaGZkUWh6MHZLb2pDSnl1dGJVZkszR0tyWmcyZWhDUHM2ODly?= =?utf-8?B?My9UU1BQcHdaYnExQlFSdDJpcVBqN1c2NEx3MitFcy96RkdKV1FpQ1NOZjBY?= =?utf-8?B?Ni8zNWtic1ZxTmY3Z2NXVkRMMTl4NVNtcVpGN3hSeTF4d3VISDZxejZQREJz?= =?utf-8?Q?RWdNB/G2X6Gkw2NfcdulqmD99UauzybgUsEzSRyi4Y=3D?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 068ad6a4-e5cf-4838-1bd8-08d99fa51d6c X-MS-Exchange-CrossTenant-AuthSource: BN9PR12MB5065.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2021 15:09:36.9207 (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: wk8dDC5M/diLTse9w2v6sEAsYsIsyb4eZW/PMBrEfyfHxhF5g/tu047gk1Rkv7av3NsYVcyhmP07QALbMwFKuA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN9PR12MB5257 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MSGID_FROM_MTA_HEADER, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Thu, 04 Nov 2021 15:09:42 -0000 On 10/31/21 10:58 PM, Lancelot SIX wrote: > [CAUTION: External Email] > > Hi, > > I have included minor nits below > > On Thu, Oct 14, 2021 at 10:32:30AM +0100, Zoran Zaric via Gdb-patches wrote: >> From: Zoran Zaric >> >> 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 e17b36e243b..e70dcd5a86e 100644 >> --- a/gdb/dwarf2/frame.c >> +++ b/gdb/dwarf2/frame.c >> @@ -236,16 +236,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); >> >> - value *init_value = value_at_lazy (type, initial); >> + value *init_value = value_at_lazy (init_type, initial); >> std::vector init_values; >> >> set_value_stack (init_value, initial_in_stack_memory); >> @@ -255,10 +256,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); >> } >> >> >> @@ -989,10 +995,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: >> @@ -1190,24 +1200,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 16673258373..3d85d2c7b59 100644 >> --- a/gdb/frame.c >> +++ b/gdb/frame.c >> @@ -1532,26 +1532,50 @@ 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 > ^^ > There is one extra space at the start of the comment (and in the > subsequent lines I guess). > > Also the comment related to a 'new case'. From the perspective of > someone reading the comment in frame.c (not in a patch), this just like > a special case. Maybe rephrase with something like: > > Computed value is a special case. The computed callback > mechanism requires a strut value argument, so we need to make > one. > >> + the computed callback mechanism only supports a struct >> + value arguments, so we need to make one. */ >> + if (value != NULL && VALUE_LVAL (value) == lval_computed) > > Prefer nullptr over NULL. > >> + { >> + const lval_funcs *funcs = value_computed_funcs (value); >> + type * reg_type = register_type (gdbarch, regnum); > > I guess funcs->write could be checked to be non nullptr before > retrieving regtype. If 'error' is called, reg_type has no use. > >> + >> + if (funcs->write == NULL) > > NULL -> nullptr > >> + error (_("Attempt to assign to an unmodifiable value.")); >> + >> + struct 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) > > NULL -> nullptr > > Best, > Lancelot. > All valid points. Thank you, Zoran