From patchwork Thu Mar 20 19:26:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 108648 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 74F573857B84 for ; Thu, 20 Mar 2025 19:30:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 74F573857B84 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=GyXdR0I/ X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by sourceware.org (Postfix) with ESMTPS id 2F6C8385842C for ; Thu, 20 Mar 2025 19:27:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2F6C8385842C 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 2F6C8385842C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d32 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742498823; cv=none; b=Ew4tQdNLHtBKT6RKsJKxNoQR3S2KpvqisvqVD8zMF9aqLmw+Hd+FDbWM/T8+LDqoWI7HCA2SBHUMX0wai/nMfkcjLx2Q5bgqxuo3CljO7BMnWCP2iiyI3t5haRTNvi6MTANxY2OMNUkf+a75TTprhaTKGboh7PdHC4ADQxLmWqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742498823; c=relaxed/simple; bh=fp1STeRt1VzX+pg386FriE20Ro6jeL0WCmm8AIPtYKg=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=MwPmwZmpB7/gLijcDw2XXQyd5cmgHGJg4HOQ3vjZOxnE3pHM2ydciBmO4RQXVEYhYPLQbVMY76BFRaShObM7wKAEONUs/Au6vMaPMc0+/ClKBLXh0BK5xYzK9BJy7kAACLkrZ/MXqccs2oBv9yFhGlK51ZVTwMnWjQ/Q1e4mOfc= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2F6C8385842C Received: by mail-io1-xd32.google.com with SMTP id ca18e2360f4ac-85e15dc801aso96692339f.2 for ; Thu, 20 Mar 2025 12:27:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1742498822; x=1743103622; darn=sourceware.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=a48uAihUzbSf0ZzMNspL67QNRU7KyvVy4UW4pTQ2aY0=; b=GyXdR0I/O3fst3AXUJ/KOJ6kOYjb3IEjKHZ5Y2N1QxPSFtuZlYj9SPLLN6cqbEu0CW 78Tsd9sjRlWEn+wDRJiEWPw2gOqv+MWSeUMTtEud7hDhHoYWJ2vtq758BYQXH1eeuZ6d QMKE4HVeFrLLjD5GvVkXtM8oRXOYTgjBCuCI60suxnLVzqfWkxGRv+n+uGofO6XAFYBh Fs0bINP5p1hjwYgpUnPxXEmN3WRhCe0jcResTiUywL0NWtG1Ovjo9fi9f5KNEyg0B+U6 83QQ6t0O//U/blPy9nwyQGo0CK20uvN/zBc6YDfk3aCP/Ndbqn82h5SYcGYVic64iI3H HCgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742498822; x=1743103622; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=a48uAihUzbSf0ZzMNspL67QNRU7KyvVy4UW4pTQ2aY0=; b=UNNcSSPB6n3nOAWFB0U+r0aOtKnTm0vS2+U03WywQijHXhRRMI/qq8KJ9QAIGeWfWt tvREKKfXI8zGjH8UUA+A4H318IELZONWz8EM2tHHiMnZbilw0XU1CdQd0DEZTl+46F87 +Tqv1yz3ha1lFFaaCXSsUTxoVZGctJhbGW1X5vGsku8VQRzLaeS9iJU9HYy8r43msXVJ h2UPu0ui+7HQblUe+bayY7eGI5JNISzXYtFObYI/LRqb6VLaNNKRtIEmP8qaar5uU8hB GIMr8sF6qSuR7vqH1eYpyuEcN4/8CDajtxisIznN0DQT5+EnMPZ4CNU6LdS2ykFKQInZ U8uQ== X-Gm-Message-State: AOJu0YzvESh8zI+F6VtPYhimk85+MHIg/IY6r1CZhogthIXMgs9+ttfo Nj3yNK9DhRzCGiGEOFCZf/QENq+RwQgCZqHVWXH/nDbY0o/YgkSx+UftO//lPw== X-Gm-Gg: ASbGncuS21zSX5e20/26lXWfIeywhzudStjPJBpEGSiTDHz5vE7Q3j4jeaiOk+ltuvH JctsqAT6+8Vvv1eHza0/xIWa/XU7oyQsNVJweH1+vdn1KssN76KnNfP7vh905X/xbiyk0Gne6ns OQ7KOv1TPpJkMgNqbQ5gCPFJ2KlqNAmZmUjDC6viAy+6lRw+tL07Bl0HfTo4HrvYUkr2e9nlBQU 8sJWBLK66lwE0tbY11u86/TgiqWjrHEfYbiNyM2EKwY039GxcU008Fnxx+v7+AmNfG/hxfem1h4 PyrWppGf7Vh5V9X+dp37hriqmaNq+tJF2xXBiPL48//QI1kLnQgIaZXB1+4qePhD781M9ebcszU eaHUv8cW6 X-Google-Smtp-Source: AGHT+IGUEThHkqsGurw4ICI4oAW45SQaiOdA+Mu2NDSaN1dINloWEiw8aYB/tKabbEDM348OgVWNPA== X-Received: by 2002:a05:6602:3997:b0:85a:ec03:b124 with SMTP id ca18e2360f4ac-85e2ca64293mr65716439f.4.1742498822459; Thu, 20 Mar 2025 12:27:02 -0700 (PDT) Received: from localhost.localdomain (97-122-123-18.hlrn.qwest.net. [97.122.123.18]) by smtp.gmail.com with ESMTPSA id ca18e2360f4ac-85e2bc6ab31sm8285939f.22.2025.03.20.12.27.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Mar 2025 12:27:02 -0700 (PDT) From: Tom Tromey Date: Thu, 20 Mar 2025 13:26:58 -0600 Subject: [PATCH 02/13] Introduce attribute::signed_constant MIME-Version: 1.0 Message-Id: <20250320-attribute-madness-v1-2-79d42789f881@adacore.com> References: <20250320-attribute-madness-v1-0-79d42789f881@adacore.com> In-Reply-To: <20250320-attribute-madness-v1-0-79d42789f881@adacore.com> To: gdb-patches@sourceware.org Cc: Tom Tromey X-Mailer: b4 0.14.2 X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, 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: 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~patchwork=sourceware.org@sourceware.org This introduces a new method, attribute::signed_constant. This should be used wherever DWARF specifies a signed integer constant, or where this is implied by the context. It properly handles sign-extension for DW_FORM_data*. To my surprise, there doesn't seem to be a pre-existing sign-extension function. I've added one to common-utils.h alongside the align functions. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680 --- gdb/dwarf2/attribute.c | 30 ++++++++++++++++++++++++++++++ gdb/dwarf2/attribute.h | 9 +++++++++ gdbsupport/common-utils.h | 10 ++++++++++ 3 files changed, 49 insertions(+) diff --git a/gdb/dwarf2/attribute.c b/gdb/dwarf2/attribute.c index 49c0bc07d75dd23f5b4f952f4ccb7c46cebc5265..25cf2b62cfd1c8f4981be2787fe4ade8c8c66b81 100644 --- a/gdb/dwarf2/attribute.c +++ b/gdb/dwarf2/attribute.c @@ -185,6 +185,36 @@ attribute::unsigned_constant () const /* See attribute.h. */ +std::optional +attribute::signed_constant () const +{ + if (form_is_strictly_signed ()) + return u.snd; + + switch (form) + { + case DW_FORM_data8: + case DW_FORM_udata: + /* Not sure if DW_FORM_udata should be handled or not. Anyway + for DW_FORM_data8, there's no need to sign-extend. */ + return u.snd; + + case DW_FORM_data1: + return sign_extend (u.unsnd, 8); + case DW_FORM_data2: + return sign_extend (u.unsnd, 16); + case DW_FORM_data4: + return sign_extend (u.unsnd, 32); + } + + /* For DW_FORM_data16 see attribute::form_is_constant. */ + complaint (_("Attribute value is not a constant (%s)"), + dwarf_form_name (form)); + return {}; +} + +/* See attribute.h. */ + bool attribute::form_is_unsigned () const { diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h index ce6c5639c1ae25644844447399988648842d8f58..6f321a53844141f408f45e99f16608eb86f33e6b 100644 --- a/gdb/dwarf2/attribute.h +++ b/gdb/dwarf2/attribute.h @@ -114,6 +114,15 @@ struct attribute returned. */ std::optional unsigned_constant () const; + /* Return a signed constant value. This only handles constant forms + (i.e., form_is_constant -- and not the extended list of + "unsigned" forms) and assumes a signed value is desired. This + function will sign-extend DW_FORM_data* values. + + If non-constant form is used, then complaint is issued and an + empty value is returned. */ + std::optional signed_constant () const; + /* Return non-zero if ATTR's value falls in the 'constant' class, or zero otherwise. When this function returns true, you can apply the constant_value method to it. diff --git a/gdbsupport/common-utils.h b/gdbsupport/common-utils.h index 114342d845d8d76ce919e7c0518ab1251e7f2d5b..316ce89af23b926f10cb6a6fdda6621a7d4e507c 100644 --- a/gdbsupport/common-utils.h +++ b/gdbsupport/common-utils.h @@ -196,6 +196,16 @@ in_inclusive_range (T value, T low, T high) extern ULONGEST align_up (ULONGEST v, int n); extern ULONGEST align_down (ULONGEST v, int n); +/* Sign-extend the value V, using N as the number of valid bits. That + is, bit N-1 is the sign bit. The higher-order bits (those outside + 0..N-1) must be zero. */ +static inline ULONGEST +sign_extend (ULONGEST v, int n) +{ + ULONGEST mask = (ULONGEST) 1 << (n - 1); + return (v ^ mask) - mask; +} + /* Convert hex digit A to a number, or throw an exception. */ extern int fromhex (int a);