summaryrefslogtreecommitdiff
path: root/chromium/third_party/zlib
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-16 11:45:35 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-17 08:59:23 +0000
commit552906b0f222c5d5dd11b9fd73829d510980461a (patch)
tree3a11e6ed0538a81dd83b20cf3a4783e297f26d91 /chromium/third_party/zlib
parent1b05827804eaf047779b597718c03e7d38344261 (diff)
downloadqtwebengine-chromium-552906b0f222c5d5dd11b9fd73829d510980461a.tar.gz
BASELINE: Update Chromium to 83.0.4103.122
Change-Id: Ie3a82f5bb0076eec2a7c6a6162326b4301ee291e Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/zlib')
-rw-r--r--chromium/third_party/zlib/BUILD.gn70
-rw-r--r--chromium/third_party/zlib/OWNERS4
-rw-r--r--chromium/third_party/zlib/adler32.c8
-rw-r--r--chromium/third_party/zlib/contrib/minizip/iowin32.c8
-rw-r--r--chromium/third_party/zlib/contrib/optimizations/insert_string.h122
-rw-r--r--chromium/third_party/zlib/contrib/tests/fuzzers/BUILD.gn32
-rw-r--r--chromium/third_party/zlib/cpu_features.c (renamed from chromium/third_party/zlib/arm_features.c)86
-rw-r--r--chromium/third_party/zlib/cpu_features.h (renamed from chromium/third_party/zlib/arm_features.h)8
-rw-r--r--chromium/third_party/zlib/crc32.c17
-rw-r--r--chromium/third_party/zlib/crc32_simd.c27
-rw-r--r--chromium/third_party/zlib/crc32_simd.h5
-rw-r--r--chromium/third_party/zlib/deflate.c112
-rw-r--r--chromium/third_party/zlib/google/BUILD.gn4
-rw-r--r--chromium/third_party/zlib/patches/0003-uninitializedjump.patch15
-rw-r--r--chromium/third_party/zlib/patches/0004-fix-uwp.patch22
-rw-r--r--chromium/third_party/zlib/simd_stub.c35
-rw-r--r--chromium/third_party/zlib/x86.c101
-rw-r--r--chromium/third_party/zlib/x86.h16
18 files changed, 313 insertions, 379 deletions
diff --git a/chromium/third_party/zlib/BUILD.gn b/chromium/third_party/zlib/BUILD.gn
index 0f59c0aaf2a..1f572378e02 100644
--- a/chromium/third_party/zlib/BUILD.gn
+++ b/chromium/third_party/zlib/BUILD.gn
@@ -17,7 +17,10 @@ config("zlib_internal_config") {
}
use_arm_neon_optimizations = false
-if (current_cpu == "arm" || current_cpu == "arm64") {
+if ((current_cpu == "arm" || current_cpu == "arm64") &&
+ !(is_win && !is_clang)) {
+ # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for
+ # Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
if (arm_use_neon) {
use_arm_neon_optimizations = true
}
@@ -29,9 +32,12 @@ use_x86_x64_optimizations =
config("zlib_adler32_simd_config") {
if (use_x86_x64_optimizations) {
defines = [ "ADLER32_SIMD_SSSE3" ]
- }
-
- if (use_arm_neon_optimizations) {
+ if (is_win) {
+ defines += [ "X86_WINDOWS" ]
+ } else {
+ defines += [ "X86_NOT_WINDOWS" ]
+ }
+ } else if (use_arm_neon_optimizations) {
defines = [ "ADLER32_SIMD_NEON" ]
}
}
@@ -94,24 +100,13 @@ if (use_arm_neon_optimizations) {
if (!is_ios) {
include_dirs = [ "." ]
- if (is_android) {
- import("//build/config/android/config.gni")
- if (defined(android_ndk_root) && android_ndk_root != "") {
- deps = [
- "//third_party/android_ndk:cpu_features",
- ]
- } else {
- assert(false, "CPU detection requires the Android NDK")
- }
- } else if (!is_win && !is_clang) {
+ if (!is_win && !is_clang) {
assert(!use_thin_lto,
"ThinLTO fails mixing different module-level targets")
cflags_c = [ "-march=armv8-a+crc" ]
}
sources = [
- "arm_features.c",
- "arm_features.h",
"crc32_simd.c",
"crc32_simd.h",
]
@@ -218,10 +213,6 @@ source_set("zlib_x86_simd") {
"-mpclmul",
]
}
- } else {
- sources = [
- "simd_stub.c",
- ]
}
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -247,6 +238,9 @@ component("zlib") {
"adler32.c",
"chromeconf.h",
"compress.c",
+ "contrib/optimizations/insert_string.h",
+ "cpu_features.c",
+ "cpu_features.h",
"crc32.c",
"crc32.h",
"deflate.c",
@@ -266,7 +260,6 @@ component("zlib") {
"trees.c",
"trees.h",
"uncompr.c",
- "x86.h",
"zconf.h",
"zlib.h",
"zutil.c",
@@ -275,6 +268,19 @@ component("zlib") {
defines = []
deps = []
+ if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
+ # Apparently android_cronet bot builds with NEON disabled and
+ # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
+ defines += [ "CPU_NO_SIMD" ]
+ }
+
+ if (is_ios) {
+ # iOS@ARM is a special case where we always have NEON but don't check
+ # for crypto extensions.
+ # TODO(cavalcantii): verify what is the current state of CPU features shipped
+ # on latest iOS devices.
+ defines += [ "ARM_OS_IOS" ]
+ }
if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
deps += [
@@ -283,7 +289,6 @@ component("zlib") {
]
if (use_x86_x64_optimizations) {
- sources += [ "x86.c" ]
deps += [ ":zlib_crc32_simd" ]
} else if (use_arm_neon_optimizations) {
sources += [ "contrib/optimizations/slide_hash_neon.h" ]
@@ -293,6 +298,15 @@ component("zlib") {
sources += [ "inflate.c" ]
}
+ if (is_android) {
+ import("//build/config/android/config.gni")
+ if (defined(android_ndk_root) && android_ndk_root != "") {
+ deps += [ "//third_party/android_ndk:cpu_features" ]
+ } else {
+ assert(false, "CPU detection requires the Android NDK")
+ }
+ }
+
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
":zlib_internal_config",
@@ -342,9 +356,7 @@ static_library("minizip") {
defines = [ "USE_FILE32API" ]
}
- deps = [
- ":zlib",
- ]
+ deps = [ ":zlib" ]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
@@ -360,9 +372,7 @@ static_library("minizip") {
executable("zlib_bench") {
include_dirs = [ "." ]
- sources = [
- "contrib/bench/zlib_bench.cc",
- ]
+ sources = [ "contrib/bench/zlib_bench.cc" ]
if (!is_debug) {
configs -= [ "//build/config/compiler:default_optimization" ]
@@ -372,7 +382,5 @@ executable("zlib_bench") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
- deps = [
- ":zlib",
- ]
+ deps = [ ":zlib" ]
}
diff --git a/chromium/third_party/zlib/OWNERS b/chromium/third_party/zlib/OWNERS
index 069bcd8c2a1..22f4d8938ef 100644
--- a/chromium/third_party/zlib/OWNERS
+++ b/chromium/third_party/zlib/OWNERS
@@ -1,7 +1,7 @@
agl@chromium.org
cavalcantii@chromium.org
cblume@chromium.org
-mtklein@chromium.org
-scroggo@chromium.org
+mtklein@google.com
+scroggo@google.com
# COMPONENT: Internals
diff --git a/chromium/third_party/zlib/adler32.c b/chromium/third_party/zlib/adler32.c
index a42f35fce2a..696773a09d4 100644
--- a/chromium/third_party/zlib/adler32.c
+++ b/chromium/third_party/zlib/adler32.c
@@ -59,10 +59,8 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
# define MOD63(a) a %= BASE
#endif
-#if defined(ADLER32_SIMD_SSSE3)
-#include "adler32_simd.h"
-#include "x86.h"
-#elif defined(ADLER32_SIMD_NEON)
+#include "cpu_features.h"
+#if defined(ADLER32_SIMD_SSSE3) || defined(ADLER32_SIMD_NEON)
#include "adler32_simd.h"
#endif
@@ -108,7 +106,7 @@ uLong ZEXPORT adler32_z(adler, buf, len)
*/
if (buf == Z_NULL) {
if (!len) /* Assume user is calling adler32(0, NULL, 0); */
- x86_check_features();
+ cpu_check_features();
return 1L;
}
#else
diff --git a/chromium/third_party/zlib/contrib/minizip/iowin32.c b/chromium/third_party/zlib/contrib/minizip/iowin32.c
index 246ceb91a13..c6bc314b3c2 100644
--- a/chromium/third_party/zlib/contrib/minizip/iowin32.c
+++ b/chromium/third_party/zlib/contrib/minizip/iowin32.c
@@ -31,14 +31,12 @@
#define _WIN32_WINNT 0x601
#endif
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
-// see Include/shared/winapifamily.h in the Windows Kit
-#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
-#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
+#if !defined(IOWIN32_USING_WINRT_API)
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+// Windows Store or Universal Windows Platform
#define IOWIN32_USING_WINRT_API 1
#endif
#endif
-#endif
voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode));
uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/chromium/third_party/zlib/contrib/optimizations/insert_string.h b/chromium/third_party/zlib/contrib/optimizations/insert_string.h
new file mode 100644
index 00000000000..1826601b7fb
--- /dev/null
+++ b/chromium/third_party/zlib/contrib/optimizations/insert_string.h
@@ -0,0 +1,122 @@
+/* insert_string.h
+ *
+ * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the Chromium source repository LICENSE file.
+ */
+#ifdef _MSC_VER
+#define INLINE __inline
+#else
+#define INLINE inline
+#endif
+
+#include "cpu_features.h"
+/* Optimized insert_string block */
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
+#define TARGET_CPU_WITH_CRC
+// clang-format off
+#if defined(CRC32_SIMD_SSE42_PCLMUL)
+ /* Required to make MSVC bot build pass. */
+ #include <smmintrin.h>
+ #if defined(__GNUC__) || defined(__clang__)
+ #undef TARGET_CPU_WITH_CRC
+ #define TARGET_CPU_WITH_CRC __attribute__((target("sse4.2")))
+ #endif
+
+ #define _cpu_crc32_u32 _mm_crc32_u32
+
+#elif defined(CRC32_ARMV8_CRC32)
+ #if defined(__clang__)
+ #undef TARGET_CPU_WITH_CRC
+ #define __crc32cw __builtin_arm_crc32cw
+ #endif
+
+ #define _cpu_crc32_u32 __crc32cw
+
+ #if defined(__aarch64__)
+ #define TARGET_CPU_WITH_CRC __attribute__((target("crc")))
+ #else // !defined(__aarch64__)
+ #define TARGET_CPU_WITH_CRC __attribute__((target("armv8-a,crc")))
+ #endif // defined(__aarch64__)
+#endif
+// clang-format on
+TARGET_CPU_WITH_CRC
+local INLINE Pos insert_string_optimized(deflate_state* const s,
+ const Pos str) {
+ Pos ret;
+ unsigned *ip, val, h = 0;
+
+ ip = (unsigned*)&s->window[str];
+ val = *ip;
+
+ if (s->level >= 6)
+ val &= 0xFFFFFF;
+
+ /* Unlike the case of data integrity checks for GZIP format where the
+ * polynomial used is defined (https://tools.ietf.org/html/rfc1952#page-11),
+ * here it is just a hash function for the hash table used while
+ * performing compression.
+ */
+ h = _cpu_crc32_u32(h, val);
+
+ ret = s->head[h & s->hash_mask];
+ s->head[h & s->hash_mask] = str;
+ s->prev[str & s->w_mask] = ret;
+ return ret;
+}
+#endif /* Optimized insert_string block */
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to UPDATE_HASH are made with consecutive input
+ * characters, so that a running hash key can be computed from the previous
+ * key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s, h, c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask)
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN assertion: all calls to INSERT_STRING are made with consecutive input
+ * characters and the first MIN_MATCH bytes of str are valid (except for
+ * the last MIN_MATCH-1 bytes of the input file).
+ */
+local INLINE Pos insert_string_c(deflate_state* const s, const Pos str) {
+ Pos ret;
+
+ UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH - 1)]);
+#ifdef FASTEST
+ ret = s->head[s->ins_h];
+#else
+ ret = s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = str;
+
+ return ret;
+}
+
+local INLINE Pos insert_string(deflate_state* const s, const Pos str) {
+/* String dictionary insertion: faster symbol hashing has a positive impact
+ * on data compression speeds (around 20% on Intel and 36% on Arm Cortex big
+ * cores).
+ * A misfeature is that the generated compressed output will differ from
+ * vanilla zlib (even though it is still valid 'DEFLATE-d' content).
+ *
+ * We offer here a way to disable the optimization if there is the expectation
+ * that compressed content should match when compared to vanilla zlib.
+ */
+#if !defined(CHROMIUM_ZLIB_NO_CASTAGNOLI)
+ /* TODO(cavalcantii): unify CPU features code. */
+#if defined(CRC32_ARMV8_CRC32)
+ if (arm_cpu_enable_crc32)
+ return insert_string_optimized(s, str);
+#elif defined(CRC32_SIMD_SSE42_PCLMUL)
+ if (x86_cpu_enable_simd)
+ return insert_string_optimized(s, str);
+#endif
+#endif
+ return insert_string_c(s, str);
+}
diff --git a/chromium/third_party/zlib/contrib/tests/fuzzers/BUILD.gn b/chromium/third_party/zlib/contrib/tests/fuzzers/BUILD.gn
index c46b6644007..34c3b43d1f5 100644
--- a/chromium/third_party/zlib/contrib/tests/fuzzers/BUILD.gn
+++ b/chromium/third_party/zlib/contrib/tests/fuzzers/BUILD.gn
@@ -9,37 +9,21 @@ group("fuzzers") {
}
fuzzer_test("zlib_uncompress_fuzzer") {
- sources = [
- "uncompress_fuzzer.cc",
- ]
- deps = [
- "../../../:zlib",
- ]
+ sources = [ "uncompress_fuzzer.cc" ]
+ deps = [ "../../../:zlib" ]
}
fuzzer_test("zlib_inflate_fuzzer") {
- sources = [
- "inflate_fuzzer.cc",
- ]
- deps = [
- "../../../:zlib",
- ]
+ sources = [ "inflate_fuzzer.cc" ]
+ deps = [ "../../../:zlib" ]
}
fuzzer_test("zlib_deflate_set_dictionary_fuzzer") {
- sources = [
- "deflate_set_dictionary_fuzzer.cc",
- ]
- deps = [
- "../../../:zlib",
- ]
+ sources = [ "deflate_set_dictionary_fuzzer.cc" ]
+ deps = [ "../../../:zlib" ]
}
fuzzer_test("zlib_deflate_fuzzer") {
- sources = [
- "deflate_fuzzer.cc",
- ]
- deps = [
- "../../../:zlib",
- ]
+ sources = [ "deflate_fuzzer.cc" ]
+ deps = [ "../../../:zlib" ]
}
diff --git a/chromium/third_party/zlib/arm_features.c b/chromium/third_party/zlib/cpu_features.c
index f5641c39bbc..ceed98822ac 100644
--- a/chromium/third_party/zlib/arm_features.c
+++ b/chromium/third_party/zlib/cpu_features.c
@@ -1,16 +1,28 @@
-/* arm_features.c -- ARM processor features detection.
+/* cpu_features.c -- Processor features detection.
*
* Copyright 2018 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the Chromium source repository LICENSE file.
*/
-#include "arm_features.h"
+#include "cpu_features.h"
#include "zutil.h"
+
#include <stdint.h>
+#if defined(_MSC_VER)
+#include <intrin.h>
+#elif defined(ADLER32_SIMD_SSSE3)
+#include <cpuid.h>
+#endif
+/* TODO(cavalcantii): remove checks for x86_flags on deflate.
+ */
int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0;
int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
+int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0;
+int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
+
+#ifndef CPU_NO_SIMD
#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
#include <pthread.h>
@@ -25,39 +37,49 @@ int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
#include <zircon/features.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>
-#elif defined(ARMV8_OS_WINDOWS)
+#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS)
#include <windows.h>
+#elif !defined(_MSC_VER)
+#include <pthread.h>
#else
-#error arm_features.c ARM feature detection in not defined for your platform
+#error cpu_features.c CPU feature detection in not defined for your platform
#endif
-static void _arm_check_features(void);
+#if !defined(CPU_NO_SIMD) && !defined(ARM_OS_IOS)
+static void _cpu_check_features(void);
+#endif
-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
+#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS)
static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
-void ZLIB_INTERNAL arm_check_features(void)
+void ZLIB_INTERNAL cpu_check_features(void)
{
- pthread_once(&cpu_check_inited_once, _arm_check_features);
+ pthread_once(&cpu_check_inited_once, _cpu_check_features);
}
-#elif defined(ARMV8_OS_WINDOWS)
+#elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS)
static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
-static BOOL CALLBACK _arm_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context)
+static BOOL CALLBACK _cpu_check_features_forwarder(PINIT_ONCE once, PVOID param, PVOID* context)
{
- _arm_check_features();
+ _cpu_check_features();
return TRUE;
}
-void ZLIB_INTERNAL arm_check_features(void)
+void ZLIB_INTERNAL cpu_check_features(void)
{
- InitOnceExecuteOnce(&cpu_check_inited_once, _arm_check_features_forwarder,
+ InitOnceExecuteOnce(&cpu_check_inited_once, _cpu_check_features_forwarder,
NULL, NULL);
}
#endif
+#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
+/*
+ * iOS@ARM is a special case where we always have NEON but don't check
+ * for crypto extensions.
+ */
+#ifndef ARM_OS_IOS
/*
* See http://bit.ly/2CcoEsr for run-time detection of ARM features and also
* crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox.
*/
-static void _arm_check_features(void)
+static void _cpu_check_features(void)
{
#if defined(ARMV8_OS_ANDROID) && defined(__aarch64__)
uint64_t features = android_getCpuFeatures();
@@ -88,3 +110,39 @@ static void _arm_check_features(void)
arm_cpu_enable_pmull = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
#endif
}
+#endif
+#elif defined(X86_NOT_WINDOWS) || defined(X86_WINDOWS)
+/*
+ * iOS@x86 (i.e. emulator) is another special case where we disable
+ * SIMD optimizations.
+ */
+#ifndef CPU_NO_SIMD
+/* On x86 we simply use a instruction to check the CPU features.
+ * (i.e. CPUID).
+ */
+static void _cpu_check_features(void)
+{
+ int x86_cpu_has_sse2;
+ int x86_cpu_has_ssse3;
+ int x86_cpu_has_sse42;
+ int x86_cpu_has_pclmulqdq;
+ int abcd[4];
+#ifdef _MSC_VER
+ __cpuid(abcd, 1);
+#else
+ __cpuid(1, abcd[0], abcd[1], abcd[2], abcd[3]);
+#endif
+ x86_cpu_has_sse2 = abcd[3] & 0x4000000;
+ x86_cpu_has_ssse3 = abcd[2] & 0x000200;
+ x86_cpu_has_sse42 = abcd[2] & 0x100000;
+ x86_cpu_has_pclmulqdq = abcd[2] & 0x2;
+
+ x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
+
+ x86_cpu_enable_simd = x86_cpu_has_sse2 &&
+ x86_cpu_has_sse42 &&
+ x86_cpu_has_pclmulqdq;
+}
+#endif
+#endif
+#endif \ No newline at end of file
diff --git a/chromium/third_party/zlib/arm_features.h b/chromium/third_party/zlib/cpu_features.h
index 09fec259b1c..2a4a797342e 100644
--- a/chromium/third_party/zlib/arm_features.h
+++ b/chromium/third_party/zlib/cpu_features.h
@@ -1,4 +1,4 @@
-/* arm_features.h -- ARM processor features detection.
+/* cpu_features.h -- Processor features detection.
*
* Copyright 2018 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
@@ -7,7 +7,11 @@
#include "zlib.h"
+/* TODO(cavalcantii): remove checks for x86_flags on deflate.
+ */
extern int arm_cpu_enable_crc32;
extern int arm_cpu_enable_pmull;
+extern int x86_cpu_enable_ssse3;
+extern int x86_cpu_enable_simd;
-void arm_check_features(void);
+void cpu_check_features(void);
diff --git a/chromium/third_party/zlib/crc32.c b/chromium/third_party/zlib/crc32.c
index e95b9087351..bd6964701bd 100644
--- a/chromium/third_party/zlib/crc32.c
+++ b/chromium/third_party/zlib/crc32.c
@@ -29,13 +29,10 @@
#endif /* MAKECRCH */
#include "deflate.h"
-#include "x86.h"
+#include "cpu_features.h"
#include "zutil.h" /* for STDC and FAR definitions */
-#if defined(CRC32_SIMD_SSE42_PCLMUL)
-#include "crc32_simd.h"
-#elif defined(CRC32_ARMV8_CRC32)
-#include "arm_features.h"
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
#include "crc32_simd.h"
#endif
@@ -226,7 +223,7 @@ unsigned long ZEXPORT crc32_z(crc, buf, len)
*/
if (buf == Z_NULL) {
if (!len) /* Assume user is calling crc32(0, NULL, 0); */
- x86_check_features();
+ cpu_check_features();
return 0UL;
}
@@ -289,7 +286,7 @@ unsigned long ZEXPORT crc32(crc, buf, len)
*/
if (buf == Z_NULL) {
if (!len) /* Assume user is calling crc32(0, NULL, 0); */
- arm_check_features();
+ cpu_check_features();
return 0UL;
}
@@ -500,25 +497,31 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
ZLIB_INTERNAL void crc_reset(deflate_state *const s)
{
+#ifdef ADLER32_SIMD_SSSE3
if (x86_cpu_enable_simd) {
crc_fold_init(s);
return;
}
+#endif
s->strm->adler = crc32(0L, Z_NULL, 0);
}
ZLIB_INTERNAL void crc_finalize(deflate_state *const s)
{
+#ifdef ADLER32_SIMD_SSSE3
if (x86_cpu_enable_simd)
s->strm->adler = crc_fold_512to32(s);
+#endif
}
ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size)
{
+#ifdef ADLER32_SIMD_SSSE3
if (x86_cpu_enable_simd) {
crc_fold_copy(strm->state, dst, strm->next_in, size);
return;
}
+#endif
zmemcpy(dst, strm->next_in, size);
strm->adler = crc32(strm->adler, dst, size);
}
diff --git a/chromium/third_party/zlib/crc32_simd.c b/chromium/third_party/zlib/crc32_simd.c
index 988f00b2f4d..c8e5592f38e 100644
--- a/chromium/third_party/zlib/crc32_simd.c
+++ b/chromium/third_party/zlib/crc32_simd.c
@@ -240,31 +240,4 @@ uint32_t ZLIB_INTERNAL armv8_crc32_little(unsigned long crc,
return ~c;
}
-TARGET_ARMV8_WITH_CRC
-Pos ZLIB_INTERNAL insert_string_arm(deflate_state *const s, const Pos str)
-{
- Pos ret;
- unsigned *ip, val, h = 0;
-
- ip = (unsigned *)&s->window[str];
- val = *ip;
-
- if (s->level >= 6)
- val &= 0xFFFFFF;
-
- /* We use CRC32C (Castagnoli) to ensure that the compressed output
- * will match between Intel x ARM.
- * Unlike the case of data integrity checks for GZIP format where the
- * polynomial used is defined (https://tools.ietf.org/html/rfc1952#page-11),
- * here it is just a hash function for the hash table used while
- * performing compression.
- */
- h = __crc32cw(h, val);
-
- ret = s->head[h & s->hash_mask];
- s->head[h & s->hash_mask] = str;
- s->prev[str & s->w_mask] = ret;
- return ret;
-}
-
#endif
diff --git a/chromium/third_party/zlib/crc32_simd.h b/chromium/third_party/zlib/crc32_simd.h
index 08f175617c5..68bc235cbe1 100644
--- a/chromium/third_party/zlib/crc32_simd.h
+++ b/chromium/third_party/zlib/crc32_simd.h
@@ -34,8 +34,3 @@ uint32_t ZLIB_INTERNAL armv8_crc32_little(unsigned long crc,
const unsigned char* buf,
z_size_t len);
-/*
- * Insert hash string.
- */
-Pos ZLIB_INTERNAL insert_string_arm(deflate_state *const s, const Pos str);
-
diff --git a/chromium/third_party/zlib/deflate.c b/chromium/third_party/zlib/deflate.c
index b21175bce43..744d8558e2e 100644
--- a/chromium/third_party/zlib/deflate.c
+++ b/chromium/third_party/zlib/deflate.c
@@ -50,20 +50,13 @@
/* @(#) $Id$ */
#include <assert.h>
#include "deflate.h"
-#include "x86.h"
-
-#if defined(CRC32_SIMD_SSE42_PCLMUL)
-#include <smmintrin.h>
-#endif
+#include "cpu_features.h"
+#include "contrib/optimizations/insert_string.h"
#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
#include "contrib/optimizations/slide_hash_neon.h"
#endif
-/* We need crypto extension crc32 to implement optimized hash in
- * insert_string.
- */
#if defined(CRC32_ARMV8_CRC32)
-#include "arm_features.h"
#include "crc32_simd.h"
#endif
@@ -121,38 +114,6 @@ extern void ZLIB_INTERNAL crc_reset(deflate_state *const s);
extern void ZLIB_INTERNAL crc_finalize(deflate_state *const s);
extern void ZLIB_INTERNAL copy_with_crc(z_streamp strm, Bytef *dst, long size);
-#ifdef _MSC_VER
-#define INLINE __inline
-#else
-#define INLINE inline
-#endif
-
-/* Intel optimized insert_string. */
-#if defined(CRC32_SIMD_SSE42_PCLMUL)
-
-#if defined(__GNUC__) || defined(__clang__)
-__attribute__((target("sse4.2")))
-#endif
-local INLINE Pos insert_string_sse(deflate_state *const s, const Pos str)
-{
- Pos ret;
- unsigned *ip, val, h = 0;
-
- ip = (unsigned *)&s->window[str];
- val = *ip;
-
- if (s->level >= 6)
- val &= 0xFFFFFF;
-
- h = _mm_crc32_u32(h, val);
-
- ret = s->head[h & s->hash_mask];
- s->head[h & s->hash_mask] = str;
- s->prev[str & s->w_mask] = ret;
- return ret;
-}
-#endif
-
/* ===========================================================================
* Local data
*/
@@ -208,62 +169,6 @@ local const config configuration_table[10] = {
#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0))
/* ===========================================================================
- * Update a hash value with the given input byte
- * IN assertion: all calls to UPDATE_HASH are made with consecutive input
- * characters, so that a running hash key can be computed from the previous
- * key instead of complete recalculation each time.
- */
-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
-
-/* ===========================================================================
- * Insert string str in the dictionary and set match_head to the previous head
- * of the hash chain (the most recent string with same hash key). Return
- * the previous length of the hash chain.
- * If this file is compiled with -DFASTEST, the compression level is forced
- * to 1, and no hash chains are maintained.
- * IN assertion: all calls to INSERT_STRING are made with consecutive input
- * characters and the first MIN_MATCH bytes of str are valid (except for
- * the last MIN_MATCH-1 bytes of the input file).
- */
-local INLINE Pos insert_string_c(deflate_state *const s, const Pos str)
-{
- Pos ret;
-
- UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]);
-#ifdef FASTEST
- ret = s->head[s->ins_h];
-#else
- ret = s->prev[str & s->w_mask] = s->head[s->ins_h];
-#endif
- s->head[s->ins_h] = str;
-
- return ret;
-}
-
-local INLINE Pos insert_string(deflate_state *const s, const Pos str)
-{
-/* String dictionary insertion: faster symbol hashing has a positive impact
- * on data compression speeds (around 20% on Intel and 36% on ARM Cortex big
- * cores).
- * A misfeature is that the generated compressed output will differ from
- * vanilla zlib (even though it is still valid 'DEFLATE-d' content).
- *
- * We offer here a way to disable the optimization if there is the expectation
- * that compressed content should match when compared to vanilla zlib.
- */
-#if !defined(CHROMIUM_ZLIB_NO_CASTAGNOLI)
-#if defined(CRC32_ARMV8_CRC32)
- if (arm_cpu_enable_crc32)
- return insert_string_arm(s, str);
-#elif defined(CRC32_SIMD_SSE42_PCLMUL)
- if (x86_cpu_enable_simd)
- return insert_string_sse(s, str);
-#endif
-#endif
- return insert_string_c(s, str);
-}
-
-/* ===========================================================================
* Initialize the hash table (avoiding 64K overflow for 16 bit systems).
* prev[] will be initialized on the fly.
*/
@@ -339,10 +244,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
// for all wrapper formats (e.g. RAW, ZLIB, GZIP).
// Feature detection is not triggered while using RAW mode (i.e. we never
// call crc32() with a NULL buffer).
-#if defined(CRC32_ARMV8_CRC32)
- arm_check_features();
-#elif defined(CRC32_SIMD_SSE42_PCLMUL)
- x86_check_features();
+#if defined(CRC32_ARMV8_CRC32) || defined(CRC32_SIMD_SSE42_PCLMUL)
+ cpu_check_features();
#endif
if (version == Z_NULL || version[0] != my_version[0] ||
@@ -415,6 +318,10 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->w_size + window_padding,
2*sizeof(Byte));
s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
+ /* Avoid use of uninitialized value, see:
+ * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
+ */
+ zmemzero(s->prev, s->w_size * sizeof(Pos));
s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
s->high_water = 0; /* nothing written to s->window yet */
@@ -1614,11 +1521,12 @@ local void fill_window_c(deflate_state *s);
local void fill_window(deflate_state *s)
{
+#ifdef ADLER32_SIMD_SSSE3
if (x86_cpu_enable_simd) {
fill_window_sse(s);
return;
}
-
+#endif
fill_window_c(s);
}
diff --git a/chromium/third_party/zlib/google/BUILD.gn b/chromium/third_party/zlib/google/BUILD.gn
index 4024836205f..a628d2f2d0d 100644
--- a/chromium/third_party/zlib/google/BUILD.gn
+++ b/chromium/third_party/zlib/google/BUILD.gn
@@ -42,7 +42,5 @@ static_library("compression_utils_portable") {
"compression_utils_portable.cc",
"compression_utils_portable.h",
]
- deps = [
- "//third_party/zlib",
- ]
+ deps = [ "//third_party/zlib" ]
}
diff --git a/chromium/third_party/zlib/patches/0003-uninitializedjump.patch b/chromium/third_party/zlib/patches/0003-uninitializedjump.patch
new file mode 100644
index 00000000000..7aae3238a50
--- /dev/null
+++ b/chromium/third_party/zlib/patches/0003-uninitializedjump.patch
@@ -0,0 +1,15 @@
+diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
+index a39e62787862..c6053fd1c7ea 100644
+--- a/third_party/zlib/deflate.c
++++ b/third_party/zlib/deflate.c
+@@ -318,6 +318,10 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+ s->w_size + window_padding,
+ 2*sizeof(Byte));
+ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
++ /* Avoid use of uninitialized value, see:
++ * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
++ */
++ zmemzero(s->prev, s->w_size * sizeof(Pos));
+ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+ s->high_water = 0; /* nothing written to s->window yet */
diff --git a/chromium/third_party/zlib/patches/0004-fix-uwp.patch b/chromium/third_party/zlib/patches/0004-fix-uwp.patch
new file mode 100644
index 00000000000..23145a7ae53
--- /dev/null
+++ b/chromium/third_party/zlib/patches/0004-fix-uwp.patch
@@ -0,0 +1,22 @@
+diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c
+index 246ceb91a139..c6bc314b3c28 100644
+--- a/third_party/zlib/contrib/minizip/iowin32.c
++++ b/third_party/zlib/contrib/minizip/iowin32.c
+@@ -31,14 +31,12 @@
+ #define _WIN32_WINNT 0x601
+ #endif
+
+-#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
+-// see Include/shared/winapifamily.h in the Windows Kit
+-#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
+-#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
++#if !defined(IOWIN32_USING_WINRT_API)
++#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
++// Windows Store or Universal Windows Platform
+ #define IOWIN32_USING_WINRT_API 1
+ #endif
+ #endif
+-#endif
+
+ voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode));
+ uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/chromium/third_party/zlib/simd_stub.c b/chromium/third_party/zlib/simd_stub.c
deleted file mode 100644
index c6d46051498..00000000000
--- a/chromium/third_party/zlib/simd_stub.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* simd_stub.c -- stub implementations
-* Copyright (C) 2014 Intel Corporation
-* For conditions of distribution and use, see copyright notice in zlib.h
-*/
-#include <assert.h>
-
-#include "deflate.h"
-#include "x86.h"
-
-int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
-
-void ZLIB_INTERNAL crc_fold_init(deflate_state *const s) {
- assert(0);
-}
-
-void ZLIB_INTERNAL crc_fold_copy(deflate_state *const s,
- unsigned char *dst,
- const unsigned char *src,
- long len) {
- assert(0);
-}
-
-unsigned ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) {
- assert(0);
- return 0;
-}
-
-void ZLIB_INTERNAL fill_window_sse(deflate_state *s)
-{
- assert(0);
-}
-
-void x86_check_features(void)
-{
-}
diff --git a/chromium/third_party/zlib/x86.c b/chromium/third_party/zlib/x86.c
deleted file mode 100644
index 7488ad08b97..00000000000
--- a/chromium/third_party/zlib/x86.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * x86 feature check
- *
- * Copyright (C) 2013 Intel Corporation. All rights reserved.
- * Author:
- * Jim Kukunas
- *
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "x86.h"
-#include "zutil.h"
-
-int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0;
-int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
-
-#ifndef _MSC_VER
-#include <pthread.h>
-
-pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
-static void _x86_check_features(void);
-
-void x86_check_features(void)
-{
- pthread_once(&cpu_check_inited_once, _x86_check_features);
-}
-
-static void _x86_check_features(void)
-{
- int x86_cpu_has_sse2;
- int x86_cpu_has_ssse3;
- int x86_cpu_has_sse42;
- int x86_cpu_has_pclmulqdq;
- unsigned eax, ebx, ecx, edx;
-
- eax = 1;
-#ifdef __i386__
- __asm__ __volatile__ (
- "xchg %%ebx, %1\n\t"
- "cpuid\n\t"
- "xchg %1, %%ebx\n\t"
- : "+a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx)
- );
-#else
- __asm__ __volatile__ (
- "cpuid\n\t"
- : "+a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
- );
-#endif /* (__i386__) */
-
- x86_cpu_has_sse2 = edx & 0x4000000;
- x86_cpu_has_ssse3 = ecx & 0x000200;
- x86_cpu_has_sse42 = ecx & 0x100000;
- x86_cpu_has_pclmulqdq = ecx & 0x2;
-
- x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
-
- x86_cpu_enable_simd = x86_cpu_has_sse2 &&
- x86_cpu_has_sse42 &&
- x86_cpu_has_pclmulqdq;
-}
-#else
-#include <intrin.h>
-#include <windows.h>
-
-static BOOL CALLBACK _x86_check_features(PINIT_ONCE once,
- PVOID param,
- PVOID *context);
-static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
-
-void x86_check_features(void)
-{
- InitOnceExecuteOnce(&cpu_check_inited_once, _x86_check_features,
- NULL, NULL);
-}
-
-static BOOL CALLBACK _x86_check_features(PINIT_ONCE once,
- PVOID param,
- PVOID *context)
-{
- int x86_cpu_has_sse2;
- int x86_cpu_has_ssse3;
- int x86_cpu_has_sse42;
- int x86_cpu_has_pclmulqdq;
- int regs[4];
-
- __cpuid(regs, 1);
-
- x86_cpu_has_sse2 = regs[3] & 0x4000000;
- x86_cpu_has_ssse3 = regs[2] & 0x000200;
- x86_cpu_has_sse42 = regs[2] & 0x100000;
- x86_cpu_has_pclmulqdq = regs[2] & 0x2;
-
- x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
-
- x86_cpu_enable_simd = x86_cpu_has_sse2 &&
- x86_cpu_has_sse42 &&
- x86_cpu_has_pclmulqdq;
- return TRUE;
-}
-#endif /* _MSC_VER */
diff --git a/chromium/third_party/zlib/x86.h b/chromium/third_party/zlib/x86.h
deleted file mode 100644
index 7205d50265c..00000000000
--- a/chromium/third_party/zlib/x86.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* x86.h -- check for x86 CPU features
-* Copyright (C) 2013 Intel Corporation Jim Kukunas
-* For conditions of distribution and use, see copyright notice in zlib.h
-*/
-
-#ifndef X86_H
-#define X86_H
-
-#include "zlib.h"
-
-extern int x86_cpu_enable_ssse3;
-extern int x86_cpu_enable_simd;
-
-void x86_check_features(void);
-
-#endif /* X86_H */