[PATCH][x86_64] Convert indirect call via GOT to direct when possible
H.J. Lu
hjl.tools@gmail.com
Fri Jun 10 20:33:00 GMT 2016
On Fri, Jun 10, 2016 at 1:06 PM, Cary Coutant <ccoutant@gmail.com> wrote:
> template<class View_type>
> static inline bool
> can_convert_callq_to_direct(const Symbol* gsym, unsigned int r_type,
> size_t r_offset, View_type* view)
> {
> gold_assert(gsym != NULL);
> // We cannot do the conversion unless it's a GOTPCRELX relocation.
> if (r_type != elfcpp::R_X86_64_GOTPCRELX)
> return false;
> // We cannot convert references to IFUNC symbols, or to symbols that
> // are not local to the current module.
> if (gsym->type() == elfcpp::STT_GNU_IFUNC
> || gsym->is_undefined ()
> || gsym->is_from_dynobj()
> || gsym->is_preemptible())
> return false;
> // Check for a CALLQ or JMPQ opcode.
> return ((*view)[r_offset - 2] == 0xff
> && ((*view)[r_offset - 1] == 0x15
> || (*view)[r_offset - 1] == 0x25));
> }
>
> A couple of observations, though:
>
> 1. Sri, in your patch, you just test for sym type == STT_FUNC. Isn't
> it sufficient to test for sym type != STT_GNU_IFUNC (as in the
> convert-to-lea case)? I don't think it really matters -- if we see a
> jump to an STT_OBJECT or STT_NOTYPE symbol, why isn't the
> transformation just as valid?
>
> 2. HJ, given an R_X86_64_GOTPCRELX relocation, is it still necessary
> to check the opcode during Scan::global()? Doesn't the relocation
> guarantee that it's an appropriate instruction for the transformation?
> I think in both cases, we could skip fetching the section contents if
> we have this relocation.
Doesn't gold make different decision based on opcode, like
branch vs non-branch?
--
H.J.
More information about the Binutils
mailing list