Files
binutils-gdb/gdb/testsuite/gdb.ada/return-small-char-array.exp
Tom de Vries 13f1820106 [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>
2025-08-08 07:19:50 +02:00

41 lines
1.1 KiB
Plaintext

# Copyright 2025 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
load_lib "ada.exp"
require allow_ada_tests
standard_ada_testfile proc
if { [gdb_compile_ada $srcfile $binfile executable debug] != "" } {
return -1
}
clean_restart $testfile
set bp_location [gdb_get_line_number "STOP" $testdir/proc.adb]
runto "proc.adb:$bp_location"
gdb_test "print Value.Name(My_Value)" \
{ = "abcd"}
# Step into the function.
gdb_test "step 2" \
"return Of_Value;"
# and finish.
gdb_test "finish" \
{ = "abcd"}