[v2,03/24] gdb: make store_integer take an array_view
Commit Message
Change store_integer, store_signed_integer and store_unsigned_integer to
accept an array_view. Add some backwards compatibility overloads to
avoid changing all callers at once.
Change-Id: Ibb1381228ab1cb65fc7e2e4b92cf9ab1047cdc03
Reviewed-By: John Baldwin <jhb@FreeBSD.org>
---
gdb/defs.h | 39 +++++++++++++++++++++++++++++++--------
gdb/findvar.c | 16 +++++++---------
2 files changed, 38 insertions(+), 17 deletions(-)
Comments
On Friday, November 24, 2023 10:26 PM Simon Marchi wrote:
> Change store_integer, store_signed_integer and store_unsigned_integer to
> accept an array_view. Add some backwards compatibility overloads to
> avoid changing all callers at once.
>
> Change-Id: Ibb1381228ab1cb65fc7e2e4b92cf9ab1047cdc03
> Reviewed-By: John Baldwin <jhb@FreeBSD.org>
> ---
> gdb/defs.h | 39 +++++++++++++++++++++++++++++++--------
> gdb/findvar.c | 16 +++++++---------
> 2 files changed, 38 insertions(+), 17 deletions(-)
>
> diff --git a/gdb/defs.h b/gdb/defs.h
> index e6dd93e791e3..f6b7a2a19a9e 100644
> --- a/gdb/defs.h
> +++ b/gdb/defs.h
> @@ -495,21 +495,44 @@ extern CORE_ADDR extract_typed_address (const gdb_byte *buf,
> target-format integer at ADDR which is LEN bytes long. */
>
> template<typename T, typename = RequireLongest<T>>
> -extern void store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
> - T val);
> +extern void store_integer (gdb::array_view<gdb_byte> dst,
> + bfd_endian byte_order, T val);
> +
> +template<typename T>
> +static inline void
> +store_integer (gdb_byte *addr, int len, bfd_endian byte_order, T val)
> +{
> + return store_integer (gdb::make_array_view (addr, len), byte_order, val);
> +}
> +
> +static inline void
> +store_signed_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order,
> + LONGEST val)
> +{
> + return store_integer (dst, byte_order, val);
> +}
> +
> +static inline void
> +store_signed_integer (gdb_byte *addr, int len, bfd_endian byte_order,
> + LONGEST val)
> +{
> + return store_signed_integer (gdb::make_array_view (addr, len), byte_order,
> + val);
> +}
>
> static inline void
> -store_signed_integer (gdb_byte *addr, int len,
> - enum bfd_endian byte_order, LONGEST val)
> +store_unsigned_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order,
> + ULONGEST val)
> {
> - return store_integer (addr, len, byte_order, val);
> + return store_integer (dst, byte_order, val);
> }
>
> static inline void
> -store_unsigned_integer (gdb_byte *addr, int len,
> - enum bfd_endian byte_order, ULONGEST val)
> +store_unsigned_integer (gdb_byte *addr, int len, bfd_endian byte_order,
> + LONGEST val)
Did you mean ULONGEST here?
Thanks,
-Baris
> {
> - return store_integer (addr, len, byte_order, val);
> + return store_unsigned_integer (gdb::make_array_view (addr, len), byte_order,
> + val);
> }
>
> extern void store_typed_address (gdb_byte *buf, struct type *type,
> diff --git a/gdb/findvar.c b/gdb/findvar.c
> index 952ec20c0b73..c7a681f8a890 100644
> --- a/gdb/findvar.c
> +++ b/gdb/findvar.c
> @@ -159,12 +159,12 @@ extract_typed_address (const gdb_byte *buf, struct type *type)
> target-format integer at ADDR which is LEN bytes long. */
> template<typename T, typename>
> void
> -store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
> +store_integer (gdb::array_view<gdb_byte> dst, enum bfd_endian byte_order,
> T val)
> {
> gdb_byte *p;
> - gdb_byte *startaddr = addr;
> - gdb_byte *endaddr = startaddr + len;
> + gdb_byte *startaddr = dst.data ();
> + gdb_byte *endaddr = startaddr + dst.size ();
>
> /* Start at the least significant end of the integer, and work towards
> the most significant. */
> @@ -187,13 +187,11 @@ store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
> }
>
> /* Explicit instantiations. */
> -template void store_integer (gdb_byte *addr, int len,
> - enum bfd_endian byte_order,
> - LONGEST val);
> +template void store_integer (gdb::array_view<gdb_byte> dst,
> + bfd_endian byte_order, LONGEST val);
>
> -template void store_integer (gdb_byte *addr, int len,
> - enum bfd_endian byte_order,
> - ULONGEST val);
> +template void store_integer (gdb::array_view<gdb_byte> dst,
> + bfd_endian byte_order, ULONGEST val);
>
> /* Store the address ADDR as a pointer of type TYPE at BUF, in target
> form. */
> --
> 2.43.0
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
On 11/30/23 06:40, Aktemur, Tankut Baris wrote:
>> static inline void
>> -store_signed_integer (gdb_byte *addr, int len,
>> - enum bfd_endian byte_order, LONGEST val)
>> +store_unsigned_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order,
>> + ULONGEST val)
>> {
>> - return store_integer (addr, len, byte_order, val);
>> + return store_integer (dst, byte_order, val);
>> }
>>
>> static inline void
>> -store_unsigned_integer (gdb_byte *addr, int len,
>> - enum bfd_endian byte_order, ULONGEST val)
>> +store_unsigned_integer (gdb_byte *addr, int len, bfd_endian byte_order,
>> + LONGEST val)
>
> Did you mean ULONGEST here?
Ohh, yes, good catch, thanks.
Simon
@@ -495,21 +495,44 @@ extern CORE_ADDR extract_typed_address (const gdb_byte *buf,
target-format integer at ADDR which is LEN bytes long. */
template<typename T, typename = RequireLongest<T>>
-extern void store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
- T val);
+extern void store_integer (gdb::array_view<gdb_byte> dst,
+ bfd_endian byte_order, T val);
+
+template<typename T>
+static inline void
+store_integer (gdb_byte *addr, int len, bfd_endian byte_order, T val)
+{
+ return store_integer (gdb::make_array_view (addr, len), byte_order, val);
+}
+
+static inline void
+store_signed_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order,
+ LONGEST val)
+{
+ return store_integer (dst, byte_order, val);
+}
+
+static inline void
+store_signed_integer (gdb_byte *addr, int len, bfd_endian byte_order,
+ LONGEST val)
+{
+ return store_signed_integer (gdb::make_array_view (addr, len), byte_order,
+ val);
+}
static inline void
-store_signed_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order, LONGEST val)
+store_unsigned_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order,
+ ULONGEST val)
{
- return store_integer (addr, len, byte_order, val);
+ return store_integer (dst, byte_order, val);
}
static inline void
-store_unsigned_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order, ULONGEST val)
+store_unsigned_integer (gdb_byte *addr, int len, bfd_endian byte_order,
+ LONGEST val)
{
- return store_integer (addr, len, byte_order, val);
+ return store_unsigned_integer (gdb::make_array_view (addr, len), byte_order,
+ val);
}
extern void store_typed_address (gdb_byte *buf, struct type *type,
@@ -159,12 +159,12 @@ extract_typed_address (const gdb_byte *buf, struct type *type)
target-format integer at ADDR which is LEN bytes long. */
template<typename T, typename>
void
-store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
+store_integer (gdb::array_view<gdb_byte> dst, enum bfd_endian byte_order,
T val)
{
gdb_byte *p;
- gdb_byte *startaddr = addr;
- gdb_byte *endaddr = startaddr + len;
+ gdb_byte *startaddr = dst.data ();
+ gdb_byte *endaddr = startaddr + dst.size ();
/* Start at the least significant end of the integer, and work towards
the most significant. */
@@ -187,13 +187,11 @@ store_integer (gdb_byte *addr, int len, enum bfd_endian byte_order,
}
/* Explicit instantiations. */
-template void store_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order,
- LONGEST val);
+template void store_integer (gdb::array_view<gdb_byte> dst,
+ bfd_endian byte_order, LONGEST val);
-template void store_integer (gdb_byte *addr, int len,
- enum bfd_endian byte_order,
- ULONGEST val);
+template void store_integer (gdb::array_view<gdb_byte> dst,
+ bfd_endian byte_order, ULONGEST val);
/* Store the address ADDR as a pointer of type TYPE at BUF, in target
form. */