From patchwork Wed Apr 5 16:07:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 67400 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9FE743858404 for ; Wed, 5 Apr 2023 16:08:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9FE743858404 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1680710901; bh=bDzM/wq+DCw1GyWzI1XdgHdcKlekTuTwbNcL/r7Ursk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Help: List-Subscribe:From:Reply-To:From; b=T+Yw1yv62lFMUPLrKHP3zmxI6d5ZBXFr72jx7nmOM0pKWga8ryNRaLYOrNeKQTavj osftLkYzULEl6Z9RFQoZZYd6RTjWOLrQQlwXVeTxYr/iCiLQtacT3dw84Z9T1znWP7 QtqL+nQ9CBLc8soguoEN/5ZZkXQykpOkOxEB+GBI= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id A44283858D20 for ; Wed, 5 Apr 2023 16:08:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A44283858D20 Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-331-HaZ0S4sXOA283FtfMDZBAA-1; Wed, 05 Apr 2023 12:08:02 -0400 X-MC-Unique: HaZ0S4sXOA283FtfMDZBAA-1 Received: by mail-qk1-f199.google.com with SMTP id 206-20020a370cd7000000b007467b5765d2so16527439qkm.0 for ; Wed, 05 Apr 2023 09:08:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680710879; h=mime-version:user-agent:message-id:date:organization:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bDzM/wq+DCw1GyWzI1XdgHdcKlekTuTwbNcL/r7Ursk=; b=M7VWXcZtIYhp7y4I6HAwJxAPajA4j2SiOhVAk9b5/yzQ3QH12PgrI3YFXhMCLhNqNF 2a301a03/UeS5S2GspNQ2pbhom/4VaM2GeKCPGrowH/D2fRSyOQH+W06sUYNEtEVFFcT W1xG+OqsbBp+N4reltt60uVySxpkmmlL9mDJuUqjLXFFL/NPLIGRGbE/soniZJFUfI83 dBa8Ds4T8mntGGekVBFK3IjI2wJniBVL8UyqahX2TxtWBwJkgAZwSZLvu8RLWiTD72s/ f+sgmPDcGxMkaw9e72CZaq9+sRBz84uY6siSs6ztPGtj5UaRHvAm8oHUMmEijfcORl8r A2tQ== X-Gm-Message-State: AAQBX9cuxNL6WNaRULRjkbx+SIVfp8zKgGuFkbqIAcqbQf7XvIURgfRz UwdjhB3ngnL03NPH1F2d9L1Ysxs+cAnpaIqJV464t3QSb1g86T1OqDBQQfxutVO+Hn4Z/NoVEST of7rgL+2Ez0nA4qnbDKV8ZiOIPzrPU0m0YNpmWjqF5vHrMBOujqmCQT2/Ae0FvOFuKhXPe9Dnei zy X-Received: by 2002:a05:622a:1749:b0:3e3:86d4:5df0 with SMTP id l9-20020a05622a174900b003e386d45df0mr5808741qtk.55.1680710878894; Wed, 05 Apr 2023 09:07:58 -0700 (PDT) X-Google-Smtp-Source: AKy350ZOy3syKC8mb16ZOVQgwfMxjAs0ZcNB0VdOvN/HiUePIawDpTNvr4imxMjRXtPRo96eM02G4w== X-Received: by 2002:a05:622a:1749:b0:3e3:86d4:5df0 with SMTP id l9-20020a05622a174900b003e386d45df0mr5808689qtk.55.1680710878365; Wed, 05 Apr 2023 09:07:58 -0700 (PDT) Received: from localhost ([88.120.130.27]) by smtp.gmail.com with ESMTPSA id j129-20020a378787000000b0074a25a59667sm4020097qkd.115.2023.04.05.09.07.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Apr 2023 09:07:58 -0700 (PDT) Received: by localhost (Postfix, from userid 1000) id A67EE581C79; Wed, 5 Apr 2023 18:07:56 +0200 (CEST) To: libabigail@sourceware.org Subject: [PATCH, applied] dwarf-reader: Support DW_OP_GNU_variable_value Organization: Red Hat / France X-Operating-System: Fedora 38 X-URL: http://www.redhat.com Date: Wed, 05 Apr 2023 18:07:56 +0200 Message-ID: <87cz4il3c3.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Dodji Seketeli via Libabigail From: Dodji Seketeli Reply-To: Dodji Seketeli Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" Hello, This solves a crash that happened with self-comparing the package 'aws' in Fedora by doing: $ fedabipkgdiff --self-compare -a --from fc37 aws When evaluating a DWARF expression with eval_last_constant_dwarf_sub_expr, indirectly called from die_member_offset, the DW_OP_GNU_variable_value appears not being supported. This patch adds the support for that. To help with figuring that kind of issue in the future, I have added a few asserts in the code of op_is_arith_logic. * src/abg-dwarf-reader.cc (op_pushes_non_constant_value): Support DW_OP_GNU_variable_value. (op_is_arith_logic): Add a number of asserts and guards here. Signed-off-by: Dodji Seketeli --- src/abg-dwarf-reader.cc | 44 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index 4b43cf54..c0a35bca 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -7952,6 +7952,10 @@ op_pushes_non_constant_value(Dwarf_Op* ops, next_index = index + 1; break; + case DW_OP_GNU_variable_value: + next_index = index + 1; + break; + default: return false; } @@ -8119,13 +8123,16 @@ op_is_arith_logic(Dwarf_Op* expr, Dwarf_Op& op = expr[index]; expr_result val1, val2; + bool result = false; switch (op.atom) { case DW_OP_abs: + ABG_ASSERT(ctxt.stack.size() > 0); val1 = ctxt.pop(); val1 = val1.abs(); ctxt.push(val1); + result = true; break; case DW_OP_and: @@ -8136,87 +8143,114 @@ op_is_arith_logic(Dwarf_Op* expr, break; case DW_OP_div: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); if (!val1.is_const()) val1 = 1; ctxt.push(val2 / val1); + result = true; break; case DW_OP_minus: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 - val1); + result = true; break; case DW_OP_mod: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 % val1); + result = true; break; case DW_OP_mul: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 * val1); + result = true; break; case DW_OP_neg: + ABG_ASSERT(ctxt.stack.size() > 0); val1 = ctxt.pop(); ctxt.push(-val1); + result = true; break; case DW_OP_not: + ABG_ASSERT(ctxt.stack.size() > 0); val1 = ctxt.pop(); ctxt.push(~val1); + result = true; break; case DW_OP_or: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val1 | val2); + result = true; break; case DW_OP_plus: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 + val1); + result = true; break; case DW_OP_plus_uconst: + ABG_ASSERT(ctxt.stack.size() > 0); val1 = ctxt.pop(); val1 += op.number; ctxt.push(val1); + result = true; break; case DW_OP_shl: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 << val1); + result = true; break; case DW_OP_shr: case DW_OP_shra: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 >> val1); + result = true; break; case DW_OP_xor: + ABG_ASSERT(ctxt.stack.size() > 1); val1 = ctxt.pop(); val2 = ctxt.pop(); ctxt.push(val2 ^ val1); + result = true; break; default: - return false; + break; } - if (ctxt.stack.front().is_const()) - ctxt.accum = ctxt.stack.front(); + if (result == true) + { + if (ctxt.stack.front().is_const()) + ctxt.accum = ctxt.stack.front(); - next_index = index + 1; - return true; + next_index = index + 1; + } + return result;; } /// If the current operation in the dwarf expression represents a push