diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e2748d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/firefox-60.9.0esr.source.tar.xz diff --git a/.mozjs60.metadata b/.mozjs60.metadata new file mode 100644 index 0000000..ac74ac9 --- /dev/null +++ b/.mozjs60.metadata @@ -0,0 +1 @@ +616f8afdee741f0bea607a671b8515ef13c68b4a SOURCES/firefox-60.9.0esr.source.tar.xz diff --git a/SOURCES/Always-use-the-equivalent-year-to-determine-the-time-zone.patch b/SOURCES/Always-use-the-equivalent-year-to-determine-the-time-zone.patch new file mode 100644 index 0000000..81474a4 --- /dev/null +++ b/SOURCES/Always-use-the-equivalent-year-to-determine-the-time-zone.patch @@ -0,0 +1,100 @@ +From: =?utf-8?q?Andr=C3=A9_Bargull?= +Date: Wed, 8 Nov 2017 03:23:41 -0800 +Subject: Always use the equivalent year to determine the time zone offset and + name + +Reviewed-by: Jeff Walden +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1415202 +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1479687 +Origin: upstream +Applied-upstream: 62, commit:https://hg.mozilla.org/mozilla-central/rev/ce9f1466ec78 +--- + js/src/jsdate.cpp | 11 +++++++---- + js/src/vm/Time.cpp | 14 ++++---------- + js/src/vm/Time.h | 2 +- + 3 files changed, 12 insertions(+), 15 deletions(-) + +diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp +index 07af3d18c865..ff8fd6c3763c 100644 +--- a/js/src/jsdate.cpp ++++ b/js/src/jsdate.cpp +@@ -2353,12 +2353,15 @@ static PRMJTime ToPRMJTime(double localTime, double utcTime) { + static size_t FormatTime(char* buf, int buflen, const char* fmt, double utcTime, + double localTime) { + PRMJTime prtm = ToPRMJTime(localTime, utcTime); +- int eqivalentYear = IsRepresentableAsTime32(utcTime) +- ? prtm.tm_year +- : EquivalentYearForDST(prtm.tm_year); ++ // If an equivalent year was used to compute the date/time components, use ++ // the same equivalent year to determine the time zone name and offset in ++ // PRMJ_FormatTime(...). ++ int timeZoneYear = IsRepresentableAsTime32(utcTime) ++ ? prtm.tm_year ++ : EquivalentYearForDST(prtm.tm_year); + int offsetInSeconds = (int)floor((localTime - utcTime) / msPerSecond); + +- return PRMJ_FormatTime(buf, buflen, fmt, &prtm, eqivalentYear, ++ return PRMJ_FormatTime(buf, buflen, fmt, &prtm, timeZoneYear, + offsetInSeconds); + } + +diff --git a/js/src/vm/Time.cpp b/js/src/vm/Time.cpp +index f59977f0d0e9..5ee4794b3e83 100644 +--- a/js/src/vm/Time.cpp ++++ b/js/src/vm/Time.cpp +@@ -247,7 +247,7 @@ static void PRMJ_InvalidParameterHandler(const wchar_t* expression, + + /* Format a time value into a buffer. Same semantics as strftime() */ + size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt, +- const PRMJTime* prtm, int equivalentYear, ++ const PRMJTime* prtm, int timeZoneYear, + int offsetInSeconds) { + size_t result = 0; + #if defined(XP_UNIX) || defined(XP_WIN) +@@ -280,7 +280,8 @@ size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt, + * Fill out |td| to the time represented by |prtm|, leaving the + * timezone fields zeroed out. localtime_r will then fill in the + * timezone fields for that local time according to the system's +- * timezone parameters. ++ * timezone parameters. Use |timeZoneYear| for the year to ensure the ++ * time zone name matches the time zone offset used by the caller. + */ + struct tm td; + memset(&td, 0, sizeof(td)); +@@ -290,19 +291,12 @@ size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt, + td.tm_mday = prtm->tm_mday; + td.tm_mon = prtm->tm_mon; + td.tm_wday = prtm->tm_wday; +- td.tm_year = prtm->tm_year - 1900; ++ td.tm_year = timeZoneYear - 1900; + td.tm_yday = prtm->tm_yday; + td.tm_isdst = prtm->tm_isdst; + + time_t t = mktime(&td); + +- // If |prtm| cannot be represented in |time_t| the year is probably +- // out of range, try again with the DST equivalent year. +- if (t == static_cast(-1)) { +- td.tm_year = equivalentYear - 1900; +- t = mktime(&td); +- } +- + // If either mktime or localtime_r failed, fill in the fallback time + // zone offset |offsetInSeconds| and set the time zone identifier to + // the empty string. +diff --git a/js/src/vm/Time.h b/js/src/vm/Time.h +index 3a51d869c922..37b7faeec028 100644 +--- a/js/src/vm/Time.h ++++ b/js/src/vm/Time.h +@@ -49,7 +49,7 @@ inline void PRMJ_NowShutdown() {} + + /* Format a time value into a buffer. Same semantics as strftime() */ + extern size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt, +- const PRMJTime* tm, int equivalentYear, ++ const PRMJTime* tm, int timeZoneYear, + int offsetInSeconds); + + /** +-- +2.21.0 + diff --git a/SOURCES/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch b/SOURCES/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch new file mode 100644 index 0000000..46d280d --- /dev/null +++ b/SOURCES/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch @@ -0,0 +1,64 @@ +# HG changeset patch +# User Lars T Hansen +# Date 1519822672 -3600 +# Node ID 800abe66894d6b07b24bccecbf6a65e2261076f6 +# Parent 223c97459e96183eb616aed39147207bdb953ba8 +Bug 1375074 - Save and restore non-volatile x28 on ARM64 for generated unboxed object constructor. r=sstangl + +Origin: upstream +Applied-upstream: 61, commit: https://hg.mozilla.org/mozilla-central/rev/800abe66894d +--- + js/src/vm/UnboxedObject.cpp | 30 ++++++++++++++++++++++++++---- + 1 file changed, 26 insertions(+), 4 deletions(-) + +diff --git a/js/src/vm/UnboxedObject.cpp b/js/src/vm/UnboxedObject.cpp +index 35ca20d7405f..1c20a1093d13 100644 +--- a/js/src/vm/UnboxedObject.cpp ++++ b/js/src/vm/UnboxedObject.cpp +@@ -86,9 +86,16 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = 0x1; + #endif + + #ifdef JS_CODEGEN_ARM64 +- // ARM64 communicates stack address via sp, but uses a pseudo-sp for +- // addressing. +- masm.initStackPtr(); ++ // ARM64 communicates stack address via sp, but uses a pseudo-sp (PSP) for ++ // addressing. The register we use for PSP may however also be used by ++ // calling code, and it is nonvolatile, so save it. Do this as a special ++ // case first because the generic save/restore code needs the PSP to be ++ // initialized already. ++ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64())); ++ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex)); ++ ++ // Initialize the PSP from the SP. ++ masm.initStackPtr(); + #endif + + MOZ_ASSERT(propertiesReg.volatile_()); +@@ -239,7 +246,22 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = 0x1; + if (ScratchDoubleReg.volatile_()) masm.pop(ScratchDoubleReg); + masm.PopRegsInMask(savedNonVolatileRegisters); + +- masm.abiret(); ++#ifdef JS_CODEGEN_ARM64 ++ // Now restore the value that was in the PSP register on entry, and return. ++ ++ // Obtain the correct SP from the PSP. ++ masm.Mov(sp, PseudoStackPointer64); ++ ++ // Restore the saved value of the PSP register, this value is whatever the ++ // caller had saved in it, not any actual SP value, and it must not be ++ // overwritten subsequently. ++ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex)); ++ ++ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong. ++ masm.Ret(vixl::lr); ++#else ++ masm.abiret(); ++#endif + + masm.bind(&failureStoreOther); + +-- +2.21.0 + diff --git a/SOURCES/Save-x28-before-clobbering-it-in-the-regex-compiler.patch b/SOURCES/Save-x28-before-clobbering-it-in-the-regex-compiler.patch new file mode 100644 index 0000000..3886c0e --- /dev/null +++ b/SOURCES/Save-x28-before-clobbering-it-in-the-regex-compiler.patch @@ -0,0 +1,97 @@ +# HG changeset patch +# User Lars T Hansen +# Date 1521449886 -3600 +# Node ID 903a79a1efff18fc7cc50db09a3fe5d768adc9a8 +# Parent 4d2955a9ca7e30ca4c3af9c214ccc77fb2fe7fb8 +Bug 1445907 - Save x28 before clobbering it in the regex compiler. r=sstangl + +Origin: upstream +Applied-upstream: 61, commit: https://hg.mozilla.org/mozilla-central/rev/903a79a1efff +--- +diff --git a/js/src/irregexp/NativeRegExpMacroAssembler.cpp b/js/src/irregexp/NativeRegExpMacroAssembler.cpp +--- a/js/src/irregexp/NativeRegExpMacroAssembler.cpp ++++ b/js/src/irregexp/NativeRegExpMacroAssembler.cpp +@@ -118,17 +118,25 @@ NativeRegExpMacroAssembler::GenerateCode + + Label return_temp0; + + // Finalize code - write the entry point code now we know how many + // registers we need. + masm.bind(&entry_label_); + + #ifdef JS_CODEGEN_ARM64 +- // ARM64 communicates stack address via sp, but uses a pseudo-sp for addressing. ++ // ARM64 communicates stack address via SP, but uses a pseudo-sp (PSP) for ++ // addressing. The register we use for PSP may however also be used by ++ // calling code, and it is nonvolatile, so save it. Do this as a special ++ // case first because the generic save/restore code needs the PSP to be ++ // initialized already. ++ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64())); ++ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex)); ++ ++ // Initialize the PSP from the SP. + masm.initStackPtr(); + #endif + + // Push non-volatile registers which might be modified by jitcode. + size_t pushedNonVolatileRegisters = 0; + for (GeneralRegisterForwardIterator iter(savedNonVolatileRegisters); iter.more(); ++iter) { + masm.Push(*iter); + pushedNonVolatileRegisters++; +@@ -416,17 +424,32 @@ NativeRegExpMacroAssembler::GenerateCode + masm.pop(temp0); + masm.movePtr(temp0, StackPointer); + #endif + + // Restore non-volatile registers which were saved on entry. + for (GeneralRegisterBackwardIterator iter(savedNonVolatileRegisters); iter.more(); ++iter) + masm.Pop(*iter); + ++#ifdef JS_CODEGEN_ARM64 ++ // Now restore the value that was in the PSP register on entry, and return. ++ ++ // Obtain the correct SP from the PSP. ++ masm.Mov(sp, PseudoStackPointer64); ++ ++ // Restore the saved value of the PSP register, this value is whatever the ++ // caller had saved in it, not any actual SP value, and it must not be ++ // overwritten subsequently. ++ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex)); ++ ++ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong. ++ masm.Ret(vixl::lr); ++#else + masm.abiret(); ++#endif + + // Backtrack code (branch target for conditional backtracks). + if (backtrack_label_.used()) { + masm.bind(&backtrack_label_); + Backtrack(); + } + + // Backtrack stack overflow code. +diff --git a/js/src/jit-test/tests/regexp/bug1445907.js b/js/src/jit-test/tests/regexp/bug1445907.js +new file mode 100644 +--- /dev/null ++++ b/js/src/jit-test/tests/regexp/bug1445907.js +@@ -0,0 +1,15 @@ ++// On ARM64, we failed to save x28 properly when generating code for the regexp ++// matcher. ++// ++// There's wasm and Debugger code here because the combination forces the use of ++// x28 and exposes the bug when running on the simulator. ++ ++if (!wasmIsSupported()) ++ quit(); ++ ++var g = newGlobal(''); ++var dbg = new Debugger(g); ++g.eval(`var m = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary('(module (func (export "test")))')))`); ++var re = /./; ++dbg.onEnterFrame = function(frame) { re.exec("x") }; ++result = g.eval("m.exports.test()"); + +-- +2.21.0 + diff --git a/SOURCES/build-icu-big-endian.patch b/SOURCES/build-icu-big-endian.patch new file mode 100644 index 0000000..2cfc839 --- /dev/null +++ b/SOURCES/build-icu-big-endian.patch @@ -0,0 +1,13 @@ +diff -up firefox-60.0/build/autoconf/icu.m4.icu firefox-60.0/build/autoconf/icu.m4 +--- firefox-60.0/build/autoconf/icu.m4.icu 2018-04-24 13:13:03.938961958 +0200 ++++ firefox-60.0/build/autoconf/icu.m4 2018-04-24 13:14:44.472714375 +0200 +@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then + # TODO: the l is actually endian-dependent + # We could make this set as 'l' or 'b' for little or big, respectively, + # but we'd need to check in a big-endian version of the file. +- ICU_DATA_FILE="icudt${version}l.dat" ++ ICU_DATA_FILE="icudt${version}b.dat" + + MOZ_ICU_DATA_ARCHIVE= + fi + diff --git a/SOURCES/copy-headers.patch b/SOURCES/copy-headers.patch new file mode 100644 index 0000000..aec3b10 --- /dev/null +++ b/SOURCES/copy-headers.patch @@ -0,0 +1,29 @@ +From: Rico Tzschichholz +Date: Wed, 5 Jul 2017 22:45:59 -0700 +Subject: build: Copy headers on install instead of symlinking + +Patch ported forward to mozjs52 by Philip Chimento +. +--- + python/mozbuild/mozbuild/backend/recursivemake.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py +index dd9020d..6918ef8 100644 +--- a/python/mozbuild/mozbuild/backend/recursivemake.py ++++ b/python/mozbuild/mozbuild/backend/recursivemake.py +@@ -1427,11 +1427,11 @@ class RecursiveMakeBackend(CommonBackend): + raise Exception("Wildcards are only supported in the filename part of " + "srcdir-relative or absolute paths.") + +- install_manifest.add_pattern_link(basepath, wild, path) ++ install_manifest.add_pattern_copy(basepath, wild, path) + else: +- install_manifest.add_pattern_link(f.srcdir, f, path) ++ install_manifest.add_pattern_copy(f.srcdir, f, path) + else: +- install_manifest.add_link(f.full_path, dest) ++ install_manifest.add_copy(f.full_path, dest) + else: + install_manifest.add_optional_exists(dest) + backend_file.write('%s_FILES += %s\n' % ( diff --git a/SOURCES/emitter.patch b/SOURCES/emitter.patch new file mode 100644 index 0000000..0f414d7 --- /dev/null +++ b/SOURCES/emitter.patch @@ -0,0 +1,15 @@ +--- a/python/mozbuild/mozbuild/frontend/emitter.py ++++ b/python/mozbuild/mozbuild/frontend/emitter.py +@@ -1127,11 +1127,6 @@ + raise SandboxValidationError('Path specified in LOCAL_INCLUDES ' + 'does not exist: %s (resolved to %s)' % (local_include, + full_path), context) +- if (full_path == context.config.topsrcdir or +- full_path == context.config.topobjdir): +- raise SandboxValidationError('Path specified in LOCAL_INCLUDES ' +- 'is not allowed: %s (resolved to %s)' % (local_include, +- full_path), context) + include_obj = LocalInclude(context, local_include) + local_includes.append(include_obj.path.full_path) + yield include_obj + diff --git a/SOURCES/emitter_test.patch b/SOURCES/emitter_test.patch new file mode 100644 index 0000000..dad8ddc --- /dev/null +++ b/SOURCES/emitter_test.patch @@ -0,0 +1,26 @@ +--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py ++++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py +@@ -999,22 +999,6 @@ + + self.assertEqual(local_includes, expected) + +- def test_local_includes_invalid(self): +- """Test that invalid LOCAL_INCLUDES are properly detected.""" +- reader = self.reader('local_includes-invalid/srcdir') +- +- with self.assertRaisesRegexp( +- SandboxValidationError, +- 'Path specified in LOCAL_INCLUDES is not allowed:'): +- objs = self.read_topsrcdir(reader) +- +- reader = self.reader('local_includes-invalid/objdir') +- +- with self.assertRaisesRegexp( +- SandboxValidationError, +- 'Path specified in LOCAL_INCLUDES is not allowed:'): +- objs = self.read_topsrcdir(reader) +- + def test_generated_includes(self): + """Test that GENERATED_INCLUDES is emitted correctly.""" + reader = self.reader('generated_includes') + diff --git a/SOURCES/enddianness.patch b/SOURCES/enddianness.patch new file mode 100644 index 0000000..56c622a --- /dev/null +++ b/SOURCES/enddianness.patch @@ -0,0 +1,141 @@ +From f66d410f3ba767efb91c6b9545d373267cd975f2 Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Sat, 7 Sep 2019 20:43:40 +0200 +Subject: [PATCH] enddianness.patch + +Bug 1488552 - Ensure proper running on 64-bit and 32-bit BE platforms. +--- + 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 + diff --git a/SOURCES/fix-soname.patch b/SOURCES/fix-soname.patch new file mode 100644 index 0000000..fc8052a --- /dev/null +++ b/SOURCES/fix-soname.patch @@ -0,0 +1,25 @@ +From: "Laszlo Boszormenyi (GCS)" +Date: Fri, 2 May 2014 22:20:45 +0200 +Subject: fix soname + +Add soname switch to linker, regardless of Operating System + +Bug-Debian: http://bugs.debian.org/746705 +--- + config/rules.mk | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/config/rules.mk b/config/rules.mk +index eb86b0c..1bb3988 100644 +--- a/config/rules.mk ++++ b/config/rules.mk +@@ -359,6 +359,9 @@ endif + endif + EXTRA_DEPS += $(SYMBOLS_FILE) + endif ++ ++EXTRA_DSO_LDOPTS += -Wl,-soname,lib$(JS_LIBRARY_NAME).so.0 ++ + # + # GNU doesn't have path length limitation + # diff --git a/SOURCES/icu_sources_data-Write-command-output-to-our-stderr.patch b/SOURCES/icu_sources_data-Write-command-output-to-our-stderr.patch new file mode 100644 index 0000000..19c0cc0 --- /dev/null +++ b/SOURCES/icu_sources_data-Write-command-output-to-our-stderr.patch @@ -0,0 +1,34 @@ +From: Simon McVittie +Date: Mon, 9 Oct 2017 09:23:14 +0100 +Subject: icu_sources_data: Write command output to our stderr + +Saying "See output in /tmp/foobar" is all very well for a developer +build, but on a buildd our /tmp is going to get thrown away after +the build. Just log the usual way instead. +--- + intl/icu_sources_data.py | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py +index 8cf9290..7d2d983 100644 +--- a/intl/icu_sources_data.py ++++ b/intl/icu_sources_data.py +@@ -84,16 +84,13 @@ def update_sources(topsrcdir): + + def try_run(name, command, cwd=None, **kwargs): + try: +- with tempfile.NamedTemporaryFile(prefix=name, delete=False) as f: +- subprocess.check_call(command, cwd=cwd, stdout=f, ++ subprocess.check_call(command, cwd=cwd, stdout=sys.stderr, + stderr=subprocess.STDOUT, **kwargs) + except subprocess.CalledProcessError: +- print('''Error running "{}" in directory {} +- See output in {}'''.format(' '.join(command), cwd, f.name), ++ print('''Error running "{}" in directory {}'''.format(' '.join(command), cwd), + file=sys.stderr) + return False + else: +- os.unlink(f.name) + return True + + diff --git a/SOURCES/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch b/SOURCES/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch new file mode 100644 index 0000000..5c75a89 --- /dev/null +++ b/SOURCES/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch @@ -0,0 +1,26 @@ +From: Simon McVittie +Date: Mon, 9 Oct 2017 09:22:12 +0100 +Subject: icu_sources_data.py: Decouple from Mozilla build system + +mozpack.path is a wrapper around os.path that normalizes path +separators on Windows, but on Unix we only have one path separator +so there's nothing to normalize. Avoid needing to import all of it. +--- + intl/icu_sources_data.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py +index 98c0ccb..8cf9290 100644 +--- a/intl/icu_sources_data.py ++++ b/intl/icu_sources_data.py +@@ -19,7 +19,9 @@ import subprocess + import sys + import tempfile + +-from mozpack import path as mozpath ++# Close enough ++import os.path as mozpath ++mozpath.normsep = lambda p: p + + + def find_source_file(dir, filename): diff --git a/SOURCES/init_patch.patch b/SOURCES/init_patch.patch new file mode 100644 index 0000000..2c1db67 --- /dev/null +++ b/SOURCES/init_patch.patch @@ -0,0 +1,12 @@ +--- a/python/mozbuild/mozbuild/configure/__init__.py ++++ b/python/mozbuild/mozbuild/configure/__init__.py +@@ -421,7 +421,7 @@ + # All options should have been removed (handled) by now. + for arg in self._helper: + without_value = arg.split('=', 1)[0] +- raise InvalidOptionError('Unknown option: %s' % without_value) ++ # raise InvalidOptionError('Unknown option: %s' % without_value) + + # Run the execution queue + for func, args in self._execution_queue: + diff --git a/SOURCES/jsproperty-endian.patch b/SOURCES/jsproperty-endian.patch new file mode 100644 index 0000000..458d499 --- /dev/null +++ b/SOURCES/jsproperty-endian.patch @@ -0,0 +1,36 @@ +From a95105b7846c29c5bd3868719621ab3679d9932b Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Sat, 7 Sep 2019 21:45:58 +0200 +Subject: [PATCH] jsproperty-endian.patch + +Bug 1543659 - fix JSPropertySpec::ValueWrapper on 64-bit big-endian platforms + +Add some padding to make the union's int32 member correspond to the +low-order bits of the string member. This fixes TypedArray tests on +s390x. +--- + js/src/jsapi.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/js/src/jsapi.h b/js/src/jsapi.h +index 0f11787f6..f1c084f6a 100644 +--- a/js/src/jsapi.h ++++ b/js/src/jsapi.h +@@ -1581,7 +1581,14 @@ struct JSPropertySpec { + uintptr_t type; + union { + const char* string; ++#if MOZ_BIG_ENDIAN && JS_BITS_PER_WORD == 64 ++ struct { ++ uint32_t padding; ++ int32_t int32; ++ }; ++#else + int32_t int32; ++#endif + }; + }; + +-- +2.23.0 + diff --git a/SOURCES/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch b/SOURCES/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch new file mode 100644 index 0000000..d7ac441 --- /dev/null +++ b/SOURCES/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch @@ -0,0 +1,41 @@ +From: Simon McVittie +Date: Mon, 9 Oct 2017 09:46:31 +0100 +Subject: tests: For tests that are skipped on 64-bit, mips64 is also 64-bit + +mips64 is a 64-bit platform and a Debian release architecture. +--- + js/src/tests/non262/Array/regress-157652.js | 2 +- + js/src/tests/non262/Array/regress-330812.js | 2 +- + js/src/tests/non262/regress/regress-422348.js | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/js/src/tests/non262/Array/regress-157652.js b/js/src/tests/non262/Array/regress-157652.js +index 6916fe1..b21dcc3 100644 +--- a/js/src/tests/non262/Array/regress-157652.js ++++ b/js/src/tests/non262/Array/regress-157652.js +@@ -1,4 +1,4 @@ +-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)||Android) -- No test results ++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results + /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this +diff --git a/js/src/tests/non262/Array/regress-330812.js b/js/src/tests/non262/Array/regress-330812.js +index c48f4c8..6b1ba2a 100644 +--- a/js/src/tests/non262/Array/regress-330812.js ++++ b/js/src/tests/non262/Array/regress-330812.js +@@ -1,4 +1,4 @@ +-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)||Android) -- No test results ++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results + /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this +diff --git a/js/src/tests/non262/regress/regress-422348.js b/js/src/tests/non262/regress/regress-422348.js +index 2c28d5a..e94c397 100644 +--- a/js/src/tests/non262/regress/regress-422348.js ++++ b/js/src/tests/non262/regress/regress-422348.js +@@ -1,4 +1,4 @@ +-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)) -- On 64-bit, takes forever rather than throwing ++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)) -- On 64-bit, takes forever rather than throwing + /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/SOURCES/tests-increase-timeout.patch b/SOURCES/tests-increase-timeout.patch new file mode 100644 index 0000000..91f5fa7 --- /dev/null +++ b/SOURCES/tests-increase-timeout.patch @@ -0,0 +1,22 @@ +From: Adrian Bunk +Date: Tue, 3 Jul 2018 10:03:37 +0100 +Subject: Increase the test timeout for slower buildds + +Bug-Debian: https://bugs.debian.org/878284 +--- + js/src/Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/src/Makefile.in b/js/src/Makefile.in +index 4ac9f48..6ab5582 100644 +--- a/js/src/Makefile.in ++++ b/js/src/Makefile.in +@@ -72,7 +72,7 @@ check:: check-style check-masm check-js-msg check-opcode + + check-jstests: + $(wildcard $(RUN_TEST_PROGRAM)) $(PYTHON) -u $(srcdir)/tests/jstests.py \ +- --no-progress --format=automation --timeout 300 \ ++ --no-progress --format=automation --timeout 600 \ + $(JSTESTS_EXTRA_ARGS) \ + $(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX) + diff --git a/SPECS/mozjs60.spec b/SPECS/mozjs60.spec new file mode 100644 index 0000000..70f1af3 --- /dev/null +++ b/SPECS/mozjs60.spec @@ -0,0 +1,350 @@ +%global major 60 + +# Require libatomic for ppc +%ifarch ppc +%global system_libatomic 1 +%endif + +# Big endian platforms +%ifarch ppc ppc64 s390 s390x +%global big_endian 1 +%endif + +Name: mozjs%{major} +Version: 60.9.0 +Release: 3%{?dist} +Summary: SpiderMonkey JavaScript library + +License: MPLv2.0 and MPLv1.1 and BSD and GPLv2+ and GPLv3+ and LGPLv2+ and AFL and ASL 2.0 +URL: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +Source0: https://ftp.mozilla.org/pub/firefox/releases/%{version}esr/source/firefox-%{version}esr.source.tar.xz + +# Patches from Debian mozjs52_52.3.1-4.debian.tar.xz: +Patch0001: fix-soname.patch +Patch0002: copy-headers.patch +Patch0003: tests-increase-timeout.patch +Patch0008: Always-use-the-equivalent-year-to-determine-the-time-zone.patch +Patch0009: icu_sources_data.py-Decouple-from-Mozilla-build-system.patch +Patch0010: icu_sources_data-Write-command-output-to-our-stderr.patch +Patch0011: tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch + +# Build fixes - https://hg.mozilla.org/mozilla-central/rev/ca36a6c4f8a4a0ddaa033fdbe20836d87bbfb873 +Patch12: emitter.patch +Patch13: emitter_test.patch +Patch14: init_patch.patch + +# s390x fixes: +# https://salsa.debian.org/gnome-team/mozjs60/blob/debian/master/debian/patches/enddianness.patch +Patch15: enddianness.patch +# https://salsa.debian.org/gnome-team/mozjs60/blob/debian/master/debian/patches/jsproperty-endian.patch +Patch16: jsproperty-endian.patch + +# Patches from Fedora firefox package: +Patch26: build-icu-big-endian.patch + +# aarch64 fixes for -O2 +Patch30: Save-x28-before-clobbering-it-in-the-regex-compiler.patch +Patch31: Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch + +BuildRequires: autoconf213 +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: perl-devel +BuildRequires: pkgconfig(libffi) +BuildRequires: pkgconfig(zlib) +BuildRequires: python2-devel +BuildRequires: readline-devel +BuildRequires: /usr/bin/zip +%if 0%{?system_libatomic} +BuildRequires: libatomic +%endif + +# Firefox does not allow to build with system version of jemalloc +Provides: bundled(jemalloc) = 4.3.1 + +%description +SpiderMonkey is the code-name for Mozilla Firefox's C++ implementation of +JavaScript. It is intended to be embedded in other applications +that provide host environments for JavaScript. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%prep +%setup -q -n firefox-%{version}/js/src + +pushd ../.. +%patch0001 -p1 +%patch0002 -p1 +%patch0003 -p1 +%patch0008 -p1 +%patch0009 -p1 +%patch0010 -p1 +%patch0011 -p1 + +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 + +# s390x fixes +%patch15 -p1 +%patch16 -p1 + +# Patch for big endian platforms only +%if 0%{?big_endian} +%patch26 -p1 -b .icu +%endif + +# aarch64 -O2 fixes +%ifarch aarch64 +%patch30 -p1 +%patch31 -p1 +%endif + +# make sure we don't ever accidentally link against bundled security libs +rm -rf security/ +popd + +# Remove zlib directory (to be sure using system version) +rm -rf ../../modules/zlib + +%build +export CFLAGS="%{optflags}" + +export CXXFLAGS="$CFLAGS" +export LINKFLAGS="%{?__global_ldflags}" +export PYTHON="%{__python2}" +# Keep using Python 2 for the build for now +# https://bugzilla.redhat.com/show_bug.cgi?id=1610009 +export RHEL_ALLOW_PYTHON2_FOR_BUILD=1 + +autoconf-2.13 +%configure \ + --without-system-icu \ + --enable-posix-nspr-emulation \ + --with-system-zlib \ + --enable-tests \ + --disable-strip \ + --with-intl-api \ + --enable-readline \ + --enable-shared-js \ + --disable-optimize \ + --enable-pie \ + --disable-jemalloc \ + +%if 0%{?big_endian} +echo "Generate big endian version of config/external/icu/data/icud58l.dat" +pushd ../.. + ./mach python intl/icu_sources_data.py . + ls -l config/external/icu/data + rm -f config/external/icu/data/icudt*l.dat +popd +%endif + +%make_build + +%install +# Keep using Python 2 for the build for now +# https://bugzilla.redhat.com/show_bug.cgi?id=1610009 +export RHEL_ALLOW_PYTHON2_FOR_BUILD=1 + +%make_install + +# Fix permissions +chmod -x %{buildroot}%{_libdir}/pkgconfig/*.pc + +# Avoid multilib conflicts +case `uname -i` in + i386 | ppc | s390 | sparc ) + wordsize="32" + ;; + x86_64 | ppc64 | s390x | sparc64 ) + wordsize="64" + ;; + *) + wordsize="" + ;; +esac + +if test -n "$wordsize" +then + mv %{buildroot}%{_includedir}/mozjs-60/js-config.h \ + %{buildroot}%{_includedir}/mozjs-60/js-config-$wordsize.h + + cat >%{buildroot}%{_includedir}/mozjs-60/js-config.h < + +#if __WORDSIZE == 32 +# include "js-config-32.h" +#elif __WORDSIZE == 64 +# include "js-config-64.h" +#else +# error "unexpected value for __WORDSIZE macro" +#endif + +#endif +EOF + +fi + +# Remove unneeded files +rm %{buildroot}%{_bindir}/js%{major} +rm %{buildroot}%{_bindir}/js%{major}-config +rm %{buildroot}%{_libdir}/libjs_static.ajs + +# Rename library and create symlinks, following fix-soname.patch +mv %{buildroot}%{_libdir}/libmozjs-%{major}.so \ + %{buildroot}%{_libdir}/libmozjs-%{major}.so.0.0.0 +ln -s libmozjs-%{major}.so.0.0.0 %{buildroot}%{_libdir}/libmozjs-%{major}.so.0 +ln -s libmozjs-%{major}.so.0 %{buildroot}%{_libdir}/libmozjs-%{major}.so + +%check +# Run SpiderMonkey tests +/usr/bin/python2-for-tests tests/jstests.py -d -s -t 1800 --no-progress ../../js/src/js/src/shell/js \ +%ifarch %{ix86} x86_64 %{arm} aarch64 ppc ppc64le +; +%else +|| : +%endif + +# Run basic JIT tests +/usr/bin/python2-for-tests jit-test/jit_test.py -s -t 1800 --no-progress ../../js/src/js/src/shell/js basic \ +%ifarch %{ix86} x86_64 %{arm} aarch64 ppc ppc64le +; +%else +|| : +%endif + +%ldconfig_scriptlets + +%files +%doc README.html +%{_libdir}/libmozjs-%{major}.so.0* + +%files devel +%{_libdir}/libmozjs-%{major}.so +%{_libdir}/pkgconfig/*.pc +%{_includedir}/mozjs-%{major}/ + +%changelog +* Tue Sep 10 2019 Kalev Lember - 60.9.0-3 +- Fix multilib conflicts in js-config.h + +* Sat Sep 07 2019 Kalev Lember - 60.9.0-2 +- Backport patches for s390x support +- Resolves: #1746889 + +* Tue Sep 03 2019 Kalev Lember - 60.9.0-1 +- Update to 60.9.0 + +* Wed May 29 2019 Kalev Lember - 60.7.0-2 +- Enable gating + +* Tue May 21 2019 Kalev Lember - 60.7.0-1 +- Update to 60.7.0 + +* Mon Apr 15 2019 Frantisek Zatloukal - 60.6.1-2 +- Backport two Firefox 61 patches and allow compiler optimizations on aarch64 + +* Sun Apr 14 2019 Frantisek Zatloukal - 60.6.1-1 +- Update to 60.6.1 + +* Thu Feb 21 2019 Frantisek Zatloukal - 60.4.0-5 +- Re-enable null pointer gcc optimization + +* Sun Feb 17 2019 Igor Gnatenko - 60.4.0-4 +- Rebuild for readline 8.0 + +* Thu Feb 14 2019 Frantisek Zatloukal - 60.4.0-3 +- Build aarch64 with -O0 because of rhbz#1676292 + +* Fri Feb 01 2019 Fedora Release Engineering - 60.4.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Jan 02 2019 Frantisek Zatloukal - 60.4.0-1 +- Update to 60.4.0 + +* Mon Nov 12 2018 Kalev Lember - 60.3.0-1 +- Update to 60.3.0 + +* Thu Oct 04 2018 Kalev Lember - 60.2.2-1 +- Update to 60.2.2 + +* Fri Sep 28 2018 Kalev Lember - 60.2.1-1 +- Update to 60.2.1 + +* Tue Sep 11 2018 Kalev Lember - 60.2.0-1 +- Update to 60.2.0 + +* Tue Sep 04 2018 Frantisek Zatloukal - 60.1.0-1 +- Update to 60.1.0 + +* Wed Jul 25 2018 Kalev Lember - 52.9.0-1 +- Update to 52.9.0 + +* Fri Jul 13 2018 Fedora Release Engineering - 52.8.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Jun 11 2018 Ray Strode - 52.8.0-2 +- safeguard against linking against bundled nss + Related: #1563708 + +* Fri May 11 2018 Kalev Lember - 52.8.0-1 +- Update to 52.8.0 +- Fix the build on ppc +- Disable JS Helper threads on ppc64le (#1523121) + +* Sat Apr 07 2018 Kalev Lember - 52.7.3-1 +- Update to 52.7.3 + +* Tue Mar 20 2018 Kalev Lember - 52.7.2-1 +- Update to 52.7.2 +- Switch to %%ldconfig_scriptlets + +* Thu Feb 08 2018 Fedora Release Engineering - 52.6.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 23 2018 Kalev Lember - 52.6.0-1 +- Update to 52.6.0 + +* Fri Nov 24 2017 Björn Esser - 52.5.0-5 +- SpiderMonkey tests have regressions on %%{power64}, too + +* Fri Nov 24 2017 Björn Esser - 52.5.0-4 +- SpiderMonkey tests have regressions on big endian platforms + +* Fri Nov 24 2017 Björn Esser - 52.5.0-3 +- SpiderMonkey tests do not fail on any arch +- Basic JIT tests are failing on s390 arches, only +- Use macro for ppc64 arches +- Run tests using Python2 explicitly +- Simplify %%check +- Use the %%{major} macro consequently +- Replace %%define with %%global + +* Fri Nov 24 2017 Björn Esser - 52.5.0-2 +- Use macro for Python 2 interpreter +- Use proper export and quoting + +* Tue Nov 14 2017 Kalev Lember - 52.5.0-1 +- Update to 52.5.0 + +* Tue Oct 31 2017 Kalev Lember - 52.4.0-3 +- Include standalone /usr/bin/js52 interpreter + +* Tue Oct 31 2017 Kalev Lember - 52.4.0-2 +- Various secondary arch fixes + +* Thu Sep 28 2017 Kalev Lember - 52.4.0-1 +- Update to 52.4.0 + +* Wed Sep 20 2017 Kalev Lember - 52.3.0-1 +- Initial Fedora packaging, based on earlier mozjs45 work