From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2887 invoked by alias); 18 Apr 2008 16:06:45 -0000 Received: (qmail 2871 invoked by uid 22791); 18 Apr 2008 16:06:43 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate7.de.ibm.com (HELO mtagate7.de.ibm.com) (195.212.29.156) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 18 Apr 2008 16:06:16 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate7.de.ibm.com (8.13.8/8.13.8) with ESMTP id m3IG6DVT198768 for ; Fri, 18 Apr 2008 16:06:13 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m3IG6D9H3498128 for ; Fri, 18 Apr 2008 18:06:13 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m3IG6D3B002161 for ; Fri, 18 Apr 2008 18:06:13 +0200 Received: from bbkeks.de.ibm.com (dyn-9-152-248-39.boeblingen.de.ibm.com [9.152.248.39]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id m3IG682f002103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 18 Apr 2008 18:06:13 +0200 Message-ID: <4808C6F0.600@de.ibm.com> Date: Fri, 18 Apr 2008 19:54:00 -0000 From: Markus Deuling User-Agent: Thunderbird 2.0.0.12 (X11/20080213) MIME-Version: 1.0 To: GDB Patches CC: Ulrich Weigand Subject: [patch]: Fix access to SPU registers for fortran Content-Type: multipart/mixed; boundary="------------090607070804010400060302" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-04/txt/msg00385.txt.bz2 This is a multi-part message in MIME format. --------------090607070804010400060302 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2012 Hi, this is a follow-up to a patch I posted a while ago: http://sourceware.org/ml/gdb-patches/2008-03/msg00012.html When debugging a fortran binary on SPU access to one of the 128-bit registers fails. For example (gdb) p $r0%v2_int64(0) Attempt to take address of value not located in memory. The reason for that is that the value is located in a register instead of inferior memory. This is fixed with the attached patch: (gdb) p $r7%v2_double $3 = (0, 0) (gdb) p $r7%v2_double(0) $4 = 0 (gdb) p $r7%v2_double(1) $5 = 0 (gdb) p $r7%v2_double(2) no such vector element (gdb) p $r7%v2_double(-1) no such vector element (gdb) Internally 128-bit SPU registers are handled as a TYPE_CODE_UNION (__spu_builtin_type_vec128). This patch adds support for TYPE_CODE_UNION in fortran language and also fixes the syntax of "ptype" and "print $reg". (gdb) ptype $r0 type = Type, C_Union :: __spu_builtin_type_vec128 int128_t :: uint128 int64_t :: v2_int64(0:1) int32_t :: v4_int32(0:3) int16_t :: v8_int16(0:7) int8_t :: v16_int8(0:15) double :: v2_double(0:1) float :: v4_float(0:3) End Type __spu_builtin_type_vec128 (gdb) p $r0 $2 = ( 0x00000094000000000000000000000000, (635655159808, 0), (148, 0, 0, 0), (0, 148, 0, 0, 0, 0, 0, 0), (0 '\000', 0 '\000', 0 '\000', -108 '\224', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000', 0 '\000'), (3.140553770628603e-312, 0), (2.07392173e-43, 0, 0, 0) ) (gdb) Testsuite showed no regression on SPU. Ok ? ChangeLog: * eval.c (evaluate_subexp_standard): Use value_subscripted_rvalue for multi_f77_subscript to support values from registers. * valarith.c (value_subscripted_rvalue): Remove prototype and static. * value.h (value_subscripted_rvalue): Add prototype. * f-typeprint.c (f_type_print_base): Add support for TYPE_CODE_UNION. Fix output. * f-valprint.c (f_val_print): Likewise. -- Markus Deuling GNU Toolchain for Linux on Cell BE deuling@de.ibm.com --------------090607070804010400060302 Content-Type: text/plain; name="diff-spu-fortran-ptype" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diff-spu-fortran-ptype" Content-length: 3940 diff -urpN src-orig/gdb/eval.c src/gdb/eval.c --- src-orig/gdb/eval.c 2008-03-21 16:02:37.000000000 +0100 +++ src/gdb/eval.c 2008-04-18 16:11:06.000000000 +0200 @@ -1720,7 +1720,7 @@ evaluate_subexp_standard (struct type *e returns the correct type value */ deprecated_set_value_type (arg1, tmp_type); - return value_ind (value_add (value_coerce_array (arg1), arg2)); + return value_subscripted_rvalue (arg1, arg2, 0); } case BINOP_LOGICAL_AND: diff -urpN src-orig/gdb/f-typeprint.c src/gdb/f-typeprint.c --- src-orig/gdb/f-typeprint.c 2008-02-28 20:10:42.000000000 +0100 +++ src/gdb/f-typeprint.c 2008-04-17 17:41:30.000000000 +0200 @@ -368,14 +369,22 @@ f_type_print_base (struct type *type, st break; case TYPE_CODE_STRUCT: - fprintfi_filtered (level, stream, "Type "); + case TYPE_CODE_UNION: + if (TYPE_CODE (type) == TYPE_CODE_UNION) + fprintfi_filtered (level, stream, "Type, C_Union :: "); + else + fprintfi_filtered (level, stream, "Type "); fputs_filtered (TYPE_TAG_NAME (type), stream); fputs_filtered ("\n", stream); for (index = 0; index < TYPE_NFIELDS (type); index++) { - f_print_type (TYPE_FIELD_TYPE (type, index), "", stream, show, level + 4); + f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show, + level + 4); fputs_filtered (" :: ", stream); - fputs_filtered (TYPE_FIELD_NAME (type, index), stream); + fprintfi_filtered (level, stream, "%s", + TYPE_FIELD_NAME (type, index)); + f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index), + stream, 0, 0, 0); fputs_filtered ("\n", stream); } fprintfi_filtered (level, stream, "End Type "); diff -urpN src-orig/gdb/f-valprint.c src/gdb/f-valprint.c --- src-orig/gdb/f-valprint.c 2008-01-11 14:34:14.000000000 +0100 +++ src/gdb/f-valprint.c 2008-04-15 20:13:55.000000000 +0200 @@ -589,9 +589,10 @@ f_val_print (struct type *type, const gd break; case TYPE_CODE_STRUCT: + case TYPE_CODE_UNION: /* Starting from the Fortran 90 standard, Fortran supports derived types. */ - fprintf_filtered (stream, "{ "); + fprintf_filtered (stream, "( "); for (index = 0; index < TYPE_NFIELDS (type); index++) { int offset = TYPE_FIELD_BITPOS (type, index) / 8; @@ -601,7 +602,7 @@ f_val_print (struct type *type, const gd if (index != TYPE_NFIELDS (type) - 1) fputs_filtered (", ", stream); } - fprintf_filtered (stream, "}"); + fprintf_filtered (stream, " )"); break; default: diff -urpN src-orig/gdb/valarith.c src/gdb/valarith.c --- src-orig/gdb/valarith.c 2008-02-04 01:23:04.000000000 +0100 +++ src/gdb/valarith.c 2008-04-18 15:08:21.000000000 +0200 @@ -39,7 +39,6 @@ #define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2) #endif -static struct value *value_subscripted_rvalue (struct value *, struct value *, int); static struct type *unop_result_type (enum exp_opcode op, struct type *type1); static struct type *binop_result_type (enum exp_opcode op, struct type *type1, struct type *type2); @@ -257,7 +256,7 @@ value_subscript (struct value *array, st (eg, a vector register). This routine used to promote floats to doubles, but no longer does. */ -static struct value * +struct value * value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound) { struct type *array_type = check_typedef (value_type (array)); diff -urpN src-orig/gdb/value.h src/gdb/value.h --- src-orig/gdb/value.h 2008-04-06 10:56:36.000000000 +0200 +++ src/gdb/value.h 2008-04-18 13:43:16.000000000 +0200 @@ -558,4 +558,5 @@ extern struct value *value_allocate_spac extern struct value *value_of_local (const char *name, int complain); +extern struct value * value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound); #endif /* !defined (VALUE_H) */ --------------090607070804010400060302--