EXTRA_DIST = libtool-version libsframe.ver
diststuff: $(EXTRA_DIST) info
-if HAVE_SFRAME_AS
- libsframebt_la_SOURCES = sframe-backtrace.c sframe-backtrace-err.c
- libsframebt_la_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../include
- libsframebt_la_CFLAGS = -Wa,--gsframe
-if INSTALL_LIBBFD
- lib_LTLIBRARIES += libsframebt.la
- include_HEADERS += $(INCDIR)/sframe-backtrace-api.h
-else
- noinst_LTLIBRARIES += libsframebt.la
-endif
-endif
-
include doc/local.mk
include testsuite/local.mk
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_TRUE@am__append_1 = libsframebt.la
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_TRUE@am__append_2 = $(INCDIR)/sframe-backtrace-api.h
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_FALSE@am__append_3 = libsframebt.la
-@BUILD_INFO_TRUE@am__append_4 = doc/sframe-spec.texi
-@BUILD_INFO_TRUE@am__append_5 = texput.log
-@BUILD_INFO_TRUE@am__append_6 = doc/sframe-spec.info
+@BUILD_INFO_TRUE@am__append_1 = doc/sframe-spec.texi
+@BUILD_INFO_TRUE@am__append_2 = texput.log
+@BUILD_INFO_TRUE@am__append_3 = doc/sframe-spec.info
check_PROGRAMS = $(am__EXEEXT_1)
-@HAVE_COMPAT_DEJAGNU_TRUE@am__append_7 = testsuite/libsframe.decode/be-flipping \
+@HAVE_COMPAT_DEJAGNU_TRUE@am__append_4 = testsuite/libsframe.decode/be-flipping \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-1 \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-2 \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.encode/encode-1 \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1 \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfunc-1 \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-1
+@HAVE_DL_ITERATE_PHDR_TRUE@@HAVE_SFRAME_AS_TRUE@am__append_5 = testsuite/libsframe.stacktrace/libsframest/libsframest.la
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \
$(libsframe_la_LDFLAGS) $(LDFLAGS) -o $@
@INSTALL_LIBBFD_FALSE@am_libsframe_la_rpath =
@INSTALL_LIBBFD_TRUE@am_libsframe_la_rpath = -rpath $(libdir)
-libsframebt_la_LIBADD =
-am__libsframebt_la_SOURCES_DIST = sframe-backtrace.c \
- sframe-backtrace-err.c
-@HAVE_SFRAME_AS_TRUE@am_libsframebt_la_OBJECTS = \
-@HAVE_SFRAME_AS_TRUE@ libsframebt_la-sframe-backtrace.lo \
-@HAVE_SFRAME_AS_TRUE@ libsframebt_la-sframe-backtrace-err.lo
-libsframebt_la_OBJECTS = $(am_libsframebt_la_OBJECTS)
-libsframebt_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
- $(libsframebt_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
- $@
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_FALSE@am_libsframebt_la_rpath =
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_TRUE@am_libsframebt_la_rpath = \
-@HAVE_SFRAME_AS_TRUE@@INSTALL_LIBBFD_TRUE@ -rpath $(libdir)
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_DEPENDENCIES = \
+ ${top_builddir}/libsframe.la
+am__dirstamp = $(am__leading_dot)dirstamp
+am_testsuite_libsframe_stacktrace_libsframest_libsframest_la_OBJECTS = testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo \
+ testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo \
+ testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_OBJECTS = $(am_testsuite_libsframe_stacktrace_libsframest_libsframest_la_OBJECTS)
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_LINK = \
+ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+@HAVE_DL_ITERATE_PHDR_TRUE@@HAVE_SFRAME_AS_TRUE@am_testsuite_libsframe_stacktrace_libsframest_libsframest_la_rpath =
@HAVE_COMPAT_DEJAGNU_TRUE@am__EXEEXT_1 = testsuite/libsframe.decode/be-flipping$(EXEEXT) \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-1$(EXEEXT) \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.decode/frecnt-2$(EXEEXT) \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfre-1$(EXEEXT) \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/findfunc-1$(EXEEXT) \
@HAVE_COMPAT_DEJAGNU_TRUE@ testsuite/libsframe.find/plt-findfre-1$(EXEEXT)
-am__dirstamp = $(am__leading_dot)dirstamp
am_testsuite_libsframe_decode_be_flipping_OBJECTS = testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.$(OBJEXT)
testsuite_libsframe_decode_be_flipping_OBJECTS = \
$(am_testsuite_libsframe_decode_be_flipping_OBJECTS)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(libsframe_la_SOURCES) $(libsframebt_la_SOURCES) \
+SOURCES = $(libsframe_la_SOURCES) \
+ $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_SOURCES) \
$(testsuite_libsframe_decode_be_flipping_SOURCES) \
$(testsuite_libsframe_decode_frecnt_1_SOURCES) \
$(testsuite_libsframe_decode_frecnt_2_SOURCES) \
$(testsuite_libsframe_find_findfunc_1_SOURCES) \
$(testsuite_libsframe_find_plt_findfre_1_SOURCES)
DIST_SOURCES = $(libsframe_la_SOURCES) \
- $(am__libsframebt_la_SOURCES_DIST) \
+ $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_SOURCES) \
$(testsuite_libsframe_decode_be_flipping_SOURCES) \
$(testsuite_libsframe_decode_frecnt_1_SOURCES) \
$(testsuite_libsframe_decode_frecnt_2_SOURCES) \
PDFS = doc/sframe-spec.pdf
PSS = doc/sframe-spec.ps
HTMLS = doc/sframe-spec.html
-TEXINFOS = $(am__append_4)
+TEXINFOS = $(am__append_1)
TEXI2DVI = texi2dvi
TEXI2PDF = $(TEXI2DVI) --pdf --batch
MAKEINFOHTML = $(MAKEINFO) --html
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
-am__include_HEADERS_DIST = $(INCDIR)/sframe-backtrace-api.h \
- $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
+am__include_HEADERS_DIST = $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
HEADERS = $(include_HEADERS)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
$(LISP)config.h.in
$(srcdir)/testsuite/libsframe.decode/local.mk \
$(srcdir)/testsuite/libsframe.encode/local.mk \
$(srcdir)/testsuite/libsframe.find/local.mk \
+ $(srcdir)/testsuite/libsframe.stacktrace/libsframest/local.mk \
+ $(srcdir)/testsuite/libsframe.stacktrace/local.mk \
$(srcdir)/testsuite/local.mk $(top_srcdir)/../ar-lib \
$(top_srcdir)/../compile $(top_srcdir)/../config.guess \
$(top_srcdir)/../config.sub $(top_srcdir)/../depcomp \
AUTOMAKE_OPTIONS = dejagnu foreign no-texinfo.tex info-in-builddir subdir-objects
# Variables that we might accumulate conditionally or in subdirs.
-info_TEXINFOS = $(am__append_4)
-DISTCLEANFILES = $(am__append_5)
-MAINTAINERCLEANFILES = $(am__append_6)
+info_TEXINFOS = $(am__append_1)
+DISTCLEANFILES = $(am__append_2)
+MAINTAINERCLEANFILES = $(am__append_3)
INCDIR = $(srcdir)/../include
# include libctf for swap.h
AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../libctf
# not support symbol versioning, there is no need to fall back on libtool's
# -export-symbols option.
@HAVE_LD_VERSION_SCRIPT_TRUE@@HAVE_SOLARIS_LD_TRUE@libsframe_version_script = -Wl,-M -Wl,$(srcdir)/libsframe.ver
-@INSTALL_LIBBFD_TRUE@lib_LTLIBRARIES = libsframe.la $(am__append_1)
-@INSTALL_LIBBFD_FALSE@include_HEADERS = $(am__append_2)
-@INSTALL_LIBBFD_TRUE@include_HEADERS = $(INCDIR)/sframe.h \
-@INSTALL_LIBBFD_TRUE@ $(INCDIR)/sframe-api.h $(am__append_2)
-@INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libsframe.la \
-@INSTALL_LIBBFD_FALSE@ $(am__append_3)
+@INSTALL_LIBBFD_TRUE@lib_LTLIBRARIES = libsframe.la
+@INSTALL_LIBBFD_FALSE@include_HEADERS =
+@INSTALL_LIBBFD_TRUE@include_HEADERS = $(INCDIR)/sframe.h $(INCDIR)/sframe-api.h
+@INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libsframe.la
libsframe_la_SOURCES = sframe.c sframe-dump.c sframe-error.c
libsframe_la_CPPFLAGS = $(AM_CPPFLAGS)
libsframe_la_LDFLAGS = $(libsframe_version_info) $(libsframe_version_script)
EXTRA_DIST = libtool-version libsframe.ver
-@HAVE_SFRAME_AS_TRUE@libsframebt_la_SOURCES = sframe-backtrace.c sframe-backtrace-err.c
-@HAVE_SFRAME_AS_TRUE@libsframebt_la_CPPFLAGS = -I$(srcdir) -I$(srcdir)/../include
-@HAVE_SFRAME_AS_TRUE@libsframebt_la_CFLAGS = -Wa,--gsframe
@BUILD_INFO_TRUE@AM_MAKEINFOFLAGS = --no-split
# Setup the testing framework
testsuite_libsframe_find_plt_findfre_1_SOURCES = testsuite/libsframe.find/plt-findfre-1.c
testsuite_libsframe_find_plt_findfre_1_LDADD = ${top_builddir}/libsframe.la
testsuite_libsframe_find_plt_findfre_1_CPPFLAGS = -I${top_srcdir}/../include -Wall
+check_LTLIBRARIES = $(am__append_5)
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_SOURCES = testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c \
+ testsuite/libsframe.stacktrace/libsframest/sframe-state.c \
+ testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c
+
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_LIBADD = ${top_builddir}/libsframe.la
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS = -I${top_srcdir}/../include \
+ -I${top_srcdir}/testsuite/libsframe.stacktrace/libsframest/include \
+ -Wall -Wno-unused-but-set-variable
+
+testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS = -Wa,--gsframe
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
.SUFFIXES: .c .dvi .lo .o .obj .ps
am--refresh: Makefile
@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(srcdir)/testsuite/libsframe.stacktrace/local.mk $(srcdir)/testsuite/libsframe.stacktrace/libsframest/local.mk $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
-$(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(am__empty):
+$(srcdir)/doc/local.mk $(srcdir)/testsuite/local.mk $(srcdir)/testsuite/libsframe.decode/local.mk $(srcdir)/testsuite/libsframe.encode/local.mk $(srcdir)/testsuite/libsframe.find/local.mk $(srcdir)/testsuite/libsframe.stacktrace/local.mk $(srcdir)/testsuite/libsframe.stacktrace/libsframest/local.mk $(am__empty):
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
distclean-hdr:
-rm -f config.h stamp-h1
+clean-checkLTLIBRARIES:
+ -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES)
+ @list='$(check_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}; \
+ }
+
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
libsframe.la: $(libsframe_la_OBJECTS) $(libsframe_la_DEPENDENCIES) $(EXTRA_libsframe_la_DEPENDENCIES)
$(AM_V_CCLD)$(libsframe_la_LINK) $(am_libsframe_la_rpath) $(libsframe_la_OBJECTS) $(libsframe_la_LIBADD) $(LIBS)
-
-libsframebt.la: $(libsframebt_la_OBJECTS) $(libsframebt_la_DEPENDENCIES) $(EXTRA_libsframebt_la_DEPENDENCIES)
- $(AM_V_CCLD)$(libsframebt_la_LINK) $(am_libsframebt_la_rpath) $(libsframebt_la_OBJECTS) $(libsframebt_la_LIBADD) $(LIBS)
+testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp):
+ @$(MKDIR_P) testsuite/libsframe.stacktrace/libsframest
+ @: > testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp)
+testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)
+ @: > testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp)
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo: \
+ testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp) \
+ testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp)
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo: \
+ testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp) \
+ testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp)
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo: \
+ testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp) \
+ testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp)
+
+testsuite/libsframe.stacktrace/libsframest/libsframest.la: $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_OBJECTS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_DEPENDENCIES) $(EXTRA_testsuite_libsframe_stacktrace_libsframest_libsframest_la_DEPENDENCIES) testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp)
+ $(AM_V_CCLD)$(testsuite_libsframe_stacktrace_libsframest_libsframest_la_LINK) $(am_testsuite_libsframe_stacktrace_libsframest_libsframest_la_rpath) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_OBJECTS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_LIBADD) $(LIBS)
clean-checkPROGRAMS:
@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-rm -f testsuite/libsframe.decode/*.$(OBJEXT)
-rm -f testsuite/libsframe.encode/*.$(OBJEXT)
-rm -f testsuite/libsframe.find/*.$(OBJEXT)
+ -rm -f testsuite/libsframe.stacktrace/libsframest/*.$(OBJEXT)
+ -rm -f testsuite/libsframe.stacktrace/libsframest/*.lo
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframe_la-sframe-dump.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframe_la-sframe-error.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframe_la-sframe.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframebt_la-sframe-backtrace-err.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsframebt_la-sframe-backtrace.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_1-frecnt-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_frecnt_2-frecnt-2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfre_1-findfre-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_findfunc_1-findfunc-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.find/$(DEPDIR)/testsuite_libsframe_find_plt_findfre_1-plt-findfre-1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframe_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsframe_la-sframe-error.lo `test -f 'sframe-error.c' || echo '$(srcdir)/'`sframe-error.c
-libsframebt_la-sframe-backtrace.lo: sframe-backtrace.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframebt_la_CPPFLAGS) $(CPPFLAGS) $(libsframebt_la_CFLAGS) $(CFLAGS) -MT libsframebt_la-sframe-backtrace.lo -MD -MP -MF $(DEPDIR)/libsframebt_la-sframe-backtrace.Tpo -c -o libsframebt_la-sframe-backtrace.lo `test -f 'sframe-backtrace.c' || echo '$(srcdir)/'`sframe-backtrace.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsframebt_la-sframe-backtrace.Tpo $(DEPDIR)/libsframebt_la-sframe-backtrace.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sframe-backtrace.c' object='libsframebt_la-sframe-backtrace.lo' libtool=yes @AMDEPBACKSLASH@
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo: testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo -MD -MP -MF testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.Tpo -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.Tpo testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c' object='testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace.c
+
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo: testsuite/libsframe.stacktrace/libsframest/sframe-state.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo -MD -MP -MF testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.Tpo -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-state.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-state.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.Tpo testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.stacktrace/libsframest/sframe-state.c' object='testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframebt_la_CPPFLAGS) $(CPPFLAGS) $(libsframebt_la_CFLAGS) $(CFLAGS) -c -o libsframebt_la-sframe-backtrace.lo `test -f 'sframe-backtrace.c' || echo '$(srcdir)/'`sframe-backtrace.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-state.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-state.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-state.c
-libsframebt_la-sframe-backtrace-err.lo: sframe-backtrace-err.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframebt_la_CPPFLAGS) $(CPPFLAGS) $(libsframebt_la_CFLAGS) $(CFLAGS) -MT libsframebt_la-sframe-backtrace-err.lo -MD -MP -MF $(DEPDIR)/libsframebt_la-sframe-backtrace-err.Tpo -c -o libsframebt_la-sframe-backtrace-err.lo `test -f 'sframe-backtrace-err.c' || echo '$(srcdir)/'`sframe-backtrace-err.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsframebt_la-sframe-backtrace-err.Tpo $(DEPDIR)/libsframebt_la-sframe-backtrace-err.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sframe-backtrace-err.c' object='libsframebt_la-sframe-backtrace-err.lo' libtool=yes @AMDEPBACKSLASH@
+testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo: testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo -MD -MP -MF testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.Tpo -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.Tpo testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c' object='testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsframebt_la_CPPFLAGS) $(CPPFLAGS) $(libsframebt_la_CFLAGS) $(CFLAGS) -c -o libsframebt_la-sframe-backtrace-err.lo `test -f 'sframe-backtrace-err.c' || echo '$(srcdir)/'`sframe-backtrace-err.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CPPFLAGS) $(CPPFLAGS) $(testsuite_libsframe_stacktrace_libsframest_libsframest_la_CFLAGS) $(CFLAGS) -c -o testsuite/libsframe.stacktrace/libsframest/testsuite_libsframe_stacktrace_libsframest_libsframest_la-sframe-stacktrace-err.lo `test -f 'testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c' || echo '$(srcdir)/'`testsuite/libsframe.stacktrace/libsframest/sframe-stacktrace-err.c
testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o: testsuite/libsframe.decode/be-flipping.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testsuite_libsframe_decode_be_flipping_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o -MD -MP -MF testsuite/libsframe.decode/$(DEPDIR)/testsuite_libsframe_decode_be_flipping-be-flipping.Tpo -c -o testsuite/libsframe.decode/testsuite_libsframe_decode_be_flipping-be-flipping.o `test -f 'testsuite/libsframe.decode/be-flipping.c' || echo '$(srcdir)/'`testsuite/libsframe.decode/be-flipping.c
-rm -rf testsuite/libsframe.decode/.libs testsuite/libsframe.decode/_libs
-rm -rf testsuite/libsframe.encode/.libs testsuite/libsframe.encode/_libs
-rm -rf testsuite/libsframe.find/.libs testsuite/libsframe.find/_libs
+ -rm -rf testsuite/libsframe.stacktrace/libsframest/.libs testsuite/libsframe.stacktrace/libsframest/_libs
distclean-libtool:
-rm -f libtool config.lt
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
- $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS)
$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
check: check-am
all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(HEADERS) config.h
-rm -f testsuite/libsframe.encode/$(am__dirstamp)
-rm -f testsuite/libsframe.find/$(DEPDIR)/$(am__dirstamp)
-rm -f testsuite/libsframe.find/$(am__dirstamp)
+ -rm -f testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)/$(am__dirstamp)
+ -rm -f testsuite/libsframe.stacktrace/libsframest/$(am__dirstamp)
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
@BUILD_INFO_FALSE@html-local:
clean: clean-am
-clean-am: clean-aminfo clean-checkPROGRAMS clean-generic \
- clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
- mostlyclean-am
+clean-am: clean-aminfo clean-checkLTLIBRARIES clean-checkPROGRAMS \
+ clean-generic clean-libLTLIBRARIES clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR)
+ -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-DEJAGNU distclean-compile \
distclean-generic distclean-hdr distclean-libtool \
maintainer-clean: maintainer-clean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
- -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR)
+ -rm -rf ./$(DEPDIR) testsuite/libsframe.decode/$(DEPDIR) testsuite/libsframe.encode/$(DEPDIR) testsuite/libsframe.find/$(DEPDIR) testsuite/libsframe.stacktrace/libsframest/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
maintainer-clean-generic
.MAKE: all check-am install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-DEJAGNU \
- check-am clean clean-aminfo clean-checkPROGRAMS clean-cscope \
- clean-generic clean-libLTLIBRARIES clean-libtool \
- clean-noinstLTLIBRARIES cscope cscopelist-am ctags ctags-am \
- dist dist-all dist-bzip2 dist-gzip dist-info dist-lzip \
- dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
- distclean-DEJAGNU distclean-compile distclean-generic \
- distclean-hdr distclean-libtool distclean-tags distcleancheck \
- distdir distuninstallcheck dvi dvi-am html html-am html-local \
- info info-am install install-am install-data install-data-am \
+ check-am clean clean-aminfo clean-checkLTLIBRARIES \
+ clean-checkPROGRAMS clean-cscope clean-generic \
+ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
+ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-info dist-lzip dist-shar dist-tarZ dist-xz \
+ dist-zip distcheck distclean distclean-DEJAGNU \
+ distclean-compile distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am html-local 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 \
CC="$(CC)" \
CROSS_COMPILE="$(CROSS_COMPILE)" \
COMPAT_DEJAGNU="$(COMPAT_DEJAGNU)" \
- CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_builddir)" \
+ HAVE_DL_ITERATE_PHDR="$(HAVE_DL_ITERATE_PHDR)" \
+ CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_srcdir)/testsuite/libsframe.stacktrace/libsframest/include -I$(top_builddir)" \
$(RUNTESTFLAGS); \
else echo "WARNING: could not find \`runtest'" 1>&2; :;\
fi
-# libsframe encoder/decoder/find testsuite
+# libsframe encoder/decoder/stacktracer testsuite
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
/* Define to 1 if you have the <byteswap.h> header file. */
#undef HAVE_BYTESWAP_H
+/* Define to 1 if you have the declaration of `', and to 0 if you don't. */
+#undef HAVE_DECL_
+
/* 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 <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
+/* Define if dl_iterate_phdr is available. */
+#undef HAVE_DL_ITERATE_PHDR
+
/* Define to 1 if you have the <endian.h> header file. */
#undef HAVE_ENDIAN_H
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
+/* Define to 1 if you have the <link.h> header file. */
+#undef HAVE_LINK_H
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
+HAVE_DL_ITERATE_PHDR_FALSE
+HAVE_DL_ITERATE_PHDR_TRUE
bfdincludedir
bfdlibdir
target_noncanonical
_ACEOF
+for ac_header in link.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "link.h" "ac_cv_header_link_h" "$ac_includes_default"
+if test "x$ac_cv_header_link_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LINK_H 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_link_h" = "no"; then
+ have_dl_iterate_phdr=no
+else
+ ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
+if test "x$ac_cv_func_dl_iterate_phdr" = xyes; then :
+ have_dl_iterate_phdr=yes
+else
+ have_dl_iterate_phdr=no
+fi
+
+fi
+if test "$have_dl_iterate_phdr" = "yes"; then
+
+$as_echo "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
+
+fi
+ if test "x$have_dl_iterate_phdr" = "xyes"; then
+ HAVE_DL_ITERATE_PHDR_TRUE=
+ HAVE_DL_ITERATE_PHDR_FALSE='#'
+else
+ HAVE_DL_ITERATE_PHDR_TRUE='#'
+ HAVE_DL_ITERATE_PHDR_FALSE=
+fi
+
+
+for ac_header in link.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "link.h" "ac_cv_header_link_h" "$ac_includes_default"
+if test "x$ac_cv_header_link_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LINK_H 1
+_ACEOF
+
+fi
+
+done
+
+ac_fn_c_check_decl "$LINENO" "" "ac_cv_have_decl_" "$ac_includes_default"
+if test "x$ac_cv_have_decl_" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ $ac_have_decl
+_ACEOF
+
+
ac_config_files="$ac_config_files Makefile"
ac_config_headers="$ac_config_headers config.h"
as_fn_error $? "conditional \"INSTALL_LIBBFD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_DL_ITERATE_PHDR_TRUE}" && test -z "${HAVE_DL_ITERATE_PHDR_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_DL_ITERATE_PHDR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
dnl Check for bswap_{16,32,64}
AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64], [], [], [[#include <byteswap.h>]])
+dnl Check for dl_iterate_phdr. Used in the libsframe.stacktrace testsuite.
+dnl The stacktrace testsuite is NOT built and run for build != target.
+AC_CHECK_HEADERS(link.h)
+if test "$ac_cv_header_link_h" = "no"; then
+ have_dl_iterate_phdr=no
+else
+ AC_CHECK_FUNC([dl_iterate_phdr],
+ [have_dl_iterate_phdr=yes],
+ [have_dl_iterate_phdr=no])
+fi
+if test "$have_dl_iterate_phdr" = "yes"; then
+ AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
+fi
+AM_CONDITIONAL([HAVE_DL_ITERATE_PHDR], [test "x$have_dl_iterate_phdr" = "xyes"])
+
+dnl Check for dl_iterate_phdr
+AC_CHECK_HEADERS(link.h)
+AC_CHECK_DECLS
+
AC_CONFIG_FILES(Makefile)
AC_CONFIG_HEADERS(config.h)
AC_OUTPUT
+++ /dev/null
-/* sframe-backtrace.c - The SFrame backtracer.
-
- Copyright (C) 2022 Free Software Foundation, Inc.
-
- This file is part of libsframebt.
-
- 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 <link.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <inttypes.h>
-#include <stdbool.h>
-#include <assert.h>
-#include <execinfo.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <ucontext.h>
-#include <stdarg.h>
-#include "ansidecl.h"
-#include "sframe-api.h"
-#include "sframe-backtrace-api.h"
-#include "sframe-backtrace-regs.h"
-
-#ifndef PT_SFRAME
-#define PT_SFRAME 0x6474e554 /* FIXME. */
-#endif
-
-#define _sf_printflike_(string_index, first_to_check) ATTRIBUTE_PRINTF (1, 2)
-
-static bool _sframe_unwind_debug; /* Control for printing out debug info. */
-static const int no_of_entries = NUM_OF_DSOS;
-
-/* SFrame decode data for the main module or a DSO. */
-struct sframe_decode_data
-{
- char *sfdd_data; /* SFrame decode data. */
- int sfdd_data_size; /* SFrame decode data size. */
- uint64_t sfdd_text_vma; /* Text segment's virtual address. */
- int sfdd_text_size; /* Text segment's size. */
- uint64_t sfdd_sframe_vma; /* SFrame segment's virtual address. */
- sframe_decoder_ctx *sfdd_sframe_ctx; /* SFrame decoder context. */
-};
-
-/* List that holds SFrame info for the shared libraries. */
-struct dso_cfi_list
-{
- int alloced; /* Entries allocated. */
- int used; /* Entries used. */
- struct sframe_decode_data *entry; /* DSO's decode data. */
-};
-
-/* Data that's passed through sframe_callback. */
-struct sframe_unwind_info
-{
- int sui_fd; /* File descriptor. */
- struct sframe_decode_data sui_ctx; /* The decode data. */
- struct dso_cfi_list sui_dsos; /* The DSO list. */
-};
-
-static void
-sframe_unwind_init_debug (void)
-{
- static int inited;
-
- if (!inited)
- {
- _sframe_unwind_debug = getenv ("SFRAME_UNWIND_DEBUG") != NULL;
- inited = 1;
- }
-}
-
-_sf_printflike_ (1, 2)
-static void
-debug_printf (const char *format, ...)
-{
- if (_sframe_unwind_debug == true)
- {
- va_list args;
-
- va_start (args, format);
- __builtin_vprintf (format, args);
- va_end (args);
- }
-}
-
-/* sframe_bt_errno - Check if there is error code in ERRP. */
-
-static int
-sframe_bt_errno (const int *errp)
-{
- if (errp == NULL)
- return 0;
-
- return (*errp != SFRAME_BT_OK);
-}
-
-/* sframe_bt_set_errno - Store the specified error code ERROR into ERRP if
- it is non-NULL. */
-
-static void
-sframe_bt_set_errno (int *errp, int error)
-{
- if (errp != NULL)
- *errp = error;
-}
-
-/* sframe_add_dso - Add .sframe info in D_DATA, which is associated with
- a dynamic shared object, to D_LIST. */
-
-static void
-sframe_add_dso (struct dso_cfi_list *d_list,
- struct sframe_decode_data d_data,
- int *errp)
-{
- if (d_list->alloced == 0)
- {
- d_list->entry = malloc (no_of_entries * sizeof (struct sframe_decode_data));
- if (d_list->entry == NULL)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_MALLOC);
- return;
- }
- memset (d_list->entry, 0,
- no_of_entries * sizeof (struct sframe_decode_data));
- d_list->alloced = no_of_entries;
- }
- else if (d_list->used == d_list->alloced)
- {
- d_list->entry = realloc (d_list->entry,
- ((d_list->alloced + no_of_entries)
- * sizeof (struct sframe_decode_data)));
- if (d_list->entry == NULL)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_REALLOC);
- return;
- }
-
- memset (&d_list->entry[d_list->alloced], 0,
- no_of_entries * sizeof (struct sframe_decode_data));
- d_list->alloced += no_of_entries;
- }
-
- sframe_bt_set_errno (errp, SFRAME_BT_OK);
- d_list->entry[d_list->used++] = d_data;
-}
-
-/* sframe_free_cfi - Free up space allocated for .sframe info for CF. */
-
-static void
-sframe_free_cfi (struct sframe_unwind_info *sf)
-{
- struct dso_cfi_list *d_list;
- int i;
-
- if (sf == NULL)
- return;
-
- free (sf->sui_ctx.sfdd_data);
- sframe_decoder_free (&sf->sui_ctx.sfdd_sframe_ctx);
- close (sf->sui_fd);
-
- d_list = &sf-> sui_dsos;
- if (d_list == NULL)
- return;
-
- for (i = 0; i < d_list->used; ++i)
- {
- free (d_list->entry[i].sfdd_data);
- sframe_decoder_free (&d_list->entry[i].sfdd_sframe_ctx);
- }
-
- free (d_list->entry);
-}
-
-/* sframe_find_context - Find the decode data that contains ADDR from CF.
- Return the pointer to the decode data or NULL. */
-
-static struct sframe_decode_data *
-sframe_find_context (struct sframe_unwind_info *sf, uint64_t addr)
-{
- struct dso_cfi_list *d_list;
- struct sframe_decode_data sdec_data;
- int i;
-
- if (sf == NULL)
- return NULL;
-
- if (sf->sui_ctx.sfdd_text_vma < addr
- && sf->sui_ctx.sfdd_text_vma + sf->sui_ctx.sfdd_text_size > addr)
- return &sf->sui_ctx;
-
- d_list = &sf->sui_dsos;
- for (i = 0; i < sf->sui_dsos.used; ++i)
- {
- sdec_data = d_list->entry[i];
- if ((sdec_data.sfdd_text_vma <= addr)
- && (sdec_data.sfdd_text_vma + sdec_data.sfdd_text_size >= addr))
- return &d_list->entry[i];
- }
-
- return NULL;
-}
-
-/* sframe_valid_addr - Check if ADDR is valid in CF. The address is considered
- invalid, with regards to SFrame, if it's not in any address range of the
- main module or any of its DSO's. Return 1 if valid, 0 otherwise. */
-
-static int
-sframe_valid_addr (struct sframe_unwind_info *sf, uint64_t addr)
-{
- struct sframe_decode_data *cdp;
-
- if (sf == NULL)
- return 0;
-
- cdp = sframe_find_context (sf, addr);
- return cdp ? 1 : 0;
-}
-
-/* sframe_load_ctx - Call decoder to create and set up the SFrame info for
- either the main module or one of the DSOs from CF, based on the input
- RADDR argument. Return the newly created decode context or NULL. */
-
-static sframe_decoder_ctx *
-sframe_load_ctx (struct sframe_unwind_info *sf, uint64_t raddr)
-{
- sframe_decoder_ctx *nctx;
- struct sframe_decode_data *cdp;
-
- if (sf == NULL)
- return NULL;
-
- cdp = sframe_find_context (sf, raddr);
- if (cdp == NULL)
- return NULL;
-
- if (cdp->sfdd_sframe_ctx == NULL)
- {
- int err;
- nctx = sframe_decode (cdp->sfdd_data, cdp->sfdd_data_size, &err);
- if (nctx == NULL)
- return NULL;
- cdp->sfdd_sframe_ctx = nctx;
- return nctx;
- }
-
- return NULL;
-}
-
-/* sframe_update_ctx - Check if need to do a decode context switch, based on
- the input RADDR argument, from CF. A new decode context will be created
- and set up if it isn't already done so. Return the new decode context in
- CTX and vma in CFI_VMA. */
-
-static void
-sframe_update_ctx (struct sframe_unwind_info *sf, uint64_t raddr,
- sframe_decoder_ctx **ctx, uint64_t *cfi_vma)
-{
- sframe_decoder_ctx *nctx;
- struct sframe_decode_data *cdp;
-
- cdp = sframe_find_context (sf, raddr);
- if (cdp != NULL)
- {
- if (cdp->sfdd_sframe_ctx == NULL)
- {
- int err;
- nctx = sframe_decode (cdp->sfdd_data, cdp->sfdd_data_size, &err);
- if (nctx == NULL)
- {
- *ctx = NULL;
- return;
- }
- cdp->sfdd_sframe_ctx = nctx;
- }
- *ctx = cdp->sfdd_sframe_ctx;
- *cfi_vma = cdp->sfdd_sframe_vma;
- }
-}
-
-/* get_contents - Return contents at ADDR from file descriptor FD. */
-
-static uint64_t
-get_contents (int fd, uint64_t addr, int *errp)
-{
- uint64_t data;
- size_t sz;
-
- sframe_bt_set_errno (errp, SFRAME_BT_OK);
- if (lseek (fd, addr, SEEK_SET) == -1)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_LSEEK);
- return 0;
- }
- sz = read (fd, &data, sizeof (uint64_t));
- if (sz != sizeof (uint64_t))
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_READ);
- return 0;
- }
-
- return data;
-}
-
-/* sframe_fd_open - Open /proc image associated with the process id and return
- the file descriptor. */
-
-static int
-sframe_fd_open (int *errp)
-{
- int fd;
-
- if ((fd = open ("/proc/self/mem", O_CLOEXEC)) == -1)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_OPEN);
- return -1;
- }
-
- return fd;
-}
-
-/* sframe_callback - The callback from dl_iterate_phdr with header info
- in INFO.
- Return SFrame info for either the main module or a DSO in DATA. */
-
-static int
-sframe_callback (struct dl_phdr_info *info,
- size_t size ATTRIBUTE_UNUSED,
- void *data)
-{
- struct sframe_unwind_info *sf = (struct sframe_unwind_info *) data;
- int p_type, i, fd, sframe_err;
- ssize_t len;
- uint64_t text_vma = 0;
- int text_size = 0;
-
- if (data == NULL || info == NULL)
- return 1;
-
- debug_printf ("-- name: %s %14p\n", info->dlpi_name, (void *)info->dlpi_addr);
-
- for (i = 0; i < info->dlpi_phnum; i++)
- {
- debug_printf (" %2d: [%" PRIu64 "; memsz %" PRIu64 "] flags: 0x%x; \n", i,
- (uint64_t) info->dlpi_phdr[i].p_vaddr,
- (uint64_t) info->dlpi_phdr[i].p_memsz,
- info->dlpi_phdr[i].p_flags);
-
- p_type = info->dlpi_phdr[i].p_type;
- if (p_type == PT_LOAD && info->dlpi_phdr[i].p_flags & PF_X)
- {
- text_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
- text_size = info->dlpi_phdr[i].p_memsz;
- continue;
- }
- if (p_type != PT_SFRAME)
- continue;
-
- if (info->dlpi_name[0] == '\0') /* the main module. */
- {
- fd = sframe_fd_open (&sframe_err);
- if (fd == -1)
- return 1;
- if (lseek (fd, info->dlpi_addr + info->dlpi_phdr[i].p_vaddr,
- SEEK_SET) == -1)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_LSEEK);
- return 1;
- }
-
- sf->sui_ctx.sfdd_data = malloc (info->dlpi_phdr[i].p_memsz);
- if (sf->sui_ctx.sfdd_data == NULL)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_MALLOC);
- return 1;
- }
-
- len = read (fd, sf->sui_ctx.sfdd_data, info->dlpi_phdr[i].p_memsz);
- if (len == -1 || len != (ssize_t) info->dlpi_phdr[i].p_memsz)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_READ);
- return 1;
- }
-
- assert (text_vma);
- sf->sui_ctx.sfdd_data_size = len;
- sf->sui_ctx.sfdd_sframe_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
- sf->sui_fd = fd;
- sf->sui_ctx.sfdd_text_vma = text_vma;
- sf->sui_ctx.sfdd_text_size = text_size;
- text_vma = 0;
- return 0;
- }
- else
- { /* a dynamic shared object. */
- struct sframe_decode_data dt;
- memset (&dt, 0, sizeof (struct sframe_decode_data));
- assert (sf->sui_fd);
- if (lseek (sf->sui_fd, info->dlpi_addr + info->dlpi_phdr[i].p_vaddr,
- SEEK_SET) == -1)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_LSEEK);
- return 1;
- }
-
- dt.sfdd_data = malloc (info->dlpi_phdr[i].p_memsz);
- if (dt.sfdd_data == NULL)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_MALLOC);
- return 1;
- }
-
- len = read (sf->sui_fd, dt.sfdd_data, info->dlpi_phdr[i].p_memsz);
- if (len == -1 || len != (ssize_t) info->dlpi_phdr[i].p_memsz)
- {
- sframe_bt_set_errno (&sframe_err, SFRAME_BT_ERR_READ);
- return 1;
- }
-
- assert (text_vma);
- dt.sfdd_data_size = len;
- dt.sfdd_sframe_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
- dt.sfdd_text_vma = text_vma;
- dt.sfdd_text_size = text_size;
- text_vma = 0;
- sframe_add_dso (&sf->sui_dsos, dt, &sframe_err);
- if (sframe_err != SFRAME_BT_OK)
- return 1;
- return 0;
- }
- }
-
- return 0;
-}
-
-/* sframe_unwind - Unwind the stack backtrace for CF. If successful,
- store the return addresses in RA_LST. The RA_SIZE argument specifies
- the maximum number of return addresses that can be stored in RA_LST
- and contains the number of the addresses collected. */
-
-static void
-sframe_unwind (struct sframe_unwind_info *sf, void **ra_lst,
- int *ra_size, int *errp)
-{
- uint64_t cfa, return_addr, ra_stack_loc, rfp_stack_loc;
- int8_t fixed_ra_offset;
- sframe_decoder_ctx *ctx;
- int cfa_offset, rfp_offset, errnum, i, count;
- sframe_frame_row_entry fred, *frep = &fred;
- uint64_t pc, rfp, rsp, ra, cfi_vma;
- ucontext_t context, *cp = &context;
-
- if (sf == NULL || ra_lst == NULL || ra_size == NULL)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_ARG);
- return;
- }
-
- /* Get the user context for its registers. */
- if (getcontext (cp) != 0)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_GETCONTEXT);
- return;
- }
- sframe_bt_set_errno (errp, SFRAME_BT_OK);
-
- pc = get_context_pc (cp);
- rsp = get_context_rsp (cp);
- rfp = get_context_rfp (cp);
- ra = get_context_ra (cp);
-
- /* Load and set up the decoder. */
- ctx = sframe_load_ctx (sf, pc);
- if (ctx == NULL)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_DECODE);
- return;
- }
- cfi_vma = sf->sui_ctx.sfdd_sframe_vma;
- count = *ra_size;
-
- for (i = 0; i < count; ++i)
- {
- pc -= cfi_vma;
- errnum = sframe_find_fre (ctx, pc, frep);
- if (errnum == 0)
- {
- cfa_offset = sframe_fre_get_cfa_offset (ctx, frep, &errnum);
- if (errnum == SFRAME_ERR_FREOFFSET_NOPRESENT)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_CFA_OFFSET);
- return;
- }
-
- cfa = ((frep->fre_info & 0x1) == SFRAME_BASE_REG_SP
- ? rsp : rfp) + cfa_offset;
-
-#ifdef __x86_64__
- /* For x86, read the return address from the fixed RA offset from
- the SFrame header. RA must be at location CFA - 8. */
- fixed_ra_offset = sframe_decoder_get_fixed_ra_offset (ctx);
- if (fixed_ra_offset == SFRAME_CFA_FIXED_RA_INVALID)
- return;
-
- ra_stack_loc = cfa + fixed_ra_offset;
- return_addr = get_contents (sf->sui_fd, ra_stack_loc, errp);
- if (sframe_bt_errno (errp))
- return;
-#else
-#ifdef __aarch64__
- int ra_offset = sframe_fre_get_ra_offset (ctx, frep, &errnum);
- if (errnum == 0)
- {
- ra_stack_loc = cfa + ra_offset;
- return_addr = get_contents (sf->sui_fd, ra_stack_loc, errp);
- if (sframe_bt_errno (errp))
- return;
- }
- else
- return_addr = ra;
-#endif
-#endif
-
- /* Validate and add return address to the list. */
- if (sframe_valid_addr (sf, return_addr) == 0)
- {
- i -= 1;
- goto find_fre_ra_err;
- }
- if (i != 0) /* exclude self. */
- ra_lst[i-1] = (void *)return_addr;
-
- /* Set up for the next frame. */
- rfp_offset = sframe_fre_get_fp_offset (ctx, frep, &errnum);
- if (errnum == 0)
- {
- rfp_stack_loc = cfa + rfp_offset;
- rfp = get_contents (sf->sui_fd, rfp_stack_loc, errp);
- if (sframe_bt_errno (errp))
- return;
- }
- rsp = cfa;
- pc = return_addr;
-
- /* Check if need to update the decoder context and vma. */
- sframe_update_ctx (sf, return_addr, &ctx, &cfi_vma);
- if (ctx == NULL)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_DECODE);
- return;
- }
- }
- else
- {
- i -= 1;
- goto find_fre_ra_err;
- }
- }
-
-find_fre_ra_err:
- *ra_size = i;
-}
-
-/* sframe_backtrace - Main API that user program calls to get a backtrace.
- The BUFFER argument provides space for the list of the return addresses
- and the SIZE argument specifies the maximum number of addresses that
- can be stored in the buffer. Return the number of return addresses
- collected or -1 if there is any error. */
-
-int
-sframe_backtrace (void **buffer, int size, int *errp)
-{
- struct sframe_unwind_info sframeinfo;
-
- sframe_unwind_init_debug ();
-
- memset (&sframeinfo, 0, sizeof (struct sframe_unwind_info));
-
- /* find and set up the .sframe sections. */
- (void) dl_iterate_phdr (sframe_callback, (void *)&sframeinfo);
- if (sframeinfo.sui_fd == 0)
- {
- sframe_bt_set_errno (errp, SFRAME_BT_ERR_NOTPRESENT);
- return -1;
- }
-
- /* Do the stack unwinding. */
- sframe_unwind (&sframeinfo, buffer, &size, errp);
- if (sframe_bt_errno (errp))
- size = -1;
-
- sframe_free_cfi (&sframeinfo);
-
- return size;
-}
--- /dev/null
+libsframest
+===========
+
+libsframest is the SFrame stack tracer library.
+
+The current usecase libsframest fulfills here is: aid testing stack
+tracing in libsframe testsuite.
-/* Public API to SFrame backtrace.
+/* Public API to SFrame stacktracer.
- Copyright (C) 2022 Free Software Foundation, Inc.
+ Copyright (C) 2023 Free Software Foundation, Inc.
- This file is part of libsframebt.
+ This file is part of libsframest.
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
enum sframe_bt_errcode
{
SFRAME_BT_OK,
- SFRAME_BT_ERR_NOTPRESENT,
+ SFRAME_BT_ERR_BAD_SFSTATE,
SFRAME_BT_ERR_ARG,
SFRAME_BT_ERR_MALLOC,
SFRAME_BT_ERR_REALLOC,
SFRAME_BT_ERR_GETCONTEXT,
SFRAME_BT_ERR_DECODE,
SFRAME_BT_ERR_CFA_OFFSET,
+ SFRAME_BT_ERR_FRE_INVAL,
};
+#define SFRAME_BT_ERR ((int) -1)
+
#define NUM_OF_DSOS 32 /* Number of DSOs. */
#define ENUM_ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
-/* Get the backtrace of the calling program by storing return addresses
+/* Get the stacktrace of the calling program by storing return addresses
in BUFFER. The SIZE argument specifies the maximum number of addresses
that can be stored in the buffer. Return the number of return addresses
collected or -1 if there is any error. */
-extern int sframe_backtrace (void **buffer, int size, int *errp);
+extern int sframe_stacktrace (void **buffer, int size, int *errp);
extern const char *sframe_bt_errmsg (enum sframe_bt_errcode ecode);
+extern int sframe_bt_ret_set_errno (int *errp, int error);
+
+extern int sframe_bt_errno (const int *errp);
+
#ifdef __cplusplus
}
#endif
--- /dev/null
+check_LTLIBRARIES =
+
+if HAVE_SFRAME_AS
+if HAVE_DL_ITERATE_PHDR
+ check_LTLIBRARIES += %D%/libsframest.la
+endif
+endif
+
+%C%_libsframest_la_SOURCES = %D%/sframe-stacktrace.c \
+ %D%/sframe-state.c \
+ %D%/sframe-stacktrace-err.c
+%C%_libsframest_la_LIBADD = ${top_builddir}/libsframe.la
+%C%_libsframest_la_CPPFLAGS = -I${top_srcdir}/../include \
+ -I${top_srcdir}/%D%/include \
+ -Wall -Wno-unused-but-set-variable
+%C%_libsframest_la_CFLAGS = -Wa,--gsframe
-/* sframe-backtrace-err.c - SFrame Backtrace Error table.
+/* sframe-stacktrace-err.c - SFrame Stacktrace Error table.
- Copyright (C) 2022 Free Software Foundation, Inc.
+ Copyright (C) 2023 Free Software Foundation, Inc.
- This file is part of libsframebt.
+ This file is part of libsframest.
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
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "config.h"
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
-/* SFrame backtrace error messages. */
+/* SFrame stacktrace error messages. */
static const char *const sframe_bt_errlist[] =
{
"",
- "File does not contain SFrame data",
- "Iterating shared object reading error",
+ "Failed to setup SFrame state for stack tracing",
+ "Bad arguments; Unhealthy SFrame state possible",
"Failed to malloc memory space",
"Failed to realloc memory space",
"Failed to open file",
"Failed to read from a file descriptor",
"Failed to get the user context",
"Failed to set up decode data",
- "Illegal CFA offset"
+ "Illegal CFA offset",
+ "Corrupt FRE"
};
/* Return the error message associated with the error code. */
return sframe_bt_errlist[ecode];
}
+
+/* sframe_bt_errno - Check if there is error code in ERRP. */
+
+int
+sframe_bt_errno (const int *errp)
+{
+ if (!errp)
+ return 0;
+
+ return (*errp != SFRAME_BT_OK);
+}
+
+int
+sframe_bt_ret_set_errno (int *errp, int error)
+{
+ if (errp)
+ *errp = error;
+
+ return error;
+}
+
-/* The SFrame backtracer - accessing target registers.
+/* The SFrame stacktracer - accessing target registers.
- Copyright (C) 2022 Free Software Foundation, Inc.
+ Copyright (C) 2023 Free Software Foundation, Inc.
- This file is part of libsframebt.
+ This file is part of libsframest.
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
#include <stdint.h>
#include <ucontext.h>
+#ifndef SFRAME_STACKTRACE_REGS_H
+#define SFRAME_STACKTRACE_REGS_H
+
#if defined (__x86_64__)
static inline uint64_t
}
#endif
+
+#endif /* SFRAME_STACKTRACE_REGS_H. */
--- /dev/null
+/* sframe-stacktrace.c - The SFrame stacktracer.
+
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of libsframest.
+
+ 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 <link.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <execinfo.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ucontext.h>
+#include <stdarg.h>
+#include "ansidecl.h"
+#include "sframe-api.h"
+#include "sframe-stacktrace-api.h"
+#include "sframe-stacktrace-regs.h"
+#include "sframe-state.h"
+
+#define STACK_ELEM_SIZE sizeof(uint64_t)
+
+/* Get the 8 bytes at ADDR from file descriptor FD. */
+
+static int
+get_contents_8b (int fd, uint64_t addr, uint64_t *data)
+{
+ size_t sz = 0;
+ int err = 0;
+
+ if (data == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_ARG);
+
+ if (lseek (fd, addr, SEEK_SET) == -1)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_LSEEK);
+
+ sz = read (fd, data, STACK_ELEM_SIZE);
+ if (sz != STACK_ELEM_SIZE)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_READ);
+
+ return SFRAME_BT_OK;
+}
+
+/* sframe_valid_addr_p - Check if ADDR is valid in CF. The address is considered
+ invalid, with regards to SFrame, if it's not in any address range of the
+ main module or any of its DSO's. Return 1 if valid, 0 otherwise. */
+
+static int
+sframe_valid_addr_p (struct sframe_state *sf, uint64_t addr)
+{
+ struct sframe_stinfo *cdp;
+
+ if (sf == NULL)
+ return 0;
+
+ cdp = sframe_find_context (sf, addr);
+ return cdp ? 1 : 0;
+}
+
+/* Unwind the stack and collect the stacktrace given SFrame unwind info SF.
+ If successful, store the return addresses in RA_LST. The RA_SIZE argument
+ specifies the maximum number of return addresses that can be stored in
+ RA_LST and contains the number of the addresses collected. */
+
+static int
+sframe_unwind (struct sframe_state *sf, void **ra_lst,
+ int *ra_size)
+{
+ uint64_t cfa, return_addr, ra_stack_loc, rfp_stack_loc;
+ int8_t fixed_ra_offset;
+ sframe_decoder_ctx *ctx;
+ int cfa_offset, rfp_offset, errnum, i, count;
+ sframe_frame_row_entry fred, *frep = &fred;
+ uint64_t pc, rfp, rsp, ra, cfi_vma;
+ ucontext_t context, *cp = &context;
+ int err = 0;
+
+ if (sf == NULL || ra_lst == NULL || ra_size == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_ARG);
+
+ /* Get the user context for its registers. */
+ if (getcontext (cp) != 0)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_GETCONTEXT);
+
+ pc = get_context_pc (cp);
+ rsp = get_context_rsp (cp);
+ rfp = get_context_rfp (cp);
+ ra = get_context_ra (cp);
+
+ /* Load and set up the decoder. */
+ ctx = sframe_load_ctx (sf, pc);
+ if (ctx == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_DECODE);
+
+ cfi_vma = sf->sui_ctx.sfdd_sframe_vma;
+ count = *ra_size;
+
+ for (i = 0; i < count; ++i)
+ {
+ pc -= cfi_vma;
+ errnum = sframe_find_fre (ctx, pc, frep);
+ if (errnum == 0)
+ {
+ cfa_offset = sframe_fre_get_cfa_offset (ctx, frep, &errnum);
+ if (errnum == SFRAME_ERR_FREOFFSET_NOPRESENT)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_CFA_OFFSET);
+
+ cfa = ((frep->fre_info & 0x1) == SFRAME_BASE_REG_SP
+ ? rsp : rfp) + cfa_offset;
+
+#ifdef __x86_64__
+ /* For x86, read the return address from the fixed RA offset from
+ the SFrame header. RA must be at location CFA - 8. */
+ fixed_ra_offset = sframe_decoder_get_fixed_ra_offset (ctx);
+ if (fixed_ra_offset == SFRAME_CFA_FIXED_RA_INVALID)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_FRE_INVAL);
+
+ ra_stack_loc = cfa + fixed_ra_offset;
+ errnum = get_contents_8b (sf->sui_fd, ra_stack_loc, &return_addr);
+ if (sframe_bt_errno (&errnum))
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_FRE_INVAL);
+#else
+#ifdef __aarch64__
+ int ra_offset = sframe_fre_get_ra_offset (ctx, frep, &errnum);
+ if (errnum == 0)
+ {
+ ra_stack_loc = cfa + ra_offset;
+ errnum = get_contents_8b (sf->sui_fd, ra_stack_loc, &return_addr);
+ if (sframe_bt_errno (&errnum))
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_FRE_INVAL);
+ }
+ else
+ return_addr = ra;
+#endif
+#endif
+
+ /* Validate and add return address to the list. */
+ if (sframe_valid_addr_p (sf, return_addr) == 0)
+ {
+ i -= 1;
+ goto find_fre_ra_err;
+ }
+ if (i != 0) /* exclude self. */
+ ra_lst[i-1] = (void *)return_addr;
+
+ /* Set up for the next frame. */
+ rfp_offset = sframe_fre_get_fp_offset (ctx, frep, &errnum);
+ if (errnum == 0)
+ {
+ rfp_stack_loc = cfa + rfp_offset;
+ errnum = get_contents_8b (sf->sui_fd, rfp_stack_loc, &rfp);
+ if (sframe_bt_errno (&errnum))
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_FRE_INVAL);
+ }
+ rsp = cfa;
+ pc = return_addr;
+
+ /* Check if need to update the decoder context and vma. */
+ sframe_update_ctx (sf, return_addr, &ctx, &cfi_vma);
+ if (ctx == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_DECODE);
+ }
+ else
+ {
+ i -= 1;
+ goto find_fre_ra_err;
+ }
+ }
+
+find_fre_ra_err:
+ *ra_size = i;
+
+ return SFRAME_BT_OK;
+}
+
+/* Main API that user program calls to get a stacktrace.
+
+ The BUFFER argument provides space for the list of the return addresses
+ and the SIZE argument specifies the maximum number of addresses that
+ can be stored in the buffer.
+
+ Returns the number of return addresses collected or -1 if there is any
+ error. ERRP is set with the error code if any. */
+
+int
+sframe_stacktrace (void **buffer, int size, int *errp)
+{
+ struct sframe_state sframeinfo;
+
+ sframe_unwind_init_debug ();
+
+ memset (&sframeinfo, 0, sizeof (struct sframe_state));
+
+ /* Find the .sframe sections and setup the SFrame state for generating stack
+ traces. */
+ (void) dl_iterate_phdr (sframe_callback, (void *)&sframeinfo);
+ if (sframeinfo.sui_fd == 0)
+ {
+ sframe_bt_ret_set_errno (errp, SFRAME_BT_ERR_BAD_SFSTATE);
+ return -1;
+ }
+
+ /* Do the stack unwinding. */
+ *errp = sframe_unwind (&sframeinfo, buffer, &size);
+ if (sframe_bt_errno (errp))
+ size = -1;
+
+ sframe_free_cfi (&sframeinfo);
+
+ return size;
+}
--- /dev/null
+/* sframe-state.c - The SFrame state for stacktracing.
+
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of libsframest.
+
+ 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 <link.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <execinfo.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ucontext.h>
+#include <stdarg.h>
+#include "ansidecl.h"
+#include "sframe-api.h"
+#include "sframe-stacktrace-api.h"
+#include "sframe-stacktrace-regs.h"
+#include "sframe-state.h"
+
+#define _sf_printflike_(string_index, first_to_check) ATTRIBUTE_PRINTF (1, 2)
+
+static bool _sframe_unwind_debug; /* Control for printing out debug info. */
+static const int no_of_entries = NUM_OF_DSOS;
+
+void
+sframe_unwind_init_debug (void)
+{
+ static int inited;
+
+ if (!inited)
+ {
+ _sframe_unwind_debug = getenv ("SFRAME_UNWIND_DEBUG") != NULL;
+ inited = 1;
+ }
+}
+
+_sf_printflike_ (1, 2)
+static void
+debug_printf (const char *format, ...)
+{
+ if (_sframe_unwind_debug == true)
+ {
+ va_list args;
+
+ va_start (args, format);
+ __builtin_vprintf (format, args);
+ va_end (args);
+ }
+}
+
+#if 0
+/* sframe_bt_set_errno - Store the specified error code ERROR into ERRP if
+ it is non-NULL. */
+
+static void
+sframe_bt_set_errno (int *errp, int error)
+{
+ if (errp != NULL)
+ *errp = error;
+}
+
+#endif
+
+/* sframe_add_dso - Add .sframe info in D_DATA, which is associated with
+ a dynamic shared object, to D_LIST. */
+
+static int
+sframe_add_dso (struct sframe_stinfo_list *d_list,
+ struct sframe_stinfo d_data)
+{
+ int err = 0;
+
+ if (d_list->alloced == 0)
+ {
+ d_list->entry = malloc (no_of_entries * sizeof (struct sframe_stinfo));
+ if (d_list->entry == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_MALLOC);
+
+ memset (d_list->entry, 0,
+ no_of_entries * sizeof (struct sframe_stinfo));
+ d_list->alloced = no_of_entries;
+ }
+ else if (d_list->used == d_list->alloced)
+ {
+ d_list->entry = realloc (d_list->entry,
+ ((d_list->alloced + no_of_entries)
+ * sizeof (struct sframe_stinfo)));
+ if (d_list->entry == NULL)
+ return sframe_bt_ret_set_errno (&err, SFRAME_BT_ERR_REALLOC);
+
+ memset (&d_list->entry[d_list->alloced], 0,
+ no_of_entries * sizeof (struct sframe_stinfo));
+ d_list->alloced += no_of_entries;
+ }
+
+ sframe_bt_ret_set_errno (&err, SFRAME_BT_OK);
+ d_list->entry[d_list->used++] = d_data;
+
+ return SFRAME_BT_OK;
+}
+
+/* sframe_free_cfi - Free up space allocated for .sframe info for CF. */
+
+void
+sframe_free_cfi (struct sframe_state *sf)
+{
+ struct sframe_stinfo_list *d_list;
+ int i;
+
+ if (sf == NULL)
+ return;
+
+ // free (sf->sui_ctx.sfdd_data);
+ sframe_decoder_free (&sf->sui_ctx.sfdd_sframe_ctx);
+ close (sf->sui_fd);
+
+ d_list = &sf-> sui_dsos;
+ if (d_list == NULL)
+ return;
+
+ for (i = 0; i < d_list->used; ++i)
+ {
+ // free (d_list->entry[i].sfdd_data);
+ sframe_decoder_free (&d_list->entry[i].sfdd_sframe_ctx);
+ }
+
+ free (d_list->entry);
+}
+
+/* sframe_find_context - Find the decode data that contains ADDR from CF.
+ Return the pointer to the decode data or NULL. */
+
+struct sframe_stinfo *
+sframe_find_context (struct sframe_state *sf, uint64_t addr)
+{
+ struct sframe_stinfo_list *d_list;
+ struct sframe_stinfo sdec_data;
+ int i;
+
+ if (sf == NULL)
+ return NULL;
+
+ if (sf->sui_ctx.sfdd_text_vma < addr
+ && sf->sui_ctx.sfdd_text_vma + sf->sui_ctx.sfdd_text_size > addr)
+ return &sf->sui_ctx;
+
+ d_list = &sf->sui_dsos;
+ for (i = 0; i < sf->sui_dsos.used; ++i)
+ {
+ sdec_data = d_list->entry[i];
+ if ((sdec_data.sfdd_text_vma <= addr)
+ && (sdec_data.sfdd_text_vma + sdec_data.sfdd_text_size >= addr))
+ return &d_list->entry[i];
+ }
+
+ return NULL;
+}
+
+/* sframe_load_ctx - Call decoder to create and set up the SFrame info for
+ either the main module or one of the DSOs from CF, based on the input
+ RADDR argument. Return the newly created decode context or NULL. */
+
+sframe_decoder_ctx *
+sframe_load_ctx (struct sframe_state *sf, uint64_t raddr)
+{
+ sframe_decoder_ctx *nctx;
+ struct sframe_stinfo *cdp;
+
+ if (sf == NULL)
+ return NULL;
+
+ cdp = sframe_find_context (sf, raddr);
+ if (cdp == NULL)
+ return NULL;
+
+ if (cdp->sfdd_sframe_ctx == NULL)
+ {
+ int err;
+ nctx = sframe_decode (cdp->sfdd_data, cdp->sfdd_data_size, &err);
+ if (nctx == NULL)
+ return NULL;
+ cdp->sfdd_sframe_ctx = nctx;
+ return nctx;
+ }
+
+ return NULL;
+}
+
+/* sframe_update_ctx - Check if need to do a decode context switch, based on
+ the input RADDR argument, from CF. A new decode context will be created
+ and set up if it isn't already done so. Return the new decode context in
+ CTX and vma in CFI_VMA. */
+
+void
+sframe_update_ctx (struct sframe_state *sf, uint64_t raddr,
+ sframe_decoder_ctx **ctx, uint64_t *cfi_vma)
+{
+ sframe_decoder_ctx *nctx;
+ struct sframe_stinfo *cdp;
+
+ cdp = sframe_find_context (sf, raddr);
+ if (cdp != NULL)
+ {
+ if (cdp->sfdd_sframe_ctx == NULL)
+ {
+ int err;
+ nctx = sframe_decode (cdp->sfdd_data, cdp->sfdd_data_size, &err);
+ if (nctx == NULL)
+ {
+ *ctx = NULL;
+ return;
+ }
+ cdp->sfdd_sframe_ctx = nctx;
+ }
+ *ctx = cdp->sfdd_sframe_ctx;
+ *cfi_vma = cdp->sfdd_sframe_vma;
+ }
+}
+
+/* sframe_fd_open - Open /proc image associated with the process id and return
+ the file descriptor. */
+
+static int
+sframe_fd_open (int *errp)
+{
+ int fd;
+
+ if ((fd = open ("/proc/self/mem", O_CLOEXEC)) == -1)
+ {
+ sframe_bt_ret_set_errno (errp, SFRAME_BT_ERR_OPEN);
+ return -1;
+ }
+
+ return fd;
+}
+
+/* The callback from dl_iterate_phdr with header info in INFO.
+ Return SFrame info for either the main module or a DSO in DATA. */
+
+int
+sframe_callback (struct dl_phdr_info *info,
+ size_t size ATTRIBUTE_UNUSED,
+ void *data)
+{
+ struct sframe_state *sf = (struct sframe_state *) data;
+ int p_type, i, fd, sframe_err;
+ ssize_t len;
+ uint64_t text_vma = 0;
+ int text_size = 0;
+
+ if (data == NULL || info == NULL)
+ return 1;
+
+ debug_printf ("-- name: %s %14p\n", info->dlpi_name, (void *)info->dlpi_addr);
+
+ for (i = 0; i < info->dlpi_phnum; i++)
+ {
+ debug_printf (" %2d: [%" PRIu64 "; memsz %" PRIu64 "] flags: 0x%x; \n", i,
+ (uint64_t) info->dlpi_phdr[i].p_vaddr,
+ (uint64_t) info->dlpi_phdr[i].p_memsz,
+ info->dlpi_phdr[i].p_flags);
+
+ p_type = info->dlpi_phdr[i].p_type;
+ if (p_type == PT_LOAD && info->dlpi_phdr[i].p_flags & PF_X)
+ {
+ text_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
+ text_size = info->dlpi_phdr[i].p_memsz;
+ continue;
+ }
+ if (p_type != PT_SFRAME)
+ continue;
+
+ if (info->dlpi_name[0] == '\0') /* the main module. */
+ {
+ fd = sframe_fd_open (&sframe_err);
+ if (fd == -1)
+ return 1;
+#if 0
+ if (lseek (fd, info->dlpi_addr + info->dlpi_phdr[i].p_vaddr,
+ SEEK_SET) == -1)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_LSEEK);
+ return 1;
+ }
+#endif
+
+ // sf->sui_ctx.sfdd_data = malloc (info->dlpi_phdr[i].p_memsz);
+ sf->sui_ctx.sfdd_data = (char *)(info->dlpi_addr + info->dlpi_phdr[i].p_vaddr);
+#if 0
+ if (sf->sui_ctx.sfdd_data == NULL)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_MALLOC);
+ return 1;
+ }
+
+ len = read (fd, sf->sui_ctx.sfdd_data, info->dlpi_phdr[i].p_memsz);
+ if (len == -1 || len != (ssize_t) info->dlpi_phdr[i].p_memsz)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_READ);
+ return 1;
+ }
+#endif
+ len = info->dlpi_phdr[i].p_memsz;
+
+ assert (text_vma);
+ sf->sui_ctx.sfdd_data_size = len;
+ sf->sui_ctx.sfdd_sframe_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
+ sf->sui_fd = fd;
+ sf->sui_ctx.sfdd_text_vma = text_vma;
+ sf->sui_ctx.sfdd_text_size = text_size;
+ text_vma = 0;
+ return 0;
+ }
+ else
+ { /* a dynamic shared object. */
+ struct sframe_stinfo dt;
+ memset (&dt, 0, sizeof (struct sframe_stinfo));
+ assert (sf->sui_fd);
+#if 0
+ if (lseek (sf->sui_fd, info->dlpi_addr + info->dlpi_phdr[i].p_vaddr,
+ SEEK_SET) == -1)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_LSEEK);
+ return 1;
+ }
+#endif
+
+ // dt.sfdd_data = malloc (info->dlpi_phdr[i].p_memsz);
+ dt.sfdd_data = (char *)(info->dlpi_addr + info->dlpi_phdr[i].p_vaddr);
+#if 0
+ if (dt.sfdd_data == NULL)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_MALLOC);
+ return 1;
+ }
+
+ len = read (sf->sui_fd, dt.sfdd_data, info->dlpi_phdr[i].p_memsz);
+ if (len == -1 || len != (ssize_t) info->dlpi_phdr[i].p_memsz)
+ {
+ sframe_bt_ret_set_errno (&sframe_err, SFRAME_BT_ERR_READ);
+ return 1;
+ }
+#endif
+ len = info->dlpi_phdr[i].p_memsz;
+ assert (text_vma);
+ dt.sfdd_data_size = len;
+ dt.sfdd_sframe_vma = info->dlpi_addr + info->dlpi_phdr[i].p_vaddr;
+ dt.sfdd_text_vma = text_vma;
+ dt.sfdd_text_size = text_size;
+ text_vma = 0;
+
+ sframe_err = sframe_add_dso (&sf->sui_dsos, dt);
+ // FIXME TODO
+ if (sframe_err != SFRAME_BT_OK)
+ return 1;
+ return 0;
+ }
+ }
+
+ return 0;
+}
--- /dev/null
+/* sframe-state.h - The SFrame state for stacktracing.
+
+ Copyright (C) 2023 Free Software Foundation, Inc.
+
+ This file is part of libsframest.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SFRAME_STATE_H
+#define SFRAME_STATE_H
+
+#include "config.h"
+#include <link.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <execinfo.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ucontext.h>
+#include <stdarg.h>
+#include "ansidecl.h"
+#include "sframe-api.h"
+#include "sframe-stacktrace-api.h"
+#include "sframe-stacktrace-regs.h"
+
+#ifndef PT_SFRAME
+#define PT_SFRAME 0x6474e554 /* FIXME. */
+#endif
+
+/* SFrame decode data for the main module or a DSO. */
+struct sframe_stinfo
+{
+ char *sfdd_data; /* SFrame decode data. */
+ int sfdd_data_size; /* SFrame decode data size. */
+ uint64_t sfdd_text_vma; /* Text segment's virtual address. */
+ int sfdd_text_size; /* Text segment's size. */
+ uint64_t sfdd_sframe_vma; /* SFrame segment's virtual address. */
+ sframe_decoder_ctx *sfdd_sframe_ctx; /* SFrame decoder context. */
+};
+
+/* List that holds SFrame info for the shared libraries. */
+struct sframe_stinfo_list
+{
+ int alloced; /* Entries allocated. */
+ int used; /* Entries used. */
+ struct sframe_stinfo *entry; /* DSO's decode data. */
+};
+
+/* Data that's passed through sframe_callback. */
+struct sframe_state
+{
+ int sui_fd; /* File descriptor. */
+ struct sframe_stinfo sui_ctx; /* The decode data. */
+ struct sframe_stinfo_list sui_dsos; /* The DSO list. */
+};
+
+
+void sframe_unwind_init_debug (void);
+
+int sframe_callback (struct dl_phdr_info *info,
+ size_t size ATTRIBUTE_UNUSED,
+ void *data);
+
+void sframe_update_ctx (struct sframe_state *sf, uint64_t raddr,
+ sframe_decoder_ctx **ctx, uint64_t *cfi_vma);
+
+sframe_decoder_ctx *sframe_load_ctx (struct sframe_state *sf, uint64_t raddr);
+
+struct sframe_stinfo *
+sframe_find_context (struct sframe_state *sf, uint64_t addr);
+
+void sframe_free_cfi (struct sframe_state *sf);
+
+#endif /* SFRAME_STATE_H. */
--- /dev/null
+include %D%/libsframest/local.mk
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#include "solib-lib2.h"
#define BT_BUF_SIZE 100
int i, nptrs, err;
char **strings;
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (err)
{
printf ("SFrame error: %s\n", sframe_bt_errmsg (err));
}
if (nptrs != 4)
{
- printf ("sframe_backtrace failed: %d %d\n", nptrs, err);
+ printf ("sframe_stacktrace failed: %d %d\n", nptrs, err);
return (-1);
}
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#include "solib-lib1.h"
#include "solib-lib2.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#define BT_BUF_SIZE 100
/* Call the unwinder to get an array of return addresses. */
// nptrs = backtrace (buffer, BT_BUF_SIZE);
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (err)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: backtrace-1\n",
- (j == nptrs) ? "PASS" : "FAIL");
+ printf ("%s: stacktrace-1\n", (j == nptrs) ? "PASS" : "FAIL");
}
int __attribute__((__noinline__)) ATTRIBUTE_NOCLONE
void *buffer[BT_BUF_SIZE];
int nptrs, err;
- /* The following call to sframe_backtrace () also prevents sibling call
+ /* The following call to sframe_stacktrace () also prevents sibling call
optimization in main (). */
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
--- /dev/null
+# source: stacktrace-1.c
+# cflags: -O2
+# link: on
+PASS: stacktrace-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#define BT_BUF_SIZE 100
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs != 5)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: backtrace test\n", j == nptrs ? "PASS" : "FAIL");
+ printf ("%s: stacktrace-2\n", (j == nptrs) ? "PASS" : "FAIL");
}
int __attribute__((__noinline__)) ATTRIBUTE_NOCLONE
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
--- /dev/null
+# source: stacktrace-2.c
+# link: on
+PASS: stacktrace-2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#ifdef __has_attribute
# if !__has_attribute (noclone)
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1 || nptrs != 6)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: unwind test\n", j == nptrs ? "PASS" : "FAIL");
+ printf ("%s: stacktrace with static function\n",
+ (j == nptrs) ? "PASS" : "FAIL");
}
static void __attribute__((__noinline__)) ATTRIBUTE_NOCLONE
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
--- /dev/null
+# source: stacktrace-3.c
+# link: on
+PASS: stacktrace with static function
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#define BT_BUF_SIZE 100
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (err)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: backtrace with omit-frame-pointer attr\n",
+ printf ("%s: stacktrace with omit-frame-pointer attr\n",
(j == nptrs) ? "PASS" : "FAIL");
}
--- /dev/null
+# source: stacktrace-fp-attr-1.c
+# cflags: -fno-omit-frame-pointer -fno-optimize-sibling-calls
+# link: on
+PASS: stacktrace with omit-frame-pointer attr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#define BT_BUF_SIZE 100
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (err)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: backtrace with no-omit-frame-pointer attr\n",
+ printf ("%s: stacktrace with no-omit-frame-pointer attr\n",
(j == nptrs) ? "PASS" : "FAIL");
}
--- /dev/null
+# source: stacktrace-fp-attr-2.c
+# cflags: -fomit-frame-pointer -fno-optimize-sibling-calls
+# link: on
+PASS: stacktrace with no-omit-frame-pointer attr
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
-#define ATTR __attribute__((always_inline))
+#define ALWAYS_INLINE __attribute__((always_inline))
#define BT_BUF_SIZE 32
x += y;
}
-inline ATTR int func1(void)
+inline ALWAYS_INLINE int func1(void)
{
bar ();
return x * y;
}
-inline ATTR int func2(void)
+inline ALWAYS_INLINE int func2(void)
{
void *buffer[BT_BUF_SIZE];
int ok = 0, nptrs, err;
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s\n", sframe_bt_errmsg (err));
free(strings);
- printf ("%s: unwind test\n", ok == 1 ? "PASS" : "FAIL");
+ printf ("%s: stacktrace with inlined function\n", ok == 1 ? "PASS" : "FAIL");
return x * func1 ();
}
--- /dev/null
+# source: stacktrace-inline-1.c
+# link: on
+PASS: stacktrace with inlined function
#include <stdlib.h>
#include <string.h>
#include <execinfo.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#define BT_BUF_SIZE 10
char **strings;
/* Call the unwinder to get an array of return addresses. */
int j, err;
- int nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ int nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1 || nptrs != 2)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
break;
free(strings);
- printf ("%s: inline-cmds test\n", j == nptrs ? "PASS" : "FAIL");
+ printf ("%s: stacktrace with inlined function test 2\n",
+ (j == nptrs) ? "PASS" : "FAIL");
}
void noinline(void)
--- /dev/null
+# source: stacktrace-inline-2.c
+# link: on
+PASS: stacktrace with inlined function test 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "sframe-backtrace-api.h"
+#include "sframe-stacktrace-api.h"
#ifdef __has_attribute
# if !__has_attribute (noclone)
char **strings;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1 || nptrs != 4)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
free(strings);
- printf ("%s: tailcall test\n", j == nptrs ? "PASS" : "FAIL");
+ printf ("%s: stacktrace tailcall test\n", j == nptrs ? "PASS" : "FAIL");
}
/* An example of tail recursive function. */
int nptrs, err;
/* Call the unwinder to get an array of return addresses. */
- nptrs = sframe_backtrace (buffer, BT_BUF_SIZE, &err);
+ nptrs = sframe_stacktrace (buffer, BT_BUF_SIZE, &err);
if (nptrs == -1)
{
printf ("SFrame error: %s (%d)\n", sframe_bt_errmsg (err), nptrs);
--- /dev/null
+# source: stacktrace-tailcall-1.c
+# link: on
+PASS: stacktrace tailcall test
# MA 02110-1301, USA.
#
-# Run the tests only if sframebt library exists.
+# Run the tests only if libsframest library exists.
-if [catch "exec ls $objdir/.libs/libsframebt.la" status] then {
- verbose -log "$objdir/.libs/libsframebt.la not found.";
- verbose -log "Skipping SFrame unwind tests";
+if [catch "exec ls $objdir/testsuite/libsframe.stacktrace/libsframest/.libs/libsframest.la" status] then {
+ verbose -log \
+ "$objdir/testsuite/libsframe.stacktrace/libsframest/.libs/libsframest.la not found.";
+ verbose -log "Skipping SFrame stacktrace tests";
return;
}
}
# Compile and link the unwind program.
- set comp_output [compile_link_one_host_cc $opts(unwind) "tmpdir/test_x" "./.libs/libsframebt.la ./.libs/libsframe.la"]
+ set comp_output [compile_link_one_host_cc $opts(unwind) "tmpdir/test_x" "./testsuite/libsframe.stacktrace/libsframest/.libs/libsframest.la ./.libs/libsframe.la"]
if { $comp_output != ""} {
send_log "compilation of unwind program $opts(unwind) failed with <$comp_output>"
if { [llength $opts(source)] > 0 } {
set unwind ""
if { $run_ld } {
- set unwind_output "tmpdir/test_x ./.libs/libsframebt.a ./.libs/libsframe.a"
+ set unwind_output "tmpdir/test_x ./testsuite/libsframe.stacktrace/libsframest/.libs/libsframest.a ./.libs/libsframe.a"
# set unwind_output "tmpdir/out.so"
# set unwind_flags "-fPIC $shared $opts(link_flags)"
} else {
+++ /dev/null
-# source: backtrace-1.c
-# cflags: -O2
-# link: on
-PASS: backtrace-1
+++ /dev/null
-# source: backtrace-fp-attr-1.c
-# cflags: -fno-omit-frame-pointer -fno-optimize-sibling-calls
-# link: on
-PASS: backtrace with omit-frame-pointer attr
+++ /dev/null
-# source: backtrace-fp-attr-2.c
-# cflags: -fomit-frame-pointer -fno-optimize-sibling-calls
-# link: on
-PASS: backtrace with no-omit-frame-pointer attr
+++ /dev/null
-# source: backtrace.c
-# link: on
-PASS: backtrace test
+++ /dev/null
-# source: inline-cmds.c
-# link: on
-PASS: inline-cmds test
+++ /dev/null
-# source: inline.c
-# link: on
-PASS: unwind test
+++ /dev/null
-# source: tailcall.c
-# link: on
-PASS: tailcall test
+++ /dev/null
-# source: ttest.c
-# link: on
-PASS: unwind test
CC="$(CC)" \
CROSS_COMPILE="$(CROSS_COMPILE)" \
COMPAT_DEJAGNU="$(COMPAT_DEJAGNU)" \
- CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_builddir)" \
+ HAVE_DL_ITERATE_PHDR="$(HAVE_DL_ITERATE_PHDR)" \
+ CFLAGS="$(CFLAGS) -I$(top_srcdir)/../include -I$(top_srcdir) -I$(top_srcdir)/testsuite/libsframe.stacktrace/libsframest/include -I$(top_builddir)" \
$(RUNTESTFLAGS); \
else echo "WARNING: could not find \`runtest'" 1>&2; :;\
fi
-# libsframe encoder/decoder/find testsuite
+# libsframe encoder/decoder/stacktracer testsuite
include %D%/libsframe.decode/local.mk
include %D%/libsframe.encode/local.mk
include %D%/libsframe.find/local.mk
+include %D%/libsframe.stacktrace/local.mk