From 89fd780e78941067d6ad3cdc1d16b2dce0d9f8d21487a4c7159e80e0d767f218 Mon Sep 17 00:00:00 2001 From: Wolfgang Rosenauer Date: Thu, 2 Jan 2014 21:31:24 +0000 Subject: [PATCH] * mozilla-ppc64le.patch: general support * mozilla-libffi-ppc64le.patch: libffi backport * mozilla-xpcom-ppc64le.patch: port xpcom OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaFirefox?expand=0&rev=361 --- MozillaFirefox.changes | 6 +- MozillaFirefox.spec | 10 +- ...64le.patch => mozilla-libffi-ppc64le.patch | 1421 ++++++++++++----- mozilla-ppc64le.patch | 257 +++ ...c64le.patch => mozilla-xpcom-ppc64le.patch | 228 ++- ppc64le-support.patch | 159 -- 6 files changed, 1500 insertions(+), 581 deletions(-) rename libffi-ppc64le.patch => mozilla-libffi-ppc64le.patch (80%) create mode 100644 mozilla-ppc64le.patch rename xpcom-ppc64le.patch => mozilla-xpcom-ppc64le.patch (55%) delete mode 100644 ppc64le-support.patch diff --git a/MozillaFirefox.changes b/MozillaFirefox.changes index 494972d8..b92d3ccb 100644 --- a/MozillaFirefox.changes +++ b/MozillaFirefox.changes @@ -2,9 +2,9 @@ Thu Dec 12 21:19:54 UTC 2013 - uweigand@de.ibm.com - Add support for powerpc64le-linux. - * ppc64le-support.patch: general support - * libffi-ppc64le.patch: libffi backport - * xpcom-ppc64le.patch: port xpcom + * mozilla-ppc64le.patch: general support + * mozilla-libffi-ppc64le.patch: libffi backport + * mozilla-xpcom-ppc64le.patch: port xpcom - Add build fix from mainline. * mozilla-bug929439.patch diff --git a/MozillaFirefox.spec b/MozillaFirefox.spec index 8604624e..18f9ff37 100644 --- a/MozillaFirefox.spec +++ b/MozillaFirefox.spec @@ -1,7 +1,7 @@ # # spec file for package MozillaFirefox # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # 2006-2013 Wolfgang Rosenauer # # All modifications and additions to the file contributed by third parties @@ -105,10 +105,10 @@ Patch10: mozilla-sle11.patch Patch12: mozilla-arm-disable-edsp.patch Patch13: mozilla-ppc.patch Patch14: mozilla-libproxy-compat.patch -Patch15: libffi-ppc64le.patch -Patch16: xpcom-ppc64le.patch -Patch17: ppc64le-support.patch -Patch18: mozilla-bug929439.patch +Patch15: mozilla-bug929439.patch +Patch16: mozilla-ppc64le.patch +Patch17: mozilla-libffi-ppc64le.patch +Patch18: mozilla-xpcom-ppc64le.patch # Firefox/browser Patch30: firefox-browser-css.patch Patch31: firefox-kde.patch diff --git a/libffi-ppc64le.patch b/mozilla-libffi-ppc64le.patch similarity index 80% rename from libffi-ppc64le.patch rename to mozilla-libffi-ppc64le.patch index e341a869..370a6518 100644 --- a/libffi-ppc64le.patch +++ b/mozilla-libffi-ppc64le.patch @@ -1,15 +1,29 @@ -Index: mozilla/js/src/ctypes/libffi/src/powerpc/aix.S -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/aix.S -+++ mozilla/js/src/ctypes/libffi/src/powerpc/aix.S -@@ -1,5 +1,5 @@ +# HG changeset patch +# Parent a38c083288a664a9b1fdeaa16563b47661ef6c16 +# User Ulrich Weigand +PPC64 LE support for libffi + +diff --git a/js/src/ctypes/libffi/src/powerpc/aix.S b/js/src/ctypes/libffi/src/powerpc/aix.S +--- a/js/src/ctypes/libffi/src/powerpc/aix.S ++++ b/js/src/ctypes/libffi/src/powerpc/aix.S +@@ -1,10 +1,10 @@ /* ----------------------------------------------------------------------- - aix.S - Copyright (c) 2002,2009 Free Software Foundation, Inc. + aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. based on darwin.S by John Hornkvist PowerPC Assembly glue. -@@ -79,6 +79,8 @@ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, +@@ -74,16 +74,18 @@ + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 .set f20,20 .set f21,21 @@ -18,7 +32,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/aix.S #define LIBFFI_ASM #include #include -@@ -125,6 +127,7 @@ ffi_call_AIX: + #define JUMPTARGET(name) name + #define L(x) x + .file "aix.S" + .toc + +@@ -120,16 +122,17 @@ ffi_call_AIX: + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address. */ + std r2, 40(r1) + /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args @@ -26,7 +50,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/aix.S /* Now do the call. */ ld r0, 0(r29) -@@ -226,6 +229,7 @@ L(float_return_value): + ld r2, 8(r29) + ld r11, 16(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 +@@ -221,16 +224,17 @@ L(float_return_value): + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + stw r2, 20(r1) + /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args @@ -34,11 +68,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/aix.S /* Now do the call. */ lwz r0, 0(r29) -Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/ffi.c -+++ mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c -@@ -1,7 +1,9 @@ + lwz r2, 4(r29) + lwz r11, 8(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/powerpc/ffi.c +--- a/js/src/ctypes/libffi/src/powerpc/ffi.c ++++ b/js/src/ctypes/libffi/src/powerpc/ffi.c +@@ -1,12 +1,14 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Geoffrey Keating - Copyright (C) 2007, 2008 Free Software Foundation, Inc @@ -51,7 +89,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c PowerPC Foreign Function Interface -@@ -39,32 +41,29 @@ enum { + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -34,42 +36,39 @@ + + extern void ffi_closure_SYSV (void); + extern void FFI_HIDDEN ffi_closure_LINUX64 (void); + + enum { /* The assembly depends on these exact flags. */ FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ @@ -92,7 +140,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* ffi_prep_args_SYSV is called by the assembly routine once stack space has been allocated for the function's arguments. -@@ -113,10 +112,12 @@ ffi_prep_args_SYSV (extended_cif *ecif, + The stack layout we want looks like this: + + | Return address from ffi_call_SYSV 4bytes | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4 | stack pointer here +@@ -108,100 +107,119 @@ ffi_prep_args_SYSV (extended_cif *ecif, + /* 'stacktop' points at the previous backchain pointer. */ + valp stacktop; + + /* 'gpr_base' points at the space for gpr3, and grows upwards as + we use GPR registers. */ valp gpr_base; int intarg_count; @@ -105,7 +163,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* 'copy_space' grows down as we put structures in it. It should stay 16-byte aligned. */ -@@ -125,9 +126,11 @@ ffi_prep_args_SYSV (extended_cif *ecif, + valp copy_space; + /* 'next_arg' grows up as we put parameters in it. */ valp next_arg; @@ -118,7 +177,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c union { void **v; char **c; -@@ -143,21 +146,22 @@ ffi_prep_args_SYSV (extended_cif *ecif, + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + unsigned int **ui; + long long **ll; + float **f; + double **d; + } p_argv; size_t struct_copy_size; unsigned gprvalue; @@ -147,7 +214,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c FFI_ASSERT ((bytes & 0xF) == 0); FFI_ASSERT (copy_space.c >= next_arg.c); -@@ -174,12 +178,28 @@ ffi_prep_args_SYSV (extended_cif *ecif, + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + { + *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; + intarg_count++; + } + + /* Now for the arguments. */ + p_argv.v = ecif->avalue; + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv.v++) { @@ -180,7 +256,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c double_tmp = **p_argv.f; if (fparg_count >= NUM_FPR_ARG_REGISTERS) { -@@ -195,8 +215,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, + *next_arg.f = (float) double_tmp; + next_arg.u += 1; + intarg_count++; + } + else + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; case FFI_TYPE_DOUBLE: /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ @@ -189,7 +273,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c double_tmp = **p_argv.d; if (fparg_count >= NUM_FPR_ARG_REGISTERS) -@@ -218,43 +236,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, + { + if (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0) + { + intarg_count++; +@@ -213,53 +231,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, + else + *fpr_base.d++ = double_tmp; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -233,7 +327,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c double_tmp = (*p_argv.d)[0]; if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) -@@ -280,13 +261,40 @@ ffi_prep_args_SYSV (extended_cif *ecif, + { + if (intarg_count >= NUM_GPR_ARG_REGISTERS + && intarg_count % 2 != 0) + { + intarg_count++; +@@ -275,23 +256,50 @@ ffi_prep_args_SYSV (extended_cif *ecif, + { + *fpr_base.d++ = double_tmp; + double_tmp = (*p_argv.d)[1]; + *fpr_base.d++ = double_tmp; + } fparg_count += 2; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); @@ -276,7 +380,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c if (intarg_count == NUM_GPR_ARG_REGISTERS-1) intarg_count++; if (intarg_count >= NUM_GPR_ARG_REGISTERS) -@@ -319,9 +327,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, + { + if (intarg_count % 2 != 0) + { + intarg_count++; + next_arg.u++; +@@ -314,19 +322,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, + gpr_base.u++; + } + *gpr_base.ll++ = **p_argv.ll; + } + intarg_count += 2; break; case FFI_TYPE_STRUCT: @@ -286,7 +400,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c struct_copy_size = ((*ptr)->size + 15) & ~0xF; copy_space.c -= struct_copy_size; memcpy (copy_space.c, *p_argv.c, (*ptr)->size); -@@ -349,7 +354,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, + + gprvalue = (unsigned long) copy_space.c; + + FFI_ASSERT (copy_space.c > next_arg.c); + FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); +@@ -344,45 +349,91 @@ ffi_prep_args_SYSV (extended_cif *ecif, + case FFI_TYPE_SINT16: + gprvalue = **p_argv.ss; + goto putgpr; + + case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: @@ -294,7 +418,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c gprvalue = **p_argv.ui; -@@ -366,8 +370,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, + putgpr: + if (intarg_count >= NUM_GPR_ARG_REGISTERS) + *next_arg.u++ = gprvalue; + else + *gpr_base.u++ = gprvalue; + intarg_count++; + break; + } + } + /* Check that we didn't overrun the stack... */ FFI_ASSERT (copy_space.c >= next_arg.c); FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); @@ -311,7 +444,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); } -@@ -378,6 +390,45 @@ enum { + /* About the LINUX64 ABI. */ + enum { + NUM_GPR_ARG_REGISTERS64 = 8, + NUM_FPR_ARG_REGISTERS64 = 13 }; enum { ASM_NEEDS_REGISTERS64 = 4 }; @@ -357,7 +493,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* ffi_prep_args64 is called by the assembly routine once stack space has been allocated for the function's arguments. -@@ -423,6 +474,7 @@ ffi_prep_args64 (extended_cif *ecif, uns + The stack layout we want looks like this: + + | Ret addr from ffi_call_LINUX64 8bytes | higher addresses + |--------------------------------------------| + | CR save area 8bytes | +@@ -418,141 +469,216 @@ ffi_prep_args64 (extended_cif *ecif, uns + const unsigned long bytes = ecif->cif->bytes; + const unsigned long flags = ecif->cif->flags; + + typedef union { + char *c; unsigned long *ul; float *f; double *d; @@ -365,7 +511,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } valp; /* 'stacktop' points at the previous backchain pointer. */ -@@ -438,9 +490,9 @@ ffi_prep_args64 (extended_cif *ecif, uns + valp stacktop; + + /* 'next_arg' points at the space for gpr3, and grows upwards as + we use GPR registers, then continues at rest. */ + valp gpr_base; + valp gpr_end; + valp rest; + valp next_arg; + /* 'fpr_base' points at the space for fpr3, and grows upwards as we use FPR registers. */ valp fpr_base; @@ -377,7 +531,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c ffi_type **ptr; double double_tmp; union { -@@ -457,11 +509,18 @@ ffi_prep_args64 (extended_cif *ecif, uns + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + signed int **si; + unsigned int **ui; + unsigned long **ul; + float **f; double **d; } p_argv; unsigned long gprvalue; @@ -396,7 +559,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; fparg_count = 0; next_arg.ul = gpr_base.ul; -@@ -477,30 +536,36 @@ ffi_prep_args64 (extended_cif *ecif, uns + + /* Check that everything starts aligned properly. */ + FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); + FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); + FFI_ASSERT ((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; /* Now for the arguments. */ p_argv.v = ecif->avalue; @@ -442,7 +613,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c fparg_count++; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; -@@ -508,18 +573,20 @@ ffi_prep_args64 (extended_cif *ecif, uns + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: double_tmp = (*p_argv.d)[0]; @@ -469,7 +640,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c fparg_count++; FFI_ASSERT (__LDBL_MANT_DIG__ == 106); FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); -@@ -527,27 +594,86 @@ ffi_prep_args64 (extended_cif *ecif, uns + break; #endif case FFI_TYPE_STRUCT: @@ -537,11 +708,6 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c else { - char *where = next_arg.c; -- -- /* Structures with size less than eight bytes are passed -- left-padded. */ -- if ((*ptr)->size < 8) -- where += 8 - (*ptr)->size; + words = ((*ptr)->size + 7) / 8; + if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) + { @@ -554,6 +720,11 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c + { + char *where = next_arg.c; +- /* Structures with size less than eight bytes are passed +- left-padded. */ +- if ((*ptr)->size < 8) +- where += 8 - (*ptr)->size; +- - memcpy (where, *p_argv.c, (*ptr)->size); - next_arg.ul += words; - if (next_arg.ul == gpr_end.ul) @@ -572,7 +743,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } break; -@@ -591,27 +717,22 @@ ffi_prep_args64 (extended_cif *ecif, uns + case FFI_TYPE_UINT8: + gprvalue = **p_argv.uc; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = **p_argv.sc; +@@ -586,53 +712,55 @@ ffi_prep_args64 (extended_cif *ecif, uns + FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS + || (next_arg.ul >= gpr_base.ul + && next_arg.ul <= gpr_base.ul + 4)); + } + /* Perform machine dependent cif processing */ @@ -606,7 +787,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); -@@ -621,13 +742,20 @@ ffi_prep_cif_machdep (ffi_cif *cif) + /* Space for the GPR registers. */ + bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); + } else { /* 64-bit ABI. */ @@ -627,7 +810,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } /* Return value handling. The rules for SYSV are as follows: -@@ -646,13 +774,30 @@ ffi_prep_cif_machdep (ffi_cif *cif) + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are returned + in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; +@@ -641,71 +769,93 @@ ffi_prep_cif_machdep (ffi_cif *cif) + - long doubles (if not equivalent to double) are returned in + fpr1,fpr2 for Linux and as for large structs for SysV. + For LINUX64: + - integer values in gpr3; + - Structures/Unions by reference; - Single/double FP values in fpr1, long double in fpr1,fpr2. - soft-float float/doubles are treated as UINT32/UINT64 respectivley. - soft-float long doubles are returned in gpr3-gpr6. */ @@ -661,7 +854,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c flags |= FLAG_RETURNS_128BITS; /* Fall through. */ #endif -@@ -660,47 +805,52 @@ ffi_prep_cif_machdep (ffi_cif *cif) + case FFI_TYPE_DOUBLE: flags |= FLAG_RETURNS_64BITS; /* Fall through. */ case FFI_TYPE_FLOAT: @@ -742,7 +935,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c #endif intarg_count++; flags |= FLAG_RETVAL_REFERENCE; -@@ -722,39 +872,36 @@ ffi_prep_cif_machdep (ffi_cif *cif) + /* Fall through. */ + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + +@@ -717,218 +867,334 @@ ffi_prep_cif_machdep (ffi_cif *cif) + if (cif->abi != FFI_LINUX64) + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures and long doubles (if not equivalent + to double) are passed as a pointer to a copy of the structure. Stuff on the stack needs to keep proper alignment. */ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { @@ -802,7 +1005,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c fparg_count++; /* If this FP arg is going on the stack, it must be 8-byte-aligned. */ -@@ -763,10 +910,21 @@ ffi_prep_cif_machdep (ffi_cif *cif) + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count % 2 != 0) intarg_count++; break; @@ -825,7 +1029,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* 'long long' arguments are passed as two words, but either both words must fit in registers or both go on the stack. If they go on the stack, they must -@@ -783,9 +941,6 @@ ffi_prep_cif_machdep (ffi_cif *cif) + be 8-byte-aligned. + + Also, only certain register pairs can be used for + passing long long int -- specifically (r3,r4), (r5,r6), + (r7,r8), (r9,r10). + */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 + || intarg_count % 2 != 0) + intarg_count++; + intarg_count += 2; break; case FFI_TYPE_STRUCT: @@ -835,7 +1048,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* We must allocate space for a copy of these to enforce pass-by-value. Pad the space up to a multiple of 16 bytes (the maximum alignment required for anything under -@@ -793,50 +948,100 @@ ffi_prep_cif_machdep (ffi_cif *cif) + the SYSV ABI). */ struct_copy_size += ((*ptr)->size + 15) & ~0xF; /* Fall through (allocate space for the pointer). */ @@ -946,7 +1159,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c if (intarg_count > 4) flags |= FLAG_4_GPR_ARGUMENTS; if (struct_copy_size != 0) -@@ -844,25 +1049,36 @@ ffi_prep_cif_machdep (ffi_cif *cif) + flags |= FLAG_ARG_NEEDS_COPY; if (cif->abi != FFI_LINUX64) { @@ -983,7 +1196,14 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } /* The stack space allocated needs to be a multiple of 16 bytes. */ -@@ -877,6 +1093,26 @@ ffi_prep_cif_machdep (ffi_cif *cif) + bytes = (bytes + 15) & ~0xF; + + /* Add in the space for the copied structures. */ + bytes += struct_copy_size; + + cif->flags = flags; + cif->bytes = bytes; + return FFI_OK; } @@ -1010,7 +1230,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, -@@ -886,28 +1122,39 @@ extern void FFI_HIDDEN ffi_call_LINUX64( + unsigned long, unsigned long *, + void (*fn)(void)); + void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { @@ -1060,7 +1282,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c case FFI_LINUX_SOFT_FLOAT: ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); break; -@@ -920,10 +1167,29 @@ ffi_call(ffi_cif *cif, void (*fn)(void), + #else + case FFI_LINUX64: + ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); + break; + #endif + default: FFI_ASSERT (0); break; } @@ -1091,7 +1318,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c #define MIN_CACHE_LINE_SIZE 8 static void -@@ -947,16 +1213,38 @@ ffi_prep_closure_loc (ffi_closure *closu + flush_icache (char *wraddr, char *xaddr, int size) + { + int i; + for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" +@@ -942,26 +1208,48 @@ flush_icache (char *wraddr, char *xaddr, + ffi_status + ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, void *codeloc) { #ifdef POWERPC64 @@ -1132,7 +1369,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c tramp = (unsigned int *) &closure->tramp[0]; tramp[0] = 0x7c0802a6; /* mflr r0 */ -@@ -1011,32 +1299,38 @@ ffi_closure_helper_SYSV (ffi_closure *cl + tramp[1] = 0x4800000d; /* bl 10 */ + tramp[4] = 0x7d6802a6; /* mflr r11 */ + tramp[5] = 0x7c0803a6; /* mtlr r0 */ + tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ + tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ +@@ -1006,110 +1294,215 @@ ffi_closure_helper_SYSV (ffi_closure *cl + /* rvalue is the pointer to space for return value in closure assembly */ + /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ + /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ + /* pst is the pointer to outgoing parameter stack in original caller */ + void ** avalue; ffi_type ** arg_types; long i, avn; @@ -1145,12 +1392,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c + long nf = 0; /* number of floating registers already used */ +#endif + long ng = 0; /* number of general registers already used */ -+ + +- cif = closure->cif; + ffi_cif *cif = closure->cif; + unsigned size = cif->rtype->size; + unsigned short rtypenum = cif->rtype->type; - -- cif = closure->cif; ++ avalue = alloca (cif->nargs * sizeof (void *)); - size = cif->rtype->size; @@ -1189,7 +1436,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c rvalue = (void *) *pgr; ng++; pgr++; -@@ -1047,12 +1341,112 @@ ffi_closure_helper_SYSV (ffi_closure *cl + } + + i = 0; + avn = cif->nargs; arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ @@ -1306,7 +1556,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* there are 8 gpr registers used to pass values */ if (ng < 8) { -@@ -1066,9 +1460,11 @@ ffi_closure_helper_SYSV (ffi_closure *cl + avalue[i] = (char *) pgr + 3; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 3; pst++; } break; @@ -1318,7 +1574,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* there are 8 gpr registers used to pass values */ if (ng < 8) { -@@ -1082,11 +1478,11 @@ ffi_closure_helper_SYSV (ffi_closure *cl + avalue[i] = (char *) pgr + 2; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 2; pst++; } break; @@ -1331,7 +1593,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* there are 8 gpr registers used to pass values */ if (ng < 8) { -@@ -1102,9 +1498,6 @@ ffi_closure_helper_SYSV (ffi_closure *cl + avalue[i] = pgr; + ng++; + pgr++; + } + else + { + avalue[i] = pst; + pst++; + } break; case FFI_TYPE_STRUCT: @@ -1341,7 +1611,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* Structs are passed by reference. The address will appear in a gpr if it is one of the first 8 arguments. */ if (ng < 8) -@@ -1122,7 +1515,6 @@ ffi_closure_helper_SYSV (ffi_closure *cl + { + avalue[i] = (void *) *pgr; + ng++; + pgr++; + } +@@ -1117,17 +1510,16 @@ ffi_closure_helper_SYSV (ffi_closure *cl + { + avalue[i] = (void *) *pst; + pst++; + } + break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: @@ -1349,7 +1629,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c /* passing long long ints are complex, they must * be passed in suitable register pairs such as * (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) -@@ -1154,99 +1546,8 @@ ffi_closure_helper_SYSV (ffi_closure *cl + * and if the entire pair aren't available then the outgoing + * parameter stack is used for both but an alignment of 8 + * must will be kept. So we must either look in pgr + * or pst to find the correct address for this type + * of parameter. +@@ -1149,277 +1541,239 @@ ffi_closure_helper_SYSV (ffi_closure *cl + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 2; + ng = 8; } break; @@ -1450,7 +1740,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } i++; -@@ -1263,39 +1564,9 @@ ffi_closure_helper_SYSV (ffi_closure *cl + } + + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. + Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4 + we have to tell ffi_closure_SYSV how to treat them. We combine the base + type FFI_SYSV_TYPE_SMALL_STRUCT - 1 with the size of the struct. + So a one byte struct gets the return type 16. Return type 1 to 15 are already used and we never have a struct with size zero. That is the reason for the subtraction of 1. See the comment in ffitarget.h about ordering. */ @@ -1492,7 +1791,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c } int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, -@@ -1312,16 +1583,20 @@ ffi_closure_helper_LINUX64 (ffi_closure + unsigned long *, ffi_dblfl *); + + int FFI_HIDDEN + ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, + unsigned long *pst, ffi_dblfl *pfr) + { + /* rvalue is the pointer to space for return value in closure assembly */ + /* pst is the pointer to parameter save area + (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ + /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ void **avalue; ffi_type **arg_types; @@ -1517,7 +1825,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c { rvalue = (void *) *pst; pst++; -@@ -1329,30 +1604,39 @@ ffi_closure_helper_LINUX64 (ffi_closure + } i = 0; avn = cif->nargs; @@ -1557,7 +1865,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: -@@ -1362,12 +1646,82 @@ ffi_closure_helper_LINUX64 (ffi_closure + case FFI_TYPE_POINTER: + avalue[i] = pst; + pst++; break; case FFI_TYPE_STRUCT: @@ -1645,7 +1955,11 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c pst += (arg_types[i]->size + 7) / 8; break; -@@ -1379,7 +1733,7 @@ ffi_closure_helper_LINUX64 (ffi_closure + case FFI_TYPE_FLOAT: + /* unfortunately float values are stored as doubles + * in the ffi_closure_LINUX64 code (since we don't check + * the type in that routine). + */ /* there are 13 64bit floating point registers */ @@ -1654,7 +1968,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c { double temp = pfr->d; pfr->f = (float) temp; -@@ -1395,7 +1749,7 @@ ffi_closure_helper_LINUX64 (ffi_closure + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pst; + pst++; + break; + + case FFI_TYPE_DOUBLE: /* On the outgoing stack all values are aligned to 8 */ /* there are 13 64bit floating point registers */ @@ -1663,7 +1985,11 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c { avalue[i] = pfr; pfr++; -@@ -1407,14 +1761,14 @@ ffi_closure_helper_LINUX64 (ffi_closure + } + else + avalue[i] = pst; + pst++; + break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -1680,7 +2006,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c { /* Passed partly in f13 and partly on the stack. Move it all to the stack. */ -@@ -1438,5 +1792,14 @@ ffi_closure_helper_LINUX64 (ffi_closure + *pst = *(unsigned long *) pfr; + pfr++; + } + avalue[i] = pst; + } +@@ -1433,10 +1787,19 @@ ffi_closure_helper_LINUX64 (ffi_closure + + i++; + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ @@ -1695,11 +2031,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi.c + } return cif->rtype->type; } -Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c -+++ mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c -@@ -3,7 +3,7 @@ +diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c +--- a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c ++++ b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c +@@ -1,14 +1,14 @@ + /* ----------------------------------------------------------------------- + ffi_darwin.c Copyright (C) 1998 Geoffrey Keating Copyright (C) 2001 John Hornkvist @@ -1708,7 +2045,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c FFI support for Darwin and AIX. -@@ -35,11 +35,17 @@ + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to +@@ -30,87 +30,112 @@ + #include + #include + + #include + extern void ffi_closure_ASM (void); enum { @@ -1731,7 +2078,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c FLAG_ARG_NEEDS_COPY = 1 << (31- 7), FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ -@@ -50,43 +56,61 @@ enum { + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) + }; + /* About the DARWIN ABI. */ enum { NUM_GPR_ARG_REGISTERS = 8, @@ -1803,7 +2153,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c /* 'stacktop' points at the previous backchain pointer. */ unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); -@@ -94,18 +118,19 @@ ffi_prep_args (extended_cif *ecif, unsig + /* 'fpr_base' points at the space for fpr1, and grows upwards as we use FPR registers. */ double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; @@ -1826,7 +2176,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c unsigned size_al = 0; /* Check that everything starts aligned properly. */ -@@ -130,25 +155,30 @@ ffi_prep_args (extended_cif *ecif, unsig + FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); + FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); + FFI_ASSERT((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. +@@ -125,78 +150,95 @@ ffi_prep_args (extended_cif *ecif, unsig + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match the size of the floating-point parameter are skipped. */ case FFI_TYPE_FLOAT: double_tmp = *(float *) *p_argv; @@ -1863,7 +2223,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c #endif fparg_count++; FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); -@@ -157,30 +187,41 @@ ffi_prep_args (extended_cif *ecif, unsig + break; + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -1913,7 +2274,11 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); break; #endif -@@ -192,6 +233,7 @@ ffi_prep_args (extended_cif *ecif, unsig + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + #ifdef POWERPC64 + gprvalue = *(long long *) *p_argv; + goto putgpr; #else *(long long *) next_arg = *(long long *) *p_argv; next_arg += 2; @@ -1921,7 +2286,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c #endif break; case FFI_TYPE_POINTER: -@@ -211,32 +253,35 @@ ffi_prep_args (extended_cif *ecif, unsig + gprvalue = *(unsigned long *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char *) *p_argv; + goto putgpr; +@@ -206,101 +248,373 @@ ffi_prep_args (extended_cif *ecif, unsig + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = *(signed short *) *p_argv; goto putgpr; case FFI_TYPE_STRUCT: @@ -1929,29 +2304,30 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c - dest_cpy = (char *) next_arg; size_al = (*ptr)->size; - if ((*ptr)->elements[0]->type == 3) +- size_al = ALIGN((*ptr)->size, 8); +- if (size_al < 3 && abi == FFI_DARWIN) +- dest_cpy += 4 - size_al; +- +- memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); +- next_arg += (size_al + 7) / 8; +#if defined(POWERPC_DARWIN64) + next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment); + darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, + (unsigned) size_al, + (unsigned int *) &fparg_count, + &fpr_base, &next_arg); -+#else -+ dest_cpy = (char *) next_arg; -+ + #else + dest_cpy = (char *) next_arg; + + /* If the first member of the struct is a double, then include enough + padding in the struct size to align it to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) - size_al = ALIGN((*ptr)->size, 8); -- if (size_al < 3 && abi == FFI_DARWIN) -- dest_cpy += 4 - size_al; - ++ size_al = ALIGN((*ptr)->size, 8); ++ +# if defined(POWERPC64) + FFI_ASSERT (abi != FFI_DARWIN); - memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); - next_arg += (size_al + 7) / 8; --#else -- dest_cpy = (char *) next_arg; -- ++ memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); ++ next_arg += (size_al + 7) / 8; +# else /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, SI 4 bytes) are aligned as if they were those modes. @@ -1970,7 +2346,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c #endif break; -@@ -249,6 +294,7 @@ ffi_prep_args (extended_cif *ecif, unsig + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = *(signed int *) *p_argv; + goto putgpr; + + case FFI_TYPE_UINT32: gprvalue = *(unsigned int *) *p_argv; putgpr: *next_arg++ = gprvalue; @@ -1978,7 +2359,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c break; default: break; -@@ -262,8 +308,269 @@ ffi_prep_args (extended_cif *ecif, unsig + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); } @@ -2249,7 +2636,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c static void darwin_adjust_aggregate_sizes (ffi_type *s) -@@ -280,22 +587,29 @@ darwin_adjust_aggregate_sizes (ffi_type + { + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; int align; p = s->elements[i]; @@ -2286,7 +2682,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c if (s->elements[0]->type == FFI_TYPE_UINT64 || s->elements[0]->type == FFI_TYPE_SINT64 || s->elements[0]->type == FFI_TYPE_DOUBLE -@@ -347,7 +661,7 @@ ffi_prep_cif_machdep (ffi_cif *cif) + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ + } + +@@ -342,17 +656,17 @@ aix_adjust_aggregate_sizes (ffi_type *s) + /* Perform machine dependent cif processing. */ + ffi_status + ffi_prep_cif_machdep (ffi_cif *cif) + { + /* All this is for the DARWIN ABI. */ unsigned i; ffi_type **ptr; unsigned bytes; @@ -2295,7 +2701,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c unsigned flags = 0; unsigned size_al = 0; -@@ -372,16 +686,25 @@ ffi_prep_cif_machdep (ffi_cif *cif) + /* All the machine-independent calculation of cif->bytes will be wrong. + All the calculation of structure sizes will also be wrong. + Redo the calculation for DARWIN. */ + + if (cif->abi == FFI_DARWIN) +@@ -367,26 +681,35 @@ ffi_prep_cif_machdep (ffi_cif *cif) + aix_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + aix_adjust_aggregate_sizes (cif->arg_types[i]); + } + /* Space for the frame pointer, callee's LR, CR, etc, and for the asm's temp regs. */ @@ -2326,7 +2742,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c - Larger structures values are allocated space and a pointer is passed as the first argument. */ switch (cif->rtype->type) -@@ -410,9 +733,42 @@ ffi_prep_cif_machdep (ffi_cif *cif) + { + + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; +@@ -405,124 +728,193 @@ ffi_prep_cif_machdep (ffi_cif *cif) + case FFI_TYPE_SINT64: + #ifdef POWERPC64 + case FFI_TYPE_POINTER: + #endif + flags |= FLAG_RETURNS_64BITS; break; case FFI_TYPE_STRUCT: @@ -2369,7 +2795,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c break; case FFI_TYPE_VOID: flags |= FLAG_RETURNS_NOTHING; -@@ -425,57 +781,83 @@ ffi_prep_cif_machdep (ffi_cif *cif) + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest @@ -2467,7 +2898,14 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c #endif break; -@@ -490,9 +872,18 @@ ffi_prep_cif_machdep (ffi_cif *cif) + default: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + if (fparg_count != 0) flags |= FLAG_FP_ARGUMENTS; @@ -2486,7 +2924,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c /* Stack space. */ #ifdef POWERPC64 -@@ -506,7 +897,7 @@ ffi_prep_cif_machdep (ffi_cif *cif) + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); + #else + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); + #endif + else bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); /* The stack space allocated needs to be a multiple of 16 bytes. */ @@ -2495,7 +2939,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c cif->flags = flags; cif->bytes = bytes; -@@ -516,8 +907,9 @@ ffi_prep_cif_machdep (ffi_cif *cif) + + return FFI_OK; + } extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, void (*fn)(void), void (*fn2)(void)); @@ -2506,7 +2952,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -@@ -546,7 +938,7 @@ ffi_call (ffi_cif *cif, void (*fn)(void) + { + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; +@@ -541,17 +933,17 @@ ffi_call (ffi_cif *cif, void (*fn)(void) + switch (cif->abi) + { + case FFI_AIX: + ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args)); break; case FFI_DARWIN: ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, @@ -2515,14 +2971,22 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c break; default: FFI_ASSERT(0); -@@ -566,58 +958,48 @@ typedef struct aix_fd_struct { + break; + } + } + + static void flush_icache(char *); +@@ -561,123 +953,127 @@ static void flush_range(char *, int); + points to one of these. */ + + typedef struct aix_fd_struct { + void *code_pointer; + void *toc; } aix_fd; /* here I'd like to add the stack frame layout we use in darwin_closure.S - and aix_clsoure.S + and aix_closure.S -+ -+ m32/m64 - SP previous -> +---------------------------------------+ <--- child frame - | back chain to caller 4 | @@ -2572,6 +3036,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c - +---------------------------------------+ xxx - | ???? | - +---------------------------------------+ xxx ++ m32/m64 ++ + The stack layout looks like this: + + | Additional params... | | Higher address @@ -2613,7 +3079,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, -@@ -631,30 +1013,44 @@ ffi_prep_closure_loc (ffi_closure* closu + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) + { + unsigned int *tramp; + struct ffi_aix_trampoline_struct *tramp_aix; + aix_fd *fd; switch (cif->abi) { @@ -2677,7 +3149,14 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c case FFI_AIX: -@@ -669,10 +1065,10 @@ ffi_prep_closure_loc (ffi_closure* closu + tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); + fd = (aix_fd *)(void *)ffi_closure_ASM; + + FFI_ASSERT (cif->abi == FFI_AIX); + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = codeloc; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; @@ -2690,7 +3169,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c break; } return FFI_OK; -@@ -708,7 +1104,7 @@ typedef union + } + + static void + flush_icache(char *addr) + { +@@ -703,28 +1099,28 @@ flush_range(char * addr1, int size) + } + + typedef union + { + float f; double d; } ffi_dblfl; @@ -2699,7 +3188,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c ffi_closure_helper_DARWIN (ffi_closure *, void *, unsigned long *, ffi_dblfl *); -@@ -719,7 +1115,7 @@ ffi_closure_helper_DARWIN (ffi_closure * + /* Basically the trampoline invokes ffi_closure_ASM, and on + entry, r11 holds the address of the closure. + After storing the registers that could possibly contain + parameters to be passed into the stack frame and setting up space for a return value, ffi_closure_ASM invokes the following helper function to do most of the work. */ @@ -2708,7 +3200,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, unsigned long *pgr, ffi_dblfl *pfr) { -@@ -741,16 +1137,32 @@ ffi_closure_helper_DARWIN (ffi_closure * + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + + typedef double ldbits[2]; +@@ -736,97 +1132,132 @@ ffi_closure_helper_DARWIN (ffi_closure * + }; + + void ** avalue; + ffi_type ** arg_types; + long i, avn; ffi_cif * cif; ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; unsigned size_al; @@ -2743,7 +3245,13 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c } i = 0; -@@ -764,7 +1176,7 @@ ffi_closure_helper_DARWIN (ffi_closure * + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: @@ -2752,7 +3260,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c avalue[i] = (char *) pgr + 7; #else avalue[i] = (char *) pgr + 3; -@@ -774,7 +1186,7 @@ ffi_closure_helper_DARWIN (ffi_closure * + #endif + pgr++; + break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: @@ -2761,7 +3271,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c avalue[i] = (char *) pgr + 6; #else avalue[i] = (char *) pgr + 2; -@@ -784,7 +1196,7 @@ ffi_closure_helper_DARWIN (ffi_closure * + #endif + pgr++; + break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: @@ -2770,7 +3282,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c avalue[i] = (char *) pgr + 4; #else case FFI_TYPE_POINTER: -@@ -794,34 +1206,53 @@ ffi_closure_helper_DARWIN (ffi_closure * + avalue[i] = pgr; + #endif + pgr++; break; case FFI_TYPE_STRUCT: @@ -2835,18 +3349,27 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c case FFI_TYPE_POINTER: avalue[i] = pgr; pgr++; -@@ -924,5 +1355,5 @@ ffi_closure_helper_DARWIN (ffi_closure * + break; + #else + /* Long long ints are passed in two gpr's. */ + avalue[i] = pgr; + pgr += 2; +@@ -919,10 +1350,10 @@ ffi_closure_helper_DARWIN (ffi_closure * + FFI_ASSERT(0); + } + i++; + } + (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype->type; + return cif->rtype; } -Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/ffitarget.h -+++ mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h -@@ -1,6 +1,8 @@ +diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi/src/powerpc/ffitarget.h +--- a/js/src/ctypes/libffi/src/powerpc/ffitarget.h ++++ b/js/src/ctypes/libffi/src/powerpc/ffitarget.h +@@ -1,11 +1,13 @@ /* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Copyright (C) 2007, 2008 Free Software Foundation, Inc @@ -2857,7 +3380,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h Target configuration macros for PowerPC. Permission is hereby granted, free of charge, to any person obtaining -@@ -28,16 +30,23 @@ + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to +@@ -23,26 +25,33 @@ + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H @@ -2882,31 +3415,51 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h #elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ #ifndef POWERPC64 #define POWERPC64 -@@ -57,18 +66,14 @@ typedef enum ffi_abi { + #endif + #endif + + #ifndef LIBFFI_ASM + typedef unsigned long ffi_arg; +@@ -52,28 +61,24 @@ typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + + #ifdef POWERPC + FFI_SYSV, + FFI_GCC_SYSV, FFI_LINUX64, FFI_LINUX, FFI_LINUX_SOFT_FLOAT, -# ifdef POWERPC64 +# if defined(POWERPC64) FFI_DEFAULT_ABI = FFI_LINUX64, --# else ++# elif defined(__NO_FPRS__) ++ FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, ++# elif (__LDBL_MANT_DIG__ == 106) ++ FFI_DEFAULT_ABI = FFI_LINUX, + # else -# if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106)) - FFI_DEFAULT_ABI = FFI_LINUX, -# else -# ifdef __NO_FPRS__ -+# elif defined(__NO_FPRS__) - FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, +- FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, -# else -+# elif (__LDBL_MANT_DIG__ == 106) -+ FFI_DEFAULT_ABI = FFI_LINUX, -+# else FFI_DEFAULT_ABI = FFI_GCC_SYSV, -# endif -# endif # endif #endif -@@ -101,6 +106,10 @@ typedef enum ffi_abi { + #ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, + #endif +@@ -96,32 +101,49 @@ typedef enum ffi_abi { + FFI_LAST_ABI + } ffi_abi; + #endif + + /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 @@ -2917,7 +3470,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h /* For additional types like the below, take care about the order in ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ -@@ -113,10 +122,23 @@ typedef enum ffi_abi { + + /* Needed for soft-float long-double-128 support. */ + #define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1) + + /* Needed for FFI_SYSV small structure returns. + We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are defined in ffi.c, to determine the exact return type and its size. */ #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) @@ -2945,11 +3503,230 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ffitarget.h #endif #ifndef LIBFFI_ASM -Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/linux64_closure.S -+++ mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S -@@ -32,66 +32,127 @@ + #if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) + struct ffi_aix_trampoline_struct { + void * code_pointer; /* Pointer to ffi_closure_ASM */ + void * toc; /* TOC */ + void * static_chain; /* Pointer to closure */ +diff --git a/js/src/ctypes/libffi/src/powerpc/linux64.S b/js/src/ctypes/libffi/src/powerpc/linux64.S +--- a/js/src/ctypes/libffi/src/powerpc/linux64.S ++++ b/js/src/ctypes/libffi/src/powerpc/linux64.S +@@ -25,56 +25,86 @@ + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + #define LIBFFI_ASM + #include + #include + + #ifdef __powerpc64__ +- .hidden ffi_call_LINUX64, .ffi_call_LINUX64 +- .globl ffi_call_LINUX64, .ffi_call_LINUX64 ++ .hidden ffi_call_LINUX64 ++ .globl ffi_call_LINUX64 ++# if _CALL_ELF == 2 ++ .text ++ffi_call_LINUX64: ++ addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha ++ addi %r2, %r2, .TOC.-ffi_call_LINUX64@l ++ .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 ++# else + .section ".opd","aw" + .align 3 + ffi_call_LINUX64: ++# ifdef _CALL_LINUX ++ .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 ++ .type ffi_call_LINUX64,@function ++ .text ++.L.ffi_call_LINUX64: ++# else ++ .hidden .ffi_call_LINUX64 ++ .globl .ffi_call_LINUX64 + .quad .ffi_call_LINUX64,.TOC.@tocbase,0 + .size ffi_call_LINUX64,24 + .type .ffi_call_LINUX64,@function + .text + .ffi_call_LINUX64: ++# endif ++# endif + .LFB1: + mflr %r0 + std %r28, -32(%r1) + std %r29, -24(%r1) + std %r30, -16(%r1) + std %r31, -8(%r1) + std %r0, 16(%r1) + + mr %r28, %r1 /* our AP. */ + .LCFI0: + stdux %r1, %r1, %r4 + mr %r31, %r5 /* flags, */ + mr %r30, %r6 /* rvalue, */ + mr %r29, %r7 /* function address. */ ++/* Save toc pointer, not for the ffi_prep_args64 call, but for the later ++ bctrl function call. */ ++# if _CALL_ELF == 2 ++ std %r2, 24(%r1) ++# else + std %r2, 40(%r1) ++# endif + + /* Call ffi_prep_args64. */ + mr %r4, %r1 ++# if defined _CALL_LINUX || _CALL_ELF == 2 ++ bl ffi_prep_args64 ++# else + bl .ffi_prep_args64 ++# endif + +- ld %r0, 0(%r29) ++# if _CALL_ELF == 2 ++ mr %r12, %r29 ++# else ++ ld %r12, 0(%r29) + ld %r2, 8(%r29) + ld %r11, 16(%r29) +- ++# endif + /* Now do the call. */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, %r31 + + /* Get the address to call into CTR. */ +- mtctr %r0 ++ mtctr %r12 + /* Load all those argument registers. */ + ld %r3, -32-(8*8)(%r28) + ld %r4, -32-(7*8)(%r28) + ld %r5, -32-(6*8)(%r28) + ld %r6, -32-(5*8)(%r28) + bf- 5, 1f + ld %r7, -32-(4*8)(%r28) + ld %r8, -32-(3*8)(%r28) +@@ -99,50 +129,93 @@ 1: + lfd %f13, -32-(9*8)(%r28) + 2: + + /* Make the call. */ + bctrl + + /* This must follow the call immediately, the unwinder + uses this to find out if r2 has been saved or not. */ ++# if _CALL_ELF == 2 ++ ld %r2, 24(%r1) ++# else + ld %r2, 40(%r1) ++# endif + + /* Now, deal with the return value. */ + mtcrf 0x01, %r31 +- bt- 30, .Ldone_return_value +- bt- 29, .Lfp_return_value ++ bt 31, .Lstruct_return_value ++ bt 30, .Ldone_return_value ++ bt 29, .Lfp_return_value + std %r3, 0(%r30) + /* Fall through... */ + + .Ldone_return_value: + /* Restore the registers we used and return. */ + mr %r1, %r28 + ld %r0, 16(%r28) +- ld %r28, -32(%r1) ++ ld %r28, -32(%r28) + mtlr %r0 + ld %r29, -24(%r1) + ld %r30, -16(%r1) + ld %r31, -8(%r1) + blr + + .Lfp_return_value: + bf 28, .Lfloat_return_value + stfd %f1, 0(%r30) + mtcrf 0x02, %r31 /* cr6 */ + bf 27, .Ldone_return_value + stfd %f2, 8(%r30) + b .Ldone_return_value + .Lfloat_return_value: + stfs %f1, 0(%r30) + b .Ldone_return_value ++ ++.Lstruct_return_value: ++ bf 29, .Lsmall_struct ++ bf 28, .Lfloat_homog_return_value ++ stfd %f1, 0(%r30) ++ stfd %f2, 8(%r30) ++ stfd %f3, 16(%r30) ++ stfd %f4, 24(%r30) ++ stfd %f5, 32(%r30) ++ stfd %f6, 40(%r30) ++ stfd %f7, 48(%r30) ++ stfd %f8, 56(%r30) ++ b .Ldone_return_value ++ ++.Lfloat_homog_return_value: ++ stfs %f1, 0(%r30) ++ stfs %f2, 4(%r30) ++ stfs %f3, 8(%r30) ++ stfs %f4, 12(%r30) ++ stfs %f5, 16(%r30) ++ stfs %f6, 20(%r30) ++ stfs %f7, 24(%r30) ++ stfs %f8, 28(%r30) ++ b .Ldone_return_value ++ ++.Lsmall_struct: ++ std %r3, 0(%r30) ++ std %r4, 8(%r30) ++ b .Ldone_return_value ++ + .LFE1: + .long 0 + .byte 0,12,0,1,128,4,0,0 ++# if _CALL_ELF == 2 ++ .size ffi_call_LINUX64,.-ffi_call_LINUX64 ++# else ++# ifdef _CALL_LINUX ++ .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 ++# else + .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 ++# endif ++# endif + + .section .eh_frame,EH_FRAME_FLAGS,@progbits + .Lframe1: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry + .LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation +@@ -175,13 +248,13 @@ 2: + .byte 0x9e # DW_CFA_offset, column 0x1e + .uleb128 0x2 + .byte 0x9d # DW_CFA_offset, column 0x1d + .uleb128 0x3 + .byte 0x9c # DW_CFA_offset, column 0x1c + .uleb128 0x4 + .align 3 + .LEFDE1: ++ ++# if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 ++ .section .note.GNU-stack,"",@progbits ++# endif + #endif +- +-#if defined __ELF__ && defined __linux__ +- .section .note.GNU-stack,"",@progbits +-#endif +diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/libffi/src/powerpc/linux64_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/linux64_closure.S +@@ -27,179 +27,332 @@ + #define LIBFFI_ASM + #include + #include + + .file "linux64_closure.S" #ifdef __powerpc64__ FFI_HIDDEN (ffi_closure_LINUX64) @@ -3006,7 +3783,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S - std %r6, 72(%r1) +# if _CALL_ELF == 2 + ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif -+ mflr %r0 + mflr %r0 + lwz %r12, 28(%r12) # cif->flags + mtcrf 0x40, %r12 + addi %r12, %r1, PARMSAVE @@ -3026,11 +3803,15 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S + std %r8, 40(%r12) + std %r9, 48(%r12) + std %r10, 56(%r12) -+ + +- std %r7, 80(%r1) +- std %r8, 88(%r1) +- std %r9, 96(%r1) +- std %r10, 104(%r1) + # load up the pointer to the parm save area + mr %r5, %r12 +# else - mflr %r0 ++ mflr %r0 + # Save general regs into parm save area + # This is the parameter save area set up by our caller. + std %r3, PARMSAVE+0(%r1) @@ -3041,35 +3822,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S + std %r8, PARMSAVE+40(%r1) + std %r9, PARMSAVE+48(%r1) + std %r10, PARMSAVE+56(%r1) - -- std %r7, 80(%r1) -- std %r8, 88(%r1) -- std %r9, 96(%r1) -- std %r10, 104(%r1) ++ std %r0, 16(%r1) - # mandatory 48 bytes special reg save area + 64 bytes parm save area - # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 - stdu %r1, -240(%r1) --.LCFI0: + # load up the pointer to the parm save area + addi %r5, %r1, PARMSAVE +# endif - - # next save fpr 1 to fpr 13 -- stfd %f1, 128+(0*8)(%r1) -- stfd %f2, 128+(1*8)(%r1) -- stfd %f3, 128+(2*8)(%r1) -- stfd %f4, 128+(3*8)(%r1) -- stfd %f5, 128+(4*8)(%r1) -- stfd %f6, 128+(5*8)(%r1) -- stfd %f7, 128+(6*8)(%r1) -- stfd %f8, 128+(7*8)(%r1) -- stfd %f9, 128+(8*8)(%r1) -- stfd %f10, 128+(9*8)(%r1) -- stfd %f11, 128+(10*8)(%r1) -- stfd %f12, 128+(11*8)(%r1) -- stfd %f13, 128+(12*8)(%r1) ++ ++ # next save fpr 1 to fpr 13 + stfd %f1, -104+(0*8)(%r1) + stfd %f2, -104+(1*8)(%r1) + stfd %f3, -104+(2*8)(%r1) @@ -3083,27 +3846,44 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S + stfd %f11, -104+(10*8)(%r1) + stfd %f12, -104+(11*8)(%r1) + stfd %f13, -104+(12*8)(%r1) - -- # set up registers for the routine that actually does the work -- # get the context pointer from the trampoline -- mr %r3, %r11 ++ + # load up the pointer to the saved fpr registers */ + addi %r6, %r1, -104 - -- # now load up the pointer to the result storage -- addi %r4, %r1, 112 ++ + # load up the pointer to the result storage + addi %r4, %r1, -STACKFRAME+RETVAL ++ ++ stdu %r1, -STACKFRAME(%r1) + .LCFI0: +- # next save fpr 1 to fpr 13 +- stfd %f1, 128+(0*8)(%r1) +- stfd %f2, 128+(1*8)(%r1) +- stfd %f3, 128+(2*8)(%r1) +- stfd %f4, 128+(3*8)(%r1) +- stfd %f5, 128+(4*8)(%r1) +- stfd %f6, 128+(5*8)(%r1) +- stfd %f7, 128+(6*8)(%r1) +- stfd %f8, 128+(7*8)(%r1) +- stfd %f9, 128+(8*8)(%r1) +- stfd %f10, 128+(9*8)(%r1) +- stfd %f11, 128+(10*8)(%r1) +- stfd %f12, 128+(11*8)(%r1) +- stfd %f13, 128+(12*8)(%r1) +- +- # set up registers for the routine that actually does the work + # get the context pointer from the trampoline +- mr %r3, %r11 +- +- # now load up the pointer to the result storage +- addi %r4, %r1, 112 +- - # now load up the pointer to the parameter save area - # in the previous frame - addi %r5, %r1, 240 + 48 -+ stdu %r1, -STACKFRAME(%r1) -+.LCFI0: - +- - # now load up the pointer to the saved fpr registers */ - addi %r6, %r1, 128 -+ # get the context pointer from the trampoline + mr %r3, %r11 # make the call @@ -3115,7 +3895,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S .Lret: # now r3 contains the return type -@@ -100,10 +161,12 @@ ffi_closure_LINUX64: + # so use it to look up in a table + # so we know how to deal with each type # look up the proper starting point in table # by using return type as offset @@ -3129,7 +3910,12 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S add %r3, %r3, %r4 # add contents of table to table address mtctr %r3 bctr # jump to it -@@ -116,85 +179,175 @@ ffi_closure_LINUX64: + + # Each of the ret_typeX code fragments has to be exactly 16 bytes long + # (4 instructions). For cache effectiveness we align to a 16 byte boundary + # first. + .align 4 + .Lret_type0: # case FFI_TYPE_VOID mtlr %r0 @@ -3261,7 +4047,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S mtlr %r0 - addi %r1, %r1, 240 + addi %r1, %r1, STACKFRAME -+ blr + blr +-# esac +# case FFI_V2_TYPE_FLOAT_HOMOG + lfs %f1, RETVAL+0(%r1) + lfs %f2, RETVAL+4(%r1) @@ -3314,8 +4101,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S + sldi %r5, %r5, 3 + addi %r1, %r1, STACKFRAME + srd %r3, %r3, %r5 - blr --# esac ++ blr +# endif + .LFE1: @@ -3333,7 +4119,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: -@@ -223,14 +376,14 @@ ffi_closure_LINUX64: + .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry + .LSCIE1: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation +@@ -218,19 +371,19 @@ ffi_closure_LINUX64: + .LASFDE1: + .4byte .LASFDE1-.Lframe1 # FDE CIE offset + .8byte .LFB1-. # FDE initial location + .8byte .LFE1-.LFB1 # FDE address range + .uleb128 0x0 # Augmentation size .byte 0x2 # DW_CFA_advance_loc1 .byte .LCFI0-.LFB1 .byte 0xe # DW_CFA_def_cfa_offset @@ -3344,186 +4140,24 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64_closure.S .sleb128 -2 .align 3 .LEFDE1: --#endif - --#if defined __ELF__ && defined __linux__ ++ +# if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits ++ .section .note.GNU-stack,"",@progbits +# endif #endif -Index: mozilla/js/src/ctypes/libffi/src/powerpc/linux64.S -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/linux64.S -+++ mozilla/js/src/ctypes/libffi/src/powerpc/linux64.S -@@ -30,16 +30,33 @@ - #include - - #ifdef __powerpc64__ -- .hidden ffi_call_LINUX64, .ffi_call_LINUX64 -- .globl ffi_call_LINUX64, .ffi_call_LINUX64 -+ .hidden ffi_call_LINUX64 -+ .globl ffi_call_LINUX64 -+# if _CALL_ELF == 2 -+ .text -+ffi_call_LINUX64: -+ addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha -+ addi %r2, %r2, .TOC.-ffi_call_LINUX64@l -+ .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 -+# else - .section ".opd","aw" - .align 3 - ffi_call_LINUX64: -+# ifdef _CALL_LINUX -+ .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 -+ .type ffi_call_LINUX64,@function -+ .text -+.L.ffi_call_LINUX64: -+# else -+ .hidden .ffi_call_LINUX64 -+ .globl .ffi_call_LINUX64 - .quad .ffi_call_LINUX64,.TOC.@tocbase,0 - .size ffi_call_LINUX64,24 - .type .ffi_call_LINUX64,@function - .text - .ffi_call_LINUX64: -+# endif -+# endif - .LFB1: - mflr %r0 - std %r28, -32(%r1) -@@ -54,22 +71,35 @@ ffi_call_LINUX64: - mr %r31, %r5 /* flags, */ - mr %r30, %r6 /* rvalue, */ - mr %r29, %r7 /* function address. */ -+/* Save toc pointer, not for the ffi_prep_args64 call, but for the later -+ bctrl function call. */ -+# if _CALL_ELF == 2 -+ std %r2, 24(%r1) -+# else - std %r2, 40(%r1) -+# endif - - /* Call ffi_prep_args64. */ - mr %r4, %r1 -+# if defined _CALL_LINUX || _CALL_ELF == 2 -+ bl ffi_prep_args64 -+# else - bl .ffi_prep_args64 -+# endif - -- ld %r0, 0(%r29) -+# if _CALL_ELF == 2 -+ mr %r12, %r29 -+# else -+ ld %r12, 0(%r29) - ld %r2, 8(%r29) - ld %r11, 16(%r29) - -+# endif - /* Now do the call. */ - /* Set up cr1 with bits 4-7 of the flags. */ - mtcrf 0x40, %r31 - - /* Get the address to call into CTR. */ -- mtctr %r0 -+ mtctr %r12 - /* Load all those argument registers. */ - ld %r3, -32-(8*8)(%r28) - ld %r4, -32-(7*8)(%r28) -@@ -104,12 +134,17 @@ ffi_call_LINUX64: - - /* This must follow the call immediately, the unwinder - uses this to find out if r2 has been saved or not. */ -+# if _CALL_ELF == 2 -+ ld %r2, 24(%r1) -+# else - ld %r2, 40(%r1) -+# endif - - /* Now, deal with the return value. */ - mtcrf 0x01, %r31 -- bt- 30, .Ldone_return_value -- bt- 29, .Lfp_return_value -+ bt 31, .Lstruct_return_value -+ bt 30, .Ldone_return_value -+ bt 29, .Lfp_return_value - std %r3, 0(%r30) - /* Fall through... */ - -@@ -117,7 +152,7 @@ ffi_call_LINUX64: - /* Restore the registers we used and return. */ - mr %r1, %r28 - ld %r0, 16(%r28) -- ld %r28, -32(%r1) -+ ld %r28, -32(%r28) - mtlr %r0 - ld %r29, -24(%r1) - ld %r30, -16(%r1) -@@ -134,10 +169,48 @@ ffi_call_LINUX64: - .Lfloat_return_value: - stfs %f1, 0(%r30) - b .Ldone_return_value -+ -+.Lstruct_return_value: -+ bf 29, .Lsmall_struct -+ bf 28, .Lfloat_homog_return_value -+ stfd %f1, 0(%r30) -+ stfd %f2, 8(%r30) -+ stfd %f3, 16(%r30) -+ stfd %f4, 24(%r30) -+ stfd %f5, 32(%r30) -+ stfd %f6, 40(%r30) -+ stfd %f7, 48(%r30) -+ stfd %f8, 56(%r30) -+ b .Ldone_return_value -+ -+.Lfloat_homog_return_value: -+ stfs %f1, 0(%r30) -+ stfs %f2, 4(%r30) -+ stfs %f3, 8(%r30) -+ stfs %f4, 12(%r30) -+ stfs %f5, 16(%r30) -+ stfs %f6, 20(%r30) -+ stfs %f7, 24(%r30) -+ stfs %f8, 28(%r30) -+ b .Ldone_return_value -+ -+.Lsmall_struct: -+ std %r3, 0(%r30) -+ std %r4, 8(%r30) -+ b .Ldone_return_value -+ - .LFE1: - .long 0 - .byte 0,12,0,1,128,4,0,0 -+# if _CALL_ELF == 2 -+ .size ffi_call_LINUX64,.-ffi_call_LINUX64 -+# else -+# ifdef _CALL_LINUX -+ .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 -+# else - .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 -+# endif -+# endif - - .section .eh_frame,EH_FRAME_FLAGS,@progbits - .Lframe1: -@@ -180,8 +253,8 @@ ffi_call_LINUX64: - .uleb128 0x4 - .align 3 - .LEFDE1: --#endif - -#if defined __ELF__ && defined __linux__ -+# if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -+# endif - #endif -Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/ppc_closure.S -+++ mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S -@@ -122,43 +122,78 @@ ENTRY(ffi_closure_SYSV) +- .section .note.GNU-stack,"",@progbits +-#endif +diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libffi/src/powerpc/ppc_closure.S +--- a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S ++++ b/js/src/ctypes/libffi/src/powerpc/ppc_closure.S +@@ -117,53 +117,88 @@ ENTRY(ffi_closure_SYSV) + # case FFI_TYPE_INT + lwz %r3,112+0(%r1) + mtlr %r0 + .Lfinish: + addi %r1,%r1,144 blr # case FFI_TYPE_FLOAT @@ -3602,7 +4236,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S mtlr %r0 addi %r1,%r1,144 blr -@@ -203,7 +238,7 @@ ENTRY(ffi_closure_SYSV) + + # case FFI_TYPE_UINT32 + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 +@@ -198,76 +233,99 @@ ENTRY(ffi_closure_SYSV) + mtlr %r0 + addi %r1,%r1,144 + blr + + # case FFI_TYPE_UINT128 lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) lwz %r5,112+8(%r1) @@ -3611,7 +4255,16 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S # The return types below are only used when the ABI type is FFI_SYSV. # case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. -@@ -220,9 +255,15 @@ ENTRY(ffi_closure_SYSV) + lbz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr + + # case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. + lhz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + blr # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. lwz %r3,112+0(%r1) @@ -3627,7 +4280,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. lwz %r3,112+0(%r1) -@@ -233,20 +274,35 @@ ENTRY(ffi_closure_SYSV) + mtlr %r0 + addi %r1,%r1,144 + blr + # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) @@ -3663,7 +4319,7 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. lwz %r3,112+0(%r1) -@@ -254,6 +310,7 @@ ENTRY(ffi_closure_SYSV) + lwz %r4,112+4(%r1) mtlr %r0 b .Lfinish @@ -3671,7 +4327,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S .Lstruct567: subfic %r6,%r5,32 srw %r4,%r4,%r5 -@@ -263,6 +320,7 @@ ENTRY(ffi_closure_SYSV) + slw %r6,%r3,%r6 + srw %r3,%r3,%r5 + or %r4,%r6,%r4 mtlr %r0 addi %r1,%r1,144 blr @@ -3679,11 +4337,20 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/ppc_closure.S .Luint128: lwz %r6,112+12(%r1) -Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S -=================================================================== ---- mozilla.orig/js/src/ctypes/libffi/src/powerpc/sysv.S -+++ mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S -@@ -83,6 +83,7 @@ ENTRY(ffi_call_SYSV) + mtlr %r0 + addi %r1,%r1,144 + blr + + END(ffi_closure_SYSV) +diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/powerpc/sysv.S +--- a/js/src/ctypes/libffi/src/powerpc/sysv.S ++++ b/js/src/ctypes/libffi/src/powerpc/sysv.S +@@ -78,37 +78,41 @@ ENTRY(ffi_call_SYSV) + nop + lwz %r7,-16-(4*4)(%r28) + lwz %r8,-16-(3*4)(%r28) + lwz %r9,-16-(2*4)(%r28) + lwz %r10,-16-(1*4)(%r28) nop 1: @@ -3691,7 +4358,11 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S /* Load all the FP registers. */ bf- 6,2f lfd %f1,-16-(8*4)-(8*8)(%r28) -@@ -94,6 +95,7 @@ ENTRY(ffi_call_SYSV) + lfd %f2,-16-(8*4)-(7*8)(%r28) + lfd %f3,-16-(8*4)-(6*8)(%r28) + lfd %f4,-16-(8*4)-(5*8)(%r28) + nop + lfd %f5,-16-(8*4)-(4*8)(%r28) lfd %f6,-16-(8*4)-(3*8)(%r28) lfd %f7,-16-(8*4)-(2*8)(%r28) lfd %f8,-16-(8*4)-(1*8)(%r28) @@ -3699,7 +4370,9 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S 2: /* Make the call. */ -@@ -103,7 +105,9 @@ ENTRY(ffi_call_SYSV) + bctrl + + /* Now, deal with the return value. */ mtcrf 0x01,%r31 /* cr7 */ bt- 31,L(small_struct_return_value) bt- 30,L(done_return_value) @@ -3709,7 +4382,17 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S stw %r3,0(%r30) bf+ 28,L(done_return_value) stw %r4,4(%r30) -@@ -124,6 +128,7 @@ L(done_return_value): + mtcrf 0x02,%r31 /* cr6 */ + bf 27,L(done_return_value) + stw %r5,8(%r30) + stw %r6,12(%r30) + /* Fall through... */ +@@ -119,41 +123,38 @@ L(done_return_value): + lwz %r31, -4(%r28) + mtlr %r9 + lwz %r30, -8(%r28) + lwz %r29,-12(%r28) + lwz %r28,-16(%r28) lwz %r1,0(%r1) blr @@ -3717,7 +4400,10 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S L(fp_return_value): bf 28,L(float_return_value) stfd %f1,0(%r30) -@@ -134,21 +139,17 @@ L(fp_return_value): + mtcrf 0x02,%r31 /* cr6 */ + bf 27,L(done_return_value) + stfd %f2,8(%r30) + b L(done_return_value) L(float_return_value): stfs %f1,0(%r30) b L(done_return_value) @@ -3748,3 +4434,8 @@ Index: mozilla/js/src/ctypes/libffi/src/powerpc/sysv.S .LFE1: END(ffi_call_SYSV) + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits + .Lframe1: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ + .LSCIE1: diff --git a/mozilla-ppc64le.patch b/mozilla-ppc64le.patch new file mode 100644 index 00000000..ea37c5b0 --- /dev/null +++ b/mozilla-ppc64le.patch @@ -0,0 +1,257 @@ +# HG changeset patch +# Parent cad86882605788345b2791275efc6e1fa7500dbd +# User Ulrich Weigand +General PPC64 LE support + +diff --git a/configure.in b/configure.in +--- a/configure.in ++++ b/configure.in +@@ -1079,17 +1079,17 @@ esac + + # Only set CPU_ARCH if we recognize the value of OS_TEST + + case "$OS_TEST" in + *86 | i86pc) + CPU_ARCH=x86 + ;; + +-powerpc64 | ppc64) ++powerpc64 | ppc64 | powerpc64le | ppc64le) + CPU_ARCH=ppc64 + ;; + + powerpc | ppc | rs6000) + CPU_ARCH=ppc + ;; + + Alpha | alpha | ALPHA) +diff --git a/js/src/assembler/wtf/Platform.h b/js/src/assembler/wtf/Platform.h +--- a/js/src/assembler/wtf/Platform.h ++++ b/js/src/assembler/wtf/Platform.h +@@ -160,26 +160,32 @@ + /* WTF_CPU_PPC - PowerPC 32-bit */ + #if defined(__ppc__) \ + || defined(__PPC__) \ + || defined(__powerpc__) \ + || defined(__powerpc) \ + || defined(__POWERPC__) \ + || defined(_M_PPC) \ + || defined(__PPC) ++#if !defined(__ppc64__) && !defined(__PPC64__) + #define WTF_CPU_PPC 1 ++#endif ++#if !defined(__LITTLE_ENDIAN__) + #define WTF_CPU_BIG_ENDIAN 1 + #endif ++#endif + + /* WTF_CPU_PPC64 - PowerPC 64-bit */ + #if defined(__ppc64__) \ + || defined(__PPC64__) + #define WTF_CPU_PPC64 1 ++#if !defined(__LITTLE_ENDIAN__) + #define WTF_CPU_BIG_ENDIAN 1 + #endif ++#endif + + /* WTF_CPU_SH4 - SuperH SH-4 */ + #if defined(__SH4__) + #define WTF_CPU_SH4 1 + #endif + + /* WTF_CPU_SPARC32 - SPARC 32-bit */ + #if defined(__sparc) && !defined(__arch64__) || defined(__sparcv8) +diff --git a/js/src/configure.in b/js/src/configure.in +--- a/js/src/configure.in ++++ b/js/src/configure.in +@@ -910,17 +910,17 @@ esac + + # Only set CPU_ARCH if we recognize the value of OS_TEST + + case "$OS_TEST" in + *86 | i86pc) + CPU_ARCH=x86 + ;; + +-powerpc64 | ppc64) ++powerpc64 | ppc64 | powerpc64le | ppc64le) + CPU_ARCH=ppc64 + ;; + + powerpc | ppc | rs6000) + CPU_ARCH=ppc + ;; + + Alpha | alpha | ALPHA) +diff --git a/js/src/jscpucfg.h b/js/src/jscpucfg.h +--- a/js/src/jscpucfg.h ++++ b/js/src/jscpucfg.h +@@ -26,17 +26,17 @@ + # define HAVE_VA_LIST_AS_ARRAY 1 + # endif + + # define IS_LITTLE_ENDIAN 1 + # undef IS_BIG_ENDIAN + # define JS_BYTES_PER_WORD 4 + # define JS_BITS_PER_WORD_LOG2 5 + +-#elif defined(__APPLE__) ++#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) + # if __LITTLE_ENDIAN__ + # define IS_LITTLE_ENDIAN 1 + # undef IS_BIG_ENDIAN + # elif __BIG_ENDIAN__ + # undef IS_LITTLE_ENDIAN + # define IS_BIG_ENDIAN 1 + # endif + +@@ -88,18 +88,17 @@ + # if defined(_STACK_GROWS_UPWARD) + # define JS_STACK_GROWTH_DIRECTION (1) + # elif defined(_STACK_GROWS_DOWNWARD) + # define JS_STACK_GROWTH_DIRECTION (-1) + # endif + # endif + + #elif defined(__sparc) || defined(__sparc__) || \ +- defined(_POWER) || defined(__powerpc__) || \ +- defined(__ppc__) || defined(__hppa) || \ ++ defined(_POWER) || defined(__hppa) || \ + defined(_MIPSEB) || defined(_BIG_ENDIAN) + /* IA64 running HP-UX will have _BIG_ENDIAN defined. + * IA64 running Linux will have endian.h and be handled above. + */ + # undef IS_LITTLE_ENDIAN + # define IS_BIG_ENDIAN 1 + + #else /* !defined(__sparc) && !defined(__sparc__) && ... */ +diff --git a/media/webrtc/trunk/webrtc/typedefs.h b/media/webrtc/trunk/webrtc/typedefs.h +--- a/media/webrtc/trunk/webrtc/typedefs.h ++++ b/media/webrtc/trunk/webrtc/typedefs.h +@@ -47,23 +47,33 @@ + //#define WEBRTC_ARCH_ARM_FAMILY + //#define WEBRTC_ARCH_ARMEL + #define WEBRTC_ARCH_32_BITS + #define WEBRTC_ARCH_LITTLE_ENDIAN + #define WEBRTC_LITTLE_ENDIAN + #elif defined(__powerpc64__) + #define WEBRTC_ARCH_PPC64 1 + #define WEBRTC_ARCH_64_BITS 1 ++#ifdef __LITTLE_ENDIAN__ ++#define WEBRTC_ARCH_LITTLE_ENDIAN ++#define WEBRTC_LITTLE_ENDIAN ++#else + #define WEBRTC_ARCH_BIG_ENDIAN + #define WEBRTC_BIG_ENDIAN ++#endif + #elif defined(__ppc__) || defined(__powerpc__) + #define WEBRTC_ARCH_PPC 1 + #define WEBRTC_ARCH_32_BITS 1 ++#ifdef __LITTLE_ENDIAN__ ++#define WEBRTC_ARCH_LITTLE_ENDIAN ++#define WEBRTC_LITTLE_ENDIAN ++#else + #define WEBRTC_ARCH_BIG_ENDIAN + #define WEBRTC_BIG_ENDIAN ++#endif + #elif defined(__sparc64__) + #define WEBRTC_ARCH_SPARC 1 + #define WEBRTC_ARCH_64_BITS 1 + #define WEBRTC_ARCH_BIG_ENDIAN + #define WEBRTC_BIG_ENDIAN + #elif defined(__sparc__) + #define WEBRTC_ARCH_SPARC 1 + #define WEBRTC_ARCH_32_BITS 1 +diff --git a/mfbt/Endian.h b/mfbt/Endian.h +--- a/mfbt/Endian.h ++++ b/mfbt/Endian.h +@@ -86,17 +86,17 @@ + # error "CPU type is unknown" + # endif + #elif defined(_WIN32) + # if defined(_M_IX86) + # define MOZ_LITTLE_ENDIAN 1 + # else + # error "CPU type is unknown" + # endif +-#elif defined(__APPLE__) ++#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) + # if __LITTLE_ENDIAN__ + # define MOZ_LITTLE_ENDIAN 1 + # elif __BIG_ENDIAN__ + # define MOZ_BIG_ENDIAN 1 + # endif + #elif defined(__GNUC__) && \ + defined(__BYTE_ORDER__) && \ + defined(__ORDER_LITTLE_ENDIAN__) && \ +@@ -114,18 +114,17 @@ + # endif + /* + * We can't include useful headers like or + * here because they're not present on all platforms. Instead we have + * this big conditional that ideally will catch all the interesting + * cases. + */ + #elif defined(__sparc) || defined(__sparc__) || \ +- defined(_POWER) || defined(__powerpc__) || \ +- defined(__ppc__) || defined(__hppa) || \ ++ defined(_POWER) || defined(__hppa) || \ + defined(_MIPSEB) || defined(__ARMEB__) || \ + defined(__s390__) || \ + (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \ + (defined(__ia64) && defined(__BIG_ENDIAN__)) + # define MOZ_BIG_ENDIAN 1 + #elif defined(__i386) || defined(__i386__) || \ + defined(__x86_64) || defined(__x86_64__) || \ + defined(_MIPSEL) || defined(__ARMEL__) || \ +diff --git a/nsprpub/pr/include/md/_linux.cfg b/nsprpub/pr/include/md/_linux.cfg +--- a/nsprpub/pr/include/md/_linux.cfg ++++ b/nsprpub/pr/include/md/_linux.cfg +@@ -24,18 +24,23 @@ + #elif defined(__GNU__) + #define PR_AF_INET6 26 /* same as AF_INET6 */ + #else + #define PR_AF_INET6 10 /* same as AF_INET6 */ + #endif + + #ifdef __powerpc64__ + ++#ifdef __LITTLE_ENDIAN__ ++#define IS_LITTLE_ENDIAN 1 ++#undef IS_BIG_ENDIAN ++#else + #undef IS_LITTLE_ENDIAN + #define IS_BIG_ENDIAN 1 ++#endif + #define IS_64 + + #define PR_BYTES_PER_BYTE 1 + #define PR_BYTES_PER_SHORT 2 + #define PR_BYTES_PER_INT 4 + #define PR_BYTES_PER_INT64 8 + #define PR_BYTES_PER_LONG 8 + #define PR_BYTES_PER_FLOAT 4 +@@ -70,18 +75,23 @@ + #define PR_ALIGN_OF_POINTER 8 + #define PR_ALIGN_OF_WORD 8 + + #define PR_BYTES_PER_WORD_LOG2 3 + #define PR_BYTES_PER_DWORD_LOG2 3 + + #elif defined(__powerpc__) + ++#ifdef __LITTLE_ENDIAN__ ++#define IS_LITTLE_ENDIAN 1 ++#undef IS_BIG_ENDIAN ++#else + #undef IS_LITTLE_ENDIAN + #define IS_BIG_ENDIAN 1 ++#endif + + #define PR_BYTES_PER_BYTE 1 + #define PR_BYTES_PER_SHORT 2 + #define PR_BYTES_PER_INT 4 + #define PR_BYTES_PER_INT64 8 + #define PR_BYTES_PER_LONG 4 + #define PR_BYTES_PER_FLOAT 4 + #define PR_BYTES_PER_DOUBLE 8 diff --git a/xpcom-ppc64le.patch b/mozilla-xpcom-ppc64le.patch similarity index 55% rename from xpcom-ppc64le.patch rename to mozilla-xpcom-ppc64le.patch index eb40f96c..aced2284 100644 --- a/xpcom-ppc64le.patch +++ b/mozilla-xpcom-ppc64le.patch @@ -1,8 +1,39 @@ -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/moz.build -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build -@@ -198,6 +198,13 @@ if CONFIG['OS_TEST'] == 'powerpc64': +# HG changeset patch +# Parent eaf8cf90f24bed087b8dc3900e57dc481c62e2a8 +# User Ulrich Weigand +PPC64 LE support for XPCOM + +diff --git a/xpcom/reflect/xptcall/src/md/unix/Makefile.in b/xpcom/reflect/xptcall/src/md/unix/Makefile.in +--- a/xpcom/reflect/xptcall/src/md/unix/Makefile.in ++++ b/xpcom/reflect/xptcall/src/md/unix/Makefile.in +@@ -161,17 +161,17 @@ endif + ifneq (,$(filter Linuxpowerpc FreeBSDpowerpc,$(OS_ARCH)$(OS_TEST))) + ASFILES := xptcinvoke_asm_ppc_linux.s xptcstubs_asm_ppc_linux.s + AS := $(CC) -c -x assembler-with-cpp + endif + + # + # Linux/PPC64 + # +-ifneq (,$(filter Linuxpowerpc64 FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) ++ifneq (,$(filter Linuxpowerpc64 Linuxpowerpc64le FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) + ASFILES := xptcinvoke_asm_ppc64_linux.s xptcstubs_asm_ppc64_linux.s + AS := $(CC) -c -x assembler-with-cpp + endif + + # + # NetBSD/PPC + # + ifneq (,$(filter NetBSDmacppc NetBSDbebox NetBSDofppc NetBSDprep NetBSDamigappc,$(OS_ARCH)$(OS_TEST))) +diff --git a/xpcom/reflect/xptcall/src/md/unix/moz.build b/xpcom/reflect/xptcall/src/md/unix/moz.build +--- a/xpcom/reflect/xptcall/src/md/unix/moz.build ++++ b/xpcom/reflect/xptcall/src/md/unix/moz.build +@@ -193,16 +193,23 @@ if CONFIG['OS_TEST'] == 'powerpc': + + if CONFIG['OS_TEST'] == 'powerpc64': + if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'): + CPP_SOURCES += [ + 'xptcinvoke_ppc64_linux.cpp', 'xptcstubs_ppc64_linux.cpp', ] @@ -16,24 +47,20 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build if CONFIG['OS_TEST'] in ('macppc', 'bebox', 'ofppc', 'prep', 'amigappc'): if CONFIG['OS_ARCH'] == 'NetBSD': CPP_SOURCES += [ -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/Makefile.in -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in -@@ -166,7 +166,7 @@ endif - # - # Linux/PPC64 - # --ifneq (,$(filter Linuxpowerpc64 FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) -+ifneq (,$(filter Linuxpowerpc64 Linuxpowerpc64le FreeBSDpowerpc64,$(OS_ARCH)$(OS_TEST))) - ASFILES := xptcinvoke_asm_ppc64_linux.s xptcstubs_asm_ppc64_linux.s - AS := $(CC) -c -x assembler-with-cpp - endif -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s -@@ -17,12 +17,29 @@ + 'xptcinvoke_ppc_netbsd.cpp', + 'xptcstubs_ppc_netbsd.cpp', + ] + + if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'powerpc': +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s +--- a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s +@@ -12,33 +12,51 @@ + .set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4 + .set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9 + .set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14 + .set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19 + .set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24 .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 .set f30,30; .set f31,31 @@ -63,7 +90,11 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s .section ".toc","aw" .section ".text" .align 2 -@@ -34,6 +51,7 @@ NS_InvokeByIndex: + .globl NS_InvokeByIndex + .section ".opd","aw" + .align 3 + NS_InvokeByIndex: + .quad .NS_InvokeByIndex,.TOC.@tocbase .previous .type NS_InvokeByIndex,@function .NS_InvokeByIndex: @@ -71,7 +102,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s mflr 0 std 0,16(r1) -@@ -56,7 +74,7 @@ NS_InvokeByIndex: + std r29,-24(r1) + std r30,-16(r1) + std r31,-8(r1) + + mr r29,r3 # Save 'that' in r29 +@@ -51,51 +69,55 @@ NS_InvokeByIndex: + # that the stack remains 16-byte aligned. + # + # | ..128-byte stack frame.. | | 7 GP | 13 FP | 3 NV | + # | |(params)........| regs | regs | regs | + # (r1)...........(+112)....(+128) # (-23*8).(-16*8).(-3*8)..(r31) # +stack frame, -unused stack params, +regs storage, +1 for alignment @@ -80,7 +121,15 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s rldicr r7,r7,3,59 # multiply by 8 and mask with ~15 neg r7,r7 stdux r1,r1,r7 -@@ -72,7 +90,7 @@ NS_InvokeByIndex: + + + # Call invoke_copy_to_stack(uint64_t* gpregs, double* fpregs, + # uint32_t paramCount, nsXPTCVariant* s, + # uint64_t* d)) + + # r5, r6 are passed through intact (paramCount, params) + # r7 (d) has to be r1+112 -- where parameters are passed on the stack. + # r3, r4 are above that, easier to address from r31 than from r1 subi r3,r31,(23*8) # r3 --> GPRS subi r4,r31,(16*8) # r4 --> FPRS @@ -89,7 +138,10 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s bl invoke_copy_to_stack nop -@@ -83,14 +101,18 @@ NS_InvokeByIndex: + # Set up to invoke function + + ld r9,0(r29) # vtable (r29 is 'that') + mr r3,r29 # self is first arg, obviously sldi r30,r30,3 # Find function descriptor add r9,r9,r30 @@ -113,7 +165,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s # Load FP and GP registers as required ld r4, -(23*8)(r31) -@@ -117,7 +139,7 @@ NS_InvokeByIndex: + ld r5, -(22*8)(r31) + ld r6, -(21*8)(r31) + ld r7, -(20*8)(r31) + ld r8, -(19*8)(r31) + ld r9, -(18*8)(r31) +@@ -112,21 +134,25 @@ NS_InvokeByIndex: + lfd f9, -(8*8)(r31) + lfd f10, -(7*8)(r31) + lfd f11, -(6*8)(r31) + lfd f12, -(5*8)(r31) + lfd f13, -(4*8)(r31) bctrl # Do it @@ -122,7 +184,8 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s ld r1,0(r1) # Revert stack frame ld 0,16(r1) # Reload lr ld 29,-24(r1) # Restore NVGPRS -@@ -126,7 +148,11 @@ NS_InvokeByIndex: + ld 30,-16(r1) + ld 31,-8(r1) mtlr 0 blr @@ -134,11 +197,15 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc64_linux.s # Magic indicating no need for an executable stack .section .note.GNU-stack, "", @progbits ; .previous -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp -@@ -74,7 +74,9 @@ invoke_copy_to_stack(uint64_t* gpregs, +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp +--- a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp +@@ -69,17 +69,19 @@ invoke_copy_to_stack(uint64_t* gpregs, + else + *(double *)d = s->val.d; + } + else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) { + if (i < FPR_COUNT) { fpregs[i] = s->val.f; // if passed in registers, floats are promoted to doubles } else { float *p = (float *)d; @@ -148,11 +215,20 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc64_linux.cpp *p = s->val.f; } } -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s -@@ -17,6 +17,27 @@ + else { + if (i < GPR_COUNT) + gpregs[i] = tempu64; + else + *d = tempu64; +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s +--- a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s +@@ -12,28 +12,50 @@ + .set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4 + .set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9 + .set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14 + .set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19 + .set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24 .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29 .set f30,30; .set f31,31 @@ -180,7 +256,12 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s .section ".text" .align 2 .globl SharedStub -@@ -29,6 +50,7 @@ SharedStub: + .section ".opd","aw" + .align 3 + + SharedStub: + .quad .SharedStub,.TOC.@tocbase + .previous .type SharedStub,@function .SharedStub: @@ -188,7 +269,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s mflr r0 std r4, -56(r1) # Save all GPRS -@@ -55,7 +77,7 @@ SharedStub: + std r5, -48(r1) + std r6, -40(r1) + std r7, -32(r1) + std r8, -24(r1) + std r9, -16(r1) +@@ -50,17 +72,17 @@ SharedStub: + stfd f5, -128(r1) + stfd f4, -136(r1) + stfd f3, -144(r1) + stfd f2, -152(r1) + stfd f1, -160(r1) subi r6,r1,56 # r6 --> gprData subi r7,r1,160 # r7 --> fprData @@ -197,7 +288,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s std r0, 16(r1) -@@ -75,7 +97,11 @@ SharedStub: + stdu r1,-288(r1) + # r3 has the 'self' pointer + # already + + mr r4,r11 # r4 is methodIndex selector, +@@ -70,12 +92,16 @@ SharedStub: + bl PrepareAndDispatch + nop + + ld 1,0(r1) # restore stack + ld r0,16(r1) # restore LR mtlr r0 blr @@ -209,11 +310,15 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_ppc64_linux.s # Magic indicating no need for an executable stack .section .note.GNU-stack, "", @progbits ; .previous -Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp -=================================================================== ---- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp -+++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp -@@ -83,7 +83,9 @@ PrepareAndDispatch(nsXPTCStubBase* self, +diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp +--- a/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp ++++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp +@@ -78,17 +78,19 @@ PrepareAndDispatch(nsXPTCStubBase* self, + dp->val.d = fprData[i]; + else + dp->val.d = *(double*) ap; + } else if (!param.IsOut() && type == nsXPTType::T_FLOAT) { + if (i < FPR_COUNT) dp->val.f = (float) fprData[i]; // in registers floats are passed as doubles else { float *p = (float *)ap; @@ -223,7 +328,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp dp->val.f = *p; } } else { /* integer type or pointer */ -@@ -153,6 +155,43 @@ PrepareAndDispatch(nsXPTCStubBase* self, + if (i < GPR_COUNT) + tempu64 = gprData[i]; + else + tempu64 = *ap; + +@@ -148,16 +150,53 @@ PrepareAndDispatch(nsXPTCStubBase* self, + // Create names would be like: + // _ZN14nsXPTCStubBase5Stub1Ev + // _ZN14nsXPTCStubBase6Stub12Ev + // _ZN14nsXPTCStubBase7Stub123Ev + // _ZN14nsXPTCStubBase8Stub1234Ev // etc. // Use assembler directives to get the names right... @@ -267,7 +382,17 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp # define STUB_ENTRY(n) \ __asm__ ( \ ".section \".toc\",\"aw\" \n\t" \ -@@ -195,6 +234,7 @@ __asm__ ( + ".section \".text\" \n\t" \ + ".align 2 \n\t" \ + ".if "#n" < 10 \n\t" \ + ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \ + ".section \".opd\",\"aw\" \n\t" \ +@@ -190,16 +229,17 @@ PrepareAndDispatch(nsXPTCStubBase* self, + \ + ".else \n\t" \ + ".err \"stub number "#n" >= 1000 not yet supported\"\n" \ + ".endif \n\t" \ + \ "li 11,"#n" \n\t" \ "b SharedStub \n" \ ); @@ -275,3 +400,8 @@ Index: mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc64_linux.cpp #define SENTINEL_ENTRY(n) \ nsresult nsXPTCStubBase::Sentinel##n() \ + { \ + NS_ERROR("nsXPTCStubBase::Sentinel called"); \ + return NS_ERROR_NOT_IMPLEMENTED; \ + } + diff --git a/ppc64le-support.patch b/ppc64le-support.patch deleted file mode 100644 index ce7a1672..00000000 --- a/ppc64le-support.patch +++ /dev/null @@ -1,159 +0,0 @@ -Index: mozilla/configure.in -=================================================================== ---- mozilla.orig/configure.in -+++ mozilla/configure.in -@@ -1084,7 +1084,7 @@ case "$OS_TEST" in - CPU_ARCH=x86 - ;; - --powerpc64 | ppc64) -+powerpc64 | ppc64 | powerpc64le | ppc64le) - CPU_ARCH=ppc64 - ;; - -Index: mozilla/js/src/configure.in -=================================================================== ---- mozilla.orig/js/src/configure.in -+++ mozilla/js/src/configure.in -@@ -915,7 +915,7 @@ case "$OS_TEST" in - CPU_ARCH=x86 - ;; - --powerpc64 | ppc64) -+powerpc64 | ppc64 | powerpc64le | ppc64le) - CPU_ARCH=ppc64 - ;; - -Index: mozilla/mfbt/Endian.h -=================================================================== ---- mozilla.orig/mfbt/Endian.h -+++ mozilla/mfbt/Endian.h -@@ -91,7 +91,7 @@ - # else - # error "CPU type is unknown" - # endif --#elif defined(__APPLE__) -+#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) - # if __LITTLE_ENDIAN__ - # define MOZ_LITTLE_ENDIAN 1 - # elif __BIG_ENDIAN__ -@@ -119,8 +119,7 @@ - * cases. - */ - #elif defined(__sparc) || defined(__sparc__) || \ -- defined(_POWER) || defined(__powerpc__) || \ -- defined(__ppc__) || defined(__hppa) || \ -+ defined(_POWER) || defined(__hppa) || \ - defined(_MIPSEB) || defined(__ARMEB__) || \ - defined(__s390__) || \ - (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \ -Index: mozilla/js/src/jscpucfg.h -=================================================================== ---- mozilla.orig/js/src/jscpucfg.h -+++ mozilla/js/src/jscpucfg.h -@@ -31,7 +31,7 @@ - # define JS_BYTES_PER_WORD 4 - # define JS_BITS_PER_WORD_LOG2 5 - --#elif defined(__APPLE__) -+#elif defined(__APPLE__) || defined(__powerpc__) || defined(__ppc__) - # if __LITTLE_ENDIAN__ - # define IS_LITTLE_ENDIAN 1 - # undef IS_BIG_ENDIAN -@@ -93,8 +93,7 @@ - # endif - - #elif defined(__sparc) || defined(__sparc__) || \ -- defined(_POWER) || defined(__powerpc__) || \ -- defined(__ppc__) || defined(__hppa) || \ -+ defined(_POWER) || defined(__hppa) || \ - defined(_MIPSEB) || defined(_BIG_ENDIAN) - /* IA64 running HP-UX will have _BIG_ENDIAN defined. - * IA64 running Linux will have endian.h and be handled above. -Index: mozilla/js/src/assembler/wtf/Platform.h -=================================================================== ---- mozilla.orig/js/src/assembler/wtf/Platform.h -+++ mozilla/js/src/assembler/wtf/Platform.h -@@ -165,16 +165,22 @@ - || defined(__POWERPC__) \ - || defined(_M_PPC) \ - || defined(__PPC) -+#if !defined(__ppc64__) && !defined(__PPC64__) - #define WTF_CPU_PPC 1 -+#endif -+#if !defined(__LITTLE_ENDIAN__) - #define WTF_CPU_BIG_ENDIAN 1 - #endif -+#endif - - /* WTF_CPU_PPC64 - PowerPC 64-bit */ - #if defined(__ppc64__) \ - || defined(__PPC64__) - #define WTF_CPU_PPC64 1 -+#if !defined(__LITTLE_ENDIAN__) - #define WTF_CPU_BIG_ENDIAN 1 - #endif -+#endif - - /* WTF_CPU_SH4 - SuperH SH-4 */ - #if defined(__SH4__) -Index: mozilla/nsprpub/pr/include/md/_linux.cfg -=================================================================== ---- mozilla.orig/nsprpub/pr/include/md/_linux.cfg -+++ mozilla/nsprpub/pr/include/md/_linux.cfg -@@ -29,8 +29,13 @@ - - #ifdef __powerpc64__ - -+#ifdef __LITTLE_ENDIAN__ -+#define IS_LITTLE_ENDIAN 1 -+#undef IS_BIG_ENDIAN -+#else - #undef IS_LITTLE_ENDIAN - #define IS_BIG_ENDIAN 1 -+#endif - #define IS_64 - - #define PR_BYTES_PER_BYTE 1 -@@ -75,8 +80,13 @@ - - #elif defined(__powerpc__) - -+#ifdef __LITTLE_ENDIAN__ -+#define IS_LITTLE_ENDIAN 1 -+#undef IS_BIG_ENDIAN -+#else - #undef IS_LITTLE_ENDIAN - #define IS_BIG_ENDIAN 1 -+#endif - - #define PR_BYTES_PER_BYTE 1 - #define PR_BYTES_PER_SHORT 2 -Index: mozilla/media/webrtc/trunk/webrtc/typedefs.h -=================================================================== ---- mozilla.orig/media/webrtc/trunk/webrtc/typedefs.h -+++ mozilla/media/webrtc/trunk/webrtc/typedefs.h -@@ -52,13 +52,23 @@ - #elif defined(__powerpc64__) - #define WEBRTC_ARCH_PPC64 1 - #define WEBRTC_ARCH_64_BITS 1 -+#ifdef __LITTLE_ENDIAN__ -+#define WEBRTC_ARCH_LITTLE_ENDIAN -+#define WEBRTC_LITTLE_ENDIAN -+#else - #define WEBRTC_ARCH_BIG_ENDIAN - #define WEBRTC_BIG_ENDIAN -+#endif - #elif defined(__ppc__) || defined(__powerpc__) - #define WEBRTC_ARCH_PPC 1 - #define WEBRTC_ARCH_32_BITS 1 -+#ifdef __LITTLE_ENDIAN__ -+#define WEBRTC_ARCH_LITTLE_ENDIAN -+#define WEBRTC_LITTLE_ENDIAN -+#else - #define WEBRTC_ARCH_BIG_ENDIAN - #define WEBRTC_BIG_ENDIAN -+#endif - #elif defined(__sparc64__) - #define WEBRTC_ARCH_SPARC 1 - #define WEBRTC_ARCH_64_BITS 1