1061da546Spatrick //===-- CommandObjectDisassemble.h ------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
10dda28197Spatrick #define LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
11061da546Spatrick 
12061da546Spatrick #include "lldb/Interpreter/CommandObject.h"
13061da546Spatrick #include "lldb/Interpreter/Options.h"
14061da546Spatrick #include "lldb/Utility/ArchSpec.h"
15061da546Spatrick 
16061da546Spatrick namespace lldb_private {
17061da546Spatrick 
18061da546Spatrick // CommandObjectDisassemble
19061da546Spatrick 
20061da546Spatrick class CommandObjectDisassemble : public CommandObjectParsed {
21061da546Spatrick public:
22061da546Spatrick   class CommandOptions : public Options {
23061da546Spatrick   public:
24061da546Spatrick     CommandOptions();
25061da546Spatrick 
26061da546Spatrick     ~CommandOptions() override;
27061da546Spatrick 
28061da546Spatrick     Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
29061da546Spatrick                           ExecutionContext *execution_context) override;
30061da546Spatrick 
31061da546Spatrick     void OptionParsingStarting(ExecutionContext *execution_context) override;
32061da546Spatrick 
33061da546Spatrick     llvm::ArrayRef<OptionDefinition> GetDefinitions() override;
34061da546Spatrick 
GetPluginName()35061da546Spatrick     const char *GetPluginName() {
36061da546Spatrick       return (plugin_name.empty() ? nullptr : plugin_name.c_str());
37061da546Spatrick     }
38061da546Spatrick 
GetFlavorString()39061da546Spatrick     const char *GetFlavorString() {
40061da546Spatrick       if (flavor_string.empty() || flavor_string == "default")
41061da546Spatrick         return nullptr;
42061da546Spatrick       return flavor_string.c_str();
43061da546Spatrick     }
44061da546Spatrick 
45061da546Spatrick     Status OptionParsingFinished(ExecutionContext *execution_context) override;
46061da546Spatrick 
47061da546Spatrick     bool show_mixed; // Show mixed source/assembly
48061da546Spatrick     bool show_bytes;
49*f6aab3d8Srobert     bool show_control_flow_kind;
50be691f3bSpatrick     uint32_t num_lines_context = 0;
51be691f3bSpatrick     uint32_t num_instructions = 0;
52061da546Spatrick     bool raw;
53061da546Spatrick     std::string func_name;
54be691f3bSpatrick     bool current_function = false;
55be691f3bSpatrick     lldb::addr_t start_addr = 0;
56be691f3bSpatrick     lldb::addr_t end_addr = 0;
57be691f3bSpatrick     bool at_pc = false;
58be691f3bSpatrick     bool frame_line = false;
59061da546Spatrick     std::string plugin_name;
60061da546Spatrick     std::string flavor_string;
61061da546Spatrick     ArchSpec arch;
62be691f3bSpatrick     bool some_location_specified = false; // If no location was specified, we'll
63be691f3bSpatrick                                           // select "at_pc".  This should be set
64061da546Spatrick     // in SetOptionValue if anything the selects a location is set.
65be691f3bSpatrick     lldb::addr_t symbol_containing_addr = 0;
66dda28197Spatrick     bool force = false;
67061da546Spatrick   };
68061da546Spatrick 
69061da546Spatrick   CommandObjectDisassemble(CommandInterpreter &interpreter);
70061da546Spatrick 
71061da546Spatrick   ~CommandObjectDisassemble() override;
72061da546Spatrick 
GetOptions()73061da546Spatrick   Options *GetOptions() override { return &m_options; }
74061da546Spatrick 
75061da546Spatrick protected:
76061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override;
77061da546Spatrick 
78dda28197Spatrick   llvm::Expected<std::vector<AddressRange>>
79dda28197Spatrick   GetRangesForSelectedMode(CommandReturnObject &result);
80dda28197Spatrick 
81dda28197Spatrick   llvm::Expected<std::vector<AddressRange>> GetContainingAddressRanges();
82dda28197Spatrick   llvm::Expected<std::vector<AddressRange>> GetCurrentFunctionRanges();
83dda28197Spatrick   llvm::Expected<std::vector<AddressRange>> GetCurrentLineRanges();
84dda28197Spatrick   llvm::Expected<std::vector<AddressRange>>
85dda28197Spatrick   GetNameRanges(CommandReturnObject &result);
86dda28197Spatrick   llvm::Expected<std::vector<AddressRange>> GetPCRanges();
87dda28197Spatrick   llvm::Expected<std::vector<AddressRange>> GetStartEndAddressRanges();
88dda28197Spatrick 
89dda28197Spatrick   llvm::Error CheckRangeSize(const AddressRange &range, llvm::StringRef what);
90dda28197Spatrick 
91061da546Spatrick   CommandOptions m_options;
92061da546Spatrick };
93061da546Spatrick 
94061da546Spatrick } // namespace lldb_private
95061da546Spatrick 
96dda28197Spatrick #endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
97