diff --git a/Makefile.def b/Makefile.def
index acdcd625ed6..1b39c910447 100644
--- a/Makefile.def
+++ b/Makefile.def
@@ -149,6 +149,7 @@ host_modules= { module= lto-plugin; bootstrap=true;
 host_modules= { module= libcc1; extra_configure_flags=--enable-shared; };
 host_modules= { module= gotools; };
 host_modules= { module= libctf; bootstrap=true; };
+host_modules= { module= libsframe; bootstrap=true; };
 
 target_modules = { module= libstdc++-v3;
 		   bootstrap=true;
@@ -478,6 +479,7 @@ dependencies = { module=all-binutils; on=all-intl; };
 dependencies = { module=all-binutils; on=all-gas; };
 dependencies = { module=all-binutils; on=all-libctf; };
 dependencies = { module=all-ld; on=all-libctf; };
+dependencies = { module=all-binutils; on=all-libsframe; };
 
 // We put install-opcodes before install-binutils because the installed
 // binutils might be on PATH, and they might need the shared opcodes
diff --git a/Makefile.in b/Makefile.in
index cb39e4790d6..b26f778a94a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1109,7 +1109,8 @@ configure-host:  \
     maybe-configure-lto-plugin \
     maybe-configure-libcc1 \
     maybe-configure-gotools \
-    maybe-configure-libctf
+    maybe-configure-libctf \
+    maybe-configure-libsframe
 .PHONY: configure-target
 configure-target:  \
     maybe-configure-target-libstdc++-v3 \
@@ -1290,6 +1291,9 @@ all-host: maybe-all-gotools
 @if libctf-no-bootstrap
 all-host: maybe-all-libctf
 @endif libctf-no-bootstrap
+@if libsframe-no-bootstrap
+all-host: maybe-all-libsframe
+@endif libsframe-no-bootstrap
 
 .PHONY: all-target
 
@@ -1396,6 +1400,7 @@ info-host: maybe-info-lto-plugin
 info-host: maybe-info-libcc1
 info-host: maybe-info-gotools
 info-host: maybe-info-libctf
+info-host: maybe-info-libsframe
 
 .PHONY: info-target
 
@@ -1487,6 +1492,7 @@ dvi-host: maybe-dvi-lto-plugin
 dvi-host: maybe-dvi-libcc1
 dvi-host: maybe-dvi-gotools
 dvi-host: maybe-dvi-libctf
+dvi-host: maybe-dvi-libsframe
 
 .PHONY: dvi-target
 
@@ -1578,6 +1584,7 @@ pdf-host: maybe-pdf-lto-plugin
 pdf-host: maybe-pdf-libcc1
 pdf-host: maybe-pdf-gotools
 pdf-host: maybe-pdf-libctf
+pdf-host: maybe-pdf-libsframe
 
 .PHONY: pdf-target
 
@@ -1669,6 +1676,7 @@ html-host: maybe-html-lto-plugin
 html-host: maybe-html-libcc1
 html-host: maybe-html-gotools
 html-host: maybe-html-libctf
+html-host: maybe-html-libsframe
 
 .PHONY: html-target
 
@@ -1760,6 +1768,7 @@ TAGS-host: maybe-TAGS-lto-plugin
 TAGS-host: maybe-TAGS-libcc1
 TAGS-host: maybe-TAGS-gotools
 TAGS-host: maybe-TAGS-libctf
+TAGS-host: maybe-TAGS-libsframe
 
 .PHONY: TAGS-target
 
@@ -1851,6 +1860,7 @@ install-info-host: maybe-install-info-lto-plugin
 install-info-host: maybe-install-info-libcc1
 install-info-host: maybe-install-info-gotools
 install-info-host: maybe-install-info-libctf
+install-info-host: maybe-install-info-libsframe
 
 .PHONY: install-info-target
 
@@ -1942,6 +1952,7 @@ install-dvi-host: maybe-install-dvi-lto-plugin
 install-dvi-host: maybe-install-dvi-libcc1
 install-dvi-host: maybe-install-dvi-gotools
 install-dvi-host: maybe-install-dvi-libctf
+install-dvi-host: maybe-install-dvi-libsframe
 
 .PHONY: install-dvi-target
 
@@ -2033,6 +2044,7 @@ install-pdf-host: maybe-install-pdf-lto-plugin
 install-pdf-host: maybe-install-pdf-libcc1
 install-pdf-host: maybe-install-pdf-gotools
 install-pdf-host: maybe-install-pdf-libctf
+install-pdf-host: maybe-install-pdf-libsframe
 
 .PHONY: install-pdf-target
 
@@ -2124,6 +2136,7 @@ install-html-host: maybe-install-html-lto-plugin
 install-html-host: maybe-install-html-libcc1
 install-html-host: maybe-install-html-gotools
 install-html-host: maybe-install-html-libctf
+install-html-host: maybe-install-html-libsframe
 
 .PHONY: install-html-target
 
@@ -2215,6 +2228,7 @@ installcheck-host: maybe-installcheck-lto-plugin
 installcheck-host: maybe-installcheck-libcc1
 installcheck-host: maybe-installcheck-gotools
 installcheck-host: maybe-installcheck-libctf
+installcheck-host: maybe-installcheck-libsframe
 
 .PHONY: installcheck-target
 
@@ -2306,6 +2320,7 @@ mostlyclean-host: maybe-mostlyclean-lto-plugin
 mostlyclean-host: maybe-mostlyclean-libcc1
 mostlyclean-host: maybe-mostlyclean-gotools
 mostlyclean-host: maybe-mostlyclean-libctf
+mostlyclean-host: maybe-mostlyclean-libsframe
 
 .PHONY: mostlyclean-target
 
@@ -2397,6 +2412,7 @@ clean-host: maybe-clean-lto-plugin
 clean-host: maybe-clean-libcc1
 clean-host: maybe-clean-gotools
 clean-host: maybe-clean-libctf
+clean-host: maybe-clean-libsframe
 
 .PHONY: clean-target
 
@@ -2488,6 +2504,7 @@ distclean-host: maybe-distclean-lto-plugin
 distclean-host: maybe-distclean-libcc1
 distclean-host: maybe-distclean-gotools
 distclean-host: maybe-distclean-libctf
+distclean-host: maybe-distclean-libsframe
 
 .PHONY: distclean-target
 
@@ -2579,6 +2596,7 @@ maintainer-clean-host: maybe-maintainer-clean-lto-plugin
 maintainer-clean-host: maybe-maintainer-clean-libcc1
 maintainer-clean-host: maybe-maintainer-clean-gotools
 maintainer-clean-host: maybe-maintainer-clean-libctf
+maintainer-clean-host: maybe-maintainer-clean-libsframe
 
 .PHONY: maintainer-clean-target
 
@@ -2727,7 +2745,8 @@ check-host:  \
     maybe-check-lto-plugin \
     maybe-check-libcc1 \
     maybe-check-gotools \
-    maybe-check-libctf
+    maybe-check-libctf \
+    maybe-check-libsframe
 
 .PHONY: check-target
 check-target:  \
@@ -2865,7 +2884,8 @@ install-host-nogcc:  \
     maybe-install-lto-plugin \
     maybe-install-libcc1 \
     maybe-install-gotools \
-    maybe-install-libctf
+    maybe-install-libctf \
+    maybe-install-libsframe
 
 .PHONY: install-host
 install-host:  \
@@ -2921,7 +2941,8 @@ install-host:  \
     maybe-install-lto-plugin \
     maybe-install-libcc1 \
     maybe-install-gotools \
-    maybe-install-libctf
+    maybe-install-libctf \
+    maybe-install-libsframe
 
 .PHONY: install-target
 install-target:  \
@@ -3032,7 +3053,8 @@ install-strip-host:  \
     maybe-install-strip-lto-plugin \
     maybe-install-strip-libcc1 \
     maybe-install-strip-gotools \
-    maybe-install-strip-libctf
+    maybe-install-strip-libctf \
+    maybe-install-strip-libsframe
 
 .PHONY: install-strip-target
 install-strip-target:  \
@@ -44044,6 +44066,1146 @@ maintainer-clean-libctf:
 
 
 
+.PHONY: configure-libsframe maybe-configure-libsframe
+maybe-configure-libsframe:
+@if gcc-bootstrap
+configure-libsframe: stage_current
+@endif gcc-bootstrap
+@if libsframe
+maybe-configure-libsframe: configure-libsframe
+configure-libsframe: 
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	$(HOST_EXPORTS)  \
+	echo Configuring in $(HOST_SUBDIR)/libsframe; \
+	cd "$(HOST_SUBDIR)/libsframe" || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) \
+	  $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias}  \
+	  || exit 1
+@endif libsframe
+
+
+
+.PHONY: configure-stage1-libsframe maybe-configure-stage1-libsframe
+maybe-configure-stage1-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stage1-libsframe: configure-stage1-libsframe
+configure-stage1-libsframe:
+	@[ $(current_stage) = stage1 ] || $(MAKE) stage1-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE1_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	CFLAGS="$(STAGE1_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGE1_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(LIBCFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage 1 in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	   \
+	  $(STAGE1_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stage2-libsframe maybe-configure-stage2-libsframe
+maybe-configure-stage2-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stage2-libsframe: configure-stage2-libsframe
+configure-stage2-libsframe:
+	@[ $(current_stage) = stage2 ] || $(MAKE) stage2-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE2_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGE2_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGE2_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGE2_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage 2 in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGE2_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stage3-libsframe maybe-configure-stage3-libsframe
+maybe-configure-stage3-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stage3-libsframe: configure-stage3-libsframe
+configure-stage3-libsframe:
+	@[ $(current_stage) = stage3 ] || $(MAKE) stage3-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE3_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGE3_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGE3_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGE3_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage 3 in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGE3_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stage4-libsframe maybe-configure-stage4-libsframe
+maybe-configure-stage4-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stage4-libsframe: configure-stage4-libsframe
+configure-stage4-libsframe:
+	@[ $(current_stage) = stage4 ] || $(MAKE) stage4-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE4_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGE4_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGE4_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGE4_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage 4 in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGE4_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stageprofile-libsframe maybe-configure-stageprofile-libsframe
+maybe-configure-stageprofile-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stageprofile-libsframe: configure-stageprofile-libsframe
+configure-stageprofile-libsframe:
+	@[ $(current_stage) = stageprofile ] || $(MAKE) stageprofile-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEprofile_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGEprofile_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGEprofile_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGEprofile_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage profile in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGEprofile_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stagetrain-libsframe maybe-configure-stagetrain-libsframe
+maybe-configure-stagetrain-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stagetrain-libsframe: configure-stagetrain-libsframe
+configure-stagetrain-libsframe:
+	@[ $(current_stage) = stagetrain ] || $(MAKE) stagetrain-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEtrain_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGEtrain_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGEtrain_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGEtrain_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage train in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGEtrain_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stagefeedback-libsframe maybe-configure-stagefeedback-libsframe
+maybe-configure-stagefeedback-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stagefeedback-libsframe: configure-stagefeedback-libsframe
+configure-stagefeedback-libsframe:
+	@[ $(current_stage) = stagefeedback ] || $(MAKE) stagefeedback-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEfeedback_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGEfeedback_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGEfeedback_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGEfeedback_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage feedback in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGEfeedback_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stageautoprofile-libsframe maybe-configure-stageautoprofile-libsframe
+maybe-configure-stageautoprofile-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stageautoprofile-libsframe: configure-stageautoprofile-libsframe
+configure-stageautoprofile-libsframe:
+	@[ $(current_stage) = stageautoprofile ] || $(MAKE) stageautoprofile-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautoprofile_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGEautoprofile_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGEautoprofile_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGEautoprofile_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage autoprofile in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGEautoprofile_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+.PHONY: configure-stageautofeedback-libsframe maybe-configure-stageautofeedback-libsframe
+maybe-configure-stageautofeedback-libsframe:
+@if libsframe-bootstrap
+maybe-configure-stageautofeedback-libsframe: configure-stageautofeedback-libsframe
+configure-stageautofeedback-libsframe:
+	@[ $(current_stage) = stageautofeedback ] || $(MAKE) stageautofeedback-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautofeedback_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libsframe/Makefile || exit 0; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS) \
+	CFLAGS="$(STAGEautofeedback_CFLAGS)"; export CFLAGS; \
+	CXXFLAGS="$(STAGEautofeedback_CXXFLAGS)"; export CXXFLAGS; \
+	LIBCFLAGS="$(STAGEautofeedback_CFLAGS)"; export LIBCFLAGS;  \
+	echo Configuring stage autofeedback in $(HOST_SUBDIR)/libsframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libsframe; \
+	cd $(HOST_SUBDIR)/libsframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libsframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libsframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	  --with-build-libsubdir=$(HOST_SUBDIR) \
+	  $(STAGEautofeedback_CONFIGURE_FLAGS)
+@endif libsframe-bootstrap
+
+
+
+
+
+.PHONY: all-libsframe maybe-all-libsframe
+maybe-all-libsframe:
+@if gcc-bootstrap
+all-libsframe: stage_current
+@endif gcc-bootstrap
+@if libsframe
+TARGET-libsframe=all
+maybe-all-libsframe: all-libsframe
+all-libsframe: configure-libsframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS)  \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS) $(STAGE1_FLAGS_TO_PASS)  \
+		$(TARGET-libsframe))
+@endif libsframe
+
+
+
+.PHONY: all-stage1-libsframe maybe-all-stage1-libsframe
+.PHONY: clean-stage1-libsframe maybe-clean-stage1-libsframe
+maybe-all-stage1-libsframe:
+maybe-clean-stage1-libsframe:
+@if libsframe-bootstrap
+maybe-all-stage1-libsframe: all-stage1-libsframe
+all-stage1: all-stage1-libsframe
+TARGET-stage1-libsframe = $(TARGET-libsframe)
+all-stage1-libsframe: configure-stage1-libsframe
+	@[ $(current_stage) = stage1 ] || $(MAKE) stage1-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE1_TFLAGS)"; \
+	$(HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGE1_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGE1_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGE1_CXXFLAGS)" \
+		LIBCFLAGS="$(LIBCFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS)  \
+		$(STAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGE1_TFLAGS)"  \
+		$(TARGET-stage1-libsframe)
+
+maybe-clean-stage1-libsframe: clean-stage1-libsframe
+clean-stage1: clean-stage1-libsframe
+clean-stage1-libsframe:
+	@if [ $(current_stage) = stage1 ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage1-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stage1-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS)  \
+	$(STAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stage2-libsframe maybe-all-stage2-libsframe
+.PHONY: clean-stage2-libsframe maybe-clean-stage2-libsframe
+maybe-all-stage2-libsframe:
+maybe-clean-stage2-libsframe:
+@if libsframe-bootstrap
+maybe-all-stage2-libsframe: all-stage2-libsframe
+all-stage2: all-stage2-libsframe
+TARGET-stage2-libsframe = $(TARGET-libsframe)
+all-stage2-libsframe: configure-stage2-libsframe
+	@[ $(current_stage) = stage2 ] || $(MAKE) stage2-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE2_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGE2_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGE2_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGE2_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGE2_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGE2_TFLAGS)"  \
+		$(TARGET-stage2-libsframe)
+
+maybe-clean-stage2-libsframe: clean-stage2-libsframe
+clean-stage2: clean-stage2-libsframe
+clean-stage2-libsframe:
+	@if [ $(current_stage) = stage2 ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage2-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stage2-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stage3-libsframe maybe-all-stage3-libsframe
+.PHONY: clean-stage3-libsframe maybe-clean-stage3-libsframe
+maybe-all-stage3-libsframe:
+maybe-clean-stage3-libsframe:
+@if libsframe-bootstrap
+maybe-all-stage3-libsframe: all-stage3-libsframe
+all-stage3: all-stage3-libsframe
+TARGET-stage3-libsframe = $(TARGET-libsframe)
+all-stage3-libsframe: configure-stage3-libsframe
+	@[ $(current_stage) = stage3 ] || $(MAKE) stage3-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE3_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGE3_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGE3_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGE3_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGE3_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGE3_TFLAGS)"  \
+		$(TARGET-stage3-libsframe)
+
+maybe-clean-stage3-libsframe: clean-stage3-libsframe
+clean-stage3: clean-stage3-libsframe
+clean-stage3-libsframe:
+	@if [ $(current_stage) = stage3 ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage3-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stage3-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stage4-libsframe maybe-all-stage4-libsframe
+.PHONY: clean-stage4-libsframe maybe-clean-stage4-libsframe
+maybe-all-stage4-libsframe:
+maybe-clean-stage4-libsframe:
+@if libsframe-bootstrap
+maybe-all-stage4-libsframe: all-stage4-libsframe
+all-stage4: all-stage4-libsframe
+TARGET-stage4-libsframe = $(TARGET-libsframe)
+all-stage4-libsframe: configure-stage4-libsframe
+	@[ $(current_stage) = stage4 ] || $(MAKE) stage4-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE4_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGE4_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGE4_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGE4_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGE4_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGE4_TFLAGS)"  \
+		$(TARGET-stage4-libsframe)
+
+maybe-clean-stage4-libsframe: clean-stage4-libsframe
+clean-stage4: clean-stage4-libsframe
+clean-stage4-libsframe:
+	@if [ $(current_stage) = stage4 ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage4-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stage4-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stageprofile-libsframe maybe-all-stageprofile-libsframe
+.PHONY: clean-stageprofile-libsframe maybe-clean-stageprofile-libsframe
+maybe-all-stageprofile-libsframe:
+maybe-clean-stageprofile-libsframe:
+@if libsframe-bootstrap
+maybe-all-stageprofile-libsframe: all-stageprofile-libsframe
+all-stageprofile: all-stageprofile-libsframe
+TARGET-stageprofile-libsframe = $(TARGET-libsframe)
+all-stageprofile-libsframe: configure-stageprofile-libsframe
+	@[ $(current_stage) = stageprofile ] || $(MAKE) stageprofile-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEprofile_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGEprofile_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGEprofile_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGEprofile_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGEprofile_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGEprofile_TFLAGS)"  \
+		$(TARGET-stageprofile-libsframe)
+
+maybe-clean-stageprofile-libsframe: clean-stageprofile-libsframe
+clean-stageprofile: clean-stageprofile-libsframe
+clean-stageprofile-libsframe:
+	@if [ $(current_stage) = stageprofile ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageprofile-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stageprofile-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stagetrain-libsframe maybe-all-stagetrain-libsframe
+.PHONY: clean-stagetrain-libsframe maybe-clean-stagetrain-libsframe
+maybe-all-stagetrain-libsframe:
+maybe-clean-stagetrain-libsframe:
+@if libsframe-bootstrap
+maybe-all-stagetrain-libsframe: all-stagetrain-libsframe
+all-stagetrain: all-stagetrain-libsframe
+TARGET-stagetrain-libsframe = $(TARGET-libsframe)
+all-stagetrain-libsframe: configure-stagetrain-libsframe
+	@[ $(current_stage) = stagetrain ] || $(MAKE) stagetrain-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEtrain_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGEtrain_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGEtrain_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGEtrain_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGEtrain_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGEtrain_TFLAGS)"  \
+		$(TARGET-stagetrain-libsframe)
+
+maybe-clean-stagetrain-libsframe: clean-stagetrain-libsframe
+clean-stagetrain: clean-stagetrain-libsframe
+clean-stagetrain-libsframe:
+	@if [ $(current_stage) = stagetrain ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stagetrain-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stagetrain-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stagefeedback-libsframe maybe-all-stagefeedback-libsframe
+.PHONY: clean-stagefeedback-libsframe maybe-clean-stagefeedback-libsframe
+maybe-all-stagefeedback-libsframe:
+maybe-clean-stagefeedback-libsframe:
+@if libsframe-bootstrap
+maybe-all-stagefeedback-libsframe: all-stagefeedback-libsframe
+all-stagefeedback: all-stagefeedback-libsframe
+TARGET-stagefeedback-libsframe = $(TARGET-libsframe)
+all-stagefeedback-libsframe: configure-stagefeedback-libsframe
+	@[ $(current_stage) = stagefeedback ] || $(MAKE) stagefeedback-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEfeedback_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGEfeedback_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGEfeedback_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGEfeedback_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGEfeedback_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGEfeedback_TFLAGS)"  \
+		$(TARGET-stagefeedback-libsframe)
+
+maybe-clean-stagefeedback-libsframe: clean-stagefeedback-libsframe
+clean-stagefeedback: clean-stagefeedback-libsframe
+clean-stagefeedback-libsframe:
+	@if [ $(current_stage) = stagefeedback ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stagefeedback-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stagefeedback-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stageautoprofile-libsframe maybe-all-stageautoprofile-libsframe
+.PHONY: clean-stageautoprofile-libsframe maybe-clean-stageautoprofile-libsframe
+maybe-all-stageautoprofile-libsframe:
+maybe-clean-stageautoprofile-libsframe:
+@if libsframe-bootstrap
+maybe-all-stageautoprofile-libsframe: all-stageautoprofile-libsframe
+all-stageautoprofile: all-stageautoprofile-libsframe
+TARGET-stageautoprofile-libsframe = $(TARGET-libsframe)
+all-stageautoprofile-libsframe: configure-stageautoprofile-libsframe
+	@[ $(current_stage) = stageautoprofile ] || $(MAKE) stageautoprofile-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautoprofile_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$$s/gcc/config/i386/$(AUTO_PROFILE) \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGEautoprofile_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGEautoprofile_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGEautoprofile_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGEautoprofile_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGEautoprofile_TFLAGS)"  \
+		$(TARGET-stageautoprofile-libsframe)
+
+maybe-clean-stageautoprofile-libsframe: clean-stageautoprofile-libsframe
+clean-stageautoprofile: clean-stageautoprofile-libsframe
+clean-stageautoprofile-libsframe:
+	@if [ $(current_stage) = stageautoprofile ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageautoprofile-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stageautoprofile-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+.PHONY: all-stageautofeedback-libsframe maybe-all-stageautofeedback-libsframe
+.PHONY: clean-stageautofeedback-libsframe maybe-clean-stageautofeedback-libsframe
+maybe-all-stageautofeedback-libsframe:
+maybe-clean-stageautofeedback-libsframe:
+@if libsframe-bootstrap
+maybe-all-stageautofeedback-libsframe: all-stageautofeedback-libsframe
+all-stageautofeedback: all-stageautofeedback-libsframe
+TARGET-stageautofeedback-libsframe = $(TARGET-libsframe)
+all-stageautofeedback-libsframe: configure-stageautofeedback-libsframe
+	@[ $(current_stage) = stageautofeedback ] || $(MAKE) stageautofeedback-start
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautofeedback_TFLAGS)"; \
+	$(HOST_EXPORTS) \
+	$(POSTSTAGE1_HOST_EXPORTS)  \
+	cd $(HOST_SUBDIR)/libsframe && \
+	 \
+	$(MAKE) $(BASE_FLAGS_TO_PASS) \
+		CFLAGS="$(STAGEautofeedback_CFLAGS)" \
+		GENERATOR_CFLAGS="$(STAGEautofeedback_GENERATOR_CFLAGS)" \
+		CXXFLAGS="$(STAGEautofeedback_CXXFLAGS)" \
+		LIBCFLAGS="$(STAGEautofeedback_CFLAGS)" \
+		CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" \
+		CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+		LIBCFLAGS_FOR_TARGET="$(LIBCFLAGS_FOR_TARGET)" \
+		$(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  \
+		TFLAGS="$(STAGEautofeedback_TFLAGS)" PERF_DATA=perf.data \
+		$(TARGET-stageautofeedback-libsframe)
+
+maybe-clean-stageautofeedback-libsframe: clean-stageautofeedback-libsframe
+clean-stageautofeedback: clean-stageautofeedback-libsframe
+clean-stageautofeedback-libsframe:
+	@if [ $(current_stage) = stageautofeedback ]; then \
+	  [ -f $(HOST_SUBDIR)/libsframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageautofeedback-libsframe/Makefile ] || exit 0; \
+	  $(MAKE) stageautofeedback-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libsframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libsframe-bootstrap
+
+
+
+
+
+.PHONY: check-libsframe maybe-check-libsframe
+maybe-check-libsframe:
+@if libsframe
+maybe-check-libsframe: check-libsframe
+
+check-libsframe:
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) $(EXTRA_HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  $(EXTRA_BOOTSTRAP_FLAGS) check)
+
+@endif libsframe
+
+.PHONY: install-libsframe maybe-install-libsframe
+maybe-install-libsframe:
+@if libsframe
+maybe-install-libsframe: install-libsframe
+
+install-libsframe: installdirs
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  install)
+
+@endif libsframe
+
+.PHONY: install-strip-libsframe maybe-install-strip-libsframe
+maybe-install-strip-libsframe:
+@if libsframe
+maybe-install-strip-libsframe: install-strip-libsframe
+
+install-strip-libsframe: installdirs
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  install-strip)
+
+@endif libsframe
+
+# Other targets (info, dvi, pdf, etc.)
+
+.PHONY: maybe-info-libsframe info-libsframe
+maybe-info-libsframe:
+@if libsframe
+maybe-info-libsframe: info-libsframe
+
+info-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing info in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          info) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-dvi-libsframe dvi-libsframe
+maybe-dvi-libsframe:
+@if libsframe
+maybe-dvi-libsframe: dvi-libsframe
+
+dvi-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing dvi in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          dvi) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-pdf-libsframe pdf-libsframe
+maybe-pdf-libsframe:
+@if libsframe
+maybe-pdf-libsframe: pdf-libsframe
+
+pdf-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing pdf in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          pdf) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-html-libsframe html-libsframe
+maybe-html-libsframe:
+@if libsframe
+maybe-html-libsframe: html-libsframe
+
+html-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing html in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          html) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-TAGS-libsframe TAGS-libsframe
+maybe-TAGS-libsframe:
+@if libsframe
+maybe-TAGS-libsframe: TAGS-libsframe
+
+TAGS-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing TAGS in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          TAGS) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-install-info-libsframe install-info-libsframe
+maybe-install-info-libsframe:
+@if libsframe
+maybe-install-info-libsframe: install-info-libsframe
+
+install-info-libsframe: \
+    configure-libsframe \
+    info-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing install-info in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          install-info) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-install-dvi-libsframe install-dvi-libsframe
+maybe-install-dvi-libsframe:
+@if libsframe
+maybe-install-dvi-libsframe: install-dvi-libsframe
+
+install-dvi-libsframe: \
+    configure-libsframe \
+    dvi-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing install-dvi in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          install-dvi) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-install-pdf-libsframe install-pdf-libsframe
+maybe-install-pdf-libsframe:
+@if libsframe
+maybe-install-pdf-libsframe: install-pdf-libsframe
+
+install-pdf-libsframe: \
+    configure-libsframe \
+    pdf-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing install-pdf in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          install-pdf) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-install-html-libsframe install-html-libsframe
+maybe-install-html-libsframe:
+@if libsframe
+maybe-install-html-libsframe: install-html-libsframe
+
+install-html-libsframe: \
+    configure-libsframe \
+    html-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing install-html in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          install-html) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-installcheck-libsframe installcheck-libsframe
+maybe-installcheck-libsframe:
+@if libsframe
+maybe-installcheck-libsframe: installcheck-libsframe
+
+installcheck-libsframe: \
+    configure-libsframe 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing installcheck in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          installcheck) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-mostlyclean-libsframe mostlyclean-libsframe
+maybe-mostlyclean-libsframe:
+@if libsframe
+maybe-mostlyclean-libsframe: mostlyclean-libsframe
+
+mostlyclean-libsframe: 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing mostlyclean in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          mostlyclean) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-clean-libsframe clean-libsframe
+maybe-clean-libsframe:
+@if libsframe
+maybe-clean-libsframe: clean-libsframe
+
+clean-libsframe: 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing clean in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          clean) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-distclean-libsframe distclean-libsframe
+maybe-distclean-libsframe:
+@if libsframe
+maybe-distclean-libsframe: distclean-libsframe
+
+distclean-libsframe: 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing distclean in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          distclean) \
+	  || exit 1
+
+@endif libsframe
+
+.PHONY: maybe-maintainer-clean-libsframe maintainer-clean-libsframe
+maybe-maintainer-clean-libsframe:
+@if libsframe
+maybe-maintainer-clean-libsframe: maintainer-clean-libsframe
+
+maintainer-clean-libsframe: 
+	@[ -f ./libsframe/Makefile ] || exit 0; \
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	for flag in $(EXTRA_HOST_FLAGS) ; do \
+	  eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+	done; \
+	echo "Doing maintainer-clean in libsframe"; \
+	(cd $(HOST_SUBDIR)/libsframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+	          "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+	          "RANLIB=$${RANLIB}" \
+	          "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+	          maintainer-clean) \
+	  || exit 1
+
+@endif libsframe
+
+
+
 # ---------------------------------------
 # Modules which run on the target machine
 # ---------------------------------------
@@ -59280,6 +60442,11 @@ stage1-start::
 	  mkdir stage1-libctf; \
 	mv stage1-libctf libctf
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stage1-libsframe ] || \
+	  mkdir stage1-libsframe; \
+	mv stage1-libsframe libsframe
+@endif libsframe
 	@[ -d stage1-$(TARGET_SUBDIR) ] || \
 	  mkdir stage1-$(TARGET_SUBDIR); \
 	mv stage1-$(TARGET_SUBDIR) $(TARGET_SUBDIR)
@@ -59405,6 +60572,11 @@ stage1-end::
 	  cd $(HOST_SUBDIR); mv libctf stage1-libctf; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stage1-libsframe; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stage1-$(TARGET_SUBDIR); \
 	fi
@@ -59597,6 +60769,12 @@ stage2-start::
 	mv stage2-libctf libctf; \
 	mv stage1-libctf prev-libctf || test -f stage1-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stage2-libsframe ] || \
+	  mkdir stage2-libsframe; \
+	mv stage2-libsframe libsframe; \
+	mv stage1-libsframe prev-libsframe || test -f stage1-lean 
+@endif libsframe
 	@[ -d stage2-$(TARGET_SUBDIR) ] || \
 	  mkdir stage2-$(TARGET_SUBDIR); \
 	mv stage2-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -59747,6 +60925,12 @@ stage2-end::
 	  mv prev-libctf stage1-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stage2-libsframe; \
+	  mv prev-libsframe stage1-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stage2-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stage1-$(TARGET_SUBDIR); : ; \
@@ -59963,6 +61147,12 @@ stage3-start::
 	mv stage3-libctf libctf; \
 	mv stage2-libctf prev-libctf || test -f stage2-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stage3-libsframe ] || \
+	  mkdir stage3-libsframe; \
+	mv stage3-libsframe libsframe; \
+	mv stage2-libsframe prev-libsframe || test -f stage2-lean 
+@endif libsframe
 	@[ -d stage3-$(TARGET_SUBDIR) ] || \
 	  mkdir stage3-$(TARGET_SUBDIR); \
 	mv stage3-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -60113,6 +61303,12 @@ stage3-end::
 	  mv prev-libctf stage2-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stage3-libsframe; \
+	  mv prev-libsframe stage2-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stage3-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stage2-$(TARGET_SUBDIR); : ; \
@@ -60385,6 +61581,12 @@ stage4-start::
 	mv stage4-libctf libctf; \
 	mv stage3-libctf prev-libctf || test -f stage3-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stage4-libsframe ] || \
+	  mkdir stage4-libsframe; \
+	mv stage4-libsframe libsframe; \
+	mv stage3-libsframe prev-libsframe || test -f stage3-lean 
+@endif libsframe
 	@[ -d stage4-$(TARGET_SUBDIR) ] || \
 	  mkdir stage4-$(TARGET_SUBDIR); \
 	mv stage4-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -60535,6 +61737,12 @@ stage4-end::
 	  mv prev-libctf stage3-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stage4-libsframe; \
+	  mv prev-libsframe stage3-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stage4-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stage3-$(TARGET_SUBDIR); : ; \
@@ -60795,6 +62003,12 @@ stageprofile-start::
 	mv stageprofile-libctf libctf; \
 	mv stage1-libctf prev-libctf || test -f stage1-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stageprofile-libsframe ] || \
+	  mkdir stageprofile-libsframe; \
+	mv stageprofile-libsframe libsframe; \
+	mv stage1-libsframe prev-libsframe || test -f stage1-lean 
+@endif libsframe
 	@[ -d stageprofile-$(TARGET_SUBDIR) ] || \
 	  mkdir stageprofile-$(TARGET_SUBDIR); \
 	mv stageprofile-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -60945,6 +62159,12 @@ stageprofile-end::
 	  mv prev-libctf stage1-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stageprofile-libsframe; \
+	  mv prev-libsframe stage1-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stageprofile-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stage1-$(TARGET_SUBDIR); : ; \
@@ -61138,6 +62358,12 @@ stagetrain-start::
 	mv stagetrain-libctf libctf; \
 	mv stageprofile-libctf prev-libctf || test -f stageprofile-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stagetrain-libsframe ] || \
+	  mkdir stagetrain-libsframe; \
+	mv stagetrain-libsframe libsframe; \
+	mv stageprofile-libsframe prev-libsframe || test -f stageprofile-lean 
+@endif libsframe
 	@[ -d stagetrain-$(TARGET_SUBDIR) ] || \
 	  mkdir stagetrain-$(TARGET_SUBDIR); \
 	mv stagetrain-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -61288,6 +62514,12 @@ stagetrain-end::
 	  mv prev-libctf stageprofile-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stagetrain-libsframe; \
+	  mv prev-libsframe stageprofile-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stagetrain-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stageprofile-$(TARGET_SUBDIR); : ; \
@@ -61481,6 +62713,12 @@ stagefeedback-start::
 	mv stagefeedback-libctf libctf; \
 	mv stagetrain-libctf prev-libctf || test -f stagetrain-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stagefeedback-libsframe ] || \
+	  mkdir stagefeedback-libsframe; \
+	mv stagefeedback-libsframe libsframe; \
+	mv stagetrain-libsframe prev-libsframe || test -f stagetrain-lean 
+@endif libsframe
 	@[ -d stagefeedback-$(TARGET_SUBDIR) ] || \
 	  mkdir stagefeedback-$(TARGET_SUBDIR); \
 	mv stagefeedback-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -61631,6 +62869,12 @@ stagefeedback-end::
 	  mv prev-libctf stagetrain-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stagefeedback-libsframe; \
+	  mv prev-libsframe stagetrain-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stagefeedback-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stagetrain-$(TARGET_SUBDIR); : ; \
@@ -61847,6 +63091,12 @@ stageautoprofile-start::
 	mv stageautoprofile-libctf libctf; \
 	mv stage1-libctf prev-libctf || test -f stage1-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stageautoprofile-libsframe ] || \
+	  mkdir stageautoprofile-libsframe; \
+	mv stageautoprofile-libsframe libsframe; \
+	mv stage1-libsframe prev-libsframe || test -f stage1-lean 
+@endif libsframe
 	@[ -d stageautoprofile-$(TARGET_SUBDIR) ] || \
 	  mkdir stageautoprofile-$(TARGET_SUBDIR); \
 	mv stageautoprofile-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -61997,6 +63247,12 @@ stageautoprofile-end::
 	  mv prev-libctf stage1-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stageautoprofile-libsframe; \
+	  mv prev-libsframe stage1-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stageautoprofile-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stage1-$(TARGET_SUBDIR); : ; \
@@ -62190,6 +63446,12 @@ stageautofeedback-start::
 	mv stageautofeedback-libctf libctf; \
 	mv stageautoprofile-libctf prev-libctf || test -f stageautoprofile-lean 
 @endif libctf
+@if libsframe
+	@cd $(HOST_SUBDIR); [ -d stageautofeedback-libsframe ] || \
+	  mkdir stageautofeedback-libsframe; \
+	mv stageautofeedback-libsframe libsframe; \
+	mv stageautoprofile-libsframe prev-libsframe || test -f stageautoprofile-lean 
+@endif libsframe
 	@[ -d stageautofeedback-$(TARGET_SUBDIR) ] || \
 	  mkdir stageautofeedback-$(TARGET_SUBDIR); \
 	mv stageautofeedback-$(TARGET_SUBDIR) $(TARGET_SUBDIR); \
@@ -62340,6 +63602,12 @@ stageautofeedback-end::
 	  mv prev-libctf stageautoprofile-libctf; : ; \
 	fi
 @endif libctf
+@if libsframe
+	@if test -d $(HOST_SUBDIR)/libsframe; then \
+	  cd $(HOST_SUBDIR); mv libsframe stageautofeedback-libsframe; \
+	  mv prev-libsframe stageautoprofile-libsframe; : ; \
+	fi
+@endif libsframe
 	@if test -d $(TARGET_SUBDIR); then \
 	  mv $(TARGET_SUBDIR) stageautofeedback-$(TARGET_SUBDIR); \
 	  mv prev-$(TARGET_SUBDIR) stageautoprofile-$(TARGET_SUBDIR); : ; \
@@ -63259,6 +64527,16 @@ all-stagetrain-ld: maybe-all-stagetrain-libctf
 all-stagefeedback-ld: maybe-all-stagefeedback-libctf
 all-stageautoprofile-ld: maybe-all-stageautoprofile-libctf
 all-stageautofeedback-ld: maybe-all-stageautofeedback-libctf
+all-binutils: maybe-all-libsframe
+all-stage1-binutils: maybe-all-stage1-libsframe
+all-stage2-binutils: maybe-all-stage2-libsframe
+all-stage3-binutils: maybe-all-stage3-libsframe
+all-stage4-binutils: maybe-all-stage4-libsframe
+all-stageprofile-binutils: maybe-all-stageprofile-libsframe
+all-stagetrain-binutils: maybe-all-stagetrain-libsframe
+all-stagefeedback-binutils: maybe-all-stagefeedback-libsframe
+all-stageautoprofile-binutils: maybe-all-stageautoprofile-libsframe
+all-stageautofeedback-binutils: maybe-all-stageautofeedback-libsframe
 install-binutils: maybe-install-opcodes
 install-strip-binutils: maybe-install-strip-opcodes
 install-libctf: maybe-install-bfd
diff --git a/binutils/Makefile.am b/binutils/Makefile.am
index b249af721ae..6d974fd3f8a 100644
--- a/binutils/Makefile.am
+++ b/binutils/Makefile.am
@@ -176,6 +176,8 @@ LIBCTF =
 LIBCTF_NOBFD =
 endif
 
+LIBSFRAME = ../libsframe/libsframe.la
+
 LIBIBERTY = ../libiberty/libiberty.a
 
 POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES)
diff --git a/binutils/Makefile.in b/binutils/Makefile.in
index 51d504ad241..05aca3d3965 100644
--- a/binutils/Makefile.in
+++ b/binutils/Makefile.in
@@ -741,6 +741,7 @@ OPCODES = ../opcodes/libopcodes.la
 @ENABLE_LIBCTF_TRUE@LIBCTF = ../libctf/libctf.la
 @ENABLE_LIBCTF_FALSE@LIBCTF_NOBFD = 
 @ENABLE_LIBCTF_TRUE@LIBCTF_NOBFD = ../libctf/libctf-nobfd.la
+LIBSFRAME = ../libsframe/libsframe.la
 LIBIBERTY = ../libiberty/libiberty.a
 POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES)
 EXPECT = expect
diff --git a/config/dejagnu.m4 b/config/dejagnu.m4
new file mode 100644
index 00000000000..0606e42cb53
--- /dev/null
+++ b/config/dejagnu.m4
@@ -0,0 +1,22 @@
+# DEJAGNU_CHECK_VERSION DEJAGNU_CHECK_VERSION
+# --------------------------------------------------------------
+# Test whether there is an incompatibility between DejaGnu and GCC versions.
+# Older versions ( <= 1.5.1 ) of dejagnu.h use GNU inline semantics improperly.
+# The issue presents itself as link-time errors complaining about undefined
+# references to 'pass' and 'fail'.
+AC_DEFUN([DEJAGNU_CHECK_VERSION],
+[
+  AC_MSG_CHECKING([for incompatibility between DejaGnu and GCC])
+  AC_MSG_RESULT([$ac_cv_dejagnu_compat])
+
+  AC_TRY_LINK([#include <dejagnu.h>],
+	      [pass ("test foo");
+	       return 0;],
+	      [ac_cv_dejagnu_compat=yes],
+	      [ac_cv_dejagnu_compat=no])
+  AC_MSG_RESULT([$ac_cv_dejagnu_compat])
+
+  if test "$ac_cv_dejagnu_compat}" = no ; then
+    AC_MSG_RESULT([detected incompatibility between dejagnu version and gcc])
+  fi
+])
diff --git a/configure b/configure
index 7bcb894d1fe..80b2b02fe7e 100755
--- a/configure
+++ b/configure
@@ -2821,7 +2821,7 @@ build_tools="build-texinfo build-flex build-bison build-m4 build-fixincludes"
 
 # these libraries are used by various programs built for the host environment
 #f
-host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libcody libdecnumber gmp mpfr mpc isl libiconv libctf"
+host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libcody libdecnumber gmp mpfr mpc isl libiconv libctf libsframe"
 
 # these tools are built for the host environment
 # Note, the powerpc-eabi build depends on sim occurring before gdb in order to
diff --git a/configure.ac b/configure.ac
index aab451467bd..36267d85785 100644
--- a/configure.ac
+++ b/configure.ac
@@ -133,7 +133,7 @@ build_tools="build-texinfo build-flex build-bison build-m4 build-fixincludes"
 
 # these libraries are used by various programs built for the host environment
 #f
-host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libcody libdecnumber gmp mpfr mpc isl libiconv libctf"
+host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libcody libdecnumber gmp mpfr mpc isl libiconv libctf libsframe"
 
 # these tools are built for the host environment
 # Note, the powerpc-eabi build depends on sim occurring before gdb in order to
diff --git a/include/sframe-api.h b/include/sframe-api.h
new file mode 100644
index 00000000000..ededf703320
--- /dev/null
+++ b/include/sframe-api.h
@@ -0,0 +1,231 @@
+/* Public API to SFrame.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libsframe.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef	_SFRAME_API_H
+#define	_SFRAME_API_H
+
+#include <sframe.h>
+
+#ifdef	__cplusplus
+extern "C"
+{
+#endif
+
+typedef struct sframe_decoder_ctx sframe_decoder_ctx;
+typedef struct sframe_encoder_ctx sframe_encoder_ctx;
+
+#define MAX_OFFSET_BYTES (SFRAME_FRE_OFFSET_4B * 2 * 3)
+
+/* User interfacing SFrame Row Entry.
+   An abstraction provided by libsframe so the consumer is decoupled from
+   the binary format representation of the same.  */
+
+typedef struct sframe_frame_row_entry
+{
+  uint32_t fre_start_addr;
+  unsigned char fre_info;
+  unsigned char fre_offsets[MAX_OFFSET_BYTES];
+} sframe_frame_row_entry;
+
+#define SFRAME_ERR ((int) -1)
+
+/* This macro holds information about all the available SFrame
+   errors.  It is used to form both an enum holding all the error
+   constants, and also the error strings themselves.  To use, define
+   _SFRAME_FIRST and _SFRAME_ITEM to expand as you like, then
+   mention the macro name.  See the enum after this for an example.  */
+#define _SFRAME_ERRORS \
+  _SFRAME_FIRST (ESFRAME_VERSION_INVAL, "SFrame version not supported.") \
+  _SFRAME_ITEM (ESFRAME_NOMEM, "Out of Memory.") \
+  _SFRAME_ITEM (ESFRAME_INVAL, "Corrupt SFrame.") \
+  _SFRAME_ITEM (ESFRAME_BUF_INVAL, "Buffer does not contain SFrame data.") \
+  _SFRAME_ITEM (ESFRAME_DCTX_INVAL, "Corrupt SFrame decoder.") \
+  _SFRAME_ITEM (ESFRAME_ECTX_INVAL, "Corrupt SFrame encoder.") \
+  _SFRAME_ITEM (ESFRAME_FDE_INVAL, "Corrput FDE.") \
+  _SFRAME_ITEM (ESFRAME_FRE_INVAL, "Corrupt FRE.") \
+  _SFRAME_ITEM (ESFRAME_FDE_NOTFOUND,"FDE not found.") \
+  _SFRAME_ITEM (ESFRAME_FDE_NOTSORTED, "FDEs not sorted.") \
+  _SFRAME_ITEM (ESFRAME_FRE_NOTFOUND,"FRE not found.") \
+  _SFRAME_ITEM (ESFRAME_FREOFFSET_NOPRESENT,"FRE offset not present.")
+
+#define	ESFRAME_BASE	2000	/* Base value for libsframe errnos.  */
+
+enum
+  {
+#define _SFRAME_FIRST(NAME, STR) NAME = ESFRAME_BASE
+#define _SFRAME_ITEM(NAME, STR) , NAME
+_SFRAME_ERRORS
+#undef _SFRAME_ITEM
+#undef _SFRAME_FIRST
+  };
+
+/* Count of SFrame errors.  */
+#define ESFRAME_NERR (ESFRAME_FREOFFSET_NOPRESENT - ESFRAME_BASE + 1)
+
+/* Get the error message string.  */
+
+extern const char *
+sframe_errmsg (int error);
+
+/* Get FDE function info given a FRE_TYPE.  */
+
+extern unsigned char
+sframe_fde_func_info (unsigned int fre_type, unsigned int fde_type);
+
+/* Gather the FRE type given the function size.  */
+
+extern unsigned int
+sframe_calc_fre_type (unsigned int func_size);
+
+/* The SFrame Decoder.  */
+
+/* Decode the specified SFrame buffer CF_BUF of size CF_SIZE and return the
+   new SFrame decoder context.  Sets ERRP for the caller if any error.  */
+extern sframe_decoder_ctx *
+sframe_decode (const char *cf_buf, size_t cf_size, int *errp);
+
+/* Free the decoder context.  */
+extern void
+sframe_decoder_free (sframe_decoder_ctx **dctx);
+
+/* Get the size of the SFrame header from the decoder context DCTX.  */
+extern unsigned int
+sframe_decoder_get_hdr_size (sframe_decoder_ctx *dctx);
+
+/* Get the SFrame's abi/arch info.  */
+extern unsigned char
+sframe_decoder_get_abi_arch (sframe_decoder_ctx *dctx);
+
+/* Return the number of function descriptor entries in the SFrame decoder
+   DCTX.  */
+unsigned int
+sframe_decoder_get_num_fidx (sframe_decoder_ctx *dctx);
+
+/* Get the fixed FP offset from the decoder context DCTX.  */
+extern int8_t
+sframe_decoder_get_fixed_fp_offset (sframe_decoder_ctx *dctx);
+
+/* Get the fixed RA offset from the decoder context DCTX.  */
+extern int8_t
+sframe_decoder_get_fixed_ra_offset (sframe_decoder_ctx *dctx);
+
+/* Find the function descriptor entry which contains the specified address.  */
+extern sframe_func_desc_entry *
+sframe_get_funcdesc_with_addr (sframe_decoder_ctx *dctx,
+			       int32_t addr, int *errp);
+
+/* Find the SFrame Frame Row Entry which contains the PC.  Returns
+   SFRAME_ERR if failure.  */
+
+extern int
+sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc,
+		 sframe_frame_row_entry *frep);
+
+/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
+   index entry in the SFrame decoder CTX.  Returns error code as
+   applicable.  */
+extern int
+sframe_decoder_get_fre (sframe_decoder_ctx *ctx,
+			unsigned int func_idx,
+			unsigned int fre_idx,
+			sframe_frame_row_entry *fre);
+
+/* Get the data (NUM_FRES, FUNC_START_ADDRESS) from the function
+   descriptor entry at index I'th in the decoder CTX.  If failed,
+   return error code.  */
+extern int
+sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
+			     unsigned int i,
+			     uint32_t *num_fres,
+			     uint32_t *func_size,
+			     int32_t *func_start_address,
+			     unsigned char *func_info);
+
+
+/* Get the base reg id from the FRE info.  Sets errp if fails.  */
+extern unsigned int
+sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre, int *errp);
+
+/* Get the CFA offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+sframe_fre_get_cfa_offset (sframe_decoder_ctx *dtcx,
+			   sframe_frame_row_entry *fre, int *errp);
+
+/* Get the FP offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,
+			  sframe_frame_row_entry *fre, int *errp);
+
+/* Get the RA offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+sframe_fre_get_ra_offset (sframe_decoder_ctx *dctx,
+			  sframe_frame_row_entry *fre, int *errp);
+
+/* The SFrame Encoder.  */
+
+/* Create an encoder context with the given SFrame format version VER, FLAGS
+   and ABI information.  Sets errp if failure.  */
+extern sframe_encoder_ctx *
+sframe_encode (unsigned char ver, unsigned char flags, int abi,
+	       int8_t fixed_fp_offset, int8_t fixed_ra_offset, int *errp);
+
+/* Free the encoder context.  */
+extern void
+sframe_free_encoder (sframe_encoder_ctx *encoder);
+
+/* Get the size of the SFrame header from the encoder ctx ENCODER.  */
+extern unsigned int
+sframe_encoder_get_hdr_size (sframe_encoder_ctx *encoder);
+
+/* Get the abi/arch info from the SFrame encoder context CTX.  */
+extern unsigned char
+sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder);
+
+/* Return the number of function descriptor entries in the SFrame encoder
+   ENCODER.  */
+extern unsigned int
+sframe_encoder_get_num_fidx (sframe_encoder_ctx *encoder);
+
+/* Add an FRE to function at FUNC_IDX'th function descriptor index entry in
+   the encoder context.  */
+extern int
+sframe_encoder_add_fre (sframe_encoder_ctx *encoder,
+			unsigned int func_idx,
+			sframe_frame_row_entry *frep);
+
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE and NUM_FRES
+   to the encoder.  */
+extern int
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
+			     int32_t start_addr,
+			     uint32_t func_size,
+			     unsigned char func_info,
+			     uint32_t num_fres);
+
+/* Serialize the contents of the encoder and return the buffer.  ENCODED_SIZE
+   is updated to the size of the buffer.  Sets ERRP if failure.  */
+extern char  *
+sframe_encoder_write (sframe_encoder_ctx *encoder,
+		      size_t *encoded_size, int *errp);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif				/* _SFRAME_API_H */
diff --git a/libsframe/Makefile.am b/libsframe/Makefile.am
new file mode 100644
index 00000000000..940494dba1e
--- /dev/null
+++ b/libsframe/Makefile.am
@@ -0,0 +1,39 @@
+## Process this file with automake to produce Makefile.in.
+#
+#   Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 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; see the file COPYING.  If not see
+# <http://www.gnu.org/licenses/>.
+#
+ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
+
+AUTOMAKE_OPTIONS = dejagnu foreign no-texinfo.tex subdir-objects
+
+INCDIR = $(srcdir)/../include
+# include libctf for swap.h
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../libctf
+AM_CFLAGS = @ac_libsframe_warn_cflags@
+
+if INSTALL_LIBBFD
+lib_LTLIBRARIES = libsframe.la
+include_HEADERS = $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
+else
+include_HEADERS =
+noinst_LTLIBRARIES = libsframe.la
+endif
+
+libsframe_la_SOURCES = sframe.c sframe-error.c
+libsframe_la_CPPFLAGS = $(AM_CPPFLAGS)
+
+include testsuite/local.mk
diff --git a/libsframe/Makefile.in b/libsframe/Makefile.in
new file mode 100644
index 00000000000..2d1ea896471
--- /dev/null
+++ b/libsframe/Makefile.in
@@ -0,0 +1,1158 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = $(am__EXEEXT_1)
+@HAVE_COMPAT_DEJAGNU_TRUE@am__append_1 = 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
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
+	$(top_srcdir)/../config/acx.m4 \
+	$(top_srcdir)/../config/dejagnu.m4 \
+	$(top_srcdir)/../config/depstand.m4 \
+	$(top_srcdir)/../config/jobserver.m4 \
+	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/override.m4 \
+	$(top_srcdir)/../config/warnings.m4 \
+	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
+	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
+	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__include_HEADERS_DIST) \
+	$(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+libsframe_la_LIBADD =
+am_libsframe_la_OBJECTS = libsframe_la-sframe.lo \
+	libsframe_la-sframe-error.lo
+libsframe_la_OBJECTS = $(am_libsframe_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+@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/frecnt-1$(EXEEXT) \
+@HAVE_COMPAT_DEJAGNU_TRUE@	testsuite/libsframe.decode/frecnt-2$(EXEEXT) \
+@HAVE_COMPAT_DEJAGNU_TRUE@	testsuite/libsframe.encode/encode-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 =  \
+	$(am_testsuite_libsframe_decode_be_flipping_OBJECTS)
+testsuite_libsframe_decode_be_flipping_DEPENDENCIES =  \
+	${top_builddir}/libsframe.la
+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)
+testsuite_libsframe_decode_frecnt_1_DEPENDENCIES =  \
+	${top_builddir}/libsframe.la
+am_testsuite_libsframe_decode_frecnt_2_OBJECTS = testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.$(OBJEXT)
+testsuite_libsframe_decode_frecnt_2_OBJECTS =  \
+	$(am_testsuite_libsframe_decode_frecnt_2_OBJECTS)
+testsuite_libsframe_decode_frecnt_2_DEPENDENCIES =  \
+	${top_builddir}/libsframe.la
+am_testsuite_libsframe_encode_encode_1_OBJECTS = testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.$(OBJEXT)
+testsuite_libsframe_encode_encode_1_OBJECTS =  \
+	$(am_testsuite_libsframe_encode_encode_1_OBJECTS)
+testsuite_libsframe_encode_encode_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
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/../depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+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)
+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)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__include_HEADERS_DIST = $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
+HEADERS = $(include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope
+DEJATOOL = $(PACKAGE)
+RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(srcdir)/testsuite/libsframe.decode/local.mk \
+	$(srcdir)/testsuite/libsframe.encode/local.mk \
+	$(srcdir)/testsuite/local.mk $(top_srcdir)/../ar-lib \
+	$(top_srcdir)/../compile $(top_srcdir)/../config.guess \
+	$(top_srcdir)/../config.sub $(top_srcdir)/../depcomp \
+	$(top_srcdir)/../install-sh $(top_srcdir)/../ltmain.sh \
+	$(top_srcdir)/../missing $(top_srcdir)/../mkinstalldirs
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+COMPAT_DEJAGNU = @COMPAT_DEJAGNU@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_libsframe_warn_cflags = @ac_libsframe_warn_cflags@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_noncanonical = @host_noncanonical@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+target_noncanonical = @target_noncanonical@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+#
+#   Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 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; see the file COPYING.  If not see
+# <http://www.gnu.org/licenses/>.
+#
+ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
+AUTOMAKE_OPTIONS = dejagnu foreign no-texinfo.tex subdir-objects
+INCDIR = $(srcdir)/../include
+# include libctf for swap.h
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../libctf
+AM_CFLAGS = @ac_libsframe_warn_cflags@
+@INSTALL_LIBBFD_TRUE@lib_LTLIBRARIES = libsframe.la
+@INSTALL_LIBBFD_FALSE@include_HEADERS = 
+@INSTALL_LIBBFD_TRUE@include_HEADERS = $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
+@INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libsframe.la
+libsframe_la_SOURCES = sframe.c sframe-error.c
+libsframe_la_CPPFLAGS = $(AM_CPPFLAGS)
+
+# Setup the testing framework
+EXPECT = expect
+RUNTEST = runtest
+RUNTESTFLAGS = 
+testsuite_libsframe_decode_be_flipping_SOURCES = testsuite/libsframe.decode/be-flipping.c
+testsuite_libsframe_decode_be_flipping_LDADD = ${top_builddir}/libsframe.la
+testsuite_libsframe_decode_be_flipping_CPPFLAGS = -I${top_srcdir}/../include -Wall
+testsuite_libsframe_decode_frecnt_1_SOURCES = testsuite/libsframe.decode/frecnt-1.c
+testsuite_libsframe_decode_frecnt_1_LDADD = ${top_builddir}/libsframe.la
+testsuite_libsframe_decode_frecnt_1_CPPFLAGS = -I${top_srcdir}/../include -Wall
+testsuite_libsframe_decode_frecnt_2_SOURCES = testsuite/libsframe.decode/frecnt-2.c
+testsuite_libsframe_decode_frecnt_2_LDADD = ${top_builddir}/libsframe.la 
+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
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+$(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libsframe.la: $(libsframe_la_OBJECTS) $(libsframe_la_DEPENDENCIES) $(EXTRA_libsframe_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_libsframe_la_rpath) $(libsframe_la_OBJECTS) $(libsframe_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+testsuite/libsframe.decode/$(am__dirstamp):
+	@$(MKDIR_P) testsuite/libsframe.decode
+	@: > testsuite/libsframe.decode/$(am__dirstamp)
+testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) testsuite/libsframe.decode/$(DEPDIR)
+	@: > testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp)
+testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.$(OBJEXT):  \
+	testsuite/libsframe.decode/$(am__dirstamp) \
+	testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp)
+
+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_frecnt_1-frecnt-1.$(OBJEXT):  \
+	testsuite/libsframe.decode/$(am__dirstamp) \
+	testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp)
+
+testsuite/libsframe.decode/frecnt-1$(EXEEXT): $(testsuite_libsframe_decode_frecnt_1_OBJECTS) $(testsuite_libsframe_decode_frecnt_1_DEPENDENCIES) $(EXTRA_testsuite_libsframe_decode_frecnt_1_DEPENDENCIES) testsuite/libsframe.decode/$(am__dirstamp)
+	@rm -f testsuite/libsframe.decode/frecnt-1$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(testsuite_libsframe_decode_frecnt_1_OBJECTS) $(testsuite_libsframe_decode_frecnt_1_LDADD) $(LIBS)
+testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.$(OBJEXT):  \
+	testsuite/libsframe.decode/$(am__dirstamp) \
+	testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp)
+
+testsuite/libsframe.decode/frecnt-2$(EXEEXT): $(testsuite_libsframe_decode_frecnt_2_OBJECTS) $(testsuite_libsframe_decode_frecnt_2_DEPENDENCIES) $(EXTRA_testsuite_libsframe_decode_frecnt_2_DEPENDENCIES) testsuite/libsframe.decode/$(am__dirstamp)
+	@rm -f testsuite/libsframe.decode/frecnt-2$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(testsuite_libsframe_decode_frecnt_2_OBJECTS) $(testsuite_libsframe_decode_frecnt_2_LDADD) $(LIBS)
+testsuite/libsframe.encode/$(am__dirstamp):
+	@$(MKDIR_P) testsuite/libsframe.encode
+	@: > testsuite/libsframe.encode/$(am__dirstamp)
+testsuite/libsframe.encode/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) testsuite/libsframe.encode/$(DEPDIR)
+	@: > testsuite/libsframe.encode/$(DEPDIR)/$(am__dirstamp)
+testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.$(OBJEXT):  \
+	testsuite/libsframe.encode/$(am__dirstamp) \
+	testsuite/libsframe.encode/$(DEPDIR)/$(am__dirstamp)
+
+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)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f testsuite/libsframe.decode/*.$(OBJEXT)
+	-rm -f testsuite/libsframe.encode/*.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@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_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@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libsframe_la-sframe.lo: sframe.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframe_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsframe_la-sframe.lo -MD -MP -MF $(DEPDIR)/libsframe_la-sframe.Tpo -c -o libsframe_la-sframe.lo `test -f 'sframe.c' || echo '$(srcdir)/'`sframe.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libsframe_la-sframe.Tpo $(DEPDIR)/libsframe_la-sframe.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sframe.c' object='libsframe_la-sframe.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframe_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsframe_la-sframe.lo `test -f 'sframe.c' || echo '$(srcdir)/'`sframe.c
+
+libsframe_la-sframe-error.lo: sframe-error.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframe_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsframe_la-sframe-error.lo -MD -MP -MF $(DEPDIR)/libsframe_la-sframe-error.Tpo -c -o libsframe_la-sframe-error.lo `test -f 'sframe-error.c' || echo '$(srcdir)/'`sframe-error.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libsframe_la-sframe-error.Tpo $(DEPDIR)/libsframe_la-sframe-error.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sframe-error.c' object='libsframe_la-sframe-error.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframe_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsframe_la-sframe-error.lo `test -f 'sframe-error.c' || echo '$(srcdir)/'`sframe-error.c
+
+testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o: testsuite/libsframe.decode/be-flipping.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_be_flipping_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o `test -f 'testsuite/libsframe.decode/be-flipping.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/be-flipping.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/be-flipping.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.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_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o `test -f 'testsuite/libsframe.decode/be-flipping.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/be-flipping.c
+
+testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.obj: testsuite/libsframe.decode/be-flipping.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_be_flipping_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.obj -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Tpo -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`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/be-flipping.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.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_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_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
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/frecnt-1.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-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_decode_frecnt_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -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
+
+testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.obj: 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.obj -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.obj `if test -f 'testsuite/libsframe.decode/frecnt-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/frecnt-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/frecnt-1.c'; fi`
+@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
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/frecnt-1.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-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_decode_frecnt_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_1-frecnt-1.obj `if test -f 'testsuite/libsframe.decode/frecnt-1.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/frecnt-1.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/frecnt-1.c'; fi`
+
+testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.o: testsuite/libsframe.decode/frecnt-2.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_frecnt_2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.o -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.o `test -f 'testsuite/libsframe.decode/frecnt-2.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/frecnt-2.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/frecnt-2.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.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_frecnt_2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.o `test -f 'testsuite/libsframe.decode/frecnt-2.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/frecnt-2.c
+
+testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.obj: testsuite/libsframe.decode/frecnt-2.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_frecnt_2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.obj -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.obj `if test -f 'testsuite/libsframe.decode/frecnt-2.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/frecnt-2.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/frecnt-2.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Tpo testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.decode/frecnt-2.c' object='testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.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_frecnt_2_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_frecnt_2-frecnt-2.obj `if test -f 'testsuite/libsframe.decode/frecnt-2.c'; then $(CYGPATH_W) 'testsuite/libsframe.decode/frecnt-2.c'; else $(CYGPATH_W) '$(srcdir)/testsuite/libsframe.decode/frecnt-2.c'; fi`
+
+testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.o: testsuite/libsframe.encode/encode-1.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_encode_encode_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.o -MD -MP -MF testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Tpo -c -o testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.o `test -f 'testsuite/libsframe.encode/encode-1.c' || echo '$(srcdir)/'`testsuite/libsframe.encode/encode-1.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Tpo testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.encode/encode-1.c' object='testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-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_encode_encode_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.o `test -f 'testsuite/libsframe.encode/encode-1.c' || echo '$(srcdir)/'`testsuite/libsframe.encode/encode-1.c
+
+testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.obj: testsuite/libsframe.encode/encode-1.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_encode_encode_1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-1.obj -MD -MP -MF testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Tpo -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`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Tpo testsuite/libsframe.encode/$(DEPDIR)/testsuite_libsframe_encode_encode_1-encode-1.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testsuite/libsframe.encode/encode-1.c' object='testsuite/libsframe.encode/testsuite_libsframe_encode_encode_1-encode-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_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`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+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
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
+	@echo 'Making a new site.exp file ...'
+	@echo '## these variables are automatically generated by make ##' >site.tmp
+	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
+	@echo '# edit the last section' >>site.tmp
+	@echo 'set srcdir "$(srcdir)"' >>site.tmp
+	@echo "set objdir `pwd`" >>site.tmp
+	@echo 'set build_alias "$(build_alias)"' >>site.tmp
+	@echo 'set build_triplet $(build_triplet)' >>site.tmp
+	@echo 'set host_alias "$(host_alias)"' >>site.tmp
+	@echo 'set host_triplet $(host_triplet)' >>site.tmp
+	@list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
+	  echo "## Begin content included from file $$f.  Do not modify. ##" \
+	   && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
+	   && echo "## End content included from file $$f. ##" \
+	   || exit 1; \
+	 done >> site.tmp
+	@echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp
+	@if test -f site.exp; then \
+	   sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \
+	 fi
+	@-rm -f site.bak
+	@test ! -f site.exp || mv site.exp site.bak
+	@mv site.tmp site.exp
+
+distclean-DEJAGNU:
+	-rm -f site.exp site.bak
+	-l='$(DEJATOOL)'; for tool in $$l; do \
+	  rm -f $$tool.sum $$tool.log; \
+	done
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f testsuite/libsframe.decode/$(DEPDIR)/$(am__dirstamp)
+	-rm -f testsuite/libsframe.decode/$(am__dirstamp)
+	-rm -f testsuite/libsframe.encode/$(DEPDIR)/$(am__dirstamp)
+	-rm -f testsuite/libsframe.encode/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-DEJAGNU distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+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 -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-DEJAGNU \
+	check-am clean clean-checkPROGRAMS clean-cscope clean-generic \
+	clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
+	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+	distcheck distclean distclean-DEJAGNU distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+check-DEJAGNU: site.exp
+	srcroot=`cd $(srcdir) && pwd`; export srcroot; \
+	r=`pwd`; export r; \
+	LC_ALL=C; export LC_ALL; \
+	EXPECT=$(EXPECT); export EXPECT; \
+	runtest=$(RUNTEST); \
+	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
+	  $$runtest --tool $(DEJATOOL) --srcdir $${srcroot}/testsuite \
+		CC="$(CC)" \
+		CROSS_COMPILE="$(CROSS_COMPILE)" \
+		COMPAT_DEJAGNU="$(COMPAT_DEJAGNU)" \
+		CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_builddir)" \
+		$(RUNTESTFLAGS); \
+	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
+	fi
+
+# libsframe encoder/decoder 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.
+.NOEXPORT:
diff --git a/libsframe/aclocal.m4 b/libsframe/aclocal.m4
new file mode 100644
index 00000000000..b0cdd6b184d
--- /dev/null
+++ b/libsframe/aclocal.m4
@@ -0,0 +1,1242 @@
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.15'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.15.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# Copyright (C) 2011-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AR([ACT-IF-FAIL])
+# -------------------------
+# Try to determine the archiver interface, and trigger the ar-lib wrapper
+# if it is needed.  If the detection of archiver interface fails, run
+# ACT-IF-FAIL (default is to abort configure with a proper error message).
+AC_DEFUN([AM_PROG_AR],
+[AC_BEFORE([$0], [LT_INIT])dnl
+AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([ar-lib])dnl
+AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
+: ${AR=ar}
+
+AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
+  [AC_LANG_PUSH([C])
+   am_cv_ar_interface=ar
+   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
+     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([am_ar_try])
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+        AC_TRY_EVAL([am_ar_try])
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+     ])
+   AC_LANG_POP([C])])
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  m4_default([$1],
+             [AC_MSG_ERROR([could not determine $AR interface])])
+  ;;
+esac
+AC_SUBST([AR])dnl
+])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+      am_maintainer_other[ make rules and dependencies not useful
+      (and sometimes confusing) to the casual installer])],
+    [USE_MAINTAINER_MODE=$enableval],
+    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../bfd/acinclude.m4])
+m4_include([../config/acx.m4])
+m4_include([../config/dejagnu.m4])
+m4_include([../config/depstand.m4])
+m4_include([../config/jobserver.m4])
+m4_include([../config/lead-dot.m4])
+m4_include([../config/override.m4])
+m4_include([../config/warnings.m4])
+m4_include([../libtool.m4])
+m4_include([../ltoptions.m4])
+m4_include([../ltsugar.m4])
+m4_include([../ltversion.m4])
+m4_include([../lt~obsolete.m4])
diff --git a/libsframe/config.h.in b/libsframe/config.h.in
new file mode 100644
index 00000000000..74810fd30df
--- /dev/null
+++ b/libsframe/config.h.in
@@ -0,0 +1,132 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
+/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you
+   don't. */
+#undef HAVE_DECL_BSWAP_16
+
+/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you
+   don't. */
+#undef HAVE_DECL_BSWAP_32
+
+/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you
+   don't. */
+#undef HAVE_DECL_BSWAP_64
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <endian.h> header file. */
+#undef HAVE_ENDIAN_H
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
diff --git a/libsframe/configure.ac b/libsframe/configure.ac
new file mode 100644
index 00000000000..a6c1d26bbbb
--- /dev/null
+++ b/libsframe/configure.ac
@@ -0,0 +1,75 @@
+dnl                                            -*- Autoconf -*-
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl   Copyright (C) 2022 Free Software Foundation, Inc.
+dnl
+dnl This file is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; see the file COPYING.  If not see
+dnl <http://www.gnu.org/licenses/>.
+dnl
+
+AC_INIT([libsframe], BFD_VERSION)
+AC_CONFIG_SRCDIR(sframe.c)
+AC_USE_SYSTEM_EXTENSIONS
+AM_INIT_AUTOMAKE
+
+# Checks for programs.
+AC_PROG_MAKE_SET
+AC_PROG_CC
+AC_PROG_RANLIB
+AM_PROG_AR
+
+dnl Default to a non shared library.  This may be overridden by the
+dnl configure option --enable-shared.
+AC_DISABLE_SHARED
+
+LT_INIT
+AC_SYS_LARGEFILE
+
+MISSING=`cd $ac_aux_dir && ${PWDCMD-pwd}`/missing
+AC_CHECK_PROGS([ACLOCAL], [aclocal], [$MISSING aclocal])
+AC_CHECK_PROGS([AUTOCONF], [autoconf], [$MISSING autoconf])
+AC_CHECK_PROGS([AUTOHEADER], [autoheader], [$MISSING autoheader])
+
+dnl Figure out what compiler warnings we can enable.
+dnl See config/warnings.m4 for details.
+
+ACX_PROG_CC_WARNING_OPTS([-Wall -Wextra -Wwrite-strings \
+			  -Wmissing-format-attribute \
+			  -Wstrict-prototypes -Wmissing-prototypes],
+			  [ac_libsframe_warn_cflags])
+
+dnl The libsframe testsuite uses dejagnu.h.
+dnl If the version of dejagnu and gcc are incompatible then the libsframe
+dnl testsuite is not built.
+
+DEJAGNU_CHECK_VERSION
+AM_CONDITIONAL([HAVE_COMPAT_DEJAGNU], [test "x$ac_cv_dejagnu_compat" = "xyes"])
+
+COMPAT_DEJAGNU=$ac_cv_dejagnu_compat
+AC_SUBST(COMPAT_DEJAGNU)
+
+AM_MAINTAINER_MODE
+AM_INSTALL_LIBBFD
+
+AC_FUNC_MMAP
+AC_CHECK_HEADERS(byteswap.h endian.h)
+
+dnl Check for bswap_{16,32,64}
+AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64], [], [], [[#include <byteswap.h>]])
+
+AC_CONFIG_FILES(Makefile)
+AC_CONFIG_HEADERS(config.h)
+AC_OUTPUT
+
+GNU_MAKE_JOBSERVER
diff --git a/libsframe/sframe-error.c b/libsframe/sframe-error.c
new file mode 100644
index 00000000000..124738f6901
--- /dev/null
+++ b/libsframe/sframe-error.c
@@ -0,0 +1,49 @@
+/* sframe-error.c - Error messages.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libsframe.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "sframe-api.h"
+#include <stddef.h>
+#include <string.h>
+
+/* In this file, we want to treat the first item of the SFrame error
+   macro like subsequent items.  */
+#define _SFRAME_FIRST(NAME, VALUE) _SFRAME_ITEM(NAME, VALUE)
+
+/* The error message strings, each in a unique structure member precisely big
+   enough for that error, plus a str member to access them all as a string
+   table.  */
+
+static const char *const _sframe_errlist[] = {
+#define _SFRAME_ITEM(n, s) s,
+_SFRAME_ERRORS
+#undef _SFRAME_ITEM
+};
+
+const char *
+sframe_errmsg (int error)
+{
+  const char *str;
+
+  if (error >= ESFRAME_BASE && (error - ESFRAME_BASE) < ESFRAME_NERR)
+    str = _sframe_errlist[error - ESFRAME_BASE];
+  else
+    str = (const char *) strerror (error);
+
+  return (str ? str : "Unknown error");
+}
diff --git a/libsframe/sframe-impl.h b/libsframe/sframe-impl.h
new file mode 100644
index 00000000000..0e61c977886
--- /dev/null
+++ b/libsframe/sframe-impl.h
@@ -0,0 +1,55 @@
+/* Implementation header.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libsframe.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SFRAME_IMPL_H
+#define _SFRAME_IMPL_H
+
+#include "sframe-api.h"
+
+#ifdef  __cplusplus
+extern "C"
+{
+#endif
+
+#include <assert.h>
+#define sframe_assert(expr) (assert (expr))
+
+struct sframe_decoder_ctx
+{
+  sframe_header sfd_header;	      /* SFrame header.  */
+  uint32_t *sfd_funcdesc;	      /* SFrame function desc entries table.  */
+  void *sfd_fres;		      /* SFrame FRE table.  */
+  int sfd_fre_nbytes;		      /* Number of bytes needed for SFrame FREs.  */
+};
+
+struct sframe_encoder_ctx
+{
+  sframe_header sfe_header;		/* SFrame header.  */
+  uint32_t *sfe_funcdesc;		/* SFrame function desc entries table.  */
+  sframe_frame_row_entry *sfe_fres;	/* SFrame FRE table.  */
+  uint32_t sfe_fre_nbytes;		/* Number of bytes needed for SFrame FREs.  */
+  char *sfe_data;			/* SFrame data buffer.  */
+  size_t sfe_data_size;			/* Size of the SFrame data buffer.  */
+};
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* _SFRAME_IMPL_H */
diff --git a/libsframe/sframe.c b/libsframe/sframe.c
new file mode 100644
index 00000000000..a1059baf9ae
--- /dev/null
+++ b/libsframe/sframe.c
@@ -0,0 +1,1657 @@
+/* sframe.c - SFrame decoder/encoder.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libsframe.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include "sframe-impl.h"
+#include "swap.h"
+
+typedef struct sf_funidx_tbl
+{
+  unsigned int count;
+  unsigned int alloced;
+  sframe_func_desc_entry entry[1];
+} sf_funidx_tbl;
+
+typedef struct sf_fre_tbl
+{
+  unsigned int count;
+  unsigned int alloced;
+  sframe_frame_row_entry entry[1];
+} sf_fre_tbl;
+
+#define _sf_printflike_(string_index,first_to_check) \
+    __attribute__ ((__format__ (__printf__, (string_index), (first_to_check))))
+
+static void debug_printf (const char *, ...);
+
+static int _sframe_debug;	/* Control for printing out debug info.  */
+static int number_of_entries = 64;
+
+static void
+sframe_init_debug (void)
+{
+  static int inited;
+
+  if (!inited)
+    {
+      _sframe_debug = getenv ("SFRAME_DEBUG") != NULL;
+      inited = 1;
+    }
+}
+
+_sf_printflike_ (1, 2)
+static void debug_printf (const char *format, ...)
+{
+  if (_sframe_debug)
+    {
+      va_list args;
+
+      va_start (args, format);
+      vfprintf (stderr, format, args);
+      va_end (args);
+    }
+}
+
+/* Generate bitmask of given size in bytes.  This is used for
+   some checks on the FRE start address.
+   SFRAME_FRE_TYPE_ADDR1 => 1 byte => [ bitmask = 0xff ]
+   SFRAME_FRE_TYPE_ADDR2 => 2 byte => [ bitmask = 0xffff ]
+   SFRAME_FRE_TYPE_ADDR4 => 4 byte => [ bitmask = 0xffffffff ].  */
+#define SFRAME_BITMASK_OF_SIZE(size_in_bytes) \
+  (((uint64_t)1 << (size_in_bytes*8)) - 1)
+
+/* Store the specified error code into errp if it is non-NULL.
+   Return SFRAME_ERR.  */
+
+static int
+sframe_set_errno (int *errp, int error)
+{
+  if (errp != NULL)
+    *errp = error;
+  return SFRAME_ERR;
+}
+
+/* Store the specified error code into errp if it is non-NULL.
+   Return NULL.  */
+
+static void *
+sframe_ret_set_errno (int *errp, int error)
+{
+  if (errp != NULL)
+    *errp = error;
+  return NULL;
+}
+
+/* Get the SFrame header size.  */
+
+static uint32_t
+sframe_get_hdr_size (sframe_header *sfh)
+{
+  return SFRAME_V1_HDR_SIZE (*sfh);
+}
+
+/* Access functions for frame row entry data.  */
+
+static unsigned int
+sframe_fre_get_offset_count (unsigned char fre_info)
+{
+  return SFRAME_V1_FRE_OFFSET_COUNT (fre_info);
+}
+
+static unsigned int
+sframe_fre_get_offset_size (unsigned char fre_info)
+{
+  return SFRAME_V1_FRE_OFFSET_SIZE (fre_info);
+}
+
+/* Access functions for info from function descriptor entry.  */
+
+static unsigned int
+sframe_get_fre_type (sframe_func_desc_entry *fdep)
+{
+  unsigned int fre_type = 0;
+  if (fdep)
+    fre_type = SFRAME_V1_FUNC_FRE_TYPE (fdep->sfde_func_info);
+  return fre_type;
+}
+
+static unsigned int
+sframe_get_fde_type (sframe_func_desc_entry *fdep)
+{
+  unsigned int fde_type = 0;
+  if (fdep)
+    fde_type = SFRAME_V1_FUNC_FDE_TYPE (fdep->sfde_func_info);
+  return fde_type;
+}
+
+/* Check if flipping is needed, based on ENDIAN.  */
+
+static int
+need_swapping (int endian)
+{
+  unsigned int ui = 1;
+  char *c = (char *)&ui;
+  int is_little = (int)*c;
+
+  switch (endian)
+    {
+      case SFRAME_ABI_AARCH64_ENDIAN_LITTLE:
+      case SFRAME_ABI_AMD64_ENDIAN_LITTLE:
+	return !is_little;
+      case SFRAME_ABI_AARCH64_ENDIAN_BIG:
+	return is_little;
+      default:
+	break;
+    }
+
+  return 0;
+}
+
+/* Flip the endianness of the SFrame header.  */
+
+static void
+flip_header (sframe_header *sfheader)
+{
+  swap_thing (sfheader->sfh_preamble.sfp_magic);
+  swap_thing (sfheader->sfh_preamble.sfp_version);
+  swap_thing (sfheader->sfh_preamble.sfp_flags);
+  swap_thing (sfheader->sfh_cfa_fixed_fp_offset);
+  swap_thing (sfheader->sfh_cfa_fixed_ra_offset);
+  swap_thing (sfheader->sfh_num_fdes);
+  swap_thing (sfheader->sfh_num_fres);
+  swap_thing (sfheader->sfh_fre_len);
+  swap_thing (sfheader->sfh_fdeoff);
+  swap_thing (sfheader->sfh_freoff);
+}
+
+static void
+flip_fde (sframe_func_desc_entry *fdep)
+{
+  swap_thing (fdep->sfde_func_start_address);
+  swap_thing (fdep->sfde_func_size);
+  swap_thing (fdep->sfde_func_start_fre_off);
+  swap_thing (fdep->sfde_func_num_fres);
+}
+
+/* Check if SFrame header has valid data.  */
+
+static int
+sframe_header_sanity_check_p (sframe_header *hp)
+{
+  unsigned char all_flags = SFRAME_F_FDE_SORTED | SFRAME_F_FRAME_POINTER;
+  /* Check preamble is valid.  */
+  if ((hp->sfh_preamble.sfp_magic != SFRAME_MAGIC)
+      || (hp->sfh_preamble.sfp_version != SFRAME_VERSION)
+      || ((hp->sfh_preamble.sfp_flags | all_flags)
+	  != all_flags))
+    return 0;
+
+  /* Check offsets are valid.  */
+  if (hp->sfh_fdeoff > hp->sfh_freoff)
+    return 0;
+
+  return 1;
+}
+
+/* Flip the start address pointed to by FP.  */
+
+static void
+flip_fre_start_address (char *fp, unsigned int fre_type)
+{
+  void *start = (void*)fp;
+  if (fre_type == SFRAME_FRE_TYPE_ADDR2)
+    {
+      unsigned short *start_addr = (unsigned short *)(start);
+      swap_thing (*start_addr);
+    }
+  else if (fre_type == SFRAME_FRE_TYPE_ADDR4)
+    {
+      uint32_t *start_addr = (uint32_t *)(start);
+      swap_thing (*start_addr);
+    }
+}
+
+static void
+flip_fre_stack_offsets (char *fp, unsigned char offset_size,
+			unsigned char offset_cnt)
+{
+  int j;
+  void *offsets = (void *)fp;
+
+  if (offset_size == SFRAME_FRE_OFFSET_2B)
+    {
+      unsigned short *ust = (unsigned short *)offsets;
+      for (j = offset_cnt; j > 0; ust++, j--)
+	swap_thing (*ust);
+    }
+  else if (offset_size == SFRAME_FRE_OFFSET_4B)
+    {
+      uint32_t *uit = (uint32_t *)offsets;
+      for (j = offset_cnt; j > 0; uit++, j--)
+	swap_thing (*uit);
+    }
+}
+
+/* Get the FRE start address size, given the FRE_TYPE.  */
+
+static size_t
+sframe_fre_start_addr_size (unsigned int fre_type)
+{
+  size_t addr_size = 0;
+  switch (fre_type)
+    {
+    case SFRAME_FRE_TYPE_ADDR1:
+      addr_size = 1;
+      break;
+    case SFRAME_FRE_TYPE_ADDR2:
+      addr_size = 2;
+      break;
+    case SFRAME_FRE_TYPE_ADDR4:
+      addr_size = 4;
+      break;
+    default:
+      /* No other value is expected.  */
+      sframe_assert (0);
+      break;
+    }
+  return addr_size;
+}
+
+/* Check if the FREP has valid data.  */
+
+static int
+sframe_fre_sanity_check_p (sframe_frame_row_entry *frep)
+{
+  unsigned int offset_size, offset_cnt;
+  unsigned int fre_info;
+
+  if (frep == NULL)
+    return 0;
+
+  fre_info = frep->fre_info;
+  offset_size = sframe_fre_get_offset_size (fre_info);
+
+  if (offset_size != SFRAME_FRE_OFFSET_1B
+      && offset_size != SFRAME_FRE_OFFSET_2B
+      && offset_size != SFRAME_FRE_OFFSET_4B)
+    return 0;
+
+  offset_cnt = sframe_fre_get_offset_count (fre_info);
+  if (offset_cnt > 3)
+    return 0;
+
+  return 1;
+}
+
+/* Get FRE_INFO's offset size in bytes.  */
+
+static size_t
+sframe_fre_offset_bytes_size (unsigned char fre_info)
+{
+  unsigned int offset_size, offset_cnt;
+
+  offset_size = sframe_fre_get_offset_size (fre_info);
+
+  debug_printf ("offset_size =  %u\n", offset_size);
+
+  offset_cnt = sframe_fre_get_offset_count (fre_info);
+
+  if (offset_size == SFRAME_FRE_OFFSET_2B
+      || offset_size == SFRAME_FRE_OFFSET_4B)	/* 2 or 4 bytes.  */
+    return (offset_cnt * (offset_size * 2));
+
+  return (offset_cnt);
+}
+
+/* Get total size in bytes to represent FREP in the binary format.  This
+   includes the starting address, FRE info, and all the offsets.  */
+
+static size_t
+sframe_fre_entry_size (sframe_frame_row_entry *frep, unsigned int fre_type)
+{
+  if (frep == NULL)
+    return 0;
+
+  unsigned char fre_info = frep->fre_info;
+  size_t addr_size = sframe_fre_start_addr_size (fre_type);
+
+  return (addr_size + sizeof (frep->fre_info)
+	  + sframe_fre_offset_bytes_size (fre_info));
+}
+
+static int
+flip_fre (char *fp, unsigned int fre_type, size_t *fre_size)
+{
+  unsigned char fre_info;
+  unsigned int offset_size, offset_cnt;
+  size_t addr_size, fre_info_size = 0;
+  int err = 0;
+
+  if (fre_size == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  flip_fre_start_address (fp, fre_type);
+
+  /* Advance the buffer pointer to where the FRE info is.  */
+  addr_size = sframe_fre_start_addr_size (fre_type);
+  fp += addr_size;
+
+  /* FRE info is unsigned char.  No need to flip.  */
+  fre_info = *(unsigned char*)fp;
+  offset_size = sframe_fre_get_offset_size (fre_info);
+  offset_cnt = sframe_fre_get_offset_count (fre_info);
+
+  /* Advance the buffer pointer to where the stack offsets are.  */
+  fre_info_size = sizeof (unsigned char);
+  fp += fre_info_size;
+  flip_fre_stack_offsets (fp, offset_size, offset_cnt);
+
+  *fre_size
+    = addr_size + fre_info_size + sframe_fre_offset_bytes_size (fre_info);
+
+  return 0;
+}
+
+/* Endian flip the contents of FRAME_BUF of size BUF_SIZE.
+   The SFrame header in the FRAME_BUF must be endian flipped prior to
+   calling flip_sframe.
+
+   Endian flipping at decode time vs encode time have different needs.  At
+   encode time, the frame_buf is in host endianness, and hence, values should
+   be read up before the buffer is changed to foreign endianness.  This change
+   of behaviour is specified via TO_FOREIGN arg.
+
+   If an error code is returned, the buffer should not be used.  */
+
+static int
+flip_sframe (char *frame_buf, size_t buf_size, uint32_t to_foreign)
+{
+  unsigned int i, j, prev_frep_index;
+  sframe_header *ihp;
+  char *fdes;
+  char *fp = NULL;
+  sframe_func_desc_entry *fdep;
+  unsigned int num_fdes, num_fres;
+  unsigned int fre_type;
+  uint32_t fre_offset;
+  size_t esz;
+  int err = 0;
+
+  /* Header must be in host endianness at this time.  */
+  ihp = (sframe_header *)frame_buf;
+
+  if (!sframe_header_sanity_check_p (ihp))
+    return sframe_set_errno (&err, ESFRAME_BUF_INVAL);
+
+  /* The contents of the SFrame header are safe to read.  Get the number of
+     FDEs and the first FDE in the buffer.  */
+  num_fdes = ihp->sfh_num_fdes;
+  fdes = frame_buf + sframe_get_hdr_size (ihp) + ihp->sfh_fdeoff;
+  fdep = (sframe_func_desc_entry *)fdes;
+
+  j = 0;
+  prev_frep_index = 0;
+  for (i = 0; i < num_fdes; fdep++, i++)
+    {
+      if (to_foreign)
+	{
+	  num_fres = fdep->sfde_func_num_fres;
+	  fre_type = sframe_get_fre_type (fdep);
+	  fre_offset = fdep->sfde_func_start_fre_off;
+	}
+
+      flip_fde (fdep);
+
+      if (!to_foreign)
+	{
+	  num_fres = fdep->sfde_func_num_fres;
+	  fre_type = sframe_get_fre_type (fdep);
+	  fre_offset = fdep->sfde_func_start_fre_off;
+	}
+
+      fp = frame_buf + sframe_get_hdr_size (ihp) + ihp->sfh_freoff;
+      fp += fre_offset;
+      for (; j < prev_frep_index + num_fres; j++)
+	{
+	  if (flip_fre (fp, fre_type, &esz))
+	    goto bad;
+
+	  if (esz == 0)
+	    goto bad;
+	  fp += esz;
+	}
+      prev_frep_index = j;
+    }
+  /* All FREs must have been endian flipped by now.  */
+  if (j != ihp->sfh_num_fres)
+    goto bad;
+  /* Contents, if any, must have been processed by now.
+     Recall that .sframe section with just a SFrame header may be generated by
+     GAS if no SFrame FDEs were found for the input file.  */
+  if (ihp->sfh_num_fres && ((frame_buf + buf_size) != (void*)fp))
+    goto bad;
+
+  /* Success.  */
+  return 0;
+bad:
+  return SFRAME_ERR;
+}
+
+/* The SFrame Decoder.  */
+
+/* Get DECODER's SFrame header.  */
+
+static sframe_header *
+sframe_decoder_get_header (sframe_decoder_ctx *decoder)
+{
+  sframe_header *hp = NULL;
+  if (decoder != NULL)
+    hp = &decoder->sfd_header;
+  return hp;
+}
+
+/* Compare function for qsort'ing the FDE table.  */
+
+static int
+fde_func (const void *p1, const void *p2)
+{
+  const sframe_func_desc_entry *aa = p1;
+  const sframe_func_desc_entry *bb = p2;
+
+  if (aa->sfde_func_start_address < bb->sfde_func_start_address)
+    return -1;
+  else if (aa->sfde_func_start_address > bb->sfde_func_start_address)
+    return 1;
+  return 0;
+}
+
+/* Get IDX'th offset from FRE.  Set errp as applicable.  */
+
+static int32_t
+sframe_get_fre_offset (sframe_frame_row_entry *fre, int idx, int *errp)
+{
+  int offset_cnt, offset_size;
+
+  if (fre == NULL || !sframe_fre_sanity_check_p (fre))
+    return sframe_set_errno (errp, ESFRAME_FRE_INVAL);
+
+  offset_cnt = sframe_fre_get_offset_count (fre->fre_info);
+  offset_size = sframe_fre_get_offset_size (fre->fre_info);
+
+  if (offset_cnt < idx + 1)
+    return sframe_set_errno (errp, ESFRAME_FREOFFSET_NOPRESENT);
+
+  if (errp)
+    *errp = 0; /* Offset Valid.  */
+
+  if (offset_size == SFRAME_FRE_OFFSET_1B)
+    {
+      int8_t *sp = (int8_t *)fre->fre_offsets;
+      return sp[idx];
+    }
+  else if (offset_size == SFRAME_FRE_OFFSET_2B)
+    {
+      int16_t *sp = (int16_t *)fre->fre_offsets;
+      return sp[idx];
+    }
+  else
+    {
+      int32_t *ip = (int32_t *)fre->fre_offsets;
+      return ip[idx];
+    }
+}
+
+/* Free the decoder context.  */
+
+void
+sframe_decoder_free (sframe_decoder_ctx **decoder)
+{
+  if (decoder != NULL)
+    {
+      sframe_decoder_ctx *dctx = *decoder;
+      if (dctx == NULL)
+	return;
+
+      if (dctx->sfd_funcdesc != NULL)
+	{
+	  free (dctx->sfd_funcdesc);
+	  dctx->sfd_funcdesc = NULL;
+	}
+      if (dctx->sfd_fres != NULL)
+	{
+	  free (dctx->sfd_fres);
+	  dctx->sfd_fres = NULL;
+	}
+
+      free (*decoder);
+      *decoder = NULL;
+    }
+}
+
+/* Create a FDE function info byte given an FRE_TYPE and an FDE_TYPE.  */
+/* FIXME API for linker.  Revisit if its better placed somewhere else?  */
+
+unsigned char
+sframe_fde_func_info (unsigned int fre_type,
+		      unsigned int fde_type)
+{
+  unsigned char func_info;
+  sframe_assert (fre_type == SFRAME_FRE_TYPE_ADDR1
+		   || fre_type == SFRAME_FRE_TYPE_ADDR2
+		   || fre_type == SFRAME_FRE_TYPE_ADDR4);
+  sframe_assert (fde_type == SFRAME_FDE_TYPE_PCINC
+		    || fde_type == SFRAME_FDE_TYPE_PCMASK);
+  func_info = SFRAME_V1_FUNC_INFO (fde_type, fre_type);
+  return func_info;
+}
+
+/* Get the FRE type given the function size.  */
+/* FIXME API for linker.  Revisit if its better placed somewhere else?  */
+
+unsigned int
+sframe_calc_fre_type (unsigned int func_size)
+{
+  unsigned int fre_type = 0;
+  if (func_size <= 0xff)
+    fre_type = SFRAME_FRE_TYPE_ADDR1;
+  else if (func_size <= 0xffff)
+    fre_type = SFRAME_FRE_TYPE_ADDR2;
+  else if (func_size <= 0xffffffff)
+    fre_type = SFRAME_FRE_TYPE_ADDR4;
+  return fre_type;
+}
+
+/* Get the base reg id from the FRE info.  Set errp if failure.  */
+
+unsigned int
+sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre, int *errp)
+{
+  if (fre == NULL)
+    return sframe_set_errno (errp, ESFRAME_FRE_INVAL);
+
+  unsigned int fre_info = fre->fre_info;
+  return SFRAME_V1_FRE_CFA_BASE_REG_ID (fre_info);
+}
+
+/* Get the CFA offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+sframe_fre_get_cfa_offset (sframe_decoder_ctx *dctx ATTRIBUTE_UNUSED,
+			   sframe_frame_row_entry *fre, int *errp)
+{
+  return sframe_get_fre_offset (fre, SFRAME_FRE_CFA_OFFSET_IDX, errp);
+}
+
+/* Get the FP offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,
+			  sframe_frame_row_entry *fre, int *errp)
+{
+  uint32_t fp_offset_idx = 0;
+  sframe_header *dhp = sframe_decoder_get_header (dctx);
+  /* If the FP offset is not being tracked, return an error code so the caller
+     can gather the fixed FP offset from the SFrame header.  */
+  if (dhp->sfh_cfa_fixed_fp_offset != SFRAME_CFA_FIXED_FP_INVALID)
+    return sframe_set_errno (errp, ESFRAME_FREOFFSET_NOPRESENT);
+
+  /* In some ABIs, the stack offset to recover RA (using the CFA) from is
+     fixed (like AMD64).  In such cases, the stack offset to recover FP will
+     appear at the second index.  */
+  fp_offset_idx = ((dhp->sfh_cfa_fixed_ra_offset != SFRAME_CFA_FIXED_RA_INVALID)
+		   ? SFRAME_FRE_RA_OFFSET_IDX
+		   : SFRAME_FRE_FP_OFFSET_IDX);
+  return sframe_get_fre_offset (fre, fp_offset_idx, errp);
+}
+
+/* Get the RA offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+sframe_fre_get_ra_offset (sframe_decoder_ctx *dctx,
+			  sframe_frame_row_entry *fre, int *errp)
+{
+  sframe_header *dhp = sframe_decoder_get_header (dctx);
+  /* If the RA offset was not being tracked, return an error code so the caller
+     can gather the fixed RA offset from the SFrame header.  */
+  if (dhp->sfh_cfa_fixed_ra_offset != SFRAME_CFA_FIXED_RA_INVALID)
+    return sframe_set_errno (errp, ESFRAME_FREOFFSET_NOPRESENT);
+
+  /* Otherwise, get the RA offset from the FRE.  */
+  return sframe_get_fre_offset (fre, SFRAME_FRE_RA_OFFSET_IDX, errp);
+}
+
+static int
+sframe_frame_row_entry_copy (sframe_frame_row_entry *dst, sframe_frame_row_entry *src)
+{
+  int err = 0;
+
+  if (dst == NULL || src == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  memcpy (dst, src, sizeof (sframe_frame_row_entry));
+  return 0;
+}
+
+static int
+sframe_decode_fre_start_address (const char *fre_buf,
+				 uint32_t *fre_start_addr,
+				 unsigned int fre_type)
+{
+  uint32_t saddr = 0;
+  int err = 0;
+
+  if (fre_type == SFRAME_FRE_TYPE_ADDR1)
+    {
+      uint8_t *uc = (uint8_t *)fre_buf;
+      saddr = (uint32_t)*uc;
+    }
+  else if (fre_type == SFRAME_FRE_TYPE_ADDR2)
+    {
+      uint16_t *ust = (uint16_t *)fre_buf;
+      saddr = (uint32_t)*ust;
+    }
+  else if (fre_type == SFRAME_FRE_TYPE_ADDR4)
+    {
+      uint32_t *uit = (uint32_t *)fre_buf;
+      saddr = (uint32_t)*uit;
+    }
+  else
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  *fre_start_addr = saddr;
+  return 0;
+}
+
+/* Decode a frame row entry FRE which starts at location FRE_BUF.  The function
+   updates ESZ to the size of the FRE as stored in the binary format.
+
+   This function works closely with the SFrame binary format.
+
+   Returns SFRAME_ERR if failure.  */
+
+static int
+sframe_decode_fre (const char *fre_buf, sframe_frame_row_entry *fre,
+		   unsigned int fre_type,
+		   size_t *esz)
+{
+  int err = 0;
+  void *stack_offsets = NULL;
+  size_t stack_offsets_sz;
+  size_t addr_size;
+  size_t fre_size;
+
+  if (fre_buf == NULL || fre == NULL || esz == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  /* Copy over the FRE start address.  */
+  sframe_decode_fre_start_address (fre_buf, &fre->fre_start_addr, fre_type);
+
+  addr_size = sframe_fre_start_addr_size (fre_type);
+  fre->fre_info = *(unsigned char *)(fre_buf + addr_size);
+  /* Sanity check as the API works closely with the binary format.  */
+  sframe_assert (sizeof (fre->fre_info) == sizeof (unsigned char));
+
+  /* Cleanup the space for fre_offsets first, then copy over the valid
+     bytes.  */
+  memset (fre->fre_offsets, 0, MAX_OFFSET_BYTES);
+  /* Get offsets size.  */
+  stack_offsets_sz = sframe_fre_offset_bytes_size (fre->fre_info);
+  stack_offsets = (unsigned char *)fre_buf + addr_size + sizeof (fre->fre_info);
+  memcpy (fre->fre_offsets, stack_offsets, stack_offsets_sz);
+
+  /* The FRE has been decoded.  Use it to perform one last sanity check.  */
+  fre_size = sframe_fre_entry_size (fre, fre_type);
+  sframe_assert (fre_size == (addr_size + sizeof (fre->fre_info)
+				 + stack_offsets_sz));
+  *esz = fre_size;
+
+  return 0;
+}
+
+/* Decode the specified SFrame buffer CF_BUF of size CF_SIZE and return the
+   new SFrame decoder context.
+
+   Sets ERRP for the caller if any error.  Frees up the allocated memory in
+   case of error.  */
+
+sframe_decoder_ctx *
+sframe_decode (const char *sf_buf, size_t sf_size, int *errp)
+{
+  const sframe_preamble *sfp;
+  size_t hdrsz;
+  sframe_header *sfheaderp;
+  sframe_decoder_ctx *dctx;
+  char *frame_buf;
+  char *tempbuf = NULL;
+
+  int fidx_size;
+  uint32_t fre_bytes;
+  int foreign_endian = 0;
+
+  sframe_init_debug ();
+
+  if ((sf_buf == NULL) || (!sf_size))
+    return sframe_ret_set_errno (errp, ESFRAME_INVAL);
+  else if (sf_size < sizeof (sframe_header))
+    return sframe_ret_set_errno (errp, ESFRAME_BUF_INVAL);
+
+  sfp = (const sframe_preamble *) sf_buf;
+
+  debug_printf ("sframe_decode: magic=0x%x version=%u flags=%u\n",
+		sfp->sfp_magic, sfp->sfp_version, sfp->sfp_flags);
+
+  /* Check for foreign endianness.  */
+  if (sfp->sfp_magic != SFRAME_MAGIC)
+    {
+      if (sfp->sfp_magic == bswap_16 (SFRAME_MAGIC))
+	foreign_endian = 1;
+      else
+	return sframe_ret_set_errno (errp, ESFRAME_BUF_INVAL);
+    }
+
+  /* Initialize a new decoder context.  */
+  if ((dctx = malloc (sizeof (sframe_decoder_ctx))) == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+  memset (dctx, 0, sizeof (sframe_decoder_ctx));
+
+  if (foreign_endian)
+    {
+      /* Allocate a new buffer and initialize it.  */
+      tempbuf = (char *) malloc (sf_size * sizeof (char));
+      if (tempbuf == NULL)
+	return sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+      memcpy (tempbuf, sf_buf, sf_size);
+
+      /* Flip the header.  */
+      sframe_header *ihp = (sframe_header *) tempbuf;
+      flip_header (ihp);
+      /* Flip the rest of the SFrame section data buffer.  */
+      if (flip_sframe (tempbuf, sf_size, 0))
+	{
+	  free (tempbuf);
+	  return sframe_ret_set_errno (errp, ESFRAME_BUF_INVAL);
+	}
+      frame_buf = tempbuf;
+    }
+  else
+    frame_buf = (char *)sf_buf;
+
+  /* Handle the SFrame header.  */
+  dctx->sfd_header = *(sframe_header *) frame_buf;
+  /* Validate the contents of SFrame header.  */
+  sfheaderp = &dctx->sfd_header;
+  if (!sframe_header_sanity_check_p (sfheaderp))
+    {
+      sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  hdrsz = sframe_get_hdr_size (sfheaderp);
+  frame_buf += hdrsz;
+
+  /* Handle the SFrame Function Descriptor Entry section.  */
+  fidx_size
+    = sfheaderp->sfh_num_fdes * sizeof (sframe_func_desc_entry);
+  dctx->sfd_funcdesc = malloc (fidx_size);
+  if (dctx->sfd_funcdesc == NULL)
+    {
+      sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  memcpy (dctx->sfd_funcdesc, frame_buf, fidx_size);
+
+  debug_printf ("%u total fidx size\n", fidx_size);
+
+  frame_buf += (fidx_size);
+
+  /* Handle the SFrame Frame Row Entry section.  */
+  dctx->sfd_fres = malloc (sfheaderp->sfh_fre_len);
+  if (dctx->sfd_fres == NULL)
+    {
+      sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  memcpy (dctx->sfd_fres, frame_buf, sfheaderp->sfh_fre_len);
+
+  fre_bytes = sfheaderp->sfh_fre_len;
+  dctx->sfd_fre_nbytes = fre_bytes;
+
+  debug_printf ("%u total fre bytes\n", fre_bytes);
+
+  return dctx;
+
+decode_fail_free:
+  if (foreign_endian && tempbuf != NULL)
+    free (tempbuf);
+  sframe_decoder_free (&dctx);
+  dctx = NULL;
+  return dctx;
+}
+
+/* Get the size of the SFrame header from the decoder context CTX.  */
+
+unsigned int
+sframe_decoder_get_hdr_size (sframe_decoder_ctx *ctx)
+{
+  sframe_header *dhp;
+  dhp = sframe_decoder_get_header (ctx);
+  return sframe_get_hdr_size (dhp);
+}
+
+/* Get the SFrame's abi/arch info given the decoder context CTX.  */
+
+unsigned char
+sframe_decoder_get_abi_arch (sframe_decoder_ctx *ctx)
+{
+  sframe_header *sframe_header;
+  sframe_header = sframe_decoder_get_header (ctx);
+  return sframe_header->sfh_abi_arch;
+}
+
+/* Get the SFrame's fixed FP offset given the decoder context CTX.  */
+int8_t
+sframe_decoder_get_fixed_fp_offset (sframe_decoder_ctx *ctx)
+{
+  sframe_header *dhp;
+  dhp = sframe_decoder_get_header (ctx);
+  return dhp->sfh_cfa_fixed_fp_offset;
+}
+
+/* Get the SFrame's fixed RA offset given the decoder context CTX.  */
+int8_t
+sframe_decoder_get_fixed_ra_offset (sframe_decoder_ctx *ctx)
+{
+  sframe_header *dhp;
+  dhp = sframe_decoder_get_header (ctx);
+  return dhp->sfh_cfa_fixed_ra_offset;
+}
+
+/* Find the function descriptor entry starting which contains the specified
+   address ADDR.  */
+
+sframe_func_desc_entry *
+sframe_get_funcdesc_with_addr (sframe_decoder_ctx *ctx,
+			       int32_t addr, int *errp)
+{
+  sframe_header *dhp;
+  sframe_func_desc_entry *fdp;
+  int low, high, cnt;
+
+  if (ctx == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_INVAL);
+
+  dhp = sframe_decoder_get_header (ctx);
+
+  if (dhp == NULL || dhp->sfh_num_fdes == 0 || ctx->sfd_funcdesc == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_DCTX_INVAL);
+  /* If the FDE sub-section is not sorted on PCs, skip the lookup because
+     binary search cannot be used.  */
+  if ((dhp->sfh_preamble.sfp_flags & SFRAME_F_FDE_SORTED) == 0)
+    return sframe_ret_set_errno (errp, ESFRAME_FDE_NOTSORTED);
+
+  /* Do the binary search.  */
+  fdp = (sframe_func_desc_entry *) ctx->sfd_funcdesc;
+  low = 0;
+  high = dhp->sfh_num_fdes;
+  cnt = high;
+  while (low <= high)
+    {
+      int mid = low + (high - low) / 2;
+
+      if (fdp[mid].sfde_func_start_address == addr)
+	return fdp + mid;
+
+      if (fdp[mid].sfde_func_start_address < addr)
+	{
+	  if (mid == (cnt - 1)) 	/* Check if it's the last one.  */
+	    return fdp + (cnt - 1) ;
+	  else if (fdp[mid+1].sfde_func_start_address > addr)
+	    return fdp + mid;
+	  low = mid + 1;
+	}
+      else
+	high = mid - 1;
+    }
+
+  return sframe_ret_set_errno (errp, ESFRAME_FDE_NOTFOUND);
+}
+
+/* Find the SFrame Row Entry which contains the PC.  Returns
+   SFRAME_ERR if failure.  */
+
+int
+sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc,
+		 sframe_frame_row_entry *frep)
+{
+  sframe_func_desc_entry *fdep;
+  uint32_t start_address, i;
+  sframe_frame_row_entry cur_fre, next_fre;
+  unsigned char *sp;
+  unsigned int fre_type, fde_type;
+  size_t esz;
+  int err = 0;
+  size_t size = 0;
+  /* For regular FDEs (i.e. fde_type SFRAME_FDE_TYPE_PCINC),
+     where the start address in the FRE is an offset from start pc,
+     use a bitmask with all bits set so that none of the address bits are
+     ignored.  In this case, we need to return the FRE where
+     (PC >= FRE_START_ADDR) */
+  uint64_t bitmask = 0xffffffff;
+
+  if ((ctx == NULL) || (frep == NULL))
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  /* Find the FDE which contains the PC, then scan its fre entries.  */
+  fdep = sframe_get_funcdesc_with_addr (ctx, pc, &err);
+  if (fdep == NULL || ctx->sfd_fres == NULL)
+    return sframe_set_errno (&err, ESFRAME_DCTX_INVAL);
+
+  fre_type = sframe_get_fre_type (fdep);
+  fde_type = sframe_get_fde_type (fdep);
+
+  /* For FDEs for repetitive pattern of insns, we need to return the FRE
+     such that (PC & FRE_START_ADDR_AS_MASK >= FRE_START_ADDR_AS_MASK).
+     so, update the bitmask to the start address.  */
+  /* FIXME - the bitmask should be picked per ABI or encoded in the format
+     somehow. For AMD64, the pltN entry stub is 16 bytes. */
+  if (fde_type == SFRAME_FDE_TYPE_PCMASK)
+    bitmask = 0xff;
+
+  sp = (unsigned char *) ctx->sfd_fres + fdep->sfde_func_start_fre_off;
+  for (i = 0; i < fdep->sfde_func_num_fres; i++)
+   {
+     err = sframe_decode_fre ((const char *)sp, &next_fre,
+				 fre_type, &esz);
+     start_address = next_fre.fre_start_addr;
+
+     if (((fdep->sfde_func_start_address
+	   + (int32_t) start_address) & bitmask) <= (pc & bitmask))
+       {
+	 sframe_frame_row_entry_copy (&cur_fre, &next_fre);
+
+	 /* Get the next FRE in sequence.  */
+	 if (i < fdep->sfde_func_num_fres - 1)
+	   {
+	     sp += esz;
+	     err = sframe_decode_fre ((const char*)sp, &next_fre,
+					 fre_type, &esz);
+
+	     /* Sanity check the next FRE.  */
+	     if (!sframe_fre_sanity_check_p (&next_fre))
+	       return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+
+	     size = next_fre.fre_start_addr;
+	   }
+	 else size = fdep->sfde_func_size;
+
+	 /* If the cur FRE is the one that contains the PC, return it.  */
+	 if (((fdep->sfde_func_start_address
+	       + (int32_t)size) & bitmask) > (pc & bitmask))
+	   {
+	     sframe_frame_row_entry_copy (frep, &cur_fre);
+	     return 0;
+	   }
+       }
+     else
+       return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+   }
+  return sframe_set_errno (&err, ESFRAME_FDE_INVAL);
+}
+
+/* Return the number of function descriptor entries in the SFrame decoder
+   DCTX.  */
+
+unsigned int
+sframe_decoder_get_num_fidx (sframe_decoder_ctx *ctx)
+{
+  unsigned int num_fdes = 0;
+  sframe_header *dhp = NULL;
+  dhp = sframe_decoder_get_header (ctx);
+  if (dhp)
+    num_fdes = dhp->sfh_num_fdes;
+  return num_fdes;
+}
+
+/* Get the data (NUM_FRES, FUNC_START_ADDRESS) from the function
+   descriptor entry at index I'th in the decoder CTX.  If failed,
+   return error code.  */
+/* FIXME - consolidate the args and return a
+   sframe_func_desc_index_elem rather?  */
+
+int
+sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
+			     unsigned int i,
+			     uint32_t *num_fres,
+			     uint32_t *func_size,
+			     int32_t *func_start_address,
+			     unsigned char *func_info)
+{
+  sframe_func_desc_entry *fdp;
+  unsigned int num_fdes;
+  int err = 0;
+
+  if (ctx == NULL || func_start_address == NULL || num_fres == NULL
+      || func_size == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  num_fdes = sframe_decoder_get_num_fidx (ctx);
+  if (num_fdes == 0
+      || i >= num_fdes
+      || ctx->sfd_funcdesc == NULL)
+    return sframe_set_errno (&err, ESFRAME_DCTX_INVAL);
+
+  fdp = (sframe_func_desc_entry *) ctx->sfd_funcdesc + i;
+  *num_fres = fdp->sfde_func_num_fres;
+  *func_start_address = fdp->sfde_func_start_address;
+  *func_size = fdp->sfde_func_size;
+  *func_info = fdp->sfde_func_info;
+
+  return 0;
+}
+
+/* Get the function descriptor entry at index FUNC_IDX in the decoder
+   context CTX.  */
+
+static sframe_func_desc_entry *
+sframe_decoder_get_funcdesc_at_index (sframe_decoder_ctx *ctx,
+					 uint32_t func_idx)
+{
+  /* Invalid argument.  No FDE will be found.  */
+  if (func_idx >= sframe_decoder_get_num_fidx (ctx))
+    return NULL;
+
+  sframe_func_desc_entry *fdep;
+  fdep = (sframe_func_desc_entry *) ctx->sfd_funcdesc;
+  return fdep + func_idx;
+}
+
+/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
+   descriptor entry in the SFrame decoder CTX.  Returns error code as
+   applicable.  */
+
+int
+sframe_decoder_get_fre (sframe_decoder_ctx *ctx,
+			   unsigned int func_idx,
+			   unsigned int fre_idx,
+			   sframe_frame_row_entry *fre)
+{
+  sframe_func_desc_entry *fdep;
+  sframe_frame_row_entry ifre;
+  unsigned char *sp;
+  uint32_t i;
+  unsigned int fre_type;
+  size_t esz = 0;
+  int err = 0;
+
+  if (ctx == NULL || fre == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  /* Get function descriptor entry at index func_idx.  */
+  fdep = sframe_decoder_get_funcdesc_at_index (ctx, func_idx);
+
+  if (fdep == NULL)
+    return sframe_set_errno (&err, ESFRAME_FDE_NOTFOUND);
+
+  fre_type = sframe_get_fre_type (fdep);
+  /* Now scan the FRE entries.  */
+  sp = (unsigned char *) ctx->sfd_fres + fdep->sfde_func_start_fre_off;
+  for (i = 0; i < fdep->sfde_func_num_fres; i++)
+   {
+     /* Decode the FRE at the current position.  Return it if valid.  */
+     err = sframe_decode_fre ((const char *)sp, &ifre, fre_type, &esz);
+     if (i == fre_idx)
+       {
+	 if (!sframe_fre_sanity_check_p (&ifre))
+	   return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+
+	 sframe_frame_row_entry_copy (fre, &ifre);
+
+	 if (fdep->sfde_func_size)
+	   sframe_assert (fre->fre_start_addr < fdep->sfde_func_size);
+	 else
+	   /* A SFrame FDE with func size equal to zero is possible.  */
+	   sframe_assert (fre->fre_start_addr == fdep->sfde_func_size);
+
+	 return 0;
+       }
+     /* Next FRE.  */
+     sp += esz;
+   }
+
+  return sframe_set_errno (&err, ESFRAME_FDE_NOTFOUND);
+}
+
+
+/* SFrame Encoder.  */
+
+/* Get a reference to the ENCODER's SFrame header.  */
+
+static sframe_header *
+sframe_encoder_get_header (sframe_encoder_ctx *encoder)
+{
+  sframe_header *hp = NULL;
+  if (encoder)
+    hp = &encoder->sfe_header;
+  return hp;
+}
+
+static sframe_func_desc_entry *
+sframe_encoder_get_funcdesc_at_index (sframe_encoder_ctx *encoder,
+					 uint32_t func_idx)
+{
+  sframe_func_desc_entry *fde = NULL;
+  if (func_idx < sframe_encoder_get_num_fidx (encoder))
+    {
+      sf_funidx_tbl *func_tbl = (sf_funidx_tbl *) encoder->sfe_funcdesc;
+      fde = func_tbl->entry + func_idx;
+    }
+  return fde;
+}
+
+/* Create an encoder context with the given SFrame format version VER, FLAGS
+   and ABI information.  Sets errp if failure.  */
+
+sframe_encoder_ctx *
+sframe_encode (unsigned char ver, unsigned char flags, int abi_arch,
+	       int8_t fixed_fp_offset, int8_t fixed_ra_offset, int *errp)
+{
+  sframe_header *hp;
+  sframe_encoder_ctx *fp;
+
+  if (ver != SFRAME_VERSION)
+    return sframe_ret_set_errno (errp, ESFRAME_VERSION_INVAL);
+
+  if ((fp = malloc (sizeof (sframe_encoder_ctx))) == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+
+  memset (fp, 0, sizeof (sframe_encoder_ctx));
+
+  /* Get the SFrame header and update it.  */
+  hp = sframe_encoder_get_header (fp);
+  hp->sfh_preamble.sfp_version = ver;
+  hp->sfh_preamble.sfp_magic = SFRAME_MAGIC;
+  hp->sfh_preamble.sfp_flags = flags;
+
+  hp->sfh_abi_arch = abi_arch;
+  hp->sfh_cfa_fixed_fp_offset = fixed_fp_offset;
+  hp->sfh_cfa_fixed_ra_offset = fixed_ra_offset;
+
+  return fp;
+}
+
+/* Free the encoder context.  */
+
+void
+sframe_free_encoder (sframe_encoder_ctx *encoder)
+{
+  if (encoder != NULL)
+    {
+      free (encoder->sfe_funcdesc);
+      free (encoder->sfe_fres);
+      free (encoder->sfe_data);
+      free (encoder);
+    }
+}
+
+/* Get the size of the SFrame header from the encoder ctx ENCODER.  */
+
+unsigned int
+sframe_encoder_get_hdr_size (sframe_encoder_ctx *encoder)
+{
+  sframe_header *ehp;
+  ehp = sframe_encoder_get_header (encoder);
+  return sframe_get_hdr_size (ehp);
+}
+
+/* Get the abi/arch info from the SFrame encoder context ENCODER.  */
+
+unsigned char
+sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder)
+{
+  unsigned char abi_arch = 0;
+  sframe_header *ehp;
+  ehp = sframe_encoder_get_header (encoder);
+  if (ehp)
+    abi_arch = ehp->sfh_abi_arch;
+  return abi_arch;
+}
+
+/* Return the number of function descriptor entries in the SFrame encoder
+   ENCODER.  */
+
+unsigned int
+sframe_encoder_get_num_fidx (sframe_encoder_ctx *encoder)
+{
+  unsigned int num_fdes = 0;
+  sframe_header *ehp = NULL;
+  ehp = sframe_encoder_get_header (encoder);
+  if (ehp)
+    num_fdes = ehp->sfh_num_fdes;
+  return num_fdes;
+}
+
+/* Add an FRE to function at FUNC_IDX'th function descriptor entry in
+   the encoder context.  */
+
+int
+sframe_encoder_add_fre (sframe_encoder_ctx *encoder,
+			   unsigned int func_idx,
+			   sframe_frame_row_entry *frep)
+{
+  sframe_header *ehp;
+  sframe_func_desc_entry *fdep;
+  sframe_frame_row_entry *ectx_frep;
+  size_t offsets_sz, esz;
+  unsigned int fre_type;
+  size_t fre_tbl_sz;
+  int err = 0;
+
+  if (encoder == NULL || frep == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+  if (!sframe_fre_sanity_check_p (frep))
+    return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+
+  /* Use func_idx to gather the function descriptor entry.  */
+  fdep = sframe_encoder_get_funcdesc_at_index (encoder, func_idx);
+
+  if (fdep == NULL)
+    return sframe_set_errno (&err, ESFRAME_FDE_NOTFOUND);
+
+  fre_type = sframe_get_fre_type (fdep);
+  sf_fre_tbl *fre_tbl = (sf_fre_tbl *) encoder->sfe_fres;
+
+  if (fre_tbl == NULL)
+    {
+      fre_tbl_sz = (sizeof (sf_fre_tbl)
+		    + (number_of_entries * sizeof (sframe_frame_row_entry)));
+      fre_tbl = malloc (fre_tbl_sz);
+
+      if (fre_tbl == NULL)
+	{
+	  sframe_set_errno (&err, ESFRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+      memset (fre_tbl, 0, fre_tbl_sz);
+      fre_tbl->alloced = number_of_entries;
+    }
+  else if (fre_tbl->count == fre_tbl->alloced)
+    {
+      fre_tbl_sz = (sizeof (sf_fre_tbl)
+		    + ((fre_tbl->alloced + number_of_entries)
+		       * sizeof (sframe_frame_row_entry)));
+      fre_tbl = realloc (fre_tbl, fre_tbl_sz);
+      if (fre_tbl == NULL)
+	{
+	  sframe_set_errno (&err, ESFRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+
+      memset (&fre_tbl->entry[fre_tbl->alloced], 0,
+	      number_of_entries * sizeof (sframe_frame_row_entry));
+      fre_tbl->alloced += number_of_entries;
+    }
+
+  ectx_frep = &fre_tbl->entry[fre_tbl->count];
+  ectx_frep->fre_start_addr
+    = frep->fre_start_addr;
+  ectx_frep->fre_info = frep->fre_info;
+
+  if (fdep->sfde_func_size)
+    sframe_assert (frep->fre_start_addr < fdep->sfde_func_size);
+  else
+    /* A SFrame FDE with func size equal to zero is possible.  */
+    sframe_assert (frep->fre_start_addr == fdep->sfde_func_size);
+
+  /* frep has already been sanity check'd.  Get offsets size.  */
+  offsets_sz = sframe_fre_offset_bytes_size (frep->fre_info);
+  memcpy (&ectx_frep->fre_offsets, &frep->fre_offsets, offsets_sz);
+
+  esz = sframe_fre_entry_size (frep, fre_type);
+  fre_tbl->count++;
+
+  encoder->sfe_fres = (void *) fre_tbl;
+  encoder->sfe_fre_nbytes += esz;
+
+  ehp = sframe_encoder_get_header (encoder);
+  ehp->sfh_num_fres = fre_tbl->count;
+
+  /* Update the value of the number of FREs for the function.  */
+  fdep->sfde_func_num_fres++;
+
+  return 0;
+
+bad:
+  if (fre_tbl != NULL)
+    free (fre_tbl);
+  encoder->sfe_fres = NULL;
+  encoder->sfe_fre_nbytes = 0;
+  return -1;
+}
+
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE and NUM_FRES
+   to the encoder.  */
+
+int
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
+			      int32_t start_addr,
+			      uint32_t func_size,
+			      unsigned char func_info,
+			      uint32_t num_fres __attribute__ ((unused)))
+{
+  sframe_header *ehp;
+  sf_funidx_tbl *fd_info;
+  size_t fd_tbl_sz;
+  int err = 0;
+
+  /* FIXME book-keep num_fres for error checking.  */
+  if (encoder == NULL)
+    return sframe_set_errno (&err, ESFRAME_INVAL);
+
+  fd_info = (sf_funidx_tbl *) encoder->sfe_funcdesc;
+  ehp = sframe_encoder_get_header (encoder);
+
+  if (fd_info == NULL)
+    {
+      fd_tbl_sz = (sizeof (sf_funidx_tbl)
+		   + (number_of_entries * sizeof (sframe_func_desc_entry)));
+      fd_info = malloc (fd_tbl_sz);
+      if (fd_info == NULL)
+	{
+	  sframe_set_errno (&err, ESFRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+      memset (fd_info, 0, fd_tbl_sz);
+      fd_info->alloced = number_of_entries;
+    }
+  else if (fd_info->count == fd_info->alloced)
+    {
+      fd_tbl_sz = (sizeof (sf_funidx_tbl)
+		   + ((fd_info->alloced + number_of_entries)
+		      * sizeof (sframe_func_desc_entry)));
+      fd_info = realloc (fd_info, fd_tbl_sz);
+      if (fd_info == NULL)
+	{
+	  sframe_set_errno (&err, ESFRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+
+      memset (&fd_info->entry[fd_info->alloced], 0,
+	      number_of_entries * sizeof (sframe_func_desc_entry));
+      fd_info->alloced += number_of_entries;
+    }
+
+  fd_info->entry[fd_info->count].sfde_func_start_address = start_addr;
+  /* Num FREs is updated as FREs are added for the function later via
+     sframe_encoder_add_fre.  */
+  fd_info->entry[fd_info->count].sfde_func_size = func_size;
+  fd_info->entry[fd_info->count].sfde_func_start_fre_off
+    = encoder->sfe_fre_nbytes;
+#if 0
+  // Linker optimization test code cleanup later ibhagat TODO FIXME
+  unsigned int fre_type = sframe_calc_fre_type (func_size);
+
+  fd_info->entry[fd_info->count].sfde_func_info
+    = sframe_fde_func_info (fre_type);
+#endif
+  fd_info->entry[fd_info->count].sfde_func_info = func_info;
+  fd_info->count++;
+  encoder->sfe_funcdesc = (void *) fd_info;
+  ehp->sfh_num_fdes++;
+  return 0;
+
+bad:
+  if (fd_info != NULL)
+    free (fd_info);
+  encoder->sfe_funcdesc = NULL;
+  ehp->sfh_num_fdes = 0;
+  return -1;
+}
+
+static int
+sframe_sort_funcdesc (sframe_encoder_ctx *encoder)
+{
+  sframe_header *ehp;
+
+  ehp = sframe_encoder_get_header (encoder);
+  /* Sort and write out the FDE table.  */
+  sf_funidx_tbl *fd_info = (sf_funidx_tbl *) encoder->sfe_funcdesc;
+  if (fd_info)
+    {
+      qsort (fd_info->entry, fd_info->count,
+	     sizeof (sframe_func_desc_entry), fde_func);
+      /* Update preamble's flags.  */
+      ehp->sfh_preamble.sfp_flags |= SFRAME_F_FDE_SORTED;
+    }
+  return 0;
+}
+
+/* Write a frame row entry pointed to by FREP into the buffer CONTENTS.  The
+   size in bytes written out are updated in ESZ.
+
+   This function works closely with the SFrame binary format.
+
+   Returns SFRAME_ERR if failure.  */
+
+static int
+sframe_encoder_write_fre (char *contents, sframe_frame_row_entry *frep,
+			  unsigned int fre_type, size_t *esz)
+{
+  size_t fre_size;
+  size_t fre_start_addr_sz;
+  size_t fre_stack_offsets_sz;
+  int err = 0;
+
+  if (!sframe_fre_sanity_check_p (frep))
+    return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+
+  fre_start_addr_sz = sframe_fre_start_addr_size (fre_type);
+  fre_stack_offsets_sz = sframe_fre_offset_bytes_size (frep->fre_info);
+
+  /* The FRE start address must be encodable in the available number of
+     bytes.  */
+  uint64_t bitmask = SFRAME_BITMASK_OF_SIZE (fre_start_addr_sz);
+  sframe_assert ((uint64_t)frep->fre_start_addr <= bitmask);
+
+  memcpy (contents,
+	  &frep->fre_start_addr,
+	  fre_start_addr_sz);
+  contents += fre_start_addr_sz;
+
+  memcpy (contents,
+	  &frep->fre_info,
+	  sizeof (frep->fre_info));
+  contents += sizeof (frep->fre_info);
+
+  memcpy (contents,
+	  frep->fre_offsets,
+	  fre_stack_offsets_sz);
+  contents+= fre_stack_offsets_sz;
+
+  fre_size = sframe_fre_entry_size (frep, fre_type);
+  /* Sanity checking.  */
+  sframe_assert ((fre_start_addr_sz
+		     + sizeof (frep->fre_info)
+		     + fre_stack_offsets_sz) == fre_size);
+
+  *esz = fre_size;
+
+  return 0;
+}
+
+/* Serialize the core contents of the SFrame section and write out to the
+   output buffer held in the ENCODER.  Return SFRAME_ERR if failure.  */
+
+static int
+sframe_encoder_write_sframe (sframe_encoder_ctx *encoder)
+{
+  char *contents;
+  size_t buf_size;
+  size_t hdr_size;
+  size_t all_fdes_size;
+  size_t fre_size;
+  size_t esz = 0;
+  sframe_header *ehp;
+  unsigned char flags;
+  sf_funidx_tbl *fd_info;
+  sf_fre_tbl *fr_info;
+  uint32_t i, num_fdes;
+  uint32_t j, num_fres;
+  sframe_func_desc_entry *fdep;
+  sframe_frame_row_entry *frep;
+
+  unsigned int fre_type;
+  int err = 0;
+
+  contents = encoder->sfe_data;
+  buf_size = encoder->sfe_data_size;
+  num_fdes = sframe_encoder_get_num_fidx (encoder);
+  all_fdes_size = num_fdes * sizeof (sframe_func_desc_entry);
+  ehp = sframe_encoder_get_header (encoder);
+  hdr_size = sframe_get_hdr_size (ehp);
+
+  fd_info = (sf_funidx_tbl *) encoder->sfe_funcdesc;
+  fr_info = (sf_fre_tbl *) encoder->sfe_fres;
+
+  /* Sanity checks:
+     - buffers must be malloc'd by the caller.  */
+  if ((contents == NULL) || (buf_size < hdr_size))
+    return sframe_set_errno (&err, ESFRAME_BUF_INVAL);
+  if (fr_info == NULL)
+    return sframe_set_errno (&err, ESFRAME_FRE_INVAL);
+
+  /* Write out the FRE table first.
+
+     Recall that read/write of FREs needs information from the corresponding
+     FDE; the latter stores the information about the FRE type record used for
+     the function.  Also note that sorting of FDEs does NOT impact the order
+     in which FREs are stored in the SFrame's FRE sub-section.  This means
+     that writing out FREs after sorting of FDEs will need some additional
+     book-keeping.  At this time, we can afford to avoid it by writing out
+     the FREs first to the output buffer.  */
+  fre_size = 0;
+  uint32_t global = 0;
+  uint32_t fre_index = 0;
+
+  contents += hdr_size + all_fdes_size;
+  for (i = 0; i < num_fdes; i++)
+    {
+      fdep = &fd_info->entry[i];
+      fre_type = sframe_get_fre_type (fdep);
+      num_fres = fdep->sfde_func_num_fres;
+
+      for (j = 0; j < num_fres; j++)
+	{
+	  fre_index = global + j;
+	  frep = &fr_info->entry[fre_index];
+
+	  sframe_encoder_write_fre (contents, frep, fre_type, &esz);
+	  contents += esz;
+	  fre_size += esz; /* For debugging only.  */
+	}
+      global += j;
+    }
+
+  sframe_assert (fre_size == ehp->sfh_fre_len);
+  sframe_assert (global == ehp->sfh_num_fres);
+  sframe_assert ((size_t)(contents - encoder->sfe_data) == buf_size);
+
+  /* Sort the FDE table */
+  sframe_sort_funcdesc (encoder);
+
+  /* Sanity checks:
+     - the FDE section must have been sorted by now on the start address
+     of each function.  */
+  flags = ehp->sfh_preamble.sfp_flags;
+  if (!(flags & SFRAME_F_FDE_SORTED)
+      || (fd_info == NULL))
+    return sframe_set_errno (&err, ESFRAME_FDE_INVAL);
+
+  contents = encoder->sfe_data;
+  /* Write out the SFrame header.  The SFrame header in the encoder
+     object has already been updated with correct offsets by the caller.  */
+  memcpy (contents, ehp, hdr_size);
+  contents += hdr_size;
+
+  /* Write out the FDE table sorted on funtion start address.  */
+  memcpy (contents, fd_info->entry, all_fdes_size);
+  contents += all_fdes_size;
+
+  return 0;
+}
+
+/* Serialize the contents of the encoder and return the buffer.  ENCODED_SIZE
+   is updated to the size of the buffer.  */
+
+char *
+sframe_encoder_write (sframe_encoder_ctx *encoder,
+		      size_t *encoded_size, int *errp)
+{
+  sframe_header *ehp;
+  size_t hdrsize, fsz, fresz, bufsize;
+  int foreign_endian;
+
+  /* Initialize the encoded_size to zero.  This makes it simpler to just
+     return from the function in case of failure.  Free'ing up of
+     encoder->sfe_data is the responsibility of the caller.  */
+  *encoded_size = 0;
+
+  if (encoder == NULL || encoded_size == NULL || errp == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_INVAL);
+
+  ehp = sframe_encoder_get_header (encoder);
+  hdrsize = sframe_get_hdr_size (ehp);
+  fsz = sframe_encoder_get_num_fidx (encoder)
+    * sizeof (sframe_func_desc_entry);
+  fresz = encoder->sfe_fre_nbytes;
+
+  /* The total size of buffer is the sum of header, SFrame Function Descriptor
+     Entries section and the FRE section.  */
+  bufsize = hdrsize + fsz + fresz;
+  encoder->sfe_data = (char *) malloc (bufsize);
+  if (encoder->sfe_data == NULL)
+    return sframe_ret_set_errno (errp, ESFRAME_NOMEM);
+  encoder->sfe_data_size = bufsize;
+
+  /* Update the information in the SFrame header.  */
+  /* SFrame FDE section follows immediately after the header.  */
+  ehp->sfh_fdeoff = 0;
+  /* SFrame FRE section follows immediately after the SFrame FDE section.  */
+  ehp->sfh_freoff = fsz;
+  ehp->sfh_fre_len = fresz;
+
+  foreign_endian = need_swapping (ehp->sfh_abi_arch);
+
+  /* Write out the FDE Index and the FRE table in the sfe_data. */
+  if (sframe_encoder_write_sframe (encoder))
+    return sframe_ret_set_errno (errp, ESFRAME_BUF_INVAL);
+
+  /* Endian flip the contents if necessary.  */
+  if (foreign_endian)
+    {
+      if (flip_sframe (encoder->sfe_data, bufsize, 1))
+	return sframe_ret_set_errno (errp, ESFRAME_BUF_INVAL);
+      flip_header ((sframe_header*)encoder->sfe_data);
+    }
+
+  *encoded_size = bufsize;
+  return encoder->sfe_data;
+}
diff --git a/libsframe/testsuite/config/default.exp b/libsframe/testsuite/config/default.exp
new file mode 100644
index 00000000000..c45e25d3357
--- /dev/null
+++ b/libsframe/testsuite/config/default.exp
@@ -0,0 +1,54 @@
+# Basic expect script for libsframe decoder tests.
+#   Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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.
+#
+# Written by Jeffrey Wheat (cassidy@cygnus.com)
+#
+
+if ![info exists ld] then {
+    set ld [findfile $base_dir/../ld/ld-new $base_dir/../ld/ld-new [transform ld]]
+}
+
+if ![info exists as] then {
+    set as [findfile $base_dir/../gas/as-new $base_dir/../gas/as-new [transform as]]
+}
+
+remote_exec host "mkdir -p tmpdir"
+
+# Make symlinks from tmpdir/libsframe to the linker and assembler in the
+# build tree, so that we can use a -B option to gcc to force it to use
+# the newly built linker and assembler.
+if {![file isdirectory tmpdir/libsframe]} then {
+    catch "exec mkdir tmpdir/libsframe" status
+    catch "exec ln -s ../../../ld/ld-new tmpdir/libsframe/ld" status
+    catch "exec ln -s ld tmpdir/libsframe/collect-ld" status
+    catch "exec ln -s ../../../gas/as-new tmpdir/libsframe/as" status
+}
+set gcc_B_opt "-B[pwd]/tmpdir/libsframe/"
+set ld_L_opt ""
+
+if {![info exists CC]} {
+    set CC gcc
+}
+if {![info exists CFLAGS]} {
+    set CFLAGS "-g -O2"
+}
+if {![info exists CFLAGS_FOR_TARGET]} {
+    set CFLAGS_FOR_TARGET $CFLAGS
+}
diff --git a/libsframe/testsuite/libsframe.decode/DATA-BE b/libsframe/testsuite/libsframe.decode/DATA-BE
new file mode 100644
index 0000000000000000000000000000000000000000..3e19ff48e9c67f30645a9d8bdca0af834dd345f4
GIT binary patch
diff --git a/libsframe/testsuite/libsframe.decode/DATA1 b/libsframe/testsuite/libsframe.decode/DATA1
diff --git a/libsframe/testsuite/libsframe.decode/DATA2 b/libsframe/testsuite/libsframe.decode/DATA2
new file mode 100644
index 0000000000000000000000000000000000000000..68fc2d240cd34878747f552d1b12bbc0e59a5217
GIT binary patch
diff --git a/libsframe/testsuite/libsframe.decode/be-flipping.c b/libsframe/testsuite/libsframe.decode/be-flipping.c
--- /dev/null
+++ b/libsframe/testsuite/libsframe.decode/be-flipping.c
@@ -0,0 +1,115 @@
+/* be-flipping.c -- Test for handling different endianness in libsframe.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "sframe-api.h"
+
+/* DejaGnu should not use gnulib's vsnprintf replacement here.  */
+#undef vsnprintf
+#include <dejagnu.h>
+
+/* SFrame info from the following source (1 fde 5 fres):
+   static int cnt;
+   extern void foo (void);
+
+   int bar()
+   {
+     cnt++;
+     if (cnt == 3)
+       foo();
+    return (cnt);
+  }
+  gcc -mbig-endian -Wa,--gsframe -c -O3 t.c
+  objcopy --dump-section .sframe=DATA-BE t.o
+ */
+#define DATA	"DATA-BE"
+
+int
+main (void)
+{
+  sframe_decoder_ctx *dctx = NULL;
+  uint32_t nfres, fsize;
+  int32_t fstart;
+  unsigned char finfo;
+  int err = 0;
+  FILE *fp;
+  struct stat st;
+  char *sf_buf;
+  size_t sf_size;
+
+#define TEST(name, cond)                                                      \
+  do                                                                          \
+    {                                                                         \
+      if (cond)                                                               \
+	pass (name);                                                          \
+      else                                                                    \
+	fail (name);                                                          \
+    }                                                                         \
+    while (0)
+
+  /* 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;
+    }
+
+  /* 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 ("be-flipping: Decoder setup", dctx != NULL);
+
+  unsigned int fde_cnt = sframe_decoder_get_num_fidx (dctx);
+  TEST ("be-flipping: Decoder FDE count", fde_cnt == 1);
+
+  err = sframe_decoder_get_funcdesc (dctx, 0, &nfres, &fsize, &fstart, &finfo);
+  TEST ("be-flipping: Decoder get FDE", err == 0);
+  TEST ("be-flipping: Decoder FRE count", nfres == 5);
+      
+  sframe_decoder_free (&dctx);
+  return 0;
+
+setup_fail:
+  sframe_decoder_free (&dctx);
+  fail ("be-flipping: Test setup");
+  return 1;
+}
diff --git a/libsframe/testsuite/libsframe.decode/decode.exp b/libsframe/testsuite/libsframe.decode/decode.exp
new file mode 100644
index 00000000000..0d859949941
--- /dev/null
+++ b/libsframe/testsuite/libsframe.decode/decode.exp
@@ -0,0 +1,50 @@
+# Copyright (C) 2022 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 be-flipping
+    unsupported frecnt-1
+    unsupported frecnt-2
+    return;
+}
+
+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-BE ." status
+
+if { [host_execute "testsuite/libsframe.decode/be-flipping"] ne "" } {
+    fail "be-flipping"
+}
+
+if { [host_execute "testsuite/libsframe.decode/frecnt-1"] ne "" } {
+    fail "frecnt-1"
+}
+
+if { [host_execute "testsuite/libsframe.decode/frecnt-2"] ne "" } {
+    fail "frecnt-2"
+}
+
+catch "exec rm DATA1" status
+catch "exec rm DATA2" status
+catch "exec rm DATA-BE" status
diff --git a/libsframe/testsuite/libsframe.decode/frecnt-1.c b/libsframe/testsuite/libsframe.decode/frecnt-1.c
new file mode 100644
index 00000000000..49861ed4f5c
--- /dev/null
+++ b/libsframe/testsuite/libsframe.decode/frecnt-1.c
@@ -0,0 +1,99 @@
+/* frecnt-1.c -- Test for decoder in libsframe.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "sframe-api.h"
+
+/* DejaGnu should not use gnulib's vsnprintf replacement here.  */
+#undef vsnprintf
+#include <dejagnu.h>
+
+/*
+ * SFrame info from the following source (1 fde 4 fres):
+ * static int cnt;
+ * int main() { cnt++; return (cnt); }
+ */
+#define DATA	"DATA1"
+
+int
+main (void)
+{
+  sframe_decoder_ctx *dctx = NULL;
+  uint32_t nfres, fsize;
+  int32_t fstart;
+  unsigned char finfo;
+  int err = 0;
+  FILE *fp;
+  struct stat st;
+  char *sf_buf;
+  size_t sf_size;
+
+#define TEST(name, cond)                                                      \
+  do                                                                          \
+    {                                                                         \
+      if (cond)                                                               \
+	pass (name);                                                          \
+      else                                                                    \
+	fail (name);                                                          \
+    }                                                                         \
+    while (0)
+
+  /* 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;
+    }
+
+  /* Execute tests.  */
+  sf_size = fread (sf_buf, 1, st.st_size, fp);
+  fclose (fp);
+  TEST ("frecnt-1: Read data", sf_size != 0);
+
+  dctx = sframe_decode (sf_buf, sf_size, &err);
+  TEST ("frecnt-1: Decoder setup", dctx != NULL);
+
+  unsigned int fde_cnt = sframe_decoder_get_num_fidx (dctx);
+  TEST ("frecnt-1: Decoder FDE count", fde_cnt == 1);
+
+  err = sframe_decoder_get_funcdesc (dctx, 0, &nfres, &fsize, &fstart, &finfo);
+  TEST ("frecnt-1: Decoder get FDE", err == 0);
+  TEST ("frecnt-1: Decoder FRE count", nfres == 4);
+
+  sframe_decoder_free (&dctx);
+  return 0;
+
+setup_fail:
+  sframe_decoder_free (&dctx);
+  fail ("frecnt-1: Test setup");
+  return 1;
+}
diff --git a/libsframe/testsuite/libsframe.decode/frecnt-2.c b/libsframe/testsuite/libsframe.decode/frecnt-2.c
new file mode 100644
index 00000000000..7c140d88c3a
--- /dev/null
+++ b/libsframe/testsuite/libsframe.decode/frecnt-2.c
@@ -0,0 +1,104 @@
+/* frecnt-2.c -- Test for decoder in libsframe.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include "sframe-api.h"
+
+/* DejaGnu should not use gnulib's vsnprintf replacement here.  */
+#undef vsnprintf
+#include <dejagnu.h>
+
+/*
+ * SFrame info from the following source (2 fde 8 fres):
+ * static int cnt;
+ * int foo() { return ++cnt; }
+ * int main() { return foo(); }
+ */
+#define DATA	"DATA2"
+
+int
+main (void)
+{
+  sframe_decoder_ctx *dctx = NULL;
+  uint32_t nfres, fsize;
+  int32_t fstart;
+  unsigned char finfo;
+  unsigned int i;
+  int err = 0;
+  FILE *fp;
+  struct stat st;
+  char *sf_buf;
+  size_t sf_size;
+
+#define TEST(name, cond)                                                      \
+  do                                                                          \
+    {                                                                         \
+      if (cond)                                                               \
+	pass (name);                                                          \
+      else                                                                    \
+	fail (name);                                                          \
+    }                                                                         \
+    while (0)
+
+  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;
+    }
+
+  /* Execute tests.  */
+  sf_size = fread (sf_buf, 1, st.st_size, fp);
+  fclose (fp);
+  TEST ("frecnt-2: Read data", sf_size != 0);
+
+  dctx = sframe_decode (sf_buf, sf_size, &err);
+  TEST ("frecnt-2: Decode setup", dctx != NULL);
+
+  unsigned int fde_cnt = sframe_decoder_get_num_fidx (dctx);
+  TEST ("frecnt-2: Decode FDE count", fde_cnt == 2);
+
+  for (i = 0; i < fde_cnt; ++i)
+    {
+      err = sframe_decoder_get_funcdesc (dctx, i, &nfres, &fsize, &fstart,
+					 &finfo);
+      TEST ("frecnt-2: Decode get FDE", err == 0);
+      TEST ("frecnt-2: Decode get FRE", nfres == 4);
+    }
+
+  sframe_decoder_free (&dctx);
+  return 0;
+
+setup_fail:
+  sframe_decoder_free (&dctx);
+  fail ("frecnt-2: Test setup");
+  return 1;
+}
diff --git a/libsframe/testsuite/libsframe.decode/local.mk b/libsframe/testsuite/libsframe.decode/local.mk
new file mode 100644
index 00000000000..0e4279b8c8e
--- /dev/null
+++ b/libsframe/testsuite/libsframe.decode/local.mk
@@ -0,0 +1,16 @@
+check_PROGRAMS =
+if HAVE_COMPAT_DEJAGNU
+  check_PROGRAMS += %D%/be-flipping %D%/frecnt-1 %D%/frecnt-2
+endif
+
+%C%_be_flipping_SOURCES = %D%/be-flipping.c
+%C%_be_flipping_LDADD = ${top_builddir}/libsframe.la
+%C%_be_flipping_CPPFLAGS = -I${top_srcdir}/../include -Wall
+
+%C%_frecnt_1_SOURCES = %D%/frecnt-1.c
+%C%_frecnt_1_LDADD = ${top_builddir}/libsframe.la
+%C%_frecnt_1_CPPFLAGS = -I${top_srcdir}/../include -Wall
+
+%C%_frecnt_2_SOURCES = %D%/frecnt-2.c
+%C%_frecnt_2_LDADD = ${top_builddir}/libsframe.la 
+%C%_frecnt_2_CPPFLAGS = -I${top_srcdir}/../include -Wall
diff --git a/libsframe/testsuite/libsframe.encode/encode-1.c b/libsframe/testsuite/libsframe.encode/encode-1.c
new file mode 100644
index 00000000000..4075591ffa1
--- /dev/null
+++ b/libsframe/testsuite/libsframe.encode/encode-1.c
@@ -0,0 +1,177 @@
+/* encode-1.c -- Test for encoder in libsframe.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "sframe-api.h"
+
+/* DejaGnu should not use gnulib's vsnprintf replacement here.  */
+#undef vsnprintf
+#include <dejagnu.h>
+
+static int
+add_fde1 (sframe_encoder_ctx *encode, int idx)
+{
+  int i, err;
+  /* A contiguous block containing 4 FREs.  */
+  sframe_frame_row_entry fres[]
+    = { {0x0, 0x3, {0x8, 0, 0}},
+	{0x1, 0x5, {0x10, 0xf0, 0}},
+	{0x4, 0x4, {0x10, 0xf0, 0}},
+	{0x1a, 0x5, {0x8, 0xf0, 0}}
+      };
+
+  unsigned char finfo = sframe_fde_func_info (SFRAME_FRE_TYPE_ADDR1,
+					      SFRAME_FDE_TYPE_PCINC);
+  err = sframe_encoder_add_funcdesc (encode, 0xfffff03e, 0x1b, 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, 0x3, {0x8, 0, 0}},
+	{0x1, 0x5, {0x10, 0xf0, 0}},
+	{0x4, 0x4, {0x10, 0xf0, 0}},
+	{0xf, 0x5, {0x8, 0xf0, 0}}
+      };
+
+  unsigned char finfo = sframe_fde_func_info (SFRAME_FRE_TYPE_ADDR1,
+					      SFRAME_FDE_TYPE_PCINC);
+  err = sframe_encoder_add_funcdesc (encode, 0xfffff059, 0x10, 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;
+}
+
+/*
+ * SFrame info from the following source (2 fdes, 4 fres in each fde):
+ * static int cnt;
+ * int foo() { return ++cnt; }
+ * int main() { return foo(); }
+ */
+#define DATA    "DATA2"
+
+static int
+data_match (char *sframe_buf, size_t sz)
+{
+  FILE *fp;
+  struct stat st;
+  char *sf_buf;
+  size_t sf_size;
+  int diffs;
+
+  fp = fopen (DATA, "r");
+  if (fp == NULL)
+    return 0;
+  if (fstat (fileno (fp), &st) < 0)
+    {
+      perror ("fstat");
+      fclose (fp);
+      return 0;
+    }
+  sf_buf = malloc (st.st_size);
+  if (sf_buf == NULL)
+    {
+      perror ("malloc");
+      return 0;
+    }
+  sf_size = fread (sf_buf, 1, st.st_size, fp);
+  fclose (fp);
+  if (sf_size == 0 || sf_buf == NULL)
+    {
+      fprintf (stderr, "Encode: Read section failed\n");
+      return 0;
+    }
+  if (sf_size != sz)
+    return 0;
+
+  diffs = memcmp (sf_buf, sframe_buf, sz);
+
+  free (sf_buf);
+  return diffs == 0;
+}
+
+int main (void)
+{
+  sframe_encoder_ctx *encode;
+  sframe_frame_row_entry frep;
+  char *sframe_buf;
+  size_t sf_size;
+  int err = 0;
+  unsigned int fde_cnt = 0;
+  int match_p = 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);
+
+  fde_cnt = sframe_encoder_get_num_fidx (encode);
+  TEST ("encode-1: Encoder FDE count", fde_cnt == 0);
+
+  err = sframe_encoder_add_fre (encode, 1, &frep);
+  TEST ("encode-1: Encoder update workflow", err == SFRAME_ERR);
+
+  err = add_fde1 (encode, 0);
+  TEST ("encode-1: Encoder adding FDE1", err == 0);
+
+  err = add_fde2 (encode, 1);
+  TEST ("encode-1: Encoder adding FDE2", err == 0);
+
+  fde_cnt = sframe_encoder_get_num_fidx (encode);
+  TEST ("encode-1: Encoder FDE count", fde_cnt == 2);
+
+  sframe_buf = sframe_encoder_write (encode, &sf_size, &err);
+  TEST ("encode-1: Encoder write", err == 0);
+
+  match_p = data_match (sframe_buf, sf_size);
+  TEST ("encode-1: Encode buffer match", match_p == 1);
+
+  sframe_encoder_free (&encode);
+  return 0;
+}
diff --git a/libsframe/testsuite/libsframe.encode/encode.exp b/libsframe/testsuite/libsframe.encode/encode.exp
new file mode 100644
index 00000000000..60c08e81063
--- /dev/null
+++ b/libsframe/testsuite/libsframe.encode/encode.exp
@@ -0,0 +1,37 @@
+# Copyright (C) 2022 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 encode-1
+    return 0;
+}
+
+catch "exec ln -s $srcdir/libsframe.decode/DATA2 ." status
+
+if { [host_execute "testsuite/libsframe.encode/encode-1"] ne "" } {
+    fail "encode-1"
+}
+
+catch "exec rm DATA2" status
+
diff --git a/libsframe/testsuite/libsframe.encode/local.mk b/libsframe/testsuite/libsframe.encode/local.mk
new file mode 100644
index 00000000000..477d4b64929
--- /dev/null
+++ b/libsframe/testsuite/libsframe.encode/local.mk
@@ -0,0 +1,7 @@
+if HAVE_COMPAT_DEJAGNU
+  check_PROGRAMS += %D%/encode-1
+endif
+
+%C%_encode_1_SOURCES = %D%/encode-1.c
+%C%_encode_1_LDADD = ${top_builddir}/libsframe.la
+%C%_encode_1_CPPFLAGS = -I${top_srcdir}/../include -Wall
diff --git a/libsframe/testsuite/local.mk b/libsframe/testsuite/local.mk
new file mode 100644
index 00000000000..83eca774d41
--- /dev/null
+++ b/libsframe/testsuite/local.mk
@@ -0,0 +1,24 @@
+# Setup the testing framework
+EXPECT = expect
+RUNTEST = runtest
+RUNTESTFLAGS =
+
+check-DEJAGNU: site.exp
+	srcroot=`cd $(srcdir) && pwd`; export srcroot; \
+	r=`pwd`; export r; \
+	LC_ALL=C; export LC_ALL; \
+	EXPECT=$(EXPECT); export EXPECT; \
+	runtest=$(RUNTEST); \
+	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
+	  $$runtest --tool $(DEJATOOL) --srcdir $${srcroot}/testsuite \
+		CC="$(CC)" \
+		CROSS_COMPILE="$(CROSS_COMPILE)" \
+		COMPAT_DEJAGNU="$(COMPAT_DEJAGNU)" \
+		CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_builddir)" \
+		$(RUNTESTFLAGS); \
+	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
+	fi
+
+# libsframe encoder/decoder testsuite
+include %D%/libsframe.decode/local.mk
+include %D%/libsframe.encode/local.mk
