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);
286 assert(target &&
"target guaranteed by eCommandRequiresTarget");
288 Address symbol_containing_address;
290 symbol_containing_address)) {
291 get_ranges(symbol_containing_address);
296 if (module_sp->ResolveFileAddress(
m_options.symbol_containing_addr,
298 get_ranges(file_address);
303 if (ranges.empty()) {
304 return llvm::createStringError(
305 llvm::inconvertibleErrorCode(),
306 "Could not find function bounds for address 0x%" PRIx64,
313llvm::Expected<std::vector<AddressRange>>
319 return llvm::createStringError(
320 "Cannot disassemble around the current function without the process "
323 return llvm::createStringError(
324 "Cannot disassemble around the current function without a selected "
325 "frame: no currently running process.\n");
329 std::vector<AddressRange> ranges;
340llvm::Expected<std::vector<AddressRange>>
346 return llvm::createStringError(
347 llvm::inconvertibleErrorCode(),
348 "Cannot disassemble around the current "
349 "function without the process being stopped.\n");
351 return llvm::createStringError(llvm::inconvertibleErrorCode(),
352 "Cannot disassemble around the current "
353 "line without a selected frame: "
354 "no currently running process.\n");
361 return std::vector<AddressRange>{pc_line_entry.
range};
368llvm::Expected<std::vector<AddressRange>>
379 function_options, sc_list);
381 std::vector<AddressRange> ranges;
382 llvm::Error range_errs = llvm::Error::success();
383 const uint32_t scope =
384 eSymbolContextBlock | eSymbolContextFunction | eSymbolContextSymbol;
385 const bool use_inline_block_range =
true;
387 std::vector<AddressRange> fn_ranges;
389 for (uint32_t range_idx = 0;
390 sc.GetAddressRange(scope, range_idx, use_inline_block_range, range);
392 fn_ranges.push_back(std::move(range));
394 if (llvm::Expected<std::vector<AddressRange>> checked_ranges =
396 llvm::move(*checked_ranges, std::back_inserter(ranges));
399 joinErrors(std::move(range_errs), checked_ranges.takeError());
401 if (ranges.empty()) {
403 return std::move(range_errs);
404 return llvm::createStringError(llvm::inconvertibleErrorCode(),
405 "Unable to find symbol with name '%s'.\n",
413llvm::Expected<std::vector<AddressRange>>
419 return llvm::createStringError(
420 llvm::inconvertibleErrorCode(),
421 "Cannot disassemble around the current "
422 "function without the process being stopped.\n");
424 return llvm::createStringError(llvm::inconvertibleErrorCode(),
425 "Cannot disassemble around the current "
426 "PC without a selected frame: "
427 "no currently running process.\n");
439llvm::Expected<std::vector<AddressRange>>
444 return llvm::createStringError(llvm::inconvertibleErrorCode(),
445 "End address before start address.");
452llvm::Expected<std::vector<AddressRange>>
471 assert(target &&
"target guaranteed by eCommandRequiresTarget");
477 "use the --arch option or set the target architecture to disassemble");
481 const char *plugin_name =
m_options.GetPluginName();
482 const char *flavor_string =
m_options.GetFlavorString();
483 const char *cpu_string =
m_options.GetCPUString();
484 const char *features_string =
m_options.GetFeaturesString();
487 m_options.arch, flavor_string, cpu_string, features_string, plugin_name);
492 "Unable to find Disassembler plug-in named '%s' that supports the "
494 plugin_name,
m_options.arch.GetArchitectureName());
497 "Unable to find Disassembler plug-in for the '%s' architecture",
500 }
else if (flavor_string !=
nullptr && !disassembler->FlavorValidForArchSpec(
503 "invalid disassembler flavor \"{0}\", using default", flavor_string);
507 if (!command.
empty()) {
509 "\"disassemble\" arguments are specified as options");
510 const int terminal_width =
514 terminal_width, use_color);
538 if (
m_options.enable_variable_annotations)
541 llvm::Expected<std::vector<AddressRange>> ranges =
548 bool print_sc_header = ranges->size() > 1;
553 if (limit.
value == 0)
560 cpu_string, features_string,
m_exe_ctx, cur_range.GetBaseAddress(),
568 "Failed to disassemble memory in function at 0x%8.8" PRIx64,
572 "Failed to disassemble memory at 0x%8.8" PRIx64,
573 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()
Target * GetTarget()
Get the target this command should operate on.
void AppendError(llvm::StringRef in_string)
void AppendWarningWithFormatv(const char *format, Args &&...args)
Stream & GetErrorStream()
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
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.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
virtual 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.
std::string toString(FormatterBytecode::OpCodes op)
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.