xref: /linux/lib/zstd/common/zstd_deps.h (revision 9958d30f38b96fb763a10d44d18ddad39127d5f4)
1 /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
2 /*
3  * Copyright (c) Facebook, Inc.
4  * All rights reserved.
5  *
6  * This source code is licensed under both the BSD-style license (found in the
7  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8  * in the COPYING file in the root directory of this source tree).
9  * You may select, at your option, one of the above-listed licenses.
10  */
11 
12 /*
13  * This file provides common libc dependencies that zstd requires.
14  * The purpose is to allow replacing this file with a custom implementation
15  * to compile zstd without libc support.
16  */
17 
18 /* Need:
19  * NULL
20  * INT_MAX
21  * UINT_MAX
22  * ZSTD_memcpy()
23  * ZSTD_memset()
24  * ZSTD_memmove()
25  */
26 #ifndef ZSTD_DEPS_COMMON
27 #define ZSTD_DEPS_COMMON
28 
29 #include <linux/limits.h>
30 #include <linux/stddef.h>
31 
32 #define ZSTD_memcpy(d,s,n) __builtin_memcpy((d),(s),(n))
33 #define ZSTD_memmove(d,s,n) __builtin_memmove((d),(s),(n))
34 #define ZSTD_memset(d,s,n) __builtin_memset((d),(s),(n))
35 
36 #endif /* ZSTD_DEPS_COMMON */
37 
38 /*
39  * Define malloc as always failing. That means the user must
40  * either use ZSTD_customMem or statically allocate memory.
41  * Need:
42  * ZSTD_malloc()
43  * ZSTD_free()
44  * ZSTD_calloc()
45  */
46 #ifdef ZSTD_DEPS_NEED_MALLOC
47 #ifndef ZSTD_DEPS_MALLOC
48 #define ZSTD_DEPS_MALLOC
49 
50 #define ZSTD_malloc(s) ({ (void)(s); NULL; })
51 #define ZSTD_free(p) ((void)(p))
52 #define ZSTD_calloc(n,s) ({ (void)(n); (void)(s); NULL; })
53 
54 #endif /* ZSTD_DEPS_MALLOC */
55 #endif /* ZSTD_DEPS_NEED_MALLOC */
56 
57 /*
58  * Provides 64-bit math support.
59  * Need:
60  * U64 ZSTD_div64(U64 dividend, U32 divisor)
61  */
62 #ifdef ZSTD_DEPS_NEED_MATH64
63 #ifndef ZSTD_DEPS_MATH64
64 #define ZSTD_DEPS_MATH64
65 
66 #include <linux/math64.h>
67 
68 static uint64_t ZSTD_div64(uint64_t dividend, uint32_t divisor) {
69   return div_u64(dividend, divisor);
70 }
71 
72 #endif /* ZSTD_DEPS_MATH64 */
73 #endif /* ZSTD_DEPS_NEED_MATH64 */
74 
75 /*
76  * This is only requested when DEBUGLEVEL >= 1, meaning
77  * it is disabled in production.
78  * Need:
79  * assert()
80  */
81 #ifdef ZSTD_DEPS_NEED_ASSERT
82 #ifndef ZSTD_DEPS_ASSERT
83 #define ZSTD_DEPS_ASSERT
84 
85 #include <linux/kernel.h>
86 
87 #define assert(x) WARN_ON((x))
88 
89 #endif /* ZSTD_DEPS_ASSERT */
90 #endif /* ZSTD_DEPS_NEED_ASSERT */
91 
92 /*
93  * This is only requested when DEBUGLEVEL >= 2, meaning
94  * it is disabled in production.
95  * Need:
96  * ZSTD_DEBUG_PRINT()
97  */
98 #ifdef ZSTD_DEPS_NEED_IO
99 #ifndef ZSTD_DEPS_IO
100 #define ZSTD_DEPS_IO
101 
102 #include <linux/printk.h>
103 
104 #define ZSTD_DEBUG_PRINT(...) pr_debug(__VA_ARGS__)
105 
106 #endif /* ZSTD_DEPS_IO */
107 #endif /* ZSTD_DEPS_NEED_IO */
108 
109 /*
110  * Only requested when MSAN is enabled.
111  * Need:
112  * intptr_t
113  */
114 #ifdef ZSTD_DEPS_NEED_STDINT
115 #ifndef ZSTD_DEPS_STDINT
116 #define ZSTD_DEPS_STDINT
117 
118 /*
119  * The Linux Kernel doesn't provide intptr_t, only uintptr_t, which
120  * is an unsigned long.
121  */
122 typedef long intptr_t;
123 
124 #endif /* ZSTD_DEPS_STDINT */
125 #endif /* ZSTD_DEPS_NEED_STDINT */
126