From patchwork Fri May 26 15:30:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 20600 Received: (qmail 63315 invoked by alias); 26 May 2017 15:30:54 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 62191 invoked by uid 89); 26 May 2017 15:30:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=beef X-HELO: EUR01-VE1-obe.outbound.protection.outlook.com Received: from mail-ve1eur01on0072.outbound.protection.outlook.com (HELO EUR01-VE1-obe.outbound.protection.outlook.com) (104.47.1.72) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 May 2017 15:30:47 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com (10.160.211.19) by AM3PR08MB0102.eurprd08.prod.outlook.com (10.160.211.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9; Fri, 26 May 2017 15:30:45 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::f0a8:fd0f:69e1:e280]) by AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::f0a8:fd0f:69e1:e280%17]) with mapi id 15.01.1124.009; Fri, 26 May 2017 15:30:45 +0000 From: Alan Hayward To: Pedro Alves CC: Yao Qi , "gdb-patches@sourceware.org" , nd Subject: Re: [PATCH 3/11] Add MIPS_MAX_REGISTER_SIZE (2/4) Date: Fri, 26 May 2017 15:30:44 +0000 Message-ID: References: <3C00280E-37C9-4C0A-9DA6-F3B9DB1A6E8F@arm.com> <86y3v7uf9j.fsf@gmail.com> <806B436F-EFA1-4200-AC54-9036D166C9B9@arm.com> <867f1m8nhm.fsf@gmail.com> <8637bx9jsw.fsf@gmail.com> <78A7E8EA-7203-44DF-B7FD-63E75A5ECEF5@arm.com> <540372d8-efc3-f842-5cac-cd813bacc3f5@redhat.com> <4F90CD36-759D-4BDA-BFEC-8DD86F44A0B7@arm.com> <40597975-9458-e9af-8915-9d303bb1ed98@redhat.com> <5A105765-C70D-413C-BB35-50BAA5FD5865@arm.com> <73b5b4f8-065b-7102-a9d8-0b909b1eb124@redhat.com> <86wp95p3ev.fsf@gmail.com> <2b6c26fe-be7e-e219-7c6a-7fb7425f7dc1@redhat.com> <73867a49-889b-171d-db60-d545da68b8dd@redhat.com> In-Reply-To: <73867a49-889b-171d-db60-d545da68b8dd@redhat.com> authentication-results: redhat.com; dkim=none (message not signed) header.d=none; redhat.com; dmarc=none action=none header.from=arm.com; x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM3PR08MB0102; 7:PfvBukLmFAoX3Uro/R9d1qoqHkHnxQgInMYDKH9fjwgRopPYM5Gf/IEDaR75otnGCvP8/mH040Yr0bAKnmJcSlYQKasTeQZa3GpLot7BvU9fRbpkCFZFLyoEZJ9Sb2S76jus5MMcYj2EZq5bt+ZZYHLaATCKy9w/4lua1yEh2dIU5bdM604mSr0kI0Br5XQQabHEOUVSy+1jsN1Nee1vFmZhuiDWop5kA2pXi7QdhsQjZvOFM8PS1q22+DpEiLOrOaMgXaCHdMilZrKLGz1xnYQVPI9M+80UHh+NcoE6yAfGUSpgV3n/gus0QPvlJocBeQY8yEmIMTjjTANOOUNSvg== x-ms-traffictypediagnostic: AM3PR08MB0102: x-ms-office365-filtering-correlation-id: 16788507-18d6-43b2-2912-08d4a44c2d64 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081); SRVR:AM3PR08MB0102; nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(6055026)(6041248)(20161123560025)(20161123555025)(20161123564025)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148); SRVR:AM3PR08MB0102; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0102; x-forefront-prvs: 031996B7EF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39850400002)(39450400003)(39400400002)(39840400002)(39860400002)(39410400002)(377424004)(24454002)(8936002)(53936002)(7736002)(83716003)(36756003)(229853002)(3660700001)(3280700002)(305945005)(6486002)(72206003)(189998001)(82746002)(39060400002)(6512007)(54906002)(99286003)(53946003)(478600001)(6506006)(2906002)(54356999)(2900100001)(50986999)(86362001)(110136004)(6436002)(3846002)(6246003)(25786009)(76176999)(6116002)(93886004)(5660300001)(6916009)(2950100002)(8676002)(81166006)(66066001)(102836003)(575784001)(4326008)(38730400002)(53546009)(33656002)(5250100002)(14454004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR08MB0102; H:AM3PR08MB0101.eurprd08.prod.outlook.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: <8F3C4187C1DCEA4D9DD97A9B8FA7DC52@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 26 May 2017 15:30:44.8497 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0102 > On 26 May 2017, at 11:26, Pedro Alves wrote: > Another issue with the test is that by relying on > extract_(un)signed_integer, the test can't notice if the > zero / sign extension in copy_integer_bytes filled the right > number of bytes: > >> + do_cint_test (0xffffffffffffbeef, 2, 0xbeef, 3); > > I.e., above, the last test _must_ not write more than > two bytes to the destination, so those leading > 0xFFs before "beef" are artificial. > > Passing ULONGEST as destination value avoids that problem, making > you write that last test as: > > do_cint_test (0x000000000000beef, 2, 0xbeef, 3); > To make that work, I also had to make extract use the unsigned version. So now all the stores and extracts are working on unsigned data. > > > So in sum: > > #1 - ULONGEST as destination value, both signed and unsigned tests. > #2 - Add unsigned tests with size >4 > #3 - Add tests src_size == dest_size > #4 - Use gdb_byte arrays for temporary buffers, and memset them with 0xaa. > #5 - Adjust tests to pass. > #6 - Add comments where appropriate. > All the above fixed up. After doing this, I noticed it was easier to combine the two test functions into one. Tested on a --enable-targets=all build using make check with board files unix and native-gdbserver. I do not have a MIPS machine to test on. Ok to commit? Alan. 2017-05-26 Alan Hayward * defs.h (copy_integer_to_size): New declaration. * findvar.c (copy_integer_to_size): New function. (do_cint_test): New selftest function. (copy_integer_to_size_test): Likewise. (_initialize_findvar): Likewise. * mips-fbsd-tdep.c (mips_fbsd_supply_reg): Use raw_supply_integer. (mips_fbsd_collect_reg): Use raw_collect_integer. * mips-linux-tdep.c (supply_32bit_reg): Use raw_supply_integer. (mips64_fill_gregset): Use raw_collect_integer (mips64_fill_fpregset): Use raw_supply_integer. * regcache.c (regcache::raw_supply_integer): New function. (regcache::raw_collect_integer): Likewise. * regcache.h: (regcache::raw_supply_integer): New declaration. (regcache::raw_collect_integer): Likewise. diff --git a/gdb/defs.h b/gdb/defs.h index a0b586f401eca205334e9f237081f4da97c83aa1..a1a97bb1e791d4f423788797d1f04c3e89877d90 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -658,7 +658,10 @@ extern void store_unsigned_integer (gdb_byte *, int, 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); + /* From valops.c */ extern int watchdog; diff --git a/gdb/findvar.c b/gdb/findvar.c index ed4d5c1266c9de069981b306bc8229ae5fb02350..afa0ea428f67093c5b750687b54c5889a389b52f 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -33,6 +33,7 @@ #include "objfiles.h" #include "language.h" #include "dwarf2loc.h" +#include "selftest.h" /* Basic byte-swapping routines. All 'extract' functions return a host-format integer from a target-format integer at ADDR which is @@ -249,7 +250,46 @@ store_typed_address (gdb_byte *buf, struct type *type, CORE_ADDR addr) gdbarch_address_to_pointer (get_type_arch (type), type, buf, addr); } +/* Copy a value from SOURCE of size SOURCE_SIZE bytes to DEST of size DEST_SIZE + bytes. If SOURCE_SIZE is greater than DEST_SIZE, then truncate the most + significant bytes. If SOURCE_SIZE is less than DEST_SIZE then either sign + or zero extended according to IS_SIGNED. Values are stored in memory with + endianess BYTE_ORDER. */ +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) +{ + signed int size_diff = dest_size - source_size; + + /* Copy across everything from SOURCE that can fit into DEST. */ + + if (byte_order == BFD_ENDIAN_BIG && size_diff > 0) + memcpy (dest + size_diff, source, source_size); + else if (byte_order == BFD_ENDIAN_BIG && size_diff < 0) + memcpy (dest, source - size_diff, dest_size); + else + memcpy (dest, source, std::min (source_size, dest_size)); + + /* Fill the remaining space in DEST by either zero extending or sign + extending. */ + + if (size_diff > 0) + { + gdb_byte extension = 0; + if (is_signed + && ((byte_order != BFD_ENDIAN_BIG && source[source_size - 1] & 0x80) + || (byte_order == BFD_ENDIAN_BIG && source[0] & 0x80))) + extension = 0xff; + + /* Extend into MSBs of SOURCE. */ + if (byte_order == BFD_ENDIAN_BIG) + memset (dest, extension, size_diff); + else + memset (dest + source_size, extension, size_diff); + } +} /* Return a `value' with the contents of (virtual or cooked) register REGNUM as found in the specified FRAME. The register's type is @@ -1005,3 +1045,89 @@ address_from_register (int regnum, struct frame_info *frame) return result; } +#if GDB_SELF_TEST +namespace selftests { +namespace findvar_tests { + +/* Function to test copy_integer_to_size. Store SOURCE_VAL with size + SOURCE_SIZE to a buffer, making sure no sign extending happens at this + stage. Copy buffer to a new buffer using copy_integer_to_size. Extract + copied value and compare to DEST_VALU. Copy again with a signed + copy_integer_to_size and compare to DEST_VALS. Do everything for both + LITTLE and BIG target endians. Use unsigned values throughout to make + sure there are no implicit sign extensions. */ + +static void +do_cint_test (ULONGEST dest_valu, ULONGEST dest_vals, int dest_size, + ULONGEST src_val, int src_size) +{ + for (int i = 0; i < 2 ; i++) + { + gdb_byte srcbuf[sizeof (ULONGEST)] = {}; + gdb_byte destbuf[sizeof (ULONGEST)] = {}; + enum bfd_endian byte_order = i ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE; + + /* Fill the src buffer (and later the dest buffer) with non-zero junk, + to ensure zero extensions aren't hidden. */ + memset (srcbuf, 0xaa, sizeof (srcbuf)); + + /* Store (and later extract) using unsigned to ensure there are no sign + extensions. */ + store_unsigned_integer (srcbuf, src_size, byte_order, src_val); + + /* Test unsigned. */ + memset (destbuf, 0xaa, sizeof (destbuf)); + copy_integer_to_size (destbuf, dest_size, srcbuf, src_size, false, + byte_order); + SELF_CHECK (dest_valu == extract_unsigned_integer (destbuf, dest_size, + byte_order)); + + /* Test signed. */ + memset (destbuf, 0xaa, sizeof (destbuf)); + copy_integer_to_size (destbuf, dest_size, srcbuf, src_size, true, + byte_order); + SELF_CHECK (dest_vals == extract_unsigned_integer (destbuf, dest_size, + byte_order)); + } +} + +static void +copy_integer_to_size_test () +{ + /* Destination is bigger than the source, which has the signed bit unset. */ + do_cint_test (0x12345678, 0x12345678, 8, 0x12345678, 4); + do_cint_test (0x345678, 0x345678, 8, 0x12345678, 3); + do_cint_test (0x5678, 0x5678, 2, 0x12345678, 3); + + /* Destination is bigger than the source, which has the signed bit set. */ + do_cint_test (0xdeadbeef, 0xffffffffdeadbeef, 8, 0xdeadbeef, 4); + do_cint_test (0xadbeef, 0xffffffffffadbeef, 8, 0xdeadbeef, 3); + do_cint_test (0xbeef, 0xbeef, 2, 0xdeadbeef, 3); + + /* Destination and source are the same size. */ + do_cint_test (0x8765432112345678, 0x8765432112345678, 8, 0x8765432112345678, + 8); + do_cint_test (0x432112345678, 0x432112345678, 6, 0x8765432112345678, 6); + do_cint_test (0xfeedbeaddeadbeef, 0xfeedbeaddeadbeef, 8, 0xfeedbeaddeadbeef, + 8); + do_cint_test (0xbeaddeadbeef, 0xbeaddeadbeef, 6, 0xfeedbeaddeadbeef, 6); + + /* Destination is bigger than the source. Source is bigger than 32bits. */ + do_cint_test (0x3412345678, 0x3412345678, 8, 0x3412345678, 6); + do_cint_test (0xff12345678, 0xff12345678, 8, 0xff12345678, 6); + do_cint_test (0x432112345678, 0x432112345678, 8, 0x8765432112345678, 6); + do_cint_test (0xff2112345678, 0xffffff2112345678, 8, 0xffffff2112345678, 6); +} + +} // namespace findvar_test +} // namespace selftests + +#endif + +void +_initialize_findvar (void) +{ +#if GDB_SELF_TEST + register_self_test (selftests::findvar_tests::copy_integer_to_size_test); +#endif +} diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c index 00fae0ec60ddc9e645d3236efe29f2f9e9ceab5c..13cf98585f96f1acfe6decbe320530d609bee646 100644 --- a/gdb/mips-fbsd-tdep.c +++ b/gdb/mips-fbsd-tdep.c @@ -47,57 +47,24 @@ 34th is a dummy for padding. */ #define MIPS_FBSD_NUM_FPREGS 34 -/* Supply a single register. If the source register size matches the - size the regcache expects, this can use regcache_raw_supply(). If - they are different, this copies the source register into a buffer - that can be passed to regcache_raw_supply(). */ +/* Supply a single register. The register size might not match, so use + regcache->raw_supply_integer (). */ static void mips_fbsd_supply_reg (struct regcache *regcache, int regnum, const void *addr, size_t len) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); - - if (register_size (gdbarch, regnum) == len) - regcache_raw_supply (regcache, regnum, addr); - else - { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - val = extract_signed_integer ((const gdb_byte *) addr, len, byte_order); - store_signed_integer (buf, register_size (gdbarch, regnum), byte_order, - val); - regcache_raw_supply (regcache, regnum, buf); - } + regcache->raw_supply_integer (regnum, (const gdb_byte *) addr, len, true); } -/* Collect a single register. If the destination register size - matches the size the regcache expects, this can use - regcache_raw_supply(). If they are different, this fetches the - register via regcache_raw_supply() into a buffer and then copies it - into the final destination. */ +/* Collect a single register. The register size might not match, so use + regcache->raw_collect_integer (). */ static void mips_fbsd_collect_reg (const struct regcache *regcache, int regnum, void *addr, size_t len) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); - - if (register_size (gdbarch, regnum) == len) - regcache_raw_collect (regcache, regnum, addr); - else - { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regnum, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regnum), - byte_order); - store_signed_integer ((gdb_byte *) addr, len, byte_order, val); - } + regcache->raw_collect_integer (regnum, (gdb_byte *) addr, len, true); } /* Supply the floating-point registers stored in FPREGS to REGCACHE. diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c index 48a582a16c934abe6e8f87c46a6009649c606d49..ccfdcdf98bc1e528cd768efaaaffaa3405708f71 100644 --- a/gdb/mips-linux-tdep.c +++ b/gdb/mips-linux-tdep.c @@ -116,13 +116,7 @@ mips_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) static void supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; - store_signed_integer (buf, register_size (gdbarch, regnum), byte_order, - extract_signed_integer ((const gdb_byte *) addr, 4, - byte_order)); - regcache_raw_supply (regcache, regnum, buf); + regcache->raw_supply_integer (regnum, (const gdb_byte *) addr, 4, true); } /* Unpack an elf_gregset_t into GDB's register cache. */ @@ -417,7 +411,6 @@ mips64_fill_gregset (const struct regcache *regcache, mips64_elf_gregset_t *gregsetp, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int regaddr, regi; mips64_elf_greg_t *regp = *gregsetp; void *dst; @@ -460,14 +453,8 @@ mips64_fill_gregset (const struct regcache *regcache, if (regaddr != -1) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); dst = regp + regaddr; - store_signed_integer ((gdb_byte *) dst, 8, byte_order, val); + regcache->raw_collect_integer (regno, (gdb_byte *) dst, 8, true); } } @@ -564,25 +551,13 @@ mips64_fill_fpregset (const struct regcache *regcache, } else if (regno == mips_regnum (gdbarch)->fp_control_status) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); to = (gdb_byte *) (*fpregsetp + 32); - store_signed_integer (to, 4, byte_order, val); + regcache->raw_collect_integer (regno, to, 4, true); } else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); to = (gdb_byte *) (*fpregsetp + 32) + 4; - store_signed_integer (to, 4, byte_order, val); + regcache->raw_collect_integer (regno, to, 4, true); } else if (regno == -1) { diff --git a/gdb/regcache.h b/gdb/regcache.h index 4dcfccbac70f0f962bf5e5596d035fda42322795..409482d17c0542c7a53620d88d33fa9706fa72c5 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -294,8 +294,14 @@ public: void raw_collect (int regnum, void *buf) const; + void raw_collect_integer (int regnum, gdb_byte *addr, int addr_len, + bool is_signed) const; + void raw_supply (int regnum, const void *buf); + void raw_supply_integer (int regnum, const gdb_byte *addr, int addr_len, + bool is_signed); + void raw_supply_zeroed (int regnum); void raw_copy (int regnum, struct regcache *src_regcache); diff --git a/gdb/regcache.c b/gdb/regcache.c index 660558f7ff10f9d8346b6e08422e16c38c3c4d7d..90462aea73ba810bd1af9ddb8c6d02e1f0e95991 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1189,6 +1189,31 @@ regcache::raw_supply (int regnum, const void *buf) } } +/* Supply register REGNUM to REGCACHE. Value to supply is an integer stored at + address ADDR, in target endian, with length ADDR_LEN and sign IS_SIGNED. If + the register size is greater than ADDR_LEN, then the integer will be sign or + zero extended. If the register size is smaller than the integer, then the + most significant bytes of the integer will be truncated. */ + +void +regcache::raw_supply_integer (int regnum, const gdb_byte *addr, int addr_len, + bool is_signed) +{ + enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch); + gdb_byte *regbuf; + size_t regsize; + + gdb_assert (regnum >= 0 && regnum < m_descr->nr_raw_registers); + gdb_assert (!m_readonly_p); + + regbuf = register_buffer (regnum); + regsize = m_descr->sizeof_register[regnum]; + + copy_integer_to_size (regbuf, regsize, addr, addr_len, is_signed, + byte_order); + m_register_status[regnum] = REG_VALID; +} + /* Supply register REGNUM with zeroed value to REGCACHE. This is not the same as calling raw_supply with NULL (which will set the state to unavailable). */ @@ -1232,6 +1257,29 @@ regcache::raw_collect (int regnum, void *buf) const memcpy (buf, regbuf, size); } +/* Collect register REGNUM from REGCACHE. Store collected value as an integer + at address ADDR, in target endian, with length ADDR_LEN and sign IS_SIGNED. + If ADDR_LEN is greater than the register size, then the integer will be sign + or zero extended. If ADDR_LEN is smaller than the register size, then the + most significant bytes of the integer will be truncated. */ + +void +regcache::raw_collect_integer (int regnum, gdb_byte *addr, int addr_len, + bool is_signed) const +{ + enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch); + const gdb_byte *regbuf; + size_t regsize; + + gdb_assert (regnum >= 0 && regnum < m_descr->nr_raw_registers); + + regbuf = register_buffer (regnum); + regsize = m_descr->sizeof_register[regnum]; + + copy_integer_to_size (addr, addr_len, regbuf, regsize, is_signed, + byte_order); +} + void regcache::raw_copy (int regnum, struct regcache *src_regcache) {