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