Skip to content

Commit

Permalink
tcg-ppc64: Adjust tcg_out_call for ELFv2
Browse files Browse the repository at this point in the history
The new ELFv2 ABI, used by default on powerpc64le-linux hosts,
introduced some changes that are incompatible with code currently
generated by the ppc64 TGC target.  In particular, we no longer
use function descriptors.

This patch adds support for the ELFv2 ABI in the ppc64 TGC
function call and function prologue sequences.

Tested-by: Tom Musta <tommusta@gmail.com>
Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>
  • Loading branch information
uweigand authored and rth7680 committed Jun 23, 2014
1 parent a2a98f8 commit 77e58d0
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions tcg/ppc64/tcg-target.c
Expand Up @@ -1115,6 +1115,23 @@ static void tcg_out_call(TCGContext *s, tcg_insn_unit *target)
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_REG_R2, ofs + SZP);
tcg_out32(s, BCCTR | BO_ALWAYS | LK);
}
#elif defined(_CALL_ELF) && _CALL_ELF == 2
intptr_t diff;

/* In the ELFv2 ABI, we have to set up r12 to contain the destination
address, which the callee uses to compute its TOC address. */
/* FIXME: when the branch is in range, we could avoid r12 load if we
knew that the destination uses the same TOC, and what its local
entry point offset is. */
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R12, (intptr_t)target);

diff = tcg_pcrel_diff(s, target);
if (in_range_b(diff)) {
tcg_out_b(s, LK, target);
} else {
tcg_out32(s, MTSPR | RS(TCG_REG_R12) | CTR);
tcg_out32(s, BCCTR | BO_ALWAYS | LK);
}
#else
tcg_out_b(s, LK, target);
#endif
Expand Down

0 comments on commit 77e58d0

Please sign in to comment.