deflate_state *s;
int wrap = 1;
+ /* Force initialization functable, because deflate captures function pointers from functable. */
+ functable.force_init();
+
if (strm == NULL)
return Z_STREAM_ERROR;
#include "functable.h"
#include "cpu_features.h"
+static void force_init_empty(void) {
+ // empty
+}
+
static void init_functable(void) {
struct functable_s ft;
struct cpu_features cf;
cpu_check_features(&cf);
// Generic code
+ ft.force_init = &force_init_empty;
ft.adler32 = &adler32_c;
ft.adler32_fold_copy = &adler32_fold_copy_c;
ft.chunkmemset_safe = &chunkmemset_safe_c;
#endif
// Assign function pointers individually for atomic operation
+ functable.force_init = ft.force_init;
functable.adler32 = ft.adler32;
functable.adler32_fold_copy = ft.adler32_fold_copy;
functable.chunkmemset_safe = ft.chunkmemset_safe;
}
/* stub functions */
+static void force_init_stub(void) {
+ init_functable();
+}
+
static uint32_t adler32_stub(uint32_t adler, const uint8_t* buf, size_t len) {
init_functable();
return functable.adler32(adler, buf, len);
/* functable init */
Z_INTERNAL Z_TLS struct functable_s functable = {
+ force_init_stub,
adler32_stub,
adler32_fold_copy_stub,
chunkmemset_safe_stub,
#endif
struct functable_s {
+ void (* force_init) (void);
uint32_t (* adler32) (uint32_t adler, const uint8_t *buf, size_t len);
uint32_t (* adler32_fold_copy) (uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
uint8_t* (* chunkmemset_safe) (uint8_t *out, unsigned dist, unsigned len, unsigned left);