diff --git a/MozillaThunderbird.spec b/MozillaThunderbird.spec index 1f11abb..8338af9 100644 --- a/MozillaThunderbird.spec +++ b/MozillaThunderbird.spec @@ -82,9 +82,9 @@ Patch3: mozilla-nongnome-proxies.patch Patch4: mozilla-kde.patch Patch5: mozilla-arm-disable-edsp.patch Patch7: mozilla-ppc.patch -Patch8: mozilla-libffi-ppc64le.patch -Patch9: mozilla-xpcom-ppc64le.patch -Patch10: mozilla-ppc64le.patch +Patch8: libffi-ppc64le.patch +Patch9: xpcom-ppc64le.patch +Patch10: ppc64le-support.patch # Thunderbird/mail Patch20: tb-ssldap.patch Patch21: tb-develdirs.patch diff --git a/mozilla-libffi-ppc64le.patch b/libffi-ppc64le.patch similarity index 80% rename from mozilla-libffi-ppc64le.patch rename to libffi-ppc64le.patch index 370a651..e341a86 100644 --- a/mozilla-libffi-ppc64le.patch +++ b/libffi-ppc64le.patch @@ -1,29 +1,15 @@ -# 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 @@ +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 @@ /* ----------------------------------------------------------------------- - 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. - - 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 +@@ -79,6 +79,8 @@ .set f20,20 .set f21,21 @@ -32,17 +18,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/aix.S b/js/src/ctypes/libffi/src/p #define LIBFFI_ASM #include #include - #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) - +@@ -125,6 +127,7 @@ ffi_call_AIX: /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args @@ -50,17 +26,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/aix.S b/js/src/ctypes/libffi/src/p /* Now do the call. */ ld r0, 0(r29) - 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) - +@@ -226,6 +229,7 @@ L(float_return_value): /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args @@ -68,15 +34,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/aix.S b/js/src/ctypes/libffi/src/p /* Now do the call. */ lwz r0, 0(r29) - 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 @@ +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 @@ /* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998 Geoffrey Keating - Copyright (C) 2007, 2008 Free Software Foundation, Inc @@ -89,17 +51,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p PowerPC Foreign Function Interface - 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 { +@@ -39,32 +41,29 @@ 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 */ @@ -140,17 +92,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* ffi_prep_args_SYSV is called by the assembly routine once stack space has been allocated for the function's arguments. - 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. */ +@@ -113,10 +112,12 @@ ffi_prep_args_SYSV (extended_cif *ecif, valp gpr_base; int intarg_count; @@ -163,8 +105,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* 'copy_space' grows down as we put structures in it. It should stay 16-byte aligned. */ - valp copy_space; - +@@ -125,9 +126,11 @@ ffi_prep_args_SYSV (extended_cif *ecif, /* 'next_arg' grows up as we put parameters in it. */ valp next_arg; @@ -177,15 +118,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p union { void **v; char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **ui; - long long **ll; - float **f; - double **d; - } p_argv; +@@ -143,21 +146,22 @@ ffi_prep_args_SYSV (extended_cif *ecif, size_t struct_copy_size; unsigned gprvalue; @@ -214,16 +147,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p FFI_ASSERT ((bytes & 0xF) == 0); FFI_ASSERT (copy_space.c >= next_arg.c); - /* 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; +@@ -174,12 +178,28 @@ ffi_prep_args_SYSV (extended_cif *ecif, i > 0; i--, ptr++, p_argv.v++) { @@ -256,15 +180,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p double_tmp = **p_argv.f; if (fparg_count >= NUM_FPR_ARG_REGISTERS) { - *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; +@@ -195,8 +215,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, case FFI_TYPE_DOUBLE: /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ @@ -273,17 +189,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p double_tmp = **p_argv.d; if (fparg_count >= NUM_FPR_ARG_REGISTERS) - { - 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; +@@ -218,43 +236,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -327,17 +233,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p double_tmp = (*p_argv.d)[0]; if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) - { - 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; - } +@@ -280,13 +261,40 @@ ffi_prep_args_SYSV (extended_cif *ecif, fparg_count += 2; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); @@ -380,17 +276,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p if (intarg_count == NUM_GPR_ARG_REGISTERS-1) intarg_count++; if (intarg_count >= NUM_GPR_ARG_REGISTERS) - { - 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; +@@ -319,9 +327,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, break; case FFI_TYPE_STRUCT: @@ -400,17 +286,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p struct_copy_size = ((*ptr)->size + 15) & ~0xF; copy_space.c -= struct_copy_size; memcpy (copy_space.c, *p_argv.c, (*ptr)->size); - - 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: +@@ -349,7 +354,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: @@ -418,16 +294,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p gprvalue = **p_argv.ui; - putgpr: - if (intarg_count >= NUM_GPR_ARG_REGISTERS) - *next_arg.u++ = gprvalue; - else - *gpr_base.u++ = gprvalue; - intarg_count++; - break; - } - } - +@@ -366,8 +370,16 @@ ffi_prep_args_SYSV (extended_cif *ecif, /* 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); @@ -444,10 +311,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); } - /* About the LINUX64 ABI. */ - enum { - NUM_GPR_ARG_REGISTERS64 = 8, - NUM_FPR_ARG_REGISTERS64 = 13 +@@ -378,6 +390,45 @@ enum { }; enum { ASM_NEEDS_REGISTERS64 = 4 }; @@ -493,17 +357,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* ffi_prep_args64 is called by the assembly routine once stack space has been allocated for the function's arguments. - 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; +@@ -423,6 +474,7 @@ ffi_prep_args64 (extended_cif *ecif, uns unsigned long *ul; float *f; double *d; @@ -511,15 +365,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } valp; /* 'stacktop' points at the previous backchain pointer. */ - 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; - +@@ -438,9 +490,9 @@ ffi_prep_args64 (extended_cif *ecif, uns /* 'fpr_base' points at the space for fpr3, and grows upwards as we use FPR registers. */ valp fpr_base; @@ -531,16 +377,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p ffi_type **ptr; double double_tmp; union { - 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; +@@ -457,11 +509,18 @@ ffi_prep_args64 (extended_cif *ecif, uns double **d; } p_argv; unsigned long gprvalue; @@ -559,15 +396,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; fparg_count = 0; next_arg.ul = gpr_base.ul; - - /* 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; +@@ -477,30 +536,36 @@ ffi_prep_args64 (extended_cif *ecif, uns /* Now for the arguments. */ p_argv.v = ecif->avalue; @@ -613,7 +442,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p 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]; @@ -640,7 +469,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p fparg_count++; FFI_ASSERT (__LDBL_MANT_DIG__ == 106); FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; +@@ -527,27 +594,86 @@ ffi_prep_args64 (extended_cif *ecif, uns #endif case FFI_TYPE_STRUCT: @@ -708,6 +537,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p 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) + { @@ -720,11 +554,6 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p + { + 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) @@ -743,17 +572,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } break; - 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)); - } - +@@ -591,27 +717,22 @@ ffi_prep_args64 (extended_cif *ecif, uns /* Perform machine dependent cif processing */ @@ -787,9 +606,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); - /* Space for the GPR registers. */ - bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); - } +@@ -621,13 +742,20 @@ ffi_prep_cif_machdep (ffi_cif *cif) else { /* 64-bit ABI. */ @@ -810,17 +627,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } /* Return value handling. The rules for SYSV are as follows: - - 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; +@@ -646,13 +774,30 @@ ffi_prep_cif_machdep (ffi_cif *cif) - 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. */ @@ -854,7 +661,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p flags |= FLAG_RETURNS_128BITS; /* Fall through. */ #endif - case FFI_TYPE_DOUBLE: +@@ -660,47 +805,52 @@ ffi_prep_cif_machdep (ffi_cif *cif) flags |= FLAG_RETURNS_64BITS; /* Fall through. */ case FFI_TYPE_FLOAT: @@ -935,17 +742,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p #endif intarg_count++; flags |= FLAG_RETVAL_REFERENCE; - /* 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. +@@ -722,39 +872,36 @@ ffi_prep_cif_machdep (ffi_cif *cif) Stuff on the stack needs to keep proper alignment. */ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { @@ -1005,8 +802,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p fparg_count++; /* If this FP arg is going on the stack, it must be 8-byte-aligned. */ - if (fparg_count > NUM_FPR_ARG_REGISTERS - && intarg_count >= NUM_GPR_ARG_REGISTERS +@@ -763,10 +910,21 @@ ffi_prep_cif_machdep (ffi_cif *cif) && intarg_count % 2 != 0) intarg_count++; break; @@ -1029,16 +825,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* '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 - 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; +@@ -783,9 +941,6 @@ ffi_prep_cif_machdep (ffi_cif *cif) break; case FFI_TYPE_STRUCT: @@ -1048,7 +835,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* 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 - the SYSV ABI). */ +@@ -793,50 +948,100 @@ ffi_prep_cif_machdep (ffi_cif *cif) struct_copy_size += ((*ptr)->size + 15) & ~0xF; /* Fall through (allocate space for the pointer). */ @@ -1159,7 +946,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p if (intarg_count > 4) flags |= FLAG_4_GPR_ARGUMENTS; if (struct_copy_size != 0) - flags |= FLAG_ARG_NEEDS_COPY; +@@ -844,25 +1049,36 @@ ffi_prep_cif_machdep (ffi_cif *cif) if (cif->abi != FFI_LINUX64) { @@ -1196,14 +983,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - /* Add in the space for the copied structures. */ - bytes += struct_copy_size; - - cif->flags = flags; - cif->bytes = bytes; - +@@ -877,6 +1093,26 @@ ffi_prep_cif_machdep (ffi_cif *cif) return FFI_OK; } @@ -1230,9 +1010,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, - unsigned long, unsigned long *, - void (*fn)(void)); - +@@ -886,28 +1122,39 @@ extern void FFI_HIDDEN ffi_call_LINUX64( void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { @@ -1282,12 +1060,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p case FFI_LINUX_SOFT_FLOAT: ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); break; - #else - case FFI_LINUX64: - ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); - break; - #endif - default: +@@ -920,10 +1167,29 @@ ffi_call(ffi_cif *cif, void (*fn)(void), FFI_ASSERT (0); break; } @@ -1318,17 +1091,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p #define MIN_CACHE_LINE_SIZE 8 static void - 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, +@@ -947,16 +1213,38 @@ ffi_prep_closure_loc (ffi_closure *closu void *codeloc) { #ifdef POWERPC64 @@ -1369,17 +1132,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p tramp = (unsigned int *) &closure->tramp[0]; tramp[0] = 0x7c0802a6; /* mflr r0 */ - 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 */ - +@@ -1011,32 +1299,38 @@ ffi_closure_helper_SYSV (ffi_closure *cl void ** avalue; ffi_type ** arg_types; long i, avn; @@ -1392,12 +1145,12 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p + 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; @@ -1436,10 +1189,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p rvalue = (void *) *pgr; ng++; pgr++; - } - - i = 0; - avn = cif->nargs; +@@ -1047,12 +1341,112 @@ ffi_closure_helper_SYSV (ffi_closure *cl arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ @@ -1556,13 +1306,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* there are 8 gpr registers used to pass values */ if (ng < 8) { - avalue[i] = (char *) pgr + 3; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 3; +@@ -1066,9 +1460,11 @@ ffi_closure_helper_SYSV (ffi_closure *cl pst++; } break; @@ -1574,13 +1318,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* there are 8 gpr registers used to pass values */ if (ng < 8) { - avalue[i] = (char *) pgr + 2; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 2; +@@ -1082,11 +1478,11 @@ ffi_closure_helper_SYSV (ffi_closure *cl pst++; } break; @@ -1593,15 +1331,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* there are 8 gpr registers used to pass values */ if (ng < 8) { - avalue[i] = pgr; - ng++; - pgr++; - } - else - { - avalue[i] = pst; - pst++; - } +@@ -1102,9 +1498,6 @@ ffi_closure_helper_SYSV (ffi_closure *cl break; case FFI_TYPE_STRUCT: @@ -1611,17 +1341,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* Structs are passed by reference. The address will appear in a gpr if it is one of the first 8 arguments. */ if (ng < 8) - { - avalue[i] = (void *) *pgr; - ng++; - pgr++; - } -@@ -1117,17 +1510,16 @@ ffi_closure_helper_SYSV (ffi_closure *cl - { - avalue[i] = (void *) *pst; - pst++; - } - break; +@@ -1122,7 +1515,6 @@ ffi_closure_helper_SYSV (ffi_closure *cl case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: @@ -1629,17 +1349,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p /* 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) - * 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; +@@ -1154,99 +1546,8 @@ ffi_closure_helper_SYSV (ffi_closure *cl } break; @@ -1740,16 +1450,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } i++; - } - - - (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 +@@ -1263,39 +1564,9 @@ ffi_closure_helper_SYSV (ffi_closure *cl 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. */ @@ -1791,16 +1492,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p } int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, - 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 */ +@@ -1312,16 +1583,20 @@ ffi_closure_helper_LINUX64 (ffi_closure void **avalue; ffi_type **arg_types; @@ -1825,7 +1517,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p { rvalue = (void *) *pst; pst++; - } +@@ -1329,30 +1604,39 @@ ffi_closure_helper_LINUX64 (ffi_closure i = 0; avn = cif->nargs; @@ -1865,9 +1557,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - avalue[i] = pst; - pst++; +@@ -1362,12 +1646,82 @@ ffi_closure_helper_LINUX64 (ffi_closure break; case FFI_TYPE_STRUCT: @@ -1955,11 +1645,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p pst += (arg_types[i]->size + 7) / 8; break; - 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). - */ +@@ -1379,7 +1733,7 @@ ffi_closure_helper_LINUX64 (ffi_closure /* there are 13 64bit floating point registers */ @@ -1968,15 +1654,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p { double temp = pfr->d; pfr->f = (float) temp; - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_DOUBLE: +@@ -1395,7 +1749,7 @@ ffi_closure_helper_LINUX64 (ffi_closure /* On the outgoing stack all values are aligned to 8 */ /* there are 13 64bit floating point registers */ @@ -1985,11 +1663,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p { avalue[i] = pfr; pfr++; - } - else - avalue[i] = pst; - pst++; - break; +@@ -1407,14 +1761,14 @@ ffi_closure_helper_LINUX64 (ffi_closure #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -2006,17 +1680,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p { /* Passed partly in f13 and partly on the stack. Move it all to the stack. */ - *pst = *(unsigned long *) pfr; - pfr++; - } - avalue[i] = pst; - } -@@ -1433,10 +1787,19 @@ ffi_closure_helper_LINUX64 (ffi_closure - - i++; - } - - +@@ -1438,5 +1792,14 @@ ffi_closure_helper_LINUX64 (ffi_closure (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ @@ -2031,12 +1695,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi.c b/js/src/ctypes/libffi/src/p + } return cif->rtype->type; } -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 +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 @@ Copyright (C) 1998 Geoffrey Keating Copyright (C) 2001 John Hornkvist @@ -2045,17 +1708,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff FFI support for Darwin and AIX. - 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 - +@@ -35,11 +35,17 @@ extern void ffi_closure_ASM (void); enum { @@ -2078,10 +1731,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff FLAG_ARG_NEEDS_COPY = 1 << (31- 7), FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4) - }; - +@@ -50,43 +56,61 @@ enum { /* About the DARWIN ABI. */ enum { NUM_GPR_ARG_REGISTERS = 8, @@ -2153,7 +1803,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff /* '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; @@ -2176,17 +1826,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff unsigned size_al = 0; /* Check that everything starts aligned properly. */ - 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 +@@ -130,25 +155,30 @@ ffi_prep_args (extended_cif *ecif, unsig the size of the floating-point parameter are skipped. */ case FFI_TYPE_FLOAT: double_tmp = *(float *) *p_argv; @@ -2223,8 +1863,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff #endif fparg_count++; FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); - break; - +@@ -157,30 +187,41 @@ ffi_prep_args (extended_cif *ecif, unsig #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: @@ -2274,11 +1913,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); break; #endif - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - #ifdef POWERPC64 - gprvalue = *(long long *) *p_argv; - goto putgpr; +@@ -192,6 +233,7 @@ ffi_prep_args (extended_cif *ecif, unsig #else *(long long *) next_arg = *(long long *) *p_argv; next_arg += 2; @@ -2286,17 +1921,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff #endif break; case FFI_TYPE_POINTER: - 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; +@@ -211,32 +253,35 @@ ffi_prep_args (extended_cif *ecif, unsig goto putgpr; case FFI_TYPE_STRUCT: @@ -2304,30 +1929,29 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff - 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); -+ + size_al = ALIGN((*ptr)->size, 8); +- if (size_al < 3 && abi == FFI_DARWIN) +- dest_cpy += 4 - size_al; + +# if defined(POWERPC64) + FFI_ASSERT (abi != FFI_DARWIN); -+ memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); -+ next_arg += (size_al + 7) / 8; + memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 7) / 8; +-#else +- dest_cpy = (char *) next_arg; +- +# else /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, SI 4 bytes) are aligned as if they were those modes. @@ -2346,12 +1970,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff #endif break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - gprvalue = *(signed int *) *p_argv; - goto putgpr; - - case FFI_TYPE_UINT32: +@@ -249,6 +294,7 @@ ffi_prep_args (extended_cif *ecif, unsig gprvalue = *(unsigned int *) *p_argv; putgpr: *next_arg++ = gprvalue; @@ -2359,13 +1978,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff break; default: break; - } - } - - /* 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); +@@ -262,8 +308,269 @@ ffi_prep_args (extended_cif *ecif, unsig //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); } @@ -2636,16 +2249,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff static void darwin_adjust_aggregate_sizes (ffi_type *s) - { - int i; - - if (s->type != FFI_TYPE_STRUCT) - return; - - s->size = 0; - for (i = 0; s->elements[i] != NULL; i++) - { - ffi_type *p; +@@ -280,22 +587,29 @@ darwin_adjust_aggregate_sizes (ffi_type int align; p = s->elements[i]; @@ -2682,17 +2286,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff if (s->elements[0]->type == FFI_TYPE_UINT64 || s->elements[0]->type == FFI_TYPE_SINT64 || s->elements[0]->type == FFI_TYPE_DOUBLE - || 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. */ +@@ -347,7 +661,7 @@ ffi_prep_cif_machdep (ffi_cif *cif) unsigned i; ffi_type **ptr; unsigned bytes; @@ -2701,17 +2295,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff unsigned flags = 0; unsigned size_al = 0; - /* 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]); - } - +@@ -372,16 +686,25 @@ ffi_prep_cif_machdep (ffi_cif *cif) /* Space for the frame pointer, callee's LR, CR, etc, and for the asm's temp regs. */ @@ -2742,17 +2326,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff - Larger structures values are allocated space and a pointer is passed as the first argument. */ switch (cif->rtype->type) - { - - #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; +@@ -410,9 +733,42 @@ ffi_prep_cif_machdep (ffi_cif *cif) break; case FFI_TYPE_STRUCT: @@ -2795,12 +2369,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff break; case FFI_TYPE_VOID: flags |= FLAG_RETURNS_NOTHING; - break; - - default: - /* Returns 32-bit integer, or similar. Nothing to do here. */ - break; - } +@@ -425,57 +781,83 @@ ffi_prep_cif_machdep (ffi_cif *cif) /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest @@ -2898,14 +2467,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff #endif break; - 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; - } - } - +@@ -490,9 +872,18 @@ ffi_prep_cif_machdep (ffi_cif *cif) if (fparg_count != 0) flags |= FLAG_FP_ARGUMENTS; @@ -2924,13 +2486,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff /* Stack space. */ #ifdef POWERPC64 - 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 +@@ -506,7 +897,7 @@ ffi_prep_cif_machdep (ffi_cif *cif) bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); /* The stack space allocated needs to be a multiple of 16 bytes. */ @@ -2939,9 +2495,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff cif->flags = flags; cif->bytes = bytes; - - return FFI_OK; - } +@@ -516,8 +907,9 @@ ffi_prep_cif_machdep (ffi_cif *cif) extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, void (*fn)(void), void (*fn2)(void)); @@ -2952,17 +2506,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) - { - 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)); +@@ -546,7 +938,7 @@ ffi_call (ffi_cif *cif, void (*fn)(void) break; case FFI_DARWIN: ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, @@ -2971,22 +2515,14 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff break; default: FFI_ASSERT(0); - 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; +@@ -566,58 +958,48 @@ typedef struct aix_fd_struct { } 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 | @@ -3036,8 +2572,6 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff - +---------------------------------------+ xxx - | ???? | - +---------------------------------------+ xxx -+ m32/m64 -+ + The stack layout looks like this: + + | Additional params... | | Higher address @@ -3079,13 +2613,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, - 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; +@@ -631,30 +1013,44 @@ ffi_prep_closure_loc (ffi_closure* closu switch (cif->abi) { @@ -3149,14 +2677,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff case FFI_AIX: - 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; +@@ -669,10 +1065,10 @@ ffi_prep_closure_loc (ffi_closure* closu closure->cif = cif; closure->fun = fun; closure->user_data = user_data; @@ -3169,17 +2690,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff break; } return FFI_OK; - } - - static void - flush_icache(char *addr) - { -@@ -703,28 +1099,28 @@ flush_range(char * addr1, int size) - } - - typedef union - { - float f; +@@ -708,7 +1104,7 @@ typedef union double d; } ffi_dblfl; @@ -3188,10 +2699,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff ffi_closure_helper_DARWIN (ffi_closure *, void *, unsigned long *, ffi_dblfl *); - /* 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 +@@ -719,7 +1115,7 @@ ffi_closure_helper_DARWIN (ffi_closure * up space for a return value, ffi_closure_ASM invokes the following helper function to do most of the work. */ @@ -3200,17 +2708,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, unsigned long *pgr, ffi_dblfl *pfr) { - /* 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; +@@ -741,16 +1137,32 @@ ffi_closure_helper_DARWIN (ffi_closure * ffi_cif * cif; ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; unsigned size_al; @@ -3245,13 +2743,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff } i = 0; - 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) +@@ -764,7 +1176,7 @@ ffi_closure_helper_DARWIN (ffi_closure * { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: @@ -3260,9 +2752,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff avalue[i] = (char *) pgr + 7; #else avalue[i] = (char *) pgr + 3; - #endif - pgr++; - break; +@@ -774,7 +1186,7 @@ ffi_closure_helper_DARWIN (ffi_closure * case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: @@ -3271,9 +2761,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff avalue[i] = (char *) pgr + 6; #else avalue[i] = (char *) pgr + 2; - #endif - pgr++; - break; +@@ -784,7 +1196,7 @@ ffi_closure_helper_DARWIN (ffi_closure * case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: @@ -3282,9 +2770,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff avalue[i] = (char *) pgr + 4; #else case FFI_TYPE_POINTER: - avalue[i] = pgr; - #endif - pgr++; +@@ -794,34 +1206,53 @@ ffi_closure_helper_DARWIN (ffi_closure * break; case FFI_TYPE_STRUCT: @@ -3349,27 +2835,18 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libff case FFI_TYPE_POINTER: avalue[i] = pgr; pgr++; - 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++; - } - +@@ -924,5 +1355,5 @@ ffi_closure_helper_DARWIN (ffi_closure * (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype->type; + return cif->rtype; } -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 @@ +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 @@ /* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. - Copyright (C) 2007, 2008 Free Software Foundation, Inc @@ -3380,17 +2857,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi Target configuration macros for PowerPC. 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 - 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. - - ----------------------------------------------------------------------- */ - +@@ -28,16 +30,23 @@ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H @@ -3415,51 +2882,31 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi #elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ #ifndef POWERPC64 #define POWERPC64 - #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, +@@ -57,18 +66,14 @@ typedef enum ffi_abi { FFI_LINUX64, FFI_LINUX, FFI_LINUX_SOFT_FLOAT, -# ifdef POWERPC64 +# if defined(POWERPC64) FFI_DEFAULT_ABI = FFI_LINUX64, -+# elif defined(__NO_FPRS__) -+ FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, -+# elif (__LDBL_MANT_DIG__ == 106) -+ FFI_DEFAULT_ABI = FFI_LINUX, - # else +-# else -# if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106)) - FFI_DEFAULT_ABI = FFI_LINUX, -# else -# ifdef __NO_FPRS__ -- FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, ++# elif defined(__NO_FPRS__) + 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 - #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 ----------------------------------------- */ +@@ -101,6 +106,10 @@ typedef enum ffi_abi { #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 @@ -3470,12 +2917,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi /* For additional types like the below, take care about the order in ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ - - /* 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 +@@ -113,10 +122,23 @@ typedef enum ffi_abi { defined in ffi.c, to determine the exact return type and its size. */ #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) @@ -3503,230 +2945,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ffitarget.h b/js/src/ctypes/libffi #endif #ifndef LIBFFI_ASM - #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" +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 @@ #ifdef __powerpc64__ FFI_HIDDEN (ffi_closure_LINUX64) @@ -3783,7 +3006,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ - 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 @@ -3803,15 +3026,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ + 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) @@ -3822,41 +3041,22 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ + 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, -104+(0*8)(%r1) -+ stfd %f2, -104+(1*8)(%r1) -+ stfd %f3, -104+(2*8)(%r1) -+ stfd %f4, -104+(3*8)(%r1) -+ stfd %f5, -104+(4*8)(%r1) -+ stfd %f6, -104+(5*8)(%r1) -+ stfd %f7, -104+(6*8)(%r1) -+ stfd %f8, -104+(7*8)(%r1) -+ stfd %f9, -104+(8*8)(%r1) -+ stfd %f10, -104+(9*8)(%r1) -+ stfd %f11, -104+(10*8)(%r1) -+ stfd %f12, -104+(11*8)(%r1) -+ stfd %f13, -104+(12*8)(%r1) -+ -+ # load up the pointer to the saved fpr registers */ -+ addi %r6, %r1, -104 -+ -+ # 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 + # 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) @@ -3870,20 +3070,40 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ - stfd %f11, 128+(10*8)(%r1) - stfd %f12, 128+(11*8)(%r1) - stfd %f13, 128+(12*8)(%r1) -- ++ stfd %f1, -104+(0*8)(%r1) ++ stfd %f2, -104+(1*8)(%r1) ++ stfd %f3, -104+(2*8)(%r1) ++ stfd %f4, -104+(3*8)(%r1) ++ stfd %f5, -104+(4*8)(%r1) ++ stfd %f6, -104+(5*8)(%r1) ++ stfd %f7, -104+(6*8)(%r1) ++ stfd %f8, -104+(7*8)(%r1) ++ stfd %f9, -104+(8*8)(%r1) ++ stfd %f10, -104+(9*8)(%r1) ++ 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 +- # 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 + - # 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 @@ -3895,8 +3115,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ .Lret: # now r3 contains the return type - # so use it to look up in a table - # so we know how to deal with each type +@@ -100,10 +161,12 @@ ffi_closure_LINUX64: # look up the proper starting point in table # by using return type as offset @@ -3910,12 +3129,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ add %r3, %r3, %r4 # add contents of table to table address mtctr %r3 bctr # jump to it - - # 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 - +@@ -116,85 +179,175 @@ ffi_closure_LINUX64: .Lret_type0: # case FFI_TYPE_VOID mtlr %r0 @@ -4047,8 +3261,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ mtlr %r0 - addi %r1, %r1, 240 + addi %r1, %r1, STACKFRAME - blr --# esac ++ blr +# case FFI_V2_TYPE_FLOAT_HOMOG + lfs %f1, RETVAL+0(%r1) + lfs %f2, RETVAL+4(%r1) @@ -4101,7 +3314,8 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ + sldi %r5, %r5, 3 + addi %r1, %r1, STACKFRAME + srd %r3, %r3, %r5 -+ blr + blr +-# esac +# endif + .LFE1: @@ -4119,17 +3333,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ .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 -@@ -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 +@@ -223,14 +376,14 @@ ffi_closure_LINUX64: .byte 0x2 # DW_CFA_advance_loc1 .byte .LCFI0-.LFB1 .byte 0xe # DW_CFA_def_cfa_offset @@ -4140,24 +3344,186 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/linux64_closure.S b/js/src/ctypes/ .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) - --#if defined __ELF__ && defined __linux__ -- .section .note.GNU-stack,"",@progbits ++# 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 -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 + +-#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) blr # case FFI_TYPE_FLOAT @@ -4236,17 +3602,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf mtlr %r0 addi %r1,%r1,144 blr - - # 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 +@@ -203,7 +238,7 @@ ENTRY(ffi_closure_SYSV) lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) lwz %r5,112+8(%r1) @@ -4255,16 +3611,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf # The return types below are only used when the ABI type is FFI_SYSV. # case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. - 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 +@@ -220,9 +255,15 @@ ENTRY(ffi_closure_SYSV) # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. lwz %r3,112+0(%r1) @@ -4280,10 +3627,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - blr - +@@ -233,20 +274,35 @@ ENTRY(ffi_closure_SYSV) # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) @@ -4319,7 +3663,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) +@@ -254,6 +310,7 @@ ENTRY(ffi_closure_SYSV) mtlr %r0 b .Lfinish @@ -4327,9 +3671,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf .Lstruct567: subfic %r6,%r5,32 srw %r4,%r4,%r5 - slw %r6,%r3,%r6 - srw %r3,%r3,%r5 - or %r4,%r6,%r4 +@@ -263,6 +320,7 @@ ENTRY(ffi_closure_SYSV) mtlr %r0 addi %r1,%r1,144 blr @@ -4337,20 +3679,11 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/ppc_closure.S b/js/src/ctypes/libf .Luint128: lwz %r6,112+12(%r1) - 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) +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) nop 1: @@ -4358,11 +3691,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/ /* Load all the FP registers. */ bf- 6,2f lfd %f1,-16-(8*4)-(8*8)(%r28) - 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) +@@ -94,6 +95,7 @@ ENTRY(ffi_call_SYSV) lfd %f6,-16-(8*4)-(3*8)(%r28) lfd %f7,-16-(8*4)-(2*8)(%r28) lfd %f8,-16-(8*4)-(1*8)(%r28) @@ -4370,9 +3699,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/ 2: /* Make the call. */ - bctrl - - /* Now, deal with the return value. */ +@@ -103,7 +105,9 @@ ENTRY(ffi_call_SYSV) mtcrf 0x01,%r31 /* cr7 */ bt- 31,L(small_struct_return_value) bt- 30,L(done_return_value) @@ -4382,17 +3709,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/ stw %r3,0(%r30) bf+ 28,L(done_return_value) stw %r4,4(%r30) - 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) +@@ -124,6 +128,7 @@ L(done_return_value): lwz %r1,0(%r1) blr @@ -4400,10 +3717,7 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/ L(fp_return_value): bf 28,L(float_return_value) stfd %f1,0(%r30) - mtcrf 0x02,%r31 /* cr6 */ - bf 27,L(done_return_value) - stfd %f2,8(%r30) - b L(done_return_value) +@@ -134,21 +139,17 @@ L(fp_return_value): L(float_return_value): stfs %f1,0(%r30) b L(done_return_value) @@ -4434,8 +3748,3 @@ diff --git a/js/src/ctypes/libffi/src/powerpc/sysv.S b/js/src/ctypes/libffi/src/ .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-arm-disable-edsp.patch b/mozilla-arm-disable-edsp.patch index 74cf5b0..cf82251 100644 --- a/mozilla-arm-disable-edsp.patch +++ b/mozilla-arm-disable-edsp.patch @@ -1,13 +1,13 @@ # HG changeset patch # User Adrian Schröter -# Parent b945e0c3b145b6b2245f42bab52f911c2d1f6759 +# Parent 5b26dbfe65bd4986ea3792f02bc025fec293b51f disable ESDP support (no BNC or BMO reference yet :-() -diff --git a/mozglue/build/arm.h b/mozglue/build/arm.h ---- a/mozglue/build/arm.h -+++ b/mozglue/build/arm.h -@@ -116,17 +116,17 @@ namespace mozilla { - extern bool MFBT_DATA neon_enabled; +diff --git a/xpcom/glue/arm.h b/xpcom/glue/arm.h +--- a/xpcom/glue/arm.h ++++ b/xpcom/glue/arm.h +@@ -143,17 +143,17 @@ namespace mozilla { + extern bool NS_COM_GLUE neon_enabled; #endif #endif } diff --git a/mozilla-kde.patch b/mozilla-kde.patch index 0fd6452..3d6990d 100644 --- a/mozilla-kde.patch +++ b/mozilla-kde.patch @@ -7,7 +7,7 @@ Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 diff --git a/modules/libpref/src/Makefile.in b/modules/libpref/src/Makefile.in --- a/modules/libpref/src/Makefile.in +++ b/modules/libpref/src/Makefile.in -@@ -33,14 +33,15 @@ endif +@@ -49,14 +49,15 @@ endif # Optimizer bug with GCC 3.2.2 on OS/2 ifeq ($(OS_ARCH), OS2) nsPrefService.$(OBJ_SUFFIX): nsPrefService.cpp @@ -26,7 +26,8 @@ diff --git a/modules/libpref/src/Makefile.in b/modules/libpref/src/Makefile.in diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp --- a/modules/libpref/src/Preferences.cpp +++ b/modules/libpref/src/Preferences.cpp -@@ -27,16 +27,17 @@ +@@ -23,16 +23,17 @@ + #include "nsIStringEnumerator.h" #include "nsIZipReader.h" #include "nsPrefBranch.h" #include "nsXPIDLString.h" @@ -34,7 +35,6 @@ diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferenc #include "nsCOMArray.h" #include "nsXPCOMCID.h" #include "nsAutoPtr.h" - #include "nsPrintfCString.h" +#include "nsKDEUtils.h" #include "nsQuickSort.h" @@ -44,7 +44,7 @@ diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferenc #include "prefread.h" #include "prefapi_private_data.h" -@@ -1100,16 +1101,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char +@@ -972,16 +973,34 @@ pref_LoadPrefsInDir(nsIFile* aDir, char static nsresult pref_LoadPrefsInDirList(const char *listId) { @@ -79,7 +79,7 @@ diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferenc return NS_OK; bool hasMore; -@@ -1125,17 +1144,17 @@ static nsresult pref_LoadPrefsInDirList( +@@ -997,17 +1016,17 @@ static nsresult pref_LoadPrefsInDirList( nsAutoCString leaf; path->GetNativeLeafName(leaf); @@ -98,7 +98,7 @@ diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferenc { nsZipItemPtr manifest(jarReader, name, true); NS_ENSURE_TRUE(manifest.Buffer(), NS_ERROR_NOT_AVAILABLE); -@@ -1229,28 +1248,40 @@ static nsresult pref_InitInitialObjects( +@@ -1101,28 +1120,40 @@ static nsresult pref_InitInitialObjects( /* these pref file names should not be used: we process them after all other application pref files for backwards compatibility */ static const char* specialFiles[] = { #if defined(XP_MACOSX) @@ -184,24 +184,25 @@ diff --git a/python/mozbuild/mozpack/chrome/manifest.py b/python/mozbuild/mozpac diff --git a/toolkit/components/downloads/Makefile.in b/toolkit/components/downloads/Makefile.in --- a/toolkit/components/downloads/Makefile.in +++ b/toolkit/components/downloads/Makefile.in -@@ -4,9 +4,10 @@ - # file, You can obtain one at http://mozilla.org/MPL/2.0/. +@@ -23,9 +23,11 @@ ifndef MOZ_SUITE + DISABLED_EXTRA_COMPONENTS = \ + nsDownloadManagerUI.js \ + nsDownloadManagerUI.manifest \ + $(NULL) + endif include $(topsrcdir)/config/rules.mk - CXXFLAGS += $(TK_CFLAGS) -DGOOGLE_PROTOBUF_NO_RTTI - - LOCAL_INCLUDES += \ - -I$(srcdir)/../protobuf \ -+ -I$(topsrcdir)/toolkit/xre \ - $(NULL) ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre ++ + CXXFLAGS += $(TK_CFLAGS) diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp --- a/toolkit/components/downloads/nsDownloadManager.cpp +++ b/toolkit/components/downloads/nsDownloadManager.cpp -@@ -41,16 +41,20 @@ +@@ -38,16 +38,20 @@ + #ifdef XP_WIN #include - #include "nsWindowsHelpers.h" #ifdef DOWNLOAD_SCANNER #include "nsDownloadScanner.h" #endif @@ -219,7 +220,7 @@ diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/compon #include "AndroidBridge.h" #endif -@@ -2686,16 +2690,25 @@ nsDownload::SetState(DownloadState aStat +@@ -2609,16 +2613,25 @@ nsDownload::SetState(DownloadState aStat nsCOMPtr pref(do_GetService(NS_PREFSERVICE_CONTRACTID)); // Master pref to control this function. @@ -245,7 +246,7 @@ diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/compon int64_t goat = PR_Now() - mStartTime; showTaskbarAlert = goat > alertIntervalUSec; -@@ -2722,19 +2735,20 @@ nsDownload::SetState(DownloadState aStat +@@ -2645,19 +2658,20 @@ nsDownload::SetState(DownloadState aStat // retention policy, there's no reason to make the text clickable // because if it is, they'll click open the download manager and // the items they downloaded will have been removed. @@ -260,7 +261,7 @@ diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/compon } + } - #if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GTK) + #if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GTK2) nsCOMPtr fileURL = do_QueryInterface(mTarget); nsCOMPtr file; nsAutoString path; @@ -270,7 +271,7 @@ diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/compon diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn --- a/toolkit/content/jar.mn +++ b/toolkit/content/jar.mn -@@ -53,29 +53,33 @@ toolkit.jar: +@@ -50,29 +50,33 @@ toolkit.jar: content/global/viewZoomOverlay.js (viewZoomOverlay.js) *+ content/global/bindings/autocomplete.xml (widgets/autocomplete.xml) content/global/bindings/browser.xml (widgets/browser.xml) @@ -764,7 +765,7 @@ diff --git a/toolkit/content/widgets/preferences-kde.xml b/toolkit/content/widge new file mode 100644 --- /dev/null +++ b/toolkit/content/widgets/preferences-kde.xml -@@ -0,0 +1,1332 @@ +@@ -0,0 +1,1339 @@ + + + + +#elif XP_UNIX -+ pack="end"> -+