aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Fioraldi <andreafioraldi@gmail.com>2021-01-02 11:36:17 +0100
committerAndrea Fioraldi <andreafioraldi@gmail.com>2021-01-02 11:36:17 +0100
commit7620f6f39672a4dc799d3875a2c6f7a0d1f0b815 (patch)
treee93d3c9c8639020f1c24fe82dedcc2c863f06ccc /src
parent214da5c42e639fb5993c9bc2ca1f48f6a8b2c9c7 (diff)
parent697e3e285bdfc3848dfeafcec7345301cb3dc64e (diff)
downloadafl++-7620f6f39672a4dc799d3875a2c6f7a0d1f0b815.tar.gz
Merge branch 'dev' of github.com:AFLplusplus/AFLplusplus into dev
Diffstat (limited to 'src')
-rw-r--r--src/afl-analyze.c11
-rw-r--r--src/afl-cc.c18
-rw-r--r--src/afl-common.c12
-rw-r--r--src/afl-fuzz-bitmap.c17
-rw-r--r--src/afl-fuzz-init.c34
-rw-r--r--src/afl-fuzz-queue.c83
-rw-r--r--src/afl-fuzz-redqueen.c3
-rw-r--r--src/afl-fuzz-run.c6
-rw-r--r--src/afl-fuzz-state.c2
-rw-r--r--src/afl-fuzz-stats.c39
-rw-r--r--src/afl-ld-lto.c4
-rw-r--r--src/afl-showmap.c25
-rw-r--r--src/afl-tmin.c11
13 files changed, 168 insertions, 97 deletions
diff --git a/src/afl-analyze.c b/src/afl-analyze.c
index a6825ef6..6dac415b 100644
--- a/src/afl-analyze.c
+++ b/src/afl-analyze.c
@@ -103,11 +103,11 @@ static u32 map_size = MAP_SIZE;
/* Classify tuple counts. This is a slow & naive version, but good enough here.
*/
-#define TIMES4(x) x,x,x,x
-#define TIMES8(x) TIMES4(x),TIMES4(x)
-#define TIMES16(x) TIMES8(x),TIMES8(x)
-#define TIMES32(x) TIMES16(x),TIMES16(x)
-#define TIMES64(x) TIMES32(x),TIMES32(x)
+#define TIMES4(x) x, x, x, x
+#define TIMES8(x) TIMES4(x), TIMES4(x)
+#define TIMES16(x) TIMES8(x), TIMES8(x)
+#define TIMES32(x) TIMES16(x), TIMES16(x)
+#define TIMES64(x) TIMES32(x), TIMES32(x)
static u8 count_class_lookup[256] = {
[0] = 0,
@@ -121,6 +121,7 @@ static u8 count_class_lookup[256] = {
[128] = TIMES64(128)
};
+
#undef TIMES64
#undef TIMES32
#undef TIMES16
diff --git a/src/afl-cc.c b/src/afl-cc.c
index 66f4860f..e6a6718e 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -879,7 +879,7 @@ static void edit_params(u32 argc, char **argv, char **envp) {
#ifndef __ANDROID__
- if (compiler_mode != GCC) {
+ if (compiler_mode != GCC && compiler_mode != CLANG) {
switch (bit_mode) {
@@ -1030,9 +1030,9 @@ int main(int argc, char **argv, char **envp) {
compiler_mode = GCC;
- } else if (strncmp(callname, "afl-clang", 9) == 0 &&
+ } else if (strcmp(callname, "afl-clang") == 0 ||
- strstr(callname, "fast") == NULL) {
+ strcmp(callname, "afl-clang++") == 0) {
compiler_mode = CLANG;
@@ -1076,13 +1076,13 @@ int main(int argc, char **argv, char **envp) {
}
- if (strncmp(callname, "afl-clang", 9) == 0 &&
- strstr(callname, "fast") == NULL) {
+ if (strcmp(callname, "afl-clang") == 0 ||
+ strcmp(callname, "afl-clang++") == 0) {
clang_mode = 1;
compiler_mode = CLANG;
- if (strncmp(callname, "afl-clang++", 11) == 0) { plusplus_mode = 1; }
+ if (strcmp(callname, "afl-clang++") == 0) { plusplus_mode = 1; }
}
@@ -1364,17 +1364,17 @@ int main(int argc, char **argv, char **envp) {
if (clang_mode) {
- instrument_mode = CLANG;
+ instrument_mode = INSTRUMENT_CLANG;
} else {
- instrument_mode = GCC;
+ instrument_mode = INSTRUMENT_GCC;
}
}
- if (compiler_mode == CLANG) { instrument_mode = CLANG; }
+ if (compiler_mode == CLANG) { instrument_mode = INSTRUMENT_CLANG; }
if (argc < 2 || strncmp(argv[1], "-h", 2) == 0) {
diff --git a/src/afl-common.c b/src/afl-common.c
index 6dc8abe0..1928663d 100644
--- a/src/afl-common.c
+++ b/src/afl-common.c
@@ -432,7 +432,9 @@ void check_environment_vars(char **envp) {
char *env, *val;
while ((env = envp[index++]) != NULL) {
- if (strncmp(env, "ALF_", 4) == 0) {
+ if (strncmp(env, "ALF_", 4) == 0 || strncmp(env, "_ALF", 4) == 0 ||
+ strncmp(env, "__ALF", 5) == 0 || strncmp(env, "_AFL", 4) == 0 ||
+ strncmp(env, "__AFL", 5) == 0) {
WARNF("Potentially mistyped AFL environment variable: %s", env);
issue_detected = 1;
@@ -628,6 +630,10 @@ u8 *stringify_float(u8 *buf, size_t len, double val) {
snprintf(buf, len, "%0.01f", val);
+ } else if (unlikely(isnan(val) || isinf(val))) {
+
+ strcpy(buf, "inf");
+
} else {
stringify_int(buf, len, (u64)val);
@@ -787,9 +793,9 @@ u8 *u_stringify_float(u8 *buf, double val) {
sprintf(buf, "%0.01f", val);
- } else if (unlikely(isnan(val) || isfinite(val))) {
+ } else if (unlikely(isnan(val) || isinf(val))) {
- strcpy(buf, "999.9");
+ strcpy(buf, "infinite");
} else {
diff --git a/src/afl-fuzz-bitmap.c b/src/afl-fuzz-bitmap.c
index 1cb9b15f..62a8211c 100644
--- a/src/afl-fuzz-bitmap.c
+++ b/src/afl-fuzz-bitmap.c
@@ -26,7 +26,7 @@
#include "afl-fuzz.h"
#include <limits.h>
#if !defined NAME_MAX
-#define NAME_MAX _XOPEN_NAME_MAX
+ #define NAME_MAX _XOPEN_NAME_MAX
#endif
/* Write bitmap to file. The bitmap is useful mostly for the secret
@@ -143,12 +143,14 @@ u32 count_non_255_bytes(afl_state_t *afl, u8 *mem) {
and replacing it with 0x80 or 0x01 depending on whether the tuple
is hit or not. Called on every new crash or timeout, should be
reasonably fast. */
-#define TIMES4(x) x,x,x,x
-#define TIMES8(x) TIMES4(x),TIMES4(x)
-#define TIMES16(x) TIMES8(x),TIMES8(x)
-#define TIMES32(x) TIMES16(x),TIMES16(x)
-#define TIMES64(x) TIMES32(x),TIMES32(x)
-#define TIMES255(x) TIMES64(x),TIMES64(x),TIMES64(x),TIMES32(x),TIMES16(x),TIMES8(x),TIMES4(x),x,x,x
+#define TIMES4(x) x, x, x, x
+#define TIMES8(x) TIMES4(x), TIMES4(x)
+#define TIMES16(x) TIMES8(x), TIMES8(x)
+#define TIMES32(x) TIMES16(x), TIMES16(x)
+#define TIMES64(x) TIMES32(x), TIMES32(x)
+#define TIMES255(x) \
+ TIMES64(x), TIMES64(x), TIMES64(x), TIMES32(x), TIMES16(x), TIMES8(x), \
+ TIMES4(x), x, x, x
const u8 simplify_lookup[256] = {
[0] = 1, [1] = TIMES255(128)
@@ -172,6 +174,7 @@ const u8 count_class_lookup8[256] = {
[128] = TIMES64(128)
};
+
#undef TIMES255
#undef TIMES64
#undef TIMES32
diff --git a/src/afl-fuzz-init.c b/src/afl-fuzz-init.c
index ec937f29..dbffa4f9 100644
--- a/src/afl-fuzz-init.c
+++ b/src/afl-fuzz-init.c
@@ -1667,20 +1667,21 @@ static void handle_existing_out_dir(afl_state_t *afl) {
if (afl->in_place_resume && rmdir(fn)) {
- time_t cur_t = time(0);
- struct tm *t = localtime(&cur_t);
+ time_t cur_t = time(0);
+ struct tm t;
+ localtime_r(&cur_t, &t);
#ifndef SIMPLE_FILES
- u8 *nfn = alloc_printf("%s.%04d-%02d-%02d-%02d:%02d:%02d", fn,
- t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
+ u8 *nfn =
+ alloc_printf("%s.%04d-%02d-%02d-%02d:%02d:%02d", fn, t.tm_year + 1900,
+ t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
#else
- u8 *nfn = alloc_printf("%s_%04d%02d%02d%02d%02d%02d", fn, t->tm_year + 1900,
- t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min,
- t->tm_sec);
+ u8 *nfn =
+ alloc_printf("%s_%04d%02d%02d%02d%02d%02d", fn, t.tm_year + 1900,
+ t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
#endif /* ^!SIMPLE_FILES */
@@ -1698,20 +1699,21 @@ static void handle_existing_out_dir(afl_state_t *afl) {
if (afl->in_place_resume && rmdir(fn)) {
- time_t cur_t = time(0);
- struct tm *t = localtime(&cur_t);
+ time_t cur_t = time(0);
+ struct tm t;
+ localtime_r(&cur_t, &t);
#ifndef SIMPLE_FILES
- u8 *nfn = alloc_printf("%s.%04d-%02d-%02d-%02d:%02d:%02d", fn,
- t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
- t->tm_hour, t->tm_min, t->tm_sec);
+ u8 *nfn =
+ alloc_printf("%s.%04d-%02d-%02d-%02d:%02d:%02d", fn, t.tm_year + 1900,
+ t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
#else
- u8 *nfn = alloc_printf("%s_%04d%02d%02d%02d%02d%02d", fn, t->tm_year + 1900,
- t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min,
- t->tm_sec);
+ u8 *nfn =
+ alloc_printf("%s_%04d%02d%02d%02d%02d%02d", fn, t.tm_year + 1900,
+ t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
#endif /* ^!SIMPLE_FILES */
diff --git a/src/afl-fuzz-queue.c b/src/afl-fuzz-queue.c
index 54afa17c..9a0d199e 100644
--- a/src/afl-fuzz-queue.c
+++ b/src/afl-fuzz-queue.c
@@ -45,25 +45,19 @@ inline u32 select_next_queue_entry(afl_state_t *afl) {
double compute_weight(afl_state_t *afl, struct queue_entry *q,
double avg_exec_us, double avg_bitmap_size) {
- u32 hits;
+ double weight = 1.0;
if (likely(afl->schedule >= FAST && afl->schedule <= RARE)) {
- hits = afl->n_fuzz[q->n_fuzz_entry];
- if (hits == 0) { hits = 1; }
-
- } else {
-
- hits = 1;
+ u32 hits = afl->n_fuzz[q->n_fuzz_entry];
+ if (likely(hits)) { weight *= log10(hits) + 1; }
}
- double weight = 1.0;
weight *= avg_exec_us / q->exec_us;
- weight *= log(q->bitmap_size) / avg_bitmap_size;
- weight /= log10(hits) + 1;
+ weight *= (log(q->bitmap_size) / avg_bitmap_size);
- if (q->favored) weight *= 5;
+ if (unlikely(q->favored)) weight *= 5;
return weight;
@@ -97,34 +91,43 @@ void create_alias_table(afl_state_t *afl) {
double avg_exec_us = 0.0;
double avg_bitmap_size = 0.0;
+ u32 active = 0;
+
for (i = 0; i < n; i++) {
struct queue_entry *q = afl->queue_buf[i];
- avg_exec_us += q->exec_us;
- avg_bitmap_size += log(q->bitmap_size);
+
+ // disabled entries might have timings and bitmap values
+ if (likely(!q->disabled)) {
+
+ avg_exec_us += q->exec_us;
+ avg_bitmap_size += log(q->bitmap_size);
+ ++active;
+
+ }
}
- avg_exec_us /= afl->queued_paths;
- avg_bitmap_size /= afl->queued_paths;
+ avg_exec_us /= active;
+ avg_bitmap_size /= active;
for (i = 0; i < n; i++) {
struct queue_entry *q = afl->queue_buf[i];
- if (!q->disabled) {
+ if (likely(!q->disabled)) {
q->weight = compute_weight(afl, q, avg_exec_us, avg_bitmap_size);
q->perf_score = calculate_score(afl, q);
+ sum += q->weight;
}
- sum += q->weight;
-
}
for (i = 0; i < n; i++) {
+ // weight is always 0 for disabled entries
P[i] = (afl->queue_buf[i]->weight * n) / sum;
}
@@ -143,8 +146,8 @@ void create_alias_table(afl_state_t *afl) {
for (i = 0; i < n; i++) {
- struct queue_entry *q = afl->queue_buf[i];
- P[i] = (q->perf_score * n) / sum;
+ // perf_score is always 0 for disabled entries
+ P[i] = (afl->queue_buf[i]->perf_score * n) / sum;
}
@@ -190,11 +193,39 @@ void create_alias_table(afl_state_t *afl) {
while (nS)
afl->alias_probability[S[--nS]] = 1;
+#ifdef INTROSPECTION
+ u8 fn[PATH_MAX];
+ snprintf(fn, PATH_MAX, "%s/introspection_corpus.txt", afl->out_dir);
+ FILE *f = fopen(fn, "a");
+ if (f) {
+
+ for (i = 0; i < n; i++) {
+
+ struct queue_entry *q = afl->queue_buf[i];
+ fprintf(
+ f,
+ "entry=%u name=%s favored=%s variable=%s disabled=%s len=%u "
+ "exec_us=%u "
+ "bitmap_size=%u bitsmap_size=%u tops=%u weight=%f perf_score=%f\n",
+ i, q->fname, q->favored ? "true" : "false",
+ q->var_behavior ? "true" : "false", q->disabled ? "true" : "false",
+ q->len, (u32)q->exec_us, q->bitmap_size, q->bitsmap_size, q->tc_ref,
+ q->weight, q->perf_score);
+
+ }
+
+ fprintf(f, "\n");
+ fclose(f);
+
+ }
+
+#endif
+
/*
- fprintf(stderr, " entry alias probability perf_score filename\n");
- for (u32 i = 0; i < n; ++i)
- fprintf(stderr, " %5u %5u %11u %0.9f %s\n", i, afl->alias_table[i],
- afl->alias_probability[i], afl->queue_buf[i]->perf_score,
+ fprintf(stderr, " entry alias probability perf_score weight
+ filename\n"); for (u32 i = 0; i < n; ++i) fprintf(stderr, " %5u %5u %11u
+ %0.9f %0.9f %s\n", i, afl->alias_table[i], afl->alias_probability[i],
+ afl->queue_buf[i]->perf_score, afl->queue_buf[i]->weight,
afl->queue_buf[i]->fname);
*/
@@ -398,6 +429,10 @@ void add_to_queue(afl_state_t *afl, u8 *fname, u32 len, u8 passed_det) {
q->trace_mini = NULL;
q->testcase_buf = NULL;
+#ifdef INTROSPECTION
+ q->bitsmap_size = afl->bitsmap_size;
+#endif
+
if (q->depth > afl->max_depth) { afl->max_depth = q->depth; }
if (afl->queue_top) {
diff --git a/src/afl-fuzz-redqueen.c b/src/afl-fuzz-redqueen.c
index 9a9ac33f..37d66aef 100644
--- a/src/afl-fuzz-redqueen.c
+++ b/src/afl-fuzz-redqueen.c
@@ -456,7 +456,8 @@ static u8 cmp_extend_encoding(afl_state_t *afl, struct cmp_header *h,
}
- if (SHAPE_BYTES(h->shape) >= 1 && *status != 1) {
+ /* avoid CodeQL warning on unsigned overflow */
+ if (/* SHAPE_BYTES(h->shape) >= 1 && */ *status != 1) {
if (its_len >= 1 && *buf_8 == (u8)pattern && *o_buf_8 == (u8)o_pattern) {
diff --git a/src/afl-fuzz-run.c b/src/afl-fuzz-run.c
index 32cca579..339fb9c3 100644
--- a/src/afl-fuzz-run.c
+++ b/src/afl-fuzz-run.c
@@ -29,7 +29,7 @@
#include <signal.h>
#include <limits.h>
#if !defined NAME_MAX
-#define NAME_MAX _XOPEN_NAME_MAX
+ #define NAME_MAX _XOPEN_NAME_MAX
#endif
#include "cmplog.h"
@@ -380,6 +380,10 @@ u8 calibrate_case(afl_state_t *afl, struct queue_entry *q, u8 *use_mem,
}
+#ifdef INTROSPECTION
+ if (unlikely(!q->bitsmap_size)) q->bitsmap_size = afl->bitsmap_size;
+#endif
+
classify_counts(&afl->fsrv);
cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
if (q->exec_cksum != cksum) {
diff --git a/src/afl-fuzz-state.c b/src/afl-fuzz-state.c
index 7053572b..34456c0d 100644
--- a/src/afl-fuzz-state.c
+++ b/src/afl-fuzz-state.c
@@ -100,7 +100,7 @@ void afl_state_init(afl_state_t *afl, uint32_t map_size) {
afl->cal_cycles_long = CAL_CYCLES_LONG;
afl->hang_tmout = EXEC_TIMEOUT;
afl->stats_update_freq = 1;
- afl->stats_avg_exec = -1;
+ afl->stats_avg_exec = 0;
afl->skip_deterministic = 1;
#ifndef NO_SPLICING
afl->use_splicing = 1;
diff --git a/src/afl-fuzz-stats.c b/src/afl-fuzz-stats.c
index 50e2ef15..1c211da6 100644
--- a/src/afl-fuzz-stats.c
+++ b/src/afl-fuzz-stats.c
@@ -120,8 +120,8 @@ void write_stats_file(afl_state_t *afl, double bitmap_cvg, double stability,
cur_time - afl->last_avg_exec_update >= 60000))) {
afl->last_avg_execs_saved =
- (float)(1000 * (afl->fsrv.total_execs - afl->last_avg_execs)) /
- (float)(cur_time - afl->last_avg_exec_update);
+ (double)(1000 * (afl->fsrv.total_execs - afl->last_avg_execs)) /
+ (double)(cur_time - afl->last_avg_exec_update);
afl->last_avg_execs = afl->fsrv.total_execs;
afl->last_avg_exec_update = cur_time;
@@ -369,30 +369,37 @@ void show_stats(afl_state_t *afl) {
/* Calculate smoothed exec speed stats. */
- if (!afl->stats_last_execs) {
+ if (unlikely(!afl->stats_last_execs)) {
- if (unlikely(cur_ms == afl->start_time)) --afl->start_time;
+ if (likely(cur_ms != afl->start_time)) {
- afl->stats_avg_exec =
- ((double)afl->fsrv.total_execs) * 1000 / (cur_ms - afl->start_time);
+ afl->stats_avg_exec =
+ ((double)afl->fsrv.total_execs) * 1000 / (cur_ms - afl->start_time);
+
+ }
} else {
- double cur_avg = ((double)(afl->fsrv.total_execs - afl->stats_last_execs)) *
- 1000 / (cur_ms - afl->stats_last_ms);
+ if (likely(cur_ms != afl->stats_last_ms)) {
- /* If there is a dramatic (5x+) jump in speed, reset the indicator
- more quickly. */
+ double cur_avg =
+ ((double)(afl->fsrv.total_execs - afl->stats_last_execs)) * 1000 /
+ (cur_ms - afl->stats_last_ms);
- if (cur_avg * 5 < afl->stats_avg_exec ||
- cur_avg / 5 > afl->stats_avg_exec) {
+ /* If there is a dramatic (5x+) jump in speed, reset the indicator
+ more quickly. */
- afl->stats_avg_exec = cur_avg;
+ if (cur_avg * 5 < afl->stats_avg_exec ||
+ cur_avg / 5 > afl->stats_avg_exec) {
- }
+ afl->stats_avg_exec = cur_avg;
- afl->stats_avg_exec = afl->stats_avg_exec * (1.0 - 1.0 / AVG_SMOOTHING) +
- cur_avg * (1.0 / AVG_SMOOTHING);
+ }
+
+ afl->stats_avg_exec = afl->stats_avg_exec * (1.0 - 1.0 / AVG_SMOOTHING) +
+ cur_avg * (1.0 / AVG_SMOOTHING);
+
+ }
}
diff --git a/src/afl-ld-lto.c b/src/afl-ld-lto.c
index 16feaa80..fccdb1a5 100644
--- a/src/afl-ld-lto.c
+++ b/src/afl-ld-lto.c
@@ -45,6 +45,10 @@
#include <dirent.h>
+#ifdef __APPLE__
+ #include <sys/syslimits.h>
+#endif
+
#define MAX_PARAM_COUNT 4096
static u8 **ld_params; /* Parameters passed to the real 'ld' */
diff --git a/src/afl-showmap.c b/src/afl-showmap.c
index b891632a..355b2dc3 100644
--- a/src/afl-showmap.c
+++ b/src/afl-showmap.c
@@ -98,17 +98,23 @@ static sharedmem_t * shm_fuzz;
/* Classify tuple counts. Instead of mapping to individual bits, as in
afl-fuzz.c, we map to more user-friendly numbers between 1 and 8. */
-#define TIMES4(x) x,x,x,x
-#define TIMES8(x) TIMES4(x),TIMES4(x)
-#define TIMES16(x) TIMES8(x),TIMES8(x)
-#define TIMES32(x) TIMES16(x),TIMES16(x)
-#define TIMES64(x) TIMES32(x),TIMES32(x)
-#define TIMES96(x) TIMES64(x),TIMES32(x)
-#define TIMES128(x) TIMES64(x),TIMES64(x)
+#define TIMES4(x) x, x, x, x
+#define TIMES8(x) TIMES4(x), TIMES4(x)
+#define TIMES16(x) TIMES8(x), TIMES8(x)
+#define TIMES32(x) TIMES16(x), TIMES16(x)
+#define TIMES64(x) TIMES32(x), TIMES32(x)
+#define TIMES96(x) TIMES64(x), TIMES32(x)
+#define TIMES128(x) TIMES64(x), TIMES64(x)
static const u8 count_class_human[256] = {
- [0] = 0, [1] = 1, [2] = 2, [3] = 3,
- [4] = TIMES4(4), [8] = TIMES8(5),[16] = TIMES16(6),[32] = TIMES96(7),
+ [0] = 0,
+ [1] = 1,
+ [2] = 2,
+ [3] = 3,
+ [4] = TIMES4(4),
+ [8] = TIMES8(5),
+ [16] = TIMES16(6),
+ [32] = TIMES96(7),
[128] = TIMES128(8)
};
@@ -126,6 +132,7 @@ static const u8 count_class_binary[256] = {
[128] = TIMES64(128)
};
+
#undef TIMES128
#undef TIMES96
#undef TIMES64
diff --git a/src/afl-tmin.c b/src/afl-tmin.c
index 6cb0d458..ed928c7c 100644
--- a/src/afl-tmin.c
+++ b/src/afl-tmin.c
@@ -98,11 +98,11 @@ static sharedmem_t * shm_fuzz;
/* Classify tuple counts. This is a slow & naive version, but good enough here.
*/
-#define TIMES4(x) x,x,x,x
-#define TIMES8(x) TIMES4(x),TIMES4(x)
-#define TIMES16(x) TIMES8(x),TIMES8(x)
-#define TIMES32(x) TIMES16(x),TIMES16(x)
-#define TIMES64(x) TIMES32(x),TIMES32(x)
+#define TIMES4(x) x, x, x, x
+#define TIMES8(x) TIMES4(x), TIMES4(x)
+#define TIMES16(x) TIMES8(x), TIMES8(x)
+#define TIMES32(x) TIMES16(x), TIMES16(x)
+#define TIMES64(x) TIMES32(x), TIMES32(x)
static const u8 count_class_lookup[256] = {
[0] = 0,
@@ -116,6 +116,7 @@ static const u8 count_class_lookup[256] = {
[128] = TIMES64(128)
};
+
#undef TIMES64
#undef TIMES32
#undef TIMES16