From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25950 invoked by alias); 2 Jun 2003 05:26:14 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 25917 invoked from network); 2 Jun 2003 05:26:13 -0000 Received: from unknown (HELO are.twiddle.net) (64.81.246.98) by sources.redhat.com with SMTP; 2 Jun 2003 05:26:13 -0000 Received: from are.twiddle.net (localhost.localdomain [127.0.0.1]) by are.twiddle.net (8.12.8/8.12.8) with ESMTP id h525QDLH007513 for ; Sun, 1 Jun 2003 22:26:13 -0700 Received: (from rth@localhost) by are.twiddle.net (8.12.8/8.12.8/Submit) id h525QCTC007511 for gdb-patches@sources.redhat.com; Sun, 1 Jun 2003 22:26:12 -0700 X-Authentication-Warning: are.twiddle.net: rth set sender to rth@twiddle.net using -f Date: Mon, 02 Jun 2003 05:26:00 -0000 From: Richard Henderson To: gdb-patches@sources.redhat.com Subject: [RFA] update alpha return value hooks to regcache Message-ID: <20030602052612.GA7505@twiddle.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2003-06/txt/msg00056.txt.bz2 Ok? r~ * alpha-tdep.c (alpha_extract_return_value): Convert to regcache. (alpha_extract_struct_value_address): Likewise. (alpha_store_return_value): Likewise. (alpha_store_struct_return): Remove. (alpha_gdbarch_init): Update hook registration to match. *** alpha-tdep.c.2 Sun Jun 1 21:59:13 2003 --- alpha-tdep.c Sun Jun 1 22:13:30 2003 *************** alpha_push_dummy_call (struct gdbarch *g *** 377,418 **** return sp; } ! /* Given a return value in `regbuf' with a type `valtype', ! extract and copy its value into `valbuf'. */ static void ! alpha_extract_return_value (struct type *valtype, ! char regbuf[ALPHA_REGISTER_BYTES], char *valbuf) { ! if (TYPE_CODE (valtype) == TYPE_CODE_FLT) ! alpha_register_convert_to_virtual (FP0_REGNUM, valtype, ! regbuf + REGISTER_BYTE (FP0_REGNUM), ! valbuf); ! else ! memcpy (valbuf, regbuf + REGISTER_BYTE (ALPHA_V0_REGNUM), ! TYPE_LENGTH (valtype)); } ! /* Given a return value in `regbuf' with a type `valtype', ! write its value into the appropriate register. */ static void ! alpha_store_return_value (struct type *valtype, char *valbuf) { - char raw_buffer[ALPHA_REGISTER_SIZE]; - int regnum = ALPHA_V0_REGNUM; int length = TYPE_LENGTH (valtype); ! if (TYPE_CODE (valtype) == TYPE_CODE_FLT) { ! regnum = FP0_REGNUM; ! length = ALPHA_REGISTER_SIZE; ! alpha_register_convert_to_raw (valtype, regnum, valbuf, raw_buffer); ! } ! else ! memcpy (raw_buffer, valbuf, length); ! deprecated_write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, length); } static int --- 377,466 ---- return sp; } ! /* Extract from REGCACHE the value about to be returned from a function ! and copy it into VALBUF. */ static void ! alpha_extract_return_value (struct type *valtype, struct regcache *regcache, ! void *valbuf) { ! char raw_buffer[ALPHA_REGISTER_SIZE]; ! ULONGEST l; ! ! switch (TYPE_CODE (valtype)) ! { ! case TYPE_CODE_FLT: ! switch (TYPE_LENGTH (valtype)) ! { ! case 4: ! regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, raw_buffer); ! alpha_convert_dbl_flt (valbuf, raw_buffer); ! break; ! ! case 8: ! regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, valbuf); ! break; ! ! default: ! abort (); ! } ! break; ! ! default: ! /* Assume everything else degenerates to an integer. */ ! regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &l); ! store_unsigned_integer (valbuf, TYPE_LENGTH (valtype), l); ! break; ! } ! } ! ! /* Extract from REGCACHE the address of a structure about to be returned ! from a function. */ ! ! static CORE_ADDR ! alpha_extract_struct_value_address (struct regcache *regcache) ! { ! ULONGEST addr; ! regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &addr); ! return addr; } ! /* Insert the given value into REGCACHE as if it was being ! returned by a function. */ static void ! alpha_store_return_value (struct type *valtype, struct regcache *regcache, ! const void *valbuf) { int length = TYPE_LENGTH (valtype); + char raw_buffer[ALPHA_REGISTER_SIZE]; + ULONGEST l; ! switch (TYPE_CODE (valtype)) { ! case TYPE_CODE_FLT: ! switch (length) ! { ! case 4: ! alpha_convert_flt_dbl (raw_buffer, valbuf); ! valbuf = raw_buffer; ! /* FALLTHRU */ ! ! case 8: ! regcache_cooked_write (regcache, ALPHA_FP0_REGNUM, valbuf); ! break; ! ! default: ! abort (); ! } ! break; ! default: ! /* Assume everything else degenerates to an integer. */ ! l = unpack_long (valtype, valbuf); ! regcache_cooked_write_unsigned (regcache, ALPHA_V0_REGNUM, l); ! break; ! } } static int *************** alpha_use_struct_convention (int gcc_p, *** 422,441 **** return 1; } - static void - alpha_store_struct_return (CORE_ADDR addr, CORE_ADDR sp) - { - /* Store the address of the place in which to copy the structure the - subroutine will return. Handled by alpha_push_arguments. */ - } - - static CORE_ADDR - alpha_extract_struct_value_address (char *regbuf) - { - return (extract_unsigned_integer (regbuf + REGISTER_BYTE (ALPHA_V0_REGNUM), - REGISTER_RAW_SIZE (ALPHA_V0_REGNUM))); - } - static const unsigned char * alpha_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) --- 470,475 ---- *************** alpha_gdbarch_init (struct gdbarch_info *** 1325,1334 **** generic_frameless_function_invocation_not); set_gdbarch_use_struct_convention (gdbarch, alpha_use_struct_convention); ! set_gdbarch_deprecated_extract_return_value (gdbarch, alpha_extract_return_value); ! set_gdbarch_deprecated_store_struct_return (gdbarch, alpha_store_struct_return); ! set_gdbarch_deprecated_store_return_value (gdbarch, alpha_store_return_value); ! set_gdbarch_deprecated_extract_struct_value_address (gdbarch, alpha_extract_struct_value_address); /* Settings for calling functions in the inferior. */ --- 1359,1367 ---- generic_frameless_function_invocation_not); set_gdbarch_use_struct_convention (gdbarch, alpha_use_struct_convention); ! set_gdbarch_extract_return_value (gdbarch, alpha_extract_return_value); ! set_gdbarch_store_return_value (gdbarch, alpha_store_return_value); ! set_gdbarch_extract_struct_value_address (gdbarch, alpha_extract_struct_value_address); /* Settings for calling functions in the inferior. */