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 
16 namespace lldb_private {
17 
18 // CommandObjectDisassemble
19 
20 class CommandObjectDisassemble : public CommandObjectParsed {
21 public:
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 
74 protected:
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