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 00000000000..2266b9ab74f
Binary files /dev/null and b/libsframe/testsuite/libsframe.decode/DATA-BE-V3 differ
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)