summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/FuzzerMain.cpp
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2015-01-31 01:14:40 +0000
committerKostya Serebryany <kcc@google.com>2015-01-31 01:14:40 +0000
commite8cee115707b21fa27212d66b2b046f7860a4cc8 (patch)
tree879abe896ca9d18c27865f5b6147cd6e1396b6c4 /llvm/lib/Fuzzer/FuzzerMain.cpp
parent303facbeb8d9fabbc84eb7eb526f4bd2a070e585 (diff)
downloadbcm5719-llvm-e8cee115707b21fa27212d66b2b046f7860a4cc8.tar.gz
bcm5719-llvm-e8cee115707b21fa27212d66b2b046f7860a4cc8.zip
[fuzzer] add flags to run fuzzer in multiple parallel processes
llvm-svn: 227664
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerMain.cpp')
-rw-r--r--llvm/lib/Fuzzer/FuzzerMain.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerMain.cpp b/llvm/lib/Fuzzer/FuzzerMain.cpp
index 03e0566049d..e0720b41bb0 100644
--- a/llvm/lib/Fuzzer/FuzzerMain.cpp
+++ b/llvm/lib/Fuzzer/FuzzerMain.cpp
@@ -15,6 +15,8 @@
#include <cstring>
#include <unistd.h>
#include <iostream>
+#include <thread>
+#include <atomic>
// ASAN options:
// * don't dump the coverage to disk.
@@ -102,6 +104,35 @@ static void ParseFlags(int argc, char **argv) {
}
}
+static void WorkerThread(const std::string &Cmd, std::atomic<int> *Counter,
+ int NumJobs) {
+ while (true) {
+ int C = (*Counter)++;
+ if (C >= NumJobs) return;
+ std::string ToRun = Cmd + " > fuzz-" + std::to_string(C) + ".log 2>&1\n";
+ if (Flags.verbosity)
+ std::cerr << ToRun;
+ system(ToRun.c_str());
+ }
+}
+
+static int RunInMultipleProcesses(int argc, char **argv, int NumWorkers,
+ int NumJobs) {
+ std::atomic<int> Counter(0);
+ std::string Cmd;
+ for (int i = 0; i < argc; i++) {
+ if (FlagValue(argv[i], "jobs") || FlagValue(argv[i], "workers")) continue;
+ Cmd += argv[i];
+ Cmd += " ";
+ }
+ std::vector<std::thread> V;
+ for (int i = 0; i < NumWorkers; i++)
+ V.push_back(std::thread(WorkerThread, Cmd, &Counter, NumJobs));
+ for (auto &T : V)
+ T.join();
+ return 0;
+}
+
int main(int argc, char **argv) {
using namespace fuzzer;
@@ -111,6 +142,10 @@ int main(int argc, char **argv) {
PrintHelp();
return 0;
}
+
+ if (Flags.workers > 0 && Flags.jobs > 0)
+ return RunInMultipleProcesses(argc, argv, Flags.workers, Flags.jobs);
+
Fuzzer::FuzzingOptions Options;
Options.Verbosity = Flags.verbosity;
Options.MaxLen = Flags.max_len;
OpenPOWER on IntegriCloud