jaydeep added inline comments.
================
Comment at: source/Target/RegisterContext.cpp:106-116
@@ -105,3 +105,13 @@
uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric,
LLDB_REGNUM_GENERIC_PC);
- return ReadRegisterAsUnsigned (reg, fail_value);
+ uint64_t pc = ReadRegisterAsUnsigned (reg, fail_value);
+
+ if (pc != fail_value)
+ {
+ TargetSP target_sp = m_thread.CalculateTarget();
+ Target *target = target_sp.get();
+ Address addr (pc);
+ pc = addr.GetOpcodeLoadAddress (target);
+ }
+
+ return pc;
}
----------------
clayborg wrote:
> Bit #0 should be stripped from the PC before it is figured out and the frame
> might need to track the address class, so this change shouldn't be needed. We
> don't want extra bits floating around in our code that we have to strip
> everywhere. This should be done as the stack frames are being created. The
> frame will need to keep track of the address class in case the address
> doesn't map back to a shared library (JITed code might not have a module
> describing the code). So this code should be removed and the backtracer will
> need to sanitize the addresses as the PC values are unwound.
The breakpoint is set on OpcodeAddress (bit #0 clear), but target returns
CallableAddress (bit #0 set) when breakpoint is hit.
Set using:
StoppointLocation (loc_id, addr.GetOpcodeLoadAddress(&owner.GetTarget()),
hardware)
Find using:
addr_t pc = thread_sp->GetRegisterContext()->GetPC() + m_breakpoint_pc_offset;
lldb::BreakpointSiteSP bp_site_sp =
thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
We either need to clear bit #0 from the PC we get or need to set the breakpoint
on CallableAddress (which would need LineTable in CallableAddress form).
Repository:
rL LLVM
http://reviews.llvm.org/D12079
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits