Skip to content

Commit 889e7e6

Browse files
committed
returning error from Target::ReadInstructions
1 parent 4eea57e commit 889e7e6

File tree

4 files changed

+27
-12
lines changed

4 files changed

+27
-12
lines changed

lldb/include/lldb/Target/Target.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,9 +1329,9 @@ class Target : public std::enable_shared_from_this<Target>,
13291329
const lldb_private::RegisterFlags &flags,
13301330
uint32_t byte_size);
13311331

1332-
lldb::DisassemblerSP ReadInstructions(const Address &start_addr,
1333-
uint32_t count,
1334-
const char *flavor_string = nullptr);
1332+
llvm::Expected<lldb::DisassemblerSP>
1333+
ReadInstructions(const Address &start_addr, uint32_t count,
1334+
const char *flavor_string = nullptr);
13351335

13361336
// Target Stop Hooks
13371337
class StopHook : public UserID {

lldb/source/API/SBTarget.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,8 +1970,10 @@ lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr,
19701970

19711971
if (TargetSP target_sp = GetSP()) {
19721972
if (Address *addr_ptr = base_addr.get()) {
1973-
sb_instructions.SetDisassembler(
1974-
target_sp->ReadInstructions(*addr_ptr, count, flavor_string));
1973+
if (llvm::Expected<DisassemblerSP> disassembler =
1974+
target_sp->ReadInstructions(*addr_ptr, count, flavor_string)) {
1975+
sb_instructions.SetDisassembler(*disassembler);
1976+
}
19751977
}
19761978
}
19771979

lldb/source/Breakpoint/BreakpointResolver.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,15 +368,23 @@ BreakpointLocationSP BreakpointResolver::AddLocation(Address loc_addr,
368368
bool *new_location) {
369369
if (m_offset_is_insn_count) {
370370
Target &target = GetBreakpoint()->GetTarget();
371-
const DisassemblerSP instructions =
371+
llvm::Expected<DisassemblerSP> expected_instructions =
372372
target.ReadInstructions(loc_addr, m_offset);
373+
if (!expected_instructions) {
374+
LLDB_LOG_ERROR(GetLog(LLDBLog::Breakpoints),
375+
expected_instructions.takeError(),
376+
"error: Unable to read instructions at address 0x{0:x}",
377+
loc_addr.GetLoadAddress(&target));
378+
return BreakpointLocationSP();
379+
}
380+
381+
const DisassemblerSP instructions = *expected_instructions;
373382
if (!instructions ||
374383
instructions->GetInstructionList().GetSize() != m_offset) {
375-
Log *log = GetLog(LLDBLog::Breakpoints);
376-
LLDB_LOGF(log,
384+
LLDB_LOGF(GetLog(LLDBLog::Breakpoints),
377385
"error: Unable to read %lu instructions at address 0x%" PRIx64
378386
"\n",
379-
m_offset, loc_addr.GetFileAddress());
387+
m_offset, loc_addr.GetLoadAddress(&target));
380388
return BreakpointLocationSP();
381389
}
382390

lldb/source/Target/Target.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2994,9 +2994,9 @@ lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) {
29942994
return arch_plugin ? arch_plugin->GetBreakableLoadAddress(addr, *this) : addr;
29952995
}
29962996

2997-
lldb::DisassemblerSP Target::ReadInstructions(const Address &start_addr,
2998-
uint32_t count,
2999-
const char *flavor_string) {
2997+
llvm::Expected<lldb::DisassemblerSP>
2998+
Target::ReadInstructions(const Address &start_addr, uint32_t count,
2999+
const char *flavor_string) {
30003000
DataBufferHeap data(GetArchitecture().GetMaximumOpcodeByteSize() * count, 0);
30013001
bool force_live_memory = true;
30023002
lldb_private::Status error;
@@ -3005,6 +3005,11 @@ lldb::DisassemblerSP Target::ReadInstructions(const Address &start_addr,
30053005
ReadMemory(start_addr, data.GetBytes(), data.GetByteSize(), error,
30063006
force_live_memory, &load_addr);
30073007

3008+
if (error.Fail())
3009+
return llvm::createStringError(
3010+
error.AsCString("Target::ReadInstructions failed to read memory at %s"),
3011+
start_addr.GetLoadAddress(this));
3012+
30083013
const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS;
30093014
if (!flavor_string || flavor_string[0] == '\0') {
30103015
// FIXME - we don't have the mechanism in place to do per-architecture

0 commit comments

Comments
 (0)