Use a continue to reduce indentation.
[oota-llvm.git] / lib / Fuzzer / FuzzerUtil.cpp
index 679f289a1c37e8c352e846b210a68f543d743a3c..e381c04063217982b97ea3cdca5e6d922af361db 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #include "FuzzerInternal.h"
-#include <iostream>
+#include <sstream>
+#include <iomanip>
 #include <sys/time.h>
 #include <cassert>
 #include <cstring>
 #include <signal.h>
+#include <unistd.h>
 
 namespace fuzzer {
 
 void Print(const Unit &v, const char *PrintAfter) {
-  std::cerr << v.size() << ": ";
   for (auto x : v)
-    std::cerr << (unsigned) x << " ";
-  std::cerr << PrintAfter;
+    Printf("0x%x,", (unsigned) x);
+  Printf("%s", PrintAfter);
 }
 
 void PrintASCII(const Unit &U, const char *PrintAfter) {
-  for (auto X : U)
-    std::cerr << (char)((isascii(X) && X >= ' ') ? X : '?');
-  std::cerr << PrintAfter;
+  for (auto X : U) {
+    if (isprint(X))
+      Printf("%c", X);
+    else
+      Printf("\\x%x", (unsigned)X);
+  }
+  Printf("%s", PrintAfter);
 }
 
-std::string Hash(const Unit &in) {
-  size_t h1 = 0, h2 = 0;
-  for (auto x : in) {
-    h1 += x;
-    h1 *= 5;
-    h2 += x;
-    h2 *= 7;
-  }
-  return std::to_string(h1) + std::to_string(h2);
+std::string Hash(const Unit &U) {
+  uint8_t Hash[kSHA1NumBytes];
+  ComputeSHA1(U.data(), U.size(), Hash);
+  std::stringstream SS;
+  for (int i = 0; i < kSHA1NumBytes; i++)
+    SS << std::hex << std::setfill('0') << std::setw(2) << (unsigned)Hash[i];
+  return SS.str();
 }
 
 static void AlarmHandler(int, siginfo_t *, void *) {
-  Fuzzer::AlarmCallback();
+  Fuzzer::StaticAlarmCallback();
 }
 
 void SetTimer(int Seconds) {
   struct itimerval T {{Seconds, 0}, {Seconds, 0}};
-  std::cerr << "SetTimer " << Seconds << "\n";
+  Printf("SetTimer %d\n", Seconds);
   int Res = setitimer(ITIMER_REAL, &T, nullptr);
   assert(Res == 0);
   struct sigaction sigact;
@@ -58,4 +61,16 @@ void SetTimer(int Seconds) {
   assert(Res == 0);
 }
 
+int NumberOfCpuCores() {
+  FILE *F = popen("nproc", "r");
+  int N = 0;
+  fscanf(F, "%d", &N);
+  fclose(F);
+  return N;
+}
+
+void ExecuteCommand(const std::string &Command) {
+  system(Command.c_str());
+}
+
 }  // namespace fuzzer