From efd3b63b68b56c15ba4558d937214251a4ef16df Mon Sep 17 00:00:00 2001 From: Indu Bhagat Date: Wed, 17 May 2023 23:14:36 -0700 Subject: [PATCH] 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. --- libsframe/Makefile.in | 63 ++++++- libsframe/testsuite/libsframe.find/find.exp | 32 ++++ .../testsuite/libsframe.find/findfre-1.c | 155 ++++++++++++++++++ libsframe/testsuite/libsframe.find/local.mk | 7 + libsframe/testsuite/local.mk | 3 +- 5 files changed, 250 insertions(+), 10 deletions(-) create mode 100644 libsframe/testsuite/libsframe.find/find.exp create mode 100644 libsframe/testsuite/libsframe.find/findfre-1.c create mode 100644 libsframe/testsuite/libsframe.find/local.mk diff --git a/libsframe/Makefile.in b/libsframe/Makefile.in index 107b82ccfdc..2ef60de3f90 100644 --- a/libsframe/Makefile.in +++ b/libsframe/Makefile.in @@ -114,7 +114,8 @@ check_PROGRAMS = $(am__EXEEXT_1) @HAVE_COMPAT_DEJAGNU_TRUE@am__append_4 = testsuite/libsframe.decode/be-flipping \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-2 \ -@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1 +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1 \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1 subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \ @@ -182,7 +183,8 @@ am__v_lt_1 = @HAVE_COMPAT_DEJAGNU_TRUE@am__EXEEXT_1 = testsuite/libsframe.decode/be-flipping$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-1$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-2$(EXEEXT) \ -@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1$(EXEEXT) +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1$(EXEEXT) \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1$(EXEEXT) am__dirstamp = $(am__leading_dot)dirstamp am_testsuite_libsframe_decode_be_flipping_OBJECTS = testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.$(OBJEXT) testsuite_libsframe_decode_be_flipping_OBJECTS = \ @@ -204,6 +206,11 @@ testsuite_libsframe_encode_encode_1_OBJECTS = \ $(am_testsuite_libsframe_encode_encode_1_OBJECTS) testsuite_libsframe_encode_encode_1_DEPENDENCIES = \ ${top_builddir}/libsframe.la +am_testsuite_libsframe_find_findfre_1_OBJECTS = testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.$(OBJEXT) +testsuite_libsframe_find_findfre_1_OBJECTS = \ + $(am_testsuite_libsframe_find_findfre_1_OBJECTS) +testsuite_libsframe_find_findfre_1_DEPENDENCIES = \ + ${top_builddir}/libsframe.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -242,12 +249,14 @@ SOURCES = $(libsframe_la_SOURCES) \ $(testsuite_libsframe_decode_be_flipping_SOURCES) \ $(testsuite_libsframe_decode_frecnt_1_SOURCES) \ $(testsuite_libsframe_decode_frecnt_2_SOURCES) \ - $(testsuite_libsframe_encode_encode_1_SOURCES) + $(testsuite_libsframe_encode_encode_1_SOURCES) \ + $(testsuite_libsframe_find_findfre_1_SOURCES) DIST_SOURCES = $(libsframe_la_SOURCES) \ $(testsuite_libsframe_decode_be_flipping_SOURCES) \ $(testsuite_libsframe_decode_frecnt_1_SOURCES) \ $(testsuite_libsframe_decode_frecnt_2_SOURCES) \ - $(testsuite_libsframe_encode_encode_1_SOURCES) + $(testsuite_libsframe_encode_encode_1_SOURCES) \ + $(testsuite_libsframe_find_findfre_1_SOURCES) AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; @@ -323,6 +332,7 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/doc/local.mk \ $(srcdir)/testsuite/libsframe.decode/local.mk \ $(srcdir)/testsuite/libsframe.encode/local.mk \ + $(srcdir)/testsuite/libsframe.find/local.mk \ $(srcdir)/testsuite/local.mk $(top_srcdir)/../ar-lib \ $(top_srcdir)/../compile $(top_srcdir)/../config.guess \ $(top_srcdir)/../config.sub $(top_srcdir)/../depcomp \ @@ -515,6 +525,9 @@ testsuite_libsframe_decode_frecnt_2_CPPFLAGS = -I${top_srcdir}/../include -Wall testsuite_libsframe_encode_encode_1_SOURCES = testsuite/libsframe.encode/encode-1.c testsuite_libsframe_encode_encode_1_LDADD = ${top_builddir}/libsframe.la testsuite_libsframe_encode_encode_1_CPPFLAGS = -I${top_srcdir}/../include -Wall +testsuite_libsframe_find_findfre_1_SOURCES = testsuite/libsframe.find/findfre-1.c +testsuite_libsframe_find_findfre_1_LDADD = ${top_builddir}/libsframe.la +testsuite_libsframe_find_findfre_1_CPPFLAGS = -I${top_srcdir}/../include -Wall all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -522,7 +535,7 @@ all: config.h .SUFFIXES: .c .dvi .lo .o .obj .ps am--refresh: Makefile @: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -544,7 +557,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; -$(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(am__empty): +$(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -667,11 +680,25 @@ testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.$(OBJEXT testsuite/libsframe.encode/encode-1$(EXEEXT): $(testsuite_libsframe_encode_encode_1_OBJECTS) $(testsuite_libsframe_encode_encode_1_DEPENDENCIES) $(EXTRA_testsuite_libsframe_encode_encode_1_DEPENDENCIES) testsuite/libsframe.encode/$(am__dirstamp) @rm -f testsuite/libsframe.encode/encode-1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testsuite_libsframe_encode_encode_1_OBJECTS) $(testsuite_libsframe_encode_encode_1_LDADD) $(LIBS) +testsuite/libsframe.find/$(am__dirstamp): + @$(MKDIR_P) testsuite/libsframe.find + @: > testsuite/libsframe.find/$(am__dirstamp) +testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) testsuite/libsframe.find/$(DEPDIR) + @: > testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp) +testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.$(OBJEXT): \ + testsuite/libsframe.find/$(am__dirstamp) \ + testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp) + +testsuite/libsframe.find/findfre-1$(EXEEXT): $(testsuite_libsframe_find_findfre_1_OBJECTS) $(testsuite_libsframe_find_findfre_1_DEPENDENCIES) $(EXTRA_testsuite_libsframe_find_findfre_1_DEPENDENCIES) testsuite/libsframe.find/$(am__dirstamp) + @rm -f testsuite/libsframe.find/findfre-1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testsuite_libsframe_find_findfre_1_OBJECTS) $(testsuite_libsframe_find_findfre_1_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f testsuite/libsframe.decode/*.$(OBJEXT) -rm -f testsuite/libsframe.encode/*.$(OBJEXT) + -rm -f testsuite/libsframe.find/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @@ -683,6 +710,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_1-frecnt-1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @@ -785,6 +813,20 @@ testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.obj: tes @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_encode_encode_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.obj `if test -f 'testsuite/libsframe.encode/encode-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.encode/encode-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.encode/encode-1.c'; fi` +testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.o: testsuite/libsframe.find/findfre-1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.o -MD -MP -MF testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Tpo -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.o `test -f 'testsuite/libsframe.find/findfre-1.c' || echo '$(srcdir)/'`testsuite/libsframe.find/findfre-1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Tpo testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.find/findfre-1.c' object='testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.o `test -f 'testsuite/libsframe.find/findfre-1.c' || echo '$(srcdir)/'`testsuite/libsframe.find/findfre-1.c + +testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj: testsuite/libsframe.find/findfre-1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj -MD -MP -MF testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Tpo -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj `if test -f 'testsuite/libsframe.find/findfre-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.find/findfre-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.find/findfre-1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Tpo testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.find/findfre-1.c' object='testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj `if test -f 'testsuite/libsframe.find/findfre-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.find/findfre-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.find/findfre-1.c'; fi` + mostlyclean-libtool: -rm -f *.lo @@ -792,6 +834,7 @@ clean-libtool: -rm -rf .libs _libs -rm -rf testsuite/libsframe.decode/.libs testsuite/libsframe.decode/_libs -rm -rf testsuite/libsframe.encode/.libs testsuite/libsframe.encode/_libs + -rm -rf testsuite/libsframe.find/.libs testsuite/libsframe.find/_libs distclean-libtool: -rm -f libtool config.lt @@ -1251,6 +1294,8 @@ distclean-generic: -rm -f testsuite/libsframe.decode/$(am__dirstamp) -rm -f testsuite/libsframe.encode/$(DEPDIR)/$(am__dirstamp) -rm -f testsuite/libsframe.encode/$(am__dirstamp) + -rm -f testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp) + -rm -f testsuite/libsframe.find/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -1266,7 +1311,7 @@ clean-am: clean-aminfo clean-checkPROGRAMS clean-generic \ distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) + -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-DEJAGNU distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ @@ -1406,7 +1451,7 @@ installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) + -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic @@ -1481,7 +1526,7 @@ check-DEJAGNU: site.exp else echo "WARNING: could not find \`runtest'" 1>&2; :;\ fi -# libsframe encoder/decoder testsuite +# libsframe encoder/decoder/find testsuite # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/libsframe/testsuite/libsframe.find/find.exp b/libsframe/testsuite/libsframe.find/find.exp new file mode 100644 index 00000000000..463d94ab6c9 --- /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 00000000000..a10da448a95 --- /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 . */ + +#include "config.h" + +#include +#include +#include + +#include "sframe-api.h" + +/* DejaGnu should not use gnulib's vsnprintf replacement here. */ +#undef vsnprintf +#include + +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 00000000000..9943520446d --- /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 83eca774d41..5e5ba927f75 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 -- 2.30.2