![Adam Duskett](/assets/img/avatar_default.png)
Spidermonkey is Mozilla's JavaScript engine written in C and C++. It is used in various Mozilla products, including Firefox, and is available under the MPL2. There are 10 patches currently required to properly cross-compile spidermonkey: 1) allow-newer-autoconf-versions - Spidermonkey is hardcoded to use Autoconf 2.13, which is from 1999! The reasoning behind using 2.13 is because newer versions of Autoconf do not work correctly with the custom m4 macros in the source code. However: Because we are building just the Spidermonkey engine instead of the entire Firefox package, newer versions of Autoconf work without issue. See: See: https://bugzilla.mozilla.org/show_bug.cgi?id=104642 for further explanation. 2) allow-building-in-tree - By default, spidermonkey must be configured and built out-of-tree, otherwise the following error occurs: FATAL ERROR PROCESSING MOZBUILD FILE ============================== The error occurred while processing the following file or one of the files it includes: js/src/shell/moz.build The error occurred when validating the result of the execution. The reported error is: The path specified in LOCAL_INCLUDES is not allowed: .. (resolved to js/src) Remove this check, as spidermonkey builds without issue in-tree. 3) allow-unknown-configuration-options - By default, if an unknown parameter is passed to configure, an error is raised. Replace the raise with a pass and continue. Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1379540 4) fix-building-with-musl - The MIPS specific header <sgidefs.h> is not provided by musl. The Linux kernel headers <asm/sgidefs.h> provide the same definitions. 5) add-riscv-support - Submitted upstream: See: https://bugzilla.mozilla.org/show_bug.cgi?id=1318905 6) copy-headers-on-install-instead-of-symlinking - When installing, instead of linking the headers to the source directory, copy them. 7) ensure-proper-running-on-64-bit-and-32-bit-be-platforms - Taken from the Fedora RPM Applied upstream. Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1488552 8) 0008-save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-obje - Taken from the Fedora RPM: Applied upstream. Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1375074 9) save-x28-before-clobbering-it-in-the-regex-compiler - Taken from the Fedora RPM: Applied upstream. Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1445907 10) always-use-the-equivalent-year-to-determine-the-time-zone - Taken from the Fedora RPM: Applied upstream. Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1415202 Typically, The Firefox source tarball is used to build spidermonkey; however, this has two disadvantages: - It's large. The Firefox source tarball is over 250M. - It requires Autoconf 2.13 Instead, use a tarball with only the Spidermonkey source code in it with a pre-setup configure file. This tarball reduces the size to 31M and prevents the Autoconf 2.13 requirement. Signed-off-by: Adam Duskett <aduskett@greenlots.com> [Thomas: adjust how the libnspr arch dependency is handled] Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
145 lines
5.3 KiB
Diff
145 lines
5.3 KiB
Diff
From f66d410f3ba767efb91c6b9545d373267cd975f2 Mon Sep 17 00:00:00 2001
|
|
From: Philip Chimento <philip@endlessm.com>
|
|
Date: Sat, 7 Sep 2019 20:43:40 +0200
|
|
Subject: [PATCH] ensure proper running on 64-bit and 32-bit BE platforms
|
|
|
|
See: https://salsa.debian.org/gnome-team/mozjs60/blob/debian/master/debian/patches/jsproperty-endian.patch
|
|
|
|
Signed-off-by: Philip Chimento <philip@endlessm.com>
|
|
Signed-off-by: Adam Duskett <aduskett@gmail.com>
|
|
---
|
|
js/src/gc/Marking-inl.h | 16 ++++++++++++++++
|
|
js/src/gc/RelocationOverlay.h | 13 ++++++++++++-
|
|
js/src/jsfriendapi.h | 8 ++++++++
|
|
js/src/vm/StringType.h | 13 +++++++++++++
|
|
4 files changed, 49 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/js/src/gc/Marking-inl.h b/js/src/gc/Marking-inl.h
|
|
index 6d2a4c7..c773c21 100644
|
|
--- a/js/src/gc/Marking-inl.h
|
|
+++ b/js/src/gc/Marking-inl.h
|
|
@@ -82,12 +82,28 @@ inline void RelocationOverlay::forwardTo(Cell* cell) {
|
|
MOZ_ASSERT(!isForwarded());
|
|
// The location of magic_ is important because it must never be valid to see
|
|
// the value Relocated there in a GC thing that has not been moved.
|
|
+#if MOZ_LITTLE_ENDIAN || JS_BITS_PER_WORD == 32
|
|
+ // On 32-bit, the magic_ aliases with whatever comes after the first
|
|
+ // pointer; on little-endian 64-bit, the magic_ aliases with the
|
|
+ // 32 most significant bits of the pointer, which are the second half.
|
|
static_assert(offsetof(RelocationOverlay, magic_) ==
|
|
offsetof(JSObject, group_) + sizeof(uint32_t),
|
|
"RelocationOverlay::magic_ is in the wrong location");
|
|
static_assert(offsetof(RelocationOverlay, magic_) ==
|
|
offsetof(js::Shape, base_) + sizeof(uint32_t),
|
|
"RelocationOverlay::magic_ is in the wrong location");
|
|
+#elif JS_BITS_PER_WORD == 64
|
|
+ // On big-endian 64-bit, the magic_ aliases with the 32 most
|
|
+ // significant bits of the pointer, but now that's the first half.
|
|
+ static_assert(offsetof(RelocationOverlay, magic_) ==
|
|
+ offsetof(JSObject, group_),
|
|
+ "RelocationOverlay::magic_ is in the wrong location");
|
|
+ static_assert(offsetof(RelocationOverlay, magic_) ==
|
|
+ offsetof(js::Shape, base_),
|
|
+ "RelocationOverlay::magic_ is in the wrong location");
|
|
+#else
|
|
+# error "Unknown endianness or word size"
|
|
+#endif
|
|
static_assert(
|
|
offsetof(RelocationOverlay, magic_) == offsetof(JSString, d.u1.length),
|
|
"RelocationOverlay::magic_ is in the wrong location");
|
|
diff --git a/js/src/gc/RelocationOverlay.h b/js/src/gc/RelocationOverlay.h
|
|
index a568843..399a541 100644
|
|
--- a/js/src/gc/RelocationOverlay.h
|
|
+++ b/js/src/gc/RelocationOverlay.h
|
|
@@ -33,14 +33,25 @@ class RelocationOverlay {
|
|
/* See comment in js/public/HeapAPI.h. */
|
|
static const uint32_t Relocated = js::gc::Relocated;
|
|
|
|
+#if MOZ_LITTLE_ENDIAN || JS_BITS_PER_WORD == 32
|
|
/*
|
|
- * Keep the low 32 bits untouched. Use them to distinguish strings from
|
|
+ * Keep the first 32 bits untouched. Use them to distinguish strings from
|
|
* objects in the nursery.
|
|
*/
|
|
uint32_t preserve_;
|
|
|
|
/* Set to Relocated when moved. */
|
|
uint32_t magic_;
|
|
+#elif JS_BITS_PER_WORD == 64
|
|
+ /*
|
|
+ * On big-endian, we need to reorder to keep preserve_ lined up with the
|
|
+ * low 32 bits of the aligned group_ pointer in JSObject.
|
|
+ */
|
|
+ uint32_t magic_;
|
|
+ uint32_t preserve_;
|
|
+#else
|
|
+# error "Unknown endianness or word size"
|
|
+#endif
|
|
|
|
/* The location |this| was moved to. */
|
|
Cell* newLocation_;
|
|
diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h
|
|
index 4b8d18a..70ce0a1 100644
|
|
--- a/js/src/jsfriendapi.h
|
|
+++ b/js/src/jsfriendapi.h
|
|
@@ -9,6 +9,7 @@
|
|
|
|
#include "mozilla/Atomics.h"
|
|
#include "mozilla/Casting.h"
|
|
+#include "mozilla/EndianUtils.h"
|
|
#include "mozilla/Maybe.h"
|
|
#include "mozilla/MemoryReporting.h"
|
|
#include "mozilla/UniquePtr.h"
|
|
@@ -609,8 +610,15 @@ struct String {
|
|
static const uint32_t LATIN1_CHARS_BIT = JS_BIT(6);
|
|
static const uint32_t EXTERNAL_FLAGS = LINEAR_BIT | NON_ATOM_BIT | JS_BIT(5);
|
|
static const uint32_t TYPE_FLAGS_MASK = JS_BIT(6) - 1;
|
|
+#if MOZ_LITTLE_ENDIAN || JS_BITS_PER_WORD == 32
|
|
uint32_t flags;
|
|
uint32_t length;
|
|
+#elif JS_BITS_PER_WORD == 64
|
|
+ uint32_t length;
|
|
+ uint32_t flags;
|
|
+#else
|
|
+# error "Unknown endianness or word size"
|
|
+#endif
|
|
union {
|
|
const JS::Latin1Char* nonInlineCharsLatin1;
|
|
const char16_t* nonInlineCharsTwoByte;
|
|
diff --git a/js/src/vm/StringType.h b/js/src/vm/StringType.h
|
|
index cde3427..c3400db 100644
|
|
--- a/js/src/vm/StringType.h
|
|
+++ b/js/src/vm/StringType.h
|
|
@@ -7,6 +7,7 @@
|
|
#ifndef vm_StringType_h
|
|
#define vm_StringType_h
|
|
|
|
+#include "mozilla/EndianUtils.h"
|
|
#include "mozilla/MemoryReporting.h"
|
|
#include "mozilla/PodOperations.h"
|
|
#include "mozilla/Range.h"
|
|
@@ -168,8 +169,20 @@ class JSString : public js::gc::Cell {
|
|
struct Data {
|
|
union {
|
|
struct {
|
|
+#if MOZ_LITTLE_ENDIAN || JS_BITS_PER_WORD == 32
|
|
uint32_t flags; /* JSString */
|
|
uint32_t length; /* JSString */
|
|
+#elif JS_BITS_PER_WORD == 64
|
|
+ /*
|
|
+ * On big-endian, we need to reorder to keep flags lined up
|
|
+ * with the low 32 bits of the aligned group_ pointer in
|
|
+ * JSObject.
|
|
+ */
|
|
+ uint32_t length; /* JSString */
|
|
+ uint32_t flags; /* JSString */
|
|
+#else
|
|
+# error "Unknown endianness or word size"
|
|
+#endif
|
|
};
|
|
uintptr_t flattenData; /* JSRope (temporary while flattening) */
|
|
} u1;
|
|
--
|
|
2.23.0
|
|
|