Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Markus Metzger <markus.t.metzger@intel.com>
To: gdb-patches@sourceware.org
Cc: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Subject: [PATCH v4 08/44] gdb: add a new extract_integer variant that takes two array_views
Date: Wed, 12 Aug 2026 15:27:28 +0200	[thread overview]
Message-ID: <20260812132805.380163-9-markus.t.metzger@intel.com> (raw)
In-Reply-To: <20260812132805.380163-1-markus.t.metzger@intel.com>

From: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>

Add a new variant of extract integer that takes both the source and
the destination values as array_view parameter.  The existing
templated extract_integer then becomes a wrapper around the new
variant.  The new variant gives flexibility and ease of use in cases
where the destination buffer and length are runtime values.
---
 gdb/extract-store-integer.c | 53 ++++++++++++++++++++++++-------------
 gdb/extract-store-integer.h |  8 ++++++
 2 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/gdb/extract-store-integer.c b/gdb/extract-store-integer.c
index 67e4534a27d..41116d6cd3c 100644
--- a/gdb/extract-store-integer.c
+++ b/gdb/extract-store-integer.c
@@ -20,26 +20,27 @@
 #include "gdbarch.h"
 #include "gdbsupport/selftest.h"
 
-template<typename T, typename>
-T
-extract_integer (gdb::array_view<const gdb_byte> buf, enum bfd_endian byte_order)
-{
-  typename std::make_unsigned<T>::type retval = 0;
+/* See extract-store-integer.h.  */
 
-  /* It is ok if BUF is wider than T, but only if the value is
+void
+extract_integer (gdb::array_view<gdb_byte> dst,
+		 gdb::array_view<const gdb_byte> buf,
+		 enum bfd_endian byte_order,
+		 bool is_signed)
+{
+  /* It is ok if BUF is wider than DST, but only if the value is
      representable.  */
   bool bad_repr = false;
-  if (buf.size () > (int) sizeof (T))
+  if (buf.size () > dst.size ())
     {
-      const size_t end = buf.size () - sizeof (T);
+      const size_t end = buf.size () - dst.size ();
       if (byte_order == BFD_ENDIAN_BIG)
 	{
 	  for (size_t i = 0; i < end; ++i)
 	    {
 	      /* High bytes == 0 are always ok, and high bytes == 0xff
 		 are ok when the type is signed.  */
-	      if ((buf[i] == 0
-		   || (std::is_signed<T>::value && buf[i] == 0xff))
+	      if ((buf[i] == 0 || (is_signed && buf[i] == 0xff))
 		  /* All the high bytes must be the same, no
 		     alternating 0 and 0xff.  */
 		  && (i == 0 || buf[i - 1] == buf[i]))
@@ -61,8 +62,7 @@ extract_integer (gdb::array_view<const gdb_byte> buf, enum bfd_endian byte_order
 	    {
 	      /* High bytes == 0 are always ok, and high bytes == 0xff
 		 are ok when the type is signed.  */
-	      if ((buf[i] == 0
-		   || (std::is_signed<T>::value && buf[i] == 0xff))
+	      if ((buf[i] == 0 || (is_signed && buf[i] == 0xff))
 		  /* All the high bytes must be the same, no
 		     alternating 0 and 0xff.  */
 		  && (i == bufsz || buf[i] == buf[i + 1]))
@@ -81,7 +81,7 @@ extract_integer (gdb::array_view<const gdb_byte> buf, enum bfd_endian byte_order
 
   if (bad_repr)
     error (_("Value cannot be represented as integer of %d bytes."),
-	   (int) sizeof (T));
+	   (int) dst.size ());
 
   /* Start at the most significant end of the integer, and work towards
      the least significant.  */
@@ -89,28 +89,43 @@ extract_integer (gdb::array_view<const gdb_byte> buf, enum bfd_endian byte_order
     {
       size_t i = 0;
 
-      if (std::is_signed<T>::value)
+      if (is_signed)
 	{
 	  /* Do the sign extension once at the start.  */
-	  retval = ((LONGEST) buf[i] ^ 0x80) - 0x80;
+	  dst[buf.size () - 1] = ((LONGEST) buf[i] ^ 0x80) - 0x80;
 	  ++i;
 	}
       for (; i < buf.size (); ++i)
-	retval = (retval << 8) | buf[i];
+	dst[buf.size () - 1 - i] = buf[i];
     }
   else
     {
       ssize_t i = buf.size () - 1;
 
-      if (std::is_signed<T>::value)
+      if (is_signed)
 	{
 	  /* Do the sign extension once at the start.  */
-	  retval = ((LONGEST) buf[i] ^ 0x80) - 0x80;
+	  dst[i] = ((LONGEST) buf[i] ^ 0x80) - 0x80;
 	  --i;
 	}
       for (; i >= 0; --i)
-	retval = (retval << 8) | buf[i];
+	dst[i] = buf[i];
     }
+
+  /* Extend the upper bytes when DST is wider than BUF.  */
+  if (is_signed && (dst[buf.size () - 1] & 0x80) != 0)
+    for (size_t i = buf.size (); i < dst.size (); ++i)
+      dst[i] = 0xff;
+}
+
+template<typename T, typename>
+T
+extract_integer (gdb::array_view<const gdb_byte> buf, enum bfd_endian byte_order)
+{
+  typename std::make_unsigned<T>::type retval = 0;
+  gdb::array_view<gdb_byte> dst ((gdb_byte *) &retval, sizeof (T));
+  extract_integer (dst, buf, byte_order, std::is_signed<T>::value);
+
   return retval;
 }
 
diff --git a/gdb/extract-store-integer.h b/gdb/extract-store-integer.h
index b6f734d23a7..5d9d95e7036 100644
--- a/gdb/extract-store-integer.h
+++ b/gdb/extract-store-integer.h
@@ -20,6 +20,14 @@
 
 #include <type_traits>
 
+/* Convert the target-format buffer SRC into the host-format buffer
+   DST, according to BYTE_ORDER and taking IS_SIGNED into account.  */
+
+void extract_integer (gdb::array_view<gdb_byte> dst,
+		      gdb::array_view<const gdb_byte> src,
+		      enum bfd_endian byte_order,
+		      bool is_signed);
+
 template<typename T, typename = std::is_integral<T>>
 T extract_integer (gdb::array_view<const gdb_byte>, enum bfd_endian byte_order);
 
-- 
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.


  parent reply	other threads:[~2026-08-12 13:31 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-12 13:27 [PATCH v4 00/44] A new target to debug Intel GPUs Markus Metzger
2026-08-12 13:27 ` [PATCH v4 01/44] bfd: add intelgt target to BFD Markus Metzger
2026-08-12 13:27 ` [PATCH v4 02/44] opcodes: add intelgt as a configuration Markus Metzger
2026-08-12 13:27 ` [PATCH v4 03/44] gdbserver: allow configuring for a heterogeneous target Markus Metzger
2026-08-12 13:27 ` [PATCH v4 04/44] config.sub: recognize level-zero as "ze" Markus Metzger
2026-08-12 13:27 ` [PATCH v4 05/44] gdbserver: import AC_LIB_HAVE_LINKFLAGS macro into the autoconf script Markus Metzger
2026-08-12 13:27 ` [PATCH v4 06/44] gdb, gdbserver, gdbsupport: add 'device' tag to XML target description Markus Metzger
2026-08-12 13:27 ` [PATCH v4 07/44] gdb, arch, intelgt: add intelgt arch definitions Markus Metzger
2026-08-12 13:27 ` Markus Metzger [this message]
2026-08-12 13:27 ` [PATCH v4 09/44] gdb, intelgt: add the target-dependent definitions for the Intel GT architecture Markus Metzger
2026-08-12 13:27 ` [PATCH v4 10/44] gdb, intelgt: add disassemble feature " Markus Metzger
2026-08-12 13:27 ` [PATCH v4 11/44] gdb: revise the pid_to_exec_file target op Markus Metzger
2026-08-12 13:27 ` [PATCH v4 12/44] gdb, remote: do 'remote_add_inferior' in 'remote_notice_new_inferior' earlier Markus Metzger
2026-08-12 13:27 ` [PATCH v4 13/44] gdbserver: move dlls_changed initialization on attach into targets Markus Metzger
2026-08-12 13:27 ` [PATCH v4 14/44] gdbserver: adjust pid after the target attaches Markus Metzger
2026-08-12 13:27 ` [PATCH v4 15/44] gdbserver: check process when we need a process Markus Metzger
2026-08-12 13:27 ` [PATCH v4 16/44] gdb: use process in xfer_partial if inferior_ptid is null_ptid Markus Metzger
2026-08-12 13:27 ` [PATCH v4 17/44] gdb: allow inferiors without threads in all_matching_threads_iterator Markus Metzger
2026-08-12 13:27 ` [PATCH v4 18/44] gdbserver: improve threads debug output for process general thread Markus Metzger
2026-08-12 13:27 ` [PATCH v4 19/44] gdb, gdbserver: allow setting null_ptid as " Markus Metzger
2026-08-12 13:27 ` [PATCH v4 20/44] gdbserver: allow inferiors without threads Markus Metzger
2026-08-12 13:27 ` [PATCH v4 21/44] gdb: allow creating and attaching to " Markus Metzger
2026-08-12 13:27 ` [PATCH v4 22/44] gdb, remote: don't create an inferior on attach Markus Metzger
2026-08-12 13:27 ` [PATCH v4 23/44] gdb: allow switching to an inferior without threads Markus Metzger
2026-08-12 13:27 ` [PATCH v4 24/44] gdb: allow resuming an inferior with no threads Markus Metzger
2026-08-12 13:27 ` [PATCH v4 25/44] gdb: allow continuing an inferior without threads Markus Metzger
2026-08-12 13:27 ` [PATCH v4 26/44] gdb: partially fix C-c not working Markus Metzger
2026-08-12 13:27 ` [PATCH v4 27/44] gdb, linux-nat: use current_inferior()->pid in mourn_inferior() Markus Metzger
2026-08-12 13:27 ` [PATCH v4 28/44] gdb: inferior events Markus Metzger
2026-08-12 13:27 ` [PATCH v4 29/44] gdb, remote: allow deleting the last thread in inferior in update_thread_list() Markus Metzger
2026-08-12 13:27 ` [PATCH v4 30/44] gdb: keep target registered in inferior_event_handler() Markus Metzger
2026-08-12 13:27 ` [PATCH v4 31/44] gdb, dwarf, ze: add DW_OP_INTEL_regval_bits Markus Metzger
2026-08-12 13:27 ` [PATCH v4 32/44] gdbserver: add a pointer to the owner thread in regcache Markus Metzger
2026-08-12 13:27 ` [PATCH v4 33/44] gdb, gdbserver, ze: in-memory libraries Markus Metzger
2026-08-12 13:27 ` [PATCH v4 34/44] gdb, gdbserver: library notifications Markus Metzger
2026-08-12 13:27 ` [PATCH v4 35/44] gdbserver, ze, intelgt: introduce ze-low and intelgt-ze-low targets Markus Metzger
2026-08-12 13:27 ` [PATCH v4 36/44] testsuite, sycl: add SYCL support Markus Metzger
2026-08-12 13:27 ` [PATCH v4 37/44] testsuite, sycl: add test for backtracing inside a kernel Markus Metzger
2026-08-12 13:27 ` [PATCH v4 38/44] testsuite, sycl: add test for 'info locals' and 'info args' Markus Metzger
2026-08-12 13:27 ` [PATCH v4 39/44] testsuite, sycl: add tests for stepping Markus Metzger
2026-08-12 13:28 ` [PATCH v4 40/44] testsuite, sycl: add test for 1-D and 2-D parallel_for kernels Markus Metzger
2026-08-12 13:28 ` [PATCH v4 41/44] testsuite, sycl: add test for scheduler-locking Markus Metzger
2026-08-12 13:28 ` [PATCH v4 42/44] testsuite, arch, intelgt: add a disassembly test Markus Metzger
2026-08-12 13:28 ` [PATCH v4 43/44] testsuite, arch, intelgt: add intelgt-program-bp.exp Markus Metzger
2026-08-12 13:28 ` [PATCH v4 44/44] testsuite, intelgt: add a test for interrupting an exited thread Markus Metzger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260812132805.380163-9-markus.t.metzger@intel.com \
    --to=markus.t.metzger@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tankut.baris.aktemur@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox