1//===-- CommandObjectDisassemble.h ------------------------------*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
10#define LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
11
12#include "lldb/Interpreter/CommandObject.h"
13#include "lldb/Interpreter/Options.h"
14#include "lldb/Utility/ArchSpec.h"
15
16namespace lldb_private {
17
18// CommandObjectDisassemble
19
20class CommandObjectDisassemble : public CommandObjectParsed {
21public:
22  class CommandOptions : public Options {
23  public:
24    CommandOptions();
25
26    ~CommandOptions() override;
27
28    Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
29                          ExecutionContext *execution_context) override;
30
31    void OptionParsingStarting(ExecutionContext *execution_context) override;
32
33    llvm::ArrayRef<OptionDefinition> GetDefinitions() override;
34
35    const char *GetPluginName() {
36      return (plugin_name.empty() ? nullptr : plugin_name.c_str());
37    }
38
39    const char *GetFlavorString() {
40      if (flavor_string.empty() || flavor_string == "default")
41        return nullptr;
42      return flavor_string.c_str();
43    }
44
45    Status OptionParsingFinished(ExecutionContext *execution_context) override;
46
47    bool show_mixed; // Show mixed source/assembly
48    bool show_bytes;
49    uint32_t num_lines_context;
50    uint32_t num_instructions;
51    bool raw;
52    std::string func_name;
53    bool current_function;
54    lldb::addr_t start_addr;
55    lldb::addr_t end_addr;
56    bool at_pc;
57    bool frame_line;
58    std::string plugin_name;
59    std::string flavor_string;
60    ArchSpec arch;
61    bool some_location_specified; // If no location was specified, we'll select
62                                  // "at_pc".  This should be set
63    // in SetOptionValue if anything the selects a location is set.
64    lldb::addr_t symbol_containing_addr;
65    bool force = false;
66  };
67
68  CommandObjectDisassemble(CommandInterpreter &interpreter);
69
70  ~CommandObjectDisassemble() override;
71
72  Options *GetOptions() override { return &m_options; }
73
74protected:
75  bool DoExecute(Args &command, CommandReturnObject &result) override;
76
77  llvm::Expected<std::vector<AddressRange>>
78  GetRangesForSelectedMode(CommandReturnObject &result);
79
80  llvm::Expected<std::vector<AddressRange>> GetContainingAddressRanges();
81  llvm::Expected<std::vector<AddressRange>> GetCurrentFunctionRanges();
82  llvm::Expected<std::vector<AddressRange>> GetCurrentLineRanges();
83  llvm::Expected<std::vector<AddressRange>>
84  GetNameRanges(CommandReturnObject &result);
85  llvm::Expected<std::vector<AddressRange>> GetPCRanges();
86  llvm::Expected<std::vector<AddressRange>> GetStartEndAddressRanges();
87
88  llvm::Error CheckRangeSize(const AddressRange &range, llvm::StringRef what);
89
90  CommandOptions m_options;
91};
92
93} // namespace lldb_private
94
95#endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
96