diff options
author | Indu Bhagat <indu.bhagat@oracle.com> | 2023-05-17 23:14:36 -0700 |
---|---|---|
committer | Indu Bhagat <indu.bhagat@oracle.com> | 2023-05-17 23:14:36 -0700 |
commit | efd3b63b68b56c15ba4558d937214251a4ef16df (patch) | |
tree | ac0fe48241e3369f1d2067d188813b1052d6db41 /libsframe/testsuite | |
parent | 0cc8cc5e6f82b8d3d8e3803c6f7f5e63f0c866ad (diff) | |
download | binutils-efd3b63b68b56c15ba4558d937214251a4ef16df.zip binutils-efd3b63b68b56c15ba4558d937214251a4ef16df.tar.gz binutils-efd3b63b68b56c15ba4558d937214251a4ef16df.tar.bz2 |
libsframe: testsuite: add new tests for sframe_find_fre API
libsframe provides an API to find the FRE associated with a given PC in
the program. This patch adds a direct test of this API.
In this test, we create two dummy SFrame FDEs with 4 FREs each. Then we
test that sframe_find_fre () works for the first, second, third and the
last FRE from one of the FDEs. Such a test ensures better regression
testing for the sframe_find_fre () function which is going to be the
bread and butter of an SFrame based stack tracer.
libsframe/
* Makefile.in: Regenerated.
* testsuite/libsframe.find/find.exp: New test.
* testsuite/libsframe.find/findfre-1.c: New test.
* testsuite/libsframe.find/local.mk: Build new test.
* testsuite/local.mk: Include libsframe.find.
Diffstat (limited to 'libsframe/testsuite')
-rw-r--r-- | libsframe/testsuite/libsframe.find/find.exp | 32 | ||||
-rw-r--r-- | libsframe/testsuite/libsframe.find/findfre-1.c | 155 | ||||
-rw-r--r-- | libsframe/testsuite/libsframe.find/local.mk | 7 | ||||
-rw-r--r-- | libsframe/testsuite/local.mk | 3 |
4 files changed, 196 insertions, 1 deletions
diff --git a/libsframe/testsuite/libsframe.find/find.exp b/libsframe/testsuite/libsframe.find/find.exp new file mode 100644 index 0000000..463d94a --- /dev/null +++ b/libsframe/testsuite/libsframe.find/find.exp @@ -0,0 +1,32 @@ +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. +# + +load_lib dejagnu.exp + +# Run the tests only if compatible dejagnu gcc pair is found +if [string equal $COMPAT_DEJAGNU "no"] { + verbose -log "SFrame testsuite needs perhaps a more recent DejaGnu" + unsupported findfre-1 + return; +} + +if { [host_execute "testsuite/libsframe.find/findfre-1"] ne "" } { + fail "findfre-1" +} diff --git a/libsframe/testsuite/libsframe.find/findfre-1.c b/libsframe/testsuite/libsframe.find/findfre-1.c new file mode 100644 index 0000000..a10da44 --- /dev/null +++ b/libsframe/testsuite/libsframe.find/findfre-1.c @@ -0,0 +1,155 @@ +/* findfre-1.c -- Test for sframe_find_fre in libsframe. + + Copyright (C) 2023 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/>. */ + +#include "config.h" + +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> + +#include "sframe-api.h" + +/* DejaGnu should not use gnulib's vsnprintf replacement here. */ +#undef vsnprintf +#include <dejagnu.h> + +static int +add_fde1 (sframe_encoder_ctx *encode, int idx) +{ + int i, err; + /* A contiguous block containing 4 FREs. */ + sframe_frame_row_entry fres[] + = { {0x0, {0x1, 0, 0}, 0x3}, + {0x1, {0x2, 0xf0, 0}, 0x5}, + {0x10, {0x3, 0xf0, 0}, 0x4}, + {0x38, {0x8, 0xf0, 0}, 0x5} + }; + + unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, + SFRAME_FDE_TYPE_PCINC); + err = sframe_encoder_add_funcdesc (encode, 0xfffff03e, 0x40, finfo, 4); + if (err == -1) + return err; + + for (i = 0; i < 4; i++) + if (sframe_encoder_add_fre (encode, idx,fres+i) == SFRAME_ERR) + return -1; + + return 0; +} + +static int +add_fde2 (sframe_encoder_ctx *encode, int idx) +{ + int i, err; + /* A contiguous block containing 4 FREs. */ + sframe_frame_row_entry fres[] + = { {0x0, {0x10, 0, 0}, 0x3}, + {0x10, {0x12, 0xf0, 0}, 0x5}, + {0x14, {0x14, 0xf0, 0}, 0x4}, + {0x20, {0x15, 0xf0, 0}, 0x5} + }; + + unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, + SFRAME_FDE_TYPE_PCINC); + err = sframe_encoder_add_funcdesc (encode, 0xfffff08e, 0x60, finfo, 4); + if (err == -1) + return err; + + for (i = 0; i < 4; i++) + if (sframe_encoder_add_fre (encode, idx, fres+i) == SFRAME_ERR) + return -1; + + return 0; +} + +int main (void) +{ + sframe_encoder_ctx *encode; + sframe_decoder_ctx *dctx; + sframe_frame_row_entry frep; + char *sframe_buf; + size_t sf_size; + int err = 0; + unsigned int fde_cnt = 0; + +#define TEST(name, cond) \ + do \ + { \ + if (cond) \ + pass (name); \ + else \ + fail (name); \ + } \ + while (0) + + encode = sframe_encode (SFRAME_VERSION, 0, + SFRAME_ABI_AMD64_ENDIAN_LITTLE, + SFRAME_CFA_FIXED_FP_INVALID, + -8, /* Fixed RA offset for AMD64. */ + &err); + + err = add_fde1 (encode, 0); + TEST ("findfre-1: Adding FDE1", err == 0); + + err = add_fde2 (encode, 1); + TEST ("findfre-1: Adding FDE2", err == 0); + + fde_cnt = sframe_encoder_get_num_fidx (encode); + TEST ("findfre-1: Test FDE count", fde_cnt == 2); + + sframe_buf = sframe_encoder_write (encode, &sf_size, &err); + TEST ("findfre-1: Encoder write", err == 0); + + dctx = sframe_decode (sframe_buf, sf_size, &err); + TEST("findfre-1: Decoder setup", dctx != NULL); + + /* Find the third FRE in first FDE. */ + err = sframe_find_fre (dctx, (0xfffff03e + 0x15), &frep); + TEST("findfre-1: Find third FRE", + ((err == 0) && (sframe_fre_get_cfa_offset(dctx, &frep, &err) == 0x3))); + + /* Find an FRE for PC at the end of range covered by FRE. */ + err = sframe_find_fre (dctx, (0xfffff03e + 0x9), &frep); + TEST("findfre-1: Find FRE for last PC covered by FRE", + ((err == 0) && (sframe_fre_get_cfa_offset(dctx, &frep, &err) == 0x2))); + + /* Find the last FRE in first FDE. */ + err = sframe_find_fre (dctx, (0xfffff03e + 0x39), &frep); + TEST("findfre-1: Find last FRE", + ((err == 0) && (sframe_fre_get_cfa_offset(dctx, &frep, &err) == 0x8))); + + /* Find the second FRE in second FDE. */ + err = sframe_find_fre (dctx, (0xfffff08e + 0x11), &frep); + TEST("findfre-1: Find second FRE", + ((err == 0) && (sframe_fre_get_cfa_offset(dctx, &frep, &err) == 0x12))); + + /* Find the first FRE in second FDE. */ + err = sframe_find_fre (dctx, (0xfffff08e + 0x0), &frep); + TEST("findfre-1: Find first FRE", + ((err == 0) && (sframe_fre_get_cfa_offset(dctx, &frep, &err) == 0x10))); + + /* Find FRE for PC out of range. Expect error code. */ + err = sframe_find_fre (dctx, (0xfffff03e + 0x40), &frep); + TEST("findfre-1: Find FRE for out of range PC", + (err == SFRAME_ERR)); + + sframe_encoder_free (&encode); + sframe_decoder_free (&dctx); + + return 0; +} diff --git a/libsframe/testsuite/libsframe.find/local.mk b/libsframe/testsuite/libsframe.find/local.mk new file mode 100644 index 0000000..9943520 --- /dev/null +++ b/libsframe/testsuite/libsframe.find/local.mk @@ -0,0 +1,7 @@ +if HAVE_COMPAT_DEJAGNU + check_PROGRAMS += %D%/findfre-1 +endif + +%C%_findfre_1_SOURCES = %D%/findfre-1.c +%C%_findfre_1_LDADD = ${top_builddir}/libsframe.la +%C%_findfre_1_CPPFLAGS = -I${top_srcdir}/../include -Wall diff --git a/libsframe/testsuite/local.mk b/libsframe/testsuite/local.mk index 83eca77..5e5ba92 100644 --- a/libsframe/testsuite/local.mk +++ b/libsframe/testsuite/local.mk @@ -19,6 +19,7 @@ check-DEJAGNU: site.exp else echo "WARNING: could not find \`runtest'" 1>&2; :;\ fi -# libsframe encoder/decoder testsuite +# libsframe encoder/decoder/find testsuite include %D%/libsframe.decode/local.mk include %D%/libsframe.encode/local.mk +include %D%/libsframe.find/local.mk |