[RFA/sparc64] internal-error printing return value (Ada array)

Joel Brobecker
2006-11-11T00:26:05Z

[-- Attachment #1: Type: text/plain, Size: 2382 bytes --]

Hello,

When working on GDB for sparc64-sun-solaris, I noticed that GDB
reports an internal error when trying to print the return value
of a function returning an Ada (fixed-size) array. I noticed this
in gdb.ada/array_return.exp:

FAIL: gdb.ada/array_return.exp: value printed by finish of Create_Small
FAIL: gdb.ada/array_return.exp: value printed by finish of Create_Large

Here is what happens. First the transcript:

(gdb) b pck.adb:5
Breakpoint 1 at 0x100009e84: file pck.adb, line 5.
(gdb) run
Starting program: /[...]/p

Breakpoint 1, pck.create_small () at pck.adb:5
5 return (others => 1);
(gdb) fin
Run till exit from #0 pck.create_small () at pck.adb:5
0x0000000100009fd0 in p () at p.adb:7
7 Small := Create_Small;
sparc64-tdep.c:1092: internal-error: sparc64_extract_return_value: Assertion `sp
arc64_integral_or_pointer_p (type)' failed.

The type in question is a TYPE_CODE_ARRAY. It seems that this case
is not handled yet by the function that extracts the return value:

sparc64-tdep.c:sparc64_extract_return_value

I am not sure yet whether this case is specific to Ada or if we can
reproduce the same with C, I will double-check. In any case, these
array objects are returned the same way as struct objects: Up to 32 bytes,
they are passed by register, otherwise %o0 contains the address of the
returned object.

I think the best fix for this is to update sparc64_structure_or_union_p
to accept arrays of 32 bytes or less. The name would become slightly
misleading for its actual implementation, and I wouldn't mind changing
it if felt necessary.

I don't know if the same issue applies to 32bit GDB or not. I tried,
but "fin" doesn't stop at the function return, so I never get the
returned value printed by GDB. I'll have a look at this another time.

I also noticed that the same problem happens for arrays larger than
32bytes. In fact, this is not specific to arrays, but to structures
as well. Support for structures larger than 32 bytes seems to be
missing. I can add that too, but let's make this another patch.

2006-11-10 Joel Brobecker <brobecker@adacore.com>

* sparc64-tdep.c (sparc64_structure_or_union_p): Accept array
types if the type length is 32 bytes or less.

Fixes the two FAILs above, no regression.
OK to apply?

Thanks,
--
Joel

[-- Attachment #2: sparc64-tdep.c.diff --]
[-- Type: text/plain, Size: 602 bytes --]

Index: sparc64-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sparc64-tdep.c,v
retrieving revision 1.27
diff -u -p -r1.27 sparc64-tdep.c
--- sparc64-tdep.c 22 Aug 2006 20:57:56 -0000 1.27
+++ sparc64-tdep.c 11 Nov 2006 00:24:36 -0000
@@ -114,6 +114,9 @@ sparc64_structure_or_union_p (const stru
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
return 1;
+ case TYPE_CODE_ARRAY:
+ /* Arrays of up to 32 bytes are returned the same way as record. */
+ return (TYPE_LENGTH (type) <= 32);
default:
break;
}