llvm-project/lldb/source/Commands/CommandObjectDisassemble.h
Pavel Labath 37f36cbffb
[lldb] Support disassembling discontinuous functions (#126505)
The command already supported disassembling multiple ranges, among other
reasons because inline functions can be discontinuous. The main thing
that was missing was being able to retrieve the function ranges from the
top level function object.

The output of the command for the case where the function entry point is
not its lowest address is somewhat confusing (we're showing negative
offsets), but it is correct.
2025-02-12 10:47:22 +01:00

112 lines
3.6 KiB
C++

//===-- CommandObjectDisassemble.h ------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
#define LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H
#include "lldb/Interpreter/CommandObject.h"
#include "lldb/Interpreter/Options.h"
#include "lldb/Utility/ArchSpec.h"
namespace lldb_private {
// CommandObjectDisassemble
class CommandObjectDisassemble : public CommandObjectParsed {
public:
class CommandOptions : public Options {
public:
CommandOptions();
~CommandOptions() override;
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
ExecutionContext *execution_context) override;
void OptionParsingStarting(ExecutionContext *execution_context) override;
llvm::ArrayRef<OptionDefinition> GetDefinitions() override;
const char *GetPluginName() {
return (plugin_name.empty() ? nullptr : plugin_name.c_str());
}
const char *GetFlavorString() {
if (flavor_string.empty() || flavor_string == "default")
return nullptr;
return flavor_string.c_str();
}
const char *GetCPUString() {
if (cpu_string.empty() || cpu_string == "default")
return nullptr;
return cpu_string.c_str();
}
const char *GetFeaturesString() {
if (features_string.empty() || features_string == "default")
return nullptr;
return features_string.c_str();
}
Status OptionParsingFinished(ExecutionContext *execution_context) override;
bool show_mixed; // Show mixed source/assembly
bool show_bytes;
bool show_control_flow_kind;
uint32_t num_lines_context = 0;
uint32_t num_instructions = 0;
bool raw;
std::string func_name;
bool current_function = false;
lldb::addr_t start_addr = 0;
lldb::addr_t end_addr = 0;
bool at_pc = false;
bool frame_line = false;
std::string plugin_name;
std::string flavor_string;
std::string cpu_string;
std::string features_string;
ArchSpec arch;
bool some_location_specified = false; // If no location was specified, we'll
// select "at_pc". This should be set
// in SetOptionValue if anything the selects a location is set.
lldb::addr_t symbol_containing_addr = 0;
bool force = false;
};
CommandObjectDisassemble(CommandInterpreter &interpreter);
~CommandObjectDisassemble() override;
Options *GetOptions() override { return &m_options; }
protected:
void DoExecute(Args &command, CommandReturnObject &result) override;
llvm::Expected<std::vector<AddressRange>>
GetRangesForSelectedMode(CommandReturnObject &result);
llvm::Expected<std::vector<AddressRange>> GetContainingAddressRanges();
llvm::Expected<std::vector<AddressRange>> GetCurrentFunctionRanges();
llvm::Expected<std::vector<AddressRange>> GetCurrentLineRanges();
llvm::Expected<std::vector<AddressRange>>
GetNameRanges(CommandReturnObject &result);
llvm::Expected<std::vector<AddressRange>> GetPCRanges();
llvm::Expected<std::vector<AddressRange>> GetStartEndAddressRanges();
llvm::Expected<std::vector<AddressRange>>
CheckRangeSize(std::vector<AddressRange> ranges, llvm::StringRef what);
CommandOptions m_options;
};
} // namespace lldb_private
#endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTDISASSEMBLE_H