Path: blob/main/contrib/llvm-project/lldb/source/Commands/CommandObjectDiagnostics.cpp
39587 views
//===-- CommandObjectDiagnostics.cpp --------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "CommandObjectDiagnostics.h"9#include "lldb/Host/OptionParser.h"10#include "lldb/Interpreter/CommandOptionArgumentTable.h"11#include "lldb/Interpreter/CommandReturnObject.h"12#include "lldb/Interpreter/OptionArgParser.h"13#include "lldb/Interpreter/OptionValueEnumeration.h"14#include "lldb/Interpreter/OptionValueUInt64.h"15#include "lldb/Interpreter/Options.h"16#include "lldb/Utility/Diagnostics.h"1718using namespace lldb;19using namespace lldb_private;2021#define LLDB_OPTIONS_diagnostics_dump22#include "CommandOptions.inc"2324class CommandObjectDiagnosticsDump : public CommandObjectParsed {25public:26// Constructors and Destructors27CommandObjectDiagnosticsDump(CommandInterpreter &interpreter)28: CommandObjectParsed(interpreter, "diagnostics dump",29"Dump diagnostics to disk", nullptr) {}3031~CommandObjectDiagnosticsDump() override = default;3233class CommandOptions : public Options {34public:35CommandOptions() = default;3637~CommandOptions() override = default;3839Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,40ExecutionContext *execution_context) override {41Status error;42const int short_option = m_getopt_table[option_idx].val;4344switch (short_option) {45case 'd':46directory.SetDirectory(option_arg);47break;48default:49llvm_unreachable("Unimplemented option");50}51return error;52}5354void OptionParsingStarting(ExecutionContext *execution_context) override {55directory.Clear();56}5758llvm::ArrayRef<OptionDefinition> GetDefinitions() override {59return llvm::ArrayRef(g_diagnostics_dump_options);60}6162FileSpec directory;63};6465Options *GetOptions() override { return &m_options; }6667protected:68llvm::Expected<FileSpec> GetDirectory() {69if (m_options.directory) {70auto ec =71llvm::sys::fs::create_directories(m_options.directory.GetPath());72if (ec)73return llvm::errorCodeToError(ec);74return m_options.directory;75}76return Diagnostics::CreateUniqueDirectory();77}7879void DoExecute(Args &args, CommandReturnObject &result) override {80llvm::Expected<FileSpec> directory = GetDirectory();8182if (!directory) {83result.AppendError(llvm::toString(directory.takeError()));84return;85}8687llvm::Error error = Diagnostics::Instance().Create(*directory);88if (error) {89result.AppendErrorWithFormat("failed to write diagnostics to %s",90directory->GetPath().c_str());91result.AppendError(llvm::toString(std::move(error)));92return;93}9495result.GetOutputStream() << "diagnostics written to " << *directory << '\n';9697result.SetStatus(eReturnStatusSuccessFinishResult);98return;99}100101CommandOptions m_options;102};103104CommandObjectDiagnostics::CommandObjectDiagnostics(105CommandInterpreter &interpreter)106: CommandObjectMultiword(interpreter, "diagnostics",107"Commands controlling LLDB diagnostics.",108"diagnostics <subcommand> [<command-options>]") {109LoadSubCommand(110"dump", CommandObjectSP(new CommandObjectDiagnosticsDump(interpreter)));111}112113CommandObjectDiagnostics::~CommandObjectDiagnostics() = default;114115116