Author: vedantk Date: Mon Oct 22 14:44:21 2018 New Revision: 344960 URL: http://llvm.org/viewvc/llvm-project?rev=344960&view=rev Log: [DWARF] Use a function-local offset for AT_call_return_pc
Logs provided by @stella.stamenova indicate that on Linux, lldb adds a spurious slide offset to the return PC it loads from AT_call_return_pc attributes (see the list thread: "[PATCH] D50478: Add support for artificial tail call frames"). This patch side-steps the issue by getting rid of the load address calculation in lldb's CallEdge::GetReturnPCAddress. The idea is to have the DWARF writer emit function-local offsets to the instruction after a call. I.e. return-pc = label-after-call-insn - function-entry. LLDB can simply add this offset to the base address of a function to get the return PC. Differential Revision: https://reviews.llvm.org/D53469 Modified: lldb/trunk/include/lldb/Symbol/Function.h lldb/trunk/source/Symbol/Function.cpp Modified: lldb/trunk/include/lldb/Symbol/Function.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Function.h?rev=344960&r1=344959&r2=344960&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/Function.h (original) +++ lldb/trunk/include/lldb/Symbol/Function.h Mon Oct 22 14:44:21 2018 @@ -324,7 +324,8 @@ public: /// made the call. lldb::addr_t GetReturnPCAddress(Function &caller, Target &target) const; - /// Like \ref GetReturnPCAddress, but returns an unresolved file address. + /// Like \ref GetReturnPCAddress, but returns an unslid function-local PC + /// offset. lldb::addr_t GetUnresolvedReturnPCAddress() const { return return_pc; } private: @@ -337,8 +338,9 @@ private: Function *def; } lazy_callee; - /// An invalid address if this is a tail call. Otherwise, the return PC for - /// the call. Note that this is a file address which must be resolved. + /// An invalid address if this is a tail call. Otherwise, the function-local + /// PC offset. Adding this PC offset to the function's base load address + /// gives the return PC for the call. lldb::addr_t return_pc; /// Whether or not an attempt was made to find the callee's definition. Modified: lldb/trunk/source/Symbol/Function.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Function.cpp?rev=344960&r1=344959&r2=344960&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Function.cpp (original) +++ lldb/trunk/source/Symbol/Function.cpp Mon Oct 22 14:44:21 2018 @@ -180,8 +180,7 @@ Function *CallEdge::GetCallee(ModuleList lldb::addr_t CallEdge::GetReturnPCAddress(Function &caller, Target &target) const { const Address &base = caller.GetAddressRange().GetBaseAddress(); - Address return_pc_addr{base.GetSection(), return_pc}; - return return_pc_addr.GetLoadAddress(&target); + return base.GetLoadAddress(&target) + return_pc; } //---------------------------------------------------------------------- _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits