1 //===-- CommandObjectReproducer.cpp -----------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "CommandObjectReproducer.h" 10 11 #include "lldb/Utility/Reproducer.h" 12 13 #include "lldb/Interpreter/CommandInterpreter.h" 14 #include "lldb/Interpreter/CommandReturnObject.h" 15 #include "lldb/Interpreter/OptionArgParser.h" 16 #include "lldb/Interpreter/OptionGroupBoolean.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 class CommandObjectReproducerGenerate : public CommandObjectParsed { 22 public: 23 CommandObjectReproducerGenerate(CommandInterpreter &interpreter) 24 : CommandObjectParsed(interpreter, "reproducer generate", 25 "Generate reproducer on disk.", nullptr) {} 26 27 ~CommandObjectReproducerGenerate() override = default; 28 29 protected: 30 bool DoExecute(Args &command, CommandReturnObject &result) override { 31 if (!command.empty()) { 32 result.AppendErrorWithFormat("'%s' takes no arguments", 33 m_cmd_name.c_str()); 34 return false; 35 } 36 37 auto &r = repro::Reproducer::Instance(); 38 if (auto generator = r.GetGenerator()) { 39 generator->Keep(); 40 } else { 41 result.AppendErrorWithFormat("Unable to get the reproducer generator"); 42 return false; 43 } 44 45 result.GetOutputStream() 46 << "Reproducer written to '" << r.GetReproducerPath() << "'\n"; 47 48 result.SetStatus(eReturnStatusSuccessFinishResult); 49 return result.Succeeded(); 50 } 51 }; 52 53 class CommandObjectReproducerStatus : public CommandObjectParsed { 54 public: 55 CommandObjectReproducerStatus(CommandInterpreter &interpreter) 56 : CommandObjectParsed(interpreter, "reproducer status", 57 "Show the current reproducer status.", nullptr) {} 58 59 ~CommandObjectReproducerStatus() override = default; 60 61 protected: 62 bool DoExecute(Args &command, CommandReturnObject &result) override { 63 if (!command.empty()) { 64 result.AppendErrorWithFormat("'%s' takes no arguments", 65 m_cmd_name.c_str()); 66 return false; 67 } 68 69 auto &r = repro::Reproducer::Instance(); 70 if (r.GetGenerator()) { 71 result.GetOutputStream() << "Reproducer is in capture mode.\n"; 72 } else if (r.GetLoader()) { 73 result.GetOutputStream() << "Reproducer is in replay mode.\n"; 74 } else { 75 result.GetOutputStream() << "Reproducer is off.\n"; 76 } 77 78 result.SetStatus(eReturnStatusSuccessFinishResult); 79 return result.Succeeded(); 80 } 81 }; 82 83 CommandObjectReproducer::CommandObjectReproducer( 84 CommandInterpreter &interpreter) 85 : CommandObjectMultiword(interpreter, "reproducer", 86 "Commands controlling LLDB reproducers.", 87 "log <subcommand> [<command-options>]") { 88 LoadSubCommand( 89 "generate", 90 CommandObjectSP(new CommandObjectReproducerGenerate(interpreter))); 91 LoadSubCommand("status", CommandObjectSP( 92 new CommandObjectReproducerStatus(interpreter))); 93 } 94 95 CommandObjectReproducer::~CommandObjectReproducer() = default; 96