public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Indu Bhagat <indu.bhagat@oracle.com>
To: binutils@sourceware.org
Subject: [PATCH,RFC 3/7] libctfframe: add the CTF Frame library
Date: Mon,  9 May 2022 10:41:27 -0700	[thread overview]
Message-ID: <20220509174127.3905875-1-indu.bhagat@oracle.com> (raw)

[PS: this patch does not include the auto-generated libctfframe/configure to
 manage the size issues of the patch file.]

libctfframe is a library that allows you to:
- decode a .ctf_frame section
- probe and inspect a .ctf_frame section
- encode (and eventually write) a .ctf_frame section.

This library is currently being used by the linker, readelf and objdump.
The file include/ctf-frame-api.h defines the user-facing APIs for decoding,
encoding and probing .ctf_frame sections. A set of error codes together
with their error message strings are also defined.

Endian flipping is performed automatically at read and write time, if
cross-endianness is detected.

ChangeLog:

	* Makefile.def: Add libctfframe as new module with its
	dependencies.
	* Makefile.in: Regenerated.
	* binutils/Makefile.am: Add libctfframe.
	* binutils/Makefile.in: Regenerated.
	* configure: Regenerated.
	* configure.ac: Add libctfframe to host_libs.
	* libctfframe/Makefile.am: New file.
	* libctfframe/Makefile.in: New file.
	* libctfframe/aclocal.m4: New file.
	* libctfframe/config.h.in: New file.
	* libctfframe/configure.ac: New file.
	* libctfframe/ctf-frame-error.c: New file.
	* libctfframe/ctf-frame-impl.h: New file.
	* libctfframe/ctf-frame.c: New file.

include/ChangeLog:

	* ctf-frame-api.h: New file.
---
 Makefile.def                  |    2 +
 Makefile.in                   | 1288 +++++++++++++++++++++++++++-
 binutils/Makefile.am          |    2 +
 binutils/Makefile.in          |    1 +
 configure                     |    2 +-
 configure.ac                  |    2 +-
 include/ctf-frame-api.h       |  210 +++++
 libctfframe/Makefile.am       |   38 +
 libctfframe/Makefile.in       |  915 ++++++++++++++++++++
 libctfframe/aclocal.m4        | 1241 +++++++++++++++++++++++++++
 libctfframe/config.h.in       |  144 ++++
 libctfframe/configure.ac      |   75 ++
 libctfframe/ctf-frame-error.c |   49 ++
 libctfframe/ctf-frame-impl.h  |   55 ++
 libctfframe/ctf-frame.c       | 1515 +++++++++++++++++++++++++++++++++
 15 files changed, 5532 insertions(+), 7 deletions(-)
 create mode 100644 include/ctf-frame-api.h
 create mode 100644 libctfframe/Makefile.am
 create mode 100644 libctfframe/Makefile.in
 create mode 100644 libctfframe/aclocal.m4
 create mode 100644 libctfframe/config.h.in
 create mode 100644 libctfframe/configure.ac
 create mode 100644 libctfframe/ctf-frame-error.c
 create mode 100644 libctfframe/ctf-frame-impl.h
 create mode 100644 libctfframe/ctf-frame.c

diff --git a/Makefile.def b/Makefile.def
index acdcd625ed6..a63c3966513 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=libctfframe; 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-libctfframe; };
 
 // 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..7b93fd14ffb 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-libctfframe
 .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 libctfframe-no-bootstrap
+all-host: maybe-all-libctfframe
+@endif libctfframe-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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .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-libctfframe
 
 .PHONY: install-strip-target
 install-strip-target:  \
@@ -44044,6 +44066,1146 @@ maintainer-clean-libctf:
 
 
 
+.PHONY: configure-libctfframe maybe-configure-libctfframe
+maybe-configure-libctfframe:
+@if gcc-bootstrap
+configure-libctfframe: stage_current
+@endif gcc-bootstrap
+@if libctfframe
+maybe-configure-libctfframe: configure-libctfframe
+configure-libctfframe: 
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/Makefile || exit 0; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	$(HOST_EXPORTS)  \
+	echo Configuring in $(HOST_SUBDIR)/libctfframe; \
+	cd "$(HOST_SUBDIR)/libctfframe" || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(SHELL) \
+	  $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias}  \
+	  || exit 1
+@endif libctfframe
+
+
+
+.PHONY: configure-stage1-libctfframe maybe-configure-stage1-libctfframe
+maybe-configure-stage1-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stage1-libctfframe: configure-stage1-libctfframe
+configure-stage1-libctfframe:
+	@[ $(current_stage) = stage1 ] || $(MAKE) stage1-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE1_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(SHELL) $$s/$$module_srcdir/configure \
+	  --srcdir=$${topdir}/$$module_srcdir \
+	  $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
+	  --target=${target_alias} \
+	   \
+	  $(STAGE1_CONFIGURE_FLAGS)
+@endif libctfframe-bootstrap
+
+.PHONY: configure-stage2-libctfframe maybe-configure-stage2-libctfframe
+maybe-configure-stage2-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stage2-libctfframe: configure-stage2-libctfframe
+configure-stage2-libctfframe:
+	@[ $(current_stage) = stage2 ] || $(MAKE) stage2-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE2_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stage3-libctfframe maybe-configure-stage3-libctfframe
+maybe-configure-stage3-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stage3-libctfframe: configure-stage3-libctfframe
+configure-stage3-libctfframe:
+	@[ $(current_stage) = stage3 ] || $(MAKE) stage3-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE3_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stage4-libctfframe maybe-configure-stage4-libctfframe
+maybe-configure-stage4-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stage4-libctfframe: configure-stage4-libctfframe
+configure-stage4-libctfframe:
+	@[ $(current_stage) = stage4 ] || $(MAKE) stage4-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGE4_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stageprofile-libctfframe maybe-configure-stageprofile-libctfframe
+maybe-configure-stageprofile-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stageprofile-libctfframe: configure-stageprofile-libctfframe
+configure-stageprofile-libctfframe:
+	@[ $(current_stage) = stageprofile ] || $(MAKE) stageprofile-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEprofile_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stagetrain-libctfframe maybe-configure-stagetrain-libctfframe
+maybe-configure-stagetrain-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stagetrain-libctfframe: configure-stagetrain-libctfframe
+configure-stagetrain-libctfframe:
+	@[ $(current_stage) = stagetrain ] || $(MAKE) stagetrain-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEtrain_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stagefeedback-libctfframe maybe-configure-stagefeedback-libctfframe
+maybe-configure-stagefeedback-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stagefeedback-libctfframe: configure-stagefeedback-libctfframe
+configure-stagefeedback-libctfframe:
+	@[ $(current_stage) = stagefeedback ] || $(MAKE) stagefeedback-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEfeedback_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stageautoprofile-libctfframe maybe-configure-stageautoprofile-libctfframe
+maybe-configure-stageautoprofile-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stageautoprofile-libctfframe: configure-stageautoprofile-libctfframe
+configure-stageautoprofile-libctfframe:
+	@[ $(current_stage) = stageautoprofile ] || $(MAKE) stageautoprofile-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautoprofile_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+.PHONY: configure-stageautofeedback-libctfframe maybe-configure-stageautofeedback-libctfframe
+maybe-configure-stageautofeedback-libctfframe:
+@if libctfframe-bootstrap
+maybe-configure-stageautofeedback-libctfframe: configure-stageautofeedback-libctfframe
+configure-stageautofeedback-libctfframe:
+	@[ $(current_stage) = stageautofeedback ] || $(MAKE) stageautofeedback-start
+	@$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	TFLAGS="$(STAGEautofeedback_TFLAGS)"; \
+	test ! -f $(HOST_SUBDIR)/libctfframe/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)/libctfframe; \
+	$(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)/libctfframe; \
+	cd $(HOST_SUBDIR)/libctfframe || exit 1; \
+	case $(srcdir) in \
+	  /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+	  *) topdir=`echo $(HOST_SUBDIR)/libctfframe/ | \
+		sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+	esac; \
+	module_srcdir=libctfframe; \
+	$(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 libctfframe-bootstrap
+
+
+
+
+
+.PHONY: all-libctfframe maybe-all-libctfframe
+maybe-all-libctfframe:
+@if gcc-bootstrap
+all-libctfframe: stage_current
+@endif gcc-bootstrap
+@if libctfframe
+TARGET-libctfframe=all
+maybe-all-libctfframe: all-libctfframe
+all-libctfframe: configure-libctfframe
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS)  \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_HOST_FLAGS) $(STAGE1_FLAGS_TO_PASS)  \
+		$(TARGET-libctfframe))
+@endif libctfframe
+
+
+
+.PHONY: all-stage1-libctfframe maybe-all-stage1-libctfframe
+.PHONY: clean-stage1-libctfframe maybe-clean-stage1-libctfframe
+maybe-all-stage1-libctfframe:
+maybe-clean-stage1-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stage1-libctfframe: all-stage1-libctfframe
+all-stage1: all-stage1-libctfframe
+TARGET-stage1-libctfframe = $(TARGET-libctfframe)
+all-stage1-libctfframe: configure-stage1-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stage1-libctfframe: clean-stage1-libctfframe
+clean-stage1: clean-stage1-libctfframe
+clean-stage1-libctfframe:
+	@if [ $(current_stage) = stage1 ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage1-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stage1-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS)  \
+	$(STAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stage2-libctfframe maybe-all-stage2-libctfframe
+.PHONY: clean-stage2-libctfframe maybe-clean-stage2-libctfframe
+maybe-all-stage2-libctfframe:
+maybe-clean-stage2-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stage2-libctfframe: all-stage2-libctfframe
+all-stage2: all-stage2-libctfframe
+TARGET-stage2-libctfframe = $(TARGET-libctfframe)
+all-stage2-libctfframe: configure-stage2-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stage2-libctfframe: clean-stage2-libctfframe
+clean-stage2: clean-stage2-libctfframe
+clean-stage2-libctfframe:
+	@if [ $(current_stage) = stage2 ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage2-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stage2-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stage3-libctfframe maybe-all-stage3-libctfframe
+.PHONY: clean-stage3-libctfframe maybe-clean-stage3-libctfframe
+maybe-all-stage3-libctfframe:
+maybe-clean-stage3-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stage3-libctfframe: all-stage3-libctfframe
+all-stage3: all-stage3-libctfframe
+TARGET-stage3-libctfframe = $(TARGET-libctfframe)
+all-stage3-libctfframe: configure-stage3-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stage3-libctfframe: clean-stage3-libctfframe
+clean-stage3: clean-stage3-libctfframe
+clean-stage3-libctfframe:
+	@if [ $(current_stage) = stage3 ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage3-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stage3-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stage4-libctfframe maybe-all-stage4-libctfframe
+.PHONY: clean-stage4-libctfframe maybe-clean-stage4-libctfframe
+maybe-all-stage4-libctfframe:
+maybe-clean-stage4-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stage4-libctfframe: all-stage4-libctfframe
+all-stage4: all-stage4-libctfframe
+TARGET-stage4-libctfframe = $(TARGET-libctfframe)
+all-stage4-libctfframe: configure-stage4-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stage4-libctfframe: clean-stage4-libctfframe
+clean-stage4: clean-stage4-libctfframe
+clean-stage4-libctfframe:
+	@if [ $(current_stage) = stage4 ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stage4-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stage4-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stageprofile-libctfframe maybe-all-stageprofile-libctfframe
+.PHONY: clean-stageprofile-libctfframe maybe-clean-stageprofile-libctfframe
+maybe-all-stageprofile-libctfframe:
+maybe-clean-stageprofile-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stageprofile-libctfframe: all-stageprofile-libctfframe
+all-stageprofile: all-stageprofile-libctfframe
+TARGET-stageprofile-libctfframe = $(TARGET-libctfframe)
+all-stageprofile-libctfframe: configure-stageprofile-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stageprofile-libctfframe: clean-stageprofile-libctfframe
+clean-stageprofile: clean-stageprofile-libctfframe
+clean-stageprofile-libctfframe:
+	@if [ $(current_stage) = stageprofile ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageprofile-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stageprofile-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stagetrain-libctfframe maybe-all-stagetrain-libctfframe
+.PHONY: clean-stagetrain-libctfframe maybe-clean-stagetrain-libctfframe
+maybe-all-stagetrain-libctfframe:
+maybe-clean-stagetrain-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stagetrain-libctfframe: all-stagetrain-libctfframe
+all-stagetrain: all-stagetrain-libctfframe
+TARGET-stagetrain-libctfframe = $(TARGET-libctfframe)
+all-stagetrain-libctfframe: configure-stagetrain-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stagetrain-libctfframe: clean-stagetrain-libctfframe
+clean-stagetrain: clean-stagetrain-libctfframe
+clean-stagetrain-libctfframe:
+	@if [ $(current_stage) = stagetrain ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stagetrain-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stagetrain-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stagefeedback-libctfframe maybe-all-stagefeedback-libctfframe
+.PHONY: clean-stagefeedback-libctfframe maybe-clean-stagefeedback-libctfframe
+maybe-all-stagefeedback-libctfframe:
+maybe-clean-stagefeedback-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stagefeedback-libctfframe: all-stagefeedback-libctfframe
+all-stagefeedback: all-stagefeedback-libctfframe
+TARGET-stagefeedback-libctfframe = $(TARGET-libctfframe)
+all-stagefeedback-libctfframe: configure-stagefeedback-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stagefeedback-libctfframe: clean-stagefeedback-libctfframe
+clean-stagefeedback: clean-stagefeedback-libctfframe
+clean-stagefeedback-libctfframe:
+	@if [ $(current_stage) = stagefeedback ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stagefeedback-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stagefeedback-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stageautoprofile-libctfframe maybe-all-stageautoprofile-libctfframe
+.PHONY: clean-stageautoprofile-libctfframe maybe-clean-stageautoprofile-libctfframe
+maybe-all-stageautoprofile-libctfframe:
+maybe-clean-stageautoprofile-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stageautoprofile-libctfframe: all-stageautoprofile-libctfframe
+all-stageautoprofile: all-stageautoprofile-libctfframe
+TARGET-stageautoprofile-libctfframe = $(TARGET-libctfframe)
+all-stageautoprofile-libctfframe: configure-stageautoprofile-libctfframe
+	@[ $(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)/libctfframe && \
+	$$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-libctfframe)
+
+maybe-clean-stageautoprofile-libctfframe: clean-stageautoprofile-libctfframe
+clean-stageautoprofile: clean-stageautoprofile-libctfframe
+clean-stageautoprofile-libctfframe:
+	@if [ $(current_stage) = stageautoprofile ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageautoprofile-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stageautoprofile-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+.PHONY: all-stageautofeedback-libctfframe maybe-all-stageautofeedback-libctfframe
+.PHONY: clean-stageautofeedback-libctfframe maybe-clean-stageautofeedback-libctfframe
+maybe-all-stageautofeedback-libctfframe:
+maybe-clean-stageautofeedback-libctfframe:
+@if libctfframe-bootstrap
+maybe-all-stageautofeedback-libctfframe: all-stageautofeedback-libctfframe
+all-stageautofeedback: all-stageautofeedback-libctfframe
+TARGET-stageautofeedback-libctfframe = $(TARGET-libctfframe)
+all-stageautofeedback-libctfframe: configure-stageautofeedback-libctfframe
+	@[ $(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)/libctfframe && \
+	 \
+	$(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-libctfframe)
+
+maybe-clean-stageautofeedback-libctfframe: clean-stageautofeedback-libctfframe
+clean-stageautofeedback: clean-stageautofeedback-libctfframe
+clean-stageautofeedback-libctfframe:
+	@if [ $(current_stage) = stageautofeedback ]; then \
+	  [ -f $(HOST_SUBDIR)/libctfframe/Makefile ] || exit 0; \
+	else \
+	  [ -f $(HOST_SUBDIR)/stageautofeedback-libctfframe/Makefile ] || exit 0; \
+	  $(MAKE) stageautofeedback-start; \
+	fi; \
+	cd $(HOST_SUBDIR)/libctfframe && \
+	$(MAKE) $(EXTRA_HOST_FLAGS) $(POSTSTAGE1_FLAGS_TO_PASS)  clean
+@endif libctfframe-bootstrap
+
+
+
+
+
+.PHONY: check-libctfframe maybe-check-libctfframe
+maybe-check-libctfframe:
+@if libctfframe
+maybe-check-libctfframe: check-libctfframe
+
+check-libctfframe:
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) $(EXTRA_HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  $(EXTRA_BOOTSTRAP_FLAGS) check)
+
+@endif libctfframe
+
+.PHONY: install-libctfframe maybe-install-libctfframe
+maybe-install-libctfframe:
+@if libctfframe
+maybe-install-libctfframe: install-libctfframe
+
+install-libctfframe: installdirs
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  install)
+
+@endif libctfframe
+
+.PHONY: install-strip-libctfframe maybe-install-strip-libctfframe
+maybe-install-strip-libctfframe:
+@if libctfframe
+maybe-install-strip-libctfframe: install-strip-libctfframe
+
+install-strip-libctfframe: installdirs
+	@: $(MAKE); $(unstage)
+	@r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(MAKE) $(FLAGS_TO_PASS)  install-strip)
+
+@endif libctfframe
+
+# Other targets (info, dvi, pdf, etc.)
+
+.PHONY: maybe-info-libctfframe info-libctfframe
+maybe-info-libctfframe:
+@if libctfframe
+maybe-info-libctfframe: info-libctfframe
+
+info-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-dvi-libctfframe dvi-libctfframe
+maybe-dvi-libctfframe:
+@if libctfframe
+maybe-dvi-libctfframe: dvi-libctfframe
+
+dvi-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-pdf-libctfframe pdf-libctfframe
+maybe-pdf-libctfframe:
+@if libctfframe
+maybe-pdf-libctfframe: pdf-libctfframe
+
+pdf-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-html-libctfframe html-libctfframe
+maybe-html-libctfframe:
+@if libctfframe
+maybe-html-libctfframe: html-libctfframe
+
+html-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-TAGS-libctfframe TAGS-libctfframe
+maybe-TAGS-libctfframe:
+@if libctfframe
+maybe-TAGS-libctfframe: TAGS-libctfframe
+
+TAGS-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-install-info-libctfframe install-info-libctfframe
+maybe-install-info-libctfframe:
+@if libctfframe
+maybe-install-info-libctfframe: install-info-libctfframe
+
+install-info-libctfframe: \
+    configure-libctfframe \
+    info-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-install-dvi-libctfframe install-dvi-libctfframe
+maybe-install-dvi-libctfframe:
+@if libctfframe
+maybe-install-dvi-libctfframe: install-dvi-libctfframe
+
+install-dvi-libctfframe: \
+    configure-libctfframe \
+    dvi-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-install-pdf-libctfframe install-pdf-libctfframe
+maybe-install-pdf-libctfframe:
+@if libctfframe
+maybe-install-pdf-libctfframe: install-pdf-libctfframe
+
+install-pdf-libctfframe: \
+    configure-libctfframe \
+    pdf-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-install-html-libctfframe install-html-libctfframe
+maybe-install-html-libctfframe:
+@if libctfframe
+maybe-install-html-libctfframe: install-html-libctfframe
+
+install-html-libctfframe: \
+    configure-libctfframe \
+    html-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-installcheck-libctfframe installcheck-libctfframe
+maybe-installcheck-libctfframe:
+@if libctfframe
+maybe-installcheck-libctfframe: installcheck-libctfframe
+
+installcheck-libctfframe: \
+    configure-libctfframe 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-mostlyclean-libctfframe mostlyclean-libctfframe
+maybe-mostlyclean-libctfframe:
+@if libctfframe
+maybe-mostlyclean-libctfframe: mostlyclean-libctfframe
+
+mostlyclean-libctfframe: 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-clean-libctfframe clean-libctfframe
+maybe-clean-libctfframe:
+@if libctfframe
+maybe-clean-libctfframe: clean-libctfframe
+
+clean-libctfframe: 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-distclean-libctfframe distclean-libctfframe
+maybe-distclean-libctfframe:
+@if libctfframe
+maybe-distclean-libctfframe: distclean-libctfframe
+
+distclean-libctfframe: 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+.PHONY: maybe-maintainer-clean-libctfframe maintainer-clean-libctfframe
+maybe-maintainer-clean-libctfframe:
+@if libctfframe
+maybe-maintainer-clean-libctfframe: maintainer-clean-libctfframe
+
+maintainer-clean-libctfframe: 
+	@[ -f ./libctfframe/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 libctfframe"; \
+	(cd $(HOST_SUBDIR)/libctfframe && \
+	  $(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 libctfframe
+
+
+
 # ---------------------------------------
 # Modules which run on the target machine
 # ---------------------------------------
@@ -59280,6 +60442,11 @@ stage1-start::
 	  mkdir stage1-libctf; \
 	mv stage1-libctf libctf
 @endif libctf
+@if libctfframe
+	@cd $(HOST_SUBDIR); [ -d stage1-libctfframe ] || \
+	  mkdir stage1-libctfframe; \
+	mv stage1-libctfframe libctfframe
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stage1-libctfframe; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stage2-libctfframe ] || \
+	  mkdir stage2-libctfframe; \
+	mv stage2-libctfframe libctfframe; \
+	mv stage1-libctfframe prev-libctfframe || test -f stage1-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stage2-libctfframe; \
+	  mv prev-libctfframe stage1-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stage3-libctfframe ] || \
+	  mkdir stage3-libctfframe; \
+	mv stage3-libctfframe libctfframe; \
+	mv stage2-libctfframe prev-libctfframe || test -f stage2-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stage3-libctfframe; \
+	  mv prev-libctfframe stage2-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stage4-libctfframe ] || \
+	  mkdir stage4-libctfframe; \
+	mv stage4-libctfframe libctfframe; \
+	mv stage3-libctfframe prev-libctfframe || test -f stage3-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stage4-libctfframe; \
+	  mv prev-libctfframe stage3-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stageprofile-libctfframe ] || \
+	  mkdir stageprofile-libctfframe; \
+	mv stageprofile-libctfframe libctfframe; \
+	mv stage1-libctfframe prev-libctfframe || test -f stage1-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stageprofile-libctfframe; \
+	  mv prev-libctfframe stage1-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stagetrain-libctfframe ] || \
+	  mkdir stagetrain-libctfframe; \
+	mv stagetrain-libctfframe libctfframe; \
+	mv stageprofile-libctfframe prev-libctfframe || test -f stageprofile-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stagetrain-libctfframe; \
+	  mv prev-libctfframe stageprofile-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stagefeedback-libctfframe ] || \
+	  mkdir stagefeedback-libctfframe; \
+	mv stagefeedback-libctfframe libctfframe; \
+	mv stagetrain-libctfframe prev-libctfframe || test -f stagetrain-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stagefeedback-libctfframe; \
+	  mv prev-libctfframe stagetrain-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stageautoprofile-libctfframe ] || \
+	  mkdir stageautoprofile-libctfframe; \
+	mv stageautoprofile-libctfframe libctfframe; \
+	mv stage1-libctfframe prev-libctfframe || test -f stage1-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stageautoprofile-libctfframe; \
+	  mv prev-libctfframe stage1-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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 libctfframe
+	@cd $(HOST_SUBDIR); [ -d stageautofeedback-libctfframe ] || \
+	  mkdir stageautofeedback-libctfframe; \
+	mv stageautofeedback-libctfframe libctfframe; \
+	mv stageautoprofile-libctfframe prev-libctfframe || test -f stageautoprofile-lean 
+@endif libctfframe
 	@[ -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 libctfframe
+	@if test -d $(HOST_SUBDIR)/libctfframe; then \
+	  cd $(HOST_SUBDIR); mv libctfframe stageautofeedback-libctfframe; \
+	  mv prev-libctfframe stageautoprofile-libctfframe; : ; \
+	fi
+@endif libctfframe
 	@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-libctfframe
+all-stage1-binutils: maybe-all-stage1-libctfframe
+all-stage2-binutils: maybe-all-stage2-libctfframe
+all-stage3-binutils: maybe-all-stage3-libctfframe
+all-stage4-binutils: maybe-all-stage4-libctfframe
+all-stageprofile-binutils: maybe-all-stageprofile-libctfframe
+all-stagetrain-binutils: maybe-all-stagetrain-libctfframe
+all-stagefeedback-binutils: maybe-all-stagefeedback-libctfframe
+all-stageautoprofile-binutils: maybe-all-stageautoprofile-libctfframe
+all-stageautofeedback-binutils: maybe-all-stageautofeedback-libctfframe
 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 751fbacce12..17dcc27fc86 100644
--- a/binutils/Makefile.am
+++ b/binutils/Makefile.am
@@ -176,6 +176,8 @@ LIBCTF =
 LIBCTF_NOBFD =
 endif
 
+LIBCTFFRAME = ../libctfframe/libctfframe.la
+
 LIBIBERTY = ../libiberty/libiberty.a
 
 POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES)
diff --git a/binutils/Makefile.in b/binutils/Makefile.in
index 78d32b350e3..2ed7f05bf37 100644
--- a/binutils/Makefile.in
+++ b/binutils/Makefile.in
@@ -738,6 +738,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
+LIBCTFFRAME = ../libctfframe/libctfframe.la
 LIBIBERTY = ../libiberty/libiberty.a
 POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES)
 EXPECT = expect
diff --git a/configure b/configure
index 1badcb314f8..7192b65b591 100755
--- a/configure
+++ b/configure
@@ -2784,7 +2784,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 libdecnumber gmp mpfr mpc isl libelf libiconv libctf"
+host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl libelf libiconv libctf libctfframe"
 
 # 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 5b6e2048514..9169670c90f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -132,7 +132,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 libdecnumber gmp mpfr mpc isl libelf libiconv libctf"
+host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktrace libcpp libdecnumber gmp mpfr mpc isl libelf libiconv libctf libctfframe"
 
 # 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/ctf-frame-api.h b/include/ctf-frame-api.h
new file mode 100644
index 00000000000..076c4a40dad
--- /dev/null
+++ b/include/ctf-frame-api.h
@@ -0,0 +1,210 @@
+/* Public API to CTF frame.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libctfframe.
+
+   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	_CTF_FRAME_API_H
+#define	_CTF_FRAME_API_H
+
+#include <ctf-frame.h>
+
+#ifdef	__cplusplus
+extern "C"
+{
+#endif
+
+typedef struct ctf_frame_decoder_ctx ctf_frame_decoder_ctx;
+typedef struct ctf_frame_encoder_ctx ctf_frame_encoder_ctx;
+
+#define MAX_OFFSET_BYTES (CTF_FRAME_FRE_OFFSET_4B * 2 * 3)
+
+/* User interfacing CTF frame row entry.
+   An abstraction provided by libctfframe so the consumer is decoupled from
+   the binary format representation of the same.  */
+
+typedef struct ctf_frame_row_entry
+{
+  uint32_t fre_start_addr;
+  unsigned char fre_info;
+  unsigned char fre_offsets[MAX_OFFSET_BYTES];
+} ctf_frame_row_entry;
+
+#define CTF_FRAME_ERR ((int) -1)
+
+/* This macro holds information about all the available ctf frame
+   errors.  It is used to form both an enum holding all the error
+   constants, and also the error strings themselves.  To use, define
+   _CTF_FRAME_FIRST and _CTF_FRAME_ITEM to expand as you like, then
+   mention the macro name.  See the enum after this for an example.  */
+#define _CTF_FRAME_ERRORS \
+  _CTF_FRAME_FIRST (ECTF_FRAME_VERSION_INVAL, "CTF frame version not supported.") \
+  _CTF_FRAME_ITEM (ECTF_FRAME_NOMEM, "Out of Memory.")			\
+  _CTF_FRAME_ITEM (ECTF_FRAME_INVAL, "Corrupt CTF Frame.")		\
+  _CTF_FRAME_ITEM (ECTF_FRAME_BUF_INVAL, "Corrupt CTF frame buffer.")	\
+  _CTF_FRAME_ITEM (ECTF_FRAME_DCTX_INVAL, "Corrupt CTF frame decoder.") \
+  _CTF_FRAME_ITEM (ECTF_FRAME_ECTX_INVAL, "Corrupt CTF frame encoder.")	\
+  _CTF_FRAME_ITEM (ECTF_FRAME_FDE_INVAL, "Corrput FDE.")		\
+  _CTF_FRAME_ITEM (ECTF_FRAME_FRE_INVAL, "Corrupt FRE.")		\
+  _CTF_FRAME_ITEM (ECTF_FRAME_FDE_NOTFOUND,"FDE not found.")		\
+  _CTF_FRAME_ITEM (ECTF_FRAME_FRE_NOTFOUND,"FRE not found.")		\
+  _CTF_FRAME_ITEM (ECTF_FRAME_FREOFFSET_NOPRESENT,"FRE offset not present.")
+
+#define	ECTF_FRAME_BASE	2000	/* Base value for libctfframe errnos.  */
+
+enum
+  {
+#define _CTF_FRAME_FIRST(NAME, STR) NAME = ECTF_FRAME_BASE
+#define _CTF_FRAME_ITEM(NAME, STR) , NAME
+_CTF_FRAME_ERRORS
+#undef _CTF_FRAME_ITEM
+#undef _CTF_FRAME_FIRST
+  };
+
+/* Count of CTF errors.  */
+#define ECTF_FRAME_NERR (ECTF_FRAME_NOMEM - ECTF_FRAME_BASE + 1)
+
+/* Get the error message string.  */
+
+extern const char *
+ctf_frame_errmsg (int error);
+
+/* Get FDE function info given a FRE_TYPE.  */
+
+extern unsigned char
+ctf_frame_fde_func_info (unsigned int fre_type);
+
+/* Gather the FRE type given the function size.  */
+
+extern unsigned int
+ctf_frame_calc_fre_type (unsigned int func_size);
+
+/* The CTF Frame Decoder.  */
+
+/* Decode the specified CTF Frame buffer CF_BUF of size CF_SIZE and return the
+   new CTF Frame decoder context.  Sets ERRP for the caller if any error.  */
+extern ctf_frame_decoder_ctx *
+ctf_frame_decode (const char *cf_buf, size_t cf_size, int *errp);
+
+/* Free the decoder context.  */
+extern void
+ctf_free_decoder (ctf_frame_decoder_ctx *dctx);
+
+/* Get the CTF Frame's abi/arch info.  */
+extern unsigned char
+ctf_frame_decoder_get_abi_arch (ctf_frame_decoder_ctx *dctx);
+
+/* Return the number of function descriptor entries in the CTF frame decoder
+   DCTX.  */
+unsigned int
+ctf_frame_decoder_get_num_fidx (ctf_frame_decoder_ctx *dctx);
+
+/* Find the function descriptor entry which contains the specified address.  */
+extern ctf_frame_func_desc_entry *
+ctf_frame_get_funcdesc_with_addr (ctf_frame_decoder_ctx *dctx,
+				  int32_t addr, int *errp);
+
+/* Find the CTF frame row entry which contains the PC.  Returns
+   CTF_FRAME_ERR if failure.  */
+
+extern int
+ctf_frame_find_fre (ctf_frame_decoder_ctx *ctx, int32_t pc,
+		    ctf_frame_row_entry *frep);
+
+/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
+   index entry in the CTF frame decoder CTX.  Returns error code as
+   applicable.  */
+extern int
+ctf_frame_decoder_get_fre (ctf_frame_decoder_ctx *ctx,
+			   unsigned int func_idx,
+			   unsigned int fre_idx,
+			   ctf_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
+ctf_frame_decoder_get_funcdesc (ctf_frame_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
+ctf_frame_fre_get_base_reg_id (ctf_frame_row_entry *fre, int *errp);
+
+/* Get the CFA offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+ctf_frame_fre_get_cfa_offset (ctf_frame_row_entry *fre, int *errp);
+
+/* Get the FP offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+ctf_frame_fre_get_fp_offset (ctf_frame_row_entry *fre, int *errp);
+
+/* Get the RA offset from the FRE.  If the offset is invalid, sets errp.  */
+extern int32_t
+ctf_frame_fre_get_ra_offset (ctf_frame_row_entry *fre, int *errp);
+
+/* The CTF Frame Encoder.  */
+
+/* Create an encoder context with the given CTF format version VER, FLAGS and
+   ABI information.  Sets errp if failure.  */
+extern ctf_frame_encoder_ctx *
+ctf_frame_encode (unsigned char ver, unsigned char flags, int abi, int *errp);
+
+/* Free the encoder context.  */
+extern void
+ctf_free_encoder (ctf_frame_encoder_ctx *encoder);
+
+/* Get the abi/arch info from the CTF frame encoder context CTX.  */
+extern unsigned char
+ctf_frame_encoder_get_abi_arch (ctf_frame_encoder_ctx *encoder);
+
+/* Return the number of function descriptor entries in the CTF frame encoder
+   ENCODER.  */
+extern unsigned int
+ctf_frame_encoder_get_num_fidx (ctf_frame_encoder_ctx *encoder);
+
+/* Add an FRE to function at FUNC_IDX'th function descriptor index entry in
+   the encoder context.  */
+extern int
+ctf_frame_encoder_add_fre (ctf_frame_encoder_ctx *encoder,
+			   unsigned int func_idx,
+			   ctf_frame_row_entry *frep);
+
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE and NUM_FRES
+   to the encoder.  */
+extern int
+ctf_frame_encoder_add_funcdesc (ctf_frame_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  *
+ctf_frame_write_encoder (ctf_frame_encoder_ctx *encoder,
+			 size_t *encoded_size, int *errp);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif				/* _CTF_FRAME_API_H */
diff --git a/libctfframe/Makefile.am b/libctfframe/Makefile.am
new file mode 100644
index 00000000000..722e526be20
--- /dev/null
+++ b/libctfframe/Makefile.am
@@ -0,0 +1,38 @@
+## 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
+
+AUTOMAKE_OPTIONS = foreign no-texinfo.tex
+
+BASEDIR = $(srcdir)/..
+INCDIR = $(srcdir)/../include
+# include libctf for swap.h
+AM_CPPFLAGS = -D_GNU_SOURCE -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../libctf
+AM_CFLAGS = -std=gnu99 @ac_libctfframe_warn_cflags@ @warn@ @c_warn@ @WARN_PEDANTIC@ @WERROR@
+
+if INSTALL_LIBBFD
+lib_LTLIBRARIES = libctfframe.la
+include_HEADERS = $(INCDIR)/ctf-frame.h $(INCDIR)/ctf-frame-api.h
+else
+include_HEADERS =
+noinst_LTLIBRARIES = libctfframe.la
+endif
+
+libctfframe_la_SOURCES = ctf-frame.c ctf-frame-error.c
diff --git a/libctfframe/Makefile.in b/libctfframe/Makefile.in
new file mode 100644
index 00000000000..ad59fe2be39
--- /dev/null
+++ b/libctfframe/Makefile.in
@@ -0,0 +1,915 @@
+# 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@
+
+#
+#   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/>.
+#
+
+
+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@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
+	$(top_srcdir)/../config/acx.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)
+libctfframe_la_LIBADD =
+am_libctfframe_la_OBJECTS = ctf-frame.lo ctf-frame-error.lo
+libctfframe_la_OBJECTS = $(am_libctfframe_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_libctfframe_la_rpath =
+@INSTALL_LIBBFD_TRUE@am_libctfframe_la_rpath = -rpath $(libdir)
+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 = $(libctfframe_la_SOURCES)
+DIST_SOURCES = $(libctfframe_la_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)/ctf-frame.h \
+	$(INCDIR)/ctf-frame-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
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(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@
+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@
+WARN_PEDANTIC = @WARN_PEDANTIC@
+WERROR = @WERROR@
+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_libctfframe_warn_cflags = @ac_libctfframe_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@
+c_warn = @c_warn@
+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@
+runstatedir = @runstatedir@
+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@
+warn = @warn@
+ACLOCAL_AMFLAGS = -I .. -I ../config
+AUTOMAKE_OPTIONS = foreign no-texinfo.tex
+BASEDIR = $(srcdir)/..
+INCDIR = $(srcdir)/../include
+# include libctf for swap.h
+AM_CPPFLAGS = -D_GNU_SOURCE -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../libctf
+AM_CFLAGS = -std=gnu99 @ac_libctfframe_warn_cflags@ @warn@ @c_warn@ @WARN_PEDANTIC@ @WERROR@
+@INSTALL_LIBBFD_TRUE@lib_LTLIBRARIES = libctfframe.la
+@INSTALL_LIBBFD_FALSE@include_HEADERS = 
+@INSTALL_LIBBFD_TRUE@include_HEADERS = $(INCDIR)/ctf-frame.h $(INCDIR)/ctf-frame-api.h
+@INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libctfframe.la
+libctfframe_la_SOURCES = ctf-frame.c ctf-frame-error.c
+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  $(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;
+
+$(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}; \
+	}
+
+libctfframe.la: $(libctfframe_la_OBJECTS) $(libctfframe_la_DEPENDENCIES) $(EXTRA_libctfframe_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(LINK) $(am_libctfframe_la_rpath) $(libctfframe_la_OBJECTS) $(libctfframe_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctf-frame-error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctf-frame.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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 $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _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
+
+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
+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)
+
+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-generic clean-libLTLIBRARIES clean-libtool \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am 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)
+	-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 install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \
+	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-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
+
+
+# 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/libctfframe/aclocal.m4 b/libctfframe/aclocal.m4
new file mode 100644
index 00000000000..3a0b3426ebc
--- /dev/null
+++ b/libctfframe/aclocal.m4
@@ -0,0 +1,1241 @@
+# 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/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/libctfframe/config.h.in b/libctfframe/config.h.in
new file mode 100644
index 00000000000..6712ff1cc81
--- /dev/null
+++ b/libctfframe/config.h.in
@@ -0,0 +1,144 @@
+/* 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 `asprintf', and to 0 if you
+   don't. */
+#undef HAVE_DECL_ASPRINTF
+
+/* 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 declaration of `stpcpy', and to 0 if you don't.
+   */
+#undef HAVE_DECL_STPCPY
+
+/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you
+   don't. */
+#undef HAVE_DECL_VASPRINTF
+
+/* 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/libctfframe/configure.ac b/libctfframe/configure.ac
new file mode 100644
index 00000000000..d5e5db3c416
--- /dev/null
+++ b/libctfframe/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([libctfframe], BFD_VERSION)
+AC_CONFIG_SRCDIR(ctf-frame.c)
+AC_CONFIG_MACRO_DIR(..)
+AC_CONFIG_MACRO_DIR(../config)
+AC_CONFIG_MACRO_DIR(../bfd)
+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])
+
+# Figure out what compiler warnings we can enable.
+# See config/warnings.m4 for details.
+
+ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wno-narrowing -Wwrite-strings \
+			  -Wmissing-format-attribute], [warn])
+ACX_PROG_CC_WARNING_OPTS([-Wstrict-prototypes -Wmissing-prototypes \
+			  -Wold-style-definition], [c_warn])
+ACX_PROG_CC_WARNING_ALMOST_PEDANTIC([-Wno-long-long])
+
+# Only enable with --enable-werror-always until existing warnings are
+# corrected.
+ACX_PROG_CC_WARNINGS_ARE_ERRORS([manual])
+
+AM_MAINTAINER_MODE
+AM_INSTALL_LIBBFD
+ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_libctfframe_warn_cflags])
+
+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_CHECK_DECLS([asprintf, vasprintf, stpcpy])
+
+AC_CONFIG_FILES(Makefile)
+AC_CONFIG_HEADERS(config.h)
+AC_OUTPUT
+
+GNU_MAKE_JOBSERVER
diff --git a/libctfframe/ctf-frame-error.c b/libctfframe/ctf-frame-error.c
new file mode 100644
index 00000000000..c0c65aa426a
--- /dev/null
+++ b/libctfframe/ctf-frame-error.c
@@ -0,0 +1,49 @@
+/* ctf-frame-error.c - Error messages.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   his file is part of libctfframe.
+
+   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 "ctf-frame-api.h"
+#include <stddef.h>
+#include <string.h>
+
+/* In this file, we want to treat the first item of the ctf error
+   macro like subsequent items.  */
+#define _CTF_FRAME_FIRST(NAME, VALUE) _CTF_FRAME_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 _ctf_frame_errlist[] = {
+#define _CTF_FRAME_ITEM(n, s) s,
+_CTF_FRAME_ERRORS
+#undef _CTF_FRAME_ITEM
+};
+
+const char *
+ctf_frame_errmsg (int error)
+{
+  const char *str;
+
+  if (error >= ECTF_FRAME_BASE && (error - ECTF_FRAME_BASE) < ECTF_FRAME_NERR)
+    str = _ctf_frame_errlist[error - ECTF_FRAME_BASE];
+  else
+    str = (const char *) strerror (error);
+
+  return (str ? str : "Unknown error");
+}
diff --git a/libctfframe/ctf-frame-impl.h b/libctfframe/ctf-frame-impl.h
new file mode 100644
index 00000000000..84510f7cca6
--- /dev/null
+++ b/libctfframe/ctf-frame-impl.h
@@ -0,0 +1,55 @@
+/* Implementation header.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libctfframe.
+
+   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 _CTF_FRAME_IMPL_H
+#define _CTF_FRAME_IMPL_H
+
+#include "ctf-frame-api.h"
+
+#ifdef  __cplusplus
+extern "C"
+{
+#endif
+
+#include <assert.h>
+#define ctf_frame_assert(expr) (assert (expr))
+
+struct ctf_frame_decoder_ctx
+{
+  ctf_frame_header cfd_header;        /* CTF Frame header.  */
+  uint32_t *cfd_funcdesc;	      /* CTF function desc entries table.  */
+  void *cfd_fres;		      /* CTF fre table.  */
+  int cfd_fre_nbytes;		      /* CTF fres number of bytes.  */
+};
+
+struct ctf_frame_encoder_ctx
+{
+  ctf_frame_header cfe_header;		/* CTF Frame header.  */
+  uint32_t *cfe_funcdesc;            	/* CTF function desc entries table.  */
+  ctf_frame_row_entry *cfe_fres;	/* CTF fre table.  */
+  uint32_t cfe_fre_nbytes;		/* CTF fres size in bytes.  */
+  char *cfe_data;			/* CTF data buffer.  */
+  size_t cfe_data_size;			/* CTF data buffer.  */
+};
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* _CTF_FRAME_IMPL_H */
diff --git a/libctfframe/ctf-frame.c b/libctfframe/ctf-frame.c
new file mode 100644
index 00000000000..11c3d172af3
--- /dev/null
+++ b/libctfframe/ctf-frame.c
@@ -0,0 +1,1515 @@
+/* ctf-frame.c - CTF Frame decoder/encoder.
+
+   Copyright (C) 2022 Free Software Foundation, Inc.
+
+   This file is part of libctfframe.
+
+   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 <errno.h>
+#include "ctf-frame-impl.h"
+#include "swap.h"
+
+typedef struct cf_funidx_tbl
+{
+  unsigned int count;
+  unsigned int alloced;
+  ctf_frame_func_desc_entry entry[1];
+} cf_funidx_tbl;
+
+typedef struct cf_fre_tbl
+{
+  unsigned int count;
+  unsigned int alloced;
+  ctf_frame_row_entry entry[1];
+} cf_fre_tbl;
+
+#define _cf_printflike_(string_index,first_to_check) \
+    __attribute__ ((__format__ (__printf__, (string_index), (first_to_check))))
+
+static void debug_printf (const char *, ...);
+
+static int _ctf_frame_debug;	/* Control for printing out debug info.  */
+static int number_of_entries = 64;
+
+static void
+ctf_frame_init_debug (void)
+{
+  static int inited;
+
+  if (!inited)
+    {
+      _ctf_frame_debug = getenv ("CTF_FRAME_DEBUG") != NULL;
+      inited = 1;
+    }
+}
+
+_cf_printflike_ (1, 2)
+static void debug_printf (const char *format, ...)
+{
+  if (_ctf_frame_debug)
+    {
+      va_list args;
+
+      va_start (args, format);
+      vfprintf (stderr, format, args);
+      va_end (args);
+    }
+}
+
+/* Store the specified error code into errp if it is non-NULL.
+   Return CTF_FRAME_ERR.  */
+
+static int
+ctf_frame_set_errno (int *errp, int error)
+{
+  if (errp != NULL)
+    *errp = error;
+  return CTF_FRAME_ERR;
+}
+
+/* Store the specified error code into errp if it is non-NULL.
+   Return NULL.  */
+
+static void *
+ctf_frame_ret_set_errno (int *errp, int error)
+{
+  if (errp != NULL)
+    *errp = error;
+  return NULL;
+}
+
+/* Access functions for frame row entry data.  */
+
+static unsigned int
+ctf_frame_fre_get_offset_count (unsigned char fre_info)
+{
+  return CTF_FRAME_V1_FRE_OFFSET_COUNT(fre_info);
+}
+
+static unsigned int
+ctf_frame_fre_get_offset_size (unsigned char fre_info)
+{
+  return CTF_FRAME_V1_FRE_OFFSET_SIZE(fre_info);
+}
+
+/* Access functions for info from function descriptor entry.  */
+
+static unsigned int
+ctf_frame_get_fre_type (ctf_frame_func_desc_entry *fdep)
+{
+  unsigned int fre_type = 0;
+  if (fdep)
+    fre_type = CTF_FRAME_V1_FUNC_FRE_TYPE (fdep->ctf_func_info);
+  return fre_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 CTF_FRAME_ABI_AARCH64_ENDIAN_LITTLE:
+      case CTF_FRAME_ABI_AMD64_ENDIAN_LITTLE:
+	return !is_little;
+      case CTF_FRAME_ABI_AARCH64_ENDIAN_BIG:
+	return is_little;
+      default:
+	break;
+    }
+
+  return 0;
+}
+
+/* Flip the endianness of the CTF header.  */
+
+static void
+flip_header (ctf_frame_header *cfh)
+{
+  swap_thing (cfh->cth_frame_preamble.ctfp_magic);
+  swap_thing (cfh->cth_frame_preamble.ctfp_version);
+  swap_thing (cfh->cth_frame_preamble.ctfp_flags);
+  swap_thing (cfh->cth_cfa_fixed_fp_offset);
+  swap_thing (cfh->cth_cfa_fixed_ra_offset);
+  swap_thing (cfh->cth_num_fdes);
+  swap_thing (cfh->cth_num_fres);
+  swap_thing (cfh->cth_fre_len);
+  swap_thing (cfh->cth_fdeoff);
+  swap_thing (cfh->cth_freoff);
+}
+
+static int
+flip_fde (ctf_frame_func_desc_entry *fdep)
+{
+  swap_thing (fdep->ctf_func_start_address);
+  swap_thing (fdep->ctf_func_size);
+  swap_thing (fdep->ctf_func_start_fre_off);
+  swap_thing (fdep->ctf_func_num_fres);
+  return 0;
+}
+
+/* Check if CTF frame header has valid data.  */
+
+static int
+ctf_frame_header_sanity_check_p (ctf_frame_header *hp)
+{
+  unsigned char all_flags = CTF_FRAME_F_FDE_SORTED | CTF_FRAME_F_FRAME_POINTER;
+  /* Check preamble is valid.  */
+  if ((hp->cth_frame_preamble.ctfp_magic != CTF_FRAME_MAGIC)
+      || (hp->cth_frame_preamble.ctfp_version != CTF_FRAME_VERSION)
+      || ((hp->cth_frame_preamble.ctfp_flags | all_flags)
+	  != all_flags))
+    return 0;
+
+  /* Check offsets are valid.  */
+  if (hp->cth_fdeoff > hp->cth_freoff)
+    return 0;
+
+  return 1;
+}
+
+/* Flip the start address pointed to by FP.  */
+
+static void
+flip_fre_start_address (char *fp, size_t addr_size)
+{
+  void *start = (void*)fp;
+  if (addr_size == CTF_FRAME_FRE_OFFSET_2B)
+    {
+      unsigned short *start_addr = (unsigned short *)(start);
+      swap_thing (*start_addr);
+    }
+  else if (addr_size == CTF_FRAME_FRE_OFFSET_4B)
+    {
+      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 == CTF_FRAME_FRE_OFFSET_2B)
+    {
+      unsigned short *ust = (unsigned short *)offsets;
+      for (j = offset_cnt; j > 0; ust++, j--)
+	swap_thing (*ust);
+    }
+  else if (offset_size == CTF_FRAME_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
+ctf_fre_start_addr_size (unsigned int fre_type)
+{
+  size_t addr_size = 0;
+  switch (fre_type)
+    {
+    case CTF_FRAME_ROW_ENTRY_TYPE_ADDR1:
+      addr_size = 1;
+      break;
+    case CTF_FRAME_ROW_ENTRY_TYPE_ADDR2:
+      addr_size = 2;
+      break;
+    case CTF_FRAME_ROW_ENTRY_TYPE_ADDR4:
+      addr_size = 4;
+      break;
+    default:
+      /* No other value is expected.  */
+      ctf_frame_assert (0);
+      break;
+    }
+  return addr_size;
+}
+
+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 fre_info_size = 0;
+  size_t stack_offsets_size = 0;
+  int err = 0;
+
+  if (fre_size == NULL)
+    return ctf_frame_set_errno (&err, EINVAL);
+
+  flip_fre_start_address (fp, fre_type);
+
+  /* Advance the buffer pointer to where the FRE info is.  */
+  fp += ctf_fre_start_addr_size (fre_type);
+
+  /* FRE info is unsigned char.  No need to flip.  */
+  fre_info = *(unsigned char*)fp;
+  offset_size = ctf_frame_fre_get_offset_size (fre_info);
+  offset_cnt = ctf_frame_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);
+  stack_offsets_size = offset_size * offset_cnt;
+
+  *fre_size = ctf_fre_start_addr_size (fre_type) + fre_info_size + stack_offsets_size;
+
+  return 0;
+}
+
+/* Check if the FREP has valid data.  */
+
+static int
+ctf_fre_sanity_check_p (ctf_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 = ctf_frame_fre_get_offset_size (fre_info);
+
+  if (offset_size != CTF_FRAME_FRE_OFFSET_1B
+      && offset_size != CTF_FRAME_FRE_OFFSET_2B
+      && offset_size != CTF_FRAME_FRE_OFFSET_4B)
+    return 0;
+
+  offset_cnt = ctf_frame_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
+ctf_fre_offset_bytes_size (unsigned char fre_info)
+{
+  unsigned int offset_size, offset_cnt;
+
+  offset_size = ctf_frame_fre_get_offset_size (fre_info);
+
+  debug_printf("offset_size =  %u\n", offset_size);
+
+  offset_cnt = ctf_frame_fre_get_offset_count (fre_info);
+
+  if (offset_size == CTF_FRAME_FRE_OFFSET_2B
+      || offset_size == CTF_FRAME_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
+ctf_fre_entry_size (ctf_frame_row_entry *frep, unsigned int fre_type)
+{
+  if (frep == NULL)
+    return 0;
+
+  unsigned char fre_info = frep->fre_info;
+  size_t addr_size = ctf_fre_start_addr_size (fre_type);
+
+  return (addr_size + sizeof (frep->fre_info)
+	  + ctf_fre_offset_bytes_size (fre_info));
+}
+
+/* Endian flip the contents of FRAME_BUF of size BUF_SIZE.
+   The CTF frame header in the FRAME_BUF must be endian flipped prior to
+   calling flip_ctf_frame.  If an error code is returned, the buffer should
+   not be used.  */
+
+static int
+flip_ctf_frame (char *frame_buf, size_t buf_size)
+{
+  unsigned int i, j, prev_frep_index;
+  ctf_frame_header *ihp;
+  char *fdes;
+  char *fp = NULL;
+  ctf_frame_func_desc_entry *fdep;
+  unsigned int num_fdes, num_fres;
+  unsigned int fre_type;
+  size_t esz;
+  int err = 0;
+
+  /* Header must have been flipped by now.  */
+  ihp = (ctf_frame_header *)frame_buf;
+
+  if (!ctf_frame_header_sanity_check_p (ihp))
+    return ctf_frame_set_errno (&err, ECTF_FRAME_BUF_INVAL);
+
+  /* The contents of the CTF frame header are safe to read.  Get the number of
+     FDEs and the first FDE in the buffer.  */
+  num_fdes = ihp->cth_num_fdes;
+  fdes = frame_buf + sizeof (ctf_frame_header) + ihp->cth_fdeoff;
+  fdep = (ctf_frame_func_desc_entry *)fdes;
+
+  j = 0;
+  for (i = 0; i < num_fdes; fdep++, i++)
+    {
+      if (!flip_fde (fdep))
+	goto bad;
+
+      num_fres = fdep->ctf_func_num_fres;
+      fre_type = ctf_frame_get_fre_type (fdep);
+
+      fp = frame_buf + sizeof (ctf_frame_header) + ihp->cth_freoff;
+      fp += fdep->ctf_func_start_fre_off;
+      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->cth_num_fres)
+    goto bad;
+  /* All contents must have been processed by now.  */
+  if ((frame_buf + buf_size) != (void*)fp)
+    goto bad;
+
+  /* Success.  */
+  return 0;
+bad:
+  return CTF_FRAME_ERR;
+}
+
+/* The CTF Frame Decoder.  */
+
+/* Compare function for qsort'ing the FDE table. */
+
+static int
+fde_func (const void *p1, const void *p2)
+{
+  const ctf_frame_func_desc_entry *aa = p1;
+  const ctf_frame_func_desc_entry *bb = p2;
+
+  if (aa->ctf_func_start_address < bb->ctf_func_start_address)
+    return -1;
+  else if (aa->ctf_func_start_address > bb->ctf_func_start_address)
+    return 1;
+  return 0;
+}
+
+/* Get IDX'th offset from FRE.  Set errp as applicable.  */
+
+static int32_t
+ctf_frame_get_fre_offset (ctf_frame_row_entry *fre, int idx, int *errp)
+{
+  int offset_cnt, offset_size;
+
+  if (fre == NULL || !ctf_fre_sanity_check_p (fre))
+    return ctf_frame_set_errno (errp, ECTF_FRAME_FRE_INVAL);
+
+  offset_cnt = ctf_frame_fre_get_offset_count (fre->fre_info);
+  offset_size = ctf_frame_fre_get_offset_size (fre->fre_info);
+
+  if (offset_cnt < idx + 1)
+    return ctf_frame_set_errno (errp, ECTF_FRAME_FREOFFSET_NOPRESENT);
+
+  if (errp)
+    *errp = 0; /* Offset Valid.  */
+
+  if (offset_size == CTF_FRAME_FRE_OFFSET_1B)
+    {
+      int8_t *sp = (int8_t *)fre->fre_offsets;
+      return sp[idx];
+    }
+  else if (offset_size == CTF_FRAME_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];
+    }
+}
+
+static void
+ctf_frame_decoder_free (ctf_frame_decoder_ctx *dctx)
+{
+  if (dctx != NULL)
+    {
+      if (dctx->cfd_funcdesc != NULL)
+	{
+	  free (dctx->cfd_funcdesc);
+	  dctx->cfd_funcdesc = NULL;
+	}
+      if (dctx->cfd_fres != NULL)
+	{
+	  free (dctx->cfd_fres);
+	  dctx->cfd_fres = NULL;
+	}
+      free (dctx);
+      dctx = NULL;
+    }
+}
+
+/* Get FDE function info given a FRE_TYPE.  */
+/* FIXME API for linker.  Revisit if its better placed somewhere else?  */
+
+unsigned char
+ctf_frame_fde_func_info (unsigned int fre_type)
+{
+  unsigned char func_info;
+  ctf_frame_assert (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR1
+		   || fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR2
+		   || fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR4);
+  func_info = CTF_FRAME_V1_FUNC_INFO (fre_type);
+  return func_info;
+}
+
+/* Gather the FRE type given the function size.  */
+/* FIXME API for linker.  Revisit if its better placed somewhere else?  */
+
+unsigned int
+ctf_frame_calc_fre_type (unsigned int func_size)
+{
+  unsigned int fre_type = 0;
+  if (func_size <= 0xff)
+    fre_type = CTF_FRAME_ROW_ENTRY_TYPE_ADDR1;
+  else if (func_size <= 0xffff)
+    fre_type = CTF_FRAME_ROW_ENTRY_TYPE_ADDR2;
+  else if (func_size <= 0xffffffff)
+    fre_type = CTF_FRAME_ROW_ENTRY_TYPE_ADDR4;
+  return fre_type;
+}
+
+/* Get the base reg id from the FRE info.  Set errp if failure.  */
+
+unsigned int
+ctf_frame_fre_get_base_reg_id (ctf_frame_row_entry *fre, int *errp)
+{
+  if (fre == NULL)
+    return ctf_frame_set_errno (errp, ECTF_FRAME_FRE_INVAL);
+
+  unsigned int fre_info = fre->fre_info;
+  return CTF_FRAME_V1_FRE_CFA_BASE_REG_ID(fre_info);
+}
+
+/* Get the CFA offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+ctf_frame_fre_get_cfa_offset (ctf_frame_row_entry *fre, int *errp)
+{
+  return ctf_frame_get_fre_offset (fre, CTF_FRAME_FRE_CFA_OFFSET_IDX, errp);
+}
+
+/* Get the FP offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+ctf_frame_fre_get_fp_offset (ctf_frame_row_entry *fre, int *errp)
+{
+  return ctf_frame_get_fre_offset (fre, CTF_FRAME_FRE_FP_OFFSET_IDX, errp);
+}
+
+/* Get the RA offset from the FRE.  If the offset is invalid, sets errp.  */
+
+int32_t
+ctf_frame_fre_get_ra_offset (ctf_frame_row_entry *fre, int *errp)
+{
+  return ctf_frame_get_fre_offset (fre, CTF_FRAME_FRE_RA_OFFSET_IDX, errp);
+}
+
+static int
+ctf_frame_row_entry_copy (ctf_frame_row_entry *dst, ctf_frame_row_entry *src)
+{
+  int err = 0;
+
+  if (dst == NULL || src == NULL)
+    return ctf_frame_set_errno (&err, EINVAL);
+
+  memcpy (dst, src, sizeof (ctf_frame_row_entry));
+  return 0;
+}
+
+static int
+ctf_frame_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 == CTF_FRAME_ROW_ENTRY_TYPE_ADDR1)
+    {
+      uint8_t *uc = (uint8_t *)fre_buf;
+      saddr = (uint32_t)*uc;
+    }
+  else if (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR2)
+    {
+      uint16_t *ust = (uint16_t *)fre_buf;
+      saddr = (uint32_t)*ust;
+    }
+  else if (fre_type == CTF_FRAME_ROW_ENTRY_TYPE_ADDR4)
+    {
+      uint32_t *uit = (uint32_t *)fre_buf;
+      saddr = (uint32_t)*uit;
+    }
+  else
+    return ctf_frame_set_errno (&err, EINVAL);
+
+  *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 CTF frame binary format.
+
+   Returns CTF_FRAME_ERR if failure.  */
+
+static int
+ctf_frame_decode_fre (const char *fre_buf, ctf_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 ctf_frame_set_errno (&err, EINVAL);
+
+  /* Copy over the FRE start address.  */
+  ctf_frame_decode_fre_start_address (fre_buf, &fre->fre_start_addr, fre_type);
+
+  addr_size = ctf_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.  */
+  ctf_frame_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 = ctf_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 = ctf_fre_entry_size (fre, fre_type);
+  ctf_frame_assert (fre_size == (addr_size + sizeof (fre->fre_info)
+				 + stack_offsets_sz));
+  *esz = fre_size;
+
+  return 0;
+}
+
+/* Decode the specified CTF Frame buffer CF_BUF of size CF_SIZE and return the
+   new CTF Frame decoder context.  Sets ERRP for the caller if any error.  */
+
+ctf_frame_decoder_ctx *
+ctf_frame_decode (const char *cf_buf, size_t cf_size, int *errp)
+{
+  const ctf_frame_preamble *cfpp;
+  size_t hdrsz = sizeof (ctf_frame_header);
+  ctf_frame_header *cfhp;
+  ctf_frame_decoder_ctx *dctx;
+  char *frame_buf;
+  char *tempbuf = NULL;
+
+  int fidx_size;
+  uint32_t fre_bytes;
+  int foreign_endian = 0;
+
+  ctf_frame_init_debug ();
+
+  if ((cf_buf == NULL) || (!cf_size))
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_INVAL);
+  else if (cf_size < hdrsz)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_BUF_INVAL);
+
+  cfpp = (const ctf_frame_preamble *) cf_buf;
+
+  debug_printf ("ctf_frame_decode: magic=0x%x version=%u flags=%u\n",
+	        cfpp->ctfp_magic, cfpp->ctfp_version, cfpp->ctfp_flags);
+
+  /* Check for foreign endianness.  */
+  if (cfpp->ctfp_magic != CTF_FRAME_MAGIC)
+    {
+      if (cfpp->ctfp_magic == bswap_16 (CTF_FRAME_MAGIC))
+	foreign_endian = 1;
+      else
+	return ctf_frame_ret_set_errno (errp, ECTF_FRAME_BUF_INVAL);
+    }
+
+  /* Initialize a new decoder context.  */
+  if ((dctx = malloc (sizeof (ctf_frame_decoder_ctx))) == NULL)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+  memset (dctx, 0, sizeof (ctf_frame_decoder_ctx));
+
+  if (foreign_endian)
+    {
+      /* Allocate a new buffer and initialize it.  */
+      tempbuf = malloc (sizeof (cf_size * sizeof (char)));
+      if (tempbuf == NULL)
+	return ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+      memcpy (tempbuf, cf_buf, cf_size);
+
+      /* Flip the header.  */
+      ctf_frame_header *ihp = (ctf_frame_header *) tempbuf;
+      flip_header (ihp);
+      /* Flip the rest of the CTF frame section data buffer.  */
+      if (flip_ctf_frame (tempbuf, cf_size))
+	{
+	  free (tempbuf);
+	  return ctf_frame_ret_set_errno (errp, ECTF_FRAME_BUF_INVAL);
+	}
+      frame_buf = tempbuf;
+    }
+  else
+    frame_buf = (char *)cf_buf;
+
+  /* Handle the CTF header.  */
+  dctx->cfd_header = *(ctf_frame_header *) frame_buf;
+  /* Validate the contents of CTF header.  */
+  cfhp = &dctx->cfd_header;
+  if (!ctf_frame_header_sanity_check_p (cfhp))
+    {
+      ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  frame_buf += hdrsz;
+
+  /* Handle the CTF function descriptor entries section.  */
+  fidx_size = cfhp->cth_num_fdes *
+	      sizeof (ctf_frame_func_desc_entry);
+  dctx->cfd_funcdesc = malloc (fidx_size);
+  if (dctx->cfd_funcdesc == NULL)
+    {
+      ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  memcpy (dctx->cfd_funcdesc, frame_buf, fidx_size);
+
+  debug_printf ("%u total fidx size\n", fidx_size);
+
+  frame_buf += (fidx_size);
+
+  /* Handle the CTF frame row entry section.  */
+  dctx->cfd_fres = malloc (cfhp->cth_fre_len);
+  if (dctx->cfd_fres == NULL)
+    {
+      ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+      goto decode_fail_free;
+    }
+  memcpy (dctx->cfd_fres, frame_buf, cfhp->cth_fre_len);
+
+  fre_bytes = cfhp->cth_fre_len;
+  dctx->cfd_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);
+  ctf_frame_decoder_free (dctx);
+  dctx = NULL;
+  return dctx;
+}
+
+/* Free the decoder context.  */
+
+void
+ctf_free_decoder (ctf_frame_decoder_ctx *decoder)
+{
+  if (decoder != NULL)
+    {
+      free (decoder->cfd_fres);
+      free (decoder->cfd_funcdesc);
+      free (decoder);
+    }
+}
+
+/* Get DECODER's CTF Frame header.  */
+
+static ctf_frame_header *
+ctf_frame_decoder_get_header (ctf_frame_decoder_ctx *decoder)
+{
+  ctf_frame_header *hp = NULL;
+  if (decoder != NULL)
+    hp = &decoder->cfd_header;
+  return hp;
+}
+
+/* Get the CTF Frame's abi/arch info.  */
+
+unsigned char
+ctf_frame_decoder_get_abi_arch (ctf_frame_decoder_ctx *ctx)
+{
+  ctf_frame_header *ctff_header;
+  ctff_header = ctf_frame_decoder_get_header (ctx);
+  return ctff_header->cth_frame_abi_arch;
+}
+
+/* Find the function descriptor entry starting which contains the specified
+   address ADDR.  */
+
+ctf_frame_func_desc_entry *
+ctf_frame_get_funcdesc_with_addr (ctf_frame_decoder_ctx *ctx,
+				  int32_t addr, int *errp)
+{
+  ctf_frame_header *dhp;
+  ctf_frame_func_desc_entry *fdp;
+  int low, high, cnt;
+
+  if (ctx == NULL)
+    return ctf_frame_ret_set_errno (errp, EINVAL);
+
+  dhp = ctf_frame_decoder_get_header (ctx);
+
+  if (dhp == NULL || dhp->cth_num_fdes == 0 || ctx->cfd_funcdesc == NULL)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_DCTX_INVAL);
+  /* If the FDE sub-section is not sorted on PCs,  it is OK to do it now.
+     This allows the usage of binary search later below.  */
+  if ((dhp->cth_frame_preamble.ctfp_flags & CTF_FRAME_F_FDE_SORTED) == 0)
+    {
+      /* Sort the FDE table */
+      qsort (ctx->cfd_funcdesc, dhp->cth_num_fdes,
+	     sizeof (ctf_frame_func_desc_entry), fde_func);
+      dhp->cth_frame_preamble.ctfp_flags |= CTF_FRAME_F_FDE_SORTED;
+    }
+
+  /* Do the binary search.  */
+  fdp = (ctf_frame_func_desc_entry *) ctx->cfd_funcdesc;
+  low = 0;
+  high = dhp->cth_num_fdes;
+  cnt = high;
+  while (low <= high)
+    {
+      int mid = low + (high - low) / 2;
+
+      if (fdp[mid].ctf_func_start_address == addr)
+	return fdp + mid;
+
+      if (fdp[mid].ctf_func_start_address < addr)
+	{
+	  if (mid == (cnt - 1)) 	/* Check if it's the last one.  */
+	    return fdp + (cnt - 1) ;
+	  else if (fdp[mid+1].ctf_func_start_address > addr)
+	    return fdp + mid;
+	  low = mid + 1;
+	}
+      else
+	high = mid - 1;
+    }
+
+  return ctf_frame_ret_set_errno (errp, ECTF_FRAME_FDE_NOTFOUND);
+}
+
+/* Find the CTF frame row entry which contains the PC.  Returns
+   CTF_FRAME_ERR if failure.  */
+
+int
+ctf_frame_find_fre (ctf_frame_decoder_ctx *ctx, int32_t pc,
+		    ctf_frame_row_entry *frep)
+{
+  ctf_frame_func_desc_entry *fdep;
+  uint32_t start_address, i;
+  ctf_frame_row_entry cur_fre, next_fre;
+  unsigned char *sp;
+  unsigned int fre_type;
+  size_t esz;
+  int err = 0;
+
+  if ((ctx == NULL) || (frep == NULL))
+    return ctf_frame_set_errno (&err, EINVAL);
+
+  /* Find the FDE which contains the PC, then scan its fre entries.  */
+  fdep = ctf_frame_get_funcdesc_with_addr (ctx, pc, &err);
+  if (fdep == NULL || ctx->cfd_fres == NULL)
+    return ctf_frame_set_errno (&err, ECTF_FRAME_DCTX_INVAL);
+
+  fre_type = ctf_frame_get_fre_type (fdep);
+  sp = (unsigned char *) ctx->cfd_fres + fdep->ctf_func_start_fre_off;
+  for (i = 0; i < fdep->ctf_func_num_fres; i++)
+   {
+     err = ctf_frame_decode_fre ((const char *)sp, &next_fre,
+				 fre_type, &esz);
+     start_address = next_fre.fre_start_addr;
+     if (fdep->ctf_func_start_address + (int32_t) start_address <= pc)
+       {
+	 ctf_frame_row_entry_copy (&cur_fre, &next_fre);
+
+	 sp += esz;
+	 err = ctf_frame_decode_fre ((const char*)sp, &next_fre,
+				     fre_type, &esz);
+
+	 if (!ctf_fre_sanity_check_p (&next_fre))
+	   return ctf_frame_set_errno (&err, ECTF_FRAME_FRE_INVAL);
+
+	 if ((fdep->ctf_func_start_address
+	      + (int32_t)next_fre.fre_start_addr) > pc)
+	   {
+	     ctf_frame_row_entry_copy (frep, &cur_fre);
+	     return 0;
+	   }
+       }
+     else
+       return ctf_frame_set_errno (&err, ECTF_FRAME_FRE_INVAL);
+   }
+  return ctf_frame_set_errno (&err, ECTF_FRAME_FDE_INVAL);
+}
+
+/* Return the number of function descriptor entries in the CTF frame decoder
+   DCTX.  */
+
+unsigned int
+ctf_frame_decoder_get_num_fidx (ctf_frame_decoder_ctx *ctx)
+{
+  unsigned int num_fdes = 0;
+  ctf_frame_header *dhp = NULL;
+  dhp = ctf_frame_decoder_get_header (ctx);
+  if (dhp)
+    num_fdes = dhp->cth_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
+   ctf_frame_func_desc_index_elem rather?  */
+
+int
+ctf_frame_decoder_get_funcdesc (ctf_frame_decoder_ctx *ctx,
+				unsigned int i,
+				uint32_t *num_fres,
+				uint32_t *func_size,
+				int32_t *func_start_address,
+				unsigned char *func_info)
+{
+  ctf_frame_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 ctf_frame_set_errno (&err, EINVAL);
+
+  num_fdes = ctf_frame_decoder_get_num_fidx (ctx);
+  if (num_fdes == 0
+      || i >= num_fdes
+      || ctx->cfd_funcdesc == NULL)
+    return ctf_frame_set_errno (&err, ECTF_FRAME_DCTX_INVAL);
+
+  fdp = (ctf_frame_func_desc_entry *) ctx->cfd_funcdesc + i;
+  *num_fres = fdp->ctf_func_num_fres;
+  *func_start_address = fdp->ctf_func_start_address;
+  *func_size = fdp->ctf_func_size;
+  *func_info = fdp->ctf_func_info;
+
+  return 0;
+}
+
+/* Get the function descriptor entry at index FUNC_IDX in the decoder
+   context CTX.  */
+
+static ctf_frame_func_desc_entry *
+ctf_frame_decoder_get_funcdesc_at_index (ctf_frame_decoder_ctx *ctx,
+					 uint32_t func_idx)
+{
+  /* Invalid argument.  No FDE will be found.  */
+  if (func_idx >= ctf_frame_decoder_get_num_fidx (ctx))
+    return NULL;
+
+  ctf_frame_func_desc_entry *fdep;
+  fdep = (ctf_frame_func_desc_entry *) ctx->cfd_funcdesc;
+  return fdep + func_idx;
+}
+
+/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
+   descriptor entry in the CTF frame decoder CTX.  Returns error code as
+   applicable.  */
+
+int
+ctf_frame_decoder_get_fre (ctf_frame_decoder_ctx *ctx,
+			   unsigned int func_idx,
+			   unsigned int fre_idx,
+			   ctf_frame_row_entry *fre)
+{
+  ctf_frame_func_desc_entry *fdep;
+  ctf_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 ctf_frame_set_errno (&err, EINVAL);
+
+  /* Get function descriptor entry at index func_idx.  */
+  fdep = ctf_frame_decoder_get_funcdesc_at_index (ctx, func_idx);
+
+  if (fdep == NULL)
+    return ctf_frame_set_errno (&err, ECTF_FRAME_FDE_NOTFOUND);
+
+  fre_type = ctf_frame_get_fre_type (fdep);
+  /* Now scan the FRE entries.  */
+  sp = (unsigned char *) ctx->cfd_fres + fdep->ctf_func_start_fre_off;
+  for (i = 0; i < fdep->ctf_func_num_fres; i++)
+   {
+     /* Decode the FRE at the current position.  Return it if valid.  */
+     err = ctf_frame_decode_fre ((const char *)sp, &ifre, fre_type, &esz);
+     if (i == fre_idx)
+       {
+	 if (!ctf_fre_sanity_check_p (&ifre))
+	   return ctf_frame_set_errno (&err, ECTF_FRAME_FRE_INVAL);
+
+	 ctf_frame_row_entry_copy (fre, &ifre);
+	 ctf_frame_assert (fre->fre_start_addr < fdep->ctf_func_size);
+	 return 0;
+       }
+     /* Next FRE.  */
+     sp += esz;
+   }
+
+  return ctf_frame_set_errno (&err, ECTF_FRAME_FDE_NOTFOUND);
+}
+
+
+/* CTF Frame Encoder.  */
+
+/* Get a reference to the ENCODER's CTF Frame header.  */
+
+static ctf_frame_header *
+ctf_frame_encoder_get_header (ctf_frame_encoder_ctx *encoder)
+{
+  ctf_frame_header *hp = NULL;
+  if (encoder)
+    hp = &encoder->cfe_header;
+  return hp;
+}
+
+static ctf_frame_func_desc_entry *
+ctf_frame_encoder_get_funcdesc_at_index (ctf_frame_encoder_ctx *encoder,
+					 uint32_t func_idx)
+{
+  ctf_frame_func_desc_entry *fde = NULL;
+  if (func_idx < ctf_frame_encoder_get_num_fidx (encoder))
+    {
+      cf_funidx_tbl *func_tbl = (cf_funidx_tbl *) encoder->cfe_funcdesc;
+      fde = func_tbl->entry + func_idx;
+    }
+  return fde;
+}
+
+/* Create an encoder context with the given CTF format version VER, FLAGS and
+   ABI information.  Sets errp if failure.  */
+
+ctf_frame_encoder_ctx *
+ctf_frame_encode (unsigned char ver, unsigned char flags, int abi_arch,
+		  int *errp)
+{
+  ctf_frame_header *hp;
+  ctf_frame_encoder_ctx *fp;
+
+  if (ver != CTF_FRAME_VERSION)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_VERSION_INVAL);
+
+  if ((fp = malloc (sizeof (ctf_frame_encoder_ctx))) == NULL)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+
+  memset (fp, 0, sizeof (ctf_frame_encoder_ctx));
+
+  /* Get the CTF header and update it.  */
+  hp = ctf_frame_encoder_get_header (fp);
+  hp->cth_frame_preamble.ctfp_version = ver;
+  hp->cth_frame_preamble.ctfp_magic = CTF_FRAME_MAGIC;
+  hp->cth_frame_preamble.ctfp_flags = flags;
+  hp->cth_frame_abi_arch = abi_arch;
+
+  return fp;
+}
+
+/* Free the encoder context.  */
+
+void
+ctf_free_encoder (ctf_frame_encoder_ctx *encoder)
+{
+  if (encoder != NULL)
+    {
+      free (encoder->cfe_funcdesc);
+      free (encoder->cfe_fres);
+      free (encoder->cfe_data);
+      free (encoder);
+    }
+}
+
+/* Get the abi/arch info from the CTF frame encoder context ENCODER.  */
+
+unsigned char
+ctf_frame_encoder_get_abi_arch (ctf_frame_encoder_ctx *encoder)
+{
+  unsigned char abi_arch = 0;
+  ctf_frame_header *ehp;
+  ehp = ctf_frame_encoder_get_header (encoder);
+  if (ehp)
+    abi_arch = ehp->cth_frame_abi_arch;
+  return abi_arch;
+}
+
+/* Return the number of function descriptor entries in the CTF frame encoder
+   ENCODER.  */
+
+unsigned int
+ctf_frame_encoder_get_num_fidx (ctf_frame_encoder_ctx *encoder)
+{
+  unsigned int num_fdes = 0;
+  ctf_frame_header *ehp = NULL;
+  ehp = ctf_frame_encoder_get_header (encoder);
+  if (ehp)
+    num_fdes = ehp->cth_num_fdes;
+  return num_fdes;
+}
+
+/* Add an FRE to function at FUNC_IDX'th function descriptor entry in
+   the encoder context.  */
+
+int
+ctf_frame_encoder_add_fre (ctf_frame_encoder_ctx *encoder,
+			   unsigned int func_idx,
+			   ctf_frame_row_entry *frep)
+{
+  ctf_frame_header *ehp;
+  ctf_frame_func_desc_entry *fdep;
+  ctf_frame_row_entry *ectx_frep;
+  size_t offsets_sz, esz;
+  unsigned int fre_type;
+  int err = 0;
+
+  if (encoder == NULL || frep == NULL)
+    return ctf_frame_set_errno (&err, EINVAL);
+  if (!ctf_fre_sanity_check_p (frep))
+    return ctf_frame_set_errno (&err, ECTF_FRAME_FRE_INVAL);
+
+  /* Use func_idx to gather the function descriptor entry.  */
+  fdep = ctf_frame_encoder_get_funcdesc_at_index (encoder, func_idx);
+
+  if (fdep == NULL)
+    return ctf_frame_set_errno (&err, ECTF_FRAME_FDE_NOTFOUND);
+
+  fre_type = ctf_frame_get_fre_type (fdep);
+  cf_fre_tbl *fd_info = (cf_fre_tbl *) encoder->cfe_fres;
+
+  if (fd_info == NULL)
+    {
+      fd_info = malloc (sizeof (cf_fre_tbl) +
+			number_of_entries * sizeof (ctf_frame_row_entry));
+      if (fd_info == NULL)
+	{
+	  ctf_frame_set_errno (&err, ECTF_FRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+      memset (fd_info, 0, sizeof (cf_fre_tbl) + number_of_entries *
+	      sizeof (ctf_frame_row_entry));
+      fd_info->alloced = number_of_entries;
+    }
+  else if (fd_info->count == fd_info->alloced)
+    {
+      fd_info = realloc (fd_info, sizeof (cf_fre_tbl) +
+			(fd_info->alloced + number_of_entries) *
+			sizeof (ctf_frame_row_entry));
+      if (fd_info == NULL)
+	{
+	  ctf_frame_set_errno (&err, ECTF_FRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+
+      memset (&fd_info->entry[fd_info->alloced], 0,
+	      number_of_entries * sizeof (ctf_frame_row_entry));
+      fd_info->alloced += number_of_entries;
+    }
+
+  ectx_frep = &fd_info->entry[fd_info->count];
+  ectx_frep->fre_start_addr
+    = frep->fre_start_addr;
+  ectx_frep->fre_info = frep->fre_info;
+
+  ctf_frame_assert (frep->fre_start_addr < fdep->ctf_func_size);
+
+  /* frep has already been sanity check'd.  Get offsets size.  */
+  offsets_sz = ctf_fre_offset_bytes_size (frep->fre_info);
+  memcpy (&ectx_frep->fre_offsets, &frep->fre_offsets, offsets_sz);
+
+  esz = ctf_fre_entry_size (frep, fre_type);
+  fd_info->count++;
+
+  encoder->cfe_fres = (void *) fd_info;
+  encoder->cfe_fre_nbytes += esz;
+
+  ehp = ctf_frame_encoder_get_header (encoder);
+  ehp->cth_num_fres = fd_info->count;
+
+  /* Update the value of the number of FREs for the function.  */
+  fdep->ctf_func_num_fres++;
+
+  return 0;
+
+bad:
+  if (fd_info != NULL)
+    free (fd_info);
+  encoder->cfe_fres = NULL;
+  encoder->cfe_fre_nbytes = 0;
+  return -1;
+}
+
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE and NUM_FRES
+   to the encoder.  */
+
+int
+ctf_frame_encoder_add_funcdesc (ctf_frame_encoder_ctx *encoder,
+			      int32_t start_addr,
+			      uint32_t func_size,
+			      unsigned char func_info,
+			      uint32_t num_fres __attribute__ ((unused)))
+{
+  ctf_frame_header *ehp;
+  cf_funidx_tbl *fd_info;
+  int err = 0;
+
+  /* FIXME book-keep num_fres for error checking.  */
+  if (encoder == NULL)
+    return ctf_frame_set_errno (&err, EINVAL);
+
+  fd_info = (cf_funidx_tbl *) encoder->cfe_funcdesc;
+  ehp = ctf_frame_encoder_get_header (encoder);
+
+  if (fd_info == NULL)
+    {
+      fd_info = malloc (sizeof (cf_funidx_tbl) +
+			number_of_entries *
+			sizeof (ctf_frame_func_desc_entry));
+      if (fd_info == NULL)
+	{
+	  ctf_frame_set_errno (&err, ECTF_FRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+      memset (fd_info, 0, sizeof (cf_funidx_tbl)+ number_of_entries *
+	      sizeof (ctf_frame_func_desc_entry));
+      fd_info->alloced = number_of_entries;
+    }
+  else if (fd_info->count == fd_info->alloced)
+    {
+      fd_info = realloc (fd_info, sizeof (cf_funidx_tbl)
+			+ (fd_info->alloced + number_of_entries)
+			* sizeof (ctf_frame_func_desc_entry));
+      if (fd_info == NULL)
+	{
+	  ctf_frame_set_errno (&err, ECTF_FRAME_NOMEM);
+	  goto bad;		/* OOM.  */
+	}
+
+      memset (&fd_info->entry[fd_info->alloced], 0,
+	      number_of_entries * sizeof (ctf_frame_func_desc_entry));
+      fd_info->alloced += number_of_entries;
+    }
+
+  fd_info->entry[fd_info->count].ctf_func_start_address = start_addr;
+  /* Num FREs is updated as FREs are added for the function later via
+     ctf_frame_encoder_add_fre.  */
+  fd_info->entry[fd_info->count].ctf_func_size = func_size;
+  fd_info->entry[fd_info->count].ctf_func_start_fre_off
+    = encoder->cfe_fre_nbytes;
+#if 0
+  // Linker optimization test code cleanup later ibhagat TODO FIXME
+  unsigned int fre_type = ctf_frame_calc_fre_type (func_size);
+
+  fd_info->entry[fd_info->count].ctf_func_info
+    = ctf_frame_fde_func_info (fre_type);
+#endif
+  fd_info->entry[fd_info->count].ctf_func_info = func_info;
+  fd_info->count++;
+  encoder->cfe_funcdesc = (void *) fd_info;
+  ehp->cth_num_fdes++;
+  return 0;
+
+bad:
+  if (fd_info != NULL)
+    free (fd_info);
+  encoder->cfe_funcdesc = NULL;
+  ehp->cth_num_fdes = 0;
+  return -1;
+}
+
+static int
+ctf_frame_sort_funcdesc (ctf_frame_encoder_ctx *encoder)
+{
+  ctf_frame_header *ehp;
+
+  ehp = ctf_frame_encoder_get_header (encoder);
+  /* Sort and write out the FDE table */
+  cf_funidx_tbl *fd_info = (cf_funidx_tbl *) encoder->cfe_funcdesc;
+  if (fd_info)
+    {
+      qsort (fd_info->entry, fd_info->count,
+	     sizeof (ctf_frame_func_desc_entry), fde_func);
+      /* Update preamble's flags.  */
+      ehp->cth_frame_preamble.ctfp_flags |= CTF_FRAME_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 CTF frame binary format.
+
+   Returns CTF_FRAME_ERR if failure.  */
+
+static int
+ctf_frame_encoder_write_fre (char *contents, ctf_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 (!ctf_fre_sanity_check_p (frep))
+    return ctf_frame_set_errno (&err, ECTF_FRAME_FRE_INVAL);
+
+  fre_start_addr_sz = ctf_fre_start_addr_size (fre_type);
+  fre_stack_offsets_sz = ctf_fre_offset_bytes_size (frep->fre_info);
+
+  /* The FRE start address must be encodable in the available number of bytes.
+     CTF_FRAME_ROW_ENTRY_TYPE_ADDR1 => 1 byte => [ bitmask = 0xff ]
+     CTF_FRAME_ROW_ENTRY_TYPE_ADDR2 => 2 byte => [ bitmask = 0xffff ]
+     CTF_FRAME_ROW_ENTRY_TYPE_ADDR4 => 4 byte => [ bitmask = 0xffffffff ].  */
+  uint64_t bitmask = ((uint64_t)1 << (fre_start_addr_sz*8)) - 1;
+  ctf_frame_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 = ctf_fre_entry_size (frep, fre_type);
+  /* Sanity checking.  */
+  ctf_frame_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 CTF frame section and write out to the
+   output buffer held in the ENCODER.  Return CTF_FRAME_ERR if failure.  */
+
+static int
+ctf_frame_encoder_write_ctf_frame (ctf_frame_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;
+  ctf_frame_header *ehp;
+  unsigned char flags;
+  cf_funidx_tbl *fd_info;
+  cf_fre_tbl *fr_info;
+  uint32_t i, num_fdes;
+  uint32_t j, num_fres;
+  ctf_frame_func_desc_entry *fdep;
+  ctf_frame_row_entry *frep;
+
+  unsigned int fre_type;
+  int err = 0;
+
+  contents = encoder->cfe_data;
+  buf_size = encoder->cfe_data_size;
+  hdr_size = sizeof (ctf_frame_header);
+  num_fdes = ctf_frame_encoder_get_num_fidx (encoder);
+  all_fdes_size = num_fdes * sizeof(ctf_frame_func_desc_entry);
+  ehp = ctf_frame_encoder_get_header (encoder);
+
+  fd_info = (cf_funidx_tbl *) encoder->cfe_funcdesc;
+  fr_info = (cf_fre_tbl *) encoder->cfe_fres;
+
+  /* Sanity checks:
+     - buffers must be malloc'd by the caller.  */
+  if ((contents == NULL) || (buf_size < hdr_size))
+    return ctf_frame_set_errno (&err, ECTF_FRAME_BUF_INVAL);
+  if (fr_info == NULL)
+    return ctf_frame_set_errno (&err, ECTF_FRAME_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 CTF frame'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 = ctf_frame_get_fre_type (fdep);
+      num_fres = fdep->ctf_func_num_fres;
+
+      for (j = 0; j < num_fres; j++)
+	{
+	  fre_index = global + j;
+	  frep = &fr_info->entry[fre_index];
+
+	  ctf_frame_encoder_write_fre (contents, frep, fre_type, &esz);
+	  contents += esz;
+	  fre_size += esz; /* For debugging only.  */
+	}
+      global += j;
+    }
+
+  ctf_frame_assert (fre_size == ehp->cth_fre_len);
+  ctf_frame_assert (global == ehp->cth_num_fres);
+  ctf_frame_assert ((size_t)(contents - encoder->cfe_data) == buf_size);
+
+  /* Sort the FDE table */
+  ctf_frame_sort_funcdesc (encoder);
+
+  /* Sanity checks:
+     - the FDE section must have been sorted by now on the start address
+     of each function.  */
+  flags = ehp->cth_frame_preamble.ctfp_flags;
+  if (!(flags & CTF_FRAME_F_FDE_SORTED)
+      || (fd_info == NULL))
+    return ctf_frame_set_errno (&err, ECTF_FRAME_FDE_INVAL);
+
+  contents = encoder->cfe_data;
+  /* Write out the CTF frame header.  The CTF frame 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 *
+ctf_frame_write_encoder (ctf_frame_encoder_ctx *encoder,
+			 size_t *encoded_size, int *errp)
+{
+  ctf_frame_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->cfe_data is the responsibility of the caller.  */
+  *encoded_size = 0;
+
+  if (encoder == NULL || encoded_size == NULL || errp == NULL)
+    return ctf_frame_ret_set_errno (errp, EINVAL);
+
+  hdrsize = sizeof (ctf_frame_header);
+  fsz = ctf_frame_encoder_get_num_fidx (encoder)
+    * sizeof(ctf_frame_func_desc_entry);
+  fresz = encoder->cfe_fre_nbytes;
+
+  /* The total size of buffer is the sum of header, function descriptor
+     entries section and the FREs. */
+  bufsize = hdrsize + fsz + fresz;
+  encoder->cfe_data = (char *) malloc (bufsize);
+  if (encoder->cfe_data == NULL)
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_NOMEM);
+  encoder->cfe_data_size = bufsize;
+
+  /* Update the header information.  */
+  ehp = ctf_frame_encoder_get_header (encoder);
+  /* CTF FDE section follows immediately after the header.  */
+  ehp->cth_fdeoff = 0;
+  /* CTF FRE section follows immediately after the CTF FDE section.  */
+  ehp->cth_freoff = fsz;
+  ehp->cth_fre_len = fresz;
+  /* FIXME - cth_cfa_fixed_fp_offset cth_cfa_fixed_ra_offset?? */
+
+  foreign_endian = need_swapping (ehp->cth_frame_abi_arch);
+
+  /* Write out the FDE Index and the FRE table */
+  if (ctf_frame_encoder_write_ctf_frame (encoder))
+    return ctf_frame_ret_set_errno (errp, ECTF_FRAME_BUF_INVAL);
+
+  /* Endian flip the contents if necessary.  */
+  if (foreign_endian)
+    {
+      flip_header ((ctf_frame_header*)encoder->cfe_data);
+      if (flip_ctf_frame (encoder->cfe_data, bufsize))
+	return ctf_frame_ret_set_errno (errp, ECTF_FRAME_BUF_INVAL);
+    }
+
+  *encoded_size = bufsize;
+  return encoder->cfe_data;
+}
-- 
2.31.1


             reply	other threads:[~2022-05-09 17:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-09 17:41 Indu Bhagat [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-05-07  0:52 [PATCH,RFC 0/7] Definition and Implementation of CTF Frame format Indu Bhagat
     [not found] ` <20220507005223.3093035-4-indu.bhagat@oracle.com>
2022-05-08 22:00   ` [PATCH,RFC 3/7] libctfframe: add the CTF Frame library Indu Bhagat
2022-05-17 13:44     ` Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220509174127.3905875-1-indu.bhagat@oracle.com \
    --to=indu.bhagat@oracle.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).