diff options
author | Kostya Serebryany <kcc@google.com> | 2015-01-31 01:14:40 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2015-01-31 01:14:40 +0000 |
commit | e8cee115707b21fa27212d66b2b046f7860a4cc8 (patch) | |
tree | 879abe896ca9d18c27865f5b6147cd6e1396b6c4 /llvm/lib/Fuzzer/FuzzerMain.cpp | |
parent | 303facbeb8d9fabbc84eb7eb526f4bd2a070e585 (diff) | |
download | bcm5719-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.cpp | 35 |
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; |