diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-04-22 16:10:14 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2024-04-22 21:34:19 -0400 |
commit | ec4525259262492b61fb9bd2f9acdf156ab037fc (patch) | |
tree | 73e3cf9b3f4049db32037f6ede09abd6dd08ec71 /gdb/extract-store-integer.h | |
parent | 15afb100ea6bc04d8944a919bf58c5c3fb8c20ec (diff) | |
download | gdb-ec4525259262492b61fb9bd2f9acdf156ab037fc.zip gdb-ec4525259262492b61fb9bd2f9acdf156ab037fc.tar.gz gdb-ec4525259262492b61fb9bd2f9acdf156ab037fc.tar.bz2 |
gdb: move store/extract integer functions to extract-store-integer.{c,h}
Move the declarations out of defs.h, and the implementations out of
findvar.c.
I opted for a new file, because this functionality of converting
integers to bytes and vice-versa seems a bit to generic to live in
findvar.c.
Change-Id: I524858fca33901ee2150c582bac16042148d2251
Approved-By: John Baldwin <jhb@FreeBSD.org>
Diffstat (limited to 'gdb/extract-store-integer.h')
-rw-r--r-- | gdb/extract-store-integer.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/gdb/extract-store-integer.h b/gdb/extract-store-integer.h new file mode 100644 index 0000000..1ba5f82 --- /dev/null +++ b/gdb/extract-store-integer.h @@ -0,0 +1,111 @@ +/* Copyright (C) 2024 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GDB_EXTRACT_STORE_INTEGER_H +#define GDB_EXTRACT_STORE_INTEGER_H + +template<typename T, typename = RequireLongest<T>> +T extract_integer (gdb::array_view<const gdb_byte>, enum bfd_endian byte_order); + +static inline LONGEST +extract_signed_integer (gdb::array_view<const gdb_byte> buf, + enum bfd_endian byte_order) +{ + return extract_integer<LONGEST> (buf, byte_order); +} + +static inline LONGEST +extract_signed_integer (const gdb_byte *addr, int len, + enum bfd_endian byte_order) +{ + return extract_signed_integer (gdb::array_view<const gdb_byte> (addr, len), + byte_order); +} + +static inline ULONGEST +extract_unsigned_integer (gdb::array_view<const gdb_byte> buf, + enum bfd_endian byte_order) +{ + return extract_integer<ULONGEST> (buf, byte_order); +} + +static inline ULONGEST +extract_unsigned_integer (const gdb_byte *addr, int len, + enum bfd_endian byte_order) +{ + return extract_unsigned_integer (gdb::array_view<const gdb_byte> (addr, len), + byte_order); +} + +extern int extract_long_unsigned_integer (const gdb_byte *, int, + enum bfd_endian, LONGEST *); + +extern CORE_ADDR extract_typed_address (const gdb_byte *buf, + struct type *type); + +/* All 'store' functions accept a host-format integer and store a + target-format integer at ADDR which is LEN bytes long. */ + +template<typename T, typename = RequireLongest<T>> +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_unsigned_integer (gdb::array_view<gdb_byte> dst, bfd_endian byte_order, + ULONGEST val) +{ + return store_integer (dst, byte_order, val); +} + +static inline void +store_unsigned_integer (gdb_byte *addr, int len, bfd_endian byte_order, + ULONGEST 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, + CORE_ADDR addr); + +extern void copy_integer_to_size (gdb_byte *dest, int dest_size, + const gdb_byte *source, int source_size, + bool is_signed, enum bfd_endian byte_order); + +#endif /* GDB_EXTRACT_STORE_INTEGER_H */ |