]> Git Repo - qemu.git/commitdiff
tcg-ppc64: Adjust tcg_out_call for ELFv2
authorUlrich Weigand <[email protected]>
Wed, 30 Apr 2014 21:33:05 +0000 (14:33 -0700)
committerRichard Henderson <[email protected]>
Mon, 23 Jun 2014 14:31:46 +0000 (07:31 -0700)
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 <[email protected]>
Signed-off-by: Ulrich Weigand <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
tcg/ppc64/tcg-target.c

index d3cc237b366fabec954c607a3c5cb1622cc70fba..635ff987bbe4177e33baa6e8d9a874b1e5e05cf5 100644 (file)
@@ -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
This page took 0.023161 seconds and 4 git commands to generate.