[linux-kernel] Fix duplicate symbols when built-in to kernel
diff --git a/contrib/linux-kernel/lib/zstd/Makefile b/contrib/linux-kernel/lib/zstd/Makefile
index aa5eb4d..dd0a359 100644
--- a/contrib/linux-kernel/lib/zstd/Makefile
+++ b/contrib/linux-kernel/lib/zstd/Makefile
@@ -3,7 +3,16 @@
 
 ccflags-y += -O3
 
-zstd_compress-y := entropy_common.o fse_decompress.o zstd_common.o \
-				fse_compress.o huf_compress.o compress.o
-zstd_decompress-y := entropy_common.o fse_decompress.o zstd_common.o \
-				huf_decompress.o decompress.o
+# Object files unique to zstd_compress and zstd_decompress
+zstd_compress-y := fse_compress.o huf_compress.o compress.o
+zstd_decompress-y := huf_decompress.o decompress.o
+
+# These object files are shared between the modules.
+# Always add them to zstd_compress.
+# Unless both zstd_compress and zstd_decompress are built in
+# then also add them to zstd_decompress.
+zstd_compress-y += entropy_common.o fse_decompress.o zstd_common.o
+
+ifneq ($(CONFIG_ZSTD_COMPRESS)$(CONFIG_ZSTD_DECOMPRESS),yy)
+	zstd_decompress-y += entropy_common.o fse_decompress.o zstd_common.o
+endif
diff --git a/contrib/linux-kernel/zstd.diff b/contrib/linux-kernel/zstd.diff
index 579e4b1..285961a 100644
--- a/contrib/linux-kernel/zstd.diff
+++ b/contrib/linux-kernel/zstd.diff
@@ -1195,22 +1195,31 @@
  
 diff --git a/lib/zstd/Makefile b/lib/zstd/Makefile
 new file mode 100644
-index 0000000..aa5eb4d
+index 0000000..dd0a359
 --- /dev/null
 +++ b/lib/zstd/Makefile
-@@ -0,0 +1,9 @@
+@@ -0,0 +1,18 @@
 +obj-$(CONFIG_ZSTD_COMPRESS) += zstd_compress.o
 +obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd_decompress.o
 +
 +ccflags-y += -O3
 +
-+zstd_compress-y := entropy_common.o fse_decompress.o zstd_common.o \
-+				fse_compress.o huf_compress.o compress.o
-+zstd_decompress-y := entropy_common.o fse_decompress.o zstd_common.o \
-+				huf_decompress.o decompress.o
++# Object files unique to zstd_compress and zstd_decompress
++zstd_compress-y := fse_compress.o huf_compress.o compress.o
++zstd_decompress-y := huf_decompress.o decompress.o
++
++# These object files are shared between the modules.
++# Always add them to zstd_compress.
++# Unless both zstd_compress and zstd_decompress are built in
++# then also add them to zstd_decompress.
++zstd_compress-y += entropy_common.o fse_decompress.o zstd_common.o
++
++ifneq ($(CONFIG_ZSTD_COMPRESS)$(CONFIG_ZSTD_DECOMPRESS),yy)
++	zstd_decompress-y += entropy_common.o fse_decompress.o zstd_common.o
++endif
 diff --git a/lib/zstd/bitstream.h b/lib/zstd/bitstream.h
 new file mode 100644
-index 0000000..0fa6db1
+index 0000000..a826b99
 --- /dev/null
 +++ b/lib/zstd/bitstream.h
 @@ -0,0 +1,374 @@
@@ -1329,7 +1338,7 @@
 +	BIT_DStream_completed = 2,
 +	BIT_DStream_overflow = 3
 +} BIT_DStream_status; /* result of BIT_reloadDStream() */
-+		      /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
++/* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
 +
 +ZSTD_STATIC size_t BIT_initDStream(BIT_DStream_t *bitD, const void *srcBuffer, size_t srcSize);
 +ZSTD_STATIC size_t BIT_readBits(BIT_DStream_t *bitD, unsigned nbBits);
@@ -1590,10 +1599,10 @@
 +#endif /* BITSTREAM_H_MODULE */
 diff --git a/lib/zstd/compress.c b/lib/zstd/compress.c
 new file mode 100644
-index 0000000..6c07a04
+index 0000000..42236a3
 --- /dev/null
 +++ b/lib/zstd/compress.c
-@@ -0,0 +1,3461 @@
+@@ -0,0 +1,3463 @@
 +/**
 + * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
 + * All rights reserved.
@@ -2412,14 +2421,15 @@
 +	}
 +
 +/* check compressibility */
-+_check_compressibility : {
-+	size_t const minGain = ZSTD_minGain(srcSize);
-+	size_t const maxCSize = srcSize - minGain;
-+	if ((size_t)(op - ostart) >= maxCSize) {
-+		zc->flagStaticHufTable = HUF_repeat_none;
-+		return 0;
++_check_compressibility:
++	{
++		size_t const minGain = ZSTD_minGain(srcSize);
++		size_t const maxCSize = srcSize - minGain;
++		if ((size_t)(op - ostart) >= maxCSize) {
++			zc->flagStaticHufTable = HUF_repeat_none;
++			return 0;
++		}
 +	}
-+}
 +
 +	/* confirm repcodes */
 +	{
@@ -3392,10 +3402,11 @@
 +	return hashTable[ZSTD_hashPtr(ip, hashLog, mls)];
 +}
 +
-+FORCE_INLINE /* inlining is important to hardwire a hot branch (template emulation) */
-+    size_t
-+    ZSTD_HcFindBestMatch_generic(ZSTD_CCtx *zc, /* Index table will be updated */
-+				 const BYTE *const ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts, const U32 mls, const U32 extDict)
++/* inlining is important to hardwire a hot branch (template emulation) */
++FORCE_INLINE
++size_t ZSTD_HcFindBestMatch_generic(ZSTD_CCtx *zc, /* Index table will be updated */
++				    const BYTE *const ip, const BYTE *const iLimit, size_t *offsetPtr, const U32 maxNbAttempts, const U32 mls,
++				    const U32 extDict)
 +{
 +	U32 *const chainTable = zc->chainTable;
 +	const U32 chainSize = (1 << zc->params.cParams.chainLog);
@@ -3585,11 +3596,12 @@
 +		}
 +
 +	/* store sequence */
-+	_storeSequence : {
-+		size_t const litLength = start - anchor;
-+		ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH);
-+		anchor = ip = start + matchLength;
-+	}
++_storeSequence:
++		{
++			size_t const litLength = start - anchor;
++			ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH);
++			anchor = ip = start + matchLength;
++		}
 +
 +		/* check immediate repcode */
 +		while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) {
@@ -4007,9 +4019,8 @@
 +	U32 const windowSize = 1U << params.cParams.windowLog;
 +	U32 const singleSegment = params.fParams.contentSizeFlag && (windowSize >= pledgedSrcSize);
 +	BYTE const windowLogByte = (BYTE)((params.cParams.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN) << 3);
-+	U32 const fcsCode = params.fParams.contentSizeFlag ? (pledgedSrcSize >= 256) + (pledgedSrcSize >= 65536 + 256) + (pledgedSrcSize >= 0xFFFFFFFFU)
-+							   : /* 0-3 */
-+				0;
++	U32 const fcsCode =
++	    params.fParams.contentSizeFlag ? (pledgedSrcSize >= 256) + (pledgedSrcSize >= 65536 + 256) + (pledgedSrcSize >= 0xFFFFFFFFU) : 0; /* 0-3 */
 +	BYTE const frameHeaderDecriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag << 2) + (singleSegment << 5) + (fcsCode << 6));
 +	size_t pos;
 +
@@ -5057,7 +5068,7 @@
 +MODULE_DESCRIPTION("Zstd Compressor");
 diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c
 new file mode 100644
-index 0000000..2926b36
+index 0000000..def10ea
 --- /dev/null
 +++ b/lib/zstd/decompress.c
 @@ -0,0 +1,2508 @@
@@ -7363,7 +7374,6 @@
 +				ip += toLoad;
 +				break;
 +			}
-+		}
 +
 +			/* check for single-pass mode opportunity */
 +			if (zds->fParams.frameContentSize && zds->fParams.windowSize /* skippable frame if == 0 */
@@ -7418,6 +7428,7 @@
 +				}
 +			}
 +			zds->stage = zdss_read;
++		}
 +		/* pass-through */
 +
 +		case zdss_read: {
@@ -7880,10 +7891,10 @@
 +#endif /* ERROR_H_MODULE */
 diff --git a/lib/zstd/fse.h b/lib/zstd/fse.h
 new file mode 100644
-index 0000000..9749755
+index 0000000..bc2962a
 --- /dev/null
 +++ b/lib/zstd/fse.h
-@@ -0,0 +1,588 @@
+@@ -0,0 +1,584 @@
 +/*
 + * FSE : Finite State Entropy codec
 + * Public Prototypes declaration
@@ -8422,8 +8433,6 @@
 +
 +ZSTD_STATIC unsigned FSE_endOfDState(const FSE_DState_t *DStatePtr) { return DStatePtr->state == 0; }
 +
-+#ifndef FSE_COMMONDEFS_ONLY
-+
 +/* **************************************************************
 +*  Tuning parameters
 +****************************************************************/
@@ -8453,8 +8462,6 @@
 +#define FSE_FUNCTION_EXTENSION
 +#define FSE_DECODE_TYPE FSE_decode_t
 +
-+#endif /* !FSE_COMMONDEFS_ONLY */
-+
 +/* ***************************************************************
 +*  Constants
 +*****************************************************************/
@@ -8474,10 +8481,10 @@
 +#endif /* FSE_H */
 diff --git a/lib/zstd/fse_compress.c b/lib/zstd/fse_compress.c
 new file mode 100644
-index 0000000..6bb810f
+index 0000000..e016bb1
 --- /dev/null
 +++ b/lib/zstd/fse_compress.c
-@@ -0,0 +1,861 @@
+@@ -0,0 +1,857 @@
 +/*
 + * FSE : Finite State Entropy encoder
 + * Copyright (C) 2013-2015, Yann Collet.
@@ -8660,8 +8667,6 @@
 +	return 0;
 +}
 +
-+#ifndef FSE_COMMONDEFS_ONLY
-+
 +/*-**************************************************************
 +*  FSE NCount encoding-decoding
 +****************************************************************/
@@ -9337,14 +9342,12 @@
 +
 +	return op - ostart;
 +}
-+
-+#endif /* FSE_COMMONDEFS_ONLY */
 diff --git a/lib/zstd/fse_decompress.c b/lib/zstd/fse_decompress.c
 new file mode 100644
-index 0000000..245570a
+index 0000000..96cf89f
 --- /dev/null
 +++ b/lib/zstd/fse_decompress.c
-@@ -0,0 +1,317 @@
+@@ -0,0 +1,313 @@
 +/*
 + * FSE : Finite State Entropy decoder
 + * Copyright (C) 2013-2015, Yann Collet.
@@ -9508,8 +9511,6 @@
 +	return 0;
 +}
 +
-+#ifndef FSE_COMMONDEFS_ONLY
-+
 +/*-*******************************************************
 +*  Decompression (Byte symbols)
 +*********************************************************/
@@ -9660,8 +9661,6 @@
 +
 +	return FSE_decompress_usingDTable(dst, dstCapacity, ip, cSrcSize, workSpace); /* always return, even if it is an error code */
 +}
-+
-+#endif /* FSE_COMMONDEFS_ONLY */
 diff --git a/lib/zstd/huf.h b/lib/zstd/huf.h
 new file mode 100644
 index 0000000..56abe2f
@@ -9873,10 +9872,10 @@
 +#endif /* HUF_H_298734234 */
 diff --git a/lib/zstd/huf_compress.c b/lib/zstd/huf_compress.c
 new file mode 100644
-index 0000000..1587401
+index 0000000..e82a136
 --- /dev/null
 +++ b/lib/zstd/huf_compress.c
-@@ -0,0 +1,732 @@
+@@ -0,0 +1,731 @@
 +/*
 + * Huffman encoder, part of New Generation Entropy library
 + * Copyright (C) 2013-2016, Yann Collet.
@@ -10184,9 +10183,8 @@
 +					}
 +				}
 +				/* only triggered when no more rank 1 symbol left => find closest one (note : there is necessarily at least one !) */
-+				while (
-+				    (nBitsToDecrease <= HUF_TABLELOG_MAX) &&
-+				    (rankLast[nBitsToDecrease] == noSymbol)) /* HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary */
++				/* HUF_MAX_TABLELOG test just to please gcc 5+; but it should not be necessary */
++				while ((nBitsToDecrease <= HUF_TABLELOG_MAX) && (rankLast[nBitsToDecrease] == noSymbol))
 +					nBitsToDecrease++;
 +				totalCost -= 1 << (nBitsToDecrease - 1);
 +				if (rankLast[nBitsToDecrease - 1] == noSymbol)
@@ -10611,10 +10609,10 @@
 +}
 diff --git a/lib/zstd/huf_decompress.c b/lib/zstd/huf_decompress.c
 new file mode 100644
-index 0000000..5c38aa3
+index 0000000..950c194
 --- /dev/null
 +++ b/lib/zstd/huf_decompress.c
-@@ -0,0 +1,921 @@
+@@ -0,0 +1,920 @@
 +/*
 + * Huffman decoder, part of New Generation Entropy library
 + * Copyright (C) 2013-2016, Yann Collet.
@@ -11190,9 +11188,8 @@
 +		if (DStream->bitsConsumed < (sizeof(DStream->bitContainer) * 8)) {
 +			BIT_skipBits(DStream, dt[val].nbBits);
 +			if (DStream->bitsConsumed > (sizeof(DStream->bitContainer) * 8))
-+				DStream->bitsConsumed =
-+				    (sizeof(DStream->bitContainer) *
-+				     8); /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
++				/* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
++				DStream->bitsConsumed = (sizeof(DStream->bitContainer) * 8);
 +		}
 +	}
 +	return 1;
@@ -12051,7 +12048,7 @@
 +#endif /* ZSTD_CCOMMON_H_MODULE */
 diff --git a/lib/zstd/zstd_opt.h b/lib/zstd/zstd_opt.h
 new file mode 100644
-index 0000000..468c143
+index 0000000..55e1b4c
 --- /dev/null
 +++ b/lib/zstd/zstd_opt.h
 @@ -0,0 +1,1014 @@
@@ -12685,7 +12682,7 @@
 +		cur = last_pos - best_mlen;
 +
 +	/* store sequence */
-+	_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
++_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
 +		opt[0].mlen = 1;
 +
 +		while (1) {
@@ -12999,7 +12996,7 @@
 +		cur = last_pos - best_mlen;
 +
 +	/* store sequence */
-+	_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
++_storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */
 +		opt[0].mlen = 1;
 +
 +		while (1) {