forked from OSchip/llvm-project
[lldb][NFC] Refactor instruction dumping out of DumpDataExtractor
This commit is contained in:
parent
d7d1af3916
commit
f3b3689c04
|
@ -128,6 +128,53 @@ static lldb::offset_t DumpAPInt(Stream *s, const DataExtractor &data,
|
|||
return offset;
|
||||
}
|
||||
|
||||
/// Dumps decoded instructions to a stream.
|
||||
static lldb::offset_t DumpInstructions(const DataExtractor &DE, Stream *s,
|
||||
ExecutionContextScope *exe_scope,
|
||||
offset_t start_offset,
|
||||
uint64_t base_addr,
|
||||
size_t number_of_instructions) {
|
||||
offset_t offset = start_offset;
|
||||
|
||||
TargetSP target_sp;
|
||||
if (exe_scope)
|
||||
target_sp = exe_scope->CalculateTarget();
|
||||
if (target_sp) {
|
||||
DisassemblerSP disassembler_sp(
|
||||
Disassembler::FindPlugin(target_sp->GetArchitecture(),
|
||||
target_sp->GetDisassemblyFlavor(), nullptr));
|
||||
if (disassembler_sp) {
|
||||
lldb::addr_t addr = base_addr + start_offset;
|
||||
lldb_private::Address so_addr;
|
||||
bool data_from_file = true;
|
||||
if (target_sp->GetSectionLoadList().ResolveLoadAddress(addr, so_addr)) {
|
||||
data_from_file = false;
|
||||
} else {
|
||||
if (target_sp->GetSectionLoadList().IsEmpty() ||
|
||||
!target_sp->GetImages().ResolveFileAddress(addr, so_addr))
|
||||
so_addr.SetRawAddress(addr);
|
||||
}
|
||||
|
||||
size_t bytes_consumed = disassembler_sp->DecodeInstructions(
|
||||
so_addr, DE, start_offset, number_of_instructions, false,
|
||||
data_from_file);
|
||||
|
||||
if (bytes_consumed) {
|
||||
offset += bytes_consumed;
|
||||
const bool show_address = base_addr != LLDB_INVALID_ADDRESS;
|
||||
const bool show_bytes = true;
|
||||
ExecutionContext exe_ctx;
|
||||
exe_scope->CalculateExecutionContext(exe_ctx);
|
||||
disassembler_sp->GetInstructionList().Dump(s, show_address, show_bytes,
|
||||
&exe_ctx);
|
||||
}
|
||||
}
|
||||
} else
|
||||
s->Printf("invalid target");
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
lldb::offset_t lldb_private::DumpDataExtractor(
|
||||
const DataExtractor &DE, Stream *s, offset_t start_offset,
|
||||
lldb::Format item_format, size_t item_byte_size, size_t item_count,
|
||||
|
@ -147,44 +194,9 @@ lldb::offset_t lldb_private::DumpDataExtractor(
|
|||
|
||||
offset_t offset = start_offset;
|
||||
|
||||
if (item_format == eFormatInstruction) {
|
||||
TargetSP target_sp;
|
||||
if (exe_scope)
|
||||
target_sp = exe_scope->CalculateTarget();
|
||||
if (target_sp) {
|
||||
DisassemblerSP disassembler_sp(Disassembler::FindPlugin(
|
||||
target_sp->GetArchitecture(),
|
||||
target_sp->GetDisassemblyFlavor(), nullptr));
|
||||
if (disassembler_sp) {
|
||||
lldb::addr_t addr = base_addr + start_offset;
|
||||
lldb_private::Address so_addr;
|
||||
bool data_from_file = true;
|
||||
if (target_sp->GetSectionLoadList().ResolveLoadAddress(addr, so_addr)) {
|
||||
data_from_file = false;
|
||||
} else {
|
||||
if (target_sp->GetSectionLoadList().IsEmpty() ||
|
||||
!target_sp->GetImages().ResolveFileAddress(addr, so_addr))
|
||||
so_addr.SetRawAddress(addr);
|
||||
}
|
||||
|
||||
size_t bytes_consumed = disassembler_sp->DecodeInstructions(
|
||||
so_addr, DE, start_offset, item_count, false, data_from_file);
|
||||
|
||||
if (bytes_consumed) {
|
||||
offset += bytes_consumed;
|
||||
const bool show_address = base_addr != LLDB_INVALID_ADDRESS;
|
||||
const bool show_bytes = true;
|
||||
ExecutionContext exe_ctx;
|
||||
exe_scope->CalculateExecutionContext(exe_ctx);
|
||||
disassembler_sp->GetInstructionList().Dump(s, show_address,
|
||||
show_bytes, &exe_ctx);
|
||||
}
|
||||
}
|
||||
} else
|
||||
s->Printf("invalid target");
|
||||
|
||||
return offset;
|
||||
}
|
||||
if (item_format == eFormatInstruction)
|
||||
return DumpInstructions(DE, s, exe_scope, start_offset, base_addr,
|
||||
item_count);
|
||||
|
||||
if ((item_format == eFormatOSType || item_format == eFormatAddressInfo) &&
|
||||
item_byte_size > 8)
|
||||
|
|
Loading…
Reference in New Issue