32#define LLDB_OPTIONS_disassemble
33#include "CommandOptions.inc"
42 uint32_t option_idx, llvm::StringRef option_arg,
48 switch (short_option) {
56 "invalid num context lines string: \"%s\"", option_arg.str().c_str());
62 "invalid num of instructions string: \"%s\"",
63 option_arg.str().c_str());
88 func_name.assign(std::string(option_arg));
112 if (target_sp && (target_sp->GetArchitecture().GetTriple().getArch() ==
114 target_sp->GetArchitecture().GetTriple().getArch() ==
115 llvm::Triple::x86_64)) {
119 "Disassembler flavors are currently only "
120 "supported for x86 and x86_64 targets.");
142 if (execution_context) {
143 const auto &target_sp = execution_context->
GetTargetSP();
144 auto platform_ptr = target_sp ? target_sp->GetPlatform().get() :
nullptr;
166 llvm_unreachable(
"Unimplemented option");
191 execution_context ? execution_context->
GetTargetPtr() :
nullptr;
200 llvm::Triple::x86_64) {
227llvm::ArrayRef<OptionDefinition>
229 return llvm::ArrayRef(g_disassemble_options);
237 interpreter,
"disassemble",
238 "Disassemble specified instructions in the current target. "
239 "Defaults to the current function for the current thread and "
241 "disassemble [<cmd-options>]", eCommandRequiresTarget) {}
245llvm::Expected<std::vector<AddressRange>>
247 llvm::StringRef what) {
248 addr_t total_range_size = 0;
250 total_range_size += r.GetByteSize();
253 total_range_size <
GetDebugger().GetStopDisassemblyMaxSize())
257 msg <<
"Not disassembling " << what <<
" because it is very large ";
261 msg <<
". To disassemble specify an instruction count limit, start/stop "
262 "addresses or use the --force option.";
263 return llvm::createStringError(msg.
GetString());
266llvm::Expected<std::vector<AddressRange>>
268 std::vector<AddressRange> ranges;
269 const auto &get_ranges = [&](
Address addr) {
270 ModuleSP module_sp(addr.GetModule());
272 bool resolve_tail_call_address =
true;
273 addr.GetModule()->ResolveSymbolContextForAddress(
274 addr, eSymbolContextEverything, sc, resolve_tail_call_address);
277 for (uint32_t idx = 0;
281 ranges.push_back(range);
287 Address symbol_containing_address;
289 symbol_containing_address)) {
290 get_ranges(symbol_containing_address);
295 if (module_sp->ResolveFileAddress(
m_options.symbol_containing_addr,
297 get_ranges(file_address);
302 if (ranges.empty()) {
303 return llvm::createStringError(
304 llvm::inconvertibleErrorCode(),
305 "Could not find function bounds for address 0x%" PRIx64,
312llvm::Expected<std::vector<AddressRange>>
318 return llvm::createStringError(
319 "Cannot disassemble around the current function without the process "
322 return llvm::createStringError(
323 "Cannot disassemble around the current function without a selected "
324 "frame: no currently running process.\n");
328 std::vector<AddressRange> ranges;
339llvm::Expected<std::vector<AddressRange>>
345 return llvm::createStringError(
346 llvm::inconvertibleErrorCode(),
347 "Cannot disassemble around the current "
348 "function without the process being stopped.\n");
350 return llvm::createStringError(llvm::inconvertibleErrorCode(),
351 "Cannot disassemble around the current "
352 "line without a selected frame: "
353 "no currently running process.\n");
360 return std::vector<AddressRange>{pc_line_entry.
range};
367llvm::Expected<std::vector<AddressRange>>
378 function_options, sc_list);
380 std::vector<AddressRange> ranges;
381 llvm::Error range_errs = llvm::Error::success();
382 const uint32_t scope =
383 eSymbolContextBlock | eSymbolContextFunction | eSymbolContextSymbol;
384 const bool use_inline_block_range =
true;
386 std::vector<AddressRange> fn_ranges;
388 for (uint32_t range_idx = 0;
389 sc.GetAddressRange(scope, range_idx, use_inline_block_range, range);
391 fn_ranges.push_back(std::move(range));
393 if (llvm::Expected<std::vector<AddressRange>> checked_ranges =
395 llvm::move(*checked_ranges, std::back_inserter(ranges));
398 joinErrors(std::move(range_errs), checked_ranges.takeError());
400 if (ranges.empty()) {
402 return std::move(range_errs);
403 return llvm::createStringError(llvm::inconvertibleErrorCode(),
404 "Unable to find symbol with name '%s'.\n",
412llvm::Expected<std::vector<AddressRange>>
418 return llvm::createStringError(
419 llvm::inconvertibleErrorCode(),
420 "Cannot disassemble around the current "
421 "function without the process being stopped.\n");
423 return llvm::createStringError(llvm::inconvertibleErrorCode(),
424 "Cannot disassemble around the current "
425 "PC without a selected frame: "
426 "no currently running process.\n");
438llvm::Expected<std::vector<AddressRange>>
443 return llvm::createStringError(llvm::inconvertibleErrorCode(),
444 "End address before start address.");
451llvm::Expected<std::vector<AddressRange>>
476 "use the --arch option or set the target architecture to disassemble");
480 const char *plugin_name =
m_options.GetPluginName();
481 const char *flavor_string =
m_options.GetFlavorString();
482 const char *cpu_string =
m_options.GetCPUString();
483 const char *features_string =
m_options.GetFeaturesString();
486 m_options.arch, flavor_string, cpu_string, features_string, plugin_name);
491 "Unable to find Disassembler plug-in named '%s' that supports the "
492 "'%s' architecture.\n",
493 plugin_name,
m_options.arch.GetArchitectureName());
496 "Unable to find Disassembler plug-in for the '%s' architecture.\n",
499 }
else if (flavor_string !=
nullptr && !disassembler->FlavorValidForArchSpec(
502 "invalid disassembler flavor \"%s\", using default.\n", flavor_string);
506 if (!command.
empty()) {
508 "\"disassemble\" arguments are specified as options.\n");
509 const int terminal_width =
513 terminal_width, use_color);
537 if (
m_options.enable_variable_annotations)
540 llvm::Expected<std::vector<AddressRange>> ranges =
547 bool print_sc_header = ranges->size() > 1;
552 if (limit.
value == 0)
559 cpu_string, features_string,
m_exe_ctx, cur_range.GetBaseAddress(),
567 "Failed to disassemble memory in function at 0x%8.8" PRIx64
".\n",
571 "Failed to disassemble memory at 0x%8.8" PRIx64
".\n",
572 cur_range.GetBaseAddress().GetLoadAddress(&target));
static constexpr unsigned default_disasm_num_ins
static constexpr unsigned default_disasm_byte_size
static llvm::raw_ostream & error(Stream &strm)
A section + offset based address range class.
A section + offset based address class.
@ DumpStyleFileAddress
Display as the file address (if any).
@ DumpStyleLoadAddress
Display as the load address (if resolved).
llvm::Triple & GetTriple()
Architecture triple accessor.
A command line argument class.
bool show_control_flow_kind
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
std::string flavor_string
uint32_t num_lines_context
bool enable_variable_annotations
std::string features_string
void OptionParsingStarting(ExecutionContext *execution_context) override
Status OptionParsingFinished(ExecutionContext *execution_context) override
lldb::addr_t symbol_containing_addr
bool some_location_specified
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
~CommandOptions() override
uint32_t num_instructions
llvm::Expected< std::vector< AddressRange > > GetCurrentFunctionRanges()
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectDisassemble() override
llvm::Expected< std::vector< AddressRange > > GetStartEndAddressRanges()
CommandObjectDisassemble(CommandInterpreter &interpreter)
llvm::Expected< std::vector< AddressRange > > GetNameRanges(CommandReturnObject &result)
llvm::Expected< std::vector< AddressRange > > GetPCRanges()
llvm::Expected< std::vector< AddressRange > > CheckRangeSize(std::vector< AddressRange > ranges, llvm::StringRef what)
llvm::Expected< std::vector< AddressRange > > GetCurrentLineRanges()
Options * GetOptions() override
llvm::Expected< std::vector< AddressRange > > GetContainingAddressRanges()
llvm::Expected< std::vector< AddressRange > > GetRangesForSelectedMode(CommandReturnObject &result)
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
ExecutionContext m_exe_ctx
CommandInterpreter & GetCommandInterpreter()
void void AppendError(llvm::StringRef in_string)
void AppendWarningWithFormat(const char *format,...) __attribute__((format(printf
Stream & GetErrorStream()
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
void void AppendWarning(llvm::StringRef in_string)
Stream & GetOutputStream()
A uniqued constant string class.
const char * GetCString() const
Get the string value as a C string.
uint64_t GetTerminalWidth() const
static lldb::DisassemblerSP FindPlugin(const ArchSpec &arch, const char *flavor, const char *cpu, const char *features, const char *plugin_name)
static bool Disassemble(Debugger &debugger, const ArchSpec &arch, const char *plugin_name, const char *flavor, const char *cpu, const char *features, const ExecutionContext &exe_ctx, const Address &start, Limit limit, bool mixed_source_and_assembly, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm)
@ eOptionVariableAnnotations
@ eOptionMarkPCSourceLine
@ eOptionShowControlFlowKind
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
Target * GetTargetPtr() const
Returns a pointer to the target object.
AddressRanges GetAddressRanges()
void FindFunctions(ConstString name, lldb::FunctionNameType name_type_mask, const ModuleFunctionSearchOptions &options, SymbolContextList &sc_list) const
ModuleIterable Modules() const
void GenerateOptionUsage(Stream &strm, CommandObject &cmd, uint32_t screen_width, bool use_color)
std::vector< Option > m_getopt_table
A plug-in interface definition class for debugging a process.
This base class provides an interface to stack frames.
const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
const Address & GetFrameCodeAddress()
Get an Address for the current pc value in this StackFrame.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
llvm::StringRef GetString() const
Defines a list of symbol context objects.
SymbolContextIterable SymbolContexts()
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
bool GetAddressRange(uint32_t scope, uint32_t range_idx, bool use_inline_block_range, AddressRange &range) const
Get the address range contained within a symbol context.
Symbol * symbol
The Symbol for a given query.
LineEntry line_entry
The LineEntry for a given query.
bool ValueIsAddress() const
lldb::addr_t GetByteSize() const
Address GetAddress() const
const char * GetDisassemblyFeatures() const
const char * GetDisassemblyFlavor() const
const char * GetDisassemblyCPU() const
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, uint32_t stop_id=SectionLoadHistory::eStopIDNow, bool allow_section_end=false)
const ModuleList & GetImages() const
Get accessor for the images for this process.
const ArchSpec & GetArchitecture() const
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
const char * toString(AppleArm64ExceptionClass EC)
std::shared_ptr< lldb_private::Disassembler > DisassemblerSP
@ eReturnStatusSuccessFinishResult
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
A line table entry class.
bool IsValid() const
Check if a line entry object is valid.
AddressRange range
The section offset address range for this line entry.
Options used by Module::FindFunctions.
bool include_inlines
Include inlined functions.
bool include_symbols
Include the symbol table.
static lldb::addr_t ToAddress(const ExecutionContext *exe_ctx, llvm::StringRef s, lldb::addr_t fail_value, Status *error_ptr)
Try to parse an address.