From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id Kf4wJuF2fGpIlCAAWB0awg (envelope-from ) for ; Wed, 12 Aug 2026 09:36:33 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=Y3+yYZ7T; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 958CB1E166; Wed, 12 Aug 2026 09:36:33 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED 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 3CF941E033 for ; Wed, 12 Aug 2026 09:36:29 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CD4164BB24F0 for ; Wed, 12 Aug 2026 13:36:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CD4164BB24F0 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=Y3+yYZ7T Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) by sourceware.org (Postfix) with ESMTPS id CD1A74BB3B80; Wed, 12 Aug 2026 13:29:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CD1A74BB3B80 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CD1A74BB3B80 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786541387; cv=none; b=nqi2JiLHK+83ZxflwPdjE62/ktBCUsTM0SJkPMWFlBPQP85MRBnigeJ3nBnBLVsdCDUuFywU4zKN2TSemp4IjH2EVmKiR5mvz02YPQe/Oa4lFA8ZHyDGWVeRup65/RAsVbJnPeAMYLyit55B5Ac+Rlxn0ixFGp6AyQMBkGzBmeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786541387; c=relaxed/simple; bh=acdaTm3hmQzw8vHPPGKmUyXcGpEPJ9S2cN0uoqX+Gt8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=AYbZRfdKB2/+Ukvv6XoNW3RHcidXzEpvp/RTwzzt93EV8at4RMQ1gd+IbmeSGtlnsK30KUvxlOuWwav2H+1XyAdL5qBkF3xzaKf1OjjIMeISthP6bdiE0q+VSgbReZSjEyGX9pj2I9rPH4A8FK4LNjyz+nxXjK8v8juFcoITJBA= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=Y3+yYZ7T DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CD1A74BB3B80 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1786541387; x=1818077387; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=acdaTm3hmQzw8vHPPGKmUyXcGpEPJ9S2cN0uoqX+Gt8=; b=Y3+yYZ7Tod5mmd++rGv2S7a7mZRjHCj4WgD0ciglK3PlmmYddEjjSBzZ p9++FuPvaogPqmCBAqeARPtnsoeglSm1Z+7M0n8sDWge5zwsU9n9RbvXh yFw/Sn/vgqm1ILx5sQzXmTh/D/Pf4X2rFL979WS7DN+IgQus3HCnFaV8q H+LpQeB7Ma92Bua9BxWlaMoRN67yqLekMLgNYgjVewS3jI3abRqB/XNoi FDbPabWLKewUOzl+ZFvwztocAI6nEq5ULeJdyRJUT//7Bx51DdvlrnjQq oWUt86rhMtjtZDfC6hg1zHKuAREPQSDR10Hd8eUDNEZiRYnavs1+1nDvO g==; X-CSE-ConnectionGUID: j0d0ehLxT7Sq5XxUZQLDvA== X-CSE-MsgGUID: PH81EDeKQzqs3qdk6M/2tQ== X-IronPort-AV: E=McAfee;i="6800,10657,11872"; a="97757914" X-IronPort-AV: E=Sophos;i="6.25,219,1779174000"; d="scan'208";a="97757914" Received: from fmviesa010.fm.intel.com ([10.60.135.150]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Aug 2026 06:29:46 -0700 X-CSE-ConnectionGUID: 0MuF2WofS/iuVCgIfuJfcA== X-CSE-MsgGUID: XirS5UGrROC/9oqJx5xlVw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,219,1779174000"; d="scan'208";a="259817995" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by fmviesa010-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Aug 2026 06:29:43 -0700 From: Markus Metzger To: gdb-patches@sourceware.org Cc: binutils@sourceware.org Subject: [PATCH v4 31/44] gdb, dwarf, ze: add DW_OP_INTEL_regval_bits Date: Wed, 12 Aug 2026 15:27:51 +0200 Message-ID: <20260812132805.380163-32-markus.t.metzger@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260812132805.380163-1-markus.t.metzger@intel.com> References: <20260812132805.380163-1-markus.t.metzger@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 Add support for a new DWARF expression proposed in https://dwarfstd.org/ShowIssue.php?issue=201007.1. Cc: --- binutils/dwarf.c | 6 ++++++ gdb/dwarf2/expr.c | 37 +++++++++++++++++++++++++++++++++++++ gdb/dwarf2/expr.h | 5 +++++ gdb/dwarf2/loc.c | 2 ++ include/dwarf2.def | 4 ++++ 5 files changed, 54 insertions(+) diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 829bcb761f7..bdeaf393572 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -1882,6 +1882,12 @@ decode_location_expression (unsigned char * data, printf ("DW_OP_PGI_omp_thread_num"); break; + /* Intel wide registers extension. */ + case DW_OP_INTEL_regval_bits: + SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); + printf ("DW_OP_INTEL_regval_bits: %lu", (unsigned long) uvalue); + break; + default: if (op >= DW_OP_lo_user && op <= DW_OP_hi_user) diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index 3a6b8f58199..03dae5bb064 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -946,6 +946,29 @@ dwarf_expr_context::deref (CORE_ADDR addr, int size, struct type *type) /* See expr.h. */ +void +dwarf_expr_context::read_reg (gdb_byte *buf, size_t bitoffset, + size_t bitsize, int dwregnum) +{ + struct gdbarch * const gdbarch = get_frame_arch (this->m_frame); + const int regnum = dwarf_reg_to_regnum_or_error (gdbarch, dwregnum); + + const int regsize = register_size (gdbarch, regnum); + if ((regsize * 8) < (bitsize + bitoffset)) + error (_("DWARF expr: error accessing %s[%" PRIu64 ":%" PRIu64 "]"), + gdbarch_register_name (gdbarch, regnum), + bitsize + bitoffset - 1, bitoffset); + + gdb_byte * const regbuf = (gdb_byte *) alloca (regsize); + get_frame_register (this->m_frame, regnum, + gdb::make_array_view (regbuf, regsize)); + + const enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + copy_bitwise (buf, 0, regbuf, bitoffset, bitsize, byte_order); +} + +/* See expr.h. */ + void dwarf_expr_context::push_dwarf_reg_entry_value (call_site_parameter_kind kind, call_site_parameter_u kind_u, @@ -2459,6 +2482,20 @@ dwarf_expr_context::execute_stack_op (gdb::array_view expr) } break; + case DW_OP_INTEL_regval_bits: + { + uint8_t size = *op_ptr++; + const ULONGEST off = value_as_long (fetch (0)); + pop (); + const LONGEST dwregnum = value_as_long (fetch (0)); + pop (); + + result = 0; + read_reg ((gdb_byte *) &result, off, size, dwregnum); + result_val = value_from_ulongest (address_type, result); + } + break; + case DW_OP_convert: case DW_OP_GNU_convert: case DW_OP_reinterpret: diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h index 02b0e41f6fd..bc07ae4b95f 100644 --- a/gdb/dwarf2/expr.h +++ b/gdb/dwarf2/expr.h @@ -256,6 +256,11 @@ struct dwarf_expr_context memory reads to come from the passed-in buffer. */ void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length); + /* Read BITSIZE bits from the register indicated by the DWARF register + number DWREGNUM starting at bit BITOFFSET into BUF. */ + void read_reg (gdb_byte *buf, size_t bitoffset, size_t bitsize, + int dwregnum); + /* Deref ADDR with size SIZE and return a value of type TYPE. If TYPE == nullptr, defaults to this->address_type (). */ value *deref (CORE_ADDR addr, int size, struct type *type = nullptr); diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index 8e2b401ba34..d19695d96bd 100644 --- a/gdb/dwarf2/loc.c +++ b/gdb/dwarf2/loc.c @@ -2100,6 +2100,7 @@ dwarf2_get_symbol_read_needs (gdb::array_view expr, case DW_OP_GNU_parameter_ref: case DW_OP_regval_type: case DW_OP_GNU_regval_type: + case DW_OP_INTEL_regval_bits: symbol_needs = SYMBOL_NEEDS_FRAME; break; @@ -3348,6 +3349,7 @@ disassemble_dwarf_expression (struct ui_file *stream, break; case DW_OP_const1u: + case DW_OP_INTEL_regval_bits: ul = extract_unsigned_integer (data, 1, gdbarch_byte_order (arch)); data += 1; gdb_printf (stream, " %s", pulongest (ul)); diff --git a/include/dwarf2.def b/include/dwarf2.def index 22b4b7d5b5a..056bb51a280 100644 --- a/include/dwarf2.def +++ b/include/dwarf2.def @@ -699,6 +699,10 @@ DW_OP (DW_OP_GNU_const_index, 0xfc) /* The GNU variable value extension. See http://dwarfstd.org/ShowIssue.php?issue=161109.2 . */ DW_OP (DW_OP_GNU_variable_value, 0xfd) +/* https://dwarfstd.org/ShowIssue.php?issue=201007.1 + + The DW_OP_regval_bits operation extracts a value from a register. */ +DW_OP (DW_OP_INTEL_regval_bits, 0xfe) /* HP extensions. */ DW_OP_DUP (DW_OP_HP_unknown, 0xe0) /* Ouch, the same as GNU_push_tls_address. */ DW_OP (DW_OP_HP_is_value, 0xe1) -- 2.43.0 ________________________________________ Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 (89) 99143-0 www.intel.de Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman Chairperson of the Supervisory Board: Sonja Pierer Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.