Compare commits
	
		
			21 Commits
		
	
	
		
			v0.2025.8
			...
			submodules
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e00f73e1d5 | |||
| 4c11667ebd | |||
| 658e7089be | |||
| 0965e90d7b | |||
| d1f87a8fb4 | |||
| 2b4265f9ee | |||
| 3bd827a9f7 | |||
| 474e39c9c3 | |||
| 0272382e0e | |||
| b1c8b51377 | |||
| 1a5acca5cf | |||
| 2d5417f7dc | |||
| 2a10d26215 | |||
| b8e5caba0d | |||
| a4b324127a | |||
| acae3e9562 | |||
| 4aa7424977 | |||
| 758f177617 | |||
| 9291de41d8 | |||
| 3603ce5ba6 | |||
| bff231751e | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -8,3 +8,7 @@ out | ||||
| *.swo | ||||
| *.swp | ||||
| .zsign_cache/ | ||||
|  | ||||
| deps/codemirror/cm6.js | ||||
| deps/prettier/standalone.mjs | ||||
| deps/lit | ||||
|   | ||||
							
								
								
									
										22
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| [submodule "deps/zlib"] | ||||
| 	path = deps/zlib | ||||
| 	url = https://github.com/madler/zlib.git | ||||
| 	branch = master | ||||
| [submodule "deps/libsodium"] | ||||
| 	path = deps/libsodium | ||||
| 	url = https://github.com/jedisct1/libsodium.git | ||||
| [submodule "deps/quickjs"] | ||||
| 	path = deps/quickjs | ||||
| 	url = https://github.com/bellard/quickjs.git | ||||
| [submodule "deps/crypt_blowfish"] | ||||
| 	path = deps/crypt_blowfish | ||||
| 	url = https://github.com/openwall/crypt_blowfish.git | ||||
| [submodule "deps/libbacktrace"] | ||||
| 	path = deps/libbacktrace | ||||
| 	url = https://github.com/ianlancetaylor/libbacktrace.git | ||||
| [submodule "deps/libuv"] | ||||
| 	path = deps/libuv | ||||
| 	url = https://github.com/libuv/libuv.git | ||||
| [submodule "deps/picohttpparser"] | ||||
| 	path = deps/picohttpparser | ||||
| 	url = https://github.com/h2o/picohttpparser.git | ||||
| @@ -8,14 +8,14 @@ VERSION_NUMBER := 0.0.17-wip | ||||
| VERSION_NAME := Please enjoy responsibly. | ||||
|  | ||||
| SQLITE_URL := https://www.sqlite.org/2024/sqlite-amalgamation-3450200.zip | ||||
| LIBUV_URL := https://dist.libuv.org/dist/v1.48.0/libuv-v1.48.0.tar.gz | ||||
|  | ||||
| PROJECT = tildefriends | ||||
| BUILD_DIR ?= out | ||||
| UNAME_S := $(shell uname -s) | ||||
| UNAME_M := $(shell uname -m) | ||||
|  | ||||
| ANDROID_SDK ?= ~/Android/Sdk | ||||
| #ANDROID_SDK ?= ~/Android/Sdk | ||||
| ANDROID_SDK ?= /nix/store/54n9xsbb8gxa719g0bs7ghp336pax6mq-androidsdk/libexec/android-sdk | ||||
|  | ||||
| ifeq ($(UNAME_M),x86_64) | ||||
| ifneq ($(UNAME_S),Haiku) | ||||
| @@ -685,6 +685,7 @@ out/res/drawable_icon.xml.flat: src/android/res/drawable/icon.xml | ||||
|  | ||||
| out/apk/res.apk out/gen/com/unprompted/tildefriends/R.java: out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat src/android/AndroidManifest.xml | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	mkdir -p out/apk | ||||
| 	@$(ANDROID_BUILD_TOOLS)/aapt2 link -I $(ANDROID_PLATFORM)/android.jar out/res/layout_activity_main.xml.flat out/res/drawable_icon.xml.flat --manifest src/android/AndroidManifest.xml -o out/apk/res.apk --java out/gen/ | ||||
|  | ||||
| JAVA_FILES := out/gen/com/unprompted/tildefriends/R.java $(wildcard src/android/com/unprompted/tildefriends/*.java) | ||||
| @@ -809,10 +810,6 @@ apklog: | ||||
| .PHONY: apklog | ||||
|  | ||||
| fetchdeps: | ||||
| 	@echo "[fetch] libuv" | ||||
| 	@test -f out/deps/libuv.tar.gz && test "$$(cat out/deps/libuv.txt 2>/dev/null)" = $(LIBUV_URL) || (mkdir -p out/deps/ && curl -q $(LIBUV_URL) -o out/deps/libuv.tar.gz) | ||||
| 	@test -d deps/libuv/ && test "$$(cat out/deps/libuv.txt 2>/dev/null)" = $(LIBUV_URL) || (rm -rf deps/libuv/ && mkdir -p deps/libuv/ && tar -C deps/libuv/ -m --strip=1 -xf out/deps/libuv.tar.gz) | ||||
| 	@echo -n $(LIBUV_URL) > out/deps/libuv.txt | ||||
| 	@echo "[fetch] sqlite" | ||||
| 	@test -f out/deps/sqlite.zip && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p out/deps/ && curl -q $(SQLITE_URL) -o out/deps/sqlite.zip) | ||||
| 	@test -d deps/sqlite/ && test "$$(cat out/deps/sqlite.txt 2>/dev/null)" = $(SQLITE_URL) || (mkdir -p deps/sqlite/ && unzip -qDjo -d deps/sqlite/ out/deps/sqlite.zip) | ||||
|   | ||||
							
								
								
									
										27
									
								
								android-sdk.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								android-sdk.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| with import <nixpkgs> {}; | ||||
| let | ||||
|   androidComposition = androidenv.composeAndroidPackages { | ||||
|     cmdLineToolsVersion = "9.0"; | ||||
|     toolsVersion = "26.1.1"; | ||||
|     platformToolsVersion = "34.0.5"; | ||||
|     buildToolsVersions = [ "34.0.0" ]; | ||||
|     includeEmulator = false; | ||||
|     #emulatorVersion = "30.3.4"; | ||||
|     platformVersions = [ "34" ]; | ||||
|     includeSources = false; | ||||
|     includeSystemImages = false; | ||||
|     #systemImageTypes = [ "google_apis_playstore" ]; | ||||
|     #abiVersions = [ "armeabi-v7a" "arm64-v8a" ]; | ||||
|     #cmakeVersions = [ "3.10.2" ]; | ||||
|     includeNDK = true; | ||||
|     ndkVersions = ["26.0.10792818"]; | ||||
|     useGoogleAPIs = false; | ||||
|     useGoogleTVAddOns = false; | ||||
|     #includeExtras = [ | ||||
|     #  "extras;google;gcm" | ||||
|     #]; | ||||
|   }; | ||||
| in | ||||
| androidComposition.androidsdk | ||||
|  | ||||
| # $ NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE=1 NIXPKGS_ALLOW_UNFREE=1 nix-build android-sdk.nix --impure | ||||
							
								
								
									
										36
									
								
								default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								default.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| with import <nixpkgs> {}; | ||||
| stdenv.mkDerivation rec { | ||||
|   pname = "tildefriends"; | ||||
|   version = "0.0.16"; | ||||
|  | ||||
|   src = fetchurl { | ||||
|     url = "https://dev.tildefriends.net/cory/${pname}/archive/v${version}.tar.gz"; | ||||
|     sha256 = "19iay794xxs3j3mhnpl4vwx65sflw5vvjaahp0jk85wlwlrc7ddw"; | ||||
|   }; | ||||
|  | ||||
|   nativeBuildInputs = [ | ||||
|     gnumake | ||||
|     openssl | ||||
|   ]; | ||||
|   # buildInputs = [  ] | ||||
|   #doCheck = true; | ||||
|  | ||||
|  | ||||
|   strictDeps = true; | ||||
|  | ||||
|   outputs = [ "out" ]; | ||||
|  | ||||
|   meta = with lib; { | ||||
|     #description = "A program that produces a familiar, friendly greeting"; | ||||
|     #longDescription = '' | ||||
|     #  GNU Hello is a program that prints "Hello, world!" when you run it. | ||||
|     #  It is fully customizable. | ||||
|     #''; | ||||
|     #homepage = "https://www.gnu.org/software/hello/manual/"; | ||||
|     #changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${version}"; | ||||
|  | ||||
|     license = licenses.gpl3Plus; | ||||
|     maintainers = [ maintainers.tasiaiso ]; | ||||
|     platforms = platforms.all; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										1
									
								
								deps/codemirror/cm6.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								deps/codemirror/cm6.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										18
									
								
								deps/codemirror_src/package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								deps/codemirror_src/package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -5,17 +5,17 @@ | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "dependencies": { | ||||
|         "@codemirror/lang-css": "^6.2.1", | ||||
|         "@codemirror/lang-html": "^6.4.8", | ||||
|         "@codemirror/lang-javascript": "^6.2.2", | ||||
|         "@codemirror/lang-json": "^6.0.1", | ||||
|         "@codemirror/theme-one-dark": "^6.1.2", | ||||
|         "@rollup/plugin-node-resolve": "^15.2.3", | ||||
|         "codemirror": "^6.0.1", | ||||
|         "rollup": "^4.13.0" | ||||
|         "@codemirror/lang-css": "6.2.1", | ||||
|         "@codemirror/lang-html": "6.4.8", | ||||
|         "@codemirror/lang-javascript": "6.2.2", | ||||
|         "@codemirror/lang-json": "6.0.1", | ||||
|         "@codemirror/theme-one-dark": "6.1.2", | ||||
|         "@rollup/plugin-node-resolve": "15.2.3", | ||||
|         "codemirror": "6.0.1", | ||||
|         "rollup": "4.13.0" | ||||
|       }, | ||||
|       "devDependencies": { | ||||
|         "@rollup/plugin-terser": "^0.4.4" | ||||
|         "@rollup/plugin-terser": "0.4.4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@codemirror/autocomplete": { | ||||
|   | ||||
							
								
								
									
										18
									
								
								deps/codemirror_src/package.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								deps/codemirror_src/package.json
									
									
									
									
										vendored
									
									
								
							| @@ -3,16 +3,16 @@ | ||||
|     "build": "rollup --config rollup.config.mjs --input editor.mjs" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@codemirror/lang-css": "^6.2.1", | ||||
|     "@codemirror/lang-html": "^6.4.8", | ||||
|     "@codemirror/lang-javascript": "^6.2.2", | ||||
|     "@codemirror/lang-json": "^6.0.1", | ||||
|     "@codemirror/theme-one-dark": "^6.1.2", | ||||
|     "@rollup/plugin-node-resolve": "^15.2.3", | ||||
|     "codemirror": "^6.0.1", | ||||
|     "rollup": "^4.13.0" | ||||
|     "@codemirror/lang-css": "6.2.1", | ||||
|     "@codemirror/lang-html": "6.4.8", | ||||
|     "@codemirror/lang-javascript": "6.2.2", | ||||
|     "@codemirror/lang-json": "6.0.1", | ||||
|     "@codemirror/theme-one-dark": "6.1.2", | ||||
|     "@rollup/plugin-node-resolve": "15.2.3", | ||||
|     "codemirror": "6.0.1", | ||||
|     "rollup": "4.13.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@rollup/plugin-terser": "^0.4.4" | ||||
|     "@rollup/plugin-terser": "0.4.4" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										1
									
								
								deps/crypt_blowfish
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								deps/crypt_blowfish
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule deps/crypt_blowfish added at 3354bb81ee
									
								
							
							
								
								
									
										29
									
								
								deps/crypt_blowfish/LINKS
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								deps/crypt_blowfish/LINKS
									
									
									
									
										vendored
									
									
								
							| @@ -1,29 +0,0 @@ | ||||
| New versions of this package (crypt_blowfish): | ||||
|  | ||||
| 	http://www.openwall.com/crypt/ | ||||
|  | ||||
| A paper on the algorithm that explains its design decisions: | ||||
|  | ||||
| 	http://www.usenix.org/events/usenix99/provos.html | ||||
|  | ||||
| Unix Seventh Edition Manual, Volume 2: the password scheme (1978): | ||||
|  | ||||
| 	http://plan9.bell-labs.com/7thEdMan/vol2/password | ||||
|  | ||||
| The Openwall GNU/*/Linux (Owl) tcb suite implementing the alternative | ||||
| password shadowing scheme.  This includes a PAM module which | ||||
| supersedes pam_unix and uses the password hashing framework provided | ||||
| with crypt_blowfish when setting new passwords. | ||||
|  | ||||
| 	http://www.openwall.com/tcb/ | ||||
|  | ||||
| pam_passwdqc, a password strength checking and policy enforcement | ||||
| module for PAM-aware password changing programs: | ||||
|  | ||||
| 	http://www.openwall.com/passwdqc/ | ||||
|  | ||||
| John the Ripper password cracker: | ||||
|  | ||||
| 	http://www.openwall.com/john/ | ||||
|  | ||||
| $Owl: Owl/packages/glibc/crypt_blowfish/LINKS,v 1.4 2005/11/16 13:09:47 solar Exp $ | ||||
							
								
								
									
										77
									
								
								deps/crypt_blowfish/Makefile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								deps/crypt_blowfish/Makefile
									
									
									
									
										vendored
									
									
								
							| @@ -1,77 +0,0 @@ | ||||
| # | ||||
| # Written and revised by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
| # No copyright is claimed, and the software is hereby placed in the public | ||||
| # domain.  In case this attempt to disclaim copyright and place the software | ||||
| # in the public domain is deemed null and void, then the software is | ||||
| # Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
| # general public under the following terms: | ||||
| # | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted. | ||||
| # | ||||
| # There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
| # | ||||
| # See crypt_blowfish.c for more information. | ||||
| # | ||||
|  | ||||
| CC = gcc | ||||
| AS = $(CC) | ||||
| LD = $(CC) | ||||
| RM = rm -f | ||||
| CFLAGS = -W -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wundef -Wpointer-arith -O2 -fomit-frame-pointer -funroll-loops | ||||
| ASFLAGS = -c | ||||
| LDFLAGS = -s | ||||
|  | ||||
| BLOWFISH_OBJS = \ | ||||
| 	crypt_blowfish.o x86.o | ||||
|  | ||||
| CRYPT_OBJS = \ | ||||
| 	$(BLOWFISH_OBJS) crypt_gensalt.o wrapper.o | ||||
|  | ||||
| TEST_OBJS = \ | ||||
| 	$(BLOWFISH_OBJS) crypt_gensalt.o crypt_test.o | ||||
|  | ||||
| TEST_THREADS_OBJS = \ | ||||
| 	$(BLOWFISH_OBJS) crypt_gensalt.o crypt_test_threads.o | ||||
|  | ||||
| EXTRA_MANS = \ | ||||
| 	crypt_r.3 crypt_rn.3 crypt_ra.3 \ | ||||
| 	crypt_gensalt.3 crypt_gensalt_rn.3 crypt_gensalt_ra.3 | ||||
|  | ||||
| all: $(CRYPT_OBJS) man | ||||
|  | ||||
| check: crypt_test | ||||
| 	./crypt_test | ||||
|  | ||||
| crypt_test: $(TEST_OBJS) | ||||
| 	$(LD) $(LDFLAGS) $(TEST_OBJS) -o $@ | ||||
|  | ||||
| crypt_test.o: wrapper.c ow-crypt.h crypt_blowfish.h crypt_gensalt.h | ||||
| 	$(CC) -c $(CFLAGS) wrapper.c -DTEST -o $@ | ||||
|  | ||||
| check_threads: crypt_test_threads | ||||
| 	./crypt_test_threads | ||||
|  | ||||
| crypt_test_threads: $(TEST_THREADS_OBJS) | ||||
| 	$(LD) $(LDFLAGS) $(TEST_THREADS_OBJS) -lpthread -o $@ | ||||
|  | ||||
| crypt_test_threads.o: wrapper.c ow-crypt.h crypt_blowfish.h crypt_gensalt.h | ||||
| 	$(CC) -c $(CFLAGS) wrapper.c -DTEST -DTEST_THREADS=4 -o $@ | ||||
|  | ||||
| man: $(EXTRA_MANS) | ||||
|  | ||||
| $(EXTRA_MANS): | ||||
| 	echo '.so man3/crypt.3' > $@ | ||||
|  | ||||
| crypt_blowfish.o: crypt_blowfish.h | ||||
| crypt_gensalt.o: crypt_gensalt.h | ||||
| wrapper.o: crypt.h ow-crypt.h crypt_blowfish.h crypt_gensalt.h | ||||
|  | ||||
| .c.o: | ||||
| 	$(CC) -c $(CFLAGS) $*.c | ||||
|  | ||||
| .S.o: | ||||
| 	$(AS) $(ASFLAGS) $*.S | ||||
|  | ||||
| clean: | ||||
| 	$(RM) crypt_test crypt_test_threads *.o $(EXTRA_MANS) core | ||||
							
								
								
									
										30
									
								
								deps/crypt_blowfish/PERFORMANCE
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								deps/crypt_blowfish/PERFORMANCE
									
									
									
									
										vendored
									
									
								
							| @@ -1,30 +0,0 @@ | ||||
| These numbers are for 32 iterations ("$2a$05"): | ||||
|  | ||||
| 			OpenBSD 3.0 bcrypt(*)	crypt_blowfish 0.4.4 | ||||
| Pentium III, 840 MHz	99 c/s			121 c/s (+22%) | ||||
| Alpha 21164PC, 533 MHz	55.5 c/s		76.9 c/s (+38%) | ||||
| UltraSparc IIi, 400 MHz	49.9 c/s		52.5 c/s (+5%) | ||||
| Pentium, 120 MHz	8.8 c/s			20.1 c/s (+128%) | ||||
| PA-RISC 7100LC, 80 MHz	8.5 c/s			16.3 c/s (+92%) | ||||
|  | ||||
| (*) built with -fomit-frame-pointer -funroll-loops, which I don't | ||||
| think happens for libcrypt. | ||||
|  | ||||
| Starting with version 1.1 released in June 2011, default builds of | ||||
| crypt_blowfish invoke a quick self-test on every hash computation. | ||||
| This has roughly a 4.8% performance impact at "$2a$05", but only a 0.6% | ||||
| impact at a more typical setting of "$2a$08". | ||||
|  | ||||
| The large speedup for the original Pentium is due to the assembly | ||||
| code and the weird optimizations this processor requires. | ||||
|  | ||||
| The numbers for password cracking are 2 to 10% higher than those for | ||||
| crypt_blowfish as certain things may be done out of the loop and the | ||||
| code doesn't need to be reentrant. | ||||
|  | ||||
| Recent versions of John the Ripper (1.6.25-dev and newer) achieve an | ||||
| additional 15% speedup on the Pentium Pro family of processors (which | ||||
| includes Pentium III) with a separate version of the assembly code and | ||||
| run-time CPU detection. | ||||
|  | ||||
| $Owl: Owl/packages/glibc/crypt_blowfish/PERFORMANCE,v 1.6 2011/06/21 12:09:20 solar Exp $ | ||||
							
								
								
									
										68
									
								
								deps/crypt_blowfish/README
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								deps/crypt_blowfish/README
									
									
									
									
										vendored
									
									
								
							| @@ -1,68 +0,0 @@ | ||||
| This is an implementation of a password hashing method, provided via the | ||||
| crypt(3) and a reentrant interface.  It is fully compatible with | ||||
| OpenBSD's bcrypt.c for prefix "$2b$", originally by Niels Provos and | ||||
| David Mazieres.  (Please refer to the included crypt(3) man page for | ||||
| information on minor compatibility issues for other bcrypt prefixes.) | ||||
|  | ||||
| I've placed this code in the public domain, with fallback to a | ||||
| permissive license.  Please see the comment in crypt_blowfish.c for | ||||
| more information. | ||||
|  | ||||
| You can use the provided routines in your own packages, or link them | ||||
| into a C library.  I've provided hooks for linking into GNU libc, but | ||||
| it shouldn't be too hard to get this into another C library.  Note | ||||
| that simply adding this code into your libc is probably not enough to | ||||
| make your system use the new password hashing algorithm.  Changes to | ||||
| passwd(1), PAM modules, or whatever else your system uses will likely | ||||
| be needed as well.  These are not a part of this package, but see | ||||
| LINKS for a pointer to our tcb suite. | ||||
|  | ||||
| Instructions on using the routines in one of the two common ways are | ||||
| given below.  It is recommended that you test the routines on your | ||||
| system before you start.  Type "make check" or "make check_threads" | ||||
| (if you have the POSIX threads library), then "make clean". | ||||
|  | ||||
|  | ||||
| 1. Using the routines in your programs. | ||||
|  | ||||
| The available interfaces are in ow-crypt.h, and this is the file you | ||||
| should include.  You won't need crypt.h.  When linking, add all of the | ||||
| C files and x86.S (you can compile and link it even on a non-x86, it | ||||
| will produce no code in this case). | ||||
|  | ||||
|  | ||||
| 2. Building the routines into GNU C library. | ||||
|  | ||||
| For versions 2.13 and 2.14 (and likely other nearby ones), extract the | ||||
| library sources as usual.  Apply the patch for glibc 2.14 provided in | ||||
| this package.  Enter crypt/ and rename crypt.h to gnu-crypt.h within | ||||
| that directory.  Copy the C sources, header, and assembly (x86.S) files | ||||
| from this package in there as well (but be sure you don't overwrite the | ||||
| Makefile).  Configure, build, and install the library as usual. | ||||
|  | ||||
| For versions 2.2 to 2.3.6 (and likely also for some newer ones), | ||||
| extract the library sources and maybe its optional add-ons as usual. | ||||
| Apply the patch for glibc 2.3.6 provided in this package.  Enter | ||||
| crypt/ and rename crypt.h to gnu-crypt.h within that directory.  Copy | ||||
| the C sources, header, and assembly (x86.S) files from this package in | ||||
| there as well (but be sure you don't overwrite the Makefile). | ||||
| Configure, build, and install the library as usual. | ||||
|  | ||||
| For versions 2.1 to 2.1.3, extract the library sources and the crypt | ||||
| and linuxthreads add-ons as usual.  Apply the patch for glibc 2.1.3 | ||||
| provided in this package.  Enter crypt/sysdeps/unix/, and rename | ||||
| crypt.h to gnu-crypt.h within that directory.  Copy C sources, header, | ||||
| and assembly (x86.S) files from this package in there as well (but be | ||||
| sure you don't overwrite the Makefile).  Configure, build, and install | ||||
| the library as usual. | ||||
|  | ||||
| Programs that want to use the provided interfaces will need to include | ||||
| crypt.h (but not ow-crypt.h directly).  By default, prototypes for the | ||||
| new routines aren't defined (but the extra functionality of crypt(3) | ||||
| is indeed available).  You need to define _OW_SOURCE to obtain the new | ||||
| routines as well. | ||||
|  | ||||
| --  | ||||
| Solar Designer <solar at openwall.com> | ||||
|  | ||||
| $Owl: Owl/packages/glibc/crypt_blowfish/README,v 1.10 2014/07/07 15:19:04 solar Exp $ | ||||
							
								
								
									
										575
									
								
								deps/crypt_blowfish/crypt.3
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										575
									
								
								deps/crypt_blowfish/crypt.3
									
									
									
									
										vendored
									
									
								
							| @@ -1,575 +0,0 @@ | ||||
| .\" Written and revised by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
| .\" No copyright is claimed, and this man page is hereby placed in the public | ||||
| .\" domain.  In case this attempt to disclaim copyright and place the man page | ||||
| .\" in the public domain is deemed null and void, then the man page is | ||||
| .\" Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
| .\" general public under the following terms: | ||||
| .\" | ||||
| .\" Redistribution and use in source and binary forms, with or without | ||||
| .\" modification, are permitted. | ||||
| .\" | ||||
| .\" There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
| .\" | ||||
| .\" This manual page in its current form is intended for use on systems | ||||
| .\" based on the GNU C Library with crypt_blowfish patched into libcrypt. | ||||
| .\" | ||||
| .TH CRYPT 3 "July 7, 2014" "Openwall Project" "Library functions" | ||||
| .ad l | ||||
| .\" No macros in NAME to keep makewhatis happy. | ||||
| .SH NAME | ||||
| \fBcrypt\fR, \fBcrypt_r\fR, \fBcrypt_rn\fR, \fBcrypt_ra\fR, | ||||
| \fBcrypt_gensalt\fR, \fBcrypt_gensalt_rn\fR, \fBcrypt_gensalt_ra\fR | ||||
| \- password hashing | ||||
| .SH SYNOPSIS | ||||
| .B #define _XOPEN_SOURCE | ||||
| .br | ||||
| .B #include <unistd.h> | ||||
| .sp | ||||
| .in +8 | ||||
| .ti -8 | ||||
| .BI "char *crypt(const char *" key ", const char *" setting ); | ||||
| .in -8 | ||||
| .sp | ||||
| .B #define _GNU_SOURCE | ||||
| .br | ||||
| .B #include <crypt.h> | ||||
| .sp | ||||
| .in +8 | ||||
| .ti -8 | ||||
| .BI "char *crypt_r(const char *" key ", const char *" setting ", struct crypt_data *" data ); | ||||
| .in -8 | ||||
| .sp | ||||
| .B #define _OW_SOURCE | ||||
| .br | ||||
| .B #include <crypt.h> | ||||
| .sp | ||||
| .in +8 | ||||
| .ti -8 | ||||
| .BI "char *crypt_rn(const char *" key ", const char *" setting ", void *" data ", int " size ); | ||||
| .ti -8 | ||||
| .BI "char *crypt_ra(const char *" key ", const char *" setting ", void **" data ", int *" size ); | ||||
| .ti -8 | ||||
| .BI "char *crypt_gensalt(const char *" prefix ", unsigned long " count ", const char *" input ", int " size ); | ||||
| .ti -8 | ||||
| .BI "char *crypt_gensalt_rn(const char *" prefix ", unsigned long " count ", const char *" input ", int " size ", char *" output ", int " output_size ); | ||||
| .ti -8 | ||||
| .BI "char *crypt_gensalt_ra(const char *" prefix ", unsigned long " count ", const char *" input ", int " size ); | ||||
| .ad b | ||||
| .de crypt | ||||
| .BR crypt , | ||||
| .BR crypt_r , | ||||
| .BR crypt_rn ", \\$1" | ||||
| .ie "\\$2"" .B crypt_ra | ||||
| .el .BR crypt_ra "\\$2" | ||||
| .. | ||||
| .de crypt_gensalt | ||||
| .BR crypt_gensalt , | ||||
| .BR crypt_gensalt_rn ", \\$1" | ||||
| .ie "\\$2"" .B crypt_gensalt_ra | ||||
| .el .BR crypt_gensalt_ra "\\$2" | ||||
| .. | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .crypt and | ||||
| functions calculate a cryptographic hash function of | ||||
| .I key | ||||
| with one of a number of supported methods as requested with | ||||
| .IR setting , | ||||
| which is also used to pass a salt and possibly other parameters to | ||||
| the chosen method. | ||||
| The hashing methods are explained below. | ||||
| .PP | ||||
| Unlike | ||||
| .BR crypt , | ||||
| the functions | ||||
| .BR crypt_r , | ||||
| .BR crypt_rn " and" | ||||
| .B crypt_ra | ||||
| are reentrant. | ||||
| They place their result and possibly their private data in a | ||||
| .I data | ||||
| area of | ||||
| .I size | ||||
| bytes as passed to them by an application and/or in memory they | ||||
| allocate dynamically.  Some hashing algorithms may use the data area to | ||||
| cache precomputed intermediate values across calls.  Thus, applications | ||||
| must properly initialize the data area before its first use. | ||||
| .B crypt_r | ||||
| requires that only | ||||
| .I data->initialized | ||||
| be reset to zero; | ||||
| .BR crypt_rn " and " crypt_ra | ||||
| require that either the entire data area is zeroed or, in the case of | ||||
| .BR crypt_ra , | ||||
| .I *data | ||||
| is NULL.  When called with a NULL | ||||
| .I *data | ||||
| or insufficient | ||||
| .I *size | ||||
| for the requested hashing algorithm, | ||||
| .B crypt_ra | ||||
| uses | ||||
| .BR realloc (3) | ||||
| to allocate the required amount of memory dynamically.  Thus, | ||||
| .B crypt_ra | ||||
| has the additional requirement that | ||||
| .IR *data , | ||||
| when non-NULL, must point to an area allocated either with a previous | ||||
| call to | ||||
| .B crypt_ra | ||||
| or with a | ||||
| .BR malloc (3) | ||||
| family call. | ||||
| The memory allocated by | ||||
| .B crypt_ra | ||||
| should be freed with | ||||
| .BR free "(3)." | ||||
| .PP | ||||
| The | ||||
| .crypt_gensalt and | ||||
| functions compile a string for use as | ||||
| .I setting | ||||
| \- with the given | ||||
| .I prefix | ||||
| (used to choose a hashing method), the iteration | ||||
| .I count | ||||
| (if supported by the chosen method) and up to | ||||
| .I size | ||||
| cryptographically random | ||||
| .I input | ||||
| bytes for use as the actual salt. | ||||
| If | ||||
| .I count | ||||
| is 0, a low default will be picked. | ||||
| The random bytes may be obtained from | ||||
| .BR /dev/urandom . | ||||
| Unlike | ||||
| .BR crypt_gensalt , | ||||
| the functions | ||||
| .BR crypt_gensalt_rn " and " crypt_gensalt_ra | ||||
| are reentrant. | ||||
| .B crypt_gensalt_rn | ||||
| places its result in the | ||||
| .I output | ||||
| buffer of | ||||
| .I output_size | ||||
| bytes. | ||||
| .B crypt_gensalt_ra | ||||
| allocates memory for its result dynamically.  The memory should be | ||||
| freed with | ||||
| .BR free "(3)." | ||||
| .SH RETURN VALUE | ||||
| Upon successful completion, the functions | ||||
| .crypt and | ||||
| return a pointer to a string containing the setting that was actually used | ||||
| and a printable encoding of the hash function value. | ||||
| The entire string is directly usable as | ||||
| .I setting | ||||
| with other calls to | ||||
| .crypt and | ||||
| and as | ||||
| .I prefix | ||||
| with calls to | ||||
| .crypt_gensalt and . | ||||
| .PP | ||||
| The behavior of | ||||
| .B crypt | ||||
| on errors isn't well standardized.  Some implementations simply can't fail | ||||
| (unless the process dies, in which case they obviously can't return), | ||||
| others return NULL or a fixed string.  Most implementations don't set | ||||
| .IR errno , | ||||
| but some do.  SUSv2 specifies only returning NULL and setting | ||||
| .I errno | ||||
| as a valid behavior, and defines only one possible error | ||||
| .RB "(" ENOSYS , | ||||
| "The functionality is not supported on this implementation.") | ||||
| Unfortunately, most existing applications aren't prepared to handle | ||||
| NULL returns from | ||||
| .BR crypt . | ||||
| The description below corresponds to this implementation of | ||||
| .BR crypt " and " crypt_r | ||||
| only, and to | ||||
| .BR crypt_rn " and " crypt_ra . | ||||
| The behavior may change to match standards, other implementations or | ||||
| existing applications. | ||||
| .PP | ||||
| .BR crypt " and " crypt_r | ||||
| may only fail (and return) when passed an invalid or unsupported | ||||
| .IR setting , | ||||
| in which case they return a pointer to a magic string that is | ||||
| shorter than 13 characters and is guaranteed to differ from | ||||
| .IR setting . | ||||
| This behavior is safe for older applications which assume that | ||||
| .B crypt | ||||
| can't fail, when both setting new passwords and authenticating against | ||||
| existing password hashes. | ||||
| .BR crypt_rn " and " crypt_ra | ||||
| return NULL to indicate failure.  All four functions set | ||||
| .I errno | ||||
| when they fail. | ||||
| .PP | ||||
| The functions | ||||
| .crypt_gensalt and | ||||
| return a pointer to the compiled string for | ||||
| .IR setting , | ||||
| or NULL on error in which case | ||||
| .I errno | ||||
| is set. | ||||
| .SH ERRORS | ||||
| .TP | ||||
| .B EINVAL | ||||
| .crypt "" : | ||||
| .I setting | ||||
| is invalid or not supported by this implementation; | ||||
| .sp | ||||
| .crypt_gensalt "" : | ||||
| .I prefix | ||||
| is invalid or not supported by this implementation; | ||||
| .I count | ||||
| is invalid for the requested | ||||
| .IR prefix ; | ||||
| the input | ||||
| .I size | ||||
| is insufficient for the smallest valid salt with the requested | ||||
| .IR prefix ; | ||||
| .I input | ||||
| is NULL. | ||||
| .TP | ||||
| .B ERANGE | ||||
| .BR crypt_rn : | ||||
| the provided data area | ||||
| .I size | ||||
| is insufficient for the requested hashing algorithm; | ||||
| .sp | ||||
| .BR crypt_gensalt_rn : | ||||
| .I output_size | ||||
| is too small to hold the compiled | ||||
| .I setting | ||||
| string. | ||||
| .TP | ||||
| .B ENOMEM | ||||
| .B crypt | ||||
| (original glibc only): | ||||
| failed to allocate memory for the output buffer (which subsequent calls | ||||
| would re-use); | ||||
| .sp | ||||
| .BR crypt_ra : | ||||
| .I *data | ||||
| is NULL or | ||||
| .I *size | ||||
| is insufficient for the requested hashing algorithm and | ||||
| .BR realloc (3) | ||||
| failed; | ||||
| .sp | ||||
| .BR crypt_gensalt_ra : | ||||
| failed to allocate memory for the compiled | ||||
| .I setting | ||||
| string. | ||||
| .TP | ||||
| .B ENOSYS | ||||
| .B crypt | ||||
| (SUSv2): | ||||
| the functionality is not supported on this implementation; | ||||
| .sp | ||||
| .BR crypt , | ||||
| .B crypt_r | ||||
| (glibc 2.0 to 2.0.1 only): | ||||
| .de no-crypt-add-on | ||||
| the crypt add-on is not compiled in and | ||||
| .I setting | ||||
| requests something other than the MD5-based algorithm. | ||||
| .. | ||||
| .no-crypt-add-on | ||||
| .TP | ||||
| .B EOPNOTSUPP | ||||
| .BR crypt , | ||||
| .B crypt_r | ||||
| (glibc 2.0.2 to 2.1.3 only): | ||||
| .no-crypt-add-on | ||||
| .SH HASHING METHODS | ||||
| The implemented hashing methods are intended specifically for processing | ||||
| user passwords for storage and authentication; | ||||
| they are at best inefficient for most other purposes. | ||||
| .PP | ||||
| It is important to understand that password hashing is not a replacement | ||||
| for strong passwords. | ||||
| It is always possible for an attacker with access to password hashes | ||||
| to try guessing candidate passwords against the hashes. | ||||
| There are, however, certain properties a password hashing method may have | ||||
| which make these key search attacks somewhat harder. | ||||
| .PP | ||||
| All of the hashing methods use salts such that the same | ||||
| .I key | ||||
| may produce many possible hashes. | ||||
| Proper use of salts may defeat a number of attacks, including: | ||||
| .TP | ||||
| 1. | ||||
| The ability to try candidate passwords against multiple hashes at the | ||||
| price of one. | ||||
| .TP | ||||
| 2. | ||||
| The use of pre-hashed lists of candidate passwords. | ||||
| .TP | ||||
| 3. | ||||
| The ability to determine whether two users (or two accounts of one user) | ||||
| have the same or different passwords without actually having to guess | ||||
| one of the passwords. | ||||
| .PP | ||||
| The key search attacks depend on computing hashes of large numbers of | ||||
| candidate passwords. | ||||
| Thus, the computational cost of a good password hashing method must be | ||||
| high \- but of course not too high to render it impractical. | ||||
| .PP | ||||
| All hashing methods implemented within the | ||||
| .crypt and | ||||
| interfaces use multiple iterations of an underlying cryptographic | ||||
| primitive specifically in order to increase the cost of trying a | ||||
| candidate password. | ||||
| Unfortunately, due to hardware improvements, the hashing methods which | ||||
| have a fixed cost become increasingly less secure over time. | ||||
| .PP | ||||
| In addition to salts, modern password hashing methods accept a variable | ||||
| iteration | ||||
| .IR count . | ||||
| This makes it possible to adapt their cost to the hardware improvements | ||||
| while still maintaining compatibility. | ||||
| .PP | ||||
| The following hashing methods are or may be implemented within the | ||||
| described interfaces: | ||||
| .PP | ||||
| .de hash | ||||
| .ad l | ||||
| .TP | ||||
| .I prefix | ||||
| .ie "\\$1"" \{\ | ||||
| "" (empty string); | ||||
| .br | ||||
| a string matching ^[./0-9A-Za-z]{2} (see | ||||
| .BR regex (7)) | ||||
| .\} | ||||
| .el "\\$1" | ||||
| .TP | ||||
| .B Encoding syntax | ||||
| \\$2 | ||||
| .TP | ||||
| .B Maximum password length | ||||
| \\$3 (uses \\$4-bit characters) | ||||
| .TP | ||||
| .B Effective key size | ||||
| .ie "\\$5"" limited by the hash size only | ||||
| .el up to \\$5 bits | ||||
| .TP | ||||
| .B Hash size | ||||
| \\$6 bits | ||||
| .TP | ||||
| .B Salt size | ||||
| \\$7 bits | ||||
| .TP | ||||
| .B Iteration count | ||||
| \\$8 | ||||
| .ad b | ||||
| .. | ||||
| .ti -2 | ||||
| .B Traditional DES-based | ||||
| .br | ||||
| This method is supported by almost all implementations of | ||||
| .BR crypt . | ||||
| Unfortunately, it no longer offers adequate security because of its many | ||||
| limitations. | ||||
| Thus, it should not be used for new passwords unless you absolutely have | ||||
| to be able to migrate the password hashes to other systems. | ||||
| .hash "" "[./0-9A-Za-z]{13}" 8 7 56 64 12 25 | ||||
| .PP | ||||
| .ti -2 | ||||
| .B Extended BSDI-style DES-based | ||||
| .br | ||||
| This method is used on BSDI and is also available on at least NetBSD, | ||||
| OpenBSD, and FreeBSD due to the use of David Burren's FreeSec library. | ||||
| .hash _ "_[./0-9A-Za-z]{19}" unlimited 7 56 64 24 "1 to 2**24-1 (must be odd)" | ||||
| .PP | ||||
| .ti -2 | ||||
| .B FreeBSD-style MD5-based | ||||
| .br | ||||
| This is Poul-Henning Kamp's MD5-based password hashing method originally | ||||
| developed for FreeBSD. | ||||
| It is currently supported on many free Unix-like systems, on Solaris 10 | ||||
| and newer, and it is part of the official glibc. | ||||
| Its main disadvantage is the fixed iteration count, which is already | ||||
| too low for the currently available hardware. | ||||
| .hash "$1$" "\e$1\e$[^$]{1,8}\e$[./0-9A-Za-z]{22}" unlimited 8 "" 128 "6 to 48" 1000 | ||||
| .PP | ||||
| .ti -2 | ||||
| .BR "OpenBSD-style Blowfish-based" " (" bcrypt ) | ||||
| .br | ||||
| .B bcrypt | ||||
| was originally developed by Niels Provos and David Mazieres for OpenBSD | ||||
| and is also supported on recent versions of FreeBSD and NetBSD, | ||||
| on Solaris 10 and newer, and on several GNU/*/Linux distributions. | ||||
| It is, however, not part of the official glibc. | ||||
| .PP | ||||
| While both | ||||
| .B bcrypt | ||||
| and the BSDI-style DES-based hashing offer a variable iteration count, | ||||
| .B bcrypt | ||||
| may scale to even faster hardware, doesn't allow for certain optimizations | ||||
| specific to password cracking only, doesn't have the effective key size | ||||
| limitation, and uses 8-bit characters in passwords. | ||||
| .hash "$2b$" "\e$2[abxy]\e$[0-9]{2}\e$[./A-Za-z0-9]{53}" 72 8 "" 184 128 "2**4 to 2**99 (current implementations are limited to 2**31 iterations)" | ||||
| .PP | ||||
| With | ||||
| .BR bcrypt , | ||||
| the | ||||
| .I count | ||||
| passed to | ||||
| .crypt_gensalt and | ||||
| is the base-2 logarithm of the actual iteration count. | ||||
| .PP | ||||
| .B bcrypt | ||||
| hashes used the "$2a$" prefix since 1997. | ||||
| However, in 2011 an implementation bug was discovered in crypt_blowfish | ||||
| (versions up to 1.0.4 inclusive) affecting handling of password characters with | ||||
| the 8th bit set. | ||||
| Besides fixing the bug, | ||||
| to provide for upgrade strategies for existing systems, two new prefixes were | ||||
| introduced: "$2x$", which fully re-introduces the bug, and "$2y$", which | ||||
| guarantees correct handling of both 7- and 8-bit characters. | ||||
| OpenBSD 5.5 introduced the "$2b$" prefix for behavior that exactly matches | ||||
| crypt_blowfish's "$2y$", and current crypt_blowfish supports it as well. | ||||
| Unfortunately, the behavior of "$2a$" on password characters with the 8th bit | ||||
| set has to be considered system-specific. | ||||
| When generating new password hashes, the "$2b$" or "$2y$" prefix should be used. | ||||
| (If such hashes ever need to be migrated to a system that does not yet support | ||||
| these new prefixes, the prefix in migrated copies of the already-generated | ||||
| hashes may be changed to "$2a$".) | ||||
| .PP | ||||
| .crypt_gensalt and | ||||
| support the "$2b$", "$2y$", and "$2a$" prefixes (the latter for legacy programs | ||||
| or configurations), but not "$2x$" (which must not be used for new hashes). | ||||
| .crypt and | ||||
| support all four of these prefixes. | ||||
| .SH PORTABILITY NOTES | ||||
| Programs using any of these functions on a glibc 2.x system must be | ||||
| linked against | ||||
| .BR libcrypt . | ||||
| However, many Unix-like operating systems and older versions of the | ||||
| GNU C Library include the | ||||
| .BR crypt " function in " libc . | ||||
| .PP | ||||
| The | ||||
| .BR crypt_r , | ||||
| .BR crypt_rn , | ||||
| .BR crypt_ra , | ||||
| .crypt_gensalt and | ||||
| functions are very non-portable. | ||||
| .PP | ||||
| The set of supported hashing methods is implementation-dependent. | ||||
| .SH CONFORMING TO | ||||
| The | ||||
| .B crypt | ||||
| function conforms to SVID, X/OPEN, and is available on BSD 4.3. | ||||
| The strings returned by | ||||
| .B crypt | ||||
| are not required to be portable among conformant systems. | ||||
| .PP | ||||
| .B crypt_r | ||||
| is a GNU extension. | ||||
| There's also a | ||||
| .B crypt_r | ||||
| function on HP-UX and MKS Toolkit, but the prototypes and semantics differ. | ||||
| .PP | ||||
| .B crypt_gensalt | ||||
| is an Openwall extension. | ||||
| There's also a | ||||
| .B crypt_gensalt | ||||
| function on Solaris 10 and newer, but the prototypes and semantics differ. | ||||
| .PP | ||||
| .BR crypt_rn , | ||||
| .BR crypt_ra , | ||||
| .BR crypt_gensalt_rn , | ||||
| and | ||||
| .B crypt_gensalt_ra | ||||
| are Openwall extensions. | ||||
| .SH HISTORY | ||||
| A rotor-based | ||||
| .B crypt | ||||
| function appeared in Version 6 AT&T UNIX. | ||||
| The "traditional" | ||||
| .B crypt | ||||
| first appeared in Version 7 AT&T UNIX. | ||||
| .PP | ||||
| The | ||||
| .B crypt_r | ||||
| function was introduced during glibc 2.0 development. | ||||
| .SH BUGS | ||||
| The return values of | ||||
| .BR crypt " and " crypt_gensalt | ||||
| point to static buffers that are overwritten by subsequent calls. | ||||
| These functions are not thread-safe. | ||||
| .RB ( crypt | ||||
| on recent versions of Solaris uses thread-specific data and actually is | ||||
| thread-safe.) | ||||
| .PP | ||||
| The strings returned by certain other implementations of | ||||
| .B crypt | ||||
| on error may be stored in read-only locations or only initialized once, | ||||
| which makes it unsafe to always attempt to zero out the buffer normally | ||||
| pointed to by the | ||||
| .B crypt | ||||
| return value as it would otherwise be preferable for security reasons. | ||||
| The problem could be avoided with the use of | ||||
| .BR crypt_r , | ||||
| .BR crypt_rn , | ||||
| or | ||||
| .B crypt_ra | ||||
| where the application has full control over output buffers of these functions | ||||
| (and often over some of their private data as well). | ||||
| Unfortunately, the functions aren't (yet?) available on platforms where | ||||
| .B crypt | ||||
| has this undesired property. | ||||
| .PP | ||||
| Applications using the thread-safe | ||||
| .B crypt_r | ||||
| need to allocate address space for the large (over 128 KB) | ||||
| .I struct crypt_data | ||||
| structure.  Each thread needs a separate instance of the structure.  The | ||||
| .B crypt_r | ||||
| interface makes it impossible to implement a hashing algorithm which | ||||
| would need to keep an even larger amount of private data, without breaking | ||||
| binary compatibility. | ||||
| .B crypt_ra | ||||
| allows for dynamically increasing the allocation size as required by the | ||||
| hashing algorithm that is actually used.  Unfortunately, | ||||
| .B crypt_ra | ||||
| is even more non-portable than | ||||
| .BR crypt_r . | ||||
| .PP | ||||
| Multi-threaded applications or library functions which are meant to be | ||||
| thread-safe should use | ||||
| .BR crypt_gensalt_rn " or " crypt_gensalt_ra | ||||
| rather than | ||||
| .BR crypt_gensalt . | ||||
| .SH SEE ALSO | ||||
| .BR login (1), | ||||
| .BR passwd (1), | ||||
| .BR crypto (3), | ||||
| .BR encrypt (3), | ||||
| .BR free (3), | ||||
| .BR getpass (3), | ||||
| .BR getpwent (3), | ||||
| .BR malloc (3), | ||||
| .BR realloc (3), | ||||
| .BR shadow (3), | ||||
| .BR passwd (5), | ||||
| .BR shadow (5), | ||||
| .BR regex (7), | ||||
| .BR pam (8) | ||||
| .sp | ||||
| Niels Provos and David Mazieres.  A Future-Adaptable Password Scheme. | ||||
| Proceedings of the 1999 USENIX Annual Technical Conference, June 1999. | ||||
| .br | ||||
| http://www.usenix.org/events/usenix99/provos.html | ||||
| .sp | ||||
| Robert Morris and Ken Thompson.  Password Security: A Case History. | ||||
| Unix Seventh Edition Manual, Volume 2, April 1978. | ||||
| .br | ||||
| http://plan9.bell-labs.com/7thEdMan/vol2/password | ||||
							
								
								
									
										24
									
								
								deps/crypt_blowfish/crypt.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								deps/crypt_blowfish/crypt.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,24 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2002. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2002 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #include <gnu-crypt.h> | ||||
|  | ||||
| #if defined(_OW_SOURCE) || defined(__USE_OW) | ||||
| #define __SKIP_GNU | ||||
| #undef __SKIP_OW | ||||
| #include <ow-crypt.h> | ||||
| #undef __SKIP_GNU | ||||
| #endif | ||||
							
								
								
									
										907
									
								
								deps/crypt_blowfish/crypt_blowfish.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										907
									
								
								deps/crypt_blowfish/crypt_blowfish.c
									
									
									
									
										vendored
									
									
								
							| @@ -1,907 +0,0 @@ | ||||
| /* | ||||
|  * The crypt_blowfish homepage is: | ||||
|  * | ||||
|  *	http://www.openwall.com/crypt/ | ||||
|  * | ||||
|  * This code comes from John the Ripper password cracker, with reentrant | ||||
|  * and crypt(3) interfaces added, but optimizations specific to password | ||||
|  * cracking removed. | ||||
|  * | ||||
|  * Written by Solar Designer <solar at openwall.com> in 1998-2014. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * It is my intent that you should be able to use this on your system, | ||||
|  * as part of a software package, or anywhere else to improve security, | ||||
|  * ensure compatibility, or for any other purpose.  I would appreciate | ||||
|  * it if you give credit where it is due and keep your modifications in | ||||
|  * the public domain as well, but I don't require that in order to let | ||||
|  * you place this code and any modifications you make under a license | ||||
|  * of your choice. | ||||
|  * | ||||
|  * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix | ||||
|  * "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses | ||||
|  * some of his ideas.  The password hashing algorithm was designed by David | ||||
|  * Mazieres <dm at lcs.mit.edu>.  For information on the level of | ||||
|  * compatibility for bcrypt hash prefixes other than "$2b$", please refer to | ||||
|  * the comments in BF_set_key() below and to the included crypt(3) man page. | ||||
|  * | ||||
|  * There's a paper on the algorithm that explains its design decisions: | ||||
|  * | ||||
|  *	http://www.usenix.org/events/usenix99/provos.html | ||||
|  * | ||||
|  * Some of the tricks in BF_ROUND might be inspired by Eric Young's | ||||
|  * Blowfish library (I can't be sure if I would think of something if I | ||||
|  * hadn't seen his code). | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include <errno.h> | ||||
| #ifndef __set_errno | ||||
| #define __set_errno(val) errno = (val) | ||||
| #endif | ||||
|  | ||||
| /* Just to make sure the prototypes match the actual definitions */ | ||||
| #include "crypt_blowfish.h" | ||||
|  | ||||
| #ifdef __i386__ | ||||
| #define BF_ASM				1 | ||||
| #define BF_SCALE			1 | ||||
| #elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__) | ||||
| #define BF_ASM				0 | ||||
| #define BF_SCALE			1 | ||||
| #else | ||||
| #define BF_ASM				0 | ||||
| #define BF_SCALE			0 | ||||
| #endif | ||||
|  | ||||
| typedef unsigned int BF_word; | ||||
| typedef signed int BF_word_signed; | ||||
|  | ||||
| /* Number of Blowfish rounds, this is also hardcoded into a few places */ | ||||
| #define BF_N				16 | ||||
|  | ||||
| typedef BF_word BF_key[BF_N + 2]; | ||||
|  | ||||
| typedef struct { | ||||
| 	BF_word S[4][0x100]; | ||||
| 	BF_key P; | ||||
| } BF_ctx; | ||||
|  | ||||
| /* | ||||
|  * Magic IV for 64 Blowfish encryptions that we do at the end. | ||||
|  * The string is "OrpheanBeholderScryDoubt" on big-endian. | ||||
|  */ | ||||
| static BF_word BF_magic_w[6] = { | ||||
| 	0x4F727068, 0x65616E42, 0x65686F6C, | ||||
| 	0x64657253, 0x63727944, 0x6F756274 | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * P-box and S-box tables initialized with digits of Pi. | ||||
|  */ | ||||
| static BF_ctx BF_init_state = { | ||||
| 	{ | ||||
| 		{ | ||||
| 			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, | ||||
| 			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, | ||||
| 			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, | ||||
| 			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, | ||||
| 			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, | ||||
| 			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, | ||||
| 			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, | ||||
| 			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, | ||||
| 			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, | ||||
| 			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, | ||||
| 			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, | ||||
| 			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, | ||||
| 			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, | ||||
| 			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, | ||||
| 			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, | ||||
| 			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, | ||||
| 			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, | ||||
| 			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, | ||||
| 			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, | ||||
| 			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, | ||||
| 			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, | ||||
| 			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, | ||||
| 			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, | ||||
| 			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, | ||||
| 			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, | ||||
| 			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, | ||||
| 			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, | ||||
| 			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, | ||||
| 			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, | ||||
| 			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, | ||||
| 			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, | ||||
| 			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, | ||||
| 			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, | ||||
| 			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, | ||||
| 			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, | ||||
| 			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, | ||||
| 			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, | ||||
| 			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, | ||||
| 			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, | ||||
| 			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, | ||||
| 			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, | ||||
| 			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, | ||||
| 			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, | ||||
| 			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, | ||||
| 			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, | ||||
| 			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, | ||||
| 			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, | ||||
| 			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, | ||||
| 			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, | ||||
| 			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, | ||||
| 			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, | ||||
| 			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, | ||||
| 			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, | ||||
| 			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, | ||||
| 			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, | ||||
| 			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, | ||||
| 			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, | ||||
| 			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, | ||||
| 			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, | ||||
| 			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, | ||||
| 			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, | ||||
| 			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, | ||||
| 			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, | ||||
| 			0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a | ||||
| 		}, { | ||||
| 			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, | ||||
| 			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, | ||||
| 			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, | ||||
| 			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, | ||||
| 			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, | ||||
| 			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, | ||||
| 			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, | ||||
| 			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, | ||||
| 			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, | ||||
| 			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, | ||||
| 			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, | ||||
| 			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, | ||||
| 			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, | ||||
| 			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, | ||||
| 			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, | ||||
| 			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, | ||||
| 			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, | ||||
| 			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, | ||||
| 			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, | ||||
| 			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, | ||||
| 			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, | ||||
| 			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, | ||||
| 			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, | ||||
| 			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, | ||||
| 			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, | ||||
| 			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, | ||||
| 			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, | ||||
| 			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, | ||||
| 			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, | ||||
| 			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, | ||||
| 			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, | ||||
| 			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, | ||||
| 			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, | ||||
| 			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, | ||||
| 			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, | ||||
| 			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, | ||||
| 			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, | ||||
| 			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, | ||||
| 			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, | ||||
| 			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, | ||||
| 			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, | ||||
| 			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, | ||||
| 			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, | ||||
| 			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, | ||||
| 			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, | ||||
| 			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, | ||||
| 			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, | ||||
| 			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, | ||||
| 			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, | ||||
| 			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, | ||||
| 			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, | ||||
| 			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, | ||||
| 			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, | ||||
| 			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, | ||||
| 			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, | ||||
| 			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, | ||||
| 			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, | ||||
| 			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, | ||||
| 			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, | ||||
| 			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, | ||||
| 			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, | ||||
| 			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, | ||||
| 			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, | ||||
| 			0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 | ||||
| 		}, { | ||||
| 			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, | ||||
| 			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, | ||||
| 			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, | ||||
| 			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, | ||||
| 			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, | ||||
| 			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, | ||||
| 			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, | ||||
| 			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, | ||||
| 			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, | ||||
| 			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, | ||||
| 			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, | ||||
| 			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, | ||||
| 			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, | ||||
| 			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, | ||||
| 			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, | ||||
| 			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, | ||||
| 			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, | ||||
| 			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, | ||||
| 			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, | ||||
| 			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, | ||||
| 			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, | ||||
| 			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, | ||||
| 			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, | ||||
| 			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, | ||||
| 			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, | ||||
| 			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, | ||||
| 			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, | ||||
| 			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, | ||||
| 			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, | ||||
| 			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, | ||||
| 			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, | ||||
| 			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, | ||||
| 			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, | ||||
| 			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, | ||||
| 			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, | ||||
| 			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, | ||||
| 			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, | ||||
| 			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, | ||||
| 			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, | ||||
| 			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, | ||||
| 			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, | ||||
| 			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, | ||||
| 			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, | ||||
| 			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, | ||||
| 			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, | ||||
| 			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, | ||||
| 			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, | ||||
| 			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, | ||||
| 			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, | ||||
| 			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, | ||||
| 			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, | ||||
| 			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, | ||||
| 			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, | ||||
| 			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, | ||||
| 			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, | ||||
| 			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, | ||||
| 			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, | ||||
| 			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, | ||||
| 			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, | ||||
| 			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, | ||||
| 			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, | ||||
| 			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, | ||||
| 			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, | ||||
| 			0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 | ||||
| 		}, { | ||||
| 			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, | ||||
| 			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, | ||||
| 			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, | ||||
| 			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, | ||||
| 			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, | ||||
| 			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, | ||||
| 			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, | ||||
| 			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, | ||||
| 			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, | ||||
| 			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, | ||||
| 			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, | ||||
| 			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, | ||||
| 			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, | ||||
| 			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, | ||||
| 			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, | ||||
| 			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, | ||||
| 			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, | ||||
| 			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, | ||||
| 			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, | ||||
| 			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, | ||||
| 			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, | ||||
| 			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, | ||||
| 			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, | ||||
| 			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, | ||||
| 			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, | ||||
| 			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, | ||||
| 			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, | ||||
| 			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, | ||||
| 			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, | ||||
| 			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, | ||||
| 			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, | ||||
| 			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, | ||||
| 			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, | ||||
| 			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, | ||||
| 			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, | ||||
| 			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, | ||||
| 			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, | ||||
| 			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, | ||||
| 			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, | ||||
| 			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, | ||||
| 			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, | ||||
| 			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, | ||||
| 			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, | ||||
| 			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, | ||||
| 			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, | ||||
| 			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, | ||||
| 			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, | ||||
| 			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, | ||||
| 			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, | ||||
| 			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, | ||||
| 			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, | ||||
| 			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, | ||||
| 			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, | ||||
| 			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, | ||||
| 			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, | ||||
| 			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, | ||||
| 			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, | ||||
| 			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, | ||||
| 			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, | ||||
| 			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, | ||||
| 			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, | ||||
| 			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, | ||||
| 			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, | ||||
| 			0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 | ||||
| 		} | ||||
| 	}, { | ||||
| 		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, | ||||
| 		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, | ||||
| 		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, | ||||
| 		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, | ||||
| 		0x9216d5d9, 0x8979fb1b | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| static unsigned char BF_itoa64[64 + 1] = | ||||
| 	"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; | ||||
|  | ||||
| static unsigned char BF_atoi64[0x60] = { | ||||
| 	64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1, | ||||
| 	54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64, | ||||
| 	64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | ||||
| 	17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64, | ||||
| 	64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, | ||||
| 	43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64 | ||||
| }; | ||||
|  | ||||
| #define BF_safe_atoi64(dst, src) \ | ||||
| { \ | ||||
| 	tmp = (unsigned char)(src); \ | ||||
| 	if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \ | ||||
| 	tmp = BF_atoi64[tmp]; \ | ||||
| 	if (tmp > 63) return -1; \ | ||||
| 	(dst) = tmp; \ | ||||
| } | ||||
|  | ||||
| static int BF_decode(BF_word *dst, const char *src, int size) | ||||
| { | ||||
| 	unsigned char *dptr = (unsigned char *)dst; | ||||
| 	unsigned char *end = dptr + size; | ||||
| 	const unsigned char *sptr = (const unsigned char *)src; | ||||
| 	unsigned int tmp, c1, c2, c3, c4; | ||||
|  | ||||
| 	do { | ||||
| 		BF_safe_atoi64(c1, *sptr++); | ||||
| 		BF_safe_atoi64(c2, *sptr++); | ||||
| 		*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4); | ||||
| 		if (dptr >= end) break; | ||||
|  | ||||
| 		BF_safe_atoi64(c3, *sptr++); | ||||
| 		*dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2); | ||||
| 		if (dptr >= end) break; | ||||
|  | ||||
| 		BF_safe_atoi64(c4, *sptr++); | ||||
| 		*dptr++ = ((c3 & 0x03) << 6) | c4; | ||||
| 	} while (dptr < end); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void BF_encode(char *dst, const BF_word *src, int size) | ||||
| { | ||||
| 	const unsigned char *sptr = (const unsigned char *)src; | ||||
| 	const unsigned char *end = sptr + size; | ||||
| 	unsigned char *dptr = (unsigned char *)dst; | ||||
| 	unsigned int c1, c2; | ||||
|  | ||||
| 	do { | ||||
| 		c1 = *sptr++; | ||||
| 		*dptr++ = BF_itoa64[c1 >> 2]; | ||||
| 		c1 = (c1 & 0x03) << 4; | ||||
| 		if (sptr >= end) { | ||||
| 			*dptr++ = BF_itoa64[c1]; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		c2 = *sptr++; | ||||
| 		c1 |= c2 >> 4; | ||||
| 		*dptr++ = BF_itoa64[c1]; | ||||
| 		c1 = (c2 & 0x0f) << 2; | ||||
| 		if (sptr >= end) { | ||||
| 			*dptr++ = BF_itoa64[c1]; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		c2 = *sptr++; | ||||
| 		c1 |= c2 >> 6; | ||||
| 		*dptr++ = BF_itoa64[c1]; | ||||
| 		*dptr++ = BF_itoa64[c2 & 0x3f]; | ||||
| 	} while (sptr < end); | ||||
| } | ||||
|  | ||||
| static void BF_swap(BF_word *x, int count) | ||||
| { | ||||
| 	static int endianness_check = 1; | ||||
| 	char *is_little_endian = (char *)&endianness_check; | ||||
| 	BF_word tmp; | ||||
|  | ||||
| 	if (*is_little_endian) | ||||
| 	do { | ||||
| 		tmp = *x; | ||||
| 		tmp = (tmp << 16) | (tmp >> 16); | ||||
| 		*x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF); | ||||
| 	} while (--count); | ||||
| } | ||||
|  | ||||
| #if BF_SCALE | ||||
| /* Architectures which can shift addresses left by 2 bits with no extra cost */ | ||||
| #define BF_ROUND(L, R, N) \ | ||||
| 	tmp1 = L & 0xFF; \ | ||||
| 	tmp2 = L >> 8; \ | ||||
| 	tmp2 &= 0xFF; \ | ||||
| 	tmp3 = L >> 16; \ | ||||
| 	tmp3 &= 0xFF; \ | ||||
| 	tmp4 = L >> 24; \ | ||||
| 	tmp1 = data.ctx.S[3][tmp1]; \ | ||||
| 	tmp2 = data.ctx.S[2][tmp2]; \ | ||||
| 	tmp3 = data.ctx.S[1][tmp3]; \ | ||||
| 	tmp3 += data.ctx.S[0][tmp4]; \ | ||||
| 	tmp3 ^= tmp2; \ | ||||
| 	R ^= data.ctx.P[N + 1]; \ | ||||
| 	tmp3 += tmp1; \ | ||||
| 	R ^= tmp3; | ||||
| #else | ||||
| /* Architectures with no complicated addressing modes supported */ | ||||
| #define BF_INDEX(S, i) \ | ||||
| 	(*((BF_word *)(((unsigned char *)S) + (i)))) | ||||
| #define BF_ROUND(L, R, N) \ | ||||
| 	tmp1 = L & 0xFF; \ | ||||
| 	tmp1 <<= 2; \ | ||||
| 	tmp2 = L >> 6; \ | ||||
| 	tmp2 &= 0x3FC; \ | ||||
| 	tmp3 = L >> 14; \ | ||||
| 	tmp3 &= 0x3FC; \ | ||||
| 	tmp4 = L >> 22; \ | ||||
| 	tmp4 &= 0x3FC; \ | ||||
| 	tmp1 = BF_INDEX(data.ctx.S[3], tmp1); \ | ||||
| 	tmp2 = BF_INDEX(data.ctx.S[2], tmp2); \ | ||||
| 	tmp3 = BF_INDEX(data.ctx.S[1], tmp3); \ | ||||
| 	tmp3 += BF_INDEX(data.ctx.S[0], tmp4); \ | ||||
| 	tmp3 ^= tmp2; \ | ||||
| 	R ^= data.ctx.P[N + 1]; \ | ||||
| 	tmp3 += tmp1; \ | ||||
| 	R ^= tmp3; | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Encrypt one block, BF_N is hardcoded here. | ||||
|  */ | ||||
| #define BF_ENCRYPT \ | ||||
| 	L ^= data.ctx.P[0]; \ | ||||
| 	BF_ROUND(L, R, 0); \ | ||||
| 	BF_ROUND(R, L, 1); \ | ||||
| 	BF_ROUND(L, R, 2); \ | ||||
| 	BF_ROUND(R, L, 3); \ | ||||
| 	BF_ROUND(L, R, 4); \ | ||||
| 	BF_ROUND(R, L, 5); \ | ||||
| 	BF_ROUND(L, R, 6); \ | ||||
| 	BF_ROUND(R, L, 7); \ | ||||
| 	BF_ROUND(L, R, 8); \ | ||||
| 	BF_ROUND(R, L, 9); \ | ||||
| 	BF_ROUND(L, R, 10); \ | ||||
| 	BF_ROUND(R, L, 11); \ | ||||
| 	BF_ROUND(L, R, 12); \ | ||||
| 	BF_ROUND(R, L, 13); \ | ||||
| 	BF_ROUND(L, R, 14); \ | ||||
| 	BF_ROUND(R, L, 15); \ | ||||
| 	tmp4 = R; \ | ||||
| 	R = L; \ | ||||
| 	L = tmp4 ^ data.ctx.P[BF_N + 1]; | ||||
|  | ||||
| #if BF_ASM | ||||
| #define BF_body() \ | ||||
| 	_BF_body_r(&data.ctx); | ||||
| #else | ||||
| #define BF_body() \ | ||||
| 	L = R = 0; \ | ||||
| 	ptr = data.ctx.P; \ | ||||
| 	do { \ | ||||
| 		ptr += 2; \ | ||||
| 		BF_ENCRYPT; \ | ||||
| 		*(ptr - 2) = L; \ | ||||
| 		*(ptr - 1) = R; \ | ||||
| 	} while (ptr < &data.ctx.P[BF_N + 2]); \ | ||||
| \ | ||||
| 	ptr = data.ctx.S[0]; \ | ||||
| 	do { \ | ||||
| 		ptr += 2; \ | ||||
| 		BF_ENCRYPT; \ | ||||
| 		*(ptr - 2) = L; \ | ||||
| 		*(ptr - 1) = R; \ | ||||
| 	} while (ptr < &data.ctx.S[3][0xFF]); | ||||
| #endif | ||||
|  | ||||
| static void BF_set_key(const char *key, BF_key expanded, BF_key initial, | ||||
|     unsigned char flags) | ||||
| { | ||||
| 	const char *ptr = key; | ||||
| 	unsigned int bug, i, j; | ||||
| 	BF_word safety, sign, diff, tmp[2]; | ||||
|  | ||||
| /* | ||||
|  * There was a sign extension bug in older revisions of this function.  While | ||||
|  * we would have liked to simply fix the bug and move on, we have to provide | ||||
|  * a backwards compatibility feature (essentially the bug) for some systems and | ||||
|  * a safety measure for some others.  The latter is needed because for certain | ||||
|  * multiple inputs to the buggy algorithm there exist easily found inputs to | ||||
|  * the correct algorithm that produce the same hash.  Thus, we optionally | ||||
|  * deviate from the correct algorithm just enough to avoid such collisions. | ||||
|  * While the bug itself affected the majority of passwords containing | ||||
|  * characters with the 8th bit set (although only a percentage of those in a | ||||
|  * collision-producing way), the anti-collision safety measure affects | ||||
|  * only a subset of passwords containing the '\xff' character (not even all of | ||||
|  * those passwords, just some of them).  This character is not found in valid | ||||
|  * UTF-8 sequences and is rarely used in popular 8-bit character encodings. | ||||
|  * Thus, the safety measure is unlikely to cause much annoyance, and is a | ||||
|  * reasonable tradeoff to use when authenticating against existing hashes that | ||||
|  * are not reliably known to have been computed with the correct algorithm. | ||||
|  * | ||||
|  * We use an approach that tries to minimize side-channel leaks of password | ||||
|  * information - that is, we mostly use fixed-cost bitwise operations instead | ||||
|  * of branches or table lookups.  (One conditional branch based on password | ||||
|  * length remains.  It is not part of the bug aftermath, though, and is | ||||
|  * difficult and possibly unreasonable to avoid given the use of C strings by | ||||
|  * the caller, which results in similar timing leaks anyway.) | ||||
|  * | ||||
|  * For actual implementation, we set an array index in the variable "bug" | ||||
|  * (0 means no bug, 1 means sign extension bug emulation) and a flag in the | ||||
|  * variable "safety" (bit 16 is set when the safety measure is requested). | ||||
|  * Valid combinations of settings are: | ||||
|  * | ||||
|  * Prefix "$2a$": bug = 0, safety = 0x10000 | ||||
|  * Prefix "$2b$": bug = 0, safety = 0 | ||||
|  * Prefix "$2x$": bug = 1, safety = 0 | ||||
|  * Prefix "$2y$": bug = 0, safety = 0 | ||||
|  */ | ||||
| 	bug = (unsigned int)flags & 1; | ||||
| 	safety = ((BF_word)flags & 2) << 15; | ||||
|  | ||||
| 	sign = diff = 0; | ||||
|  | ||||
| 	for (i = 0; i < BF_N + 2; i++) { | ||||
| 		tmp[0] = tmp[1] = 0; | ||||
| 		for (j = 0; j < 4; j++) { | ||||
| 			tmp[0] <<= 8; | ||||
| 			tmp[0] |= (unsigned char)*ptr; /* correct */ | ||||
| 			tmp[1] <<= 8; | ||||
| 			tmp[1] |= (BF_word_signed)(signed char)*ptr; /* bug */ | ||||
| /* | ||||
|  * Sign extension in the first char has no effect - nothing to overwrite yet, | ||||
|  * and those extra 24 bits will be fully shifted out of the 32-bit word.  For | ||||
|  * chars 2, 3, 4 in each four-char block, we set bit 7 of "sign" if sign | ||||
|  * extension in tmp[1] occurs.  Once this flag is set, it remains set. | ||||
|  */ | ||||
| 			if (j) | ||||
| 				sign |= tmp[1] & 0x80; | ||||
| 			if (!*ptr) | ||||
| 				ptr = key; | ||||
| 			else | ||||
| 				ptr++; | ||||
| 		} | ||||
| 		diff |= tmp[0] ^ tmp[1]; /* Non-zero on any differences */ | ||||
|  | ||||
| 		expanded[i] = tmp[bug]; | ||||
| 		initial[i] = BF_init_state.P[i] ^ tmp[bug]; | ||||
| 	} | ||||
|  | ||||
| /* | ||||
|  * At this point, "diff" is zero iff the correct and buggy algorithms produced | ||||
|  * exactly the same result.  If so and if "sign" is non-zero, which indicates | ||||
|  * that there was a non-benign sign extension, this means that we have a | ||||
|  * collision between the correctly computed hash for this password and a set of | ||||
|  * passwords that could be supplied to the buggy algorithm.  Our safety measure | ||||
|  * is meant to protect from such many-buggy to one-correct collisions, by | ||||
|  * deviating from the correct algorithm in such cases.  Let's check for this. | ||||
|  */ | ||||
| 	diff |= diff >> 16; /* still zero iff exact match */ | ||||
| 	diff &= 0xffff; /* ditto */ | ||||
| 	diff += 0xffff; /* bit 16 set iff "diff" was non-zero (on non-match) */ | ||||
| 	sign <<= 9; /* move the non-benign sign extension flag to bit 16 */ | ||||
| 	sign &= ~diff & safety; /* action needed? */ | ||||
|  | ||||
| /* | ||||
|  * If we have determined that we need to deviate from the correct algorithm, | ||||
|  * flip bit 16 in initial expanded key.  (The choice of 16 is arbitrary, but | ||||
|  * let's stick to it now.  It came out of the approach we used above, and it's | ||||
|  * not any worse than any other choice we could make.) | ||||
|  * | ||||
|  * It is crucial that we don't do the same to the expanded key used in the main | ||||
|  * Eksblowfish loop.  By doing it to only one of these two, we deviate from a | ||||
|  * state that could be directly specified by a password to the buggy algorithm | ||||
|  * (and to the fully correct one as well, but that's a side-effect). | ||||
|  */ | ||||
| 	initial[0] ^= sign; | ||||
| } | ||||
|  | ||||
| static const unsigned char flags_by_subtype[26] = | ||||
| 	{2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0}; | ||||
|  | ||||
| static char *BF_crypt(const char *key, const char *setting, | ||||
| 	char *output, int size, | ||||
| 	BF_word min) | ||||
| { | ||||
| #if BF_ASM | ||||
| 	extern void _BF_body_r(BF_ctx *ctx); | ||||
| #endif | ||||
| 	struct { | ||||
| 		BF_ctx ctx; | ||||
| 		BF_key expanded_key; | ||||
| 		union { | ||||
| 			BF_word salt[4]; | ||||
| 			BF_word output[6]; | ||||
| 		} binary; | ||||
| 	} data; | ||||
| 	BF_word L, R; | ||||
| 	BF_word tmp1, tmp2, tmp3, tmp4; | ||||
| 	BF_word *ptr; | ||||
| 	BF_word count; | ||||
| 	int i; | ||||
|  | ||||
| 	if (size < 7 + 22 + 31 + 1) { | ||||
| 		__set_errno(ERANGE); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (setting[0] != '$' || | ||||
| 	    setting[1] != '2' || | ||||
| 	    setting[2] < 'a' || setting[2] > 'z' || | ||||
| 	    !flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a'] || | ||||
| 	    setting[3] != '$' || | ||||
| 	    setting[4] < '0' || setting[4] > '3' || | ||||
| 	    setting[5] < '0' || setting[5] > '9' || | ||||
| 	    (setting[4] == '3' && setting[5] > '1') || | ||||
| 	    setting[6] != '$') { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	count = (BF_word)1 << ((setting[4] - '0') * 10 + (setting[5] - '0')); | ||||
| 	if (count < min || BF_decode(data.binary.salt, &setting[7], 16)) { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	BF_swap(data.binary.salt, 4); | ||||
|  | ||||
| 	BF_set_key(key, data.expanded_key, data.ctx.P, | ||||
| 	    flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a']); | ||||
|  | ||||
| 	memcpy(data.ctx.S, BF_init_state.S, sizeof(data.ctx.S)); | ||||
|  | ||||
| 	L = R = 0; | ||||
| 	for (i = 0; i < BF_N + 2; i += 2) { | ||||
| 		L ^= data.binary.salt[i & 2]; | ||||
| 		R ^= data.binary.salt[(i & 2) + 1]; | ||||
| 		BF_ENCRYPT; | ||||
| 		data.ctx.P[i] = L; | ||||
| 		data.ctx.P[i + 1] = R; | ||||
| 	} | ||||
|  | ||||
| 	ptr = data.ctx.S[0]; | ||||
| 	do { | ||||
| 		ptr += 4; | ||||
| 		L ^= data.binary.salt[(BF_N + 2) & 3]; | ||||
| 		R ^= data.binary.salt[(BF_N + 3) & 3]; | ||||
| 		BF_ENCRYPT; | ||||
| 		*(ptr - 4) = L; | ||||
| 		*(ptr - 3) = R; | ||||
|  | ||||
| 		L ^= data.binary.salt[(BF_N + 4) & 3]; | ||||
| 		R ^= data.binary.salt[(BF_N + 5) & 3]; | ||||
| 		BF_ENCRYPT; | ||||
| 		*(ptr - 2) = L; | ||||
| 		*(ptr - 1) = R; | ||||
| 	} while (ptr < &data.ctx.S[3][0xFF]); | ||||
|  | ||||
| 	do { | ||||
| 		int done; | ||||
|  | ||||
| 		for (i = 0; i < BF_N + 2; i += 2) { | ||||
| 			data.ctx.P[i] ^= data.expanded_key[i]; | ||||
| 			data.ctx.P[i + 1] ^= data.expanded_key[i + 1]; | ||||
| 		} | ||||
|  | ||||
| 		done = 0; | ||||
| 		do { | ||||
| 			BF_body(); | ||||
| 			if (done) | ||||
| 				break; | ||||
| 			done = 1; | ||||
|  | ||||
| 			tmp1 = data.binary.salt[0]; | ||||
| 			tmp2 = data.binary.salt[1]; | ||||
| 			tmp3 = data.binary.salt[2]; | ||||
| 			tmp4 = data.binary.salt[3]; | ||||
| 			for (i = 0; i < BF_N; i += 4) { | ||||
| 				data.ctx.P[i] ^= tmp1; | ||||
| 				data.ctx.P[i + 1] ^= tmp2; | ||||
| 				data.ctx.P[i + 2] ^= tmp3; | ||||
| 				data.ctx.P[i + 3] ^= tmp4; | ||||
| 			} | ||||
| 			data.ctx.P[16] ^= tmp1; | ||||
| 			data.ctx.P[17] ^= tmp2; | ||||
| 		} while (1); | ||||
| 	} while (--count); | ||||
|  | ||||
| 	for (i = 0; i < 6; i += 2) { | ||||
| 		L = BF_magic_w[i]; | ||||
| 		R = BF_magic_w[i + 1]; | ||||
|  | ||||
| 		count = 64; | ||||
| 		do { | ||||
| 			BF_ENCRYPT; | ||||
| 		} while (--count); | ||||
|  | ||||
| 		data.binary.output[i] = L; | ||||
| 		data.binary.output[i + 1] = R; | ||||
| 	} | ||||
|  | ||||
| 	memcpy(output, setting, 7 + 22 - 1); | ||||
| 	output[7 + 22 - 1] = BF_itoa64[(int) | ||||
| 		BF_atoi64[(int)setting[7 + 22 - 1] - 0x20] & 0x30]; | ||||
|  | ||||
| /* This has to be bug-compatible with the original implementation, so | ||||
|  * only encode 23 of the 24 bytes. :-) */ | ||||
| 	BF_swap(data.binary.output, 6); | ||||
| 	BF_encode(&output[7 + 22], data.binary.output, 23); | ||||
| 	output[7 + 22 + 31] = '\0'; | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| int _crypt_output_magic(const char *setting, char *output, int size) | ||||
| { | ||||
| 	if (size < 3) | ||||
| 		return -1; | ||||
|  | ||||
| 	output[0] = '*'; | ||||
| 	output[1] = '0'; | ||||
| 	output[2] = '\0'; | ||||
|  | ||||
| 	if (setting[0] == '*' && setting[1] == '0') | ||||
| 		output[1] = '1'; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Please preserve the runtime self-test.  It serves two purposes at once: | ||||
|  * | ||||
|  * 1. We really can't afford the risk of producing incompatible hashes e.g. | ||||
|  * when there's something like gcc bug 26587 again, whereas an application or | ||||
|  * library integrating this code might not also integrate our external tests or | ||||
|  * it might not run them after every build.  Even if it does, the miscompile | ||||
|  * might only occur on the production build, but not on a testing build (such | ||||
|  * as because of different optimization settings).  It is painful to recover | ||||
|  * from incorrectly-computed hashes - merely fixing whatever broke is not | ||||
|  * enough.  Thus, a proactive measure like this self-test is needed. | ||||
|  * | ||||
|  * 2. We don't want to leave sensitive data from our actual password hash | ||||
|  * computation on the stack or in registers.  Previous revisions of the code | ||||
|  * would do explicit cleanups, but simply running the self-test after hash | ||||
|  * computation is more reliable. | ||||
|  * | ||||
|  * The performance cost of this quick self-test is around 0.6% at the "$2a$08" | ||||
|  * setting. | ||||
|  */ | ||||
| char *_crypt_blowfish_rn(const char *key, const char *setting, | ||||
| 	char *output, int size) | ||||
| { | ||||
| 	const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8"; | ||||
| 	const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu"; | ||||
| 	static const char * const test_hashes[2] = | ||||
| 		{"i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55", /* 'a', 'b', 'y' */ | ||||
| 		"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55"}; /* 'x' */ | ||||
| 	const char *test_hash = test_hashes[0]; | ||||
| 	char *retval; | ||||
| 	const char *p; | ||||
| 	int save_errno, ok; | ||||
| 	struct { | ||||
| 		char s[7 + 22 + 1]; | ||||
| 		char o[7 + 22 + 31 + 1 + 1 + 1]; | ||||
| 	} buf; | ||||
|  | ||||
| /* Hash the supplied password */ | ||||
| 	_crypt_output_magic(setting, output, size); | ||||
| 	retval = BF_crypt(key, setting, output, size, 16); | ||||
| 	save_errno = errno; | ||||
|  | ||||
| /* | ||||
|  * Do a quick self-test.  It is important that we make both calls to BF_crypt() | ||||
|  * from the same scope such that they likely use the same stack locations, | ||||
|  * which makes the second call overwrite the first call's sensitive data on the | ||||
|  * stack and makes it more likely that any alignment related issues would be | ||||
|  * detected by the self-test. | ||||
|  */ | ||||
| 	memcpy(buf.s, test_setting, sizeof(buf.s)); | ||||
| 	if (retval) { | ||||
| 		unsigned int flags = flags_by_subtype[ | ||||
| 		    (unsigned int)(unsigned char)setting[2] - 'a']; | ||||
| 		test_hash = test_hashes[flags & 1]; | ||||
| 		buf.s[2] = setting[2]; | ||||
| 	} | ||||
| 	memset(buf.o, 0x55, sizeof(buf.o)); | ||||
| 	buf.o[sizeof(buf.o) - 1] = 0; | ||||
| 	p = BF_crypt(test_key, buf.s, buf.o, sizeof(buf.o) - (1 + 1), 1); | ||||
|  | ||||
| 	ok = (p == buf.o && | ||||
| 	    !memcmp(p, buf.s, 7 + 22) && | ||||
| 	    !memcmp(p + (7 + 22), test_hash, 31 + 1 + 1 + 1)); | ||||
|  | ||||
| 	{ | ||||
| 		const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345"; | ||||
| 		BF_key ae, ai, ye, yi; | ||||
| 		BF_set_key(k, ae, ai, 2); /* $2a$ */ | ||||
| 		BF_set_key(k, ye, yi, 4); /* $2y$ */ | ||||
| 		ai[0] ^= 0x10000; /* undo the safety (for comparison) */ | ||||
| 		ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 && | ||||
| 		    !memcmp(ae, ye, sizeof(ae)) && | ||||
| 		    !memcmp(ai, yi, sizeof(ai)); | ||||
| 	} | ||||
|  | ||||
| 	__set_errno(save_errno); | ||||
| 	if (ok) | ||||
| 		return retval; | ||||
|  | ||||
| /* Should not happen */ | ||||
| 	_crypt_output_magic(setting, output, size); | ||||
| 	__set_errno(EINVAL); /* pretend we don't support this hash type */ | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| char *_crypt_gensalt_blowfish_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size) | ||||
| { | ||||
| 	if (size < 16 || output_size < 7 + 22 + 1 || | ||||
| 	    (count && (count < 4 || count > 31)) || | ||||
| 	    prefix[0] != '$' || prefix[1] != '2' || | ||||
| 	    (prefix[2] != 'a' && prefix[2] != 'b' && prefix[2] != 'y')) { | ||||
| 		if (output_size > 0) output[0] = '\0'; | ||||
| 		__set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (!count) count = 5; | ||||
|  | ||||
| 	output[0] = '$'; | ||||
| 	output[1] = '2'; | ||||
| 	output[2] = prefix[2]; | ||||
| 	output[3] = '$'; | ||||
| 	output[4] = '0' + count / 10; | ||||
| 	output[5] = '0' + count % 10; | ||||
| 	output[6] = '$'; | ||||
|  | ||||
| 	BF_encode(&output[7], (const BF_word *)input, 16); | ||||
| 	output[7 + 22] = '\0'; | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
							
								
								
									
										27
									
								
								deps/crypt_blowfish/crypt_blowfish.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								deps/crypt_blowfish/crypt_blowfish.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #ifndef _CRYPT_BLOWFISH_H | ||||
| #define _CRYPT_BLOWFISH_H | ||||
|  | ||||
| extern int _crypt_output_magic(const char *setting, char *output, int size); | ||||
| extern char *_crypt_blowfish_rn(const char *key, const char *setting, | ||||
| 	char *output, int size); | ||||
| extern char *_crypt_gensalt_blowfish_rn(const char *prefix, | ||||
| 	unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										124
									
								
								deps/crypt_blowfish/crypt_gensalt.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										124
									
								
								deps/crypt_blowfish/crypt_gensalt.c
									
									
									
									
										vendored
									
									
								
							| @@ -1,124 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  * | ||||
|  * This file contains salt generation functions for the traditional and | ||||
|  * other common crypt(3) algorithms, except for bcrypt which is defined | ||||
|  * entirely in crypt_blowfish.c. | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include <errno.h> | ||||
| #ifndef __set_errno | ||||
| #define __set_errno(val) errno = (val) | ||||
| #endif | ||||
|  | ||||
| /* Just to make sure the prototypes match the actual definitions */ | ||||
| #include "crypt_gensalt.h" | ||||
|  | ||||
| unsigned char _crypt_itoa64[64 + 1] = | ||||
| 	"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||
|  | ||||
| char *_crypt_gensalt_traditional_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size) | ||||
| { | ||||
| 	(void) prefix; | ||||
|  | ||||
| 	if (size < 2 || output_size < 2 + 1 || (count && count != 25)) { | ||||
| 		if (output_size > 0) output[0] = '\0'; | ||||
| 		__set_errno((output_size < 2 + 1) ? ERANGE : EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	output[0] = _crypt_itoa64[(unsigned int)input[0] & 0x3f]; | ||||
| 	output[1] = _crypt_itoa64[(unsigned int)input[1] & 0x3f]; | ||||
| 	output[2] = '\0'; | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| char *_crypt_gensalt_extended_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size) | ||||
| { | ||||
| 	unsigned long value; | ||||
|  | ||||
| 	(void) prefix; | ||||
|  | ||||
| /* Even iteration counts make it easier to detect weak DES keys from a look | ||||
|  * at the hash, so they should be avoided */ | ||||
| 	if (size < 3 || output_size < 1 + 4 + 4 + 1 || | ||||
| 	    (count && (count > 0xffffff || !(count & 1)))) { | ||||
| 		if (output_size > 0) output[0] = '\0'; | ||||
| 		__set_errno((output_size < 1 + 4 + 4 + 1) ? ERANGE : EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (!count) count = 725; | ||||
|  | ||||
| 	output[0] = '_'; | ||||
| 	output[1] = _crypt_itoa64[count & 0x3f]; | ||||
| 	output[2] = _crypt_itoa64[(count >> 6) & 0x3f]; | ||||
| 	output[3] = _crypt_itoa64[(count >> 12) & 0x3f]; | ||||
| 	output[4] = _crypt_itoa64[(count >> 18) & 0x3f]; | ||||
| 	value = (unsigned long)(unsigned char)input[0] | | ||||
| 		((unsigned long)(unsigned char)input[1] << 8) | | ||||
| 		((unsigned long)(unsigned char)input[2] << 16); | ||||
| 	output[5] = _crypt_itoa64[value & 0x3f]; | ||||
| 	output[6] = _crypt_itoa64[(value >> 6) & 0x3f]; | ||||
| 	output[7] = _crypt_itoa64[(value >> 12) & 0x3f]; | ||||
| 	output[8] = _crypt_itoa64[(value >> 18) & 0x3f]; | ||||
| 	output[9] = '\0'; | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| char *_crypt_gensalt_md5_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size) | ||||
| { | ||||
| 	unsigned long value; | ||||
|  | ||||
| 	(void) prefix; | ||||
|  | ||||
| 	if (size < 3 || output_size < 3 + 4 + 1 || (count && count != 1000)) { | ||||
| 		if (output_size > 0) output[0] = '\0'; | ||||
| 		__set_errno((output_size < 3 + 4 + 1) ? ERANGE : EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	output[0] = '$'; | ||||
| 	output[1] = '1'; | ||||
| 	output[2] = '$'; | ||||
| 	value = (unsigned long)(unsigned char)input[0] | | ||||
| 		((unsigned long)(unsigned char)input[1] << 8) | | ||||
| 		((unsigned long)(unsigned char)input[2] << 16); | ||||
| 	output[3] = _crypt_itoa64[value & 0x3f]; | ||||
| 	output[4] = _crypt_itoa64[(value >> 6) & 0x3f]; | ||||
| 	output[5] = _crypt_itoa64[(value >> 12) & 0x3f]; | ||||
| 	output[6] = _crypt_itoa64[(value >> 18) & 0x3f]; | ||||
| 	output[7] = '\0'; | ||||
|  | ||||
| 	if (size >= 6 && output_size >= 3 + 4 + 4 + 1) { | ||||
| 		value = (unsigned long)(unsigned char)input[3] | | ||||
| 			((unsigned long)(unsigned char)input[4] << 8) | | ||||
| 			((unsigned long)(unsigned char)input[5] << 16); | ||||
| 		output[7] = _crypt_itoa64[value & 0x3f]; | ||||
| 		output[8] = _crypt_itoa64[(value >> 6) & 0x3f]; | ||||
| 		output[9] = _crypt_itoa64[(value >> 12) & 0x3f]; | ||||
| 		output[10] = _crypt_itoa64[(value >> 18) & 0x3f]; | ||||
| 		output[11] = '\0'; | ||||
| 	} | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
							
								
								
									
										30
									
								
								deps/crypt_blowfish/crypt_gensalt.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								deps/crypt_blowfish/crypt_gensalt.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,30 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #ifndef _CRYPT_GENSALT_H | ||||
| #define _CRYPT_GENSALT_H | ||||
|  | ||||
| extern unsigned char _crypt_itoa64[]; | ||||
| extern char *_crypt_gensalt_traditional_rn(const char *prefix, | ||||
| 	unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size); | ||||
| extern char *_crypt_gensalt_extended_rn(const char *prefix, | ||||
| 	unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size); | ||||
| extern char *_crypt_gensalt_md5_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										53
									
								
								deps/crypt_blowfish/glibc-2.1.3-crypt.diff
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								deps/crypt_blowfish/glibc-2.1.3-crypt.diff
									
									
									
									
										vendored
									
									
								
							| @@ -1,53 +0,0 @@ | ||||
| --- glibc-2.1.3.orig/crypt/sysdeps/unix/Makefile	1997-03-05 00:33:59 +0000 | ||||
| +++ glibc-2.1.3/crypt/sysdeps/unix/Makefile	2000-06-11 03:13:41 +0000 | ||||
| @@ -1,4 +1,4 @@ | ||||
|  ifeq ($(subdir),md5-crypt) | ||||
| -libcrypt-routines += crypt crypt_util | ||||
| -dont_distribute += crypt.c crypt_util.c | ||||
| +libcrypt-routines += crypt crypt_util crypt_blowfish x86 crypt_gensalt wrapper | ||||
| +dont_distribute += crypt.c crypt_util.c crypt_blowfish.c x86.S crypt_gensalt.c wrapper.c | ||||
|  endif | ||||
| --- glibc-2.1.3.orig/crypt/sysdeps/unix/crypt-entry.c	1998-12-10 12:49:04 +0000 | ||||
| +++ glibc-2.1.3/crypt/sysdeps/unix/crypt-entry.c	2000-06-11 03:14:57 +0000 | ||||
| @@ -70,7 +70,7 @@ extern struct crypt_data _ufc_foobar; | ||||
|   */ | ||||
|   | ||||
|  char * | ||||
| -__crypt_r (key, salt, data) | ||||
| +__des_crypt_r (key, salt, data) | ||||
|       const char *key; | ||||
|       const char *salt; | ||||
|       struct crypt_data * __restrict data; | ||||
| @@ -115,6 +115,7 @@ __crypt_r (key, salt, data) | ||||
|    _ufc_output_conversion_r (res[0], res[1], salt, data); | ||||
|    return data->crypt_3_buf; | ||||
|  } | ||||
| +#if 0 | ||||
|  weak_alias (__crypt_r, crypt_r) | ||||
|   | ||||
|  char * | ||||
| @@ -147,3 +148,4 @@ __fcrypt (key, salt) | ||||
|    return crypt (key, salt); | ||||
|  } | ||||
|  #endif | ||||
| +#endif | ||||
| --- glibc-2.1.3.orig/md5-crypt/Makefile	1998-07-02 22:46:47 +0000 | ||||
| +++ glibc-2.1.3/md5-crypt/Makefile	2000-06-11 03:12:34 +0000 | ||||
| @@ -21,7 +21,7 @@ | ||||
|  # | ||||
|  subdir	:= md5-crypt | ||||
|   | ||||
| -headers := crypt.h | ||||
| +headers := crypt.h gnu-crypt.h ow-crypt.h | ||||
|   | ||||
|  distribute := md5.h | ||||
|   | ||||
| --- glibc-2.1.3.orig/md5-crypt/Versions	1998-07-02 22:32:07 +0000 | ||||
| +++ glibc-2.1.3/md5-crypt/Versions	2000-06-11 09:11:03 +0000 | ||||
| @@ -1,5 +1,6 @@ | ||||
|  libcrypt { | ||||
|    GLIBC_2.0 { | ||||
|      crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r; | ||||
| +    crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra; | ||||
|    } | ||||
|  } | ||||
							
								
								
									
										55
									
								
								deps/crypt_blowfish/glibc-2.14-crypt.diff
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								deps/crypt_blowfish/glibc-2.14-crypt.diff
									
									
									
									
										vendored
									
									
								
							| @@ -1,55 +0,0 @@ | ||||
| diff -urp glibc-2.14.orig/crypt/Makefile glibc-2.14/crypt/Makefile | ||||
| --- glibc-2.14.orig/crypt/Makefile	2011-05-31 04:12:33 +0000 | ||||
| +++ glibc-2.14/crypt/Makefile	2011-07-16 21:40:56 +0000 | ||||
| @@ -22,6 +22,7 @@ | ||||
|  subdir	:= crypt | ||||
|   | ||||
|  headers := crypt.h | ||||
| +headers += gnu-crypt.h ow-crypt.h | ||||
|   | ||||
|  extra-libs := libcrypt | ||||
|  extra-libs-others := $(extra-libs) | ||||
| @@ -29,6 +30,8 @@ extra-libs-others := $(extra-libs) | ||||
|  libcrypt-routines := crypt-entry md5-crypt sha256-crypt sha512-crypt crypt \ | ||||
|  		     crypt_util | ||||
|   | ||||
| +libcrypt-routines += crypt_blowfish x86 crypt_gensalt wrapper | ||||
| + | ||||
|  tests := cert md5c-test sha256c-test sha512c-test | ||||
|   | ||||
|  distribute := ufc-crypt.h crypt-private.h ufc.c speeds.c README.ufc-crypt \ | ||||
| diff -urp glibc-2.14.orig/crypt/Versions glibc-2.14/crypt/Versions | ||||
| --- glibc-2.14.orig/crypt/Versions	2011-05-31 04:12:33 +0000 | ||||
| +++ glibc-2.14/crypt/Versions	2011-07-16 21:40:56 +0000 | ||||
| @@ -1,5 +1,6 @@ | ||||
|  libcrypt { | ||||
|    GLIBC_2.0 { | ||||
|      crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r; | ||||
| +    crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra; | ||||
|    } | ||||
|  } | ||||
| diff -urp glibc-2.14.orig/crypt/crypt-entry.c glibc-2.14/crypt/crypt-entry.c | ||||
| --- glibc-2.14.orig/crypt/crypt-entry.c	2011-05-31 04:12:33 +0000 | ||||
| +++ glibc-2.14/crypt/crypt-entry.c	2011-07-16 21:40:56 +0000 | ||||
| @@ -82,7 +82,7 @@ extern struct crypt_data _ufc_foobar; | ||||
|   */ | ||||
|   | ||||
|  char * | ||||
| -__crypt_r (key, salt, data) | ||||
| +__des_crypt_r (key, salt, data) | ||||
|       const char *key; | ||||
|       const char *salt; | ||||
|       struct crypt_data * __restrict data; | ||||
| @@ -137,6 +137,7 @@ __crypt_r (key, salt, data) | ||||
|    _ufc_output_conversion_r (res[0], res[1], salt, data); | ||||
|    return data->crypt_3_buf; | ||||
|  } | ||||
| +#if 0 | ||||
|  weak_alias (__crypt_r, crypt_r) | ||||
|   | ||||
|  char * | ||||
| @@ -177,3 +178,4 @@ __fcrypt (key, salt) | ||||
|    return crypt (key, salt); | ||||
|  } | ||||
|  #endif | ||||
| +#endif | ||||
							
								
								
									
										52
									
								
								deps/crypt_blowfish/glibc-2.3.6-crypt.diff
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								deps/crypt_blowfish/glibc-2.3.6-crypt.diff
									
									
									
									
										vendored
									
									
								
							| @@ -1,52 +0,0 @@ | ||||
| --- glibc-2.3.6.orig/crypt/Makefile	2001-07-06 04:54:45 +0000 | ||||
| +++ glibc-2.3.6/crypt/Makefile	2004-02-27 00:23:48 +0000 | ||||
| @@ -21,14 +21,14 @@ | ||||
|  # | ||||
|  subdir	:= crypt | ||||
|   | ||||
| -headers := crypt.h | ||||
| +headers := crypt.h gnu-crypt.h ow-crypt.h | ||||
|   | ||||
|  distribute := md5.h | ||||
|   | ||||
|  extra-libs := libcrypt | ||||
|  extra-libs-others := $(extra-libs) | ||||
|   | ||||
| -libcrypt-routines := crypt-entry md5-crypt md5 crypt crypt_util | ||||
| +libcrypt-routines := crypt-entry md5-crypt md5 crypt crypt_util crypt_blowfish x86 crypt_gensalt wrapper | ||||
|   | ||||
|  tests = cert md5test md5c-test | ||||
|   | ||||
| --- glibc-2.3.6.orig/crypt/Versions	2000-03-04 00:47:30 +0000 | ||||
| +++ glibc-2.3.6/crypt/Versions	2004-02-27 00:25:15 +0000 | ||||
| @@ -1,5 +1,6 @@ | ||||
|  libcrypt { | ||||
|    GLIBC_2.0 { | ||||
|      crypt; crypt_r; encrypt; encrypt_r; fcrypt; setkey; setkey_r; | ||||
| +    crypt_rn; crypt_ra; crypt_gensalt; crypt_gensalt_rn; crypt_gensalt_ra; | ||||
|    } | ||||
|  } | ||||
| --- glibc-2.3.6.orig/crypt/crypt-entry.c	2001-07-06 05:18:49 +0000 | ||||
| +++ glibc-2.3.6/crypt/crypt-entry.c	2004-02-27 00:12:32 +0000 | ||||
| @@ -70,7 +70,7 @@ extern struct crypt_data _ufc_foobar; | ||||
|   */ | ||||
|   | ||||
|  char * | ||||
| -__crypt_r (key, salt, data) | ||||
| +__des_crypt_r (key, salt, data) | ||||
|       const char *key; | ||||
|       const char *salt; | ||||
|       struct crypt_data * __restrict data; | ||||
| @@ -115,6 +115,7 @@ __crypt_r (key, salt, data) | ||||
|    _ufc_output_conversion_r (res[0], res[1], salt, data); | ||||
|    return data->crypt_3_buf; | ||||
|  } | ||||
| +#if 0 | ||||
|  weak_alias (__crypt_r, crypt_r) | ||||
|   | ||||
|  char * | ||||
| @@ -147,3 +148,4 @@ __fcrypt (key, salt) | ||||
|    return crypt (key, salt); | ||||
|  } | ||||
|  #endif | ||||
| +#endif | ||||
							
								
								
									
										43
									
								
								deps/crypt_blowfish/ow-crypt.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								deps/crypt_blowfish/ow-crypt.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,43 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2011. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #ifndef _OW_CRYPT_H | ||||
| #define _OW_CRYPT_H | ||||
|  | ||||
| #ifndef __GNUC__ | ||||
| #undef __const | ||||
| #define __const const | ||||
| #endif | ||||
|  | ||||
| #ifndef __SKIP_GNU | ||||
| extern char *crypt(__const char *key, __const char *setting); | ||||
| extern char *crypt_r(__const char *key, __const char *setting, void *data); | ||||
| #endif | ||||
|  | ||||
| #ifndef __SKIP_OW | ||||
| extern char *crypt_rn(__const char *key, __const char *setting, | ||||
| 	void *data, int size); | ||||
| extern char *crypt_ra(__const char *key, __const char *setting, | ||||
| 	void **data, int *size); | ||||
| extern char *crypt_gensalt(__const char *prefix, unsigned long count, | ||||
| 	__const char *input, int size); | ||||
| extern char *crypt_gensalt_rn(__const char *prefix, unsigned long count, | ||||
| 	__const char *input, int size, char *output, int output_size); | ||||
| extern char *crypt_gensalt_ra(__const char *prefix, unsigned long count, | ||||
| 	__const char *input, int size); | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										551
									
								
								deps/crypt_blowfish/wrapper.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										551
									
								
								deps/crypt_blowfish/wrapper.c
									
									
									
									
										vendored
									
									
								
							| @@ -1,551 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 2000-2014. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 2000-2014 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include <errno.h> | ||||
| #ifndef __set_errno | ||||
| #define __set_errno(val) errno = (val) | ||||
| #endif | ||||
|  | ||||
| #ifdef TEST | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
| #include <signal.h> | ||||
| #include <time.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/times.h> | ||||
| #ifdef TEST_THREADS | ||||
| #include <pthread.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #define CRYPT_OUTPUT_SIZE		(7 + 22 + 31 + 1) | ||||
| #define CRYPT_GENSALT_OUTPUT_SIZE	(7 + 22 + 1) | ||||
|  | ||||
| #if defined(__GLIBC__) && defined(_LIBC) | ||||
| #define __SKIP_GNU | ||||
| #endif | ||||
| #include "ow-crypt.h" | ||||
|  | ||||
| #include "crypt_blowfish.h" | ||||
| #include "crypt_gensalt.h" | ||||
|  | ||||
| #if defined(__GLIBC__) && defined(_LIBC) | ||||
| /* crypt.h from glibc-crypt-2.1 will define struct crypt_data for us */ | ||||
| #include "crypt.h" | ||||
| extern char *__md5_crypt_r(const char *key, const char *salt, | ||||
| 	char *buffer, int buflen); | ||||
| /* crypt-entry.c needs to be patched to define __des_crypt_r rather than | ||||
|  * __crypt_r, and not define crypt_r and crypt at all */ | ||||
| extern char *__des_crypt_r(const char *key, const char *salt, | ||||
| 	struct crypt_data *data); | ||||
| extern struct crypt_data _ufc_foobar; | ||||
| #endif | ||||
|  | ||||
| static int _crypt_data_alloc(void **data, int *size, int need) | ||||
| { | ||||
| 	void *updated; | ||||
|  | ||||
| 	if (*data && *size >= need) return 0; | ||||
|  | ||||
| 	updated = realloc(*data, need); | ||||
|  | ||||
| 	if (!updated) { | ||||
| #ifndef __GLIBC__ | ||||
| 		/* realloc(3) on glibc sets errno, so we don't need to bother */ | ||||
| 		__set_errno(ENOMEM); | ||||
| #endif | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| #if defined(__GLIBC__) && defined(_LIBC) | ||||
| 	if (need >= sizeof(struct crypt_data)) | ||||
| 		((struct crypt_data *)updated)->initialized = 0; | ||||
| #endif | ||||
|  | ||||
| 	*data = updated; | ||||
| 	*size = need; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static char *_crypt_retval_magic(char *retval, const char *setting, | ||||
| 	char *output, int size) | ||||
| { | ||||
| 	if (retval) | ||||
| 		return retval; | ||||
|  | ||||
| 	if (_crypt_output_magic(setting, output, size)) | ||||
| 		return NULL; /* shouldn't happen */ | ||||
|  | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| #if defined(__GLIBC__) && defined(_LIBC) | ||||
| /* | ||||
|  * Applications may re-use the same instance of struct crypt_data without | ||||
|  * resetting the initialized field in order to let crypt_r() skip some of | ||||
|  * its initialization code.  Thus, it is important that our multiple hashing | ||||
|  * algorithms either don't conflict with each other in their use of the | ||||
|  * data area or reset the initialized field themselves whenever required. | ||||
|  * Currently, the hashing algorithms simply have no conflicts: the first | ||||
|  * field of struct crypt_data is the 128-byte large DES key schedule which | ||||
|  * __des_crypt_r() calculates each time it is called while the two other | ||||
|  * hashing algorithms use less than 128 bytes of the data area. | ||||
|  */ | ||||
|  | ||||
| char *__crypt_rn(__const char *key, __const char *setting, | ||||
| 	void *data, int size) | ||||
| { | ||||
| 	if (setting[0] == '$' && setting[1] == '2') | ||||
| 		return _crypt_blowfish_rn(key, setting, (char *)data, size); | ||||
| 	if (setting[0] == '$' && setting[1] == '1') | ||||
| 		return __md5_crypt_r(key, setting, (char *)data, size); | ||||
| 	if (setting[0] == '$' || setting[0] == '_') { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	if (size >= sizeof(struct crypt_data)) | ||||
| 		return __des_crypt_r(key, setting, (struct crypt_data *)data); | ||||
| 	__set_errno(ERANGE); | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| char *__crypt_ra(__const char *key, __const char *setting, | ||||
| 	void **data, int *size) | ||||
| { | ||||
| 	if (setting[0] == '$' && setting[1] == '2') { | ||||
| 		if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE)) | ||||
| 			return NULL; | ||||
| 		return _crypt_blowfish_rn(key, setting, (char *)*data, *size); | ||||
| 	} | ||||
| 	if (setting[0] == '$' && setting[1] == '1') { | ||||
| 		if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE)) | ||||
| 			return NULL; | ||||
| 		return __md5_crypt_r(key, setting, (char *)*data, *size); | ||||
| 	} | ||||
| 	if (setting[0] == '$' || setting[0] == '_') { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	if (_crypt_data_alloc(data, size, sizeof(struct crypt_data))) | ||||
| 		return NULL; | ||||
| 	return __des_crypt_r(key, setting, (struct crypt_data *)*data); | ||||
| } | ||||
|  | ||||
| char *__crypt_r(__const char *key, __const char *setting, | ||||
| 	struct crypt_data *data) | ||||
| { | ||||
| 	return _crypt_retval_magic( | ||||
| 		__crypt_rn(key, setting, data, sizeof(*data)), | ||||
| 		setting, (char *)data, sizeof(*data)); | ||||
| } | ||||
|  | ||||
| char *__crypt(__const char *key, __const char *setting) | ||||
| { | ||||
| 	return _crypt_retval_magic( | ||||
| 		__crypt_rn(key, setting, &_ufc_foobar, sizeof(_ufc_foobar)), | ||||
| 		setting, (char *)&_ufc_foobar, sizeof(_ufc_foobar)); | ||||
| } | ||||
| #else | ||||
| char *crypt_rn(const char *key, const char *setting, void *data, int size) | ||||
| { | ||||
| 	return _crypt_blowfish_rn(key, setting, (char *)data, size); | ||||
| } | ||||
|  | ||||
| char *crypt_ra(const char *key, const char *setting, | ||||
| 	void **data, int *size) | ||||
| { | ||||
| 	if (_crypt_data_alloc(data, size, CRYPT_OUTPUT_SIZE)) | ||||
| 		return NULL; | ||||
| 	return _crypt_blowfish_rn(key, setting, (char *)*data, *size); | ||||
| } | ||||
|  | ||||
| char *crypt_r(const char *key, const char *setting, void *data) | ||||
| { | ||||
| 	return _crypt_retval_magic( | ||||
| 		crypt_rn(key, setting, data, CRYPT_OUTPUT_SIZE), | ||||
| 		setting, (char *)data, CRYPT_OUTPUT_SIZE); | ||||
| } | ||||
|  | ||||
| char *crypt(const char *key, const char *setting) | ||||
| { | ||||
| 	static char output[CRYPT_OUTPUT_SIZE]; | ||||
|  | ||||
| 	return _crypt_retval_magic( | ||||
| 		crypt_rn(key, setting, output, sizeof(output)), | ||||
| 		setting, output, sizeof(output)); | ||||
| } | ||||
|  | ||||
| #define __crypt_gensalt_rn crypt_gensalt_rn | ||||
| #define __crypt_gensalt_ra crypt_gensalt_ra | ||||
| #define __crypt_gensalt crypt_gensalt | ||||
| #endif | ||||
|  | ||||
| char *__crypt_gensalt_rn(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size, char *output, int output_size) | ||||
| { | ||||
| 	char *(*use)(const char *_prefix, unsigned long _count, | ||||
| 		const char *_input, int _size, | ||||
| 		char *_output, int _output_size); | ||||
|  | ||||
| 	/* This may be supported on some platforms in the future */ | ||||
| 	if (!input) { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if (!strncmp(prefix, "$2a$", 4) || !strncmp(prefix, "$2b$", 4) || | ||||
| 	    !strncmp(prefix, "$2y$", 4)) | ||||
| 		use = _crypt_gensalt_blowfish_rn; | ||||
| 	else | ||||
| 	if (!strncmp(prefix, "$1$", 3)) | ||||
| 		use = _crypt_gensalt_md5_rn; | ||||
| 	else | ||||
| 	if (prefix[0] == '_') | ||||
| 		use = _crypt_gensalt_extended_rn; | ||||
| 	else | ||||
| 	if (!prefix[0] || | ||||
| 	    (prefix[0] && prefix[1] && | ||||
| 	    memchr(_crypt_itoa64, prefix[0], 64) && | ||||
| 	    memchr(_crypt_itoa64, prefix[1], 64))) | ||||
| 		use = _crypt_gensalt_traditional_rn; | ||||
| 	else { | ||||
| 		__set_errno(EINVAL); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	return use(prefix, count, input, size, output, output_size); | ||||
| } | ||||
|  | ||||
| char *__crypt_gensalt_ra(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size) | ||||
| { | ||||
| 	char output[CRYPT_GENSALT_OUTPUT_SIZE]; | ||||
| 	char *retval; | ||||
|  | ||||
| 	retval = __crypt_gensalt_rn(prefix, count, | ||||
| 		input, size, output, sizeof(output)); | ||||
|  | ||||
| 	if (retval) { | ||||
| 		retval = strdup(retval); | ||||
| #ifndef __GLIBC__ | ||||
| 		/* strdup(3) on glibc sets errno, so we don't need to bother */ | ||||
| 		if (!retval) | ||||
| 			__set_errno(ENOMEM); | ||||
| #endif | ||||
| 	} | ||||
|  | ||||
| 	return retval; | ||||
| } | ||||
|  | ||||
| char *__crypt_gensalt(const char *prefix, unsigned long count, | ||||
| 	const char *input, int size) | ||||
| { | ||||
| 	static char output[CRYPT_GENSALT_OUTPUT_SIZE]; | ||||
|  | ||||
| 	return __crypt_gensalt_rn(prefix, count, | ||||
| 		input, size, output, sizeof(output)); | ||||
| } | ||||
|  | ||||
| #if defined(__GLIBC__) && defined(_LIBC) | ||||
| weak_alias(__crypt_rn, crypt_rn) | ||||
| weak_alias(__crypt_ra, crypt_ra) | ||||
| weak_alias(__crypt_r, crypt_r) | ||||
| weak_alias(__crypt, crypt) | ||||
| weak_alias(__crypt_gensalt_rn, crypt_gensalt_rn) | ||||
| weak_alias(__crypt_gensalt_ra, crypt_gensalt_ra) | ||||
| weak_alias(__crypt_gensalt, crypt_gensalt) | ||||
| weak_alias(crypt, fcrypt) | ||||
| #endif | ||||
|  | ||||
| #ifdef TEST | ||||
| static const char *tests[][3] = { | ||||
| 	{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW", | ||||
| 		"U*U"}, | ||||
| 	{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK", | ||||
| 		"U*U*"}, | ||||
| 	{"$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a", | ||||
| 		"U*U*U"}, | ||||
| 	{"$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui", | ||||
| 		"0123456789abcdefghijklmnopqrstuvwxyz" | ||||
| 		"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | ||||
| 		"chars after 72 are ignored"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", | ||||
| 		"\xa3"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", | ||||
| 		"\xff\xff\xa3"}, | ||||
| 	{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", | ||||
| 		"\xff\xff\xa3"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.nqd1wy.pTMdcvrRWxyiGL2eMz.2a85.", | ||||
| 		"\xff\xff\xa3"}, | ||||
| 	{"$2b$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e", | ||||
| 		"\xff\xff\xa3"}, | ||||
| 	{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq", | ||||
| 		"\xa3"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq", | ||||
| 		"\xa3"}, | ||||
| 	{"$2b$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq", | ||||
| 		"\xa3"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi", | ||||
| 		"1\xa3" "345"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi", | ||||
| 		"\xff\xa3" "345"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi", | ||||
| 		"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"}, | ||||
| 	{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi", | ||||
| 		"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.ZC1JEJ8Z4gPfpe1JOr/oyPXTWl9EFd.", | ||||
| 		"\xff\xa3" "34" "\xff\xff\xff\xa3" "345"}, | ||||
| 	{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e", | ||||
| 		"\xff\xa3" "345"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e", | ||||
| 		"\xff\xa3" "345"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS", | ||||
| 		"\xa3" "ab"}, | ||||
| 	{"$2x$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS", | ||||
| 		"\xa3" "ab"}, | ||||
| 	{"$2y$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS", | ||||
| 		"\xa3" "ab"}, | ||||
| 	{"$2x$05$6bNw2HLQYeqHYyBfLMsv/OiwqTymGIGzFsA4hOTWebfehXHNprcAS", | ||||
| 		"\xd1\x91"}, | ||||
| 	{"$2x$05$6bNw2HLQYeqHYyBfLMsv/O9LIGgn8OMzuDoHfof8AQimSGfcSWxnS", | ||||
| 		"\xd0\xc1\xd2\xcf\xcc\xd8"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6", | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" | ||||
| 		"chars after 72 are ignored as usual"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy", | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" | ||||
| 		"\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"}, | ||||
| 	{"$2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe", | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" | ||||
| 		"\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"}, | ||||
| 	{"$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy", | ||||
| 		""}, | ||||
| 	{"*0", "", "$2a$03$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*0", "", "$2a$32$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*0", "", "$2c$05$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*0", "", "$2z$05$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*0", "", "$2`$05$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*0", "", "$2{$05$CCCCCCCCCCCCCCCCCCCCC."}, | ||||
| 	{"*1", "", "*0"}, | ||||
| 	{NULL} | ||||
| }; | ||||
|  | ||||
| #define which				tests[0] | ||||
|  | ||||
| static volatile sig_atomic_t running; | ||||
|  | ||||
| static void handle_timer(int signum) | ||||
| { | ||||
| 	(void) signum; | ||||
| 	running = 0; | ||||
| } | ||||
|  | ||||
| static void *run(void *arg) | ||||
| { | ||||
| 	unsigned long count = 0; | ||||
| 	int i = 0; | ||||
| 	void *data = NULL; | ||||
| 	int size = 0x12345678; | ||||
|  | ||||
| 	do { | ||||
| 		const char *hash = tests[i][0]; | ||||
| 		const char *key = tests[i][1]; | ||||
| 		const char *setting = tests[i][2]; | ||||
|  | ||||
| 		if (!tests[++i][0]) | ||||
| 			i = 0; | ||||
|  | ||||
| 		if (setting && strlen(hash) < 30) /* not for benchmark */ | ||||
| 			continue; | ||||
|  | ||||
| 		if (strcmp(crypt_ra(key, hash, &data, &size), hash)) { | ||||
| 			printf("%d: FAILED (crypt_ra/%d/%lu)\n", | ||||
| 				(int)((char *)arg - (char *)0), i, count); | ||||
| 			free(data); | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		count++; | ||||
| 	} while (running); | ||||
|  | ||||
| 	free(data); | ||||
| 	return count + (char *)0; | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
| 	struct itimerval it; | ||||
| 	struct tms buf; | ||||
| 	clock_t clk_tck, start_real, start_virtual, end_real, end_virtual; | ||||
| 	unsigned long count; | ||||
| 	void *data; | ||||
| 	int size; | ||||
| 	char *setting1, *setting2; | ||||
| 	int i; | ||||
| #ifdef TEST_THREADS | ||||
| 	pthread_t t[TEST_THREADS]; | ||||
| 	void *t_retval; | ||||
| #endif | ||||
|  | ||||
| 	data = NULL; | ||||
| 	size = 0x12345678; | ||||
|  | ||||
| 	for (i = 0; tests[i][0]; i++) { | ||||
| 		const char *hash = tests[i][0]; | ||||
| 		const char *key = tests[i][1]; | ||||
| 		const char *setting = tests[i][2]; | ||||
| 		const char *p; | ||||
| 		int ok = !setting || strlen(hash) >= 30; | ||||
| 		int o_size; | ||||
| 		char s_buf[30], o_buf[61]; | ||||
| 		if (!setting) { | ||||
| 			memcpy(s_buf, hash, sizeof(s_buf) - 1); | ||||
| 			s_buf[sizeof(s_buf) - 1] = 0; | ||||
| 			setting = s_buf; | ||||
| 		} | ||||
|  | ||||
| 		__set_errno(0); | ||||
| 		p = crypt(key, setting); | ||||
| 		if ((!ok && !errno) || strcmp(p, hash)) { | ||||
| 			printf("FAILED (crypt/%d)\n", i); | ||||
| 			return 1; | ||||
| 		} | ||||
|  | ||||
| 		if (ok && strcmp(crypt(key, hash), hash)) { | ||||
| 			printf("FAILED (crypt/%d)\n", i); | ||||
| 			return 1; | ||||
| 		} | ||||
|  | ||||
| 		for (o_size = -1; o_size <= (int)sizeof(o_buf); o_size++) { | ||||
| 			int ok_n = ok && o_size == (int)sizeof(o_buf); | ||||
| 			const char *x = "abc"; | ||||
| 			strcpy(o_buf, x); | ||||
| 			if (o_size >= 3) { | ||||
| 				x = "*0"; | ||||
| 				if (setting[0] == '*' && setting[1] == '0') | ||||
| 					x = "*1"; | ||||
| 			} | ||||
| 			__set_errno(0); | ||||
| 			p = crypt_rn(key, setting, o_buf, o_size); | ||||
| 			if ((ok_n && (!p || strcmp(p, hash))) || | ||||
| 			    (!ok_n && (!errno || p || strcmp(o_buf, x)))) { | ||||
| 				printf("FAILED (crypt_rn/%d)\n", i); | ||||
| 				return 1; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		__set_errno(0); | ||||
| 		p = crypt_ra(key, setting, &data, &size); | ||||
| 		if ((ok && (!p || strcmp(p, hash))) || | ||||
| 		    (!ok && (!errno || p || strcmp((char *)data, hash)))) { | ||||
| 			printf("FAILED (crypt_ra/%d)\n", i); | ||||
| 			return 1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	setting1 = crypt_gensalt(which[0], 12, data, size); | ||||
| 	if (!setting1 || strncmp(setting1, "$2a$12$", 7)) { | ||||
| 		puts("FAILED (crypt_gensalt)\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	setting2 = crypt_gensalt_ra(setting1, 12, data, size); | ||||
| 	if (strcmp(setting1, setting2)) { | ||||
| 		puts("FAILED (crypt_gensalt_ra/1)\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	(*(char *)data)++; | ||||
| 	setting1 = crypt_gensalt_ra(setting2, 12, data, size); | ||||
| 	if (!strcmp(setting1, setting2)) { | ||||
| 		puts("FAILED (crypt_gensalt_ra/2)\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	free(setting1); | ||||
| 	free(setting2); | ||||
| 	free(data); | ||||
|  | ||||
| #if defined(_SC_CLK_TCK) || !defined(CLK_TCK) | ||||
| 	clk_tck = sysconf(_SC_CLK_TCK); | ||||
| #else | ||||
| 	clk_tck = CLK_TCK; | ||||
| #endif | ||||
|  | ||||
| 	running = 1; | ||||
| 	signal(SIGALRM, handle_timer); | ||||
|  | ||||
| 	memset(&it, 0, sizeof(it)); | ||||
| 	it.it_value.tv_sec = 5; | ||||
| 	setitimer(ITIMER_REAL, &it, NULL); | ||||
|  | ||||
| 	start_real = times(&buf); | ||||
| 	start_virtual = buf.tms_utime + buf.tms_stime; | ||||
|  | ||||
| 	count = (char *)run((char *)0) - (char *)0; | ||||
|  | ||||
| 	end_real = times(&buf); | ||||
| 	end_virtual = buf.tms_utime + buf.tms_stime; | ||||
| 	if (end_virtual == start_virtual) end_virtual++; | ||||
|  | ||||
| 	printf("%.1f c/s real, %.1f c/s virtual\n", | ||||
| 		(float)count * clk_tck / (end_real - start_real), | ||||
| 		(float)count * clk_tck / (end_virtual - start_virtual)); | ||||
|  | ||||
| #ifdef TEST_THREADS | ||||
| 	running = 1; | ||||
| 	it.it_value.tv_sec = 60; | ||||
| 	setitimer(ITIMER_REAL, &it, NULL); | ||||
| 	start_real = times(&buf); | ||||
|  | ||||
| 	for (i = 0; i < TEST_THREADS; i++) | ||||
| 	if (pthread_create(&t[i], NULL, run, i + (char *)0)) { | ||||
| 		perror("pthread_create"); | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < TEST_THREADS; i++) { | ||||
| 		if (pthread_join(t[i], &t_retval)) { | ||||
| 			perror("pthread_join"); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (!t_retval) continue; | ||||
| 		count = (char *)t_retval - (char *)0; | ||||
| 		end_real = times(&buf); | ||||
| 		printf("%d: %.1f c/s real\n", i, | ||||
| 			(float)count * clk_tck / (end_real - start_real)); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										203
									
								
								deps/crypt_blowfish/x86.S
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										203
									
								
								deps/crypt_blowfish/x86.S
									
									
									
									
										vendored
									
									
								
							| @@ -1,203 +0,0 @@ | ||||
| /* | ||||
|  * Written by Solar Designer <solar at openwall.com> in 1998-2010. | ||||
|  * No copyright is claimed, and the software is hereby placed in the public | ||||
|  * domain.  In case this attempt to disclaim copyright and place the software | ||||
|  * in the public domain is deemed null and void, then the software is | ||||
|  * Copyright (c) 1998-2010 Solar Designer and it is hereby released to the | ||||
|  * general public under the following terms: | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted. | ||||
|  * | ||||
|  * There's ABSOLUTELY NO WARRANTY, express or implied. | ||||
|  * | ||||
|  * See crypt_blowfish.c for more information. | ||||
|  */ | ||||
|  | ||||
| #ifdef __i386__ | ||||
|  | ||||
| #if defined(__OpenBSD__) && !defined(__ELF__) | ||||
| #define UNDERSCORES | ||||
| #define ALIGN_LOG | ||||
| #endif | ||||
|  | ||||
| #if defined(__CYGWIN32__) || defined(__MINGW32__) | ||||
| #define UNDERSCORES | ||||
| #endif | ||||
|  | ||||
| #ifdef __DJGPP__ | ||||
| #define UNDERSCORES | ||||
| #define ALIGN_LOG | ||||
| #endif | ||||
|  | ||||
| #ifdef UNDERSCORES | ||||
| #define _BF_body_r			__BF_body_r | ||||
| #endif | ||||
|  | ||||
| #ifdef ALIGN_LOG | ||||
| #define DO_ALIGN(log)			.align (log) | ||||
| #elif defined(DUMBAS) | ||||
| #define DO_ALIGN(log)			.align 1 << log | ||||
| #else | ||||
| #define DO_ALIGN(log)			.align (1 << (log)) | ||||
| #endif | ||||
|  | ||||
| #define BF_FRAME			0x200 | ||||
| #define ctx				%esp | ||||
|  | ||||
| #define BF_ptr				(ctx) | ||||
|  | ||||
| #define S(N, r)				N+BF_FRAME(ctx,r,4) | ||||
| #ifdef DUMBAS | ||||
| #define P(N)				0x1000+N+N+N+N+BF_FRAME(ctx) | ||||
| #else | ||||
| #define P(N)				0x1000+4*N+BF_FRAME(ctx) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * This version of the assembly code is optimized primarily for the original | ||||
|  * Intel Pentium but is also careful to avoid partial register stalls on the | ||||
|  * Pentium Pro family of processors (tested up to Pentium III Coppermine). | ||||
|  * | ||||
|  * It is possible to do 15% faster on the Pentium Pro family and probably on | ||||
|  * many non-Intel x86 processors, but, unfortunately, that would make things | ||||
|  * twice slower for the original Pentium. | ||||
|  * | ||||
|  * An additional 2% speedup may be achieved with non-reentrant code. | ||||
|  */ | ||||
|  | ||||
| #define L				%esi | ||||
| #define R				%edi | ||||
| #define tmp1				%eax | ||||
| #define tmp1_lo				%al | ||||
| #define tmp2				%ecx | ||||
| #define tmp2_hi				%ch | ||||
| #define tmp3				%edx | ||||
| #define tmp3_lo				%dl | ||||
| #define tmp4				%ebx | ||||
| #define tmp4_hi				%bh | ||||
| #define tmp5				%ebp | ||||
|  | ||||
| .text | ||||
|  | ||||
| #define BF_ROUND(L, R, N) \ | ||||
| 	xorl L,tmp2; \ | ||||
| 	xorl tmp1,tmp1; \ | ||||
| 	movl tmp2,L; \ | ||||
| 	shrl $16,tmp2; \ | ||||
| 	movl L,tmp4; \ | ||||
| 	movb tmp2_hi,tmp1_lo; \ | ||||
| 	andl $0xFF,tmp2; \ | ||||
| 	movb tmp4_hi,tmp3_lo; \ | ||||
| 	andl $0xFF,tmp4; \ | ||||
| 	movl S(0,tmp1),tmp1; \ | ||||
| 	movl S(0x400,tmp2),tmp5; \ | ||||
| 	addl tmp5,tmp1; \ | ||||
| 	movl S(0x800,tmp3),tmp5; \ | ||||
| 	xorl tmp5,tmp1; \ | ||||
| 	movl S(0xC00,tmp4),tmp5; \ | ||||
| 	addl tmp1,tmp5; \ | ||||
| 	movl 4+P(N),tmp2; \ | ||||
| 	xorl tmp5,R | ||||
|  | ||||
| #define BF_ENCRYPT_START \ | ||||
| 	BF_ROUND(L, R, 0); \ | ||||
| 	BF_ROUND(R, L, 1); \ | ||||
| 	BF_ROUND(L, R, 2); \ | ||||
| 	BF_ROUND(R, L, 3); \ | ||||
| 	BF_ROUND(L, R, 4); \ | ||||
| 	BF_ROUND(R, L, 5); \ | ||||
| 	BF_ROUND(L, R, 6); \ | ||||
| 	BF_ROUND(R, L, 7); \ | ||||
| 	BF_ROUND(L, R, 8); \ | ||||
| 	BF_ROUND(R, L, 9); \ | ||||
| 	BF_ROUND(L, R, 10); \ | ||||
| 	BF_ROUND(R, L, 11); \ | ||||
| 	BF_ROUND(L, R, 12); \ | ||||
| 	BF_ROUND(R, L, 13); \ | ||||
| 	BF_ROUND(L, R, 14); \ | ||||
| 	BF_ROUND(R, L, 15); \ | ||||
| 	movl BF_ptr,tmp5; \ | ||||
| 	xorl L,tmp2; \ | ||||
| 	movl P(17),L | ||||
|  | ||||
| #define BF_ENCRYPT_END \ | ||||
| 	xorl R,L; \ | ||||
| 	movl tmp2,R | ||||
|  | ||||
| DO_ALIGN(5) | ||||
| .globl _BF_body_r | ||||
| _BF_body_r: | ||||
| 	movl 4(%esp),%eax | ||||
| 	pushl %ebp | ||||
| 	pushl %ebx | ||||
| 	pushl %esi | ||||
| 	pushl %edi | ||||
| 	subl $BF_FRAME-8,%eax | ||||
| 	xorl L,L | ||||
| 	cmpl %esp,%eax | ||||
| 	ja BF_die | ||||
| 	xchgl %eax,%esp | ||||
| 	xorl R,R | ||||
| 	pushl %eax | ||||
| 	leal 0x1000+BF_FRAME-4(ctx),%eax | ||||
| 	movl 0x1000+BF_FRAME-4(ctx),tmp2 | ||||
| 	pushl %eax | ||||
| 	xorl tmp3,tmp3 | ||||
| BF_loop_P: | ||||
| 	BF_ENCRYPT_START | ||||
| 	addl $8,tmp5 | ||||
| 	BF_ENCRYPT_END | ||||
| 	leal 0x1000+18*4+BF_FRAME(ctx),tmp1 | ||||
| 	movl tmp5,BF_ptr | ||||
| 	cmpl tmp5,tmp1 | ||||
| 	movl L,-8(tmp5) | ||||
| 	movl R,-4(tmp5) | ||||
| 	movl P(0),tmp2 | ||||
| 	ja BF_loop_P | ||||
| 	leal BF_FRAME(ctx),tmp5 | ||||
| 	xorl tmp3,tmp3 | ||||
| 	movl tmp5,BF_ptr | ||||
| BF_loop_S: | ||||
| 	BF_ENCRYPT_START | ||||
| 	BF_ENCRYPT_END | ||||
| 	movl P(0),tmp2 | ||||
| 	movl L,(tmp5) | ||||
| 	movl R,4(tmp5) | ||||
| 	BF_ENCRYPT_START | ||||
| 	BF_ENCRYPT_END | ||||
| 	movl P(0),tmp2 | ||||
| 	movl L,8(tmp5) | ||||
| 	movl R,12(tmp5) | ||||
| 	BF_ENCRYPT_START | ||||
| 	BF_ENCRYPT_END | ||||
| 	movl P(0),tmp2 | ||||
| 	movl L,16(tmp5) | ||||
| 	movl R,20(tmp5) | ||||
| 	BF_ENCRYPT_START | ||||
| 	addl $32,tmp5 | ||||
| 	BF_ENCRYPT_END | ||||
| 	leal 0x1000+BF_FRAME(ctx),tmp1 | ||||
| 	movl tmp5,BF_ptr | ||||
| 	cmpl tmp5,tmp1 | ||||
| 	movl P(0),tmp2 | ||||
| 	movl L,-8(tmp5) | ||||
| 	movl R,-4(tmp5) | ||||
| 	ja BF_loop_S | ||||
| 	movl 4(%esp),%esp | ||||
| 	popl %edi | ||||
| 	popl %esi | ||||
| 	popl %ebx | ||||
| 	popl %ebp | ||||
| 	ret | ||||
|  | ||||
| BF_die: | ||||
| /* Oops, need to re-compile with a larger BF_FRAME. */ | ||||
| 	hlt | ||||
| 	jmp BF_die | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #if defined(__ELF__) && defined(__linux__) | ||||
| .section .note.GNU-stack,"",@progbits | ||||
| #endif | ||||
							
								
								
									
										1
									
								
								deps/libbacktrace
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								deps/libbacktrace
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule deps/libbacktrace added at 9ae4f4ae44
									
								
							
							
								
								
									
										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); | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user