remove libbacktrace
This commit is contained in:
parent
b8e5caba0d
commit
2a10d26215
5
deps/libbacktrace/.gitignore
vendored
5
deps/libbacktrace/.gitignore
vendored
@ -1,5 +0,0 @@
|
|||||||
*~
|
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
*.a
|
|
||||||
*.la
|
|
9286
deps/libbacktrace/Isaac.Newton-Opticks.txt
vendored
9286
deps/libbacktrace/Isaac.Newton-Opticks.txt
vendored
File diff suppressed because it is too large
Load Diff
29
deps/libbacktrace/LICENSE
vendored
29
deps/libbacktrace/LICENSE
vendored
@ -1,29 +0,0 @@
|
|||||||
# Copyright (C) 2012-2016 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
623
deps/libbacktrace/Makefile.am
vendored
623
deps/libbacktrace/Makefile.am
vendored
@ -1,623 +0,0 @@
|
|||||||
# Makefile.am -- Backtrace Makefile.
|
|
||||||
# Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I config
|
|
||||||
|
|
||||||
AM_CPPFLAGS =
|
|
||||||
|
|
||||||
AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
|
|
||||||
|
|
||||||
include_HEADERS = backtrace.h backtrace-supported.h
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libbacktrace.la
|
|
||||||
|
|
||||||
libbacktrace_la_SOURCES = \
|
|
||||||
backtrace.h \
|
|
||||||
atomic.c \
|
|
||||||
dwarf.c \
|
|
||||||
fileline.c \
|
|
||||||
internal.h \
|
|
||||||
posix.c \
|
|
||||||
print.c \
|
|
||||||
sort.c \
|
|
||||||
state.c
|
|
||||||
|
|
||||||
BACKTRACE_FILES = \
|
|
||||||
backtrace.c \
|
|
||||||
simple.c \
|
|
||||||
nounwind.c
|
|
||||||
|
|
||||||
FORMAT_FILES = \
|
|
||||||
elf.c \
|
|
||||||
macho.c \
|
|
||||||
pecoff.c \
|
|
||||||
unknown.c \
|
|
||||||
xcoff.c
|
|
||||||
|
|
||||||
VIEW_FILES = \
|
|
||||||
read.c \
|
|
||||||
mmapio.c
|
|
||||||
|
|
||||||
ALLOC_FILES = \
|
|
||||||
alloc.c \
|
|
||||||
mmap.c
|
|
||||||
|
|
||||||
EXTRA_libbacktrace_la_SOURCES = \
|
|
||||||
$(BACKTRACE_FILES) \
|
|
||||||
$(FORMAT_FILES) \
|
|
||||||
$(VIEW_FILES) \
|
|
||||||
$(ALLOC_FILES)
|
|
||||||
|
|
||||||
libbacktrace_la_LIBADD = \
|
|
||||||
$(BACKTRACE_FILE) \
|
|
||||||
$(FORMAT_FILE) \
|
|
||||||
$(VIEW_FILE) \
|
|
||||||
$(ALLOC_FILE)
|
|
||||||
|
|
||||||
libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
|
|
||||||
|
|
||||||
# Testsuite.
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a program,
|
|
||||||
# with SOURCES, etc.
|
|
||||||
check_PROGRAMS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be run.
|
|
||||||
TESTS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a Makefile
|
|
||||||
# target and run.
|
|
||||||
MAKETESTS =
|
|
||||||
|
|
||||||
# Add a test to this variable if you want it to be built as a program,
|
|
||||||
# with SOURCES, etc., and run.
|
|
||||||
BUILDTESTS =
|
|
||||||
|
|
||||||
# Add a file to this variable if you want it to be built for testing.
|
|
||||||
check_DATA =
|
|
||||||
|
|
||||||
# Flags to use when compiling test programs.
|
|
||||||
libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
|
|
||||||
%.dSYM: %
|
|
||||||
$(DSYMUTIL) $<
|
|
||||||
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if NATIVE
|
|
||||||
check_LTLIBRARIES = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
libbacktrace_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) read.lo alloc.lo
|
|
||||||
|
|
||||||
libbacktrace_alloc_la_DEPENDENCIES = $(libbacktrace_alloc_la_LIBADD)
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_noformat.la
|
|
||||||
|
|
||||||
libbacktrace_noformat_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_noformat_la_LIBADD = $(BACKTRACE_FILE) $(VIEW_FILE) $(ALLOC_FILE)
|
|
||||||
|
|
||||||
libbacktrace_noformat_la_DEPENDENCIES = $(libbacktrace_noformat_la_LIBADD)
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
TEST_BUILD_ID_DIR=$(abs_builddir)/usr/lib/debug/.build-id/
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
libbacktrace_elf_for_test_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_elf_for_test_la_LIBADD = $(BACKTRACE_FILE) elf_for_test.lo \
|
|
||||||
$(VIEW_FILE) $(ALLOC_FILE)
|
|
||||||
|
|
||||||
elf_for_test.c: elf.c
|
|
||||||
SEARCH='^#define SYSTEM_BUILD_ID_DIR.*$$'; \
|
|
||||||
REPLACE="#define SYSTEM_BUILD_ID_DIR \"$(TEST_BUILD_ID_DIR)\""; \
|
|
||||||
$(SED) "s%$$SEARCH%$$REPLACE%" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
elf_%.c: elf.c
|
|
||||||
SEARCH='#error "Unknown BACKTRACE_ELF_SIZE"'; \
|
|
||||||
REPLACE='#undef BACKTRACE_ELF_SIZE\
|
|
||||||
#define BACKTRACE_ELF_SIZE'; \
|
|
||||||
$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
xcoff_%.c: xcoff.c
|
|
||||||
SEARCH='#error "Unknown BACKTRACE_XCOFF_SIZE"'; \
|
|
||||||
REPLACE='#undef BACKTRACE_XCOFF_SIZE\
|
|
||||||
#define BACKTRACE_XCOFF_SIZE'; \
|
|
||||||
$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
|
|
||||||
$< \
|
|
||||||
> $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
test_elf_32_SOURCES = test_format.c testlib.c
|
|
||||||
test_elf_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_elf_32_LDADD = libbacktrace_noformat.la elf_32.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_elf_32
|
|
||||||
|
|
||||||
test_elf_64_SOURCES = test_format.c testlib.c
|
|
||||||
test_elf_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_elf_64_LDADD = libbacktrace_noformat.la elf_64.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_elf_64
|
|
||||||
|
|
||||||
test_macho_SOURCES = test_format.c testlib.c
|
|
||||||
test_macho_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_macho_LDADD = libbacktrace_noformat.la macho.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_macho
|
|
||||||
|
|
||||||
test_xcoff_32_SOURCES = test_format.c testlib.c
|
|
||||||
test_xcoff_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_xcoff_32_LDADD = libbacktrace_noformat.la xcoff_32.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_xcoff_32
|
|
||||||
|
|
||||||
test_xcoff_64_SOURCES = test_format.c testlib.c
|
|
||||||
test_xcoff_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_xcoff_64_LDADD = libbacktrace_noformat.la xcoff_64.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_xcoff_64
|
|
||||||
|
|
||||||
test_pecoff_SOURCES = test_format.c testlib.c
|
|
||||||
test_pecoff_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_pecoff_LDADD = libbacktrace_noformat.la pecoff.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_pecoff
|
|
||||||
|
|
||||||
test_unknown_SOURCES = test_format.c testlib.c
|
|
||||||
test_unknown_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
test_unknown_LDADD = libbacktrace_noformat.la unknown.lo
|
|
||||||
|
|
||||||
BUILDTESTS += test_unknown
|
|
||||||
|
|
||||||
unittest_SOURCES = unittest.c testlib.c
|
|
||||||
unittest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
unittest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += unittest
|
|
||||||
|
|
||||||
unittest_alloc_SOURCES = $(unittest_SOURCES)
|
|
||||||
unittest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
unittest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += unittest_alloc
|
|
||||||
|
|
||||||
check_LTLIBRARIES += libbacktrace_instrumented_alloc.la
|
|
||||||
|
|
||||||
libbacktrace_instrumented_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
|
|
||||||
libbacktrace_instrumented_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) \
|
|
||||||
read.lo instrumented_alloc.lo
|
|
||||||
|
|
||||||
libbacktrace_instrumented_alloc_la_DEPENDENCIES = \
|
|
||||||
$(libbacktrace_instrumented_alloc_la_LIBADD)
|
|
||||||
|
|
||||||
instrumented_alloc.lo: alloc.c
|
|
||||||
|
|
||||||
allocfail_SOURCES = allocfail.c testlib.c
|
|
||||||
allocfail_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
allocfail_LDADD = libbacktrace_instrumented_alloc.la
|
|
||||||
|
|
||||||
check_PROGRAMS += allocfail
|
|
||||||
|
|
||||||
allocfail.sh: allocfail
|
|
||||||
|
|
||||||
TESTS += allocfail.sh
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += allocfail.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
if HAVE_BUILDID
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
b2test_SOURCES = $(btest_SOURCES)
|
|
||||||
b2test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
b2test_LDFLAGS = -Wl,--build-id
|
|
||||||
b2test_LDADD = libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
check_PROGRAMS += b2test
|
|
||||||
MAKETESTS += b2test_buildid
|
|
||||||
|
|
||||||
if HAVE_DWZ
|
|
||||||
|
|
||||||
b3test_SOURCES = $(btest_SOURCES)
|
|
||||||
b3test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
b3test_LDFLAGS = -Wl,--build-id
|
|
||||||
b3test_LDADD = libbacktrace_elf_for_test.la
|
|
||||||
|
|
||||||
check_PROGRAMS += b3test
|
|
||||||
MAKETESTS += b3test_dwz_buildid
|
|
||||||
|
|
||||||
endif HAVE_DWZ
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
endif HAVE_BUILDID
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
btest_SOURCES = btest.c testlib.c
|
|
||||||
btest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
|
|
||||||
btest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += btest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
btest_lto_SOURCES = btest.c testlib.c
|
|
||||||
btest_lto_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O -flto
|
|
||||||
btest_lto_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest_lto
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
btest_alloc_SOURCES = $(btest_SOURCES)
|
|
||||||
btest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
btest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += btest_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += btest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_DWZ
|
|
||||||
|
|
||||||
%_dwz: %
|
|
||||||
rm -f $@ $@_common.debug
|
|
||||||
cp $< $@_1
|
|
||||||
cp $< $@_2
|
|
||||||
if $(DWZ) -m $@_common.debug $@_1 $@_2; then \
|
|
||||||
rm -f $@_2; \
|
|
||||||
mv $@_1 $@; \
|
|
||||||
else \
|
|
||||||
echo "Ignoring dwz errors, assuming that test passes"; \
|
|
||||||
cp $< $@; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
MAKETESTS += btest_dwz
|
|
||||||
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
MAKETESTS += btest_dwz_gnudebuglink
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
endif HAVE_DWZ
|
|
||||||
|
|
||||||
stest_SOURCES = stest.c
|
|
||||||
stest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
stest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += stest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += stest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
stest_alloc_SOURCES = $(stest_SOURCES)
|
|
||||||
stest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
stest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += stest_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += stest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
ztest_SOURCES = ztest.c testlib.c
|
|
||||||
ztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
ztest_LDADD = libbacktrace.la
|
|
||||||
ztest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_ZLIB
|
|
||||||
ztest_LDADD += -lz
|
|
||||||
ztest_alloc_LDADD += -lz
|
|
||||||
endif
|
|
||||||
ztest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
ztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += ztest
|
|
||||||
|
|
||||||
ztest_alloc_SOURCES = $(ztest_SOURCES)
|
|
||||||
ztest_alloc_CFLAGS = $(ztest_CFLAGS)
|
|
||||||
|
|
||||||
BUILDTESTS += ztest_alloc
|
|
||||||
|
|
||||||
zstdtest_SOURCES = zstdtest.c testlib.c
|
|
||||||
zstdtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
zstdtest_LDADD = libbacktrace.la
|
|
||||||
zstdtest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_ZSTD
|
|
||||||
zstdtest_LDADD += -lzstd
|
|
||||||
zstdtest_alloc_LDADD += -lzstd
|
|
||||||
endif
|
|
||||||
zstdtest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
zstdtest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += zstdtest
|
|
||||||
|
|
||||||
zstdtest_alloc_SOURCES = $(zstdtest_SOURCES)
|
|
||||||
zstdtest_alloc_CFLAGS = $(zstdtest_CFLAGS)
|
|
||||||
|
|
||||||
BUILDTESTS += zstdtest_alloc
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
edtest_SOURCES = edtest.c edtest2_build.c testlib.c
|
|
||||||
edtest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
edtest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += edtest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += edtest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
edtest_alloc_SOURCES = $(edtest_SOURCES)
|
|
||||||
edtest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
edtest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += edtest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
BUILDTESTS += edtest_alloc
|
|
||||||
|
|
||||||
edtest2_build.c: gen_edtest2_build; @true
|
|
||||||
gen_edtest2_build: $(srcdir)/edtest2.c
|
|
||||||
cat $(srcdir)/edtest2.c > tmp-edtest2_build.c
|
|
||||||
$(SHELL) $(srcdir)/move-if-change tmp-edtest2_build.c edtest2_build.c
|
|
||||||
echo timestamp > $@
|
|
||||||
|
|
||||||
if HAVE_PTHREAD
|
|
||||||
|
|
||||||
BUILDTESTS += ttest
|
|
||||||
|
|
||||||
ttest_SOURCES = ttest.c testlib.c
|
|
||||||
ttest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -pthread
|
|
||||||
ttest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += ttest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
BUILDTESTS += ttest_alloc
|
|
||||||
|
|
||||||
ttest_alloc_SOURCES = $(ttest_SOURCES)
|
|
||||||
ttest_alloc_CFLAGS = $(ttest_CFLAGS)
|
|
||||||
ttest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += ttest_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
endif HAVE_PTHREAD
|
|
||||||
|
|
||||||
if HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
MAKETESTS += btest_gnudebuglink
|
|
||||||
|
|
||||||
%_gnudebuglink: %
|
|
||||||
$(OBJCOPY) --only-keep-debug $< $@.debug
|
|
||||||
$(OBJCOPY) --strip-debug --add-gnu-debuglink=$@.debug $< $@
|
|
||||||
|
|
||||||
endif HAVE_OBJCOPY_DEBUGLINK
|
|
||||||
|
|
||||||
%_buildid: %
|
|
||||||
./install-debuginfo-for-buildid.sh \
|
|
||||||
"$(TEST_BUILD_ID_DIR)" \
|
|
||||||
$<
|
|
||||||
$(OBJCOPY) --strip-debug $< $@
|
|
||||||
|
|
||||||
if HAVE_COMPRESSED_DEBUG
|
|
||||||
|
|
||||||
ctestg_SOURCES = btest.c testlib.c
|
|
||||||
ctestg_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctestg_LDFLAGS = -Wl,--compress-debug-sections=zlib-gnu
|
|
||||||
ctestg_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
ctesta_SOURCES = btest.c testlib.c
|
|
||||||
ctesta_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctesta_LDFLAGS = -Wl,--compress-debug-sections=zlib-gabi
|
|
||||||
ctesta_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestg ctesta
|
|
||||||
|
|
||||||
if HAVE_COMPRESSED_DEBUG_ZSTD
|
|
||||||
|
|
||||||
ctestzstd_SOURCES = btest.c testlib.c
|
|
||||||
ctestzstd_CFLAGS = $(libbacktrace_TEST_CFLAGS)
|
|
||||||
ctestzstd_LDFLAGS = -Wl,--compress-debug-sections=zstd
|
|
||||||
ctestzstd_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestzstd
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
ctestg_alloc_SOURCES = $(ctestg_SOURCES)
|
|
||||||
ctestg_alloc_CFLAGS = $(ctestg_CFLAGS)
|
|
||||||
ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS)
|
|
||||||
ctestg_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
ctesta_alloc_SOURCES = $(ctesta_SOURCES)
|
|
||||||
ctesta_alloc_CFLAGS = $(ctesta_CFLAGS)
|
|
||||||
ctesta_alloc_LDFLAGS = $(ctesta_LDFLAGS)
|
|
||||||
ctesta_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += ctestg_alloc ctesta_alloc
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_DWARF5
|
|
||||||
|
|
||||||
dwarf5_SOURCES = btest.c testlib.c
|
|
||||||
dwarf5_CFLAGS = $(libbacktrace_TEST_CFLAGS) -gdwarf-5
|
|
||||||
dwarf5_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += dwarf5
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += dwarf5.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
dwarf5_alloc_SOURCES = $(dwarf5_SOURCES)
|
|
||||||
dwarf5_alloc_CFLAGS = $(dwarf5_CFLAGS)
|
|
||||||
dwarf5_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
BUILDTESTS += dwarf5_alloc
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += dwarf5_alloc.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
mtest_SOURCES = mtest.c testlib.c
|
|
||||||
mtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
|
|
||||||
mtest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
BUILDTESTS += mtest
|
|
||||||
|
|
||||||
if USE_DSYMUTIL
|
|
||||||
check_DATA += mtest.dSYM
|
|
||||||
endif USE_DSYMUTIL
|
|
||||||
|
|
||||||
if HAVE_MINIDEBUG
|
|
||||||
|
|
||||||
MAKETESTS += mtest_minidebug
|
|
||||||
|
|
||||||
%_minidebug: %
|
|
||||||
$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
|
|
||||||
$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
|
|
||||||
$(COMM) -13 $<.dsyms $<.fsyms > $<.keepsyms
|
|
||||||
$(OBJCOPY) --only-keep-debug $< $<.dbg
|
|
||||||
$(OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$<.keepsyms $<.dbg $<.mdbg
|
|
||||||
$(OBJCOPY) --strip-all --remove-section ..comment $< $<.strip
|
|
||||||
rm -f $<.mdbg.xz
|
|
||||||
$(XZ) $<.mdbg
|
|
||||||
$(OBJCOPY) --add-section .gnu_debugdata=$<.mdbg.xz $<.strip
|
|
||||||
mv $<.strip $@
|
|
||||||
|
|
||||||
endif HAVE_MINIDEBUG
|
|
||||||
|
|
||||||
endif NATIVE
|
|
||||||
|
|
||||||
if HAVE_ELF
|
|
||||||
|
|
||||||
xztest_SOURCES = xztest.c testlib.c
|
|
||||||
xztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
|
|
||||||
xztest_LDADD = libbacktrace.la
|
|
||||||
|
|
||||||
xztest_alloc_SOURCES = $(xztest_SOURCES)
|
|
||||||
xztest_alloc_CFLAGS = $(xztest_CFLAGS)
|
|
||||||
xztest_alloc_LDADD = libbacktrace_alloc.la
|
|
||||||
|
|
||||||
if HAVE_LIBLZMA
|
|
||||||
xztest_LDADD += -llzma
|
|
||||||
xztest_alloc_LDADD += -llzma
|
|
||||||
endif
|
|
||||||
|
|
||||||
xztest_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
xztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
BUILDTESTS += xztest xztest_alloc
|
|
||||||
|
|
||||||
endif HAVE_ELF
|
|
||||||
|
|
||||||
check_PROGRAMS += $(BUILDTESTS)
|
|
||||||
|
|
||||||
TESTS += $(MAKETESTS) $(BUILDTESTS)
|
|
||||||
|
|
||||||
CLEANFILES = \
|
|
||||||
$(MAKETESTS) $(BUILDTESTS) *.debug elf_for_test.c edtest2_build.c \
|
|
||||||
gen_edtest2_build \
|
|
||||||
*.dsyms *.fsyms *.keepsyms *.dbg *.mdbg *.mdbg.xz *.strip
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
-rm -rf usr
|
|
||||||
|
|
||||||
# We can't use automake's automatic dependency tracking, because it
|
|
||||||
# breaks when using bootstrap-lean. Automatic dependency tracking
|
|
||||||
# with GCC bootstrap will cause some of the objects to depend on
|
|
||||||
# header files in prev-gcc/include, e.g., stddef.h and stdarg.h. When
|
|
||||||
# using bootstrap-lean, prev-gcc is removed after each stage. When
|
|
||||||
# running "make install", those header files will be gone, causing the
|
|
||||||
# library to be rebuilt at install time. That may not succeed.
|
|
||||||
|
|
||||||
# These manual dependencies do not include dependencies on unwind.h,
|
|
||||||
# even though that is part of GCC, because where to find it depends on
|
|
||||||
# whether we are being built as a host library or a target library.
|
|
||||||
|
|
||||||
alloc.lo: config.h backtrace.h internal.h
|
|
||||||
backtrace.lo: config.h backtrace.h internal.h
|
|
||||||
btest.lo: filenames.h backtrace.h backtrace-supported.h
|
|
||||||
dwarf.lo: config.h filenames.h backtrace.h internal.h
|
|
||||||
elf.lo: config.h backtrace.h internal.h
|
|
||||||
fileline.lo: config.h backtrace.h internal.h
|
|
||||||
macho.lo: config.h backtrace.h internal.h
|
|
||||||
mmap.lo: config.h backtrace.h internal.h
|
|
||||||
mmapio.lo: config.h backtrace.h internal.h
|
|
||||||
mtest.lo: backtrace.h backtrace-supported.h
|
|
||||||
nounwind.lo: config.h internal.h
|
|
||||||
pecoff.lo: config.h backtrace.h internal.h
|
|
||||||
posix.lo: config.h backtrace.h internal.h
|
|
||||||
print.lo: config.h backtrace.h internal.h
|
|
||||||
read.lo: config.h backtrace.h internal.h
|
|
||||||
simple.lo: config.h backtrace.h internal.h
|
|
||||||
sort.lo: config.h backtrace.h internal.h
|
|
||||||
stest.lo: config.h backtrace.h internal.h
|
|
||||||
state.lo: config.h backtrace.h backtrace-supported.h internal.h
|
|
||||||
unknown.lo: config.h backtrace.h internal.h
|
|
||||||
xcoff.lo: config.h backtrace.h internal.h
|
|
||||||
xztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
|
|
||||||
ztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
|
|
||||||
|
|
2666
deps/libbacktrace/Makefile.in
vendored
2666
deps/libbacktrace/Makefile.in
vendored
File diff suppressed because it is too large
Load Diff
36
deps/libbacktrace/README.md
vendored
36
deps/libbacktrace/README.md
vendored
@ -1,36 +0,0 @@
|
|||||||
# libbacktrace
|
|
||||||
A C library that may be linked into a C/C++ program to produce symbolic backtraces
|
|
||||||
|
|
||||||
Initially written by Ian Lance Taylor <iant@golang.org>.
|
|
||||||
|
|
||||||
This is version 1.0.
|
|
||||||
It is likely that this will always be version 1.0.
|
|
||||||
|
|
||||||
The libbacktrace library may be linked into a program or library and
|
|
||||||
used to produce symbolic backtraces.
|
|
||||||
Sample uses would be to print a detailed backtrace when an error
|
|
||||||
occurs or to gather detailed profiling information.
|
|
||||||
In general the functions provided by this library are async-signal-safe,
|
|
||||||
meaning that they may be safely called from a signal handler.
|
|
||||||
|
|
||||||
The libbacktrace library is provided under a BSD license.
|
|
||||||
See the source files for the exact license text.
|
|
||||||
|
|
||||||
The public functions are declared and documented in the header file
|
|
||||||
backtrace.h, which should be #include'd by a user of the library.
|
|
||||||
|
|
||||||
Building libbacktrace will generate a file backtrace-supported.h,
|
|
||||||
which a user of the library may use to determine whether backtraces
|
|
||||||
will work.
|
|
||||||
See the source file backtrace-supported.h.in for the macros that it
|
|
||||||
defines.
|
|
||||||
|
|
||||||
As of October 2020, libbacktrace supports ELF, PE/COFF, Mach-O, and
|
|
||||||
XCOFF executables with DWARF debugging information.
|
|
||||||
In other words, it supports GNU/Linux, *BSD, macOS, Windows, and AIX.
|
|
||||||
The library is written to make it straightforward to add support for
|
|
||||||
other object file and debugging formats.
|
|
||||||
|
|
||||||
The library relies on the C++ unwind API defined at
|
|
||||||
https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
|
|
||||||
This API is provided by GCC and clang.
|
|
864
deps/libbacktrace/aclocal.m4
vendored
864
deps/libbacktrace/aclocal.m4
vendored
@ -1,864 +0,0 @@
|
|||||||
# 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]))])
|
|
||||||
|
|
||||||
# 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])])
|
|
||||||
|
|
||||||
# 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
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
# 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([config/lead-dot.m4])
|
|
||||||
m4_include([config/libtool.m4])
|
|
||||||
m4_include([config/ltoptions.m4])
|
|
||||||
m4_include([config/ltsugar.m4])
|
|
||||||
m4_include([config/ltversion.m4])
|
|
||||||
m4_include([config/lt~obsolete.m4])
|
|
||||||
m4_include([config/multi.m4])
|
|
||||||
m4_include([config/override.m4])
|
|
||||||
m4_include([config/unwind_ipinfo.m4])
|
|
||||||
m4_include([config/warnings.m4])
|
|
167
deps/libbacktrace/alloc.c
vendored
167
deps/libbacktrace/alloc.c
vendored
@ -1,167 +0,0 @@
|
|||||||
/* alloc.c -- Memory allocation without mmap.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* Allocation routines to use on systems that do not support anonymous
|
|
||||||
mmap. This implementation just uses malloc, which means that the
|
|
||||||
backtrace functions may not be safely invoked from a signal
|
|
||||||
handler. */
|
|
||||||
|
|
||||||
/* Allocate memory like malloc. If ERROR_CALLBACK is NULL, don't
|
|
||||||
report an error. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_alloc (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
size_t size, backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
ret = malloc (size);
|
|
||||||
if (ret == NULL)
|
|
||||||
{
|
|
||||||
if (error_callback)
|
|
||||||
error_callback (data, "malloc", errno);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free memory. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_free (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
void *p, size_t size ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
free (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Grow VEC by SIZE bytes. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_vector_grow (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
size_t size, backtrace_error_callback error_callback,
|
|
||||||
void *data, struct backtrace_vector *vec)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (size > vec->alc)
|
|
||||||
{
|
|
||||||
size_t alc;
|
|
||||||
void *base;
|
|
||||||
|
|
||||||
if (vec->size == 0)
|
|
||||||
alc = 32 * size;
|
|
||||||
else if (vec->size >= 4096)
|
|
||||||
alc = vec->size + 4096;
|
|
||||||
else
|
|
||||||
alc = 2 * vec->size;
|
|
||||||
|
|
||||||
if (alc < vec->size + size)
|
|
||||||
alc = vec->size + size;
|
|
||||||
|
|
||||||
base = realloc (vec->base, alc);
|
|
||||||
if (base == NULL)
|
|
||||||
{
|
|
||||||
error_callback (data, "realloc", errno);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec->base = base;
|
|
||||||
vec->alc = alc - vec->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = (char *) vec->base + vec->size;
|
|
||||||
vec->size += size;
|
|
||||||
vec->alc -= size;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finish the current allocation on VEC. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_vector_finish (struct backtrace_state *state,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
/* With this allocator we call realloc in backtrace_vector_grow,
|
|
||||||
which means we can't easily reuse the memory here. So just
|
|
||||||
release it. */
|
|
||||||
if (!backtrace_vector_release (state, vec, error_callback, data))
|
|
||||||
return NULL;
|
|
||||||
ret = vec->base;
|
|
||||||
vec->base = NULL;
|
|
||||||
vec->size = 0;
|
|
||||||
vec->alc = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release any extra space allocated for VEC. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_vector_release (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
vec->alc = 0;
|
|
||||||
|
|
||||||
if (vec->size == 0)
|
|
||||||
{
|
|
||||||
/* As of C17, realloc with size 0 is marked as an obsolescent feature, use
|
|
||||||
free instead. */
|
|
||||||
free (vec->base);
|
|
||||||
vec->base = NULL;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec->base = realloc (vec->base, vec->size);
|
|
||||||
if (vec->base == NULL)
|
|
||||||
{
|
|
||||||
error_callback (data, "realloc", errno);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
136
deps/libbacktrace/allocfail.c
vendored
136
deps/libbacktrace/allocfail.c
vendored
@ -1,136 +0,0 @@
|
|||||||
/* allocfail.c -- Test for libbacktrace library
|
|
||||||
Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
extern uint64_t get_nr_allocs (void);
|
|
||||||
extern void set_fail_at_alloc (uint64_t);
|
|
||||||
extern int at_fail_alloc_p (void);
|
|
||||||
|
|
||||||
static int test1 (void) __attribute__ ((noinline, unused));
|
|
||||||
static int f2 (int) __attribute__ ((noinline));
|
|
||||||
static int f3 (int, int) __attribute__ ((noinline));
|
|
||||||
|
|
||||||
static unsigned callback_errors = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback_full (void *vdata ATTRIBUTE_UNUSED,
|
|
||||||
const char *msg ATTRIBUTE_UNUSED,
|
|
||||||
int errnum ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
if (at_fail_alloc_p ())
|
|
||||||
{
|
|
||||||
set_fail_at_alloc (0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
callback_errors++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
callback_full (void *vdata ATTRIBUTE_UNUSED, uintptr_t pc ATTRIBUTE_UNUSED,
|
|
||||||
const char *filename ATTRIBUTE_UNUSED,
|
|
||||||
int lineno ATTRIBUTE_UNUSED,
|
|
||||||
const char *function ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
return f2 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f2 (int f1line)
|
|
||||||
{
|
|
||||||
return f3 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f3 (int f1line ATTRIBUTE_UNUSED, int f2line ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i = backtrace_full (state, 0, callback_full, error_callback_full, NULL);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (callback_errors)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run all the tests. */
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
uint64_t fail_at = 0;
|
|
||||||
|
|
||||||
if (argc == 2)
|
|
||||||
{
|
|
||||||
fail_at = atoi (argv[1]);
|
|
||||||
set_fail_at_alloc (fail_at);
|
|
||||||
}
|
|
||||||
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_full, NULL);
|
|
||||||
if (state == NULL)
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
|
|
||||||
#if BACKTRACE_SUPPORTED
|
|
||||||
test1 ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (argc == 1)
|
|
||||||
fprintf (stderr, "%llu\n", (long long unsigned) get_nr_allocs ());
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
104
deps/libbacktrace/allocfail.sh
vendored
104
deps/libbacktrace/allocfail.sh
vendored
@ -1,104 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# allocfail.sh -- Test for libbacktrace library.
|
|
||||||
# Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ ! -f ./allocfail ]; then
|
|
||||||
# Hard failure.
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
allocs=$(./allocfail 2>&1)
|
|
||||||
if [ "$allocs" = "" ]; then
|
|
||||||
# Hard failure.
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# This generates the following output:
|
|
||||||
# ...
|
|
||||||
# $ allocfail.sh
|
|
||||||
# allocs: 80495
|
|
||||||
# Status changed to 0 at 1
|
|
||||||
# Status changed to 1 at 3
|
|
||||||
# Status changed to 0 at 11
|
|
||||||
# Status changed to 1 at 12
|
|
||||||
# Status changed to 0 at 845
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
# We have status 0 for an allocation failure at:
|
|
||||||
# - 1 because backtrace_create_state handles failure robustly
|
|
||||||
# - 2 because the fail switches backtrace_full to !can_alloc mode.
|
|
||||||
# - 11 because failure of elf_open_debugfile_by_buildid does not generate an
|
|
||||||
# error callback beyond the one for the allocation failure itself.
|
|
||||||
|
|
||||||
echo "allocs: $allocs"
|
|
||||||
|
|
||||||
step=1
|
|
||||||
i=1
|
|
||||||
passes=0
|
|
||||||
prev_status=-1
|
|
||||||
while [ $i -le $allocs ]; do
|
|
||||||
if ./allocfail $i >/dev/null 2>&1; status=$?; then
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
if [ $status -gt 1 ]; then
|
|
||||||
echo "Unallowed fail found: $i"
|
|
||||||
# Failure.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The test-case would run too long if we would excercise all allocs.
|
|
||||||
# So, run with step 1 initially, and increase the step once we have 10
|
|
||||||
# subsequent passes, and drop back to step 1 once we encounter another
|
|
||||||
# failure. This takes ~2.6 seconds on an i7-6600U CPU @ 2.60GHz.
|
|
||||||
if [ $status -eq 0 ]; then
|
|
||||||
passes=$(($passes + 1))
|
|
||||||
if [ $passes -ge 10 ]; then
|
|
||||||
step=$((step * 10))
|
|
||||||
passes=0
|
|
||||||
fi
|
|
||||||
elif [ $status -eq 1 ]; then
|
|
||||||
passes=0
|
|
||||||
step=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $status -ne $prev_status ]; then
|
|
||||||
echo "Status changed to $status at $i"
|
|
||||||
fi
|
|
||||||
prev_status=$status
|
|
||||||
|
|
||||||
i=$(($i + $step))
|
|
||||||
done
|
|
||||||
|
|
||||||
# Success.
|
|
||||||
exit 0
|
|
113
deps/libbacktrace/atomic.c
vendored
113
deps/libbacktrace/atomic.c
vendored
@ -1,113 +0,0 @@
|
|||||||
/* atomic.c -- Support for atomic functions if not present.
|
|
||||||
Copyright (C) 2013-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* This file holds implementations of the atomic functions that are
|
|
||||||
used if the host compiler has the sync functions but not the atomic
|
|
||||||
functions, as is true of versions of GCC before 4.7. */
|
|
||||||
|
|
||||||
#if !defined (HAVE_ATOMIC_FUNCTIONS) && defined (HAVE_SYNC_FUNCTIONS)
|
|
||||||
|
|
||||||
/* Do an atomic load of a pointer. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_atomic_load_pointer (void *arg)
|
|
||||||
{
|
|
||||||
void **pp;
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
pp = (void **) arg;
|
|
||||||
p = *pp;
|
|
||||||
while (!__sync_bool_compare_and_swap (pp, p, p))
|
|
||||||
p = *pp;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do an atomic load of an int. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_atomic_load_int (int *p)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i = *p;
|
|
||||||
while (!__sync_bool_compare_and_swap (p, i, i))
|
|
||||||
i = *p;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do an atomic store of a pointer. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_atomic_store_pointer (void *arg, void *p)
|
|
||||||
{
|
|
||||||
void **pp;
|
|
||||||
void *old;
|
|
||||||
|
|
||||||
pp = (void **) arg;
|
|
||||||
old = *pp;
|
|
||||||
while (!__sync_bool_compare_and_swap (pp, old, p))
|
|
||||||
old = *pp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do an atomic store of a size_t value. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_atomic_store_size_t (size_t *p, size_t v)
|
|
||||||
{
|
|
||||||
size_t old;
|
|
||||||
|
|
||||||
old = *p;
|
|
||||||
while (!__sync_bool_compare_and_swap (p, old, v))
|
|
||||||
old = *p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do an atomic store of a int value. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_atomic_store_int (int *p, int v)
|
|
||||||
{
|
|
||||||
size_t old;
|
|
||||||
|
|
||||||
old = *p;
|
|
||||||
while (!__sync_bool_compare_and_swap (p, old, v))
|
|
||||||
old = *p;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
66
deps/libbacktrace/backtrace-supported.h.in
vendored
66
deps/libbacktrace/backtrace-supported.h.in
vendored
@ -1,66 +0,0 @@
|
|||||||
/* backtrace-supported.h.in -- Whether stack backtrace is supported.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* The file backtrace-supported.h.in is used by configure to generate
|
|
||||||
the file backtrace-supported.h. The file backtrace-supported.h may
|
|
||||||
be #include'd to see whether the backtrace library will be able to
|
|
||||||
get a backtrace and produce symbolic information. */
|
|
||||||
|
|
||||||
|
|
||||||
/* BACKTRACE_SUPPORTED will be #define'd as 1 if the backtrace library
|
|
||||||
should work, 0 if it will not. Libraries may #include this to make
|
|
||||||
other arrangements. */
|
|
||||||
|
|
||||||
#define BACKTRACE_SUPPORTED @BACKTRACE_SUPPORTED@
|
|
||||||
|
|
||||||
/* BACKTRACE_USES_MALLOC will be #define'd as 1 if the backtrace
|
|
||||||
library will call malloc as it works, 0 if it will call mmap
|
|
||||||
instead. This may be used to determine whether it is safe to call
|
|
||||||
the backtrace functions from a signal handler. In general this
|
|
||||||
only applies to calls like backtrace and backtrace_pcinfo. It does
|
|
||||||
not apply to backtrace_simple, which never calls malloc. It does
|
|
||||||
not apply to backtrace_print, which always calls fprintf and
|
|
||||||
therefore malloc. */
|
|
||||||
|
|
||||||
#define BACKTRACE_USES_MALLOC @BACKTRACE_USES_MALLOC@
|
|
||||||
|
|
||||||
/* BACKTRACE_SUPPORTS_THREADS will be #define'd as 1 if the backtrace
|
|
||||||
library is configured with threading support, 0 if not. If this is
|
|
||||||
0, the threaded parameter to backtrace_create_state must be passed
|
|
||||||
as 0. */
|
|
||||||
|
|
||||||
#define BACKTRACE_SUPPORTS_THREADS @BACKTRACE_SUPPORTS_THREADS@
|
|
||||||
|
|
||||||
/* BACKTRACE_SUPPORTS_DATA will be #defined'd as 1 if the backtrace_syminfo
|
|
||||||
will work for variables. It will always work for functions. */
|
|
||||||
|
|
||||||
#define BACKTRACE_SUPPORTS_DATA @BACKTRACE_SUPPORTS_DATA@
|
|
129
deps/libbacktrace/backtrace.c
vendored
129
deps/libbacktrace/backtrace.c
vendored
@ -1,129 +0,0 @@
|
|||||||
/* backtrace.c -- Entry point for stack backtrace library.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "unwind.h"
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* The main backtrace_full routine. */
|
|
||||||
|
|
||||||
/* Data passed through _Unwind_Backtrace. */
|
|
||||||
|
|
||||||
struct backtrace_data
|
|
||||||
{
|
|
||||||
/* Number of frames to skip. */
|
|
||||||
int skip;
|
|
||||||
/* Library state. */
|
|
||||||
struct backtrace_state *state;
|
|
||||||
/* Callback routine. */
|
|
||||||
backtrace_full_callback callback;
|
|
||||||
/* Error callback routine. */
|
|
||||||
backtrace_error_callback error_callback;
|
|
||||||
/* Data to pass to callback routines. */
|
|
||||||
void *data;
|
|
||||||
/* Value to return from backtrace_full. */
|
|
||||||
int ret;
|
|
||||||
/* Whether there is any memory available. */
|
|
||||||
int can_alloc;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Unwind library callback routine. This is passed to
|
|
||||||
_Unwind_Backtrace. */
|
|
||||||
|
|
||||||
static _Unwind_Reason_Code
|
|
||||||
unwind (struct _Unwind_Context *context, void *vdata)
|
|
||||||
{
|
|
||||||
struct backtrace_data *bdata = (struct backtrace_data *) vdata;
|
|
||||||
uintptr_t pc;
|
|
||||||
int ip_before_insn = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_GETIPINFO
|
|
||||||
pc = _Unwind_GetIPInfo (context, &ip_before_insn);
|
|
||||||
#else
|
|
||||||
pc = _Unwind_GetIP (context);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bdata->skip > 0)
|
|
||||||
{
|
|
||||||
--bdata->skip;
|
|
||||||
return _URC_NO_REASON;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ip_before_insn)
|
|
||||||
--pc;
|
|
||||||
|
|
||||||
if (!bdata->can_alloc)
|
|
||||||
bdata->ret = bdata->callback (bdata->data, pc, NULL, 0, NULL);
|
|
||||||
else
|
|
||||||
bdata->ret = backtrace_pcinfo (bdata->state, pc, bdata->callback,
|
|
||||||
bdata->error_callback, bdata->data);
|
|
||||||
if (bdata->ret != 0)
|
|
||||||
return _URC_END_OF_STACK;
|
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get a stack backtrace. */
|
|
||||||
|
|
||||||
int __attribute__((noinline))
|
|
||||||
backtrace_full (struct backtrace_state *state, int skip,
|
|
||||||
backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
struct backtrace_data bdata;
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
bdata.skip = skip + 1;
|
|
||||||
bdata.state = state;
|
|
||||||
bdata.callback = callback;
|
|
||||||
bdata.error_callback = error_callback;
|
|
||||||
bdata.data = data;
|
|
||||||
bdata.ret = 0;
|
|
||||||
|
|
||||||
/* If we can't allocate any memory at all, don't try to produce
|
|
||||||
file/line information. */
|
|
||||||
p = backtrace_alloc (state, 4096, NULL, NULL);
|
|
||||||
if (p == NULL)
|
|
||||||
bdata.can_alloc = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
backtrace_free (state, p, 4096, NULL, NULL);
|
|
||||||
bdata.can_alloc = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_Unwind_Backtrace (unwind, &bdata);
|
|
||||||
return bdata.ret;
|
|
||||||
}
|
|
189
deps/libbacktrace/backtrace.h
vendored
189
deps/libbacktrace/backtrace.h
vendored
@ -1,189 +0,0 @@
|
|||||||
/* backtrace.h -- Public header file for stack backtrace library.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#ifndef BACKTRACE_H
|
|
||||||
#define BACKTRACE_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The backtrace state. This struct is intentionally not defined in
|
|
||||||
the public interface. */
|
|
||||||
|
|
||||||
struct backtrace_state;
|
|
||||||
|
|
||||||
/* The type of the error callback argument to backtrace functions.
|
|
||||||
This function, if not NULL, will be called for certain error cases.
|
|
||||||
The DATA argument is passed to the function that calls this one.
|
|
||||||
The MSG argument is an error message. The ERRNUM argument, if
|
|
||||||
greater than 0, holds an errno value. The MSG buffer may become
|
|
||||||
invalid after this function returns.
|
|
||||||
|
|
||||||
As a special case, the ERRNUM argument will be passed as -1 if no
|
|
||||||
debug info can be found for the executable, or if the debug info
|
|
||||||
exists but has an unsupported version, but the function requires
|
|
||||||
debug info (e.g., backtrace_full, backtrace_pcinfo). The MSG in
|
|
||||||
this case will be something along the lines of "no debug info".
|
|
||||||
Similarly, ERRNUM will be passed as -1 if there is no symbol table,
|
|
||||||
but the function requires a symbol table (e.g., backtrace_syminfo).
|
|
||||||
This may be used as a signal that some other approach should be
|
|
||||||
tried. */
|
|
||||||
|
|
||||||
typedef void (*backtrace_error_callback) (void *data, const char *msg,
|
|
||||||
int errnum);
|
|
||||||
|
|
||||||
/* Create state information for the backtrace routines. This must be
|
|
||||||
called before any of the other routines, and its return value must
|
|
||||||
be passed to all of the other routines. FILENAME is the path name
|
|
||||||
of the executable file; if it is NULL the library will try
|
|
||||||
system-specific path names. If not NULL, FILENAME must point to a
|
|
||||||
permanent buffer. If THREADED is non-zero the state may be
|
|
||||||
accessed by multiple threads simultaneously, and the library will
|
|
||||||
use appropriate atomic operations. If THREADED is zero the state
|
|
||||||
may only be accessed by one thread at a time. This returns a state
|
|
||||||
pointer on success, NULL on error. If an error occurs, this will
|
|
||||||
call the ERROR_CALLBACK routine.
|
|
||||||
|
|
||||||
Calling this function allocates resources that cannot be freed.
|
|
||||||
There is no backtrace_free_state function. The state is used to
|
|
||||||
cache information that is expensive to recompute. Programs are
|
|
||||||
expected to call this function at most once and to save the return
|
|
||||||
value for all later calls to backtrace functions. */
|
|
||||||
|
|
||||||
extern struct backtrace_state *backtrace_create_state (
|
|
||||||
const char *filename, int threaded,
|
|
||||||
backtrace_error_callback error_callback, void *data);
|
|
||||||
|
|
||||||
/* The type of the callback argument to the backtrace_full function.
|
|
||||||
DATA is the argument passed to backtrace_full. PC is the program
|
|
||||||
counter. FILENAME is the name of the file containing PC, or NULL
|
|
||||||
if not available. LINENO is the line number in FILENAME containing
|
|
||||||
PC, or 0 if not available. FUNCTION is the name of the function
|
|
||||||
containing PC, or NULL if not available. This should return 0 to
|
|
||||||
continuing tracing. The FILENAME and FUNCTION buffers may become
|
|
||||||
invalid after this function returns. */
|
|
||||||
|
|
||||||
typedef int (*backtrace_full_callback) (void *data, uintptr_t pc,
|
|
||||||
const char *filename, int lineno,
|
|
||||||
const char *function);
|
|
||||||
|
|
||||||
/* Get a full stack backtrace. SKIP is the number of frames to skip;
|
|
||||||
passing 0 will start the trace with the function calling
|
|
||||||
backtrace_full. DATA is passed to the callback routine. If any
|
|
||||||
call to CALLBACK returns a non-zero value, the stack backtrace
|
|
||||||
stops, and backtrace returns that value; this may be used to limit
|
|
||||||
the number of stack frames desired. If all calls to CALLBACK
|
|
||||||
return 0, backtrace returns 0. The backtrace_full function will
|
|
||||||
make at least one call to either CALLBACK or ERROR_CALLBACK. This
|
|
||||||
function requires debug info for the executable. */
|
|
||||||
|
|
||||||
extern int backtrace_full (struct backtrace_state *state, int skip,
|
|
||||||
backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* The type of the callback argument to the backtrace_simple function.
|
|
||||||
DATA is the argument passed to simple_backtrace. PC is the program
|
|
||||||
counter. This should return 0 to continue tracing. */
|
|
||||||
|
|
||||||
typedef int (*backtrace_simple_callback) (void *data, uintptr_t pc);
|
|
||||||
|
|
||||||
/* Get a simple backtrace. SKIP is the number of frames to skip, as
|
|
||||||
in backtrace. DATA is passed to the callback routine. If any call
|
|
||||||
to CALLBACK returns a non-zero value, the stack backtrace stops,
|
|
||||||
and backtrace_simple returns that value. Otherwise
|
|
||||||
backtrace_simple returns 0. The backtrace_simple function will
|
|
||||||
make at least one call to either CALLBACK or ERROR_CALLBACK. This
|
|
||||||
function does not require any debug info for the executable. */
|
|
||||||
|
|
||||||
extern int backtrace_simple (struct backtrace_state *state, int skip,
|
|
||||||
backtrace_simple_callback callback,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* Print the current backtrace in a user readable format to a FILE.
|
|
||||||
SKIP is the number of frames to skip, as in backtrace_full. Any
|
|
||||||
error messages are printed to stderr. This function requires debug
|
|
||||||
info for the executable. */
|
|
||||||
|
|
||||||
extern void backtrace_print (struct backtrace_state *state, int skip, FILE *);
|
|
||||||
|
|
||||||
/* Given PC, a program counter in the current program, call the
|
|
||||||
callback function with filename, line number, and function name
|
|
||||||
information. This will normally call the callback function exactly
|
|
||||||
once. However, if the PC happens to describe an inlined call, and
|
|
||||||
the debugging information contains the necessary information, then
|
|
||||||
this may call the callback function multiple times. This will make
|
|
||||||
at least one call to either CALLBACK or ERROR_CALLBACK. This
|
|
||||||
returns the first non-zero value returned by CALLBACK, or 0. */
|
|
||||||
|
|
||||||
extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
|
|
||||||
backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* The type of the callback argument to backtrace_syminfo. DATA and
|
|
||||||
PC are the arguments passed to backtrace_syminfo. SYMNAME is the
|
|
||||||
name of the symbol for the corresponding code. SYMVAL is the
|
|
||||||
value and SYMSIZE is the size of the symbol. SYMNAME will be NULL
|
|
||||||
if no error occurred but the symbol could not be found. */
|
|
||||||
|
|
||||||
typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,
|
|
||||||
const char *symname,
|
|
||||||
uintptr_t symval,
|
|
||||||
uintptr_t symsize);
|
|
||||||
|
|
||||||
/* Given ADDR, an address or program counter in the current program,
|
|
||||||
call the callback information with the symbol name and value
|
|
||||||
describing the function or variable in which ADDR may be found.
|
|
||||||
This will call either CALLBACK or ERROR_CALLBACK exactly once.
|
|
||||||
This returns 1 on success, 0 on failure. This function requires
|
|
||||||
the symbol table but does not require the debug info. Note that if
|
|
||||||
the symbol table is present but ADDR could not be found in the
|
|
||||||
table, CALLBACK will be called with a NULL SYMNAME argument.
|
|
||||||
Returns 1 on success, 0 on error. */
|
|
||||||
|
|
||||||
extern int backtrace_syminfo (struct backtrace_state *state, uintptr_t addr,
|
|
||||||
backtrace_syminfo_callback callback,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* End extern "C". */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
501
deps/libbacktrace/btest.c
vendored
501
deps/libbacktrace/btest.c
vendored
@ -1,501 +0,0 @@
|
|||||||
/* btest.c -- Test for libbacktrace library
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* This program tests the externally visible interfaces of the
|
|
||||||
libbacktrace library. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
/* Test the backtrace function with non-inlined functions. */
|
|
||||||
|
|
||||||
static int test1 (void) __attribute__ ((noinline, noclone, unused));
|
|
||||||
static int f2 (int) __attribute__ ((noinline, noclone));
|
|
||||||
static int f3 (int, int) __attribute__ ((noinline, noclone));
|
|
||||||
|
|
||||||
static int
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
/* Returning a value here and elsewhere avoids a tailcall which
|
|
||||||
would mess up the backtrace. */
|
|
||||||
return f2 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f2 (int f1line)
|
|
||||||
{
|
|
||||||
return f3 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f3 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.all = &all[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index < 3)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
|
||||||
data.index);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test1", 0, all, f3line, "f3", "btest.c", &data.failed);
|
|
||||||
check ("test1", 1, all, f2line, "f2", "btest.c", &data.failed);
|
|
||||||
check ("test1", 2, all, f1line, "test1", "btest.c", &data.failed);
|
|
||||||
|
|
||||||
printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test the backtrace function with inlined functions. */
|
|
||||||
|
|
||||||
static inline int test2 (void) __attribute__ ((always_inline, unused));
|
|
||||||
static inline int f12 (int) __attribute__ ((always_inline));
|
|
||||||
static inline int f13 (int, int) __attribute__ ((always_inline));
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
test2 (void)
|
|
||||||
{
|
|
||||||
return f12 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
f12 (int f1line)
|
|
||||||
{
|
|
||||||
return f13 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
f13 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.all = &all[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test2: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test2", 0, all, f3line, "f13", "btest.c", &data.failed);
|
|
||||||
check ("test2", 1, all, f2line, "f12", "btest.c", &data.failed);
|
|
||||||
check ("test2", 2, all, f1line, "test2", "btest.c", &data.failed);
|
|
||||||
|
|
||||||
printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test the backtrace_simple function with non-inlined functions. */
|
|
||||||
|
|
||||||
static int test3 (void) __attribute__ ((noinline, noclone, unused));
|
|
||||||
static int f22 (int) __attribute__ ((noinline, noclone));
|
|
||||||
static int f23 (int, int) __attribute__ ((noinline, noclone));
|
|
||||||
|
|
||||||
static int
|
|
||||||
test3 (void)
|
|
||||||
{
|
|
||||||
return f22 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f22 (int f1line)
|
|
||||||
{
|
|
||||||
return f23 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f23 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
uintptr_t addrs[20];
|
|
||||||
struct sdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.addrs = &addrs[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test3: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data.failed)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata bdata;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
bdata.all = &all[0];
|
|
||||||
bdata.index = 0;
|
|
||||||
bdata.max = 20;
|
|
||||||
bdata.failed = 0;
|
|
||||||
|
|
||||||
for (j = 0; j < 3; ++j)
|
|
||||||
{
|
|
||||||
i = backtrace_pcinfo (state, addrs[j], callback_one,
|
|
||||||
error_callback_one, &bdata);
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test3: unexpected return value "
|
|
||||||
"from backtrace_pcinfo %d\n"),
|
|
||||||
i);
|
|
||||||
bdata.failed = 1;
|
|
||||||
}
|
|
||||||
if (!bdata.failed && bdata.index != (size_t) (j + 1))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("wrong number of calls from backtrace_pcinfo "
|
|
||||||
"got %u expected %d\n"),
|
|
||||||
(unsigned int) bdata.index, j + 1);
|
|
||||||
bdata.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test3", 0, all, f3line, "f23", "btest.c", &bdata.failed);
|
|
||||||
check ("test3", 1, all, f2line, "f22", "btest.c", &bdata.failed);
|
|
||||||
check ("test3", 2, all, f1line, "test3", "btest.c", &bdata.failed);
|
|
||||||
|
|
||||||
if (bdata.failed)
|
|
||||||
data.failed = 1;
|
|
||||||
|
|
||||||
for (j = 0; j < 3; ++j)
|
|
||||||
{
|
|
||||||
struct symdata symdata;
|
|
||||||
|
|
||||||
symdata.name = NULL;
|
|
||||||
symdata.val = 0;
|
|
||||||
symdata.size = 0;
|
|
||||||
symdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_syminfo (state, addrs[j], callback_three,
|
|
||||||
error_callback_three, &symdata);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test3: [%d]: unexpected return value "
|
|
||||||
"from backtrace_syminfo %d\n"),
|
|
||||||
j, i);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!symdata.failed)
|
|
||||||
{
|
|
||||||
const char *expected;
|
|
||||||
|
|
||||||
switch (j)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
expected = "f23";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
expected = "f22";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
expected = "test3";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (symdata.name == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
/* Use strncmp, not strcmp, because GCC might create a
|
|
||||||
clone. */
|
|
||||||
else if (strncmp (symdata.name, expected, strlen (expected))
|
|
||||||
!= 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test3: [%d]: unexpected syminfo name "
|
|
||||||
"got %s expected %s\n"),
|
|
||||||
j, symdata.name, expected);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (symdata.failed)
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test the backtrace_simple function with inlined functions. */
|
|
||||||
|
|
||||||
static inline int test4 (void) __attribute__ ((always_inline, unused));
|
|
||||||
static inline int f32 (int) __attribute__ ((always_inline));
|
|
||||||
static inline int f33 (int, int) __attribute__ ((always_inline));
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
test4 (void)
|
|
||||||
{
|
|
||||||
return f32 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
f32 (int f1line)
|
|
||||||
{
|
|
||||||
return f33 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
f33 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
uintptr_t addrs[20];
|
|
||||||
struct sdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.addrs = &addrs[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test3: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data.failed)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata bdata;
|
|
||||||
|
|
||||||
bdata.all = &all[0];
|
|
||||||
bdata.index = 0;
|
|
||||||
bdata.max = 20;
|
|
||||||
bdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
|
|
||||||
&bdata);
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test4: unexpected return value "
|
|
||||||
"from backtrace_pcinfo %d\n"),
|
|
||||||
i);
|
|
||||||
bdata.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test4", 0, all, f3line, "f33", "btest.c", &bdata.failed);
|
|
||||||
check ("test4", 1, all, f2line, "f32", "btest.c", &bdata.failed);
|
|
||||||
check ("test4", 2, all, f1line, "test4", "btest.c", &bdata.failed);
|
|
||||||
|
|
||||||
if (bdata.failed)
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int test5 (void) __attribute__ ((unused));
|
|
||||||
|
|
||||||
int global = 1;
|
|
||||||
|
|
||||||
static int
|
|
||||||
test5 (void)
|
|
||||||
{
|
|
||||||
struct symdata symdata;
|
|
||||||
int i;
|
|
||||||
uintptr_t addr = (uintptr_t) &global;
|
|
||||||
|
|
||||||
if (sizeof (global) > 1)
|
|
||||||
addr += 1;
|
|
||||||
|
|
||||||
symdata.name = NULL;
|
|
||||||
symdata.val = 0;
|
|
||||||
symdata.size = 0;
|
|
||||||
symdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_syminfo (state, addr, callback_three,
|
|
||||||
error_callback_three, &symdata);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected return value from backtrace_syminfo %d\n",
|
|
||||||
i);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!symdata.failed)
|
|
||||||
{
|
|
||||||
if (symdata.name == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test5: NULL syminfo name\n");
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (!(strncmp (symdata.name, "global", 6) == 0
|
|
||||||
&& (symdata.name[6] == '\0'|| symdata.name[6] == '.')))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo name got %s expected %s\n",
|
|
||||||
symdata.name, "global");
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (symdata.val != (uintptr_t) &global)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo value got %lx expected %lx\n",
|
|
||||||
(unsigned long) symdata.val,
|
|
||||||
(unsigned long) (uintptr_t) &global);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (symdata.size != sizeof (global))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo size got %lx expected %lx\n",
|
|
||||||
(unsigned long) symdata.size,
|
|
||||||
(unsigned long) sizeof (global));
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_syminfo variable\n",
|
|
||||||
symdata.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (symdata.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check that are no files left open. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_open_files (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 3; i < 10; i++)
|
|
||||||
{
|
|
||||||
if (close (i) == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"ERROR: descriptor %d still open after tests complete\n",
|
|
||||||
i);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run all the tests. */
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
#if BACKTRACE_SUPPORTED
|
|
||||||
test1 ();
|
|
||||||
test2 ();
|
|
||||||
test3 ();
|
|
||||||
test4 ();
|
|
||||||
#if BACKTRACE_SUPPORTS_DATA
|
|
||||||
test5 ();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
check_open_files ();
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
348
deps/libbacktrace/compile
vendored
348
deps/libbacktrace/compile
vendored
@ -1,348 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2016-01-11.22; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# 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 2, 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/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
file_conv=cygwin
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
file_conv=wine
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
case $file_conv/,$2, in
|
|
||||||
*,$file_conv,*)
|
|
||||||
;;
|
|
||||||
mingw/*)
|
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
||||||
;;
|
|
||||||
cygwin/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
|
||||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC0"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
1700
deps/libbacktrace/config.guess
vendored
1700
deps/libbacktrace/config.guess
vendored
File diff suppressed because it is too large
Load Diff
179
deps/libbacktrace/config.h.in
vendored
179
deps/libbacktrace/config.h.in
vendored
@ -1,179 +0,0 @@
|
|||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* ELF size: 32 or 64 */
|
|
||||||
#undef BACKTRACE_ELF_SIZE
|
|
||||||
|
|
||||||
/* XCOFF size: 32 or 64 */
|
|
||||||
#undef BACKTRACE_XCOFF_SIZE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the __atomic functions */
|
|
||||||
#undef HAVE_ATOMIC_FUNCTIONS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clock_gettime' function. */
|
|
||||||
#undef HAVE_CLOCK_GETTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `getpagesize', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#undef HAVE_DECL_GETPAGESIZE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#undef HAVE_DECL_STRNLEN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_pgmptr', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#undef HAVE_DECL__PGMPTR
|
|
||||||
|
|
||||||
/* 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 fcntl function */
|
|
||||||
#undef HAVE_FCNTL
|
|
||||||
|
|
||||||
/* Define if getexecname is available. */
|
|
||||||
#undef HAVE_GETEXECNAME
|
|
||||||
|
|
||||||
/* Define if _Unwind_GetIPInfo is available. */
|
|
||||||
#undef HAVE_GETIPINFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have KERN_PROC and KERN_PROC_PATHNAME in <sys/sysctl.h>.
|
|
||||||
*/
|
|
||||||
#undef HAVE_KERN_PROC
|
|
||||||
|
|
||||||
/* Define to 1 if you have KERN_PROCARGS and KERN_PROC_PATHNAME in
|
|
||||||
<sys/sysctl.h>. */
|
|
||||||
#undef HAVE_KERN_PROC_ARGS
|
|
||||||
|
|
||||||
/* Define if -llzma is available. */
|
|
||||||
#undef HAVE_LIBLZMA
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <link.h> header file. */
|
|
||||||
#undef HAVE_LINK_H
|
|
||||||
|
|
||||||
/* Define if AIX loadquery is available. */
|
|
||||||
#undef HAVE_LOADQUERY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lstat' function. */
|
|
||||||
#undef HAVE_LSTAT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <mach-o/dyld.h> header file. */
|
|
||||||
#undef HAVE_MACH_O_DYLD_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `readlink' function. */
|
|
||||||
#undef HAVE_READLINK
|
|
||||||
|
|
||||||
/* 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 __sync functions */
|
|
||||||
#undef HAVE_SYNC_FUNCTIONS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/ldr.h> header file. */
|
|
||||||
#undef HAVE_SYS_LDR_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/link.h> header file. */
|
|
||||||
#undef HAVE_SYS_LINK_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
|
||||||
#undef HAVE_SYS_MMAN_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 if -lz is available. */
|
|
||||||
#undef HAVE_ZLIB
|
|
||||||
|
|
||||||
/* Define if -lzstd is available. */
|
|
||||||
#undef HAVE_ZSTD
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
|
|
||||||
/* 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
|
|
1885
deps/libbacktrace/config.sub
vendored
1885
deps/libbacktrace/config.sub
vendored
File diff suppressed because it is too large
Load Diff
38
deps/libbacktrace/config/enable.m4
vendored
38
deps/libbacktrace/config/enable.m4
vendored
@ -1,38 +0,0 @@
|
|||||||
dnl ----------------------------------------------------------------------
|
|
||||||
dnl This whole bit snagged from libstdc++-v3.
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl GCC_ENABLE
|
|
||||||
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
|
|
||||||
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
|
|
||||||
dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
|
|
||||||
dnl
|
|
||||||
dnl See docs/html/17_intro/configury.html#enable for documentation.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([GCC_ENABLE],[dnl
|
|
||||||
m4_define([_g_switch],[--enable-$1])dnl
|
|
||||||
m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl
|
|
||||||
AC_ARG_ENABLE($1,_g_help,
|
|
||||||
m4_bmatch([$5],
|
|
||||||
[^permit ],
|
|
||||||
[[
|
|
||||||
case "$enableval" in
|
|
||||||
m4_bpatsubst([$5],[permit ])) ;;
|
|
||||||
*) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
|
|
||||||
dnl Idea for future: generate a URL pointing to
|
|
||||||
dnl "onlinedocs/configopts.html#whatever"
|
|
||||||
esac
|
|
||||||
]],
|
|
||||||
[^$],
|
|
||||||
[[
|
|
||||||
case "$enableval" in
|
|
||||||
yes|no) ;;
|
|
||||||
*) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
|
|
||||||
esac
|
|
||||||
]],
|
|
||||||
[[$5]]),
|
|
||||||
[enable_]m4_bpatsubst([$1],-,_)[=][$2])
|
|
||||||
m4_undefine([_g_switch])dnl
|
|
||||||
m4_undefine([_g_help])dnl
|
|
||||||
])
|
|
||||||
|
|
31
deps/libbacktrace/config/lead-dot.m4
vendored
31
deps/libbacktrace/config/lead-dot.m4
vendored
@ -1,31 +0,0 @@
|
|||||||
# -*- Autoconf -*-
|
|
||||||
# Copyright (C) 2003, 2009 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, 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 COPYING3. If not see
|
|
||||||
# <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# serial 1
|
|
||||||
|
|
||||||
# Check whether the underlying file-system supports filenames
|
|
||||||
# with a leading dot. For instance MS-DOS doesn't.
|
|
||||||
AC_DEFUN([AM_SET_LEADING_DOT],
|
|
||||||
[rm -rf .tst 2>/dev/null
|
|
||||||
mkdir .tst 2>/dev/null
|
|
||||||
if test -d .tst; then
|
|
||||||
am__leading_dot=.
|
|
||||||
else
|
|
||||||
am__leading_dot=_
|
|
||||||
fi
|
|
||||||
rmdir .tst 2>/dev/null
|
|
||||||
AC_SUBST([am__leading_dot])])
|
|
7436
deps/libbacktrace/config/libtool.m4
vendored
7436
deps/libbacktrace/config/libtool.m4
vendored
File diff suppressed because it is too large
Load Diff
369
deps/libbacktrace/config/ltoptions.m4
vendored
369
deps/libbacktrace/config/ltoptions.m4
vendored
@ -1,369 +0,0 @@
|
|||||||
# Helper functions for option handling. -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 6 ltoptions.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ------------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_OPTION],
|
|
||||||
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ---------------------------------------
|
|
||||||
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
|
||||||
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
|
||||||
# saved as a flag.
|
|
||||||
m4_define([_LT_SET_OPTION],
|
|
||||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
|
||||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
|
||||||
m4_define([_LT_IF_OPTION],
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
|
||||||
# -------------------------------------------------------
|
|
||||||
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
|
||||||
# are set.
|
|
||||||
m4_define([_LT_UNLESS_OPTIONS],
|
|
||||||
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
|
||||||
[m4_define([$0_found])])])[]dnl
|
|
||||||
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
|
||||||
])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
|
||||||
# ----------------------------------------
|
|
||||||
# OPTION-LIST is a space-separated list of Libtool options associated
|
|
||||||
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
|
||||||
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
|
||||||
# the unknown option and exit.
|
|
||||||
m4_defun([_LT_SET_OPTIONS],
|
|
||||||
[# Set options
|
|
||||||
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[_LT_SET_OPTION([$1], _LT_Option)])
|
|
||||||
|
|
||||||
m4_if([$1],[LT_INIT],[
|
|
||||||
dnl
|
|
||||||
dnl Simply set some default values (i.e off) if boolean options were not
|
|
||||||
dnl specified:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
|
||||||
])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl If no reference was made to various pairs of opposing options, then
|
|
||||||
dnl we run the default mode handler for the pair. For example, if neither
|
|
||||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
|
||||||
dnl archives by default:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
|
||||||
[_LT_ENABLE_FAST_INSTALL])
|
|
||||||
])
|
|
||||||
])# _LT_SET_OPTIONS
|
|
||||||
|
|
||||||
|
|
||||||
## --------------------------------- ##
|
|
||||||
## Macros to handle LT_INIT options. ##
|
|
||||||
## --------------------------------- ##
|
|
||||||
|
|
||||||
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
|
||||||
# -----------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_DEFUN],
|
|
||||||
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
|
||||||
# -----------------------------------------------
|
|
||||||
m4_define([LT_OPTION_DEFINE],
|
|
||||||
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
|
||||||
])# LT_OPTION_DEFINE
|
|
||||||
|
|
||||||
|
|
||||||
# dlopen
|
|
||||||
# ------
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `dlopen' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
|
||||||
|
|
||||||
|
|
||||||
# win32-dll
|
|
||||||
# ---------
|
|
||||||
# Declare package support for building win32 dll's.
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
|
||||||
[enable_win32_dll=yes
|
|
||||||
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
|
|
||||||
AC_CHECK_TOOL(AS, as, false)
|
|
||||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
|
||||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
test -z "$AS" && AS=as
|
|
||||||
_LT_DECL([], [AS], [1], [Assembler program])dnl
|
|
||||||
|
|
||||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
|
||||||
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
|
|
||||||
|
|
||||||
test -z "$OBJDUMP" && OBJDUMP=objdump
|
|
||||||
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
|
|
||||||
])# win32-dll
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
|
||||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
|
||||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_SHARED([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-shared flag, and supports the `shared' and
|
|
||||||
# `disable-shared' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_SHARED],
|
|
||||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([shared],
|
|
||||||
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
|
||||||
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_shared=yes ;;
|
|
||||||
no) enable_shared=no ;;
|
|
||||||
*)
|
|
||||||
enable_shared=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_shared=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
|
||||||
[Whether or not to build shared libraries])
|
|
||||||
])# _LT_ENABLE_SHARED
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_STATIC([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-static flag, and support the `static' and
|
|
||||||
# `disable-static' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_STATIC],
|
|
||||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([static],
|
|
||||||
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
|
||||||
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_static=yes ;;
|
|
||||||
no) enable_static=no ;;
|
|
||||||
*)
|
|
||||||
enable_static=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_static=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_old_libs], [enable_static], [0],
|
|
||||||
[Whether or not to build static libraries])
|
|
||||||
])# _LT_ENABLE_STATIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
|
||||||
# ----------------------------------
|
|
||||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
|
||||||
# and `disable-fast-install' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
|
||||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([fast-install],
|
|
||||||
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
|
||||||
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_fast_install=yes ;;
|
|
||||||
no) enable_fast_install=no ;;
|
|
||||||
*)
|
|
||||||
enable_fast_install=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_fast_install=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([fast_install], [enable_fast_install], [0],
|
|
||||||
[Whether or not to optimize for fast installation])dnl
|
|
||||||
])# _LT_ENABLE_FAST_INSTALL
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_WITH_PIC([MODE])
|
|
||||||
# --------------------
|
|
||||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
|
||||||
# LT_INIT options.
|
|
||||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
|
||||||
m4_define([_LT_WITH_PIC],
|
|
||||||
[AC_ARG_WITH([pic],
|
|
||||||
[AS_HELP_STRING([--with-pic],
|
|
||||||
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
|
||||||
[pic_mode="$withval"],
|
|
||||||
[pic_mode=default])
|
|
||||||
|
|
||||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
|
||||||
|
|
||||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
|
||||||
])# _LT_WITH_PIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
|
||||||
|
|
||||||
# Old name:
|
|
||||||
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `pic-only' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
|
||||||
|
|
||||||
## ----------------- ##
|
|
||||||
## LTDL_INIT Options ##
|
|
||||||
## ----------------- ##
|
|
||||||
|
|
||||||
m4_define([_LTDL_MODE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
|
||||||
[m4_define([_LTDL_MODE], [nonrecursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
|
||||||
[m4_define([_LTDL_MODE], [recursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
|
||||||
[m4_define([_LTDL_MODE], [subproject])])
|
|
||||||
|
|
||||||
m4_define([_LTDL_TYPE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
|
||||||
[m4_define([_LTDL_TYPE], [installable])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
|
||||||
[m4_define([_LTDL_TYPE], [convenience])])
|
|
123
deps/libbacktrace/config/ltsugar.m4
vendored
123
deps/libbacktrace/config/ltsugar.m4
vendored
@ -1,123 +0,0 @@
|
|||||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 6 ltsugar.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_join(SEP, ARG1, [ARG2...])
|
|
||||||
# -----------------------------
|
|
||||||
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
|
||||||
# associated separator.
|
|
||||||
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
|
||||||
# versions in m4sugar had bugs.
|
|
||||||
m4_define([lt_join],
|
|
||||||
[m4_if([$#], [1], [],
|
|
||||||
[$#], [2], [[$2]],
|
|
||||||
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
m4_define([_lt_join],
|
|
||||||
[m4_if([$#$2], [2], [],
|
|
||||||
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_car(LIST)
|
|
||||||
# lt_cdr(LIST)
|
|
||||||
# ------------
|
|
||||||
# Manipulate m4 lists.
|
|
||||||
# These macros are necessary as long as will still need to support
|
|
||||||
# Autoconf-2.59 which quotes differently.
|
|
||||||
m4_define([lt_car], [[$1]])
|
|
||||||
m4_define([lt_cdr],
|
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
|
||||||
[$#], 1, [],
|
|
||||||
[m4_dquote(m4_shift($@))])])
|
|
||||||
m4_define([lt_unquote], $1)
|
|
||||||
|
|
||||||
|
|
||||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
|
||||||
# ------------------------------------------
|
|
||||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
|
||||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
|
||||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
|
||||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
|
||||||
# than defined and empty).
|
|
||||||
#
|
|
||||||
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
|
||||||
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
|
||||||
m4_define([lt_append],
|
|
||||||
[m4_define([$1],
|
|
||||||
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# Produce a SEP delimited list of all paired combinations of elements of
|
|
||||||
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
|
||||||
# has the form PREFIXmINFIXSUFFIXn.
|
|
||||||
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
|
||||||
m4_define([lt_combine],
|
|
||||||
[m4_if(m4_eval([$# > 3]), [1],
|
|
||||||
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
|
||||||
[[m4_foreach([_Lt_prefix], [$2],
|
|
||||||
[m4_foreach([_Lt_suffix],
|
|
||||||
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
|
||||||
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
|
||||||
# -----------------------------------------------------------------------
|
|
||||||
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
|
||||||
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
|
||||||
m4_define([lt_if_append_uniq],
|
|
||||||
[m4_ifdef([$1],
|
|
||||||
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
|
||||||
[lt_append([$1], [$2], [$3])$4],
|
|
||||||
[$5])],
|
|
||||||
[lt_append([$1], [$2], [$3])$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add(DICT, KEY, VALUE)
|
|
||||||
# -----------------------------
|
|
||||||
m4_define([lt_dict_add],
|
|
||||||
[m4_define([$1($2)], [$3])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
|
||||||
# --------------------------------------------
|
|
||||||
m4_define([lt_dict_add_subkey],
|
|
||||||
[m4_define([$1($2:$3)], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
|
||||||
# ----------------------------------
|
|
||||||
m4_define([lt_dict_fetch],
|
|
||||||
[m4_ifval([$3],
|
|
||||||
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
|
||||||
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
m4_define([lt_if_dict_fetch],
|
|
||||||
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
|
||||||
[$5],
|
|
||||||
[$6])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
m4_define([lt_dict_filter],
|
|
||||||
[m4_if([$5], [], [],
|
|
||||||
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
|
||||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
|
||||||
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
|
||||||
])
|
|
23
deps/libbacktrace/config/ltversion.m4
vendored
23
deps/libbacktrace/config/ltversion.m4
vendored
@ -1,23 +0,0 @@
|
|||||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# Generated from ltversion.in.
|
|
||||||
|
|
||||||
# serial 3134 ltversion.m4
|
|
||||||
# This file is part of GNU Libtool
|
|
||||||
|
|
||||||
m4_define([LT_PACKAGE_VERSION], [2.2.7a])
|
|
||||||
m4_define([LT_PACKAGE_REVISION], [1.3134])
|
|
||||||
|
|
||||||
AC_DEFUN([LTVERSION_VERSION],
|
|
||||||
[macro_version='2.2.7a'
|
|
||||||
macro_revision='1.3134'
|
|
||||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
|
||||||
_LT_DECL(, macro_revision, 0)
|
|
||||||
])
|
|
98
deps/libbacktrace/config/lt~obsolete.m4
vendored
98
deps/libbacktrace/config/lt~obsolete.m4
vendored
@ -1,98 +0,0 @@
|
|||||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 4 lt~obsolete.m4
|
|
||||||
|
|
||||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
|
||||||
#
|
|
||||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
|
||||||
# which have later been changed to m4_define as they aren't part of the
|
|
||||||
# exported API, or moved to Autoconf or Automake where they belong.
|
|
||||||
#
|
|
||||||
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
|
||||||
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
|
||||||
# using a macro with the same name in our local m4/libtool.m4 it'll
|
|
||||||
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
|
||||||
# and doesn't know about Autoconf macros at all.)
|
|
||||||
#
|
|
||||||
# So we provide this file, which has a silly filename so it's always
|
|
||||||
# included after everything else. This provides aclocal with the
|
|
||||||
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
|
||||||
# because those macros already exist, or will be overwritten later.
|
|
||||||
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
|
||||||
#
|
|
||||||
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
|
||||||
# Yes, that means every name once taken will need to remain here until
|
|
||||||
# we give up compatibility with versions before 1.7, at which point
|
|
||||||
# we need to keep only those names which we still refer to.
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
|
||||||
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
|
||||||
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
|
||||||
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
|
||||||
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
|
||||||
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
|
||||||
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
|
||||||
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
|
||||||
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
|
||||||
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
|
||||||
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
|
||||||
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
|
||||||
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
|
||||||
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
|
||||||
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
|
||||||
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
|
||||||
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
|
||||||
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
|
|
||||||
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
|
|
||||||
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
|
|
||||||
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
|
|
||||||
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
|
|
68
deps/libbacktrace/config/multi.m4
vendored
68
deps/libbacktrace/config/multi.m4
vendored
@ -1,68 +0,0 @@
|
|||||||
## -*- Autoconf -*-
|
|
||||||
# Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2008
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 6
|
|
||||||
|
|
||||||
# AM_ENABLE_MULTILIB([MAKEFILE], [REL-TO-TOP-SRCDIR])
|
|
||||||
# ---------------------------------------------------
|
|
||||||
# Add --enable-multilib to configure.
|
|
||||||
AC_DEFUN([AM_ENABLE_MULTILIB],
|
|
||||||
[# Default to --enable-multilib
|
|
||||||
AC_ARG_ENABLE(multilib,
|
|
||||||
[ --enable-multilib build many library versions (default)],
|
|
||||||
[case "$enableval" in
|
|
||||||
yes) multilib=yes ;;
|
|
||||||
no) multilib=no ;;
|
|
||||||
*) AC_MSG_ERROR([bad value $enableval for multilib option]) ;;
|
|
||||||
esac],
|
|
||||||
[multilib=yes])
|
|
||||||
|
|
||||||
# We may get other options which we leave undocumented:
|
|
||||||
# --with-target-subdir, --with-multisrctop, --with-multisubdir
|
|
||||||
# See config-ml.in if you want the gory details.
|
|
||||||
|
|
||||||
if test "$srcdir" = "."; then
|
|
||||||
if test "$with_target_subdir" != "."; then
|
|
||||||
multi_basedir="$srcdir/$with_multisrctop../$2"
|
|
||||||
else
|
|
||||||
multi_basedir="$srcdir/$with_multisrctop$2"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
multi_basedir="$srcdir/$2"
|
|
||||||
fi
|
|
||||||
AC_SUBST(multi_basedir)
|
|
||||||
|
|
||||||
# Even if the default multilib is not a cross compilation,
|
|
||||||
# it may be that some of the other multilibs are.
|
|
||||||
if test $cross_compiling = no && test $multilib = yes \
|
|
||||||
&& test "x${with_multisubdir}" != x ; then
|
|
||||||
cross_compiling=maybe
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_OUTPUT_COMMANDS([
|
|
||||||
# Only add multilib support code if we just rebuilt the top-level
|
|
||||||
# Makefile.
|
|
||||||
case " $CONFIG_FILES " in
|
|
||||||
*" ]m4_default([$1],Makefile)[ "*)
|
|
||||||
ac_file=]m4_default([$1],Makefile)[ . ${multi_basedir}/config-ml.in
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[
|
|
||||||
srcdir="$srcdir"
|
|
||||||
host="$host"
|
|
||||||
target="$target"
|
|
||||||
with_multisubdir="$with_multisubdir"
|
|
||||||
with_multisrctop="$with_multisrctop"
|
|
||||||
with_target_subdir="$with_target_subdir"
|
|
||||||
ac_configure_args="${multilib_arg} ${ac_configure_args}"
|
|
||||||
multi_basedir="$multi_basedir"
|
|
||||||
CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
|
|
||||||
CC="$CC"
|
|
||||||
CXX="$CXX"
|
|
||||||
GFORTRAN="$GFORTRAN"
|
|
||||||
GDC="$GDC"])])dnl
|
|
117
deps/libbacktrace/config/override.m4
vendored
117
deps/libbacktrace/config/override.m4
vendored
@ -1,117 +0,0 @@
|
|||||||
dnl Fix Autoconf bugs by overriding broken internal Autoconf
|
|
||||||
dnl macros with backports of fixes from newer releases.
|
|
||||||
dnl
|
|
||||||
dnl The override bits of this file should be a no-op for the newest
|
|
||||||
dnl Autoconf version, which means they can be removed once the complete
|
|
||||||
dnl tree has moved to a new enough Autoconf version.
|
|
||||||
dnl
|
|
||||||
dnl The _GCC_AUTOCONF_VERSION_TEST ensures that exactly the desired
|
|
||||||
dnl Autoconf version is used. It should be kept for consistency.
|
|
||||||
|
|
||||||
dnl Use ifdef/ifelse over m4_ifdef/m4_ifelse to be clean for 2.13.
|
|
||||||
ifdef([m4_PACKAGE_VERSION], [
|
|
||||||
|
|
||||||
dnl Provide m4_copy_force and m4_rename_force for old Autoconf versions.
|
|
||||||
|
|
||||||
m4_ifndef([m4_copy_force],
|
|
||||||
[m4_define([m4_copy_force],
|
|
||||||
[m4_ifdef([$2], [m4_undefine([$2])])m4_copy($@)])])
|
|
||||||
|
|
||||||
m4_ifndef([m4_rename_force],
|
|
||||||
[m4_define([m4_rename_force],
|
|
||||||
[m4_ifdef([$2], [m4_undefine([$2])])m4_rename($@)])])
|
|
||||||
|
|
||||||
dnl AC_DEFUN a commonly used macro so this file is picked up.
|
|
||||||
m4_copy([AC_PREREQ], [_AC_PREREQ])
|
|
||||||
AC_DEFUN([AC_PREREQ], [frob])
|
|
||||||
m4_copy_force([_AC_PREREQ], [AC_PREREQ])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Ensure exactly this Autoconf version is used
|
|
||||||
m4_ifndef([_GCC_AUTOCONF_VERSION],
|
|
||||||
[m4_define([_GCC_AUTOCONF_VERSION], [2.69])])
|
|
||||||
|
|
||||||
dnl Test for the exact version when AC_INIT is expanded.
|
|
||||||
dnl This allows to update the tree in steps (for testing)
|
|
||||||
dnl by putting
|
|
||||||
dnl m4_define([_GCC_AUTOCONF_VERSION], [X.Y])
|
|
||||||
dnl in configure.ac before AC_INIT,
|
|
||||||
dnl without rewriting this file.
|
|
||||||
dnl Or for updating the whole tree at once with the definition above.
|
|
||||||
AC_DEFUN([_GCC_AUTOCONF_VERSION_CHECK],
|
|
||||||
[m4_if(m4_defn([_GCC_AUTOCONF_VERSION]),
|
|
||||||
m4_defn([m4_PACKAGE_VERSION]), [],
|
|
||||||
[m4_fatal([Please use exactly Autoconf ]_GCC_AUTOCONF_VERSION[ instead of ]m4_defn([m4_PACKAGE_VERSION])[.])])
|
|
||||||
])
|
|
||||||
dnl don't do this for libbacktrace
|
|
||||||
dnl m4_define([AC_INIT], m4_defn([AC_INIT])[
|
|
||||||
dnl _GCC_AUTOCONF_VERSION_CHECK
|
|
||||||
dnl ])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Ensure we do not use a buggy M4.
|
|
||||||
m4_if(m4_index([..wi.d.], [.d.]), [-1],
|
|
||||||
[m4_fatal(m4_do([m4 with buggy strstr detected. Please install
|
|
||||||
GNU M4 1.4.16 or newer and set the M4 environment variable]))])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Fix 2.64 cross compile detection for AVR and RTEMS
|
|
||||||
dnl by not trying to compile fopen.
|
|
||||||
m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.64],
|
|
||||||
[m4_foreach([_GCC_LANG], [C, C++, Fortran, Fortran 77],
|
|
||||||
[m4_define([_AC_LANG_IO_PROGRAM(]_GCC_LANG[)], m4_defn([AC_LANG_PROGRAM(]_GCC_LANG[)]))])])
|
|
||||||
|
|
||||||
m4_version_prereq([2.66],, [
|
|
||||||
dnl We need AC_CHECK_DECL which works for overloaded C++ functions.
|
|
||||||
|
|
||||||
# _AC_CHECK_DECL_BODY
|
|
||||||
# -------------------
|
|
||||||
# Shell function body for AC_CHECK_DECL.
|
|
||||||
m4_define([_AC_CHECK_DECL_BODY],
|
|
||||||
[ AS_LINENO_PUSH([$[]1])
|
|
||||||
[as_decl_name=`echo $][2|sed 's/ *(.*//'`]
|
|
||||||
[as_decl_use=`echo $][2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`]
|
|
||||||
AC_CACHE_CHECK([whether $as_decl_name is declared], [$[]3],
|
|
||||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$[]4],
|
|
||||||
[@%:@ifndef $[]as_decl_name
|
|
||||||
@%:@ifdef __cplusplus
|
|
||||||
(void) $[]as_decl_use;
|
|
||||||
@%:@else
|
|
||||||
(void) $[]as_decl_name;
|
|
||||||
@%:@endif
|
|
||||||
@%:@endif
|
|
||||||
])],
|
|
||||||
[AS_VAR_SET([$[]3], [yes])],
|
|
||||||
[AS_VAR_SET([$[]3], [no])])])
|
|
||||||
AS_LINENO_POP
|
|
||||||
])# _AC_CHECK_DECL_BODY
|
|
||||||
|
|
||||||
# _AC_CHECK_DECLS(SYMBOL, ACTION-IF_FOUND, ACTION-IF-NOT-FOUND,
|
|
||||||
# INCLUDES)
|
|
||||||
# -------------------------------------------------------------
|
|
||||||
# Helper to AC_CHECK_DECLS, which generates the check for a single
|
|
||||||
# SYMBOL with INCLUDES, performs the AC_DEFINE, then expands
|
|
||||||
# ACTION-IF-FOUND or ACTION-IF-NOT-FOUND.
|
|
||||||
m4_define([_AC_CHECK_DECLS],
|
|
||||||
[AC_CHECK_DECL([$1], [ac_have_decl=1], [ac_have_decl=0], [$4])]dnl
|
|
||||||
[AC_DEFINE_UNQUOTED(AS_TR_CPP(m4_bpatsubst(HAVE_DECL_[$1],[ *(.*])),
|
|
||||||
[$ac_have_decl],
|
|
||||||
[Define to 1 if you have the declaration of `$1',
|
|
||||||
and to 0 if you don't.])]dnl
|
|
||||||
[m4_ifvaln([$2$3], [AS_IF([test $ac_have_decl = 1], [$2], [$3])])])
|
|
||||||
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl If flex/lex are not found, the top level configure sets LEX to
|
|
||||||
dnl "/path_to/missing flex". When AC_PROG_LEX tries to find the flex
|
|
||||||
dnl output file, it calls $LEX to do so, but the current lightweight
|
|
||||||
dnl "missing" won't create a file. This results in an error.
|
|
||||||
dnl Avoid calling the bulk of AC_PROG_LEX when $LEX is "missing".
|
|
||||||
AC_DEFUN_ONCE([AC_PROG_LEX],
|
|
||||||
[AC_CHECK_PROGS(LEX, flex lex, :)
|
|
||||||
case "$LEX" in
|
|
||||||
:|*"missing "*) ;;
|
|
||||||
*) _AC_PROG_LEX_YYTEXT_DECL ;;
|
|
||||||
esac])
|
|
||||||
|
|
||||||
])
|
|
37
deps/libbacktrace/config/unwind_ipinfo.m4
vendored
37
deps/libbacktrace/config/unwind_ipinfo.m4
vendored
@ -1,37 +0,0 @@
|
|||||||
dnl
|
|
||||||
dnl Check whether _Unwind_GetIPInfo is available without doing a link
|
|
||||||
dnl test so we can use this with libstdc++-v3 and libjava. Need to
|
|
||||||
dnl use $target to set defaults because automatic checking is not possible
|
|
||||||
dnl without a link test (and maybe even with a link test).
|
|
||||||
dnl
|
|
||||||
|
|
||||||
AC_DEFUN([GCC_CHECK_UNWIND_GETIPINFO], [
|
|
||||||
AC_ARG_WITH(system-libunwind,
|
|
||||||
[ --with-system-libunwind use installed libunwind])
|
|
||||||
# If system-libunwind was not specifically set, pick a default setting.
|
|
||||||
if test x$with_system_libunwind = x; then
|
|
||||||
case ${target} in
|
|
||||||
ia64-*-hpux*) with_system_libunwind=yes ;;
|
|
||||||
*) with_system_libunwind=no ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
# Based on system-libunwind and target, do we have ipinfo?
|
|
||||||
if test x$with_system_libunwind = xyes; then
|
|
||||||
case ${target} in
|
|
||||||
ia64-*-*) have_unwind_getipinfo=no ;;
|
|
||||||
*) have_unwind_getipinfo=yes ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
# Darwin before version 9 does not have _Unwind_GetIPInfo.
|
|
||||||
changequote(,)
|
|
||||||
case ${target} in
|
|
||||||
*-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
|
|
||||||
*) have_unwind_getipinfo=yes ;;
|
|
||||||
esac
|
|
||||||
changequote([,])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x$have_unwind_getipinfo = xyes; then
|
|
||||||
AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
|
|
||||||
fi
|
|
||||||
])
|
|
227
deps/libbacktrace/config/warnings.m4
vendored
227
deps/libbacktrace/config/warnings.m4
vendored
@ -1,227 +0,0 @@
|
|||||||
# Autoconf include file defining macros related to compile-time warnings.
|
|
||||||
|
|
||||||
# Copyright 2004, 2005, 2007, 2009, 2011 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
#This file is part of GCC.
|
|
||||||
|
|
||||||
#GCC 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, or (at your option) any later
|
|
||||||
#version.
|
|
||||||
|
|
||||||
#GCC 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 GCC; see the file COPYING3. If not see
|
|
||||||
#<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# ACX_PROG_CC_WARNING_OPTS(WARNINGS, [VARIABLE = WARN_CFLAGS])
|
|
||||||
# Sets @VARIABLE@ to the subset of the given options which the
|
|
||||||
# compiler accepts.
|
|
||||||
AC_DEFUN([ACX_PROG_CC_WARNING_OPTS],
|
|
||||||
[AC_REQUIRE([AC_PROG_CC])dnl
|
|
||||||
AC_LANG_PUSH(C)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WARN_CFLAGS])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
for real_option in $1; do
|
|
||||||
# Do the check with the no- prefix removed since gcc silently
|
|
||||||
# accepts any -Wno-* option on purpose
|
|
||||||
case $real_option in
|
|
||||||
-Wno-*) option=-W`expr x$real_option : 'x-Wno-\(.*\)'` ;;
|
|
||||||
*) option=$real_option ;;
|
|
||||||
esac
|
|
||||||
AS_VAR_PUSHDEF([acx_Woption], [acx_cv_prog_cc_warning_$option])
|
|
||||||
AC_CACHE_CHECK([whether $CC supports $option], acx_Woption,
|
|
||||||
[CFLAGS="$option"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
|
|
||||||
[AS_VAR_SET(acx_Woption, yes)],
|
|
||||||
[AS_VAR_SET(acx_Woption, no)])
|
|
||||||
])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_Woption) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }$real_option"])
|
|
||||||
AS_VAR_POPDEF([acx_Woption])dnl
|
|
||||||
done
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C)
|
|
||||||
])# ACX_PROG_CC_WARNING_OPTS
|
|
||||||
|
|
||||||
# ACX_PROG_CC_WARNING_ALMOST_PEDANTIC(WARNINGS, [VARIABLE = WARN_PEDANTIC])
|
|
||||||
# Append to VARIABLE "-pedantic" + the argument, if the compiler is GCC
|
|
||||||
# and accepts all of those options simultaneously, otherwise to nothing.
|
|
||||||
AC_DEFUN([ACX_PROG_CC_WARNING_ALMOST_PEDANTIC],
|
|
||||||
[AC_REQUIRE([AC_PROG_CC])dnl
|
|
||||||
AC_LANG_PUSH(C)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WARN_PEDANTIC])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
# Do the check with the no- prefix removed from the warning options
|
|
||||||
# since gcc silently accepts any -Wno-* option on purpose
|
|
||||||
m4_pushdef([acx_Woptions], [m4_bpatsubst([$1], [-Wno-], [-W])])dnl
|
|
||||||
AS_VAR_PUSHDEF([acx_Pedantic], [acx_cv_prog_cc_pedantic_]acx_Woptions)dnl
|
|
||||||
AS_IF([test "$GCC" = yes],
|
|
||||||
[AC_CACHE_CHECK([whether $CC supports -pedantic ]acx_Woptions, acx_Pedantic,
|
|
||||||
[save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="-pedantic acx_Woptions"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
|
|
||||||
[AS_VAR_SET(acx_Pedantic, yes)],
|
|
||||||
[AS_VAR_SET(acx_Pedantic, no)])
|
|
||||||
CFLAGS="$save_CFLAGS"])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_Pedantic) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-pedantic $1"])
|
|
||||||
])
|
|
||||||
AS_VAR_POPDEF([acx_Pedantic])dnl
|
|
||||||
m4_popdef([acx_Woptions])dnl
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C)
|
|
||||||
])# ACX_PROG_CC_WARNING_ALMOST_PEDANTIC
|
|
||||||
|
|
||||||
# ACX_PROG_CC_WARNINGS_ARE_ERRORS([x.y.z], [VARIABLE = WERROR])
|
|
||||||
# sets @VARIABLE@ to "-Werror" if the compiler is GCC >=x.y.z, or if
|
|
||||||
# --enable-werror-always was given on the command line, otherwise
|
|
||||||
# to nothing.
|
|
||||||
# If the argument is the word "manual" instead of a version number,
|
|
||||||
# then @VARIABLE@ will be set to -Werror only if --enable-werror-always
|
|
||||||
# appeared on the configure command line.
|
|
||||||
AC_DEFUN([ACX_PROG_CC_WARNINGS_ARE_ERRORS],
|
|
||||||
[AC_REQUIRE([AC_PROG_CC])dnl
|
|
||||||
AC_LANG_PUSH(C)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WERROR])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
AC_ARG_ENABLE(werror-always,
|
|
||||||
AS_HELP_STRING([--enable-werror-always],
|
|
||||||
[enable -Werror despite compiler version]),
|
|
||||||
[], [enable_werror_always=no])
|
|
||||||
AS_IF([test $enable_werror_always = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-Werror"])
|
|
||||||
m4_if($1, [manual],,
|
|
||||||
[AS_VAR_PUSHDEF([acx_GCCvers], [acx_cv_prog_cc_gcc_$1_or_newer])dnl
|
|
||||||
AC_CACHE_CHECK([whether $CC is GCC >=$1], acx_GCCvers,
|
|
||||||
[set fnord `echo $1 | tr '.' ' '`
|
|
||||||
shift
|
|
||||||
AC_PREPROC_IFELSE(
|
|
||||||
[#if __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ \
|
|
||||||
< [$]1 * 10000 + [$]2 * 100 + [$]3
|
|
||||||
#error insufficient
|
|
||||||
#endif],
|
|
||||||
[AS_VAR_SET(acx_GCCvers, yes)],
|
|
||||||
[AS_VAR_SET(acx_GCCvers, no)])])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_GCCvers) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-Werror"])
|
|
||||||
AS_VAR_POPDEF([acx_GCCvers])])
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C)
|
|
||||||
])# ACX_PROG_CC_WARNINGS_ARE_ERRORS
|
|
||||||
|
|
||||||
# ACX_PROG_CXX_WARNING_OPTS(WARNINGS, [VARIABLE = WARN_CXXFLAGS])
|
|
||||||
# Sets @VARIABLE@ to the subset of the given options which the
|
|
||||||
# compiler accepts.
|
|
||||||
AC_DEFUN([ACX_PROG_CXX_WARNING_OPTS],
|
|
||||||
[AC_REQUIRE([AC_PROG_CXX])dnl
|
|
||||||
AC_LANG_PUSH(C++)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WARN_CXXFLAGS])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
save_CXXFLAGS="$CXXFLAGS"
|
|
||||||
for real_option in $1; do
|
|
||||||
# Do the check with the no- prefix removed since gcc silently
|
|
||||||
# accepts any -Wno-* option on purpose
|
|
||||||
case $real_option in
|
|
||||||
-Wno-*) option=-W`expr x$real_option : 'x-Wno-\(.*\)'` ;;
|
|
||||||
*) option=$real_option ;;
|
|
||||||
esac
|
|
||||||
AS_VAR_PUSHDEF([acx_Woption], [acx_cv_prog_cc_warning_$option])
|
|
||||||
AC_CACHE_CHECK([whether $CXX supports $option], acx_Woption,
|
|
||||||
[CXXFLAGS="$option"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
|
|
||||||
[AS_VAR_SET(acx_Woption, yes)],
|
|
||||||
[AS_VAR_SET(acx_Woption, no)])
|
|
||||||
])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_Woption) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }$real_option"])
|
|
||||||
AS_VAR_POPDEF([acx_Woption])dnl
|
|
||||||
done
|
|
||||||
CXXFLAGS="$save_CXXFLAGS"
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C++)
|
|
||||||
])# ACX_PROG_CXX_WARNING_OPTS
|
|
||||||
|
|
||||||
# ACX_PROG_CXX_WARNING_ALMOST_PEDANTIC(WARNINGS, [VARIABLE = WARN_PEDANTIC])
|
|
||||||
# Append to VARIABLE "-pedantic" + the argument, if the compiler is G++
|
|
||||||
# and accepts all of those options simultaneously, otherwise to nothing.
|
|
||||||
AC_DEFUN([ACX_PROG_CXX_WARNING_ALMOST_PEDANTIC],
|
|
||||||
[AC_REQUIRE([AC_PROG_CXX])dnl
|
|
||||||
AC_LANG_PUSH(C++)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WARN_PEDANTIC])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
# Do the check with the no- prefix removed from the warning options
|
|
||||||
# since gcc silently accepts any -Wno-* option on purpose
|
|
||||||
m4_pushdef([acx_Woptions], [m4_bpatsubst([$1], [-Wno-], [-W])])dnl
|
|
||||||
AS_VAR_PUSHDEF([acx_Pedantic], [acx_cv_prog_cc_pedantic_]acx_Woptions)dnl
|
|
||||||
AS_IF([test "$GXX" = yes],
|
|
||||||
[AC_CACHE_CHECK([whether $CXX supports -pedantic ]acx_Woptions, acx_Pedantic,
|
|
||||||
[save_CXXFLAGS="$CXXFLAGS"
|
|
||||||
CXXFLAGS="-pedantic acx_Woptions"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
|
|
||||||
[AS_VAR_SET(acx_Pedantic, yes)],
|
|
||||||
[AS_VAR_SET(acx_Pedantic, no)])
|
|
||||||
CXXFLAGS="$save_CXXFLAGS"])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_Pedantic) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-pedantic $1"])
|
|
||||||
])
|
|
||||||
AS_VAR_POPDEF([acx_Pedantic])dnl
|
|
||||||
m4_popdef([acx_Woptions])dnl
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C++)
|
|
||||||
])# ACX_PROG_CXX_WARNING_ALMOST_PEDANTIC
|
|
||||||
|
|
||||||
# ACX_PROG_CXX_WARNINGS_ARE_ERRORS([x.y.z], [VARIABLE = WERROR])
|
|
||||||
# sets @VARIABLE@ to "-Werror" if the compiler is G++ >=x.y.z, or if
|
|
||||||
# --enable-werror-always was given on the command line, otherwise
|
|
||||||
# to nothing.
|
|
||||||
# If the argument is the word "manual" instead of a version number,
|
|
||||||
# then @VARIABLE@ will be set to -Werror only if --enable-werror-always
|
|
||||||
# appeared on the configure command line.
|
|
||||||
AC_DEFUN([ACX_PROG_CXX_WARNINGS_ARE_ERRORS],
|
|
||||||
[AC_REQUIRE([AC_PROG_CXX])dnl
|
|
||||||
AC_LANG_PUSH(C++)
|
|
||||||
m4_pushdef([acx_Var], [m4_default([$2], [WERROR])])dnl
|
|
||||||
AC_SUBST(acx_Var)dnl
|
|
||||||
m4_expand_once([acx_Var=
|
|
||||||
],m4_quote(acx_Var=))dnl
|
|
||||||
AC_ARG_ENABLE(werror-always,
|
|
||||||
AS_HELP_STRING([--enable-werror-always],
|
|
||||||
[enable -Werror despite compiler version]),
|
|
||||||
[], [enable_werror_always=no])
|
|
||||||
AS_IF([test $enable_werror_always = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-Werror"])
|
|
||||||
m4_if($1, [manual],,
|
|
||||||
[AS_VAR_PUSHDEF([acx_GXXvers], [acx_cv_prog_cxx_gxx_$1_or_newer])dnl
|
|
||||||
AC_CACHE_CHECK([whether $CXX is G++ >=$1], acx_GXXvers,
|
|
||||||
[set fnord `echo $1 | tr '.' ' '`
|
|
||||||
shift
|
|
||||||
AC_PREPROC_IFELSE(
|
|
||||||
[#if __GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ \
|
|
||||||
< [$]1 * 10000 + [$]2 * 100 + [$]3
|
|
||||||
#error insufficient
|
|
||||||
#endif],
|
|
||||||
[AS_VAR_SET(acx_GXXvers, yes)],
|
|
||||||
[AS_VAR_SET(acx_GXXvers, no)])])
|
|
||||||
AS_IF([test AS_VAR_GET(acx_GXXvers) = yes],
|
|
||||||
[acx_Var="$acx_Var${acx_Var:+ }-Werror"])
|
|
||||||
AS_VAR_POPDEF([acx_GXXvers])])
|
|
||||||
m4_popdef([acx_Var])dnl
|
|
||||||
AC_LANG_POP(C++)
|
|
||||||
])# ACX_PROG_CXX_WARNINGS_ARE_ERRORS
|
|
15727
deps/libbacktrace/configure
vendored
15727
deps/libbacktrace/configure
vendored
File diff suppressed because it is too large
Load Diff
611
deps/libbacktrace/configure.ac
vendored
611
deps/libbacktrace/configure.ac
vendored
@ -1,611 +0,0 @@
|
|||||||
# configure.ac -- Backtrace configure script.
|
|
||||||
# Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
AC_PREREQ(2.69)
|
|
||||||
AC_INIT(package-unused, version-unused,, libbacktrace)
|
|
||||||
AC_CONFIG_SRCDIR(backtrace.h)
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
|
||||||
AC_CONFIG_MACRO_DIR(config)
|
|
||||||
|
|
||||||
# with_target_subdir is used when configured as part of a GCC tree.
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
AM_ENABLE_MULTILIB(, ..)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
|
||||||
target_alias=${target_alias-$host_alias}
|
|
||||||
|
|
||||||
AC_USE_SYSTEM_EXTENSIONS
|
|
||||||
|
|
||||||
# Default to not building a shared library.
|
|
||||||
AC_DISABLE_SHARED
|
|
||||||
|
|
||||||
libtool_VERSION=1:0:0
|
|
||||||
AC_SUBST(libtool_VERSION)
|
|
||||||
|
|
||||||
# 1.11.1: Require that version of automake.
|
|
||||||
# foreign: Don't require README, INSTALL, NEWS, etc.
|
|
||||||
# no-define: Don't define PACKAGE and VERSION.
|
|
||||||
# no-dependencies: Don't generate automatic dependencies.
|
|
||||||
# (because it breaks when using bootstrap-lean, since some of the
|
|
||||||
# headers are gone at "make install" time).
|
|
||||||
# -Wall: Issue all automake warnings.
|
|
||||||
# -Wno-portability: Don't warn about constructs supported by GNU make.
|
|
||||||
# (because GCC requires GNU make anyhow).
|
|
||||||
AM_INIT_AUTOMAKE([1.11.1 foreign no-dist no-define no-dependencies -Wall -Wno-portability])
|
|
||||||
|
|
||||||
AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
AC_ARG_WITH(target-subdir,
|
|
||||||
[ --with-target-subdir=SUBDIR Configuring in a subdirectory for target])
|
|
||||||
|
|
||||||
# We must force CC to /not/ be precious variables; otherwise
|
|
||||||
# the wrong, non-multilib-adjusted value will be used in multilibs.
|
|
||||||
# As a side effect, we have to subst CFLAGS ourselves.
|
|
||||||
m4_rename([_AC_ARG_VAR_PRECIOUS],[backtrace_PRECIOUS])
|
|
||||||
m4_define([_AC_ARG_VAR_PRECIOUS],[])
|
|
||||||
AC_PROG_CC
|
|
||||||
m4_rename_force([backtrace_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
|
|
||||||
|
|
||||||
AC_SUBST(CFLAGS)
|
|
||||||
|
|
||||||
AC_PROG_RANLIB
|
|
||||||
|
|
||||||
AC_PROG_AWK
|
|
||||||
case "$AWK" in
|
|
||||||
"") AC_MSG_ERROR([can't build without awk]) ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_CHECK_PROG(DWZ, dwz, dwz)
|
|
||||||
AM_CONDITIONAL(HAVE_DWZ, test "$DWZ" != "")
|
|
||||||
|
|
||||||
LT_INIT
|
|
||||||
AM_PROG_LIBTOOL
|
|
||||||
|
|
||||||
AC_SYS_LARGEFILE
|
|
||||||
|
|
||||||
backtrace_supported=yes
|
|
||||||
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
# We are compiling a GCC library. We can assume that the unwind
|
|
||||||
# library exists.
|
|
||||||
BACKTRACE_FILE="backtrace.lo simple.lo"
|
|
||||||
else
|
|
||||||
AC_CHECK_HEADER([unwind.h],
|
|
||||||
[AC_CHECK_FUNC([_Unwind_Backtrace],
|
|
||||||
[BACKTRACE_FILE="backtrace.lo simple.lo"],
|
|
||||||
[BACKTRACE_FILE="nounwind.lo"
|
|
||||||
backtrace_supported=no])],
|
|
||||||
[BACKTRACE_FILE="nounwind.lo"
|
|
||||||
backtrace_supported=no])
|
|
||||||
fi
|
|
||||||
AC_SUBST(BACKTRACE_FILE)
|
|
||||||
|
|
||||||
EXTRA_FLAGS=
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
|
|
||||||
else
|
|
||||||
AC_CACHE_CHECK([for -funwind-tables option],
|
|
||||||
[libbacktrace_cv_c_unwind_tables],
|
|
||||||
[CFLAGS_hold="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -funwind-tables"
|
|
||||||
AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([static int f() { return 0; }], [return f();])],
|
|
||||||
[libbacktrace_cv_c_unwind_tables=yes],
|
|
||||||
[libbacktrace_cv_c_unwind_tables=no])
|
|
||||||
CFLAGS="$CFLAGS_hold"])
|
|
||||||
if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
|
|
||||||
EXTRA_FLAGS=-funwind-tables
|
|
||||||
fi
|
|
||||||
AC_CACHE_CHECK([for -frandom-seed=string option],
|
|
||||||
[libbacktrace_cv_c_random_seed_string],
|
|
||||||
[CFLAGS_hold="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
|
|
||||||
AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([], [return 0;])],
|
|
||||||
[libbacktrace_cv_c_random_seed_string=yes],
|
|
||||||
[libbacktrace_cv_c_random_seed_string=no])
|
|
||||||
CFLAGS="$CFLAGS_hold"])
|
|
||||||
if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
|
|
||||||
EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST(EXTRA_FLAGS)
|
|
||||||
|
|
||||||
ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wstrict-prototypes \
|
|
||||||
-Wmissing-prototypes -Wold-style-definition \
|
|
||||||
-Wmissing-format-attribute -Wcast-qual],
|
|
||||||
[WARN_FLAGS])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([werror],
|
|
||||||
[AS_HELP_STRING([--disable-werror], [disable building with -Werror])])
|
|
||||||
AS_IF([test "x$enable_werror" != "xno" && test -n "${with_target_subdir}"],
|
|
||||||
[WARN_FLAGS="$WARN_FLAGS -Werror"])
|
|
||||||
|
|
||||||
AC_SUBST(WARN_FLAGS)
|
|
||||||
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
GCC_CHECK_UNWIND_GETIPINFO
|
|
||||||
else
|
|
||||||
ac_save_CFFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
|
|
||||||
AC_MSG_CHECKING([for _Unwind_GetIPInfo])
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[#include "unwind.h"
|
|
||||||
struct _Unwind_Context *context;
|
|
||||||
int ip_before_insn = 0;],
|
|
||||||
[return _Unwind_GetIPInfo (context, &ip_before_insn);])],
|
|
||||||
[have_unwind_getipinfo=yes], [have_unwind_getipinfo=no])
|
|
||||||
CFLAGS="$ac_save_CFLAGS"
|
|
||||||
AC_MSG_RESULT([$have_unwind_getipinfo])
|
|
||||||
if test "$have_unwind_getipinfo" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Enable --enable-host-shared.
|
|
||||||
AC_ARG_ENABLE(host-shared,
|
|
||||||
[AS_HELP_STRING([--enable-host-shared],
|
|
||||||
[build host code as shared libraries])],
|
|
||||||
[PIC_FLAG=-fPIC], [PIC_FLAG=])
|
|
||||||
AC_SUBST(PIC_FLAG)
|
|
||||||
|
|
||||||
# Test for __sync support.
|
|
||||||
AC_CACHE_CHECK([__sync extensions],
|
|
||||||
[libbacktrace_cv_sys_sync],
|
|
||||||
[if test -n "${with_target_subdir}"; then
|
|
||||||
case "${host}" in
|
|
||||||
hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;;
|
|
||||||
*) libbacktrace_cv_sys_sync=yes ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([int i;],
|
|
||||||
[__sync_bool_compare_and_swap (&i, i, i);
|
|
||||||
__sync_lock_test_and_set (&i, 1);
|
|
||||||
__sync_lock_release (&i);])],
|
|
||||||
[libbacktrace_cv_sys_sync=yes],
|
|
||||||
[libbacktrace_cv_sys_sync=no])
|
|
||||||
fi])
|
|
||||||
BACKTRACE_SUPPORTS_THREADS=0
|
|
||||||
if test "$libbacktrace_cv_sys_sync" = "yes"; then
|
|
||||||
BACKTRACE_SUPPORTS_THREADS=1
|
|
||||||
AC_DEFINE([HAVE_SYNC_FUNCTIONS], 1,
|
|
||||||
[Define to 1 if you have the __sync functions])
|
|
||||||
fi
|
|
||||||
AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
|
|
||||||
|
|
||||||
# Test for __atomic support.
|
|
||||||
AC_CACHE_CHECK([__atomic extensions],
|
|
||||||
[libbacktrace_cv_sys_atomic],
|
|
||||||
[if test -n "${with_target_subdir}"; then
|
|
||||||
libbacktrace_cv_sys_atomic=yes
|
|
||||||
else
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([int i;],
|
|
||||||
[__atomic_load_n (&i, __ATOMIC_ACQUIRE);
|
|
||||||
__atomic_store_n (&i, 1, __ATOMIC_RELEASE);])],
|
|
||||||
[libbacktrace_cv_sys_atomic=yes],
|
|
||||||
[libbacktrace_cv_sys_atomic=no])
|
|
||||||
fi])
|
|
||||||
if test "$libbacktrace_cv_sys_atomic" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE_ATOMIC_FUNCTIONS], 1,
|
|
||||||
[Define to 1 if you have the __atomic functions])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The library needs to be able to read the executable itself. Compile
|
|
||||||
# a file to determine the executable format. The awk script
|
|
||||||
# filetype.awk prints out the file type.
|
|
||||||
AC_CACHE_CHECK([output filetype],
|
|
||||||
[libbacktrace_cv_sys_filetype],
|
|
||||||
[filetype=
|
|
||||||
AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([int i;], [int j;])],
|
|
||||||
[filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`],
|
|
||||||
[AC_MSG_FAILURE([compiler failed])])
|
|
||||||
libbacktrace_cv_sys_filetype=$filetype])
|
|
||||||
|
|
||||||
# Match the file type to decide what files to compile.
|
|
||||||
FORMAT_FILE=
|
|
||||||
backtrace_supports_data=yes
|
|
||||||
case "$libbacktrace_cv_sys_filetype" in
|
|
||||||
elf*) FORMAT_FILE="elf.lo" ;;
|
|
||||||
macho) FORMAT_FILE="macho.lo" ;;
|
|
||||||
pecoff) FORMAT_FILE="pecoff.lo"
|
|
||||||
backtrace_supports_data=no
|
|
||||||
;;
|
|
||||||
xcoff*) FORMAT_FILE="xcoff.lo"
|
|
||||||
backtrace_supports_data=no
|
|
||||||
;;
|
|
||||||
*) AC_MSG_WARN([could not determine output file type])
|
|
||||||
FORMAT_FILE="unknown.lo"
|
|
||||||
backtrace_supported=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_SUBST(FORMAT_FILE)
|
|
||||||
|
|
||||||
# ELF defines.
|
|
||||||
elfsize=
|
|
||||||
case "$libbacktrace_cv_sys_filetype" in
|
|
||||||
elf32) elfsize=32 ;;
|
|
||||||
elf64) elfsize=64 ;;
|
|
||||||
*) elfsize=unused
|
|
||||||
esac
|
|
||||||
AC_DEFINE_UNQUOTED([BACKTRACE_ELF_SIZE], [$elfsize], [ELF size: 32 or 64])
|
|
||||||
AM_CONDITIONAL(HAVE_ELF, test "$FORMAT_FILE" = "elf.lo")
|
|
||||||
|
|
||||||
# XCOFF defines.
|
|
||||||
xcoffsize=
|
|
||||||
case "$libbacktrace_cv_sys_filetype" in
|
|
||||||
xcoff32) xcoffsize=32 ;;
|
|
||||||
xcoff64) xcoffsize=64 ;;
|
|
||||||
*) xcoffsize=unused
|
|
||||||
esac
|
|
||||||
AC_DEFINE_UNQUOTED([BACKTRACE_XCOFF_SIZE], [$xcoffsize], [XCOFF size: 32 or 64])
|
|
||||||
|
|
||||||
BACKTRACE_SUPPORTED=0
|
|
||||||
if test "$backtrace_supported" = "yes"; then
|
|
||||||
BACKTRACE_SUPPORTED=1
|
|
||||||
fi
|
|
||||||
AC_SUBST(BACKTRACE_SUPPORTED)
|
|
||||||
|
|
||||||
BACKTRACE_SUPPORTS_DATA=0
|
|
||||||
if test "$backtrace_supports_data" = "yes"; then
|
|
||||||
BACKTRACE_SUPPORTS_DATA=1
|
|
||||||
fi
|
|
||||||
AC_SUBST(BACKTRACE_SUPPORTS_DATA)
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(sys/mman.h)
|
|
||||||
if test "$ac_cv_header_sys_mman_h" = "no"; then
|
|
||||||
have_mmap=no
|
|
||||||
else
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
# When built as a GCC target library, we can't do a link test. We
|
|
||||||
# simply assume that if we have mman.h, we have mmap.
|
|
||||||
have_mmap=yes
|
|
||||||
case "${host}" in
|
|
||||||
spu-*-*|*-*-msdosdjgpp)
|
|
||||||
# The SPU does not have mmap, but it has a sys/mman.h header file
|
|
||||||
# containing "mmap_eaddr" and the mmap flags, confusing the test.
|
|
||||||
# DJGPP also has sys/man.h, but no mmap
|
|
||||||
have_mmap=no ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
AC_CHECK_FUNC(mmap, [have_mmap=yes], [have_mmap=no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$have_mmap" = "no"; then
|
|
||||||
VIEW_FILE=read.lo
|
|
||||||
ALLOC_FILE=alloc.lo
|
|
||||||
else
|
|
||||||
VIEW_FILE=mmapio.lo
|
|
||||||
AC_PREPROC_IFELSE([AC_LANG_SOURCE([
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
|
|
||||||
#error no MAP_ANONYMOUS
|
|
||||||
#endif
|
|
||||||
])], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
|
|
||||||
fi
|
|
||||||
AC_SUBST(VIEW_FILE)
|
|
||||||
AC_SUBST(ALLOC_FILE)
|
|
||||||
|
|
||||||
BACKTRACE_USES_MALLOC=0
|
|
||||||
if test "$ALLOC_FILE" = "alloc.lo"; then
|
|
||||||
BACKTRACE_USES_MALLOC=1
|
|
||||||
fi
|
|
||||||
AC_SUBST(BACKTRACE_USES_MALLOC)
|
|
||||||
|
|
||||||
# Check for dl_iterate_phdr.
|
|
||||||
AC_CHECK_HEADERS(link.h sys/link.h)
|
|
||||||
if test "$ac_cv_header_link_h" = "no" -a "$ac_cv_header_sys_link_h" = "no"; then
|
|
||||||
have_dl_iterate_phdr=no
|
|
||||||
else
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
link_h=link.h
|
|
||||||
if test "$ac_cv_header_link_h" = "no"; then
|
|
||||||
link_h=sys/link.h
|
|
||||||
fi
|
|
||||||
# When built as a GCC target library, we can't do a link test.
|
|
||||||
AC_EGREP_HEADER([dl_iterate_phdr], [$link_h], [have_dl_iterate_phdr=yes],
|
|
||||||
[have_dl_iterate_phdr=no])
|
|
||||||
case "${host}" in
|
|
||||||
*-*-solaris2.10*)
|
|
||||||
# Avoid dl_iterate_phdr on Solaris 10, where it is in the
|
|
||||||
# header file but is only in -ldl.
|
|
||||||
have_dl_iterate_phdr=no ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
AC_CHECK_FUNC([dl_iterate_phdr], [have_dl_iterate_phdr=yes],
|
|
||||||
[have_dl_iterate_phdr=no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$have_dl_iterate_phdr" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for header file for Mach-O image functions.
|
|
||||||
AC_CHECK_HEADERS(mach-o/dyld.h)
|
|
||||||
|
|
||||||
# Check for loadquery.
|
|
||||||
AC_CHECK_HEADERS(sys/ldr.h)
|
|
||||||
if test "$ac_cv_header_sys_ldr_h" = "no"; then
|
|
||||||
have_loadquery=no
|
|
||||||
else
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
# When built as a GCC target library, we can't do a link test.
|
|
||||||
AC_EGREP_HEADER([loadquery], [sys/ldr.h], [have_loadquery=yes],
|
|
||||||
[have_loadquery=no])
|
|
||||||
else
|
|
||||||
AC_CHECK_FUNC([loadquery], [have_loadquery=yes],
|
|
||||||
[have_loadquery=no])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$have_loadquery" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_LOADQUERY, 1, [Define if AIX loadquery is available.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for the fcntl function.
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
case "${host}" in
|
|
||||||
*-*-mingw*) have_fcntl=no ;;
|
|
||||||
spu-*-*) have_fcntl=no ;;
|
|
||||||
*) have_fcntl=yes ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
|
|
||||||
fi
|
|
||||||
if test "$have_fcntl" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE_FCNTL], 1,
|
|
||||||
[Define to 1 if you have the fcntl function])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_DECLS([strnlen, getpagesize])
|
|
||||||
AC_CHECK_FUNCS(lstat readlink)
|
|
||||||
|
|
||||||
# Check for getexecname function.
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
case "${host}" in
|
|
||||||
*-*-solaris2*) have_getexecname=yes ;;
|
|
||||||
*) have_getexecname=no ;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
|
|
||||||
fi
|
|
||||||
if test "$have_getexecname" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for _pgmptr variable, contains the executable filename on windows
|
|
||||||
AC_CHECK_DECLS([_pgmptr])
|
|
||||||
|
|
||||||
# Check for sysctl definitions.
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for KERN_PROC],
|
|
||||||
[libbacktrace_cv_proc],
|
|
||||||
[AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
], [int mib0 = CTL_KERN; int mib1 = KERN_PROC; int mib2 = KERN_PROC_PATHNAME;])],
|
|
||||||
[libbacktrace_cv_proc=yes],
|
|
||||||
[libbacktrace_cv_proc=no])])
|
|
||||||
if test "$libbacktrace_cv_proc" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE_KERN_PROC], 1,
|
|
||||||
[Define to 1 if you have KERN_PROC and KERN_PROC_PATHNAME in <sys/sysctl.h>.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for KERN_PROG_ARGS],
|
|
||||||
[libbacktrace_cv_procargs],
|
|
||||||
[AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM([
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
], [int mib0 = CTL_KERN; int mib1 = KERN_PROC_ARGS; int mib2 = KERN_PROC_PATHNAME;])],
|
|
||||||
[libbacktrace_cv_procargs=yes],
|
|
||||||
[libbacktrace_cv_procargs=no])])
|
|
||||||
if test "$libbacktrace_cv_procargs" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE_KERN_PROC_ARGS], 1,
|
|
||||||
[Define to 1 if you have KERN_PROCARGS and KERN_PROC_PATHNAME in <sys/sysctl.h>.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for the clock_gettime function.
|
|
||||||
AC_CHECK_FUNCS(clock_gettime)
|
|
||||||
clock_gettime_link=
|
|
||||||
# At least for glibc, clock_gettime is in librt. But don't
|
|
||||||
# pull that in if it still doesn't give us the function we want. This
|
|
||||||
# test is copied from libgomp, and modified to not link in -lrt as
|
|
||||||
# we're using this for test timing only.
|
|
||||||
if test "$ac_cv_func_clock_gettime" = no; then
|
|
||||||
AC_CHECK_LIB(rt, clock_gettime,
|
|
||||||
[CLOCK_GETTIME_LINK=-lrt
|
|
||||||
AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
|
|
||||||
[Define to 1 if you have the `clock_gettime' function.])])
|
|
||||||
fi
|
|
||||||
AC_SUBST(CLOCK_GETTIME_LINK)
|
|
||||||
|
|
||||||
dnl Test whether the compiler supports the -pthread option.
|
|
||||||
AC_CACHE_CHECK([whether -pthread is supported],
|
|
||||||
[libgo_cv_lib_pthread],
|
|
||||||
[CFLAGS_hold=$CFLAGS
|
|
||||||
CFLAGS="$CFLAGS -pthread"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])],
|
|
||||||
[libgo_cv_lib_pthread=yes],
|
|
||||||
[libgo_cv_lib_pthread=no])
|
|
||||||
CFLAGS=$CFLAGS_hold])
|
|
||||||
PTHREAD_CFLAGS=
|
|
||||||
if test "$libgo_cv_lib_pthread" = yes; then
|
|
||||||
PTHREAD_CFLAGS=-pthread
|
|
||||||
fi
|
|
||||||
AC_SUBST(PTHREAD_CFLAGS)
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_PTHREAD, test "$libgo_cv_lib_pthread" = yes)
|
|
||||||
|
|
||||||
dnl Test whether the compiler and the linker support the -gdwarf-5 option.
|
|
||||||
AC_CACHE_CHECK([whether -gdwarf-5 is supported],
|
|
||||||
[libbacktrace_cv_lib_dwarf5],
|
|
||||||
[CFLAGS_hold=$CFLAGS
|
|
||||||
CFLAGS="$CFLAGS -gdwarf-5"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([int i;], [return 0;])],
|
|
||||||
[libbacktrace_cv_lib_dwarf5=yes],
|
|
||||||
[libbacktrace_cv_lib_dwarf5=no])
|
|
||||||
CFLAGS=$CFLAGS_hold])
|
|
||||||
AM_CONDITIONAL(HAVE_DWARF5, test "$libbacktrace_cv_lib_dwarf5" = yes)
|
|
||||||
|
|
||||||
AC_CHECK_LIB([z], [compress],
|
|
||||||
[AC_DEFINE(HAVE_ZLIB, 1, [Define if -lz is available.])])
|
|
||||||
AM_CONDITIONAL(HAVE_ZLIB, test "$ac_cv_lib_z_compress" = yes)
|
|
||||||
|
|
||||||
dnl Test whether the linker supports the --build-id option.
|
|
||||||
AC_CACHE_CHECK([whether --build-id is supported],
|
|
||||||
[libbacktrace_cv_ld_buildid],
|
|
||||||
[LDFLAGS_hold=$LDFLAGS
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,--build-id"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
|
|
||||||
[libbacktrace_cv_ld_buildid=yes],
|
|
||||||
[libbacktrace_cv_ld_buildid=no])
|
|
||||||
LDFLAGS=$LDFLAGS_hold])
|
|
||||||
AM_CONDITIONAL(HAVE_BUILDID, test "$libbacktrace_cv_ld_buildid" = yes)
|
|
||||||
|
|
||||||
dnl Test whether the linker supports the --compress-debug-sections option.
|
|
||||||
AC_CACHE_CHECK([whether --compress-debug-sections is supported],
|
|
||||||
[libgo_cv_ld_compress],
|
|
||||||
[LDFLAGS_hold=$LDFLAGS
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,--compress-debug-sections=zlib-gnu"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
|
|
||||||
[libgo_cv_ld_compress=yes],
|
|
||||||
[libgo_cv_ld_compress=no])
|
|
||||||
LDFLAGS=$LDFLAGS_hold])
|
|
||||||
AM_CONDITIONAL(HAVE_COMPRESSED_DEBUG, test "$libgo_cv_ld_compress" = yes)
|
|
||||||
|
|
||||||
AC_CHECK_LIB([zstd], [ZSTD_compress],
|
|
||||||
[AC_DEFINE(HAVE_ZSTD, 1, [Define if -lzstd is available.])])
|
|
||||||
AM_CONDITIONAL(HAVE_ZSTD, test "$ac_cv_lib_zstd_ZSTD_compress" = yes)
|
|
||||||
|
|
||||||
dnl Test whether the linker supports --compress-debug-sections=zstd option.
|
|
||||||
AC_CACHE_CHECK([whether --compress-debug-sections=zstd is supported],
|
|
||||||
[libgo_cv_ld_compress_zstd],
|
|
||||||
[LDFLAGS_hold=$LDFLAGS
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,--compress-debug-sections=zstd"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
|
|
||||||
[libgo_cv_ld_compress_zstd=yes],
|
|
||||||
[libgo_cv_ld_compress_zstd=no])
|
|
||||||
LDFLAGS=$LDFLAGS_hold])
|
|
||||||
AM_CONDITIONAL(HAVE_COMPRESSED_DEBUG_ZSTD, test "$libgo_cv_ld_compress_zstd" = yes)
|
|
||||||
|
|
||||||
AC_ARG_VAR(OBJCOPY, [location of objcopy])
|
|
||||||
AC_CHECK_PROG(OBJCOPY, objcopy, objcopy,)
|
|
||||||
AC_CHECK_PROG(READELF, readelf, readelf)
|
|
||||||
AC_CACHE_CHECK([whether objcopy supports debuglink],
|
|
||||||
[libbacktrace_cv_objcopy_debuglink],
|
|
||||||
[if test -n "${with_target_subdir}"; then
|
|
||||||
libbacktrace_cv_objcopy_debuglink=no
|
|
||||||
elif ! test -n "${OBJCOPY}"; then
|
|
||||||
libbacktrace_cv_objcopy_debuglink=no
|
|
||||||
elif ${OBJCOPY} --help | grep add-gnu-debuglink >/dev/null 2>&1; then
|
|
||||||
libbacktrace_cv_objcopy_debuglink=yes
|
|
||||||
else
|
|
||||||
libbacktrace_cv_objcopy_debuglink=no
|
|
||||||
fi])
|
|
||||||
AM_CONDITIONAL(HAVE_OBJCOPY_DEBUGLINK, test "$libbacktrace_cv_objcopy_debuglink" = yes)
|
|
||||||
|
|
||||||
AC_ARG_VAR(DSYMUTIL, [location of dsymutil])
|
|
||||||
AC_CHECK_PROG(DSYMUTIL, dsymutil, dsymutil)
|
|
||||||
AM_CONDITIONAL(USE_DSYMUTIL, test -n "${DSYMUTIL}" -a "$FORMAT_FILE" = "macho.lo")
|
|
||||||
|
|
||||||
AC_ARG_VAR(NM, [location of nm])
|
|
||||||
AC_CHECK_PROG(NM, nm, nm)
|
|
||||||
|
|
||||||
AC_CHECK_PROG(XZ, xz, xz)
|
|
||||||
AM_CONDITIONAL(HAVE_XZ, test "$XZ" != "")
|
|
||||||
AC_CHECK_PROG(COMM, comm, comm)
|
|
||||||
AM_CONDITIONAL(HAVE_COMM, test "$COMM" != "")
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_MINIDEBUG,
|
|
||||||
test "${with_target_subdir}" = "" -a "$FORMAT_FILE" = "elf.lo" -a "${OBJCOPY}" != "" -a "${NM}" != "" -a "${XZ}" != "" -a "${COMM}" != "")
|
|
||||||
|
|
||||||
AC_CHECK_LIB([lzma], [lzma_auto_decoder],
|
|
||||||
[AC_DEFINE(HAVE_LIBLZMA, 1, [Define if -llzma is available.])])
|
|
||||||
AM_CONDITIONAL(HAVE_LIBLZMA, test "$ac_cv_lib_lzma_lzma_auto_decoder" = yes)
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether tests can run],
|
|
||||||
[libbacktrace_cv_sys_native],
|
|
||||||
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
|
||||||
[libbacktrace_cv_sys_native=yes],
|
|
||||||
[libbacktrace_cv_sys_native=no],
|
|
||||||
[libbacktrace_cv_sys_native=no])])
|
|
||||||
AM_CONDITIONAL(NATIVE, test "$libbacktrace_cv_sys_native" = "yes")
|
|
||||||
|
|
||||||
if test "${multilib}" = "yes"; then
|
|
||||||
multilib_arg="--enable-multilib"
|
|
||||||
else
|
|
||||||
multilib_arg=
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CONFIG_FILES(Makefile backtrace-supported.h)
|
|
||||||
AC_CONFIG_FILES(install-debuginfo-for-buildid.sh, chmod +x install-debuginfo-for-buildid.sh)
|
|
||||||
|
|
||||||
# We need multilib support, but only if configuring for the target.
|
|
||||||
AC_CONFIG_COMMANDS([default],
|
|
||||||
[if test -n "$CONFIG_FILES"; then
|
|
||||||
if test -n "${with_target_subdir}"; then
|
|
||||||
# Multilibs need MULTISUBDIR defined correctly in certain makefiles so
|
|
||||||
# that multilib installs will end up installed in the correct place.
|
|
||||||
# The testsuite needs it for multilib-aware ABI baseline files.
|
|
||||||
# To work around this not being passed down from config-ml.in ->
|
|
||||||
# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
|
|
||||||
# append it here. Only modify Makefiles that have just been created.
|
|
||||||
#
|
|
||||||
# Also, get rid of this simulated-VPATH thing that automake does.
|
|
||||||
cat > vpsed << \_EOF
|
|
||||||
s!`test -f '$<' || echo '$(srcdir)/'`!!
|
|
||||||
_EOF
|
|
||||||
for i in $SUBDIRS; do
|
|
||||||
case $CONFIG_FILES in
|
|
||||||
*${i}/Makefile*)
|
|
||||||
#echo "Adding MULTISUBDIR to $i/Makefile"
|
|
||||||
sed -f vpsed $i/Makefile > tmp
|
|
||||||
grep '^MULTISUBDIR =' Makefile >> tmp
|
|
||||||
mv tmp $i/Makefile
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
rm vpsed
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
],
|
|
||||||
[
|
|
||||||
# Variables needed in config.status (file generation) which aren't already
|
|
||||||
# passed by autoconf.
|
|
||||||
SUBDIRS="$SUBDIRS"
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_OUTPUT
|
|
4402
deps/libbacktrace/dwarf.c
vendored
4402
deps/libbacktrace/dwarf.c
vendored
File diff suppressed because it is too large
Load Diff
120
deps/libbacktrace/edtest.c
vendored
120
deps/libbacktrace/edtest.c
vendored
@ -1,120 +0,0 @@
|
|||||||
/* edtest.c -- Test for libbacktrace storage allocation stress handling
|
|
||||||
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
static int test1 (void) __attribute__ ((noinline, noclone, unused));
|
|
||||||
extern int f2 (int);
|
|
||||||
extern int f3 (int, int);
|
|
||||||
|
|
||||||
static int
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
/* Returning a value here and elsewhere avoids a tailcall which
|
|
||||||
would mess up the backtrace. */
|
|
||||||
return f2 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
f3 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.all = &all[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index < 3)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
|
||||||
data.index);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test1", 0, all, f3line, "f3", "edtest.c", &data.failed);
|
|
||||||
check ("test1", 1, all, f2line, "f2", "edtest2_build.c", &data.failed);
|
|
||||||
check ("test1", 2, all, f1line, "test1", "edtest.c", &data.failed);
|
|
||||||
|
|
||||||
printf ("%s: backtrace_full alloc stress\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
// Grab the storage allocation lock prior to doing anything interesting.
|
|
||||||
// The intent here is to insure that the backtrace_alloc code is forced
|
|
||||||
// to always call mmap() for new memory as opposed to reusing previously
|
|
||||||
// allocated memory from the free list. Doing things this way helps
|
|
||||||
// simulate what you might see in a multithreaded program in which there
|
|
||||||
// are racing calls to the allocator.
|
|
||||||
struct backtrace_state *state_internal =
|
|
||||||
(struct backtrace_state *) state;
|
|
||||||
state_internal->lock_alloc = 1;
|
|
||||||
|
|
||||||
// Kick off the test
|
|
||||||
test1();
|
|
||||||
|
|
||||||
exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
43
deps/libbacktrace/edtest2.c
vendored
43
deps/libbacktrace/edtest2.c
vendored
@ -1,43 +0,0 @@
|
|||||||
/* edtest2.c -- Test for libbacktrace storage allocation stress handling (p2)
|
|
||||||
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* This file intentionally written without any #include's
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int f3(int, int);
|
|
||||||
extern int f2(int);
|
|
||||||
|
|
||||||
int f2(int x)
|
|
||||||
{
|
|
||||||
/* Returning a value here and elsewhere avoids a tailcall which
|
|
||||||
would mess up the backtrace. */
|
|
||||||
return f3(x, __LINE__) + 3;
|
|
||||||
}
|
|
7443
deps/libbacktrace/elf.c
vendored
7443
deps/libbacktrace/elf.c
vendored
File diff suppressed because it is too large
Load Diff
361
deps/libbacktrace/fileline.c
vendored
361
deps/libbacktrace/fileline.c
vendored
@ -1,361 +0,0 @@
|
|||||||
/* fileline.c -- Get file and line number information in a backtrace.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#if defined (HAVE_KERN_PROC_ARGS) || defined (HAVE_KERN_PROC)
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_MACH_O_DYLD_H
|
|
||||||
#include <mach-o/dyld.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_GETEXECNAME
|
|
||||||
#define getexecname() NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined (HAVE_KERN_PROC_ARGS) && !defined (HAVE_KERN_PROC)
|
|
||||||
|
|
||||||
#define sysctl_exec_name1(state, error_callback, data) NULL
|
|
||||||
#define sysctl_exec_name2(state, error_callback, data) NULL
|
|
||||||
|
|
||||||
#else /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */
|
|
||||||
|
|
||||||
static char *
|
|
||||||
sysctl_exec_name (struct backtrace_state *state,
|
|
||||||
int mib0, int mib1, int mib2, int mib3,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
int mib[4];
|
|
||||||
size_t len;
|
|
||||||
char *name;
|
|
||||||
size_t rlen;
|
|
||||||
|
|
||||||
mib[0] = mib0;
|
|
||||||
mib[1] = mib1;
|
|
||||||
mib[2] = mib2;
|
|
||||||
mib[3] = mib3;
|
|
||||||
|
|
||||||
if (sysctl (mib, 4, NULL, &len, NULL, 0) < 0)
|
|
||||||
return NULL;
|
|
||||||
name = (char *) backtrace_alloc (state, len, error_callback, data);
|
|
||||||
if (name == NULL)
|
|
||||||
return NULL;
|
|
||||||
rlen = len;
|
|
||||||
if (sysctl (mib, 4, name, &rlen, NULL, 0) < 0)
|
|
||||||
{
|
|
||||||
backtrace_free (state, name, len, error_callback, data);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_KERN_PROC_ARGS
|
|
||||||
|
|
||||||
static char *
|
|
||||||
sysctl_exec_name1 (struct backtrace_state *state,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
/* This variant is used on NetBSD. */
|
|
||||||
return sysctl_exec_name (state, CTL_KERN, KERN_PROC_ARGS, -1,
|
|
||||||
KERN_PROC_PATHNAME, error_callback, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define sysctl_exec_name1(state, error_callback, data) NULL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_KERN_PROC
|
|
||||||
|
|
||||||
static char *
|
|
||||||
sysctl_exec_name2 (struct backtrace_state *state,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
/* This variant is used on FreeBSD. */
|
|
||||||
return sysctl_exec_name (state, CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1,
|
|
||||||
error_callback, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define sysctl_exec_name2(state, error_callback, data) NULL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */
|
|
||||||
|
|
||||||
#ifdef HAVE_MACH_O_DYLD_H
|
|
||||||
|
|
||||||
static char *
|
|
||||||
macho_get_executable_path (struct backtrace_state *state,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
uint32_t len;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
if (_NSGetExecutablePath (NULL, &len) == 0)
|
|
||||||
return NULL;
|
|
||||||
name = (char *) backtrace_alloc (state, len, error_callback, data);
|
|
||||||
if (name == NULL)
|
|
||||||
return NULL;
|
|
||||||
if (_NSGetExecutablePath (name, &len) != 0)
|
|
||||||
{
|
|
||||||
backtrace_free (state, name, len, error_callback, data);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !defined (HAVE_MACH_O_DYLD_H) */
|
|
||||||
|
|
||||||
#define macho_get_executable_path(state, error_callback, data) NULL
|
|
||||||
|
|
||||||
#endif /* !defined (HAVE_MACH_O_DYLD_H) */
|
|
||||||
|
|
||||||
#if HAVE_DECL__PGMPTR
|
|
||||||
|
|
||||||
#define windows_executable_filename() _pgmptr
|
|
||||||
|
|
||||||
#else /* !HAVE_DECL__PGMPTR */
|
|
||||||
|
|
||||||
#define windows_executable_filename() NULL
|
|
||||||
|
|
||||||
#endif /* !HAVE_DECL__PGMPTR */
|
|
||||||
|
|
||||||
/* Initialize the fileline information from the executable. Returns 1
|
|
||||||
on success, 0 on failure. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
fileline_initialize (struct backtrace_state *state,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
int failed;
|
|
||||||
fileline fileline_fn;
|
|
||||||
int pass;
|
|
||||||
int called_error_callback;
|
|
||||||
int descriptor;
|
|
||||||
const char *filename;
|
|
||||||
char buf[64];
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
failed = state->fileline_initialization_failed;
|
|
||||||
else
|
|
||||||
failed = backtrace_atomic_load_int (&state->fileline_initialization_failed);
|
|
||||||
|
|
||||||
if (failed)
|
|
||||||
{
|
|
||||||
error_callback (data, "failed to read executable information", -1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
fileline_fn = state->fileline_fn;
|
|
||||||
else
|
|
||||||
fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
|
|
||||||
if (fileline_fn != NULL)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* We have not initialized the information. Do it now. */
|
|
||||||
|
|
||||||
descriptor = -1;
|
|
||||||
called_error_callback = 0;
|
|
||||||
for (pass = 0; pass < 9; ++pass)
|
|
||||||
{
|
|
||||||
int does_not_exist;
|
|
||||||
|
|
||||||
switch (pass)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
filename = state->filename;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
filename = getexecname ();
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
/* Test this before /proc/self/exe, as the latter exists but points
|
|
||||||
to the wine binary (and thus doesn't work). */
|
|
||||||
filename = windows_executable_filename ();
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
filename = "/proc/self/exe";
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
filename = "/proc/curproc/file";
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
snprintf (buf, sizeof (buf), "/proc/%ld/object/a.out",
|
|
||||||
(long) getpid ());
|
|
||||||
filename = buf;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
filename = sysctl_exec_name1 (state, error_callback, data);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
filename = sysctl_exec_name2 (state, error_callback, data);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
filename = macho_get_executable_path (state, error_callback, data);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
abort ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filename == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
descriptor = backtrace_open (filename, error_callback, data,
|
|
||||||
&does_not_exist);
|
|
||||||
if (descriptor < 0 && !does_not_exist)
|
|
||||||
{
|
|
||||||
called_error_callback = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (descriptor >= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (descriptor < 0)
|
|
||||||
{
|
|
||||||
if (!called_error_callback)
|
|
||||||
{
|
|
||||||
if (state->filename != NULL)
|
|
||||||
error_callback (data, state->filename, ENOENT);
|
|
||||||
else
|
|
||||||
error_callback (data,
|
|
||||||
"libbacktrace could not find executable to open",
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!failed)
|
|
||||||
{
|
|
||||||
if (!backtrace_initialize (state, filename, descriptor, error_callback,
|
|
||||||
data, &fileline_fn))
|
|
||||||
failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (failed)
|
|
||||||
{
|
|
||||||
if (!state->threaded)
|
|
||||||
state->fileline_initialization_failed = 1;
|
|
||||||
else
|
|
||||||
backtrace_atomic_store_int (&state->fileline_initialization_failed, 1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
state->fileline_fn = fileline_fn;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
backtrace_atomic_store_pointer (&state->fileline_fn, fileline_fn);
|
|
||||||
|
|
||||||
/* Note that if two threads initialize at once, one of the data
|
|
||||||
sets may be leaked. */
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Given a PC, find the file name, line number, and function name. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
|
|
||||||
backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
if (!fileline_initialize (state, error_callback, data))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (state->fileline_initialization_failed)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return state->fileline_fn (state, pc, callback, error_callback, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Given a PC, find the symbol for it, and its value. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_syminfo (struct backtrace_state *state, uintptr_t pc,
|
|
||||||
backtrace_syminfo_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
if (!fileline_initialize (state, error_callback, data))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (state->fileline_initialization_failed)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
state->syminfo_fn (state, pc, callback, error_callback, data);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A backtrace_syminfo_callback that can call into a
|
|
||||||
backtrace_full_callback, used when we have a symbol table but no
|
|
||||||
debug info. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_syminfo_to_full_callback (void *data, uintptr_t pc,
|
|
||||||
const char *symname,
|
|
||||||
uintptr_t symval ATTRIBUTE_UNUSED,
|
|
||||||
uintptr_t symsize ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
struct backtrace_call_full *bdata = (struct backtrace_call_full *) data;
|
|
||||||
|
|
||||||
bdata->ret = bdata->full_callback (bdata->full_data, pc, NULL, 0, symname);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An error callback that corresponds to
|
|
||||||
backtrace_syminfo_to_full_callback. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_syminfo_to_full_error_callback (void *data, const char *msg,
|
|
||||||
int errnum)
|
|
||||||
{
|
|
||||||
struct backtrace_call_full *bdata = (struct backtrace_call_full *) data;
|
|
||||||
|
|
||||||
bdata->full_error_callback (bdata->full_data, msg, errnum);
|
|
||||||
}
|
|
52
deps/libbacktrace/filenames.h
vendored
52
deps/libbacktrace/filenames.h
vendored
@ -1,52 +0,0 @@
|
|||||||
/* btest.c -- Filename header for libbacktrace library
|
|
||||||
Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#ifndef GCC_VERSION
|
|
||||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (GCC_VERSION < 2007)
|
|
||||||
# define __attribute__(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_UNUSED
|
|
||||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__)
|
|
||||||
# define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\')
|
|
||||||
# define HAS_DRIVE_SPEC(f) ((f)[0] != '\0' && (f)[1] == ':')
|
|
||||||
# define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || HAS_DRIVE_SPEC(f))
|
|
||||||
#else
|
|
||||||
# define IS_DIR_SEPARATOR(c) ((c) == '/')
|
|
||||||
# define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]))
|
|
||||||
#endif
|
|
13
deps/libbacktrace/filetype.awk
vendored
13
deps/libbacktrace/filetype.awk
vendored
@ -1,13 +0,0 @@
|
|||||||
# An awk script to determine the type of a file.
|
|
||||||
/^\177ELF\001/ { if (NR == 1) { print "elf32"; exit } }
|
|
||||||
/^\177ELF\002/ { if (NR == 1) { print "elf64"; exit } }
|
|
||||||
/^\114\001/ { if (NR == 1) { print "pecoff"; exit } }
|
|
||||||
/^\144\206/ { if (NR == 1) { print "pecoff"; exit } }
|
|
||||||
/^\001\337/ { if (NR == 1) { print "xcoff32"; exit } }
|
|
||||||
/^\001\367/ { if (NR == 1) { print "xcoff64"; exit } }
|
|
||||||
/^\376\355\372\316/ { if (NR == 1) { print "macho"; exit } }
|
|
||||||
/^\316\372\355\376/ { if (NR == 1) { print "macho"; exit } }
|
|
||||||
/^\376\355\372\317/ { if (NR == 1) { print "macho"; exit } }
|
|
||||||
/^\317\372\355\376/ { if (NR == 1) { print "macho"; exit } }
|
|
||||||
/^\312\376\272\276/ { if (NR == 1) { print "macho"; exit } }
|
|
||||||
/^\276\272\376\312/ { if (NR == 1) { print "macho"; exit } }
|
|
@ -1,65 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# install-debug-info-for-buildid.sh -- Helper script for libbacktrace library
|
|
||||||
# testing.
|
|
||||||
# Copyright (C) 2019-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
|
|
||||||
# (1) Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
# (2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in
|
|
||||||
# the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
|
|
||||||
# (3) The name of the author may not be used to
|
|
||||||
# endorse or promote products derived from this software without
|
|
||||||
# specific prior written permission.
|
|
||||||
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
# Extract build-id from src, and copy debug info of src to
|
|
||||||
# $build_id_dir/aa/bb...zz.debug.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
sed=@SED@
|
|
||||||
awk=@AWK@
|
|
||||||
grep=@GREP@
|
|
||||||
objcopy=@OBJCOPY@
|
|
||||||
readelf=@READELF@
|
|
||||||
mkdir_p="@MKDIR_P@"
|
|
||||||
|
|
||||||
build_id_dir="$1"
|
|
||||||
src="$2"
|
|
||||||
|
|
||||||
buildid=$($readelf -n $src \
|
|
||||||
| $grep "Build ID" \
|
|
||||||
| $awk '{print $3}')
|
|
||||||
|
|
||||||
prefix=$(echo $buildid \
|
|
||||||
| $sed 's/^\(.\{2\}\).*/\1/')
|
|
||||||
|
|
||||||
remainder=$(echo $buildid \
|
|
||||||
| $sed 's/^.\{2\}//')
|
|
||||||
|
|
||||||
dir=$build_id_dir/$prefix
|
|
||||||
dst=$dir/$remainder.debug
|
|
||||||
|
|
||||||
$mkdir_p $dir
|
|
||||||
|
|
||||||
$objcopy --only-keep-debug $src $dst
|
|
501
deps/libbacktrace/install-sh
vendored
501
deps/libbacktrace/install-sh
vendored
@ -1,501 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2013-12-25.23; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# 'make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
tab=' '
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" $tab$nl"
|
|
||||||
|
|
||||||
# Set DOITPROG to "echo" to test this script.
|
|
||||||
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
doit_exec=${doit:-exec}
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
is_target_a_directory=possibly
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t)
|
|
||||||
is_target_a_directory=always
|
|
||||||
dst_arg=$2
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) is_target_a_directory=never;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# We allow the use of options -d and -T together, by making -d
|
|
||||||
# take the precedence; this is for compatibility with GNU install.
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
echo "$0: target directory not allowed when installing a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call 'install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
|
||||||
if test ! -d "$dst_arg"; then
|
|
||||||
echo "$0: $dst_arg: Is not a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
do_exit='(exit $ret); exit $ret'
|
|
||||||
trap "ret=129; $do_exit" 1
|
|
||||||
trap "ret=130; $do_exit" 2
|
|
||||||
trap "ret=141; $do_exit" 13
|
|
||||||
trap "ret=143; $do_exit" 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $src in
|
|
||||||
-* | [=\(\)!]) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dst=$dst_arg
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test "$is_target_a_directory" = never; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
dstdir=`dirname "$dst"`
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
[-=\(\)!]*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test X"$d" = X && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
set +f &&
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
114
deps/libbacktrace/instrumented_alloc.c
vendored
114
deps/libbacktrace/instrumented_alloc.c
vendored
@ -1,114 +0,0 @@
|
|||||||
/* instrumented_alloc.c -- Memory allocation instrumented to fail when
|
|
||||||
requested, for testing purposes.
|
|
||||||
Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* Include all the header files of alloc here, to make sure they're not
|
|
||||||
processed when including alloc.c below, such that the redefinitions of malloc
|
|
||||||
and realloc are only effective in alloc.c itself. This does not work for
|
|
||||||
config.h, because it's not wrapped in "#ifndef CONFIG_H\n#define CONFIG_H"
|
|
||||||
and "#endif" but that does not seem to be harmful. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
extern void *instrumented_malloc (size_t size);
|
|
||||||
extern void *instrumented_realloc (void *ptr, size_t size);
|
|
||||||
|
|
||||||
#define malloc instrumented_malloc
|
|
||||||
#define realloc instrumented_realloc
|
|
||||||
#include "alloc.c"
|
|
||||||
#undef malloc
|
|
||||||
#undef realloc
|
|
||||||
|
|
||||||
static uint64_t nr_allocs = 0;
|
|
||||||
static uint64_t fail_at_alloc = 0;
|
|
||||||
|
|
||||||
extern int at_fail_alloc_p (void);
|
|
||||||
extern uint64_t get_nr_allocs (void);
|
|
||||||
extern void set_fail_at_alloc (uint64_t);
|
|
||||||
|
|
||||||
void *
|
|
||||||
instrumented_malloc (size_t size)
|
|
||||||
{
|
|
||||||
void *res;
|
|
||||||
|
|
||||||
if (at_fail_alloc_p ())
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
res = malloc (size);
|
|
||||||
if (res != NULL)
|
|
||||||
nr_allocs++;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
instrumented_realloc (void *ptr, size_t size)
|
|
||||||
{
|
|
||||||
void *res;
|
|
||||||
|
|
||||||
if (size != 0)
|
|
||||||
{
|
|
||||||
if (at_fail_alloc_p ())
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = realloc (ptr, size);
|
|
||||||
if (res != NULL)
|
|
||||||
nr_allocs++;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
at_fail_alloc_p (void)
|
|
||||||
{
|
|
||||||
return fail_at_alloc == nr_allocs + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t
|
|
||||||
get_nr_allocs (void)
|
|
||||||
{
|
|
||||||
return nr_allocs;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
set_fail_at_alloc (uint64_t nr)
|
|
||||||
{
|
|
||||||
fail_at_alloc = nr;
|
|
||||||
}
|
|
389
deps/libbacktrace/internal.h
vendored
389
deps/libbacktrace/internal.h
vendored
@ -1,389 +0,0 @@
|
|||||||
/* internal.h -- Internal header file for stack backtrace library.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#ifndef BACKTRACE_INTERNAL_H
|
|
||||||
#define BACKTRACE_INTERNAL_H
|
|
||||||
|
|
||||||
/* We assume that <sys/types.h> and "backtrace.h" have already been
|
|
||||||
included. */
|
|
||||||
|
|
||||||
#ifndef GCC_VERSION
|
|
||||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (GCC_VERSION < 2007)
|
|
||||||
# define __attribute__(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_UNUSED
|
|
||||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_MALLOC
|
|
||||||
# if (GCC_VERSION >= 2096)
|
|
||||||
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
|
||||||
# else
|
|
||||||
# define ATTRIBUTE_MALLOC
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_FALLTHROUGH
|
|
||||||
# if (GCC_VERSION >= 7000)
|
|
||||||
# define ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
|
|
||||||
# else
|
|
||||||
# define ATTRIBUTE_FALLTHROUGH
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_SYNC_FUNCTIONS
|
|
||||||
|
|
||||||
/* Define out the sync functions. These should never be called if
|
|
||||||
they are not available. */
|
|
||||||
|
|
||||||
#define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
|
|
||||||
#define __sync_lock_test_and_set(A, B) (abort(), 0)
|
|
||||||
#define __sync_lock_release(A) abort()
|
|
||||||
|
|
||||||
#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
|
|
||||||
|
|
||||||
#ifdef HAVE_ATOMIC_FUNCTIONS
|
|
||||||
|
|
||||||
/* We have the atomic builtin functions. */
|
|
||||||
|
|
||||||
#define backtrace_atomic_load_pointer(p) \
|
|
||||||
__atomic_load_n ((p), __ATOMIC_ACQUIRE)
|
|
||||||
#define backtrace_atomic_load_int(p) \
|
|
||||||
__atomic_load_n ((p), __ATOMIC_ACQUIRE)
|
|
||||||
#define backtrace_atomic_store_pointer(p, v) \
|
|
||||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
|
||||||
#define backtrace_atomic_store_size_t(p, v) \
|
|
||||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
|
||||||
#define backtrace_atomic_store_int(p, v) \
|
|
||||||
__atomic_store_n ((p), (v), __ATOMIC_RELEASE)
|
|
||||||
|
|
||||||
#else /* !defined (HAVE_ATOMIC_FUNCTIONS) */
|
|
||||||
#ifdef HAVE_SYNC_FUNCTIONS
|
|
||||||
|
|
||||||
/* We have the sync functions but not the atomic functions. Define
|
|
||||||
the atomic ones in terms of the sync ones. */
|
|
||||||
|
|
||||||
extern void *backtrace_atomic_load_pointer (void *);
|
|
||||||
extern int backtrace_atomic_load_int (int *);
|
|
||||||
extern void backtrace_atomic_store_pointer (void *, void *);
|
|
||||||
extern void backtrace_atomic_store_size_t (size_t *, size_t);
|
|
||||||
extern void backtrace_atomic_store_int (int *, int);
|
|
||||||
|
|
||||||
#else /* !defined (HAVE_SYNC_FUNCTIONS) */
|
|
||||||
|
|
||||||
/* We have neither the sync nor the atomic functions. These will
|
|
||||||
never be called. */
|
|
||||||
|
|
||||||
#define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
|
|
||||||
#define backtrace_atomic_load_int(p) (abort(), 0)
|
|
||||||
#define backtrace_atomic_store_pointer(p, v) abort()
|
|
||||||
#define backtrace_atomic_store_size_t(p, v) abort()
|
|
||||||
#define backtrace_atomic_store_int(p, v) abort()
|
|
||||||
|
|
||||||
#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
|
|
||||||
#endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
|
|
||||||
|
|
||||||
/* The type of the function that collects file/line information. This
|
|
||||||
is like backtrace_pcinfo. */
|
|
||||||
|
|
||||||
typedef int (*fileline) (struct backtrace_state *state, uintptr_t pc,
|
|
||||||
backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data);
|
|
||||||
|
|
||||||
/* The type of the function that collects symbol information. This is
|
|
||||||
like backtrace_syminfo. */
|
|
||||||
|
|
||||||
typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
|
|
||||||
backtrace_syminfo_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data);
|
|
||||||
|
|
||||||
/* What the backtrace state pointer points to. */
|
|
||||||
|
|
||||||
struct backtrace_state
|
|
||||||
{
|
|
||||||
/* The name of the executable. */
|
|
||||||
const char *filename;
|
|
||||||
/* Non-zero if threaded. */
|
|
||||||
int threaded;
|
|
||||||
/* The master lock for fileline_fn, fileline_data, syminfo_fn,
|
|
||||||
syminfo_data, fileline_initialization_failed and everything the
|
|
||||||
data pointers point to. */
|
|
||||||
void *lock;
|
|
||||||
/* The function that returns file/line information. */
|
|
||||||
fileline fileline_fn;
|
|
||||||
/* The data to pass to FILELINE_FN. */
|
|
||||||
void *fileline_data;
|
|
||||||
/* The function that returns symbol information. */
|
|
||||||
syminfo syminfo_fn;
|
|
||||||
/* The data to pass to SYMINFO_FN. */
|
|
||||||
void *syminfo_data;
|
|
||||||
/* Whether initializing the file/line information failed. */
|
|
||||||
int fileline_initialization_failed;
|
|
||||||
/* The lock for the freelist. */
|
|
||||||
int lock_alloc;
|
|
||||||
/* The freelist when using mmap. */
|
|
||||||
struct backtrace_freelist_struct *freelist;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Open a file for reading. Returns -1 on error. If DOES_NOT_EXIST
|
|
||||||
is not NULL, *DOES_NOT_EXIST will be set to 0 normally and set to 1
|
|
||||||
if the file does not exist. If the file does not exist and
|
|
||||||
DOES_NOT_EXIST is not NULL, the function will return -1 and will
|
|
||||||
not call ERROR_CALLBACK. On other errors, or if DOES_NOT_EXIST is
|
|
||||||
NULL, the function will call ERROR_CALLBACK before returning. */
|
|
||||||
extern int backtrace_open (const char *filename,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data,
|
|
||||||
int *does_not_exist);
|
|
||||||
|
|
||||||
/* A view of the contents of a file. This supports mmap when
|
|
||||||
available. A view will remain in memory even after backtrace_close
|
|
||||||
is called on the file descriptor from which the view was
|
|
||||||
obtained. */
|
|
||||||
|
|
||||||
struct backtrace_view
|
|
||||||
{
|
|
||||||
/* The data that the caller requested. */
|
|
||||||
const void *data;
|
|
||||||
/* The base of the view. */
|
|
||||||
void *base;
|
|
||||||
/* The total length of the view. */
|
|
||||||
size_t len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. Store the
|
|
||||||
result in *VIEW. Returns 1 on success, 0 on error. */
|
|
||||||
extern int backtrace_get_view (struct backtrace_state *state, int descriptor,
|
|
||||||
off_t offset, uint64_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, struct backtrace_view *view);
|
|
||||||
|
|
||||||
/* Release a view created by backtrace_get_view. */
|
|
||||||
extern void backtrace_release_view (struct backtrace_state *state,
|
|
||||||
struct backtrace_view *view,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* Close a file opened by backtrace_open. Returns 1 on success, 0 on
|
|
||||||
error. */
|
|
||||||
|
|
||||||
extern int backtrace_close (int descriptor,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* Sort without using memory. */
|
|
||||||
|
|
||||||
extern void backtrace_qsort (void *base, size_t count, size_t size,
|
|
||||||
int (*compar) (const void *, const void *));
|
|
||||||
|
|
||||||
/* Allocate memory. This is like malloc. If ERROR_CALLBACK is NULL,
|
|
||||||
this does not report an error, it just returns NULL. */
|
|
||||||
|
|
||||||
extern void *backtrace_alloc (struct backtrace_state *state, size_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data) ATTRIBUTE_MALLOC;
|
|
||||||
|
|
||||||
/* Free memory allocated by backtrace_alloc. If ERROR_CALLBACK is
|
|
||||||
NULL, this does not report an error. */
|
|
||||||
|
|
||||||
extern void backtrace_free (struct backtrace_state *state, void *mem,
|
|
||||||
size_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* A growable vector of some struct. This is used for more efficient
|
|
||||||
allocation when we don't know the final size of some group of data
|
|
||||||
that we want to represent as an array. */
|
|
||||||
|
|
||||||
struct backtrace_vector
|
|
||||||
{
|
|
||||||
/* The base of the vector. */
|
|
||||||
void *base;
|
|
||||||
/* The number of bytes in the vector. */
|
|
||||||
size_t size;
|
|
||||||
/* The number of bytes available at the current allocation. */
|
|
||||||
size_t alc;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Grow VEC by SIZE bytes. Return a pointer to the newly allocated
|
|
||||||
bytes. Note that this may move the entire vector to a new memory
|
|
||||||
location. Returns NULL on failure. */
|
|
||||||
|
|
||||||
extern void *backtrace_vector_grow (struct backtrace_state *state, size_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data,
|
|
||||||
struct backtrace_vector *vec);
|
|
||||||
|
|
||||||
/* Finish the current allocation on VEC. Prepare to start a new
|
|
||||||
allocation. The finished allocation will never be freed. Returns
|
|
||||||
a pointer to the base of the finished entries, or NULL on
|
|
||||||
failure. */
|
|
||||||
|
|
||||||
extern void* backtrace_vector_finish (struct backtrace_state *state,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* Release any extra space allocated for VEC. This may change
|
|
||||||
VEC->base. Returns 1 on success, 0 on failure. */
|
|
||||||
|
|
||||||
extern int backtrace_vector_release (struct backtrace_state *state,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data);
|
|
||||||
|
|
||||||
/* Free the space managed by VEC. This will reset VEC. */
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
backtrace_vector_free (struct backtrace_state *state,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
vec->alc += vec->size;
|
|
||||||
vec->size = 0;
|
|
||||||
backtrace_vector_release (state, vec, error_callback, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read initial debug data from a descriptor, and set the
|
|
||||||
fileline_data, syminfo_fn, and syminfo_data fields of STATE.
|
|
||||||
Return the fileln_fn field in *FILELN_FN--this is done this way so
|
|
||||||
that the synchronization code is only implemented once. This is
|
|
||||||
called after the descriptor has first been opened. It will close
|
|
||||||
the descriptor if it is no longer needed. Returns 1 on success, 0
|
|
||||||
on error. There will be multiple implementations of this function,
|
|
||||||
for different file formats. Each system will compile the
|
|
||||||
appropriate one. */
|
|
||||||
|
|
||||||
extern int backtrace_initialize (struct backtrace_state *state,
|
|
||||||
const char *filename,
|
|
||||||
int descriptor,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data,
|
|
||||||
fileline *fileline_fn);
|
|
||||||
|
|
||||||
/* An enum for the DWARF sections we care about. */
|
|
||||||
|
|
||||||
enum dwarf_section
|
|
||||||
{
|
|
||||||
DEBUG_INFO,
|
|
||||||
DEBUG_LINE,
|
|
||||||
DEBUG_ABBREV,
|
|
||||||
DEBUG_RANGES,
|
|
||||||
DEBUG_STR,
|
|
||||||
DEBUG_ADDR,
|
|
||||||
DEBUG_STR_OFFSETS,
|
|
||||||
DEBUG_LINE_STR,
|
|
||||||
DEBUG_RNGLISTS,
|
|
||||||
|
|
||||||
DEBUG_MAX
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Data for the DWARF sections we care about. */
|
|
||||||
|
|
||||||
struct dwarf_sections
|
|
||||||
{
|
|
||||||
const unsigned char *data[DEBUG_MAX];
|
|
||||||
size_t size[DEBUG_MAX];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* DWARF data read from a file, used for .gnu_debugaltlink. */
|
|
||||||
|
|
||||||
struct dwarf_data;
|
|
||||||
|
|
||||||
/* Add file/line information for a DWARF module. */
|
|
||||||
|
|
||||||
extern int backtrace_dwarf_add (struct backtrace_state *state,
|
|
||||||
uintptr_t base_address,
|
|
||||||
const struct dwarf_sections *dwarf_sections,
|
|
||||||
int is_bigendian,
|
|
||||||
struct dwarf_data *fileline_altlink,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, fileline *fileline_fn,
|
|
||||||
struct dwarf_data **fileline_entry);
|
|
||||||
|
|
||||||
/* A data structure to pass to backtrace_syminfo_to_full. */
|
|
||||||
|
|
||||||
struct backtrace_call_full
|
|
||||||
{
|
|
||||||
backtrace_full_callback full_callback;
|
|
||||||
backtrace_error_callback full_error_callback;
|
|
||||||
void *full_data;
|
|
||||||
int ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A backtrace_syminfo_callback that can call into a
|
|
||||||
backtrace_full_callback, used when we have a symbol table but no
|
|
||||||
debug info. */
|
|
||||||
|
|
||||||
extern void backtrace_syminfo_to_full_callback (void *data, uintptr_t pc,
|
|
||||||
const char *symname,
|
|
||||||
uintptr_t symval,
|
|
||||||
uintptr_t symsize);
|
|
||||||
|
|
||||||
/* An error callback that corresponds to
|
|
||||||
backtrace_syminfo_to_full_callback. */
|
|
||||||
|
|
||||||
extern void backtrace_syminfo_to_full_error_callback (void *, const char *,
|
|
||||||
int);
|
|
||||||
|
|
||||||
/* A test-only hook for elf_uncompress_zdebug. */
|
|
||||||
|
|
||||||
extern int backtrace_uncompress_zdebug (struct backtrace_state *,
|
|
||||||
const unsigned char *compressed,
|
|
||||||
size_t compressed_size,
|
|
||||||
backtrace_error_callback, void *data,
|
|
||||||
unsigned char **uncompressed,
|
|
||||||
size_t *uncompressed_size);
|
|
||||||
|
|
||||||
/* A test-only hook for elf_zstd_decompress. */
|
|
||||||
|
|
||||||
extern int backtrace_uncompress_zstd (struct backtrace_state *,
|
|
||||||
const unsigned char *compressed,
|
|
||||||
size_t compressed_size,
|
|
||||||
backtrace_error_callback, void *data,
|
|
||||||
unsigned char *uncompressed,
|
|
||||||
size_t uncompressed_size);
|
|
||||||
|
|
||||||
/* A test-only hook for elf_uncompress_lzma. */
|
|
||||||
|
|
||||||
extern int backtrace_uncompress_lzma (struct backtrace_state *,
|
|
||||||
const unsigned char *compressed,
|
|
||||||
size_t compressed_size,
|
|
||||||
backtrace_error_callback, void *data,
|
|
||||||
unsigned char **uncompressed,
|
|
||||||
size_t *uncompressed_size);
|
|
||||||
|
|
||||||
#endif
|
|
7436
deps/libbacktrace/libtool.m4
vendored
7436
deps/libbacktrace/libtool.m4
vendored
File diff suppressed because it is too large
Load Diff
8636
deps/libbacktrace/ltmain.sh
vendored
8636
deps/libbacktrace/ltmain.sh
vendored
File diff suppressed because it is too large
Load Diff
369
deps/libbacktrace/ltoptions.m4
vendored
369
deps/libbacktrace/ltoptions.m4
vendored
@ -1,369 +0,0 @@
|
|||||||
# Helper functions for option handling. -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 6 ltoptions.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ------------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_OPTION],
|
|
||||||
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ---------------------------------------
|
|
||||||
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
|
||||||
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
|
||||||
# saved as a flag.
|
|
||||||
m4_define([_LT_SET_OPTION],
|
|
||||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
|
||||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
|
||||||
m4_define([_LT_IF_OPTION],
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
|
||||||
# -------------------------------------------------------
|
|
||||||
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
|
||||||
# are set.
|
|
||||||
m4_define([_LT_UNLESS_OPTIONS],
|
|
||||||
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
|
||||||
[m4_define([$0_found])])])[]dnl
|
|
||||||
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
|
||||||
])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
|
||||||
# ----------------------------------------
|
|
||||||
# OPTION-LIST is a space-separated list of Libtool options associated
|
|
||||||
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
|
||||||
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
|
||||||
# the unknown option and exit.
|
|
||||||
m4_defun([_LT_SET_OPTIONS],
|
|
||||||
[# Set options
|
|
||||||
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[_LT_SET_OPTION([$1], _LT_Option)])
|
|
||||||
|
|
||||||
m4_if([$1],[LT_INIT],[
|
|
||||||
dnl
|
|
||||||
dnl Simply set some default values (i.e off) if boolean options were not
|
|
||||||
dnl specified:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
|
||||||
])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl If no reference was made to various pairs of opposing options, then
|
|
||||||
dnl we run the default mode handler for the pair. For example, if neither
|
|
||||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
|
||||||
dnl archives by default:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
|
||||||
[_LT_ENABLE_FAST_INSTALL])
|
|
||||||
])
|
|
||||||
])# _LT_SET_OPTIONS
|
|
||||||
|
|
||||||
|
|
||||||
## --------------------------------- ##
|
|
||||||
## Macros to handle LT_INIT options. ##
|
|
||||||
## --------------------------------- ##
|
|
||||||
|
|
||||||
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
|
||||||
# -----------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_DEFUN],
|
|
||||||
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
|
||||||
# -----------------------------------------------
|
|
||||||
m4_define([LT_OPTION_DEFINE],
|
|
||||||
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
|
||||||
])# LT_OPTION_DEFINE
|
|
||||||
|
|
||||||
|
|
||||||
# dlopen
|
|
||||||
# ------
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `dlopen' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
|
||||||
|
|
||||||
|
|
||||||
# win32-dll
|
|
||||||
# ---------
|
|
||||||
# Declare package support for building win32 dll's.
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
|
||||||
[enable_win32_dll=yes
|
|
||||||
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
|
|
||||||
AC_CHECK_TOOL(AS, as, false)
|
|
||||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
|
||||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
test -z "$AS" && AS=as
|
|
||||||
_LT_DECL([], [AS], [1], [Assembler program])dnl
|
|
||||||
|
|
||||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
|
||||||
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
|
|
||||||
|
|
||||||
test -z "$OBJDUMP" && OBJDUMP=objdump
|
|
||||||
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
|
|
||||||
])# win32-dll
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
|
||||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
|
||||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_SHARED([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-shared flag, and supports the `shared' and
|
|
||||||
# `disable-shared' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_SHARED],
|
|
||||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([shared],
|
|
||||||
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
|
||||||
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_shared=yes ;;
|
|
||||||
no) enable_shared=no ;;
|
|
||||||
*)
|
|
||||||
enable_shared=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_shared=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
|
||||||
[Whether or not to build shared libraries])
|
|
||||||
])# _LT_ENABLE_SHARED
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_STATIC([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-static flag, and support the `static' and
|
|
||||||
# `disable-static' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_STATIC],
|
|
||||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([static],
|
|
||||||
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
|
||||||
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_static=yes ;;
|
|
||||||
no) enable_static=no ;;
|
|
||||||
*)
|
|
||||||
enable_static=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_static=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_old_libs], [enable_static], [0],
|
|
||||||
[Whether or not to build static libraries])
|
|
||||||
])# _LT_ENABLE_STATIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
|
||||||
# ----------------------------------
|
|
||||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
|
||||||
# and `disable-fast-install' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
|
||||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([fast-install],
|
|
||||||
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
|
||||||
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_fast_install=yes ;;
|
|
||||||
no) enable_fast_install=no ;;
|
|
||||||
*)
|
|
||||||
enable_fast_install=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_fast_install=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([fast_install], [enable_fast_install], [0],
|
|
||||||
[Whether or not to optimize for fast installation])dnl
|
|
||||||
])# _LT_ENABLE_FAST_INSTALL
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_WITH_PIC([MODE])
|
|
||||||
# --------------------
|
|
||||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
|
||||||
# LT_INIT options.
|
|
||||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
|
||||||
m4_define([_LT_WITH_PIC],
|
|
||||||
[AC_ARG_WITH([pic],
|
|
||||||
[AS_HELP_STRING([--with-pic],
|
|
||||||
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
|
||||||
[pic_mode="$withval"],
|
|
||||||
[pic_mode=default])
|
|
||||||
|
|
||||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
|
||||||
|
|
||||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
|
||||||
])# _LT_WITH_PIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
|
||||||
|
|
||||||
# Old name:
|
|
||||||
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `pic-only' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
|
||||||
|
|
||||||
## ----------------- ##
|
|
||||||
## LTDL_INIT Options ##
|
|
||||||
## ----------------- ##
|
|
||||||
|
|
||||||
m4_define([_LTDL_MODE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
|
||||||
[m4_define([_LTDL_MODE], [nonrecursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
|
||||||
[m4_define([_LTDL_MODE], [recursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
|
||||||
[m4_define([_LTDL_MODE], [subproject])])
|
|
||||||
|
|
||||||
m4_define([_LTDL_TYPE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
|
||||||
[m4_define([_LTDL_TYPE], [installable])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
|
||||||
[m4_define([_LTDL_TYPE], [convenience])])
|
|
123
deps/libbacktrace/ltsugar.m4
vendored
123
deps/libbacktrace/ltsugar.m4
vendored
@ -1,123 +0,0 @@
|
|||||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 6 ltsugar.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_join(SEP, ARG1, [ARG2...])
|
|
||||||
# -----------------------------
|
|
||||||
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
|
||||||
# associated separator.
|
|
||||||
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
|
||||||
# versions in m4sugar had bugs.
|
|
||||||
m4_define([lt_join],
|
|
||||||
[m4_if([$#], [1], [],
|
|
||||||
[$#], [2], [[$2]],
|
|
||||||
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
m4_define([_lt_join],
|
|
||||||
[m4_if([$#$2], [2], [],
|
|
||||||
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_car(LIST)
|
|
||||||
# lt_cdr(LIST)
|
|
||||||
# ------------
|
|
||||||
# Manipulate m4 lists.
|
|
||||||
# These macros are necessary as long as will still need to support
|
|
||||||
# Autoconf-2.59 which quotes differently.
|
|
||||||
m4_define([lt_car], [[$1]])
|
|
||||||
m4_define([lt_cdr],
|
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
|
||||||
[$#], 1, [],
|
|
||||||
[m4_dquote(m4_shift($@))])])
|
|
||||||
m4_define([lt_unquote], $1)
|
|
||||||
|
|
||||||
|
|
||||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
|
||||||
# ------------------------------------------
|
|
||||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
|
||||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
|
||||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
|
||||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
|
||||||
# than defined and empty).
|
|
||||||
#
|
|
||||||
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
|
||||||
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
|
||||||
m4_define([lt_append],
|
|
||||||
[m4_define([$1],
|
|
||||||
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# Produce a SEP delimited list of all paired combinations of elements of
|
|
||||||
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
|
||||||
# has the form PREFIXmINFIXSUFFIXn.
|
|
||||||
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
|
||||||
m4_define([lt_combine],
|
|
||||||
[m4_if(m4_eval([$# > 3]), [1],
|
|
||||||
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
|
||||||
[[m4_foreach([_Lt_prefix], [$2],
|
|
||||||
[m4_foreach([_Lt_suffix],
|
|
||||||
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
|
||||||
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
|
||||||
# -----------------------------------------------------------------------
|
|
||||||
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
|
||||||
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
|
||||||
m4_define([lt_if_append_uniq],
|
|
||||||
[m4_ifdef([$1],
|
|
||||||
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
|
||||||
[lt_append([$1], [$2], [$3])$4],
|
|
||||||
[$5])],
|
|
||||||
[lt_append([$1], [$2], [$3])$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add(DICT, KEY, VALUE)
|
|
||||||
# -----------------------------
|
|
||||||
m4_define([lt_dict_add],
|
|
||||||
[m4_define([$1($2)], [$3])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
|
||||||
# --------------------------------------------
|
|
||||||
m4_define([lt_dict_add_subkey],
|
|
||||||
[m4_define([$1($2:$3)], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
|
||||||
# ----------------------------------
|
|
||||||
m4_define([lt_dict_fetch],
|
|
||||||
[m4_ifval([$3],
|
|
||||||
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
|
||||||
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
m4_define([lt_if_dict_fetch],
|
|
||||||
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
|
||||||
[$5],
|
|
||||||
[$6])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
m4_define([lt_dict_filter],
|
|
||||||
[m4_if([$5], [], [],
|
|
||||||
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
|
||||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
|
||||||
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
|
||||||
])
|
|
23
deps/libbacktrace/ltversion.m4
vendored
23
deps/libbacktrace/ltversion.m4
vendored
@ -1,23 +0,0 @@
|
|||||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# Generated from ltversion.in.
|
|
||||||
|
|
||||||
# serial 3134 ltversion.m4
|
|
||||||
# This file is part of GNU Libtool
|
|
||||||
|
|
||||||
m4_define([LT_PACKAGE_VERSION], [2.2.7a])
|
|
||||||
m4_define([LT_PACKAGE_REVISION], [1.3134])
|
|
||||||
|
|
||||||
AC_DEFUN([LTVERSION_VERSION],
|
|
||||||
[macro_version='2.2.7a'
|
|
||||||
macro_revision='1.3134'
|
|
||||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
|
||||||
_LT_DECL(, macro_revision, 0)
|
|
||||||
])
|
|
98
deps/libbacktrace/lt~obsolete.m4
vendored
98
deps/libbacktrace/lt~obsolete.m4
vendored
@ -1,98 +0,0 @@
|
|||||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# serial 4 lt~obsolete.m4
|
|
||||||
|
|
||||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
|
||||||
#
|
|
||||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
|
||||||
# which have later been changed to m4_define as they aren't part of the
|
|
||||||
# exported API, or moved to Autoconf or Automake where they belong.
|
|
||||||
#
|
|
||||||
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
|
||||||
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
|
||||||
# using a macro with the same name in our local m4/libtool.m4 it'll
|
|
||||||
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
|
||||||
# and doesn't know about Autoconf macros at all.)
|
|
||||||
#
|
|
||||||
# So we provide this file, which has a silly filename so it's always
|
|
||||||
# included after everything else. This provides aclocal with the
|
|
||||||
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
|
||||||
# because those macros already exist, or will be overwritten later.
|
|
||||||
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
|
||||||
#
|
|
||||||
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
|
||||||
# Yes, that means every name once taken will need to remain here until
|
|
||||||
# we give up compatibility with versions before 1.7, at which point
|
|
||||||
# we need to keep only those names which we still refer to.
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
|
||||||
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
|
||||||
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
|
||||||
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
|
||||||
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
|
||||||
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
|
||||||
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
|
||||||
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
|
||||||
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
|
||||||
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
|
||||||
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
|
||||||
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
|
||||||
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
|
||||||
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
|
||||||
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
|
||||||
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
|
||||||
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
|
||||||
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
|
|
||||||
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
|
|
||||||
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
|
|
||||||
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
|
|
||||||
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
|
|
1355
deps/libbacktrace/macho.c
vendored
1355
deps/libbacktrace/macho.c
vendored
File diff suppressed because it is too large
Load Diff
215
deps/libbacktrace/missing
vendored
215
deps/libbacktrace/missing
vendored
@ -1,215 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Common wrapper for a few potentially missing GNU programs.
|
|
||||||
|
|
||||||
scriptversion=2013-10-28.13; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
|
||||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# 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 2, 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/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
|
|
||||||
--is-lightweight)
|
|
||||||
# Used by our autoconf macros to check whether the available missing
|
|
||||||
# script is modern enough.
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
--run)
|
|
||||||
# Back-compat with the calling convention used by older automake.
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
|
||||||
to PROGRAM being missing or too old.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal autoconf autoheader autom4te automake makeinfo
|
|
||||||
bison yacc flex lex help2man
|
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
|
||||||
'g' are ignored when checking the name.
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: unknown '$1' option"
|
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Run the given program, remember its exit status.
|
|
||||||
"$@"; st=$?
|
|
||||||
|
|
||||||
# If it succeeded, we are done.
|
|
||||||
test $st -eq 0 && exit 0
|
|
||||||
|
|
||||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
|
||||||
# passed; such an option is passed most likely to detect whether the
|
|
||||||
# program is present and works.
|
|
||||||
case $2 in --version|--help) exit $st;; esac
|
|
||||||
|
|
||||||
# Exit code 63 means version mismatch. This often happens when the user
|
|
||||||
# tries to use an ancient version of a tool on a file that requires a
|
|
||||||
# minimum version.
|
|
||||||
if test $st -eq 63; then
|
|
||||||
msg="probably too old"
|
|
||||||
elif test $st -eq 127; then
|
|
||||||
# Program was missing.
|
|
||||||
msg="missing on your system"
|
|
||||||
else
|
|
||||||
# Program was found and executed, but failed. Give up.
|
|
||||||
exit $st
|
|
||||||
fi
|
|
||||||
|
|
||||||
perl_URL=http://www.perl.org/
|
|
||||||
flex_URL=http://flex.sourceforge.net/
|
|
||||||
gnu_software_URL=http://www.gnu.org/software
|
|
||||||
|
|
||||||
program_details ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
aclocal|automake)
|
|
||||||
echo "The '$1' program is part of the GNU Automake package:"
|
|
||||||
echo "<$gnu_software_URL/automake>"
|
|
||||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/autoconf>"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
autoconf|autom4te|autoheader)
|
|
||||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
|
||||||
echo "<$gnu_software_URL/autoconf/>"
|
|
||||||
echo "It also requires GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
give_advice ()
|
|
||||||
{
|
|
||||||
# Normalize program name to check for.
|
|
||||||
normalized_program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
|
||||||
s/^gnu//; t
|
|
||||||
s/^g//; t'`
|
|
||||||
|
|
||||||
printf '%s\n' "'$1' is $msg."
|
|
||||||
|
|
||||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
|
||||||
case $normalized_program in
|
|
||||||
autoconf*)
|
|
||||||
echo "You should only need it if you modified 'configure.ac',"
|
|
||||||
echo "or m4 files included by it."
|
|
||||||
program_details 'autoconf'
|
|
||||||
;;
|
|
||||||
autoheader*)
|
|
||||||
echo "You should only need it if you modified 'acconfig.h' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'autoheader'
|
|
||||||
;;
|
|
||||||
automake*)
|
|
||||||
echo "You should only need it if you modified 'Makefile.am' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'automake'
|
|
||||||
;;
|
|
||||||
aclocal*)
|
|
||||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'aclocal'
|
|
||||||
;;
|
|
||||||
autom4te*)
|
|
||||||
echo "You might have modified some maintainer files that require"
|
|
||||||
echo "the 'autom4te' program to be rebuilt."
|
|
||||||
program_details 'autom4te'
|
|
||||||
;;
|
|
||||||
bison*|yacc*)
|
|
||||||
echo "You should only need it if you modified a '.y' file."
|
|
||||||
echo "You may want to install the GNU Bison package:"
|
|
||||||
echo "<$gnu_software_URL/bison/>"
|
|
||||||
;;
|
|
||||||
lex*|flex*)
|
|
||||||
echo "You should only need it if you modified a '.l' file."
|
|
||||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
|
||||||
echo "<$flex_URL>"
|
|
||||||
;;
|
|
||||||
help2man*)
|
|
||||||
echo "You should only need it if you modified a dependency" \
|
|
||||||
"of a man page."
|
|
||||||
echo "You may want to install the GNU Help2man package:"
|
|
||||||
echo "<$gnu_software_URL/help2man/>"
|
|
||||||
;;
|
|
||||||
makeinfo*)
|
|
||||||
echo "You should only need it if you modified a '.texi' file, or"
|
|
||||||
echo "any other file indirectly affecting the aspect of the manual."
|
|
||||||
echo "You might want to install the Texinfo package:"
|
|
||||||
echo "<$gnu_software_URL/texinfo/>"
|
|
||||||
echo "The spurious makeinfo call might also be the consequence of"
|
|
||||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
|
||||||
echo "want to install GNU make:"
|
|
||||||
echo "<$gnu_software_URL/make/>"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "You might have modified some files without having the proper"
|
|
||||||
echo "tools for further handling them. Check the 'README' file, it"
|
|
||||||
echo "often tells you about the needed prerequisites for installing"
|
|
||||||
echo "this package. You may also peek at any GNU archive site, in"
|
|
||||||
echo "case some other package contains this missing '$1' program."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
|
||||||
-e '2,$s/^/ /' >&2
|
|
||||||
|
|
||||||
# Propagate the correct exit status (expected to be 127 for a program
|
|
||||||
# not found, 63 for a program that failed due to version mismatch).
|
|
||||||
exit $st
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
331
deps/libbacktrace/mmap.c
vendored
331
deps/libbacktrace/mmap.c
vendored
@ -1,331 +0,0 @@
|
|||||||
/* mmap.c -- Memory allocation with mmap.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_DECL_GETPAGESIZE
|
|
||||||
extern int getpagesize (void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Memory allocation on systems that provide anonymous mmap. This
|
|
||||||
permits the backtrace functions to be invoked from a signal
|
|
||||||
handler, assuming that mmap is async-signal safe. */
|
|
||||||
|
|
||||||
#ifndef MAP_ANONYMOUS
|
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAP_FAILED
|
|
||||||
#define MAP_FAILED ((void *)-1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A list of free memory blocks. */
|
|
||||||
|
|
||||||
struct backtrace_freelist_struct
|
|
||||||
{
|
|
||||||
/* Next on list. */
|
|
||||||
struct backtrace_freelist_struct *next;
|
|
||||||
/* Size of this block, including this structure. */
|
|
||||||
size_t size;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Free memory allocated by backtrace_alloc. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size)
|
|
||||||
{
|
|
||||||
/* Just leak small blocks. We don't have to be perfect. Don't put
|
|
||||||
more than 16 entries on the free list, to avoid wasting time
|
|
||||||
searching when allocating a block. If we have more than 16
|
|
||||||
entries, leak the smallest entry. */
|
|
||||||
|
|
||||||
if (size >= sizeof (struct backtrace_freelist_struct))
|
|
||||||
{
|
|
||||||
size_t c;
|
|
||||||
struct backtrace_freelist_struct **ppsmall;
|
|
||||||
struct backtrace_freelist_struct **pp;
|
|
||||||
struct backtrace_freelist_struct *p;
|
|
||||||
|
|
||||||
c = 0;
|
|
||||||
ppsmall = NULL;
|
|
||||||
for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
|
|
||||||
{
|
|
||||||
if (ppsmall == NULL || (*pp)->size < (*ppsmall)->size)
|
|
||||||
ppsmall = pp;
|
|
||||||
++c;
|
|
||||||
}
|
|
||||||
if (c >= 16)
|
|
||||||
{
|
|
||||||
if (size <= (*ppsmall)->size)
|
|
||||||
return;
|
|
||||||
*ppsmall = (*ppsmall)->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = (struct backtrace_freelist_struct *) addr;
|
|
||||||
p->next = state->freelist;
|
|
||||||
p->size = size;
|
|
||||||
state->freelist = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate memory like malloc. If ERROR_CALLBACK is NULL, don't
|
|
||||||
report an error. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_alloc (struct backtrace_state *state,
|
|
||||||
size_t size, backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
int locked;
|
|
||||||
struct backtrace_freelist_struct **pp;
|
|
||||||
size_t pagesize;
|
|
||||||
size_t asksize;
|
|
||||||
void *page;
|
|
||||||
|
|
||||||
ret = NULL;
|
|
||||||
|
|
||||||
/* If we can acquire the lock, then see if there is space on the
|
|
||||||
free list. If we can't acquire the lock, drop straight into
|
|
||||||
using mmap. __sync_lock_test_and_set returns the old state of
|
|
||||||
the lock, so we have acquired it if it returns 0. */
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
locked = 1;
|
|
||||||
else
|
|
||||||
locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
|
|
||||||
|
|
||||||
if (locked)
|
|
||||||
{
|
|
||||||
for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
|
|
||||||
{
|
|
||||||
if ((*pp)->size >= size)
|
|
||||||
{
|
|
||||||
struct backtrace_freelist_struct *p;
|
|
||||||
|
|
||||||
p = *pp;
|
|
||||||
*pp = p->next;
|
|
||||||
|
|
||||||
/* Round for alignment; we assume that no type we care about
|
|
||||||
is more than 8 bytes. */
|
|
||||||
size = (size + 7) & ~ (size_t) 7;
|
|
||||||
if (size < p->size)
|
|
||||||
backtrace_free_locked (state, (char *) p + size,
|
|
||||||
p->size - size);
|
|
||||||
|
|
||||||
ret = (void *) p;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state->threaded)
|
|
||||||
__sync_lock_release (&state->lock_alloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret == NULL)
|
|
||||||
{
|
|
||||||
/* Allocate a new page. */
|
|
||||||
|
|
||||||
pagesize = getpagesize ();
|
|
||||||
asksize = (size + pagesize - 1) & ~ (pagesize - 1);
|
|
||||||
page = mmap (NULL, asksize, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
||||||
if (page == MAP_FAILED)
|
|
||||||
{
|
|
||||||
if (error_callback)
|
|
||||||
error_callback (data, "mmap", errno);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size = (size + 7) & ~ (size_t) 7;
|
|
||||||
if (size < asksize)
|
|
||||||
backtrace_free (state, (char *) page + size, asksize - size,
|
|
||||||
error_callback, data);
|
|
||||||
|
|
||||||
ret = page;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free memory allocated by backtrace_alloc. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_free (struct backtrace_state *state, void *addr, size_t size,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
int locked;
|
|
||||||
|
|
||||||
/* If we are freeing a large aligned block, just release it back to
|
|
||||||
the system. This case arises when growing a vector for a large
|
|
||||||
binary with lots of debug info. Calling munmap here may cause us
|
|
||||||
to call mmap again if there is also a large shared library; we
|
|
||||||
just live with that. */
|
|
||||||
if (size >= 16 * 4096)
|
|
||||||
{
|
|
||||||
size_t pagesize;
|
|
||||||
|
|
||||||
pagesize = getpagesize ();
|
|
||||||
if (((uintptr_t) addr & (pagesize - 1)) == 0
|
|
||||||
&& (size & (pagesize - 1)) == 0)
|
|
||||||
{
|
|
||||||
/* If munmap fails for some reason, just add the block to
|
|
||||||
the freelist. */
|
|
||||||
if (munmap (addr, size) == 0)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we can acquire the lock, add the new space to the free list.
|
|
||||||
If we can't acquire the lock, just leak the memory.
|
|
||||||
__sync_lock_test_and_set returns the old state of the lock, so we
|
|
||||||
have acquired it if it returns 0. */
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
locked = 1;
|
|
||||||
else
|
|
||||||
locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
|
|
||||||
|
|
||||||
if (locked)
|
|
||||||
{
|
|
||||||
backtrace_free_locked (state, addr, size);
|
|
||||||
|
|
||||||
if (state->threaded)
|
|
||||||
__sync_lock_release (&state->lock_alloc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Grow VEC by SIZE bytes. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_vector_grow (struct backtrace_state *state,size_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, struct backtrace_vector *vec)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (size > vec->alc)
|
|
||||||
{
|
|
||||||
size_t pagesize;
|
|
||||||
size_t alc;
|
|
||||||
void *base;
|
|
||||||
|
|
||||||
pagesize = getpagesize ();
|
|
||||||
alc = vec->size + size;
|
|
||||||
if (vec->size == 0)
|
|
||||||
alc = 16 * size;
|
|
||||||
else if (alc < pagesize)
|
|
||||||
{
|
|
||||||
alc *= 2;
|
|
||||||
if (alc > pagesize)
|
|
||||||
alc = pagesize;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
alc *= 2;
|
|
||||||
alc = (alc + pagesize - 1) & ~ (pagesize - 1);
|
|
||||||
}
|
|
||||||
base = backtrace_alloc (state, alc, error_callback, data);
|
|
||||||
if (base == NULL)
|
|
||||||
return NULL;
|
|
||||||
if (vec->base != NULL)
|
|
||||||
{
|
|
||||||
memcpy (base, vec->base, vec->size);
|
|
||||||
backtrace_free (state, vec->base, vec->size + vec->alc,
|
|
||||||
error_callback, data);
|
|
||||||
}
|
|
||||||
vec->base = base;
|
|
||||||
vec->alc = alc - vec->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = (char *) vec->base + vec->size;
|
|
||||||
vec->size += size;
|
|
||||||
vec->alc -= size;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finish the current allocation on VEC. */
|
|
||||||
|
|
||||||
void *
|
|
||||||
backtrace_vector_finish (
|
|
||||||
struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
ret = vec->base;
|
|
||||||
vec->base = (char *) vec->base + vec->size;
|
|
||||||
vec->size = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release any extra space allocated for VEC. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_vector_release (struct backtrace_state *state,
|
|
||||||
struct backtrace_vector *vec,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
size_t size;
|
|
||||||
size_t alc;
|
|
||||||
size_t aligned;
|
|
||||||
|
|
||||||
/* Make sure that the block that we free is aligned on an 8-byte
|
|
||||||
boundary. */
|
|
||||||
size = vec->size;
|
|
||||||
alc = vec->alc;
|
|
||||||
aligned = (size + 7) & ~ (size_t) 7;
|
|
||||||
alc -= aligned - size;
|
|
||||||
|
|
||||||
backtrace_free (state, (char *) vec->base + aligned, alc,
|
|
||||||
error_callback, data);
|
|
||||||
vec->alc = 0;
|
|
||||||
if (vec->size == 0)
|
|
||||||
vec->base = NULL;
|
|
||||||
return 1;
|
|
||||||
}
|
|
110
deps/libbacktrace/mmapio.c
vendored
110
deps/libbacktrace/mmapio.c
vendored
@ -1,110 +0,0 @@
|
|||||||
/* mmapio.c -- File views using mmap.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_DECL_GETPAGESIZE
|
|
||||||
extern int getpagesize (void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAP_FAILED
|
|
||||||
#define MAP_FAILED ((void *)-1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This file implements file views and memory allocation when mmap is
|
|
||||||
available. */
|
|
||||||
|
|
||||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
int descriptor, off_t offset, uint64_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, struct backtrace_view *view)
|
|
||||||
{
|
|
||||||
size_t pagesize;
|
|
||||||
unsigned int inpage;
|
|
||||||
off_t pageoff;
|
|
||||||
void *map;
|
|
||||||
|
|
||||||
if ((uint64_t) (size_t) size != size)
|
|
||||||
{
|
|
||||||
error_callback (data, "file size too large", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pagesize = getpagesize ();
|
|
||||||
inpage = offset % pagesize;
|
|
||||||
pageoff = offset - inpage;
|
|
||||||
|
|
||||||
size += inpage;
|
|
||||||
size = (size + (pagesize - 1)) & ~ (pagesize - 1);
|
|
||||||
|
|
||||||
map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, descriptor, pageoff);
|
|
||||||
if (map == MAP_FAILED)
|
|
||||||
{
|
|
||||||
error_callback (data, "mmap", errno);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
view->data = (char *) map + inpage;
|
|
||||||
view->base = map;
|
|
||||||
view->len = size;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release a view read by backtrace_get_view. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_release_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
struct backtrace_view *view,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
const void *cv;
|
|
||||||
void *v;
|
|
||||||
} const_cast;
|
|
||||||
|
|
||||||
const_cast.cv = view->base;
|
|
||||||
if (munmap (const_cast.v, view->len) < 0)
|
|
||||||
error_callback (data, "munmap", errno);
|
|
||||||
}
|
|
83
deps/libbacktrace/move-if-change
vendored
83
deps/libbacktrace/move-if-change
vendored
@ -1,83 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Like mv $1 $2, but if the files are the same, just delete $1.
|
|
||||||
# Status is zero if successful, nonzero otherwise.
|
|
||||||
|
|
||||||
VERSION='2012-01-06 07:23'; # UTC
|
|
||||||
# The definition above must lie within the first 8 lines in order
|
|
||||||
# for the Emacs time-stamp write hook (at end) to update it.
|
|
||||||
# If you change this file with Emacs, please let the write hook
|
|
||||||
# do its job. Otherwise, update this string manually.
|
|
||||||
|
|
||||||
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
usage="usage: $0 SOURCE DEST"
|
|
||||||
|
|
||||||
help="$usage
|
|
||||||
or: $0 OPTION
|
|
||||||
If SOURCE is different than DEST, then move it to DEST; else remove SOURCE.
|
|
||||||
|
|
||||||
--help display this help and exit
|
|
||||||
--version output version information and exit
|
|
||||||
|
|
||||||
The variable CMPPROG can be used to specify an alternative to 'cmp'.
|
|
||||||
|
|
||||||
Report bugs to <bug-gnulib@gnu.org>."
|
|
||||||
|
|
||||||
version=`expr "$VERSION" : '\([^ ]*\)'`
|
|
||||||
version="move-if-change (gnulib) $version
|
|
||||||
Copyright (C) 2011 Free Software Foundation, Inc.
|
|
||||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
|
||||||
This is free software: you are free to change and redistribute it.
|
|
||||||
There is NO WARRANTY, to the extent permitted by law."
|
|
||||||
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
--help | --hel | --he | --h)
|
|
||||||
exec echo "$help" ;;
|
|
||||||
--version | --versio | --versi | --vers | --ver | --ve | --v)
|
|
||||||
exec echo "$version" ;;
|
|
||||||
--)
|
|
||||||
shift
|
|
||||||
break ;;
|
|
||||||
-*)
|
|
||||||
echo "$0: invalid option: $arg" >&2
|
|
||||||
exit 1 ;;
|
|
||||||
*)
|
|
||||||
break ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test $# -eq 2 || { echo "$0: $usage" >&2; exit 1; }
|
|
||||||
|
|
||||||
if test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null; then
|
|
||||||
rm -f -- "$1"
|
|
||||||
else
|
|
||||||
if mv -f -- "$1" "$2"; then :; else
|
|
||||||
# Ignore failure due to a concurrent move-if-change.
|
|
||||||
test -r "$2" && $cmpprog -- "$1" "$2" >/dev/null && rm -f -- "$1"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
## Local Variables:
|
|
||||||
## eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
## time-stamp-start: "VERSION='"
|
|
||||||
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
|
||||||
## time-stamp-time-zone: "UTC"
|
|
||||||
## time-stamp-end: "'; # UTC"
|
|
||||||
## End:
|
|
410
deps/libbacktrace/mtest.c
vendored
410
deps/libbacktrace/mtest.c
vendored
@ -1,410 +0,0 @@
|
|||||||
/* mtest.c -- Minidebug test for libbacktrace library
|
|
||||||
Copyright (C) 2020-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* This program tests using libbacktrace with a program that uses the
|
|
||||||
minidebuginfo format in a .gnu_debugdata section. See
|
|
||||||
https://sourceware.org/gdb/current/onlinedocs/gdb/MiniDebugInfo.html
|
|
||||||
for a bit more information about minidebuginfo. What is relevant
|
|
||||||
for libbacktrace is that we have just a symbol table, with no debug
|
|
||||||
info, so we should be able to do a function backtrace, but we can't
|
|
||||||
do a file/line backtrace. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
static int test1 (void) __attribute__ ((noinline, noclone, unused));
|
|
||||||
static int f2 (int) __attribute__ ((noinline, noclone));
|
|
||||||
static int f3 (int, int) __attribute__ ((noinline, noclone));
|
|
||||||
|
|
||||||
/* Collected PC values. */
|
|
||||||
|
|
||||||
static uintptr_t addrs[20];
|
|
||||||
|
|
||||||
/* The backtrace callback function. This is like callback_one in
|
|
||||||
testlib.c, but it saves the PC also. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
callback_mtest (void *vdata, uintptr_t pc, const char *filename, int lineno,
|
|
||||||
const char *function)
|
|
||||||
{
|
|
||||||
struct bdata *data = (struct bdata *) vdata;
|
|
||||||
|
|
||||||
if (data->index >= sizeof addrs / sizeof addrs[0])
|
|
||||||
{
|
|
||||||
fprintf (stderr, "callback_mtest: callback called too many times\n");
|
|
||||||
data->failed = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
addrs[data->index] = pc;
|
|
||||||
|
|
||||||
return callback_one (vdata, pc, filename, lineno, function);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test the backtrace function with non-inlined functions. (We don't
|
|
||||||
test with inlined functions because they won't work with minidebug
|
|
||||||
anyhow.) */
|
|
||||||
|
|
||||||
static int
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
/* Returning a value here and elsewhere avoids a tailcall which
|
|
||||||
would mess up the backtrace. */
|
|
||||||
return f2 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f2 (int f1line)
|
|
||||||
{
|
|
||||||
return f3 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f3 (int f1line __attribute__ ((unused)), int f2line __attribute__ ((unused)))
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata data;
|
|
||||||
int i;
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
data.all = &all[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_full (state, 0, callback_mtest, error_callback_one, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index < 3)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
|
||||||
data.index);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* When using minidebug we don't expect the function name here. */
|
|
||||||
|
|
||||||
for (j = 0; j < 3 && j < data.index; j++)
|
|
||||||
{
|
|
||||||
if (all[j].function == NULL)
|
|
||||||
{
|
|
||||||
struct symdata symdata;
|
|
||||||
|
|
||||||
symdata.name = NULL;
|
|
||||||
symdata.val = 0;
|
|
||||||
symdata.size = 0;
|
|
||||||
symdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_syminfo (state, addrs[j], callback_three,
|
|
||||||
error_callback_three, &symdata);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test1: [%zu], unexpected return value from "
|
|
||||||
"backtrace_syminfo %d\n"),
|
|
||||||
j, i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
else if (symdata.name == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [%zu]: syminfo did not find name\n", j);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
all[j].function = strdup (symdata.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index > 0)
|
|
||||||
{
|
|
||||||
if (all[0].function == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [0]: missing function name\n");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
else if (strcmp (all[0].function, "f3") != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [0]: got %s expected %s\n",
|
|
||||||
all[0].function, "f3");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index > 1)
|
|
||||||
{
|
|
||||||
if (all[1].function == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [1]: missing function name\n");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
else if (strcmp (all[1].function, "f2") != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [1]: got %s expected %s\n",
|
|
||||||
all[0].function, "f2");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index > 2)
|
|
||||||
{
|
|
||||||
if (all[2].function == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [2]: missing function name\n");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
else if (strcmp (all[2].function, "test1") != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: [2]: got %s expected %s\n",
|
|
||||||
all[0].function, "test1");
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Test the backtrace_simple function with non-inlined functions. */
|
|
||||||
|
|
||||||
static int test3 (void) __attribute__ ((noinline, noclone, unused));
|
|
||||||
static int f22 (int) __attribute__ ((noinline, noclone));
|
|
||||||
static int f23 (int, int) __attribute__ ((noinline, noclone));
|
|
||||||
|
|
||||||
static int
|
|
||||||
test3 (void)
|
|
||||||
{
|
|
||||||
return f22 (__LINE__) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f22 (int f1line)
|
|
||||||
{
|
|
||||||
return f23 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f23 (int f1line __attribute__ ((unused)), int f2line __attribute__ ((unused)))
|
|
||||||
{
|
|
||||||
uintptr_t addrs[20];
|
|
||||||
struct sdata data;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.addrs = &addrs[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test3: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data.failed)
|
|
||||||
{
|
|
||||||
int j;
|
|
||||||
|
|
||||||
for (j = 0; j < 3; ++j)
|
|
||||||
{
|
|
||||||
struct symdata symdata;
|
|
||||||
|
|
||||||
symdata.name = NULL;
|
|
||||||
symdata.val = 0;
|
|
||||||
symdata.size = 0;
|
|
||||||
symdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_syminfo (state, addrs[j], callback_three,
|
|
||||||
error_callback_three, &symdata);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test3: [%d]: unexpected return value "
|
|
||||||
"from backtrace_syminfo %d\n"),
|
|
||||||
j, i);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!symdata.failed)
|
|
||||||
{
|
|
||||||
const char *expected;
|
|
||||||
|
|
||||||
switch (j)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
expected = "f23";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
expected = "f22";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
expected = "test3";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (symdata.name == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
/* Use strncmp, not strcmp, because GCC might create a
|
|
||||||
clone. */
|
|
||||||
else if (strncmp (symdata.name, expected, strlen (expected))
|
|
||||||
!= 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("test3: [%d]: unexpected syminfo name "
|
|
||||||
"got %s expected %s\n"),
|
|
||||||
j, symdata.name, expected);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (symdata.failed)
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (data.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test5 (void) __attribute__ ((unused));
|
|
||||||
|
|
||||||
int global = 1;
|
|
||||||
|
|
||||||
int
|
|
||||||
test5 (void)
|
|
||||||
{
|
|
||||||
struct symdata symdata;
|
|
||||||
int i;
|
|
||||||
uintptr_t addr = (uintptr_t) &global;
|
|
||||||
|
|
||||||
if (sizeof (global) > 1)
|
|
||||||
addr += 1;
|
|
||||||
|
|
||||||
symdata.name = NULL;
|
|
||||||
symdata.val = 0;
|
|
||||||
symdata.size = 0;
|
|
||||||
symdata.failed = 0;
|
|
||||||
|
|
||||||
i = backtrace_syminfo (state, addr, callback_three,
|
|
||||||
error_callback_three, &symdata);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected return value from backtrace_syminfo %d\n",
|
|
||||||
i);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!symdata.failed)
|
|
||||||
{
|
|
||||||
if (symdata.name == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test5: NULL syminfo name\n");
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (!(strncmp (symdata.name, "global", 6) == 0
|
|
||||||
&& (symdata.name[6] == '\0'|| symdata.name[6] == '.')))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo name got %s expected %s\n",
|
|
||||||
symdata.name, "global");
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (symdata.val != (uintptr_t) &global)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo value got %lx expected %lx\n",
|
|
||||||
(unsigned long) symdata.val,
|
|
||||||
(unsigned long) (uintptr_t) &global);
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
else if (symdata.size != sizeof (global))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test5: unexpected syminfo size got %lx expected %lx\n",
|
|
||||||
(unsigned long) symdata.size,
|
|
||||||
(unsigned long) sizeof (global));
|
|
||||||
symdata.failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: backtrace_syminfo variable\n",
|
|
||||||
symdata.failed ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
if (symdata.failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
#if BACKTRACE_SUPPORTED
|
|
||||||
test1 ();
|
|
||||||
test3 ();
|
|
||||||
#if BACKTRACE_SUPPORTS_DATA
|
|
||||||
test5 ();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
66
deps/libbacktrace/nounwind.c
vendored
66
deps/libbacktrace/nounwind.c
vendored
@ -1,66 +0,0 @@
|
|||||||
/* backtrace.c -- Entry point for stack backtrace library.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* This source file is compiled if the unwind library is not
|
|
||||||
available. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_full (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
int skip ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_full_callback callback ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
error_callback (data,
|
|
||||||
"no stack trace because unwind library not available",
|
|
||||||
0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_simple (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
int skip ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_simple_callback callback ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
error_callback (data,
|
|
||||||
"no stack trace because unwind library not available",
|
|
||||||
0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
935
deps/libbacktrace/pecoff.c
vendored
935
deps/libbacktrace/pecoff.c
vendored
@ -1,935 +0,0 @@
|
|||||||
/* pecoff.c -- Get debug data from a PE/COFFF file for backtraces.
|
|
||||||
Copyright (C) 2015-2021 Free Software Foundation, Inc.
|
|
||||||
Adapted from elf.c by Tristan Gingold, AdaCore.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* Coff file header. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t machine;
|
|
||||||
uint16_t number_of_sections;
|
|
||||||
uint32_t time_date_stamp;
|
|
||||||
uint32_t pointer_to_symbol_table;
|
|
||||||
uint32_t number_of_symbols;
|
|
||||||
uint16_t size_of_optional_header;
|
|
||||||
uint16_t characteristics;
|
|
||||||
} b_coff_file_header;
|
|
||||||
|
|
||||||
/* Coff optional header. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t magic;
|
|
||||||
uint8_t major_linker_version;
|
|
||||||
uint8_t minor_linker_version;
|
|
||||||
uint32_t size_of_code;
|
|
||||||
uint32_t size_of_initialized_data;
|
|
||||||
uint32_t size_of_uninitialized_data;
|
|
||||||
uint32_t address_of_entry_point;
|
|
||||||
uint32_t base_of_code;
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
uint32_t base_of_data;
|
|
||||||
uint32_t image_base;
|
|
||||||
} pe;
|
|
||||||
struct {
|
|
||||||
uint64_t image_base;
|
|
||||||
} pep;
|
|
||||||
} u;
|
|
||||||
} b_coff_optional_header;
|
|
||||||
|
|
||||||
/* Values of magic in optional header. */
|
|
||||||
|
|
||||||
#define PE_MAGIC 0x10b /* PE32 executable. */
|
|
||||||
#define PEP_MAGIC 0x20b /* PE32+ executable (for 64bit targets). */
|
|
||||||
|
|
||||||
/* Coff section header. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char name[8];
|
|
||||||
uint32_t virtual_size;
|
|
||||||
uint32_t virtual_address;
|
|
||||||
uint32_t size_of_raw_data;
|
|
||||||
uint32_t pointer_to_raw_data;
|
|
||||||
uint32_t pointer_to_relocations;
|
|
||||||
uint32_t pointer_to_line_numbers;
|
|
||||||
uint16_t number_of_relocations;
|
|
||||||
uint16_t number_of_line_numbers;
|
|
||||||
uint32_t characteristics;
|
|
||||||
} b_coff_section_header;
|
|
||||||
|
|
||||||
/* Coff symbol name. */
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
char short_name[8];
|
|
||||||
struct {
|
|
||||||
unsigned char zeroes[4];
|
|
||||||
unsigned char off[4];
|
|
||||||
} long_name;
|
|
||||||
} b_coff_name;
|
|
||||||
|
|
||||||
/* Coff symbol (external representation which is unaligned). */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
b_coff_name name;
|
|
||||||
unsigned char value[4];
|
|
||||||
unsigned char section_number[2];
|
|
||||||
unsigned char type[2];
|
|
||||||
unsigned char storage_class;
|
|
||||||
unsigned char number_of_aux_symbols;
|
|
||||||
} b_coff_external_symbol;
|
|
||||||
|
|
||||||
/* Symbol types. */
|
|
||||||
|
|
||||||
#define N_TBSHFT 4 /* Shift for the derived type. */
|
|
||||||
#define IMAGE_SYM_DTYPE_FUNCTION 2 /* Function derived type. */
|
|
||||||
|
|
||||||
/* Size of a coff symbol. */
|
|
||||||
|
|
||||||
#define SYM_SZ 18
|
|
||||||
|
|
||||||
/* Coff symbol, internal representation (aligned). */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char *name;
|
|
||||||
uint32_t value;
|
|
||||||
int16_t sec;
|
|
||||||
uint16_t type;
|
|
||||||
uint16_t sc;
|
|
||||||
} b_coff_internal_symbol;
|
|
||||||
|
|
||||||
/* Names of sections, indexed by enum dwarf_section in internal.h. */
|
|
||||||
|
|
||||||
static const char * const debug_section_names[DEBUG_MAX] =
|
|
||||||
{
|
|
||||||
".debug_info",
|
|
||||||
".debug_line",
|
|
||||||
".debug_abbrev",
|
|
||||||
".debug_ranges",
|
|
||||||
".debug_str",
|
|
||||||
".debug_addr",
|
|
||||||
".debug_str_offsets",
|
|
||||||
".debug_line_str",
|
|
||||||
".debug_rnglists"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Information we gather for the sections we care about. */
|
|
||||||
|
|
||||||
struct debug_section_info
|
|
||||||
{
|
|
||||||
/* Section file offset. */
|
|
||||||
off_t offset;
|
|
||||||
/* Section size. */
|
|
||||||
size_t size;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Information we keep for an coff symbol. */
|
|
||||||
|
|
||||||
struct coff_symbol
|
|
||||||
{
|
|
||||||
/* The name of the symbol. */
|
|
||||||
const char *name;
|
|
||||||
/* The address of the symbol. */
|
|
||||||
uintptr_t address;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Information to pass to coff_syminfo. */
|
|
||||||
|
|
||||||
struct coff_syminfo_data
|
|
||||||
{
|
|
||||||
/* Symbols for the next module. */
|
|
||||||
struct coff_syminfo_data *next;
|
|
||||||
/* The COFF symbols, sorted by address. */
|
|
||||||
struct coff_symbol *symbols;
|
|
||||||
/* The number of symbols. */
|
|
||||||
size_t count;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A dummy callback function used when we can't find any debug info. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
uintptr_t pc ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_full_callback callback ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
error_callback (data, "no debug info in PE/COFF executable", -1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A dummy callback function used when we can't find a symbol
|
|
||||||
table. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
coff_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
uintptr_t addr ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
error_callback (data, "no symbol table in PE/COFF executable", -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a potentially unaligned 4 byte word at P, using native endianness. */
|
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
coff_read4 (const unsigned char *p)
|
|
||||||
{
|
|
||||||
uint32_t res;
|
|
||||||
|
|
||||||
memcpy (&res, p, 4);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a potentially unaligned 2 byte word at P, using native endianness.
|
|
||||||
All 2 byte word in symbols are always aligned, but for coherency all
|
|
||||||
fields are declared as char arrays. */
|
|
||||||
|
|
||||||
static uint16_t
|
|
||||||
coff_read2 (const unsigned char *p)
|
|
||||||
{
|
|
||||||
uint16_t res;
|
|
||||||
|
|
||||||
memcpy (&res, p, sizeof (res));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the length (without the trailing 0) of a COFF short name. */
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
coff_short_name_len (const char *name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
if (name[i] == 0)
|
|
||||||
return i;
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true iff COFF short name CNAME is the same as NAME (a NUL-terminated
|
|
||||||
string). */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_short_name_eq (const char *name, const char *cname)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
if (name[i] != cname[i])
|
|
||||||
return 0;
|
|
||||||
if (name[i] == 0)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return name[8] == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true iff NAME is the same as string at offset OFF. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_long_name_eq (const char *name, unsigned int off,
|
|
||||||
struct backtrace_view *str_view)
|
|
||||||
{
|
|
||||||
if (off >= str_view->len)
|
|
||||||
return 0;
|
|
||||||
return strcmp (name, (const char *)str_view->data + off) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compare struct coff_symbol for qsort. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_symbol_compare (const void *v1, const void *v2)
|
|
||||||
{
|
|
||||||
const struct coff_symbol *e1 = (const struct coff_symbol *) v1;
|
|
||||||
const struct coff_symbol *e2 = (const struct coff_symbol *) v2;
|
|
||||||
|
|
||||||
if (e1->address < e2->address)
|
|
||||||
return -1;
|
|
||||||
else if (e1->address > e2->address)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert SYM to internal (and aligned) format ISYM, using string table
|
|
||||||
from STRTAB and STRTAB_SIZE, and number of sections SECTS_NUM.
|
|
||||||
Return -1 in case of error (invalid section number or string index). */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_expand_symbol (b_coff_internal_symbol *isym,
|
|
||||||
const b_coff_external_symbol *sym,
|
|
||||||
uint16_t sects_num,
|
|
||||||
const unsigned char *strtab, size_t strtab_size)
|
|
||||||
{
|
|
||||||
isym->type = coff_read2 (sym->type);
|
|
||||||
isym->sec = coff_read2 (sym->section_number);
|
|
||||||
isym->sc = sym->storage_class;
|
|
||||||
|
|
||||||
if (isym->sec > 0 && (uint16_t) isym->sec > sects_num)
|
|
||||||
return -1;
|
|
||||||
if (sym->name.short_name[0] != 0)
|
|
||||||
isym->name = sym->name.short_name;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint32_t off = coff_read4 (sym->name.long_name.off);
|
|
||||||
|
|
||||||
if (off >= strtab_size)
|
|
||||||
return -1;
|
|
||||||
isym->name = (const char *) strtab + off;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true iff SYM is a defined symbol for a function. Data symbols
|
|
||||||
aren't considered because they aren't easily identified (same type as
|
|
||||||
section names, presence of symbols defined by the linker script). */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_is_function_symbol (const b_coff_internal_symbol *isym)
|
|
||||||
{
|
|
||||||
return (isym->type >> N_TBSHFT) == IMAGE_SYM_DTYPE_FUNCTION
|
|
||||||
&& isym->sec > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the symbol table info for coff_syminfo. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_initialize_syminfo (struct backtrace_state *state,
|
|
||||||
uintptr_t base_address, int is_64,
|
|
||||||
const b_coff_section_header *sects, size_t sects_num,
|
|
||||||
const b_coff_external_symbol *syms, size_t syms_size,
|
|
||||||
const unsigned char *strtab, size_t strtab_size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, struct coff_syminfo_data *sdata)
|
|
||||||
{
|
|
||||||
size_t syms_count;
|
|
||||||
char *coff_symstr;
|
|
||||||
size_t coff_symstr_len;
|
|
||||||
size_t coff_symbol_count;
|
|
||||||
size_t coff_symbol_size;
|
|
||||||
struct coff_symbol *coff_symbols;
|
|
||||||
struct coff_symbol *coff_sym;
|
|
||||||
char *coff_str;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
syms_count = syms_size / SYM_SZ;
|
|
||||||
|
|
||||||
/* We only care about function symbols. Count them. Also count size of
|
|
||||||
strings for in-symbol names. */
|
|
||||||
coff_symbol_count = 0;
|
|
||||||
coff_symstr_len = 0;
|
|
||||||
for (i = 0; i < syms_count; ++i)
|
|
||||||
{
|
|
||||||
const b_coff_external_symbol *asym = &syms[i];
|
|
||||||
b_coff_internal_symbol isym;
|
|
||||||
|
|
||||||
if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size) < 0)
|
|
||||||
{
|
|
||||||
error_callback (data, "invalid section or offset in coff symbol", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (coff_is_function_symbol (&isym))
|
|
||||||
{
|
|
||||||
++coff_symbol_count;
|
|
||||||
if (asym->name.short_name[0] != 0)
|
|
||||||
coff_symstr_len += coff_short_name_len (asym->name.short_name) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
i += asym->number_of_aux_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
coff_symbol_size = (coff_symbol_count + 1) * sizeof (struct coff_symbol);
|
|
||||||
coff_symbols = ((struct coff_symbol *)
|
|
||||||
backtrace_alloc (state, coff_symbol_size, error_callback,
|
|
||||||
data));
|
|
||||||
if (coff_symbols == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Allocate memory for symbols strings. */
|
|
||||||
if (coff_symstr_len > 0)
|
|
||||||
{
|
|
||||||
coff_symstr = ((char *)
|
|
||||||
backtrace_alloc (state, coff_symstr_len, error_callback,
|
|
||||||
data));
|
|
||||||
if (coff_symstr == NULL)
|
|
||||||
{
|
|
||||||
backtrace_free (state, coff_symbols, coff_symbol_size,
|
|
||||||
error_callback, data);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
coff_symstr = NULL;
|
|
||||||
|
|
||||||
/* Copy symbols. */
|
|
||||||
coff_sym = coff_symbols;
|
|
||||||
coff_str = coff_symstr;
|
|
||||||
for (i = 0; i < syms_count; ++i)
|
|
||||||
{
|
|
||||||
const b_coff_external_symbol *asym = &syms[i];
|
|
||||||
b_coff_internal_symbol isym;
|
|
||||||
|
|
||||||
if (coff_expand_symbol (&isym, asym, sects_num, strtab, strtab_size))
|
|
||||||
{
|
|
||||||
/* Should not fail, as it was already tested in the previous
|
|
||||||
loop. */
|
|
||||||
abort ();
|
|
||||||
}
|
|
||||||
if (coff_is_function_symbol (&isym))
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
int16_t secnum;
|
|
||||||
|
|
||||||
if (asym->name.short_name[0] != 0)
|
|
||||||
{
|
|
||||||
size_t len = coff_short_name_len (isym.name);
|
|
||||||
name = coff_str;
|
|
||||||
memcpy (coff_str, isym.name, len);
|
|
||||||
coff_str[len] = 0;
|
|
||||||
coff_str += len + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
name = isym.name;
|
|
||||||
|
|
||||||
if (!is_64)
|
|
||||||
{
|
|
||||||
/* Strip leading '_'. */
|
|
||||||
if (name[0] == '_')
|
|
||||||
name++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Symbol value is section relative, so we need to read the address
|
|
||||||
of its section. */
|
|
||||||
secnum = coff_read2 (asym->section_number);
|
|
||||||
|
|
||||||
coff_sym->name = name;
|
|
||||||
coff_sym->address = (coff_read4 (asym->value)
|
|
||||||
+ sects[secnum - 1].virtual_address
|
|
||||||
+ base_address);
|
|
||||||
coff_sym++;
|
|
||||||
}
|
|
||||||
|
|
||||||
i += asym->number_of_aux_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of symbols marker. */
|
|
||||||
coff_sym->name = NULL;
|
|
||||||
coff_sym->address = -1;
|
|
||||||
|
|
||||||
backtrace_qsort (coff_symbols, coff_symbol_count,
|
|
||||||
sizeof (struct coff_symbol), coff_symbol_compare);
|
|
||||||
|
|
||||||
sdata->next = NULL;
|
|
||||||
sdata->symbols = coff_symbols;
|
|
||||||
sdata->count = coff_symbol_count;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add EDATA to the list in STATE. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
coff_add_syminfo_data (struct backtrace_state *state,
|
|
||||||
struct coff_syminfo_data *sdata)
|
|
||||||
{
|
|
||||||
if (!state->threaded)
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data **pp;
|
|
||||||
|
|
||||||
for (pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
|
||||||
*pp != NULL;
|
|
||||||
pp = &(*pp)->next)
|
|
||||||
;
|
|
||||||
*pp = sdata;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data **pp;
|
|
||||||
|
|
||||||
pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data *p;
|
|
||||||
|
|
||||||
p = backtrace_atomic_load_pointer (pp);
|
|
||||||
|
|
||||||
if (p == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
pp = &p->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (__sync_bool_compare_and_swap (pp, NULL, sdata))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compare an ADDR against an elf_symbol for bsearch. We allocate one
|
|
||||||
extra entry in the array so that this can look safely at the next
|
|
||||||
entry. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_symbol_search (const void *vkey, const void *ventry)
|
|
||||||
{
|
|
||||||
const uintptr_t *key = (const uintptr_t *) vkey;
|
|
||||||
const struct coff_symbol *entry = (const struct coff_symbol *) ventry;
|
|
||||||
uintptr_t addr;
|
|
||||||
|
|
||||||
addr = *key;
|
|
||||||
if (addr < entry->address)
|
|
||||||
return -1;
|
|
||||||
else if (addr >= entry[1].address)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the symbol name and value for an ADDR. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
coff_syminfo (struct backtrace_state *state, uintptr_t addr,
|
|
||||||
backtrace_syminfo_callback callback,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data *sdata;
|
|
||||||
struct coff_symbol *sym = NULL;
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
{
|
|
||||||
for (sdata = (struct coff_syminfo_data *) state->syminfo_data;
|
|
||||||
sdata != NULL;
|
|
||||||
sdata = sdata->next)
|
|
||||||
{
|
|
||||||
sym = ((struct coff_symbol *)
|
|
||||||
bsearch (&addr, sdata->symbols, sdata->count,
|
|
||||||
sizeof (struct coff_symbol), coff_symbol_search));
|
|
||||||
if (sym != NULL)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data **pp;
|
|
||||||
|
|
||||||
pp = (struct coff_syminfo_data **) (void *) &state->syminfo_data;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
sdata = backtrace_atomic_load_pointer (pp);
|
|
||||||
if (sdata == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
sym = ((struct coff_symbol *)
|
|
||||||
bsearch (&addr, sdata->symbols, sdata->count,
|
|
||||||
sizeof (struct coff_symbol), coff_symbol_search));
|
|
||||||
if (sym != NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
pp = &sdata->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sym == NULL)
|
|
||||||
callback (data, addr, NULL, 0, 0);
|
|
||||||
else
|
|
||||||
callback (data, addr, sym->name, sym->address, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add the backtrace data for one PE/COFF file. Returns 1 on success,
|
|
||||||
0 on failure (in both cases descriptor is closed). */
|
|
||||||
|
|
||||||
static int
|
|
||||||
coff_add (struct backtrace_state *state, int descriptor,
|
|
||||||
backtrace_error_callback error_callback, void *data,
|
|
||||||
fileline *fileline_fn, int *found_sym, int *found_dwarf)
|
|
||||||
{
|
|
||||||
struct backtrace_view fhdr_view;
|
|
||||||
off_t fhdr_off;
|
|
||||||
int magic_ok;
|
|
||||||
b_coff_file_header fhdr;
|
|
||||||
off_t opt_sects_off;
|
|
||||||
size_t opt_sects_size;
|
|
||||||
unsigned int sects_num;
|
|
||||||
struct backtrace_view sects_view;
|
|
||||||
int sects_view_valid;
|
|
||||||
const b_coff_optional_header *opt_hdr;
|
|
||||||
const b_coff_section_header *sects;
|
|
||||||
struct backtrace_view str_view;
|
|
||||||
int str_view_valid;
|
|
||||||
size_t str_size;
|
|
||||||
off_t str_off;
|
|
||||||
struct backtrace_view syms_view;
|
|
||||||
off_t syms_off;
|
|
||||||
size_t syms_size;
|
|
||||||
int syms_view_valid;
|
|
||||||
unsigned int syms_num;
|
|
||||||
unsigned int i;
|
|
||||||
struct debug_section_info sections[DEBUG_MAX];
|
|
||||||
off_t min_offset;
|
|
||||||
off_t max_offset;
|
|
||||||
struct backtrace_view debug_view;
|
|
||||||
int debug_view_valid;
|
|
||||||
int is_64;
|
|
||||||
uintptr_t image_base;
|
|
||||||
struct dwarf_sections dwarf_sections;
|
|
||||||
|
|
||||||
*found_sym = 0;
|
|
||||||
*found_dwarf = 0;
|
|
||||||
|
|
||||||
sects_view_valid = 0;
|
|
||||||
syms_view_valid = 0;
|
|
||||||
str_view_valid = 0;
|
|
||||||
debug_view_valid = 0;
|
|
||||||
|
|
||||||
/* Map the MS-DOS stub (if any) and extract file header offset. */
|
|
||||||
if (!backtrace_get_view (state, descriptor, 0, 0x40, error_callback,
|
|
||||||
data, &fhdr_view))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
{
|
|
||||||
const unsigned char *vptr = fhdr_view.data;
|
|
||||||
|
|
||||||
if (vptr[0] == 'M' && vptr[1] == 'Z')
|
|
||||||
fhdr_off = coff_read4 (vptr + 0x3c);
|
|
||||||
else
|
|
||||||
fhdr_off = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
backtrace_release_view (state, &fhdr_view, error_callback, data);
|
|
||||||
|
|
||||||
/* Map the coff file header. */
|
|
||||||
if (!backtrace_get_view (state, descriptor, fhdr_off,
|
|
||||||
sizeof (b_coff_file_header) + 4,
|
|
||||||
error_callback, data, &fhdr_view))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if (fhdr_off != 0)
|
|
||||||
{
|
|
||||||
const char *magic = (const char *) fhdr_view.data;
|
|
||||||
magic_ok = memcmp (magic, "PE\0", 4) == 0;
|
|
||||||
fhdr_off += 4;
|
|
||||||
|
|
||||||
memcpy (&fhdr, fhdr_view.data + 4, sizeof fhdr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy (&fhdr, fhdr_view.data, sizeof fhdr);
|
|
||||||
/* TODO: test fhdr.machine for coff but non-PE platforms. */
|
|
||||||
magic_ok = 0;
|
|
||||||
}
|
|
||||||
backtrace_release_view (state, &fhdr_view, error_callback, data);
|
|
||||||
|
|
||||||
if (!magic_ok)
|
|
||||||
{
|
|
||||||
error_callback (data, "executable file is not COFF", 0);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
sects_num = fhdr.number_of_sections;
|
|
||||||
syms_num = fhdr.number_of_symbols;
|
|
||||||
|
|
||||||
opt_sects_off = fhdr_off + sizeof (fhdr);
|
|
||||||
opt_sects_size = (fhdr.size_of_optional_header
|
|
||||||
+ sects_num * sizeof (b_coff_section_header));
|
|
||||||
|
|
||||||
/* To translate PC to file/line when using DWARF, we need to find
|
|
||||||
the .debug_info and .debug_line sections. */
|
|
||||||
|
|
||||||
/* Read the optional header and the section headers. */
|
|
||||||
|
|
||||||
if (!backtrace_get_view (state, descriptor, opt_sects_off, opt_sects_size,
|
|
||||||
error_callback, data, §s_view))
|
|
||||||
goto fail;
|
|
||||||
sects_view_valid = 1;
|
|
||||||
opt_hdr = (const b_coff_optional_header *) sects_view.data;
|
|
||||||
sects = (const b_coff_section_header *)
|
|
||||||
(sects_view.data + fhdr.size_of_optional_header);
|
|
||||||
|
|
||||||
is_64 = 0;
|
|
||||||
if (fhdr.size_of_optional_header > sizeof (*opt_hdr))
|
|
||||||
{
|
|
||||||
if (opt_hdr->magic == PE_MAGIC)
|
|
||||||
image_base = opt_hdr->u.pe.image_base;
|
|
||||||
else if (opt_hdr->magic == PEP_MAGIC)
|
|
||||||
{
|
|
||||||
image_base = opt_hdr->u.pep.image_base;
|
|
||||||
is_64 = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error_callback (data, "bad magic in PE optional header", 0);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
image_base = 0;
|
|
||||||
|
|
||||||
/* Read the symbol table and the string table. */
|
|
||||||
|
|
||||||
if (fhdr.pointer_to_symbol_table == 0)
|
|
||||||
{
|
|
||||||
/* No symbol table, no string table. */
|
|
||||||
str_off = 0;
|
|
||||||
str_size = 0;
|
|
||||||
syms_num = 0;
|
|
||||||
syms_size = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Symbol table is followed by the string table. The string table
|
|
||||||
starts with its length (on 4 bytes).
|
|
||||||
Map the symbol table and the length of the string table. */
|
|
||||||
syms_off = fhdr.pointer_to_symbol_table;
|
|
||||||
syms_size = syms_num * SYM_SZ;
|
|
||||||
|
|
||||||
if (!backtrace_get_view (state, descriptor, syms_off, syms_size + 4,
|
|
||||||
error_callback, data, &syms_view))
|
|
||||||
goto fail;
|
|
||||||
syms_view_valid = 1;
|
|
||||||
|
|
||||||
str_size = coff_read4 (syms_view.data + syms_size);
|
|
||||||
|
|
||||||
str_off = syms_off + syms_size;
|
|
||||||
|
|
||||||
if (str_size > 4)
|
|
||||||
{
|
|
||||||
/* Map string table (including the length word). */
|
|
||||||
|
|
||||||
if (!backtrace_get_view (state, descriptor, str_off, str_size,
|
|
||||||
error_callback, data, &str_view))
|
|
||||||
goto fail;
|
|
||||||
str_view_valid = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (sections, 0, sizeof sections);
|
|
||||||
|
|
||||||
/* Look for the symbol table. */
|
|
||||||
for (i = 0; i < sects_num; ++i)
|
|
||||||
{
|
|
||||||
const b_coff_section_header *s = sects + i;
|
|
||||||
unsigned int str_off;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
if (s->name[0] == '/')
|
|
||||||
{
|
|
||||||
/* Extended section name. */
|
|
||||||
str_off = atoi (s->name + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
str_off = 0;
|
|
||||||
|
|
||||||
for (j = 0; j < (int) DEBUG_MAX; ++j)
|
|
||||||
{
|
|
||||||
const char *dbg_name = debug_section_names[j];
|
|
||||||
int match;
|
|
||||||
|
|
||||||
if (str_off != 0)
|
|
||||||
match = coff_long_name_eq (dbg_name, str_off, &str_view);
|
|
||||||
else
|
|
||||||
match = coff_short_name_eq (dbg_name, s->name);
|
|
||||||
if (match)
|
|
||||||
{
|
|
||||||
sections[j].offset = s->pointer_to_raw_data;
|
|
||||||
sections[j].size = s->virtual_size <= s->size_of_raw_data ?
|
|
||||||
s->virtual_size : s->size_of_raw_data;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (syms_num != 0)
|
|
||||||
{
|
|
||||||
struct coff_syminfo_data *sdata;
|
|
||||||
|
|
||||||
sdata = ((struct coff_syminfo_data *)
|
|
||||||
backtrace_alloc (state, sizeof *sdata, error_callback, data));
|
|
||||||
if (sdata == NULL)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if (!coff_initialize_syminfo (state, image_base, is_64,
|
|
||||||
sects, sects_num,
|
|
||||||
syms_view.data, syms_size,
|
|
||||||
str_view.data, str_size,
|
|
||||||
error_callback, data, sdata))
|
|
||||||
{
|
|
||||||
backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
*found_sym = 1;
|
|
||||||
|
|
||||||
coff_add_syminfo_data (state, sdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
backtrace_release_view (state, §s_view, error_callback, data);
|
|
||||||
sects_view_valid = 0;
|
|
||||||
if (syms_view_valid)
|
|
||||||
{
|
|
||||||
backtrace_release_view (state, &syms_view, error_callback, data);
|
|
||||||
syms_view_valid = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read all the debug sections in a single view, since they are
|
|
||||||
probably adjacent in the file. We never release this view. */
|
|
||||||
|
|
||||||
min_offset = 0;
|
|
||||||
max_offset = 0;
|
|
||||||
for (i = 0; i < (int) DEBUG_MAX; ++i)
|
|
||||||
{
|
|
||||||
off_t end;
|
|
||||||
|
|
||||||
if (sections[i].size == 0)
|
|
||||||
continue;
|
|
||||||
if (min_offset == 0 || sections[i].offset < min_offset)
|
|
||||||
min_offset = sections[i].offset;
|
|
||||||
end = sections[i].offset + sections[i].size;
|
|
||||||
if (end > max_offset)
|
|
||||||
max_offset = end;
|
|
||||||
}
|
|
||||||
if (min_offset == 0 || max_offset == 0)
|
|
||||||
{
|
|
||||||
if (!backtrace_close (descriptor, error_callback, data))
|
|
||||||
goto fail;
|
|
||||||
*fileline_fn = coff_nodebug;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_get_view (state, descriptor, min_offset,
|
|
||||||
max_offset - min_offset,
|
|
||||||
error_callback, data, &debug_view))
|
|
||||||
goto fail;
|
|
||||||
debug_view_valid = 1;
|
|
||||||
|
|
||||||
/* We've read all we need from the executable. */
|
|
||||||
if (!backtrace_close (descriptor, error_callback, data))
|
|
||||||
goto fail;
|
|
||||||
descriptor = -1;
|
|
||||||
|
|
||||||
for (i = 0; i < (int) DEBUG_MAX; ++i)
|
|
||||||
{
|
|
||||||
size_t size = sections[i].size;
|
|
||||||
dwarf_sections.size[i] = size;
|
|
||||||
if (size == 0)
|
|
||||||
dwarf_sections.data[i] = NULL;
|
|
||||||
else
|
|
||||||
dwarf_sections.data[i] = ((const unsigned char *) debug_view.data
|
|
||||||
+ (sections[i].offset - min_offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_dwarf_add (state, /* base_address */ 0, &dwarf_sections,
|
|
||||||
0, /* FIXME: is_bigendian */
|
|
||||||
NULL, /* altlink */
|
|
||||||
error_callback, data, fileline_fn,
|
|
||||||
NULL /* returned fileline_entry */))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
*found_dwarf = 1;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (sects_view_valid)
|
|
||||||
backtrace_release_view (state, §s_view, error_callback, data);
|
|
||||||
if (str_view_valid)
|
|
||||||
backtrace_release_view (state, &str_view, error_callback, data);
|
|
||||||
if (syms_view_valid)
|
|
||||||
backtrace_release_view (state, &syms_view, error_callback, data);
|
|
||||||
if (debug_view_valid)
|
|
||||||
backtrace_release_view (state, &debug_view, error_callback, data);
|
|
||||||
if (descriptor != -1)
|
|
||||||
backtrace_close (descriptor, error_callback, data);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the backtrace data we need from an ELF executable. At
|
|
||||||
the ELF level, all we need to do is find the debug info
|
|
||||||
sections. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_initialize (struct backtrace_state *state,
|
|
||||||
const char *filename ATTRIBUTE_UNUSED, int descriptor,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, fileline *fileline_fn)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
int found_sym;
|
|
||||||
int found_dwarf;
|
|
||||||
fileline coff_fileline_fn;
|
|
||||||
|
|
||||||
ret = coff_add (state, descriptor, error_callback, data,
|
|
||||||
&coff_fileline_fn, &found_sym, &found_dwarf);
|
|
||||||
if (!ret)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
{
|
|
||||||
if (found_sym)
|
|
||||||
state->syminfo_fn = coff_syminfo;
|
|
||||||
else if (state->syminfo_fn == NULL)
|
|
||||||
state->syminfo_fn = coff_nosyms;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (found_sym)
|
|
||||||
backtrace_atomic_store_pointer (&state->syminfo_fn, coff_syminfo);
|
|
||||||
else
|
|
||||||
(void) __sync_bool_compare_and_swap (&state->syminfo_fn, NULL,
|
|
||||||
coff_nosyms);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!state->threaded)
|
|
||||||
{
|
|
||||||
if (state->fileline_fn == NULL || state->fileline_fn == coff_nodebug)
|
|
||||||
*fileline_fn = coff_fileline_fn;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fileline current_fn;
|
|
||||||
|
|
||||||
current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
|
|
||||||
if (current_fn == NULL || current_fn == coff_nodebug)
|
|
||||||
*fileline_fn = coff_fileline_fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
104
deps/libbacktrace/posix.c
vendored
104
deps/libbacktrace/posix.c
vendored
@ -1,104 +0,0 @@
|
|||||||
/* posix.c -- POSIX file I/O routines for the backtrace library.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
#ifndef O_BINARY
|
|
||||||
#define O_BINARY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef O_CLOEXEC
|
|
||||||
#define O_CLOEXEC 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FD_CLOEXEC
|
|
||||||
#define FD_CLOEXEC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Open a file for reading. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_open (const char *filename, backtrace_error_callback error_callback,
|
|
||||||
void *data, int *does_not_exist)
|
|
||||||
{
|
|
||||||
int descriptor;
|
|
||||||
|
|
||||||
if (does_not_exist != NULL)
|
|
||||||
*does_not_exist = 0;
|
|
||||||
|
|
||||||
descriptor = open (filename, (int) (O_RDONLY | O_BINARY | O_CLOEXEC));
|
|
||||||
if (descriptor < 0)
|
|
||||||
{
|
|
||||||
/* If DOES_NOT_EXIST is not NULL, then don't call ERROR_CALLBACK
|
|
||||||
if the file does not exist. We treat lacking permission to
|
|
||||||
open the file as the file not existing; this case arises when
|
|
||||||
running the libgo syscall package tests as root. */
|
|
||||||
if (does_not_exist != NULL && (errno == ENOENT || errno == EACCES))
|
|
||||||
*does_not_exist = 1;
|
|
||||||
else
|
|
||||||
error_callback (data, filename, errno);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_FCNTL
|
|
||||||
/* Set FD_CLOEXEC just in case the kernel does not support
|
|
||||||
O_CLOEXEC. It doesn't matter if this fails for some reason.
|
|
||||||
FIXME: At some point it should be safe to only do this if
|
|
||||||
O_CLOEXEC == 0. */
|
|
||||||
fcntl (descriptor, F_SETFD, FD_CLOEXEC);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return descriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Close DESCRIPTOR. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_close (int descriptor, backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
if (close (descriptor) < 0)
|
|
||||||
{
|
|
||||||
error_callback (data, "close", errno);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
92
deps/libbacktrace/print.c
vendored
92
deps/libbacktrace/print.c
vendored
@ -1,92 +0,0 @@
|
|||||||
/* print.c -- Print the current backtrace.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* Passed to callbacks. */
|
|
||||||
|
|
||||||
struct print_data
|
|
||||||
{
|
|
||||||
struct backtrace_state *state;
|
|
||||||
FILE *f;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Print one level of a backtrace. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
|
|
||||||
const char *function)
|
|
||||||
{
|
|
||||||
struct print_data *pdata = (struct print_data *) data;
|
|
||||||
|
|
||||||
fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n",
|
|
||||||
(unsigned long) pc,
|
|
||||||
function == NULL ? "???" : function,
|
|
||||||
filename == NULL ? "???" : filename,
|
|
||||||
lineno);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print errors to stderr. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback (void *data, const char *msg, int errnum)
|
|
||||||
{
|
|
||||||
struct print_data *pdata = (struct print_data *) data;
|
|
||||||
|
|
||||||
if (pdata->state->filename != NULL)
|
|
||||||
fprintf (stderr, "%s: ", pdata->state->filename);
|
|
||||||
fprintf (stderr, "libbacktrace: %s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fputc ('\n', stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print a backtrace. */
|
|
||||||
|
|
||||||
void __attribute__((noinline))
|
|
||||||
backtrace_print (struct backtrace_state *state, int skip, FILE *f)
|
|
||||||
{
|
|
||||||
struct print_data data;
|
|
||||||
|
|
||||||
data.state = state;
|
|
||||||
data.f = f;
|
|
||||||
backtrace_full (state, skip + 1, print_callback, error_callback,
|
|
||||||
(void *) &data);
|
|
||||||
}
|
|
110
deps/libbacktrace/read.c
vendored
110
deps/libbacktrace/read.c
vendored
@ -1,110 +0,0 @@
|
|||||||
/* read.c -- File views without mmap.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* This file implements file views when mmap is not available. */
|
|
||||||
|
|
||||||
/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_get_view (struct backtrace_state *state, int descriptor,
|
|
||||||
off_t offset, uint64_t size,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data, struct backtrace_view *view)
|
|
||||||
{
|
|
||||||
uint64_t got;
|
|
||||||
ssize_t r;
|
|
||||||
|
|
||||||
if ((uint64_t) (size_t) size != size)
|
|
||||||
{
|
|
||||||
error_callback (data, "file size too large", 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lseek (descriptor, offset, SEEK_SET) < 0)
|
|
||||||
{
|
|
||||||
error_callback (data, "lseek", errno);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
view->base = backtrace_alloc (state, size, error_callback, data);
|
|
||||||
if (view->base == NULL)
|
|
||||||
return 0;
|
|
||||||
view->data = view->base;
|
|
||||||
view->len = size;
|
|
||||||
|
|
||||||
got = 0;
|
|
||||||
while (got < size)
|
|
||||||
{
|
|
||||||
r = read (descriptor, view->base, size - got);
|
|
||||||
if (r < 0)
|
|
||||||
{
|
|
||||||
error_callback (data, "read", errno);
|
|
||||||
free (view->base);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (r == 0)
|
|
||||||
break;
|
|
||||||
got += (uint64_t) r;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (got < size)
|
|
||||||
{
|
|
||||||
error_callback (data, "file too short", 0);
|
|
||||||
free (view->base);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release a view read by backtrace_get_view. */
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_release_view (struct backtrace_state *state,
|
|
||||||
struct backtrace_view *view,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
backtrace_free (state, view->base, view->len, error_callback, data);
|
|
||||||
view->data = NULL;
|
|
||||||
view->base = NULL;
|
|
||||||
}
|
|
108
deps/libbacktrace/simple.c
vendored
108
deps/libbacktrace/simple.c
vendored
@ -1,108 +0,0 @@
|
|||||||
/* simple.c -- The backtrace_simple function.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "unwind.h"
|
|
||||||
#include "backtrace.h"
|
|
||||||
|
|
||||||
/* The simple_backtrace routine. */
|
|
||||||
|
|
||||||
/* Data passed through _Unwind_Backtrace. */
|
|
||||||
|
|
||||||
struct backtrace_simple_data
|
|
||||||
{
|
|
||||||
/* Number of frames to skip. */
|
|
||||||
int skip;
|
|
||||||
/* Library state. */
|
|
||||||
struct backtrace_state *state;
|
|
||||||
/* Callback routine. */
|
|
||||||
backtrace_simple_callback callback;
|
|
||||||
/* Error callback routine. */
|
|
||||||
backtrace_error_callback error_callback;
|
|
||||||
/* Data to pass to callback routine. */
|
|
||||||
void *data;
|
|
||||||
/* Value to return from backtrace. */
|
|
||||||
int ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Unwind library callback routine. This is passed to
|
|
||||||
_Unwind_Backtrace. */
|
|
||||||
|
|
||||||
static _Unwind_Reason_Code
|
|
||||||
simple_unwind (struct _Unwind_Context *context, void *vdata)
|
|
||||||
{
|
|
||||||
struct backtrace_simple_data *bdata = (struct backtrace_simple_data *) vdata;
|
|
||||||
uintptr_t pc;
|
|
||||||
int ip_before_insn = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_GETIPINFO
|
|
||||||
pc = _Unwind_GetIPInfo (context, &ip_before_insn);
|
|
||||||
#else
|
|
||||||
pc = _Unwind_GetIP (context);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bdata->skip > 0)
|
|
||||||
{
|
|
||||||
--bdata->skip;
|
|
||||||
return _URC_NO_REASON;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ip_before_insn)
|
|
||||||
--pc;
|
|
||||||
|
|
||||||
bdata->ret = bdata->callback (bdata->data, pc);
|
|
||||||
|
|
||||||
if (bdata->ret != 0)
|
|
||||||
return _URC_END_OF_STACK;
|
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get a simple stack backtrace. */
|
|
||||||
|
|
||||||
int __attribute__((noinline))
|
|
||||||
backtrace_simple (struct backtrace_state *state, int skip,
|
|
||||||
backtrace_simple_callback callback,
|
|
||||||
backtrace_error_callback error_callback, void *data)
|
|
||||||
{
|
|
||||||
struct backtrace_simple_data bdata;
|
|
||||||
|
|
||||||
bdata.skip = skip + 1;
|
|
||||||
bdata.state = state;
|
|
||||||
bdata.callback = callback;
|
|
||||||
bdata.error_callback = error_callback;
|
|
||||||
bdata.data = data;
|
|
||||||
bdata.ret = 0;
|
|
||||||
_Unwind_Backtrace (simple_unwind, &bdata);
|
|
||||||
return bdata.ret;
|
|
||||||
}
|
|
108
deps/libbacktrace/sort.c
vendored
108
deps/libbacktrace/sort.c
vendored
@ -1,108 +0,0 @@
|
|||||||
/* sort.c -- Sort without allocating memory
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* The GNU glibc version of qsort allocates memory, which we must not
|
|
||||||
do if we are invoked by a signal handler. So provide our own
|
|
||||||
sort. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
swap (char *a, char *b, size_t size)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++, a++, b++)
|
|
||||||
{
|
|
||||||
char t;
|
|
||||||
|
|
||||||
t = *a;
|
|
||||||
*a = *b;
|
|
||||||
*b = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
backtrace_qsort (void *basearg, size_t count, size_t size,
|
|
||||||
int (*compar) (const void *, const void *))
|
|
||||||
{
|
|
||||||
char *base = (char *) basearg;
|
|
||||||
size_t i;
|
|
||||||
size_t mid;
|
|
||||||
|
|
||||||
tail_recurse:
|
|
||||||
if (count < 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* The symbol table and DWARF tables, which is all we use this
|
|
||||||
routine for, tend to be roughly sorted. Pick the middle element
|
|
||||||
in the array as our pivot point, so that we are more likely to
|
|
||||||
cut the array in half for each recursion step. */
|
|
||||||
swap (base, base + (count / 2) * size, size);
|
|
||||||
|
|
||||||
mid = 0;
|
|
||||||
for (i = 1; i < count; i++)
|
|
||||||
{
|
|
||||||
if ((*compar) (base, base + i * size) > 0)
|
|
||||||
{
|
|
||||||
++mid;
|
|
||||||
if (i != mid)
|
|
||||||
swap (base + mid * size, base + i * size, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mid > 0)
|
|
||||||
swap (base, base + mid * size, size);
|
|
||||||
|
|
||||||
/* Recurse with the smaller array, loop with the larger one. That
|
|
||||||
ensures that our maximum stack depth is log count. */
|
|
||||||
if (2 * mid < count)
|
|
||||||
{
|
|
||||||
backtrace_qsort (base, mid, size, compar);
|
|
||||||
base += (mid + 1) * size;
|
|
||||||
count -= mid + 1;
|
|
||||||
goto tail_recurse;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
backtrace_qsort (base + (mid + 1) * size, count - (mid + 1),
|
|
||||||
size, compar);
|
|
||||||
count = mid;
|
|
||||||
goto tail_recurse;
|
|
||||||
}
|
|
||||||
}
|
|
72
deps/libbacktrace/state.c
vendored
72
deps/libbacktrace/state.c
vendored
@ -1,72 +0,0 @@
|
|||||||
/* state.c -- Create the backtrace state.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* Create the backtrace state. This will then be passed to all the
|
|
||||||
other routines. */
|
|
||||||
|
|
||||||
struct backtrace_state *
|
|
||||||
backtrace_create_state (const char *filename, int threaded,
|
|
||||||
backtrace_error_callback error_callback,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct backtrace_state init_state;
|
|
||||||
struct backtrace_state *state;
|
|
||||||
|
|
||||||
#ifndef HAVE_SYNC_FUNCTIONS
|
|
||||||
if (threaded)
|
|
||||||
{
|
|
||||||
error_callback (data, "backtrace library does not support threads", 0);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
memset (&init_state, 0, sizeof init_state);
|
|
||||||
init_state.filename = filename;
|
|
||||||
init_state.threaded = threaded;
|
|
||||||
|
|
||||||
state = ((struct backtrace_state *)
|
|
||||||
backtrace_alloc (&init_state, sizeof *state, error_callback, data));
|
|
||||||
if (state == NULL)
|
|
||||||
return NULL;
|
|
||||||
*state = init_state;
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
137
deps/libbacktrace/stest.c
vendored
137
deps/libbacktrace/stest.c
vendored
@ -1,137 +0,0 @@
|
|||||||
/* stest.c -- Test for libbacktrace internal sort function
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* Test the local qsort implementation. */
|
|
||||||
|
|
||||||
#define MAX 10
|
|
||||||
|
|
||||||
struct test
|
|
||||||
{
|
|
||||||
size_t count;
|
|
||||||
int input[MAX];
|
|
||||||
int output[MAX];
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct test tests[] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
10,
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
9,
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 },
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
10,
|
|
||||||
{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
9,
|
|
||||||
{ 9, 8, 7, 6, 5, 4, 3, 2, 1 },
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
10,
|
|
||||||
{ 2, 4, 6, 8, 10, 1, 3, 5, 7, 9 },
|
|
||||||
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
5,
|
|
||||||
{ 4, 5, 3, 1, 2 },
|
|
||||||
{ 1, 2, 3, 4, 5 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
5,
|
|
||||||
{ 1, 1, 1, 1, 1 },
|
|
||||||
{ 1, 1, 1, 1, 1 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
5,
|
|
||||||
{ 1, 1, 2, 1, 1 },
|
|
||||||
{ 1, 1, 1, 1, 2 },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
5,
|
|
||||||
{ 2, 1, 1, 1, 1 },
|
|
||||||
{ 1, 1, 1, 1, 2 },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
compare (const void *a, const void *b)
|
|
||||||
{
|
|
||||||
const int *ai = (const int *) a;
|
|
||||||
const int *bi = (const int *) b;
|
|
||||||
|
|
||||||
return *ai - *bi;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
int failures;
|
|
||||||
size_t i;
|
|
||||||
int a[MAX];
|
|
||||||
|
|
||||||
failures = 0;
|
|
||||||
for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
|
|
||||||
{
|
|
||||||
memcpy (a, tests[i].input, tests[i].count * sizeof (int));
|
|
||||||
backtrace_qsort (a, tests[i].count, sizeof (int), compare);
|
|
||||||
if (memcmp (a, tests[i].output, tests[i].count * sizeof (int)) != 0)
|
|
||||||
{
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
fprintf (stderr, "test %d failed:", (int) i);
|
|
||||||
for (j = 0; j < tests[i].count; j++)
|
|
||||||
fprintf (stderr, " %d", a[j]);
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
148
deps/libbacktrace/test-driver
vendored
148
deps/libbacktrace/test-driver
vendored
@ -1,148 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# test-driver - basic testsuite driver script.
|
|
||||||
|
|
||||||
scriptversion=2016-01-11.22; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 2011-2017 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, 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/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
# Make unconditional expansion of undefined variables an error. This
|
|
||||||
# helps a lot in preventing typo-related bugs.
|
|
||||||
set -u
|
|
||||||
|
|
||||||
usage_error ()
|
|
||||||
{
|
|
||||||
echo "$0: $*" >&2
|
|
||||||
print_usage >&2
|
|
||||||
exit 2
|
|
||||||
}
|
|
||||||
|
|
||||||
print_usage ()
|
|
||||||
{
|
|
||||||
cat <<END
|
|
||||||
Usage:
|
|
||||||
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
|
||||||
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
|
||||||
[--enable-hard-errors={yes|no}] [--]
|
|
||||||
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
|
||||||
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
|
||||||
END
|
|
||||||
}
|
|
||||||
|
|
||||||
test_name= # Used for reporting.
|
|
||||||
log_file= # Where to save the output of the test script.
|
|
||||||
trs_file= # Where to save the metadata of the test run.
|
|
||||||
expect_failure=no
|
|
||||||
color_tests=no
|
|
||||||
enable_hard_errors=yes
|
|
||||||
while test $# -gt 0; do
|
|
||||||
case $1 in
|
|
||||||
--help) print_usage; exit $?;;
|
|
||||||
--version) echo "test-driver $scriptversion"; exit $?;;
|
|
||||||
--test-name) test_name=$2; shift;;
|
|
||||||
--log-file) log_file=$2; shift;;
|
|
||||||
--trs-file) trs_file=$2; shift;;
|
|
||||||
--color-tests) color_tests=$2; shift;;
|
|
||||||
--expect-failure) expect_failure=$2; shift;;
|
|
||||||
--enable-hard-errors) enable_hard_errors=$2; shift;;
|
|
||||||
--) shift; break;;
|
|
||||||
-*) usage_error "invalid option: '$1'";;
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
missing_opts=
|
|
||||||
test x"$test_name" = x && missing_opts="$missing_opts --test-name"
|
|
||||||
test x"$log_file" = x && missing_opts="$missing_opts --log-file"
|
|
||||||
test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
|
|
||||||
if test x"$missing_opts" != x; then
|
|
||||||
usage_error "the following mandatory options are missing:$missing_opts"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
usage_error "missing argument"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $color_tests = yes; then
|
|
||||||
# Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
|
|
||||||
red='[0;31m' # Red.
|
|
||||||
grn='[0;32m' # Green.
|
|
||||||
lgn='[1;32m' # Light green.
|
|
||||||
blu='[1;34m' # Blue.
|
|
||||||
mgn='[0;35m' # Magenta.
|
|
||||||
std='[m' # No color.
|
|
||||||
else
|
|
||||||
red= grn= lgn= blu= mgn= std=
|
|
||||||
fi
|
|
||||||
|
|
||||||
do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
|
|
||||||
trap "st=129; $do_exit" 1
|
|
||||||
trap "st=130; $do_exit" 2
|
|
||||||
trap "st=141; $do_exit" 13
|
|
||||||
trap "st=143; $do_exit" 15
|
|
||||||
|
|
||||||
# Test script is run here.
|
|
||||||
"$@" >$log_file 2>&1
|
|
||||||
estatus=$?
|
|
||||||
|
|
||||||
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
|
||||||
tweaked_estatus=1
|
|
||||||
else
|
|
||||||
tweaked_estatus=$estatus
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $tweaked_estatus:$expect_failure in
|
|
||||||
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
|
||||||
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
|
||||||
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
|
||||||
99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
|
|
||||||
*:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
|
|
||||||
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Report the test outcome and exit status in the logs, so that one can
|
|
||||||
# know whether the test passed or failed simply by looking at the '.log'
|
|
||||||
# file, without the need of also peaking into the corresponding '.trs'
|
|
||||||
# file (automake bug#11814).
|
|
||||||
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
|
||||||
|
|
||||||
# Report outcome to console.
|
|
||||||
echo "${col}${res}${std}: $test_name"
|
|
||||||
|
|
||||||
# Register the test result, and other relevant metadata.
|
|
||||||
echo ":test-result: $res" > $trs_file
|
|
||||||
echo ":global-test-result: $res" >> $trs_file
|
|
||||||
echo ":recheck: $recheck" >> $trs_file
|
|
||||||
echo ":copy-in-global-log: $gcopy" >> $trs_file
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC0"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
55
deps/libbacktrace/test_format.c
vendored
55
deps/libbacktrace/test_format.c
vendored
@ -1,55 +0,0 @@
|
|||||||
/* test_format.c -- Test for libbacktrace library
|
|
||||||
Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* This program tests the externally visible interfaces of the
|
|
||||||
libbacktrace library. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
234
deps/libbacktrace/testlib.c
vendored
234
deps/libbacktrace/testlib.c
vendored
@ -1,234 +0,0 @@
|
|||||||
/* testlib.c -- test functions for libbacktrace library
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
/* The backtrace state. */
|
|
||||||
|
|
||||||
void *state;
|
|
||||||
|
|
||||||
/* The number of failures. */
|
|
||||||
|
|
||||||
int failures;
|
|
||||||
|
|
||||||
/* Return the base name in a path. */
|
|
||||||
|
|
||||||
const char *
|
|
||||||
base (const char *p)
|
|
||||||
{
|
|
||||||
const char *last;
|
|
||||||
const char *s;
|
|
||||||
|
|
||||||
last = NULL;
|
|
||||||
for (s = p; *s != '\0'; ++s)
|
|
||||||
{
|
|
||||||
if (IS_DIR_SEPARATOR (*s))
|
|
||||||
last = s + 1;
|
|
||||||
}
|
|
||||||
return last != NULL ? last : p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check an entry in a struct info array. */
|
|
||||||
|
|
||||||
void
|
|
||||||
check (const char *name, int index, const struct info *all, int want_lineno,
|
|
||||||
const char *want_function, const char *want_file, int *failed)
|
|
||||||
{
|
|
||||||
if (*failed)
|
|
||||||
return;
|
|
||||||
if (all[index].filename == NULL || all[index].function == NULL)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s: [%d]: missing file name or function name\n",
|
|
||||||
name, index);
|
|
||||||
*failed = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (strcmp (base (all[index].filename), want_file) != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
|
|
||||||
all[index].filename, want_file);
|
|
||||||
*failed = 1;
|
|
||||||
}
|
|
||||||
if (all[index].lineno != want_lineno)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
|
|
||||||
all[index].lineno, want_lineno);
|
|
||||||
*failed = 1;
|
|
||||||
}
|
|
||||||
if (strcmp (all[index].function, want_function) != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
|
|
||||||
all[index].function, want_function);
|
|
||||||
*failed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The backtrace callback function. */
|
|
||||||
|
|
||||||
int
|
|
||||||
callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
|
|
||||||
const char *filename, int lineno, const char *function)
|
|
||||||
{
|
|
||||||
struct bdata *data = (struct bdata *) vdata;
|
|
||||||
struct info *p;
|
|
||||||
|
|
||||||
if (data->index >= data->max)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "callback_one: callback called too many times\n");
|
|
||||||
data->failed = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = &data->all[data->index];
|
|
||||||
if (filename == NULL)
|
|
||||||
p->filename = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
p->filename = strdup (filename);
|
|
||||||
assert (p->filename != NULL);
|
|
||||||
}
|
|
||||||
p->lineno = lineno;
|
|
||||||
if (function == NULL)
|
|
||||||
p->function = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
p->function = strdup (function);
|
|
||||||
assert (p->function != NULL);
|
|
||||||
}
|
|
||||||
++data->index;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An error callback passed to backtrace. */
|
|
||||||
|
|
||||||
void
|
|
||||||
error_callback_one (void *vdata, const char *msg, int errnum)
|
|
||||||
{
|
|
||||||
struct bdata *data = (struct bdata *) vdata;
|
|
||||||
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
data->failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The backtrace_simple callback function. */
|
|
||||||
|
|
||||||
int
|
|
||||||
callback_two (void *vdata, uintptr_t pc)
|
|
||||||
{
|
|
||||||
struct sdata *data = (struct sdata *) vdata;
|
|
||||||
|
|
||||||
if (data->index >= data->max)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "callback_two: callback called too many times\n");
|
|
||||||
data->failed = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->addrs[data->index] = pc;
|
|
||||||
++data->index;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An error callback passed to backtrace_simple. */
|
|
||||||
|
|
||||||
void
|
|
||||||
error_callback_two (void *vdata, const char *msg, int errnum)
|
|
||||||
{
|
|
||||||
struct sdata *data = (struct sdata *) vdata;
|
|
||||||
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
data->failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The backtrace_syminfo callback function. */
|
|
||||||
|
|
||||||
void
|
|
||||||
callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
|
|
||||||
const char *symname, uintptr_t symval,
|
|
||||||
uintptr_t symsize)
|
|
||||||
{
|
|
||||||
struct symdata *data = (struct symdata *) vdata;
|
|
||||||
|
|
||||||
if (symname == NULL)
|
|
||||||
data->name = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data->name = strdup (symname);
|
|
||||||
assert (data->name != NULL);
|
|
||||||
}
|
|
||||||
data->val = symval;
|
|
||||||
data->size = symsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The backtrace_syminfo error callback function. */
|
|
||||||
|
|
||||||
void
|
|
||||||
error_callback_three (void *vdata, const char *msg, int errnum)
|
|
||||||
{
|
|
||||||
struct symdata *data = (struct symdata *) vdata;
|
|
||||||
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
data->failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The backtrace_create_state error callback function. */
|
|
||||||
|
|
||||||
void
|
|
||||||
error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
|
|
||||||
int errnum)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
110
deps/libbacktrace/testlib.h
vendored
110
deps/libbacktrace/testlib.h
vendored
@ -1,110 +0,0 @@
|
|||||||
/* testlib.h -- Header for test functions for libbacktrace library
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#ifndef LIBBACKTRACE_TESTLIB_H
|
|
||||||
#define LIBBACKTRACE_TESTLIB_H
|
|
||||||
|
|
||||||
/* Portable attribute syntax. Actually some of these tests probably
|
|
||||||
won't work if the attributes are not recognized. */
|
|
||||||
|
|
||||||
#ifndef GCC_VERSION
|
|
||||||
# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (GCC_VERSION < 2007)
|
|
||||||
# define __attribute__(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_UNUSED
|
|
||||||
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Used to collect backtrace info. */
|
|
||||||
|
|
||||||
struct info
|
|
||||||
{
|
|
||||||
char *filename;
|
|
||||||
int lineno;
|
|
||||||
char *function;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Passed to backtrace callback function. */
|
|
||||||
|
|
||||||
struct bdata
|
|
||||||
{
|
|
||||||
struct info *all;
|
|
||||||
size_t index;
|
|
||||||
size_t max;
|
|
||||||
int failed;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Passed to backtrace_simple callback function. */
|
|
||||||
|
|
||||||
struct sdata
|
|
||||||
{
|
|
||||||
uintptr_t *addrs;
|
|
||||||
size_t index;
|
|
||||||
size_t max;
|
|
||||||
int failed;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Passed to backtrace_syminfo callback function. */
|
|
||||||
|
|
||||||
struct symdata
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
uintptr_t val, size;
|
|
||||||
int failed;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The backtrace state. */
|
|
||||||
|
|
||||||
extern void *state;
|
|
||||||
|
|
||||||
/* The number of failures. */
|
|
||||||
|
|
||||||
extern int failures;
|
|
||||||
|
|
||||||
extern const char *base (const char *p);
|
|
||||||
extern void check (const char *name, int index, const struct info *all,
|
|
||||||
int want_lineno, const char *want_function,
|
|
||||||
const char *want_file, int *failed);
|
|
||||||
extern int callback_one (void *, uintptr_t, const char *, int, const char *);
|
|
||||||
extern void error_callback_one (void *, const char *, int);
|
|
||||||
extern int callback_two (void *, uintptr_t);
|
|
||||||
extern void error_callback_two (void *, const char *, int);
|
|
||||||
extern void callback_three (void *, uintptr_t, const char *, uintptr_t,
|
|
||||||
uintptr_t);
|
|
||||||
extern void error_callback_three (void *, const char *, int);
|
|
||||||
extern void error_callback_create (void *, const char *, int);
|
|
||||||
|
|
||||||
#endif /* !defined(LIBBACKTRACE_TESTLIB_H) */
|
|
161
deps/libbacktrace/ttest.c
vendored
161
deps/libbacktrace/ttest.c
vendored
@ -1,161 +0,0 @@
|
|||||||
/* ttest.c -- Test for libbacktrace library
|
|
||||||
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* Test using the libbacktrace library from multiple threads. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
static int f2 (int) __attribute__ ((noinline));
|
|
||||||
static int f3 (int, int) __attribute__ ((noinline));
|
|
||||||
|
|
||||||
/* Test that a simple backtrace works. This is called via
|
|
||||||
pthread_create. It returns the number of failures, as void *. */
|
|
||||||
|
|
||||||
static void *
|
|
||||||
test1_thread (void *arg ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
/* Returning a value here and elsewhere avoids a tailcall which
|
|
||||||
would mess up the backtrace. */
|
|
||||||
return (void *) (uintptr_t) (f2 (__LINE__) - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f2 (int f1line)
|
|
||||||
{
|
|
||||||
return f3 (f1line, __LINE__) + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
f3 (int f1line, int f2line)
|
|
||||||
{
|
|
||||||
struct info all[20];
|
|
||||||
struct bdata data;
|
|
||||||
int f3line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
data.all = &all[0];
|
|
||||||
data.index = 0;
|
|
||||||
data.max = 20;
|
|
||||||
data.failed = 0;
|
|
||||||
|
|
||||||
f3line = __LINE__ + 1;
|
|
||||||
i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
|
|
||||||
|
|
||||||
if (i != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test1: unexpected return value %d\n", i);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.index < 3)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test1: not enough frames; got %zu, expected at least 3\n",
|
|
||||||
data.index);
|
|
||||||
data.failed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
check ("test1", 0, all, f3line, "f3", "ttest.c", &data.failed);
|
|
||||||
check ("test1", 1, all, f2line, "f2", "ttest.c", &data.failed);
|
|
||||||
check ("test1", 2, all, f1line, "test1_thread", "ttest.c", &data.failed);
|
|
||||||
|
|
||||||
return data.failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run the test with 10 threads simultaneously. */
|
|
||||||
|
|
||||||
#define THREAD_COUNT 10
|
|
||||||
|
|
||||||
static void test1 (void) __attribute__ ((unused));
|
|
||||||
|
|
||||||
static void
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
pthread_t atid[THREAD_COUNT];
|
|
||||||
int i;
|
|
||||||
int errnum;
|
|
||||||
int this_fail;
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
for (i = 0; i < THREAD_COUNT; i++)
|
|
||||||
{
|
|
||||||
errnum = pthread_create (&atid[i], NULL, test1_thread, NULL);
|
|
||||||
if (errnum != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "pthread_create %d: %s\n", i, strerror (errnum));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this_fail = 0;
|
|
||||||
for (i = 0; i < THREAD_COUNT; i++)
|
|
||||||
{
|
|
||||||
errnum = pthread_join (atid[i], &ret);
|
|
||||||
if (errnum != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "pthread_join %d: %s\n", i, strerror (errnum));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
this_fail += (int) (uintptr_t) ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("%s: threaded backtrace_full noinline\n", this_fail > 0 ? "FAIL" : "PASS");
|
|
||||||
|
|
||||||
failures += this_fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
#if BACKTRACE_SUPPORTED
|
|
||||||
#if BACKTRACE_SUPPORTS_THREADS
|
|
||||||
test1 ();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
92
deps/libbacktrace/unittest.c
vendored
92
deps/libbacktrace/unittest.c
vendored
@ -1,92 +0,0 @@
|
|||||||
/* unittest.c -- Test for libbacktrace library
|
|
||||||
Copyright (C) 2018-2021 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "filenames.h"
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
static unsigned count;
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback (void *vdata ATTRIBUTE_UNUSED, const char *msg ATTRIBUTE_UNUSED,
|
|
||||||
int errnum ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
test1 (void)
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
int failed;
|
|
||||||
|
|
||||||
struct backtrace_vector vec;
|
|
||||||
|
|
||||||
memset (&vec, 0, sizeof vec);
|
|
||||||
|
|
||||||
backtrace_vector_grow (state, 100, error_callback, NULL, &vec);
|
|
||||||
vec.alc += vec.size;
|
|
||||||
vec.size = 0;
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
res = backtrace_vector_release (state, &vec, error_callback, NULL);
|
|
||||||
failed = res != 1 || count != 0 || vec.base != NULL;
|
|
||||||
|
|
||||||
printf ("%s: unittest backtrace_vector_release size == 0\n",
|
|
||||||
failed ? "FAIL": "PASS");
|
|
||||||
|
|
||||||
if (failed)
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
return failures;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
test1 ();
|
|
||||||
|
|
||||||
exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
65
deps/libbacktrace/unknown.c
vendored
65
deps/libbacktrace/unknown.c
vendored
@ -1,65 +0,0 @@
|
|||||||
/* unknown.c -- used when backtrace configury does not know file format.
|
|
||||||
Copyright (C) 2012-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
/* A trivial routine that always fails to find fileline data. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
unknown_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
uintptr_t pc, backtrace_full_callback callback,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data)
|
|
||||||
|
|
||||||
{
|
|
||||||
return callback (data, pc, NULL, 0, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the backtrace data when we don't know how to read the
|
|
||||||
debug info. */
|
|
||||||
|
|
||||||
int
|
|
||||||
backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
|
||||||
const char *filename ATTRIBUTE_UNUSED,
|
|
||||||
int descriptor ATTRIBUTE_UNUSED,
|
|
||||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
|
||||||
void *data ATTRIBUTE_UNUSED, fileline *fileline_fn)
|
|
||||||
{
|
|
||||||
state->fileline_data = NULL;
|
|
||||||
*fileline_fn = unknown_fileline;
|
|
||||||
return 1;
|
|
||||||
}
|
|
1606
deps/libbacktrace/xcoff.c
vendored
1606
deps/libbacktrace/xcoff.c
vendored
File diff suppressed because it is too large
Load Diff
508
deps/libbacktrace/xztest.c
vendored
508
deps/libbacktrace/xztest.c
vendored
@ -1,508 +0,0 @@
|
|||||||
/* xztest.c -- Test for libbacktrace LZMA decoder.
|
|
||||||
Copyright (C) 2020-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLZMA
|
|
||||||
#include <lzma.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_CLOCK_GETTIME
|
|
||||||
|
|
||||||
typedef int xclockid_t;
|
|
||||||
|
|
||||||
static int
|
|
||||||
xclock_gettime (xclockid_t id ATTRIBUTE_UNUSED,
|
|
||||||
struct timespec *ts ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define clockid_t xclockid_t
|
|
||||||
#define clock_gettime xclock_gettime
|
|
||||||
#undef CLOCK_REALTIME
|
|
||||||
#define CLOCK_REALTIME 0
|
|
||||||
|
|
||||||
#endif /* !defined(HAVE_CLOCK_GETTIME) */
|
|
||||||
|
|
||||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#define LIBLZMA_CLOCK_GETTIME_ARG CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#else
|
|
||||||
#define LIBLZMA_CLOCK_GETTIME_ARG CLOCK_REALTIME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Some tests for the local lzma inflation code. */
|
|
||||||
|
|
||||||
struct lzma_test
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
const char *compressed;
|
|
||||||
size_t compressed_len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Error callback. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback_compress (void *vdata ATTRIBUTE_UNUSED, const char *msg,
|
|
||||||
int errnum)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct lzma_test tests[] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
"empty",
|
|
||||||
"",
|
|
||||||
0,
|
|
||||||
("\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x00\x00\x00\x00"
|
|
||||||
"\x1c\xdf\x44\x21\x1f\xb6\xf3\x7d\x01\x00\x00\x00\x00\x04\x59\x5a"),
|
|
||||||
32,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hello",
|
|
||||||
"hello, world\n",
|
|
||||||
0,
|
|
||||||
("\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21\x01"
|
|
||||||
"\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x0c\x68\x65\x6c\x6c\x6f"
|
|
||||||
"\x2c\x20\x77\x6f\x72\x6c\x64\x0a\x00\x00\x00\x00\x7b\x46\x5a\x81"
|
|
||||||
"\xc9\x12\xb8\xea\x00\x01\x25\x0d\x71\x19\xc4\xb6\x1f\xb6\xf3\x7d"
|
|
||||||
"\x01\x00\x00\x00\x00\x04\x59\x5a"),
|
|
||||||
72,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"goodbye",
|
|
||||||
"goodbye, world",
|
|
||||||
0,
|
|
||||||
("\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21\x01"
|
|
||||||
"\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x0d\x67\x6f\x6f\x64\x62"
|
|
||||||
"\x79\x65\x2c\x20\x77\x6f\x72\x6c\x64\x00\x00\x00\xf6\xf8\xa3\x33"
|
|
||||||
"\x8c\x4e\xc9\x68\x00\x01\x26\x0e\x08\x1b\xe0\x04\x1f\xb6\xf3\x7d"
|
|
||||||
"\x01\x00\x00\x00\x00\x04\x59\x5a"),
|
|
||||||
72,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Test the hand coded samples. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_samples (struct backtrace_state *state)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof tests / sizeof tests[0]; ++i)
|
|
||||||
{
|
|
||||||
unsigned char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
|
|
||||||
uncompressed = NULL;
|
|
||||||
uncompressed_len = 0;
|
|
||||||
if (!backtrace_uncompress_lzma (state,
|
|
||||||
((const unsigned char *)
|
|
||||||
tests[i].compressed),
|
|
||||||
tests[i].compressed_len,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed, &uncompressed_len))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t v;
|
|
||||||
|
|
||||||
v = tests[i].uncompressed_len;
|
|
||||||
if (v == 0)
|
|
||||||
v = strlen (tests[i].uncompressed);
|
|
||||||
if (uncompressed_len != v)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test %s: got uncompressed length %zu, want %zu\n",
|
|
||||||
tests[i].name, uncompressed_len, v);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else if (memcmp (tests[i].uncompressed, uncompressed, v) != 0)
|
|
||||||
{
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
fprintf (stderr, "test %s: uncompressed data mismatch\n",
|
|
||||||
tests[i].name);
|
|
||||||
for (j = 0; j < v; ++j)
|
|
||||||
if (tests[i].uncompressed[j] != uncompressed[j])
|
|
||||||
fprintf (stderr, " %zu: got %#x want %#x\n", j,
|
|
||||||
uncompressed[j], tests[i].uncompressed[j]);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf ("PASS: lzma %s\n", tests[i].name);
|
|
||||||
|
|
||||||
backtrace_free (state, uncompressed, uncompressed_len,
|
|
||||||
error_callback_compress, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_LIBLZMA
|
|
||||||
|
|
||||||
/* Given a set of TRIALS timings, discard the lowest and highest
|
|
||||||
values and return the mean average of the rest. */
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
average_time (const size_t *times, size_t trials)
|
|
||||||
{
|
|
||||||
size_t imax;
|
|
||||||
size_t max;
|
|
||||||
size_t imin;
|
|
||||||
size_t min;
|
|
||||||
size_t i;
|
|
||||||
size_t sum;
|
|
||||||
|
|
||||||
imin = 0;
|
|
||||||
imax = 0;
|
|
||||||
min = times[0];
|
|
||||||
max = times[0];
|
|
||||||
for (i = 1; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (times[i] < min)
|
|
||||||
{
|
|
||||||
imin = i;
|
|
||||||
min = times[i];
|
|
||||||
}
|
|
||||||
if (times[i] > max)
|
|
||||||
{
|
|
||||||
imax = i;
|
|
||||||
max = times[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (i != imax && i != imin)
|
|
||||||
sum += times[i];
|
|
||||||
}
|
|
||||||
return sum / (trials - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Test a larger text, if available. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_large (struct backtrace_state *state ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
#if HAVE_LIBLZMA
|
|
||||||
unsigned char *orig_buf;
|
|
||||||
size_t orig_bufsize;
|
|
||||||
size_t i;
|
|
||||||
lzma_stream initial_stream = LZMA_STREAM_INIT;
|
|
||||||
lzma_stream stream;
|
|
||||||
unsigned char *compressed_buf;
|
|
||||||
size_t compressed_bufsize;
|
|
||||||
unsigned char *uncompressed_buf;
|
|
||||||
size_t uncompressed_bufsize;
|
|
||||||
unsigned char *spare_buf;
|
|
||||||
int r;
|
|
||||||
clockid_t cid;
|
|
||||||
struct timespec ts1;
|
|
||||||
struct timespec ts2;
|
|
||||||
size_t ctime;
|
|
||||||
size_t ztime;
|
|
||||||
const size_t trials = 16;
|
|
||||||
size_t ctimes[16];
|
|
||||||
size_t ztimes[16];
|
|
||||||
static const char * const names[] = {
|
|
||||||
"Isaac.Newton-Opticks.txt",
|
|
||||||
"../libgo/go/testdata/Isaac.Newton-Opticks.txt",
|
|
||||||
};
|
|
||||||
|
|
||||||
orig_buf = NULL;
|
|
||||||
orig_bufsize = 0;
|
|
||||||
uncompressed_buf = NULL;
|
|
||||||
compressed_buf = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof names / sizeof names[0]; ++i)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
char *namebuf;
|
|
||||||
FILE *e;
|
|
||||||
struct stat st;
|
|
||||||
char *rbuf;
|
|
||||||
size_t got;
|
|
||||||
|
|
||||||
len = strlen (SRCDIR) + strlen (names[i]) + 2;
|
|
||||||
namebuf = malloc (len);
|
|
||||||
if (namebuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
snprintf (namebuf, len, "%s/%s", SRCDIR, names[i]);
|
|
||||||
e = fopen (namebuf, "r");
|
|
||||||
free (namebuf);
|
|
||||||
if (e == NULL)
|
|
||||||
continue;
|
|
||||||
if (fstat (fileno (e), &st) < 0)
|
|
||||||
{
|
|
||||||
perror ("fstat");
|
|
||||||
fclose (e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rbuf = malloc (st.st_size);
|
|
||||||
if (rbuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
got = fread (rbuf, 1, st.st_size, e);
|
|
||||||
fclose (e);
|
|
||||||
if (got > 0)
|
|
||||||
{
|
|
||||||
orig_buf = (unsigned char *) rbuf;
|
|
||||||
orig_bufsize = got;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free (rbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (orig_buf == NULL)
|
|
||||||
{
|
|
||||||
/* We couldn't find an input file. */
|
|
||||||
printf ("UNSUPPORTED: lzma large\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream = initial_stream;
|
|
||||||
r = lzma_easy_encoder (&stream, 6, LZMA_CHECK_CRC32);
|
|
||||||
if (r != LZMA_OK)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma_easy_encoder failed: %d\n", r);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
compressed_bufsize = orig_bufsize + 100;
|
|
||||||
compressed_buf = malloc (compressed_bufsize);
|
|
||||||
if (compressed_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.next_in = orig_buf;
|
|
||||||
stream.avail_in = orig_bufsize;
|
|
||||||
stream.next_out = compressed_buf;
|
|
||||||
stream.avail_out = compressed_bufsize;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
r = lzma_code (&stream, LZMA_FINISH);
|
|
||||||
if (r != LZMA_OK && r != LZMA_STREAM_END)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma_code failed: %d\n", r);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (r != LZMA_STREAM_END);
|
|
||||||
|
|
||||||
compressed_bufsize = stream.total_out;
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_lzma (state, (unsigned char *) compressed_buf,
|
|
||||||
compressed_bufsize,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed_buf, &uncompressed_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma large: backtrace_uncompress_lzma failed\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uncompressed_bufsize != orig_bufsize)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"lzma large: got uncompressed length %zu, want %zu\n",
|
|
||||||
uncompressed_bufsize, orig_bufsize);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memcmp (uncompressed_buf, orig_buf, uncompressed_bufsize) != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma large: uncompressed data mismatch\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("PASS: lzma large\n");
|
|
||||||
|
|
||||||
spare_buf = malloc (orig_bufsize);
|
|
||||||
if (spare_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
cid = LIBLZMA_CLOCK_GETTIME_ARG;
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
if (errno == EINVAL)
|
|
||||||
return;
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_lzma (state,
|
|
||||||
(unsigned char *) compressed_buf,
|
|
||||||
compressed_bufsize,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed_buf,
|
|
||||||
&uncompressed_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("lzma large: "
|
|
||||||
"benchmark backtrace_uncompress_lzma failed\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ctime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ctimes[i] = ctime;
|
|
||||||
|
|
||||||
stream = initial_stream;
|
|
||||||
|
|
||||||
r = lzma_auto_decoder (&stream, UINT64_MAX, 0);
|
|
||||||
if (r != LZMA_OK)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma_stream_decoder failed: %d\n", r);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.next_in = compressed_buf;
|
|
||||||
stream.avail_in = compressed_bufsize;
|
|
||||||
stream.next_out = spare_buf;
|
|
||||||
stream.avail_out = orig_bufsize;
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
perror("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
r = lzma_code (&stream, LZMA_FINISH);
|
|
||||||
if (r != LZMA_OK && r != LZMA_STREAM_END)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "lzma_code failed: %d\n", r);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (r != LZMA_STREAM_END);
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ztime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ztimes[i] = ztime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Toss the highest and lowest times and average the rest. */
|
|
||||||
ctime = average_time (ctimes, trials);
|
|
||||||
ztime = average_time (ztimes, trials);
|
|
||||||
|
|
||||||
printf ("backtrace: %zu ns\n", ctime);
|
|
||||||
printf ("liblzma : %zu ns\n", ztime);
|
|
||||||
printf ("ratio : %g\n", (double) ztime / (double) ctime);
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
printf ("FAIL: lzma large\n");
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
if (orig_buf != NULL)
|
|
||||||
free (orig_buf);
|
|
||||||
if (compressed_buf != NULL)
|
|
||||||
free (compressed_buf);
|
|
||||||
if (uncompressed_buf != NULL)
|
|
||||||
free (uncompressed_buf);
|
|
||||||
|
|
||||||
#else /* !HAVE_LIBLZMA */
|
|
||||||
|
|
||||||
printf ("UNSUPPORTED: lzma large\n");
|
|
||||||
|
|
||||||
#endif /* !HAVE_LIBLZMA */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
struct backtrace_state *state;
|
|
||||||
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
test_samples (state);
|
|
||||||
test_large (state);
|
|
||||||
|
|
||||||
exit (failures != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
523
deps/libbacktrace/zstdtest.c
vendored
523
deps/libbacktrace/zstdtest.c
vendored
@ -1,523 +0,0 @@
|
|||||||
/* ztest.c -- Test for libbacktrace zstd code.
|
|
||||||
Copyright (C) 2022 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_ZSTD
|
|
||||||
#include <zstd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_CLOCK_GETTIME
|
|
||||||
|
|
||||||
typedef int xclockid_t;
|
|
||||||
|
|
||||||
static int
|
|
||||||
xclock_gettime (xclockid_t id ATTRIBUTE_UNUSED,
|
|
||||||
struct timespec *ts ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define clockid_t xclockid_t
|
|
||||||
#define clock_gettime xclock_gettime
|
|
||||||
#undef CLOCK_REALTIME
|
|
||||||
#define CLOCK_REALTIME 0
|
|
||||||
|
|
||||||
#endif /* !defined(HAVE_CLOCK_GETTIME) */
|
|
||||||
|
|
||||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#define ZSTD_CLOCK_GETTIME_ARG CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#else
|
|
||||||
#define ZSTD_CLOCK_GETTIME_ARG CLOCK_REALTIME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Some tests for the local zstd inflation code. */
|
|
||||||
|
|
||||||
struct zstd_test
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
const char *compressed;
|
|
||||||
size_t compressed_len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Error callback. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback_compress (void *vdata ATTRIBUTE_UNUSED, const char *msg,
|
|
||||||
int errnum)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zstd_test tests[] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
"empty",
|
|
||||||
"",
|
|
||||||
0,
|
|
||||||
"\x28\xb5\x2f\xfd\x24\x00\x01\x00\x00\x99\xe9\xd8\x51",
|
|
||||||
13,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hello",
|
|
||||||
"hello, world\n",
|
|
||||||
0,
|
|
||||||
("\x28\xb5\x2f\xfd\x24\x0d\x69\x00\x00\x68\x65\x6c\x6c\x6f\x2c\x20"
|
|
||||||
"\x77\x6f\x72\x6c\x64\x0a\x4c\x1f\xf9\xf1"),
|
|
||||||
26,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"goodbye",
|
|
||||||
"goodbye, world",
|
|
||||||
0,
|
|
||||||
("\x28\xb5\x2f\xfd\x24\x0e\x71\x00\x00\x67\x6f\x6f\x64\x62\x79\x65"
|
|
||||||
"\x2c\x20\x77\x6f\x72\x6c\x64\x61\x7b\x4b\x83"),
|
|
||||||
27,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ranges",
|
|
||||||
("\xcc\x11\x00\x00\x00\x00\x00\x00\xd5\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x1c\x14\x00\x00\x00\x00\x00\x00\x72\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x0c\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x29\x14\x00\x00\x00\x00\x00\x00\x4e\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x67\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x5f\x0b\x00\x00\x00\x00\x00\x00\x6c\x0b\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7d\x0b\x00\x00\x00\x00\x00\x00\x7e\x0c\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x38\x0f\x00\x00\x00\x00\x00\x00\x5c\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x83\x0c\x00\x00\x00\x00\x00\x00\xfa\x0c\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xef\x0e\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x14\x0f\x00\x00\x00\x00\x00\x00\x38\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xd8\x0e\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfa\x0c\x00\x00\x00\x00\x00\x00\xea\x0d\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xef\x0e\x00\x00\x00\x00\x00\x00\x14\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x5c\x0f\x00\x00\x00\x00\x00\x00\x9f\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xac\x0f\x00\x00\x00\x00\x00\x00\xdb\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xff\x0f\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x60\x11\x00\x00\x00\x00\x00\x00\xd1\x16\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x40\x0b\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
|
|
||||||
672,
|
|
||||||
("\x28\xb5\x2f\xfd\x64\xa0\x01\x2d\x05\x00\xc4\x04\xcc\x11\x00\xd5"
|
|
||||||
"\x13\x00\x1c\x14\x00\x72\x9d\xd5\xfb\x12\x00\x09\x0c\x13\xcb\x13"
|
|
||||||
"\x29\x4e\x67\x5f\x0b\x6c\x0b\x7d\x0b\x7e\x0c\x38\x0f\x5c\x0f\x83"
|
|
||||||
"\x0c\xfa\x0c\xfd\x0d\xef\x0e\x14\x38\x9f\x0f\xac\x0f\xdb\x0f\xff"
|
|
||||||
"\x0f\xd8\x9f\xac\xdb\xff\xea\x5c\x2c\x10\x60\xd1\x16\x40\x0b\x7a"
|
|
||||||
"\x00\xb6\x00\x9f\x01\xa7\x01\xa9\x36\x20\xa0\x83\x14\x34\x63\x4a"
|
|
||||||
"\x21\x70\x8c\x07\x46\x03\x4e\x10\x62\x3c\x06\x4e\xc8\x8c\xb0\x32"
|
|
||||||
"\x2a\x59\xad\xb2\xf1\x02\x82\x7c\x33\xcb\x92\x6f\x32\x4f\x9b\xb0"
|
|
||||||
"\xa2\x30\xf0\xc0\x06\x1e\x98\x99\x2c\x06\x1e\xd8\xc0\x03\x56\xd8"
|
|
||||||
"\xc0\x03\x0f\x6c\xe0\x01\xf1\xf0\xee\x9a\xc6\xc8\x97\x99\xd1\x6c"
|
|
||||||
"\xb4\x21\x45\x3b\x10\xe4\x7b\x99\x4d\x8a\x36\x64\x5c\x77\x08\x02"
|
|
||||||
"\xcb\xe0\xce"),
|
|
||||||
179,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Test the hand coded samples. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_samples (struct backtrace_state *state)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof tests / sizeof tests[0]; ++i)
|
|
||||||
{
|
|
||||||
unsigned char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
|
|
||||||
uncompressed_len = tests[i].uncompressed_len;
|
|
||||||
if (uncompressed_len == 0)
|
|
||||||
uncompressed_len = strlen (tests[i].uncompressed);
|
|
||||||
|
|
||||||
uncompressed = (unsigned char *) malloc (uncompressed_len);
|
|
||||||
if (uncompressed == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
|
|
||||||
++failures;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_zstd (state,
|
|
||||||
((const unsigned char *)
|
|
||||||
tests[i].compressed),
|
|
||||||
tests[i].compressed_len,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
uncompressed, uncompressed_len))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (memcmp (tests[i].uncompressed, uncompressed, uncompressed_len)
|
|
||||||
!= 0)
|
|
||||||
{
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
fprintf (stderr, "test %s: uncompressed data mismatch\n",
|
|
||||||
tests[i].name);
|
|
||||||
for (j = 0; j < uncompressed_len; ++j)
|
|
||||||
if (tests[i].uncompressed[j] != uncompressed[j])
|
|
||||||
fprintf (stderr, " %zu: got %#x want %#x\n", j,
|
|
||||||
uncompressed[j], tests[i].uncompressed[j]);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf ("PASS: uncompress %s\n", tests[i].name);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (uncompressed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_ZSTD
|
|
||||||
|
|
||||||
/* Given a set of TRIALS timings, discard the lowest and highest
|
|
||||||
values and return the mean average of the rest. */
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
average_time (const size_t *times, size_t trials)
|
|
||||||
{
|
|
||||||
size_t imax;
|
|
||||||
size_t max;
|
|
||||||
size_t imin;
|
|
||||||
size_t min;
|
|
||||||
size_t i;
|
|
||||||
size_t sum;
|
|
||||||
|
|
||||||
imin = 0;
|
|
||||||
imax = 0;
|
|
||||||
min = times[0];
|
|
||||||
max = times[0];
|
|
||||||
for (i = 1; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (times[i] < min)
|
|
||||||
{
|
|
||||||
imin = i;
|
|
||||||
min = times[i];
|
|
||||||
}
|
|
||||||
if (times[i] > max)
|
|
||||||
{
|
|
||||||
imax = i;
|
|
||||||
max = times[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (i != imax && i != imin)
|
|
||||||
sum += times[i];
|
|
||||||
}
|
|
||||||
return sum / (trials - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Test a larger text, if available. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_large (struct backtrace_state *state ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_ZSTD
|
|
||||||
unsigned char *orig_buf;
|
|
||||||
size_t orig_bufsize;
|
|
||||||
size_t i;
|
|
||||||
char *compressed_buf;
|
|
||||||
size_t compressed_bufsize;
|
|
||||||
size_t compressed_size;
|
|
||||||
unsigned char *uncompressed_buf;
|
|
||||||
size_t r;
|
|
||||||
clockid_t cid;
|
|
||||||
struct timespec ts1;
|
|
||||||
struct timespec ts2;
|
|
||||||
size_t ctime;
|
|
||||||
size_t ztime;
|
|
||||||
const size_t trials = 16;
|
|
||||||
size_t ctimes[16];
|
|
||||||
size_t ztimes[16];
|
|
||||||
static const char * const names[] = {
|
|
||||||
"Isaac.Newton-Opticks.txt",
|
|
||||||
"../libgo/go/testdata/Isaac.Newton-Opticks.txt",
|
|
||||||
};
|
|
||||||
|
|
||||||
orig_buf = NULL;
|
|
||||||
orig_bufsize = 0;
|
|
||||||
uncompressed_buf = NULL;
|
|
||||||
compressed_buf = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof names / sizeof names[0]; ++i)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
char *namebuf;
|
|
||||||
FILE *e;
|
|
||||||
struct stat st;
|
|
||||||
char *rbuf;
|
|
||||||
size_t got;
|
|
||||||
|
|
||||||
len = strlen (SRCDIR) + strlen (names[i]) + 2;
|
|
||||||
namebuf = malloc (len);
|
|
||||||
if (namebuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
snprintf (namebuf, len, "%s/%s", SRCDIR, names[i]);
|
|
||||||
e = fopen (namebuf, "r");
|
|
||||||
free (namebuf);
|
|
||||||
if (e == NULL)
|
|
||||||
continue;
|
|
||||||
if (fstat (fileno (e), &st) < 0)
|
|
||||||
{
|
|
||||||
perror ("fstat");
|
|
||||||
fclose (e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rbuf = malloc (st.st_size);
|
|
||||||
if (rbuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
got = fread (rbuf, 1, st.st_size, e);
|
|
||||||
fclose (e);
|
|
||||||
if (got > 0)
|
|
||||||
{
|
|
||||||
orig_buf = (unsigned char *) rbuf;
|
|
||||||
orig_bufsize = got;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free (rbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (orig_buf == NULL)
|
|
||||||
{
|
|
||||||
/* We couldn't find an input file. */
|
|
||||||
printf ("UNSUPPORTED: zstd large\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
compressed_bufsize = ZSTD_compressBound (orig_bufsize);
|
|
||||||
compressed_buf = malloc (compressed_bufsize);
|
|
||||||
if (compressed_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = ZSTD_compress (compressed_buf, compressed_bufsize,
|
|
||||||
orig_buf, orig_bufsize,
|
|
||||||
ZSTD_CLEVEL_DEFAULT);
|
|
||||||
if (ZSTD_isError (r))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "zstd compress failed: %s\n", ZSTD_getErrorName (r));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
compressed_size = r;
|
|
||||||
|
|
||||||
uncompressed_buf = malloc (orig_bufsize);
|
|
||||||
if (uncompressed_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_zstd (state, (unsigned char *) compressed_buf,
|
|
||||||
compressed_size,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
uncompressed_buf, orig_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "zstd large: backtrace_uncompress_zstd failed\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memcmp (uncompressed_buf, orig_buf, orig_bufsize) != 0)
|
|
||||||
{
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
fprintf (stderr, "zstd large: uncompressed data mismatch\n");
|
|
||||||
for (j = 0; j < orig_bufsize; ++j)
|
|
||||||
if (orig_buf[j] != uncompressed_buf[j])
|
|
||||||
fprintf (stderr, " %zu: got %#x want %#x\n", j,
|
|
||||||
uncompressed_buf[j], orig_buf[j]);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("PASS: zstd large\n");
|
|
||||||
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
cid = ZSTD_CLOCK_GETTIME_ARG;
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
if (errno == EINVAL)
|
|
||||||
return;
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_zstd (state,
|
|
||||||
(unsigned char *) compressed_buf,
|
|
||||||
compressed_size,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
uncompressed_buf,
|
|
||||||
orig_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("zstd large: "
|
|
||||||
"benchmark backtrace_uncompress_zstd failed\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ctime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ctimes[i] = ctime;
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
perror("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = ZSTD_decompress (uncompressed_buf, orig_bufsize,
|
|
||||||
compressed_buf, compressed_size);
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ZSTD_isError (r))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"zstd large: benchmark zlib uncompress failed: %s\n",
|
|
||||||
ZSTD_getErrorName (r));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ztime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ztimes[i] = ztime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Toss the highest and lowest times and average the rest. */
|
|
||||||
ctime = average_time (ctimes, trials);
|
|
||||||
ztime = average_time (ztimes, trials);
|
|
||||||
|
|
||||||
printf ("backtrace: %zu ns\n", ctime);
|
|
||||||
printf ("zstd : %zu ns\n", ztime);
|
|
||||||
printf ("ratio : %g\n", (double) ztime / (double) ctime);
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
printf ("FAIL: zstd large\n");
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
if (orig_buf != NULL)
|
|
||||||
free (orig_buf);
|
|
||||||
if (compressed_buf != NULL)
|
|
||||||
free (compressed_buf);
|
|
||||||
if (uncompressed_buf != NULL)
|
|
||||||
free (uncompressed_buf);
|
|
||||||
|
|
||||||
#else /* !HAVE_ZSTD */
|
|
||||||
|
|
||||||
printf ("UNSUPPORTED: zstd large\n");
|
|
||||||
|
|
||||||
#endif /* !HAVE_ZSTD */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
struct backtrace_state *state;
|
|
||||||
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
test_samples (state);
|
|
||||||
test_large (state);
|
|
||||||
|
|
||||||
exit (failures != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
541
deps/libbacktrace/ztest.c
vendored
541
deps/libbacktrace/ztest.c
vendored
@ -1,541 +0,0 @@
|
|||||||
/* ztest.c -- Test for libbacktrace inflate code.
|
|
||||||
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
|
||||||
Written by Ian Lance Taylor, Google.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
(1) Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
(2) Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in
|
|
||||||
the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
(3) The name of the author may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
#include <zlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "backtrace.h"
|
|
||||||
#include "backtrace-supported.h"
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
#include "testlib.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_CLOCK_GETTIME
|
|
||||||
|
|
||||||
typedef int xclockid_t;
|
|
||||||
|
|
||||||
static int
|
|
||||||
xclock_gettime (xclockid_t id ATTRIBUTE_UNUSED,
|
|
||||||
struct timespec *ts ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define clockid_t xclockid_t
|
|
||||||
#define clock_gettime xclock_gettime
|
|
||||||
#undef CLOCK_REALTIME
|
|
||||||
#define CLOCK_REALTIME 0
|
|
||||||
|
|
||||||
#endif /* !defined(HAVE_CLOCK_GETTIME) */
|
|
||||||
|
|
||||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#define ZLIB_CLOCK_GETTIME_ARG CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#else
|
|
||||||
#define ZLIB_CLOCK_GETTIME_ARG CLOCK_REALTIME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Some tests for the local zlib inflation code. */
|
|
||||||
|
|
||||||
struct zlib_test
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
const char *compressed;
|
|
||||||
size_t compressed_len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Error callback. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
error_callback_compress (void *vdata ATTRIBUTE_UNUSED, const char *msg,
|
|
||||||
int errnum)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s", msg);
|
|
||||||
if (errnum > 0)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zlib_test tests[] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
"empty",
|
|
||||||
"",
|
|
||||||
0,
|
|
||||||
"\x78\x9c\x03\x00\x00\x00\x00\x01",
|
|
||||||
8,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"hello",
|
|
||||||
"hello, world\n",
|
|
||||||
0,
|
|
||||||
("\x78\x9c\xca\x48\xcd\xc9\xc9\xd7\x51\x28\xcf"
|
|
||||||
"\x2f\xca\x49\xe1\x02\x04\x00\x00\xff\xff\x21\xe7\x04\x93"),
|
|
||||||
25,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"goodbye",
|
|
||||||
"goodbye, world",
|
|
||||||
0,
|
|
||||||
("\x78\x9c\x4b\xcf\xcf\x4f\x49\xaa"
|
|
||||||
"\x4c\xd5\x51\x28\xcf\x2f\xca\x49"
|
|
||||||
"\x01\x00\x28\xa5\x05\x5e"),
|
|
||||||
22,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ranges",
|
|
||||||
("\xcc\x11\x00\x00\x00\x00\x00\x00\xd5\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x1c\x14\x00\x00\x00\x00\x00\x00\x72\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x0c\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x29\x14\x00\x00\x00\x00\x00\x00\x4e\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfb\x12\x00\x00\x00\x00\x00\x00\x09\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x67\x13\x00\x00\x00\x00\x00\x00\xcb\x13\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9d\x14\x00\x00\x00\x00\x00\x00\xd5\x14\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x5f\x0b\x00\x00\x00\x00\x00\x00\x6c\x0b\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7d\x0b\x00\x00\x00\x00\x00\x00\x7e\x0c\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x38\x0f\x00\x00\x00\x00\x00\x00\x5c\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x83\x0c\x00\x00\x00\x00\x00\x00\xfa\x0c\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xef\x0e\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x14\x0f\x00\x00\x00\x00\x00\x00\x38\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfd\x0d\x00\x00\x00\x00\x00\x00\xd8\x0e\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x0f\x00\x00\x00\x00\x00\x00\xac\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xdb\x0f\x00\x00\x00\x00\x00\x00\xff\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xfa\x0c\x00\x00\x00\x00\x00\x00\xea\x0d\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xef\x0e\x00\x00\x00\x00\x00\x00\x14\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x5c\x0f\x00\x00\x00\x00\x00\x00\x9f\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xac\x0f\x00\x00\x00\x00\x00\x00\xdb\x0f\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\xff\x0f\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x60\x11\x00\x00\x00\x00\x00\x00\xd1\x16\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x40\x0b\x00\x00\x00\x00\x00\x00\x2c\x10\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x7a\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x9f\x01\x00\x00\x00\x00\x00\x00\xa7\x01\x00\x00\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
|
|
||||||
672,
|
|
||||||
("\x78\x9c\x3b\x23\xc8\x00\x06\x57\x85\x21\xb4\x8c\x08\x84\x2e\x82"
|
|
||||||
"\xd2\x73\xa1\xf4\x55\x28\x8d\x0e\x7e\x0b\x41\x68\x4e\xa8\x7e\x1e"
|
|
||||||
"\x28\x7d\x1a\x4a\x6b\x42\xf5\xf9\x91\x69\x5e\x3a\x9a\x79\x84\xf4"
|
|
||||||
"\xc7\x73\x43\xe8\x1c\x28\x5d\x0b\xa5\xeb\x78\x20\xb4\x05\x3f\x84"
|
|
||||||
"\x8e\xe1\xc7\xae\xbf\x19\xaa\xee\x17\x94\xfe\xcb\x0b\xa1\xdf\xf3"
|
|
||||||
"\x41\x68\x11\x7e\x54\x73\xe6\x43\xe9\x35\x50\xfa\x36\x94\xfe\x8f"
|
|
||||||
"\xc3\x7c\x98\x79\x37\xf8\xc8\xd3\x0f\x73\xd7\x2b\x1c\xee\x8a\x21"
|
|
||||||
"\xd2\x5d\x3a\x02\xd8\xcd\x4f\x80\xa6\x87\x8b\x62\x10\xda\x81\x1b"
|
|
||||||
"\xbf\xfa\x2a\x28\xbd\x0d\x4a\xcf\x67\x84\xd0\xcb\x19\xf1\xab\x5f"
|
|
||||||
"\x49\xa4\x7a\x00\x48\x97\x29\xd4"),
|
|
||||||
152,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Test the hand coded samples. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_samples (struct backtrace_state *state)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof tests / sizeof tests[0]; ++i)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
size_t v;
|
|
||||||
size_t j;
|
|
||||||
unsigned char *uncompressed;
|
|
||||||
size_t uncompressed_len;
|
|
||||||
|
|
||||||
p = malloc (12 + tests[i].compressed_len);
|
|
||||||
memcpy (p, "ZLIB", 4);
|
|
||||||
v = tests[i].uncompressed_len;
|
|
||||||
if (v == 0)
|
|
||||||
v = strlen (tests[i].uncompressed);
|
|
||||||
for (j = 0; j < 8; ++j)
|
|
||||||
p[j + 4] = (v >> ((7 - j) * 8)) & 0xff;
|
|
||||||
memcpy (p + 12, tests[i].compressed, tests[i].compressed_len);
|
|
||||||
uncompressed = NULL;
|
|
||||||
uncompressed_len = 0;
|
|
||||||
if (!backtrace_uncompress_zdebug (state, (unsigned char *) p,
|
|
||||||
tests[i].compressed_len + 12,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed, &uncompressed_len))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "test %s: uncompress failed\n", tests[i].name);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (uncompressed_len != v)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"test %s: got uncompressed length %zu, want %zu\n",
|
|
||||||
tests[i].name, uncompressed_len, v);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else if (memcmp (tests[i].uncompressed, uncompressed, v) != 0)
|
|
||||||
{
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
fprintf (stderr, "test %s: uncompressed data mismatch\n",
|
|
||||||
tests[i].name);
|
|
||||||
for (j = 0; j < v; ++j)
|
|
||||||
if (tests[i].uncompressed[j] != uncompressed[j])
|
|
||||||
fprintf (stderr, " %zu: got %#x want %#x\n", j,
|
|
||||||
uncompressed[j], tests[i].uncompressed[j]);
|
|
||||||
++failures;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf ("PASS: inflate %s\n", tests[i].name);
|
|
||||||
|
|
||||||
backtrace_free (state, uncompressed, uncompressed_len,
|
|
||||||
error_callback_compress, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
|
|
||||||
/* Given a set of TRIALS timings, discard the lowest and highest
|
|
||||||
values and return the mean average of the rest. */
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
average_time (const size_t *times, size_t trials)
|
|
||||||
{
|
|
||||||
size_t imax;
|
|
||||||
size_t max;
|
|
||||||
size_t imin;
|
|
||||||
size_t min;
|
|
||||||
size_t i;
|
|
||||||
size_t sum;
|
|
||||||
|
|
||||||
imin = 0;
|
|
||||||
imax = 0;
|
|
||||||
min = times[0];
|
|
||||||
max = times[0];
|
|
||||||
for (i = 1; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (times[i] < min)
|
|
||||||
{
|
|
||||||
imin = i;
|
|
||||||
min = times[i];
|
|
||||||
}
|
|
||||||
if (times[i] > max)
|
|
||||||
{
|
|
||||||
imax = i;
|
|
||||||
max = times[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
if (i != imax && i != imin)
|
|
||||||
sum += times[i];
|
|
||||||
}
|
|
||||||
return sum / (trials - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Test a larger text, if available. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
test_large (struct backtrace_state *state ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
unsigned char *orig_buf;
|
|
||||||
size_t orig_bufsize;
|
|
||||||
size_t i;
|
|
||||||
char *compressed_buf;
|
|
||||||
size_t compressed_bufsize;
|
|
||||||
unsigned long compress_sizearg;
|
|
||||||
unsigned char *uncompressed_buf;
|
|
||||||
size_t uncompressed_bufsize;
|
|
||||||
int r;
|
|
||||||
clockid_t cid;
|
|
||||||
struct timespec ts1;
|
|
||||||
struct timespec ts2;
|
|
||||||
size_t ctime;
|
|
||||||
size_t ztime;
|
|
||||||
const size_t trials = 16;
|
|
||||||
size_t ctimes[16];
|
|
||||||
size_t ztimes[16];
|
|
||||||
static const char * const names[] = {
|
|
||||||
"Isaac.Newton-Opticks.txt",
|
|
||||||
"../libgo/go/testdata/Isaac.Newton-Opticks.txt",
|
|
||||||
};
|
|
||||||
|
|
||||||
orig_buf = NULL;
|
|
||||||
orig_bufsize = 0;
|
|
||||||
uncompressed_buf = NULL;
|
|
||||||
compressed_buf = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof names / sizeof names[0]; ++i)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
char *namebuf;
|
|
||||||
FILE *e;
|
|
||||||
struct stat st;
|
|
||||||
char *rbuf;
|
|
||||||
size_t got;
|
|
||||||
|
|
||||||
len = strlen (SRCDIR) + strlen (names[i]) + 2;
|
|
||||||
namebuf = malloc (len);
|
|
||||||
if (namebuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
snprintf (namebuf, len, "%s/%s", SRCDIR, names[i]);
|
|
||||||
e = fopen (namebuf, "r");
|
|
||||||
free (namebuf);
|
|
||||||
if (e == NULL)
|
|
||||||
continue;
|
|
||||||
if (fstat (fileno (e), &st) < 0)
|
|
||||||
{
|
|
||||||
perror ("fstat");
|
|
||||||
fclose (e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rbuf = malloc (st.st_size);
|
|
||||||
if (rbuf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
got = fread (rbuf, 1, st.st_size, e);
|
|
||||||
fclose (e);
|
|
||||||
if (got > 0)
|
|
||||||
{
|
|
||||||
orig_buf = (unsigned char *) rbuf;
|
|
||||||
orig_bufsize = got;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free (rbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (orig_buf == NULL)
|
|
||||||
{
|
|
||||||
/* We couldn't find an input file. */
|
|
||||||
printf ("UNSUPPORTED: inflate large\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
compressed_bufsize = compressBound (orig_bufsize) + 12;
|
|
||||||
compressed_buf = malloc (compressed_bufsize);
|
|
||||||
if (compressed_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
compress_sizearg = compressed_bufsize - 12;
|
|
||||||
r = compress ((unsigned char *) compressed_buf + 12, &compress_sizearg,
|
|
||||||
orig_buf, orig_bufsize);
|
|
||||||
if (r != Z_OK)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "zlib compress failed: %d\n", r);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
compressed_bufsize = compress_sizearg + 12;
|
|
||||||
|
|
||||||
/* Prepare the header that our library expects. */
|
|
||||||
memcpy (compressed_buf, "ZLIB", 4);
|
|
||||||
for (i = 0; i < 8; ++i)
|
|
||||||
compressed_buf[i + 4] = (orig_bufsize >> ((7 - i) * 8)) & 0xff;
|
|
||||||
|
|
||||||
uncompressed_buf = malloc (orig_bufsize);
|
|
||||||
if (uncompressed_buf == NULL)
|
|
||||||
{
|
|
||||||
perror ("malloc");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
uncompressed_bufsize = orig_bufsize;
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_zdebug (state, (unsigned char *) compressed_buf,
|
|
||||||
compressed_bufsize,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed_buf, &uncompressed_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr, "inflate large: backtrace_uncompress_zdebug failed\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uncompressed_bufsize != orig_bufsize)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"inflate large: got uncompressed length %zu, want %zu\n",
|
|
||||||
uncompressed_bufsize, orig_bufsize);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memcmp (uncompressed_buf, orig_buf, uncompressed_bufsize) != 0)
|
|
||||||
{
|
|
||||||
fprintf (stderr, "inflate large: uncompressed data mismatch\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("PASS: inflate large\n");
|
|
||||||
|
|
||||||
for (i = 0; i < trials; ++i)
|
|
||||||
{
|
|
||||||
unsigned long uncompress_sizearg;
|
|
||||||
|
|
||||||
cid = ZLIB_CLOCK_GETTIME_ARG;
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
if (errno == EINVAL)
|
|
||||||
return;
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!backtrace_uncompress_zdebug (state,
|
|
||||||
(unsigned char *) compressed_buf,
|
|
||||||
compressed_bufsize,
|
|
||||||
error_callback_compress, NULL,
|
|
||||||
&uncompressed_buf,
|
|
||||||
&uncompressed_bufsize))
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
("inflate large: "
|
|
||||||
"benchmark backtrace_uncompress_zdebug failed\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ctime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ctimes[i] = ctime;
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts1) < 0)
|
|
||||||
{
|
|
||||||
perror("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uncompress_sizearg = uncompressed_bufsize;
|
|
||||||
r = uncompress ((unsigned char *) uncompressed_buf, &uncompress_sizearg,
|
|
||||||
(unsigned char *) compressed_buf + 12,
|
|
||||||
compressed_bufsize - 12);
|
|
||||||
|
|
||||||
if (clock_gettime (cid, &ts2) < 0)
|
|
||||||
{
|
|
||||||
perror ("clock_gettime");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r != Z_OK)
|
|
||||||
{
|
|
||||||
fprintf (stderr,
|
|
||||||
"inflate large: benchmark zlib uncompress failed: %d\n",
|
|
||||||
r);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ztime = (ts2.tv_sec - ts1.tv_sec) * 1000000000;
|
|
||||||
ztime += ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
ztimes[i] = ztime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Toss the highest and lowest times and average the rest. */
|
|
||||||
ctime = average_time (ctimes, trials);
|
|
||||||
ztime = average_time (ztimes, trials);
|
|
||||||
|
|
||||||
printf ("backtrace: %zu ns\n", ctime);
|
|
||||||
printf ("zlib : %zu ns\n", ztime);
|
|
||||||
printf ("ratio : %g\n", (double) ztime / (double) ctime);
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
printf ("FAIL: inflate large\n");
|
|
||||||
++failures;
|
|
||||||
|
|
||||||
if (orig_buf != NULL)
|
|
||||||
free (orig_buf);
|
|
||||||
if (compressed_buf != NULL)
|
|
||||||
free (compressed_buf);
|
|
||||||
if (uncompressed_buf != NULL)
|
|
||||||
free (uncompressed_buf);
|
|
||||||
|
|
||||||
#else /* !HAVE_ZLIB */
|
|
||||||
|
|
||||||
printf ("UNSUPPORTED: inflate large\n");
|
|
||||||
|
|
||||||
#endif /* !HAVE_ZLIB */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc ATTRIBUTE_UNUSED, char **argv)
|
|
||||||
{
|
|
||||||
struct backtrace_state *state;
|
|
||||||
|
|
||||||
state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
|
|
||||||
error_callback_create, NULL);
|
|
||||||
|
|
||||||
test_samples (state);
|
|
||||||
test_large (state);
|
|
||||||
|
|
||||||
exit (failures != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user