summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2016-12-17 08:20:24 +0000
committerKostya Serebryany <kcc@google.com>2016-12-17 08:20:24 +0000
commit1e438a1dbae0c5c37aabe99becd279a0ccfb7566 (patch)
treeeb9a0ab0bb164e5b20a8e8f82552940d1415ae38
parentbf594a560089552d861d72764256fa469296b97b (diff)
downloadbcm5719-llvm-1e438a1dbae0c5c37aabe99becd279a0ccfb7566.tar.gz
bcm5719-llvm-1e438a1dbae0c5c37aabe99becd279a0ccfb7566.zip
[libFuzzer] use less memory for merge
llvm-svn: 290039
-rw-r--r--llvm/lib/Fuzzer/FuzzerMerge.cpp13
-rw-r--r--llvm/lib/Fuzzer/FuzzerMerge.h2
-rw-r--r--llvm/lib/Fuzzer/test/FuzzerUnittest.cpp7
3 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerMerge.cpp b/llvm/lib/Fuzzer/FuzzerMerge.cpp
index 38479953a77..84660e0fe53 100644
--- a/llvm/lib/Fuzzer/FuzzerMerge.cpp
+++ b/llvm/lib/Fuzzer/FuzzerMerge.cpp
@@ -94,10 +94,11 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) {
return false;
LastSeenStartMarker = kInvalidStartMarker;
if (ParseCoverage) {
- while (!ISS1.rdstate()) {
- ISS1 >> std::hex >> N;
- Files[CurrentFileIdx].Features.insert(N);
- }
+ auto &V = Files[CurrentFileIdx].Features;
+ V.clear();
+ while (ISS1 >> std::hex >> N)
+ V.push_back(N);
+ std::sort(V.begin(), V.end());
}
} else {
return false;
@@ -115,7 +116,7 @@ bool Merger::Parse(std::istream &IS, bool ParseCoverage) {
size_t Merger::Merge(std::vector<std::string> *NewFiles) {
NewFiles->clear();
assert(NumFilesInFirstCorpus <= Files.size());
- std::set<size_t> AllFeatures;
+ std::set<uint32_t> AllFeatures;
// What features are in the initial corpus?
for (size_t i = 0; i < NumFilesInFirstCorpus; i++) {
@@ -127,7 +128,7 @@ size_t Merger::Merge(std::vector<std::string> *NewFiles) {
// Remove all features that we already know from all other inputs.
for (size_t i = NumFilesInFirstCorpus; i < Files.size(); i++) {
auto &Cur = Files[i].Features;
- std::set<size_t> Tmp;
+ std::vector<uint32_t> Tmp;
std::set_difference(Cur.begin(), Cur.end(), AllFeatures.begin(),
AllFeatures.end(), std::inserter(Tmp, Tmp.begin()));
Cur.swap(Tmp);
diff --git a/llvm/lib/Fuzzer/FuzzerMerge.h b/llvm/lib/Fuzzer/FuzzerMerge.h
index d00349a953a..8a2fe5d74f8 100644
--- a/llvm/lib/Fuzzer/FuzzerMerge.h
+++ b/llvm/lib/Fuzzer/FuzzerMerge.h
@@ -50,7 +50,7 @@ namespace fuzzer {
struct MergeFileInfo {
std::string Name;
size_t Size = 0;
- std::set<size_t> Features;
+ std::vector<uint32_t> Features;
};
struct Merger {
diff --git a/llvm/lib/Fuzzer/test/FuzzerUnittest.cpp b/llvm/lib/Fuzzer/test/FuzzerUnittest.cpp
index aab326229a8..4992ef57b6c 100644
--- a/llvm/lib/Fuzzer/test/FuzzerUnittest.cpp
+++ b/llvm/lib/Fuzzer/test/FuzzerUnittest.cpp
@@ -620,7 +620,7 @@ TEST(Merge, Bad) {
}
}
-void EQ(const std::set<size_t> &A, const std::set<size_t> &B) {
+void EQ(const std::vector<uint32_t> &A, const std::vector<uint32_t> &B) {
EXPECT_EQ(A, B);
}
@@ -699,8 +699,11 @@ TEST(Merge, Good) {
EXPECT_TRUE(M.Parse("3\n1\nA\nB\nC\n"
"STARTED 0 1000\nDONE 0 1 2 3\n"
"STARTED 1 1001\nDONE 1 4 5 6 \n"
- "STARTED 2 1002\nDONE 2 6 1 3 \n"
+ "STARTED 2 1002\nDONE 2 6 1 3\n"
"", true));
+ EQ(M.Files[0].Features, {1, 2, 3});
+ EQ(M.Files[1].Features, {4, 5, 6});
+ EQ(M.Files[2].Features, {1, 3, 6});
EXPECT_EQ(3U, M.Merge(&NewFiles));
EQ(NewFiles, {"B"});
}
OpenPOWER on IntegriCloud