[PowerPC] Remove wild call to RegScavenger::initRegState().
[oota-llvm.git] / tools / llvm-mc-fuzzer / llvm-mc-fuzzer.cpp
index 7b891325571c86ba3ad2f5db993c89a98fc0e3e0..3f80e4582ee1bc2e275a8677d4f535395c936717 100644 (file)
@@ -44,6 +44,12 @@ static cl::opt<std::string>
          cl::desc("Target a specific cpu type (-mcpu=help for details)"),
          cl::value_desc("cpu-name"), cl::init(""));
 
+// This is useful for variable-length instruction sets.
+static cl::opt<unsigned> InsnLimit(
+    "insn-limit",
+    cl::desc("Limit the number of instructions to process (0 for no limit)"),
+    cl::value_desc("count"), cl::init(0));
+
 static cl::list<std::string>
     MAttrs("mattr", cl::CommaSeparated,
            cl::desc("Target specific attributes (-mattr=help for details)"),
@@ -56,7 +62,7 @@ static cl::list<std::string>
                cl::desc("Options to pass to the fuzzer"), cl::ZeroOrMore,
                cl::PositionalEatsArgs);
 
-void DisassembleOneInput(const uint8_t *Data, size_t Size) {
+int DisassembleOneInput(const uint8_t *Data, size_t Size) {
   char AssemblyText[AssemblyTextBufSize];
 
   std::vector<uint8_t> DataCopy(Data, Data + Size);
@@ -67,13 +73,19 @@ void DisassembleOneInput(const uint8_t *Data, size_t Size) {
   assert(Ctx);
   uint8_t *p = DataCopy.data();
   unsigned Consumed;
+  unsigned InstructionsProcessed = 0;
   do {
     Consumed = LLVMDisasmInstruction(Ctx, p, Size, 0, AssemblyText,
                                      AssemblyTextBufSize);
     Size -= Consumed;
     p += Consumed;
+
+    InstructionsProcessed ++;
+    if (InsnLimit != 0 && InstructionsProcessed < InsnLimit)
+      break;
   } while (Consumed != 0);
   LLVMDisasmDispose(Ctx);
+  return 0;
 }
 
 int main(int argc, char **argv) {
@@ -116,13 +128,10 @@ int main(int argc, char **argv) {
     FeaturesStr = Features.getString();
   }
 
-  // Insert the program name into the FuzzerArgv.
-  FuzzerArgv.insert(FuzzerArgv.begin(), argv[0]);
-
   if (Action == AC_Assemble)
     errs() << "error: -assemble is not implemented\n";
   else if (Action == AC_Disassemble)
-    return fuzzer::FuzzerDriver(FuzzerArgv, DisassembleOneInput);
+    return fuzzer::FuzzerDriver(argc, argv, DisassembleOneInput);
 
   llvm_unreachable("Unknown action");
   return 1;