1*8a62a2a5SMartin Matuska // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-only 2*8a62a2a5SMartin Matuska /* 3*8a62a2a5SMartin Matuska * Copyright (c) Meta Platforms, Inc. and affiliates. 4*8a62a2a5SMartin Matuska * All rights reserved. 5*8a62a2a5SMartin Matuska * 6*8a62a2a5SMartin Matuska * This source code is licensed under both the BSD-style license (found in the 7*8a62a2a5SMartin Matuska * LICENSE file in the root directory of this source tree) and the GPLv2 (found 8*8a62a2a5SMartin Matuska * in the COPYING file in the root directory of this source tree). 9*8a62a2a5SMartin Matuska * You may select, at your option, one of the above-listed licenses. 10*8a62a2a5SMartin Matuska */ 11*8a62a2a5SMartin Matuska 12*8a62a2a5SMartin Matuska #ifndef ZSTD_TRACE_H 13*8a62a2a5SMartin Matuska #define ZSTD_TRACE_H 14*8a62a2a5SMartin Matuska 15*8a62a2a5SMartin Matuska #include <stddef.h> 16*8a62a2a5SMartin Matuska 17*8a62a2a5SMartin Matuska /* weak symbol support 18*8a62a2a5SMartin Matuska * For now, enable conservatively: 19*8a62a2a5SMartin Matuska * - Only GNUC 20*8a62a2a5SMartin Matuska * - Only ELF 21*8a62a2a5SMartin Matuska * - Only x86-64, i386, aarch64 and risc-v. 22*8a62a2a5SMartin Matuska * Also, explicitly disable on platforms known not to work so they aren't 23*8a62a2a5SMartin Matuska * forgotten in the future. 24*8a62a2a5SMartin Matuska */ 25*8a62a2a5SMartin Matuska #if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ 26*8a62a2a5SMartin Matuska defined(__GNUC__) && defined(__ELF__) && \ 27*8a62a2a5SMartin Matuska (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \ 28*8a62a2a5SMartin Matuska defined(_M_IX86) || defined(__aarch64__) || defined(__riscv)) && \ 29*8a62a2a5SMartin Matuska !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ 30*8a62a2a5SMartin Matuska !defined(__CYGWIN__) && !defined(_AIX) 31*8a62a2a5SMartin Matuska # define ZSTD_HAVE_WEAK_SYMBOLS 1 32*8a62a2a5SMartin Matuska #else 33*8a62a2a5SMartin Matuska # define ZSTD_HAVE_WEAK_SYMBOLS 0 34*8a62a2a5SMartin Matuska #endif 35*8a62a2a5SMartin Matuska #if ZSTD_HAVE_WEAK_SYMBOLS 36*8a62a2a5SMartin Matuska # define ZSTD_WEAK_ATTR __attribute__((__weak__)) 37*8a62a2a5SMartin Matuska #else 38*8a62a2a5SMartin Matuska # define ZSTD_WEAK_ATTR 39*8a62a2a5SMartin Matuska #endif 40*8a62a2a5SMartin Matuska 41*8a62a2a5SMartin Matuska /* Only enable tracing when weak symbols are available. */ 42*8a62a2a5SMartin Matuska #ifndef ZSTD_TRACE 43*8a62a2a5SMartin Matuska # define ZSTD_TRACE ZSTD_HAVE_WEAK_SYMBOLS 44*8a62a2a5SMartin Matuska #endif 45*8a62a2a5SMartin Matuska 46*8a62a2a5SMartin Matuska #if ZSTD_TRACE 47*8a62a2a5SMartin Matuska 48*8a62a2a5SMartin Matuska struct ZSTD_CCtx_s; 49*8a62a2a5SMartin Matuska struct ZSTD_DCtx_s; 50*8a62a2a5SMartin Matuska struct ZSTD_CCtx_params_s; 51*8a62a2a5SMartin Matuska 52*8a62a2a5SMartin Matuska typedef struct { 53*8a62a2a5SMartin Matuska /** 54*8a62a2a5SMartin Matuska * ZSTD_VERSION_NUMBER 55*8a62a2a5SMartin Matuska * 56*8a62a2a5SMartin Matuska * This is guaranteed to be the first member of ZSTD_trace. 57*8a62a2a5SMartin Matuska * Otherwise, this struct is not stable between versions. If 58*8a62a2a5SMartin Matuska * the version number does not match your expectation, you 59*8a62a2a5SMartin Matuska * should not interpret the rest of the struct. 60*8a62a2a5SMartin Matuska */ 61*8a62a2a5SMartin Matuska unsigned version; 62*8a62a2a5SMartin Matuska /** 63*8a62a2a5SMartin Matuska * Non-zero if streaming (de)compression is used. 64*8a62a2a5SMartin Matuska */ 65*8a62a2a5SMartin Matuska int streaming; 66*8a62a2a5SMartin Matuska /** 67*8a62a2a5SMartin Matuska * The dictionary ID. 68*8a62a2a5SMartin Matuska */ 69*8a62a2a5SMartin Matuska unsigned dictionaryID; 70*8a62a2a5SMartin Matuska /** 71*8a62a2a5SMartin Matuska * Is the dictionary cold? 72*8a62a2a5SMartin Matuska * Only set on decompression. 73*8a62a2a5SMartin Matuska */ 74*8a62a2a5SMartin Matuska int dictionaryIsCold; 75*8a62a2a5SMartin Matuska /** 76*8a62a2a5SMartin Matuska * The dictionary size or zero if no dictionary. 77*8a62a2a5SMartin Matuska */ 78*8a62a2a5SMartin Matuska size_t dictionarySize; 79*8a62a2a5SMartin Matuska /** 80*8a62a2a5SMartin Matuska * The uncompressed size of the data. 81*8a62a2a5SMartin Matuska */ 82*8a62a2a5SMartin Matuska size_t uncompressedSize; 83*8a62a2a5SMartin Matuska /** 84*8a62a2a5SMartin Matuska * The compressed size of the data. 85*8a62a2a5SMartin Matuska */ 86*8a62a2a5SMartin Matuska size_t compressedSize; 87*8a62a2a5SMartin Matuska /** 88*8a62a2a5SMartin Matuska * The fully resolved CCtx parameters (NULL on decompression). 89*8a62a2a5SMartin Matuska */ 90*8a62a2a5SMartin Matuska struct ZSTD_CCtx_params_s const* params; 91*8a62a2a5SMartin Matuska /** 92*8a62a2a5SMartin Matuska * The ZSTD_CCtx pointer (NULL on decompression). 93*8a62a2a5SMartin Matuska */ 94*8a62a2a5SMartin Matuska struct ZSTD_CCtx_s const* cctx; 95*8a62a2a5SMartin Matuska /** 96*8a62a2a5SMartin Matuska * The ZSTD_DCtx pointer (NULL on compression). 97*8a62a2a5SMartin Matuska */ 98*8a62a2a5SMartin Matuska struct ZSTD_DCtx_s const* dctx; 99*8a62a2a5SMartin Matuska } ZSTD_Trace; 100*8a62a2a5SMartin Matuska 101*8a62a2a5SMartin Matuska /** 102*8a62a2a5SMartin Matuska * A tracing context. It must be 0 when tracing is disabled. 103*8a62a2a5SMartin Matuska * Otherwise, any non-zero value returned by a tracing begin() 104*8a62a2a5SMartin Matuska * function is presented to any subsequent calls to end(). 105*8a62a2a5SMartin Matuska * 106*8a62a2a5SMartin Matuska * Any non-zero value is treated as tracing is enabled and not 107*8a62a2a5SMartin Matuska * interpreted by the library. 108*8a62a2a5SMartin Matuska * 109*8a62a2a5SMartin Matuska * Two possible uses are: 110*8a62a2a5SMartin Matuska * * A timestamp for when the begin() function was called. 111*8a62a2a5SMartin Matuska * * A unique key identifying the (de)compression, like the 112*8a62a2a5SMartin Matuska * address of the [dc]ctx pointer if you need to track 113*8a62a2a5SMartin Matuska * more information than just a timestamp. 114*8a62a2a5SMartin Matuska */ 115*8a62a2a5SMartin Matuska typedef unsigned long long ZSTD_TraceCtx; 116*8a62a2a5SMartin Matuska 117*8a62a2a5SMartin Matuska /** 118*8a62a2a5SMartin Matuska * Trace the beginning of a compression call. 119*8a62a2a5SMartin Matuska * @param cctx The dctx pointer for the compression. 120*8a62a2a5SMartin Matuska * It can be used as a key to map begin() to end(). 121*8a62a2a5SMartin Matuska * @returns Non-zero if tracing is enabled. The return value is 122*8a62a2a5SMartin Matuska * passed to ZSTD_trace_compress_end(). 123*8a62a2a5SMartin Matuska */ 124*8a62a2a5SMartin Matuska ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_compress_begin( 125*8a62a2a5SMartin Matuska struct ZSTD_CCtx_s const* cctx); 126*8a62a2a5SMartin Matuska 127*8a62a2a5SMartin Matuska /** 128*8a62a2a5SMartin Matuska * Trace the end of a compression call. 129*8a62a2a5SMartin Matuska * @param ctx The return value of ZSTD_trace_compress_begin(). 130*8a62a2a5SMartin Matuska * @param trace The zstd tracing info. 131*8a62a2a5SMartin Matuska */ 132*8a62a2a5SMartin Matuska ZSTD_WEAK_ATTR void ZSTD_trace_compress_end( 133*8a62a2a5SMartin Matuska ZSTD_TraceCtx ctx, 134*8a62a2a5SMartin Matuska ZSTD_Trace const* trace); 135*8a62a2a5SMartin Matuska 136*8a62a2a5SMartin Matuska /** 137*8a62a2a5SMartin Matuska * Trace the beginning of a decompression call. 138*8a62a2a5SMartin Matuska * @param dctx The dctx pointer for the decompression. 139*8a62a2a5SMartin Matuska * It can be used as a key to map begin() to end(). 140*8a62a2a5SMartin Matuska * @returns Non-zero if tracing is enabled. The return value is 141*8a62a2a5SMartin Matuska * passed to ZSTD_trace_compress_end(). 142*8a62a2a5SMartin Matuska */ 143*8a62a2a5SMartin Matuska ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_decompress_begin( 144*8a62a2a5SMartin Matuska struct ZSTD_DCtx_s const* dctx); 145*8a62a2a5SMartin Matuska 146*8a62a2a5SMartin Matuska /** 147*8a62a2a5SMartin Matuska * Trace the end of a decompression call. 148*8a62a2a5SMartin Matuska * @param ctx The return value of ZSTD_trace_decompress_begin(). 149*8a62a2a5SMartin Matuska * @param trace The zstd tracing info. 150*8a62a2a5SMartin Matuska */ 151*8a62a2a5SMartin Matuska ZSTD_WEAK_ATTR void ZSTD_trace_decompress_end( 152*8a62a2a5SMartin Matuska ZSTD_TraceCtx ctx, 153*8a62a2a5SMartin Matuska ZSTD_Trace const* trace); 154*8a62a2a5SMartin Matuska 155*8a62a2a5SMartin Matuska #endif /* ZSTD_TRACE */ 156*8a62a2a5SMartin Matuska 157*8a62a2a5SMartin Matuska #endif /* ZSTD_TRACE_H */ 158