aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Breakpoint/BreakpointResolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Breakpoint/BreakpointResolver.cpp')
-rw-r--r--lldb/source/Breakpoint/BreakpointResolver.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/lldb/source/Breakpoint/BreakpointResolver.cpp b/lldb/source/Breakpoint/BreakpointResolver.cpp
index 91fdff4..4ac4050 100644
--- a/lldb/source/Breakpoint/BreakpointResolver.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolver.cpp
@@ -42,9 +42,9 @@ const char *BreakpointResolver::g_ty_to_name[] = {"FileAndLine", "Address",
const char *BreakpointResolver::g_option_names[static_cast<uint32_t>(
BreakpointResolver::OptionNames::LastOptionName)] = {
- "AddressOffset", "Exact", "FileName", "Inlines", "Language",
- "LineNumber", "Column", "ModuleName", "NameMask", "Offset",
- "PythonClass", "Regex", "ScriptArgs", "SectionName", "SearchDepth",
+ "AddressOffset", "Exact", "FileName", "Inlines", "Language",
+ "LineNumber", "Column", "ModuleName", "NameMask", "Offset",
+ "PythonClass", "Regex", "ScriptArgs", "SectionName", "SearchDepth",
"SkipPrologue", "SymbolNames"};
const char *BreakpointResolver::ResolverTyToName(enum ResolverTy type) {
@@ -65,8 +65,10 @@ BreakpointResolver::NameToResolverTy(llvm::StringRef name) {
BreakpointResolver::BreakpointResolver(const BreakpointSP &bkpt,
const unsigned char resolverTy,
- lldb::addr_t offset)
- : m_breakpoint(bkpt), m_offset(offset), SubclassID(resolverTy) {}
+ lldb::addr_t offset,
+ bool offset_is_insn_count)
+ : m_breakpoint(bkpt), m_offset(offset),
+ m_offset_is_insn_count(offset_is_insn_count), SubclassID(resolverTy) {}
BreakpointResolver::~BreakpointResolver() = default;
@@ -364,7 +366,32 @@ void BreakpointResolver::AddLocation(SearchFilter &filter,
BreakpointLocationSP BreakpointResolver::AddLocation(Address loc_addr,
bool *new_location) {
- loc_addr.Slide(m_offset);
+ if (m_offset_is_insn_count) {
+ Target &target = GetBreakpoint()->GetTarget();
+ llvm::Expected<DisassemblerSP> expected_instructions =
+ target.ReadInstructions(loc_addr, m_offset);
+ if (!expected_instructions) {
+ LLDB_LOG_ERROR(GetLog(LLDBLog::Breakpoints),
+ expected_instructions.takeError(),
+ "error: Unable to read instructions at address 0x{0:x}",
+ loc_addr.GetLoadAddress(&target));
+ return BreakpointLocationSP();
+ }
+
+ const DisassemblerSP instructions = *expected_instructions;
+ if (!instructions ||
+ instructions->GetInstructionList().GetSize() != m_offset) {
+ LLDB_LOG(GetLog(LLDBLog::Breakpoints),
+ "error: Unable to read {0} instructions at address 0x{1:x}",
+ m_offset, loc_addr.GetLoadAddress(&target));
+ return BreakpointLocationSP();
+ }
+
+ loc_addr.Slide(instructions->GetInstructionList().GetTotalByteSize());
+ } else {
+ loc_addr.Slide(m_offset);
+ }
+
return GetBreakpoint()->AddLocation(loc_addr, new_location);
}