android-platform-tools (29.0.6-23) unstable; urgency=medium
authorRoger Shimizu <rosh@debian.org>
Fri, 20 Jan 2023 08:36:41 +0000 (08:36 +0000)
committerRoger Shimizu <rosh@debian.org>
Fri, 20 Jan 2023 08:36:41 +0000 (08:36 +0000)
  * Fix CVE-2022-20128 and CVE-2022-3168
  * debian/source/lintian-overrides: Fix lintian.
  * Apply multi-arch hints
  * Sync with experimental to support adb and fastboot on ppc64el.

[dgit import unpatched android-platform-tools 29.0.6-23]

165 files changed:
1  2 
debian/README.Debian.boringssl
debian/README.core
debian/README.dalvik
debian/README.extras
debian/README.frameworks-native
debian/README.libunwind
debian/README.source
debian/adb.bash-completion
debian/adb.docs
debian/adb.install
debian/adb.links
debian/adb.lintian-overrides
debian/adb.manpages
debian/android-libbacktrace-dev.docs
debian/android-libbacktrace-dev.install
debian/android-libbacktrace.docs
debian/android-libbacktrace.install
debian/android-libbacktrace.lintian-overrides
debian/android-libbase-dev.docs
debian/android-libbase-dev.install
debian/android-libbase.docs
debian/android-libbase.install
debian/android-libbase.lintian-overrides
debian/android-libcutils-dev.docs
debian/android-libcutils-dev.install
debian/android-libcutils.docs
debian/android-libcutils.install
debian/android-libcutils.lintian-overrides
debian/android-liblog-dev.docs
debian/android-liblog-dev.install
debian/android-liblog.docs
debian/android-liblog.install
debian/android-liblog.lintian-overrides
debian/android-libnativehelper-dev.docs
debian/android-libnativehelper-dev.install
debian/android-libnativehelper.docs
debian/android-libnativehelper.install
debian/android-libnativehelper.lintian-overrides
debian/android-libsparse-dev.docs
debian/android-libsparse-dev.install
debian/android-libsparse.docs
debian/android-libsparse.install
debian/android-libsparse.lintian-overrides
debian/android-libutils-dev.docs
debian/android-libutils-dev.install
debian/android-libutils.docs
debian/android-libutils.install
debian/android-libutils.lintian-overrides
debian/android-libziparchive-dev.docs
debian/android-libziparchive-dev.install
debian/android-libziparchive.docs
debian/android-libziparchive.install
debian/android-libziparchive.lintian-overrides
debian/android-platform-frameworks-native-headers.install
debian/android-platform-system-core-headers.docs
debian/android-platform-system-core-headers.install
debian/android-sdk-libsparse-utils.install
debian/android-sdk-libsparse-utils.lintian-overrides
debian/bash-completion/system/core/adb
debian/bash-completion/system/core/fastboot
debian/changelog
debian/clean
debian/control
debian/copyright
debian/dalvik/hprof-conv.mk
debian/development/etc1tool.mk
debian/dmtracedump.docs
debian/dmtracedump.install
debian/dmtracedump.links
debian/dmtracedump.manpages
debian/etc1tool.docs
debian/etc1tool.install
debian/etc1tool.links
debian/etc1tool.lintian-overrides
debian/etc1tool.manpages
debian/external/libunwind/detect-arch.mk
debian/external/libunwind/libunwind.mk
debian/fastboot.bash-completion
debian/fastboot.docs
debian/fastboot.install
debian/fastboot.links
debian/fastboot.lintian-overrides
debian/fastboot.manpages
debian/frameworks/native/libETC1.mk
debian/hprof-conv.docs
debian/hprof-conv.install
debian/include/art/dlmalloc/README.source
debian/include/art/dlmalloc/malloc.c
debian/include/art/dlmalloc/malloc.h
debian/include/external/libunwind/7zCrc.h
debian/include/external/libunwind/7zTypes.h
debian/include/external/libunwind/Sha256.h
debian/include/external/libunwind/Xz.h
debian/include/external/libunwind/XzCrc64.h
debian/libnativehelper/libnativehelper.mk
debian/manifest.xml
debian/manpages/development/etc1tool.1.md
debian/manpages/system/core/adb.1.md
debian/manpages/system/core/fastboot.1.md
debian/mkbootimg.install
debian/orig.excludes
debian/patches/art/add-assembler-macro.patch
debian/patches/art/arm-asm-instruction.patch
debian/patches/art/atomic-exception-specification.patch
debian/patches/art/fix-build-on-non-x86.patch
debian/patches/art/fix-standard-namespace-errors.patch
debian/patches/art/image-space-dereference.patch
debian/patches/art/method-reference-std-ns.patch
debian/patches/art/missing-system-includes.patch
debian/patches/art/python3-gen_mterp.patch
debian/patches/art/stats-incomplete-def.patch
debian/patches/art/storage-mode-concat.patch
debian/patches/art/ucontext.patch
debian/patches/art/use-android-dlmalloc.patch
debian/patches/art/workaround-cacheflush-on-arm.patch
debian/patches/cve/CVE-2022-20128.patch
debian/patches/cve/CVE-2022-3168.patch
debian/patches/development/typos.patch
debian/patches/external/libunwind/20150704-CVE-2015-3239_dwarf_i.h.patch
debian/patches/external/libunwind/legacy_built-in_sync_functions.patch
debian/patches/external/libunwind/user_pt_regs.patch
debian/patches/external/selinux/Fix-header-path.patch
debian/patches/libnativehelper/add-missing-headers.patch
debian/patches/series
debian/patches/system/Fix-include-path.patch
debian/patches/system/Fix-shebang-of-python-script.patch
debian/patches/system/core/Added-missing-headers.patch
debian/patches/system/core/Nonnull.patch
debian/patches/system/core/Vector-cast.patch
debian/patches/system/core/add-missing-headers.patch
debian/patches/system/core/fix-attribute-issue-with-gcc.patch
debian/patches/system/core/fix-build-on-non-x86.patch
debian/patches/system/core/fix-gettid-exception-declaration.patch
debian/patches/system/core/fix-standard-namespace-errors.patch
debian/patches/system/core/hard-code-build-number.patch
debian/patches/system/core/libusb-header-path.patch
debian/patches/system/core/move-log-file-to-proper-dir.patch
debian/patches/system/core/simg_dump-python3.patch
debian/patches/system/core/stdatomic.patch
debian/patches/system/core/stub-out-fastdeploy.patch
debian/patches/system/core/throw-exception-on-unknown-os.patch
debian/patches/system/unwindstack-porting.patch
debian/rules
debian/scripts/get-orig-source
debian/source/format
debian/source/lintian-overrides
debian/system/core/adb.mk
debian/system/core/append2simg.mk
debian/system/core/fastboot.mk
debian/system/core/img2simg.mk
debian/system/core/libadb.mk
debian/system/core/libbacktrace.mk
debian/system/core/libbase.mk
debian/system/core/libcrypto_utils.mk
debian/system/core/libcutils.mk
debian/system/core/liblog.mk
debian/system/core/libsparse.mk
debian/system/core/libutils.mk
debian/system/core/libziparchive.mk
debian/system/core/simg2img.mk
debian/system/core/simg2simg.mk
debian/system/extras/libext4_utils.mk
debian/tests/control
debian/upstream/metadata
debian/watch

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fd5a11c7e1a0e0b528327cec0b5f24256b862d4a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,21 @@@
++This library is a version of Google's internal OpenSSL fork called
++BoringSSL.  This is not the official BoringSSL release, it is the
++version of BoringSSL that is maintained as part of the Android SDK and
++OS.  These packages should never be used for anything but the parts of
++the Android SDK that require them.
++
++We package these chunks separately because we believe it makes it
++easier to maintain.  Security updates can happen only in the
++particular package rather than having to build the whole Android SDK
++together as one giant source tree.
++
++Upstream is already good at providing security fixes for all of the
++various bits, and they maintain quite a few stable releases in
++parallel.  Security maintenance for the Android SDK packages will
++mostly be a matter of just including any new patch versions
++(i.e. 8.1.0_r14 vs 8.1.0_r15).
++
++For more info:
++https://lists.debian.org/debian-security/2016/05/msg00038.html
++
++ -- Hans-Christoph Steiner <hans@eds.org>, Wed, 28 Feb 2018 11:51:35 +0100
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..01d33850a466fec58d91f5d2fc2fccec9b42e97d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,39 @@@
++The Android source repositories are quite chaotic.  They often include a mix
++of things under arbitrary umbrellas.  For example, there are parts of this
++particular repository that will only ever be built when building the complete
++Android OS (aka "target"), other parts that are only built as part of the SDK
++to support building Android apps (aka "host"), and other parts that are used
++both in the SDK and the Android OS. Most of the source code in this particular
++repostory will never be built or included on Debian because it is only used in
++the Android OS.
++
++It is possible to see which sections will be built for what by looking at the
++Android.mk files.  The parts that are meant for the "host" system, in this
++case Debian, will have lines like this in it:
++
++  * include $(BUILD_HOST_EXECUTABLE)
++  * include $(BUILD_HOST_JAVA_LIBRARY)
++  * include $(BUILD_HOST_SHARED_LIBRARY)
++  * include $(BUILD_HOST_STATIC_LIBRARY)
++
++The build targets that are only for Android OS builds instead have this:
++
++  * include $(BUILD_EXECUTABLE)
++  * include $(BUILD_JAVA_LIBRARY)
++  * include $(BUILD_SHARED_LIBRARY)
++  * include $(BUILD_STATIC_LIBRARY)
++
++A given chunk of code that is built both for "host" will have both of these
++lines included in the Android.mk file.
++
++debian/cutils_atomic.h
++-------------------
++
++cutils_atomic.h is based on core/include/cutils/atomic.h and is used by
++libutils.so. Because libutils.so is written in C++11 and atomic.h uses
++stdatomic.h which is deprecated in C++11, and all functions in atomic.h are
++inline functions, we need make it a standalone C header so that libutils.so
++can include it.
++
++ -- Hans-Christoph Steiner <hans@eds.org>, Wed, 28 Feb 2018 14:12:15 +0100
++ -- Kai-Chung Yan <seamlikok@gmail.com>  Tue, 17 Nov 2015 14:39:17 +0800
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fb7f4f40b0f0a452d72dca6b5357144337ce6af5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,11 @@@
++This package includes a bunch of symlinks and other little tricks to
++create the same path layout as is used by the official Android SDK
++binaries released by Google.
++
++Also, this utility is only ever known as 'dx' in the Android world as
++well as the official documentation.  The other tools that rely on it
++only ever call it as 'dx'.  There is already a package called 'dx' in
++Debian that is totally unrelated.  For now, this package Conflicts:
++with 'dx' so that it can provide /usr/bin/dx, as users will expect.
++
++ -- Hans-Christoph Steiner <hans@eds.org>, Thu, 18 Feb 2016 09:30:12 +0100
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..75ca7af86a45e00a0318a11823c7f9a0412c10d2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,30 @@@
++The Android source repositories are quite chaotic.  They often include a mix
++of things under arbitrary umbrellas.  For example, there are parts of this
++particular repository that will only ever be built when building the complete
++Android OS (aka "target"), other parts that are only built as part of the SDK
++to support building Android apps (aka "host"), and other parts that are used
++both in the SDK and the Android OS. Most of the source code in this particular
++repostory will never be built or included on Debian because it is only used in
++the Android OS.
++
++It is possible to see which sections will be built for what by looking at the
++Android.mk files.  The parts that are meant for the "host" system, in this
++case Debian, will have lines like this in it:
++
++    include $(BUILD_HOST_EXECUTABLE)
++    include $(BUILD_HOST_JAVA_LIBRARY)
++    include $(BUILD_HOST_SHARED_LIBRARY)
++    include $(BUILD_HOST_STATIC_LIBRARY)
++
++The build targets that are only for Android OS builds instead have this:
++
++    include $(BUILD_EXECUTABLE)
++    include $(BUILD_JAVA_LIBRARY)
++    include $(BUILD_SHARED_LIBRARY)
++    include $(BUILD_STATIC_LIBRARY)
++
++A given chunk of code that is built both for "host" will have both of these
++lines included in the Android.mk file.
++
++ -- Hans-Christoph Steiner <hans@eds.org>, Thu, 18 Sep 2014 20:01:52 -0400
++ -- Kai-Chung Yan <seamlikok@gmail.com>  Fri, 27 Nov 2015 21:02:44 +0800
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..52a656da91b404e55f70aec9d9b648ec5143fcbc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,35 @@@
++The Android source repositories are quite chaotic.  They often include a mix
++of things under arbitrary umbrellas.  For example, there are parts of this
++particular repository that will only ever be built when building the complete
++Android OS (aka "target"), other parts that are only built as part of the SDK
++to support building Android apps (aka "host"), and other parts that are used
++both in the SDK and the Android OS. Most of the source code in this particular
++repostory will never be built or included on Debian because it is only used in
++the Android OS.
++
++It is possible to see which sections will be built for what by looking at the
++Android.mk files.  The parts that are meant for the "host" system, in this
++case Debian, will have lines like this in it:
++
++    include $(BUILD_HOST_EXECUTABLE)
++    include $(BUILD_HOST_JAVA_LIBRARY)
++    include $(BUILD_HOST_SHARED_LIBRARY)
++    include $(BUILD_HOST_STATIC_LIBRARY)
++
++The build targets that are only for Android OS builds instead have this:
++
++    include $(BUILD_EXECUTABLE)
++    include $(BUILD_JAVA_LIBRARY)
++    include $(BUILD_SHARED_LIBRARY)
++    include $(BUILD_STATIC_LIBRARY)
++
++A given chunk of code that is built both for "host" will have both of these
++lines included in the Android.mk file.
++
++Excluding files under SGI-B-v-1.0
++=================================
++
++`debian/copyright` excludes some files under SGI-B-v-1.0 license because
++this license is not DFSG-compliant (see #211765).
++
++ -- Hans-Christoph Steiner <hans@eds.org>  Thu, 18 Sep 2014 16:37:50 -0400
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7eac414d68f82d759baaf200407b6b73936fa967
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++Files under debian/include
++==========================
++
++These files are extracted from the AOSP forked external project LZMA [1] which
++is actually the "p7zip" package in Debian. However the package does not provide
++separated binary packages for lib7z.so or its header files, therefore we include
++the file in this package.
++
++See the filed bug [2].
++
++[1]: https://android.googlesource.com/platform/external/lzma
++[2]: http://bugs.debian.org/837873
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a067eefb5964324bf0dbb942bfcbe44ed67203fc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++To download upstream sources (approx 1GB), you will need some additional tools
++locally (repo v2 is available in buster-backports).
++
++  ```
++  $ sudo apt install maven-repo-helper javahelper repo
++  $ debian/rules get-orig-source
++  ```
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..df7cca5d06d9dd79b41a1cc7c21f6eaa366f9c39
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/bash-completion/system/core/adb
diff --cc debian/adb.docs
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..921dfc7844f97c76c75fe7ef3a4e926bc7314607
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++system/core/adb/OVERVIEW.TXT
++system/core/adb/SERVICES.TXT
++system/core/adb/SYNC.TXT
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8f69344b078851202b67e29127d99b364c03086b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/system/core/adb   usr/lib/android-sdk/platform-tools/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..211f79af5e11f99db606af75ad7ae5f0866f09b7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/android-sdk/platform-tools/adb   usr/bin/adb
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3cc6b7487a6c09f9cfb261c439bf1c585a0c68e5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/manpages/system/core/adb.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dd424d54f8a4a4ed4f7df27ccb48958324654be3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/libbacktrace/include/backtrace    usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..46ee025f11418451454d7dcdc9ab7841f3978d0c
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libbacktrace.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libbacktrace.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d9aebc724a927c4cda3145863b588e4ddcee373d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/base/include/android-base/* usr/include/android/android-base
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e703a8079caf3c9677ca2306ac481a86065f0414
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libbase.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libbase.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e225be1f04686fea1b08430a33e4e4ff5c67b8ea
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/libcutils/include/cutils usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e4eca6689a3800ce504b07e1fe3c1073d42c47ff
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libcutils.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libcutils.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c6e368a89265630cbb51a12540e51f3d8b087295
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++system/core/NOTICE
++system/core/liblog/README.md
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..053f53346e92e6315886ed04340eda4c4c076199
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++system/core/liblog/include/android/log.h      usr/include/android/android
++system/core/liblog/include/log                                usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..af194b1cc47f1a260ea2725ce3c944a6d40b5591
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/liblog.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/liblog.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5b4d7ff8d1740f2c088f4ded1d92b4bcdf7aec72
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++libnativehelper/NOTICE
++libnativehelper/README
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cb39bde9d321aee7a568cb6cc5a275dca382e59f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++libnativehelper/include_jni/*          usr/include/android/nativehelper
++libnativehelper/include/nativehelper   usr/include/android
++libnativehelper/header_only_include/nativehelper usr/include/android
++libnativehelper/platform_include/*     usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6cff7b1faddebd0869db7d02b21231ee863d531a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++libnativehelper/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4400f221a4406e37f35c9a2d3ebdbe19259e0269
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/libnativehelper/libnativehelper.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/libnativehelper/libnativehelper.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9012107d586eccc378b08219894251d769451296
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/libsparse/include/* usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c926172caa9858ec329053c2cacc0ae601be3050
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libsparse.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libsparse.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b9d70a50ca70e2b0f110a610ff452732ff3bb77a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++system/core/NOTICE
++system/core/libutils/README
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..55081f6b0e77a85872aad11f08e59a94d8089968
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/libutils/include/utils    usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..55f4b0d179dd55b01ed1f673cf636845c90e2594
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libutils.so.*       usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libutils.so         usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..616dd4f1049c536f43e32e38a27d48a8b179c0f2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/libziparchive/include/ziparchive usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..478aee942748d566f079510ee8d91143af113e3d
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++debian/out/system/core/libziparchive.so.*   usr/lib/${DEB_HOST_MULTIARCH}/android
++debian/out/system/core/libziparchive.so     usr/lib/${DEB_HOST_MULTIARCH}/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3bef9d3c45b7644d2581ab24c0971106e8f6494e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++frameworks/native/include/android                             usr/include/android
++frameworks/native/libs/binder/include/binder  usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5258e96da721797db127229e1f5629186afc1916
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..33825b85e6a1326d91e5db8f7af8af107eda4779
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++system/core/libsystem/include/system    usr/include/android
++system/core/libcutils/include/private   usr/include/android
++system/core/libunwindstack/include/unwindstack usr/include/android
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..74bdc7b7d568f8b6c43b8796bcb45724b326ee5f
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++#!/usr/bin/dh-exec
++
++system/core/libsparse/simg_dump.py => usr/bin/simg_dump
++debian/out/system/core/simg2simg      usr/bin
++debian/out/system/core/img2simg               usr/bin
++debian/out/system/core/simg2img               usr/bin
++debian/out/system/core/append2simg    usr/bin
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..86f8b653133d3da1fc77429d3248089ce3545b37
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,181 @@@
++## Bash completion for the Android SDK tools.
++##
++## Copyright (c) 2009 Matt Brubeck
++##
++## 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
++## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++## THE SOFTWARE.
++
++function _adb()
++{
++  local cur prev opts cmds c subcommand device_selected
++  COMPREPLY=()
++  cur="${COMP_WORDS[COMP_CWORD]}"
++  prev="${COMP_WORDS[COMP_CWORD-1]}"
++  opts="-d -e -s -p"
++  cmds="backup bugreport connect devices disable-verity disconnect emu \
++        enable-verity features forward get-devpath get-serialno get-state \
++        help host-features install install-multiple jdwp keygen \
++        kill-server logcat longcat ls ppp pull push reboot \
++        reboot-bootloader reconnect remount restore reverse root shell \
++        sideload start-server sync tcpip track-devices track-jdwp \
++        uninstall unroot usb version wait-for-bootloader wait-for-device \
++        wait-for-recovery wait-for-sideload"
++  cmds_not_need_device="connect devices disconnect help keygen kill-server \
++                        start-server version"
++  subcommand=""
++  device_selected=""
++
++  # Look for the subcommand.
++  c=1
++  while [ $c -lt $COMP_CWORD ]; do
++    word="${COMP_WORDS[c]}"
++    if [ "$word" = "-d" -o "$word" = "-e" -o "$word" = "-s" ]; then
++      device_selected=true
++      opts="-p"
++    fi
++    for cmd in $cmds; do
++      if [ "$cmd" = "$word" ]; then
++        subcommand="$word"
++      fi
++    done
++    c=$((++c))
++  done
++
++  case "${subcommand}" in
++    '')
++      case "${prev}" in
++        -p)
++          return 0;
++          ;;
++        -s)
++          # Use 'adb devices' to list serial numbers.
++          COMPREPLY=( $(compgen -W "$(adb devices |
++                awk '/(device|recovery|sideload)$/{print $1}')" -- ${cur} ) )
++          return 0
++          ;;
++      esac
++      case "${cur}" in
++        -*)
++          COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      if [ -z "$device_selected" ]; then
++        local num_devices=$(( $(adb devices 2>/dev/null|wc -l) - 2 ))
++        if [ "$num_devices" -gt "1" ]; then
++          # With multiple devices, you must choose a device first.
++          COMPREPLY=( $(compgen -W "${opts} ${cmds_not_need_device}" -- ${cur}) )
++          return 0
++        fi
++      fi
++      COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) )
++      return 0
++      ;;
++    disconnect)
++      # Use 'adb devices' to list serial numbers.
++      COMPREPLY=( $(compgen -W "$(adb devices |
++            awk '/(device|recovery|sideload|offline|unauthorized)$/{print $1}')" -- ${cur} ) )
++      return 0
++      ;;
++    install)
++      case "${cur}" in
++        -*)
++          COMPREPLY=( $(compgen -W "-l -r -s" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      ;;
++    forward)
++      # Filename or installation option.
++      COMPREPLY=( $(compgen -W "tcp: localabstract: localreserved: localfilesystem: dev: jdwp:" -- ${cur}) )
++      return 0
++      ;;
++    uninstall)
++      local apks=$(adb shell pm list packages 2>/dev/null | cut -b9-999 | tr '\n\r' ' ')
++      if [[ $prev != "-k" && $cur == "-" ]]; then
++          COMPREPLY=( $(compgen -W "-k $apks" -- ${cur}) )
++      else
++          COMPREPLY=( $(compgen -W "$apks" -- ${cur}) )
++      fi
++      return 0
++      ;;
++    logcat)
++      case "${cur}" in
++        -*)
++          COMPREPLY=( $(compgen -W "-v -b -c -d -f -g -n -r -s" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      case "${prev}" in
++        -v)
++          COMPREPLY=( $(compgen -W "brief process tag thread raw time long" -- ${cur}) )
++          return 0
++          ;;
++        -b)
++          COMPREPLY=( $(compgen -W "radio events main" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      ;;
++    backup)
++      case "${cur}" in
++        -*)
++          COMPREPLY=( $(compgen -W "-f -apk -noapk -obb -noobb -shared -noshared -all -system -nosystem" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      ;;
++    pull)
++      if [ ${prev} == "pull" ]; then
++          local IFS=$'\n'
++          if [ -z ${cur} ]; then
++              local files=$(adb shell "ls -a -d /*" 2>/dev/null | tr -d '\r')
++              COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
++          else
++              local stripped_cur=$(echo ${cur} | sed 's,^",,')
++              local files=$(adb shell "ls -a -d '${stripped_cur}'*" 2>/dev/null | tr -d '\r')
++              COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
++          fi
++          return 0
++      fi
++      ;;
++    push)
++      if [ "${COMP_WORDS[COMP_CWORD-2]}" == "push" ]; then
++          local IFS=$'\n'
++          if [ -z "${cur}" ]; then
++              local files=$(adb shell "ls -a -d /*" 2>/dev/null | tr -d '\r')
++              COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
++          else
++              local stripped_cur=$(echo ${cur} | sed 's,^",,')
++              local files=$(adb shell "ls -a -d '${stripped_cur}'*" 2>/dev/null | tr -d '\r')
++              COMPREPLY=( $(compgen -W "$files" -o filenames -- ${cur}) )
++          fi
++          return 0
++      fi
++      ;;
++  esac
++}
++complete -o default -F _adb adb
++
++# Local variables:
++# mode: shell-script
++# sh-basic-offset: 4
++# sh-indent-comment: t
++# indent-tabs-mode: nil
++# End:
++# ex: ts=4 sw=4 et filetype=sh
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2aa7a5d962682e9b061171cd003859e446a73b5d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,97 @@@
++## Bash completion for the Android SDK tools.
++##
++## Copyright (c) 2009 Matt Brubeck
++##
++## 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
++## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++## THE SOFTWARE.
++
++function _fastboot()
++{
++  local cur prev opts cmds c subcommand device_selected
++  COMPREPLY=()
++  cur="${COMP_WORDS[COMP_CWORD]}"
++  prev="${COMP_WORDS[COMP_CWORD-1]}"
++  opts="-w -s -p -c -i -b -n"
++  cmds="boot continue devices erase flash flashall getvar oem reboot \
++        reboot-bootloader update"
++  subcommand=""
++  partition_list="boot bootloader radio recovery system userdata"
++  device_selected=""
++
++  # Look for the subcommand.
++  c=1
++  while [ $c -lt $COMP_CWORD ]; do
++    word="${COMP_WORDS[c]}"
++    if [ "$word" = "-s" ]; then
++      device_selected=true
++    fi
++    for cmd in $cmds; do
++      if [ "$cmd" = "$word" ]; then
++        subcommand="$word"
++      fi
++    done
++    c=$((++c))
++  done
++
++  case "${subcommand}" in
++    '')
++      case "${prev}" in
++        -s)
++          # Use 'fastboot devices' to list serial numbers.
++          COMPREPLY=( $(compgen -W "$(fastboot devices|cut -f1)" -- ${cur} ) )
++          return 0
++          ;;
++      esac
++      case "${cur}" in
++        -*)
++          COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
++          return 0
++          ;;
++      esac
++      if [ -z "$device_selected" ]; then
++        local num_devices=$(( $(fastboot devices 2>/dev/null|wc -l) ))
++        if [ "$num_devices" -gt "1" ]; then
++          # With multiple devices, you must choose a device first.
++          COMPREPLY=( $(compgen -W "-s" -- ${cur}) )
++          return 0
++        fi
++      fi
++      COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) )
++      return 0
++      ;;
++    flash)
++      # partition name
++      COMPREPLY=( $(compgen -W "${partition_list}" -- ${cur}) )
++      return 0
++      ;;
++    erase)
++      # partition name
++      COMPREPLY=( $(compgen -W "${partition_list}" -- ${cur}) )
++      return 0
++      ;;
++  esac
++}
++complete -o default -F _fastboot fastboot
++
++# Local variables:
++# mode: shell-script
++# sh-basic-offset: 4
++# sh-indent-comment: t
++# indent-tabs-mode: nil
++# End:
++# ex: ts=4 sw=4 et filetype=sh
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ffc10bc3adefa1e6429b50f558c53b457f14c5bb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,318 @@@
++android-platform-tools (29.0.6-23) unstable; urgency=medium
++
++  * Fix CVE-2022-20128 and CVE-2022-3168
++  * debian/source/lintian-overrides: Fix lintian.
++  * Apply multi-arch hints
++  * Sync with experimental to support adb and fastboot on ppc64el.
++
++ -- Roger Shimizu <rosh@debian.org>  Fri, 20 Jan 2023 00:36:41 -0800
++
++android-platform-tools (29.0.6-22) unstable; urgency=medium
++
++  * Team upload.
++  * Add patch to fix FTBFS (Closes: #1027653)
++
++ -- Jochen Sprickerhof <jspricke@debian.org>  Wed, 11 Jan 2023 09:19:44 +0100
++
++android-platform-tools (29.0.6-21) unstable; urgency=medium
++
++  * Team upload.
++  * debian/{control,rules}: Sync with debian/exp branch.
++  * debian/rules: Export gdwarf-4 instead of ignoring dwz
++    (Closes: #1016468, #1015355).
++
++ -- Roger Shimizu <rosh@debian.org>  Wed, 03 Aug 2022 00:23:27 +0900
++
++android-platform-tools (29.0.6-20) unstable; urgency=medium
++
++  * Team upload.
++  * debian/system/core/fastboot.mk:
++    - Add usb-1.0 as lib dependency to linker (Closes: #1012892).
++  * debian/rules: Sync with ubuntu that ignoring error from dh_dwz.
++
++ -- Roger Shimizu <rosh@debian.org>  Fri, 29 Jul 2022 01:01:55 +0900
++
++android-platform-tools (29.0.6-19) unstable; urgency=medium
++
++  * Team upload.
++  * Cherry-pick from debian/exp to restore supporting for mips*el.
++
++ -- Roger Shimizu <rosh@debian.org>  Tue, 28 Jun 2022 02:30:12 +0900
++
++android-platform-tools (29.0.6-18) unstable; urgency=medium
++
++  * Team upload.
++  * debian/control: Update Depends version.
++  * debian/control: Add Section to each binary package.
++
++ -- Roger Shimizu <rosh@debian.org>  Sat, 28 May 2022 20:13:51 +0900
++
++android-platform-tools (29.0.6-17) unstable; urgency=medium
++
++  * Team upload.
++  * debian/tests/control: Add Depends for etc1tool test.
++  * debian/control: Update B-D list to install packages only necessary.
++  * debian/rules: Build libext4_utils.mk only for fastboot needed
++    architectures.
++
++ -- Roger Shimizu <rosh@debian.org>  Sat, 28 May 2022 02:12:26 +0900
++
++android-platform-tools (29.0.6-16) unstable; urgency=medium
++
++  * Team upload.
++  * debian/rules:
++    - Skip dh_auto_test for buildd: all
++
++ -- Roger Shimizu <rosh@debian.org>  Thu, 26 May 2022 18:10:50 +0900
++
++android-platform-tools (29.0.6-15) unstable; urgency=medium
++
++  * Team upload.
++  * Make use of android-libboringssl-dev package
++  * Build etc1tool on any architecture
++  * debian/rules:
++    - Port some tests from autopkgtest to run on dh_auto_test.
++  * d/*.mk:
++    - Update symblic linking command to easier rebuild locally.
++
++ -- Roger Shimizu <rosh@debian.org>  Thu, 26 May 2022 01:44:34 +0900
++
++android-platform-tools (29.0.6-14) unstable; urgency=medium
++
++  * Team upload.
++  * Fix gcc build for libsparse.mk
++  * Add debian/watch
++  * debian/*.mk:
++    - Link atomic library only necessary for armel and mipsel.
++
++ -- Roger Shimizu <rosh@debian.org>  Sun, 08 May 2022 23:40:34 +0900
++
++android-platform-tools (29.0.6-13) unstable; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Update B-D: libselinux1-dev to all arch, since building
++      libziparchive.mk depends on this package.
++
++ -- Roger Shimizu <rosh@debian.org>  Sun, 08 May 2022 00:41:07 +0900
++
++android-platform-tools (29.0.6-12) unstable; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Add libgtest-dev to Depends of android-libziparchive-dev.
++    - Fix multiarch issues.
++  * Add DexFiles.cpp to libbacktrace.mk
++  * Make libziparchive.so build on all arch
++
++ -- Roger Shimizu <rosh@debian.org>  Sat, 07 May 2022 23:25:20 +0900
++
++android-platform-tools (29.0.6-11) unstable; urgency=medium
++
++  * Team upload.
++  * Update d/*.lintian-overrides
++  * debian/control:
++    - Revise B-D and Depends for each package.
++
++ -- Roger Shimizu <rosh@debian.org>  Wed, 04 May 2022 19:33:12 +0900
++
++android-platform-tools (29.0.6-10) unstable; urgency=medium
++
++  * Team upload.
++  * Fix multiarch issues
++  * Make liblog and libnativehelper dynamic linked
++
++ -- Roger Shimizu <rosh@debian.org>  Tue, 03 May 2022 01:41:05 +0900
++
++android-platform-tools (29.0.6-9) unstable; urgency=medium
++
++  * Team upload.
++  * debian/rules:
++    - Update version for android-sdk-libsparse-utils.
++
++ -- Roger Shimizu <rosh@debian.org>  Tue, 19 Apr 2022 02:56:18 +0900
++
++android-platform-tools (29.0.6-8) unstable; urgency=medium
++
++  * Team upload.
++  * debian/system/core/*img*.mk: Fix ftbfs issue on armel.
++  * debian/control: Fix ftbfs issue on mips*el.
++
++ -- Roger Shimizu <rosh@debian.org>  Mon, 18 Apr 2022 22:49:01 +0900
++
++android-platform-tools (29.0.6-7) unstable; urgency=medium
++
++  * Team upload.
++  * debian/*.mk and debian/rules:
++    - Remove libart since it is not dependency for adb and fastboot.
++    - Following libraries are no longer static linked:
++      + libbacktrace.so
++      + libbase.so
++      + libcutils.so
++      + libsparse.so
++      + libutils.so
++      + libziparchive.so
++  * debian/control:
++    - Add new packages to replace old ones in
++      android-platform-system-core:
++      + android-libutils
++      + android-libutils-dev
++      + android-libziparchive
++      + android-libziparchive-dev
++      + android-platform-system-core-headers
++      + android-libbacktrace
++      + android-libbacktrace-dev
++      + android-libbase
++      + android-libbase-dev
++      + mkbootimg
++    - Remove package: dmtracedump
++  * debian/tests:
++    - Remove test for dmtracedump
++  * debian/rules:
++    - Mark the same version for android-lib* packages as adb and
++      fastboot.
++
++ -- Roger Shimizu <rosh@debian.org>  Mon, 18 Apr 2022 01:04:48 +0900
++
++android-platform-tools (29.0.6-6) unstable; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - For adb and fastboot package, move
++      android-sdk-platform-tools-common from Depends to Recommends,
++      since it might be removed from testing soon.
++
++ -- Roger Shimizu <rosh@debian.org>  Fri, 25 Feb 2022 01:58:51 +0900
++
++android-platform-tools (29.0.6-5) unstable; urgency=medium
++
++  * Team upload.
++  * Upload to unstable.
++
++ -- Roger Shimizu <rosh@debian.org>  Mon, 21 Feb 2022 19:25:42 +0900
++
++android-platform-tools (29.0.6-5~exp2) experimental; urgency=medium
++
++  * Team upload.
++  * Use system libselinux1-dev and remove external/selinux
++  * Remove development/* except development/tools
++
++ -- Roger Shimizu <rosh@debian.org>  Sun, 20 Feb 2022 00:51:34 +0900
++
++android-platform-tools (29.0.6-5~exp1) experimental; urgency=medium
++
++  * Team upload.
++  * debian/tests/control:
++    - Add Architecture limit for each test.
++  * debian/*.mk: Cleanup, sort list, etc.
++  * debian/rules: Move -pie to LDFLAGS.
++
++ -- Roger Shimizu <rosh@debian.org>  Sat, 05 Feb 2022 04:05:11 +0900
++
++android-platform-tools (29.0.6-4) unstable; urgency=medium
++
++  * Team upload.
++  * Upload to unstable.
++
++ -- Roger Shimizu <rosh@debian.org>  Sun, 30 Jan 2022 18:43:43 +0900
++
++android-platform-tools (29.0.6-4~exp2) experimental; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Add B-D python3 for [amd64 i386 arm64], which requires to build
++      libart.
++
++ -- Roger Shimizu <rosh@debian.org>  Wed, 26 Jan 2022 02:27:18 +0900
++
++android-platform-tools (29.0.6-4~exp1) experimental; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Remove unnecessary B-D: python3.
++  * debian/copyright:
++    - Add my entry.
++  * debian/source/lintian-overrides:
++    - Add very-long-line-length-in-source-file
++    - Add ancient-libtool
++
++ -- Roger Shimizu <rosh@debian.org>  Wed, 26 Jan 2022 01:53:58 +0900
++
++android-platform-tools (29.0.6-3) unstable; urgency=medium
++
++  * Team upload.
++  * Upload to unstable.
++  * debian/control:
++    - Use gcc for Arch that do not have clang support.
++  * Use gcc for assembly on armel to fix ftbfs:
++    - debian/external/boringssl/libcrypto.mk
++    - debian/external/libunwind/libunwind.mk
++
++ -- Roger Shimizu <rosh@debian.org>  Tue, 25 Jan 2022 19:54:01 +0900
++
++android-platform-tools (29.0.6-3~exp3) experimental; urgency=medium
++
++  * Team upload.
++  * debian/rules:
++    - Disable libdexfile for armel and armhf.
++
++ -- Roger Shimizu <rosh@debian.org>  Tue, 25 Jan 2022 01:50:38 +0900
++
++android-platform-tools (29.0.6-3~exp2) experimental; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Remove unnecessary B-D: maven-repo-helper.
++
++ -- Roger Shimizu <rosh@debian.org>  Mon, 24 Jan 2022 18:07:50 +0900
++
++android-platform-tools (29.0.6-3~exp1) experimental; urgency=medium
++
++  * Team upload.
++  * debian: Remove legacy mips Arch support.
++  * debian/control:
++    - Add Arch for adb and fastboot: mipsel, mips64el.
++    - Remove unnecessary B-D: dh-exec, dpkg-dev, p7zip-full.
++  * debian/rules:
++    - Support to build adb and fastboot for Archs other than amd64.
++  * debian/scripts:
++    - Update get-orig-source to get perf data and run in parallel.
++
++ -- Roger Shimizu <rosh@debian.org>  Mon, 24 Jan 2022 01:37:17 +0900
++
++android-platform-tools (29.0.6-2) unstable; urgency=medium
++
++  * Team upload.
++  * debian/control:
++    - Remove unused B-D: debhelper (>= 11).
++    - Use clang for all ARCHs.
++  * debian/patches:
++    - Update to adapt patch requirement for gbp pq command:
++      + debian/patches/system/core/stub-out-fastdeploy.patch
++    - To fix ftbfs issues (Closes: #999334):
++      + Update: debian/patches/art/fix-standard-namespace-errors.patch
++      + Update: debian/patches/system/core/add-missing-headers.patch
++      + Add: debian/patches/system/core/fix-standard-namespace-errors.patch
++    - Cherry-pick patch from upstream:
++      + Switch to an assembler macro for CFI_RESTORE_STATE_AND_DEF_CFA.
++
++ -- Roger Shimizu <rosh@debian.org>  Sun, 23 Jan 2022 18:03:24 +0900
++
++android-platform-tools (29.0.6-1) unstable; urgency=medium
++
++  * Team upload
++  * New upstream version 29.0.6
++
++ -- Prateek Ganguli <prateek.ganguli@gmail.com>  Thu, 20 May 2021 10:00:00 +0530
++
++android-platform-tools (29.0.4-1) UNRELEASED; urgency=medium
++
++  * New upstream version 29.0.4
++
++ -- Prateek Ganguli <prateek.ganguli@gmail.com>  Thu, 06 May 2021 19:03:00 +0530
++
++android-platform-tools (10.0.0+r36-1) UNRELEASED; urgency=medium
++
++  * Initial release.
++
++ -- Chirayu Desai <chirayudesai1@gmail.com>  Thu, 28 Jan 2021 16:35:48 +0530
diff --cc debian/clean
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1709634b6db1f90558a9c73769108850a7729bb5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++debian/out/
++*.o
++debian/manpages/development/*.1
++debian/manpages/system/core/*.1
++debian/.gradle/
diff --cc debian/control
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e48a322451ef7286fbaa71be23b4591573d53f32
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,350 @@@
++Source: android-platform-tools
++Section: devel
++Priority: optional
++Maintainer: Android Tools Maintainers <android-tools-devel@lists.alioth.debian.org>
++Uploaders: Chirayu Desai <chirayudesai1@gmail.com>
++Build-Depends:
++ bash-completion,
++ debhelper-compat (= 13),
++ dh-exec,
++Build-Depends-Arch:
++ android-libboringssl-dev (>= 12) [amd64 i386 armel armhf arm64 mipsel mips64el ppc64el],
++ clang [amd64 i386 armel armhf arm64 mipsel mips64el ppc64el s390x powerpc ppc64 sparc64 riscv64],
++ libgtest-dev,
++ libpng-dev,
++ libsquashfuse-dev [amd64 i386 armel armhf arm64 mipsel mips64el ppc64el],
++ libusb-1.0-0-dev [amd64 i386 armel armhf arm64 mipsel mips64el ppc64el],
++ p7zip-full [amd64 i386 armel armhf arm64 mipsel mips64el ppc64el],
++ pandoc,
++Standards-Version: 4.5.0
++Rules-Requires-Root: no
++Vcs-Git: https://salsa.debian.org/android-tools-team/android-platform-tools.git
++Vcs-Browser: https://salsa.debian.org/android-tools-team/android-platform-tools
++Homepage: https://developer.android.com/studio/releases/platform-tools
++
++Package: android-sdk-libsparse-utils
++Architecture: any
++Multi-Arch: foreign
++Section: utils
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-libbase (= ${binary:Version}),
++         android-libsparse (= ${binary:Version}),
++         python3,
++Breaks: android-tools-fsutils,
++        append2simg (<< 1:10.0.0+r36-1~),
++        img2simg (<< 1:10.0.0+r36-1~),
++        simg2img (<< 1:10.0.0+r36-1~)
++Replaces: android-tools-fsutils,
++          append2simg (<< 1:10.0.0+r36-1~),
++          img2simg (<< 1:10.0.0+r36-1~),
++          simg2img (<< 1:10.0.0+r36-1~)
++Description: Android sparse image creation tool
++ Command line tools to create sparse images for usage with Android devices.
++ Includes simg2img, img2simg, simg2simg, simg_dump and append2simg tools.
++
++Package: android-liblog
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends}, ${shlibs:Depends}
++Description: Android NDK logger interfaces
++ liblog represents an interface to the volatile Android Logging system for NDK
++ (Native) applications and libraries. Interfaces for either writing or reading
++ logs. The log buffers are divided up in Main, System, Radio and Events
++ sub-logs.
++
++Package: android-liblog-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-liblog (= ${binary:Version}),
++Description: Android NDK logger interfaces - Development files
++ liblog represents an interface to the volatile Android Logging system for NDK
++ (Native) applications and libraries. Interfaces for either writing or reading
++ logs. The log buffers are divided up in Main, System, Radio and Events
++ sub-logs.
++ .
++ This package contains the development files.
++
++Package: android-libcutils
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-libbase (= ${binary:Version}),
++         libbsd0,
++Description: Android utils library for C
++ This library provides common functionalities for android related tools.
++ .
++ This library is only used by Android SDK currently.
++
++Package: android-libcutils-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libcutils (= ${binary:Version}),
++         android-libbase-dev (= ${binary:Version}),
++         android-platform-system-core-headers (= 1:${source:Version}),
++         libbsd-dev,
++Description: Android utils library for C - Development files
++ This library provides common functionalities for android related tools.
++ .
++ This library is only used by Android SDK currently.
++ .
++ This package contains the development files.
++
++Package: adb
++Section: utils
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: foreign
++Depends: ${misc:Depends}, ${shlibs:Depends},
++         android-libcutils (= ${binary:Version}),
++Recommends: android-sdk-platform-tools-common (>= 28.0.2~)
++Provides: android-tools-adb
++Description: Android Debug Bridge
++ A versatile command line tool that lets you communicate with an emulator
++ instance or connected Android-powered device.
++ .
++ This package recommends "android-sdk-platform-tools-common" which contains
++ the udev rules for Android devices. Without this package, adb and fastboot need
++ to be running with root permission.
++
++Package: android-libsparse
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends}, ${shlibs:Depends},
++         android-libbase (= ${binary:Version}),
++Description: Library for sparse files
++ This library provides APIs for creating, manipulating and destroying sparse
++ files.
++ .
++ This library is only used by Android SDK currently.
++
++Package: android-libsparse-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libsparse (= ${binary:Version}),
++Description: Library for sparse files - Development files
++ This library provides APIs for creating, manipulating and destroying sparse
++ files.
++ .
++ This library is only used by Android SDK currently.
++ .
++ This package contains the development files.
++
++Package: android-libutils
++Section: libs
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-libbacktrace (= ${binary:Version}),
++         android-libcutils (= ${binary:Version}),
++Description: Android Utility Function Library
++ This library provides miscellaneous utility functions.
++ .
++ This library is only used by Android SDK currently.
++
++Package: android-libutils-dev
++Section: libdevel
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libbacktrace-dev (= ${binary:Version}),
++         android-libcutils-dev (= ${binary:Version}),
++         android-libutils (= ${binary:Version}),
++         android-platform-system-core-headers (= 1:${source:Version}),
++Description: Android Utility Function Library - Development files
++ This library provides miscellaneous utility functions.
++ .
++ This library is only used by Android SDK currently.
++ .
++ This package contains the development files.
++
++Package: android-libziparchive
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-libbase (= ${binary:Version}),
++Description: Library for ZIP archives
++ This library provides APIs for creating and manipulating ZIP archives.
++ .
++ This library is only used by Android SDK currently.
++
++Package: android-libziparchive-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libziparchive (= ${binary:Version}),
++         libgtest-dev,
++Description: Library for ZIP archives - Development files
++ This library provides APIs for creating and manipulating ZIP archives.
++ .
++ This library is only used by Android SDK currently.
++ .
++ This package contains the development files.
++
++Package: android-platform-frameworks-native-headers
++Section: libdevel
++Architecture: all
++Multi-Arch: foreign
++Depends: ${misc:Depends}
++Description: Headers of android-platform-frameworks-native
++ This package contains headers in include/android in platform/frameworks/native
++ Consists of all the header files ranging from asset_manager.h to window.h.
++
++Package: android-platform-system-core-headers
++Section: libdevel
++Architecture: all
++Multi-Arch: foreign
++Depends: ${misc:Depends}
++Description: Shared headers in AOSP repository platform/system/core
++ This package contains header files in AOSP repository platform/system/core that
++ do not belong to any specific libraries but used by other programs.
++ .
++ This package currently contains headers in include/private and include/system.
++
++Package: android-libbacktrace
++Section: libs
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-libbase (= ${binary:Version}),
++         p7zip-full,
++Description: Android backtrace library
++ Android backtrace library produce symbolic backtraces for making
++ debugging easier.
++
++Package: android-libbacktrace-dev
++Section: libdevel
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libbacktrace (= ${binary:Version}),
++Description: Android backtrace library - Development files
++ Android backtrace library produce symbolic backtraces for making
++ debugging easier.
++ .
++ This package contains the development files.
++
++Package: android-libbase
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-liblog (= ${binary:Version}),
++Description: Android base library
++ This library provides APIs for basic tasks like handling files, Unicode
++ strings, logging, memory allocation, integer parsing, etc..
++ .
++ This library is only used by Android SDK currently.
++
++Package: android-libbase-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libbase (= ${binary:Version}),
++         android-liblog-dev (= ${binary:Version}),
++Description: Android base library - Development files
++ This library provides APIs for basic tasks like handling files, Unicode
++ strings, logging, memory allocation, integer parsing, etc..
++ .
++ This library is only used by Android SDK currently.
++ .
++ This package contains the development files.
++
++Package: android-libnativehelper
++Section: libs
++Architecture: any
++Multi-Arch: same
++Depends: ${shlibs:Depends}, ${misc:Depends},
++         android-liblog (= 1:${binary:Version}),
++Description: Support functions for Android's class libraries
++ libnativehelper is a collection of JNI related utilities used in
++ Android.
++ .
++ There are several header and binary libraries here and not all of the
++ functionality fits together well. The header libraries are mostly C++
++ based. The binary libraries are entirely written in C with no C++
++ dependencies. This is by design as the code here can be distributed in
++ multiple ways, including mainline modules, so keeping the size down
++ benefits everyone with smaller downloads and a stable ABI.
++
++Package: android-libnativehelper-dev
++Section: libdevel
++Architecture: any
++Multi-Arch: same
++Depends: ${misc:Depends},
++         android-libnativehelper (= ${binary:Version}),
++Breaks: android-libnativehelper (<< 10.0.0+r36-3)
++Replaces: android-libnativehelper (<< 10.0.0+r36-3)
++Description: Support functions for Android's class libraries - Development files
++ libnativehelper is a collection of JNI related utilities used in
++ Android.
++ .
++ There are several header and binary libraries here and not all of the
++ functionality fits together well. The header libraries are mostly C++
++ based. The binary libraries are entirely written in C with no C++
++ dependencies. This is by design as the code here can be distributed in
++ multiple ways, including mainline modules, so keeping the size down
++ benefits everyone with smaller downloads and a stable ABI.
++ .
++ This package contains the development files.
++
++Package: mkbootimg
++Depends: ${misc:Depends},
++         python3:any,
++Breaks: android-tools-mkbootimg (<< 1:10.0.0+r36-11)
++Replaces: android-tools-mkbootimg (<< 1:10.0.0+r36-11)
++Architecture: all
++Multi-Arch: foreign
++Section: utils
++Description: Creates Android boot images
++ Creates Android boot images that includes kernel image and ramdisk, in a
++ special format which can be used with fastboot.
++
++Package: fastboot
++Section: utils
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Multi-Arch: foreign
++Depends: ${misc:Depends}, ${shlibs:Depends},
++         android-libcutils (= ${binary:Version}),
++         android-libsparse (= ${binary:Version}),
++         android-libziparchive (= ${binary:Version}),
++Recommends: android-sdk-platform-tools-common (>= 28.0.2~)
++Suggests: android-sdk-platform-tools
++Provides: android-tools-fastboot
++Description: Android fastboot tool
++ A command line tool for flashing an Android device, boot an Android device to
++ fastboot mode, etc..
++ .
++ This package recommends "android-sdk-platform-tools-common" which contains
++ the udev rules for Android devices. Without this package, adb and fastboot need
++ to be running with root permission.
++
++Package: etc1tool
++Architecture: any
++Multi-Arch: foreign
++Depends: ${misc:Depends}, ${shlibs:Depends},
++Description: ETC1 conversion tool
++ etc1tool is a command line utility that lets you encode PNG images to
++ the ETC1 compression standard and decode ETC1 compressed images back
++ to PNG. It is part of the Android SDK for working with media files
++ for game apps. The standard for the ETC1 texture format is here:
++ http://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt
++
++Package: hprof-conv
++Architecture: any
++Multi-Arch: foreign
++Depends: ${misc:Depends}, ${shlibs:Depends},
++Description: HPROF Converter
++ The hprof-conv tool converts the HPROF file that is generated by the Android
++ SDK tools to a standard format so you can view the file in a profiling tool of
++ your choice.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..025721283d26e89418babc943852cc71e69099ca
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1141 @@@
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0
++Upstream-Contact: https://source.android.com/compatibility/contact-us.html
++Comment: Files excluded should be kept in sync with d/orig.excludes
++Files-Excluded: *.a
++                *.apk
++                *.data
++                *.dll
++                *.exe
++                *.jar
++                *.o
++                *.so
++                *.tgz
++                *.tar.gz
++                *.vdex
++                *.zip
++                development/host/windows/usb/api/AdbWinApi.rc
++                development/host/windows/usb/api/Resource.h
++                development/host/windows/usb/winusb/AdbWinUsbApi.rc
++                development/host/windows/usb/winusb/Resource.h
++                development/perftests
++                development/prebuilt
++                development/samples
++                system/core/libunwindstack/tests
++                system/extras/simpleperf
++                external/avb/examples
++                external/selinux/mcstrans/share/examples
++
++Files: *
++Copyright: 2019, Kai-Chung Yan (殷啟聰)
++           2021, Chirayu Desai
++License: Apache-2.0
++
++Files: external/boringssl/*
++Copyright: 1998-2011, The OpenSSL Project
++License: OpenSSL and SSLeay
++
++Files: external/boringssl/src/crypto/asn1/*
++       external/boringssl/src/crypto/base64/base64.c
++       external/boringssl/src/crypto/bio/*
++       external/boringssl/src/crypto/bn_extra/*
++       external/boringssl/src/crypto/buf/*
++       external/boringssl/src/crypto/cipher_extra/cipher_extra.c
++       external/boringssl/src/crypto/cipher_extra/derive_key.c
++       external/boringssl/src/crypto/cipher_extra/e_null.c
++       external/boringssl/src/crypto/cipher_extra/e_rc2.c
++       external/boringssl/src/crypto/cipher_extra/e_rc4.c
++       external/boringssl/src/crypto/cipher_extra/internal.h
++       external/boringssl/src/crypto/conf/conf.c
++       external/boringssl/src/crypto/conf/conf_def.h
++       external/boringssl/src/crypto/cpu-intel.c
++       external/boringssl/src/crypto/dh/check.c
++       external/boringssl/src/crypto/dh/dh_test.cc
++       external/boringssl/src/crypto/dh/dh.c
++       external/boringssl/src/crypto/digest_extra/digest_extra.c
++       external/boringssl/src/crypto/dsa/dsa_test.cc
++       external/boringssl/src/crypto/dsa/dsa.c
++       external/boringssl/src/crypto/err/err.c
++       external/boringssl/src/crypto/evp/evp_asn1.c
++       external/boringssl/src/crypto/evp/evp_ctx.c
++       external/boringssl/src/crypto/evp/evp.c
++       external/boringssl/src/crypto/evp/internal.h
++       external/boringssl/src/crypto/evp/sign.c
++       external/boringssl/src/crypto/ex_data.c
++       external/boringssl/src/crypto/fipsmodule/bn/*
++       external/boringssl/src/crypto/fipsmodule/cipher/cipher.c
++       external/boringssl/src/crypto/fipsmodule/cipher/e_des.c
++       external/boringssl/src/crypto/fipsmodule/cipher/internal.h
++       external/boringssl/src/crypto/fipsmodule/des/des.c
++       external/boringssl/src/crypto/fipsmodule/des/internal.h
++       external/boringssl/src/crypto/fipsmodule/digest/digest.c
++       external/boringssl/src/crypto/fipsmodule/digest/digests.c
++       external/boringssl/src/crypto/fipsmodule/digest/internal.h
++       external/boringssl/src/crypto/fipsmodule/hmac/hmac.c
++       external/boringssl/src/crypto/fipsmodule/md4/md4.c
++       external/boringssl/src/crypto/fipsmodule/md5/md5.c
++       external/boringssl/src/crypto/fipsmodule/rsa/internal.h
++       external/boringssl/src/crypto/fipsmodule/rsa/rsa_impl.c
++       external/boringssl/src/crypto/fipsmodule/rsa/rsa.c
++       external/boringssl/src/crypto/fipsmodule/sha/sha1-altivec.c
++       external/boringssl/src/crypto/fipsmodule/sha/sha1.c
++       external/boringssl/src/crypto/fipsmodule/sha/sha256.c
++       external/boringssl/src/crypto/fipsmodule/sha/sha512.c
++       external/boringssl/src/crypto/hmac_extra/*
++       external/boringssl/src/crypto/internal.h
++       external/boringssl/src/crypto/lhash/lhash.c
++       external/boringssl/src/crypto/mem.c
++       external/boringssl/src/crypto/obj/*
++       external/boringssl/src/crypto/pem/*
++       external/boringssl/src/crypto/rc4/rc4.c
++       external/boringssl/src/crypto/rsa_extra/*
++       external/boringssl/src/crypto/stack/stack.c
++       external/boringssl/src/crypto/thread.c
++       external/boringssl/src/crypto/x509/*
++       external/boringssl/src/decrepit/bio/base64_bio.c
++       external/boringssl/src/decrepit/blowfish/blowfish.c
++       external/boringssl/src/decrepit/cast/cast_tables.c
++       external/boringssl/src/decrepit/cast/cast.c
++       external/boringssl/src/decrepit/cast/internal.h
++       external/boringssl/src/decrepit/des/cfb64ede.c
++       external/boringssl/src/decrepit/macros.h
++       external/boringssl/src/decrepit/rc4/rc4_decrepit.c
++       external/boringssl/src/decrepit/ripemd/internal.h
++       external/boringssl/src/decrepit/ripemd/ripemd.c
++       external/boringssl/src/decrepit/rsa/rsa_decrepit.c
++       external/boringssl/src/decrepit/ssl/ssl_decrepit.c
++       external/boringssl/src/include/openssl/asn1.h
++       external/boringssl/src/include/openssl/base64.h
++       external/boringssl/src/include/openssl/bio.h
++       external/boringssl/src/include/openssl/blowfish.h
++       external/boringssl/src/include/openssl/bn.h
++       external/boringssl/src/include/openssl/buf.h
++       external/boringssl/src/include/openssl/cast.h
++       external/boringssl/src/include/openssl/cipher.h
++       external/boringssl/src/include/openssl/conf.h
++       external/boringssl/src/include/openssl/cpu.h
++       external/boringssl/src/include/openssl/des.h
++       external/boringssl/src/include/openssl/dh.h
++       external/boringssl/src/include/openssl/digest.h
++       external/boringssl/src/include/openssl/dsa.h
++       external/boringssl/src/include/openssl/err.h
++       external/boringssl/src/include/openssl/evp.h
++       external/boringssl/src/include/openssl/ex_data.h
++       external/boringssl/src/include/openssl/hmac.h
++       external/boringssl/src/include/openssl/lhash.h
++       external/boringssl/src/include/openssl/md4.h
++       external/boringssl/src/include/openssl/md5.h
++       external/boringssl/src/include/openssl/mem.h
++       external/boringssl/src/include/openssl/nid.h
++       external/boringssl/src/include/openssl/obj.h
++       external/boringssl/src/include/openssl/pem.h
++       external/boringssl/src/include/openssl/rc4.h
++       external/boringssl/src/include/openssl/ripemd.h
++       external/boringssl/src/include/openssl/rsa.h
++       external/boringssl/src/include/openssl/sha.h
++       external/boringssl/src/include/openssl/ssl.h
++       external/boringssl/src/include/openssl/ssl3.h
++       external/boringssl/src/include/openssl/stack.h
++       external/boringssl/src/include/openssl/thread.h
++       external/boringssl/src/include/openssl/tls1.h
++       external/boringssl/src/include/openssl/type_check.h
++       external/boringssl/src/include/openssl/x509_vfy.h
++       external/boringssl/src/include/openssl/x509.h
++       external/boringssl/src/ssl/*
++Copyright: 1995-1998, Eric Young <eay@cryptsoft.com>
++License: SSLeay
++
++Files:
++       external/boringssl/crypto_test_data.cc
++       external/boringssl/err_data.c
++       external/boringssl/rules.mk
++       external/boringssl/src/.clang-format
++       external/boringssl/src/.github/*
++       external/boringssl/src/.gitignore
++       external/boringssl/src/BUILDING.md
++       external/boringssl/src/CMakeLists.txt
++       external/boringssl/src/CONTRIBUTING.md
++       external/boringssl/src/FUZZING.md
++       external/boringssl/src/INCORPORATING.md
++       external/boringssl/src/PORTING.md
++       external/boringssl/src/README.md
++       external/boringssl/src/STYLE.md
++       external/boringssl/src/codereview.settings
++       external/boringssl/src/crypto/asn1/asn1_test.cc
++       external/boringssl/src/crypto/base64/base64_test.cc
++       external/boringssl/src/crypto/bio/bio_test.cc
++       external/boringssl/src/crypto/bio/socket_helper.c
++       external/boringssl/src/crypto/bn_extra/bn_asn1.c
++       external/boringssl/src/crypto/bytestring/*
++       external/boringssl/src/crypto/chacha/*
++       external/boringssl/src/crypto/cipher_extra/aead_test.cc
++       external/boringssl/src/crypto/cipher_extra/e_aesctrhmac.c
++       external/boringssl/src/crypto/cipher_extra/e_aesgcmsiv.c
++       external/boringssl/src/crypto/cipher_extra/e_chacha20poly1305.c
++       external/boringssl/src/crypto/cipher_extra/e_tls.c
++       external/boringssl/src/crypto/cipher_extra/test/nist_cavp/make_cavp.go
++       external/boringssl/src/crypto/cmac/cmac_test.cc
++       external/boringssl/src/crypto/compiler_test.cc
++       external/boringssl/src/crypto/conf/internal.h
++       external/boringssl/src/crypto/cpu-aarch64-linux.c
++       external/boringssl/src/crypto/cpu-arm-linux.c
++       external/boringssl/src/crypto/cpu-arm.c
++       external/boringssl/src/crypto/cpu-ppc64le.c
++       external/boringssl/src/crypto/crypto.c
++       external/boringssl/src/crypto/curve25519/*
++       external/boringssl/src/crypto/digest_extra/digest_test.cc
++       external/boringssl/src/crypto/engine/*
++       external/boringssl/src/crypto/err/err_data_generate.go
++       external/boringssl/src/crypto/err/err_test.cc
++       external/boringssl/src/crypto/evp/evp_extra_test.cc
++       external/boringssl/src/crypto/evp/p_ed25519.c
++       external/boringssl/src/crypto/evp/p_ed25519_asn1.c
++       external/boringssl/src/crypto/evp/pbkdf_test.cc
++       external/boringssl/src/crypto/evp/scrypt_test.cc
++       external/boringssl/src/crypto/fipsmodule/aes/aes_test.cc
++       external/boringssl/src/crypto/fipsmodule/aes/internal.h
++       external/boringssl/src/crypto/fipsmodule/bcm.c
++       external/boringssl/src/crypto/fipsmodule/bn/check_bn_tests.go
++       external/boringssl/src/crypto/fipsmodule/cipher/aead.c
++       external/boringssl/src/crypto/fipsmodule/delocate.h
++       external/boringssl/src/crypto/fipsmodule/ec/ec_test.cc
++       external/boringssl/src/crypto/fipsmodule/ec/p224-64.c
++       external/boringssl/src/crypto/fipsmodule/ec/p256-x86_64_test.cc
++       external/boringssl/src/crypto/fipsmodule/is_fips.c
++       external/boringssl/src/crypto/fipsmodule/modes/polyval.c
++       external/boringssl/src/crypto/fipsmodule/rand/*
++       external/boringssl/src/crypto/hkdf/*
++       external/boringssl/src/crypto/lhash/lhash_test.cc
++       external/boringssl/src/crypto/obj/obj_test.cc
++       external/boringssl/src/crypto/obj/objects.go
++       external/boringssl/src/crypto/pkcs7/*
++       external/boringssl/src/crypto/pkcs8/pkcs12_test.cc
++       external/boringssl/src/crypto/pkcs8/pkcs8_test.cc
++       external/boringssl/src/crypto/poly1305/*
++       external/boringssl/src/crypto/pool/*
++       external/boringssl/src/crypto/rand_extra/*
++       external/boringssl/src/crypto/refcount_*.c
++       external/boringssl/src/crypto/test/*
++       external/boringssl/src/crypto/thread_*.c
++       external/boringssl/src/crypto/x509/internal.h
++       external/boringssl/src/crypto/x509/x509_test.cc
++       external/boringssl/src/decrepit/evp/*
++       external/boringssl/src/decrepit/obj/*
++       external/boringssl/src/decrepit/x509/*
++       external/boringssl/src/include/openssl/aead.h
++       external/boringssl/src/include/openssl/asn1_mac.h
++       external/boringssl/src/include/openssl/buffer.h
++       external/boringssl/src/include/openssl/bytestring.h
++       external/boringssl/src/include/openssl/chacha.h
++       external/boringssl/src/include/openssl/cmac.h
++       external/boringssl/src/include/openssl/crypto.h
++       external/boringssl/src/include/openssl/curve25519.h
++       external/boringssl/src/include/openssl/dtls1.h
++       external/boringssl/src/include/openssl/engine.h
++       external/boringssl/src/include/openssl/hkdf.h
++       external/boringssl/src/include/openssl/is_boringssl.h
++       external/boringssl/src/include/openssl/obj_mac.h
++       external/boringssl/src/include/openssl/objects.h
++       external/boringssl/src/include/openssl/opensslconf.h
++       external/boringssl/src/include/openssl/opensslv.h
++       external/boringssl/src/include/openssl/ossl_typ.h
++       external/boringssl/src/include/openssl/pkcs12.h
++       external/boringssl/src/include/openssl/pkcs7.h
++       external/boringssl/src/include/openssl/poly1305.h
++       external/boringssl/src/include/openssl/pool.h
++       external/boringssl/src/include/openssl/rand.h
++       external/boringssl/src/include/openssl/safestack.h
++       external/boringssl/src/include/openssl/srtp.h
++       external/boringssl/src/ssl/CMakeLists.txt
++       external/boringssl/src/ssl/ssl_aead_ctx.cc
++       external/boringssl/src/ssl/ssl_buffer.cc
++       external/boringssl/src/ssl/ssl_test.cc
++       external/boringssl/src/ssl/ssl_versions.cc
++       external/boringssl/src/ssl/test/*
++       external/boringssl/src/ssl/tls13_both.cc
++       external/boringssl/src/ssl/tls13_client.cc
++       external/boringssl/src/ssl/tls13_enc.cc
++       external/boringssl/src/ssl/tls13_server.cc
++       external/boringssl/src/tool/*
++       external/boringssl/src/util/*
++Copyright: 2014-2017, Google Inc.
++License: ISC
++
++Files: external/boringssl/src/crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl
++Copyright: 2017, Shay Gueron
++           2017, Google Inc
++License: ISC
++
++Files: external/boringssl/AndroidTest.xml
++       external/boringssl/sources.bp
++       external/boringssl/sources.mk
++Copyright: 2017, The Android Open Source Project
++License: Apache-2.0
++
++Files: external/boringssl/src/ssl/test/runner/curve25519/*
++       external/boringssl/src/ssl/test/runner/alert.go
++       external/boringssl/src/ssl/test/runner/cipher_suites.go
++       external/boringssl/src/ssl/test/runner/common.go
++       external/boringssl/src/ssl/test/runner/conn.go
++       external/boringssl/src/ssl/test/runner/dtls.go
++       external/boringssl/src/ssl/test/runner/handshake_client.go
++       external/boringssl/src/ssl/test/runner/handshake_messages.go
++       external/boringssl/src/ssl/test/runner/handshake_server.go
++       external/boringssl/src/ssl/test/runner/key_agreement.go
++       external/boringssl/src/ssl/test/runner/packet_adapter.go
++       external/boringssl/src/ssl/test/runner/prf.go
++       external/boringssl/src/ssl/test/runner/sign.go
++       external/boringssl/src/ssl/test/runner/ticket.go
++       external/boringssl/src/ssl/test/runner/tls.go
++Copyright: 2012-2016, The Go Authors
++License: BSD-3-clause
++
++Files: external/boringssl/src/util/bot/go/*
++       external/boringssl/src/util/bot/vs_toolchain.py
++Copyright: 2014, The Chromium Authors
++License: BSD-3-clause
++
++Files: external/boringssl/src/crypto/fipsmodule/bn/asm/rsaz-avx2.pl
++       external/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.c
++       external/boringssl/src/crypto/fipsmodule/bn/rsaz_exp.h
++Copyright: 2012, Intel Corporation
++License: BSD-3-clause
++
++Files: external/boringssl/src/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl
++       external/boringssl/src/crypto/fipsmodule/ec/p256-x86_64-table.h
++       external/boringssl/src/crypto/fipsmodule/ec/p256-x86_64.*
++Copyright: 2014-2015, Intel Corporation
++License: ISC
++
++Files: external/boringssl/src/crypto/x509v3/v3_pci.c
++       external/boringssl/src/crypto/x509v3/v3_pcia.c
++Copyright: 2004, Kungliga Tekniska Högskolan
++License: BSD-3-clause
++
++Files: external/boringssl/src/include/openssl/ecdh.h
++Copyright: 2002, Sun Microsystems
++           2000-2002, The OpenSSL Project
++License: OpenSSL
++
++Files: external/boringssl/src/crypto/fipsmodule/bn/montgomery_inv.c
++Copyright: 2016, Brian Smith
++License: ISC
++
++Files: external/boringssl/src/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl
++Copyright: 2015, CloudFlare Ltd
++License: ISC
++
++Files: debian/*
++Copyright: 2022, Roger Shimizu <rosh@debian.org>
++           2018, Saif Abdul Cassim <saif.15@cse.mrt.ac.lk>
++           2016, Kai-Chung Yan (殷啟聰) <seamlikok@gmail.com>
++           2015, Laszlo Boszormenyi (GCS) <gcs@debian.org>
++           2015, Hans-Christoph Steiner <hans@eds.org>
++License: MIT
++
++Files: external/selinux/*
++Copyright: 2004-2005, Trusted Computer Solutions, Inc.
++           2003-2008, Tresys Technology, LLC
++           2005-2013, Red Hat Inc.
++License: GPL-2
++
++Files: external/selinux/libselinux/*
++Copyright: N/A
++License: public-domain
++
++Files: external/selinux/checkpolicy/parse_util.*
++       external/selinux/libsemanage/*
++       external/selinux/libsepol/*
++Copyright: 2004-2005, Trusted Computer Solutions, Inc.
++           2003-2008, Tresys Technology, LLC
++           2005-2007, Red Hat Inc.
++License: LGPL-2.1
++
++Files: external/libunwind/*
++Copyright: 2001-2005 Hewlett-Packard Co.
++           2007 David Mosberger-Tang
++License: MIT
++
++Files: external/libunwind/android/*
++Copyright: 2014 The Android Open Source Project
++License: Apache-2.0
++
++Files: external/libunwind/src/arm/*
++Copyright: 2008 CodeSourcery
++License: MIT
++
++Files: external/libunwind/src/mi/strerror.c
++Copyright: 2004 BEA Systems
++License: MIT
++
++Files: external/libunwind/src/mips/*
++Copyright: 2008 CodeSourcery
++License: MIT
++
++Files: external/libunwind/src/ppc*/*
++Copyright: 2006-2007 IBM
++License: MIT
++
++Files: external/libunwind/src/ptrace/_UPT_access_*
++Copyright: 2003-2005 Hewlett-Packard Co
++           2010 Konstantin Belousov <kib@freebsd.org>
++License: MIT
++
++Files: external/libunwind/src/unwind/GetIPInfo.c
++Copyright: 2009 Red Hat
++License: MIT
++
++Files: external/libunwind/src/x86/getcontext-linux.S
++Copyright: 2009 Google, Inc
++License: MIT
++
++Files: external/libunwind/src/x86_64/*context.S
++Copyright: 2008 Google, Inc
++           2010 Konstantin Belousov <kib@freebsd.org>
++License: MIT
++
++Files: external/libunwind/tests/Gtest-nomalloc.c
++Copyright: 2009, 2011 Google, Inc
++License: MIT
++
++Files: external/libunwind/tests/Gtest-trace.c
++Copyright: 2010, 2011 by FERMI NATIONAL ACCELERATOR LABORATORY
++License: MIT
++
++Files: external/libunwind/tests/Ltest-cxx-exceptions.cxx
++Copyright: 2010 stefan.demharter@gmx.net
++           2010 arun.sharma@google.com
++License: MIT
++
++Files: debian/include/external/libunwind/*
++Copyright: 2013-2014, Igor Pavlov
++License: public-domain
++
++Files: libnativehelper/*
++Copyright: 2005-2014, The Android Open Source Project
++License: Apache-2.0
++
++Files: system/core/*
++Copyright: 2005-2014, The Android Open Source Project
++License: Apache-2.0
++
++Files: debian/bash-completion/system/core/*
++Copyright: 2009, Matt Brubeck
++License: MIT
++
++Files: system/core/fastboot/*.cpp
++       system/core/fastboot/*.h
++       system/core/libcutils/arch-mips/android_memset.c
++       system/core/libcutils/socket_inaddr_any_server_windows.cpp
++       system/core/libcutils/socket_network_client_windows.cpp
++       system/core/libcutils/sockets.cpp
++       system/core/libcutils/sockets_windows.cpp
++       system/core/libpixelflinger/arch-arm64/col32cb16blend.S
++       system/core/libpixelflinger/arch-arm64/t32cb16blend.S
++       system/core/libpixelflinger/codeflinger/Arm64Assembler.cpp
++       system/core/libpixelflinger/codeflinger/Arm64Assembler.h
++       system/core/libpixelflinger/codeflinger/Arm64Disassembler.cpp
++       system/core/libpixelflinger/codeflinger/Arm64Disassembler.h
++       system/core/libpixelflinger/tests/arch-arm64/*
++       system/core/libpixelflinger/tests/arch-mips/*
++       system/core/libpixelflinger/tests/arch-mips64/*
++       system/core/libpixelflinger/tests/gglmul/gglmul_test.cpp
++Copyright: 2008-2016, The Android Open Source Project
++License: BSD-2-clause
++
++Files: system/core/libcutils/include/cutils/ashmem.h
++       system/core/liblog/logger.h
++Copyright: 2007-2014, The Android Open Source Project
++License: Apache-2.0 or GPL-2
++
++Files: system/core/libpixelflinger/codeflinger/armreg.h
++       system/core/libpixelflinger/codeflinger/disassem.c
++       system/core/libpixelflinger/codeflinger/disassem.h
++Copyright: 1998-2001, Ben Harris
++           1994-1996, Mark Brinicombe
++           1994, Brini
++           1997, Causality Limited
++License: BSD-4-clause
++
++Files: system/core/libpixelflinger/codeflinger/mips_opcode.h
++       system/core/libpixelflinger/codeflinger/mips_disassem.c
++       system/core/libpixelflinger/codeflinger/mips_disassem.h
++       system/core/libpixelflinger/codeflinger/mips64_disassem.c
++       system/core/libpixelflinger/codeflinger/mips64_disassem.h
++Copyright: 1987-1994, The Regents of the University of California
++License: BSD-3-clause
++
++Files: system/core/libsparse/sparse_crc32.cpp
++Copyright: 1986, Gary S. Brow
++License: BSD-2-clause
++
++Files: system/core/debuggerd/libdebuggerd/test/sys/system_properties.h
++Copyright: 2015, The Android Open Source Project
++License: BSD-2-clause
++
++Files: system/core/libcutils/arch-arm64/android_memset.S
++Copyright: 2012, Linaro Limited
++License: BSD-3-clause
++
++Files: system/core/libcutils/strlcpy.c
++Copyright: 1998, Todd C. Miller <Todd.Miller@courtesan.com>
++License: MIT
++
++Files: development/*
++Copyright: 2005-2016, The Android Open Source Project
++           2008-2012, Google Inc.
++           1995-1996, Carnegie-Mellon University.
++License: Apache-2.0
++
++Files: art/*
++Copyright: 2005-2018, The Android Open Source Project
++License: Apache-2.0
++
++Files: debian/include/art/dlmalloc/*
++Copyright: N/A
++License: public-domain
++
++Files: frameworks/native/*
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/cmds/bugreportz/bugreportz.h
++Copyright: 2009, 2016, Google Inc.
++License: Apache-2.0
++
++Files: frameworks/native/cmds/rawbu/backup.cpp
++Copyright: 2008-2010, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/cmds/servicemanager/*
++Copyright: 2008-2010, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/headers/media_plugin/media/openmax/*
++Copyright: 1998-2009, PacketVideo
++License: Apache-2.0
++
++Files: frameworks/native/headers/media_plugin/media/openmax/OMX_AsString.h
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/headers/media_plugin/media/openmax/OMX_AudioExt.h
++  frameworks/native/headers/media_plugin/media/openmax/OMX_IndexExt.h
++  frameworks/native/headers/media_plugin/media/openmax/OMX_VideoExt.h
++Copyright: 2010, The Khronos Group Inc.
++License: Expat
++
++Files: frameworks/native/include/OWNERS
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/libs/input/InputTransport.cpp
++Copyright: 2008-2010, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/OWNERS
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/include/*
++Copyright: 2007-2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/opengl/include/EGL/Platform.h
++  frameworks/native/opengl/include/EGL/eglext_angle.h
++Copyright: 2015, 2017, The ANGLE Project Authors.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/include/ETC1/*
++Copyright: 2009, 2016, Google Inc.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/include/GLES/*
++Copyright: 2008-2017, The Khronos Group Inc.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/include/GLES/NOTICE
++Copyright: 2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/opengl/include/GLES/gl.h
++  frameworks/native/opengl/include/GLES/glext.h
++Copyright: 2007-2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/opengl/include/GLES2/NOTICE
++Copyright: 2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/opengl/include/GLES2/gl2platform.h
++Copyright: 2008-2017, The Khronos Group Inc.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/include/GLES3/NOTICE
++Copyright: 2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/opengl/include/GLES3/gl3platform.h
++Copyright: 2008-2017, The Khronos Group Inc.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/EGL/*
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/EGL/GLES_layers.md
++  frameworks/native/opengl/libs/EGL/egl_entries.in
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/ETC1/*
++Copyright: 2009, 2016, Google Inc.
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/GLES2/gl2.cpp
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/GLES_CM/gl.cpp
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/libs/egl_impl.h
++  frameworks/native/opengl/libs/hooks.h
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/specs/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/angeles/*
++Copyright: 2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/angeles/app-linux.cpp
++Copyright: 2004, 2005, Jetro Lauha
++License: Expat
++
++Files: frameworks/native/opengl/tests/filter/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gl2_jni/jni/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gl_basic/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gl_jni/jni/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gl_perf/fragment_shaders.cpp
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gl_perfapp/jni/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/gldual/jni/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/testPauseResume/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/testPauseResume/src/*
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/testViewport/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/testViewport/src/*
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tests/tritex/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/gen
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/specs/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/stubs/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/stubs/egl/EGL14cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/egl/EGL15cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/egl/EGLExtcHeader.cpp
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/stubs/gles11/GLES10ExtcHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES10cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES11ExtcHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES11cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES20cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES30cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES31ExtcHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES31cHeader.cpp
++  frameworks/native/opengl/tools/glgen/stubs/gles11/GLES32cHeader.cpp
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/stubs/jsr239/*
++Copyright: 2005-2019, The Android Open Source Project
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen/stubs/jsr239/glGetString.cpp
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/opengl/tools/glgen2/registry/*
++Copyright: 2007-2017, The Khronos Group Inc.
++License: Khronos
++
++Files: frameworks/native/services/batteryservice/include/batteryservice/BatteryServiceConstants.h
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/bufferhub/BufferNode.cpp
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/bufferhub/include/bufferhub/BufferNode.h
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/bufferhub/tests/*
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/displayservice/OWNERS
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/inputflinger/OWNERS
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/sensorservice/OWNERS
++Copyright: 2008-2017, The Khronos Group Inc.
++  2008-2016, Google Inc.
++  2005-2017, The Android Open Source Project
++  2004, 2005, Jetro Lauha
++License: Apache-2.0
++
++Files: frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/*
++Copyright: 2015, 2016, Valve Corporation
++  2015, 2016, The Khronos Group Inc.
++  2015, 2016, LunarG, Inc.
++  2015, 2016, Google, Inc.
++License: Apache-2.0
++
++Files: system/extras/*
++Copyright: 2005-2015, The Android Open Source Project
++License: Apache-2.0
++
++Files: system/extras/ANRdaemon/ANRdaemon.cpp
++       system/extras/cpustats/cpustats.c
++Copyright: 2012-2015, The Android Open Source Project
++License: BSD-3-clause
++
++Files: system/extras/tests/directiotest/directiotest.c
++Copyright: 2010, Garmin Ltd. or its subsidiaries
++License: Apache-2.0
++
++Files: dalvik/*
++Copyright: 2005-2015, The Android Open Source Project
++           2006, Google Inc.
++           2005-2006, Intel Corporation
++           2005-2006, RSA Data Security Inc.
++           2005-2006, Caldera International Inc.
++License: Apache-2.0
++
++License: Apache-2.0
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ .
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
++ .
++ On Debian systems, the full text of the Apache License, Version 2.0
++ can be found in the file `/usr/share/common-licenses/Apache-2.0'.
++
++License: OpenSSL
++ 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. All advertising materials mentioning features or use of this
++    software must display the following acknowledgment:
++    "This product includes software developed by the OpenSSL Project
++    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
++ 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
++    endorse or promote products derived from this software without
++    prior written permission. For written permission, please contact
++    openssl-core@openssl.org.
++ 5. Products derived from this software may not be called "OpenSSL"
++    nor may "OpenSSL" appear in their names without prior written
++    permission of the OpenSSL Project.
++ 6. Redistributions of any form whatsoever must retain the following
++    acknowledgment:
++    "This product includes software developed by the OpenSSL Project
++    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
++ .
++ THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
++ EXPRESSED 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 OpenSSL PROJECT OR
++ ITS CONTRIBUTORS 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.
++
++License: ISC
++ Permission to use, copy, modify, and/or distribute this software for any
++ purpose with or without fee is hereby granted, provided that the above
++ copyright notice and this permission notice appear in all copies.
++ .
++ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
++ SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
++ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
++ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++
++License: MIT
++ 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
++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ SOFTWARE.
++
++License: SSLeay
++ This library is free for commercial and non-commercial use as long as
++ the following conditions are adhered to.  The following conditions
++ apply to all code found in this distribution, be it the RC4, RSA,
++ lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ included with this distribution is covered by the same copyright terms
++ except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ .
++ Copyright remains Eric Young's, and as such any Copyright notices in
++ the code are not to be removed.
++ If this package is used in a product, Eric Young should be given attribution
++ as the author of the parts of the library used.
++ This can be in the form of a textual message at program startup or
++ in documentation (online or textual) provided with the package.
++ .
++ 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 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. All advertising materials mentioning features or use of this software
++    must display the following acknowledgement:
++    "This product includes cryptographic software written by
++     Eric Young (eay@cryptsoft.com)"
++    The word 'cryptographic' can be left out if the routines from the library
++    being used are not cryptographic related :-).
++ 4. If you include any Windows specific code (or a derivative thereof) from
++    the apps directory (application code) you must include an acknowledgement:
++    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ .
++ THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 OR CONTRIBUTORS 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 licence and distribution terms for any publically available version or
++ derivative of this code cannot be changed.  i.e. this code cannot simply be
++ copied and put under another distribution licence
++ [including the GNU General Public Licence.]
++
++License: BSD-3-clause
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are
++ met:
++ .
++    * Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++    * 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.
++    * Neither the name of Google Inc. nor the names of its
++ contributors may be used to endorse or promote products derived from
++ this software without specific prior written permission.
++ .
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ "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 COPYRIGHT
++ OWNER OR CONTRIBUTORS 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.
++
++License: public-domain
++ The person or persons who have associated work with this document (the
++ "Dedicator" or "Certifier") hereby either (a) certifies that, to the best of
++ his knowledge, the work of authorship identified is in the public domain of the
++ country from which the work is published, or (b) hereby dedicates whatever
++ copyright the dedicators holds in the work of authorship identified below (the
++ "Work") to the public domain. A certifier, moreover, dedicates any copyright
++ interest he may have in the associated work, and for these purposes, is
++ described as a "dedicator" below.
++ .
++ A certifier has taken reasonable steps to verify the copyright status of this
++ work. Certifier recognizes that his good faith efforts may not shield him from
++ liability if in fact the work certified is not in the public domain.
++ .
++ Dedicator makes this dedication for the benefit of the public at large and to
++ the detriment of the Dedicator's heirs and successors. Dedicator intends this
++ dedication to be an overt act of relinquishment in perpetuity of all present
++ and future rights under copyright law, whether vested or contingent, in the
++ Work. Dedicator understands that such relinquishment of all rights includes the
++ relinquishment of all rights to enforce (by lawsuit or otherwise) those
++ copyrights in the Work.
++ .
++ Dedicator recognizes that, once placed in the public domain, the Work may be
++ freely reproduced, distributed, transmitted, used, modified, built upon, or
++ otherwise exploited by anyone for any purpose, commercial or non-commercial,
++ and in any way, including by methods that have not yet been invented or
++ conceived.
++ .
++ This copy of license text is based on
++   http://creativecommons.org/licenses/publicdomain
++
++License: GPL-2
++ Full text of the GNU General Public License version 2 can be found at
++ `/usr/share/common-licenses/GPL-2` in any Debian distribution.
++
++License: LGPL-2.1
++ Full text of the GNU Lesser General Public License version 2.1 can be found at
++ `/usr/share/common-licenses/GPL-2` in any Debian distribution.
++
++License: BSD-2-clause
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions
++ are met:
++ *  Redistributions of source code must retain the above copyright
++    notice, this list of conditions and the following disclaimer.
++ *  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.
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ "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
++ COPYRIGHT OWNER OR CONTRIBUTORS 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.
++
++License: BSD-4-clause
++ 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. All advertising materials mentioning features or use of this software
++    must display the following acknowledgement:
++    This product includes software developed by Mark Brinicombe.
++ 4. The name of the company nor the name of the author may be used to
++    endorse or promote products derived from this software without specific
++    prior written permission.
++
++License: Expat
++ This software is Copyright (c) 2020 by foo.
++ This is free software, licensed under:
++ The MIT (X11) License
++ The MIT License
++ 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 AUTHORS OR COPYRIGHT HOLDERS BE
++ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ CONNECTION WITH THE SOFTWARE OR THE USE OR
++ OTHER DEALINGS IN THE SOFTWARE.
++
++License: Khronos
++ Copyright (c) 2017 The Khronos Group Inc.
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++     http://www.apache.org/licenses/LICENSE-2.0
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
++ Copyright (c) 2013-2017 The Khronos Group Inc.
++ Permission is hereby granted, free of charge, to any person obtaining a
++ copy of this software and/or associated documentation files (the
++ "Materials"), to deal in the Materials without restriction, including
++ without limitation the rights to use, copy, modify, merge, publish,
++ distribute, sublicense, and/or sell copies of the Materials, and to
++ permit persons to whom the Materials are 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 Materials.
++ THE MATERIALS ARE 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
++ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..749719f224b8468acd0b72b7180213b934a987c0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,8 @@@
++NAME = hprof-conv
++
++SOURCES = dalvik/tools/hprof-conv/HprofConv.c
++LDFLAGS += -pie
++
++debian/out/dalvik/tools/$(NAME): $(SOURCES)
++      mkdir -p debian/out/dalvik/tools
++      $(CC) -o $@ $^ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e0b6ca491d4f6010ad0a2e085751ed4b29b6f459
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++NAME = etc1tool
++
++SOURCES = development/tools/etc1tool/etc1tool.cpp
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -I/usr/include/android \
++  -Idevelopment/include \
++  -Iframeworks/native/opengl/include \
++
++LDFLAGS += -lpng -pie
++STATIC_LIBS = debian/out/frameworks/native/libETC1.a
++
++debian/out/development/$(NAME): $(SOURCES)
++      mkdir -p debian/out/development
++      $(CXX) -o $@ $^ $(CXXFLAGS) $(CPPFLAGS) $(STATIC_LIBS) $(LDFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dbcf683b07dadcb8ab6babcdd0257999ab798258
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++art/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5dc3489a6aae911e4ccd789b246038e9b6ae638b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/art/dmtracedump    usr/lib/android-sdk/platform-tools/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..637133937891b6991a6bdf54cc19ff8b4f95cc52
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/android-sdk/platform-tools/dmtracedump   usr/bin/dmtracedump
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2a8dd0946b2e4aba1192ff9579f3a59d35c40210
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/art/dmtracedump.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6cff7b1faddebd0869db7d02b21231ee863d531a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++libnativehelper/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2f89bcef6a53f059ffbe64229740ff3fdff170b7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/development/etc1tool   usr/lib/android-sdk/platform-tools/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5257d2f3488b889765a567fe6554432c010a00fd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/android-sdk/platform-tools/etc1tool   usr/bin/etc1tool
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9420d349188d1e7d51cdd23b190091217c633ff5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++# the line is too long because its a long URL, wrapping it will make
++# it no longer clickable
++
++extended-description-line-too-long
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..006227ed2c5f5e369772514d57d5f92d4b0c156a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/manpages/development/etc1tool.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fb9a97c179f9f9fc2b3855e4d56c1cb2a492a706
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++# More info see: /usr/share/dpkg/cputable
++
++ifeq ($(DEB_HOST_ARCH), amd64)
++  CPU = x86_64
++endif
++ifeq ($(DEB_HOST_ARCH), i386)
++  CPU = x86
++endif
++ifeq ($(DEB_HOST_ARCH), armel)
++  CPU = arm
++endif
++ifeq ($(DEB_HOST_ARCH), armhf)
++  CPU = arm
++endif
++ifeq ($(DEB_HOST_ARCH), arm64)
++  CPU = arm64
++endif
++ifeq ($(DEB_HOST_ARCH), mipsel)
++  CPU = mips
++endif
++ifeq ($(DEB_HOST_ARCH), mips64el)
++  CPU = mips64
++endif
++ifeq ($(DEB_HOST_ARCH), ppc64el)
++  CPU = ppc64
++endif
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c09a3826f1e4e56015fa298693e83360ba900feb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,179 @@@
++include debian/external/libunwind/detect-arch.mk
++
++NAME = libunwind
++
++ARCH_SOURCES = \
++  is_fpreg.c \
++  regname.c \
++  Gcreate_addr_space.c \
++  Gget_proc_info.c \
++  Gget_save_loc.c \
++  Gglobal.c \
++  Ginit.c \
++  Ginit_local.c \
++  Ginit_remote.c \
++  Gregs.c \
++  Gresume.c \
++  Gstep.c \
++  Lcreate_addr_space.c \
++  Lget_proc_info.c \
++  Lget_save_loc.c \
++  Lglobal.c \
++  Linit.c \
++  Linit_local.c \
++  Linit_remote.c \
++  Lregs.c \
++  Lresume.c \
++  Lstep.c \
++
++arm_SOURCES = $(foreach source, $(ARCH_SOURCES), src/arm/$(source)) \
++  src/arm/getcontext.S \
++  src/arm/Gis_signal_frame.c \
++  src/arm/Gex_tables.c \
++  src/arm/Lis_signal_frame.c \
++  src/arm/Lex_tables.c \
++  src/elf32.c \
++
++arm64_SOURCES = $(foreach source, $(ARCH_SOURCES), src/aarch64/$(source)) \
++  src/aarch64/Gis_signal_frame.c \
++  src/aarch64/Lis_signal_frame.c \
++  src/elf64.c \
++
++mips_SOURCES = $(foreach source, $(ARCH_SOURCES), src/mips/$(source)) \
++  src/mips/getcontext-android.S \
++  src/mips/Gis_signal_frame.c \
++  src/mips/Lis_signal_frame.c \
++
++mips64_SOURCES := $(mips_SOURCES) src/elf64.c
++mips_SOURCES += src/elf32.c
++x86_SOURCES = $(foreach source, $(ARCH_SOURCES), src/x86/$(source)) \
++  src/x86/getcontext-linux.S \
++  src/x86/Gos-linux.c \
++  src/x86/Los-linux.c \
++  src/elf32.c \
++
++x86_64_SOURCES = $(foreach source, $(ARCH_SOURCES), src/x86_64/$(source)) \
++  src/x86_64/getcontext.S \
++  src/x86_64/Gstash_frame.c \
++  src/x86_64/Gtrace.c \
++  src/x86_64/Gos-linux.c \
++  src/x86_64/Lstash_frame.c \
++  src/x86_64/Ltrace.c \
++  src/x86_64/Los-linux.c \
++  src/x86_64/setcontext.S \
++  src/elf64.c \
++
++arm_INCLUDES = -Iexternal/libunwind/include/tdep-arm
++arm64_INCLUDES = -Iexternal/libunwind/include/tdep-aarch64
++mips_INCLUDES = -Iexternal/libunwind/include/tdep-mips
++mips64_INCLUDES = $(mips_INCLUDES)
++x86_INCLUDES = -Iexternal/libunwind/include/tdep-x86
++x86_64_INCLUDES = -Iexternal/libunwind/include/tdep-x86_64
++ppc64_INCLUDES = -Iexternal/libunwind/include/tdep-ppc64
++
++SOURCES = \
++  src/mi/init.c \
++  src/mi/flush_cache.c \
++  src/mi/mempool.c \
++  src/mi/strerror.c \
++  src/mi/backtrace.c \
++  src/mi/dyn-cancel.c \
++  src/mi/dyn-info-list.c \
++  src/mi/dyn-register.c \
++  src/mi/map.c \
++  src/mi/Lmap.c \
++  src/mi/Ldyn-extract.c \
++  src/mi/Lfind_dynamic_proc_info.c \
++  src/mi/Lget_proc_info_by_ip.c \
++  src/mi/Lget_proc_name.c \
++  src/mi/Lput_dynamic_unwind_info.c \
++  src/mi/Ldestroy_addr_space.c \
++  src/mi/Lget_reg.c \
++  src/mi/Lset_reg.c \
++  src/mi/Lget_fpreg.c \
++  src/mi/Lset_fpreg.c \
++  src/mi/Lset_caching_policy.c \
++  src/mi/Gdyn-extract.c \
++  src/mi/Gdyn-remote.c \
++  src/mi/Gfind_dynamic_proc_info.c \
++  src/mi/Gget_accessors.c \
++  src/mi/Gget_proc_info_by_ip.c \
++  src/mi/Gget_proc_name.c \
++  src/mi/Gput_dynamic_unwind_info.c \
++  src/mi/Gdestroy_addr_space.c \
++  src/mi/Gget_reg.c \
++  src/mi/Gset_reg.c \
++  src/mi/Gget_fpreg.c \
++  src/mi/Gset_fpreg.c \
++  src/mi/Gset_caching_policy.c \
++  src/dwarf/Lexpr.c \
++  src/dwarf/Lfde.c \
++  src/dwarf/Lparser.c \
++  src/dwarf/Lpe.c \
++  src/dwarf/Lstep_dwarf.c \
++  src/dwarf/Lfind_proc_info-lsb.c \
++  src/dwarf/Lfind_unwind_table.c \
++  src/dwarf/Gexpr.c \
++  src/dwarf/Gfde.c \
++  src/dwarf/Gfind_proc_info-lsb.c \
++  src/dwarf/Gfind_unwind_table.c \
++  src/dwarf/Gparser.c \
++  src/dwarf/Gpe.c \
++  src/dwarf/Gstep_dwarf.c \
++  src/dwarf/global.c \
++  src/os-common.c \
++  src/os-linux.c \
++  src/Los-common.c \
++  src/ptrace/_UPT_accessors.c \
++  src/ptrace/_UPT_access_fpreg.c \
++  src/ptrace/_UPT_access_mem.c \
++  src/ptrace/_UPT_access_reg.c \
++  src/ptrace/_UPT_create.c \
++  src/ptrace/_UPT_destroy.c \
++  src/ptrace/_UPT_find_proc_info.c \
++  src/ptrace/_UPT_get_dyn_info_list_addr.c \
++  src/ptrace/_UPT_put_unwind_info.c \
++  src/ptrace/_UPT_get_proc_name.c \
++  src/ptrace/_UPT_reg_offset.c \
++  src/ptrace/_UPT_resume.c \
++
++SOURCES += $($(CPU)_SOURCES)
++SOURCES := $(foreach source, $(SOURCES), external/libunwind/$(source))
++
++SOURCES_C = $(filter %.c,$(SOURCES))
++OBJECTS_C = $(SOURCES_C:.c=.o)
++SOURCES_ASSEMBLY = $(filter %.S,$(SOURCES))
++OBJECTS_ASSEMBLY = $(SOURCES_ASSEMBLY:.S=.o)
++
++CFLAGS += \
++  -fcommon \
++  -Werror \
++  -Wno-absolute-value \
++  -Wno-header-guard \
++  -Wno-inline-asm \
++  -Wno-unused-parameter \
++
++CPPFLAGS += \
++  -D_GNU_SOURCE \
++  -DHAVE_CONFIG_H \
++  -DNDEBUG \
++  -Idebian/include/external/libunwind \
++  -Iexternal/libunwind/include \
++  -Iexternal/libunwind/src \
++  $($(CPU)_INCLUDES) \
++
++# Use gcc instead of clang for assembly on armel
++# Header external/libunwind/include/libunwind_i.h includes some assembly
++ifeq ($(DEB_HOST_ARCH), armel)
++  CC=gcc
++endif
++
++debian/out/external/libunwind/$(NAME).a: $(OBJECTS_C) $(OBJECTS_ASSEMBLY)
++      mkdir -p debian/out/external/libunwind
++      ar -rcs $@ $^
++
++$(OBJECTS_C): %.o: %.c
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS)
++
++$(OBJECTS_ASSEMBLY): %.o: %.S
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..48ae68fecd27644f7ebe5a57efd154bf5e9b26a4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/bash-completion/system/core/fastboot
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9a71f6988ab5fa4103a13ab591f8f3828618f910
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++system/core/fastboot/README.md
++system/core/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0d2b518c21d81cd607905c026921db42fd0bb868
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/system/core/fastboot   usr/lib/android-sdk/platform-tools/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..26b40c4b2772285ba6134326395d1c132f4c0a04
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/android-sdk/platform-tools/fastboot   usr/bin/fastboot
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f810abbde4471634558a31de85cf69f1ddadea5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++# Executables from the Android SDK normally each staticly link in all
++# of the libs.  That means each executable includes a full copy of all
++# the libs, which is not how Debian works.  These libs need to be
++# dynamically linlked in so that just the library can be updated when
++# there is a security fix, instead of requiring all of the executables
++# be recompiled.  That said, these libraries do not have a stable
++# interface and were never intended to be used by any other project,
++# only with the internal, Android SDK executables.  Therefore, the
++# Android SDK executables use private libraries located in
++# /usr/lib/${DEB_HOST_MULTIARCH}/android
++
++custom-library-search-path
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..bf287bad9d177d86371ac4bd1d368edb11cd03c2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/manpages/system/core/fastboot.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..71767011f753b45d4c82f8e628a9799e56174efb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,14 @@@
++NAME = libETC1
++
++SOURCES = frameworks/native/opengl/libs/ETC1/etc1.cpp
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += -Iframeworks/native/opengl/include
++
++debian/out/frameworks/native/$(NAME).a: $(OBJECTS)
++      mkdir -p debian/out/frameworks/native
++      ar -rcs $@ $^
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..885361775923043c8952c1089232b3d5faba3b1a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++dalvik/NOTICE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0932af2991f629d72c485947069b29ece28171c1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/out/dalvik/tools/hprof-conv   usr/lib/android-sdk/platform-tools/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..148f0b546a00e0368c812162ecea8e191a6b226c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++The code is pulled from
++[here](https://android.googlesource.com/platform/external/dlmalloc).
++It seems to be used only at 2 places in AOSP and never receive any update, so
++I decided not to go through the trouble of the NEW queue.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a61c0da9cda725e1b990a74b4e28750985fa7acb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6323 @@@
++/*
++  This is a version (aka dlmalloc) of malloc/free/realloc written by
++  Doug Lea and released to the public domain, as explained at
++  http://creativecommons.org/publicdomain/zero/1.0/ Send questions,
++  comments, complaints, performance data, etc to dl@cs.oswego.edu
++
++* Version 2.8.6 Wed Aug 29 06:57:58 2012  Doug Lea
++   Note: There may be an updated version of this malloc obtainable at
++           ftp://gee.cs.oswego.edu/pub/misc/malloc.c
++         Check before installing!
++
++* Quickstart
++
++  This library is all in one file to simplify the most common usage:
++  ftp it, compile it (-O3), and link it into another program. All of
++  the compile-time options default to reasonable values for use on
++  most platforms.  You might later want to step through various
++  compile-time and dynamic tuning options.
++
++  For convenience, an include file for code using this malloc is at:
++     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.6.h
++  You don't really need this .h file unless you call functions not
++  defined in your system include files.  The .h file contains only the
++  excerpts from this file needed for using this malloc on ANSI C/C++
++  systems, so long as you haven't changed compile-time options about
++  naming and tuning parameters.  If you do, then you can create your
++  own malloc.h that does include all settings by cutting at the point
++  indicated below. Note that you may already by default be using a C
++  library containing a malloc that is based on some version of this
++  malloc (for example in linux). You might still want to use the one
++  in this file to customize settings or to avoid overheads associated
++  with library versions.
++
++* Vital statistics:
++
++  Supported pointer/size_t representation:       4 or 8 bytes
++       size_t MUST be an unsigned type of the same width as
++       pointers. (If you are using an ancient system that declares
++       size_t as a signed type, or need it to be a different width
++       than pointers, you can use a previous release of this malloc
++       (e.g. 2.7.2) supporting these.)
++
++  Alignment:                                     8 bytes (minimum)
++       This suffices for nearly all current machines and C compilers.
++       However, you can define MALLOC_ALIGNMENT to be wider than this
++       if necessary (up to 128bytes), at the expense of using more space.
++
++  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)
++                                          8 or 16 bytes (if 8byte sizes)
++       Each malloced chunk has a hidden word of overhead holding size
++       and status information, and additional cross-check word
++       if FOOTERS is defined.
++
++  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)
++                          8-byte ptrs:  32 bytes    (including overhead)
++
++       Even a request for zero bytes (i.e., malloc(0)) returns a
++       pointer to something of the minimum allocatable size.
++       The maximum overhead wastage (i.e., number of extra bytes
++       allocated than were requested in malloc) is less than or equal
++       to the minimum size, except for requests >= mmap_threshold that
++       are serviced via mmap(), where the worst case wastage is about
++       32 bytes plus the remainder from a system page (the minimal
++       mmap unit); typically 4096 or 8192 bytes.
++
++  Security: static-safe; optionally more or less
++       The "security" of malloc refers to the ability of malicious
++       code to accentuate the effects of errors (for example, freeing
++       space that is not currently malloc'ed or overwriting past the
++       ends of chunks) in code that calls malloc.  This malloc
++       guarantees not to modify any memory locations below the base of
++       heap, i.e., static variables, even in the presence of usage
++       errors.  The routines additionally detect most improper frees
++       and reallocs.  All this holds as long as the static bookkeeping
++       for malloc itself is not corrupted by some other means.  This
++       is only one aspect of security -- these checks do not, and
++       cannot, detect all possible programming errors.
++
++       If FOOTERS is defined nonzero, then each allocated chunk
++       carries an additional check word to verify that it was malloced
++       from its space.  These check words are the same within each
++       execution of a program using malloc, but differ across
++       executions, so externally crafted fake chunks cannot be
++       freed. This improves security by rejecting frees/reallocs that
++       could corrupt heap memory, in addition to the checks preventing
++       writes to statics that are always on.  This may further improve
++       security at the expense of time and space overhead.  (Note that
++       FOOTERS may also be worth using with MSPACES.)
++
++       By default detected errors cause the program to abort (calling
++       "abort()"). You can override this to instead proceed past
++       errors by defining PROCEED_ON_ERROR.  In this case, a bad free
++       has no effect, and a malloc that encounters a bad address
++       caused by user overwrites will ignore the bad address by
++       dropping pointers and indices to all known memory. This may
++       be appropriate for programs that should continue if at all
++       possible in the face of programming errors, although they may
++       run out of memory because dropped memory is never reclaimed.
++
++       If you don't like either of these options, you can define
++       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
++       else. And if if you are sure that your program using malloc has
++       no errors or vulnerabilities, you can define INSECURE to 1,
++       which might (or might not) provide a small performance improvement.
++
++       It is also possible to limit the maximum total allocatable
++       space, using malloc_set_footprint_limit. This is not
++       designed as a security feature in itself (calls to set limits
++       are not screened or privileged), but may be useful as one
++       aspect of a secure implementation.
++
++  Thread-safety: NOT thread-safe unless USE_LOCKS defined non-zero
++       When USE_LOCKS is defined, each public call to malloc, free,
++       etc is surrounded with a lock. By default, this uses a plain
++       pthread mutex, win32 critical section, or a spin-lock if if
++       available for the platform and not disabled by setting
++       USE_SPIN_LOCKS=0.  However, if USE_RECURSIVE_LOCKS is defined,
++       recursive versions are used instead (which are not required for
++       base functionality but may be needed in layered extensions).
++       Using a global lock is not especially fast, and can be a major
++       bottleneck.  It is designed only to provide minimal protection
++       in concurrent environments, and to provide a basis for
++       extensions.  If you are using malloc in a concurrent program,
++       consider instead using nedmalloc
++       (http://www.nedprod.com/programs/portable/nedmalloc/) or
++       ptmalloc (See http://www.malloc.de), which are derived from
++       versions of this malloc.
++
++  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
++       This malloc can use unix sbrk or any emulation (invoked using
++       the CALL_MORECORE macro) and/or mmap/munmap or any emulation
++       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
++       memory.  On most unix systems, it tends to work best if both
++       MORECORE and MMAP are enabled.  On Win32, it uses emulations
++       based on VirtualAlloc. It also uses common C library functions
++       like memset.
++
++  Compliance: I believe it is compliant with the Single Unix Specification
++       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
++       others as well.
++
++* Overview of algorithms
++
++  This is not the fastest, most space-conserving, most portable, or
++  most tunable malloc ever written. However it is among the fastest
++  while also being among the most space-conserving, portable and
++  tunable.  Consistent balance across these factors results in a good
++  general-purpose allocator for malloc-intensive programs.
++
++  In most ways, this malloc is a best-fit allocator. Generally, it
++  chooses the best-fitting existing chunk for a request, with ties
++  broken in approximately least-recently-used order. (This strategy
++  normally maintains low fragmentation.) However, for requests less
++  than 256bytes, it deviates from best-fit when there is not an
++  exactly fitting available chunk by preferring to use space adjacent
++  to that used for the previous small request, as well as by breaking
++  ties in approximately most-recently-used order. (These enhance
++  locality of series of small allocations.)  And for very large requests
++  (>= 256Kb by default), it relies on system memory mapping
++  facilities, if supported.  (This helps avoid carrying around and
++  possibly fragmenting memory used only for large chunks.)
++
++  All operations (except malloc_stats and mallinfo) have execution
++  times that are bounded by a constant factor of the number of bits in
++  a size_t, not counting any clearing in calloc or copying in realloc,
++  or actions surrounding MORECORE and MMAP that have times
++  proportional to the number of non-contiguous regions returned by
++  system allocation routines, which is often just 1. In real-time
++  applications, you can optionally suppress segment traversals using
++  NO_SEGMENT_TRAVERSAL, which assures bounded execution even when
++  system allocators return non-contiguous spaces, at the typical
++  expense of carrying around more memory and increased fragmentation.
++
++  The implementation is not very modular and seriously overuses
++  macros. Perhaps someday all C compilers will do as good a job
++  inlining modular code as can now be done by brute-force expansion,
++  but now, enough of them seem not to.
++
++  Some compilers issue a lot of warnings about code that is
++  dead/unreachable only on some platforms, and also about intentional
++  uses of negation on unsigned types. All known cases of each can be
++  ignored.
++
++  For a longer but out of date high-level description, see
++     http://gee.cs.oswego.edu/dl/html/malloc.html
++
++* MSPACES
++  If MSPACES is defined, then in addition to malloc, free, etc.,
++  this file also defines mspace_malloc, mspace_free, etc. These
++  are versions of malloc routines that take an "mspace" argument
++  obtained using create_mspace, to control all internal bookkeeping.
++  If ONLY_MSPACES is defined, only these versions are compiled.
++  So if you would like to use this allocator for only some allocations,
++  and your system malloc for others, you can compile with
++  ONLY_MSPACES and then do something like...
++    static mspace mymspace = create_mspace(0,0); // for example
++    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)
++
++  (Note: If you only need one instance of an mspace, you can instead
++  use "USE_DL_PREFIX" to relabel the global malloc.)
++
++  You can similarly create thread-local allocators by storing
++  mspaces as thread-locals. For example:
++    static __thread mspace tlms = 0;
++    void*  tlmalloc(size_t bytes) {
++      if (tlms == 0) tlms = create_mspace(0, 0);
++      return mspace_malloc(tlms, bytes);
++    }
++    void  tlfree(void* mem) { mspace_free(tlms, mem); }
++
++  Unless FOOTERS is defined, each mspace is completely independent.
++  You cannot allocate from one and free to another (although
++  conformance is only weakly checked, so usage errors are not always
++  caught). If FOOTERS is defined, then each chunk carries around a tag
++  indicating its originating mspace, and frees are directed to their
++  originating spaces. Normally, this requires use of locks.
++
++ -------------------------  Compile-time options ---------------------------
++
++Be careful in setting #define values for numerical constants of type
++size_t. On some systems, literal values are not automatically extended
++to size_t precision unless they are explicitly casted. You can also
++use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below.
++
++WIN32                    default: defined if _WIN32 defined
++  Defining WIN32 sets up defaults for MS environment and compilers.
++  Otherwise defaults are for unix. Beware that there seem to be some
++  cases where this malloc might not be a pure drop-in replacement for
++  Win32 malloc: Random-looking failures from Win32 GDI API's (eg;
++  SetDIBits()) may be due to bugs in some video driver implementations
++  when pixel buffers are malloc()ed, and the region spans more than
++  one VirtualAlloc()ed region. Because dlmalloc uses a small (64Kb)
++  default granularity, pixel buffers may straddle virtual allocation
++  regions more often than when using the Microsoft allocator.  You can
++  avoid this by using VirtualAlloc() and VirtualFree() for all pixel
++  buffers rather than using malloc().  If this is not possible,
++  recompile this malloc with a larger DEFAULT_GRANULARITY. Note:
++  in cases where MSC and gcc (cygwin) are known to differ on WIN32,
++  conditions use _MSC_VER to distinguish them.
++
++DLMALLOC_EXPORT       default: extern
++  Defines how public APIs are declared. If you want to export via a
++  Windows DLL, you might define this as
++    #define DLMALLOC_EXPORT extern  __declspec(dllexport)
++  If you want a POSIX ELF shared object, you might use
++    #define DLMALLOC_EXPORT extern __attribute__((visibility("default")))
++
++MALLOC_ALIGNMENT         default: (size_t)(2 * sizeof(void *))
++  Controls the minimum alignment for malloc'ed chunks.  It must be a
++  power of two and at least 8, even on machines for which smaller
++  alignments would suffice. It may be defined as larger than this
++  though. Note however that code and data structures are optimized for
++  the case of 8-byte alignment.
++
++MSPACES                  default: 0 (false)
++  If true, compile in support for independent allocation spaces.
++  This is only supported if HAVE_MMAP is true.
++
++ONLY_MSPACES             default: 0 (false)
++  If true, only compile in mspace versions, not regular versions.
++
++USE_LOCKS                default: 0 (false)
++  Causes each call to each public routine to be surrounded with
++  pthread or WIN32 mutex lock/unlock. (If set true, this can be
++  overridden on a per-mspace basis for mspace versions.) If set to a
++  non-zero value other than 1, locks are used, but their
++  implementation is left out, so lock functions must be supplied manually,
++  as described below.
++
++USE_SPIN_LOCKS           default: 1 iff USE_LOCKS and spin locks available
++  If true, uses custom spin locks for locking. This is currently
++  supported only gcc >= 4.1, older gccs on x86 platforms, and recent
++  MS compilers.  Otherwise, posix locks or win32 critical sections are
++  used.
++
++USE_RECURSIVE_LOCKS      default: not defined
++  If defined nonzero, uses recursive (aka reentrant) locks, otherwise
++  uses plain mutexes. This is not required for malloc proper, but may
++  be needed for layered allocators such as nedmalloc.
++
++LOCK_AT_FORK            default: not defined
++  If defined nonzero, performs pthread_atfork upon initialization
++  to initialize child lock while holding parent lock. The implementation
++  assumes that pthread locks (not custom locks) are being used. In other
++  cases, you may need to customize the implementation.
++
++FOOTERS                  default: 0
++  If true, provide extra checking and dispatching by placing
++  information in the footers of allocated chunks. This adds
++  space and time overhead.
++
++INSECURE                 default: 0
++  If true, omit checks for usage errors and heap space overwrites.
++
++USE_DL_PREFIX            default: NOT defined
++  Causes compiler to prefix all public routines with the string 'dl'.
++  This can be useful when you only want to use this malloc in one part
++  of a program, using your regular system malloc elsewhere.
++
++MALLOC_INSPECT_ALL       default: NOT defined
++  If defined, compiles malloc_inspect_all and mspace_inspect_all, that
++  perform traversal of all heap space.  Unless access to these
++  functions is otherwise restricted, you probably do not want to
++  include them in secure implementations.
++
++ABORT                    default: defined as abort()
++  Defines how to abort on failed checks.  On most systems, a failed
++  check cannot die with an "assert" or even print an informative
++  message, because the underlying print routines in turn call malloc,
++  which will fail again.  Generally, the best policy is to simply call
++  abort(). It's not very useful to do more than this because many
++  errors due to overwriting will show up as address faults (null, odd
++  addresses etc) rather than malloc-triggered checks, so will also
++  abort.  Also, most compilers know that abort() does not return, so
++  can better optimize code conditionally calling it.
++
++PROCEED_ON_ERROR           default: defined as 0 (false)
++  Controls whether detected bad addresses cause them to bypassed
++  rather than aborting. If set, detected bad arguments to free and
++  realloc are ignored. And all bookkeeping information is zeroed out
++  upon a detected overwrite of freed heap space, thus losing the
++  ability to ever return it from malloc again, but enabling the
++  application to proceed. If PROCEED_ON_ERROR is defined, the
++  static variable malloc_corruption_error_count is compiled in
++  and can be examined to see if errors have occurred. This option
++  generates slower code than the default abort policy.
++
++DEBUG                    default: NOT defined
++  The DEBUG setting is mainly intended for people trying to modify
++  this code or diagnose problems when porting to new platforms.
++  However, it may also be able to better isolate user errors than just
++  using runtime checks.  The assertions in the check routines spell
++  out in more detail the assumptions and invariants underlying the
++  algorithms.  The checking is fairly extensive, and will slow down
++  execution noticeably. Calling malloc_stats or mallinfo with DEBUG
++  set will attempt to check every non-mmapped allocated and free chunk
++  in the course of computing the summaries.
++
++ABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)
++  Debugging assertion failures can be nearly impossible if your
++  version of the assert macro causes malloc to be called, which will
++  lead to a cascade of further failures, blowing the runtime stack.
++  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
++  which will usually make debugging easier.
++
++MALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32
++  The action to take before "return 0" when malloc fails to be able to
++  return memory because there is none available.
++
++HAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES
++  True if this system supports sbrk or an emulation of it.
++
++MORECORE                  default: sbrk
++  The name of the sbrk-style system routine to call to obtain more
++  memory.  See below for guidance on writing custom MORECORE
++  functions. The type of the argument to sbrk/MORECORE varies across
++  systems.  It cannot be size_t, because it supports negative
++  arguments, so it is normally the signed type of the same width as
++  size_t (sometimes declared as "intptr_t").  It doesn't much matter
++  though. Internally, we only call it with arguments less than half
++  the max value of a size_t, which should work across all reasonable
++  possibilities, although sometimes generating compiler warnings.
++
++MORECORE_CONTIGUOUS       default: 1 (true) if HAVE_MORECORE
++  If true, take advantage of fact that consecutive calls to MORECORE
++  with positive arguments always return contiguous increasing
++  addresses.  This is true of unix sbrk. It does not hurt too much to
++  set it true anyway, since malloc copes with non-contiguities.
++  Setting it false when definitely non-contiguous saves time
++  and possibly wasted space it would take to discover this though.
++
++MORECORE_CANNOT_TRIM      default: NOT defined
++  True if MORECORE cannot release space back to the system when given
++  negative arguments. This is generally necessary only if you are
++  using a hand-crafted MORECORE function that cannot handle negative
++  arguments.
++
++NO_SEGMENT_TRAVERSAL       default: 0
++  If non-zero, suppresses traversals of memory segments
++  returned by either MORECORE or CALL_MMAP. This disables
++  merging of segments that are contiguous, and selectively
++  releasing them to the OS if unused, but bounds execution times.
++
++HAVE_MMAP                 default: 1 (true)
++  True if this system supports mmap or an emulation of it.  If so, and
++  HAVE_MORECORE is not true, MMAP is used for all system
++  allocation. If set and HAVE_MORECORE is true as well, MMAP is
++  primarily used to directly allocate very large blocks. It is also
++  used as a backup strategy in cases where MORECORE fails to provide
++  space from system. Note: A single call to MUNMAP is assumed to be
++  able to unmap memory that may have be allocated using multiple calls
++  to MMAP, so long as they are adjacent.
++
++HAVE_MREMAP               default: 1 on linux, else 0
++  If true realloc() uses mremap() to re-allocate large blocks and
++  extend or shrink allocation spaces.
++
++MMAP_CLEARS               default: 1 except on WINCE.
++  True if mmap clears memory so calloc doesn't need to. This is true
++  for standard unix mmap using /dev/zero and on WIN32 except for WINCE.
++
++USE_BUILTIN_FFS            default: 0 (i.e., not used)
++  Causes malloc to use the builtin ffs() function to compute indices.
++  Some compilers may recognize and intrinsify ffs to be faster than the
++  supplied C version. Also, the case of x86 using gcc is special-cased
++  to an asm instruction, so is already as fast as it can be, and so
++  this setting has no effect. Similarly for Win32 under recent MS compilers.
++  (On most x86s, the asm version is only slightly faster than the C version.)
++
++malloc_getpagesize         default: derive from system includes, or 4096.
++  The system page size. To the extent possible, this malloc manages
++  memory from the system in page-size units.  This may be (and
++  usually is) a function rather than a constant. This is ignored
++  if WIN32, where page size is determined using getSystemInfo during
++  initialization.
++
++USE_DEV_RANDOM             default: 0 (i.e., not used)
++  Causes malloc to use /dev/random to initialize secure magic seed for
++  stamping footers. Otherwise, the current time is used.
++
++NO_MALLINFO                default: 0
++  If defined, don't compile "mallinfo". This can be a simple way
++  of dealing with mismatches between system declarations and
++  those in this file.
++
++MALLINFO_FIELD_TYPE        default: size_t
++  The type of the fields in the mallinfo struct. This was originally
++  defined as "int" in SVID etc, but is more usefully defined as
++  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set
++
++NO_MALLOC_STATS            default: 0
++  If defined, don't compile "malloc_stats". This avoids calls to
++  fprintf and bringing in stdio dependencies you might not want.
++
++REALLOC_ZERO_BYTES_FREES    default: not defined
++  This should be set if a call to realloc with zero bytes should
++  be the same as a call to free. Some people think it should. Otherwise,
++  since this malloc returns a unique pointer for malloc(0), so does
++  realloc(p, 0).
++
++LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
++LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H
++LACKS_STDLIB_H LACKS_SCHED_H LACKS_TIME_H  default: NOT defined unless on WIN32
++  Define these if your system does not have these header files.
++  You might need to manually insert some of the declarations they provide.
++
++DEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,
++                                system_info.dwAllocationGranularity in WIN32,
++                                otherwise 64K.
++      Also settable using mallopt(M_GRANULARITY, x)
++  The unit for allocating and deallocating memory from the system.  On
++  most systems with contiguous MORECORE, there is no reason to
++  make this more than a page. However, systems with MMAP tend to
++  either require or encourage larger granularities.  You can increase
++  this value to prevent system allocation functions to be called so
++  often, especially if they are slow.  The value must be at least one
++  page and must be a power of two.  Setting to 0 causes initialization
++  to either page size or win32 region size.  (Note: In previous
++  versions of malloc, the equivalent of this option was called
++  "TOP_PAD")
++
++DEFAULT_TRIM_THRESHOLD    default: 2MB
++      Also settable using mallopt(M_TRIM_THRESHOLD, x)
++  The maximum amount of unused top-most memory to keep before
++  releasing via malloc_trim in free().  Automatic trimming is mainly
++  useful in long-lived programs using contiguous MORECORE.  Because
++  trimming via sbrk can be slow on some systems, and can sometimes be
++  wasteful (in cases where programs immediately afterward allocate
++  more large chunks) the value should be high enough so that your
++  overall system performance would improve by releasing this much
++  memory.  As a rough guide, you might set to a value close to the
++  average size of a process (program) running on your system.
++  Releasing this much memory would allow such a process to run in
++  memory.  Generally, it is worth tuning trim thresholds when a
++  program undergoes phases where several large chunks are allocated
++  and released in ways that can reuse each other's storage, perhaps
++  mixed with phases where there are no such chunks at all. The trim
++  value must be greater than page size to have any useful effect.  To
++  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
++  some people use of mallocing a huge space and then freeing it at
++  program startup, in an attempt to reserve system memory, doesn't
++  have the intended effect under automatic trimming, since that memory
++  will immediately be returned to the system.
++
++DEFAULT_MMAP_THRESHOLD       default: 256K
++      Also settable using mallopt(M_MMAP_THRESHOLD, x)
++  The request size threshold for using MMAP to directly service a
++  request. Requests of at least this size that cannot be allocated
++  using already-existing space will be serviced via mmap.  (If enough
++  normal freed space already exists it is used instead.)  Using mmap
++  segregates relatively large chunks of memory so that they can be
++  individually obtained and released from the host system. A request
++  serviced through mmap is never reused by any other request (at least
++  not directly; the system may just so happen to remap successive
++  requests to the same locations).  Segregating space in this way has
++  the benefits that: Mmapped space can always be individually released
++  back to the system, which helps keep the system level memory demands
++  of a long-lived program low.  Also, mapped memory doesn't become
++  `locked' between other chunks, as can happen with normally allocated
++  chunks, which means that even trimming via malloc_trim would not
++  release them.  However, it has the disadvantage that the space
++  cannot be reclaimed, consolidated, and then used to service later
++  requests, as happens with normal chunks.  The advantages of mmap
++  nearly always outweigh disadvantages for "large" chunks, but the
++  value of "large" may vary across systems.  The default is an
++  empirically derived value that works well in most systems. You can
++  disable mmap by setting to MAX_SIZE_T.
++
++MAX_RELEASE_CHECK_RATE   default: 4095 unless not HAVE_MMAP
++  The number of consolidated frees between checks to release
++  unused segments when freeing. When using non-contiguous segments,
++  especially with multiple mspaces, checking only for topmost space
++  doesn't always suffice to trigger trimming. To compensate for this,
++  free() will, with a period of MAX_RELEASE_CHECK_RATE (or the
++  current number of segments, if greater) try to release unused
++  segments to the OS when freeing chunks that result in
++  consolidation. The best value for this parameter is a compromise
++  between slowing down frees with relatively costly checks that
++  rarely trigger versus holding on to unused memory. To effectively
++  disable, set to MAX_SIZE_T. This may lead to a very slight speed
++  improvement at the expense of carrying around more memory.
++*/
++
++/* Version identifier to allow people to support multiple versions */
++#ifndef DLMALLOC_VERSION
++#define DLMALLOC_VERSION 20806
++#endif /* DLMALLOC_VERSION */
++
++#ifndef DLMALLOC_EXPORT
++#define DLMALLOC_EXPORT extern
++#endif
++
++#ifndef WIN32
++#ifdef _WIN32
++#define WIN32 1
++#endif  /* _WIN32 */
++#ifdef _WIN32_WCE
++#define LACKS_FCNTL_H
++#define WIN32 1
++#endif /* _WIN32_WCE */
++#endif  /* WIN32 */
++#ifdef WIN32
++#define WIN32_LEAN_AND_MEAN
++#include <windows.h>
++#include <tchar.h>
++#define HAVE_MMAP 1
++#define HAVE_MORECORE 0
++#define LACKS_UNISTD_H
++#define LACKS_SYS_PARAM_H
++#define LACKS_SYS_MMAN_H
++#define LACKS_STRING_H
++#define LACKS_STRINGS_H
++#define LACKS_SYS_TYPES_H
++#define LACKS_ERRNO_H
++#define LACKS_SCHED_H
++#ifndef MALLOC_FAILURE_ACTION
++#define MALLOC_FAILURE_ACTION
++#endif /* MALLOC_FAILURE_ACTION */
++#ifndef MMAP_CLEARS
++#ifdef _WIN32_WCE /* WINCE reportedly does not clear */
++#define MMAP_CLEARS 0
++#else
++#define MMAP_CLEARS 1
++#endif /* _WIN32_WCE */
++#endif /*MMAP_CLEARS */
++#endif  /* WIN32 */
++
++#if defined(DARWIN) || defined(_DARWIN)
++/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
++#ifndef HAVE_MORECORE
++#define HAVE_MORECORE 0
++#define HAVE_MMAP 1
++/* OSX allocators provide 16 byte alignment */
++#ifndef MALLOC_ALIGNMENT
++#define MALLOC_ALIGNMENT ((size_t)16U)
++#endif
++#endif  /* HAVE_MORECORE */
++#endif  /* DARWIN */
++
++#ifndef LACKS_SYS_TYPES_H
++#include <sys/types.h>  /* For size_t */
++#endif  /* LACKS_SYS_TYPES_H */
++
++/* The maximum possible size_t value has all bits set */
++#define MAX_SIZE_T           (~(size_t)0)
++
++#ifndef USE_LOCKS /* ensure true if spin or recursive locks set */
++#define USE_LOCKS  ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \
++                    (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0))
++#endif /* USE_LOCKS */
++
++#if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */
++#if ((defined(__GNUC__) &&                                              \
++      ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) ||      \
++       defined(__i386__) || defined(__x86_64__))) ||                    \
++     (defined(_MSC_VER) && _MSC_VER>=1310))
++#ifndef USE_SPIN_LOCKS
++#define USE_SPIN_LOCKS 1
++#endif /* USE_SPIN_LOCKS */
++#elif USE_SPIN_LOCKS
++#error "USE_SPIN_LOCKS defined without implementation"
++#endif /* ... locks available... */
++#elif !defined(USE_SPIN_LOCKS)
++#define USE_SPIN_LOCKS 0
++#endif /* USE_LOCKS */
++
++#ifndef ONLY_MSPACES
++#define ONLY_MSPACES 0
++#endif  /* ONLY_MSPACES */
++#ifndef MSPACES
++#if ONLY_MSPACES
++#define MSPACES 1
++#else   /* ONLY_MSPACES */
++#define MSPACES 0
++#endif  /* ONLY_MSPACES */
++#endif  /* MSPACES */
++#ifndef MALLOC_ALIGNMENT
++#define MALLOC_ALIGNMENT ((size_t)(2 * sizeof(void *)))
++#endif  /* MALLOC_ALIGNMENT */
++#ifndef FOOTERS
++#define FOOTERS 0
++#endif  /* FOOTERS */
++#ifndef ABORT
++#define ABORT  abort()
++#endif  /* ABORT */
++#ifndef ABORT_ON_ASSERT_FAILURE
++#define ABORT_ON_ASSERT_FAILURE 1
++#endif  /* ABORT_ON_ASSERT_FAILURE */
++#ifndef PROCEED_ON_ERROR
++#define PROCEED_ON_ERROR 0
++#endif  /* PROCEED_ON_ERROR */
++
++#ifndef INSECURE
++#define INSECURE 0
++#endif  /* INSECURE */
++#ifndef MALLOC_INSPECT_ALL
++#define MALLOC_INSPECT_ALL 0
++#endif  /* MALLOC_INSPECT_ALL */
++#ifndef HAVE_MMAP
++#define HAVE_MMAP 1
++#endif  /* HAVE_MMAP */
++#ifndef MMAP_CLEARS
++#define MMAP_CLEARS 1
++#endif  /* MMAP_CLEARS */
++#ifndef HAVE_MREMAP
++#ifdef linux
++#define HAVE_MREMAP 1
++#define _GNU_SOURCE /* Turns on mremap() definition */
++#else   /* linux */
++#define HAVE_MREMAP 0
++#endif  /* linux */
++#endif  /* HAVE_MREMAP */
++#ifndef MALLOC_FAILURE_ACTION
++#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
++#endif  /* MALLOC_FAILURE_ACTION */
++#ifndef HAVE_MORECORE
++#if ONLY_MSPACES
++#define HAVE_MORECORE 0
++#else   /* ONLY_MSPACES */
++#define HAVE_MORECORE 1
++#endif  /* ONLY_MSPACES */
++#endif  /* HAVE_MORECORE */
++#if !HAVE_MORECORE
++#define MORECORE_CONTIGUOUS 0
++#else   /* !HAVE_MORECORE */
++#define MORECORE_DEFAULT sbrk
++#ifndef MORECORE_CONTIGUOUS
++#define MORECORE_CONTIGUOUS 1
++#endif  /* MORECORE_CONTIGUOUS */
++#endif  /* HAVE_MORECORE */
++#ifndef DEFAULT_GRANULARITY
++#if (MORECORE_CONTIGUOUS || defined(WIN32))
++#define DEFAULT_GRANULARITY (0)  /* 0 means to compute in init_mparams */
++#else   /* MORECORE_CONTIGUOUS */
++#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
++#endif  /* MORECORE_CONTIGUOUS */
++#endif  /* DEFAULT_GRANULARITY */
++#ifndef DEFAULT_TRIM_THRESHOLD
++#ifndef MORECORE_CANNOT_TRIM
++#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
++#else   /* MORECORE_CANNOT_TRIM */
++#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
++#endif  /* MORECORE_CANNOT_TRIM */
++#endif  /* DEFAULT_TRIM_THRESHOLD */
++#ifndef DEFAULT_MMAP_THRESHOLD
++#if HAVE_MMAP
++#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
++#else   /* HAVE_MMAP */
++#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
++#endif  /* HAVE_MMAP */
++#endif  /* DEFAULT_MMAP_THRESHOLD */
++#ifndef MAX_RELEASE_CHECK_RATE
++#if HAVE_MMAP
++#define MAX_RELEASE_CHECK_RATE 4095
++#else
++#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T
++#endif /* HAVE_MMAP */
++#endif /* MAX_RELEASE_CHECK_RATE */
++#ifndef USE_BUILTIN_FFS
++#define USE_BUILTIN_FFS 0
++#endif  /* USE_BUILTIN_FFS */
++#ifndef USE_DEV_RANDOM
++#define USE_DEV_RANDOM 0
++#endif  /* USE_DEV_RANDOM */
++#ifndef NO_MALLINFO
++#define NO_MALLINFO 0
++#endif  /* NO_MALLINFO */
++#ifndef MALLINFO_FIELD_TYPE
++#define MALLINFO_FIELD_TYPE size_t
++#endif  /* MALLINFO_FIELD_TYPE */
++#ifndef NO_MALLOC_STATS
++#define NO_MALLOC_STATS 0
++#endif  /* NO_MALLOC_STATS */
++#ifndef NO_SEGMENT_TRAVERSAL
++#define NO_SEGMENT_TRAVERSAL 0
++#endif /* NO_SEGMENT_TRAVERSAL */
++
++/*
++  mallopt tuning options.  SVID/XPG defines four standard parameter
++  numbers for mallopt, normally defined in malloc.h.  None of these
++  are used in this malloc, so setting them has no effect. But this
++  malloc does support the following options.
++*/
++
++#define M_TRIM_THRESHOLD     (-1)
++#define M_GRANULARITY        (-2)
++#define M_MMAP_THRESHOLD     (-3)
++
++/* ------------------------ Mallinfo declarations ------------------------ */
++
++#if !NO_MALLINFO
++/*
++  This version of malloc supports the standard SVID/XPG mallinfo
++  routine that returns a struct containing usage properties and
++  statistics. It should work on any system that has a
++  /usr/include/malloc.h defining struct mallinfo.  The main
++  declaration needed is the mallinfo struct that is returned (by-copy)
++  by mallinfo().  The malloinfo struct contains a bunch of fields that
++  are not even meaningful in this version of malloc.  These fields are
++  are instead filled by mallinfo() with other numbers that might be of
++  interest.
++
++  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
++  /usr/include/malloc.h file that includes a declaration of struct
++  mallinfo.  If so, it is included; else a compliant version is
++  declared below.  These must be precisely the same for mallinfo() to
++  work.  The original SVID version of this struct, defined on most
++  systems with mallinfo, declares all fields as ints. But some others
++  define as unsigned long. If your system defines the fields using a
++  type of different width than listed here, you MUST #include your
++  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
++*/
++
++/* #define HAVE_USR_INCLUDE_MALLOC_H */
++
++#ifdef HAVE_USR_INCLUDE_MALLOC_H
++#include "/usr/include/malloc.h"
++#else /* HAVE_USR_INCLUDE_MALLOC_H */
++#ifndef STRUCT_MALLINFO_DECLARED
++/* HP-UX (and others?) redefines mallinfo unless _STRUCT_MALLINFO is defined */
++#define _STRUCT_MALLINFO
++#define STRUCT_MALLINFO_DECLARED 1
++struct mallinfo {
++  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
++  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
++  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
++  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
++  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
++  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
++  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
++  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
++  MALLINFO_FIELD_TYPE fordblks; /* total free space */
++  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
++};
++#endif /* STRUCT_MALLINFO_DECLARED */
++#endif /* HAVE_USR_INCLUDE_MALLOC_H */
++#endif /* NO_MALLINFO */
++
++/*
++  Try to persuade compilers to inline. The most critical functions for
++  inlining are defined as macros, so these aren't used for them.
++*/
++
++#ifndef FORCEINLINE
++  #if defined(__GNUC__)
++#define FORCEINLINE __inline __attribute__ ((always_inline))
++  #elif defined(_MSC_VER)
++    #define FORCEINLINE __forceinline
++  #endif
++#endif
++#ifndef NOINLINE
++  #if defined(__GNUC__)
++    #define NOINLINE __attribute__ ((noinline))
++  #elif defined(_MSC_VER)
++    #define NOINLINE __declspec(noinline)
++  #else
++    #define NOINLINE
++  #endif
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#ifndef FORCEINLINE
++ #define FORCEINLINE inline
++#endif
++#endif /* __cplusplus */
++#ifndef FORCEINLINE
++ #define FORCEINLINE
++#endif
++
++#if !ONLY_MSPACES
++
++/* ------------------- Declarations of public routines ------------------- */
++
++#ifndef USE_DL_PREFIX
++#define dlcalloc               calloc
++#define dlfree                 free
++#define dlmalloc               malloc
++#define dlmemalign             memalign
++#define dlposix_memalign       posix_memalign
++#define dlrealloc              realloc
++#define dlrealloc_in_place     realloc_in_place
++#define dlvalloc               valloc
++#define dlpvalloc              pvalloc
++#define dlmallinfo             mallinfo
++#define dlmallopt              mallopt
++#define dlmalloc_trim          malloc_trim
++#define dlmalloc_stats         malloc_stats
++#define dlmalloc_usable_size   malloc_usable_size
++#define dlmalloc_footprint     malloc_footprint
++#define dlmalloc_max_footprint malloc_max_footprint
++#define dlmalloc_footprint_limit malloc_footprint_limit
++#define dlmalloc_set_footprint_limit malloc_set_footprint_limit
++#define dlmalloc_inspect_all   malloc_inspect_all
++#define dlindependent_calloc   independent_calloc
++#define dlindependent_comalloc independent_comalloc
++#define dlbulk_free            bulk_free
++#endif /* USE_DL_PREFIX */
++
++/*
++  malloc(size_t n)
++  Returns a pointer to a newly allocated chunk of at least n bytes, or
++  null if no space is available, in which case errno is set to ENOMEM
++  on ANSI C systems.
++
++  If n is zero, malloc returns a minimum-sized chunk. (The minimum
++  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
++  systems.)  Note that size_t is an unsigned type, so calls with
++  arguments that would be negative if signed are interpreted as
++  requests for huge amounts of space, which will often fail. The
++  maximum supported value of n differs across systems, but is in all
++  cases less than the maximum representable value of a size_t.
++*/
++DLMALLOC_EXPORT void* dlmalloc(size_t);
++
++/*
++  free(void* p)
++  Releases the chunk of memory pointed to by p, that had been previously
++  allocated using malloc or a related routine such as realloc.
++  It has no effect if p is null. If p was not malloced or already
++  freed, free(p) will by default cause the current program to abort.
++*/
++DLMALLOC_EXPORT void  dlfree(void*);
++
++/*
++  calloc(size_t n_elements, size_t element_size);
++  Returns a pointer to n_elements * element_size bytes, with all locations
++  set to zero.
++*/
++DLMALLOC_EXPORT void* dlcalloc(size_t, size_t);
++
++/*
++  realloc(void* p, size_t n)
++  Returns a pointer to a chunk of size n that contains the same data
++  as does chunk p up to the minimum of (n, p's size) bytes, or null
++  if no space is available.
++
++  The returned pointer may or may not be the same as p. The algorithm
++  prefers extending p in most cases when possible, otherwise it
++  employs the equivalent of a malloc-copy-free sequence.
++
++  If p is null, realloc is equivalent to malloc.
++
++  If space is not available, realloc returns null, errno is set (if on
++  ANSI) and p is NOT freed.
++
++  if n is for fewer bytes than already held by p, the newly unused
++  space is lopped off and freed if possible.  realloc with a size
++  argument of zero (re)allocates a minimum-sized chunk.
++
++  The old unix realloc convention of allowing the last-free'd chunk
++  to be used as an argument to realloc is not supported.
++*/
++DLMALLOC_EXPORT void* dlrealloc(void*, size_t);
++
++/*
++  realloc_in_place(void* p, size_t n)
++  Resizes the space allocated for p to size n, only if this can be
++  done without moving p (i.e., only if there is adjacent space
++  available if n is greater than p's current allocated size, or n is
++  less than or equal to p's size). This may be used instead of plain
++  realloc if an alternative allocation strategy is needed upon failure
++  to expand space; for example, reallocation of a buffer that must be
++  memory-aligned or cleared. You can use realloc_in_place to trigger
++  these alternatives only when needed.
++
++  Returns p if successful; otherwise null.
++*/
++DLMALLOC_EXPORT void* dlrealloc_in_place(void*, size_t);
++
++/*
++  memalign(size_t alignment, size_t n);
++  Returns a pointer to a newly allocated chunk of n bytes, aligned
++  in accord with the alignment argument.
++
++  The alignment argument should be a power of two. If the argument is
++  not a power of two, the nearest greater power is used.
++  8-byte alignment is guaranteed by normal malloc calls, so don't
++  bother calling memalign with an argument of 8 or less.
++
++  Overreliance on memalign is a sure way to fragment space.
++*/
++DLMALLOC_EXPORT void* dlmemalign(size_t, size_t);
++
++/*
++  int posix_memalign(void** pp, size_t alignment, size_t n);
++  Allocates a chunk of n bytes, aligned in accord with the alignment
++  argument. Differs from memalign only in that it (1) assigns the
++  allocated memory to *pp rather than returning it, (2) fails and
++  returns EINVAL if the alignment is not a power of two (3) fails and
++  returns ENOMEM if memory cannot be allocated.
++*/
++DLMALLOC_EXPORT int dlposix_memalign(void**, size_t, size_t);
++
++/*
++  valloc(size_t n);
++  Equivalent to memalign(pagesize, n), where pagesize is the page
++  size of the system. If the pagesize is unknown, 4096 is used.
++*/
++DLMALLOC_EXPORT void* dlvalloc(size_t);
++
++/*
++  mallopt(int parameter_number, int parameter_value)
++  Sets tunable parameters The format is to provide a
++  (parameter-number, parameter-value) pair.  mallopt then sets the
++  corresponding parameter to the argument value if it can (i.e., so
++  long as the value is meaningful), and returns 1 if successful else
++  0.  To workaround the fact that mallopt is specified to use int,
++  not size_t parameters, the value -1 is specially treated as the
++  maximum unsigned size_t value.
++
++  SVID/XPG/ANSI defines four standard param numbers for mallopt,
++  normally defined in malloc.h.  None of these are use in this malloc,
++  so setting them has no effect. But this malloc also supports other
++  options in mallopt. See below for details.  Briefly, supported
++  parameters are as follows (listed defaults are for "typical"
++  configurations).
++
++  Symbol            param #  default    allowed param values
++  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (-1 disables)
++  M_GRANULARITY        -2     page size   any power of 2 >= page size
++  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
++*/
++DLMALLOC_EXPORT int dlmallopt(int, int);
++
++/*
++  malloc_footprint();
++  Returns the number of bytes obtained from the system.  The total
++  number of bytes allocated by malloc, realloc etc., is less than this
++  value. Unlike mallinfo, this function returns only a precomputed
++  result, so can be called frequently to monitor memory consumption.
++  Even if locks are otherwise defined, this function does not use them,
++  so results might not be up to date.
++*/
++DLMALLOC_EXPORT size_t dlmalloc_footprint(void);
++
++/*
++  malloc_max_footprint();
++  Returns the maximum number of bytes obtained from the system. This
++  value will be greater than current footprint if deallocated space
++  has been reclaimed by the system. The peak number of bytes allocated
++  by malloc, realloc etc., is less than this value. Unlike mallinfo,
++  this function returns only a precomputed result, so can be called
++  frequently to monitor memory consumption.  Even if locks are
++  otherwise defined, this function does not use them, so results might
++  not be up to date.
++*/
++DLMALLOC_EXPORT size_t dlmalloc_max_footprint(void);
++
++/*
++  malloc_footprint_limit();
++  Returns the number of bytes that the heap is allowed to obtain from
++  the system, returning the last value returned by
++  malloc_set_footprint_limit, or the maximum size_t value if
++  never set. The returned value reflects a permission. There is no
++  guarantee that this number of bytes can actually be obtained from
++  the system.
++*/
++DLMALLOC_EXPORT size_t dlmalloc_footprint_limit();
++
++/*
++  malloc_set_footprint_limit();
++  Sets the maximum number of bytes to obtain from the system, causing
++  failure returns from malloc and related functions upon attempts to
++  exceed this value. The argument value may be subject to page
++  rounding to an enforceable limit; this actual value is returned.
++  Using an argument of the maximum possible size_t effectively
++  disables checks. If the argument is less than or equal to the
++  current malloc_footprint, then all future allocations that require
++  additional system memory will fail. However, invocation cannot
++  retroactively deallocate existing used memory.
++*/
++DLMALLOC_EXPORT size_t dlmalloc_set_footprint_limit(size_t bytes);
++
++#if MALLOC_INSPECT_ALL
++/*
++  malloc_inspect_all(void(*handler)(void *start,
++                                    void *end,
++                                    size_t used_bytes,
++                                    void* callback_arg),
++                      void* arg);
++  Traverses the heap and calls the given handler for each managed
++  region, skipping all bytes that are (or may be) used for bookkeeping
++  purposes.  Traversal does not include include chunks that have been
++  directly memory mapped. Each reported region begins at the start
++  address, and continues up to but not including the end address.  The
++  first used_bytes of the region contain allocated data. If
++  used_bytes is zero, the region is unallocated. The handler is
++  invoked with the given callback argument. If locks are defined, they
++  are held during the entire traversal. It is a bad idea to invoke
++  other malloc functions from within the handler.
++
++  For example, to count the number of in-use chunks with size greater
++  than 1000, you could write:
++  static int count = 0;
++  void count_chunks(void* start, void* end, size_t used, void* arg) {
++    if (used >= 1000) ++count;
++  }
++  then:
++    malloc_inspect_all(count_chunks, NULL);
++
++  malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined.
++*/
++DLMALLOC_EXPORT void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*),
++                           void* arg);
++
++#endif /* MALLOC_INSPECT_ALL */
++
++#if !NO_MALLINFO
++/*
++  mallinfo()
++  Returns (by copy) a struct containing various summary statistics:
++
++  arena:     current total non-mmapped bytes allocated from system
++  ordblks:   the number of free chunks
++  smblks:    always zero.
++  hblks:     current number of mmapped regions
++  hblkhd:    total bytes held in mmapped regions
++  usmblks:   the maximum total allocated space. This will be greater
++                than current total if trimming has occurred.
++  fsmblks:   always zero
++  uordblks:  current total allocated space (normal or mmapped)
++  fordblks:  total free space
++  keepcost:  the maximum number of bytes that could ideally be released
++               back to system via malloc_trim. ("ideally" means that
++               it ignores page restrictions etc.)
++
++  Because these fields are ints, but internal bookkeeping may
++  be kept as longs, the reported values may wrap around zero and
++  thus be inaccurate.
++*/
++DLMALLOC_EXPORT struct mallinfo dlmallinfo(void);
++#endif /* NO_MALLINFO */
++
++/*
++  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
++
++  independent_calloc is similar to calloc, but instead of returning a
++  single cleared space, it returns an array of pointers to n_elements
++  independent elements that can hold contents of size elem_size, each
++  of which starts out cleared, and can be independently freed,
++  realloc'ed etc. The elements are guaranteed to be adjacently
++  allocated (this is not guaranteed to occur with multiple callocs or
++  mallocs), which may also improve cache locality in some
++  applications.
++
++  The "chunks" argument is optional (i.e., may be null, which is
++  probably the most typical usage). If it is null, the returned array
++  is itself dynamically allocated and should also be freed when it is
++  no longer needed. Otherwise, the chunks array must be of at least
++  n_elements in length. It is filled in with the pointers to the
++  chunks.
++
++  In either case, independent_calloc returns this pointer array, or
++  null if the allocation failed.  If n_elements is zero and "chunks"
++  is null, it returns a chunk representing an array with zero elements
++  (which should be freed if not wanted).
++
++  Each element must be freed when it is no longer needed. This can be
++  done all at once using bulk_free.
++
++  independent_calloc simplifies and speeds up implementations of many
++  kinds of pools.  It may also be useful when constructing large data
++  structures that initially have a fixed number of fixed-sized nodes,
++  but the number is not known at compile time, and some of the nodes
++  may later need to be freed. For example:
++
++  struct Node { int item; struct Node* next; };
++
++  struct Node* build_list() {
++    struct Node** pool;
++    int n = read_number_of_nodes_needed();
++    if (n <= 0) return 0;
++    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
++    if (pool == 0) die();
++    // organize into a linked list...
++    struct Node* first = pool[0];
++    for (i = 0; i < n-1; ++i)
++      pool[i]->next = pool[i+1];
++    free(pool);     // Can now free the array (or not, if it is needed later)
++    return first;
++  }
++*/
++DLMALLOC_EXPORT void** dlindependent_calloc(size_t, size_t, void**);
++
++/*
++  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
++
++  independent_comalloc allocates, all at once, a set of n_elements
++  chunks with sizes indicated in the "sizes" array.    It returns
++  an array of pointers to these elements, each of which can be
++  independently freed, realloc'ed etc. The elements are guaranteed to
++  be adjacently allocated (this is not guaranteed to occur with
++  multiple callocs or mallocs), which may also improve cache locality
++  in some applications.
++
++  The "chunks" argument is optional (i.e., may be null). If it is null
++  the returned array is itself dynamically allocated and should also
++  be freed when it is no longer needed. Otherwise, the chunks array
++  must be of at least n_elements in length. It is filled in with the
++  pointers to the chunks.
++
++  In either case, independent_comalloc returns this pointer array, or
++  null if the allocation failed.  If n_elements is zero and chunks is
++  null, it returns a chunk representing an array with zero elements
++  (which should be freed if not wanted).
++
++  Each element must be freed when it is no longer needed. This can be
++  done all at once using bulk_free.
++
++  independent_comallac differs from independent_calloc in that each
++  element may have a different size, and also that it does not
++  automatically clear elements.
++
++  independent_comalloc can be used to speed up allocation in cases
++  where several structs or objects must always be allocated at the
++  same time.  For example:
++
++  struct Head { ... }
++  struct Foot { ... }
++
++  void send_message(char* msg) {
++    int msglen = strlen(msg);
++    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
++    void* chunks[3];
++    if (independent_comalloc(3, sizes, chunks) == 0)
++      die();
++    struct Head* head = (struct Head*)(chunks[0]);
++    char*        body = (char*)(chunks[1]);
++    struct Foot* foot = (struct Foot*)(chunks[2]);
++    // ...
++  }
++
++  In general though, independent_comalloc is worth using only for
++  larger values of n_elements. For small values, you probably won't
++  detect enough difference from series of malloc calls to bother.
++
++  Overuse of independent_comalloc can increase overall memory usage,
++  since it cannot reuse existing noncontiguous small chunks that
++  might be available for some of the elements.
++*/
++DLMALLOC_EXPORT void** dlindependent_comalloc(size_t, size_t*, void**);
++
++/*
++  bulk_free(void* array[], size_t n_elements)
++  Frees and clears (sets to null) each non-null pointer in the given
++  array.  This is likely to be faster than freeing them one-by-one.
++  If footers are used, pointers that have been allocated in different
++  mspaces are not freed or cleared, and the count of all such pointers
++  is returned.  For large arrays of pointers with poor locality, it
++  may be worthwhile to sort this array before calling bulk_free.
++*/
++DLMALLOC_EXPORT size_t  dlbulk_free(void**, size_t n_elements);
++
++/*
++  pvalloc(size_t n);
++  Equivalent to valloc(minimum-page-that-holds(n)), that is,
++  round up n to nearest pagesize.
++ */
++DLMALLOC_EXPORT void*  dlpvalloc(size_t);
++
++/*
++  malloc_trim(size_t pad);
++
++  If possible, gives memory back to the system (via negative arguments
++  to sbrk) if there is unused memory at the `high' end of the malloc
++  pool or in unused MMAP segments. You can call this after freeing
++  large blocks of memory to potentially reduce the system-level memory
++  requirements of a program. However, it cannot guarantee to reduce
++  memory. Under some allocation patterns, some large free blocks of
++  memory will be locked between two used chunks, so they cannot be
++  given back to the system.
++
++  The `pad' argument to malloc_trim represents the amount of free
++  trailing space to leave untrimmed. If this argument is zero, only
++  the minimum amount of memory to maintain internal data structures
++  will be left. Non-zero arguments can be supplied to maintain enough
++  trailing space to service future expected allocations without having
++  to re-obtain memory from the system.
++
++  Malloc_trim returns 1 if it actually released any memory, else 0.
++*/
++DLMALLOC_EXPORT int  dlmalloc_trim(size_t);
++
++/*
++  malloc_stats();
++  Prints on stderr the amount of space obtained from the system (both
++  via sbrk and mmap), the maximum amount (which may be more than
++  current if malloc_trim and/or munmap got called), and the current
++  number of bytes allocated via malloc (or realloc, etc) but not yet
++  freed. Note that this is the number of bytes allocated, not the
++  number requested. It will be larger than the number requested
++  because of alignment and bookkeeping overhead. Because it includes
++  alignment wastage as being in use, this figure may be greater than
++  zero even when no user-level chunks are allocated.
++
++  The reported current and maximum system memory can be inaccurate if
++  a program makes other calls to system memory allocation functions
++  (normally sbrk) outside of malloc.
++
++  malloc_stats prints only the most commonly interesting statistics.
++  More information can be obtained by calling mallinfo.
++*/
++DLMALLOC_EXPORT void  dlmalloc_stats(void);
++
++/*
++  malloc_usable_size(void* p);
++
++  Returns the number of bytes you can actually use in
++  an allocated chunk, which may be more than you requested (although
++  often not) due to alignment and minimum size constraints.
++  You can use this many bytes without worrying about
++  overwriting other allocated objects. This is not a particularly great
++  programming practice. malloc_usable_size can be more useful in
++  debugging and assertions, for example:
++
++  p = malloc(n);
++  assert(malloc_usable_size(p) >= 256);
++*/
++/* BEGIN android-changed: added const */
++size_t dlmalloc_usable_size(const void*);
++/* END android-change */
++
++#endif /* ONLY_MSPACES */
++
++#if MSPACES
++
++/*
++  mspace is an opaque type representing an independent
++  region of space that supports mspace_malloc, etc.
++*/
++typedef void* mspace;
++
++/*
++  create_mspace creates and returns a new independent space with the
++  given initial capacity, or, if 0, the default granularity size.  It
++  returns null if there is no system memory available to create the
++  space.  If argument locked is non-zero, the space uses a separate
++  lock to control access. The capacity of the space will grow
++  dynamically as needed to service mspace_malloc requests.  You can
++  control the sizes of incremental increases of this space by
++  compiling with a different DEFAULT_GRANULARITY or dynamically
++  setting with mallopt(M_GRANULARITY, value).
++*/
++DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked);
++
++/*
++  destroy_mspace destroys the given space, and attempts to return all
++  of its memory back to the system, returning the total number of
++  bytes freed. After destruction, the results of access to all memory
++  used by the space become undefined.
++*/
++DLMALLOC_EXPORT size_t destroy_mspace(mspace msp);
++
++/*
++  create_mspace_with_base uses the memory supplied as the initial base
++  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
++  space is used for bookkeeping, so the capacity must be at least this
++  large. (Otherwise 0 is returned.) When this initial space is
++  exhausted, additional memory will be obtained from the system.
++  Destroying this space will deallocate all additionally allocated
++  space (if possible) but not the initial base.
++*/
++DLMALLOC_EXPORT mspace create_mspace_with_base(void* base, size_t capacity, int locked);
++
++/*
++  mspace_track_large_chunks controls whether requests for large chunks
++  are allocated in their own untracked mmapped regions, separate from
++  others in this mspace. By default large chunks are not tracked,
++  which reduces fragmentation. However, such chunks are not
++  necessarily released to the system upon destroy_mspace.  Enabling
++  tracking by setting to true may increase fragmentation, but avoids
++  leakage when relying on destroy_mspace to release all memory
++  allocated using this space.  The function returns the previous
++  setting.
++*/
++DLMALLOC_EXPORT int mspace_track_large_chunks(mspace msp, int enable);
++
++
++/*
++  mspace_malloc behaves as malloc, but operates within
++  the given space.
++*/
++DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes);
++
++/*
++  mspace_free behaves as free, but operates within
++  the given space.
++
++  If compiled with FOOTERS==1, mspace_free is not actually needed.
++  free may be called instead of mspace_free because freed chunks from
++  any space are handled by their originating spaces.
++*/
++DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem);
++
++/*
++  mspace_realloc behaves as realloc, but operates within
++  the given space.
++
++  If compiled with FOOTERS==1, mspace_realloc is not actually
++  needed.  realloc may be called instead of mspace_realloc because
++  realloced chunks from any space are handled by their originating
++  spaces.
++*/
++DLMALLOC_EXPORT void* mspace_realloc(mspace msp, void* mem, size_t newsize);
++
++/*
++  mspace_calloc behaves as calloc, but operates within
++  the given space.
++*/
++DLMALLOC_EXPORT void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
++
++/*
++  mspace_memalign behaves as memalign, but operates within
++  the given space.
++*/
++DLMALLOC_EXPORT void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
++
++/*
++  mspace_independent_calloc behaves as independent_calloc, but
++  operates within the given space.
++*/
++DLMALLOC_EXPORT void** mspace_independent_calloc(mspace msp, size_t n_elements,
++                                 size_t elem_size, void* chunks[]);
++
++/*
++  mspace_independent_comalloc behaves as independent_comalloc, but
++  operates within the given space.
++*/
++DLMALLOC_EXPORT void** mspace_independent_comalloc(mspace msp, size_t n_elements,
++                                   size_t sizes[], void* chunks[]);
++
++/*
++  mspace_footprint() returns the number of bytes obtained from the
++  system for this space.
++*/
++DLMALLOC_EXPORT size_t mspace_footprint(mspace msp);
++
++/*
++  mspace_max_footprint() returns the peak number of bytes obtained from the
++  system for this space.
++*/
++DLMALLOC_EXPORT size_t mspace_max_footprint(mspace msp);
++
++
++#if !NO_MALLINFO
++/*
++  mspace_mallinfo behaves as mallinfo, but reports properties of
++  the given space.
++*/
++DLMALLOC_EXPORT struct mallinfo mspace_mallinfo(mspace msp);
++#endif /* NO_MALLINFO */
++
++/*
++  malloc_usable_size(void* p) behaves the same as malloc_usable_size;
++*/
++DLMALLOC_EXPORT size_t mspace_usable_size(const void* mem);
++
++/*
++  mspace_malloc_stats behaves as malloc_stats, but reports
++  properties of the given space.
++*/
++DLMALLOC_EXPORT void mspace_malloc_stats(mspace msp);
++
++/*
++  mspace_trim behaves as malloc_trim, but
++  operates within the given space.
++*/
++DLMALLOC_EXPORT int mspace_trim(mspace msp, size_t pad);
++
++/*
++  An alias for mallopt.
++*/
++DLMALLOC_EXPORT int mspace_mallopt(int, int);
++
++#endif /* MSPACES */
++
++#ifdef __cplusplus
++}  /* end of extern "C" */
++#endif /* __cplusplus */
++
++/*
++  ========================================================================
++  To make a fully customizable malloc.h header file, cut everything
++  above this line, put into file malloc.h, edit to suit, and #include it
++  on the next line, as well as in programs that use this malloc.
++  ========================================================================
++*/
++
++/* #include "malloc.h" */
++
++/*------------------------------ internal #includes ---------------------- */
++
++#ifdef _MSC_VER
++#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
++#endif /* _MSC_VER */
++#if !NO_MALLOC_STATS
++#include <stdio.h>       /* for printing in malloc_stats */
++#endif /* NO_MALLOC_STATS */
++#ifndef LACKS_ERRNO_H
++#include <errno.h>       /* for MALLOC_FAILURE_ACTION */
++#endif /* LACKS_ERRNO_H */
++#ifdef DEBUG
++#if ABORT_ON_ASSERT_FAILURE
++#undef assert
++#define assert(x) if(!(x)) ABORT
++#else /* ABORT_ON_ASSERT_FAILURE */
++#include <assert.h>
++#endif /* ABORT_ON_ASSERT_FAILURE */
++#else  /* DEBUG */
++#ifndef assert
++#define assert(x)
++#endif
++#define DEBUG 0
++#endif /* DEBUG */
++#if !defined(WIN32) && !defined(LACKS_TIME_H)
++#include <time.h>        /* for magic initialization */
++#endif /* WIN32 */
++#ifndef LACKS_STDLIB_H
++#include <stdlib.h>      /* for abort() */
++#endif /* LACKS_STDLIB_H */
++#ifndef LACKS_STRING_H
++#include <string.h>      /* for memset etc */
++#endif  /* LACKS_STRING_H */
++#if USE_BUILTIN_FFS
++#ifndef LACKS_STRINGS_H
++#include <strings.h>     /* for ffs */
++#endif /* LACKS_STRINGS_H */
++#endif /* USE_BUILTIN_FFS */
++#if HAVE_MMAP
++#ifndef LACKS_SYS_MMAN_H
++/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */
++#if (defined(linux) && !defined(__USE_GNU))
++#define __USE_GNU 1
++#include <sys/mman.h>    /* for mmap */
++#undef __USE_GNU
++#else
++#include <sys/mman.h>    /* for mmap */
++#endif /* linux */
++#endif /* LACKS_SYS_MMAN_H */
++#ifndef LACKS_FCNTL_H
++#include <fcntl.h>
++#endif /* LACKS_FCNTL_H */
++#endif /* HAVE_MMAP */
++#ifndef LACKS_UNISTD_H
++#include <unistd.h>     /* for sbrk, sysconf */
++#else /* LACKS_UNISTD_H */
++#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
++extern void*     sbrk(ptrdiff_t);
++#endif /* FreeBSD etc */
++#endif /* LACKS_UNISTD_H */
++
++/* Declarations for locking */
++#if USE_LOCKS
++#ifndef WIN32
++#if defined (__SVR4) && defined (__sun)  /* solaris */
++#include <thread.h>
++#elif !defined(LACKS_SCHED_H)
++#include <sched.h>
++#endif /* solaris or LACKS_SCHED_H */
++#if (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) || !USE_SPIN_LOCKS
++#include <pthread.h>
++#endif /* USE_RECURSIVE_LOCKS ... */
++#elif defined(_MSC_VER)
++#ifndef _M_AMD64
++/* These are already defined on AMD64 builds */
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp);
++LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++#endif /* _M_AMD64 */
++#pragma intrinsic (_InterlockedCompareExchange)
++#pragma intrinsic (_InterlockedExchange)
++#define interlockedcompareexchange _InterlockedCompareExchange
++#define interlockedexchange _InterlockedExchange
++#elif defined(WIN32) && defined(__GNUC__)
++#define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b)
++#define interlockedexchange __sync_lock_test_and_set
++#endif /* Win32 */
++#else /* USE_LOCKS */
++#endif /* USE_LOCKS */
++
++#ifndef LOCK_AT_FORK
++#define LOCK_AT_FORK 0
++#endif
++
++/* Declarations for bit scanning on win32 */
++#if defined(_MSC_VER) && _MSC_VER>=1300
++#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++unsigned char _BitScanForward(unsigned long *index, unsigned long mask);
++unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++
++#define BitScanForward _BitScanForward
++#define BitScanReverse _BitScanReverse
++#pragma intrinsic(_BitScanForward)
++#pragma intrinsic(_BitScanReverse)
++#endif /* BitScanForward */
++#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */
++
++#ifndef WIN32
++#ifndef malloc_getpagesize
++#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
++#    ifndef _SC_PAGE_SIZE
++#      define _SC_PAGE_SIZE _SC_PAGESIZE
++#    endif
++#  endif
++#  ifdef _SC_PAGE_SIZE
++#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
++#  else
++#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
++       extern size_t getpagesize();
++#      define malloc_getpagesize getpagesize()
++#    else
++#      ifdef WIN32 /* use supplied emulation of getpagesize */
++#        define malloc_getpagesize getpagesize()
++#      else
++#        ifndef LACKS_SYS_PARAM_H
++#          include <sys/param.h>
++#        endif
++#        ifdef EXEC_PAGESIZE
++#          define malloc_getpagesize EXEC_PAGESIZE
++#        else
++#          ifdef NBPG
++#            ifndef CLSIZE
++#              define malloc_getpagesize NBPG
++#            else
++#              define malloc_getpagesize (NBPG * CLSIZE)
++#            endif
++#          else
++#            ifdef NBPC
++#              define malloc_getpagesize NBPC
++#            else
++#              ifdef PAGESIZE
++#                define malloc_getpagesize PAGESIZE
++#              else /* just guess */
++#                define malloc_getpagesize ((size_t)4096U)
++#              endif
++#            endif
++#          endif
++#        endif
++#      endif
++#    endif
++#  endif
++#endif
++#endif
++
++/* ------------------- size_t and alignment properties -------------------- */
++
++/* The byte and bit size of a size_t */
++#define SIZE_T_SIZE         (sizeof(size_t))
++#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
++
++/* Some constants coerced to size_t */
++/* Annoying but necessary to avoid errors on some platforms */
++#define SIZE_T_ZERO         ((size_t)0)
++#define SIZE_T_ONE          ((size_t)1)
++#define SIZE_T_TWO          ((size_t)2)
++#define SIZE_T_FOUR         ((size_t)4)
++#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
++#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
++#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
++#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
++
++/* The bit mask value corresponding to MALLOC_ALIGNMENT */
++#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
++
++/* True if address a has acceptable alignment */
++#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
++
++/* the number of bytes to offset an address to align it */
++#define align_offset(A)\
++ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
++  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
++
++/* -------------------------- MMAP preliminaries ------------------------- */
++
++/*
++   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
++   checks to fail so compiler optimizer can delete code rather than
++   using so many "#if"s.
++*/
++
++
++/* MORECORE and MMAP must return MFAIL on failure */
++#define MFAIL                ((void*)(MAX_SIZE_T))
++#define CMFAIL               ((char*)(MFAIL)) /* defined for convenience */
++
++#if HAVE_MMAP
++
++#ifndef WIN32
++#define MUNMAP_DEFAULT(a, s)  munmap((a), (s))
++#define MMAP_PROT            (PROT_READ|PROT_WRITE)
++#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
++#define MAP_ANONYMOUS        MAP_ANON
++#endif /* MAP_ANON */
++#ifdef MAP_ANONYMOUS
++#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
++#define MMAP_DEFAULT(s)       mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
++#else /* MAP_ANONYMOUS */
++/*
++   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
++   is unlikely to be needed, but is supplied just in case.
++*/
++#define MMAP_FLAGS           (MAP_PRIVATE)
++static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
++#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \
++           (dev_zero_fd = open("/dev/zero", O_RDWR), \
++            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
++            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
++#endif /* MAP_ANONYMOUS */
++
++#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s)
++
++#else /* WIN32 */
++
++/* Win32 MMAP via VirtualAlloc */
++static FORCEINLINE void* win32mmap(size_t size) {
++  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
++  return (ptr != 0)? ptr: MFAIL;
++}
++
++/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
++static FORCEINLINE void* win32direct_mmap(size_t size) {
++  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
++                           PAGE_READWRITE);
++  return (ptr != 0)? ptr: MFAIL;
++}
++
++/* This function supports releasing coalesed segments */
++static FORCEINLINE int win32munmap(void* ptr, size_t size) {
++  MEMORY_BASIC_INFORMATION minfo;
++  char* cptr = (char*)ptr;
++  while (size) {
++    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
++      return -1;
++    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
++        minfo.State != MEM_COMMIT || minfo.RegionSize > size)
++      return -1;
++    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
++      return -1;
++    cptr += minfo.RegionSize;
++    size -= minfo.RegionSize;
++  }
++  return 0;
++}
++
++#define MMAP_DEFAULT(s)             win32mmap(s)
++#define MUNMAP_DEFAULT(a, s)        win32munmap((a), (s))
++#define DIRECT_MMAP_DEFAULT(s)      win32direct_mmap(s)
++#endif /* WIN32 */
++#endif /* HAVE_MMAP */
++
++#if HAVE_MREMAP
++#ifndef WIN32
++#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
++#endif /* WIN32 */
++#endif /* HAVE_MREMAP */
++
++/**
++ * Define CALL_MORECORE
++ */
++#if HAVE_MORECORE
++    #ifdef MORECORE
++        #define CALL_MORECORE(S)    MORECORE(S)
++    #else  /* MORECORE */
++        #define CALL_MORECORE(S)    MORECORE_DEFAULT(S)
++    #endif /* MORECORE */
++#else  /* HAVE_MORECORE */
++    #define CALL_MORECORE(S)        MFAIL
++#endif /* HAVE_MORECORE */
++
++/**
++ * Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP
++ */
++#if HAVE_MMAP
++    #define USE_MMAP_BIT            (SIZE_T_ONE)
++
++    #ifdef MMAP
++        #define CALL_MMAP(s)        MMAP(s)
++    #else /* MMAP */
++        #define CALL_MMAP(s)        MMAP_DEFAULT(s)
++    #endif /* MMAP */
++    #ifdef MUNMAP
++        #define CALL_MUNMAP(a, s)   MUNMAP((a), (s))
++    #else /* MUNMAP */
++        #define CALL_MUNMAP(a, s)   MUNMAP_DEFAULT((a), (s))
++    #endif /* MUNMAP */
++    #ifdef DIRECT_MMAP
++        #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
++    #else /* DIRECT_MMAP */
++        #define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
++    #endif /* DIRECT_MMAP */
++#else  /* HAVE_MMAP */
++    #define USE_MMAP_BIT            (SIZE_T_ZERO)
++
++    #define MMAP(s)                 MFAIL
++    #define MUNMAP(a, s)            (-1)
++    #define DIRECT_MMAP(s)          MFAIL
++    #define CALL_DIRECT_MMAP(s)     DIRECT_MMAP(s)
++    #define CALL_MMAP(s)            MMAP(s)
++    #define CALL_MUNMAP(a, s)       MUNMAP((a), (s))
++#endif /* HAVE_MMAP */
++
++/**
++ * Define CALL_MREMAP
++ */
++#if HAVE_MMAP && HAVE_MREMAP
++    #ifdef MREMAP
++        #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv))
++    #else /* MREMAP */
++        #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv))
++    #endif /* MREMAP */
++#else  /* HAVE_MMAP && HAVE_MREMAP */
++    #define CALL_MREMAP(addr, osz, nsz, mv)     MFAIL
++#endif /* HAVE_MMAP && HAVE_MREMAP */
++
++/* mstate bit set if continguous morecore disabled or failed */
++#define USE_NONCONTIGUOUS_BIT (4U)
++
++/* segment bit set in create_mspace_with_base */
++#define EXTERN_BIT            (8U)
++
++
++/* --------------------------- Lock preliminaries ------------------------ */
++
++/*
++  When locks are defined, there is one global lock, plus
++  one per-mspace lock.
++
++  The global lock_ensures that mparams.magic and other unique
++  mparams values are initialized only once. It also protects
++  sequences of calls to MORECORE.  In many cases sys_alloc requires
++  two calls, that should not be interleaved with calls by other
++  threads.  This does not protect against direct calls to MORECORE
++  by other threads not using this lock, so there is still code to
++  cope the best we can on interference.
++
++  Per-mspace locks surround calls to malloc, free, etc.
++  By default, locks are simple non-reentrant mutexes.
++
++  Because lock-protected regions generally have bounded times, it is
++  OK to use the supplied simple spinlocks. Spinlocks are likely to
++  improve performance for lightly contended applications, but worsen
++  performance under heavy contention.
++
++  If USE_LOCKS is > 1, the definitions of lock routines here are
++  bypassed, in which case you will need to define the type MLOCK_T,
++  and at least INITIAL_LOCK, DESTROY_LOCK, ACQUIRE_LOCK, RELEASE_LOCK
++  and TRY_LOCK.  You must also declare a
++    static MLOCK_T malloc_global_mutex = { initialization values };.
++
++*/
++
++#if !USE_LOCKS
++#define USE_LOCK_BIT               (0U)
++#define INITIAL_LOCK(l)            (0)
++#define DESTROY_LOCK(l)            (0)
++#define ACQUIRE_MALLOC_GLOBAL_LOCK()
++#define RELEASE_MALLOC_GLOBAL_LOCK()
++
++#else
++#if USE_LOCKS > 1
++/* -----------------------  User-defined locks ------------------------ */
++/* Define your own lock implementation here */
++/* #define INITIAL_LOCK(lk)  ... */
++/* #define DESTROY_LOCK(lk)  ... */
++/* #define ACQUIRE_LOCK(lk)  ... */
++/* #define RELEASE_LOCK(lk)  ... */
++/* #define TRY_LOCK(lk) ... */
++/* static MLOCK_T malloc_global_mutex = ... */
++
++#elif USE_SPIN_LOCKS
++
++/* First, define CAS_LOCK and CLEAR_LOCK on ints */
++/* Note CAS_LOCK defined to return 0 on success */
++
++#if defined(__GNUC__)&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
++#define CAS_LOCK(sl)     __sync_lock_test_and_set(sl, 1)
++#define CLEAR_LOCK(sl)   __sync_lock_release(sl)
++
++#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
++/* Custom spin locks for older gcc on x86 */
++static FORCEINLINE int x86_cas_lock(int *sl) {
++  int ret;
++  int val = 1;
++  int cmp = 0;
++  __asm__ __volatile__  ("lock; cmpxchgl %1, %2"
++                         : "=a" (ret)
++                         : "r" (val), "m" (*(sl)), "0"(cmp)
++                         : "memory", "cc");
++  return ret;
++}
++
++static FORCEINLINE void x86_clear_lock(int* sl) {
++  assert(*sl != 0);
++  int prev = 0;
++  int ret;
++  __asm__ __volatile__ ("lock; xchgl %0, %1"
++                        : "=r" (ret)
++                        : "m" (*(sl)), "0"(prev)
++                        : "memory");
++}
++
++#define CAS_LOCK(sl)     x86_cas_lock(sl)
++#define CLEAR_LOCK(sl)   x86_clear_lock(sl)
++
++#else /* Win32 MSC */
++#define CAS_LOCK(sl)     interlockedexchange(sl, (LONG)1)
++#define CLEAR_LOCK(sl)   interlockedexchange (sl, (LONG)0)
++
++#endif /* ... gcc spins locks ... */
++
++/* How to yield for a spin lock */
++#define SPINS_PER_YIELD       63
++#if defined(_MSC_VER)
++#define SLEEP_EX_DURATION     50 /* delay for yield/sleep */
++#define SPIN_LOCK_YIELD  SleepEx(SLEEP_EX_DURATION, FALSE)
++#elif defined (__SVR4) && defined (__sun) /* solaris */
++#define SPIN_LOCK_YIELD   thr_yield();
++#elif !defined(LACKS_SCHED_H)
++#define SPIN_LOCK_YIELD   sched_yield();
++#else
++#define SPIN_LOCK_YIELD
++#endif /* ... yield ... */
++
++#if !defined(USE_RECURSIVE_LOCKS) || USE_RECURSIVE_LOCKS == 0
++/* Plain spin locks use single word (embedded in malloc_states) */
++static int spin_acquire_lock(int *sl) {
++  int spins = 0;
++  while (*(volatile int *)sl != 0 || CAS_LOCK(sl)) {
++    if ((++spins & SPINS_PER_YIELD) == 0) {
++      SPIN_LOCK_YIELD;
++    }
++  }
++  return 0;
++}
++
++#define MLOCK_T               int
++#define TRY_LOCK(sl)          !CAS_LOCK(sl)
++#define RELEASE_LOCK(sl)      CLEAR_LOCK(sl)
++#define ACQUIRE_LOCK(sl)      (CAS_LOCK(sl)? spin_acquire_lock(sl) : 0)
++#define INITIAL_LOCK(sl)      (*sl = 0)
++#define DESTROY_LOCK(sl)      (0)
++static MLOCK_T malloc_global_mutex = 0;
++
++#else /* USE_RECURSIVE_LOCKS */
++/* types for lock owners */
++#ifdef WIN32
++#define THREAD_ID_T           DWORD
++#define CURRENT_THREAD        GetCurrentThreadId()
++#define EQ_OWNER(X,Y)         ((X) == (Y))
++#else
++/*
++  Note: the following assume that pthread_t is a type that can be
++  initialized to (casted) zero. If this is not the case, you will need to
++  somehow redefine these or not use spin locks.
++*/
++#define THREAD_ID_T           pthread_t
++#define CURRENT_THREAD        pthread_self()
++#define EQ_OWNER(X,Y)         pthread_equal(X, Y)
++#endif
++
++struct malloc_recursive_lock {
++  int sl;
++  unsigned int c;
++  THREAD_ID_T threadid;
++};
++
++#define MLOCK_T  struct malloc_recursive_lock
++static MLOCK_T malloc_global_mutex = { 0, 0, (THREAD_ID_T)0};
++
++static FORCEINLINE void recursive_release_lock(MLOCK_T *lk) {
++  assert(lk->sl != 0);
++  if (--lk->c == 0) {
++    CLEAR_LOCK(&lk->sl);
++  }
++}
++
++static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) {
++  THREAD_ID_T mythreadid = CURRENT_THREAD;
++  int spins = 0;
++  for (;;) {
++    if (*((volatile int *)(&lk->sl)) == 0) {
++      if (!CAS_LOCK(&lk->sl)) {
++        lk->threadid = mythreadid;
++        lk->c = 1;
++        return 0;
++      }
++    }
++    else if (EQ_OWNER(lk->threadid, mythreadid)) {
++      ++lk->c;
++      return 0;
++    }
++    if ((++spins & SPINS_PER_YIELD) == 0) {
++      SPIN_LOCK_YIELD;
++    }
++  }
++}
++
++static FORCEINLINE int recursive_try_lock(MLOCK_T *lk) {
++  THREAD_ID_T mythreadid = CURRENT_THREAD;
++  if (*((volatile int *)(&lk->sl)) == 0) {
++    if (!CAS_LOCK(&lk->sl)) {
++      lk->threadid = mythreadid;
++      lk->c = 1;
++      return 1;
++    }
++  }
++  else if (EQ_OWNER(lk->threadid, mythreadid)) {
++    ++lk->c;
++    return 1;
++  }
++  return 0;
++}
++
++#define RELEASE_LOCK(lk)      recursive_release_lock(lk)
++#define TRY_LOCK(lk)          recursive_try_lock(lk)
++#define ACQUIRE_LOCK(lk)      recursive_acquire_lock(lk)
++#define INITIAL_LOCK(lk)      ((lk)->threadid = (THREAD_ID_T)0, (lk)->sl = 0, (lk)->c = 0)
++#define DESTROY_LOCK(lk)      (0)
++#endif /* USE_RECURSIVE_LOCKS */
++
++#elif defined(WIN32) /* Win32 critical sections */
++#define MLOCK_T               CRITICAL_SECTION
++#define ACQUIRE_LOCK(lk)      (EnterCriticalSection(lk), 0)
++#define RELEASE_LOCK(lk)      LeaveCriticalSection(lk)
++#define TRY_LOCK(lk)          TryEnterCriticalSection(lk)
++#define INITIAL_LOCK(lk)      (!InitializeCriticalSectionAndSpinCount((lk), 0x80000000|4000))
++#define DESTROY_LOCK(lk)      (DeleteCriticalSection(lk), 0)
++#define NEED_GLOBAL_LOCK_INIT
++
++static MLOCK_T malloc_global_mutex;
++static volatile LONG malloc_global_mutex_status;
++
++/* Use spin loop to initialize global lock */
++static void init_malloc_global_mutex() {
++  for (;;) {
++    long stat = malloc_global_mutex_status;
++    if (stat > 0)
++      return;
++    /* transition to < 0 while initializing, then to > 0) */
++    if (stat == 0 &&
++        interlockedcompareexchange(&malloc_global_mutex_status, (LONG)-1, (LONG)0) == 0) {
++      InitializeCriticalSection(&malloc_global_mutex);
++      interlockedexchange(&malloc_global_mutex_status, (LONG)1);
++      return;
++    }
++    SleepEx(0, FALSE);
++  }
++}
++
++#else /* pthreads-based locks */
++#define MLOCK_T               pthread_mutex_t
++#define ACQUIRE_LOCK(lk)      pthread_mutex_lock(lk)
++#define RELEASE_LOCK(lk)      pthread_mutex_unlock(lk)
++#define TRY_LOCK(lk)          (!pthread_mutex_trylock(lk))
++#define INITIAL_LOCK(lk)      pthread_init_lock(lk)
++#define DESTROY_LOCK(lk)      pthread_mutex_destroy(lk)
++
++#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0 && defined(linux) && !defined(PTHREAD_MUTEX_RECURSIVE)
++/* Cope with old-style linux recursive lock initialization by adding */
++/* skipped internal declaration from pthread.h */
++extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr,
++                                              int __kind));
++#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
++#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y)
++#endif /* USE_RECURSIVE_LOCKS ... */
++
++static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER;
++
++static int pthread_init_lock (MLOCK_T *lk) {
++  pthread_mutexattr_t attr;
++  if (pthread_mutexattr_init(&attr)) return 1;
++#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0
++  if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1;
++#endif
++  if (pthread_mutex_init(lk, &attr)) return 1;
++  if (pthread_mutexattr_destroy(&attr)) return 1;
++  return 0;
++}
++
++#endif /* ... lock types ... */
++
++/* Common code for all lock types */
++#define USE_LOCK_BIT               (2U)
++
++#ifndef ACQUIRE_MALLOC_GLOBAL_LOCK
++#define ACQUIRE_MALLOC_GLOBAL_LOCK()  ACQUIRE_LOCK(&malloc_global_mutex);
++#endif
++
++#ifndef RELEASE_MALLOC_GLOBAL_LOCK
++#define RELEASE_MALLOC_GLOBAL_LOCK()  RELEASE_LOCK(&malloc_global_mutex);
++#endif
++
++#endif /* USE_LOCKS */
++
++/* -----------------------  Chunk representations ------------------------ */
++
++/*
++  (The following includes lightly edited explanations by Colin Plumb.)
++
++  The malloc_chunk declaration below is misleading (but accurate and
++  necessary).  It declares a "view" into memory allowing access to
++  necessary fields at known offsets from a given base.
++
++  Chunks of memory are maintained using a `boundary tag' method as
++  originally described by Knuth.  (See the paper by Paul Wilson
++  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
++  techniques.)  Sizes of free chunks are stored both in the front of
++  each chunk and at the end.  This makes consolidating fragmented
++  chunks into bigger chunks fast.  The head fields also hold bits
++  representing whether chunks are free or in use.
++
++  Here are some pictures to make it clearer.  They are "exploded" to
++  show that the state of a chunk can be thought of as extending from
++  the high 31 bits of the head field of its header through the
++  prev_foot and PINUSE_BIT bit of the following chunk header.
++
++  A chunk that's in use looks like:
++
++   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++           | Size of previous chunk (if P = 0)                             |
++           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
++         | Size of this chunk                                         1| +-+
++   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         |                                                               |
++         +-                                                             -+
++         |                                                               |
++         +-                                                             -+
++         |                                                               :
++         +-      size - sizeof(size_t) available payload bytes          -+
++         :                                                               |
++ chunk-> +-                                                             -+
++         |                                                               |
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
++       | Size of next chunk (may or may not be in use)               | +-+
++ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++
++    And if it's free, it looks like this:
++
++   chunk-> +-                                                             -+
++           | User payload (must be in use, or we would have merged!)       |
++           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
++         | Size of this chunk                                         0| +-+
++   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         | Next pointer                                                  |
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         | Prev pointer                                                  |
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         |                                                               :
++         +-      size - sizeof(struct chunk) unused bytes               -+
++         :                                                               |
++ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++         | Size of this chunk                                            |
++         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
++       | Size of next chunk (must be in use, or we would have merged)| +-+
++ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++       |                                                               :
++       +- User payload                                                -+
++       :                                                               |
++       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++                                                                     |0|
++                                                                     +-+
++  Note that since we always merge adjacent free chunks, the chunks
++  adjacent to a free chunk must be in use.
++
++  Given a pointer to a chunk (which can be derived trivially from the
++  payload pointer) we can, in O(1) time, find out whether the adjacent
++  chunks are free, and if so, unlink them from the lists that they
++  are on and merge them with the current chunk.
++
++  Chunks always begin on even word boundaries, so the mem portion
++  (which is returned to the user) is also on an even word boundary, and
++  thus at least double-word aligned.
++
++  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
++  chunk size (which is always a multiple of two words), is an in-use
++  bit for the *previous* chunk.  If that bit is *clear*, then the
++  word before the current chunk size contains the previous chunk
++  size, and can be used to find the front of the previous chunk.
++  The very first chunk allocated always has this bit set, preventing
++  access to non-existent (or non-owned) memory. If pinuse is set for
++  any given chunk, then you CANNOT determine the size of the
++  previous chunk, and might even get a memory addressing fault when
++  trying to do so.
++
++  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
++  the chunk size redundantly records whether the current chunk is
++  inuse (unless the chunk is mmapped). This redundancy enables usage
++  checks within free and realloc, and reduces indirection when freeing
++  and consolidating chunks.
++
++  Each freshly allocated chunk must have both cinuse and pinuse set.
++  That is, each allocated chunk borders either a previously allocated
++  and still in-use chunk, or the base of its memory arena. This is
++  ensured by making all allocations from the `lowest' part of any
++  found chunk.  Further, no free chunk physically borders another one,
++  so each free chunk is known to be preceded and followed by either
++  inuse chunks or the ends of memory.
++
++  Note that the `foot' of the current chunk is actually represented
++  as the prev_foot of the NEXT chunk. This makes it easier to
++  deal with alignments etc but can be very confusing when trying
++  to extend or adapt this code.
++
++  The exceptions to all this are
++
++     1. The special chunk `top' is the top-most available chunk (i.e.,
++        the one bordering the end of available memory). It is treated
++        specially.  Top is never included in any bin, is used only if
++        no other chunk is available, and is released back to the
++        system if it is very large (see M_TRIM_THRESHOLD).  In effect,
++        the top chunk is treated as larger (and thus less well
++        fitting) than any other available chunk.  The top chunk
++        doesn't update its trailing size field since there is no next
++        contiguous chunk that would have to index off it. However,
++        space is still allocated for it (TOP_FOOT_SIZE) to enable
++        separation or merging when space is extended.
++
++     3. Chunks allocated via mmap, have both cinuse and pinuse bits
++        cleared in their head fields.  Because they are allocated
++        one-by-one, each must carry its own prev_foot field, which is
++        also used to hold the offset this chunk has within its mmapped
++        region, which is needed to preserve alignment. Each mmapped
++        chunk is trailed by the first two fields of a fake next-chunk
++        for sake of usage checks.
++
++*/
++
++struct malloc_chunk {
++  size_t               prev_foot;  /* Size of previous chunk (if free).  */
++  size_t               head;       /* Size and inuse bits. */
++  struct malloc_chunk* fd;         /* double links -- used only if free. */
++  struct malloc_chunk* bk;
++};
++
++typedef struct malloc_chunk  mchunk;
++typedef struct malloc_chunk* mchunkptr;
++typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
++typedef unsigned int bindex_t;         /* Described below */
++typedef unsigned int binmap_t;         /* Described below */
++typedef unsigned int flag_t;           /* The type of various bit flag sets */
++
++/* ------------------- Chunks sizes and alignments ----------------------- */
++
++#define MCHUNK_SIZE         (sizeof(mchunk))
++
++#if FOOTERS
++#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
++#else /* FOOTERS */
++#define CHUNK_OVERHEAD      (SIZE_T_SIZE)
++#endif /* FOOTERS */
++
++/* MMapped chunks need a second word of overhead ... */
++#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
++/* ... and additional padding for fake next-chunk at foot */
++#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
++
++/* The smallest size we can malloc is an aligned minimal chunk */
++#define MIN_CHUNK_SIZE\
++  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
++
++/* conversion from malloc headers to user pointers, and back */
++#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))
++#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
++/* chunk associated with aligned address A */
++#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
++
++/* Bounds on request (not chunk) sizes. */
++#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
++#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
++
++/* pad request bytes into a usable size */
++#define pad_request(req) \
++   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
++
++/* pad request, checking for minimum (but not maximum) */
++#define request2size(req) \
++  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
++
++
++/* ------------------ Operations on head and foot fields ----------------- */
++
++/*
++  The head field of a chunk is or'ed with PINUSE_BIT when previous
++  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
++  use, unless mmapped, in which case both bits are cleared.
++
++  FLAG4_BIT is not used by this malloc, but might be useful in extensions.
++*/
++
++#define PINUSE_BIT          (SIZE_T_ONE)
++#define CINUSE_BIT          (SIZE_T_TWO)
++#define FLAG4_BIT           (SIZE_T_FOUR)
++#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
++#define FLAG_BITS           (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT)
++
++/* Head value for fenceposts */
++#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
++
++/* extraction of fields from head words */
++#define cinuse(p)           ((p)->head & CINUSE_BIT)
++#define pinuse(p)           ((p)->head & PINUSE_BIT)
++#define flag4inuse(p)       ((p)->head & FLAG4_BIT)
++#define is_inuse(p)         (((p)->head & INUSE_BITS) != PINUSE_BIT)
++#define is_mmapped(p)       (((p)->head & INUSE_BITS) == 0)
++
++#define chunksize(p)        ((p)->head & ~(FLAG_BITS))
++
++#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
++#define set_flag4(p)        ((p)->head |= FLAG4_BIT)
++#define clear_flag4(p)      ((p)->head &= ~FLAG4_BIT)
++
++/* Treat space at ptr +/- offset as a chunk */
++#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
++#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
++
++/* Ptr to next or previous physical malloc_chunk. */
++#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS)))
++#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
++
++/* extract next chunk's pinuse bit */
++#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
++
++/* Get/set size at footer */
++#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)
++#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
++
++/* Set size, pinuse bit, and foot */
++#define set_size_and_pinuse_of_free_chunk(p, s)\
++  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
++
++/* Set size, pinuse bit, foot, and clear next pinuse */
++#define set_free_with_pinuse(p, s, n)\
++  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
++
++/* Get the internal overhead associated with chunk p */
++#define overhead_for(p)\
++ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
++
++/* Return true if malloced space is not necessarily cleared */
++#if MMAP_CLEARS
++#define calloc_must_clear(p) (!is_mmapped(p))
++#else /* MMAP_CLEARS */
++#define calloc_must_clear(p) (1)
++#endif /* MMAP_CLEARS */
++
++/* ---------------------- Overlaid data structures ----------------------- */
++
++/*
++  When chunks are not in use, they are treated as nodes of either
++  lists or trees.
++
++  "Small"  chunks are stored in circular doubly-linked lists, and look
++  like this:
++
++    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Size of previous chunk                            |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++    `head:' |             Size of chunk, in bytes                         |P|
++      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Forward pointer to next chunk in list             |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Back pointer to previous chunk in list            |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Unused space (may be 0 bytes long)                .
++            .                                                               .
++            .                                                               |
++nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++    `foot:' |             Size of chunk, in bytes                           |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++
++  Larger chunks are kept in a form of bitwise digital trees (aka
++  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for
++  free chunks greater than 256 bytes, their size doesn't impose any
++  constraints on user chunk sizes.  Each node looks like:
++
++    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Size of previous chunk                            |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++    `head:' |             Size of chunk, in bytes                         |P|
++      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Forward pointer to next chunk of same size        |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Back pointer to previous chunk of same size       |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Pointer to left child (child[0])                  |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Pointer to right child (child[1])                 |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Pointer to parent                                 |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             bin index of this chunk                           |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++            |             Unused space                                      .
++            .                                                               |
++nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++    `foot:' |             Size of chunk, in bytes                           |
++            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++
++  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks
++  of the same size are arranged in a circularly-linked list, with only
++  the oldest chunk (the next to be used, in our FIFO ordering)
++  actually in the tree.  (Tree members are distinguished by a non-null
++  parent pointer.)  If a chunk with the same size an an existing node
++  is inserted, it is linked off the existing node using pointers that
++  work in the same way as fd/bk pointers of small chunks.
++
++  Each tree contains a power of 2 sized range of chunk sizes (the
++  smallest is 0x100 <= x < 0x180), which is is divided in half at each
++  tree level, with the chunks in the smaller half of the range (0x100
++  <= x < 0x140 for the top nose) in the left subtree and the larger
++  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,
++  done by inspecting individual bits.
++
++  Using these rules, each node's left subtree contains all smaller
++  sizes than its right subtree.  However, the node at the root of each
++  subtree has no particular ordering relationship to either.  (The
++  dividing line between the subtree sizes is based on trie relation.)
++  If we remove the last chunk of a given size from the interior of the
++  tree, we need to replace it with a leaf node.  The tree ordering
++  rules permit a node to be replaced by any leaf below it.
++
++  The smallest chunk in a tree (a common operation in a best-fit
++  allocator) can be found by walking a path to the leftmost leaf in
++  the tree.  Unlike a usual binary tree, where we follow left child
++  pointers until we reach a null, here we follow the right child
++  pointer any time the left one is null, until we reach a leaf with
++  both child pointers null. The smallest chunk in the tree will be
++  somewhere along that path.
++
++  The worst case number of steps to add, find, or remove a node is
++  bounded by the number of bits differentiating chunks within
++  bins. Under current bin calculations, this ranges from 6 up to 21
++  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
++  is of course much better.
++*/
++
++struct malloc_tree_chunk {
++  /* The first four fields must be compatible with malloc_chunk */
++  size_t                    prev_foot;
++  size_t                    head;
++  struct malloc_tree_chunk* fd;
++  struct malloc_tree_chunk* bk;
++
++  struct malloc_tree_chunk* child[2];
++  struct malloc_tree_chunk* parent;
++  bindex_t                  index;
++};
++
++typedef struct malloc_tree_chunk  tchunk;
++typedef struct malloc_tree_chunk* tchunkptr;
++typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
++
++/* A little helper macro for trees */
++#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
++
++/* ----------------------------- Segments -------------------------------- */
++
++/*
++  Each malloc space may include non-contiguous segments, held in a
++  list headed by an embedded malloc_segment record representing the
++  top-most space. Segments also include flags holding properties of
++  the space. Large chunks that are directly allocated by mmap are not
++  included in this list. They are instead independently created and
++  destroyed without otherwise keeping track of them.
++
++  Segment management mainly comes into play for spaces allocated by
++  MMAP.  Any call to MMAP might or might not return memory that is
++  adjacent to an existing segment.  MORECORE normally contiguously
++  extends the current space, so this space is almost always adjacent,
++  which is simpler and faster to deal with. (This is why MORECORE is
++  used preferentially to MMAP when both are available -- see
++  sys_alloc.)  When allocating using MMAP, we don't use any of the
++  hinting mechanisms (inconsistently) supported in various
++  implementations of unix mmap, or distinguish reserving from
++  committing memory. Instead, we just ask for space, and exploit
++  contiguity when we get it.  It is probably possible to do
++  better than this on some systems, but no general scheme seems
++  to be significantly better.
++
++  Management entails a simpler variant of the consolidation scheme
++  used for chunks to reduce fragmentation -- new adjacent memory is
++  normally prepended or appended to an existing segment. However,
++  there are limitations compared to chunk consolidation that mostly
++  reflect the fact that segment processing is relatively infrequent
++  (occurring only when getting memory from system) and that we
++  don't expect to have huge numbers of segments:
++
++  * Segments are not indexed, so traversal requires linear scans.  (It
++    would be possible to index these, but is not worth the extra
++    overhead and complexity for most programs on most platforms.)
++  * New segments are only appended to old ones when holding top-most
++    memory; if they cannot be prepended to others, they are held in
++    different segments.
++
++  Except for the top-most segment of an mstate, each segment record
++  is kept at the tail of its segment. Segments are added by pushing
++  segment records onto the list headed by &mstate.seg for the
++  containing mstate.
++
++  Segment flags control allocation/merge/deallocation policies:
++  * If EXTERN_BIT set, then we did not allocate this segment,
++    and so should not try to deallocate or merge with others.
++    (This currently holds only for the initial segment passed
++    into create_mspace_with_base.)
++  * If USE_MMAP_BIT set, the segment may be merged with
++    other surrounding mmapped segments and trimmed/de-allocated
++    using munmap.
++  * If neither bit is set, then the segment was obtained using
++    MORECORE so can be merged with surrounding MORECORE'd segments
++    and deallocated/trimmed using MORECORE with negative arguments.
++*/
++
++struct malloc_segment {
++  char*        base;             /* base address */
++  size_t       size;             /* allocated size */
++  struct malloc_segment* next;   /* ptr to next segment */
++  flag_t       sflags;           /* mmap and extern flag */
++};
++
++#define is_mmapped_segment(S)  ((S)->sflags & USE_MMAP_BIT)
++#define is_extern_segment(S)   ((S)->sflags & EXTERN_BIT)
++
++typedef struct malloc_segment  msegment;
++typedef struct malloc_segment* msegmentptr;
++
++/* ---------------------------- malloc_state ----------------------------- */
++
++/*
++   A malloc_state holds all of the bookkeeping for a space.
++   The main fields are:
++
++  Top
++    The topmost chunk of the currently active segment. Its size is
++    cached in topsize.  The actual size of topmost space is
++    topsize+TOP_FOOT_SIZE, which includes space reserved for adding
++    fenceposts and segment records if necessary when getting more
++    space from the system.  The size at which to autotrim top is
++    cached from mparams in trim_check, except that it is disabled if
++    an autotrim fails.
++
++  Designated victim (dv)
++    This is the preferred chunk for servicing small requests that
++    don't have exact fits.  It is normally the chunk split off most
++    recently to service another small request.  Its size is cached in
++    dvsize. The link fields of this chunk are not maintained since it
++    is not kept in a bin.
++
++  SmallBins
++    An array of bin headers for free chunks.  These bins hold chunks
++    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
++    chunks of all the same size, spaced 8 bytes apart.  To simplify
++    use in double-linked lists, each bin header acts as a malloc_chunk
++    pointing to the real first node, if it exists (else pointing to
++    itself).  This avoids special-casing for headers.  But to avoid
++    waste, we allocate only the fd/bk pointers of bins, and then use
++    repositioning tricks to treat these as the fields of a chunk.
++
++  TreeBins
++    Treebins are pointers to the roots of trees holding a range of
++    sizes. There are 2 equally spaced treebins for each power of two
++    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
++    larger.
++
++  Bin maps
++    There is one bit map for small bins ("smallmap") and one for
++    treebins ("treemap).  Each bin sets its bit when non-empty, and
++    clears the bit when empty.  Bit operations are then used to avoid
++    bin-by-bin searching -- nearly all "search" is done without ever
++    looking at bins that won't be selected.  The bit maps
++    conservatively use 32 bits per map word, even if on 64bit system.
++    For a good description of some of the bit-based techniques used
++    here, see Henry S. Warren Jr's book "Hacker's Delight" (and
++    supplement at http://hackersdelight.org/). Many of these are
++    intended to reduce the branchiness of paths through malloc etc, as
++    well as to reduce the number of memory locations read or written.
++
++  Segments
++    A list of segments headed by an embedded malloc_segment record
++    representing the initial space.
++
++  Address check support
++    The least_addr field is the least address ever obtained from
++    MORECORE or MMAP. Attempted frees and reallocs of any address less
++    than this are trapped (unless INSECURE is defined).
++
++  Magic tag
++    A cross-check field that should always hold same value as mparams.magic.
++
++  Max allowed footprint
++    The maximum allowed bytes to allocate from system (zero means no limit)
++
++  Flags
++    Bits recording whether to use MMAP, locks, or contiguous MORECORE
++
++  Statistics
++    Each space keeps track of current and maximum system memory
++    obtained via MORECORE or MMAP.
++
++  Trim support
++    Fields holding the amount of unused topmost memory that should trigger
++    trimming, and a counter to force periodic scanning to release unused
++    non-topmost segments.
++
++  Locking
++    If USE_LOCKS is defined, the "mutex" lock is acquired and released
++    around every public call using this mspace.
++
++  Extension support
++    A void* pointer and a size_t field that can be used to help implement
++    extensions to this malloc.
++*/
++
++/* Bin types, widths and sizes */
++#define NSMALLBINS        (32U)
++#define NTREEBINS         (32U)
++#define SMALLBIN_SHIFT    (3U)
++#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
++#define TREEBIN_SHIFT     (8U)
++#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
++#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
++#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
++
++struct malloc_state {
++  binmap_t   smallmap;
++  binmap_t   treemap;
++  size_t     dvsize;
++  size_t     topsize;
++  char*      least_addr;
++  mchunkptr  dv;
++  mchunkptr  top;
++  size_t     trim_check;
++  size_t     release_checks;
++  size_t     magic;
++  mchunkptr  smallbins[(NSMALLBINS+1)*2];
++  tbinptr    treebins[NTREEBINS];
++  size_t     footprint;
++  size_t     max_footprint;
++  size_t     footprint_limit; /* zero means no limit */
++  flag_t     mflags;
++#if USE_LOCKS
++  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
++#endif /* USE_LOCKS */
++  msegment   seg;
++  void*      extp;      /* Unused but available for extensions */
++  size_t     exts;
++};
++
++typedef struct malloc_state*    mstate;
++
++/* ------------- Global malloc_state and malloc_params ------------------- */
++
++/*
++  malloc_params holds global properties, including those that can be
++  dynamically set using mallopt. There is a single instance, mparams,
++  initialized in init_mparams. Note that the non-zeroness of "magic"
++  also serves as an initialization flag.
++*/
++
++struct malloc_params {
++  size_t magic;
++  size_t page_size;
++  size_t granularity;
++  size_t mmap_threshold;
++  size_t trim_threshold;
++  flag_t default_mflags;
++};
++
++static struct malloc_params mparams;
++
++/* Ensure mparams initialized */
++#define ensure_initialization() (void)(mparams.magic != 0 || init_mparams())
++
++#if !ONLY_MSPACES
++
++/* The global malloc_state used for all non-"mspace" calls */
++static struct malloc_state _gm_;
++#define gm                 (&_gm_)
++#define is_global(M)       ((M) == &_gm_)
++
++#endif /* !ONLY_MSPACES */
++
++#define is_initialized(M)  ((M)->top != 0)
++
++/* -------------------------- system alloc setup ------------------------- */
++
++/* Operations on mflags */
++
++#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
++#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
++#if USE_LOCKS
++#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
++#else
++#define disable_lock(M)
++#endif
++
++#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
++#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
++#if HAVE_MMAP
++#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
++#else
++#define disable_mmap(M)
++#endif
++
++#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
++#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
++
++#define set_lock(M,L)\
++ ((M)->mflags = (L)?\
++  ((M)->mflags | USE_LOCK_BIT) :\
++  ((M)->mflags & ~USE_LOCK_BIT))
++
++/* page-align a size */
++#define page_align(S)\
++ (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE))
++
++/* granularity-align a size */
++#define granularity_align(S)\
++  (((S) + (mparams.granularity - SIZE_T_ONE))\
++   & ~(mparams.granularity - SIZE_T_ONE))
++
++
++/* For mmap, use granularity alignment on windows, else page-align */
++#ifdef WIN32
++#define mmap_align(S) granularity_align(S)
++#else
++#define mmap_align(S) page_align(S)
++#endif
++
++/* For sys_alloc, enough padding to ensure can malloc request on success */
++#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT)
++
++#define is_page_aligned(S)\
++   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
++#define is_granularity_aligned(S)\
++   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
++
++/*  True if segment S holds address A */
++#define segment_holds(S, A)\
++  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
++
++/* Return segment holding given address */
++static msegmentptr segment_holding(mstate m, char* addr) {
++  msegmentptr sp = &m->seg;
++  for (;;) {
++    if (addr >= sp->base && addr < sp->base + sp->size)
++      return sp;
++    if ((sp = sp->next) == 0)
++      return 0;
++  }
++}
++
++/* Return true if segment contains a segment link */
++static int has_segment_link(mstate m, msegmentptr ss) {
++  msegmentptr sp = &m->seg;
++  for (;;) {
++    if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
++      return 1;
++    if ((sp = sp->next) == 0)
++      return 0;
++  }
++}
++
++#ifndef MORECORE_CANNOT_TRIM
++#define should_trim(M,s)  ((s) > (M)->trim_check)
++#else  /* MORECORE_CANNOT_TRIM */
++#define should_trim(M,s)  (0)
++#endif /* MORECORE_CANNOT_TRIM */
++
++/*
++  TOP_FOOT_SIZE is padding at the end of a segment, including space
++  that may be needed to place segment records and fenceposts when new
++  noncontiguous segments are added.
++*/
++#define TOP_FOOT_SIZE\
++  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
++
++
++/* -------------------------------  Hooks -------------------------------- */
++
++/*
++  PREACTION should be defined to return 0 on success, and nonzero on
++  failure. If you are not using locking, you can redefine these to do
++  anything you like.
++*/
++
++#if USE_LOCKS
++#define PREACTION(M)  ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
++#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
++#else /* USE_LOCKS */
++
++#ifndef PREACTION
++#define PREACTION(M) (0)
++#endif  /* PREACTION */
++
++#ifndef POSTACTION
++#define POSTACTION(M)
++#endif  /* POSTACTION */
++
++#endif /* USE_LOCKS */
++
++/*
++  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
++  USAGE_ERROR_ACTION is triggered on detected bad frees and
++  reallocs. The argument p is an address that might have triggered the
++  fault. It is ignored by the two predefined actions, but might be
++  useful in custom actions that try to help diagnose errors.
++*/
++
++#if PROCEED_ON_ERROR
++
++/* A count of the number of corruption errors causing resets */
++int malloc_corruption_error_count;
++
++/* default corruption action */
++static void reset_on_error(mstate m);
++
++#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
++#define USAGE_ERROR_ACTION(m, p)
++
++#else /* PROCEED_ON_ERROR */
++
++#ifndef CORRUPTION_ERROR_ACTION
++#define CORRUPTION_ERROR_ACTION(m) ABORT
++#endif /* CORRUPTION_ERROR_ACTION */
++
++#ifndef USAGE_ERROR_ACTION
++#define USAGE_ERROR_ACTION(m,p) ABORT
++#endif /* USAGE_ERROR_ACTION */
++
++#endif /* PROCEED_ON_ERROR */
++
++
++/* -------------------------- Debugging setup ---------------------------- */
++
++#if ! DEBUG
++
++#define check_free_chunk(M,P)
++#define check_inuse_chunk(M,P)
++#define check_malloced_chunk(M,P,N)
++#define check_mmapped_chunk(M,P)
++#define check_malloc_state(M)
++#define check_top_chunk(M,P)
++
++#else /* DEBUG */
++#define check_free_chunk(M,P)       do_check_free_chunk(M,P)
++#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
++#define check_top_chunk(M,P)        do_check_top_chunk(M,P)
++#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
++#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
++#define check_malloc_state(M)       do_check_malloc_state(M)
++
++static void   do_check_any_chunk(mstate m, mchunkptr p);
++static void   do_check_top_chunk(mstate m, mchunkptr p);
++static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
++static void   do_check_inuse_chunk(mstate m, mchunkptr p);
++static void   do_check_free_chunk(mstate m, mchunkptr p);
++static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
++static void   do_check_tree(mstate m, tchunkptr t);
++static void   do_check_treebin(mstate m, bindex_t i);
++static void   do_check_smallbin(mstate m, bindex_t i);
++static void   do_check_malloc_state(mstate m);
++static int    bin_find(mstate m, mchunkptr x);
++static size_t traverse_and_check(mstate m);
++#endif /* DEBUG */
++
++/* ---------------------------- Indexing Bins ---------------------------- */
++
++#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
++#define small_index(s)      (bindex_t)((s)  >> SMALLBIN_SHIFT)
++#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
++#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
++
++/* addressing by index. See above about smallbin repositioning */
++/* BEGIN android-changed: strict aliasing change: char* cast to void* */
++#define smallbin_at(M, i)   ((sbinptr)((void*)&((M)->smallbins[(i)<<1])))
++/* END android-changed */
++#define treebin_at(M,i)     (&((M)->treebins[i]))
++
++/* assign tree index for size S to variable I. Use x86 asm if possible  */
++#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
++#define compute_tree_index(S, I)\
++{\
++  unsigned int X = S >> TREEBIN_SHIFT;\
++  if (X == 0)\
++    I = 0;\
++  else if (X > 0xFFFF)\
++    I = NTREEBINS-1;\
++  else {\
++    unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \
++    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
++  }\
++}
++
++#elif defined (__INTEL_COMPILER)
++#define compute_tree_index(S, I)\
++{\
++  size_t X = S >> TREEBIN_SHIFT;\
++  if (X == 0)\
++    I = 0;\
++  else if (X > 0xFFFF)\
++    I = NTREEBINS-1;\
++  else {\
++    unsigned int K = _bit_scan_reverse (X); \
++    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
++  }\
++}
++
++#elif defined(_MSC_VER) && _MSC_VER>=1300
++#define compute_tree_index(S, I)\
++{\
++  size_t X = S >> TREEBIN_SHIFT;\
++  if (X == 0)\
++    I = 0;\
++  else if (X > 0xFFFF)\
++    I = NTREEBINS-1;\
++  else {\
++    unsigned int K;\
++    _BitScanReverse((DWORD *) &K, (DWORD) X);\
++    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
++  }\
++}
++
++#else /* GNUC */
++#define compute_tree_index(S, I)\
++{\
++  size_t X = S >> TREEBIN_SHIFT;\
++  if (X == 0)\
++    I = 0;\
++  else if (X > 0xFFFF)\
++    I = NTREEBINS-1;\
++  else {\
++    unsigned int Y = (unsigned int)X;\
++    unsigned int N = ((Y - 0x100) >> 16) & 8;\
++    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
++    N += K;\
++    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
++    K = 14 - N + ((Y <<= K) >> 15);\
++    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
++  }\
++}
++#endif /* GNUC */
++
++/* Bit representing maximum resolved size in a treebin at i */
++#define bit_for_tree_index(i) \
++   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
++
++/* Shift placing maximum resolved bit in a treebin at i as sign bit */
++#define leftshift_for_tree_index(i) \
++   ((i == NTREEBINS-1)? 0 : \
++    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
++
++/* The size of the smallest chunk held in bin with index i */
++#define minsize_for_tree_index(i) \
++   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \
++   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
++
++
++/* ------------------------ Operations on bin maps ----------------------- */
++
++/* bit corresponding to given index */
++#define idx2bit(i)              ((binmap_t)(1) << (i))
++
++/* Mark/Clear bits with given index */
++#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
++#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
++#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
++
++#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
++#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
++#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
++
++/* isolate the least set bit of a bitmap */
++#define least_bit(x)         ((x) & -(x))
++
++/* mask with all bits to left of least bit of x on */
++#define left_bits(x)         ((x<<1) | -(x<<1))
++
++/* mask with all bits to left of or equal to least bit of x on */
++#define same_or_left_bits(x) ((x) | -(x))
++
++/* index corresponding to given bit. Use x86 asm if possible */
++
++#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
++#define compute_bit2idx(X, I)\
++{\
++  unsigned int J;\
++  J = __builtin_ctz(X); \
++  I = (bindex_t)J;\
++}
++
++#elif defined (__INTEL_COMPILER)
++#define compute_bit2idx(X, I)\
++{\
++  unsigned int J;\
++  J = _bit_scan_forward (X); \
++  I = (bindex_t)J;\
++}
++
++#elif defined(_MSC_VER) && _MSC_VER>=1300
++#define compute_bit2idx(X, I)\
++{\
++  unsigned int J;\
++  _BitScanForward((DWORD *) &J, X);\
++  I = (bindex_t)J;\
++}
++
++#elif USE_BUILTIN_FFS
++#define compute_bit2idx(X, I) I = ffs(X)-1
++
++#else
++#define compute_bit2idx(X, I)\
++{\
++  unsigned int Y = X - 1;\
++  unsigned int K = Y >> (16-4) & 16;\
++  unsigned int N = K;        Y >>= K;\
++  N += K = Y >> (8-3) &  8;  Y >>= K;\
++  N += K = Y >> (4-2) &  4;  Y >>= K;\
++  N += K = Y >> (2-1) &  2;  Y >>= K;\
++  N += K = Y >> (1-0) &  1;  Y >>= K;\
++  I = (bindex_t)(N + Y);\
++}
++#endif /* GNUC */
++
++
++/* ----------------------- Runtime Check Support ------------------------- */
++
++/*
++  For security, the main invariant is that malloc/free/etc never
++  writes to a static address other than malloc_state, unless static
++  malloc_state itself has been corrupted, which cannot occur via
++  malloc (because of these checks). In essence this means that we
++  believe all pointers, sizes, maps etc held in malloc_state, but
++  check all of those linked or offsetted from other embedded data
++  structures.  These checks are interspersed with main code in a way
++  that tends to minimize their run-time cost.
++
++  When FOOTERS is defined, in addition to range checking, we also
++  verify footer fields of inuse chunks, which can be used guarantee
++  that the mstate controlling malloc/free is intact.  This is a
++  streamlined version of the approach described by William Robertson
++  et al in "Run-time Detection of Heap-based Overflows" LISA'03
++  http://www.usenix.org/events/lisa03/tech/robertson.html The footer
++  of an inuse chunk holds the xor of its mstate and a random seed,
++  that is checked upon calls to free() and realloc().  This is
++  (probabalistically) unguessable from outside the program, but can be
++  computed by any code successfully malloc'ing any chunk, so does not
++  itself provide protection against code that has already broken
++  security through some other means.  Unlike Robertson et al, we
++  always dynamically check addresses of all offset chunks (previous,
++  next, etc). This turns out to be cheaper than relying on hashes.
++*/
++
++#if !INSECURE
++/* Check if address a is at least as high as any from MORECORE or MMAP */
++#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
++/* Check if address of next chunk n is higher than base chunk p */
++#define ok_next(p, n)    ((char*)(p) < (char*)(n))
++/* Check if p has inuse status */
++#define ok_inuse(p)     is_inuse(p)
++/* Check if p has its pinuse bit on */
++#define ok_pinuse(p)     pinuse(p)
++
++#else /* !INSECURE */
++#define ok_address(M, a) (1)
++#define ok_next(b, n)    (1)
++#define ok_inuse(p)      (1)
++#define ok_pinuse(p)     (1)
++#endif /* !INSECURE */
++
++#if (FOOTERS && !INSECURE)
++/* Check if (alleged) mstate m has expected magic field */
++#define ok_magic(M)      ((M)->magic == mparams.magic)
++#else  /* (FOOTERS && !INSECURE) */
++#define ok_magic(M)      (1)
++#endif /* (FOOTERS && !INSECURE) */
++
++/* In gcc, use __builtin_expect to minimize impact of checks */
++#if !INSECURE
++#if defined(__GNUC__) && __GNUC__ >= 3
++#define RTCHECK(e)  __builtin_expect(e, 1)
++#else /* GNUC */
++#define RTCHECK(e)  (e)
++#endif /* GNUC */
++#else /* !INSECURE */
++#define RTCHECK(e)  (1)
++#endif /* !INSECURE */
++
++/* macros to set up inuse chunks with or without footers */
++
++#if !FOOTERS
++
++#define mark_inuse_foot(M,p,s)
++
++/* Macros for setting head/foot of non-mmapped chunks */
++
++/* Set cinuse bit and pinuse bit of next chunk */
++#define set_inuse(M,p,s)\
++  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
++  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
++
++/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
++#define set_inuse_and_pinuse(M,p,s)\
++  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
++  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
++
++/* Set size, cinuse and pinuse bit of this chunk */
++#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
++  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
++
++#else /* FOOTERS */
++
++/* Set foot of inuse chunk to be xor of mstate and seed */
++#define mark_inuse_foot(M,p,s)\
++  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
++
++#define get_mstate_for(p)\
++  ((mstate)(((mchunkptr)((char*)(p) +\
++    (chunksize(p))))->prev_foot ^ mparams.magic))
++
++#define set_inuse(M,p,s)\
++  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
++  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
++  mark_inuse_foot(M,p,s))
++
++#define set_inuse_and_pinuse(M,p,s)\
++  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
++  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
++ mark_inuse_foot(M,p,s))
++
++#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
++  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
++  mark_inuse_foot(M, p, s))
++
++#endif /* !FOOTERS */
++
++/* ---------------------------- setting mparams -------------------------- */
++
++#if LOCK_AT_FORK
++static void pre_fork(void)         { ACQUIRE_LOCK(&(gm)->mutex); }
++static void post_fork_parent(void) { RELEASE_LOCK(&(gm)->mutex); }
++static void post_fork_child(void)  { INITIAL_LOCK(&(gm)->mutex); }
++#endif /* LOCK_AT_FORK */
++
++/* Initialize mparams */
++static int init_mparams(void) {
++  /* BEGIN android-added: move pthread_atfork outside of lock */
++  int first_run = 0;
++  /* END android-added */
++#ifdef NEED_GLOBAL_LOCK_INIT
++  if (malloc_global_mutex_status <= 0)
++    init_malloc_global_mutex();
++#endif
++
++  ACQUIRE_MALLOC_GLOBAL_LOCK();
++  if (mparams.magic == 0) {
++    size_t magic;
++    size_t psize;
++    size_t gsize;
++    /* BEGIN android-added: move pthread_atfork outside of lock */
++    first_run = 1;
++    /* END android-added */
++
++#ifndef WIN32
++    psize = malloc_getpagesize;
++    gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize);
++#else /* WIN32 */
++    {
++      SYSTEM_INFO system_info;
++      GetSystemInfo(&system_info);
++      psize = system_info.dwPageSize;
++      gsize = ((DEFAULT_GRANULARITY != 0)?
++               DEFAULT_GRANULARITY : system_info.dwAllocationGranularity);
++    }
++#endif /* WIN32 */
++
++    /* Sanity-check configuration:
++       size_t must be unsigned and as wide as pointer type.
++       ints must be at least 4 bytes.
++       alignment must be at least 8.
++       Alignment, min chunk size, and page size must all be powers of 2.
++    */
++    if ((sizeof(size_t) != sizeof(char*)) ||
++        (MAX_SIZE_T < MIN_CHUNK_SIZE)  ||
++        (sizeof(int) < 4)  ||
++        (MALLOC_ALIGNMENT < (size_t)8U) ||
++        ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) ||
++        ((MCHUNK_SIZE      & (MCHUNK_SIZE-SIZE_T_ONE))      != 0) ||
++        ((gsize            & (gsize-SIZE_T_ONE))            != 0) ||
++        ((psize            & (psize-SIZE_T_ONE))            != 0))
++      ABORT;
++    mparams.granularity = gsize;
++    mparams.page_size = psize;
++    mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
++    mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
++#if MORECORE_CONTIGUOUS
++    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
++#else  /* MORECORE_CONTIGUOUS */
++    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
++#endif /* MORECORE_CONTIGUOUS */
++
++#if !ONLY_MSPACES
++    /* Set up lock for main malloc area */
++    gm->mflags = mparams.default_mflags;
++    (void)INITIAL_LOCK(&gm->mutex);
++#endif
++    /* BEGIN android-removed: move pthread_atfork outside of lock */
++#if 0 && LOCK_AT_FORK
++    pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
++#endif
++    /* END android-removed */
++
++    {
++#if USE_DEV_RANDOM
++      int fd;
++      unsigned char buf[sizeof(size_t)];
++      /* Try to use /dev/urandom, else fall back on using time */
++      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
++          read(fd, buf, sizeof(buf)) == sizeof(buf)) {
++        magic = *((size_t *) buf);
++        close(fd);
++      }
++      else
++#endif /* USE_DEV_RANDOM */
++#ifdef WIN32
++      magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U);
++#elif defined(LACKS_TIME_H)
++      magic = (size_t)&magic ^ (size_t)0x55555555U;
++#else
++      magic = (size_t)(time(0) ^ (size_t)0x55555555U);
++#endif
++      magic |= (size_t)8U;    /* ensure nonzero */
++      magic &= ~(size_t)7U;   /* improve chances of fault for bad values */
++      /* Until memory modes commonly available, use volatile-write */
++      (*(volatile size_t *)(&(mparams.magic))) = magic;
++    }
++  }
++
++  RELEASE_MALLOC_GLOBAL_LOCK();
++  /* BEGIN android-added: move pthread_atfork outside of lock */
++  if (first_run != 0) {
++#if LOCK_AT_FORK
++    pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
++#endif
++  }
++  /* END android-added */
++  return 1;
++}
++
++/* support for mallopt */
++static int change_mparam(int param_number, int value) {
++  size_t val;
++  ensure_initialization();
++  val = (value == -1)? MAX_SIZE_T : (size_t)value;
++  switch(param_number) {
++  case M_TRIM_THRESHOLD:
++    mparams.trim_threshold = val;
++    return 1;
++  case M_GRANULARITY:
++    if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
++      mparams.granularity = val;
++      return 1;
++    }
++    else
++      return 0;
++  case M_MMAP_THRESHOLD:
++    mparams.mmap_threshold = val;
++    return 1;
++  default:
++    return 0;
++  }
++}
++
++#if DEBUG
++/* ------------------------- Debugging Support --------------------------- */
++
++/* Check properties of any chunk, whether free, inuse, mmapped etc  */
++static void do_check_any_chunk(mstate m, mchunkptr p) {
++  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
++  assert(ok_address(m, p));
++}
++
++/* Check properties of top chunk */
++static void do_check_top_chunk(mstate m, mchunkptr p) {
++  msegmentptr sp = segment_holding(m, (char*)p);
++  size_t  sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */
++  assert(sp != 0);
++  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
++  assert(ok_address(m, p));
++  assert(sz == m->topsize);
++  assert(sz > 0);
++  assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
++  assert(pinuse(p));
++  assert(!pinuse(chunk_plus_offset(p, sz)));
++}
++
++/* Check properties of (inuse) mmapped chunks */
++static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
++  size_t  sz = chunksize(p);
++  size_t len = (sz + (p->prev_foot) + MMAP_FOOT_PAD);
++  assert(is_mmapped(p));
++  assert(use_mmap(m));
++  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
++  assert(ok_address(m, p));
++  assert(!is_small(sz));
++  assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
++  assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
++  assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
++}
++
++/* Check properties of inuse chunks */
++static void do_check_inuse_chunk(mstate m, mchunkptr p) {
++  do_check_any_chunk(m, p);
++  assert(is_inuse(p));
++  assert(next_pinuse(p));
++  /* If not pinuse and not mmapped, previous chunk has OK offset */
++  assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
++  if (is_mmapped(p))
++    do_check_mmapped_chunk(m, p);
++}
++
++/* Check properties of free chunks */
++static void do_check_free_chunk(mstate m, mchunkptr p) {
++  size_t sz = chunksize(p);
++  mchunkptr next = chunk_plus_offset(p, sz);
++  do_check_any_chunk(m, p);
++  assert(!is_inuse(p));
++  assert(!next_pinuse(p));
++  assert (!is_mmapped(p));
++  if (p != m->dv && p != m->top) {
++    if (sz >= MIN_CHUNK_SIZE) {
++      assert((sz & CHUNK_ALIGN_MASK) == 0);
++      assert(is_aligned(chunk2mem(p)));
++      assert(next->prev_foot == sz);
++      assert(pinuse(p));
++      assert (next == m->top || is_inuse(next));
++      assert(p->fd->bk == p);
++      assert(p->bk->fd == p);
++    }
++    else  /* markers are always of size SIZE_T_SIZE */
++      assert(sz == SIZE_T_SIZE);
++  }
++}
++
++/* Check properties of malloced chunks at the point they are malloced */
++static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
++  if (mem != 0) {
++    mchunkptr p = mem2chunk(mem);
++    size_t sz = p->head & ~INUSE_BITS;
++    do_check_inuse_chunk(m, p);
++    assert((sz & CHUNK_ALIGN_MASK) == 0);
++    assert(sz >= MIN_CHUNK_SIZE);
++    assert(sz >= s);
++    /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
++    assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
++  }
++}
++
++/* Check a tree and its subtrees.  */
++static void do_check_tree(mstate m, tchunkptr t) {
++  tchunkptr head = 0;
++  tchunkptr u = t;
++  bindex_t tindex = t->index;
++  size_t tsize = chunksize(t);
++  bindex_t idx;
++  compute_tree_index(tsize, idx);
++  assert(tindex == idx);
++  assert(tsize >= MIN_LARGE_SIZE);
++  assert(tsize >= minsize_for_tree_index(idx));
++  assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
++
++  do { /* traverse through chain of same-sized nodes */
++    do_check_any_chunk(m, ((mchunkptr)u));
++    assert(u->index == tindex);
++    assert(chunksize(u) == tsize);
++    assert(!is_inuse(u));
++    assert(!next_pinuse(u));
++    assert(u->fd->bk == u);
++    assert(u->bk->fd == u);
++    if (u->parent == 0) {
++      assert(u->child[0] == 0);
++      assert(u->child[1] == 0);
++    }
++    else {
++      assert(head == 0); /* only one node on chain has parent */
++      head = u;
++      assert(u->parent != u);
++      assert (u->parent->child[0] == u ||
++              u->parent->child[1] == u ||
++              *((tbinptr*)(u->parent)) == u);
++      if (u->child[0] != 0) {
++        assert(u->child[0]->parent == u);
++        assert(u->child[0] != u);
++        do_check_tree(m, u->child[0]);
++      }
++      if (u->child[1] != 0) {
++        assert(u->child[1]->parent == u);
++        assert(u->child[1] != u);
++        do_check_tree(m, u->child[1]);
++      }
++      if (u->child[0] != 0 && u->child[1] != 0) {
++        assert(chunksize(u->child[0]) < chunksize(u->child[1]));
++      }
++    }
++    u = u->fd;
++  } while (u != t);
++  assert(head != 0);
++}
++
++/*  Check all the chunks in a treebin.  */
++static void do_check_treebin(mstate m, bindex_t i) {
++  tbinptr* tb = treebin_at(m, i);
++  tchunkptr t = *tb;
++  int empty = (m->treemap & (1U << i)) == 0;
++  if (t == 0)
++    assert(empty);
++  if (!empty)
++    do_check_tree(m, t);
++}
++
++/*  Check all the chunks in a smallbin.  */
++static void do_check_smallbin(mstate m, bindex_t i) {
++  sbinptr b = smallbin_at(m, i);
++  mchunkptr p = b->bk;
++  unsigned int empty = (m->smallmap & (1U << i)) == 0;
++  if (p == b)
++    assert(empty);
++  if (!empty) {
++    for (; p != b; p = p->bk) {
++      size_t size = chunksize(p);
++      mchunkptr q;
++      /* each chunk claims to be free */
++      do_check_free_chunk(m, p);
++      /* chunk belongs in bin */
++      assert(small_index(size) == i);
++      assert(p->bk == b || chunksize(p->bk) == chunksize(p));
++      /* chunk is followed by an inuse chunk */
++      q = next_chunk(p);
++      if (q->head != FENCEPOST_HEAD)
++        do_check_inuse_chunk(m, q);
++    }
++  }
++}
++
++/* Find x in a bin. Used in other check functions. */
++static int bin_find(mstate m, mchunkptr x) {
++  size_t size = chunksize(x);
++  if (is_small(size)) {
++    bindex_t sidx = small_index(size);
++    sbinptr b = smallbin_at(m, sidx);
++    if (smallmap_is_marked(m, sidx)) {
++      mchunkptr p = b;
++      do {
++        if (p == x)
++          return 1;
++      } while ((p = p->fd) != b);
++    }
++  }
++  else {
++    bindex_t tidx;
++    compute_tree_index(size, tidx);
++    if (treemap_is_marked(m, tidx)) {
++      tchunkptr t = *treebin_at(m, tidx);
++      size_t sizebits = size << leftshift_for_tree_index(tidx);
++      while (t != 0 && chunksize(t) != size) {
++        t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
++        sizebits <<= 1;
++      }
++      if (t != 0) {
++        tchunkptr u = t;
++        do {
++          if (u == (tchunkptr)x)
++            return 1;
++        } while ((u = u->fd) != t);
++      }
++    }
++  }
++  return 0;
++}
++
++/* Traverse each chunk and check it; return total */
++static size_t traverse_and_check(mstate m) {
++  size_t sum = 0;
++  if (is_initialized(m)) {
++    msegmentptr s = &m->seg;
++    sum += m->topsize + TOP_FOOT_SIZE;
++    while (s != 0) {
++      mchunkptr q = align_as_chunk(s->base);
++      mchunkptr lastq = 0;
++      assert(pinuse(q));
++      while (segment_holds(s, q) &&
++             q != m->top && q->head != FENCEPOST_HEAD) {
++        sum += chunksize(q);
++        if (is_inuse(q)) {
++          assert(!bin_find(m, q));
++          do_check_inuse_chunk(m, q);
++        }
++        else {
++          assert(q == m->dv || bin_find(m, q));
++          assert(lastq == 0 || is_inuse(lastq)); /* Not 2 consecutive free */
++          do_check_free_chunk(m, q);
++        }
++        lastq = q;
++        q = next_chunk(q);
++      }
++      s = s->next;
++    }
++  }
++  return sum;
++}
++
++
++/* Check all properties of malloc_state. */
++static void do_check_malloc_state(mstate m) {
++  bindex_t i;
++  size_t total;
++  /* check bins */
++  for (i = 0; i < NSMALLBINS; ++i)
++    do_check_smallbin(m, i);
++  for (i = 0; i < NTREEBINS; ++i)
++    do_check_treebin(m, i);
++
++  if (m->dvsize != 0) { /* check dv chunk */
++    do_check_any_chunk(m, m->dv);
++    assert(m->dvsize == chunksize(m->dv));
++    assert(m->dvsize >= MIN_CHUNK_SIZE);
++    assert(bin_find(m, m->dv) == 0);
++  }
++
++  if (m->top != 0) {   /* check top chunk */
++    do_check_top_chunk(m, m->top);
++    /*assert(m->topsize == chunksize(m->top)); redundant */
++    assert(m->topsize > 0);
++    assert(bin_find(m, m->top) == 0);
++  }
++
++  total = traverse_and_check(m);
++  assert(total <= m->footprint);
++  assert(m->footprint <= m->max_footprint);
++}
++#endif /* DEBUG */
++
++/* ----------------------------- statistics ------------------------------ */
++
++#if !NO_MALLINFO
++static struct mallinfo internal_mallinfo(mstate m) {
++  struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
++  ensure_initialization();
++  if (!PREACTION(m)) {
++    check_malloc_state(m);
++    if (is_initialized(m)) {
++      size_t nfree = SIZE_T_ONE; /* top always free */
++      size_t mfree = m->topsize + TOP_FOOT_SIZE;
++      size_t sum = mfree;
++      msegmentptr s = &m->seg;
++      while (s != 0) {
++        mchunkptr q = align_as_chunk(s->base);
++        while (segment_holds(s, q) &&
++               q != m->top && q->head != FENCEPOST_HEAD) {
++          size_t sz = chunksize(q);
++          sum += sz;
++          if (!is_inuse(q)) {
++            mfree += sz;
++            ++nfree;
++          }
++          q = next_chunk(q);
++        }
++        s = s->next;
++      }
++
++      nm.arena    = sum;
++      nm.ordblks  = nfree;
++      nm.hblkhd   = m->footprint - sum;
++      /* BEGIN android-changed: usmblks set to footprint from max_footprint */
++      nm.usmblks  = m->footprint;
++      /* END android-changed */
++      nm.uordblks = m->footprint - mfree;
++      nm.fordblks = mfree;
++      nm.keepcost = m->topsize;
++    }
++
++    POSTACTION(m);
++  }
++  return nm;
++}
++#endif /* !NO_MALLINFO */
++
++#if !NO_MALLOC_STATS
++static void internal_malloc_stats(mstate m) {
++  ensure_initialization();
++  if (!PREACTION(m)) {
++    size_t maxfp = 0;
++    size_t fp = 0;
++    size_t used = 0;
++    check_malloc_state(m);
++    if (is_initialized(m)) {
++      msegmentptr s = &m->seg;
++      maxfp = m->max_footprint;
++      fp = m->footprint;
++      used = fp - (m->topsize + TOP_FOOT_SIZE);
++
++      while (s != 0) {
++        mchunkptr q = align_as_chunk(s->base);
++        while (segment_holds(s, q) &&
++               q != m->top && q->head != FENCEPOST_HEAD) {
++          if (!is_inuse(q))
++            used -= chunksize(q);
++          q = next_chunk(q);
++        }
++        s = s->next;
++      }
++    }
++    POSTACTION(m); /* drop lock */
++    fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
++    fprintf(stderr, "system bytes     = %10lu\n", (unsigned long)(fp));
++    fprintf(stderr, "in use bytes     = %10lu\n", (unsigned long)(used));
++  }
++}
++#endif /* NO_MALLOC_STATS */
++
++/* ----------------------- Operations on smallbins ----------------------- */
++
++/*
++  Various forms of linking and unlinking are defined as macros.  Even
++  the ones for trees, which are very long but have very short typical
++  paths.  This is ugly but reduces reliance on inlining support of
++  compilers.
++*/
++
++/* Link a free chunk into a smallbin  */
++#define insert_small_chunk(M, P, S) {\
++  bindex_t I  = small_index(S);\
++  mchunkptr B = smallbin_at(M, I);\
++  mchunkptr F = B;\
++  assert(S >= MIN_CHUNK_SIZE);\
++  if (!smallmap_is_marked(M, I))\
++    mark_smallmap(M, I);\
++  else if (RTCHECK(ok_address(M, B->fd)))\
++    F = B->fd;\
++  else {\
++    CORRUPTION_ERROR_ACTION(M);\
++  }\
++  B->fd = P;\
++  F->bk = P;\
++  P->fd = F;\
++  P->bk = B;\
++}
++
++/* Unlink a chunk from a smallbin  */
++#define unlink_small_chunk(M, P, S) {\
++  mchunkptr F = P->fd;\
++  mchunkptr B = P->bk;\
++  bindex_t I = small_index(S);\
++  assert(P != B);\
++  assert(P != F);\
++  assert(chunksize(P) == small_index2size(I));\
++  if (RTCHECK(F == smallbin_at(M,I) || (ok_address(M, F) && F->bk == P))) { \
++    if (B == F) {\
++      clear_smallmap(M, I);\
++    }\
++    else if (RTCHECK(B == smallbin_at(M,I) ||\
++                     (ok_address(M, B) && B->fd == P))) {\
++      F->bk = B;\
++      B->fd = F;\
++    }\
++    else {\
++      CORRUPTION_ERROR_ACTION(M);\
++    }\
++  }\
++  else {\
++    CORRUPTION_ERROR_ACTION(M);\
++  }\
++}
++
++/* Unlink the first chunk from a smallbin */
++#define unlink_first_small_chunk(M, B, P, I) {\
++  mchunkptr F = P->fd;\
++  assert(P != B);\
++  assert(P != F);\
++  assert(chunksize(P) == small_index2size(I));\
++  if (B == F) {\
++    clear_smallmap(M, I);\
++  }\
++  else if (RTCHECK(ok_address(M, F) && F->bk == P)) {\
++    F->bk = B;\
++    B->fd = F;\
++  }\
++  else {\
++    CORRUPTION_ERROR_ACTION(M);\
++  }\
++}
++
++/* Replace dv node, binning the old one */
++/* Used only when dvsize known to be small */
++#define replace_dv(M, P, S) {\
++  size_t DVS = M->dvsize;\
++  assert(is_small(DVS));\
++  if (DVS != 0) {\
++    mchunkptr DV = M->dv;\
++    insert_small_chunk(M, DV, DVS);\
++  }\
++  M->dvsize = S;\
++  M->dv = P;\
++}
++
++/* ------------------------- Operations on trees ------------------------- */
++
++/* Insert chunk into tree */
++#define insert_large_chunk(M, X, S) {\
++  tbinptr* H;\
++  bindex_t I;\
++  compute_tree_index(S, I);\
++  H = treebin_at(M, I);\
++  X->index = I;\
++  X->child[0] = X->child[1] = 0;\
++  if (!treemap_is_marked(M, I)) {\
++    mark_treemap(M, I);\
++    *H = X;\
++    X->parent = (tchunkptr)H;\
++    X->fd = X->bk = X;\
++  }\
++  else {\
++    tchunkptr T = *H;\
++    size_t K = S << leftshift_for_tree_index(I);\
++    for (;;) {\
++      if (chunksize(T) != S) {\
++        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
++        K <<= 1;\
++        if (*C != 0)\
++          T = *C;\
++        else if (RTCHECK(ok_address(M, C))) {\
++          *C = X;\
++          X->parent = T;\
++          X->fd = X->bk = X;\
++          break;\
++        }\
++        else {\
++          CORRUPTION_ERROR_ACTION(M);\
++          break;\
++        }\
++      }\
++      else {\
++        tchunkptr F = T->fd;\
++        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
++          T->fd = F->bk = X;\
++          X->fd = F;\
++          X->bk = T;\
++          X->parent = 0;\
++          break;\
++        }\
++        else {\
++          CORRUPTION_ERROR_ACTION(M);\
++          break;\
++        }\
++      }\
++    }\
++  }\
++}
++
++/*
++  Unlink steps:
++
++  1. If x is a chained node, unlink it from its same-sized fd/bk links
++     and choose its bk node as its replacement.
++  2. If x was the last node of its size, but not a leaf node, it must
++     be replaced with a leaf node (not merely one with an open left or
++     right), to make sure that lefts and rights of descendents
++     correspond properly to bit masks.  We use the rightmost descendent
++     of x.  We could use any other leaf, but this is easy to locate and
++     tends to counteract removal of leftmosts elsewhere, and so keeps
++     paths shorter than minimally guaranteed.  This doesn't loop much
++     because on average a node in a tree is near the bottom.
++  3. If x is the base of a chain (i.e., has parent links) relink
++     x's parent and children to x's replacement (or null if none).
++*/
++
++#define unlink_large_chunk(M, X) {\
++  tchunkptr XP = X->parent;\
++  tchunkptr R;\
++  if (X->bk != X) {\
++    tchunkptr F = X->fd;\
++    R = X->bk;\
++    if (RTCHECK(ok_address(M, F) && F->bk == X && R->fd == X)) {\
++      F->bk = R;\
++      R->fd = F;\
++    }\
++    else {\
++      CORRUPTION_ERROR_ACTION(M);\
++    }\
++  }\
++  else {\
++    tchunkptr* RP;\
++    if (((R = *(RP = &(X->child[1]))) != 0) ||\
++        ((R = *(RP = &(X->child[0]))) != 0)) {\
++      tchunkptr* CP;\
++      while ((*(CP = &(R->child[1])) != 0) ||\
++             (*(CP = &(R->child[0])) != 0)) {\
++        R = *(RP = CP);\
++      }\
++      if (RTCHECK(ok_address(M, RP)))\
++        *RP = 0;\
++      else {\
++        CORRUPTION_ERROR_ACTION(M);\
++      }\
++    }\
++  }\
++  if (XP != 0) {\
++    tbinptr* H = treebin_at(M, X->index);\
++    if (X == *H) {\
++      if ((*H = R) == 0) \
++        clear_treemap(M, X->index);\
++    }\
++    else if (RTCHECK(ok_address(M, XP))) {\
++      if (XP->child[0] == X) \
++        XP->child[0] = R;\
++      else \
++        XP->child[1] = R;\
++    }\
++    else\
++      CORRUPTION_ERROR_ACTION(M);\
++    if (R != 0) {\
++      if (RTCHECK(ok_address(M, R))) {\
++        tchunkptr C0, C1;\
++        R->parent = XP;\
++        if ((C0 = X->child[0]) != 0) {\
++          if (RTCHECK(ok_address(M, C0))) {\
++            R->child[0] = C0;\
++            C0->parent = R;\
++          }\
++          else\
++            CORRUPTION_ERROR_ACTION(M);\
++        }\
++        if ((C1 = X->child[1]) != 0) {\
++          if (RTCHECK(ok_address(M, C1))) {\
++            R->child[1] = C1;\
++            C1->parent = R;\
++          }\
++          else\
++            CORRUPTION_ERROR_ACTION(M);\
++        }\
++      }\
++      else\
++        CORRUPTION_ERROR_ACTION(M);\
++    }\
++  }\
++}
++
++/* Relays to large vs small bin operations */
++
++#define insert_chunk(M, P, S)\
++  if (is_small(S)) insert_small_chunk(M, P, S)\
++  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
++
++#define unlink_chunk(M, P, S)\
++  if (is_small(S)) unlink_small_chunk(M, P, S)\
++  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
++
++
++/* Relays to internal calls to malloc/free from realloc, memalign etc */
++
++#if ONLY_MSPACES
++#define internal_malloc(m, b) mspace_malloc(m, b)
++#define internal_free(m, mem) mspace_free(m,mem);
++#else /* ONLY_MSPACES */
++#if MSPACES
++#define internal_malloc(m, b)\
++  ((m == gm)? dlmalloc(b) : mspace_malloc(m, b))
++#define internal_free(m, mem)\
++   if (m == gm) dlfree(mem); else mspace_free(m,mem);
++#else /* MSPACES */
++#define internal_malloc(m, b) dlmalloc(b)
++#define internal_free(m, mem) dlfree(mem)
++#endif /* MSPACES */
++#endif /* ONLY_MSPACES */
++
++/* -----------------------  Direct-mmapping chunks ----------------------- */
++
++/*
++  Directly mmapped chunks are set up with an offset to the start of
++  the mmapped region stored in the prev_foot field of the chunk. This
++  allows reconstruction of the required argument to MUNMAP when freed,
++  and also allows adjustment of the returned chunk to meet alignment
++  requirements (especially in memalign).
++*/
++
++/* Malloc using mmap */
++static void* mmap_alloc(mstate m, size_t nb) {
++  size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
++  if (m->footprint_limit != 0) {
++    size_t fp = m->footprint + mmsize;
++    if (fp <= m->footprint || fp > m->footprint_limit)
++      return 0;
++  }
++  if (mmsize > nb) {     /* Check for wrap around 0 */
++    char* mm = (char*)(CALL_DIRECT_MMAP(mmsize));
++    if (mm != CMFAIL) {
++      size_t offset = align_offset(chunk2mem(mm));
++      size_t psize = mmsize - offset - MMAP_FOOT_PAD;
++      mchunkptr p = (mchunkptr)(mm + offset);
++      p->prev_foot = offset;
++      p->head = psize;
++      mark_inuse_foot(m, p, psize);
++      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
++      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
++
++      if (m->least_addr == 0 || mm < m->least_addr)
++        m->least_addr = mm;
++      if ((m->footprint += mmsize) > m->max_footprint)
++        m->max_footprint = m->footprint;
++      assert(is_aligned(chunk2mem(p)));
++      check_mmapped_chunk(m, p);
++      return chunk2mem(p);
++    }
++  }
++  return 0;
++}
++
++/* Realloc using mmap */
++static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb, int flags) {
++  size_t oldsize = chunksize(oldp);
++  (void)flags; /* placate people compiling -Wunused */
++  if (is_small(nb)) /* Can't shrink mmap regions below small size */
++    return 0;
++  /* Keep old chunk if big enough but not too big */
++  if (oldsize >= nb + SIZE_T_SIZE &&
++      (oldsize - nb) <= (mparams.granularity << 1))
++    return oldp;
++  else {
++    size_t offset = oldp->prev_foot;
++    size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
++    size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
++    char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
++                                  oldmmsize, newmmsize, flags);
++    if (cp != CMFAIL) {
++      mchunkptr newp = (mchunkptr)(cp + offset);
++      size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
++      newp->head = psize;
++      mark_inuse_foot(m, newp, psize);
++      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
++      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
++
++      if (cp < m->least_addr)
++        m->least_addr = cp;
++      if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
++        m->max_footprint = m->footprint;
++      check_mmapped_chunk(m, newp);
++      return newp;
++    }
++  }
++  return 0;
++}
++
++
++/* -------------------------- mspace management -------------------------- */
++
++/* Initialize top chunk and its size */
++static void init_top(mstate m, mchunkptr p, size_t psize) {
++  /* Ensure alignment */
++  size_t offset = align_offset(chunk2mem(p));
++  p = (mchunkptr)((char*)p + offset);
++  psize -= offset;
++
++  m->top = p;
++  m->topsize = psize;
++  p->head = psize | PINUSE_BIT;
++  /* set size of fake trailing chunk holding overhead space only once */
++  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
++  m->trim_check = mparams.trim_threshold; /* reset on each update */
++}
++
++/* Initialize bins for a new mstate that is otherwise zeroed out */
++static void init_bins(mstate m) {
++  /* Establish circular links for smallbins */
++  bindex_t i;
++  for (i = 0; i < NSMALLBINS; ++i) {
++    sbinptr bin = smallbin_at(m,i);
++    bin->fd = bin->bk = bin;
++  }
++}
++
++#if PROCEED_ON_ERROR
++
++/* default corruption action */
++static void reset_on_error(mstate m) {
++  int i;
++  ++malloc_corruption_error_count;
++  /* Reinitialize fields to forget about all memory */
++  m->smallmap = m->treemap = 0;
++  m->dvsize = m->topsize = 0;
++  m->seg.base = 0;
++  m->seg.size = 0;
++  m->seg.next = 0;
++  m->top = m->dv = 0;
++  for (i = 0; i < NTREEBINS; ++i)
++    *treebin_at(m, i) = 0;
++  init_bins(m);
++}
++#endif /* PROCEED_ON_ERROR */
++
++/* Allocate chunk and prepend remainder with chunk in successor base. */
++static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
++                           size_t nb) {
++  mchunkptr p = align_as_chunk(newbase);
++  mchunkptr oldfirst = align_as_chunk(oldbase);
++  size_t psize = (char*)oldfirst - (char*)p;
++  mchunkptr q = chunk_plus_offset(p, nb);
++  size_t qsize = psize - nb;
++  set_size_and_pinuse_of_inuse_chunk(m, p, nb);
++
++  assert((char*)oldfirst > (char*)q);
++  assert(pinuse(oldfirst));
++  assert(qsize >= MIN_CHUNK_SIZE);
++
++  /* consolidate remainder with first chunk of old base */
++  if (oldfirst == m->top) {
++    size_t tsize = m->topsize += qsize;
++    m->top = q;
++    q->head = tsize | PINUSE_BIT;
++    check_top_chunk(m, q);
++  }
++  else if (oldfirst == m->dv) {
++    size_t dsize = m->dvsize += qsize;
++    m->dv = q;
++    set_size_and_pinuse_of_free_chunk(q, dsize);
++  }
++  else {
++    if (!is_inuse(oldfirst)) {
++      size_t nsize = chunksize(oldfirst);
++      unlink_chunk(m, oldfirst, nsize);
++      oldfirst = chunk_plus_offset(oldfirst, nsize);
++      qsize += nsize;
++    }
++    set_free_with_pinuse(q, qsize, oldfirst);
++    insert_chunk(m, q, qsize);
++    check_free_chunk(m, q);
++  }
++
++  check_malloced_chunk(m, chunk2mem(p), nb);
++  return chunk2mem(p);
++}
++
++/* Add a segment to hold a new noncontiguous region */
++static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
++  /* Determine locations and sizes of segment, fenceposts, old top */
++  char* old_top = (char*)m->top;
++  msegmentptr oldsp = segment_holding(m, old_top);
++  char* old_end = oldsp->base + oldsp->size;
++  size_t ssize = pad_request(sizeof(struct malloc_segment));
++  char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
++  size_t offset = align_offset(chunk2mem(rawsp));
++  char* asp = rawsp + offset;
++  char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
++  mchunkptr sp = (mchunkptr)csp;
++  msegmentptr ss = (msegmentptr)(chunk2mem(sp));
++  mchunkptr tnext = chunk_plus_offset(sp, ssize);
++  mchunkptr p = tnext;
++  int nfences = 0;
++
++  /* reset top to new space */
++  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
++
++  /* Set up segment record */
++  assert(is_aligned(ss));
++  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
++  *ss = m->seg; /* Push current record */
++  m->seg.base = tbase;
++  m->seg.size = tsize;
++  m->seg.sflags = mmapped;
++  m->seg.next = ss;
++
++  /* Insert trailing fenceposts */
++  for (;;) {
++    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
++    p->head = FENCEPOST_HEAD;
++    ++nfences;
++    if ((char*)(&(nextp->head)) < old_end)
++      p = nextp;
++    else
++      break;
++  }
++  assert(nfences >= 2);
++
++  /* Insert the rest of old top into a bin as an ordinary free chunk */
++  if (csp != old_top) {
++    mchunkptr q = (mchunkptr)old_top;
++    size_t psize = csp - old_top;
++    mchunkptr tn = chunk_plus_offset(q, psize);
++    set_free_with_pinuse(q, psize, tn);
++    insert_chunk(m, q, psize);
++  }
++
++  check_top_chunk(m, m->top);
++}
++
++/* -------------------------- System allocation -------------------------- */
++
++/* Get memory from system using MORECORE or MMAP */
++static void* sys_alloc(mstate m, size_t nb) {
++  char* tbase = CMFAIL;
++  size_t tsize = 0;
++  flag_t mmap_flag = 0;
++  size_t asize; /* allocation size */
++
++  ensure_initialization();
++
++  /* Directly map large chunks, but only if already initialized */
++  if (use_mmap(m) && nb >= mparams.mmap_threshold && m->topsize != 0) {
++    void* mem = mmap_alloc(m, nb);
++    if (mem != 0)
++      return mem;
++  }
++
++  asize = granularity_align(nb + SYS_ALLOC_PADDING);
++  if (asize <= nb) {
++    /* BEGIN android-added: set errno */
++    MALLOC_FAILURE_ACTION;
++    /* END android-added */
++    return 0; /* wraparound */
++  }
++  if (m->footprint_limit != 0) {
++    size_t fp = m->footprint + asize;
++    if (fp <= m->footprint || fp > m->footprint_limit) {
++      /* BEGIN android-added: set errno */
++      MALLOC_FAILURE_ACTION;
++      /* END android-added */
++      return 0;
++    }
++  }
++
++  /*
++    Try getting memory in any of three ways (in most-preferred to
++    least-preferred order):
++    1. A call to MORECORE that can normally contiguously extend memory.
++       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
++       or main space is mmapped or a previous contiguous call failed)
++    2. A call to MMAP new space (disabled if not HAVE_MMAP).
++       Note that under the default settings, if MORECORE is unable to
++       fulfill a request, and HAVE_MMAP is true, then mmap is
++       used as a noncontiguous system allocator. This is a useful backup
++       strategy for systems with holes in address spaces -- in this case
++       sbrk cannot contiguously expand the heap, but mmap may be able to
++       find space.
++    3. A call to MORECORE that cannot usually contiguously extend memory.
++       (disabled if not HAVE_MORECORE)
++
++   In all cases, we need to request enough bytes from system to ensure
++   we can malloc nb bytes upon success, so pad with enough space for
++   top_foot, plus alignment-pad to make sure we don't lose bytes if
++   not on boundary, and round this up to a granularity unit.
++  */
++
++  if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
++    char* br = CMFAIL;
++    size_t ssize = asize; /* sbrk call size */
++    msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
++    ACQUIRE_MALLOC_GLOBAL_LOCK();
++
++    if (ss == 0) {  /* First time through or recovery */
++      char* base = (char*)CALL_MORECORE(0);
++      if (base != CMFAIL) {
++        size_t fp;
++        /* Adjust to end on a page boundary */
++        if (!is_page_aligned(base))
++          ssize += (page_align((size_t)base) - (size_t)base);
++        fp = m->footprint + ssize; /* recheck limits */
++        if (ssize > nb && ssize < HALF_MAX_SIZE_T &&
++            (m->footprint_limit == 0 ||
++             (fp > m->footprint && fp <= m->footprint_limit)) &&
++            (br = (char*)(CALL_MORECORE(ssize))) == base) {
++          tbase = base;
++          tsize = ssize;
++        }
++      }
++    }
++    else {
++      /* Subtract out existing available top space from MORECORE request. */
++      ssize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING);
++      /* Use mem here only if it did continuously extend old space */
++      if (ssize < HALF_MAX_SIZE_T &&
++          (br = (char*)(CALL_MORECORE(ssize))) == ss->base+ss->size) {
++        tbase = br;
++        tsize = ssize;
++      }
++    }
++
++    if (tbase == CMFAIL) {    /* Cope with partial failure */
++      if (br != CMFAIL) {    /* Try to use/extend the space we did get */
++        if (ssize < HALF_MAX_SIZE_T &&
++            ssize < nb + SYS_ALLOC_PADDING) {
++          size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - ssize);
++          if (esize < HALF_MAX_SIZE_T) {
++            char* end = (char*)CALL_MORECORE(esize);
++            if (end != CMFAIL)
++              ssize += esize;
++            else {            /* Can't use; try to release */
++              (void) CALL_MORECORE(-ssize);
++              br = CMFAIL;
++            }
++          }
++        }
++      }
++      if (br != CMFAIL) {    /* Use the space we did get */
++        tbase = br;
++        tsize = ssize;
++      }
++      else
++        disable_contiguous(m); /* Don't try contiguous path in the future */
++    }
++
++    RELEASE_MALLOC_GLOBAL_LOCK();
++  }
++
++  if (HAVE_MMAP && tbase == CMFAIL) {  /* Try MMAP */
++    char* mp = (char*)(CALL_MMAP(asize));
++    if (mp != CMFAIL) {
++      tbase = mp;
++      tsize = asize;
++      mmap_flag = USE_MMAP_BIT;
++    }
++  }
++
++  if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
++    if (asize < HALF_MAX_SIZE_T) {
++      char* br = CMFAIL;
++      char* end = CMFAIL;
++      ACQUIRE_MALLOC_GLOBAL_LOCK();
++      br = (char*)(CALL_MORECORE(asize));
++      end = (char*)(CALL_MORECORE(0));
++      RELEASE_MALLOC_GLOBAL_LOCK();
++      if (br != CMFAIL && end != CMFAIL && br < end) {
++        size_t ssize = end - br;
++        if (ssize > nb + TOP_FOOT_SIZE) {
++          tbase = br;
++          tsize = ssize;
++        }
++      }
++    }
++  }
++
++  if (tbase != CMFAIL) {
++
++    if ((m->footprint += tsize) > m->max_footprint)
++      m->max_footprint = m->footprint;
++
++    if (!is_initialized(m)) { /* first-time initialization */
++      if (m->least_addr == 0 || tbase < m->least_addr)
++        m->least_addr = tbase;
++      m->seg.base = tbase;
++      m->seg.size = tsize;
++      m->seg.sflags = mmap_flag;
++      m->magic = mparams.magic;
++      m->release_checks = MAX_RELEASE_CHECK_RATE;
++      init_bins(m);
++#if !ONLY_MSPACES
++      if (is_global(m))
++        init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
++      else
++#endif
++      {
++        /* Offset top by embedded malloc_state */
++        mchunkptr mn = next_chunk(mem2chunk(m));
++        init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
++      }
++    }
++
++    else {
++      /* Try to merge with an existing segment */
++      msegmentptr sp = &m->seg;
++      /* Only consider most recent segment if traversal suppressed */
++      while (sp != 0 && tbase != sp->base + sp->size)
++        sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
++      if (sp != 0 &&
++          !is_extern_segment(sp) &&
++          (sp->sflags & USE_MMAP_BIT) == mmap_flag &&
++          segment_holds(sp, m->top)) { /* append */
++        sp->size += tsize;
++        init_top(m, m->top, m->topsize + tsize);
++      }
++      else {
++        if (tbase < m->least_addr)
++          m->least_addr = tbase;
++        sp = &m->seg;
++        while (sp != 0 && sp->base != tbase + tsize)
++          sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
++        if (sp != 0 &&
++            !is_extern_segment(sp) &&
++            (sp->sflags & USE_MMAP_BIT) == mmap_flag) {
++          char* oldbase = sp->base;
++          sp->base = tbase;
++          sp->size += tsize;
++          return prepend_alloc(m, tbase, oldbase, nb);
++        }
++        else
++          add_segment(m, tbase, tsize, mmap_flag);
++      }
++    }
++
++    if (nb < m->topsize) { /* Allocate from new or extended top space */
++      size_t rsize = m->topsize -= nb;
++      mchunkptr p = m->top;
++      mchunkptr r = m->top = chunk_plus_offset(p, nb);
++      r->head = rsize | PINUSE_BIT;
++      set_size_and_pinuse_of_inuse_chunk(m, p, nb);
++      check_top_chunk(m, m->top);
++      check_malloced_chunk(m, chunk2mem(p), nb);
++      return chunk2mem(p);
++    }
++  }
++
++  MALLOC_FAILURE_ACTION;
++  return 0;
++}
++
++/* -----------------------  system deallocation -------------------------- */
++
++/* Unmap and unlink any mmapped segments that don't contain used chunks */
++static size_t release_unused_segments(mstate m) {
++  size_t released = 0;
++  int nsegs = 0;
++  msegmentptr pred = &m->seg;
++  msegmentptr sp = pred->next;
++  while (sp != 0) {
++    char* base = sp->base;
++    size_t size = sp->size;
++    msegmentptr next = sp->next;
++    ++nsegs;
++    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
++      mchunkptr p = align_as_chunk(base);
++      size_t psize = chunksize(p);
++      /* Can unmap if first chunk holds entire segment and not pinned */
++      if (!is_inuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
++        tchunkptr tp = (tchunkptr)p;
++        assert(segment_holds(sp, (char*)sp));
++        if (p == m->dv) {
++          m->dv = 0;
++          m->dvsize = 0;
++        }
++        else {
++          unlink_large_chunk(m, tp);
++        }
++        if (CALL_MUNMAP(base, size) == 0) {
++          released += size;
++          m->footprint -= size;
++          /* unlink obsoleted record */
++          sp = pred;
++          sp->next = next;
++        }
++        else { /* back out if cannot unmap */
++          insert_large_chunk(m, tp, psize);
++        }
++      }
++    }
++    if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */
++      break;
++    pred = sp;
++    sp = next;
++  }
++  /* Reset check counter */
++  m->release_checks = (((size_t) nsegs > (size_t) MAX_RELEASE_CHECK_RATE)?
++                       (size_t) nsegs : (size_t) MAX_RELEASE_CHECK_RATE);
++  return released;
++}
++
++static int sys_trim(mstate m, size_t pad) {
++  size_t released = 0;
++  ensure_initialization();
++  if (pad < MAX_REQUEST && is_initialized(m)) {
++    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
++
++    if (m->topsize > pad) {
++      /* Shrink top space in granularity-size units, keeping at least one */
++      size_t unit = mparams.granularity;
++      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
++                      SIZE_T_ONE) * unit;
++      msegmentptr sp = segment_holding(m, (char*)m->top);
++
++      if (!is_extern_segment(sp)) {
++        if (is_mmapped_segment(sp)) {
++          if (HAVE_MMAP &&
++              sp->size >= extra &&
++              !has_segment_link(m, sp)) { /* can't shrink if pinned */
++            size_t newsize = sp->size - extra;
++            (void)newsize; /* placate people compiling -Wunused-variable */
++            /* Prefer mremap, fall back to munmap */
++            if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
++                (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
++              released = extra;
++            }
++          }
++        }
++        else if (HAVE_MORECORE) {
++          if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
++            extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
++          ACQUIRE_MALLOC_GLOBAL_LOCK();
++          {
++            /* Make sure end of memory is where we last set it. */
++            char* old_br = (char*)(CALL_MORECORE(0));
++            if (old_br == sp->base + sp->size) {
++              char* rel_br = (char*)(CALL_MORECORE(-extra));
++              char* new_br = (char*)(CALL_MORECORE(0));
++              if (rel_br != CMFAIL && new_br < old_br)
++                released = old_br - new_br;
++            }
++          }
++          RELEASE_MALLOC_GLOBAL_LOCK();
++        }
++      }
++
++      if (released != 0) {
++        sp->size -= released;
++        m->footprint -= released;
++        init_top(m, m->top, m->topsize - released);
++        check_top_chunk(m, m->top);
++      }
++    }
++
++    /* Unmap any unused mmapped segments */
++    if (HAVE_MMAP)
++      released += release_unused_segments(m);
++
++    /* On failure, disable autotrim to avoid repeated failed future calls */
++    if (released == 0 && m->topsize > m->trim_check)
++      m->trim_check = MAX_SIZE_T;
++  }
++
++  return (released != 0)? 1 : 0;
++}
++
++/* Consolidate and bin a chunk. Differs from exported versions
++   of free mainly in that the chunk need not be marked as inuse.
++*/
++static void dispose_chunk(mstate m, mchunkptr p, size_t psize) {
++  mchunkptr next = chunk_plus_offset(p, psize);
++  if (!pinuse(p)) {
++    mchunkptr prev;
++    size_t prevsize = p->prev_foot;
++    if (is_mmapped(p)) {
++      psize += prevsize + MMAP_FOOT_PAD;
++      if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
++        m->footprint -= psize;
++      return;
++    }
++    prev = chunk_minus_offset(p, prevsize);
++    psize += prevsize;
++    p = prev;
++    if (RTCHECK(ok_address(m, prev))) { /* consolidate backward */
++      if (p != m->dv) {
++        unlink_chunk(m, p, prevsize);
++      }
++      else if ((next->head & INUSE_BITS) == INUSE_BITS) {
++        m->dvsize = psize;
++        set_free_with_pinuse(p, psize, next);
++        return;
++      }
++    }
++    else {
++      CORRUPTION_ERROR_ACTION(m);
++      return;
++    }
++  }
++  if (RTCHECK(ok_address(m, next))) {
++    if (!cinuse(next)) {  /* consolidate forward */
++      if (next == m->top) {
++        size_t tsize = m->topsize += psize;
++        m->top = p;
++        p->head = tsize | PINUSE_BIT;
++        if (p == m->dv) {
++          m->dv = 0;
++          m->dvsize = 0;
++        }
++        return;
++      }
++      else if (next == m->dv) {
++        size_t dsize = m->dvsize += psize;
++        m->dv = p;
++        set_size_and_pinuse_of_free_chunk(p, dsize);
++        return;
++      }
++      else {
++        size_t nsize = chunksize(next);
++        psize += nsize;
++        unlink_chunk(m, next, nsize);
++        set_size_and_pinuse_of_free_chunk(p, psize);
++        if (p == m->dv) {
++          m->dvsize = psize;
++          return;
++        }
++      }
++    }
++    else {
++      set_free_with_pinuse(p, psize, next);
++    }
++    insert_chunk(m, p, psize);
++  }
++  else {
++    CORRUPTION_ERROR_ACTION(m);
++  }
++}
++
++/* ---------------------------- malloc --------------------------- */
++
++/* allocate a large request from the best fitting chunk in a treebin */
++static void* tmalloc_large(mstate m, size_t nb) {
++  tchunkptr v = 0;
++  size_t rsize = -nb; /* Unsigned negation */
++  tchunkptr t;
++  bindex_t idx;
++  compute_tree_index(nb, idx);
++  if ((t = *treebin_at(m, idx)) != 0) {
++    /* Traverse tree for this bin looking for node with size == nb */
++    size_t sizebits = nb << leftshift_for_tree_index(idx);
++    tchunkptr rst = 0;  /* The deepest untaken right subtree */
++    for (;;) {
++      tchunkptr rt;
++      size_t trem = chunksize(t) - nb;
++      if (trem < rsize) {
++        v = t;
++        if ((rsize = trem) == 0)
++          break;
++      }
++      rt = t->child[1];
++      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
++      if (rt != 0 && rt != t)
++        rst = rt;
++      if (t == 0) {
++        t = rst; /* set t to least subtree holding sizes > nb */
++        break;
++      }
++      sizebits <<= 1;
++    }
++  }
++  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
++    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
++    if (leftbits != 0) {
++      bindex_t i;
++      binmap_t leastbit = least_bit(leftbits);
++      compute_bit2idx(leastbit, i);
++      t = *treebin_at(m, i);
++    }
++  }
++
++  while (t != 0) { /* find smallest of tree or subtree */
++    size_t trem = chunksize(t) - nb;
++    if (trem < rsize) {
++      rsize = trem;
++      v = t;
++    }
++    t = leftmost_child(t);
++  }
++
++  /*  If dv is a better fit, return 0 so malloc will use it */
++  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
++    if (RTCHECK(ok_address(m, v))) { /* split */
++      mchunkptr r = chunk_plus_offset(v, nb);
++      assert(chunksize(v) == rsize + nb);
++      if (RTCHECK(ok_next(v, r))) {
++        unlink_large_chunk(m, v);
++        if (rsize < MIN_CHUNK_SIZE)
++          set_inuse_and_pinuse(m, v, (rsize + nb));
++        else {
++          set_size_and_pinuse_of_inuse_chunk(m, v, nb);
++          set_size_and_pinuse_of_free_chunk(r, rsize);
++          insert_chunk(m, r, rsize);
++        }
++        return chunk2mem(v);
++      }
++    }
++    CORRUPTION_ERROR_ACTION(m);
++  }
++  return 0;
++}
++
++/* allocate a small request from the best fitting chunk in a treebin */
++static void* tmalloc_small(mstate m, size_t nb) {
++  tchunkptr t, v;
++  size_t rsize;
++  bindex_t i;
++  binmap_t leastbit = least_bit(m->treemap);
++  compute_bit2idx(leastbit, i);
++  v = t = *treebin_at(m, i);
++  rsize = chunksize(t) - nb;
++
++  while ((t = leftmost_child(t)) != 0) {
++    size_t trem = chunksize(t) - nb;
++    if (trem < rsize) {
++      rsize = trem;
++      v = t;
++    }
++  }
++
++  if (RTCHECK(ok_address(m, v))) {
++    mchunkptr r = chunk_plus_offset(v, nb);
++    assert(chunksize(v) == rsize + nb);
++    if (RTCHECK(ok_next(v, r))) {
++      unlink_large_chunk(m, v);
++      if (rsize < MIN_CHUNK_SIZE)
++        set_inuse_and_pinuse(m, v, (rsize + nb));
++      else {
++        set_size_and_pinuse_of_inuse_chunk(m, v, nb);
++        set_size_and_pinuse_of_free_chunk(r, rsize);
++        replace_dv(m, r, rsize);
++      }
++      return chunk2mem(v);
++    }
++  }
++
++  CORRUPTION_ERROR_ACTION(m);
++  return 0;
++}
++
++#if !ONLY_MSPACES
++
++void* dlmalloc(size_t bytes) {
++  /*
++     Basic algorithm:
++     If a small request (< 256 bytes minus per-chunk overhead):
++       1. If one exists, use a remainderless chunk in associated smallbin.
++          (Remainderless means that there are too few excess bytes to
++          represent as a chunk.)
++       2. If it is big enough, use the dv chunk, which is normally the
++          chunk adjacent to the one used for the most recent small request.
++       3. If one exists, split the smallest available chunk in a bin,
++          saving remainder in dv.
++       4. If it is big enough, use the top chunk.
++       5. If available, get memory from system and use it
++     Otherwise, for a large request:
++       1. Find the smallest available binned chunk that fits, and use it
++          if it is better fitting than dv chunk, splitting if necessary.
++       2. If better fitting than any binned chunk, use the dv chunk.
++       3. If it is big enough, use the top chunk.
++       4. If request size >= mmap threshold, try to directly mmap this chunk.
++       5. If available, get memory from system and use it
++
++     The ugly goto's here ensure that postaction occurs along all paths.
++  */
++
++#if USE_LOCKS
++  ensure_initialization(); /* initialize in sys_alloc if not using locks */
++#endif
++
++  if (!PREACTION(gm)) {
++    void* mem;
++    size_t nb;
++    if (bytes <= MAX_SMALL_REQUEST) {
++      bindex_t idx;
++      binmap_t smallbits;
++      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
++      idx = small_index(nb);
++      smallbits = gm->smallmap >> idx;
++
++      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
++        mchunkptr b, p;
++        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
++        b = smallbin_at(gm, idx);
++        p = b->fd;
++        assert(chunksize(p) == small_index2size(idx));
++        unlink_first_small_chunk(gm, b, p, idx);
++        set_inuse_and_pinuse(gm, p, small_index2size(idx));
++        mem = chunk2mem(p);
++        check_malloced_chunk(gm, mem, nb);
++        goto postaction;
++      }
++
++      else if (nb > gm->dvsize) {
++        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
++          mchunkptr b, p, r;
++          size_t rsize;
++          bindex_t i;
++          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
++          binmap_t leastbit = least_bit(leftbits);
++          compute_bit2idx(leastbit, i);
++          b = smallbin_at(gm, i);
++          p = b->fd;
++          assert(chunksize(p) == small_index2size(i));
++          unlink_first_small_chunk(gm, b, p, i);
++          rsize = small_index2size(i) - nb;
++          /* Fit here cannot be remainderless if 4byte sizes */
++          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
++            set_inuse_and_pinuse(gm, p, small_index2size(i));
++          else {
++            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
++            r = chunk_plus_offset(p, nb);
++            set_size_and_pinuse_of_free_chunk(r, rsize);
++            replace_dv(gm, r, rsize);
++          }
++          mem = chunk2mem(p);
++          check_malloced_chunk(gm, mem, nb);
++          goto postaction;
++        }
++
++        else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
++          check_malloced_chunk(gm, mem, nb);
++          goto postaction;
++        }
++      }
++    }
++    else if (bytes >= MAX_REQUEST)
++      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
++    else {
++      nb = pad_request(bytes);
++      if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
++        check_malloced_chunk(gm, mem, nb);
++        goto postaction;
++      }
++    }
++
++    if (nb <= gm->dvsize) {
++      size_t rsize = gm->dvsize - nb;
++      mchunkptr p = gm->dv;
++      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
++        mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
++        gm->dvsize = rsize;
++        set_size_and_pinuse_of_free_chunk(r, rsize);
++        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
++      }
++      else { /* exhaust dv */
++        size_t dvs = gm->dvsize;
++        gm->dvsize = 0;
++        gm->dv = 0;
++        set_inuse_and_pinuse(gm, p, dvs);
++      }
++      mem = chunk2mem(p);
++      check_malloced_chunk(gm, mem, nb);
++      goto postaction;
++    }
++
++    else if (nb < gm->topsize) { /* Split top */
++      size_t rsize = gm->topsize -= nb;
++      mchunkptr p = gm->top;
++      mchunkptr r = gm->top = chunk_plus_offset(p, nb);
++      r->head = rsize | PINUSE_BIT;
++      set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
++      mem = chunk2mem(p);
++      check_top_chunk(gm, gm->top);
++      check_malloced_chunk(gm, mem, nb);
++      goto postaction;
++    }
++
++    mem = sys_alloc(gm, nb);
++
++  postaction:
++    POSTACTION(gm);
++    return mem;
++  }
++
++  return 0;
++}
++
++/* ---------------------------- free --------------------------- */
++
++void dlfree(void* mem) {
++  /*
++     Consolidate freed chunks with preceeding or succeeding bordering
++     free chunks, if they exist, and then place in a bin.  Intermixed
++     with special cases for top, dv, mmapped chunks, and usage errors.
++  */
++
++  if (mem != 0) {
++    mchunkptr p  = mem2chunk(mem);
++#if FOOTERS
++    mstate fm = get_mstate_for(p);
++    if (!ok_magic(fm)) {
++      USAGE_ERROR_ACTION(fm, p);
++      return;
++    }
++#else /* FOOTERS */
++#define fm gm
++#endif /* FOOTERS */
++    if (!PREACTION(fm)) {
++      check_inuse_chunk(fm, p);
++      if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
++        size_t psize = chunksize(p);
++        mchunkptr next = chunk_plus_offset(p, psize);
++        if (!pinuse(p)) {
++          size_t prevsize = p->prev_foot;
++          if (is_mmapped(p)) {
++            psize += prevsize + MMAP_FOOT_PAD;
++            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
++              fm->footprint -= psize;
++            goto postaction;
++          }
++          else {
++            mchunkptr prev = chunk_minus_offset(p, prevsize);
++            psize += prevsize;
++            p = prev;
++            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
++              if (p != fm->dv) {
++                unlink_chunk(fm, p, prevsize);
++              }
++              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
++                fm->dvsize = psize;
++                set_free_with_pinuse(p, psize, next);
++                goto postaction;
++              }
++            }
++            else
++              goto erroraction;
++          }
++        }
++
++        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
++          if (!cinuse(next)) {  /* consolidate forward */
++            if (next == fm->top) {
++              size_t tsize = fm->topsize += psize;
++              fm->top = p;
++              p->head = tsize | PINUSE_BIT;
++              if (p == fm->dv) {
++                fm->dv = 0;
++                fm->dvsize = 0;
++              }
++              if (should_trim(fm, tsize))
++                sys_trim(fm, 0);
++              goto postaction;
++            }
++            else if (next == fm->dv) {
++              size_t dsize = fm->dvsize += psize;
++              fm->dv = p;
++              set_size_and_pinuse_of_free_chunk(p, dsize);
++              goto postaction;
++            }
++            else {
++              size_t nsize = chunksize(next);
++              psize += nsize;
++              unlink_chunk(fm, next, nsize);
++              set_size_and_pinuse_of_free_chunk(p, psize);
++              if (p == fm->dv) {
++                fm->dvsize = psize;
++                goto postaction;
++              }
++            }
++          }
++          else
++            set_free_with_pinuse(p, psize, next);
++
++          if (is_small(psize)) {
++            insert_small_chunk(fm, p, psize);
++            check_free_chunk(fm, p);
++          }
++          else {
++            tchunkptr tp = (tchunkptr)p;
++            insert_large_chunk(fm, tp, psize);
++            check_free_chunk(fm, p);
++            if (--fm->release_checks == 0)
++              release_unused_segments(fm);
++          }
++          goto postaction;
++        }
++      }
++    erroraction:
++      USAGE_ERROR_ACTION(fm, p);
++    postaction:
++      POSTACTION(fm);
++    }
++  }
++#if !FOOTERS
++#undef fm
++#endif /* FOOTERS */
++}
++
++void* dlcalloc(size_t n_elements, size_t elem_size) {
++  void* mem;
++  size_t req = 0;
++  if (n_elements != 0) {
++    req = n_elements * elem_size;
++    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
++        (req / n_elements != elem_size))
++      req = MAX_SIZE_T; /* force downstream failure on overflow */
++  }
++  mem = dlmalloc(req);
++  if (mem != 0) {
++    mchunkptr p = mem2chunk(mem);
++    if (calloc_must_clear(p)) {
++      /* Make sure to clear all of the buffer, not just the requested size. */
++      memset(mem, 0, chunksize(p) - overhead_for(p));
++    }
++  }
++  return mem;
++}
++
++#endif /* !ONLY_MSPACES */
++
++/* ------------ Internal support for realloc, memalign, etc -------------- */
++
++/* Try to realloc; only in-place unless can_move true */
++static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb,
++                                   int can_move) {
++  mchunkptr newp = 0;
++  size_t oldsize = chunksize(p);
++  mchunkptr next = chunk_plus_offset(p, oldsize);
++  if (RTCHECK(ok_address(m, p) && ok_inuse(p) &&
++              ok_next(p, next) && ok_pinuse(next))) {
++    if (is_mmapped(p)) {
++      newp = mmap_resize(m, p, nb, can_move);
++    }
++    else if (oldsize >= nb) {             /* already big enough */
++      size_t rsize = oldsize - nb;
++      if (rsize >= MIN_CHUNK_SIZE) {      /* split off remainder */
++        mchunkptr r = chunk_plus_offset(p, nb);
++        set_inuse(m, p, nb);
++        set_inuse(m, r, rsize);
++        dispose_chunk(m, r, rsize);
++      }
++      newp = p;
++    }
++    else if (next == m->top) {  /* extend into top */
++      if (oldsize + m->topsize > nb) {
++        size_t newsize = oldsize + m->topsize;
++        size_t newtopsize = newsize - nb;
++        mchunkptr newtop = chunk_plus_offset(p, nb);
++        set_inuse(m, p, nb);
++        newtop->head = newtopsize |PINUSE_BIT;
++        m->top = newtop;
++        m->topsize = newtopsize;
++        newp = p;
++      }
++    }
++    else if (next == m->dv) { /* extend into dv */
++      size_t dvs = m->dvsize;
++      if (oldsize + dvs >= nb) {
++        size_t dsize = oldsize + dvs - nb;
++        if (dsize >= MIN_CHUNK_SIZE) {
++          mchunkptr r = chunk_plus_offset(p, nb);
++          mchunkptr n = chunk_plus_offset(r, dsize);
++          set_inuse(m, p, nb);
++          set_size_and_pinuse_of_free_chunk(r, dsize);
++          clear_pinuse(n);
++          m->dvsize = dsize;
++          m->dv = r;
++        }
++        else { /* exhaust dv */
++          size_t newsize = oldsize + dvs;
++          set_inuse(m, p, newsize);
++          m->dvsize = 0;
++          m->dv = 0;
++        }
++        newp = p;
++      }
++    }
++    else if (!cinuse(next)) { /* extend into next free chunk */
++      size_t nextsize = chunksize(next);
++      if (oldsize + nextsize >= nb) {
++        size_t rsize = oldsize + nextsize - nb;
++        unlink_chunk(m, next, nextsize);
++        if (rsize < MIN_CHUNK_SIZE) {
++          size_t newsize = oldsize + nextsize;
++          set_inuse(m, p, newsize);
++        }
++        else {
++          mchunkptr r = chunk_plus_offset(p, nb);
++          set_inuse(m, p, nb);
++          set_inuse(m, r, rsize);
++          dispose_chunk(m, r, rsize);
++        }
++        newp = p;
++      }
++    }
++  }
++  else {
++    USAGE_ERROR_ACTION(m, chunk2mem(p));
++  }
++  return newp;
++}
++
++static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
++  void* mem = 0;
++  if (alignment <  MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
++    alignment = MIN_CHUNK_SIZE;
++  if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
++    size_t a = MALLOC_ALIGNMENT << 1;
++    while (a < alignment) a <<= 1;
++    alignment = a;
++  }
++  if (bytes >= MAX_REQUEST - alignment) {
++    if (m != 0)  { /* Test isn't needed but avoids compiler warning */
++      MALLOC_FAILURE_ACTION;
++    }
++  }
++  else {
++    size_t nb = request2size(bytes);
++    size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
++    mem = internal_malloc(m, req);
++    if (mem != 0) {
++      mchunkptr p = mem2chunk(mem);
++      if (PREACTION(m))
++        return 0;
++      if ((((size_t)(mem)) & (alignment - 1)) != 0) { /* misaligned */
++        /*
++          Find an aligned spot inside chunk.  Since we need to give
++          back leading space in a chunk of at least MIN_CHUNK_SIZE, if
++          the first calculation places us at a spot with less than
++          MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
++          We've allocated enough total room so that this is always
++          possible.
++        */
++        char* br = (char*)mem2chunk((size_t)(((size_t)((char*)mem + alignment -
++                                                       SIZE_T_ONE)) &
++                                             -alignment));
++        char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
++          br : br+alignment;
++        mchunkptr newp = (mchunkptr)pos;
++        size_t leadsize = pos - (char*)(p);
++        size_t newsize = chunksize(p) - leadsize;
++
++        if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
++          newp->prev_foot = p->prev_foot + leadsize;
++          newp->head = newsize;
++        }
++        else { /* Otherwise, give back leader, use the rest */
++          set_inuse(m, newp, newsize);
++          set_inuse(m, p, leadsize);
++          dispose_chunk(m, p, leadsize);
++        }
++        p = newp;
++      }
++
++      /* Give back spare room at the end */
++      if (!is_mmapped(p)) {
++        size_t size = chunksize(p);
++        if (size > nb + MIN_CHUNK_SIZE) {
++          size_t remainder_size = size - nb;
++          mchunkptr remainder = chunk_plus_offset(p, nb);
++          set_inuse(m, p, nb);
++          set_inuse(m, remainder, remainder_size);
++          dispose_chunk(m, remainder, remainder_size);
++        }
++      }
++
++      mem = chunk2mem(p);
++      assert (chunksize(p) >= nb);
++      assert(((size_t)mem & (alignment - 1)) == 0);
++      check_inuse_chunk(m, p);
++      POSTACTION(m);
++    }
++  }
++  return mem;
++}
++
++/*
++  Common support for independent_X routines, handling
++    all of the combinations that can result.
++  The opts arg has:
++    bit 0 set if all elements are same size (using sizes[0])
++    bit 1 set if elements should be zeroed
++*/
++static void** ialloc(mstate m,
++                     size_t n_elements,
++                     size_t* sizes,
++                     int opts,
++                     void* chunks[]) {
++
++  size_t    element_size;   /* chunksize of each element, if all same */
++  size_t    contents_size;  /* total size of elements */
++  size_t    array_size;     /* request size of pointer array */
++  void*     mem;            /* malloced aggregate space */
++  mchunkptr p;              /* corresponding chunk */
++  size_t    remainder_size; /* remaining bytes while splitting */
++  void**    marray;         /* either "chunks" or malloced ptr array */
++  mchunkptr array_chunk;    /* chunk for malloced ptr array */
++  flag_t    was_enabled;    /* to disable mmap */
++  size_t    size;
++  size_t    i;
++
++  ensure_initialization();
++  /* compute array length, if needed */
++  if (chunks != 0) {
++    if (n_elements == 0)
++      return chunks; /* nothing to do */
++    marray = chunks;
++    array_size = 0;
++  }
++  else {
++    /* if empty req, must still return chunk representing empty array */
++    if (n_elements == 0)
++      return (void**)internal_malloc(m, 0);
++    marray = 0;
++    array_size = request2size(n_elements * (sizeof(void*)));
++  }
++
++  /* compute total element size */
++  if (opts & 0x1) { /* all-same-size */
++    element_size = request2size(*sizes);
++    contents_size = n_elements * element_size;
++  }
++  else { /* add up all the sizes */
++    element_size = 0;
++    contents_size = 0;
++    for (i = 0; i != n_elements; ++i)
++      contents_size += request2size(sizes[i]);
++  }
++
++  size = contents_size + array_size;
++
++  /*
++     Allocate the aggregate chunk.  First disable direct-mmapping so
++     malloc won't use it, since we would not be able to later
++     free/realloc space internal to a segregated mmap region.
++  */
++  was_enabled = use_mmap(m);
++  disable_mmap(m);
++  mem = internal_malloc(m, size - CHUNK_OVERHEAD);
++  if (was_enabled)
++    enable_mmap(m);
++  if (mem == 0)
++    return 0;
++
++  if (PREACTION(m)) return 0;
++  p = mem2chunk(mem);
++  remainder_size = chunksize(p);
++
++  assert(!is_mmapped(p));
++
++  if (opts & 0x2) {       /* optionally clear the elements */
++    memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
++  }
++
++  /* If not provided, allocate the pointer array as final part of chunk */
++  if (marray == 0) {
++    size_t  array_chunk_size;
++    array_chunk = chunk_plus_offset(p, contents_size);
++    array_chunk_size = remainder_size - contents_size;
++    marray = (void**) (chunk2mem(array_chunk));
++    set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
++    remainder_size = contents_size;
++  }
++
++  /* split out elements */
++  for (i = 0; ; ++i) {
++    marray[i] = chunk2mem(p);
++    if (i != n_elements-1) {
++      if (element_size != 0)
++        size = element_size;
++      else
++        size = request2size(sizes[i]);
++      remainder_size -= size;
++      set_size_and_pinuse_of_inuse_chunk(m, p, size);
++      p = chunk_plus_offset(p, size);
++    }
++    else { /* the final element absorbs any overallocation slop */
++      set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
++      break;
++    }
++  }
++
++#if DEBUG
++  if (marray != chunks) {
++    /* final element must have exactly exhausted chunk */
++    if (element_size != 0) {
++      assert(remainder_size == element_size);
++    }
++    else {
++      assert(remainder_size == request2size(sizes[i]));
++    }
++    check_inuse_chunk(m, mem2chunk(marray));
++  }
++  for (i = 0; i != n_elements; ++i)
++    check_inuse_chunk(m, mem2chunk(marray[i]));
++
++#endif /* DEBUG */
++
++  POSTACTION(m);
++  return marray;
++}
++
++/* Try to free all pointers in the given array.
++   Note: this could be made faster, by delaying consolidation,
++   at the price of disabling some user integrity checks, We
++   still optimize some consolidations by combining adjacent
++   chunks before freeing, which will occur often if allocated
++   with ialloc or the array is sorted.
++*/
++static size_t internal_bulk_free(mstate m, void* array[], size_t nelem) {
++  size_t unfreed = 0;
++  if (!PREACTION(m)) {
++    void** a;
++    void** fence = &(array[nelem]);
++    for (a = array; a != fence; ++a) {
++      void* mem = *a;
++      if (mem != 0) {
++        mchunkptr p = mem2chunk(mem);
++        size_t psize = chunksize(p);
++#if FOOTERS
++        if (get_mstate_for(p) != m) {
++          ++unfreed;
++          continue;
++        }
++#endif
++        check_inuse_chunk(m, p);
++        *a = 0;
++        if (RTCHECK(ok_address(m, p) && ok_inuse(p))) {
++          void ** b = a + 1; /* try to merge with next chunk */
++          mchunkptr next = next_chunk(p);
++          if (b != fence && *b == chunk2mem(next)) {
++            size_t newsize = chunksize(next) + psize;
++            set_inuse(m, p, newsize);
++            *b = chunk2mem(p);
++          }
++          else
++            dispose_chunk(m, p, psize);
++        }
++        else {
++          CORRUPTION_ERROR_ACTION(m);
++          break;
++        }
++      }
++    }
++    if (should_trim(m, m->topsize))
++      sys_trim(m, 0);
++    POSTACTION(m);
++  }
++  return unfreed;
++}
++
++/* Traversal */
++#if MALLOC_INSPECT_ALL
++static void internal_inspect_all(mstate m,
++                                 void(*handler)(void *start,
++                                                void *end,
++                                                size_t used_bytes,
++                                                void* callback_arg),
++                                 void* arg) {
++  if (is_initialized(m)) {
++    mchunkptr top = m->top;
++    msegmentptr s;
++    for (s = &m->seg; s != 0; s = s->next) {
++      mchunkptr q = align_as_chunk(s->base);
++      while (segment_holds(s, q) && q->head != FENCEPOST_HEAD) {
++        mchunkptr next = next_chunk(q);
++        size_t sz = chunksize(q);
++        size_t used;
++        void* start;
++        if (is_inuse(q)) {
++          used = sz - CHUNK_OVERHEAD; /* must not be mmapped */
++          start = chunk2mem(q);
++        }
++        else {
++          used = 0;
++          if (is_small(sz)) {     /* offset by possible bookkeeping */
++            start = (void*)((char*)q + sizeof(struct malloc_chunk));
++          }
++          else {
++            start = (void*)((char*)q + sizeof(struct malloc_tree_chunk));
++          }
++        }
++        if (start < (void*)next)  /* skip if all space is bookkeeping */
++          handler(start, next, used, arg);
++        if (q == top)
++          break;
++        q = next;
++      }
++    }
++  }
++}
++#endif /* MALLOC_INSPECT_ALL */
++
++/* ------------------ Exported realloc, memalign, etc -------------------- */
++
++#if !ONLY_MSPACES
++
++void* dlrealloc(void* oldmem, size_t bytes) {
++  void* mem = 0;
++  if (oldmem == 0) {
++    mem = dlmalloc(bytes);
++  }
++  else if (bytes >= MAX_REQUEST) {
++    MALLOC_FAILURE_ACTION;
++  }
++#ifdef REALLOC_ZERO_BYTES_FREES
++  else if (bytes == 0) {
++    dlfree(oldmem);
++  }
++#endif /* REALLOC_ZERO_BYTES_FREES */
++  else {
++    size_t nb = request2size(bytes);
++    mchunkptr oldp = mem2chunk(oldmem);
++#if ! FOOTERS
++    mstate m = gm;
++#else /* FOOTERS */
++    mstate m = get_mstate_for(oldp);
++    if (!ok_magic(m)) {
++      USAGE_ERROR_ACTION(m, oldmem);
++      return 0;
++    }
++#endif /* FOOTERS */
++    if (!PREACTION(m)) {
++      mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
++      POSTACTION(m);
++      if (newp != 0) {
++        check_inuse_chunk(m, newp);
++        mem = chunk2mem(newp);
++      }
++      else {
++        mem = internal_malloc(m, bytes);
++        if (mem != 0) {
++          size_t oc = chunksize(oldp) - overhead_for(oldp);
++          memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
++          internal_free(m, oldmem);
++        }
++      }
++    }
++  }
++  return mem;
++}
++
++void* dlrealloc_in_place(void* oldmem, size_t bytes) {
++  void* mem = 0;
++  if (oldmem != 0) {
++    if (bytes >= MAX_REQUEST) {
++      MALLOC_FAILURE_ACTION;
++    }
++    else {
++      size_t nb = request2size(bytes);
++      mchunkptr oldp = mem2chunk(oldmem);
++#if ! FOOTERS
++      mstate m = gm;
++#else /* FOOTERS */
++      mstate m = get_mstate_for(oldp);
++      if (!ok_magic(m)) {
++        USAGE_ERROR_ACTION(m, oldmem);
++        return 0;
++      }
++#endif /* FOOTERS */
++      if (!PREACTION(m)) {
++        mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
++        POSTACTION(m);
++        if (newp == oldp) {
++          check_inuse_chunk(m, newp);
++          mem = oldmem;
++        }
++      }
++    }
++  }
++  return mem;
++}
++
++void* dlmemalign(size_t alignment, size_t bytes) {
++  if (alignment <= MALLOC_ALIGNMENT) {
++    return dlmalloc(bytes);
++  }
++  return internal_memalign(gm, alignment, bytes);
++}
++
++int dlposix_memalign(void** pp, size_t alignment, size_t bytes) {
++  void* mem = 0;
++  if (alignment == MALLOC_ALIGNMENT)
++    mem = dlmalloc(bytes);
++  else {
++    size_t d = alignment / sizeof(void*);
++    size_t r = alignment % sizeof(void*);
++    if (r != 0 || d == 0 || (d & (d-SIZE_T_ONE)) != 0)
++      return EINVAL;
++    else if (bytes <= MAX_REQUEST - alignment) {
++      if (alignment <  MIN_CHUNK_SIZE)
++        alignment = MIN_CHUNK_SIZE;
++      mem = internal_memalign(gm, alignment, bytes);
++    }
++  }
++  if (mem == 0)
++    return ENOMEM;
++  else {
++    *pp = mem;
++    return 0;
++  }
++}
++
++void* dlvalloc(size_t bytes) {
++  size_t pagesz;
++  ensure_initialization();
++  pagesz = mparams.page_size;
++  return dlmemalign(pagesz, bytes);
++}
++
++/* BEGIN android-changed: added overflow check */
++void* dlpvalloc(size_t bytes) {
++  size_t pagesz;
++  size_t size;
++  ensure_initialization();
++  pagesz = mparams.page_size;
++  size = (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE);
++  if (size < bytes) {
++    return NULL;
++  }
++  return dlmemalign(pagesz, size);
++}
++/* END android-change */
++
++void** dlindependent_calloc(size_t n_elements, size_t elem_size,
++                            void* chunks[]) {
++  size_t sz = elem_size; /* serves as 1-element array */
++  return ialloc(gm, n_elements, &sz, 3, chunks);
++}
++
++void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
++                              void* chunks[]) {
++  return ialloc(gm, n_elements, sizes, 0, chunks);
++}
++
++size_t dlbulk_free(void* array[], size_t nelem) {
++  return internal_bulk_free(gm, array, nelem);
++}
++
++#if MALLOC_INSPECT_ALL
++void dlmalloc_inspect_all(void(*handler)(void *start,
++                                         void *end,
++                                         size_t used_bytes,
++                                         void* callback_arg),
++                          void* arg) {
++  ensure_initialization();
++  if (!PREACTION(gm)) {
++    internal_inspect_all(gm, handler, arg);
++    POSTACTION(gm);
++  }
++}
++#endif /* MALLOC_INSPECT_ALL */
++
++int dlmalloc_trim(size_t pad) {
++  int result = 0;
++  ensure_initialization();
++  if (!PREACTION(gm)) {
++    result = sys_trim(gm, pad);
++    POSTACTION(gm);
++  }
++  return result;
++}
++
++size_t dlmalloc_footprint(void) {
++  return gm->footprint;
++}
++
++size_t dlmalloc_max_footprint(void) {
++  return gm->max_footprint;
++}
++
++size_t dlmalloc_footprint_limit(void) {
++  size_t maf = gm->footprint_limit;
++  return maf == 0 ? MAX_SIZE_T : maf;
++}
++
++size_t dlmalloc_set_footprint_limit(size_t bytes) {
++  size_t result;  /* invert sense of 0 */
++  if (bytes == 0)
++    result = granularity_align(1); /* Use minimal size */
++  if (bytes == MAX_SIZE_T)
++    result = 0;                    /* disable */
++  else
++    result = granularity_align(bytes);
++  return gm->footprint_limit = result;
++}
++
++#if !NO_MALLINFO
++struct mallinfo dlmallinfo(void) {
++  return internal_mallinfo(gm);
++}
++#endif /* NO_MALLINFO */
++
++#if !NO_MALLOC_STATS
++void dlmalloc_stats() {
++  internal_malloc_stats(gm);
++}
++#endif /* NO_MALLOC_STATS */
++
++int dlmallopt(int param_number, int value) {
++  return change_mparam(param_number, value);
++}
++
++/* BEGIN android-changed: added const */
++size_t dlmalloc_usable_size(const void* mem) {
++/* END android-change */
++  if (mem != 0) {
++    mchunkptr p = mem2chunk(mem);
++    if (is_inuse(p))
++      return chunksize(p) - overhead_for(p);
++  }
++  return 0;
++}
++
++#endif /* !ONLY_MSPACES */
++
++/* ----------------------------- user mspaces ---------------------------- */
++
++#if MSPACES
++
++static mstate init_user_mstate(char* tbase, size_t tsize) {
++  size_t msize = pad_request(sizeof(struct malloc_state));
++  mchunkptr mn;
++  mchunkptr msp = align_as_chunk(tbase);
++  mstate m = (mstate)(chunk2mem(msp));
++  memset(m, 0, msize);
++  (void)INITIAL_LOCK(&m->mutex);
++  msp->head = (msize|INUSE_BITS);
++  m->seg.base = m->least_addr = tbase;
++  m->seg.size = m->footprint = m->max_footprint = tsize;
++  m->magic = mparams.magic;
++  m->release_checks = MAX_RELEASE_CHECK_RATE;
++  m->mflags = mparams.default_mflags;
++  m->extp = 0;
++  m->exts = 0;
++  disable_contiguous(m);
++  init_bins(m);
++  mn = next_chunk(mem2chunk(m));
++  init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
++  check_top_chunk(m, m->top);
++  return m;
++}
++
++mspace create_mspace(size_t capacity, int locked) {
++  mstate m = 0;
++  size_t msize;
++  ensure_initialization();
++  msize = pad_request(sizeof(struct malloc_state));
++  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
++    size_t rs = ((capacity == 0)? mparams.granularity :
++                 (capacity + TOP_FOOT_SIZE + msize));
++    size_t tsize = granularity_align(rs);
++    char* tbase = (char*)(CALL_MMAP(tsize));
++    if (tbase != CMFAIL) {
++      m = init_user_mstate(tbase, tsize);
++      m->seg.sflags = USE_MMAP_BIT;
++      set_lock(m, locked);
++    }
++  }
++  return (mspace)m;
++}
++
++mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
++  mstate m = 0;
++  size_t msize;
++  ensure_initialization();
++  msize = pad_request(sizeof(struct malloc_state));
++  if (capacity > msize + TOP_FOOT_SIZE &&
++      capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
++    m = init_user_mstate((char*)base, capacity);
++    m->seg.sflags = EXTERN_BIT;
++    set_lock(m, locked);
++  }
++  return (mspace)m;
++}
++
++int mspace_track_large_chunks(mspace msp, int enable) {
++  int ret = 0;
++  mstate ms = (mstate)msp;
++  if (!PREACTION(ms)) {
++    if (!use_mmap(ms)) {
++      ret = 1;
++    }
++    if (!enable) {
++      enable_mmap(ms);
++    } else {
++      disable_mmap(ms);
++    }
++    POSTACTION(ms);
++  }
++  return ret;
++}
++
++size_t destroy_mspace(mspace msp) {
++  size_t freed = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    msegmentptr sp = &ms->seg;
++    (void)DESTROY_LOCK(&ms->mutex); /* destroy before unmapped */
++    while (sp != 0) {
++      char* base = sp->base;
++      size_t size = sp->size;
++      flag_t flag = sp->sflags;
++      (void)base; /* placate people compiling -Wunused-variable */
++      sp = sp->next;
++      if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) &&
++          CALL_MUNMAP(base, size) == 0)
++        freed += size;
++    }
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return freed;
++}
++
++/*
++  mspace versions of routines are near-clones of the global
++  versions. This is not so nice but better than the alternatives.
++*/
++
++void* mspace_malloc(mspace msp, size_t bytes) {
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++    return 0;
++  }
++  if (!PREACTION(ms)) {
++    void* mem;
++    size_t nb;
++    if (bytes <= MAX_SMALL_REQUEST) {
++      bindex_t idx;
++      binmap_t smallbits;
++      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
++      idx = small_index(nb);
++      smallbits = ms->smallmap >> idx;
++
++      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
++        mchunkptr b, p;
++        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
++        b = smallbin_at(ms, idx);
++        p = b->fd;
++        assert(chunksize(p) == small_index2size(idx));
++        unlink_first_small_chunk(ms, b, p, idx);
++        set_inuse_and_pinuse(ms, p, small_index2size(idx));
++        mem = chunk2mem(p);
++        check_malloced_chunk(ms, mem, nb);
++        goto postaction;
++      }
++
++      else if (nb > ms->dvsize) {
++        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
++          mchunkptr b, p, r;
++          size_t rsize;
++          bindex_t i;
++          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
++          binmap_t leastbit = least_bit(leftbits);
++          compute_bit2idx(leastbit, i);
++          b = smallbin_at(ms, i);
++          p = b->fd;
++          assert(chunksize(p) == small_index2size(i));
++          unlink_first_small_chunk(ms, b, p, i);
++          rsize = small_index2size(i) - nb;
++          /* Fit here cannot be remainderless if 4byte sizes */
++          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
++            set_inuse_and_pinuse(ms, p, small_index2size(i));
++          else {
++            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
++            r = chunk_plus_offset(p, nb);
++            set_size_and_pinuse_of_free_chunk(r, rsize);
++            replace_dv(ms, r, rsize);
++          }
++          mem = chunk2mem(p);
++          check_malloced_chunk(ms, mem, nb);
++          goto postaction;
++        }
++
++        else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
++          check_malloced_chunk(ms, mem, nb);
++          goto postaction;
++        }
++      }
++    }
++    else if (bytes >= MAX_REQUEST)
++      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
++    else {
++      nb = pad_request(bytes);
++      if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
++        check_malloced_chunk(ms, mem, nb);
++        goto postaction;
++      }
++    }
++
++    if (nb <= ms->dvsize) {
++      size_t rsize = ms->dvsize - nb;
++      mchunkptr p = ms->dv;
++      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
++        mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
++        ms->dvsize = rsize;
++        set_size_and_pinuse_of_free_chunk(r, rsize);
++        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
++      }
++      else { /* exhaust dv */
++        size_t dvs = ms->dvsize;
++        ms->dvsize = 0;
++        ms->dv = 0;
++        set_inuse_and_pinuse(ms, p, dvs);
++      }
++      mem = chunk2mem(p);
++      check_malloced_chunk(ms, mem, nb);
++      goto postaction;
++    }
++
++    else if (nb < ms->topsize) { /* Split top */
++      size_t rsize = ms->topsize -= nb;
++      mchunkptr p = ms->top;
++      mchunkptr r = ms->top = chunk_plus_offset(p, nb);
++      r->head = rsize | PINUSE_BIT;
++      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
++      mem = chunk2mem(p);
++      check_top_chunk(ms, ms->top);
++      check_malloced_chunk(ms, mem, nb);
++      goto postaction;
++    }
++
++    mem = sys_alloc(ms, nb);
++
++  postaction:
++    POSTACTION(ms);
++    return mem;
++  }
++
++  return 0;
++}
++
++void mspace_free(mspace msp, void* mem) {
++  if (mem != 0) {
++    mchunkptr p  = mem2chunk(mem);
++#if FOOTERS
++    mstate fm = get_mstate_for(p);
++    (void)msp; /* placate people compiling -Wunused */
++#else /* FOOTERS */
++    mstate fm = (mstate)msp;
++#endif /* FOOTERS */
++    if (!ok_magic(fm)) {
++      USAGE_ERROR_ACTION(fm, p);
++      return;
++    }
++    if (!PREACTION(fm)) {
++      check_inuse_chunk(fm, p);
++      if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
++        size_t psize = chunksize(p);
++        mchunkptr next = chunk_plus_offset(p, psize);
++        if (!pinuse(p)) {
++          size_t prevsize = p->prev_foot;
++          if (is_mmapped(p)) {
++            psize += prevsize + MMAP_FOOT_PAD;
++            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
++              fm->footprint -= psize;
++            goto postaction;
++          }
++          else {
++            mchunkptr prev = chunk_minus_offset(p, prevsize);
++            psize += prevsize;
++            p = prev;
++            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
++              if (p != fm->dv) {
++                unlink_chunk(fm, p, prevsize);
++              }
++              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
++                fm->dvsize = psize;
++                set_free_with_pinuse(p, psize, next);
++                goto postaction;
++              }
++            }
++            else
++              goto erroraction;
++          }
++        }
++
++        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
++          if (!cinuse(next)) {  /* consolidate forward */
++            if (next == fm->top) {
++              size_t tsize = fm->topsize += psize;
++              fm->top = p;
++              p->head = tsize | PINUSE_BIT;
++              if (p == fm->dv) {
++                fm->dv = 0;
++                fm->dvsize = 0;
++              }
++              if (should_trim(fm, tsize))
++                sys_trim(fm, 0);
++              goto postaction;
++            }
++            else if (next == fm->dv) {
++              size_t dsize = fm->dvsize += psize;
++              fm->dv = p;
++              set_size_and_pinuse_of_free_chunk(p, dsize);
++              goto postaction;
++            }
++            else {
++              size_t nsize = chunksize(next);
++              psize += nsize;
++              unlink_chunk(fm, next, nsize);
++              set_size_and_pinuse_of_free_chunk(p, psize);
++              if (p == fm->dv) {
++                fm->dvsize = psize;
++                goto postaction;
++              }
++            }
++          }
++          else
++            set_free_with_pinuse(p, psize, next);
++
++          if (is_small(psize)) {
++            insert_small_chunk(fm, p, psize);
++            check_free_chunk(fm, p);
++          }
++          else {
++            tchunkptr tp = (tchunkptr)p;
++            insert_large_chunk(fm, tp, psize);
++            check_free_chunk(fm, p);
++            if (--fm->release_checks == 0)
++              release_unused_segments(fm);
++          }
++          goto postaction;
++        }
++      }
++    erroraction:
++      USAGE_ERROR_ACTION(fm, p);
++    postaction:
++      POSTACTION(fm);
++    }
++  }
++}
++
++void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
++  void* mem;
++  size_t req = 0;
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++    return 0;
++  }
++  if (n_elements != 0) {
++    req = n_elements * elem_size;
++    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
++        (req / n_elements != elem_size))
++      req = MAX_SIZE_T; /* force downstream failure on overflow */
++  }
++  mem = internal_malloc(ms, req);
++  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
++    memset(mem, 0, req);
++  return mem;
++}
++
++void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
++  void* mem = 0;
++  if (oldmem == 0) {
++    mem = mspace_malloc(msp, bytes);
++  }
++  else if (bytes >= MAX_REQUEST) {
++    MALLOC_FAILURE_ACTION;
++  }
++#ifdef REALLOC_ZERO_BYTES_FREES
++  else if (bytes == 0) {
++    mspace_free(msp, oldmem);
++  }
++#endif /* REALLOC_ZERO_BYTES_FREES */
++  else {
++    size_t nb = request2size(bytes);
++    mchunkptr oldp = mem2chunk(oldmem);
++#if ! FOOTERS
++    mstate m = (mstate)msp;
++#else /* FOOTERS */
++    mstate m = get_mstate_for(oldp);
++    if (!ok_magic(m)) {
++      USAGE_ERROR_ACTION(m, oldmem);
++      return 0;
++    }
++#endif /* FOOTERS */
++    if (!PREACTION(m)) {
++      mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
++      POSTACTION(m);
++      if (newp != 0) {
++        check_inuse_chunk(m, newp);
++        mem = chunk2mem(newp);
++      }
++      else {
++        mem = mspace_malloc(m, bytes);
++        if (mem != 0) {
++          size_t oc = chunksize(oldp) - overhead_for(oldp);
++          memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
++          mspace_free(m, oldmem);
++        }
++      }
++    }
++  }
++  return mem;
++}
++
++void* mspace_realloc_in_place(mspace msp, void* oldmem, size_t bytes) {
++  void* mem = 0;
++  if (oldmem != 0) {
++    if (bytes >= MAX_REQUEST) {
++      MALLOC_FAILURE_ACTION;
++    }
++    else {
++      size_t nb = request2size(bytes);
++      mchunkptr oldp = mem2chunk(oldmem);
++#if ! FOOTERS
++      mstate m = (mstate)msp;
++#else /* FOOTERS */
++      mstate m = get_mstate_for(oldp);
++      (void)msp; /* placate people compiling -Wunused */
++      if (!ok_magic(m)) {
++        USAGE_ERROR_ACTION(m, oldmem);
++        return 0;
++      }
++#endif /* FOOTERS */
++      if (!PREACTION(m)) {
++        mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
++        POSTACTION(m);
++        if (newp == oldp) {
++          check_inuse_chunk(m, newp);
++          mem = oldmem;
++        }
++      }
++    }
++  }
++  return mem;
++}
++
++void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++    return 0;
++  }
++  if (alignment <= MALLOC_ALIGNMENT)
++    return mspace_malloc(msp, bytes);
++  return internal_memalign(ms, alignment, bytes);
++}
++
++void** mspace_independent_calloc(mspace msp, size_t n_elements,
++                                 size_t elem_size, void* chunks[]) {
++  size_t sz = elem_size; /* serves as 1-element array */
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++    return 0;
++  }
++  return ialloc(ms, n_elements, &sz, 3, chunks);
++}
++
++void** mspace_independent_comalloc(mspace msp, size_t n_elements,
++                                   size_t sizes[], void* chunks[]) {
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++    return 0;
++  }
++  return ialloc(ms, n_elements, sizes, 0, chunks);
++}
++
++size_t mspace_bulk_free(mspace msp, void* array[], size_t nelem) {
++  return internal_bulk_free((mstate)msp, array, nelem);
++}
++
++#if MALLOC_INSPECT_ALL
++void mspace_inspect_all(mspace msp,
++                        void(*handler)(void *start,
++                                       void *end,
++                                       size_t used_bytes,
++                                       void* callback_arg),
++                        void* arg) {
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    if (!PREACTION(ms)) {
++      internal_inspect_all(ms, handler, arg);
++      POSTACTION(ms);
++    }
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++}
++#endif /* MALLOC_INSPECT_ALL */
++
++int mspace_trim(mspace msp, size_t pad) {
++  int result = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    if (!PREACTION(ms)) {
++      result = sys_trim(ms, pad);
++      POSTACTION(ms);
++    }
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return result;
++}
++
++#if !NO_MALLOC_STATS
++void mspace_malloc_stats(mspace msp) {
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    internal_malloc_stats(ms);
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++}
++#endif /* NO_MALLOC_STATS */
++
++size_t mspace_footprint(mspace msp) {
++  size_t result = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    result = ms->footprint;
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return result;
++}
++
++size_t mspace_max_footprint(mspace msp) {
++  size_t result = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    result = ms->max_footprint;
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return result;
++}
++
++size_t mspace_footprint_limit(mspace msp) {
++  size_t result = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    size_t maf = ms->footprint_limit;
++    result = (maf == 0) ? MAX_SIZE_T : maf;
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return result;
++}
++
++size_t mspace_set_footprint_limit(mspace msp, size_t bytes) {
++  size_t result = 0;
++  mstate ms = (mstate)msp;
++  if (ok_magic(ms)) {
++    if (bytes == 0)
++      result = granularity_align(1); /* Use minimal size */
++    if (bytes == MAX_SIZE_T)
++      result = 0;                    /* disable */
++    else
++      result = granularity_align(bytes);
++    ms->footprint_limit = result;
++  }
++  else {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return result;
++}
++
++#if !NO_MALLINFO
++struct mallinfo mspace_mallinfo(mspace msp) {
++  mstate ms = (mstate)msp;
++  if (!ok_magic(ms)) {
++    USAGE_ERROR_ACTION(ms,ms);
++  }
++  return internal_mallinfo(ms);
++}
++#endif /* NO_MALLINFO */
++
++size_t mspace_usable_size(const void* mem) {
++  if (mem != 0) {
++    mchunkptr p = mem2chunk(mem);
++    if (is_inuse(p))
++      return chunksize(p) - overhead_for(p);
++  }
++  return 0;
++}
++
++int mspace_mallopt(int param_number, int value) {
++  return change_mparam(param_number, value);
++}
++
++#endif /* MSPACES */
++
++
++/* -------------------- Alternative MORECORE functions ------------------- */
++
++/*
++  Guidelines for creating a custom version of MORECORE:
++
++  * For best performance, MORECORE should allocate in multiples of pagesize.
++  * MORECORE may allocate more memory than requested. (Or even less,
++      but this will usually result in a malloc failure.)
++  * MORECORE must not allocate memory when given argument zero, but
++      instead return one past the end address of memory from previous
++      nonzero call.
++  * For best performance, consecutive calls to MORECORE with positive
++      arguments should return increasing addresses, indicating that
++      space has been contiguously extended.
++  * Even though consecutive calls to MORECORE need not return contiguous
++      addresses, it must be OK for malloc'ed chunks to span multiple
++      regions in those cases where they do happen to be contiguous.
++  * MORECORE need not handle negative arguments -- it may instead
++      just return MFAIL when given negative arguments.
++      Negative arguments are always multiples of pagesize. MORECORE
++      must not misinterpret negative args as large positive unsigned
++      args. You can suppress all such calls from even occurring by defining
++      MORECORE_CANNOT_TRIM,
++
++  As an example alternative MORECORE, here is a custom allocator
++  kindly contributed for pre-OSX macOS.  It uses virtually but not
++  necessarily physically contiguous non-paged memory (locked in,
++  present and won't get swapped out).  You can use it by uncommenting
++  this section, adding some #includes, and setting up the appropriate
++  defines above:
++
++      #define MORECORE osMoreCore
++
++  There is also a shutdown routine that should somehow be called for
++  cleanup upon program exit.
++
++  #define MAX_POOL_ENTRIES 100
++  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)
++  static int next_os_pool;
++  void *our_os_pools[MAX_POOL_ENTRIES];
++
++  void *osMoreCore(int size)
++  {
++    void *ptr = 0;
++    static void *sbrk_top = 0;
++
++    if (size > 0)
++    {
++      if (size < MINIMUM_MORECORE_SIZE)
++         size = MINIMUM_MORECORE_SIZE;
++      if (CurrentExecutionLevel() == kTaskLevel)
++         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
++      if (ptr == 0)
++      {
++        return (void *) MFAIL;
++      }
++      // save ptrs so they can be freed during cleanup
++      our_os_pools[next_os_pool] = ptr;
++      next_os_pool++;
++      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
++      sbrk_top = (char *) ptr + size;
++      return ptr;
++    }
++    else if (size < 0)
++    {
++      // we don't currently support shrink behavior
++      return (void *) MFAIL;
++    }
++    else
++    {
++      return sbrk_top;
++    }
++  }
++
++  // cleanup any allocated memory pools
++  // called as last thing before shutting down driver
++
++  void osCleanupMem(void)
++  {
++    void **ptr;
++
++    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
++      if (*ptr)
++      {
++         PoolDeallocate(*ptr);
++         *ptr = 0;
++      }
++  }
++
++*/
++
++
++/* -----------------------------------------------------------------------
++History:
++    v2.8.6 Wed Aug 29 06:57:58 2012  Doug Lea
++      * fix bad comparison in dlposix_memalign
++      * don't reuse adjusted asize in sys_alloc
++      * add LOCK_AT_FORK -- thanks to Kirill Artamonov for the suggestion
++      * reduce compiler warnings -- thanks to all who reported/suggested these
++
++    v2.8.5 Sun May 22 10:26:02 2011  Doug Lea  (dl at gee)
++      * Always perform unlink checks unless INSECURE
++      * Add posix_memalign.
++      * Improve realloc to expand in more cases; expose realloc_in_place.
++        Thanks to Peter Buhr for the suggestion.
++      * Add footprint_limit, inspect_all, bulk_free. Thanks
++        to Barry Hayes and others for the suggestions.
++      * Internal refactorings to avoid calls while holding locks
++      * Use non-reentrant locks by default. Thanks to Roland McGrath
++        for the suggestion.
++      * Small fixes to mspace_destroy, reset_on_error.
++      * Various configuration extensions/changes. Thanks
++         to all who contributed these.
++
++    V2.8.4a Thu Apr 28 14:39:43 2011 (dl at gee.cs.oswego.edu)
++      * Update Creative Commons URL
++
++    V2.8.4 Wed May 27 09:56:23 2009  Doug Lea  (dl at gee)
++      * Use zeros instead of prev foot for is_mmapped
++      * Add mspace_track_large_chunks; thanks to Jean Brouwers
++      * Fix set_inuse in internal_realloc; thanks to Jean Brouwers
++      * Fix insufficient sys_alloc padding when using 16byte alignment
++      * Fix bad error check in mspace_footprint
++      * Adaptations for ptmalloc; thanks to Wolfram Gloger.
++      * Reentrant spin locks; thanks to Earl Chew and others
++      * Win32 improvements; thanks to Niall Douglas and Earl Chew
++      * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options
++      * Extension hook in malloc_state
++      * Various small adjustments to reduce warnings on some compilers
++      * Various configuration extensions/changes for more platforms. Thanks
++         to all who contributed these.
++
++    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)
++      * Add max_footprint functions
++      * Ensure all appropriate literals are size_t
++      * Fix conditional compilation problem for some #define settings
++      * Avoid concatenating segments with the one provided
++        in create_mspace_with_base
++      * Rename some variables to avoid compiler shadowing warnings
++      * Use explicit lock initialization.
++      * Better handling of sbrk interference.
++      * Simplify and fix segment insertion, trimming and mspace_destroy
++      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
++      * Thanks especially to Dennis Flanagan for help on these.
++
++    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)
++      * Fix memalign brace error.
++
++    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)
++      * Fix improper #endif nesting in C++
++      * Add explicit casts needed for C++
++
++    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)
++      * Use trees for large bins
++      * Support mspaces
++      * Use segments to unify sbrk-based and mmap-based system allocation,
++        removing need for emulation on most platforms without sbrk.
++      * Default safety checks
++      * Optional footer checks. Thanks to William Robertson for the idea.
++      * Internal code refactoring
++      * Incorporate suggestions and platform-specific changes.
++        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
++        Aaron Bachmann,  Emery Berger, and others.
++      * Speed up non-fastbin processing enough to remove fastbins.
++      * Remove useless cfree() to avoid conflicts with other apps.
++      * Remove internal memcpy, memset. Compilers handle builtins better.
++      * Remove some options that no one ever used and rename others.
++
++    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)
++      * Fix malloc_state bitmap array misdeclaration
++
++    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)
++      * Allow tuning of FIRST_SORTED_BIN_SIZE
++      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
++      * Better detection and support for non-contiguousness of MORECORE.
++        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
++      * Bypass most of malloc if no frees. Thanks To Emery Berger.
++      * Fix freeing of old top non-contiguous chunk im sysmalloc.
++      * Raised default trim and map thresholds to 256K.
++      * Fix mmap-related #defines. Thanks to Lubos Lunak.
++      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
++      * Branch-free bin calculation
++      * Default trim and mmap thresholds now 256K.
++
++    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)
++      * Introduce independent_comalloc and independent_calloc.
++        Thanks to Michael Pachos for motivation and help.
++      * Make optional .h file available
++      * Allow > 2GB requests on 32bit systems.
++      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
++        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
++        and Anonymous.
++      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
++        helping test this.)
++      * memalign: check alignment arg
++      * realloc: don't try to shift chunks backwards, since this
++        leads to  more fragmentation in some programs and doesn't
++        seem to help in any others.
++      * Collect all cases in malloc requiring system memory into sysmalloc
++      * Use mmap as backup to sbrk
++      * Place all internal state in malloc_state
++      * Introduce fastbins (although similar to 2.5.1)
++      * Many minor tunings and cosmetic improvements
++      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
++      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
++        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
++      * Include errno.h to support default failure action.
++
++    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
++      * return null for negative arguments
++      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
++         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
++          (e.g. WIN32 platforms)
++         * Cleanup header file inclusion for WIN32 platforms
++         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
++         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
++           memory allocation routines
++         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
++         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
++           usage of 'assert' in non-WIN32 code
++         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
++           avoid infinite loop
++      * Always call 'fREe()' rather than 'free()'
++
++    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
++      * Fixed ordering problem with boundary-stamping
++
++    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
++      * Added pvalloc, as recommended by H.J. Liu
++      * Added 64bit pointer support mainly from Wolfram Gloger
++      * Added anonymously donated WIN32 sbrk emulation
++      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
++      * malloc_extend_top: fix mask error that caused wastage after
++        foreign sbrks
++      * Add linux mremap support code from HJ Liu
++
++    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
++      * Integrated most documentation with the code.
++      * Add support for mmap, with help from
++        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
++      * Use last_remainder in more cases.
++      * Pack bins using idea from  colin@nyx10.cs.du.edu
++      * Use ordered bins instead of best-fit threshhold
++      * Eliminate block-local decls to simplify tracing and debugging.
++      * Support another case of realloc via move into top
++      * Fix error occuring when initial sbrk_base not word-aligned.
++      * Rely on page size for units instead of SBRK_UNIT to
++        avoid surprises about sbrk alignment conventions.
++      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
++        (raymond@es.ele.tue.nl) for the suggestion.
++      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
++      * More precautions for cases where other routines call sbrk,
++        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
++      * Added macros etc., allowing use in linux libc from
++        H.J. Lu (hjl@gnu.ai.mit.edu)
++      * Inverted this history list
++
++    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
++      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
++      * Removed all preallocation code since under current scheme
++        the work required to undo bad preallocations exceeds
++        the work saved in good cases for most test programs.
++      * No longer use return list or unconsolidated bins since
++        no scheme using them consistently outperforms those that don't
++        given above changes.
++      * Use best fit for very large chunks to prevent some worst-cases.
++      * Added some support for debugging
++
++    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
++      * Removed footers when chunks are in use. Thanks to
++        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
++
++    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
++      * Added malloc_trim, with help from Wolfram Gloger
++        (wmglo@Dent.MED.Uni-Muenchen.DE).
++
++    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
++
++    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
++      * realloc: try to expand in both directions
++      * malloc: swap order of clean-bin strategy;
++      * realloc: only conditionally expand backwards
++      * Try not to scavenge used bins
++      * Use bin counts as a guide to preallocation
++      * Occasionally bin return list chunks in first scan
++      * Add a few optimizations from colin@nyx10.cs.du.edu
++
++    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
++      * faster bin computation & slightly different binning
++      * merged all consolidations to one part of malloc proper
++         (eliminating old malloc_find_space & malloc_clean_bin)
++      * Scan 2 returns chunks (not just 1)
++      * Propagate failure in realloc if malloc returns 0
++      * Add stuff to allow compilation on non-ANSI compilers
++          from kpv@research.att.com
++
++    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
++      * removed potential for odd address access in prev_chunk
++      * removed dependency on getpagesize.h
++      * misc cosmetics and a bit more internal documentation
++      * anticosmetics: mangled names in macros to evade debugger strangeness
++      * tested on sparc, hp-700, dec-mips, rs6000
++          with gcc & native cc (hp, dec only) allowing
++          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
++
++    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
++      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
++         structure of old version,  but most details differ.)
++
++*/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e52c9e5a412aaa20e682c7cd354516160591ca9a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,620 @@@
++/*
++  Default header file for malloc-2.8.x, written by Doug Lea
++  and released to the public domain, as explained at
++  http://creativecommons.org/publicdomain/zero/1.0/ 
++ 
++  This header is for ANSI C/C++ only.  You can set any of
++  the following #defines before including:
++
++  * If USE_DL_PREFIX is defined, it is assumed that malloc.c 
++    was also compiled with this option, so all routines
++    have names starting with "dl".
++
++  * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this
++    file will be #included AFTER <malloc.h>. This is needed only if
++    your system defines a struct mallinfo that is incompatible with the
++    standard one declared here.  Otherwise, you can include this file
++    INSTEAD of your system system <malloc.h>.  At least on ANSI, all
++    declarations should be compatible with system versions
++
++  * If MSPACES is defined, declarations for mspace versions are included.
++*/
++
++#ifndef MALLOC_280_H
++#define MALLOC_280_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stddef.h>   /* for size_t */
++
++#ifndef ONLY_MSPACES
++#define ONLY_MSPACES 0     /* define to a value */
++#elif ONLY_MSPACES != 0
++#define ONLY_MSPACES 1
++#endif  /* ONLY_MSPACES */
++#ifndef NO_MALLINFO
++#define NO_MALLINFO 0
++#endif  /* NO_MALLINFO */
++
++#ifndef MSPACES
++#if ONLY_MSPACES
++#define MSPACES 1
++#else   /* ONLY_MSPACES */
++#define MSPACES 0
++#endif  /* ONLY_MSPACES */
++#endif  /* MSPACES */
++
++#if !ONLY_MSPACES
++
++#ifndef USE_DL_PREFIX
++#define dlcalloc               calloc
++#define dlfree                 free
++#define dlmalloc               malloc
++#define dlmemalign             memalign
++#define dlposix_memalign       posix_memalign
++#define dlrealloc              realloc
++#define dlvalloc               valloc
++#define dlpvalloc              pvalloc
++#define dlmallinfo             mallinfo
++#define dlmallopt              mallopt
++#define dlmalloc_trim          malloc_trim
++#define dlmalloc_stats         malloc_stats
++#define dlmalloc_usable_size   malloc_usable_size
++#define dlmalloc_footprint     malloc_footprint
++#define dlmalloc_max_footprint malloc_max_footprint
++#define dlmalloc_footprint_limit malloc_footprint_limit
++#define dlmalloc_set_footprint_limit malloc_set_footprint_limit
++#define dlmalloc_inspect_all   malloc_inspect_all
++#define dlindependent_calloc   independent_calloc
++#define dlindependent_comalloc independent_comalloc
++#define dlbulk_free            bulk_free
++#endif /* USE_DL_PREFIX */
++
++#if !NO_MALLINFO 
++#ifndef HAVE_USR_INCLUDE_MALLOC_H
++#ifndef _MALLOC_H
++#ifndef MALLINFO_FIELD_TYPE
++#define MALLINFO_FIELD_TYPE size_t
++#endif /* MALLINFO_FIELD_TYPE */
++#ifndef STRUCT_MALLINFO_DECLARED
++#define STRUCT_MALLINFO_DECLARED 1
++struct mallinfo {
++  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
++  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
++  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
++  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
++  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
++  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
++  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
++  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
++  MALLINFO_FIELD_TYPE fordblks; /* total free space */
++  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
++};
++#endif /* STRUCT_MALLINFO_DECLARED */
++#endif  /* _MALLOC_H */
++#endif  /* HAVE_USR_INCLUDE_MALLOC_H */
++#endif  /* !NO_MALLINFO */
++
++/*
++  malloc(size_t n)
++  Returns a pointer to a newly allocated chunk of at least n bytes, or
++  null if no space is available, in which case errno is set to ENOMEM
++  on ANSI C systems.
++
++  If n is zero, malloc returns a minimum-sized chunk. (The minimum
++  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
++  systems.)  Note that size_t is an unsigned type, so calls with
++  arguments that would be negative if signed are interpreted as
++  requests for huge amounts of space, which will often fail. The
++  maximum supported value of n differs across systems, but is in all
++  cases less than the maximum representable value of a size_t.
++*/
++void* dlmalloc(size_t);
++
++/*
++  free(void* p)
++  Releases the chunk of memory pointed to by p, that had been previously
++  allocated using malloc or a related routine such as realloc.
++  It has no effect if p is null. If p was not malloced or already
++  freed, free(p) will by default cuase the current program to abort.
++*/
++void  dlfree(void*);
++
++/*
++  calloc(size_t n_elements, size_t element_size);
++  Returns a pointer to n_elements * element_size bytes, with all locations
++  set to zero.
++*/
++void* dlcalloc(size_t, size_t);
++
++/*
++  realloc(void* p, size_t n)
++  Returns a pointer to a chunk of size n that contains the same data
++  as does chunk p up to the minimum of (n, p's size) bytes, or null
++  if no space is available.
++
++  The returned pointer may or may not be the same as p. The algorithm
++  prefers extending p in most cases when possible, otherwise it
++  employs the equivalent of a malloc-copy-free sequence.
++
++  If p is null, realloc is equivalent to malloc.
++
++  If space is not available, realloc returns null, errno is set (if on
++  ANSI) and p is NOT freed.
++
++  if n is for fewer bytes than already held by p, the newly unused
++  space is lopped off and freed if possible.  realloc with a size
++  argument of zero (re)allocates a minimum-sized chunk.
++
++  The old unix realloc convention of allowing the last-free'd chunk
++  to be used as an argument to realloc is not supported.
++*/
++void* dlrealloc(void*, size_t);
++
++/*
++  realloc_in_place(void* p, size_t n)
++  Resizes the space allocated for p to size n, only if this can be
++  done without moving p (i.e., only if there is adjacent space
++  available if n is greater than p's current allocated size, or n is
++  less than or equal to p's size). This may be used instead of plain
++  realloc if an alternative allocation strategy is needed upon failure
++  to expand space; for example, reallocation of a buffer that must be
++  memory-aligned or cleared. You can use realloc_in_place to trigger
++  these alternatives only when needed.
++
++  Returns p if successful; otherwise null.
++*/
++void* dlrealloc_in_place(void*, size_t);
++
++/*
++  memalign(size_t alignment, size_t n);
++  Returns a pointer to a newly allocated chunk of n bytes, aligned
++  in accord with the alignment argument.
++
++  The alignment argument should be a power of two. If the argument is
++  not a power of two, the nearest greater power is used.
++  8-byte alignment is guaranteed by normal malloc calls, so don't
++  bother calling memalign with an argument of 8 or less.
++
++  Overreliance on memalign is a sure way to fragment space.
++*/
++void* dlmemalign(size_t, size_t);
++
++/*
++  int posix_memalign(void** pp, size_t alignment, size_t n);
++  Allocates a chunk of n bytes, aligned in accord with the alignment
++  argument. Differs from memalign only in that it (1) assigns the
++  allocated memory to *pp rather than returning it, (2) fails and
++  returns EINVAL if the alignment is not a power of two (3) fails and
++  returns ENOMEM if memory cannot be allocated.
++*/
++int dlposix_memalign(void**, size_t, size_t);
++
++/*
++  valloc(size_t n);
++  Equivalent to memalign(pagesize, n), where pagesize is the page
++  size of the system. If the pagesize is unknown, 4096 is used.
++*/
++void* dlvalloc(size_t);
++
++/*
++  mallopt(int parameter_number, int parameter_value)
++  Sets tunable parameters The format is to provide a
++  (parameter-number, parameter-value) pair.  mallopt then sets the
++  corresponding parameter to the argument value if it can (i.e., so
++  long as the value is meaningful), and returns 1 if successful else
++  0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
++  normally defined in malloc.h.  None of these are use in this malloc,
++  so setting them has no effect. But this malloc also supports other
++  options in mallopt:
++
++  Symbol            param #  default    allowed param values
++  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (-1U disables trimming)
++  M_GRANULARITY        -2     page size   any power of 2 >= page size
++  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
++*/
++int dlmallopt(int, int);
++
++#define M_TRIM_THRESHOLD     (-1)
++#define M_GRANULARITY        (-2)
++#define M_MMAP_THRESHOLD     (-3)
++
++
++/*
++  malloc_footprint();
++  Returns the number of bytes obtained from the system.  The total
++  number of bytes allocated by malloc, realloc etc., is less than this
++  value. Unlike mallinfo, this function returns only a precomputed
++  result, so can be called frequently to monitor memory consumption.
++  Even if locks are otherwise defined, this function does not use them,
++  so results might not be up to date.
++*/
++size_t dlmalloc_footprint(void);
++
++/*
++  malloc_max_footprint();
++  Returns the maximum number of bytes obtained from the system. This
++  value will be greater than current footprint if deallocated space
++  has been reclaimed by the system. The peak number of bytes allocated
++  by malloc, realloc etc., is less than this value. Unlike mallinfo,
++  this function returns only a precomputed result, so can be called
++  frequently to monitor memory consumption.  Even if locks are
++  otherwise defined, this function does not use them, so results might
++  not be up to date.
++*/
++size_t dlmalloc_max_footprint(void);
++
++/*
++  malloc_footprint_limit();
++  Returns the number of bytes that the heap is allowed to obtain from
++  the system, returning the last value returned by
++  malloc_set_footprint_limit, or the maximum size_t value if
++  never set. The returned value reflects a permission. There is no
++  guarantee that this number of bytes can actually be obtained from
++  the system.  
++*/
++size_t dlmalloc_footprint_limit(void);
++
++/*
++  malloc_set_footprint_limit();
++  Sets the maximum number of bytes to obtain from the system, causing
++  failure returns from malloc and related functions upon attempts to
++  exceed this value. The argument value may be subject to page
++  rounding to an enforceable limit; this actual value is returned.
++  Using an argument of the maximum possible size_t effectively
++  disables checks. If the argument is less than or equal to the
++  current malloc_footprint, then all future allocations that require
++  additional system memory will fail. However, invocation cannot
++  retroactively deallocate existing used memory.
++*/
++size_t dlmalloc_set_footprint_limit(size_t bytes);
++
++/*
++  malloc_inspect_all(void(*handler)(void *start,
++                                    void *end,
++                                    size_t used_bytes,
++                                    void* callback_arg),
++                      void* arg);
++  Traverses the heap and calls the given handler for each managed
++  region, skipping all bytes that are (or may be) used for bookkeeping
++  purposes.  Traversal does not include include chunks that have been
++  directly memory mapped. Each reported region begins at the start
++  address, and continues up to but not including the end address.  The
++  first used_bytes of the region contain allocated data. If
++  used_bytes is zero, the region is unallocated. The handler is
++  invoked with the given callback argument. If locks are defined, they
++  are held during the entire traversal. It is a bad idea to invoke
++  other malloc functions from within the handler.
++
++  For example, to count the number of in-use chunks with size greater
++  than 1000, you could write:
++  static int count = 0;
++  void count_chunks(void* start, void* end, size_t used, void* arg) {
++    if (used >= 1000) ++count;
++  }
++  then:
++    malloc_inspect_all(count_chunks, NULL);
++
++  malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined.
++*/
++void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*),
++                           void* arg);
++
++#if !NO_MALLINFO
++/*
++  mallinfo()
++  Returns (by copy) a struct containing various summary statistics:
++
++  arena:     current total non-mmapped bytes allocated from system
++  ordblks:   the number of free chunks
++  smblks:    always zero.
++  hblks:     current number of mmapped regions
++  hblkhd:    total bytes held in mmapped regions
++  usmblks:   the maximum total allocated space. This will be greater
++                than current total if trimming has occurred.
++  fsmblks:   always zero
++  uordblks:  current total allocated space (normal or mmapped)
++  fordblks:  total free space
++  keepcost:  the maximum number of bytes that could ideally be released
++               back to system via malloc_trim. ("ideally" means that
++               it ignores page restrictions etc.)
++
++  Because these fields are ints, but internal bookkeeping may
++  be kept as longs, the reported values may wrap around zero and
++  thus be inaccurate.
++*/
++
++struct mallinfo dlmallinfo(void);
++#endif  /* NO_MALLINFO */
++
++/*
++  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
++
++  independent_calloc is similar to calloc, but instead of returning a
++  single cleared space, it returns an array of pointers to n_elements
++  independent elements that can hold contents of size elem_size, each
++  of which starts out cleared, and can be independently freed,
++  realloc'ed etc. The elements are guaranteed to be adjacently
++  allocated (this is not guaranteed to occur with multiple callocs or
++  mallocs), which may also improve cache locality in some
++  applications.
++
++  The "chunks" argument is optional (i.e., may be null, which is
++  probably the most typical usage). If it is null, the returned array
++  is itself dynamically allocated and should also be freed when it is
++  no longer needed. Otherwise, the chunks array must be of at least
++  n_elements in length. It is filled in with the pointers to the
++  chunks.
++
++  In either case, independent_calloc returns this pointer array, or
++  null if the allocation failed.  If n_elements is zero and "chunks"
++  is null, it returns a chunk representing an array with zero elements
++  (which should be freed if not wanted).
++
++  Each element must be freed when it is no longer needed. This can be
++  done all at once using bulk_free.
++
++  independent_calloc simplifies and speeds up implementations of many
++  kinds of pools.  It may also be useful when constructing large data
++  structures that initially have a fixed number of fixed-sized nodes,
++  but the number is not known at compile time, and some of the nodes
++  may later need to be freed. For example:
++
++  struct Node { int item; struct Node* next; };
++
++  struct Node* build_list() {
++    struct Node** pool;
++    int n = read_number_of_nodes_needed();
++    if (n <= 0) return 0;
++    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
++    if (pool == 0) die();
++    // organize into a linked list...
++    struct Node* first = pool[0];
++    for (i = 0; i < n-1; ++i)
++      pool[i]->next = pool[i+1];
++    free(pool);     // Can now free the array (or not, if it is needed later)
++    return first;
++  }
++*/
++void** dlindependent_calloc(size_t, size_t, void**);
++
++/*
++  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
++
++  independent_comalloc allocates, all at once, a set of n_elements
++  chunks with sizes indicated in the "sizes" array.    It returns
++  an array of pointers to these elements, each of which can be
++  independently freed, realloc'ed etc. The elements are guaranteed to
++  be adjacently allocated (this is not guaranteed to occur with
++  multiple callocs or mallocs), which may also improve cache locality
++  in some applications.
++
++  The "chunks" argument is optional (i.e., may be null). If it is null
++  the returned array is itself dynamically allocated and should also
++  be freed when it is no longer needed. Otherwise, the chunks array
++  must be of at least n_elements in length. It is filled in with the
++  pointers to the chunks.
++
++  In either case, independent_comalloc returns this pointer array, or
++  null if the allocation failed.  If n_elements is zero and chunks is
++  null, it returns a chunk representing an array with zero elements
++  (which should be freed if not wanted).
++
++  Each element must be freed when it is no longer needed. This can be
++  done all at once using bulk_free.
++
++  independent_comallac differs from independent_calloc in that each
++  element may have a different size, and also that it does not
++  automatically clear elements.
++
++  independent_comalloc can be used to speed up allocation in cases
++  where several structs or objects must always be allocated at the
++  same time.  For example:
++
++  struct Head { ... }
++  struct Foot { ... }
++
++  void send_message(char* msg) {
++    int msglen = strlen(msg);
++    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
++    void* chunks[3];
++    if (independent_comalloc(3, sizes, chunks) == 0)
++      die();
++    struct Head* head = (struct Head*)(chunks[0]);
++    char*        body = (char*)(chunks[1]);
++    struct Foot* foot = (struct Foot*)(chunks[2]);
++    // ...
++  }
++
++  In general though, independent_comalloc is worth using only for
++  larger values of n_elements. For small values, you probably won't
++  detect enough difference from series of malloc calls to bother.
++
++  Overuse of independent_comalloc can increase overall memory usage,
++  since it cannot reuse existing noncontiguous small chunks that
++  might be available for some of the elements.
++*/
++void** dlindependent_comalloc(size_t, size_t*, void**);
++
++/*
++  bulk_free(void* array[], size_t n_elements)
++  Frees and clears (sets to null) each non-null pointer in the given
++  array.  This is likely to be faster than freeing them one-by-one.
++  If footers are used, pointers that have been allocated in different
++  mspaces are not freed or cleared, and the count of all such pointers
++  is returned.  For large arrays of pointers with poor locality, it
++  may be worthwhile to sort this array before calling bulk_free.
++*/
++size_t  dlbulk_free(void**, size_t n_elements);
++
++/*
++  pvalloc(size_t n);
++  Equivalent to valloc(minimum-page-that-holds(n)), that is,
++  round up n to nearest pagesize.
++ */
++void*  dlpvalloc(size_t);
++
++/*
++  malloc_trim(size_t pad);
++
++  If possible, gives memory back to the system (via negative arguments
++  to sbrk) if there is unused memory at the `high' end of the malloc
++  pool or in unused MMAP segments. You can call this after freeing
++  large blocks of memory to potentially reduce the system-level memory
++  requirements of a program. However, it cannot guarantee to reduce
++  memory. Under some allocation patterns, some large free blocks of
++  memory will be locked between two used chunks, so they cannot be
++  given back to the system.
++
++  The `pad' argument to malloc_trim represents the amount of free
++  trailing space to leave untrimmed. If this argument is zero, only
++  the minimum amount of memory to maintain internal data structures
++  will be left. Non-zero arguments can be supplied to maintain enough
++  trailing space to service future expected allocations without having
++  to re-obtain memory from the system.
++
++  Malloc_trim returns 1 if it actually released any memory, else 0.
++*/
++int  dlmalloc_trim(size_t);
++
++/*
++  malloc_stats();
++  Prints on stderr the amount of space obtained from the system (both
++  via sbrk and mmap), the maximum amount (which may be more than
++  current if malloc_trim and/or munmap got called), and the current
++  number of bytes allocated via malloc (or realloc, etc) but not yet
++  freed. Note that this is the number of bytes allocated, not the
++  number requested. It will be larger than the number requested
++  because of alignment and bookkeeping overhead. Because it includes
++  alignment wastage as being in use, this figure may be greater than
++  zero even when no user-level chunks are allocated.
++
++  The reported current and maximum system memory can be inaccurate if
++  a program makes other calls to system memory allocation functions
++  (normally sbrk) outside of malloc.
++
++  malloc_stats prints only the most commonly interesting statistics.
++  More information can be obtained by calling mallinfo.
++  
++  malloc_stats is not compiled if NO_MALLOC_STATS is defined.
++*/
++void  dlmalloc_stats(void);
++
++#endif /* !ONLY_MSPACES */
++
++/*
++  malloc_usable_size(void* p);
++
++  Returns the number of bytes you can actually use in
++  an allocated chunk, which may be more than you requested (although
++  often not) due to alignment and minimum size constraints.
++  You can use this many bytes without worrying about
++  overwriting other allocated objects. This is not a particularly great
++  programming practice. malloc_usable_size can be more useful in
++  debugging and assertions, for example:
++
++  p = malloc(n);
++  assert(malloc_usable_size(p) >= 256);
++*/
++size_t dlmalloc_usable_size(const void*);
++
++#if MSPACES
++
++/*
++  mspace is an opaque type representing an independent
++  region of space that supports mspace_malloc, etc.
++*/
++typedef void* mspace;
++
++/*
++  create_mspace creates and returns a new independent space with the
++  given initial capacity, or, if 0, the default granularity size.  It
++  returns null if there is no system memory available to create the
++  space.  If argument locked is non-zero, the space uses a separate
++  lock to control access. The capacity of the space will grow
++  dynamically as needed to service mspace_malloc requests.  You can
++  control the sizes of incremental increases of this space by
++  compiling with a different DEFAULT_GRANULARITY or dynamically
++  setting with mallopt(M_GRANULARITY, value).
++*/
++mspace create_mspace(size_t capacity, int locked);
++
++/*
++  destroy_mspace destroys the given space, and attempts to return all
++  of its memory back to the system, returning the total number of
++  bytes freed. After destruction, the results of access to all memory
++  used by the space become undefined.
++*/
++size_t destroy_mspace(mspace msp);
++
++/*
++  create_mspace_with_base uses the memory supplied as the initial base
++  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
++  space is used for bookkeeping, so the capacity must be at least this
++  large. (Otherwise 0 is returned.) When this initial space is
++  exhausted, additional memory will be obtained from the system.
++  Destroying this space will deallocate all additionally allocated
++  space (if possible) but not the initial base.
++*/
++mspace create_mspace_with_base(void* base, size_t capacity, int locked);
++
++/*
++  mspace_track_large_chunks controls whether requests for large chunks
++  are allocated in their own untracked mmapped regions, separate from
++  others in this mspace. By default large chunks are not tracked,
++  which reduces fragmentation. However, such chunks are not
++  necessarily released to the system upon destroy_mspace.  Enabling
++  tracking by setting to true may increase fragmentation, but avoids
++  leakage when relying on destroy_mspace to release all memory
++  allocated using this space.  The function returns the previous
++  setting.
++*/
++int mspace_track_large_chunks(mspace msp, int enable);
++
++#if !NO_MALLINFO
++/*
++  mspace_mallinfo behaves as mallinfo, but reports properties of
++  the given space.
++*/
++struct mallinfo mspace_mallinfo(mspace msp);
++#endif /* NO_MALLINFO */
++
++/*
++  An alias for mallopt.
++*/
++int mspace_mallopt(int, int);
++
++/*
++  The following operate identically to their malloc counterparts
++  but operate only for the given mspace argument
++*/
++void* mspace_malloc(mspace msp, size_t bytes);
++void mspace_free(mspace msp, void* mem);
++void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
++void* mspace_realloc(mspace msp, void* mem, size_t newsize);
++void* mspace_realloc_in_place(mspace msp, void* mem, size_t newsize);
++void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
++void** mspace_independent_calloc(mspace msp, size_t n_elements,
++                                 size_t elem_size, void* chunks[]);
++void** mspace_independent_comalloc(mspace msp, size_t n_elements,
++                                   size_t sizes[], void* chunks[]);
++size_t mspace_bulk_free(mspace msp, void**, size_t n_elements);
++size_t mspace_usable_size(const void* mem);
++void mspace_malloc_stats(mspace msp);
++int mspace_trim(mspace msp, size_t pad);
++size_t mspace_footprint(mspace msp);
++size_t mspace_max_footprint(mspace msp);
++size_t mspace_footprint_limit(mspace msp);
++size_t mspace_set_footprint_limit(mspace msp, size_t bytes);
++void mspace_inspect_all(mspace msp, 
++                        void(*handler)(void *, void *, size_t, void*),
++                        void* arg);
++#endif  /* MSPACES */
++
++#ifdef __cplusplus
++};  /* end of extern "C" */
++#endif
++
++#endif /* MALLOC_280_H */
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3b0459402b94313c580e35701eccde4efdd43d96
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++/* 7zCrc.h -- CRC32 calculation\r
++2013-01-18 : Igor Pavlov : Public domain */\r
++\r
++#ifndef __7Z_CRC_H\r
++#define __7Z_CRC_H\r
++\r
++#include "7zTypes.h"\r
++\r
++EXTERN_C_BEGIN\r
++\r
++extern UInt32 g_CrcTable[];\r
++\r
++/* Call CrcGenerateTable one time before other CRC functions */\r
++void MY_FAST_CALL CrcGenerateTable(void);\r
++\r
++#define CRC_INIT_VAL 0xFFFFFFFF\r
++#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL)\r
++#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\r
++\r
++UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size);\r
++UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size);\r
++\r
++EXTERN_C_END\r
++\r
++#endif\r
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..593f5aa2597e37276179796d75d21f9acf043f4e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,375 @@@
++/* 7zTypes.h -- Basic types\r
++2018-08-04 : Igor Pavlov : Public domain */\r
++\r
++#ifndef __7Z_TYPES_H\r
++#define __7Z_TYPES_H\r
++\r
++#ifdef _WIN32\r
++/* #include <windows.h> */\r
++#endif\r
++\r
++#include <stddef.h>\r
++\r
++#ifndef EXTERN_C_BEGIN\r
++#ifdef __cplusplus\r
++#define EXTERN_C_BEGIN extern "C" {\r
++#define EXTERN_C_END }\r
++#else\r
++#define EXTERN_C_BEGIN\r
++#define EXTERN_C_END\r
++#endif\r
++#endif\r
++\r
++EXTERN_C_BEGIN\r
++\r
++#define SZ_OK 0\r
++\r
++#define SZ_ERROR_DATA 1\r
++#define SZ_ERROR_MEM 2\r
++#define SZ_ERROR_CRC 3\r
++#define SZ_ERROR_UNSUPPORTED 4\r
++#define SZ_ERROR_PARAM 5\r
++#define SZ_ERROR_INPUT_EOF 6\r
++#define SZ_ERROR_OUTPUT_EOF 7\r
++#define SZ_ERROR_READ 8\r
++#define SZ_ERROR_WRITE 9\r
++#define SZ_ERROR_PROGRESS 10\r
++#define SZ_ERROR_FAIL 11\r
++#define SZ_ERROR_THREAD 12\r
++\r
++#define SZ_ERROR_ARCHIVE 16\r
++#define SZ_ERROR_NO_ARCHIVE 17\r
++\r
++typedef int SRes;\r
++\r
++\r
++#ifdef _WIN32\r
++\r
++/* typedef DWORD WRes; */\r
++typedef unsigned WRes;\r
++#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x)\r
++\r
++#else\r
++\r
++typedef int WRes;\r
++#define MY__FACILITY_WIN32 7\r
++#define MY__FACILITY__WRes MY__FACILITY_WIN32\r
++#define MY_SRes_HRESULT_FROM_WRes(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (MY__FACILITY__WRes << 16) | 0x80000000)))\r
++\r
++#endif\r
++\r
++\r
++#ifndef RINOK\r
++#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }\r
++#endif\r
++\r
++typedef unsigned char Byte;\r
++typedef short Int16;\r
++typedef unsigned short UInt16;\r
++\r
++#ifdef _LZMA_UINT32_IS_ULONG\r
++typedef long Int32;\r
++typedef unsigned long UInt32;\r
++#else\r
++typedef int Int32;\r
++typedef unsigned int UInt32;\r
++#endif\r
++\r
++#ifdef _SZ_NO_INT_64\r
++\r
++/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.\r
++   NOTES: Some code will work incorrectly in that case! */\r
++\r
++typedef long Int64;\r
++typedef unsigned long UInt64;\r
++\r
++#else\r
++\r
++#if defined(_MSC_VER) || defined(__BORLANDC__)\r
++typedef __int64 Int64;\r
++typedef unsigned __int64 UInt64;\r
++#define UINT64_CONST(n) n\r
++#else\r
++typedef long long int Int64;\r
++typedef unsigned long long int UInt64;\r
++#define UINT64_CONST(n) n ## ULL\r
++#endif\r
++\r
++#endif\r
++\r
++#ifdef _LZMA_NO_SYSTEM_SIZE_T\r
++typedef UInt32 SizeT;\r
++#else\r
++typedef size_t SizeT;\r
++#endif\r
++\r
++typedef int BoolInt;\r
++/* typedef BoolInt Bool; */\r
++#define True 1\r
++#define False 0\r
++\r
++\r
++#ifdef _WIN32\r
++#define MY_STD_CALL __stdcall\r
++#else\r
++#define MY_STD_CALL\r
++#endif\r
++\r
++#ifdef _MSC_VER\r
++\r
++#if _MSC_VER >= 1300\r
++#define MY_NO_INLINE __declspec(noinline)\r
++#else\r
++#define MY_NO_INLINE\r
++#endif\r
++\r
++#define MY_FORCE_INLINE __forceinline\r
++\r
++#define MY_CDECL __cdecl\r
++#define MY_FAST_CALL __fastcall\r
++\r
++#else\r
++\r
++#define MY_NO_INLINE\r
++#define MY_FORCE_INLINE\r
++#define MY_CDECL\r
++#define MY_FAST_CALL\r
++\r
++/* inline keyword : for C++ / C99 */\r
++\r
++/* GCC, clang: */\r
++/*\r
++#if defined (__GNUC__) && (__GNUC__ >= 4)\r
++#define MY_FORCE_INLINE __attribute__((always_inline))\r
++#define MY_NO_INLINE __attribute__((noinline))\r
++#endif\r
++*/\r
++\r
++#endif\r
++\r
++\r
++/* The following interfaces use first parameter as pointer to structure */\r
++\r
++typedef struct IByteIn IByteIn;\r
++struct IByteIn\r
++{\r
++  Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */\r
++};\r
++#define IByteIn_Read(p) (p)->Read(p)\r
++\r
++\r
++typedef struct IByteOut IByteOut;\r
++struct IByteOut\r
++{\r
++  void (*Write)(const IByteOut *p, Byte b);\r
++};\r
++#define IByteOut_Write(p, b) (p)->Write(p, b)\r
++\r
++\r
++typedef struct ISeqInStream ISeqInStream;\r
++struct ISeqInStream\r
++{\r
++  SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size);\r
++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\r
++       (output(*size) < input(*size)) is allowed */\r
++};\r
++#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size)\r
++\r
++/* it can return SZ_ERROR_INPUT_EOF */\r
++SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size);\r
++SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType);\r
++SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf);\r
++\r
++\r
++typedef struct ISeqOutStream ISeqOutStream;\r
++struct ISeqOutStream\r
++{\r
++  size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size);\r
++    /* Returns: result - the number of actually written bytes.\r
++       (result < size) means error */\r
++};\r
++#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size)\r
++\r
++typedef enum\r
++{\r
++  SZ_SEEK_SET = 0,\r
++  SZ_SEEK_CUR = 1,\r
++  SZ_SEEK_END = 2\r
++} ESzSeek;\r
++\r
++\r
++typedef struct ISeekInStream ISeekInStream;\r
++struct ISeekInStream\r
++{\r
++  SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */\r
++  SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin);\r
++};\r
++#define ISeekInStream_Read(p, buf, size)   (p)->Read(p, buf, size)\r
++#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)\r
++\r
++\r
++typedef struct ILookInStream ILookInStream;\r
++struct ILookInStream\r
++{\r
++  SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size);\r
++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\r
++       (output(*size) > input(*size)) is not allowed\r
++       (output(*size) < input(*size)) is allowed */\r
++  SRes (*Skip)(const ILookInStream *p, size_t offset);\r
++    /* offset must be <= output(*size) of Look */\r
++\r
++  SRes (*Read)(const ILookInStream *p, void *buf, size_t *size);\r
++    /* reads directly (without buffer). It's same as ISeqInStream::Read */\r
++  SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin);\r
++};\r
++\r
++#define ILookInStream_Look(p, buf, size)   (p)->Look(p, buf, size)\r
++#define ILookInStream_Skip(p, offset)      (p)->Skip(p, offset)\r
++#define ILookInStream_Read(p, buf, size)   (p)->Read(p, buf, size)\r
++#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)\r
++\r
++\r
++SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size);\r
++SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset);\r
++\r
++/* reads via ILookInStream::Read */\r
++SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType);\r
++SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size);\r
++\r
++\r
++\r
++typedef struct\r
++{\r
++  ILookInStream vt;\r
++  const ISeekInStream *realStream;\r
++ \r
++  size_t pos;\r
++  size_t size; /* it's data size */\r
++  \r
++  /* the following variables must be set outside */\r
++  Byte *buf;\r
++  size_t bufSize;\r
++} CLookToRead2;\r
++\r
++void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead);\r
++\r
++#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; }\r
++\r
++\r
++typedef struct\r
++{\r
++  ISeqInStream vt;\r
++  const ILookInStream *realStream;\r
++} CSecToLook;\r
++\r
++void SecToLook_CreateVTable(CSecToLook *p);\r
++\r
++\r
++\r
++typedef struct\r
++{\r
++  ISeqInStream vt;\r
++  const ILookInStream *realStream;\r
++} CSecToRead;\r
++\r
++void SecToRead_CreateVTable(CSecToRead *p);\r
++\r
++\r
++typedef struct ICompressProgress ICompressProgress;\r
++\r
++struct ICompressProgress\r
++{\r
++  SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize);\r
++    /* Returns: result. (result != SZ_OK) means break.\r
++       Value (UInt64)(Int64)-1 for size means unknown value. */\r
++};\r
++#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize)\r
++\r
++\r
++\r
++typedef struct ISzAlloc ISzAlloc;\r
++typedef const ISzAlloc * ISzAllocPtr;\r
++\r
++struct ISzAlloc\r
++{\r
++  void *(*Alloc)(ISzAllocPtr p, size_t size);\r
++  void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */\r
++};\r
++\r
++#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size)\r
++#define ISzAlloc_Free(p, a) (p)->Free(p, a)\r
++\r
++/* deprecated */\r
++#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size)\r
++#define IAlloc_Free(p, a) ISzAlloc_Free(p, a)\r
++\r
++\r
++\r
++\r
++\r
++#ifndef MY_offsetof\r
++  #ifdef offsetof\r
++    #define MY_offsetof(type, m) offsetof(type, m)\r
++    /*\r
++    #define MY_offsetof(type, m) FIELD_OFFSET(type, m)\r
++    */\r
++  #else\r
++    #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m))\r
++  #endif\r
++#endif\r
++\r
++\r
++\r
++#ifndef MY_container_of\r
++\r
++/*\r
++#define MY_container_of(ptr, type, m) container_of(ptr, type, m)\r
++#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m)\r
++#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m)))\r
++#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m))))\r
++*/\r
++\r
++/*\r
++  GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly"\r
++    GCC 3.4.4 : classes with constructor\r
++    GCC 4.8.1 : classes with non-public variable members"\r
++*/\r
++\r
++#define MY_container_of(ptr, type, m) ((type *)((char *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m)))\r
++\r
++\r
++#endif\r
++\r
++#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(ptr))\r
++\r
++/*\r
++#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)\r
++*/\r
++#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m)\r
++\r
++#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)\r
++/*\r
++#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m)\r
++*/\r
++\r
++\r
++\r
++#ifdef _WIN32\r
++\r
++#define CHAR_PATH_SEPARATOR '\\'\r
++#define WCHAR_PATH_SEPARATOR L'\\'\r
++#define STRING_PATH_SEPARATOR "\\"\r
++#define WSTRING_PATH_SEPARATOR L"\\"\r
++\r
++#else\r
++\r
++#define CHAR_PATH_SEPARATOR '/'\r
++#define WCHAR_PATH_SEPARATOR L'/'\r
++#define STRING_PATH_SEPARATOR "/"\r
++#define WSTRING_PATH_SEPARATOR L"/"\r
++\r
++#endif\r
++\r
++EXTERN_C_END\r
++\r
++#endif\r
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7f17ccf9c9f98c707e9625fe7fa93afb45d4a76a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++/* Sha256.h -- SHA-256 Hash\r
++2013-01-18 : Igor Pavlov : Public domain */\r
++\r
++#ifndef __CRYPTO_SHA256_H\r
++#define __CRYPTO_SHA256_H\r
++\r
++#include "7zTypes.h"\r
++\r
++EXTERN_C_BEGIN\r
++\r
++#define SHA256_DIGEST_SIZE 32\r
++\r
++typedef struct\r
++{\r
++  UInt32 state[8];\r
++  UInt64 count;\r
++  Byte buffer[64];\r
++} CSha256;\r
++\r
++void Sha256_Init(CSha256 *p);\r
++void Sha256_Update(CSha256 *p, const Byte *data, size_t size);\r
++void Sha256_Final(CSha256 *p, Byte *digest);\r
++\r
++EXTERN_C_END\r
++\r
++#endif\r
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fad56a3fb7907e9a01102143d808bbc6ed0f1efe
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,460 @@@
++/* Xz.h - Xz interface\r
++2018-07-04 : Igor Pavlov : Public domain */\r
++\r
++#ifndef __XZ_H\r
++#define __XZ_H\r
++\r
++#include "Sha256.h"\r
++\r
++EXTERN_C_BEGIN\r
++\r
++#define XZ_ID_Subblock 1\r
++#define XZ_ID_Delta 3\r
++#define XZ_ID_X86 4\r
++#define XZ_ID_PPC 5\r
++#define XZ_ID_IA64 6\r
++#define XZ_ID_ARM 7\r
++#define XZ_ID_ARMT 8\r
++#define XZ_ID_SPARC 9\r
++#define XZ_ID_LZMA2 0x21\r
++\r
++unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value);\r
++unsigned Xz_WriteVarInt(Byte *buf, UInt64 v);\r
++\r
++/* ---------- xz block ---------- */\r
++\r
++#define XZ_BLOCK_HEADER_SIZE_MAX 1024\r
++\r
++#define XZ_NUM_FILTERS_MAX 4\r
++#define XZ_BF_NUM_FILTERS_MASK 3\r
++#define XZ_BF_PACK_SIZE (1 << 6)\r
++#define XZ_BF_UNPACK_SIZE (1 << 7)\r
++\r
++#define XZ_FILTER_PROPS_SIZE_MAX 20\r
++\r
++typedef struct\r
++{\r
++  UInt64 id;\r
++  UInt32 propsSize;\r
++  Byte props[XZ_FILTER_PROPS_SIZE_MAX];\r
++} CXzFilter;\r
++\r
++typedef struct\r
++{\r
++  UInt64 packSize;\r
++  UInt64 unpackSize;\r
++  Byte flags;\r
++  CXzFilter filters[XZ_NUM_FILTERS_MAX];\r
++} CXzBlock;\r
++\r
++#define XzBlock_GetNumFilters(p) (((p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1)\r
++#define XzBlock_HasPackSize(p)   (((p)->flags & XZ_BF_PACK_SIZE) != 0)\r
++#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0)\r
++#define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0)\r
++\r
++SRes XzBlock_Parse(CXzBlock *p, const Byte *header);\r
++SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes);\r
++\r
++/* ---------- xz stream ---------- */\r
++\r
++#define XZ_SIG_SIZE 6\r
++#define XZ_FOOTER_SIG_SIZE 2\r
++\r
++extern const Byte XZ_SIG[XZ_SIG_SIZE];\r
++\r
++/*\r
++extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE];\r
++*/\r
++\r
++#define XZ_FOOTER_SIG_0 'Y'\r
++#define XZ_FOOTER_SIG_1 'Z'\r
++\r
++#define XZ_STREAM_FLAGS_SIZE 2\r
++#define XZ_STREAM_CRC_SIZE 4\r
++\r
++#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE)\r
++#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4)\r
++\r
++#define XZ_CHECK_MASK 0xF\r
++#define XZ_CHECK_NO 0\r
++#define XZ_CHECK_CRC32 1\r
++#define XZ_CHECK_CRC64 4\r
++#define XZ_CHECK_SHA256 10\r
++\r
++typedef struct\r
++{\r
++  unsigned mode;\r
++  UInt32 crc;\r
++  UInt64 crc64;\r
++  CSha256 sha;\r
++} CXzCheck;\r
++\r
++void XzCheck_Init(CXzCheck *p, unsigned mode);\r
++void XzCheck_Update(CXzCheck *p, const void *data, size_t size);\r
++int XzCheck_Final(CXzCheck *p, Byte *digest);\r
++\r
++typedef UInt16 CXzStreamFlags;\r
++\r
++#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK)\r
++#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK)\r
++#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32)\r
++unsigned XzFlags_GetCheckSize(CXzStreamFlags f);\r
++\r
++SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf);\r
++SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream);\r
++\r
++typedef struct\r
++{\r
++  UInt64 unpackSize;\r
++  UInt64 totalSize;\r
++} CXzBlockSizes;\r
++\r
++typedef struct\r
++{\r
++  CXzStreamFlags flags;\r
++  size_t numBlocks;\r
++  CXzBlockSizes *blocks;\r
++  UInt64 startOffset;\r
++} CXzStream;\r
++\r
++void Xz_Construct(CXzStream *p);\r
++void Xz_Free(CXzStream *p, ISzAllocPtr alloc);\r
++\r
++#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1)\r
++\r
++UInt64 Xz_GetUnpackSize(const CXzStream *p);\r
++UInt64 Xz_GetPackSize(const CXzStream *p);\r
++\r
++typedef struct\r
++{\r
++  size_t num;\r
++  size_t numAllocated;\r
++  CXzStream *streams;\r
++} CXzs;\r
++\r
++void Xzs_Construct(CXzs *p);\r
++void Xzs_Free(CXzs *p, ISzAllocPtr alloc);\r
++SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc);\r
++\r
++UInt64 Xzs_GetNumBlocks(const CXzs *p);\r
++UInt64 Xzs_GetUnpackSize(const CXzs *p);\r
++\r
++\r
++// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder\r
++\r
++typedef enum\r
++{\r
++  CODER_STATUS_NOT_SPECIFIED,               /* use main error code instead */\r
++  CODER_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */\r
++  CODER_STATUS_NOT_FINISHED,                /* stream was not finished */\r
++  CODER_STATUS_NEEDS_MORE_INPUT             /* you must provide more input bytes */\r
++} ECoderStatus;\r
++\r
++\r
++// ECoderFinishMode values are identical to ELzmaFinishMode\r
++\r
++typedef enum\r
++{\r
++  CODER_FINISH_ANY,   /* finish at any point */\r
++  CODER_FINISH_END    /* block must be finished at the end */\r
++} ECoderFinishMode;\r
++\r
++\r
++typedef struct _IStateCoder\r
++{\r
++  void *p;\r
++  void (*Free)(void *p, ISzAllocPtr alloc);\r
++  SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc);\r
++  void (*Init)(void *p);\r
++  SRes (*Code2)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\r
++      int srcWasFinished, ECoderFinishMode finishMode,\r
++      // int *wasFinished,\r
++      ECoderStatus *status);\r
++  SizeT (*Filter)(void *p, Byte *data, SizeT size);\r
++} IStateCoder;\r
++\r
++\r
++\r
++#define MIXCODER_NUM_FILTERS_MAX 4\r
++\r
++typedef struct\r
++{\r
++  ISzAllocPtr alloc;\r
++  Byte *buf;\r
++  unsigned numCoders;\r
++\r
++  Byte *outBuf;\r
++  size_t outBufSize;\r
++  size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode)\r
++  BoolInt wasFinished;\r
++  SRes res;\r
++  ECoderStatus status;\r
++  // BoolInt SingleBufMode;\r
++  \r
++  int finished[MIXCODER_NUM_FILTERS_MAX - 1];\r
++  size_t pos[MIXCODER_NUM_FILTERS_MAX - 1];\r
++  size_t size[MIXCODER_NUM_FILTERS_MAX - 1];\r
++  UInt64 ids[MIXCODER_NUM_FILTERS_MAX];\r
++  SRes results[MIXCODER_NUM_FILTERS_MAX];\r
++  IStateCoder coders[MIXCODER_NUM_FILTERS_MAX];\r
++} CMixCoder;\r
++\r
++\r
++typedef enum\r
++{\r
++  XZ_STATE_STREAM_HEADER,\r
++  XZ_STATE_STREAM_INDEX,\r
++  XZ_STATE_STREAM_INDEX_CRC,\r
++  XZ_STATE_STREAM_FOOTER,\r
++  XZ_STATE_STREAM_PADDING,\r
++  XZ_STATE_BLOCK_HEADER,\r
++  XZ_STATE_BLOCK,\r
++  XZ_STATE_BLOCK_FOOTER\r
++} EXzState;\r
++\r
++\r
++typedef struct\r
++{\r
++  EXzState state;\r
++  UInt32 pos;\r
++  unsigned alignPos;\r
++  unsigned indexPreSize;\r
++\r
++  CXzStreamFlags streamFlags;\r
++  \r
++  UInt32 blockHeaderSize;\r
++  UInt64 packSize;\r
++  UInt64 unpackSize;\r
++\r
++  UInt64 numBlocks; // number of finished blocks in current stream\r
++  UInt64 indexSize;\r
++  UInt64 indexPos;\r
++  UInt64 padSize;\r
++\r
++  UInt64 numStartedStreams;\r
++  UInt64 numFinishedStreams;\r
++  UInt64 numTotalBlocks;\r
++\r
++  UInt32 crc;\r
++  CMixCoder decoder;\r
++  CXzBlock block;\r
++  CXzCheck check;\r
++  CSha256 sha;\r
++\r
++  BoolInt parseMode;\r
++  BoolInt headerParsedOk;\r
++  BoolInt decodeToStreamSignature;\r
++  unsigned decodeOnlyOneBlock;\r
++\r
++  Byte *outBuf;\r
++  size_t outBufSize;\r
++  size_t outDataWritten; // the size of data in (outBuf) that were fully unpacked\r
++\r
++  Byte shaDigest[SHA256_DIGEST_SIZE];\r
++  Byte buf[XZ_BLOCK_HEADER_SIZE_MAX];\r
++} CXzUnpacker;\r
++\r
++/* alloc : aligned for cache line allocation is better */\r
++void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc);\r
++void XzUnpacker_Init(CXzUnpacker *p);\r
++void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize);\r
++void XzUnpacker_Free(CXzUnpacker *p);\r
++\r
++/*\r
++  XzUnpacker\r
++  The sequence for decoding functions:\r
++  {\r
++    XzUnpacker_Construct()\r
++    [Decoding_Calls]\r
++    XzUnpacker_Free()\r
++  }\r
++\r
++  [Decoding_Calls]\r
++\r
++  There are 3 types of interfaces for [Decoding_Calls] calls:\r
++\r
++  Interface-1 : Partial output buffers:\r
++    {\r
++      XzUnpacker_Init()\r
++      for()\r
++        XzUnpacker_Code();\r
++    }\r
++    \r
++  Interface-2 : Direct output buffer:\r
++    Use it, if you know exact size of decoded data, and you need\r
++    whole xz unpacked data in one output buffer.\r
++    xz unpacker doesn't allocate additional buffer for lzma2 dictionary in that mode.\r
++    {\r
++      XzUnpacker_Init()\r
++      XzUnpacker_SetOutBufMode(); // to set output buffer and size\r
++      for()\r
++        XzUnpacker_Code(); // (dest = NULL) in XzUnpacker_Code()\r
++    }\r
++\r
++  Interface-3 : Direct output buffer : One call full decoding\r
++    It unpacks whole input buffer to output buffer in one call.\r
++    It uses Interface-2 internally.\r
++    {\r
++      XzUnpacker_CodeFull()\r
++    }\r
++*/\r
++\r
++/*\r
++finishMode:\r
++  It has meaning only if the decoding reaches output limit (*destLen).\r
++  CODER_FINISH_ANY - use smallest number of input bytes\r
++  CODER_FINISH_END - read EndOfStream marker after decoding\r
++\r
++Returns:\r
++  SZ_OK\r
++    status:\r
++      CODER_STATUS_NOT_FINISHED,\r
++      CODER_STATUS_NEEDS_MORE_INPUT - maybe there are more xz streams,\r
++                                      call XzUnpacker_IsStreamWasFinished to check that current stream was finished\r
++  SZ_ERROR_MEM  - Memory allocation error\r
++  SZ_ERROR_DATA - Data error\r
++  SZ_ERROR_UNSUPPORTED - Unsupported method or method properties\r
++  SZ_ERROR_CRC  - CRC error\r
++  // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).\r
++\r
++  SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons:\r
++     - xz Stream Signature failure\r
++     - CRC32 of xz Stream Header is failed\r
++     - The size of Stream padding is not multiple of four bytes.\r
++    It's possible to get that error, if xz stream was finished and the stream\r
++    contains some another data. In that case you can call XzUnpacker_GetExtraSize()\r
++    function to get real size of xz stream.\r
++*/\r
++\r
++\r
++SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,\r
++    const Byte *src, SizeT *srcLen, int srcFinished,\r
++    ECoderFinishMode finishMode, ECoderStatus *status);\r
++\r
++SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen,\r
++    const Byte *src, SizeT *srcLen,\r
++    ECoderFinishMode finishMode, ECoderStatus *status);\r
++\r
++BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p);\r
++\r
++/*\r
++XzUnpacker_GetExtraSize() returns then number of uncofirmed bytes,\r
++ if it's in (XZ_STATE_STREAM_HEADER) state or in (XZ_STATE_STREAM_PADDING) state.\r
++These bytes can be some bytes after xz archive, or\r
++it can be start of new xz stream.\r
++ \r
++Call XzUnpacker_GetExtraSize() after XzUnpacker_Code() function to detect real size of\r
++xz stream in two cases, if XzUnpacker_Code() returns:\r
++  res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT\r
++  res == SZ_ERROR_NO_ARCHIVE\r
++*/\r
++\r
++UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p);\r
++\r
++\r
++/*\r
++  for random block decoding:\r
++    XzUnpacker_Init();\r
++    set CXzUnpacker::streamFlags\r
++    XzUnpacker_PrepareToRandomBlockDecoding()\r
++    loop\r
++    {\r
++      XzUnpacker_Code()\r
++      XzUnpacker_IsBlockFinished()\r
++    }\r
++*/\r
++\r
++void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p);\r
++BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p);\r
++\r
++#define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags))\r
++\r
++\r
++\r
++/* ---------- Multi Threading Decoding ---------- */\r
++\r
++\r
++typedef struct\r
++{\r
++  size_t inBufSize_ST;\r
++  size_t outStep_ST;\r
++  BoolInt ignoreErrors;\r
++  \r
++  #ifndef _7ZIP_ST\r
++  unsigned numThreads;\r
++  size_t inBufSize_MT;\r
++  size_t memUseMax;\r
++  #endif\r
++} CXzDecMtProps;\r
++\r
++void XzDecMtProps_Init(CXzDecMtProps *p);\r
++\r
++\r
++typedef void * CXzDecMtHandle;\r
++\r
++/*\r
++  alloc    : XzDecMt uses CAlignOffsetAlloc for addresses allocated by (alloc).\r
++  allocMid : for big allocations, aligned allocation is better\r
++*/\r
++\r
++CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid);\r
++void XzDecMt_Destroy(CXzDecMtHandle p);\r
++\r
++\r
++typedef struct\r
++{\r
++  Byte UnpackSize_Defined;\r
++  Byte NumStreams_Defined;\r
++  Byte NumBlocks_Defined;\r
++\r
++  Byte DataAfterEnd;\r
++  Byte DecodingTruncated; // Decoding was Truncated, we need only partial output data\r
++\r
++  UInt64 InSize;  // pack size processed\r
++  UInt64 OutSize;\r
++\r
++  UInt64 NumStreams;\r
++  UInt64 NumBlocks;\r
++\r
++  SRes DecodeRes;\r
++  SRes ReadRes;\r
++  SRes ProgressRes;\r
++  SRes CombinedRes;\r
++  SRes CombinedRes_Type;\r
++\r
++} CXzStatInfo;\r
++\r
++void XzStatInfo_Clear(CXzStatInfo *p);\r
++\r
++/*\r
++XzDecMt_Decode()\r
++SRes:\r
++  SZ_OK               - OK\r
++  SZ_ERROR_MEM        - Memory allocation error\r
++  SZ_ERROR_NO_ARCHIVE - is not xz archive\r
++  SZ_ERROR_ARCHIVE    - Headers error\r
++  SZ_ERROR_DATA       - Data Error\r
++  SZ_ERROR_CRC        - CRC Error\r
++  SZ_ERROR_INPUT_EOF  - it needs more input data\r
++  SZ_ERROR_WRITE      - ISeqOutStream error\r
++  (SZ_ERROR_READ)     - ISeqInStream errors\r
++  (SZ_ERROR_PROGRESS) - ICompressProgress errors\r
++  // SZ_ERROR_THREAD     - error in multi-threading functions\r
++  MY_SRes_HRESULT_FROM_WRes(WRes_error) - error in multi-threading function\r
++*/\r
++\r
++SRes XzDecMt_Decode(CXzDecMtHandle p,\r
++    const CXzDecMtProps *props,\r
++    const UInt64 *outDataSize, // NULL means undefined\r
++    int finishMode,            // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished\r
++    ISeqOutStream *outStream,\r
++    // Byte *outBuf, size_t *outBufSize,\r
++    ISeqInStream *inStream,\r
++    // const Byte *inData, size_t inDataSize,\r
++    CXzStatInfo *stat,\r
++    int *isMT,                 // 0 means that ST (Single-Thread) version was used\r
++    ICompressProgress *progress);\r
++\r
++EXTERN_C_END\r
++\r
++#endif\r
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..71b10d57e5c7c2bb44d4ce8f9371d2559fbd4f85
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++/* XzCrc64.h -- CRC64 calculation\r
++2013-01-18 : Igor Pavlov : Public domain */\r
++\r
++#ifndef __XZ_CRC64_H\r
++#define __XZ_CRC64_H\r
++\r
++#include <stddef.h>\r
++\r
++#include "7zTypes.h"\r
++\r
++EXTERN_C_BEGIN\r
++\r
++extern UInt64 g_Crc64Table[];\r
++\r
++void MY_FAST_CALL Crc64GenerateTable(void);\r
++\r
++#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF)\r
++#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL)\r
++#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\r
++\r
++UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size);\r
++UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size);\r
++\r
++EXTERN_C_END\r
++\r
++#endif\r
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5905ddf6d0fd5ad646cae2fbde24cffb391bca48
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,36 @@@
++NAME = libnativehelper
++
++SOURCES = \
++  JNIHelp.cpp \
++  JniConstants.cpp \
++  toStringArray.cpp \
++  JniInvocation.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), libnativehelper/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -I/usr/include/android \
++  -Ilibnativehelper/header_only_include \
++  -Ilibnativehelper/include \
++  -Ilibnativehelper/include_jni \
++  -Ilibnativehelper/platform_include \
++  -Isystem/core/base/include \
++  -Isystem/core/liblog/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -ldl \
++  -llog \
++  -shared
++
++build: $(OBJECTS)
++      mkdir -p debian/out/libnativehelper
++      $(CXX) $^ -o debian/out/libnativehelper/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/libnativehelper/$(NAME).so
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..49f3b904fc88fd9c3725c38ce61d1191410415c4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,23 @@@
++<?xml version="1.0" encoding="UTF-8"?>
++<manifest>
++
++  <remote  name="aosp"
++           fetch="https://android.googlesource.com/" />
++  <default revision="refs/tags/platform-tools-29.0.6"
++           remote="aosp"
++           sync-j="4" />
++
++   <project path="art" name="platform/art" groups="pdk" />
++   <project path="dalvik" name="platform/dalvik" groups="pdk-cw-fs,pdk-fs" />
++   <project path="development" name="platform/development" groups="developers,pdk-cw-fs,pdk-fs" />
++   <project path="external/boringssl" name="platform/external/boringssl" groups="pdk" />
++   <project path="external/selinux" name="platform/external/selinux" groups="pdk" />
++   <project path="external/libunwind" name="platform/external/libunwind" groups="pdk" />
++   <project path="external/avb" name="platform/external/avb" groups="pdk" />
++   <project path="frameworks/native" name="platform/frameworks/native" groups="pdk" />
++   <project path="libnativehelper" name="platform/libnativehelper" groups="pdk" />
++   <project path="system/core" name="platform/system/core" groups="pdk" />
++   <project path="system/extras" name="platform/system/extras" groups="pdk" />
++   <project path="system/tools/mkbootimg" name="platform/system/tools/mkbootimg" groups="pdk" />
++
++</manifest>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..67f26a90ba8e6d4e801fbc1311d51c64663dba25
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,47 @@@
++% ETC1TOOL(1)
++% The Android Open Source Project
++
++# NAME
++
++etc1tool - ETC1 conversion tool
++
++# SYNOPSIS
++
++**etc1tool** _infile_ [--help | --encode | --encodeNoHeader | --decode] [--showDifference _difffile_] [-o _outfile_]
++
++# DESCRIPTION
++
++**etc1tool** is a command line utility that lets you encode PNG images to the
++ETC1 compression standard and decode ETC1 compressed images back to PNG.
++
++Default is **--encode**
++
++# OPTIONS
++
++_infile_
++: The input file to compress.
++
++--help
++: Print this usage information.
++
++--encode
++: Create an ETC1 file from a PNG file.
++
++--encodeNoHeader
++: Create a raw ETC1 data file (without a header) from a PNG file.
++
++--decode
++: Create a PNG file from an ETC1 file.
++
++--showDifference _difffile_
++: Write difference between original and encoded image to _difffile_. (Only valid
++  when encoding).
++
++-o _outfile_
++: Specify the name of the output file. If _outfile_ is not specified, the output
++  file is constructed from the input filename with the appropriate suffix
++  (**.pkm** or **.png**).
++
++# SEE ALSO
++
++https://developer.android.com/tools/help/etc1tool.html
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..073acc535d6edab1147fcd9eecdb05059dd9f700
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,318 @@@
++% ADB(1) android-platform-system-core | adb Manuals
++% The Android Open Source Project
++
++# NAME
++
++adb - Android Debug Bridge
++
++# SYNOPSIS
++
++**adb** [-d|-e|-s _serialNumber_] _command_
++
++# DESCRIPTION
++
++WARNING: This manual might be outdated, please refer to the official
++documentation.
++
++Android Debug Bridge (**adb**) is a versatile command line tool that lets you
++communicate with an emulator instance or connected Android-powered device. It is
++a client-server program that includes three components:
++
++  * **A client**, which sends commands. The client runs on your development
++    machine. You can invoke a client from a shell by issuing an **adb** command.
++    Other Android tools such as DDMS also create **adb** clients.
++  * **A daemon**, which runs commands on a device. The daemon runs as a
++    background process on each emulator or device instance.
++  * **A server**, which manages communication between the client and the daemon.
++    The server runs as a background process on your development machine.
++
++If there's only one emulator running or only one device connected, the **adb**
++command is sent to that device by default. If multiple emulators are running
++and/or multiple devices are attached, you need to use the **-d**, **-e**, or
++**-s** option to specify the target device to which the command should be
++directed.
++
++# OPTIONS
++
++-a
++: Directs **adb** to listen on all interfaces for a connection.
++
++-d
++: Directs command to the only connected USB device. Returns an error if more
++  than one USB device is present.
++
++-e
++: Directs command to the only running emulator. Returns an error if more than
++  one emulator is running.
++
++-s _specific device_
++: Directs command to the device or emulator with the given serial number or
++  qualifier. Overrides **ANDROID_SERIAL** environment variable.
++
++-p _product name or path_
++: Simple product name like **sooner**, or a relative/absolute path to a product
++  out directory like **out/target/product/sooner**. If **-p** is not specified,
++  the **ANDROID_PRODUCT_OUT** environment variable is used, which must be an
++  absolute path.
++
++-H
++: Name of adb server host (default: **localhost**)
++
++-P
++: Port of adb server (default: **5037**)
++
++# COMMANDS
++
++adb devices [-l]
++: List all connected devices. **-l** will also list device qualifiers.
++
++adb connect _host_[:_port_]
++: Connect to a device via TCP/IP. Port **5555** is used by default if no port
++  number is specified.
++
++adb disconnect [_host_[:_port_]]
++: Disconnect from a TCP/IP device. Port **5555** is used by default if no port
++  number is specified. Using this command with no additional arguments will
++  disconnect from all connected TCP/IP devices.
++
++## Device commands
++
++adb push _local_... _remote_
++: Copy file/dir to device.
++
++adb pull [-a] _remote_ [_local_]
++: Copy file/dir from device. **-a** means copy timestamp and mode.
++
++adb sync [-l] [_directory_]
++: Copy host->device only if changed. **-l** means list but don't copy.
++
++If _directory_ is not specified, **/system**, **/vendor** (if present), **/oem**
++(if present) and **/data** partitions will be updated.
++
++If it is **system**, **vendor**, **oem** or **data**, only the corresponding
++partition is updated.
++
++adb shell [-e _escape_] [-n] [-T|-t] [-x] [_command_]
++: Run remote shell command (interactive shell if no command given)
++
++  * -e: Choose escape character, or **none**; default **~**
++  * -n: Don't read from stdin
++  * -T: Disable PTY allocation
++  * -t: Force PTY allocation
++  * -x: Disable remote exit codes and stdout/stderr separation
++
++adb emu _command_
++: Run emulator console command
++
++adb logcat [_filter-spec_]
++: View device log.
++
++adb forward --list
++: List all forward socket connections. The format is a list of lines with the
++  following format: **_serial_ " " _local_ " " _remote_ "\n"**
++
++adb forward _local_ _remote_
++: Forward socket connections.
++
++Forward specs are one of:
++
++  * tcp:_port_
++  * localabstract:_unix domain socket name_
++  * localreserved:_unix domain socket name_
++  * localfilesystem:_unix domain socket name_
++  * dev:_character device name_
++  * jdwp:_process pid_ (remote only)
++
++adb forward --no-rebind _local_ _remote_
++: Same as "adb forward _local_ _remote_" but fails if _local_ is already
++  forwarded
++
++adb forward --remove _local_
++: Remove a specific forward socket connection.
++
++adb forward --remove-all
++: Remove all forward socket connections.
++
++adb reverse --list
++: List all reverse socket connections from device.
++
++adb reverse _remote_ _local_
++: Reverse socket connections.
++
++Reverse specs are one of:
++
++  * tcp:_port_
++  * localabstract:_unix domain socket name_
++  * localreserved:_unix domain socket name_
++  * localfilesystem:_unix domain socket name_
++
++adb reverse --no-rebind _remote_ _local_
++: Same as 'adb reverse _remote_ _local_' but fails if _remote_ is already
++  reversed.
++
++adb reverse --remove _remote_
++: Remove a specific reversed socket connection.
++
++adb reverse --remove-all
++: Remove all reversed socket connections from device.
++
++adb jdwp
++: List PIDs of processes hosting a JDWP transport.
++
++adb install [-lrtsdg] _file_
++: Push this package file to the device and install it.
++
++  * **-l**: Forward lock application.
++  * **-r**: Replace existing application.
++  * **-t**: Allow test packages.
++  * **-s**: Install application on sdcard.
++  * **-d**: Allow version code downgrade (debuggable packages only).
++  * **-g**: Grant all runtime permissions.
++
++adb install-multiple [-lrtsdpg] _file..._
++: Push this package file to the device and install it.
++
++  * **-l**: Forward lock application.
++  * **-r**: Replace existing application.
++  * **-t**: Allow test packages.
++  * **-s**: Install application on sdcard.
++  * **-d**: Allow version code downgrade (debuggable packages only).
++  * **-p**: Partial application install.
++  * **-g**: Grant all runtime permissions.
++
++adb uninstall [-k] _package_
++: Remove this app package from the device. **-k** means keep the data and cache
++  directories.
++
++adb bugreport [_zipfile_]
++: Return all information from the device that should be included in a bug report.
++
++adb backup [-f _file_] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [_packages..._]
++: Write an archive of the device's data to _file_. If no **-f** option is
++  supplied then the data is written to **backup.ab** in the current directory.
++
++**-apk** | **-noapk** enable/disable backup of the .apks themselves in the
++archive; the default is noapk.
++
++**-obb** | **-noobb** enable/disable backup of any installed apk expansion (aka
++.obb) files associated with each application; the default is noobb.
++
++**-shared** | **-noshared** enable/disable backup of the device's shared storage
++/ SD card contents; the default is noshared.
++
++**-all** means to back up all installed applications.
++
++
++**-system** | **-nosystem** toggles whether **-all** automatically includes
++system applications; the default is to include system apps.
++
++_packages..._ is the list of applications to be backed up. If the **-all** or
++**-shared** flags are passed, then the package list is optional. Applications
++explicitly given on the command line will be included even if **-nosystem**
++would ordinarily cause them to be omitted.
++
++adb restore _file_
++: Restore device contents from the _file_ backup archive.
++
++adb disable-verity
++: Disable dm-verity checking on USERDEBUG builds.
++
++adb enable-verity
++: Re-enable dm-verity checking on USERDEBUG builds.
++
++adb keygen _file_
++: Generate adb public/private key. The private key is stored in _file_, and the
++  public key is stored in _file_.pub. Any existing files are overwritten.
++
++adb help
++: Show help message.
++
++adb version
++: Show version number.
++
++## Scripting
++
++adb wait-for-[-_transport_]-_state_
++: Wait for device to be in the given state: **device**, **recovery**,
++  **sideload**, or **bootloader**. _transport_ is: **usb**, **local** or **any**
++  (default = **any**)
++
++adb start-server
++: Ensure that there is a server running.
++
++adb kill-server
++: Kill the server if it is running.
++
++adb get-state
++: Prints: **offline** | **bootloader** | **device**
++
++adb get-serialno
++: Prints: _serial-number_.
++
++adb get-devpath
++: Prints: _device-path_.
++
++adb remount
++: Remounts the **/system**, **/vendor** (if present) and **/oem** (if present)
++  partitions on the device read-write.
++
++adb reboot [bootloader|recovery]
++: Reboots the device, optionally into the bootloader or recovery program.
++
++adb reboot sideload
++: Reboots the device into the sideload mode in recovery program (adb root
++  required).
++
++adb reboot sideload-auto-reboot
++: Reboots into the sideload mode, then reboots automatically after the sideload
++  regardless of the result.
++
++adb sideload _file_
++: Sideloads the given package.
++
++adb root
++: Restarts the adbd daemon with root permissions.
++
++adb unroot
++: Restarts the adbd daemon without root permissions.
++
++adb usb
++: Restarts the adbd daemon listening on USB.
++
++adb tcpip _port_
++: Restarts the adbd daemon listening on TCP on the specified port.
++
++## Networking
++
++adb ppp _tty_ [_parameters_]
++: Run PPP over USB.
++
++_parameters_: E.g. **defaultroute debug dump local notty usepeerdns**
++
++Note: you should not automatically start a PPP connection. _tty_ refers to the
++tty for PPP stream. E.g. **dev:/dev/omap_csmi_tty1**
++
++# Internal Debugging
++
++adb reconnect
++: Kick current connection from host side and make it reconnect.
++
++adb reconnect device
++: Kick current connection from device side and make it reconnect.
++
++# ENVIRONMENT VARIABLES
++
++ADB_TRACE
++: Print debug information. A comma separated list of the following values **1**
++  or **all**, **adb**, **sockets**, **packets**, **rwx**, **usb**, **sync**,
++  **sysdeps**, **transport**, **jdwp**
++
++ANDROID_SERIAL
++: The serial number to connect to. **-s** takes priority over this if given.
++
++ANDROID_LOG_TAGS
++: When used with the logcat option, only these debug tags are printed.
++
++# SEE ALSO
++
++https://developer.android.com/tools/help/adb.html
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8c04d54a995ff37e6762fce20f9c40d5052e1c63
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,144 @@@
++% FASTBOOT(1) android-platform-system-core | fastboot Manuals
++% The Android Open Source Project
++
++# NAME
++
++fastboot - Android flashing and booting utility
++
++# SYNOPSIS
++
++**fastboot** [-w] [-u] [-s _device_] [-p _product_] [-c _cmdline_] [-i _vendorId_] [-b _baseAddr_] [-n _pageSize_] [-S _size_[K|M|G]] _command_
++
++# DESCRIPTION
++
++WARNING: This manual might be outdated, please refer to the official
++documentation.
++
++**fastboot** is a command line tool for flashing an Android device, boot an
++Android device to fastboot mode, etc..
++
++# OPTIONS
++
++-w
++: Erase userdata and cache (and format if supported by partition type).
++
++-u
++: Do not erase partition before formatting.
++
++-s _device_
++: Specify device serial number or path to device port.
++
++-l
++: With **devices** command, list device paths.
++
++-p _product_
++: Specify product name.
++
++-c _cmdline_
++: Override kernel commandline.
++
++-i _vendorId_
++: Specify a custom USB vendor ID.
++
++-b|--base _baseAddr_
++: Specify a custom kernel base address (default: **0x10000000**).
++
++--kernel-offset
++: Specify a custom kernel offset (default: **0x00008000**).
++
++--ramdisk-offset
++: Specify a custom ramdisk offset (default: **0x01000000**).
++
++--tags-offset _offset_
++: Specify a custom tags offset (default: **0x00000100**).
++
++-n|--page-size _pageSize_
++: Specify the nand page size (default: **2048**).
++
++-S _size_[K|M|G]
++: Automatically sparse files greater than 'size'. **0** to disable.
++
++--slot _suffix_
++: Specify slot suffix to be used if the device supports slots. This will be
++  added to all partition names that use slots. **all** can be given to refer to
++  all slots. **other** can be given to refer to a non-current slot. If this flag
++  is not used, slotted partitions will default to the current active slot.
++
++-a, --set-active[=<suffix>]
++: Sets the active slot. If no suffix is provided, this will default to the value
++  given by **--slot**. If slots are not supported, this does nothing. This will
++  run after all non-reboot commands.
++
++--wipe-and-use-fbe
++: On devices which support it, erase userdata and cache, and enable file-based
++  encryption.
++
++--unbuffered
++: Do not buffer input or output.
++
++--version
++: Display version.
++
++-h|--help
++: show this message.
++
++# COMMANDS
++
++fastboot update _filename_
++: Reflash device from update.zip.
++
++fastboot flashall
++: Flash boot, system, vendor, and (if found) recovery.
++
++fastboot flash _partition_ [_filename_]
++: Write a file to a flash partition.
++
++fastboot flashing lock
++: Locks the device. Prevents flashing.
++
++fastboot flashing unlock
++: Unlocks the device. Allows flashing any partition except bootloader-related
++  partitions.
++
++fastboot flashing lock_critical
++: Prevents flashing bootloader-related partitions.
++
++fastboot flashing unlock_critical
++: Enables flashing bootloader-related partitions.
++
++fastboot flashing get_unlock_ability
++: Queries bootloader to see if the device is unlocked.
++
++fastboot erase _partition_
++: Erase a flash partition.
++
++fastboot format[:[_fs type_][:[_size_]] _partition_
++: Format a flash partition. Can override the fs type and/or size the bootloader
++  reports.
++
++fastboot getvar _variable_
++: Display a bootloader variable.
++
++fastboot set_active _suffix_
++: Sets the active slot. If slots are not supported, this does nothing.
++
++fastboot boot _kernel_ [_ramdisk_ [_second_]]
++: Download and boot kernel.
++
++fastboot flash:raw boot _kernel_ [_ramdisk_ [_second_]]
++: Create bootimage and flash it.
++
++fastboot devices [-l]
++: List all connected devices (with device paths if **-l** is used).
++
++fastboot continue
++: Continue with autoboot.
++
++fastboot reboot [bootloader]
++: Reboot device [into bootloader].
++
++fastboot reboot-bootloader
++: Reboot device into bootloader.
++
++fastboot help
++: Show this help message.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6971e5aadf3b093f7242ce41c089755254ad3309
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++#!/usr/bin/dh-exec
++
++system/tools/mkbootimg/mkbootimg.py => usr/bin/mkbootimg
++system/tools/mkbootimg/unpack_bootimg.py => usr/bin/unpack_bootimg
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f4ca59f7f6d6805500b6ce14949e6fe3aa2edef6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,27 @@@
++.pc
++.repo
++*/.git
++debian
++*.a
++*.apk
++*.data
++*.dll
++*.exe
++*.jar
++*.o
++*.so
++*.tgz
++*.tar.gz
++*.vdex
++*.zip
++development/host/windows/usb/api/AdbWinApi.rc
++development/host/windows/usb/api/Resource.h
++development/host/windows/usb/winusb/AdbWinUsbApi.rc
++development/host/windows/usb/winusb/Resource.h
++development/perftests
++development/prebuilt
++development/samples
++system/core/libunwindstack/tests
++system/extras/simpleperf
++external/avb/examples
++external/selinux/mcstrans/share/examples
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..558053f4a713d93d4781e245958fc04b022cb127
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,311 @@@
++From: Peter Collingbourne <pcc@google.com>
++Date: Thu, 24 Jun 2021 10:17:39 -0700
++Subject: Switch to an assembler macro for CFI_RESTORE_STATE_AND_DEF_CFA
++
++Newer versions of clang reject multiple assembler directives
++on the same line, which breaks the preprocessor macro
++CFI_RESTORE_STATE_AND_DEF_CFA. Fix it by making it an assembler
++macro instead.
++
++Bug: 191980979
++Change-Id: I823ff9c66336931249d2bac40280b24ecdebd0cf
++(cherry picked from commit 082659bcbf66c08e2ad9be88363c7ab88c50e114)
++---
++ art/runtime/arch/x86/asm_support_x86.S             |  5 ++-
++ art/runtime/arch/x86/memcmp16_x86.S                | 38 ++++++++++++----------
++ art/runtime/arch/x86/quick_entrypoints_x86.S       |  8 ++---
++ art/runtime/arch/x86_64/asm_support_x86_64.S       |  7 +++-
++ art/runtime/arch/x86_64/quick_entrypoints_x86_64.S | 10 +++---
++ 5 files changed, 40 insertions(+), 28 deletions(-)
++
++diff --git a/art/runtime/arch/x86/asm_support_x86.S b/art/runtime/arch/x86/asm_support_x86.S
++index 8f43cc8..5f2f739 100644
++--- a/art/runtime/arch/x86/asm_support_x86.S
+++++ b/art/runtime/arch/x86/asm_support_x86.S
++@@ -82,7 +82,10 @@
++     // differ in the behaviour, so explicitly set the CFA to avoid any ambiguity.
++     // The restored CFA state should match the CFA state during CFI_REMEMBER_STATE.
++     // `objdump -Wf libart.so | egrep "_cfa|_state"` is useful to audit the opcodes.
++-    #define CFI_RESTORE_STATE_AND_DEF_CFA(reg,off) .cfi_restore_state .cfi_def_cfa reg,off
+++    MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+++        .cfi_restore_state
+++        .cfi_def_cfa \reg,\off
+++    END_MACRO
++     #define CFI_ESCAPE(...) .cfi_escape __VA_ARGS__
++ #else
++     // Mac OS' doesn't like cfi_* directives.
++diff --git a/art/runtime/arch/x86/memcmp16_x86.S b/art/runtime/arch/x86/memcmp16_x86.S
++index bd33a62..636ceb9 100644
++--- a/art/runtime/arch/x86/memcmp16_x86.S
+++++ b/art/runtime/arch/x86/memcmp16_x86.S
++@@ -40,7 +40,11 @@
++ #define BLK2        BLK1+4
++ #define LEN        BLK2+4
++ #define RETURN_END    POP (%edi); POP (%esi); POP (%ebx); ret
++-#define RETURN        RETURN_END; CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16); CFI_REMEMBER_STATE
+++MACRO0(RETURN)
+++    RETURN_END
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
+++    CFI_REMEMBER_STATE
+++END_MACRO
++ 
++ DEFINE_FUNCTION MEMCMP
++     movl       LEN(%esp), %ecx
++@@ -131,7 +135,7 @@ L(shr_0):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_0_gobble):
++@@ -177,7 +181,7 @@ L(shr_0_gobble_loop_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_2):
++@@ -207,7 +211,7 @@ L(shr_2):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_2_gobble):
++@@ -260,7 +264,7 @@ L(shr_2_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_4):
++@@ -290,7 +294,7 @@ L(shr_4):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_4_gobble):
++@@ -343,7 +347,7 @@ L(shr_4_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_6):
++@@ -373,7 +377,7 @@ L(shr_6):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_6_gobble):
++@@ -426,7 +430,7 @@ L(shr_6_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_8):
++@@ -456,7 +460,7 @@ L(shr_8):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_8_gobble):
++@@ -509,7 +513,7 @@ L(shr_8_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_10):
++@@ -539,7 +543,7 @@ L(shr_10):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_10_gobble):
++@@ -592,7 +596,7 @@ L(shr_10_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_12):
++@@ -622,7 +626,7 @@ L(shr_12):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_12_gobble):
++@@ -675,7 +679,7 @@ L(shr_12_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_14):
++@@ -705,7 +709,7 @@ L(shr_14):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(shr_14_gobble):
++@@ -758,7 +762,7 @@ L(shr_14_gobble_next):
++     POP        (%esi)
++     jmp        L(less48bytes)
++ 
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++     CFI_REMEMBER_STATE
++     .p2align 4
++ L(exit):
++diff --git a/art/runtime/arch/x86/quick_entrypoints_x86.S b/art/runtime/arch/x86/quick_entrypoints_x86.S
++index 7533cf8..d623a99 100644
++--- a/art/runtime/arch/x86/quick_entrypoints_x86.S
+++++ b/art/runtime/arch/x86/quick_entrypoints_x86.S
++@@ -944,7 +944,7 @@ MACRO3(ONE_ARG_SAVE_EVERYTHING_DOWNCALL, c_name, cxx_name, runtime_method_offset
++     CFI_REMEMBER_STATE
++     RESTORE_SAVE_EVERYTHING_FRAME_KEEP_EAX            // restore frame up to return address
++     ret                                               // return
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, FRAME_SIZE_SAVE_EVERYTHING)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, FRAME_SIZE_SAVE_EVERYTHING
++ 1:
++     DELIVER_PENDING_EXCEPTION_FRAME_READY
++     END_FUNCTION VAR(c_name)
++@@ -1835,7 +1835,7 @@ DEFINE_FUNCTION art_quick_imt_conflict_trampoline
++     POP ESI
++     POP EDI
++     jmp *ART_METHOD_QUICK_CODE_OFFSET_32(%eax)
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++ .Limt_table_next_entry:
++     // If the entry is null, the interface method is not in the ImtConflictTable.
++     cmpl LITERAL(0), 0(%edi)
++@@ -1851,7 +1851,7 @@ DEFINE_FUNCTION art_quick_imt_conflict_trampoline
++     POP ESI
++     POP EDI
++     INVOKE_TRAMPOLINE_BODY artInvokeInterfaceTrampoline
++-    CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
++ .Limt_conflict_trampoline_dex_cache_miss:
++     // We're not creating a proper runtime method frame here,
++     // artLookupResolvedMethod() is not allowed to walk the stack.
++@@ -2433,7 +2433,7 @@ DEFINE_FUNCTION art_quick_osr_stub
++     mov %edx, 4(%ecx)             // Store the other half of the result.
++     ret
++ .Losr_entry:
++-    CFI_RESTORE_STATE_AND_DEF_CFA(ebp, SAVE_SIZE)  // CFA = ebp + SAVE_SIZE
+++    CFI_RESTORE_STATE_AND_DEF_CFA ebp, SAVE_SIZE   // CFA = ebp + SAVE_SIZE
++     subl LITERAL(4), %ecx         // Given stack size contains pushed frame pointer, substract it.
++     subl %ecx, %esp
++     mov %esp, %edi                // EDI = beginning of stack
++diff --git a/art/runtime/arch/x86_64/asm_support_x86_64.S b/art/runtime/arch/x86_64/asm_support_x86_64.S
++index 2b50cdb..4606751 100644
++--- a/art/runtime/arch/x86_64/asm_support_x86_64.S
+++++ b/art/runtime/arch/x86_64/asm_support_x86_64.S
++@@ -81,7 +81,10 @@
++     // differ in the behaviour, so explicitly set the CFA to avoid any ambiguity.
++     // The restored CFA state should match the CFA state during CFI_REMEMBER_STATE.
++     // `objdump -Wf libart.so | egrep "_cfa|_state"` is useful to audit the opcodes.
++-    #define CFI_RESTORE_STATE_AND_DEF_CFA(reg,off) .cfi_restore_state .cfi_def_cfa reg,off
+++    MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+++        .cfi_restore_state
+++        .cfi_def_cfa \reg,\off
+++    END_MACRO
++     #define CFI_RESTORE_STATE .cfi_restore_state
++ #else
++     // Mac OS' doesn't like cfi_* directives.
++@@ -94,6 +97,8 @@
++     #define CFI_REL_OFFSET(reg,size)
++     #define CFI_REMEMBER_STATE
++     #define CFI_RESTORE_STATE_AND_DEF_CFA(off)
+++    MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+++    END_MACRO
++     #define CFI_RESTORE_STATE
++ #endif
++ 
++diff --git a/art/runtime/arch/x86_64/quick_entrypoints_x86_64.S b/art/runtime/arch/x86_64/quick_entrypoints_x86_64.S
++index 56961d7..68a1ee5 100644
++--- a/art/runtime/arch/x86_64/quick_entrypoints_x86_64.S
+++++ b/art/runtime/arch/x86_64/quick_entrypoints_x86_64.S
++@@ -828,7 +828,7 @@ MACRO3(ONE_ARG_SAVE_EVERYTHING_DOWNCALL, c_name, cxx_name, runtime_method_offset
++     CFI_REMEMBER_STATE
++     RESTORE_SAVE_EVERYTHING_FRAME_KEEP_RAX        // restore frame up to return address
++     ret
++-    CFI_RESTORE_STATE_AND_DEF_CFA(rsp, FRAME_SIZE_SAVE_EVERYTHING)
+++    CFI_RESTORE_STATE_AND_DEF_CFA rsp, FRAME_SIZE_SAVE_EVERYTHING
++ 1:
++     DELIVER_PENDING_EXCEPTION_FRAME_READY
++     END_FUNCTION VAR(c_name)
++@@ -1279,7 +1279,7 @@ DEFINE_FUNCTION art_quick_check_instance_of
++     addq LITERAL(24), %rsp            // pop arguments
++     CFI_ADJUST_CFA_OFFSET(-24)
++     ret
++-    CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 64)  // Reset unwind info so following code unwinds.
+++    CFI_RESTORE_STATE_AND_DEF_CFA rsp, 64  // Reset unwind info so following code unwinds.
++ 
++ .Lthrow_class_cast_exception:
++     RESTORE_FP_CALLEE_SAVE_FRAME
++@@ -1541,7 +1541,7 @@ DEFINE_FUNCTION art_quick_imt_conflict_trampoline
++     CFI_REMEMBER_STATE
++     POP rdx
++     jmp *ART_METHOD_QUICK_CODE_OFFSET_64(%rdi)
++-    CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA rsp, 16
++ .Limt_table_next_entry:
++     // If the entry is null, the interface method is not in the ImtConflictTable.
++     cmpq LITERAL(0), 0(%rdi)
++@@ -1556,7 +1556,7 @@ DEFINE_FUNCTION art_quick_imt_conflict_trampoline
++     POP rdx
++     movq %rax, %rdi  // Load interface method
++     INVOKE_TRAMPOLINE_BODY artInvokeInterfaceTrampoline
++-    CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 16)
+++    CFI_RESTORE_STATE_AND_DEF_CFA rsp, 16
++ .Limt_conflict_trampoline_dex_cache_miss:
++     // We're not creating a proper runtime method frame here,
++     // artLookupResolvedMethod() is not allowed to walk the stack.
++@@ -2260,7 +2260,7 @@ DEFINE_FUNCTION art_quick_osr_stub
++     movq %rax, (%rcx)              // Store the result.
++     ret
++ .Losr_entry:
++-    CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 80)
+++    CFI_RESTORE_STATE_AND_DEF_CFA rsp, 80
++     // Since the call has pushed the return address we need to switch the CFA register to RBP.
++     CFI_DEF_CFA_REGISTER(rbp)
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f78fabb6bf31a86b98bd8be93ee3cedc947d96f7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++Description: arm asm instruction
++Forwarded: not-needed
++--- a/art/runtime/interpreter/mterp/arm/main.S
+++++ b/art/runtime/interpreter/mterp/arm/main.S
++@@ -602,7 +602,7 @@ MterpCommonTakenBranch:
++ #endif
++     cmp     rPROFILE, #JIT_CHECK_OSR
++     beq     .L_osr_check
++-    subsgt  rPROFILE, #1
+++    subgt   rPROFILE, #1
++     beq     .L_add_batch                @ counted down to zero - report
++ .L_resume_backward_branch:
++     ldr     lr, [rSELF, #THREAD_FLAGS_OFFSET]
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c4be911c1d14740c07e5dbe97976ca032e1437bb
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,46 @@@
++Description: Conforms with the exception specification of `std::atomic`
++ All constructors of `std::atomic` require `noexcept`. As a result, its members
++ must also be able to instantiate without any exception throwing.
++Forwarded: not-needed
++--- a/art/runtime/mirror/dex_cache.h
+++++ b/art/runtime/mirror/dex_cache.h
++@@ -68,7 +68,7 @@
++   // Set the initial state for the 0th entry to be {0,1} which is guaranteed to fail
++   // the lookup id == stored id branch.
++   DexCachePair(ObjPtr<T> object, uint32_t index);
++-  DexCachePair() : index(0) {}
+++  DexCachePair() noexcept : index(0) {}
++   DexCachePair(const DexCachePair<T>&) = default;
++   DexCachePair& operator=(const DexCachePair<T>&) = default;
++ 
++@@ -91,7 +91,7 @@
++   NativeDexCachePair(T* object, uint32_t index)
++       : object(object),
++         index(index) {}
++-  NativeDexCachePair() : object(nullptr), index(0u) { }
+++  NativeDexCachePair() noexcept : object(nullptr), index(0u) { }
++   NativeDexCachePair(const NativeDexCachePair<T>&) = default;
++   NativeDexCachePair& operator=(const NativeDexCachePair<T>&) = default;
++ 
++--- a/art/runtime/mirror/object_reference.h
+++++ b/art/runtime/mirror/object_reference.h
++@@ -164,7 +164,7 @@
++ template<class MirrorType>
++ class MANAGED CompressedReference : public mirror::ObjectReference<false, MirrorType> {
++  public:
++-  CompressedReference<MirrorType>() REQUIRES_SHARED(Locks::mutator_lock_)
+++  CompressedReference<MirrorType>() noexcept REQUIRES_SHARED(Locks::mutator_lock_)
++       : mirror::ObjectReference<false, MirrorType>(nullptr) {}
++ 
++   static CompressedReference<MirrorType> FromMirrorPtr(MirrorType* p)
++--- a/art/runtime/gc_root.h
+++++ b/art/runtime/gc_root.h
++@@ -213,7 +213,7 @@
++     return root_.IsNull();
++   }
++ 
++-  ALWAYS_INLINE GcRoot() {}
+++  ALWAYS_INLINE GcRoot() noexcept {}
++   explicit ALWAYS_INLINE GcRoot(MirrorType* ref)
++       REQUIRES_SHARED(Locks::mutator_lock_);
++   explicit ALWAYS_INLINE GcRoot(ObjPtr<MirrorType> ref)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0191a4291694b7e03c259624ffe255322698c154
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,19 @@@
++Description: non-x86 arches do not have PAGE_SIZE
++Forwarded: not-needed
++--- a/art/libartbase/base/safe_copy.cc
+++++ b/art/libartbase/base/safe_copy.cc
++@@ -56,10 +56,11 @@ ssize_t SafeCopy(void *dst, const void *src, size_t len) {
++     }
++ 
++     src_iovs[iovecs_used].iov_base = const_cast<char*>(cur);
++-    if (!IsAlignedParam(cur, PAGE_SIZE)) {
++-      src_iovs[iovecs_used].iov_len = AlignUp(cur, PAGE_SIZE) - cur;
+++    size_t pagesize = static_cast<size_t>(sysconf(_SC_PAGE_SIZE));
+++    if (!IsAlignedParam(cur, pagesize)) {
+++      src_iovs[iovecs_used].iov_len = AlignUp(cur, pagesize) - cur;
++     } else {
++-      src_iovs[iovecs_used].iov_len = PAGE_SIZE;
+++      src_iovs[iovecs_used].iov_len = pagesize;
++     }
++ 
++     src_iovs[iovecs_used].iov_len = std::min(src_iovs[iovecs_used].iov_len, len);
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9f6a2a4a6c81224888a0d76088df09db572445e3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,33 @@@
++Description: Add missing 'std::' scope identifiers.
++Forwarded: not-needed
++--- a/art/libdexfile/dex/compact_offset_table.h
+++++ b/art/libdexfile/dex/compact_offset_table.h
++@@ -28,7 +28,7 @@
++  public:
++   // This value is coupled with the leb chunk bitmask. That logic must also be adjusted when the
++   // integer is modified.
++-  static constexpr size_t kElementsPerIndex = 16;
+++  static constexpr std::size_t kElementsPerIndex = 16;
++ 
++   // Leb block format:
++   // [uint16_t] 16 bit mask for what indexes actually have a non zero offset for the chunk.
++@@ -61,7 +61,7 @@
++                     uint32_t* out_table_offset);
++ 
++   // 32 bit aligned for the offset table.
++-  static constexpr size_t kAlignment = sizeof(uint32_t);
+++  static constexpr std::size_t kAlignment = sizeof(uint32_t);
++ };
++ 
++ }  // namespace art
++--- a/art/runtime/class_linker.cc
+++++ b/art/runtime/class_linker.cc
++@@ -3181,7 +3181,7 @@
++     return Finish(h_klass);
++   }
++ 
++-  ObjPtr<mirror::Class> Finish(nullptr_t np ATTRIBUTE_UNUSED)
+++  ObjPtr<mirror::Class> Finish(std::nullptr_t np ATTRIBUTE_UNUSED)
++       REQUIRES_SHARED(Locks::mutator_lock_) {
++     ScopedNullHandle<mirror::Class> snh;
++     return Finish(snh);
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..07c0319788981c89d4d35c9a0a41ecf2bec4d1ee
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++Description: get libart building
++Forwarded: not-needed
++--- a/art/runtime/gc/space/image_space.cc
+++++ b/art/runtime/gc/space/image_space.cc
++@@ -3272,7 +3272,7 @@ class ImageSpace::BootImageLoader {
++ 
++   if (VLOG_IS_ON(image)) {
++     LOG(INFO) << "ImageSpace::BootImageLoader::LoadFromSystem exiting "
++-        << boot_image_spaces->front();
+++        << *boot_image_spaces->front();
++     logger.Dump(LOG_STREAM(INFO));
++   }
++   return true;
++@@ -3303,7 +3303,7 @@ class ImageSpace::BootImageLoader {
++ 
++   if (VLOG_IS_ON(image)) {
++     LOG(INFO) << "ImageSpace::BootImageLoader::LoadFromDalvikCache exiting "
++-        << boot_image_spaces->front();
+++        << *boot_image_spaces->front();
++     logger.Dump(LOG_STREAM(INFO));
++   }
++   return true;
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..044a9f6fa0811ce6c83830154a7cea8e3b4aeefa
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,37 @@@
++Description: Add standard namespace scope resolution
++Forwarded: not-needed
++--- a/art/libdexfile/dex/method_reference.h
+++++ b/art/libdexfile/dex/method_reference.h
++@@ -52,20 +52,20 @@ struct MethodReferenceValueComparator {
++     // Compare the class descriptors first.
++     const dex::MethodId& mid1 = mr1.GetMethodId();
++     const dex::MethodId& mid2 = mr2.GetMethodId();
++-    int descriptor_diff = strcmp(mr1.dex_file->StringByTypeIdx(mid1.class_idx_),
+++    int descriptor_diff = std::strcmp(mr1.dex_file->StringByTypeIdx(mid1.class_idx_),
++                                  mr2.dex_file->StringByTypeIdx(mid2.class_idx_));
++     if (descriptor_diff != 0) {
++       return descriptor_diff < 0;
++     }
++     // Compare names second.
++-    int name_diff = strcmp(mr1.dex_file->GetMethodName(mid1), mr2.dex_file->GetMethodName(mid2));
+++    int name_diff = std::strcmp(mr1.dex_file->GetMethodName(mid1), mr2.dex_file->GetMethodName(mid2));
++     if (name_diff != 0) {
++       return name_diff < 0;
++     }
++     // And then compare proto ids, starting with return type comparison.
++     const dex::ProtoId& prid1 = mr1.dex_file->GetProtoId(mid1.proto_idx_);
++     const dex::ProtoId& prid2 = mr2.dex_file->GetProtoId(mid2.proto_idx_);
++-    int return_type_diff = strcmp(mr1.dex_file->StringByTypeIdx(prid1.return_type_idx_),
+++    int return_type_diff = std::strcmp(mr1.dex_file->StringByTypeIdx(prid1.return_type_idx_),
++                                   mr2.dex_file->StringByTypeIdx(prid2.return_type_idx_));
++     if (return_type_diff != 0) {
++       return return_type_diff < 0;
++@@ -76,7 +76,7 @@ struct MethodReferenceValueComparator {
++     const dex::TypeList* params2 = mr2.dex_file->GetProtoParameters(prid2);
++     size_t param2_size = (params2 != nullptr) ? params2->Size() : 0u;
++     for (size_t i = 0, num = std::min(param1_size, param2_size); i != num; ++i) {
++-      int param_diff = strcmp(mr1.dex_file->StringByTypeIdx(params1->GetTypeItem(i).type_idx_),
+++      int param_diff = std::strcmp(mr1.dex_file->StringByTypeIdx(params1->GetTypeItem(i).type_idx_),
++                               mr2.dex_file->StringByTypeIdx(params2->GetTypeItem(i).type_idx_));
++       if (param_diff != 0) {
++         return param_diff < 0;
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..725b08ff020afbe9dcb8d7c60f7cf3b3412fed0a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,307 @@@
++Description: somehow upstream builds don't need these headers :-/
++Forwarded: not-needed
++--- a/art/runtime/runtime_common.h
+++++ b/art/runtime/runtime_common.h
++@@ -27,6 +27,7 @@
++ 
++ #include <sys/utsname.h>
++ #include <ucontext.h>
+++#include <signal.h>
++ 
++ #include <iomanip>
++ 
++--- a/art/sigchainlib/sigchain.cc
+++++ b/art/sigchainlib/sigchain.cc
++@@ -27,6 +27,7 @@
++ #include <mutex>
++ #include <type_traits>
++ #include <utility>
+++#include <climits>
++ 
++ #include "log.h"
++ #include "sigchain.h"
++--- a/art/runtime/base/mutex.cc
+++++ b/art/runtime/base/mutex.cc
++@@ -18,6 +18,7 @@
++ 
++ #include <errno.h>
++ #include <sys/time.h>
+++#include <algorithm>
++ 
++ #include <sstream>
++ 
++--- a/art/runtime/exec_utils.cc
+++++ b/art/runtime/exec_utils.cc
++@@ -20,6 +20,7 @@
++ #include <sys/wait.h>
++ #include <string>
++ #include <vector>
+++#include <cstring>
++ 
++ #include "android-base/stringprintf.h"
++ #include "android-base/strings.h"
++--- a/art/runtime/gc/accounting/heap_bitmap.cc
+++++ b/art/runtime/gc/accounting/heap_bitmap.cc
++@@ -16,6 +16,8 @@
++ 
++ #include "heap_bitmap.h"
++ 
+++#include <algorithm>
+++
++ #include "gc/accounting/space_bitmap-inl.h"
++ #include "gc/space/space.h"
++ 
++--- a/art/runtime/gc/accounting/read_barrier_table.h
+++++ b/art/runtime/gc/accounting/read_barrier_table.h
++@@ -18,6 +18,7 @@
++ #define ART_RUNTIME_GC_ACCOUNTING_READ_BARRIER_TABLE_H_
++ 
++ #include <sys/mman.h>  // For the PROT_* and MAP_* constants.
+++#include <cstring>
++ 
++ #include "base/bit_utils.h"
++ #include "base/locks.h"
++--- a/art/runtime/jit/profiling_info.h
+++++ b/art/runtime/jit/profiling_info.h
++@@ -18,6 +18,7 @@
++ #define ART_RUNTIME_JIT_PROFILING_INFO_H_
++ 
++ #include <vector>
+++#include <cstring>
++ 
++ #include "base/macros.h"
++ #include "gc_root.h"
++--- a/art/runtime/arch/instruction_set_features.cc
+++++ b/art/runtime/arch/instruction_set_features.cc
++@@ -21,6 +21,8 @@
++ #include <algorithm>
++ #include <ostream>
++ 
+++#include <algorithm>
+++
++ #include "android-base/strings.h"
++ 
++ #include "base/casts.h"
++--- a/art/runtime/arch/mips/instruction_set_features_mips.cc
+++++ b/art/runtime/arch/mips/instruction_set_features_mips.cc
++@@ -18,6 +18,7 @@
++ 
++ #include <fstream>
++ #include <sstream>
+++#include <cstring>
++ 
++ #include <android-base/stringprintf.h>
++ #include <android-base/strings.h>
++--- a/art/runtime/monitor.h
+++++ b/art/runtime/monitor.h
++@@ -24,6 +24,7 @@
++ #include <iosfwd>
++ #include <list>
++ #include <vector>
+++#include <cstring>
++ 
++ #include "base/allocator.h"
++ #include "base/atomic.h"
++--- a/art/runtime/arch/x86/context_x86.cc
+++++ b/art/runtime/arch/x86/context_x86.cc
++@@ -16,6 +16,8 @@
++ 
++ #include "context_x86.h"
++ 
+++#include <cstring>
+++
++ #include "base/bit_utils.h"
++ #include "base/bit_utils_iterator.h"
++ #include "base/memory_tool.h"
++--- a/art/libartbase/base/arena_allocator.h
+++++ b/art/libartbase/base/arena_allocator.h
++@@ -17,6 +17,7 @@
++ #ifndef ART_LIBARTBASE_BASE_ARENA_ALLOCATOR_H_
++ #define ART_LIBARTBASE_BASE_ARENA_ALLOCATOR_H_
++ 
+++#include <cstring>
++ #include <stddef.h>
++ #include <stdint.h>
++ 
++--- a/art/libdexfile/dex/dex_file_types.h
+++++ b/art/libdexfile/dex/dex_file_types.h
++@@ -17,6 +17,8 @@
++ #ifndef ART_LIBDEXFILE_DEX_DEX_FILE_TYPES_H_
++ #define ART_LIBDEXFILE_DEX_DEX_FILE_TYPES_H_
++ 
+++#include <cstdint>
+++#include <functional>
++ #include <iosfwd>
++ #include <limits>
++ #include <utility>
++--- a/art/libdexfile/dex/method_reference.h
+++++ b/art/libdexfile/dex/method_reference.h
++@@ -17,6 +17,7 @@
++ #ifndef ART_LIBDEXFILE_DEX_METHOD_REFERENCE_H_
++ #define ART_LIBDEXFILE_DEX_METHOD_REFERENCE_H_
++ 
+++#include <cstring>
++ #include <stdint.h>
++ #include <string>
++ #include "dex/dex_file.h"
++--- a/art/libartbase/base/arena_containers.h
+++++ b/art/libartbase/base/arena_containers.h
++@@ -17,6 +17,7 @@
++ #ifndef ART_LIBARTBASE_BASE_ARENA_CONTAINERS_H_
++ #define ART_LIBARTBASE_BASE_ARENA_CONTAINERS_H_
++ 
+++#include <cstring>
++ #include <deque>
++ #include <queue>
++ #include <set>
++--- a/art/libartbase/arch/instruction_set.cc
+++++ b/art/libartbase/arch/instruction_set.cc
++@@ -19,6 +19,7 @@
++ #include "android-base/logging.h"
++ #include "base/bit_utils.h"
++ #include "base/globals.h"
+++#include <cstring>
++ 
++ namespace art {
++ 
++--- a/art/libartbase/base/bit_vector-inl.h
+++++ b/art/libartbase/base/bit_vector-inl.h
++@@ -20,6 +20,7 @@
++ #include "bit_vector.h"
++ 
++ #include <android-base/logging.h>
+++#include <cstring>
++ 
++ #include "bit_utils.h"
++ 
++--- a/art/libartbase/base/bit_vector.cc
+++++ b/art/libartbase/base/bit_vector.cc
++@@ -16,6 +16,7 @@
++ 
++ #include "bit_vector.h"
++ 
+++#include <cstring>
++ #include <limits>
++ #include <sstream>
++ 
++--- a/art/libartbase/base/file_utils.cc
+++++ b/art/libartbase/base/file_utils.cc
++@@ -40,6 +40,7 @@
++ 
++ 
++ #include <memory>
+++#include <cstring>
++ 
++ #include "android-base/stringprintf.h"
++ #include "android-base/strings.h"
++--- a/art/libartbase/base/bit_vector.h
+++++ b/art/libartbase/base/bit_vector.h
++@@ -18,6 +18,7 @@
++ #define ART_LIBARTBASE_BASE_BIT_VECTOR_H_
++ 
++ #include <stdint.h>
+++#include <cstring>
++ #include <iterator>
++ 
++ #include "bit_utils.h"
++--- a/art/libartbase/base/file_magic.cc
+++++ b/art/libartbase/base/file_magic.cc
++@@ -19,6 +19,7 @@
++ #include <fcntl.h>
++ #include <sys/stat.h>
++ #include <sys/types.h>
+++#include <cstring>
++ 
++ #include <android-base/logging.h>
++ #include <android-base/stringprintf.h>
++--- a/art/libartbase/base/logging.cc
+++++ b/art/libartbase/base/logging.cc
++@@ -16,6 +16,7 @@
++ 
++ #include "logging.h"
++ 
+++#include <cstring>
++ #include <iostream>
++ #include <limits>
++ #include <sstream>
++--- a/art/libartbase/base/memfd.cc
+++++ b/art/libartbase/base/memfd.cc
++@@ -31,6 +31,7 @@
++ #include <android-base/logging.h>
++ #include <android-base/unique_fd.h>
++ 
+++#include <cstring>
++ #include "macros.h"
++ 
++ 
++--- a/art/libartbase/base/endian_utils.h
+++++ b/art/libartbase/base/endian_utils.h
++@@ -20,6 +20,7 @@
++ #include <stdint.h>
++ #include <endian.h>
++ #include <vector>
+++#include <cstring>
++ 
++ namespace art {
++ 
++--- a/art/libartbase/base/membarrier.cc
+++++ b/art/libartbase/base/membarrier.cc
++@@ -18,6 +18,7 @@
++ 
++ #include <errno.h>
++ #include <stdio.h>
+++#include <cstring>
++ 
++ #if !defined(_WIN32)
++ #include <sys/syscall.h>
++--- a/art/libartbase/base/scoped_flock.cc
+++++ b/art/libartbase/base/scoped_flock.cc
++@@ -19,6 +19,8 @@
++ #include <sys/file.h>
++ #include <sys/stat.h>
++ 
+++#include <cstring>
+++
++ #include <android-base/logging.h>
++ #include <android-base/stringprintf.h>
++ 
++--- a/art/libartbase/base/unix_file/fd_file.cc
+++++ b/art/libartbase/base/unix_file/fd_file.cc
++@@ -29,6 +29,7 @@
++ #include <windows.h>
++ #endif
++ 
+++#include <cstring>
++ #include <limits>
++ 
++ #include <android-base/file.h>
++--- a/art/libdexfile/dex/descriptors_names.cc
+++++ b/art/libdexfile/dex/descriptors_names.cc
++@@ -21,6 +21,7 @@
++ 
++ #include "base/macros.h"
++ #include "dex/utf-inl.h"
+++#include <cstring>
++ 
++ namespace art {
++ 
++--- a/art/libdexfile/dex/dex_file_loader.h
+++++ b/art/libdexfile/dex/dex_file_loader.h
++@@ -18,6 +18,7 @@
++ #define ART_LIBDEXFILE_DEX_DEX_FILE_LOADER_H_
++ 
++ #include <cstdint>
+++#include <cstring>
++ #include <memory>
++ #include <string>
++ #include <vector>
++--- a/art/libprofile/profile/profile_boot_info.cc
+++++ b/art/libprofile/profile/profile_boot_info.cc
++@@ -18,6 +18,7 @@
++ 
++ #include <unistd.h>
++ 
+++#include <cstring>
++ #include <vector>
++ 
++ #include "dex/dex_file.h"
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..438ca01dc911fbf0d1cce5c62f2cf6e5c1e07b3a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,47 @@@
++Description: Fix python interpreter name
++Forwarded: not-needed
++diff --git a/art/runtime/interpreter/mterp/common/gen_setup.py b/art/runtime/interpreter/mterp/common/gen_setup.py
++index 2684ab2..ac0606b 100644
++--- a/art/runtime/interpreter/mterp/common/gen_setup.py
+++++ b/art/runtime/interpreter/mterp/common/gen_setup.py
++@@ -19,7 +19,7 @@
++ # the templated snippets. Those define all the helper functions used below.
++ 
++ import sys, re
++-from cStringIO import StringIO
+++from io import StringIO
++ 
++ out = StringIO()  # File-like in-memory buffer.
++ handler_size_bytes = "MTERP_HANDLER_SIZE"
++diff --git a/art/runtime/interpreter/mterp/gen_mterp.py b/art/runtime/interpreter/mterp/gen_mterp.py
++index 5d25955..8534e99 100755
++--- a/art/runtime/interpreter/mterp/gen_mterp.py
+++++ b/art/runtime/interpreter/mterp/gen_mterp.py
++@@ -1,4 +1,4 @@
++-#!/usr/bin/env python
+++#!/usr/bin/env python3
++ #
++ # Copyright (C) 2016 The Android Open Source Project
++ #
++@@ -15,7 +15,7 @@
++ # limitations under the License.
++ 
++ import sys, re, os
++-from cStringIO import StringIO
+++from io import StringIO
++ 
++ SCRIPT_DIR = os.path.dirname(sys.argv[0])
++ # This file is included verbatim at the start of the in-memory python script.
++@@ -37,9 +37,9 @@ def getOpcodeList():
++   opcode_fp.close()
++ 
++   if len(opcodes) != NUM_PACKED_OPCODES:
++-    print "ERROR: found %d opcodes in Interp.h (expected %d)" \
++-        % (len(opcodes), NUM_PACKED_OPCODES)
++-    raise SyntaxError, "bad opcode count"
+++    print("ERROR: found %d opcodes in Interp.h (expected %d)" \
+++        % (len(opcodes), NUM_PACKED_OPCODES))
+++    raise SyntaxError("bad opcode count")
++   return opcodes
++ 
++ indent_re = re.compile(r"^%( *)")
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..80300c476f46884574d28cbd167db35d6541a6ff
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,33 @@@
++Description: Use `Stats*` instead of `Stats`
++Forwarded: not-needed
++--- a/art/libartbase/base/stats.h
+++++ b/art/libartbase/base/stats.h
++@@ -28,8 +28,8 @@ class Stats {
++  public:
++   double Value() const { return value_; }
++   size_t Count() const { return count_; }
++-  Stats* Child(const char* name) { return &children_[name]; }
++-  const std::unordered_map<const char*, Stats>& Children() const { return children_; }
+++  Stats* Child(const char* name) { return &(*children_)[name]; }
+++  const std::unordered_map<const char*, Stats>& Children() const { return *children_; }
++ 
++   void AddBytes(double bytes, size_t count = 1) { Add(bytes, count); }
++   void AddBits(double bits, size_t count = 1) { Add(bits / kBitsPerByte, count); }
++@@ -38,7 +38,7 @@ class Stats {
++ 
++   double SumChildrenValues() const {
++     double sum = 0.0;
++-    for (auto it : children_) {
+++    for (auto it : *children_) {
++       sum += it.second.Value();
++     }
++     return sum;
++@@ -52,7 +52,7 @@ class Stats {
++ 
++   double value_ = 0.0;  // Commutative sum of the collected statistic in basic units.
++   size_t count_ = 0;    // The number of samples for this node.
++-  std::unordered_map<const char*, Stats> children_;
+++  std::unordered_map<const char*, Stats>* children_;
++ };
++ 
++ }  // namespace art
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5189c893cd022a0999b306b8d5240d60951ffbf3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++Description: Fix concatenation of storage_mode string.
++Forwarded: not-needed
++--- a/art/runtime/image.cc
+++++ b/art/runtime/image.cc
++@@ -172,7 +172,7 @@ bool ImageHeader::Block::Decompress(uint8_t* out_ptr,
++     }
++     default: {
++       if (error_msg != nullptr) {
++-        *error_msg = (std::ostringstream() << "Invalid image format " << storage_mode_).str();
+++        *error_msg = "Invalid image format " + storage_mode_;
++       }
++       return false;
++     }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..970eea16106f9b69685daeb8bc01f395b07002f0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,209 @@@
++Description: Use `ucontext_t` instead of `ucontext`
++ Both Bionic and glibc define a struct called `ucontext_t` but only Bionic
++ defines an alias `ucontext_t`. Let's use the more standardized one.
++Forwarded: not-needed
++--- a/art/runtime/native_stack_dump.cc
+++++ b/art/runtime/native_stack_dump.cc
++@@ -38,6 +38,7 @@
++ #include <stdlib.h>
++ #include <sys/time.h>
++ #include <sys/types.h>
+++#include <sys/ucontext.h>
++ 
++ #include "android-base/file.h"
++ #include "android-base/stringprintf.h"
++@@ -328,7 +329,7 @@
++   }
++   std::unique_ptr<Backtrace> backtrace(Backtrace::Create(BACKTRACE_CURRENT_PROCESS, tid, map));
++   backtrace->SetSkipFrames(skip_frames);
++-  if (!backtrace->Unwind(0, reinterpret_cast<ucontext*>(ucontext_ptr))) {
+++  if (!backtrace->Unwind(0, reinterpret_cast<ucontext_t*>(ucontext_ptr))) {
++     os << prefix << "(backtrace::Unwind failed for thread " << tid
++        << ": " <<  backtrace->GetErrorString(backtrace->GetError()) << ")" << std::endl;
++     return;
++--- a/art/runtime/arch/x86/fault_handler_x86.cc
+++++ b/art/runtime/arch/x86/fault_handler_x86.cc
++@@ -282,7 +282,7 @@
++                                              uintptr_t* out_return_pc,
++                                              uintptr_t* out_sp,
++                                              bool* out_is_stack_overflow) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   *out_sp = static_cast<uintptr_t>(uc->CTX_ESP);
++   VLOG(signals) << "sp: " << std::hex << *out_sp;
++   if (*out_sp == 0) {
++@@ -325,7 +325,7 @@
++   if (!IsValidImplicitCheck(sig)) {
++     return false;
++   }
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   uint8_t* pc = reinterpret_cast<uint8_t*>(uc->CTX_EIP);
++   uint8_t* sp = reinterpret_cast<uint8_t*>(uc->CTX_ESP);
++ 
++@@ -381,7 +381,7 @@
++ #endif
++   uint8_t checkinst2[] = {0x85, 0x00};
++ 
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   uint8_t* pc = reinterpret_cast<uint8_t*>(uc->CTX_EIP);
++   uint8_t* sp = reinterpret_cast<uint8_t*>(uc->CTX_ESP);
++ 
++@@ -437,7 +437,7 @@
++ // address for the previous method is on the stack at ESP.
++ 
++ bool StackOverflowHandler::Action(int, siginfo_t* info, void* context) {
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   uintptr_t sp = static_cast<uintptr_t>(uc->CTX_ESP);
++ 
++   uintptr_t fault_addr = reinterpret_cast<uintptr_t>(info->si_addr);
++--- a/art/runtime/arch/arm64/fault_handler_arm64.cc
+++++ b/art/runtime/arch/arm64/fault_handler_arm64.cc
++@@ -44,7 +44,7 @@
++                                              uintptr_t* out_return_pc,
++                                              uintptr_t* out_sp,
++                                              bool* out_is_stack_overflow) {
++-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   *out_sp = static_cast<uintptr_t>(sc->sp);
++   VLOG(signals) << "sp: " << *out_sp;
++@@ -77,7 +77,7 @@
++   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
++   // the load/store instruction that might cause the fault.
++ 
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++ 
++   // Push the gc map location to the stack and pass the fault address in LR.
++@@ -106,7 +106,7 @@
++       (Thread::ThreadSuspendTriggerOffset<PointerSize::k64>().Int32Value() << 7);
++   uint32_t checkinst2 = 0xf9400000;
++ 
++-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   uint8_t* ptr2 = reinterpret_cast<uint8_t*>(sc->pc);
++   uint8_t* ptr1 = ptr2 - 4;
++@@ -152,7 +152,7 @@
++ 
++ bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBUTE_UNUSED,
++                                   void* context) {
++-  struct ucontext *uc = reinterpret_cast<struct ucontext *>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t *>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
++   VLOG(signals) << "sigcontext: " << std::hex << sc;
++--- a/art/runtime/arch/arm/fault_handler_arm.cc
+++++ b/art/runtime/arch/arm/fault_handler_arm.cc
++@@ -51,7 +51,7 @@
++                                              uintptr_t* out_return_pc,
++                                              uintptr_t* out_sp,
++                                              bool* out_is_stack_overflow) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   *out_sp = static_cast<uintptr_t>(sc->arm_sp);
++   VLOG(signals) << "sp: " << std::hex << *out_sp;
++@@ -99,7 +99,7 @@
++   // register in order to find the mapping.
++ 
++   // Need to work out the size of the instruction that caused the exception.
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   uint8_t* ptr = reinterpret_cast<uint8_t*>(sc->arm_pc);
++   uint32_t instr_size = GetInstructionSize(ptr);
++@@ -132,7 +132,7 @@
++       + Thread::ThreadSuspendTriggerOffset<PointerSize::k32>().Int32Value();
++   uint16_t checkinst2 = 0x6800;
++ 
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   uint8_t* ptr2 = reinterpret_cast<uint8_t*>(sc->arm_pc);
++   uint8_t* ptr1 = ptr2 - 4;
++@@ -197,7 +197,7 @@
++ 
++ bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info ATTRIBUTE_UNUSED,
++                                   void* context) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
++   VLOG(signals) << "sigcontext: " << std::hex << sc;
++--- a/art/runtime/arch/arm/instruction_set_features_arm.cc
+++++ b/art/runtime/arch/arm/instruction_set_features_arm.cc
++@@ -223,8 +223,9 @@
++                             siginfo_t* si ATTRIBUTE_UNUSED,
++                             void* data) {
++ #if defined(__arm__)
++-  struct ucontext *uc = (struct ucontext *)data;
++-  struct sigcontext *sc = &uc->uc_mcontext;
+++  struct ucontext_t *uc = (struct ucontext_t *)data;
+++  // See the starting chunk of `FaultManager::GetMethodAndReturnPcAndSp()` in `fault_handler_arm.cc`
+++  struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   sc->arm_r0 = 0;     // Set R0 to #0 to signal error.
++   sc->arm_pc += 4;    // Skip offending instruction.
++ #else
++--- a/art/runtime/arch/mips/fault_handler_mips.cc
+++++ b/art/runtime/arch/mips/fault_handler_mips.cc
++@@ -43,7 +43,7 @@
++                                              uintptr_t* out_return_pc,
++                                              uintptr_t* out_sp,
++                                              bool* out_is_stack_overflow) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   *out_sp = static_cast<uintptr_t>(sc->sc_regs[mips::SP]);
++   VLOG(signals) << "sp: " << *out_sp;
++@@ -77,7 +77,7 @@
++   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
++   // the load/store instruction that might cause the fault.
++ 
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++ 
++   // Decrement $sp by the frame size of the kSaveEverything method and store
++@@ -112,7 +112,7 @@
++ // to the overflow region below the protected region.
++ 
++ bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void* context) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
++   VLOG(signals) << "sigcontext: " << std::hex << sc;
++--- a/art/runtime/arch/mips64/fault_handler_mips64.cc
+++++ b/art/runtime/arch/mips64/fault_handler_mips64.cc
++@@ -44,7 +44,7 @@
++                                              uintptr_t* out_return_pc,
++                                              uintptr_t* out_sp,
++                                              bool* out_is_stack_overflow) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   *out_sp = static_cast<uintptr_t>(sc->sc_regs[mips64::SP]);
++   VLOG(signals) << "sp: " << *out_sp;
++@@ -79,7 +79,7 @@
++   // PC at the point of call.  For Null checks we insert a GC map that is immediately after
++   // the load/store instruction that might cause the fault.
++ 
++-  struct ucontext *uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t *uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++ 
++   // Decrement $sp by the frame size of the kSaveEverything method and store
++@@ -114,7 +114,7 @@
++ // to the overflow region below the protected region.
++ 
++ bool StackOverflowHandler::Action(int sig ATTRIBUTE_UNUSED, siginfo_t* info, void* context) {
++-  struct ucontext* uc = reinterpret_cast<struct ucontext*>(context);
+++  struct ucontext_t* uc = reinterpret_cast<struct ucontext_t*>(context);
++   struct sigcontext *sc = reinterpret_cast<struct sigcontext*>(&uc->uc_mcontext);
++   VLOG(signals) << "stack overflow handler with sp at " << std::hex << &uc;
++   VLOG(signals) << "sigcontext: " << std::hex << sc;
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8580057f54834b51aad8a58e9742015c2848010f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++Description: Make libart use dlmalloc from
++https://android.googlesource.com/platform/external/dlmalloc
++Forwarded: not-needed
++--- a/art/runtime/gc/allocator/dlmalloc.h
+++++ b/art/runtime/gc/allocator/dlmalloc.h
++@@ -33,7 +33,7 @@
++ #pragma GCC diagnostic push
++ #pragma GCC diagnostic ignored "-Wredundant-decls"
++ #pragma GCC diagnostic ignored "-Wnull-pointer-arithmetic"
++-#include "../../external/dlmalloc/malloc.h"
+++#include "../../../../debian/include/art/dlmalloc/malloc.h"
++ #pragma GCC diagnostic pop
++ 
++ // Callback for dlmalloc_inspect_all or mspace_inspect_all that will madvise(2) unused
++--- a/art/runtime/gc/allocator/dlmalloc.cc
+++++ b/art/runtime/gc/allocator/dlmalloc.cc
++@@ -39,7 +39,7 @@
++ #pragma GCC diagnostic ignored "-Wstrict-aliasing"
++ #pragma GCC diagnostic ignored "-Wnull-pointer-arithmetic"
++ #pragma GCC diagnostic ignored "-Wexpansion-to-defined"
++-#include "../../../external/dlmalloc/malloc.c"
+++#include "../../../../debian/include/art/dlmalloc/malloc.c"
++ // Note: malloc.c uses a DEBUG define to drive debug code. This interferes with the DEBUG severity
++ //       of libbase, so undefine it now.
++ #undef DEBUG
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..87a53de5a61da6e9bc3bac7b80f2445e1f412715
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++Description: Workaround cacheflush on arm
++Forwarded: not-needed
++--- a/art/libartbase/base/utils.cc
+++++ b/art/libartbase/base/utils.cc
++@@ -76,7 +76,10 @@ static constexpr size_t kMaxFlushAttempts = 4;
++ int CacheFlush(uintptr_t start, uintptr_t limit) {
++   // The signature of cacheflush(2) seems to vary by source. On ARM the system call wrapper
++   //    (bionic/SYSCALLS.TXT) has the form: int cacheflush(long start, long end, long flags);
++-  int r = cacheflush(start, limit, kCacheFlushFlags);
+++//  int r = cacheflush(start, limit, kCacheFlushFlags);
+++//This is only for ARM
+++//Workaround/skip cacheflush until we find the real replacement
+++  int r = 0;
++   if (r == -1) {
++     CHECK_NE(errno, EINVAL);
++   }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..80a1600b512d00ad3ab63d0f9f291a8bfaeac454
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++From: Shaju Mathew <shaju@google.com>
++Date: Tue, 5 Apr 2022 14:45:28 +0000
++Subject: Backport of Win-specific suppression of potentially rogue construct
++ that can engage in directory traversal on the host.
++
++Bug:209438553
++
++Ignore-AOSP-First: Resolution for potential security exploit.
++
++Test: Relying on presubmits for now.
++Will followup with a full-fledged sync and manual cursory test.
++
++Merged-In: Ie1f82db2fb14e1bdd183bf8d3d93d5e9f974be5d
++Change-Id: I2a5da348eba104a7d06d6c0acb3cd56b770142a1
++---
++ system/core/adb/client/file_sync_client.cpp | 12 +++++++++++-
++ 1 file changed, 11 insertions(+), 1 deletion(-)
++
++diff --git a/system/core/adb/client/file_sync_client.cpp b/system/core/adb/client/file_sync_client.cpp
++index 922f2ba..a5207c7 100644
++--- a/system/core/adb/client/file_sync_client.cpp
+++++ b/system/core/adb/client/file_sync_client.cpp
++@@ -399,7 +399,17 @@ class SyncConnection {
++ 
++             if (!ReadFdExactly(fd, buf, len)) return false;
++             buf[len] = 0;
++-
+++            // Address the unlikely scenario wherein a
+++            // compromised device/service might be able to
+++            // traverse across directories on the host. Let's
+++            // shut that door!
+++            if (strchr(buf, '/')
+++#if defined(_WIN32)
+++                || strchr(buf, '\\')
+++#endif
+++            ) {
+++                return false;
+++            }
++             callback(dent.mode, dent.size, dent.mtime, buf);
++         }
++     }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1cc75d1dedd2a25297ebcf48ab1f1d43021953ab
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,168 @@@
++From: Shaju Mathew <shaju@google.com>
++Date: Sat, 25 Jun 2022 14:57:31 +0000
++Subject: Reject external connect: requests.
++
++Steps:
++  1. Track forward:reverse config in a data-structure.
++  2. connect_to_remote() examines each socket transport and updates
++    this data-structure.
++  3. handle_packet() takes appropriate action
++    (abort) for an unknown connect: request originating from the device.
++
++Bug:205286508
++
++Test: treehugger
++
++Signed-off-by: jmgao <jmgao@fb.com>
++Change-Id: I0ec7d6f8e60afc2ee5d1be2b63bf90ca99443a52
++---
++ system/core/adb/adb.cpp       | 11 ++++++++-
++ system/core/adb/sockets.cpp   |  6 +++++
++ system/core/adb/transport.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++
++ system/core/adb/transport.h   | 12 +++++++++
++ 4 files changed, 85 insertions(+), 1 deletion(-)
++
++diff --git a/system/core/adb/adb.cpp b/system/core/adb/adb.cpp
++index a2a766b..044571b 100644
++--- a/system/core/adb/adb.cpp
+++++ b/system/core/adb/adb.cpp
++@@ -369,7 +369,16 @@ void handle_packet(apacket *p, atransport *t)
++             // byte. The client sent strings with null termination, which post-string_view, start
++             // being interpreted as part of the string, unless we explicitly strip them.
++             address = StripTrailingNulls(address);
++-
+++#if ADB_HOST
+++            // The incoming address (from the payload) might be some other
+++            // target (e.g tcp:<ip>:8000), however we do not allow *any*
+++            // such requests - namely, those from (a potentially compromised)
+++            // adbd (reverse:forward: source) port transport.
+++            if (!t->IsReverseConfigured(address.data())) {
+++                LOG(FATAL) << __func__ << " disallowed connect to " << address << " from "
+++                           << t->serial_name();
+++            }
+++#endif
++             asocket* s = create_local_service_socket(address, t);
++             if (s == nullptr) {
++                 send_close(0, p->msg.arg0, t);
++diff --git a/system/core/adb/sockets.cpp b/system/core/adb/sockets.cpp
++index 423af67..c1ba0d4 100644
++--- a/system/core/adb/sockets.cpp
+++++ b/system/core/adb/sockets.cpp
++@@ -501,6 +501,12 @@ asocket* create_remote_socket(unsigned id, atransport* t) {
++ }
++ 
++ void connect_to_remote(asocket* s, std::string_view destination) {
+++#if ADB_HOST
+++    // Snoop reverse:forward: requests to track them so that an
+++    // appropriate filter (to figure out whether the remote is
+++    // allowed to connect locally) can be applied.
+++    s->transport->UpdateReverseConfig(destination);
+++#endif
++     D("Connect_to_remote call RS(%d) fd=%d", s->id, s->fd);
++     apacket* p = get_apacket();
++ 
++diff --git a/system/core/adb/transport.cpp b/system/core/adb/transport.cpp
++index 9dd6ec6..4d05f0c 100644
++--- a/system/core/adb/transport.cpp
+++++ b/system/core/adb/transport.cpp
++@@ -1341,6 +1341,63 @@ void unregister_usb_transport(usb_handle* usb) {
++         return t->GetUsbHandle() == usb && t->GetConnectionState() == kCsNoPerm;
++     });
++ }
+++
+++// Track reverse:forward commands, so that info can be used to develop
+++// an 'allow-list':
+++//   - adb reverse tcp:<device_port> localhost:<host_port> : responds with the
+++//   device_port
+++//   - adb reverse --remove tcp:<device_port> : responds OKAY
+++//   - adb reverse --remove-all : responds OKAY
+++void atransport::UpdateReverseConfig(std::string_view service_addr) {
+++    check_main_thread();
+++    if (!android::base::ConsumePrefix(&service_addr, "reverse:")) {
+++        return;
+++    }
+++
+++    if (android::base::ConsumePrefix(&service_addr, "forward:")) {
+++        // forward:[norebind:]<remote>;<local>
+++        bool norebind = android::base::ConsumePrefix(&service_addr, "norebind:");
+++        auto it = service_addr.find(';');
+++        if (it == std::string::npos) {
+++            return;
+++        }
+++        std::string remote(service_addr.substr(0, it));
+++
+++        if (norebind && reverse_forwards_.find(remote) != reverse_forwards_.end()) {
+++            // This will fail, don't update the map.
+++            LOG(DEBUG) << "ignoring reverse forward that will fail due to norebind";
+++            return;
+++        }
+++
+++        std::string local(service_addr.substr(it + 1));
+++        reverse_forwards_[remote] = local;
+++    } else if (android::base::ConsumePrefix(&service_addr, "killforward:")) {
+++        // kill-forward:<remote>
+++        auto it = service_addr.find(';');
+++        if (it != std::string::npos) {
+++            return;
+++        }
+++        reverse_forwards_.erase(std::string(service_addr));
+++    } else if (service_addr == "killforward-all") {
+++        reverse_forwards_.clear();
+++    } else if (service_addr == "list-forward") {
+++        LOG(DEBUG) << __func__ << " ignoring --list";
+++    } else {  // Anything else we need to know about?
+++        LOG(FATAL) << "unhandled reverse service: " << service_addr;
+++    }
+++}
+++
+++// Is this an authorized :connect request?
+++bool atransport::IsReverseConfigured(const std::string& local_addr) {
+++    check_main_thread();
+++    for (const auto& [remote, local] : reverse_forwards_) {
+++        if (local == local_addr) {
+++            return true;
+++        }
+++    }
+++    return false;
+++}
+++
++ #endif
++ 
++ bool check_header(apacket* p, atransport* t) {
++diff --git a/system/core/adb/transport.h b/system/core/adb/transport.h
++index 5a750ee..a16c38a 100644
++--- a/system/core/adb/transport.h
+++++ b/system/core/adb/transport.h
++@@ -30,6 +30,7 @@
++ #include <string>
++ #include <string_view>
++ #include <thread>
+++#include <unordered_map>
++ #include <unordered_set>
++ 
++ #include <android-base/macros.h>
++@@ -267,6 +268,10 @@ class atransport : public enable_weak_from_this<atransport> {
++     void SetUsbHandle(usb_handle* h) { usb_handle_ = h; }
++     usb_handle* GetUsbHandle() { return usb_handle_; }
++ 
+++    // Interface for management/filter on forward:reverse: configuration.
+++    void UpdateReverseConfig(std::string_view service_addr);
+++    bool IsReverseConfigured(const std::string& local_addr);
+++
++     const TransportId id;
++ 
++     bool online = false;
++@@ -372,6 +377,13 @@ class atransport : public enable_weak_from_this<atransport> {
++ 
++     std::mutex mutex_;
++ 
+++#if ADB_HOST
+++    // Track remote addresses against local addresses (configured)
+++    // through `adb reverse` commands.
+++    // Access constrained to primary thread by virtue of check_main_thread().
+++    std::unordered_map<std::string, std::string> reverse_forwards_;
+++#endif
+++
++     DISALLOW_COPY_AND_ASSIGN(atransport);
++ };
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1c3410bca0755736964dcb1a8296f76c1a2ce717
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++Description: Fix typos
++Author: Kai-Chung Yan (殷啟聰)
++Last-Update: 2016-10-01
++Forwarded: not-needed
++--- a/development/tools/etc1tool/etc1tool.cpp
+++++ b/development/tools/etc1tool/etc1tool.cpp
++@@ -56,7 +56,7 @@
++             "\t\t                             image to difffile. (Only valid when encoding).\n");
++     fprintf(stderr,
++             "\tIf outfile is not specified, an outfile path is constructed from infile,\n");
++-    fprintf(stderr, "\twith the apropriate suffix (.pkm or .png).\n");
+++    fprintf(stderr, "\twith the appropriate suffix (.pkm or .png).\n");
++     exit(1);
++ }
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b926eddcdff254d9b14feb94ee47ee40314b3c39
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++Description: Off-by-one error in the dwarf_to_unw_regnum function in include/dwarf_i.h in
++libunwind 1.1 allows local users to have unspecified impact via invalid dwarf opcodes.
++--- a/external/libunwind/include/dwarf_i.h
+++++ b/external/libunwind/include/dwarf_i.h
++@@ -20,7 +20,7 @@
++ extern const uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH];
++ /* REG is evaluated multiple times; it better be side-effects free!  */
++ # define dwarf_to_unw_regnum(reg)                                      \
++-  (((reg) <= DWARF_REGNUM_MAP_LENGTH) ? dwarf_to_unw_regnum_map[reg] : 0)
+++  (((reg) < DWARF_REGNUM_MAP_LENGTH) ? dwarf_to_unw_regnum_map[reg] : 0)
++ #endif
++ 
++ #ifdef UNW_LOCAL_ONLY
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ce1d4e52eb1c88a751cce9abb4b890bd1e124036
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,26 @@@
++Description: Replace the legacy __sync built-in functions with __atomic ones
++ libunwind uses the built-in __sync_* functions which are deprecated by GCC and
++ should be replaced by __atomic_* ones. See the official manuals [1].
++ .
++ The legacy __sync functions do not require to specify the memory order but
++ __atomic ones do, so we choose the strongest one: __ATOMIC_SEQ_CST.
++ .
++ We do this because __sync_fetch_and_add() is not supported on armel.
++ .
++ [1]: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fsync-Builtins.html
++Author: Kai-Chung Yan ()
++Last-Update: 2016-10-04
++Forwarded: not-needed
++--- a/external/libunwind/include/libunwind_i.h
+++++ b/external/libunwind/include/libunwind_i.h
++@@ -155,8 +155,8 @@ cmpxchg_ptr (void *addr, void *old, void
++   u.vp = addr;
++   return __sync_bool_compare_and_swap(u.vlp, (long) old, (long) new);
++ }
++-# define fetch_and_add1(_ptr)                __sync_fetch_and_add(_ptr, 1)
++-# define fetch_and_add(_ptr, value)  __sync_fetch_and_add(_ptr, value)
+++# define fetch_and_add1(_ptr) __atomic_fetch_add(_ptr, 1, __ATOMIC_SEQ_CST)
+++# define fetch_and_add(_ptr, value) __atomic_fetch_add(_ptr, value, __ATOMIC_SEQ_CST)
++ # define HAVE_CMPXCHG
++ # define HAVE_FETCH_AND_ADD
++ #endif
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..600471f126fcddf3797462d392102f4ea5d196a0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++Author: Kai-Chung Yan <seamlikok@gmail.com>
++Last-Update: 2016-08-24
++Description: Manual definition of struct user_pt_regs
++ On ARM64, libunwind uses struct user_pt_regs which is not defined in
++ anywhere, which causes FTBFS.
++Forwarded: not-needed
++--- a/external/libunwind/src/ptrace/_UPT_access_reg.c
+++++ b/external/libunwind/src/ptrace/_UPT_access_reg.c
++@@ -26,6 +26,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE
++ 
++ #include "_UPT_internal.h"
++ 
+++#if defined(__aarch64__)
+++  struct user_pt_regs {
+++    __u64            regs[31];
+++    __u64            sp;
+++    __u64            pc;
+++    __u64            pstate;
+++  };
+++#endif
+++
++ #if UNW_TARGET_IA64
++ # include <elf.h>
++ # ifdef HAVE_ASM_PTRACE_OFFSETS_H
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8224446da35bf5e7c661d966f9de49971935fa3a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,27 @@@
++Description: Fix header path to get rid of compile errors
++Author: Umang Parmar <umangjparmar@gmail.com>
++Forwarded: not-needed
++Last-Update: 2018-06-13
++
++--- a/external/selinux/libsepol/src/private.h
+++++ b/external/selinux/libsepol/src/private.h
++@@ -14,7 +14,7 @@
++ #endif
++ 
++ #include <errno.h>
++-#include <dso.h>
+++#include "dso.h"
++ 
++ #ifdef __APPLE__
++ #define __BYTE_ORDER  BYTE_ORDER
++--- a/external/selinux/libsepol/src/util.c
+++++ b/external/selinux/libsepol/src/util.c
++@@ -27,7 +27,7 @@
++ #include <sepol/policydb/flask_types.h>
++ #include <sepol/policydb/policydb.h>
++ #include <sepol/policydb/util.h>
++-#include <dso.h>
+++#include "dso.h"
++ 
++ struct val_to_name {
++      unsigned int val;
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a25662209eb53b0f38ad6f78bd811defebfe1783
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++Description: Added missing headers causing compile errors
++Forwarded: not-needed
++--- a/libnativehelper/JNIHelp.cpp
+++++ b/libnativehelper/JNIHelp.cpp
++@@ -17,6 +17,7 @@
++ #include "nativehelper/JNIHelp.h"
++ 
++ #include <string>
+++#include <cstring>
++ 
++ #define LOG_TAG "JNIHelp"
++ #include "ALog-priv.h"
++--- a/libnativehelper/JniInvocation.cpp
+++++ b/libnativehelper/JniInvocation.cpp
++@@ -17,6 +17,7 @@
++ #include "nativehelper/JniInvocation.h"
++ 
++ #include <string>
+++#include <cstring>
++ 
++ #ifdef _WIN32
++ #include <windows.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c0ab5974406ffb570409872dca73c06caab3f5ae
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,40 @@@
++external/selinux/Fix-header-path.patch
++external/libunwind/user_pt_regs.patch
++external/libunwind/legacy_built-in_sync_functions.patch
++external/libunwind/20150704-CVE-2015-3239_dwarf_i.h.patch
++libnativehelper/add-missing-headers.patch
++system/core/move-log-file-to-proper-dir.patch
++system/core/Added-missing-headers.patch
++system/core/libusb-header-path.patch
++system/core/stdatomic.patch
++system/core/Nonnull.patch
++system/core/Vector-cast.patch
++system/core/throw-exception-on-unknown-os.patch
++system/core/simg_dump-python3.patch
++system/core/fix-attribute-issue-with-gcc.patch
++system/core/fix-gettid-exception-declaration.patch
++system/core/fix-build-on-non-x86.patch
++system/core/add-missing-headers.patch
++system/core/hard-code-build-number.patch
++system/core/stub-out-fastdeploy.patch
++system/core/fix-standard-namespace-errors.patch
++system/Fix-shebang-of-python-script.patch
++system/Fix-include-path.patch
++system/unwindstack-porting.patch
++development/typos.patch
++art/use-android-dlmalloc.patch
++art/missing-system-includes.patch
++art/ucontext.patch
++art/atomic-exception-specification.patch
++art/image-space-dereference.patch
++art/storage-mode-concat.patch
++art/method-reference-std-ns.patch
++art/python3-gen_mterp.patch
++art/stats-incomplete-def.patch
++art/fix-build-on-non-x86.patch
++art/workaround-cacheflush-on-arm.patch
++art/arm-asm-instruction.patch
++art/fix-standard-namespace-errors.patch
++art/add-assembler-macro.patch
++cve/CVE-2022-20128.patch
++cve/CVE-2022-3168.patch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..827aa618c86d1605955953a613019696a1123782
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,21 @@@
++From: Jochen Sprickerhof <jspricke@debian.org>
++Date: Wed, 11 Jan 2023 09:06:55 +0100
++Subject: Fix include path
++
++---
++ system/extras/squashfs_utils/squashfs_utils.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/system/extras/squashfs_utils/squashfs_utils.c b/system/extras/squashfs_utils/squashfs_utils.c
++index 1db424b..9fc3066 100644
++--- a/system/extras/squashfs_utils/squashfs_utils.c
+++++ b/system/extras/squashfs_utils/squashfs_utils.c
++@@ -24,7 +24,7 @@
++ #include <string.h>
++ #include <unistd.h>
++ 
++-#include "squashfs_fs.h"
+++#include <squashfuse/squashfs_fs.h>
++ 
++ #ifdef SQUASHFS_NO_KLOG
++ #include <stdio.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..85a0dd70ab40b85cce513aeefd5aab2607a2f324
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++Description: Fix shebang of python script
++Author: Roger Shimizu <rosh@debian.org>
++Forwarded: not-needed
++
++--- a/system/tools/mkbootimg/mkbootimg.py
+++++ b/system/tools/mkbootimg/mkbootimg.py
++@@ -1,4 +1,4 @@
++-#!/usr/bin/env python
+++#!/usr/bin/env python3
++ # Copyright 2015, The Android Open Source Project
++ #
++ # Licensed under the Apache License, Version 2.0 (the "License");
++--- a/system/tools/mkbootimg/unpack_bootimg.py
+++++ b/system/tools/mkbootimg/unpack_bootimg.py
++@@ -1,4 +1,4 @@
++-#!/usr/bin/env python
+++#!/usr/bin/env python3
++ # Copyright 2018, The Android Open Source Project
++ #
++ # Licensed under the Apache License, Version 2.0 (the "License");
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c07e93660f528ef8627dc12f5020be986bd392b7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++Description: Added missing headers causing compile errors
++Author: Umang Parmar <umangjparmar@gmail.com>
++Forwarded: not-needed
++
++--- a/system/core/adb/sysdeps/posix/network.cpp
+++++ b/system/core/adb/sysdeps/posix/network.cpp
++@@ -22,6 +22,7 @@
++ #include <sys/socket.h>
++ 
++ #include <string>
+++#include <cstring>
++ 
++ #include <android-base/logging.h>
++ #include <android-base/stringprintf.h>
++--- a/system/core/base/file.cpp
+++++ b/system/core/base/file.cpp
++@@ -26,6 +26,7 @@
++ #include <sys/stat.h>
++ #include <sys/types.h>
++ #include <unistd.h>
+++#include <cstring>
++ 
++ #include <memory>
++ #include <mutex>
++--- a/system/core/libbacktrace/BacktraceMap.cpp
+++++ b/system/core/libbacktrace/BacktraceMap.cpp
++@@ -21,6 +21,7 @@
++ #include <stdint.h>
++ #include <sys/types.h>
++ #include <unistd.h>
+++#include <algorithm>
++ 
++ #include <log/log.h>
++ 
++--- a/system/core/libbacktrace/UnwindStackMap.cpp
+++++ b/system/core/libbacktrace/UnwindStackMap.cpp
++@@ -20,6 +20,7 @@
++ 
++ #include <string>
++ #include <vector>
+++#include <algorithm>
++ 
++ #include <backtrace/BacktraceMap.h>
++ #include <unwindstack/Elf.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8d1408a48e0c2d6f6399ec653753a70c261a5d2f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++Description: Bring Clang's _Nonnull keyword to GCC
++Author: Kai-Chung Yan
++Forwarded: not-needed
++--- a/system/core/adb/sysdeps.h
+++++ b/system/core/adb/sysdeps.h
++@@ -40,11 +40,12 @@
++ #include "sysdeps/network.h"
++ #include "sysdeps/stat.h"
++ 
+++#define _Nonnull
+++#define _Nullable
+++
++ #ifdef _WIN32
++ 
++ // Clang-only nullability specifiers
++-#define _Nonnull
++-#define _Nullable
++ 
++ #include <ctype.h>
++ #include <direct.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b32d5f6f54c0e9f39a0edfa1751a8db9e8441e7e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,14 @@@
++Description: Fix the weird error by GCC7 that fails to match the correct parent method.
++Author: Kai-Chung Yan
++Forwarded: not-needed
++--- a/system/core/libutils/include/utils/Vector.h
+++++ b/system/core/libutils/include/utils/Vector.h
++@@ -256,7 +256,7 @@
++ 
++ template<class TYPE> inline
++ const Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) const {
++-    VectorImpl::operator = (static_cast<const VectorImpl&>(rhs));
+++    VectorImpl::operator = (rhs);
++     return *this;
++ }
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..49d3ecefbbe44ef6bf4ed86e5e53bf329b074577
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++Forwarded: not-needed
++--- a/system/core/fs_mgr/liblp/reader.cpp
+++++ b/system/core/fs_mgr/liblp/reader.cpp
++@@ -22,6 +22,7 @@
++ #include <unistd.h>
++ 
++ #include <functional>
+++#include <cstring>
++ 
++ #include <android-base/file.h>
++ #include <android-base/unique_fd.h>
++--- a/system/core/fs_mgr/liblp/writer.cpp
+++++ b/system/core/fs_mgr/liblp/writer.cpp
++@@ -21,6 +21,7 @@
++ #include <unistd.h>
++ 
++ #include <string>
+++#include <cstring>
++ 
++ #include <android-base/file.h>
++ #include <android-base/unique_fd.h>
++--- a/system/core/liblog/logger_write.cpp
+++++ b/system/core/liblog/logger_write.cpp
++@@ -27,6 +27,7 @@
++ #include <android/set_abort_message.h>
++ #endif
++ 
+++#include <mutex>
++ #include <shared_mutex>
++ 
++ #include <android-base/errno_restorer.h>
++--- a/system/core/libziparchive/zip_archive_stream_entry.cc
+++++ b/system/core/libziparchive/zip_archive_stream_entry.cc
++@@ -23,6 +23,7 @@
++ #include <sys/types.h>
++ #include <unistd.h>
++ 
+++#include <limits>
++ #include <memory>
++ #include <vector>
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e0b4275579e1fb7755fd3870e49649caa9324723
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,17 @@@
++Description: remove clang-ism
++Forwarded: not-needed
++
++--- a/system/core/base/include/android-base/logging.h
+++++ b/system/core/base/include/android-base/logging.h
++@@ -451,10 +451,7 @@
++ //       -Wno-user-defined-warnings to CPPFLAGS.
++ #pragma clang diagnostic push
++ #pragma clang diagnostic ignored "-Wgcc-compat"
++-#define OSTREAM_STRING_POINTER_USAGE_WARNING \
++-    __attribute__((diagnose_if(true, "Unexpected logging of string pointer", "warning")))
++-inline OSTREAM_STRING_POINTER_USAGE_WARNING
++-std::ostream& operator<<(std::ostream& stream, const std::string* string_pointer) {
+++inline std::ostream& operator<<(std::ostream& stream, const std::string* string_pointer) {
++   return stream << static_cast<const void*>(string_pointer);
++ }
++ #pragma clang diagnostic pop
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..98a50782440fa9d6025381267373c30bd4871346
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++Description: non-x86 arches do not have PAGE_SIZE
++Forwarded: not-needed
++--- a/system/core/base/cmsg.cpp
+++++ b/system/core/base/cmsg.cpp
++@@ -33,7 +33,8 @@
++                                  const std::vector<int>& fds) {
++   size_t cmsg_space = CMSG_SPACE(sizeof(int) * fds.size());
++   size_t cmsg_len = CMSG_LEN(sizeof(int) * fds.size());
++-  if (cmsg_space >= PAGE_SIZE) {
+++  size_t pagesize = static_cast<size_t>(sysconf(_SC_PAGE_SIZE));
+++  if (cmsg_space >= pagesize) {
++     errno = ENOMEM;
++     return -1;
++   }
++@@ -75,7 +76,8 @@
++   fds->clear();
++ 
++   size_t cmsg_space = CMSG_SPACE(sizeof(int) * max_fds);
++-  if (cmsg_space >= PAGE_SIZE) {
+++  size_t pagesize = static_cast<size_t>(sysconf(_SC_PAGE_SIZE));
+++  if (cmsg_space >= pagesize) {
++     errno = ENOMEM;
++     return -1;
++   }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7fd228bff6fd02e3f9697ac223573e02710f4c93
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++Description: get libcutils building
++Forwarded: not-needed
++--- a/system/core/libcutils/include/cutils/threads.h
+++++ b/system/core/libcutils/include/cutils/threads.h
++@@ -33,7 +33,7 @@
++ // Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows.
++ //
++ 
++-extern pid_t gettid();
+++extern pid_t gettid(void) __THROW;
++ 
++ //
++ // Deprecated: use `_Thread_local` in C or `thread_local` in C++.
++--- a/system/core/libcutils/threads.cpp
+++++ b/system/core/libcutils/threads.cpp
++@@ -33,7 +33,7 @@
++ 
++ // No definition needed for Android because we'll just pick up bionic's copy.
++ #ifndef __ANDROID__
++-pid_t gettid() {
+++pid_t gettid(void) __THROW {
++ #if defined(__APPLE__)
++   uint64_t tid;
++   pthread_threadid_np(NULL, &tid);
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e41a3576aebfc9cb90399f984beabcd396ce31f4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++Description: Add missing 'std::' scope identifiers.
++Forwarded: not-needed
++--- a/system/core/libunwindstack/include/unwindstack/DwarfMemory.h
+++++ b/system/core/libunwindstack/include/unwindstack/DwarfMemory.h
++@@ -29,7 +29,7 @@
++   DwarfMemory(Memory* memory) : memory_(memory) {}
++   virtual ~DwarfMemory() = default;
++ 
++-  bool ReadBytes(void* dst, size_t num_bytes);
+++  bool ReadBytes(void* dst, std::size_t num_bytes);
++ 
++   template <typename SignedType>
++   bool ReadSigned(uint64_t* value);
++@@ -39,7 +39,7 @@
++   bool ReadSLEB128(int64_t* value);
++ 
++   template <typename AddressType>
++-  size_t GetEncodedSize(uint8_t encoding);
+++  std::size_t GetEncodedSize(uint8_t encoding);
++ 
++   bool AdjustEncodedValue(uint8_t encoding, uint64_t* value);
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2a332eb689637c390c7354169780dffa5e183cd4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++Description: just hard code rather than deal with circular deps
++Forwarded: not-needed
++--- a/system/core/adb/adb.cpp
+++++ b/system/core/adb/adb.cpp
++@@ -44,8 +44,6 @@
++ #include <android-base/parsenetaddress.h>
++ #include <android-base/stringprintf.h>
++ #include <android-base/strings.h>
++-#include <build/version.h>
++-#include <platform_tools_version.h>
++ 
++ #include "adb_auth.h"
++ #include "adb_io.h"
++@@ -69,7 +67,7 @@
++         "Version %s-%s\n"
++         "Installed as %s\n",
++         ADB_VERSION_MAJOR, ADB_VERSION_MINOR, ADB_SERVER_VERSION,
++-        PLATFORM_TOOLS_VERSION, android::build::GetBuildNumber().c_str(),
+++        PLATFORM_TOOLS_VERSION, "debian",
++         android::base::GetExecutablePath().c_str());
++ }
++ 
++--- a/system/core/fastboot/fastboot.cpp
+++++ b/system/core/fastboot/fastboot.cpp
++@@ -59,10 +59,8 @@
++ #include <android-base/stringprintf.h>
++ #include <android-base/strings.h>
++ #include <android-base/unique_fd.h>
++-#include <build/version.h>
++ #include <libavb/libavb.h>
++ #include <liblp/liblp.h>
++-#include <platform_tools_version.h>
++ #include <sparse/sparse.h>
++ #include <ziparchive/zip_archive.h>
++ 
++@@ -1680,7 +1678,7 @@
++                 setvbuf(stdout, nullptr, _IONBF, 0);
++                 setvbuf(stderr, nullptr, _IONBF, 0);
++             } else if (name == "version") {
++-                fprintf(stdout, "fastboot version %s-%s\n", PLATFORM_TOOLS_VERSION, android::build::GetBuildNumber().c_str());
+++                fprintf(stdout, "fastboot version %s-%s\n", PLATFORM_TOOLS_VERSION, "debian");
++                 fprintf(stdout, "Installed as %s\n", android::base::GetExecutablePath().c_str());
++                 return 0;
++ #if !defined(_WIN32)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1663aae46599b94d297de1c13067eb13299f7c76
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++Description: libusb.h comes from different location
++Author: Umang Parmar <umangjparmar@gmail.com>
++Forwarded: not-needed
++Last-Update: 2018-05-26
++
++--- a/system/core/adb/client/usb_libusb.cpp
+++++ b/system/core/adb/client/usb_libusb.cpp
++@@ -30,7 +30,7 @@
++ #include <thread>
++ #include <unordered_map>
++ 
++-#include <libusb/libusb.h>
+++#include <libusb-1.0/libusb.h>
++ 
++ #include <android-base/file.h>
++ #include <android-base/logging.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..006564b024efc78a084fc2f424661ef96fdf6713
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,18 @@@
++Description: Update log file directory.
++Author: Umang Parmar <umangjparmar@gmail.com>
++Last Updated: 2018-05-17
++
++--- a/system/core/adb/adb_utils.cpp
+++++ b/system/core/adb/adb_utils.cpp
++@@ -339,6 +339,11 @@
++ 
++     return temp_path_utf8 + log_name;
++ #else
+++    std::string log_dir = android::base::StringPrintf("/run/user/%u/adb.log", getuid());
+++    struct stat st = {0};
+++    if (stat(log_dir.c_str(), &st) == 0) {
+++      return log_dir;
+++    }
++     const char* tmp_dir = getenv("TMPDIR");
++     if (tmp_dir == nullptr) tmp_dir = "/tmp";
++     return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid());
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e6933ef145733b922ee10513c865ccee0a146076
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,62 @@@
++Description: Port simg_dump to Python 3.
++Author: Antonio Russo <antonio.e.russo@gmail.com>
++Forwarded: not-needed
++Last-Update: 2019-01-05
++Origin: https://bugs.debian.org/945646
++
++---
++Index: android-platform-tools/system/core/libsparse/simg_dump.py
++===================================================================
++--- android-platform-tools.orig/system/core/libsparse/simg_dump.py
+++++ android-platform-tools/system/core/libsparse/simg_dump.py
++@@ -1,4 +1,4 @@
++-#! /usr/bin/env python
+++#! /usr/bin/env python3
++ 
++ # Copyright (C) 2012 The Android Open Source Project
++ #
++@@ -14,7 +14,7 @@
++ # See the License for the specific language governing permissions and
++ # limitations under the License.
++ 
++-from __future__ import print_function
+++
++ import csv
++ import getopt
++ import hashlib
++@@ -47,7 +47,7 @@ def main():
++     opts, args = getopt.getopt(sys.argv[1:],
++                                "vsc:",
++                                ["verbose", "showhash", "csvfile"])
++-  except getopt.GetoptError, e:
+++  except getopt.GetoptError as e:
++     print(e)
++     usage(me)
++   for o, a in opts:
++@@ -66,7 +66,7 @@ def main():
++     usage(me)
++ 
++   if csvfilename:
++-    csvfile = open(csvfilename, "wb")
+++    csvfile = open(csvfilename, "w", newline='')
++     csvwriter = csv.writer(csvfile)
++ 
++   output = verbose or csvfilename or showhash
++@@ -121,7 +121,7 @@ def main():
++                           "output offset", "output blocks", "type", "hash"])
++ 
++     offset = 0
++-    for i in xrange(1, total_chunks + 1):
+++    for i in range(1, total_chunks + 1):
++       header_bin = FH.read(12)
++       header = struct.unpack("<2H2I", header_bin)
++       chunk_type = header[0]
++@@ -160,7 +160,7 @@ def main():
++           if showhash:
++             h = hashlib.sha1()
++             data = fill_bin * (blk_sz / 4);
++-            for block in xrange(chunk_sz):
+++            for block in range(chunk_sz):
++               h.update(data)
++             curhash = h.hexdigest()
++       elif chunk_type == 0xCAC3:
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ea3711dfa29907304165e117c2f5d76810894f7a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,64 @@@
++Description: Fix incompatibility between <stdatomic.h> and <atomic>
++ This 2 headers combined will cause errors for both GCC and Clang. This patch
++ makes sure only one of them is present at any time.
++Bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932
++Bug: https://reviews.llvm.org/D45470
++--- a/system/core/libcutils/include/cutils/trace.h
+++++ b/system/core/libcutils/include/cutils/trace.h
++@@ -18,7 +18,14 @@
++ #define _LIBS_CUTILS_TRACE_H
++ 
++ #include <inttypes.h>
+++#ifdef __cplusplus
+++#include <atomic>
+++using std::atomic_bool;
+++using std::atomic_load_explicit;
+++using std::memory_order_acquire;
+++#else
++ #include <stdatomic.h>
+++#endif
++ #include <stdbool.h>
++ #include <stdint.h>
++ #include <stdio.h>
++--- a/system/core/libcutils/include/cutils/atomic.h
+++++ b/system/core/libcutils/include/cutils/atomic.h
++@@ -19,7 +19,23 @@
++ 
++ #include <stdint.h>
++ #include <sys/types.h>
+++#ifdef __cplusplus
+++#include <atomic>
+++using std::atomic_compare_exchange_strong_explicit;
+++using std::atomic_fetch_add_explicit;
+++using std::atomic_fetch_or_explicit;
+++using std::atomic_fetch_sub_explicit;
+++using std::atomic_int_least32_t;
+++using std::atomic_load_explicit;
+++using std::atomic_store_explicit;
+++using std::atomic_thread_fence;
+++using std::memory_order::memory_order_acquire;
+++using std::memory_order::memory_order_relaxed;
+++using std::memory_order::memory_order_release;
+++using std::memory_order::memory_order_seq_cst;
+++#else
++ #include <stdatomic.h>
+++#endif
++ 
++ #ifndef ANDROID_ATOMIC_INLINE
++ #define ANDROID_ATOMIC_INLINE static inline
++--- a/system/core/liblog/logger.h
+++++ b/system/core/liblog/logger.h
++@@ -16,7 +16,13 @@
++ 
++ #pragma once
++ 
+++#ifdef __cplusplus
+++#include <atomic>
+++using std::atomic_int;
+++using std::atomic_uintptr_t;
+++#else
++ #include <stdatomic.h>
+++#endif
++ #include <sys/cdefs.h>
++ 
++ #include <log/log.h>
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d2426a781ddac0129d8d8f6d1ad6c3615c0339a8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,93 @@@
++Description: Defer packaging fastdeploy with adb for 29.x.x tags.
++Forwarded: not-needed
++--- a/system/core/adb/client/commandline.cpp
+++++ b/system/core/adb/client/commandline.cpp
++@@ -59,7 +59,6 @@
++ #include "bugreport.h"
++ #include "client/file_sync_client.h"
++ #include "commandline.h"
++-#include "fastdeploy.h"
++ #include "services.h"
++ #include "shell_protocol.h"
++ #include "sysdeps/chrono.h"
++--- a/system/core/adb/client/adb_install.cpp
+++++ b/system/core/adb/client/adb_install.cpp
++@@ -35,7 +35,6 @@
++ #include "adb_utils.h"
++ #include "client/file_sync_client.h"
++ #include "commandline.h"
++-#include "fastdeploy.h"
++ 
++ static constexpr int kFastDeployMinApi = 24;
++ 
++@@ -167,14 +166,6 @@
++     }
++ 
++     if (use_fastdeploy) {
++-        auto metadata = extract_metadata(file);
++-        if (metadata.has_value()) {
++-            // pass all but 1st (command) and last (apk path) parameters through to pm for
++-            // session creation
++-            std::vector<const char*> pm_args{argv + 1, argv + argc - 1};
++-            auto patchFd = install_patch(pm_args.size(), pm_args.data());
++-            return stream_patch(file, std::move(metadata.value()), std::move(patchFd));
++-        }
++     }
++ 
++     struct stat sb;
++@@ -267,16 +258,6 @@
++     argv[last_apk] = apk_dest.c_str(); /* destination name, not source location */
++ 
++     if (use_fastdeploy) {
++-        auto metadata = extract_metadata(apk_file[0]);
++-        if (metadata.has_value()) {
++-            auto patchFd = apply_patch_on_device(apk_dest.c_str());
++-            int status = stream_patch(apk_file[0], std::move(metadata.value()), std::move(patchFd));
++-
++-            result = pm_command(argc, argv);
++-            delete_device_file(apk_dest);
++-
++-            return status;
++-        }
++     }
++ 
++     if (do_sync_push(apk_file, apk_dest.c_str(), false)) {
++@@ -292,7 +273,6 @@
++     InstallMode installMode = INSTALL_DEFAULT;
++     bool use_fastdeploy = false;
++     bool is_reinstall = false;
++-    FastDeploy_AgentUpdateStrategy agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion;
++ 
++     for (int i = 1; i < argc; i++) {
++         if (!strcmp(argv[i], "--streaming")) {
++@@ -313,13 +293,10 @@
++             use_fastdeploy = false;
++         } else if (!strcmp(argv[i], "--force-agent")) {
++             processedArgIndicies.push_back(i);
++-            agent_update_strategy = FastDeploy_AgentUpdateAlways;
++         } else if (!strcmp(argv[i], "--date-check-agent")) {
++             processedArgIndicies.push_back(i);
++-            agent_update_strategy = FastDeploy_AgentUpdateNewerTimeStamp;
++         } else if (!strcmp(argv[i], "--version-check-agent")) {
++             processedArgIndicies.push_back(i);
++-            agent_update_strategy = FastDeploy_AgentUpdateDifferentVersion;
++         }
++     }
++ 
++@@ -331,13 +308,11 @@
++         error_exit("Attempting to use streaming install on unsupported device");
++     }
++ 
++-    if (use_fastdeploy && get_device_api_level() < kFastDeployMinApi) {
++-        printf("Fast Deploy is only compatible with devices of API version %d or higher, "
++-               "ignoring.\n",
++-               kFastDeployMinApi);
+++    if (use_fastdeploy) {
+++        printf("Fast Deploy is unavailable in this build of adb, "
+++               "ignoring.\n");
++         use_fastdeploy = false;
++     }
++-    fastdeploy_set_agent_update_strategy(agent_update_strategy);
++ 
++     std::vector<const char*> passthrough_argv;
++     for (int i = 0; i < argc; i++) {
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6b07f17bfcf15e09fad0c73272189ae17baffb4f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++Description: Turn #error into exceptions
++ So the library can be built on non-Linux platforms too, although can't
++ guarauntee its functionality regarding that piece of code.
++Forwarded: not-needed
++--- a/system/core/base/file.cpp
+++++ b/system/core/base/file.cpp
++@@ -422,7 +422,8 @@
++   path[PATH_MAX - 1] = 0;
++   return path;
++ #else
++-#error unknown OS
+++#include <stdexcept>
+++  throw std::runtime_error(std::string("Unknown OS!"));
++ #endif
++ }
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2b46fcd20d0c13b2aa1db3d00e3041cb379092ee
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,13 @@@
++Description: unwindstack porting
++Forwarded: not-needed
++--- a/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h
+++++ b/system/core/libunwindstack/include/unwindstack/RegsGetLocal.h
++@@ -81,7 +81,7 @@ inline __attribute__((__always_inline__)) void AsmGetRegs(void* reg_data) {
++       : "x12", "x13", "memory");
++ }
++ 
++-#elif defined(__i386__) || defined(__x86_64__) || defined(__mips__)
+++#else
++ 
++ extern "C" void AsmGetRegs(void* regs);
++ 
diff --cc debian/rules
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1a7a27da34ccbbc451434218cba32847021a9474
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,208 @@@
++#!/usr/bin/make -f
++
++include /usr/share/dpkg/architecture.mk
++include /usr/share/dpkg/pkg-info.mk
++
++## Security Hardening
++export DEB_BUILD_MAINT_OPTIONS = hardening=+all optimize=-lto
++# https://android.googlesource.com/platform/build/soong/+/refs/tags/platform-tools-29.0.6/cc/config/global.go#121
++export DEB_CFLAGS_MAINT_APPEND = -fPIC -gdwarf-4
++export DEB_CXXFLAGS_MAINT_APPEND = -fPIC -gdwarf-4
++export DEB_LDFLAGS_MAINT_APPEND = -fPIC
++export DEB_CPPFLAGS_MAINT_APPEND = -DNDEBUG -UDEBUG \
++  -fmessage-length=0 \
++  -fno-exceptions \
++  -fno-strict-aliasing \
++  -no-canonical-prefixes \
++
++## For get-orig-source
++export DEB_SOURCE
++export DEB_VERSION_UPSTREAM
++
++export DEB_HOST_MULTIARCH
++
++## system/core
++export DEB_HOST_MULTIARCH
++export DEB_VERSION
++# https://android.googlesource.com/platform/development/+/refs/tags/platform-tools-29.0.6/sdk/plat_tools_source.prop_template
++export PLATFORM_TOOLS_VERSION = 29.0.6
++
++ifneq (, $(shell which clang))
++  export CC=clang
++  export CXX=clang++
++  export DEB_CPPFLAGS_MAINT_APPEND += \
++    -Wno-c99-designator \
++    -Wno-gnu-designator \
++    -Wno-gnu-folding-constant \
++
++endif
++
++%:
++      dh $@ --with bash-completion
++
++get-orig-source:
++      debian/scripts/get-orig-source
++
++## system/core
++
++s/core/lib%.a: debian/system/core/lib%.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/lib%.so: debian/system/core/lib%.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++debian/manpages/system/core/%.1: debian/manpages/system/core/%.1.md
++      pandoc --standalone --from=markdown-smart --to=man --output=$@ $<
++
++s/core/libbacktrace.so: debian/system/core/libbacktrace.mk s/core/libbase.so e/libunwind/libunwind.a
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/libbase.so: debian/system/core/libbase.mk s/core/liblog.so
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/libcutils.so: debian/system/core/libcutils.mk s/core/libbase.so
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/adb: debian/system/core/adb.mk s/core/libadb.a s/core/libcrypto_utils.a s/core/libcutils.so debian/manpages/system/core/adb.1
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/fastboot: debian/system/core/fastboot.mk s/core/adb s/extras/libext4_utils.a s/core/libziparchive.so s/core/libsparse.so debian/manpages/system/core/fastboot.1
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/simg2img: debian/system/core/simg2img.mk s/core/libbase.so s/core/libsparse.so
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/simg2simg: debian/system/core/simg2simg.mk s/core/simg2img
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/img2simg: debian/system/core/img2simg.mk s/core/simg2img
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++s/core/append2simg: debian/system/core/append2simg.mk s/core/simg2img
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++COMPONENTS = \
++  s/core/libbacktrace.so \
++  s/core/libbase.so \
++  s/core/libcutils.so \
++  s/core/liblog.so \
++  s/core/libsparse.so \
++  s/core/libutils.so \
++  s/core/libziparchive.so \
++  s/core/simg2img \
++  s/core/img2simg \
++  s/core/append2simg \
++  s/core/simg2simg \
++
++# Whatever depends on BoringSSL must be disabled on MIPS
++NON_MIPS_COMPONENTS = s/core/adb s/core/fastboot
++ifneq ($(filter amd64 i386 armel armhf arm64 mipsel mips64el ppc64el,$(DEB_HOST_ARCH)),)
++  COMPONENTS += $(NON_MIPS_COMPONENTS)
++endif
++
++# Most components only support ARM, x86 and MIPS, but some can be built
++# on all architectures.
++COMPONENTS_ANY_ARCH = \
++  s/core/append2simg \
++  s/core/img2simg \
++  s/core/libbase.so \
++  s/core/libcutils.so \
++  s/core/liblog.so \
++  s/core/libsparse.so \
++  s/core/libziparchive.so \
++  s/core/simg2img \
++  s/core/simg2simg \
++
++ifeq ($(filter amd64 i386 armel armhf arm64 mipsel mips64el ppc64el,$(DEB_HOST_ARCH)),)
++  COMPONENTS := $(filter $(COMPONENTS_ANY_ARCH), $(COMPONENTS))
++endif
++
++## development
++
++debian/manpages/development/%.1: debian/manpages/development/%.1.md
++      pandoc --standalone --from=markdown-smart --to=man --output=$@ $<
++
++development/etc1tool: debian/development/etc1tool.mk debian/manpages/development/etc1tool.1 f/native/libETC1.a
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++COMPONENTS += development/etc1tool
++
++## frameworks/native
++
++f/native/libETC1.a: debian/frameworks/native/libETC1.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++COMPONENTS += f/native/libETC1.a
++
++## external/libunwind
++
++e/libunwind/libunwind.a: debian/external/libunwind/libunwind.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++ifneq ($(filter amd64 i386 armel armhf arm64 mipsel mips64el,$(DEB_HOST_ARCH)),)
++COMPONENTS += \
++  e/libunwind/libunwind.a \
++
++endif
++
++## system/extras
++
++s/extras/libext4_utils.a: debian/system/extras/libext4_utils.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++## libnativehelper
++
++libnativehelper/libnativehelper.so: debian/libnativehelper/libnativehelper.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++COMPONENTS += libnativehelper/libnativehelper.so
++
++## dalvik
++
++dalvik/hprof-conv: debian/dalvik/hprof-conv.mk
++      dh_auto_build --buildsystem=makefile -- --file=$<
++
++COMPONENTS += dalvik/hprof-conv
++
++override_dh_auto_build-arch: $(COMPONENTS)
++
++ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
++override_dh_auto_test-arch:
++      debian/out/development/etc1tool development/tools/templates/ic_launcher_ldpi.png --encode && debian/out/development/etc1tool development/tools/templates/ic_launcher_ldpi.pkm --decode
++ifneq ($(filter amd64 i386 armel armhf arm64 mipsel mips64el ppc64el,$(DEB_HOST_ARCH)),)
++      LD_LIBRARY_PATH=debian/out/system/core debian/out/system/core/adb version
++      LD_LIBRARY_PATH=debian/out/system/core debian/out/system/core/adb help
++      LD_LIBRARY_PATH=debian/out/system/core debian/out/system/core/adb keygen key.txt && ls -l key.txt* && rm key.txt*
++      LD_LIBRARY_PATH=debian/out/system/core debian/out/system/core/fastboot --version
++      LD_LIBRARY_PATH=debian/out/system/core debian/out/system/core/fastboot devices
++endif
++endif
++
++override_dh_auto_install:
++      echo ignore upstream build system install procedure
++
++override_dh_auto_configure-arch:
++      rm -rf external/boringssl external/selinux development/[a-s]* development/v* development/testrunner art
++
++override_dh_gencontrol:
++      dh_gencontrol
++      dh_gencontrol -padb -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libbacktrace -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libbacktrace-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libbase -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libbase-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libcutils -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libcutils-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-liblog -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-liblog-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libsparse -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libsparse-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libutils -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libutils-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libziparchive -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-libziparchive-dev -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-platform-frameworks-native-headers -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-platform-system-core-headers -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pandroid-sdk-libsparse-utils -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pfastboot -- -v1:$(DEB_VERSION)
++      dh_gencontrol -pmkbootimg -- -v1:$(DEB_VERSION)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7faab868dd0c0a7f3bcdddbff7758c5d1a010890
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,46 @@@
++#!/usr/bin/env bash
++
++set -e
++
++# Must be invoked by `debian/rules` for the use of `DEB_*` variables
++if ! test -v DEB_VERSION_UPSTREAM; then
++  echo 'usage: debian/rules get-orig-source'
++  exit 1
++fi
++
++mkdir --parents debian/tmp/get-orig-source/manifest
++(
++  cd debian/tmp/get-orig-source/manifest
++  ln --physical --force ../../../manifest.xml default.xml
++  git init
++  git add default.xml
++  git commit --no-gpg-sign --message=Changes
++)
++
++# repo edits(!) a hardcoded ~/.gitconfig which will override ~/.config/git/config
++(
++  if test -f ~/.gitconfig; then
++    echo 'backing up ~/.gitconfig'
++    cp --archive ~/.gitconfig ~/.gitconfig.get-orig-source
++  else
++    touch ~/.gitconfig
++  fi
++
++  git config --global user.name "${DEBFULLNAME:-$(git config user.name)}"
++  git config --global user.email "${DEBEMAIL:-$(git config user.email)}"
++  git config --global color.ui >/dev/null || git config --global color.ui auto
++)
++
++mkdir --parents debian/tmp/get-orig-source/archive
++(
++  cd debian/tmp/get-orig-source/archive
++  repo --time init --manifest-url=file://"$(readlink --canonicalize-existing ../manifest/.git)" --depth=1 -c --no-tags
++  repo --time sync -c --no-tags -j$(nproc)
++  tar --create --xz --file "../../../../../${DEB_SOURCE}_${DEB_VERSION_UPSTREAM}.orig.tar.xz" --exclude-from=../../../orig.excludes --mtime=2000-01-01 --sort=name ./*
++)
++
++# cleanup
++rm ~/.gitconfig
++if test -f ~/.gitconfig.get-orig-source; then
++  mv ~/.gitconfig.get-orig-source ~/.gitconfig
++fi
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..46ebe0266599c4440c3cc958b9e769927a55dbd4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++3.0 (quilt)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c5a7047dff0df033437c363e3557392ee741c461
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++# Many markdown, json, etc. files in source tree have long line
++# and this should not be a problem
++very-long-line-length-in-source-file
++
++# We use hand-written makefiles to build the package
++ancient-libtool 1.4.3 [external/libunwind/aux/ltmain.sh]
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..02eb9ef8ac91bc73c54d273d9a731d74413d7616
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,53 @@@
++NAME = adb
++
++SOURCES = \
++  client/adb_client.cpp \
++  client/bugreport.cpp \
++  client/commandline.cpp \
++  client/file_sync_client.cpp \
++  client/main.cpp \
++  client/console.cpp \
++  client/adb_install.cpp \
++  client/line_printer.cpp \
++  shell_service_protocol.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/adb/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -D_GNU_SOURCE \
++  -DADB_HOST=1 \
++  -DADB_VERSION='"$(DEB_VERSION)"' \
++  -I/usr/include/android \
++  -Isystem/core/adb \
++  -Isystem/core/base/include \
++  -Isystem/core/include \
++
++LDFLAGS += \
++  -L/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -fuse-ld=gold \
++  -lbase \
++  -lcrypto \
++  -lcutils \
++  -lpthread \
++  -lusb-1.0 \
++  -pie \
++
++STATIC_LIBS = \
++  debian/out/system/core/libadb.a \
++  debian/out/system/core/libcrypto_utils.a \
++
++# -latomic should be the last library specified
++# https://github.com/android/ndk/issues/589
++ifneq ($(filter armel mipsel,$(DEB_HOST_ARCH)),)
++  LDFLAGS += -latomic
++endif
++
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(STATIC_LIBS) $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1e4be673e81791d114ca6642de4adb304f6cc1e4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++NAME = append2simg
++
++SOURCES = append2simg.cpp
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libsparse/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++17
++CPPFLAGS += \
++  -Isystem/core/libsparse/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -lbase \
++  -llog \
++  -lpthread \
++  -lsparse \
++  -pie \
++
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..869931d1c1e67f4d540b1fc760d83b9959e3892e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,77 @@@
++NAME = fastboot
++
++fastboot_SOURCES = \
++  bootimg_utils.cpp \
++  fastboot.cpp \
++  fastboot_driver.cpp \
++  fs.cpp \
++  main.cpp \
++  socket.cpp \
++  tcp.cpp \
++  udp.cpp \
++  usb_linux.cpp \
++  util.cpp \
++
++fs_mgr_liblp_SOURCES := \
++  builder.cpp \
++  images.cpp \
++  partition_opener.cpp \
++  property_fetcher.cpp \
++  reader.cpp \
++  utility.cpp \
++  writer.cpp \
++
++SOURCES := \
++  $(foreach source, $(fastboot_SOURCES), system/core/fastboot/$(source)) \
++  $(foreach source, $(fs_mgr_liblp_SOURCES), system/core/fs_mgr/liblp/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a -fpermissive
++CPPFLAGS += \
++   -D_FILE_OFFSET_BITS=64 \
++   -DPLATFORM_TOOLS_VERSION='"$(PLATFORM_TOOLS_VERSION)"' \
++   -I/usr/include/android \
++   -Iexternal/avb \
++   -Isystem/core/adb \
++   -Isystem/core/base/include \
++   -Isystem/core/demangle/include \
++   -Isystem/core/diagnose_usb/include \
++   -Isystem/core/fs_mgr/include \
++   -Isystem/core/fs_mgr/include_fstab \
++   -Isystem/core/fs_mgr/liblp/include \
++   -Isystem/core/include \
++   -Isystem/core/libcutils/include \
++   -Isystem/core/libsparse/include \
++   -Isystem/core/libziparchive/include \
++   -Isystem/extras/ext4_utils/include \
++   -Isystem/tools/mkbootimg/include/bootimg \
++
++LDFLAGS += \
++  -L/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -fuse-ld=gold \
++  -lbase \
++  -lcrypto \
++  -lcutils \
++  -lpthread \
++  -lsparse \
++  -lusb-1.0 \
++  -lziparchive \
++  -pie \
++
++STATIC_LIBS = \
++  debian/out/system/core/libadb.a \
++  debian/out/system/extras/libext4_utils.a \
++
++# -latomic should be the last library specified
++# https://github.com/android/ndk/issues/589
++ifneq ($(filter armel mipsel,$(DEB_HOST_ARCH)),)
++  LDFLAGS += -latomic
++endif
++
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(STATIC_LIBS) $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..96baca9674dd053bded77a481b69c5bad6a4c06f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++NAME = img2simg
++
++SOURCES = img2simg.cpp
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libsparse/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++17
++CPPFLAGS += \
++  -Isystem/core/libsparse/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -lbase \
++  -llog \
++  -lpthread \
++  -lsparse \
++  -pie \
++
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2d837123fb61572b1103ae3a1eaac9b87d6406b6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,65 @@@
++NAME := libadb
++
++LIBADB_SRC_FILES := \
++  adb.cpp \
++  adb_io.cpp \
++  adb_listeners.cpp \
++  adb_trace.cpp \
++  adb_unique_fd.cpp \
++  adb_utils.cpp \
++  fdevent/fdevent.cpp \
++  fdevent/fdevent_poll.cpp \
++  services.cpp \
++  sockets.cpp \
++  socket_spec.cpp \
++  sysdeps/errno.cpp \
++  transport.cpp \
++  transport_fd.cpp \
++  transport_local.cpp \
++  transport_usb.cpp \
++  types.cpp \
++
++LIBADB_posix_srcs := \
++  sysdeps_unix.cpp \
++  sysdeps/posix/network.cpp \
++
++LIBADB_linux_SRC_FILES := \
++  fdevent/fdevent_epoll.cpp \
++  client/auth.cpp \
++  client/usb_dispatch.cpp \
++  client/usb_libusb.cpp \
++  client/usb_linux.cpp \
++
++LOCAL_SRC_FILES := \
++  $(LIBADB_SRC_FILES) \
++  $(LIBADB_posix_srcs) \
++  $(LIBADB_linux_SRC_FILES) \
++
++LIBDIAGNOSE_USB_SRC_FILES = diagnose_usb/diagnose_usb.cpp
++
++GEN := debian/out/system/core/transport_mdns_unsupported.cpp
++
++SOURCES := $(foreach source, $(LOCAL_SRC_FILES), adb/$(source)) $(LIBDIAGNOSE_USB_SRC_FILES)
++SOURCES := $(foreach source, $(SOURCES), system/core/$(source)) $(GEN)
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -DPLATFORM_TOOLS_VERSION='"$(PLATFORM_TOOLS_VERSION)"' \
++  -DADB_HOST=1 -DADB_VERSION='"$(DEB_VERSION)"' \
++  -I/usr/include/android \
++  -Isystem/core/adb \
++  -Isystem/core/base/include \
++  -Isystem/core/diagnose_usb/include \
++  -Isystem/core/include \
++  -Isystem/core/libcrypto_utils/include \
++  -Isystem/core/libcutils/include \
++
++debian/out/system/core/$(NAME).a: $(OBJECTS)
++      ar -rcs $@ $^
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
++
++debian/out/system/core/transport_mdns_unsupported.cpp:
++      echo 'void init_mdns_transport_discovery(void) {}' > $@
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..65373e5ec6ec073e5430a06763464652ffb4b24b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,98 @@@
++include /usr/share/dpkg/architecture.mk
++
++NAME = libbacktrace
++
++libbacktrace_SOURCES = \
++  Backtrace.cpp \
++  BacktraceCurrent.cpp \
++  BacktraceMap.cpp \
++  BacktracePtrace.cpp \
++  ThreadEntry.cpp \
++  UnwindStack.cpp \
++  UnwindStackMap.cpp \
++
++libunwindstack_SOURCES := \
++  ArmExidx.cpp \
++  DexFiles.cpp \
++  DwarfCfa.cpp \
++  DwarfEhFrameWithHdr.cpp \
++  DwarfMemory.cpp \
++  DwarfOp.cpp \
++  DwarfSection.cpp \
++  Elf.cpp \
++  ElfInterface.cpp \
++  ElfInterfaceArm.cpp \
++  Global.cpp \
++  JitDebug.cpp \
++  Log.cpp \
++  MapInfo.cpp \
++  Maps.cpp \
++  Memory.cpp \
++  LocalUnwinder.cpp \
++  Regs.cpp \
++  RegsArm.cpp \
++  RegsArm64.cpp \
++  RegsX86.cpp \
++  RegsX86_64.cpp \
++  RegsMips.cpp \
++  RegsMips64.cpp \
++  Unwinder.cpp \
++  Symbols.cpp \
++
++ifeq ($(DEB_HOST_ARCH), amd64)
++  SOURCES_ASSEMBLY = libunwindstack/AsmGetRegsX86_64.S
++else ifeq ($(DEB_HOST_ARCH), i386)
++  SOURCES_ASSEMBLY = libunwindstack/AsmGetRegsX86.S
++else ifeq ($(DEB_HOST_ARCH), mips64el)
++  SOURCES_ASSEMBLY = libunwindstack/AsmGetRegsMips64.S
++else ifeq ($(DEB_HOST_ARCH), mipsel)
++  SOURCES_ASSEMBLY = libunwindstack/AsmGetRegsMips.S
++endif
++
++SOURCES = \
++  $(foreach source, $(filter %.cpp, $(libbacktrace_SOURCES)), libbacktrace/$(source)) \
++  $(foreach source, $(filter %.cpp, $(libunwindstack_SOURCES)), libunwindstack/$(source)) \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/$(source))
++OBJECTS_CXX = $(SOURCES:.cpp=.o)
++SOURCES_ASSEMBLY := $(foreach source, $(SOURCES_ASSEMBLY), system/core/$(source))
++OBJECTS_ASSEMBLY := $(SOURCES_ASSEMBLY:.S=.o)
++
++CXXFLAGS += -std=gnu++2a -fno-omit-frame-pointer
++CPPFLAGS += \
++  -Iexternal/libunwind/include \
++  -Idebian/include/external/libunwind \
++  -Isystem/core/include \
++  -Isystem/core/base/include \
++  -Isystem/core/liblog/include \
++  -Isystem/core/libprocinfo/include \
++  -Isystem/core/libunwindstack/include \
++
++LDFLAGS += \
++  -L/usr/lib/p7zip \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/p7zip \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -l:7z.so \
++  -lbase \
++  -llog \
++  -lpthread \
++  -shared
++
++# -latomic should be the last library specified
++# https://github.com/android/ndk/issues/589
++ifneq ($(filter armel mipsel,$(DEB_HOST_ARCH)),)
++  LDFLAGS += -latomic
++endif
++
++build: $(OBJECTS_CXX) $(OBJECTS_ASSEMBLY) debian/out/external/libunwind/libunwind.a
++      mkdir -p debian/out/system/core
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS_CXX): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
++
++$(OBJECTS_ASSEMBLY): %.o: %.S
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS) -D__ASSEMBLY__
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..bab44ffa3c01b02ca403b3ba0955d0f1feef0b64
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,50 @@@
++NAME = libbase
++
++SOURCES = \
++  abi_compatibility.cpp \
++  chrono_utils.cpp \
++  cmsg.cpp \
++  file.cpp \
++  liblog_symbols.cpp \
++  logging.cpp \
++  mapped_file.cpp \
++  parsebool.cpp \
++  parsenetaddress.cpp \
++  process.cpp \
++  properties.cpp \
++  stringprintf.cpp \
++  strings.cpp \
++  threads.cpp \
++  test_utils.cpp \
++  \
++  errors_unix.cpp
++
++SOURCES := $(foreach source, $(SOURCES), system/core/base/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -D_FILE_OFFSET_BITS=64 \
++  -Isystem/core/base/include \
++  -Isystem/core/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -llog \
++  -lpthread \
++  -shared
++
++# -latomic should be the last library specified
++# https://github.com/android/ndk/issues/589
++ifneq ($(filter armel mipsel,$(DEB_HOST_ARCH)),)
++  LDFLAGS += -latomic
++endif
++
++build: $(OBJECTS)
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cc7aa3d15e0003de884b0d310bf5b533e72cff3f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++NAME:= libcrypto_utils
++
++SOURCES = system/core/libcrypto_utils/android_pubkey.c
++OBJECTS = $(SOURCES:.c=.o)
++
++CPPFLAGS += \
++  -I/usr/include/android \
++  -Isystem/core/include \
++  -Isystem/core/libcrypto_utils/include \
++
++debian/out/system/core/$(NAME).a: $(OBJECTS)
++      ar -rcs $@ $^
++
++$(OBJECTS): %.o: %.c
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d4e933cf728d67de4be957e7a9c3a6c1ef44a238
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,65 @@@
++NAME = libcutils
++
++libcutils_nonwindows_sources = \
++  fs.cpp \
++  hashmap.cpp \
++  multiuser.cpp \
++  socket_inaddr_any_server_unix.cpp \
++  socket_local_client_unix.cpp \
++  socket_local_server_unix.cpp \
++  socket_network_client_unix.cpp \
++  sockets_unix.cpp \
++  str_parms.cpp \
++
++cc_library_srcs = \
++  config_utils.cpp \
++  canned_fs_config.cpp \
++  iosched_policy.cpp \
++  load_file.cpp \
++  native_handle.cpp \
++  record_stream.cpp \
++  sockets.cpp \
++  strlcpy.c \
++  threads.cpp \
++
++cc_library_target_not_windows_srcs = \
++  ashmem-host.cpp \
++  fs_config.cpp \
++  trace-host.cpp \
++
++SOURCES = \
++  $(libcutils_nonwindows_sources) \
++  $(cc_library_srcs) \
++  $(cc_library_target_not_windows_srcs)
++
++
++SOURCES_C := $(foreach source, $(filter %.c, $(SOURCES)), system/core/libcutils/$(source))
++OBJECTS_C := $(SOURCES_C:.c=.o)
++SOURCES_CXX := $(foreach source, $(filter %.cpp, $(SOURCES)), system/core/libcutils/$(source))
++OBJECTS_CXX := $(SOURCES_CXX:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -Isystem/core/base/include \
++  -Isystem/core/libcutils/include \
++  -Isystem/core/liblog/include \
++  -Isystem/core/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -lbase \
++  -llog \
++  -lpthread \
++  -shared
++
++build: $(OBJECTS_C) $(OBJECTS_CXX)
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS_C): %.o: %.c
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS)
++
++$(OBJECTS_CXX): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..21ab2766f8b47fac678c6b186e69781e6aa77b9b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++NAME = liblog
++
++liblog_sources = \
++  log_event_list.cpp \
++  log_event_write.cpp \
++  logger_name.cpp \
++  logger_read.cpp \
++  logger_write.cpp \
++  logprint.cpp \
++  properties.cpp \
++
++not_windows_sources = \
++  event_tag_map.cpp \
++
++SOURCES = $(liblog_sources) $(not_windows_sources)
++SOURCES := $(foreach source, $(SOURCES), system/core/liblog/$(source))
++OBJECTS := $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a -fcommon
++CPPFLAGS += \
++  -DFAKE_LOG_DEVICE=1 \
++  -DLIBLOG_LOG_TAG=1006 \
++  -DSNET_EVENT_LOG_TAG=1397638484 \
++  -Isystem/core/base/include \
++  -Isystem/core/include \
++  -Isystem/core/liblog/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -lpthread \
++  -shared
++
++build: $(OBJECTS)
++      mkdir -p debian/out/system/core
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..bf99f89f3542aad26ec70b7dcbc2846fb70730ae
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,33 @@@
++NAME = libsparse
++
++SOURCES = \
++  backed_block.cpp \
++  output_file.cpp \
++  sparse.cpp \
++  sparse_crc32.cpp \
++  sparse_err.cpp \
++  sparse_read.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libsparse/$(source))
++OBJECTS := $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -Isystem/core/base/include \
++  -Isystem/core/include \
++  -Isystem/core/libsparse/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -lbase \
++  -lz \
++  -shared
++
++build: $(OBJECTS)
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e90f2663762d6c4a812de6ba6747122f36d63ee6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,63 @@@
++include /usr/share/dpkg/architecture.mk
++
++NAME = libutils
++
++SOURCES = \
++  CallStack.cpp \
++  FileMap.cpp \
++  JenkinsHash.cpp \
++  Looper.cpp \
++  misc.cpp \
++  NativeHandle.cpp \
++  Printer.cpp \
++  ProcessCallStack.cpp \
++  PropertyMap.cpp \
++  RefBase.cpp \
++  SharedBuffer.cpp \
++  StopWatch.cpp \
++  String16.cpp \
++  String8.cpp \
++  StrongPointer.cpp \
++  SystemClock.cpp \
++  Threads.cpp \
++  Timers.cpp \
++  Tokenizer.cpp \
++  Unicode.cpp \
++  VectorImpl.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libutils/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a
++CPPFLAGS += \
++  -DLIBUTILS_NATIVE=1 \
++  -Isystem/core/base/include \
++  -Isystem/core/cutils/include \
++  -Isystem/core/include \
++  -Isystem/core/libbacktrace/include \
++  -Isystem/core/libcutils/include \
++  -Isystem/core/liblog/include \
++  -Isystem/core/libprocessgroup/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -lbacktrace \
++  -lcutils \
++  -llog \
++  -lpthread \
++  -shared
++
++# -latomic should be the last library specified
++# https://github.com/android/ndk/issues/589
++ifneq ($(filter armel mipsel,$(DEB_HOST_ARCH)),)
++  LDFLAGS += -latomic
++endif
++
++build: $(OBJECTS)
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..de7b89fed9ec6ba04d0f6fea68bbf9826dd565fc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,35 @@@
++NAME = libziparchive
++
++SOURCES = \
++  zip_archive.cc \
++  zip_archive_stream_entry.cc \
++  zip_writer.cc \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libziparchive/$(source))
++OBJECTS = $(SOURCES:.cc=.o)
++
++CXXFLAGS += -std=gnu++17
++CPPFLAGS += \
++  -DZLIB_CONST \
++  -D_FILE_OFFSET_BITS=64 \
++  -Isystem/core/include \
++  -Isystem/core/base/include \
++  -Isystem/core/liblog/include \
++  -Isystem/core/libziparchive/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -Wl,-soname,$(NAME).so.0 \
++  -lbase \
++  -llog \
++  -lpthread \
++  -lz \
++  -shared
++
++build: $(OBJECTS)
++      $(CXX) $^ -o debian/out/system/core/$(NAME).so.0 $(LDFLAGS)
++      ln -sf $(NAME).so.0 debian/out/system/core/$(NAME).so
++
++$(OBJECTS): %.o: %.cc
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..78a9ea6b808263ae70de85982dc47cc341367997
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,27 @@@
++NAME = simg2img
++
++SOURCES = \
++  simg2img.cpp \
++  sparse_crc32.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libsparse/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++17
++CPPFLAGS += \
++  -Isystem/core/libsparse/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -lbase \
++  -llog \
++  -lpthread \
++  -lsparse \
++  -pie \
++
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dc0a07974145616b44ab1669fdee09ee2ceb5735
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,30 @@@
++NAME = simg2simg
++
++SOURCES = \
++  simg2simg.cpp \
++  sparse_crc32.cpp \
++
++SOURCES := $(foreach source, $(SOURCES), system/core/libsparse/$(source))
++OBJECTS = $(SOURCES:.cpp=.o)
++
++CXXFLAGS += -std=gnu++17 -fpermissive
++CPPFLAGS += \
++  -Isystem/core/libsparse/include \
++
++LDFLAGS += \
++  -Ldebian/out/system/core \
++  -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \
++  -lbase \
++  -llog \
++  -lpthread \
++  -lsparse \
++  -pie \
++
++# force GCC, clang fails on:
++# libsparse/simg2simg.cpp:75:11: error: assigning to 'struct sparse_file **' from incompatible type 'void *'
++#  out_s = calloc(sizeof(struct sparse_file*), files);
++debian/out/system/core/$(NAME): $(OBJECTS)
++      $(CXX) -o $@ $^ $(LDFLAGS)
++
++$(OBJECTS): %.o: %.cpp
++      g++ -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..264bb95ad36aa3da073210103b45dbee6fd92b1d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++NAME = libext4_utils
++
++ext4_utils_SOURCES = \
++  ext4_utils.cpp \
++  wipe.cpp \
++  ext4_sb.cpp \
++
++ext4_utils_SOURCES := $(foreach source, $(ext4_utils_SOURCES), system/extras/ext4_utils/$(source))
++
++squashfs_utils_SOURCES = \
++  squashfs_utils.c \
++
++squashfs_utils_SOURCES := $(foreach source, $(squashfs_utils_SOURCES), system/extras/squashfs_utils/$(source))
++
++SOURCES = $(ext4_utils_SOURCES) $(squashfs_utils_SOURCES)
++
++SOURCES_C = $(filter %.c,$(SOURCES))
++OBJECTS_C = $(SOURCES_C:.c=.o)
++SOURCES_CXX = $(filter %.cpp,$(SOURCES))
++OBJECTS_CXX = $(SOURCES_CXX:.cpp=.o)
++
++CXXFLAGS += -std=gnu++2a -fno-strict-aliasing
++CPPFLAGS += \
++  -D_GNU_SOURCE \
++  -D_LARGEFILE64_SOURCE \
++  -DFEC_NO_KLOG \
++  -DSQUASHFS_NO_KLOG \
++  -I/usr/include/android \
++  -Isystem/core/base/include \
++  -Isystem/core/libcutils/include \
++  -Isystem/core/libsparse/include \
++  -Isystem/extras/ext4_utils/include \
++  -Isystem/extras/libfec/include \
++  -Isystem/extras/squashfs_utils \
++
++debian/out/system/extras/libext4_utils.a: $(OBJECTS_C) $(OBJECTS_CXX)
++      mkdir -p debian/out/system/extras
++      ar -rcs $@ $^
++
++$(OBJECTS_C): %.o: %.c
++      $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS)
++
++$(OBJECTS_CXX): %.o: %.cpp
++      $(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a7fa244fa4d9047f1e727e2a1c166459ba43edc5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,32 @@@
++## system-core
++
++Test-Command: adb version
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: adb
++
++Test-Command: adb help
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: adb
++
++Test-Command: adb kill-server && adb devices
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: adb
++Restrictions: allow-stderr
++
++Test-Command: adb keygen key.txt && ls -l key.txt* && rm key.txt*
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: adb
++Restrictions: allow-stderr
++
++Test-Command: fastboot --version
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: fastboot
++
++Test-Command: fastboot devices
++Architecture: amd64 i386 armel armhf arm64 mipsel mips64el ppc64el
++Depends: fastboot
++
++## development
++
++Test-Command: etc1tool development/tools/templates/ic_launcher_ldpi.png --encode && etc1tool development/tools/templates/ic_launcher_ldpi.pkm --decode
++Depends: etc1tool
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..eadbad9726769bfb01d8a1e6ed6035bfffa400fc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++Archive: Android Open Source Project (AOSP)
++Bug-Database: https://issuetracker.google.com/issues?q=componentid:192728%20status:open
++Bug-Submit: https://developer.android.com/studio/report-bugs
++Documentation: https://developer.android.com/studio/releases/platform-tools
++Repository-Browse: https://android.googlesource.com
++Security-Contact: https://source.android.com/security/overview/updates-resources#report-issues
diff --cc debian/watch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4f2355cae35aa455aa5fb0df188a4d869b85e3e2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++# this produces a corrupt tarball, see README.source and get-orig-source
++version=4
++opts="pagemangle=s%\">platform-tools-%\.tar\.gz\">platform-tools-%g;s%/\+/refs/tags/%/+archive/%g" \
++https://android.googlesource.com/platform/system/core/+refs \
++    [\w\/]+\+archive\/platform-tools-([0-9\.]+)\.tar\.gz