19e046f02SJonas Devlieghere //===-- CommandObjectReproducer.cpp -----------------------------*- C++ -*-===//
29e046f02SJonas Devlieghere //
39e046f02SJonas Devlieghere //                     The LLVM Compiler Infrastructure
49e046f02SJonas Devlieghere //
59e046f02SJonas Devlieghere // This file is distributed under the University of Illinois Open Source
69e046f02SJonas Devlieghere // License. See LICENSE.TXT for details.
79e046f02SJonas Devlieghere //
89e046f02SJonas Devlieghere //===----------------------------------------------------------------------===//
99e046f02SJonas Devlieghere 
109e046f02SJonas Devlieghere #include "CommandObjectReproducer.h"
119e046f02SJonas Devlieghere 
129e046f02SJonas Devlieghere #include "lldb/Utility/Reproducer.h"
139e046f02SJonas Devlieghere 
14df14b942SJonas Devlieghere #include "lldb/Interpreter/CommandInterpreter.h"
159e046f02SJonas Devlieghere #include "lldb/Interpreter/CommandReturnObject.h"
169e046f02SJonas Devlieghere #include "lldb/Interpreter/OptionArgParser.h"
179e046f02SJonas Devlieghere #include "lldb/Interpreter/OptionGroupBoolean.h"
189e046f02SJonas Devlieghere 
199e046f02SJonas Devlieghere using namespace lldb;
209e046f02SJonas Devlieghere using namespace lldb_private;
219e046f02SJonas Devlieghere 
229e046f02SJonas Devlieghere class CommandObjectReproducerGenerate : public CommandObjectParsed {
239e046f02SJonas Devlieghere public:
249e046f02SJonas Devlieghere   CommandObjectReproducerGenerate(CommandInterpreter &interpreter)
259e046f02SJonas Devlieghere       : CommandObjectParsed(interpreter, "reproducer generate",
269e046f02SJonas Devlieghere                             "Generate reproducer on disk.", nullptr) {}
279e046f02SJonas Devlieghere 
289e046f02SJonas Devlieghere   ~CommandObjectReproducerGenerate() override = default;
299e046f02SJonas Devlieghere 
309e046f02SJonas Devlieghere protected:
319e046f02SJonas Devlieghere   bool DoExecute(Args &command, CommandReturnObject &result) override {
329e046f02SJonas Devlieghere     if (!command.empty()) {
339e046f02SJonas Devlieghere       result.AppendErrorWithFormat("'%s' takes no arguments",
349e046f02SJonas Devlieghere                                    m_cmd_name.c_str());
359e046f02SJonas Devlieghere       return false;
369e046f02SJonas Devlieghere     }
379e046f02SJonas Devlieghere 
389e046f02SJonas Devlieghere     auto &r = repro::Reproducer::Instance();
399e046f02SJonas Devlieghere     if (auto generator = r.GetGenerator()) {
409e046f02SJonas Devlieghere       generator->Keep();
419e046f02SJonas Devlieghere     } else {
429e046f02SJonas Devlieghere       result.AppendErrorWithFormat("Unable to get the reproducer generator");
439e046f02SJonas Devlieghere       return false;
449e046f02SJonas Devlieghere     }
459e046f02SJonas Devlieghere 
469e046f02SJonas Devlieghere     result.GetOutputStream()
479e046f02SJonas Devlieghere         << "Reproducer written to '" << r.GetReproducerPath() << "'\n";
489e046f02SJonas Devlieghere 
499e046f02SJonas Devlieghere     result.SetStatus(eReturnStatusSuccessFinishResult);
509e046f02SJonas Devlieghere     return result.Succeeded();
519e046f02SJonas Devlieghere   }
529e046f02SJonas Devlieghere };
539e046f02SJonas Devlieghere 
54*15eacd74SJonas Devlieghere class CommandObjectReproducerStatus : public CommandObjectParsed {
559e046f02SJonas Devlieghere public:
56*15eacd74SJonas Devlieghere   CommandObjectReproducerStatus(CommandInterpreter &interpreter)
57*15eacd74SJonas Devlieghere       : CommandObjectParsed(interpreter, "reproducer status",
58*15eacd74SJonas Devlieghere                             "Show the current reproducer status.", nullptr) {}
599e046f02SJonas Devlieghere 
60*15eacd74SJonas Devlieghere   ~CommandObjectReproducerStatus() override = default;
619e046f02SJonas Devlieghere 
629e046f02SJonas Devlieghere protected:
639e046f02SJonas Devlieghere   bool DoExecute(Args &command, CommandReturnObject &result) override {
64*15eacd74SJonas Devlieghere     if (!command.empty()) {
65*15eacd74SJonas Devlieghere       result.AppendErrorWithFormat("'%s' takes no arguments",
669e046f02SJonas Devlieghere                                    m_cmd_name.c_str());
679e046f02SJonas Devlieghere       return false;
689e046f02SJonas Devlieghere     }
699e046f02SJonas Devlieghere 
709e046f02SJonas Devlieghere     auto &r = repro::Reproducer::Instance();
71*15eacd74SJonas Devlieghere     if (auto generator = r.GetGenerator()) {
72*15eacd74SJonas Devlieghere       result.GetOutputStream() << "Reproducer is in capture mode.\n";
73*15eacd74SJonas Devlieghere     } else if (auto generator = r.GetLoader()) {
74*15eacd74SJonas Devlieghere       result.GetOutputStream() << "Reproducer is in replay mode.\n";
75*15eacd74SJonas Devlieghere     } else {
769e046f02SJonas Devlieghere 
77*15eacd74SJonas Devlieghere       result.GetOutputStream() << "Reproducer is off.\n";
789e046f02SJonas Devlieghere     }
799e046f02SJonas Devlieghere 
80*15eacd74SJonas Devlieghere     result.SetStatus(eReturnStatusSuccessFinishResult);
819e046f02SJonas Devlieghere     return result.Succeeded();
829e046f02SJonas Devlieghere   }
839e046f02SJonas Devlieghere };
849e046f02SJonas Devlieghere 
859e046f02SJonas Devlieghere CommandObjectReproducer::CommandObjectReproducer(
869e046f02SJonas Devlieghere     CommandInterpreter &interpreter)
879e046f02SJonas Devlieghere     : CommandObjectMultiword(interpreter, "reproducer",
889e046f02SJonas Devlieghere                              "Commands controlling LLDB reproducers.",
899e046f02SJonas Devlieghere                              "log <subcommand> [<command-options>]") {
909e046f02SJonas Devlieghere   LoadSubCommand(
919e046f02SJonas Devlieghere       "generate",
929e046f02SJonas Devlieghere       CommandObjectSP(new CommandObjectReproducerGenerate(interpreter)));
93*15eacd74SJonas Devlieghere   LoadSubCommand("status", CommandObjectSP(
94*15eacd74SJonas Devlieghere                                new CommandObjectReproducerStatus(interpreter)));
959e046f02SJonas Devlieghere }
969e046f02SJonas Devlieghere 
979e046f02SJonas Devlieghere CommandObjectReproducer::~CommandObjectReproducer() = default;
98