summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2016-08-30 03:05:50 +0000
committerKostya Serebryany <kcc@google.com>2016-08-30 03:05:50 +0000
commitd4492f81011df9dd12ff78275b45bb81093700c7 (patch)
treea4b97afdf5518646ff1eabeeaf54802592da04fe
parent84832a7a795033386bd80cc8028ef2a8b23692a9 (diff)
downloadbcm5719-llvm-d4492f81011df9dd12ff78275b45bb81093700c7.tar.gz
bcm5719-llvm-d4492f81011df9dd12ff78275b45bb81093700c7.zip
[libFuzzer] use bits instead of bytes for memcmp/strcmp value profile -- the fuzzer reaches the goal much faster, at least on the simple puzzles
llvm-svn: 280054
-rw-r--r--llvm/lib/Fuzzer/FuzzerTraceState.cpp28
-rw-r--r--llvm/lib/Fuzzer/test/value-profile-mem.test6
2 files changed, 21 insertions, 13 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerTraceState.cpp b/llvm/lib/Fuzzer/FuzzerTraceState.cpp
index 7bbc7591fbd..732e1a44fac 100644
--- a/llvm/lib/Fuzzer/FuzzerTraceState.cpp
+++ b/llvm/lib/Fuzzer/FuzzerTraceState.cpp
@@ -552,26 +552,34 @@ static void AddValueForMemcmp(void *caller_pc, const void *s1, const void *s2,
size_t n) {
if (!n) return;
size_t Len = std::min(n, (size_t)32);
- const char *A1 = reinterpret_cast<const char *>(s1);
- const char *A2 = reinterpret_cast<const char *>(s2);
- size_t LastSameByte = 0;
- for (; LastSameByte < Len; LastSameByte++)
- if (A1[LastSameByte] != A2[LastSameByte])
+ const uint8_t *A1 = reinterpret_cast<const uint8_t *>(s1);
+ const uint8_t *A2 = reinterpret_cast<const uint8_t *>(s2);
+ size_t I = 0;
+ for (; I < Len; I++)
+ if (A1[I] != A2[I])
break;
size_t PC = reinterpret_cast<size_t>(caller_pc);
- VP.AddValue((PC & 4095) | (LastSameByte << 12));
+ size_t Idx = I * 8;
+ if (I < Len)
+ Idx += __builtin_popcountl((A1[I] ^ A2[I])) - 1;
+ VP.AddValue((PC & 4095) | (Idx << 12));
}
static void AddValueForStrcmp(void *caller_pc, const char *s1, const char *s2,
size_t n) {
if (!n) return;
size_t Len = std::min(n, (size_t)32);
- size_t LastSameByte = 0;
- for (; LastSameByte < Len; LastSameByte++)
- if (s1[LastSameByte] != s2[LastSameByte] || s1[LastSameByte] == 0)
+ const uint8_t *A1 = reinterpret_cast<const uint8_t *>(s1);
+ const uint8_t *A2 = reinterpret_cast<const uint8_t *>(s2);
+ size_t I = 0;
+ for (; I < Len; I++)
+ if (A1[I] != A2[I] || A1[I] == 0)
break;
size_t PC = reinterpret_cast<size_t>(caller_pc);
- VP.AddValue((PC & 4095) | (LastSameByte << 12));
+ size_t Idx = I * 8;
+ if (I < Len && A1[I])
+ Idx += __builtin_popcountl((A1[I] ^ A2[I])) - 1;
+ VP.AddValue((PC & 4095) | (Idx << 12));
}
ATTRIBUTE_TARGET_POPCNT
diff --git a/llvm/lib/Fuzzer/test/value-profile-mem.test b/llvm/lib/Fuzzer/test/value-profile-mem.test
index 60cc67fe72e..059fec85f0e 100644
--- a/llvm/lib/Fuzzer/test/value-profile-mem.test
+++ b/llvm/lib/Fuzzer/test/value-profile-mem.test
@@ -1,4 +1,4 @@
CHECK: BINGO
-RUN: not LLVMFuzzer-SingleMemcmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=10000000 2>&1 | FileCheck %s
-RUN: not LLVMFuzzer-SingleStrcmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=10000000 2>&1 | FileCheck %s
-RUN: not LLVMFuzzer-SingleStrncmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=10000000 2>&1 | FileCheck %s
+RUN: not LLVMFuzzer-SingleMemcmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=1000000 2>&1 | FileCheck %s
+RUN: not LLVMFuzzer-SingleStrcmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=1000000 2>&1 | FileCheck %s
+RUN: not LLVMFuzzer-SingleStrncmpTest -seed=1 -use_memcmp=0 -use_value_profile=1 -runs=1000000 2>&1 | FileCheck %s
OpenPOWER on IntegriCloud