Skip to content

Commit 3e2146c

Browse files
committed
returning error from Target::ReadInstructions
1 parent 3d28e90 commit 3e2146c

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
@@ -1335,9 +1335,9 @@ class Target : public std::enable_shared_from_this<Target>,
13351335
const lldb_private::RegisterFlags &flags,
13361336
uint32_t byte_size);
13371337

1338-
lldb::DisassemblerSP ReadInstructions(const Address &start_addr,
1339-
uint32_t count,
1340-
const char *flavor_string = nullptr);
1338+
llvm::Expected<lldb::DisassemblerSP>
1339+
ReadInstructions(const Address &start_addr, uint32_t count,
1340+
const char *flavor_string = nullptr);
13411341

13421342
// Target Stop Hooks
13431343
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
@@ -3000,9 +3000,9 @@ lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) {
30003000
return arch_plugin ? arch_plugin->GetBreakableLoadAddress(addr, *this) : addr;
30013001
}
30023002

3003-
lldb::DisassemblerSP Target::ReadInstructions(const Address &start_addr,
3004-
uint32_t count,
3005-
const char *flavor_string) {
3003+
llvm::Expected<lldb::DisassemblerSP>
3004+
Target::ReadInstructions(const Address &start_addr, uint32_t count,
3005+
const char *flavor_string) {
30063006
DataBufferHeap data(GetArchitecture().GetMaximumOpcodeByteSize() * count, 0);
30073007
bool force_live_memory = true;
30083008
lldb_private::Status error;
@@ -3011,6 +3011,11 @@ lldb::DisassemblerSP Target::ReadInstructions(const Address &start_addr,
30113011
ReadMemory(start_addr, data.GetBytes(), data.GetByteSize(), error,
30123012
force_live_memory, &load_addr);
30133013

3014+
if (error.Fail())
3015+
return llvm::createStringError(
3016+
error.AsCString("Target::ReadInstructions failed to read memory at %s"),
3017+
start_addr.GetLoadAddress(this));
3018+
30143019
const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS;
30153020
if (!flavor_string || flavor_string[0] == '\0') {
30163021
// FIXME - we don't have the mechanism in place to do per-architecture

0 commit comments

Comments
 (0)