114 lines · cpp
1//===-- CommandObjectDiagnostics.cpp --------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "CommandObjectDiagnostics.h"10#include "lldb/Host/OptionParser.h"11#include "lldb/Interpreter/CommandOptionArgumentTable.h"12#include "lldb/Interpreter/CommandReturnObject.h"13#include "lldb/Interpreter/OptionArgParser.h"14#include "lldb/Interpreter/OptionValueEnumeration.h"15#include "lldb/Interpreter/OptionValueUInt64.h"16#include "lldb/Interpreter/Options.h"17#include "lldb/Utility/Diagnostics.h"18 19using namespace lldb;20using namespace lldb_private;21 22#define LLDB_OPTIONS_diagnostics_dump23#include "CommandOptions.inc"24 25class CommandObjectDiagnosticsDump : public CommandObjectParsed {26public:27 // Constructors and Destructors28 CommandObjectDiagnosticsDump(CommandInterpreter &interpreter)29 : CommandObjectParsed(interpreter, "diagnostics dump",30 "Dump diagnostics to disk", nullptr) {}31 32 ~CommandObjectDiagnosticsDump() override = default;33 34 class CommandOptions : public Options {35 public:36 CommandOptions() = default;37 38 ~CommandOptions() override = default;39 40 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,41 ExecutionContext *execution_context) override {42 Status error;43 const int short_option = m_getopt_table[option_idx].val;44 45 switch (short_option) {46 case 'd':47 directory.SetDirectory(option_arg);48 break;49 default:50 llvm_unreachable("Unimplemented option");51 }52 return error;53 }54 55 void OptionParsingStarting(ExecutionContext *execution_context) override {56 directory.Clear();57 }58 59 llvm::ArrayRef<OptionDefinition> GetDefinitions() override {60 return llvm::ArrayRef(g_diagnostics_dump_options);61 }62 63 FileSpec directory;64 };65 66 Options *GetOptions() override { return &m_options; }67 68protected:69 llvm::Expected<FileSpec> GetDirectory() {70 if (m_options.directory) {71 auto ec =72 llvm::sys::fs::create_directories(m_options.directory.GetPath());73 if (ec)74 return llvm::errorCodeToError(ec);75 return m_options.directory;76 }77 return Diagnostics::CreateUniqueDirectory();78 }79 80 void DoExecute(Args &args, CommandReturnObject &result) override {81 llvm::Expected<FileSpec> directory = GetDirectory();82 83 if (!directory) {84 result.AppendError(llvm::toString(directory.takeError()));85 return;86 }87 88 llvm::Error error = Diagnostics::Instance().Create(*directory);89 if (error) {90 result.AppendErrorWithFormat("failed to write diagnostics to %s",91 directory->GetPath().c_str());92 result.AppendError(llvm::toString(std::move(error)));93 return;94 }95 96 result.GetOutputStream() << "diagnostics written to " << *directory << '\n';97 98 result.SetStatus(eReturnStatusSuccessFinishResult);99 }100 101 CommandOptions m_options;102};103 104CommandObjectDiagnostics::CommandObjectDiagnostics(105 CommandInterpreter &interpreter)106 : CommandObjectMultiword(interpreter, "diagnostics",107 "Commands controlling LLDB diagnostics.",108 "diagnostics <subcommand> [<command-options>]") {109 LoadSubCommand(110 "dump", CommandObjectSP(new CommandObjectDiagnosticsDump(interpreter)));111}112 113CommandObjectDiagnostics::~CommandObjectDiagnostics() = default;114