[rfc] 'union' handling for Fortran

Markus Deuling deuling@de.ibm.com
Wed Jun 13 16:30:00 GMT 2007


Daniel Jacobowitz wrote:
> On Sat, Jun 09, 2007 at 02:46:25PM +0200, Markus Deuling wrote:
>> This patch adds support for TYPE_CODE_UNION to Fortran backend by calling the 
>> appropriate C routines c_type_print_base and
>> c_val_print.
>>
>> ChangeLog:
>> 	* f-typeprint.c (print_equivalent_f77_float_type): Add support for
>> 	TYPE_CODE_UNION.
>> 	* f-valprint.c (f_val_print): Likewise.
>>
>> Testsuite showed no regressions. Would this be ok to commit ?
> 
> A test would be nice.  You should be able to do one from C, using "set
> language".
> 
> Is this good enough to be useful?  The syntax will be unexpected, and
> I don't know if you'll be able to get at the members without changing
> the parser too.
> 

This is a test with spu-gdb debugging a C application:

(gdb) br main
Breakpoint 1 at 0x4dc: file break_spu_bin.c, line 10.
(gdb) r
Starting program: /home/deuling/simple/break_spu_bin

Breakpoint 1, main (speid=4294967296, argp=1125693748412416, envp=0)
    at break_spu_bin.c:10
10        printf("Hello World! from spu\n");
(gdb) set language fortran
Warning: the current language does not match this frame.
(gdb) p $r1
$1 = {uint128 = 0x0003ff700003f2500003ff700003ff70,
  v2_int64 = (1125281431810640, 1125281431814000),
  v4_int32 = (262000, 258640, 262000, 262000),
  v8_int16 = (3, -144, 3, -3504, 3, -144, 3, -144),
  v16_int8 = (0 '\000', 3 '\003', -1 '�', 112 'p', 0 '\000', 3 '\003', -14 '�', 80 'P', 0 '\000', 3 '\003', -1 '�', 112 'p', 0 '\000', 3 '\003', -1 '�', 112 'p'), v2_double = (5.5596289736068649e-309, 5.5596289736234655e-309),
  v4_float = (3.67140198e-40, 3.62431835e-40, 3.67140198e-40, 3.67140198e-40)}
(gdb) ptype $r1
type = union __spu_builtin_type_vec128 {
    int128_t uint128;
    int64_t v2_int64[2];
    int32_t v4_int32[4];
    int16_t v8_int16[8];
    int8_t v16_int8[16];
    double v2_double[2];
    float v4_float[4];
}spu_builtin_type_vec128
(gdb)


Yes, you're right. The fortran programmer will wonder what that means :-) But I guess it's better
than an error message like
(gdb) p $r1
$2 = <error reading variable> 


And yes, when language is set to fortran you can't access union members with out changes in the parser.

(gdb) p $r1.v4_float[0]
A syntax error in expression, near `.v4_float[0]'.
(gdb) set language c
(gdb) p $r1.v4_float[0]
$2 = 3.67140198e-40
(gdb)

Any Ideas on that ? Shall I do that changes to the parser ?!?

-- 
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com



More information about the Gdb-patches mailing list