]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
[gdb/tdep] Fix inferior call return of small char array for ppc64 v1 abi
authorTom de Vries <tdevries@suse.de>
Fri, 8 Aug 2025 05:19:50 +0000 (07:19 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 8 Aug 2025 05:19:50 +0000 (07:19 +0200)
commit13f1820106cf8888d8df5fcc0f01e55ed1a10db4
tree69918ee46336a38ce7733655fd5f6e3edb62d621
parentb2a61519d18c27fb4b93ec786ce6bbf45060311a
[gdb/tdep] Fix inferior call return of small char array for ppc64 v1 abi

In ppc64_sysv_abi_return_value I came across this if clause:
...
   /* Small character arrays are returned, right justified, in r3.  */
  if (valtype->code () == TYPE_CODE_ARRAY
      && !valtype->is_vector ()
      && valtype->length () <= 8
      && valtype->target_type ()->code () == TYPE_CODE_INT
      && valtype->target_type ()->length () == 1)
...

I decided to write a test-case to try and trigger this.

AFAIU, in C/C++, we're not allowed to return an array, so I wrote an Ada
test-case instead, with a function returning this type:
...
  type T is new String (1 .. 4);
...

After doing so I realized that the clause above is not triggering because
valtype->target_type ()->code () == TYPE_CODE_CHAR.  Fix this by allowing
both TYPE_CODE_INT and TYPE_CODE_CHAR.

Then I realized that the specific "small character array" handling comes from
the v1 abi.  Add a check for this as well.

Tested on ppc64le-linux, with v2 abi.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/ppc-sysv-tdep.c
gdb/testsuite/gdb.ada/return-small-char-array.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/return-small-char-array/proc.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/return-small-char-array/value.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/return-small-char-array/value.ads [new file with mode: 0644]