1
0

mozilla-bmo1512162.patch

thunderbird-broken-locales-build.patch
   thunderbird-locale-build.patch

OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaThunderbird?expand=0&rev=492
This commit is contained in:
Wolfgang Rosenauer 2019-09-26 08:29:27 +00:00 committed by Git OBS Bridge
parent 013a53c81d
commit 3a3fedfe3f
8 changed files with 543 additions and 79 deletions

View File

@ -43,9 +43,12 @@ Wed Sep 25 11:46:51 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
mozilla-reduce-rust-debuginfo.patch
mozilla-s390-bigendian.patch
mozilla-s390-context.patch
mozilla-bmo1512162.patch
thunderbird-broken-locales-build.patch
- removed renamed patches
fix-missing-return-warning.patch
fix-top-level-asm-issue.patch
thunderbird-locale-build.patch
-------------------------------------------------------------------
Fri Sep 20 15:59:25 UTC 2019 - munix9@googlemail.com

View File

@ -152,7 +152,7 @@ Source9: thunderbird.appdata.xml
Source10: compare-locales.tar.xz
Source14: https://github.com/openSUSE/firefox-scripts/raw/master/create-tar.sh
Source20: https://ftp.mozilla.org/pub/%{progname}/releases/%{orig_version}%{orig_suffix}/source/%{progname}-%{orig_version}%{orig_suffix}.source.tar.xz.asc
Source21: https://ftp.mozilla.org/pub/%{progname}/releases/%{orig_version}/KEY#/%{name}.keyring
Source21: https://ftp.mozilla.org/pub/%{progname}/releases/%{orig_version}/KEY#/mozilla.keyring
# Gecko/Toolkit
Patch1: mozilla-nongnome-proxies.patch
Patch2: mozilla-kde.patch
@ -176,8 +176,9 @@ Patch19: mozilla-bmo1504834-part3.patch
Patch20: mozilla-bmo1511604.patch
Patch21: mozilla-bmo1554971.patch
Patch22: mozilla-nestegg-big-endian.patch
Patch23: mozilla-fix-top-level-asm.patch
Patch100: thunderbird-locale-build.patch
Patch23: mozilla-bmo1512162.patch
Patch24: mozilla-fix-top-level-asm.patch
Patch100: thunderbird-broken-locales-build.patch
%endif # only_print_mozconfig
BuildRoot: %{_tmppath}/%{name}-%{version}-build
PreReq: coreutils fileutils textutils /bin/sh
@ -280,6 +281,7 @@ fi
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
# Thunderbird
%patch100 -p1
%endif # only_print_mozconfig

View File

@ -1,19 +1,14 @@
# HG changeset patch
# Parent 6fa4b62427433e8f445d05c557e5db096667d880
# Parent 36563351309ddbc6c29559ba50a41d005f925abb
Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
has no interest in maintaining big endian.
So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
out again, we transform back to BE.
diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
--- a/gfx/2d/ConvolutionFilter.cpp
+++ b/gfx/2d/ConvolutionFilter.cpp
@@ -30,32 +30,79 @@ bool ConvolutionFilter::GetFilterOffsetA
int32_t* aResultLength) {
if (aRowIndex >= mFilter->numValues()) {
return false;
}
mFilter->FilterForValue(aRowIndex, aResultOffset, aResultLength);
diff -r 36563351309d gfx/2d/ConvolutionFilter.cpp
--- a/gfx/2d/ConvolutionFilter.cpp Mon Sep 09 17:59:28 2019 +0200
+++ b/gfx/2d/ConvolutionFilter.cpp Tue Sep 10 08:25:13 2019 +0200
@@ -35,9 +35,38 @@
return true;
}
@ -52,11 +47,7 @@ diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
}
void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
int32_t aRowIndex, int32_t aRowSize,
bool aHasAlpha) {
MOZ_ASSERT(aRowIndex < mFilter->numValues());
int32_t filterOffset;
@@ -49,8 +78,26 @@
int32_t filterLength;
auto filterValues =
mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
@ -83,20 +74,10 @@ diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
}
/* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
* SkBitmapScaler/SkResizeFilter::computeFactors. It is governed by Skia's
* BSD-style license (see gfx/skia/LICENSE) and the following copyright:
* Copyright (c) 2015 Google Inc.
*/
bool ConvolutionFilter::ComputeResizeFilter(ResizeMethod aResizeMethod,
diff --git a/gfx/skia/skia/include/core/SkPreConfig.h b/gfx/skia/skia/include/core/SkPreConfig.h
--- a/gfx/skia/skia/include/core/SkPreConfig.h
+++ b/gfx/skia/skia/include/core/SkPreConfig.h
@@ -68,17 +68,17 @@
#define SK_CPU_BENDIAN
#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
#define SK_CPU_LENDIAN
#elif defined(__sparc) || defined(__sparc__) || \
defined(_POWER) || defined(__powerpc__) || \
diff -r 36563351309d gfx/skia/skia/include/core/SkPreConfig.h
--- a/gfx/skia/skia/include/core/SkPreConfig.h Mon Sep 09 17:59:28 2019 +0200
+++ b/gfx/skia/skia/include/core/SkPreConfig.h Tue Sep 10 08:25:13 2019 +0200
@@ -73,7 +73,7 @@
defined(__ppc__) || defined(__hppa) || \
defined(__PPC__) || defined(__PPC64__) || \
defined(_MIPSEB) || defined(__ARMEB__) || \
@ -105,8 +86,3 @@ diff --git a/gfx/skia/skia/include/core/SkPreConfig.h b/gfx/skia/skia/include/co
(defined(__sh__) && defined(__BIG_ENDIAN__)) || \
(defined(__ia64) && defined(__BIG_ENDIAN__))
#define SK_CPU_BENDIAN
#else
#define SK_CPU_LENDIAN
#endif
#endif

View File

@ -3,7 +3,7 @@
# Date 1543674229 0
# Sat Dec 01 14:23:49 2018 +0000
# Node ID 0309ff19e46b126c527e633518d7de8570442114
# Parent ba2c9b0542c95cc5ee26c264e8338fc9ba94c958
# Parent 5b5a6a164acbd4da6131808bd12e42e7b0a33c2a
Bug 1511604 - Swizzle YCbCr->RGB data on big-endian machines
Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1511604
@ -11,12 +11,10 @@ This is very closely related to mozilla-bmo1504834
Again, input for skia is swizzled to LE, as skia only understands LE.
diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp
--- a/gfx/ycbcr/YCbCrUtils.cpp
+++ b/gfx/ycbcr/YCbCrUtils.cpp
@@ -1,14 +1,16 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
diff -r 5b5a6a164acb gfx/ycbcr/YCbCrUtils.cpp
--- a/gfx/ycbcr/YCbCrUtils.cpp Mon Sep 09 17:59:29 2019 +0200
+++ b/gfx/ycbcr/YCbCrUtils.cpp Tue Sep 10 08:22:10 2019 +0200
@@ -3,7 +3,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@ -26,17 +24,7 @@ diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp
#include "YCbCrUtils.h"
#include "yuv_convert.h"
#include "ycbcr_to_rgb565.h"
namespace mozilla {
namespace gfx {
@@ -231,16 +233,23 @@ ConvertYCbCrToRGB(const layers::PlanarYC
srcData.mPicSize.width,
srcData.mPicSize.height,
srcData.mYStride,
srcData.mCbCrStride,
aStride,
@@ -236,6 +238,13 @@
yuvtype,
srcData.mYUVColorSpace);
}
@ -50,17 +38,7 @@ diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp
}
void
ConvertYCbCrAToARGB(const uint8_t* aSrcY,
const uint8_t* aSrcU,
const uint8_t* aSrcV,
const uint8_t* aSrcA,
int aSrcStrideYA, int aSrcStrideUV,
@@ -252,12 +261,18 @@ ConvertYCbCrAToARGB(const uint8_t* aSrcY
aSrcV,
aSrcA,
aDstARGB,
aWidth,
aHeight,
@@ -257,6 +266,12 @@
aSrcStrideYA,
aSrcStrideUV,
aDstStrideARGB);
@ -73,4 +51,3 @@ diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp
}
} // namespace gfx
} // namespace mozilla

502
mozilla-bmo1512162.patch Normal file
View File

@ -0,0 +1,502 @@
# HG changeset patch
# Parent d4ba07ab572268a34e98c63792beb2ce6d78e7a1
This patch is upstream
diff -r d4ba07ab5722 js/xpconnect/src/XPCWrappedNative.cpp
--- a/js/xpconnect/src/XPCWrappedNative.cpp Fri Sep 20 07:56:01 2019 +0200
+++ b/js/xpconnect/src/XPCWrappedNative.cpp Fri Sep 20 08:00:19 2019 +0200
@@ -1157,10 +1157,6 @@
return helper.get().Call();
}
-#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
-// Work around a compiler bug on ppc64le (bug 1512162).
-__attribute__ ((noinline,noclone))
-#endif
bool CallMethodHelper::Call() {
mCallContext.SetRetVal(JS::UndefinedValue());
@@ -1319,10 +1315,6 @@
return true;
}
-#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
-// Work around a compiler bug on ppc64le (bug 1512162).
-__attribute__ ((noinline,noclone))
-#endif
bool CallMethodHelper::GatherAndConvertResults() {
// now we iterate through the native params to gather and convert results
uint8_t paramCount = mMethodInfo->GetParamCount();
diff -r d4ba07ab5722 xpcom/reflect/xptcall/md/unix/xptcinvoke_asm_ppc64_linux.S
--- a/xpcom/reflect/xptcall/md/unix/xptcinvoke_asm_ppc64_linux.S Fri Sep 20 07:56:01 2019 +0200
+++ b/xpcom/reflect/xptcall/md/unix/xptcinvoke_asm_ppc64_linux.S Fri Sep 20 08:00:19 2019 +0200
@@ -151,10 +151,10 @@
ld r2,STACK_TOC(r1) # Load our own TOC pointer
ld r1,0(r1) # Revert stack frame
ld 0,16(r1) # Reload lr
+ mtlr 0
ld 29,-24(r1) # Restore NVGPRS
ld 30,-16(r1)
ld 31,-8(r1)
- mtlr 0
blr
#if _CALL_ELF == 2
diff -r d4ba07ab5722 xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp
--- a/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp Fri Sep 20 07:56:01 2019 +0200
+++ b/xpcom/reflect/xptcall/md/unix/xptcinvoke_ppc64_linux.cpp Fri Sep 20 08:00:19 2019 +0200
@@ -5,93 +5,126 @@
// Platform specific code to invoke XPCOM methods on native objects
+#include "xptcprivate.h"
+
// The purpose of NS_InvokeByIndex() is to map a platform
// independent call to the platform ABI. To do that,
// NS_InvokeByIndex() has to determine the method to call via vtable
// access. The parameters for the method are read from the
// nsXPTCVariant* and prepared for the native ABI.
-
-// The PowerPC64 platform ABI can be found here:
-// http://www.freestandards.org/spec/ELF/ppc64/
+//
+// Prior to POWER8, all 64-bit Power ISA systems used ELF v1 ABI, found
+// here:
+// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html
// and in particular:
-// http://www.freestandards.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-CALL
-
-#include <stdio.h>
-#include "xptcprivate.h"
+// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUNC-CALL
+// Little-endian ppc64le, however, uses ELF v2 ABI, which is here:
+// http://openpowerfoundation.org/wp-content/uploads/resources/leabi/leabi-20170510.pdf
+// and in particular section 2.2, page 22. However, most big-endian ppc64
+// systems still use ELF v1, so this file should support both.
-// 8 integral parameters are passed in registers, not including 'that'
-#define GPR_COUNT 7
+// 7 integral parameters are passed in registers, not including |this|
+// (i.e., r3-r10, with r3 being |this|).
+const uint32_t GPR_COUNT = 7;
-// 8 floating point parameters are passed in registers, floats are
-// promoted to doubles when passed in registers
-#define FPR_COUNT 13
-
-extern "C" uint32_t
-invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
-{
- return uint32_t(((paramCount * 2) + 3) & ~3);
-}
+// 13 floating point parameters are passed in registers, either single or
+// double precision (i.e., f1-f13).
+const uint32_t FPR_COUNT = 13;
-extern "C" void
-invoke_copy_to_stack(uint64_t* gpregs,
- double* fpregs,
- uint32_t paramCount,
- nsXPTCVariant* s,
- uint64_t* d)
+// Both ABIs use the same register assignment strategy, as per this
+// example from V1 ABI section 3.2.3 and V2 ABI section 2.2.3.2 [page 43]:
+//
+// typedef struct {
+// int a;
+// double dd;
+// } sparm;
+// sparm s, t;
+// int c, d, e;
+// long double ld;
+// double ff, gg, hh;
+//
+// x = func(c, ff, d, ld, s, gg, t, e, hh);
+//
+// Parameter Register Offset in parameter save area
+// c r3 0-7 (not stored in parameter save area)
+// ff f1 8-15 (not stored)
+// d r5 16-23 (not stored)
+// ld f2,f3 24-39 (not stored)
+// s r8,r9 40-55 (not stored)
+// gg f4 56-63 (not stored)
+// t (none) 64-79 (stored in parameter save area)
+// e (none) 80-87 (stored)
+// hh f5 88-95 (not stored)
+//
+// i.e., each successive FPR usage skips a GPR, but not the other way around.
+
+extern "C" void invoke_copy_to_stack(uint64_t* gpregs, double* fpregs,
+ uint32_t paramCount, nsXPTCVariant* s,
+ uint64_t* d)
{
- uint64_t tempu64;
+ uint32_t nr_gpr = 0u;
+ uint32_t nr_fpr = 0u;
+ uint64_t value = 0u;
- for(uint32_t i = 0; i < paramCount; i++, s++) {
- if(s->IsIndirect())
- tempu64 = (uint64_t) &s->val;
+ for (uint32_t i = 0; i < paramCount; i++, s++) {
+ if (s->IsIndirect())
+ value = (uint64_t) &s->val;
else {
- switch(s->type) {
- case nsXPTType::T_FLOAT: break;
- case nsXPTType::T_DOUBLE: break;
- case nsXPTType::T_I8: tempu64 = s->val.i8; break;
- case nsXPTType::T_I16: tempu64 = s->val.i16; break;
- case nsXPTType::T_I32: tempu64 = s->val.i32; break;
- case nsXPTType::T_I64: tempu64 = s->val.i64; break;
- case nsXPTType::T_U8: tempu64 = s->val.u8; break;
- case nsXPTType::T_U16: tempu64 = s->val.u16; break;
- case nsXPTType::T_U32: tempu64 = s->val.u32; break;
- case nsXPTType::T_U64: tempu64 = s->val.u64; break;
- case nsXPTType::T_BOOL: tempu64 = s->val.b; break;
- case nsXPTType::T_CHAR: tempu64 = s->val.c; break;
- case nsXPTType::T_WCHAR: tempu64 = s->val.wc; break;
- default: tempu64 = (uint64_t) s->val.p; break;
+ switch (s->type) {
+ case nsXPTType::T_FLOAT: break;
+ case nsXPTType::T_DOUBLE: break;
+ case nsXPTType::T_I8: value = s->val.i8; break;
+ case nsXPTType::T_I16: value = s->val.i16; break;
+ case nsXPTType::T_I32: value = s->val.i32; break;
+ case nsXPTType::T_I64: value = s->val.i64; break;
+ case nsXPTType::T_U8: value = s->val.u8; break;
+ case nsXPTType::T_U16: value = s->val.u16; break;
+ case nsXPTType::T_U32: value = s->val.u32; break;
+ case nsXPTType::T_U64: value = s->val.u64; break;
+ case nsXPTType::T_BOOL: value = s->val.b; break;
+ case nsXPTType::T_CHAR: value = s->val.c; break;
+ case nsXPTType::T_WCHAR: value = s->val.wc; break;
+ default: value = (uint64_t) s->val.p; break;
}
}
if (!s->IsIndirect() && s->type == nsXPTType::T_DOUBLE) {
- if (i < FPR_COUNT)
- fpregs[i] = s->val.d;
- else
- *(double *)d = s->val.d;
+ if (nr_fpr < FPR_COUNT) {
+ fpregs[nr_fpr++] = s->val.d;
+ nr_gpr++;
+ } else {
+ *((double *)d) = s->val.d;
+ d++;
+ }
}
else if (!s->IsIndirect() && s->type == nsXPTType::T_FLOAT) {
- if (i < FPR_COUNT) {
- fpregs[i] = s->val.f; // if passed in registers, floats are promoted to doubles
+ if (nr_fpr < FPR_COUNT) {
+ // Single-precision floats are passed in FPRs too.
+ fpregs[nr_fpr++] = s->val.f;
+ nr_gpr++;
} else {
- float *p = (float *)d;
-#ifndef __LITTLE_ENDIAN__
+#ifdef __LITTLE_ENDIAN__
+ *((float *)d) = s->val.f;
+#else
+ // Big endian needs adjustment to point to the least
+ // significant word.
+ float* p = (float*)d;
p++;
+ *p = s->val.f;
#endif
- *p = s->val.f;
+ d++;
}
}
else {
- if (i < GPR_COUNT)
- gpregs[i] = tempu64;
- else
- *d = tempu64;
+ if (nr_gpr < GPR_COUNT) {
+ gpregs[nr_gpr++] = value;
+ } else {
+ *d++ = value;
+ }
}
- if (i >= 7)
- d++;
}
}
EXPORT_XPCOM_API(nsresult)
-NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
- uint32_t paramCount, nsXPTCVariant* params);
-
+NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, uint32_t paramCount,
+ nsXPTCVariant* params);
diff -r d4ba07ab5722 xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp
--- a/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp Fri Sep 20 07:56:01 2019 +0200
+++ b/xpcom/reflect/xptcall/md/unix/xptcstubs_ppc64_linux.cpp Fri Sep 20 08:00:19 2019 +0200
@@ -7,36 +7,64 @@
#include "xptcprivate.h"
-// The Linux/PPC64 ABI passes the first 8 integral
-// parameters and the first 13 floating point parameters in registers
-// (r3-r10 and f1-f13), no stack space is allocated for these by the
-// caller. The rest of the parameters are passed in the caller's stack
-// area. The stack pointer has to retain 16-byte alignment.
+// Prior to POWER8, all 64-bit Power ISA systems used ELF v1 ABI, found
+// here:
+// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html
+// and in particular:
+// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUNC-CALL
+// Little-endian ppc64le, however, uses ELF v2 ABI, which is here:
+// http://openpowerfoundation.org/wp-content/uploads/resources/leabi/leabi-20170510.pdf
+// and in particular section 2.2, page 22. However, most big-endian ppc64
+// systems still use ELF v1, so this file should support both.
+//
+// Both ABIs pass the first 8 integral parameters and the first 13 floating
+// point parameters in registers r3-r10 and f1-f13. No stack space is
+// allocated for these by the caller. The rest of the parameters are passed
+// in the caller's stack area. The stack pointer must stay 16-byte aligned.
-// The PowerPC64 platform ABI can be found here:
-// http://www.freestandards.org/spec/ELF/ppc64/
-// and in particular:
-// http://www.freestandards.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-CALL
-
-#define PARAM_BUFFER_COUNT 16
-#define GPR_COUNT 7
-#define FPR_COUNT 13
+const uint32_t PARAM_BUFFER_COUNT = 16;
+const uint32_t GPR_COUNT = 7;
+const uint32_t FPR_COUNT = 13;
// PrepareAndDispatch() is called by SharedStub() and calls the actual method.
//
// - 'args[]' contains the arguments passed on stack
-// - 'gprData[]' contains the arguments passed in integer registers
-// - 'fprData[]' contains the arguments passed in floating point registers
+// - 'gpregs[]' contains the arguments passed in integer registers
+// - 'fpregs[]' contains the arguments passed in floating point registers
//
// The parameters are mapped into an array of type 'nsXPTCMiniVariant'
// and then the method gets called.
-#include <stdio.h>
+//
+// Both ABIs use the same register assignment strategy, as per this
+// example from V1 ABI section 3.2.3 and V2 ABI section 2.2.3.2 [page 43]:
+//
+// typedef struct {
+// int a;
+// double dd;
+// } sparm;
+// sparm s, t;
+// int c, d, e;
+// long double ld;
+// double ff, gg, hh;
+//
+// x = func(c, ff, d, ld, s, gg, t, e, hh);
+//
+// Parameter Register Offset in parameter save area
+// c r3 0-7 (not stored in parameter save area)
+// ff f1 8-15 (not stored)
+// d r5 16-23 (not stored)
+// ld f2,f3 24-39 (not stored)
+// s r8,r9 40-55 (not stored)
+// gg f4 56-63 (not stored)
+// t (none) 64-79 (stored in parameter save area)
+// e (none) 80-87 (stored)
+// hh f5 88-95 (not stored)
+//
+// i.e., each successive FPR usage skips a GPR, but not the other way around.
+
extern "C" nsresult ATTRIBUTE_USED
-PrepareAndDispatch(nsXPTCStubBase* self,
- uint64_t methodIndex,
- uint64_t* args,
- uint64_t *gprData,
- double *fprData)
+PrepareAndDispatch(nsXPTCStubBase * self, uint32_t methodIndex,
+ uint64_t * args, uint64_t * gpregs, double *fpregs)
{
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
nsXPTCMiniVariant* dispatchParams = nullptr;
@@ -48,7 +76,7 @@
self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info);
NS_ASSERTION(info,"no method info");
- if (! info)
+ if (!info)
return NS_ERROR_UNEXPECTED;
paramCount = info->GetParamCount();
@@ -66,9 +94,11 @@
const uint8_t indexOfJSContext = info->IndexOfJSContext();
uint64_t* ap = args;
- uint32_t iCount = 0;
- uint32_t fpCount = 0;
- uint64_t tempu64;
+ // |that| is implicit in the calling convention; we really do start at the
+ // first GPR (as opposed to x86_64).
+ uint32_t nr_gpr = 0;
+ uint32_t nr_fpr = 0;
+ uint64_t value;
for(i = 0; i < paramCount; i++) {
const nsXPTParamInfo& param = info->GetParam(i);
@@ -76,67 +106,67 @@
nsXPTCMiniVariant* dp = &dispatchParams[i];
if (i == indexOfJSContext) {
- if (iCount < GPR_COUNT)
- iCount++;
+ if (nr_gpr < GPR_COUNT)
+ nr_gpr++;
else
ap++;
}
if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
- if (fpCount < FPR_COUNT) {
- dp->val.d = fprData[fpCount++];
- }
- else
- dp->val.d = *(double*) ap;
- } else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
- if (fpCount < FPR_COUNT) {
- dp->val.f = (float) fprData[fpCount++]; // in registers floats are passed as doubles
+ if (nr_fpr < FPR_COUNT) {
+ dp->val.d = fpregs[nr_fpr++];
+ nr_gpr++;
+ } else {
+ dp->val.d = *(double*)ap++;
}
- else {
- float *p = (float *)ap;
-#ifndef __LITTLE_ENDIAN__
+ continue;
+ }
+ if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
+ if (nr_fpr < FPR_COUNT) {
+ // Single-precision floats are passed in FPRs too.
+ dp->val.f = (float)fpregs[nr_fpr++];
+ nr_gpr++;
+ } else {
+#ifdef __LITTLE_ENDIAN__
+ dp->val.f = *(float*)ap++;
+#else
+ // Big endian needs adjustment to point to the least
+ // significant word.
+ float* p = (float*)ap;
p++;
-#endif
dp->val.f = *p;
+ ap++;
+#endif
}
- } else { /* integer type or pointer */
- if (iCount < GPR_COUNT)
- tempu64 = gprData[iCount];
- else
- tempu64 = *ap;
+ continue;
+ }
+ if (nr_gpr < GPR_COUNT)
+ value = gpregs[nr_gpr++];
+ else
+ value = *ap++;
- if (param.IsOut() || !type.IsArithmetic())
- dp->val.p = (void*) tempu64;
- else if (type == nsXPTType::T_I8)
- dp->val.i8 = (int8_t) tempu64;
- else if (type == nsXPTType::T_I16)
- dp->val.i16 = (int16_t) tempu64;
- else if (type == nsXPTType::T_I32)
- dp->val.i32 = (int32_t) tempu64;
- else if (type == nsXPTType::T_I64)
- dp->val.i64 = (int64_t) tempu64;
- else if (type == nsXPTType::T_U8)
- dp->val.u8 = (uint8_t) tempu64;
- else if (type == nsXPTType::T_U16)
- dp->val.u16 = (uint16_t) tempu64;
- else if (type == nsXPTType::T_U32)
- dp->val.u32 = (uint32_t) tempu64;
- else if (type == nsXPTType::T_U64)
- dp->val.u64 = (uint64_t) tempu64;
- else if (type == nsXPTType::T_BOOL)
- dp->val.b = (bool) tempu64;
- else if (type == nsXPTType::T_CHAR)
- dp->val.c = (char) tempu64;
- else if (type == nsXPTType::T_WCHAR)
- dp->val.wc = (wchar_t) tempu64;
- else
- NS_ERROR("bad type");
+ if (param.IsOut() || !type.IsArithmetic()) {
+ dp->val.p = (void*) value;
+ continue;
}
- if (iCount < GPR_COUNT)
- iCount++; // gprs are skipped for fp args, so this always needs inc
- else
- ap++;
+ switch (type) {
+ case nsXPTType::T_I8: dp->val.i8 = (int8_t) value; break;
+ case nsXPTType::T_I16: dp->val.i16 = (int16_t) value; break;
+ case nsXPTType::T_I32: dp->val.i32 = (int32_t) value; break;
+ case nsXPTType::T_I64: dp->val.i64 = (int64_t) value; break;
+ case nsXPTType::T_U8: dp->val.u8 = (uint8_t) value; break;
+ case nsXPTType::T_U16: dp->val.u16 = (uint16_t) value; break;
+ case nsXPTType::T_U32: dp->val.u32 = (uint32_t) value; break;
+ case nsXPTType::T_U64: dp->val.u64 = (uint64_t) value; break;
+ case nsXPTType::T_BOOL: dp->val.b = (bool) value; break;
+ case nsXPTType::T_CHAR: dp->val.c = (char) value; break;
+ case nsXPTType::T_WCHAR: dp->val.wc = (wchar_t) value; break;
+
+ default:
+ NS_ERROR("bad type");
+ break;
+ }
}
nsresult result = self->mOuter->CallMethod((uint16_t) methodIndex, info,
@@ -150,23 +180,19 @@
// Load r11 with the constant 'n' and branch to SharedStub().
//
+// As G++3 ABI contains the length of the functionname in the mangled
+// name, it is difficult to get a generic assembler mechanism like
+// in the G++ 2.95 case.
// XXX Yes, it's ugly that we're relying on gcc's name-mangling here;
// however, it's quick, dirty, and'll break when the ABI changes on
// us, which is what we want ;-).
-
-
-// gcc-3 version
-//
-// As G++3 ABI contains the length of the functionname in the mangled
-// name, it is difficult to get a generic assembler mechanism like
-// in the G++ 2.95 case.
// Create names would be like:
// _ZN14nsXPTCStubBase5Stub1Ev
// _ZN14nsXPTCStubBase6Stub12Ev
// _ZN14nsXPTCStubBase7Stub123Ev
// _ZN14nsXPTCStubBase8Stub1234Ev
// etc.
-// Use assembler directives to get the names right...
+// Use assembler directives to get the names right.
#if _CALL_ELF == 2
# define STUB_ENTRY(n) \
@@ -252,7 +278,7 @@
#define SENTINEL_ENTRY(n) \
nsresult nsXPTCStubBase::Sentinel##n() \
{ \
- NS_ERROR("nsXPTCStubBase::Sentinel called"); \
+ NS_ERROR("nsXPTCStubBase::Sentinel called"); \
return NS_ERROR_NOT_IMPLEMENTED; \
}

View File

@ -0,0 +1,16 @@
# HG changeset patch
# Parent b2d2d5ae8d2a00ddbf496e415fdde16d08e35884
This has been submitted upstream:
https://bugzilla.mozilla.org/show_bug.cgi?id=1580701
diff -r b2d2d5ae8d2a -r 91fa98f1d233 comm/mail/locales/l10n.ini
--- a/comm/mail/locales/l10n.ini Fri May 31 11:28:11 2019 +0200
+++ b/comm/mail/locales/l10n.ini Wed Sep 11 15:01:55 2019 +0200
@@ -13,5 +13,5 @@
# include toolkit from mozilla.
# Don't specify which, use l10n-central.ini and friends if you're
# not working on a local check-out
-toolkit = mozilla/toolkit/locales/l10n.ini
-devtools_client = mozilla/devtools/client/locales/l10n.ini
+toolkit = ../toolkit/locales/l10n.ini
+devtools_client = ../devtools/client/locales/l10n.ini

View File

@ -1,12 +0,0 @@
diff --git a/comm/mail/locales/l10n.ini b/comm/mail/locales/l10n.ini
index eac6bfa..8700472 100644
--- a/comm/mail/locales/l10n.ini
+++ b/comm/mail/locales/l10n.ini
@@ -13,5 +13,5 @@ dirs = mail
# include toolkit from mozilla.
# Don't specify which, use l10n-central.ini and friends if you're
# not working on a local check-out
-toolkit = mozilla/toolkit/locales/l10n.ini
-devtools_client = mozilla/devtools/client/locales/l10n.ini
+toolkit = ../toolkit/locales/l10n.ini
+devtools_client = ../devtools/client/locales/l10n.ini