19e046f02SJonas Devlieghere //===-- CommandObjectReproducer.cpp -----------------------------*- C++ -*-===// 29e046f02SJonas Devlieghere // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69e046f02SJonas Devlieghere // 79e046f02SJonas Devlieghere //===----------------------------------------------------------------------===// 89e046f02SJonas Devlieghere 99e046f02SJonas Devlieghere #include "CommandObjectReproducer.h" 109e046f02SJonas Devlieghere 119e046f02SJonas Devlieghere #include "lldb/Utility/Reproducer.h" 129e046f02SJonas Devlieghere 13df14b942SJonas Devlieghere #include "lldb/Interpreter/CommandInterpreter.h" 149e046f02SJonas Devlieghere #include "lldb/Interpreter/CommandReturnObject.h" 159e046f02SJonas Devlieghere #include "lldb/Interpreter/OptionArgParser.h" 169e046f02SJonas Devlieghere #include "lldb/Interpreter/OptionGroupBoolean.h" 179e046f02SJonas Devlieghere 189e046f02SJonas Devlieghere using namespace lldb; 199e046f02SJonas Devlieghere using namespace lldb_private; 209e046f02SJonas Devlieghere 219e046f02SJonas Devlieghere class CommandObjectReproducerGenerate : public CommandObjectParsed { 229e046f02SJonas Devlieghere public: 239e046f02SJonas Devlieghere CommandObjectReproducerGenerate(CommandInterpreter &interpreter) 249e046f02SJonas Devlieghere : CommandObjectParsed(interpreter, "reproducer generate", 259e046f02SJonas Devlieghere "Generate reproducer on disk.", nullptr) {} 269e046f02SJonas Devlieghere 279e046f02SJonas Devlieghere ~CommandObjectReproducerGenerate() override = default; 289e046f02SJonas Devlieghere 299e046f02SJonas Devlieghere protected: 309e046f02SJonas Devlieghere bool DoExecute(Args &command, CommandReturnObject &result) override { 319e046f02SJonas Devlieghere if (!command.empty()) { 329e046f02SJonas Devlieghere result.AppendErrorWithFormat("'%s' takes no arguments", 339e046f02SJonas Devlieghere m_cmd_name.c_str()); 349e046f02SJonas Devlieghere return false; 359e046f02SJonas Devlieghere } 369e046f02SJonas Devlieghere 379e046f02SJonas Devlieghere auto &r = repro::Reproducer::Instance(); 389e046f02SJonas Devlieghere if (auto generator = r.GetGenerator()) { 399e046f02SJonas Devlieghere generator->Keep(); 409e046f02SJonas Devlieghere } else { 419e046f02SJonas Devlieghere result.AppendErrorWithFormat("Unable to get the reproducer generator"); 429e046f02SJonas Devlieghere return false; 439e046f02SJonas Devlieghere } 449e046f02SJonas Devlieghere 459e046f02SJonas Devlieghere result.GetOutputStream() 469e046f02SJonas Devlieghere << "Reproducer written to '" << r.GetReproducerPath() << "'\n"; 479e046f02SJonas Devlieghere 489e046f02SJonas Devlieghere result.SetStatus(eReturnStatusSuccessFinishResult); 499e046f02SJonas Devlieghere return result.Succeeded(); 509e046f02SJonas Devlieghere } 519e046f02SJonas Devlieghere }; 529e046f02SJonas Devlieghere 5315eacd74SJonas Devlieghere class CommandObjectReproducerStatus : public CommandObjectParsed { 549e046f02SJonas Devlieghere public: 5515eacd74SJonas Devlieghere CommandObjectReproducerStatus(CommandInterpreter &interpreter) 5615eacd74SJonas Devlieghere : CommandObjectParsed(interpreter, "reproducer status", 5715eacd74SJonas Devlieghere "Show the current reproducer status.", nullptr) {} 589e046f02SJonas Devlieghere 5915eacd74SJonas Devlieghere ~CommandObjectReproducerStatus() override = default; 609e046f02SJonas Devlieghere 619e046f02SJonas Devlieghere protected: 629e046f02SJonas Devlieghere bool DoExecute(Args &command, CommandReturnObject &result) override { 6315eacd74SJonas Devlieghere if (!command.empty()) { 6415eacd74SJonas Devlieghere result.AppendErrorWithFormat("'%s' takes no arguments", 659e046f02SJonas Devlieghere m_cmd_name.c_str()); 669e046f02SJonas Devlieghere return false; 679e046f02SJonas Devlieghere } 689e046f02SJonas Devlieghere 699e046f02SJonas Devlieghere auto &r = repro::Reproducer::Instance(); 7015eacd74SJonas Devlieghere if (auto generator = r.GetGenerator()) { 7115eacd74SJonas Devlieghere result.GetOutputStream() << "Reproducer is in capture mode.\n"; 7215eacd74SJonas Devlieghere } else if (auto generator = r.GetLoader()) { 7315eacd74SJonas Devlieghere result.GetOutputStream() << "Reproducer is in replay mode.\n"; 7415eacd74SJonas Devlieghere } else { 759e046f02SJonas Devlieghere 7615eacd74SJonas Devlieghere result.GetOutputStream() << "Reproducer is off.\n"; 779e046f02SJonas Devlieghere } 789e046f02SJonas Devlieghere 7915eacd74SJonas Devlieghere result.SetStatus(eReturnStatusSuccessFinishResult); 809e046f02SJonas Devlieghere return result.Succeeded(); 819e046f02SJonas Devlieghere } 829e046f02SJonas Devlieghere }; 839e046f02SJonas Devlieghere 849e046f02SJonas Devlieghere CommandObjectReproducer::CommandObjectReproducer( 859e046f02SJonas Devlieghere CommandInterpreter &interpreter) 869e046f02SJonas Devlieghere : CommandObjectMultiword(interpreter, "reproducer", 879e046f02SJonas Devlieghere "Commands controlling LLDB reproducers.", 889e046f02SJonas Devlieghere "log <subcommand> [<command-options>]") { 899e046f02SJonas Devlieghere LoadSubCommand( 909e046f02SJonas Devlieghere "generate", 919e046f02SJonas Devlieghere CommandObjectSP(new CommandObjectReproducerGenerate(interpreter))); 9215eacd74SJonas Devlieghere LoadSubCommand("status", CommandObjectSP( 9315eacd74SJonas Devlieghere new CommandObjectReproducerStatus(interpreter))); 949e046f02SJonas Devlieghere } 959e046f02SJonas Devlieghere 969e046f02SJonas Devlieghere CommandObjectReproducer::~CommandObjectReproducer() = default; 97