mirror of
https://github.com/facebook/zstd.git
synced 2025-08-01 09:47:01 +03:00
Reorganize zstd_deps.h and mem.h + replace mem.h for the kernel
This commit is contained in:
@ -21,6 +21,7 @@ from typing import Optional
|
|||||||
INCLUDED_SUBDIRS = ["common", "compress", "decompress"]
|
INCLUDED_SUBDIRS = ["common", "compress", "decompress"]
|
||||||
|
|
||||||
SKIPPED_FILES = [
|
SKIPPED_FILES = [
|
||||||
|
"common/mem.h",
|
||||||
"common/zstd_deps.h",
|
"common/zstd_deps.h",
|
||||||
"common/pool.c",
|
"common/pool.c",
|
||||||
"common/pool.h",
|
"common/pool.h",
|
||||||
@ -386,13 +387,14 @@ class PartialPreprocessor(object):
|
|||||||
|
|
||||||
class Freestanding(object):
|
class Freestanding(object):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,zstd_deps: str, source_lib: str, output_lib: str,
|
self, zstd_deps: str, mem: str, source_lib: str, output_lib: str,
|
||||||
external_xxhash: bool, xxh64_state: Optional[str],
|
external_xxhash: bool, xxh64_state: Optional[str],
|
||||||
xxh64_prefix: Optional[str], rewritten_includes: [(str, str)],
|
xxh64_prefix: Optional[str], rewritten_includes: [(str, str)],
|
||||||
defs: [(str, Optional[str])], replaces: [(str, str)],
|
defs: [(str, Optional[str])], replaces: [(str, str)],
|
||||||
undefs: [str], excludes: [str]
|
undefs: [str], excludes: [str]
|
||||||
):
|
):
|
||||||
self._zstd_deps = zstd_deps
|
self._zstd_deps = zstd_deps
|
||||||
|
self._mem = mem
|
||||||
self._src_lib = source_lib
|
self._src_lib = source_lib
|
||||||
self._dst_lib = output_lib
|
self._dst_lib = output_lib
|
||||||
self._external_xxhash = external_xxhash
|
self._external_xxhash = external_xxhash
|
||||||
@ -453,6 +455,11 @@ class Freestanding(object):
|
|||||||
self._log(f"Copying zstd_deps: {self._zstd_deps} -> {dst_zstd_deps}")
|
self._log(f"Copying zstd_deps: {self._zstd_deps} -> {dst_zstd_deps}")
|
||||||
shutil.copyfile(self._zstd_deps, dst_zstd_deps)
|
shutil.copyfile(self._zstd_deps, dst_zstd_deps)
|
||||||
|
|
||||||
|
def _copy_mem(self):
|
||||||
|
dst_mem = os.path.join(self._dst_lib, "common", "mem.h")
|
||||||
|
self._log(f"Copying mem: {self._mem} -> {dst_mem}")
|
||||||
|
shutil.copyfile(self._mem, dst_mem)
|
||||||
|
|
||||||
def _hardwire_preprocessor(self, name: str, value: Optional[str] = None, undef=False):
|
def _hardwire_preprocessor(self, name: str, value: Optional[str] = None, undef=False):
|
||||||
"""
|
"""
|
||||||
If value=None then hardwire that it is defined, but not what the value is.
|
If value=None then hardwire that it is defined, but not what the value is.
|
||||||
@ -553,6 +560,7 @@ class Freestanding(object):
|
|||||||
def go(self):
|
def go(self):
|
||||||
self._copy_source_lib()
|
self._copy_source_lib()
|
||||||
self._copy_zstd_deps()
|
self._copy_zstd_deps()
|
||||||
|
self._copy_mem()
|
||||||
self._hardwire_defines()
|
self._hardwire_defines()
|
||||||
self._remove_excludes()
|
self._remove_excludes()
|
||||||
self._rewrite_includes()
|
self._rewrite_includes()
|
||||||
@ -587,6 +595,7 @@ def parse_pair(rewritten_includes: [str]) -> [(str, str)]:
|
|||||||
def main(name, args):
|
def main(name, args):
|
||||||
parser = argparse.ArgumentParser(prog=name)
|
parser = argparse.ArgumentParser(prog=name)
|
||||||
parser.add_argument("--zstd-deps", default="zstd_deps.h", help="Zstd dependencies file")
|
parser.add_argument("--zstd-deps", default="zstd_deps.h", help="Zstd dependencies file")
|
||||||
|
parser.add_argument("--mem", default="mem.h", help="Memory module")
|
||||||
parser.add_argument("--source-lib", default="../../lib", help="Location of the zstd library")
|
parser.add_argument("--source-lib", default="../../lib", help="Location of the zstd library")
|
||||||
parser.add_argument("--output-lib", default="./freestanding_lib", help="Where to output the freestanding zstd library")
|
parser.add_argument("--output-lib", default="./freestanding_lib", help="Where to output the freestanding zstd library")
|
||||||
parser.add_argument("--xxhash", default=None, help="Alternate external xxhash include e.g. --xxhash='<xxhash.h>'. If set xxhash is not included.")
|
parser.add_argument("--xxhash", default=None, help="Alternate external xxhash include e.g. --xxhash='<xxhash.h>'. If set xxhash is not included.")
|
||||||
@ -630,6 +639,7 @@ def main(name, args):
|
|||||||
|
|
||||||
Freestanding(
|
Freestanding(
|
||||||
args.zstd_deps,
|
args.zstd_deps,
|
||||||
|
args.mem,
|
||||||
args.source_lib,
|
args.source_lib,
|
||||||
args.output_lib,
|
args.output_lib,
|
||||||
external_xxhash,
|
external_xxhash,
|
||||||
|
258
contrib/linux-kernel/mem.h
Normal file
258
contrib/linux-kernel/mem.h
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under both the BSD-style license (found in the
|
||||||
|
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||||
|
* in the COPYING file in the root directory of this source tree).
|
||||||
|
* You may select, at your option, one of the above-listed licenses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MEM_H_MODULE
|
||||||
|
#define MEM_H_MODULE
|
||||||
|
|
||||||
|
/*-****************************************
|
||||||
|
* Dependencies
|
||||||
|
******************************************/
|
||||||
|
#include <asm/unaligned.h> /* get_unaligned, put_unaligned* */
|
||||||
|
#include <linux/compiler.h> /* inline */
|
||||||
|
#include <linux/swab.h> /* swab32, swab64 */
|
||||||
|
#include <linux/types.h> /* size_t, ptrdiff_t */
|
||||||
|
#include "debug.h" /* DEBUG_STATIC_ASSERT */
|
||||||
|
|
||||||
|
/*-****************************************
|
||||||
|
* Compiler specifics
|
||||||
|
******************************************/
|
||||||
|
#define MEM_STATIC static inline
|
||||||
|
|
||||||
|
/*-**************************************************************
|
||||||
|
* Basic Types
|
||||||
|
*****************************************************************/
|
||||||
|
typedef uint8_t BYTE;
|
||||||
|
typedef uint16_t U16;
|
||||||
|
typedef int16_t S16;
|
||||||
|
typedef uint32_t U32;
|
||||||
|
typedef int32_t S32;
|
||||||
|
typedef uint64_t U64;
|
||||||
|
typedef int64_t S64;
|
||||||
|
|
||||||
|
/*-**************************************************************
|
||||||
|
* Memory I/O API
|
||||||
|
*****************************************************************/
|
||||||
|
/*=== Static platform detection ===*/
|
||||||
|
MEM_STATIC unsigned MEM_32bits(void);
|
||||||
|
MEM_STATIC unsigned MEM_64bits(void);
|
||||||
|
MEM_STATIC unsigned MEM_isLittleEndian(void);
|
||||||
|
|
||||||
|
/*=== Native unaligned read/write ===*/
|
||||||
|
MEM_STATIC U16 MEM_read16(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_read32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_read64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value);
|
||||||
|
MEM_STATIC void MEM_write32(void* memPtr, U32 value);
|
||||||
|
MEM_STATIC void MEM_write64(void* memPtr, U64 value);
|
||||||
|
|
||||||
|
/*=== Little endian unaligned read/write ===*/
|
||||||
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_readLE24(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val);
|
||||||
|
MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val);
|
||||||
|
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32);
|
||||||
|
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64);
|
||||||
|
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val);
|
||||||
|
|
||||||
|
/*=== Big endian unaligned read/write ===*/
|
||||||
|
MEM_STATIC U32 MEM_readBE32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_readBE64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readBEST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32);
|
||||||
|
MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64);
|
||||||
|
MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val);
|
||||||
|
|
||||||
|
/*=== Byteswap ===*/
|
||||||
|
MEM_STATIC U32 MEM_swap32(U32 in);
|
||||||
|
MEM_STATIC U64 MEM_swap64(U64 in);
|
||||||
|
MEM_STATIC size_t MEM_swapST(size_t in);
|
||||||
|
|
||||||
|
/*-**************************************************************
|
||||||
|
* Memory I/O Implementation
|
||||||
|
*****************************************************************/
|
||||||
|
MEM_STATIC unsigned MEM_32bits(void)
|
||||||
|
{
|
||||||
|
return sizeof(size_t) == 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC unsigned MEM_64bits(void)
|
||||||
|
{
|
||||||
|
return sizeof(size_t) == 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__LITTLE_ENDIAN)
|
||||||
|
#define MEM_LITTLE_ENDIAN 1
|
||||||
|
#else
|
||||||
|
#define MEM_LITTLE_ENDIAN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MEM_STATIC unsigned MEM_isLittleEndian(void)
|
||||||
|
{
|
||||||
|
return MEM_LITTLE_ENDIAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U16 MEM_read16(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned((const U16 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U32 MEM_read32(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned((const U32 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U64 MEM_read64(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned((const U64 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC size_t MEM_readST(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned((const size_t *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_write16(void *memPtr, U16 value)
|
||||||
|
{
|
||||||
|
put_unaligned(value, (U16 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_write32(void *memPtr, U32 value)
|
||||||
|
{
|
||||||
|
put_unaligned(value, (U32 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_write64(void *memPtr, U64 value)
|
||||||
|
{
|
||||||
|
put_unaligned(value, (U64 *)memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=== Little endian r/w ===*/
|
||||||
|
|
||||||
|
MEM_STATIC U16 MEM_readLE16(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned_le16(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE16(void *memPtr, U16 val)
|
||||||
|
{
|
||||||
|
put_unaligned_le16(val, memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U32 MEM_readLE24(const void *memPtr)
|
||||||
|
{
|
||||||
|
return MEM_readLE16(memPtr) + (((const BYTE *)memPtr)[2] << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE24(void *memPtr, U32 val)
|
||||||
|
{
|
||||||
|
MEM_writeLE16(memPtr, (U16)val);
|
||||||
|
((BYTE *)memPtr)[2] = (BYTE)(val >> 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U32 MEM_readLE32(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned_le32(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE32(void *memPtr, U32 val32)
|
||||||
|
{
|
||||||
|
put_unaligned_le32(val32, memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U64 MEM_readLE64(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned_le64(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE64(void *memPtr, U64 val64)
|
||||||
|
{
|
||||||
|
put_unaligned_le64(val64, memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC size_t MEM_readLEST(const void *memPtr)
|
||||||
|
{
|
||||||
|
if (MEM_32bits())
|
||||||
|
return (size_t)MEM_readLE32(memPtr);
|
||||||
|
else
|
||||||
|
return (size_t)MEM_readLE64(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLEST(void *memPtr, size_t val)
|
||||||
|
{
|
||||||
|
if (MEM_32bits())
|
||||||
|
MEM_writeLE32(memPtr, (U32)val);
|
||||||
|
else
|
||||||
|
MEM_writeLE64(memPtr, (U64)val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=== Big endian r/w ===*/
|
||||||
|
|
||||||
|
MEM_STATIC U32 MEM_readBE32(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned_be32(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeBE32(void *memPtr, U32 val32)
|
||||||
|
{
|
||||||
|
put_unaligned_be32(val32, memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U64 MEM_readBE64(const void *memPtr)
|
||||||
|
{
|
||||||
|
return get_unaligned_be64(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeBE64(void *memPtr, U64 val64)
|
||||||
|
{
|
||||||
|
put_unaligned_be64(val64, memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC size_t MEM_readBEST(const void *memPtr)
|
||||||
|
{
|
||||||
|
if (MEM_32bits())
|
||||||
|
return (size_t)MEM_readBE32(memPtr);
|
||||||
|
else
|
||||||
|
return (size_t)MEM_readBE64(memPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeBEST(void *memPtr, size_t val)
|
||||||
|
{
|
||||||
|
if (MEM_32bits())
|
||||||
|
MEM_writeBE32(memPtr, (U32)val);
|
||||||
|
else
|
||||||
|
MEM_writeBE64(memPtr, (U64)val);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U32 MEM_swap32(U32 in)
|
||||||
|
{
|
||||||
|
return swab32(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC U64 MEM_swap64(U64 in)
|
||||||
|
{
|
||||||
|
return swab64(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_STATIC size_t MEM_swapST(size_t in)
|
||||||
|
{
|
||||||
|
if (MEM_32bits())
|
||||||
|
return (size_t)MEM_swap32((U32)in);
|
||||||
|
else
|
||||||
|
return (size_t)MEM_swap64((U64)in);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MEM_H_MODULE */
|
17
contrib/linux-kernel/test/include/linux/compiler.h
Normal file
17
contrib/linux-kernel/test/include/linux/compiler.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2020, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under both the BSD-style license (found in the
|
||||||
|
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||||
|
* in the COPYING file in the root directory of this source tree).
|
||||||
|
* You may select, at your option, one of the above-listed licenses.
|
||||||
|
*/
|
||||||
|
#ifndef LINUX_COMPILER_H
|
||||||
|
#define LINUX_COMPILER_H
|
||||||
|
|
||||||
|
#ifndef inline
|
||||||
|
#define inline __inline __attribute__((unused))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
16
contrib/linux-kernel/test/include/linux/swab.h
Normal file
16
contrib/linux-kernel/test/include/linux/swab.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2020, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under both the BSD-style license (found in the
|
||||||
|
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||||
|
* in the COPYING file in the root directory of this source tree).
|
||||||
|
* You may select, at your option, one of the above-listed licenses.
|
||||||
|
*/
|
||||||
|
#ifndef LINUX_SWAB_H
|
||||||
|
#define LINUX_SWAB_H
|
||||||
|
|
||||||
|
#define swab32(x) __builtin_bswap32((x))
|
||||||
|
#define swab64(x) __builtin_bswap64((x))
|
||||||
|
|
||||||
|
#endif
|
@ -8,36 +8,26 @@
|
|||||||
* You may select, at your option, one of the above-listed licenses.
|
* You may select, at your option, one of the above-listed licenses.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file provides common libc dependencies that zstd requires.
|
||||||
|
* The purpose is to allow replacing this file with a custom implementation
|
||||||
|
* to compile zstd without libc support.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Need:
|
/* Need:
|
||||||
* NULL
|
* NULL
|
||||||
|
* INT_MAX
|
||||||
|
* UINT_MAX
|
||||||
* ZSTD_memcpy()
|
* ZSTD_memcpy()
|
||||||
* ZSTD_memset()
|
* ZSTD_memset()
|
||||||
* ZSTD_memmove()
|
* ZSTD_memmove()
|
||||||
* BYTE
|
|
||||||
* S16
|
|
||||||
* U16
|
|
||||||
* U32
|
|
||||||
* U64
|
|
||||||
* size_t
|
|
||||||
* ptrdiff_t
|
|
||||||
* INT_MAX
|
|
||||||
* UINT_MAX
|
|
||||||
*/
|
*/
|
||||||
#ifndef ZSTD_DEPS_COMMON
|
#ifndef ZSTD_DEPS_COMMON
|
||||||
#define ZSTD_DEPS_COMMON
|
#define ZSTD_DEPS_COMMON
|
||||||
|
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
|
|
||||||
typedef uint8_t BYTE;
|
|
||||||
typedef uint16_t U16;
|
|
||||||
typedef int16_t S16;
|
|
||||||
typedef uint32_t U32;
|
|
||||||
typedef int32_t S32;
|
|
||||||
typedef uint64_t U64;
|
|
||||||
typedef int64_t S64;
|
|
||||||
|
|
||||||
#define ZSTD_memcpy(d,s,n) __builtin_memcpy((d),(s),(n))
|
#define ZSTD_memcpy(d,s,n) __builtin_memcpy((d),(s),(n))
|
||||||
#define ZSTD_memmove(d,s,n) __builtin_memmove((d),(s),(n))
|
#define ZSTD_memmove(d,s,n) __builtin_memmove((d),(s),(n))
|
||||||
#define ZSTD_memset(d,s,n) __builtin_memset((d),(s),(n))
|
#define ZSTD_memset(d,s,n) __builtin_memset((d),(s),(n))
|
||||||
@ -74,7 +64,7 @@ typedef int64_t S64;
|
|||||||
|
|
||||||
#include <linux/math64.h>
|
#include <linux/math64.h>
|
||||||
|
|
||||||
static U64 ZSTD_div64(U64 dividend, U32 divisor) {
|
static uint64_t ZSTD_div64(uint64_t dividend, uint32_t divisor) {
|
||||||
return div_u64(dividend, divisor);
|
return div_u64(dividend, divisor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,8 +213,7 @@
|
|||||||
* We therefore declare the functions we need ourselves, rather than trying to
|
* We therefore declare the functions we need ourselves, rather than trying to
|
||||||
* include the header file... */
|
* include the header file... */
|
||||||
#include <stddef.h> /* size_t */
|
#include <stddef.h> /* size_t */
|
||||||
|
#define ZSTD_DEPS_NEED_STDINT
|
||||||
#define ZS_DEPS_NEED_STDINT
|
|
||||||
#include "zstd_deps.h" /* intptr_t */
|
#include "zstd_deps.h" /* intptr_t */
|
||||||
|
|
||||||
/* Make memory region fully initialized (without changing its contents). */
|
/* Make memory region fully initialized (without changing its contents). */
|
||||||
|
@ -18,8 +18,10 @@ extern "C" {
|
|||||||
/*-****************************************
|
/*-****************************************
|
||||||
* Dependencies
|
* Dependencies
|
||||||
******************************************/
|
******************************************/
|
||||||
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
||||||
|
#include "compiler.h" /* __has_builtin */
|
||||||
#include "debug.h" /* DEBUG_STATIC_ASSERT */
|
#include "debug.h" /* DEBUG_STATIC_ASSERT */
|
||||||
#include "zstd_deps.h" /* size_t, ptrdiff_t, ZSTD_memcpy */
|
#include "zstd_deps.h" /* ZSTD_memcpy */
|
||||||
|
|
||||||
|
|
||||||
/*-****************************************
|
/*-****************************************
|
||||||
@ -39,12 +41,89 @@ extern "C" {
|
|||||||
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* code only tested on 32 and 64 bits systems */
|
/*-**************************************************************
|
||||||
MEM_STATIC void MEM_check(void) { DEBUG_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
|
* Basic Types
|
||||||
|
*****************************************************************/
|
||||||
|
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
||||||
|
# include <stdint.h>
|
||||||
|
typedef uint8_t BYTE;
|
||||||
|
typedef uint16_t U16;
|
||||||
|
typedef int16_t S16;
|
||||||
|
typedef uint32_t U32;
|
||||||
|
typedef int32_t S32;
|
||||||
|
typedef uint64_t U64;
|
||||||
|
typedef int64_t S64;
|
||||||
|
#else
|
||||||
|
# include <limits.h>
|
||||||
|
#if CHAR_BIT != 8
|
||||||
|
# error "this implementation requires char to be exactly 8-bit type"
|
||||||
|
#endif
|
||||||
|
typedef unsigned char BYTE;
|
||||||
|
#if USHRT_MAX != 65535
|
||||||
|
# error "this implementation requires short to be exactly 16-bit type"
|
||||||
|
#endif
|
||||||
|
typedef unsigned short U16;
|
||||||
|
typedef signed short S16;
|
||||||
|
#if UINT_MAX != 4294967295
|
||||||
|
# error "this implementation requires int to be exactly 32-bit type"
|
||||||
|
#endif
|
||||||
|
typedef unsigned int U32;
|
||||||
|
typedef signed int S32;
|
||||||
|
/* note : there are no limits defined for long long type in C90.
|
||||||
|
* limits exist in C99, however, in such case, <stdint.h> is preferred */
|
||||||
|
typedef unsigned long long U64;
|
||||||
|
typedef signed long long S64;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*-**************************************************************
|
/*-**************************************************************
|
||||||
* Memory I/O
|
* Memory I/O API
|
||||||
|
*****************************************************************/
|
||||||
|
/*=== Static platform detection ===*/
|
||||||
|
MEM_STATIC unsigned MEM_32bits(void);
|
||||||
|
MEM_STATIC unsigned MEM_64bits(void);
|
||||||
|
MEM_STATIC unsigned MEM_isLittleEndian(void);
|
||||||
|
|
||||||
|
/*=== Native unaligned read/write ===*/
|
||||||
|
MEM_STATIC U16 MEM_read16(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_read32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_read64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_write16(void* memPtr, U16 value);
|
||||||
|
MEM_STATIC void MEM_write32(void* memPtr, U32 value);
|
||||||
|
MEM_STATIC void MEM_write64(void* memPtr, U64 value);
|
||||||
|
|
||||||
|
/*=== Little endian unaligned read/write ===*/
|
||||||
|
MEM_STATIC U16 MEM_readLE16(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_readLE24(const void* memPtr);
|
||||||
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_readLE64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readLEST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val);
|
||||||
|
MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val);
|
||||||
|
MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32);
|
||||||
|
MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64);
|
||||||
|
MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val);
|
||||||
|
|
||||||
|
/*=== Big endian unaligned read/write ===*/
|
||||||
|
MEM_STATIC U32 MEM_readBE32(const void* memPtr);
|
||||||
|
MEM_STATIC U64 MEM_readBE64(const void* memPtr);
|
||||||
|
MEM_STATIC size_t MEM_readBEST(const void* memPtr);
|
||||||
|
|
||||||
|
MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32);
|
||||||
|
MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64);
|
||||||
|
MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val);
|
||||||
|
|
||||||
|
/*=== Byteswap ===*/
|
||||||
|
MEM_STATIC U32 MEM_swap32(U32 in);
|
||||||
|
MEM_STATIC U64 MEM_swap64(U64 in);
|
||||||
|
MEM_STATIC size_t MEM_swapST(size_t in);
|
||||||
|
|
||||||
|
|
||||||
|
/*-**************************************************************
|
||||||
|
* Memory I/O Implementation
|
||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
/* MEM_FORCE_MEMORY_ACCESS :
|
/* MEM_FORCE_MEMORY_ACCESS :
|
||||||
* By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
|
* By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.
|
||||||
@ -332,6 +411,9 @@ MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val)
|
|||||||
MEM_writeBE64(memPtr, (U64)val);
|
MEM_writeBE64(memPtr, (U64)val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* code only tested on 32 and 64 bits systems */
|
||||||
|
MEM_STATIC void MEM_check(void) { DEBUG_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
|
||||||
|
|
||||||
|
|
||||||
#if defined (__cplusplus)
|
#if defined (__cplusplus)
|
||||||
}
|
}
|
||||||
|
@ -93,32 +93,13 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_
|
|||||||
/* *************************************
|
/* *************************************
|
||||||
* Compiler Specific Options
|
* Compiler Specific Options
|
||||||
***************************************/
|
***************************************/
|
||||||
#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
#include "compiler.h"
|
||||||
# define INLINE_KEYWORD inline
|
|
||||||
#else
|
|
||||||
# define INLINE_KEYWORD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__GNUC__) || defined(__ICCARM__)
|
|
||||||
# define FORCE_INLINE_ATTR __attribute__((always_inline))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
# define FORCE_INLINE_ATTR __forceinline
|
|
||||||
#else
|
|
||||||
# define FORCE_INLINE_ATTR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* *************************************
|
/* *************************************
|
||||||
* Basic Types
|
* Basic Types
|
||||||
***************************************/
|
***************************************/
|
||||||
|
#include "mem.h" /* BYTE, U32, U64, size_t */
|
||||||
|
|
||||||
#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))
|
#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))
|
||||||
|
|
||||||
|
@ -8,19 +8,18 @@
|
|||||||
* You may select, at your option, one of the above-listed licenses.
|
* You may select, at your option, one of the above-listed licenses.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* This file provides common libc dependencies that zstd requires.
|
||||||
|
* The purpose is to allow replacing this file with a custom implementation
|
||||||
|
* to compile zstd without libc support.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Need:
|
/* Need:
|
||||||
|
* NULL
|
||||||
|
* INT_MAX
|
||||||
|
* UINT_MAX
|
||||||
* ZSTD_memcpy()
|
* ZSTD_memcpy()
|
||||||
* ZSTD_memset()
|
* ZSTD_memset()
|
||||||
* ZSTD_memmove()
|
* ZSTD_memmove()
|
||||||
* BYTE
|
|
||||||
* S16
|
|
||||||
* U16
|
|
||||||
* U32
|
|
||||||
* U64
|
|
||||||
* size_t
|
|
||||||
* ptrdiff_t
|
|
||||||
* INT_MAX
|
|
||||||
* ...
|
|
||||||
*/
|
*/
|
||||||
#ifndef ZSTD_DEPS_COMMON
|
#ifndef ZSTD_DEPS_COMMON
|
||||||
#define ZSTD_DEPS_COMMON
|
#define ZSTD_DEPS_COMMON
|
||||||
@ -39,40 +38,6 @@
|
|||||||
# define ZSTD_memset(p,v,l) memset((p),(v),(l))
|
# define ZSTD_memset(p,v,l) memset((p),(v),(l))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*-**************************************************************
|
|
||||||
* Basic Types
|
|
||||||
*****************************************************************/
|
|
||||||
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
|
||||||
# include <stdint.h>
|
|
||||||
typedef uint8_t BYTE;
|
|
||||||
typedef uint16_t U16;
|
|
||||||
typedef int16_t S16;
|
|
||||||
typedef uint32_t U32;
|
|
||||||
typedef int32_t S32;
|
|
||||||
typedef uint64_t U64;
|
|
||||||
typedef int64_t S64;
|
|
||||||
#else
|
|
||||||
# include <limits.h>
|
|
||||||
#if CHAR_BIT != 8
|
|
||||||
# error "this implementation requires char to be exactly 8-bit type"
|
|
||||||
#endif
|
|
||||||
typedef unsigned char BYTE;
|
|
||||||
#if USHRT_MAX != 65535
|
|
||||||
# error "this implementation requires short to be exactly 16-bit type"
|
|
||||||
#endif
|
|
||||||
typedef unsigned short U16;
|
|
||||||
typedef signed short S16;
|
|
||||||
#if UINT_MAX != 4294967295
|
|
||||||
# error "this implementation requires int to be exactly 32-bit type"
|
|
||||||
#endif
|
|
||||||
typedef unsigned int U32;
|
|
||||||
typedef signed int S32;
|
|
||||||
/* note : there are no limits defined for long long type in C90.
|
|
||||||
* limits exist in C99, however, in such case, <stdint.h> is preferred */
|
|
||||||
typedef unsigned long long U64;
|
|
||||||
typedef signed long long S64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ZSTD_DEPS_COMMON */
|
#endif /* ZSTD_DEPS_COMMON */
|
||||||
|
|
||||||
/* Need:
|
/* Need:
|
||||||
@ -102,9 +67,7 @@
|
|||||||
#ifndef ZSTD_DEPS_MATH64
|
#ifndef ZSTD_DEPS_MATH64
|
||||||
#define ZSTD_DEPS_MATH64
|
#define ZSTD_DEPS_MATH64
|
||||||
|
|
||||||
static U64 ZSTD_div64(U64 dividend, U32 divisor) {
|
#define ZSTD_div64(dividend, divisor) ((dividend) / (divisor))
|
||||||
return dividend / divisor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* ZSTD_DEPS_MATH64 */
|
#endif /* ZSTD_DEPS_MATH64 */
|
||||||
#endif /* ZSTD_DEPS_NEED_MATH64 */
|
#endif /* ZSTD_DEPS_NEED_MATH64 */
|
||||||
|
Reference in New Issue
Block a user