From 55575b6058fc228609e9a56c7860976f3e02b0ee Mon Sep 17 00:00:00 2001 From: Indu Bhagat Date: Thu, 15 Jan 2026 16:44:03 -0800 Subject: [PATCH] [SFrame-V3] libsframe: testsuite: add new testcases for SFRAME_FDE_TYPE_FLEX This patch adds two new tests for SFrame V3 changes, focusing on the newly added flexible FDE TYPE SFRAME_FDE_TYPE_FLEX. Following tests are added: - be-flipping-v3.c: Validates that big-endian SFrame V3 data is correctly endian flipped when run on little-endian hosts. It verifies the decoding of CFA offsets and the new V3 register/offset metadata bitfields using the SFRAME_V3_FLEX_FDE_OFFSET_REG_* macros. - findfre-flex-1.c: Tests a variety of sframe_find_fre lookup scenarios, apart from checking the basic encoder/decoder APIs. Documentation for the binary test data DATA-BE-V3 is provided in README-be-flipping-v3 to ensure reproducibility. libsframe/ * Makefile.in: Regenerate. * testsuite/libsframe.decode/DATA-BE-V3: New test data. * testsuite/libsframe.decode/README-be-flipping-v3: New file. * testsuite/libsframe.decode/be-flipping-v3.c: New test. * testsuite/libsframe.decode/decode.exp: Run be-flipping-v3. * testsuite/libsframe.decode/local.mk: Add be-flipping-v3. * testsuite/libsframe.find/find.exp: Run findfre-flex-1. * testsuite/libsframe.find/findfre-flex-1.c: New test. * testsuite/libsframe.find/local.mk: Add findfre-flex-1. --- libsframe/Makefile.in | 68 ++++++ .../testsuite/libsframe.decode/DATA-BE-V3 | Bin 0 -> 77 bytes .../libsframe.decode/README-be-flipping-v3 | 58 +++++ .../libsframe.decode/be-flipping-v3.c | 118 ++++++++++ .../testsuite/libsframe.decode/decode.exp | 6 + libsframe/testsuite/libsframe.decode/local.mk | 7 +- libsframe/testsuite/libsframe.find/find.exp | 4 + .../testsuite/libsframe.find/findfre-flex-1.c | 205 ++++++++++++++++++ libsframe/testsuite/libsframe.find/local.mk | 6 +- 9 files changed, 470 insertions(+), 2 deletions(-) create mode 100644 libsframe/testsuite/libsframe.decode/DATA-BE-V3 create mode 100644 libsframe/testsuite/libsframe.decode/README-be-flipping-v3 create mode 100644 libsframe/testsuite/libsframe.decode/be-flipping-v3.c create mode 100644 libsframe/testsuite/libsframe.find/findfre-flex-1.c diff --git a/libsframe/Makefile.in b/libsframe/Makefile.in index 308ec16d97d..bd61638262b 100644 --- a/libsframe/Makefile.in +++ b/libsframe/Makefile.in @@ -113,11 +113,13 @@ target_triplet = @target@ @BUILD_INFO_TRUE@am__append_3 = doc/sframe-spec.info check_PROGRAMS = $(am__EXEEXT_1) @HAVE_COMPAT_DEJAGNU_TRUE@am__append_4 = testsuite/libsframe.decode/be-flipping \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/be-flipping-v3 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-2 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-v2 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1 \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-flex-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfunc-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-1 \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-2 @@ -192,11 +194,13 @@ libsframe_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ @INSTALL_LIBBFD_FALSE@am_libsframe_la_rpath = @INSTALL_LIBBFD_TRUE@am_libsframe_la_rpath = -rpath $(libdir) @HAVE_COMPAT_DEJAGNU_TRUE@am__EXEEXT_1 = testsuite/libsframe.decode/be-flipping$(EXEEXT) \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/be-flipping-v3$(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.decode/frecnt-v2$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1$(EXEEXT) \ +@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-flex-1$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfunc-1$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-1$(EXEEXT) \ @HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-2$(EXEEXT) @@ -206,6 +210,11 @@ testsuite_libsframe_decode_be_flipping_OBJECTS = \ $(am_testsuite_libsframe_decode_be_flipping_OBJECTS) testsuite_libsframe_decode_be_flipping_DEPENDENCIES = \ $(testsuite_LDADD) +am_testsuite_libsframe_decode_be_flipping_v3_OBJECTS = testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.$(OBJEXT) +testsuite_libsframe_decode_be_flipping_v3_OBJECTS = \ + $(am_testsuite_libsframe_decode_be_flipping_v3_OBJECTS) +testsuite_libsframe_decode_be_flipping_v3_DEPENDENCIES = \ + $(testsuite_LDADD) am_testsuite_libsframe_decode_frecnt_1_OBJECTS = testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.$(OBJEXT) testsuite_libsframe_decode_frecnt_1_OBJECTS = \ $(am_testsuite_libsframe_decode_frecnt_1_OBJECTS) @@ -227,6 +236,11 @@ am_testsuite_libsframe_find_findfre_1_OBJECTS = testsuite/libsframe.find/testsui testsuite_libsframe_find_findfre_1_OBJECTS = \ $(am_testsuite_libsframe_find_findfre_1_OBJECTS) testsuite_libsframe_find_findfre_1_DEPENDENCIES = $(testsuite_LDADD) +am_testsuite_libsframe_find_findfre_flex_1_OBJECTS = testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.$(OBJEXT) +testsuite_libsframe_find_findfre_flex_1_OBJECTS = \ + $(am_testsuite_libsframe_find_findfre_flex_1_OBJECTS) +testsuite_libsframe_find_findfre_flex_1_DEPENDENCIES = \ + $(testsuite_LDADD) am_testsuite_libsframe_find_findfunc_1_OBJECTS = testsuite/libsframe.find/testsuite_libsframe_find_findfunc_1-findfunc-1.$(OBJEXT) testsuite_libsframe_find_findfunc_1_OBJECTS = \ $(am_testsuite_libsframe_find_findfunc_1_OBJECTS) @@ -277,21 +291,25 @@ am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsframe_la_SOURCES) \ $(testsuite_libsframe_decode_be_flipping_SOURCES) \ + $(testsuite_libsframe_decode_be_flipping_v3_SOURCES) \ $(testsuite_libsframe_decode_frecnt_1_SOURCES) \ $(testsuite_libsframe_decode_frecnt_2_SOURCES) \ $(testsuite_libsframe_decode_frecnt_v2_SOURCES) \ $(testsuite_libsframe_encode_encode_1_SOURCES) \ $(testsuite_libsframe_find_findfre_1_SOURCES) \ + $(testsuite_libsframe_find_findfre_flex_1_SOURCES) \ $(testsuite_libsframe_find_findfunc_1_SOURCES) \ $(testsuite_libsframe_find_plt_findfre_1_SOURCES) \ $(testsuite_libsframe_find_plt_findfre_2_SOURCES) DIST_SOURCES = $(libsframe_la_SOURCES) \ $(testsuite_libsframe_decode_be_flipping_SOURCES) \ + $(testsuite_libsframe_decode_be_flipping_v3_SOURCES) \ $(testsuite_libsframe_decode_frecnt_1_SOURCES) \ $(testsuite_libsframe_decode_frecnt_2_SOURCES) \ $(testsuite_libsframe_decode_frecnt_v2_SOURCES) \ $(testsuite_libsframe_encode_encode_1_SOURCES) \ $(testsuite_libsframe_find_findfre_1_SOURCES) \ + $(testsuite_libsframe_find_findfre_flex_1_SOURCES) \ $(testsuite_libsframe_find_findfunc_1_SOURCES) \ $(testsuite_libsframe_find_plt_findfre_1_SOURCES) \ $(testsuite_libsframe_find_plt_findfre_2_SOURCES) @@ -569,6 +587,9 @@ testsuite_CPPFLAGS = -I$(srcdir)/testsuite -I$(srcdir)/../include testsuite_libsframe_decode_be_flipping_SOURCES = testsuite/libsframe.decode/be-flipping.c testsuite_libsframe_decode_be_flipping_LDADD = $(testsuite_LDADD) testsuite_libsframe_decode_be_flipping_CPPFLAGS = $(testsuite_CPPFLAGS) +testsuite_libsframe_decode_be_flipping_v3_SOURCES = testsuite/libsframe.decode/be-flipping-v3.c +testsuite_libsframe_decode_be_flipping_v3_LDADD = $(testsuite_LDADD) +testsuite_libsframe_decode_be_flipping_v3_CPPFLAGS = $(testsuite_CPPFLAGS) testsuite_libsframe_decode_frecnt_1_SOURCES = testsuite/libsframe.decode/frecnt-1.c testsuite_libsframe_decode_frecnt_1_LDADD = $(testsuite_LDADD) testsuite_libsframe_decode_frecnt_1_CPPFLAGS = $(testsuite_CPPFLAGS) @@ -584,6 +605,9 @@ testsuite_libsframe_encode_encode_1_CPPFLAGS = $(testsuite_CPPFLAGS) testsuite_libsframe_find_findfre_1_SOURCES = testsuite/libsframe.find/findfre-1.c testsuite_libsframe_find_findfre_1_LDADD = $(testsuite_LDADD) testsuite_libsframe_find_findfre_1_CPPFLAGS = $(testsuite_CPPFLAGS) +testsuite_libsframe_find_findfre_flex_1_SOURCES = testsuite/libsframe.find/findfre-flex-1.c +testsuite_libsframe_find_findfre_flex_1_LDADD = $(testsuite_LDADD) +testsuite_libsframe_find_findfre_flex_1_CPPFLAGS = $(testsuite_CPPFLAGS) testsuite_libsframe_find_findfunc_1_SOURCES = testsuite/libsframe.find/findfunc-1.c testsuite_libsframe_find_findfunc_1_LDADD = $(testsuite_LDADD) testsuite_libsframe_find_findfunc_1_CPPFLAGS = $(testsuite_CPPFLAGS) @@ -718,6 +742,13 @@ testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.$( testsuite/libsframe.decode/be-flipping$(EXEEXT): $(testsuite_libsframe_decode_be_flipping_OBJECTS) $(testsuite_libsframe_decode_be_flipping_DEPENDENCIES) $(EXTRA_testsuite_libsframe_decode_be_flipping_DEPENDENCIES) testsuite/libsframe.decode/$(am__dirstamp) @rm -f testsuite/libsframe.decode/be-flipping$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testsuite_libsframe_decode_be_flipping_OBJECTS) $(testsuite_libsframe_decode_be_flipping_LDADD) $(LIBS) +testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.$(OBJEXT): \ + testsuite/libsframe.decode/$(am__dirstamp) \ + testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp) + +testsuite/libsframe.decode/be-flipping-v3$(EXEEXT): $(testsuite_libsframe_decode_be_flipping_v3_OBJECTS) $(testsuite_libsframe_decode_be_flipping_v3_DEPENDENCIES) $(EXTRA_testsuite_libsframe_decode_be_flipping_v3_DEPENDENCIES) testsuite/libsframe.decode/$(am__dirstamp) + @rm -f testsuite/libsframe.decode/be-flipping-v3$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testsuite_libsframe_decode_be_flipping_v3_OBJECTS) $(testsuite_libsframe_decode_be_flipping_v3_LDADD) $(LIBS) testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.$(OBJEXT): \ testsuite/libsframe.decode/$(am__dirstamp) \ testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp) @@ -765,6 +796,13 @@ testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.$(OBJEXT): 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) +testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.$(OBJEXT): \ + testsuite/libsframe.find/$(am__dirstamp) \ + testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp) + +testsuite/libsframe.find/findfre-flex-1$(EXEEXT): $(testsuite_libsframe_find_findfre_flex_1_OBJECTS) $(testsuite_libsframe_find_findfre_flex_1_DEPENDENCIES) $(EXTRA_testsuite_libsframe_find_findfre_flex_1_DEPENDENCIES) testsuite/libsframe.find/$(am__dirstamp) + @rm -f testsuite/libsframe.find/findfre-flex-1$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testsuite_libsframe_find_findfre_flex_1_OBJECTS) $(testsuite_libsframe_find_findfre_flex_1_LDADD) $(LIBS) testsuite/libsframe.find/testsuite_libsframe_find_findfunc_1-findfunc-1.$(OBJEXT): \ testsuite/libsframe.find/$(am__dirstamp) \ testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp) @@ -800,11 +838,13 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframe_la-sframe-error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframe_la-sframe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Po@am__quote@ @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.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_v2-frecnt-v2.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@ +@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfunc_1-findfunc-1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_plt_findfre_1-plt-findfre-1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_plt_findfre_2-plt-findfre-2.Po@am__quote@ @@ -868,6 +908,20 @@ testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.ob @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_decode_be_flipping_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.obj `if test -f 'testsuite/libsframe.decode/be-flipping.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/be-flipping.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/be-flipping.c'; fi` +testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.o: testsuite/libsframe.decode/be-flipping-v3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_be_flipping_v3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.o -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.o `test -f 'testsuite/libsframe.decode/be-flipping-v3.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/be-flipping-v3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.decode/be-flipping-v3.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.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_decode_be_flipping_v3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.o `test -f 'testsuite/libsframe.decode/be-flipping-v3.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/be-flipping-v3.c + +testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.obj: testsuite/libsframe.decode/be-flipping-v3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_be_flipping_v3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.obj -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.obj `if test -f 'testsuite/libsframe.decode/be-flipping-v3.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/be-flipping-v3.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/be-flipping-v3.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.decode/be-flipping-v3.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.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_decode_be_flipping_v3_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping_v3-be-flipping-v3.obj `if test -f 'testsuite/libsframe.decode/be-flipping-v3.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/be-flipping-v3.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/be-flipping-v3.c'; fi` + testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.o: testsuite/libsframe.decode/frecnt-1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_frecnt_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.o -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_1-frecnt-1.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.o `test -f 'testsuite/libsframe.decode/frecnt-1.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/frecnt-1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_1-frecnt-1.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_1-frecnt-1.Po @@ -938,6 +992,20 @@ testsuite/libsframe.find/testsuite_libsframe_find_findfre_1-findfre-1.obj: tests @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` +testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.o: testsuite/libsframe.find/findfre-flex-1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_flex_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.o -MD -MP -MF testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Tpo -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.o `test -f 'testsuite/libsframe.find/findfre-flex-1.c' || echo '$(srcdir)/'`testsuite/libsframe.find/findfre-flex-1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Tpo testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.find/findfre-flex-1.c' object='testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-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_flex_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.o `test -f 'testsuite/libsframe.find/findfre-flex-1.c' || echo '$(srcdir)/'`testsuite/libsframe.find/findfre-flex-1.c + +testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.obj: testsuite/libsframe.find/findfre-flex-1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfre_flex_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.obj -MD -MP -MF testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Tpo -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.obj `if test -f 'testsuite/libsframe.find/findfre-flex-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.find/findfre-flex-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.find/findfre-flex-1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Tpo testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.find/findfre-flex-1.c' object='testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-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_flex_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfre_flex_1-findfre-flex-1.obj `if test -f 'testsuite/libsframe.find/findfre-flex-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.find/findfre-flex-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.find/findfre-flex-1.c'; fi` + testsuite/libsframe.find/testsuite_libsframe_find_findfunc_1-findfunc-1.o: testsuite/libsframe.find/findfunc-1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_find_findfunc_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.find/testsuite_libsframe_find_findfunc_1-findfunc-1.o -MD -MP -MF testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfunc_1-findfunc-1.Tpo -c -o testsuite/libsframe.find/testsuite_libsframe_find_findfunc_1-findfunc-1.o `test -f 'testsuite/libsframe.find/findfunc-1.c' || echo '$(srcdir)/'`testsuite/libsframe.find/findfunc-1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfunc_1-findfunc-1.Tpo testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfunc_1-findfunc-1.Po diff --git a/libsframe/testsuite/libsframe.decode/DATA-BE-V3 b/libsframe/testsuite/libsframe.decode/DATA-BE-V3 new file mode 100644 index 0000000000000000000000000000000000000000..2266b9ab74fcff869984172809ab933194089975 GIT binary patch literal 77 zcmccjh?$jz0Sp*{Br6arLbwb9{~_QAkS_%mV`TuUVX0(b;izP2WZ>Wdk(~@8V4eg} F8~{B$4yFJA literal 0 HcmV?d00001 diff --git a/libsframe/testsuite/libsframe.decode/README-be-flipping-v3 b/libsframe/testsuite/libsframe.decode/README-be-flipping-v3 new file mode 100644 index 00000000000..22d1c6893ef --- /dev/null +++ b/libsframe/testsuite/libsframe.decode/README-be-flipping-v3 @@ -0,0 +1,58 @@ +$ cat be-flipping-v3.s + .text + .type bar, @function +bar: + .cfi_sections + .cfi_startproc + ldgr %f0,%r14 + .cfi_register 14, 16 + ldgr %f2,%r11 + .cfi_register 11, 17 + la %r11,0 + la %r14,0 +.Lreturn: + lgdr %r11,%f2 + .cfi_restore 11 + lgdr %r14,%f0 + .cfi_restore 14 + br %r14 + .cfi_endproc + .size bar,.-bar + + .globl _start + .type _start, @function +_start: + brasl %r14,bar@PLT + .size _start,.-_start + +$ s390x-ibm-linux-gnu-as --gsframe-3 -o be-flipping-v3.o be-flipping-v3.s + +Although running ld is not strictly necessary for the current set of tests, it +is being done in case future testing desires invoking sframe_find_fre (). +SFrame FDE lookup APIs in libsframe currently implement binary search of index +entires (and check for SFRAME_F_FDE_SORTED). + +$ s390x-ibm-linux-gnu-ld be-flipping-v3.o -o be-flipping-v3 +$ s390x-ibm-linux-gnu-objdump --sframe be-flipping-v3 + +be-flipping-v3: file format elf64-s390 + +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_3 + Flags: SFRAME_F_FDE_SORTED, + SFRAME_F_FDE_FUNC_START_PCREL + Num FDEs: 1 + Num FREs: 5 + + Function Index : + + func idx [0]: pc = 0x10000b0, size = 26 bytes, attr = "F" + STARTPC CFA FP RA + 00000000010000b0 sp+160 u u + 00000000010000b4 sp+160 u r16+0 + 00000000010000b8 sp+160 r17+0 r16+0 + 00000000010000c4 sp+160 u r16+0 + 00000000010000c8 sp+160 u u +$ s390x-ibm-linux-gnu-objcopy --dump-section .sframe=DATA-BE-V3 be-flipping-v3 diff --git a/libsframe/testsuite/libsframe.decode/be-flipping-v3.c b/libsframe/testsuite/libsframe.decode/be-flipping-v3.c new file mode 100644 index 00000000000..f573c4bbf82 --- /dev/null +++ b/libsframe/testsuite/libsframe.decode/be-flipping-v3.c @@ -0,0 +1,118 @@ +/* be-flipping-v3.c -- Test for handling different endianness for SFrame V3 + flex FDE in libsframe. + + Copyright (C) 2026 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 "sframe-test.h" + +/* SFrame info from the source specified in README-be-flipping-v3. It contains + one flex FDE with 5 FREs. */ +#define DATA "DATA-BE-V3" + +int +main (void) +{ + sframe_decoder_ctx *dctx = NULL; + uint32_t nfres, fsize; + int32_t fstart; + unsigned char finfo; + int err = 0, err_reg_data = 0; + uint32_t reg_data = 0; + + FILE *fp; + struct stat st; + char *sf_buf; + size_t sf_size; + uint8_t rep_block_size; + + /* Test setup. */ + fp = fopen (DATA, "r"); + if (fp == NULL) + goto setup_fail; + if (fstat (fileno (fp), &st) < 0) + { + perror ("fstat"); + fclose (fp); + goto setup_fail; + } + sf_buf = malloc (st.st_size); + if (sf_buf == NULL) + { + perror ("malloc"); + goto setup_fail; + } + sf_size = fread (sf_buf, 1, st.st_size, fp); + fclose (fp); + if (sf_size == 0) + { + fprintf (stderr, "Decode: Read buffer failed\n"); + goto setup_fail; + } + + uint32_t dfde = SFRAME_FDE_TYPE_FLEX; + /* Execute tests. */ + + /* Call to sframe_decode will endian flip the input buffer (big-endian) if + the host running the test is a little-endian system. This endian-flipped + copy of the buffer is kept internally in dctx. */ + dctx = sframe_decode (sf_buf, sf_size, &err); + TEST (dctx != NULL, "be-flipping-v3: Decoder setup"); + + unsigned int fde_cnt = sframe_decoder_get_num_fidx (dctx); + TEST (fde_cnt == 1, "be-flipping-v3: Decoder FDE count"); + + err = sframe_decoder_get_funcdesc_v2 (dctx, 0, &nfres, &fsize, &fstart, + &finfo, &rep_block_size); + TEST (err == 0, "be-flipping-v3: Decoder get FDE"); + TEST (nfres == 5, "be-flipping-v3: Decoder FRE count"); + + /* Get the FRE at index 2. */ + sframe_frame_row_entry fre = {0}; + err = sframe_decoder_get_fre (dctx, 0, 2, &fre); + TEST (err == 0, "be-flipping-v3: Decoder get third FRE"); + + /* Expected CFA offset of 160. */ + TEST ((err == 0 && sframe_fre_get_cfa_offset (dctx, &fre, dfde, &err) == 0xa0), + "be-flipping-v3: Get CFA offset of third FRE"); + + /* Expected RA reg r16. */ + reg_data = sframe_get_fre_udata (&fre, SFRAME_FRE_RA_OFFSET_IDX * 2, + &err_reg_data); + TEST ((err_reg_data == 0 && SFRAME_V3_FLEX_FDE_OFFSET_REG_P (reg_data) == 0x1), + "be-flipping-v3: Whether RA reg_p is true"); + TEST ((err_reg_data == 0 && SFRAME_V3_FLEX_FDE_OFFSET_REG_NUM (reg_data) == 16), + "be-flipping-v3: Get RA reg of third FRE"); + + /* Expected FP reg r17. */ + err_reg_data = 0; + reg_data = sframe_get_fre_udata (&fre, SFRAME_FRE_FP_OFFSET_IDX * 2, + &err_reg_data); + TEST ((err_reg_data == 0 && SFRAME_V3_FLEX_FDE_OFFSET_REG_P (reg_data) == 0x1), + "be-flipping-v3: Whether FP reg_p is true"); + TEST ((err_reg_data == 0 && SFRAME_V3_FLEX_FDE_OFFSET_REG_NUM (reg_data) == 17), + "be-flipping-v3: Get FP reg of third FRE"); + + free (sf_buf); + sf_buf = NULL; + + sframe_decoder_free (&dctx); + return 0; + +setup_fail: + sframe_decoder_free (&dctx); + fail ("be-flipping-v3: Test setup"); + return 1; +} diff --git a/libsframe/testsuite/libsframe.decode/decode.exp b/libsframe/testsuite/libsframe.decode/decode.exp index 37a27262858..9afc9d21b0c 100644 --- a/libsframe/testsuite/libsframe.decode/decode.exp +++ b/libsframe/testsuite/libsframe.decode/decode.exp @@ -33,11 +33,16 @@ catch "exec ln -s $srcdir/libsframe.decode/DATA1 ." status catch "exec ln -s $srcdir/libsframe.decode/DATA2 ." status catch "exec ln -s $srcdir/libsframe.decode/DATA-V2 ." status catch "exec ln -s $srcdir/libsframe.decode/DATA-BE ." status +catch "exec ln -s $srcdir/libsframe.decode/DATA-BE-V3 ." status if { [host_execute "testsuite/libsframe.decode/be-flipping"] ne "" } { fail "be-flipping" } +if { [host_execute "testsuite/libsframe.decode/be-flipping-v3"] ne "" } { + fail "be-flipping-v3" +} + if { [host_execute "testsuite/libsframe.decode/frecnt-1"] ne "" } { fail "frecnt-1" } @@ -54,3 +59,4 @@ catch "exec rm DATA1" status catch "exec rm DATA2" status catch "exec rm DATA-V2" status catch "exec rm DATA-BE" status +catch "exec rm DATA-BE-V3" status diff --git a/libsframe/testsuite/libsframe.decode/local.mk b/libsframe/testsuite/libsframe.decode/local.mk index aacbfdcfdd1..5976edd5fbe 100644 --- a/libsframe/testsuite/libsframe.decode/local.mk +++ b/libsframe/testsuite/libsframe.decode/local.mk @@ -1,12 +1,17 @@ check_PROGRAMS = if HAVE_COMPAT_DEJAGNU - check_PROGRAMS += %D%/be-flipping %D%/frecnt-1 %D%/frecnt-2 %D%/frecnt-v2 + check_PROGRAMS += %D%/be-flipping %D%/be-flipping-v3 \ + %D%/frecnt-1 %D%/frecnt-2 %D%/frecnt-v2 endif %C%_be_flipping_SOURCES = %D%/be-flipping.c %C%_be_flipping_LDADD = $(testsuite_LDADD) %C%_be_flipping_CPPFLAGS = $(testsuite_CPPFLAGS) +%C%_be_flipping_v3_SOURCES = %D%/be-flipping-v3.c +%C%_be_flipping_v3_LDADD = $(testsuite_LDADD) +%C%_be_flipping_v3_CPPFLAGS = $(testsuite_CPPFLAGS) + %C%_frecnt_1_SOURCES = %D%/frecnt-1.c %C%_frecnt_1_LDADD = $(testsuite_LDADD) %C%_frecnt_1_CPPFLAGS = $(testsuite_CPPFLAGS) diff --git a/libsframe/testsuite/libsframe.find/find.exp b/libsframe/testsuite/libsframe.find/find.exp index bbe9e1f4623..52494f3ec40 100644 --- a/libsframe/testsuite/libsframe.find/find.exp +++ b/libsframe/testsuite/libsframe.find/find.exp @@ -34,6 +34,10 @@ if { [host_execute "testsuite/libsframe.find/findfre-1"] ne "" } { fail "findfre-1" } +if { [host_execute "testsuite/libsframe.find/findfre-flex-1"] ne "" } { + fail "findfre-flex-1" +} + if { [host_execute "testsuite/libsframe.find/findfunc-1"] ne "" } { fail "findfunc-1" } diff --git a/libsframe/testsuite/libsframe.find/findfre-flex-1.c b/libsframe/testsuite/libsframe.find/findfre-flex-1.c new file mode 100644 index 00000000000..6cb73852782 --- /dev/null +++ b/libsframe/testsuite/libsframe.find/findfre-flex-1.c @@ -0,0 +1,205 @@ +/* findfre-flex-1.c -- Test for sframe_find_fre and access APIs for + SFRAME_FDE_TYPE_FLEX in libsframe. + + Copyright (C) 2026 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 "sframe-test.h" + +static int +add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr, + int64_t sframe_vaddr, int idx, uint32_t *func_size) +{ + /* A contiguous block containing 6 FREs which look like: + func idx [0]: pc = 0x0, size = 95 bytes, attr = "F" + STARTPC CFA FP RA + 0000000000000000 sp+8 u f + 0000000000000009 r10+0 u f + 0000000000000018 r10+0 (fp+0) U + 000000000000001a (fp-8) (fp+0) U + 0000000000000052 r10+0 (fp+0) U + 000000000000005e sp+8 (fp+0) U */ +#define FDE1_NUM_FRES 6 + sframe_frame_row_entry fres[FDE1_NUM_FRES] + = { {0x0, {0x39, 0x08}, 0x4}, + {0x9, {0x51, 0x0}, 0x4}, + {0x18, {0x51, 0x0, 0x0, 0x33, 0x0}, 0xa}, + {0x1a, {0x33, 0xf8, 0x0, 0x33, 0x0}, 0xa}, + {0x52, {0x51, 0x0, 0x0, 0x33, 0x0}, 0xa}, + {0x5e, {0x39, 0x08, 0x0, 0x33, 0x0}, 0xa} + }; + /* Function size in bytes. P.S. Must be a value greater than the + fre_start_addr of the last FRE above (0x5e). */ + *func_size = 0x5f; + + uint32_t offsetof_fde_in_sec + = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL); + int64_t func1_start_addr = (start_pc_vaddr + - (sframe_vaddr + offsetof_fde_in_sec)); + unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, + SFRAME_V3_FDE_PCTYPE_INC); + unsigned char finfo2 = 0; + finfo2 = SFRAME_V3_SET_FDE_TYPE (finfo2, SFRAME_FDE_TYPE_FLEX); + int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr, + *func_size, finfo, finfo2, 0, + FDE1_NUM_FRES); + if (err == -1) + return err; + + for (unsigned int i = 0; i < FDE1_NUM_FRES; i++) + if (sframe_encoder_add_fre (encode, idx, fres + i) == SFRAME_ERR) + return -1; + + return 0; +} + +static int +add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr, + int64_t sframe_vaddr, int idx, uint32_t *func_size) +{ + /* A contiguous block containing 3 FREs which look like: + func idx [0]: pc = 0x0, size = 7 bytes, attr = "F" + STARTPC CFA FP RA + 0000000000000000 sp+8 u f + 0000000000000004 sp+40 u f + 0000000000000005 sp+0 u r2+0 */ +#define FDE2_NUM_FRES 3 + sframe_frame_row_entry fres[FDE2_NUM_FRES] + = { {0x0, {0x39, 0x8, 0}, 0x4}, + {0x4, {0x39, 0x28, 0}, 0x8}, + {0x5, {0x39, 0x0, 0x11, 0x0}, 0x8} + }; + /* Function size in bytes. P.S. Must be a value greater than the + fre_start_addr of the last FRE above (0x5). */ + *func_size = 0x7; + + uint32_t offsetof_fde_in_sec + = sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL); + int64_t func2_start_addr = (start_pc_vaddr + - (sframe_vaddr + offsetof_fde_in_sec)); + unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1, + SFRAME_V3_FDE_PCTYPE_INC); + unsigned char finfo2 = 0; + finfo2 = SFRAME_V3_SET_FDE_TYPE (finfo2, SFRAME_FDE_TYPE_FLEX); + int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr, + *func_size, finfo, finfo2, 0, + FDE2_NUM_FRES); + if (err == -1) + return err; + + for (unsigned int i = 0; i < FDE2_NUM_FRES; i++) + if (sframe_encoder_add_fre (encode, idx, fres + i) == SFRAME_ERR) + return -1; + + return 0; +} + +static +void test_text_findfre (const char suffix, int64_t text_vaddr, + int64_t sframe_vaddr) +{ + sframe_encoder_ctx *encode; + sframe_decoder_ctx *dctx; + sframe_frame_row_entry frep; + int64_t func1_start_vaddr; + int64_t func2_start_vaddr; + uint32_t func1_size = 0; + uint32_t func2_size = 0; + uint32_t fde_cnt = 0; + int64_t lookup_pc; + char *sframe_buf; + size_t sf_size; + int err = 0; + uint32_t dfde = SFRAME_FDE_TYPE_FLEX; + + encode = sframe_encode (SFRAME_VERSION, + SFRAME_F_FDE_FUNC_START_PCREL, + SFRAME_ABI_AMD64_ENDIAN_LITTLE, + SFRAME_CFA_FIXED_FP_INVALID, + -8, /* Fixed RA offset for AMD64. */ + &err); + + func1_start_vaddr = text_vaddr; + err = add_fde1 (encode, func1_start_vaddr, sframe_vaddr, 0, &func1_size); + TEST (err == 0, "findfre-flex-1%c: Adding FDE1", suffix); + + /* Function 2 is placed after 0x10 bytes from the end of Function 1. */ + func2_start_vaddr = func1_start_vaddr + func1_size + 0x10; + err = add_fde2 (encode, func2_start_vaddr, sframe_vaddr, 1, &func2_size); + TEST (err == 0, "findfre-flex-1%c: Adding FDE2", suffix); + + fde_cnt = sframe_encoder_get_num_fidx (encode); + TEST (fde_cnt == 2, "findfre-flex-1%c: Test FDE count", suffix); + + sframe_buf = sframe_encoder_write (encode, &sf_size, true, &err); + TEST (err == 0, "findfre-flex-1%c: Encoder write", suffix); + + dctx = sframe_decode (sframe_buf, sf_size, &err); + TEST (dctx != NULL, "findfre-flex-1%c: Decoder setup", suffix); + + /* Find the third FRE in first FDE. */ + lookup_pc = func1_start_vaddr + 0x19 - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST ((err == 0 && sframe_fre_get_fp_offset (dctx, &frep, dfde, &err) == 0x0), + "findfre-flex-1%c: Find third FRE in FDE1", suffix); + + /* Find an FRE for PC at the end of range covered by FRE. */ + lookup_pc = func1_start_vaddr + 0x8 - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST ((err == 0 && sframe_fre_get_cfa_offset (dctx, &frep, dfde, &err) == 0x8), + "findfre-flex-1%c: Find FRE for last PC covered by FRE", suffix); + + /* Find the last FRE in first FDE. */ + lookup_pc = func1_start_vaddr + 0x5e - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST ((err == 0 && sframe_fre_get_cfa_offset (dctx, &frep, dfde, &err) == 0x8), + "findfre-flex-1%c: Find last FRE", suffix); + + /* Find the second FRE in second FDE. */ + lookup_pc = func2_start_vaddr + 0x4 - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST ((err == 0 && sframe_fre_get_cfa_offset (dctx, &frep, dfde, &err) == 0x28), + "findfre-flex-1%c: Find second FRE", suffix); + + /* Find the third FRE in second FDE. */ + lookup_pc = func2_start_vaddr + 0x5 - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST ((err == 0 && sframe_fre_get_ra_offset (dctx, &frep, dfde, &err) == 0x0), + "findfre-flex-1%c: Find third FRE in FDE2", suffix); + + /* Find FRE for PC out of range. Expect error code. */ + lookup_pc = func1_start_vaddr + func1_size - sframe_vaddr; + err = sframe_find_fre (dctx, lookup_pc, &frep); + TEST (err == SFRAME_ERR, + "findfre-flex-1%c: Find FRE for out of range PC", suffix); + + sframe_encoder_free (&encode); + sframe_decoder_free (&dctx); +} + +int main (void) +{ + int64_t sframe_vaddr = 0x402220; + int64_t text_vaddr = 0x401020; + printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr, + sframe_vaddr); + test_text_findfre ('a', text_vaddr, sframe_vaddr); + + sframe_vaddr = 0x401020; + text_vaddr = 0x402220; + printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr, + sframe_vaddr); + test_text_findfre ('b', text_vaddr, sframe_vaddr); +} diff --git a/libsframe/testsuite/libsframe.find/local.mk b/libsframe/testsuite/libsframe.find/local.mk index 05c7a10a8db..30b06b16a1e 100644 --- a/libsframe/testsuite/libsframe.find/local.mk +++ b/libsframe/testsuite/libsframe.find/local.mk @@ -1,5 +1,5 @@ if HAVE_COMPAT_DEJAGNU - check_PROGRAMS += %D%/findfre-1 %D%/findfunc-1 %D%/plt-findfre-1 + check_PROGRAMS += %D%/findfre-1 %D%/findfre-flex-1 %D%/findfunc-1 %D%/plt-findfre-1 check_PROGRAMS += %D%/plt-findfre-2 endif @@ -7,6 +7,10 @@ endif %C%_findfre_1_LDADD = $(testsuite_LDADD) %C%_findfre_1_CPPFLAGS = $(testsuite_CPPFLAGS) +%C%_findfre_flex_1_SOURCES = %D%/findfre-flex-1.c +%C%_findfre_flex_1_LDADD = $(testsuite_LDADD) +%C%_findfre_flex_1_CPPFLAGS = $(testsuite_CPPFLAGS) + %C%_findfunc_1_SOURCES = %D%/findfunc-1.c %C%_findfunc_1_LDADD = $(testsuite_LDADD) %C%_findfunc_1_CPPFLAGS = $(testsuite_CPPFLAGS)