From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id nNmNN7egoWp5ijoAWB0awg (envelope-from ) for ; Wed, 09 Sep 2026 14:08:55 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=b2B0kQs4; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id CE7401E09E; Wed, 09 Sep 2026 14:08:55 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id AC83B1E033 for ; Wed, 09 Sep 2026 14:08:54 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 375E44BB24E9 for ; Wed, 9 Sep 2026 18:08:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 375E44BB24E9 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=b2B0kQs4 Received: from mail-oi2-x10.google.com (mail-oi2-x10.google.com [IPv6:2607:f8b0:4864:32::10]) by sourceware.org (Postfix) with ESMTPS id CC3994BB1C19 for ; Wed, 9 Sep 2026 18:08:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CC3994BB1C19 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CC3994BB1C19 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:32::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788977308; cv=none; b=d8nPB8ZNp0UsA11XwdZSncb1mh+78i/551XNNHHT+B+zewc5GIzp5cbcbhkY2ETWzjzmFCi+lD88AMFDx1nUAss+gFL0hCbyPCRhR6FRxLflfpIAtICQFlYZ9YhW7tEQJqLqs6J1oF1hmEsgsBYbaldK4jQRIhG8AnleSeNUe7A= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788977308; c=relaxed/simple; bh=JjmC1eAXPxT7EJM7L5c7mgTqs+9zNoLF+xiztYZtTHU=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=aeVA9v4tK3lEIxdjgSh4F/b06IADj7IpkNte5WC3cQ5Is2vP0dkPHPJEcNoaSiFIgfhGUReTZjTDITSyaEdhzKmZJ1ASR2YIqQGRK/orbrlp1dkcxMAEtRLJhKn/RK4MylbDWrjEJV2ycaNvxZctYGCPTMblIf7Mh8RZJ21Jhss= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=b2B0kQs4 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CC3994BB1C19 Received: by mail-oi2-x10.google.com with SMTP id 5614622812f47-4b37a36887bso380576b6e.2 for ; Wed, 09 Sep 2026 11:08:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1788977308; x=1789582108; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=PtbYI398nzRLRbpX/s7rbW19ylnWojwfkQuN8vf+Jow=; b=b2B0kQs47CoXqk44VRrSr7aZGfVE+ZfNwxB5Ii53zJjlXUB8TGbDaFhy0odBDMG4WX T4fHHnqwnHhS9SJcC8cA+j3A9l52x4Qg7sg+gnQk0JwsAYy1H3lCX+Pvk4Fi9w+0Ecj6 g85IGFujdQ8Kvqm5touacQLfIv2sVNesa3AC8RZrRsZcqxKCv92hFA+3+xDn+/Deea/6 lmD8w2ektfcThZIeTQJFti8Ksb9wdH79kMssfwqydFCC19F3M5Yul8Q1Inqk9EjGA9gg 4Pxv0jyY+Bdk2ecwGob+s8WDIsE9T+X20eGcz+2AaUk1LWfXjIE1YKT7qJwXS4luPAvl j/pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788977308; x=1789582108; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PtbYI398nzRLRbpX/s7rbW19ylnWojwfkQuN8vf+Jow=; b=fElMuAlGKgeY5asEPptTXdxI9lrfxRTiIZV4QCQVZJAqcqJ2vJXnGudxFRd773RB5W ZRpaSEVpXtGsyCtm/uQpQA+Yne3K8VSZkKyosTFzaIiTcisbCOsJAxEX4tiprJ7hyHLA hqCR/+C4FxJ1sfuIPmdxm1ScDTDT4ZYZ19JUCz44rlZ/IqztyrVD8CbAbvtlT0umWO9T L3U4Fm4jKNmm7LFsaTOp6CpfgEmEDZAXqKVBAd6Pqy5YVYmLxITA8Gq1+VXr0B0OBjd/ cf5Ck/3dNBT0ORJ+4F3dv8oASV4EM6sYsqWS1d3TW/ceWHzt2A4zJJ4zcKg7amN2uNKl i6yw== X-Gm-Message-State: AFuF++lNywACmds+hlcU/XndvzlKFqi18Q0EU69CHQgvoB+7WHfY5rpS vgCEmkaxjmVo6dZSAasx4XfBORElkX33p3rtyr4dQF2LK3tJqvMrUHNiudSO3hZ0EucmrKxdVDP NnNJ7Xg== X-Gm-Gg: AYBFou07OHT2BM/Vh0ozjOwtXUSK6KsP4DyV5pMwtvNU5GlfR+3HjrSq0DS2L3giPBK JkPVzb0bXhfdOahHZoDHUg3uPjqSCsXb/h3MTg/5FOS4KP6+ndUa7iGDtilcMFN5lLPVEtfGF1a WU62kbrQlj3cHYR+BnMum0DZvgG4403hck8foosU9rtHySTAXZdmKU7XrV/nKDFoRy9MINBywjE Vwxi/ZiSiJMtOnwgTJejwgxeGULQOnY8mBA2x12MDY0nf3Y8m+sCJN+s6w4O7IxReJYK3JRKb7u lTSyOnGPfBlR4PW8Bc9otZKWtj7eJ7fXAwVxxADH54z164p9JVKXOTdHp1eLDil5MKets6/oGh7 y297R8Ok0x2K/deEzApggubCPWISsWHjgzAvUEuglsCI6xprJJNBemy/d3+GiL+2HDxGkxxQRKy ixjHtrF9Gqmk4k0Nb/a0De7tQfny3skCnzUK+aDmuuDOnqpDRJvc0LyZPad2lP6b3N4T2Lvk7bI 67C9h00gfzBG4E= X-Received: by 2002:a05:6808:1506:b0:4b9:a8ac:47e with SMTP id 5614622812f47-4c141ec9dc2mr1783840b6e.28.1788977308031; Wed, 09 Sep 2026 11:08:28 -0700 (PDT) Received: from bapiya (97-122-117-2.hlrn.qwest.net. [97.122.117.2]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4bbafa0b8casm11662196b6e.5.2026.09.09.11.08.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 11:08:25 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Rewrite gdb_mpz::export_bits Date: Wed, 9 Sep 2026 12:08:22 -0600 Message-ID: <20260909180822.2255847-1-tromey@adacore.com> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org A couple of bugs point out that, when multiplication overflows, gdb does not compute the correct result. This is caused by some bugs in gdb_mpz::export_bits. This patch rewrites part of this function, hopefully now getting the correct answer. I think the new code should be somewhat simpler to follow. A new selftest is added, derived from the code in the bug report. This rewrite doesn't try to minimize allocations, the way the previous one did. I tend to doubt that matters, and this is one of the readability improvements IMO. Regression tested on x86-64 Fedora 43. I am not sure but it might be worth applying this to gdb 18; your thoughts appreciated. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34601 --- gdb/gmp-utils.c | 38 ++++++++++------------------- gdb/unittests/gmp-utils-selftests.c | 6 +++++ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/gdb/gmp-utils.c b/gdb/gmp-utils.c index b7fed9a82d1..949d75d21bd 100644 --- a/gdb/gmp-utils.c +++ b/gdb/gmp-utils.c @@ -128,35 +128,22 @@ gdb_mpz::export_bits (gdb::array_view buf, int endian, bool unsigned_p hi.str ().c_str ()); } - const gdb_mpz *exported_val = this; - gdb_mpz un_signed; - if (sign < 0) + gdb_mpz masked = *this; + masked.mask (buf.size () * HOST_CHAR_BIT); + + if (sign < 0 && masked.sgn () != 0) { /* mpz_export does not handle signed values, so create a positive value whose bit representation as an unsigned of the same length - would be the same as our negative value. */ + would be the same as our negative value. However, if masking + left us with 0, we don't need to do anything else. */ gdb_mpz neg_offset = gdb_mpz::pow (2, buf.size () * HOST_CHAR_BIT); - un_signed = *exported_val + neg_offset; - exported_val = &un_signed; - } - - /* If the value is too large, truncate it. */ - if (!safe - && mpz_sizeinbase (exported_val->m_val, 2) > buf.size () * HOST_CHAR_BIT) - { - /* If we don't already have a copy, make it now. */ - if (exported_val != &un_signed) - { - un_signed = *exported_val; - exported_val = &un_signed; - } - - un_signed.mask (buf.size () * HOST_CHAR_BIT); + masked += neg_offset; } - /* It's possible that one of the above results in zero, which has to - be handled specially. */ - if (exported_val->sgn () == 0) + /* It's possible that the above results in zero, which has to be + handled specially. */ + if (masked.sgn () == 0) { memset (buf.data (), 0, buf.size ()); return; @@ -174,8 +161,9 @@ gdb_mpz::export_bits (gdb::array_view buf, int endian, bool unsigned_p size_t word_countp; gdb::unique_xmalloc_ptr exported - (mpz_export (NULL, &word_countp, -1 /* order */, buf.size () /* size */, - endian, 0 /* nails */, exported_val->m_val)); + (mpz_export (nullptr, &word_countp, -1 /* order */, + buf.size () /* size */, endian, 0 /* nails */, + masked.m_val)); gdb_assert (word_countp == 1); diff --git a/gdb/unittests/gmp-utils-selftests.c b/gdb/unittests/gmp-utils-selftests.c index 1912d346c17..417abae5463 100644 --- a/gdb/unittests/gmp-utils-selftests.c +++ b/gdb/unittests/gmp-utils-selftests.c @@ -80,6 +80,12 @@ gdb_mpz_as_integer () v -= 1; SELF_CHECK (v.as_integer () == ul_expected); + + /* This is from PR gdb/34601. */ + LONGEST neg = (LONGEST) 0x8000000000000001ull; + gdb_mpz a (neg); + gdb_mpz b (0x1234); + SELF_CHECK ((a * b).as_integer_truncate () == 0x1234); } /* A helper function which calls the given gdb_mpz object's as_integer base-commit: 2ece447a4f3dcf1d96bcaca644dbf895e42194b8 -- 2.55.0