diff options
| author | Mark Wielaard <[email protected]> | 2024-03-19 22:43:10 +0000 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2024-03-20 20:36:51 +0100 |
| commit | 669b648111d3bc27cd4756879f5fe5a18515de77 (patch) | |
| tree | 14ae8f7d6e5546f525cb224c258d265af53a1011 /tests | |
| parent | ef8a4b841aaf26326b8961a651dbe915d54d23e7 (diff) | |
riscv: Partial implementation of flatten_aggregate
dwfl_module_return_value_location would fail on riscv for functions
which return a (small) struct. This patch implements the simplest
cases of flatten_aggregate in backends/riscv_retval.c. It just handles
structs containing one or two members of the same base type which fit
completely or in pieces in one or two general or floating point
registers.
It also adds a specific test case run-funcretval-struct.sh containing
small structs of ints, longs, floats and doubles. All these testscases
now work for riscv. There is already a slightly more extensive
testcase for this in tests/run-funcretval.sh but that only has a
testcase for aarch64.
* backends/riscv_retval.c (flatten_aggregate_arg): Implement
for the simple cases where we have a struct with one or two
members of the same base type.
(pass_by_flattened_arg): Likewise. Call either
pass_in_gpr_lp64 or pass_in_fpr_lp64d.
(riscv_return_value_location_lp64ifd): Call
flatten_aggregate_arg including size.
* tests/Makefile.am (TESTS): Add run-funcretval-struct.sh
and run-funcretval-struct-native.sh.
(check_PROGRAMS): Add funcretval_test_struct.
(funcretval_test_struct_SOURCES): New.
(EXTRA_DIST): Add run-funcretval-struct.sh,
funcretval_test_struct_riscv.bz2 and
run-funcretval-struct-native.sh.
* tests/funcretval_test_struct_riscv.bz2: New test binary.
* tests/run-funcretval-struct-native.sh: New test.
* tests/run-funcretval-struct.sh: Likewise.
https://sourceware.org/bugzilla/show_bug.cgi?id=31142
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/Makefile.am | 7 | ||||
| -rw-r--r-- | tests/funcretval_test_struct.c | 86 | ||||
| -rwxr-xr-x | tests/funcretval_test_struct_riscv.bz2 | bin | 0 -> 3821 bytes | |||
| -rwxr-xr-x | tests/run-funcretval-struct-native.sh | 22 | ||||
| -rwxr-xr-x | tests/run-funcretval-struct.sh | 35 |
5 files changed, 150 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 9141074f..9315ec3b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -162,6 +162,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ run-addr2line-C-test.sh \ run-addr2line-i-test.sh run-addr2line-i-lex-test.sh \ run-addr2line-i-demangle-test.sh run-addr2line-alt-debugpath.sh \ + run-funcretval-struct.sh \ run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh run-funcretval.sh \ run-backtrace-native.sh run-backtrace-data.sh run-backtrace-dwarf.sh \ run-backtrace-native-biarch.sh run-backtrace-native-core.sh \ @@ -284,6 +285,10 @@ funcretval_test__11_SOURCES = funcretval_test++11.cxx TESTS += run-funcretval++11.sh endif +check_PROGRAMS += funcretval_test_struct +funcretval_test_struct_SOURCES = funcretval_test_struct.c +TESTS += run-funcretval-struct-native.sh + EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ run-ar-N.sh \ run-show-die-info.sh run-get-files.sh run-get-lines.sh \ @@ -478,6 +483,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ testfile_aarch64_core.bz2 testfile_i686_core.bz2 \ addrx_constx-4.dwo.bz2 addrx_constx-5.dwo.bz2 \ testfile-addrx_constx-4.bz2 testfile-addrx_constx-5.bz2 \ + run-funcretval-struct.sh funcretval_test_struct_riscv.bz2 \ run-funcretval.sh funcretval_test.c funcretval_test_aarch64.bz2 \ run-backtrace-data.sh run-backtrace-dwarf.sh cleanup-13.c \ run-backtrace-native.sh run-backtrace-native-biarch.sh \ @@ -635,6 +641,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ testfile_nvidia_linemap.bz2 \ testfile-largealign.o.bz2 run-strip-largealign.sh \ run-funcretval++11.sh \ + run-funcretval-struct-native.sh \ test-ar-duplicates.a.bz2 \ run-dwfl-core-noncontig.sh testcore-noncontig.bz2 \ testfile-dwarf5-line-clang.bz2 \ diff --git a/tests/funcretval_test_struct.c b/tests/funcretval_test_struct.c new file mode 100644 index 00000000..df94bde0 --- /dev/null +++ b/tests/funcretval_test_struct.c @@ -0,0 +1,86 @@ +/* Copyright (C) 2024 Mark J. Wielaard <[email protected]> + This file is part of elfutils. + + This file 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. + + elfutils 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/>. */ + +typedef struct + { + int q; + int r; + } div_t; + +typedef struct + { + long q; + long r; + } ldiv_t; + +typedef struct + { + float x; + float y; + } point_t; + +typedef struct + { + double x; + double y; + } dpoint_t; + +div_t __attribute__((__noinline__)) +div (int n, int d) +{ + div_t r; + r.q = n / d; + r.r = n % d; + return r; +} + +ldiv_t __attribute__((__noinline__)) +ldiv (long n, long d) +{ + ldiv_t r; + r.q = n / d; + r.r = n % d; + return r; +} + +point_t __attribute__((__noinline__)) +mkpt (float x, float y) +{ + point_t r; + r.x = x; + r.y = y; + return r; +} + +dpoint_t __attribute__((__noinline__)) +dmkpt (double x, double y) +{ + dpoint_t r; + r.x = x; + r.y = y; + return r; +} + +int +main (void) +{ + div_t d = div (3, 2); + ldiv_t ld = ldiv (3, 2); + point_t p = mkpt (3.0f, 1.0f); + dpoint_t dp = dmkpt (3.0d, 1.0d); + + return d.q - (int) p.y + ld.q - (int) dp.y; +} diff --git a/tests/funcretval_test_struct_riscv.bz2 b/tests/funcretval_test_struct_riscv.bz2 Binary files differnew file mode 100755 index 00000000..de3e5ba9 --- /dev/null +++ b/tests/funcretval_test_struct_riscv.bz2 diff --git a/tests/run-funcretval-struct-native.sh b/tests/run-funcretval-struct-native.sh new file mode 100755 index 00000000..798edb3b --- /dev/null +++ b/tests/run-funcretval-struct-native.sh @@ -0,0 +1,22 @@ +#! /bin/sh +# Copyright (C) 2024 Mark J. Wielaard <[email protected]> +# This file is part of elfutils. +# +# This file 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. +# +# elfutils 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/>. + +. $srcdir/test-subr.sh + +# Just run it, we don't know what the native representation is. +# But it should at least work and not error out. +testrun $abs_builddir/funcretval -e $abs_builddir/funcretval_test_struct diff --git a/tests/run-funcretval-struct.sh b/tests/run-funcretval-struct.sh new file mode 100755 index 00000000..92b2a3ab --- /dev/null +++ b/tests/run-funcretval-struct.sh @@ -0,0 +1,35 @@ +#! /bin/sh +# Copyright (C) 2024 Mark J. Wielaard <[email protected]> +# This file is part of elfutils. +# +# This file 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. +# +# elfutils 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/>. + +. $srcdir/test-subr.sh + +# The test files are the native funcretval_test_struct files +# funcretval_test_struct.c +# See also run-funcretval-struct-native.sh + +testfiles funcretval_test_struct_riscv + +testrun_compare ${abs_top_builddir}/tests/funcretval \ + -e funcretval_test_struct_riscv <<\EOF +() main: return value location: {0x5a, 0} +() dmkpt: return value location: {0x90, 0x2a} {0x93, 0x8} {0x90, 0x2b} {0x93, 0x8} +() mkpt: return value location: {0x90, 0x2a} +() ldiv: return value location: {0x5a, 0} {0x93, 0x8} {0x5b, 0} {0x93, 0x8} +() div: return value location: {0x5a, 0} +EOF + +exit 0 |
