Move the implementation of programs/timefn.c into rust/src/timefn.rs. The file provides the monotonic nanosecond clock (UTIL_getTime, span helpers, UTIL_waitForNextTick, UTIL_support_MT_measurements) used by the CLI and by several C test tools. timefn.c remains as a declaration-only shim so the original source lists and header configuration keep working, and it pins the ABI with static asserts: UTIL_time_t is returned by value and must stay a plain 64-bit counter, which the Rust #[repr(C)] mirror also asserts. Platform selection mirrors the C preprocessor structure: Windows uses QueryPerformanceCounter, Apple targets use mach_absolute_time, and other POSIX systems use libc clock_gettime(CLOCK_MONOTONIC). Only the unix path is exercised by this environment; the Windows and Apple paths are written from the C source and compile-checked logically but are untested here. The C90 clock() fallback is unreachable on Rust-supported targets, so multi-threaded measurement support is always reported. The symbols live in the program-only zstd-cli-rs package, keeping them out of library builds. Linking that archive into C test binaries surfaced a structural problem: rustc's local ThinLTO promotes internal symbols across codegen units, so extracting the timefn object could drag in the zstd_cli parser object, whose FIO_* externs test binaries cannot satisfy. The parser is therefore gated behind a new additive `cli` cargo feature (default on). Program archives build with cli,compression,decompression as before, while tests/Makefile links a helpers-only archive (rust/target/cli-helpers) built with --no-default-features, which contains no fileio references at all. tests/Makefile gains build rules for the helpers archive and adds it as a prerequisite of every binary that compiles the timefn shim: fullbench(32), fullbench-lib, fullbench-dll, fuzzer(32), zstreamtest(32/asan/tsan/ubsan), paramgrill, decodecorpus, and poolTests. Prerequisite order places the archive after all C objects in `$^` link lines; the known-broken -dll recipes filter to %.c, so they name the archive explicitly. Original C test sources are untouched; only link inputs changed. zstd-cli-rs now depends on libc (already used by the core crate) for clock_gettime and the Mach timebase bindings. Test Plan: - cd rust && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test --all-targets && cargo build --release - cd rust/cli && cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test --all-targets; repeat tests with --no-default-features plus features compression / decompression / (none) - make -C programs zstd; roundtrip echo hello | zstd | zstd -d - make -C tests fullbench fuzzer zstreamtest paramgrill decodecorpus poolTests; ./tests/fullbench -i0; ./tests/fuzzer -i1 --no-big-tests; ./tests/poolTests; make -C tests test-rust-lib-smoke - verified with nm that the helpers archive member defining UTIL_getTime has no FIO_*/ZSTD_* undefined references Refs: rust/README.md
66 lines
624 B
INI
66 lines
624 B
INI
# Object files
|
|
*.o
|
|
*.ko
|
|
*.dSYM
|
|
|
|
# Libraries
|
|
*.lib
|
|
*.a
|
|
|
|
# Shared objects (inc. Windows DLLs)
|
|
*.dll
|
|
*.so
|
|
*.so.*
|
|
*.dylib
|
|
*.framework
|
|
*.xcframework
|
|
|
|
# Executables
|
|
/zstd
|
|
zstdmt
|
|
*.exe
|
|
*.out
|
|
*.app
|
|
|
|
# Test artefacts
|
|
tmp*
|
|
*.zst
|
|
*.zstd
|
|
dictionary.
|
|
dictionary
|
|
NUL
|
|
cmakebuild/
|
|
install/
|
|
|
|
# Build artefacts
|
|
/rust/target/
|
|
/rust/cli/target/
|
|
contrib/linux-kernel/linux/
|
|
projects/
|
|
bin/
|
|
.buckd/
|
|
buck-out/
|
|
build-*
|
|
*.gcda
|
|
|
|
# IDE
|
|
.clang_complete
|
|
compile_flags.txt
|
|
.clang-format
|
|
|
|
# Other files
|
|
.directory
|
|
_codelite/
|
|
_zstdbench/
|
|
*.idea
|
|
*.swp
|
|
.DS_Store
|
|
googletest/
|
|
*.d
|
|
*.vscode
|
|
*.code-workspace
|
|
compile_commands.json
|
|
.clangd
|
|
perf.data
|
|
perf.data.old
|