Hi!
I am currently working on fixing OpenJDK-9 on all non-mainstream
targets available in Debian. For Debian/sparc64, the attached four
patches were necessary to make the build succeed [1].
I know the patches cannot be merged right now, but I'm posting them
anyway in case someone else is interested in using them.
All patches are:
Signed-off-by: John Paul Adrian Glaubitz <[email protected]>
I also signed the OCA.
I'm now looking into fixing the builds on alpha (DEC Alpha), armel
(ARMv4T), m68k (680x0), powerpc (PPC32) and sh4 (SuperH/J-Core).
Cheers,
Adrian
> [1]
> https://buildd.debian.org/status/fetch.php?pkg=openjdk-9&arch=sparc64&ver=9%7Eb170-2&stamp=1496931563&raw=0
--
.''`. John Paul Adrian Glaubitz
: :' : Debian Developer - [email protected]
`. `' Freie Universitaet Berlin - [email protected]
`- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
--- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp~ 2017-04-28 12:54:05.000000000 +0300
+++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp 2017-05-10 21:23:37.067179458 +0300
@@ -22,6 +22,7 @@
*
*/
+#include "logging/log.hpp"
#include "precompiled.hpp"
#include "runtime/os.hpp"
#include "vm_version_sparc.hpp"
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp~ 2017-04-28 12:54:05.000000000 +0300
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp 2017-05-10 20:51:54.373241668 +0300
@@ -387,7 +387,7 @@
return false;
}
-inline static bool checkByteBuffer(address pc, address npc, address* stub) {
+inline static bool checkByteBuffer(address pc, address npc, JavaThread * thread, address* stub) {
// BugId 4454115: A read from a MappedByteBuffer can fault
// here if the underlying file has been truncated.
// Do not crash the VM in such a case.
@@ -579,7 +579,7 @@
break;
}
- if ((sig == SIGBUS) && checkByteBuffer(pc, npc, &stub)) {
+ if ((sig == SIGBUS) && checkByteBuffer(pc, npc, thread, &stub)) {
break;
}
diff -Nru hotspot-jdk-9+168.orig/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.hpp hotspot-jdk-9+168/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.hpp
--- a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.hpp 1970-01-01 03:00:00.000000000 +0300
+++ b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.hpp 2017-04-28 12:54:05.000000000 +0300
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
+#define OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
+
+// Implementation of class atomic
+
+inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; }
+inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; }
+inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; }
+inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
+inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; }
+inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; }
+
+inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; }
+inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; }
+inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; }
+inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
+inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; }
+inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; }
+
+inline void Atomic::inc (volatile jint* dest) { (void)add (1, dest); }
+inline void Atomic::inc_ptr(volatile intptr_t* dest) { (void)add_ptr(1, dest); }
+inline void Atomic::inc_ptr(volatile void* dest) { (void)add_ptr(1, dest); }
+
+inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); }
+inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
+inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); }
+
+inline jlong Atomic::load(volatile jlong* src) { return *src; }
+
+inline jint Atomic::add (jint add_value, volatile jint* dest) {
+ intptr_t rv;
+ __asm__ volatile(
+ "1: \n\t"
+ " ld [%2], %%o2\n\t"
+ " add %1, %%o2, %%o3\n\t"
+ " cas [%2], %%o2, %%o3\n\t"
+ " cmp %%o2, %%o3\n\t"
+ " bne 1b\n\t"
+ " nop\n\t"
+ " add %1, %%o2, %0\n\t"
+ : "=r" (rv)
+ : "r" (add_value), "r" (dest)
+ : "memory", "o2", "o3");
+ return rv;
+}
+
+inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
+ intptr_t rv;
+#ifdef _LP64
+ __asm__ volatile(
+ "1: \n\t"
+ " ldx [%2], %%o2\n\t"
+ " add %1, %%o2, %%o3\n\t"
+ " casx [%2], %%o2, %%o3\n\t"
+ " cmp %%o2, %%o3\n\t"
+ " bne %%xcc, 1b\n\t"
+ " nop\n\t"
+ " add %1, %%o2, %0\n\t"
+ : "=r" (rv)
+ : "r" (add_value), "r" (dest)
+ : "memory", "o2", "o3");
+#else
+ __asm__ volatile(
+ "1: \n\t"
+ " ld [%2], %%o2\n\t"
+ " add %1, %%o2, %%o3\n\t"
+ " cas [%2], %%o2, %%o3\n\t"
+ " cmp %%o2, %%o3\n\t"
+ " bne 1b\n\t"
+ " nop\n\t"
+ " add %1, %%o2, %0\n\t"
+ : "=r" (rv)
+ : "r" (add_value), "r" (dest)
+ : "memory", "o2", "o3");
+#endif // _LP64
+ return rv;
+}
+
+inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
+ return (void*)add_ptr((intptr_t)add_value, (volatile intptr_t*)dest);
+}
+
+
+inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
+ intptr_t rv = exchange_value;
+ __asm__ volatile(
+ " swap [%2],%1\n\t"
+ : "=r" (rv)
+ : "0" (exchange_value) /* we use same register as for return value */, "r" (dest)
+ : "memory");
+ return rv;
+}
+
+inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
+ intptr_t rv = exchange_value;
+#ifdef _LP64
+ __asm__ volatile(
+ "1:\n\t"
+ " mov %1, %%o3\n\t"
+ " ldx [%2], %%o2\n\t"
+ " casx [%2], %%o2, %%o3\n\t"
+ " cmp %%o2, %%o3\n\t"
+ " bne %%xcc, 1b\n\t"
+ " nop\n\t"
+ " mov %%o2, %0\n\t"
+ : "=r" (rv)
+ : "r" (exchange_value), "r" (dest)
+ : "memory", "o2", "o3");
+#else
+ __asm__ volatile(
+ "swap [%2],%1\n\t"
+ : "=r" (rv)
+ : "0" (exchange_value) /* we use same register as for return value */, "r" (dest)
+ : "memory");
+#endif // _LP64
+ return rv;
+}
+
+inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
+ return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
+}
+
+
+inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) {
+ jint rv;
+ __asm__ volatile(
+ " cas [%2], %3, %0"
+ : "=r" (rv)
+ : "0" (exchange_value), "r" (dest), "r" (compare_value)
+ : "memory");
+ return rv;
+}
+
+inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
+#ifdef _LP64
+ jlong rv;
+ __asm__ volatile(
+ " casx [%2], %3, %0"
+ : "=r" (rv)
+ : "0" (exchange_value), "r" (dest), "r" (compare_value)
+ : "memory");
+ return rv;
+#else
+ volatile jlong_accessor evl, cvl, rv;
+ evl.long_value = exchange_value;
+ cvl.long_value = compare_value;
+
+ __asm__ volatile(
+ " sllx %2, 32, %2\n\t"
+ " srl %3, 0, %3\n\t"
+ " or %2, %3, %2\n\t"
+ " sllx %5, 32, %5\n\t"
+ " srl %6, 0, %6\n\t"
+ " or %5, %6, %5\n\t"
+ " casx [%4], %5, %2\n\t"
+ " srl %2, 0, %1\n\t"
+ " srlx %2, 32, %0\n\t"
+ : "=r" (rv.words[0]), "=r" (rv.words[1])
+ : "r" (evl.words[0]), "r" (evl.words[1]), "r" (dest), "r" (cvl.words[0]), "r" (cvl.words[1])
+ : "memory");
+
+ return rv.long_value;
+#endif
+}
+
+inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
+ intptr_t rv;
+#ifdef _LP64
+ __asm__ volatile(
+ " casx [%2], %3, %0"
+ : "=r" (rv)
+ : "0" (exchange_value), "r" (dest), "r" (compare_value)
+ : "memory");
+#else
+ __asm__ volatile(
+ " cas [%2], %3, %0"
+ : "=r" (rv)
+ : "0" (exchange_value), "r" (dest), "r" (compare_value)
+ : "memory");
+#endif // _LP64
+ return rv;
+}
+
+inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
+ return (void*)cmpxchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest, (intptr_t)compare_value, order);
+}
+
+#endif // OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
diff -Nru hotspot-jdk-9+168.orig/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp hotspot-jdk-9+168/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp
--- a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp 2017-04-28 12:54:05.000000000 +0300
+++ b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp 1970-01-01 03:00:00.000000000 +0300
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
-#define OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
-
-// Implementation of class atomic
-
-inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; }
-inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; }
-inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; }
-inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
-inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; }
-inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; }
-
-inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; }
-inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; }
-inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; }
-inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
-inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; }
-inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; }
-
-inline void Atomic::inc (volatile jint* dest) { (void)add (1, dest); }
-inline void Atomic::inc_ptr(volatile intptr_t* dest) { (void)add_ptr(1, dest); }
-inline void Atomic::inc_ptr(volatile void* dest) { (void)add_ptr(1, dest); }
-
-inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); }
-inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
-inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); }
-
-inline jlong Atomic::load(volatile jlong* src) { return *src; }
-
-inline jint Atomic::add (jint add_value, volatile jint* dest) {
- intptr_t rv;
- __asm__ volatile(
- "1: \n\t"
- " ld [%2], %%o2\n\t"
- " add %1, %%o2, %%o3\n\t"
- " cas [%2], %%o2, %%o3\n\t"
- " cmp %%o2, %%o3\n\t"
- " bne 1b\n\t"
- " nop\n\t"
- " add %1, %%o2, %0\n\t"
- : "=r" (rv)
- : "r" (add_value), "r" (dest)
- : "memory", "o2", "o3");
- return rv;
-}
-
-inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
- intptr_t rv;
-#ifdef _LP64
- __asm__ volatile(
- "1: \n\t"
- " ldx [%2], %%o2\n\t"
- " add %1, %%o2, %%o3\n\t"
- " casx [%2], %%o2, %%o3\n\t"
- " cmp %%o2, %%o3\n\t"
- " bne %%xcc, 1b\n\t"
- " nop\n\t"
- " add %1, %%o2, %0\n\t"
- : "=r" (rv)
- : "r" (add_value), "r" (dest)
- : "memory", "o2", "o3");
-#else
- __asm__ volatile(
- "1: \n\t"
- " ld [%2], %%o2\n\t"
- " add %1, %%o2, %%o3\n\t"
- " cas [%2], %%o2, %%o3\n\t"
- " cmp %%o2, %%o3\n\t"
- " bne 1b\n\t"
- " nop\n\t"
- " add %1, %%o2, %0\n\t"
- : "=r" (rv)
- : "r" (add_value), "r" (dest)
- : "memory", "o2", "o3");
-#endif // _LP64
- return rv;
-}
-
-inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
- return (void*)add_ptr((intptr_t)add_value, (volatile intptr_t*)dest);
-}
-
-
-inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
- intptr_t rv = exchange_value;
- __asm__ volatile(
- " swap [%2],%1\n\t"
- : "=r" (rv)
- : "0" (exchange_value) /* we use same register as for return value */, "r" (dest)
- : "memory");
- return rv;
-}
-
-inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
- intptr_t rv = exchange_value;
-#ifdef _LP64
- __asm__ volatile(
- "1:\n\t"
- " mov %1, %%o3\n\t"
- " ldx [%2], %%o2\n\t"
- " casx [%2], %%o2, %%o3\n\t"
- " cmp %%o2, %%o3\n\t"
- " bne %%xcc, 1b\n\t"
- " nop\n\t"
- " mov %%o2, %0\n\t"
- : "=r" (rv)
- : "r" (exchange_value), "r" (dest)
- : "memory", "o2", "o3");
-#else
- __asm__ volatile(
- "swap [%2],%1\n\t"
- : "=r" (rv)
- : "0" (exchange_value) /* we use same register as for return value */, "r" (dest)
- : "memory");
-#endif // _LP64
- return rv;
-}
-
-inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
- return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
-}
-
-
-inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) {
- jint rv;
- __asm__ volatile(
- " cas [%2], %3, %0"
- : "=r" (rv)
- : "0" (exchange_value), "r" (dest), "r" (compare_value)
- : "memory");
- return rv;
-}
-
-inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
-#ifdef _LP64
- jlong rv;
- __asm__ volatile(
- " casx [%2], %3, %0"
- : "=r" (rv)
- : "0" (exchange_value), "r" (dest), "r" (compare_value)
- : "memory");
- return rv;
-#else
- volatile jlong_accessor evl, cvl, rv;
- evl.long_value = exchange_value;
- cvl.long_value = compare_value;
-
- __asm__ volatile(
- " sllx %2, 32, %2\n\t"
- " srl %3, 0, %3\n\t"
- " or %2, %3, %2\n\t"
- " sllx %5, 32, %5\n\t"
- " srl %6, 0, %6\n\t"
- " or %5, %6, %5\n\t"
- " casx [%4], %5, %2\n\t"
- " srl %2, 0, %1\n\t"
- " srlx %2, 32, %0\n\t"
- : "=r" (rv.words[0]), "=r" (rv.words[1])
- : "r" (evl.words[0]), "r" (evl.words[1]), "r" (dest), "r" (cvl.words[0]), "r" (cvl.words[1])
- : "memory");
-
- return rv.long_value;
-#endif
-}
-
-inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
- intptr_t rv;
-#ifdef _LP64
- __asm__ volatile(
- " casx [%2], %3, %0"
- : "=r" (rv)
- : "0" (exchange_value), "r" (dest), "r" (compare_value)
- : "memory");
-#else
- __asm__ volatile(
- " cas [%2], %3, %0"
- : "=r" (rv)
- : "0" (exchange_value), "r" (dest), "r" (compare_value)
- : "memory");
-#endif // _LP64
- return rv;
-}
-
-inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
- return (void*)cmpxchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest, (intptr_t)compare_value, order);
-}
-
-#endif // OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP
--- a/hotspot/src/share/vm/gc/shared/memset_with_concurrent_readers.hpp 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/gc/shared/memset_with_concurrent_readers.hpp 2017-06-07 14:50:39.835143370 +0300
@@ -37,7 +37,7 @@
// understanding that there may be concurrent readers of that memory.
void memset_with_concurrent_readers(void* to, int value, size_t size);
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// SPARC requires special handling. See SPARC-specific definition.
--- a/hotspot/src/share/vm/compiler/oopMap.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/compiler/oopMap.cpp 2017-06-07 15:21:34.723210971 +0300
@@ -39,7 +39,7 @@
#ifdef COMPILER2
#include "opto/optoreg.hpp"
#endif
-#ifdef SPARC
+#if defined (SPARC) && !defined(ZERO)
#include "vmreg_sparc.inline.hpp"
#endif
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp 2017-06-07 15:41:01.847585726 +0300
@@ -86,7 +86,7 @@
// Must never look like an address returned by reserve_memory,
// even in its subfields (as defined by the CPU immediate fields,
// if the CPU splits constants across multiple instructions).
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// On SPARC, 0 != %hi(any real address), because there is no
// allocation in the first 1Kb of the virtual address space.
return (char *) 0;
--- a/hotspot/src/share/vm/opto/output.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/opto/output.cpp 2017-06-07 15:42:35.147461407 +0300
@@ -588,7 +588,7 @@
array->append(new_loc_value( _regalloc, regnum, Location::lng ));
}
#else //_LP64
-#ifdef SPARC
+#if defined (SPARC) && !defined(ZERO)
if (t->base() == Type::Long && OptoReg::is_reg(regnum)) {
// For SPARC we have to swap high and low words for
// long values stored in a single-register (g0-g7).
--- a/hotspot/src/share/vm/opto/chaitin.cpp~ 2017-06-07 15:43:34.357918591 +0300
+++ b/hotspot/src/share/vm/opto/chaitin.cpp 2017-06-07 15:45:09.097846755 +0300
@@ -878,7 +878,7 @@
case Op_RegD:
lrg.set_num_regs(2);
// Define platform specific register pressure
-#if defined(SPARC) || defined(ARM32)
+#if (defined(SPARC) && !defined(ZERO)) || defined(ARM32)
lrg.set_reg_pressure(2);
#elif defined(IA32)
if( ireg == Op_RegL ) {
@@ -905,7 +905,7 @@
case Op_RegFlags:
case 0: // not an ideal register
lrg.set_num_regs(1);
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
lrg.set_reg_pressure(2);
#else
lrg.set_reg_pressure(1);
@@ -1526,7 +1526,7 @@
// Check if a color is available and if so pick the color
OptoReg::Name reg = choose_color( *lrg, chunk );
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
debug_only(lrg->compute_set_mask_size());
assert(lrg->num_regs() < 2 || lrg->is_bound() || is_even(reg-1), "allocate all doubles aligned");
#endif
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp 2017-06-07 15:47:36.275942531 +0300
@@ -861,7 +861,7 @@
#ifdef _LP64
jlong res = (jlong)low->get_int();
#else
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// For SPARC we have to swap high and low words.
jlong res = jlong_from((jint)low->get_int(), (jint)value->get_int());
#else
@@ -895,7 +895,7 @@
#ifdef _LP64
jlong res = (jlong)low->get_int();
#else
- #ifdef SPARC
+ #if defined(SPARC) && !defined(ZERO)
// For SPARC we have to swap high and low words.
jlong res = jlong_from((jint)low->get_int(), (jint)value->get_int());
#else
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp 2017-06-07 15:48:36.130419657 +0300
@@ -87,7 +87,7 @@
}
#endif
-#if defined SPARC || defined AARCH64
+#if (defined(SPARC) && !defined(ZERO)) || defined AARCH64
if (FLAG_IS_DEFAULT(InlineSmallCode)) {
FLAG_SET_DEFAULT(InlineSmallCode, 2500);
}
--- a/hotspot/src/share/vm/runtime/stackValue.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/runtime/stackValue.cpp 2017-06-07 15:49:31.052691809 +0300
@@ -34,7 +34,7 @@
// Stack or register value
Location loc = ((LocationValue *)sv)->location();
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// %%%%% Callee-save floats will NOT be working on a Sparc until we
// handle the case of a 2 floats in a single double register.
assert( !(loc.is_register() && loc.type() == Location::float_in_dbl), "Sparc does not handle callee-save floats yet" );
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp 2017-06-07 15:52:20.987717957 +0300
@@ -571,7 +571,7 @@
monitor_address(op->in_opr()->as_constant_ptr()->as_jint(), op->result_opr());
break;
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
case lir_pack64:
pack64(op->in_opr(), op->result_opr());
break;
@@ -841,7 +841,7 @@
if (!r->is_stack()) {
stringStream st;
st.print("bad oop %s at %d", r->as_Register()->name(), _masm->offset());
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
_masm->_verify_oop(r->as_Register(), os::strdup(st.as_string(), mtCompiler), __FILE__, __LINE__);
#else
_masm->verify_oop(r->as_Register());
--- a/hotspot/src/share/vm/c1/c1_LinearScan.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/c1/c1_LinearScan.cpp 2017-06-07 15:53:34.154741548 +0300
@@ -2163,7 +2163,7 @@
}
#endif
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
assert(assigned_reg >= pd_first_fpu_reg && assigned_reg <= pd_last_fpu_reg, "no fpu register");
assert(interval->assigned_regHi() >= pd_first_fpu_reg && interval->assigned_regHi() <= pd_last_fpu_reg, "no fpu register");
assert(assigned_reg % 2 == 0 && assigned_reg + 1 == interval->assigned_regHi(), "must be sequential and even");
@@ -2761,7 +2761,7 @@
assert(opr->fpu_regnrLo() == opr->fpu_regnrHi(), "assumed in calculation (only fpu_regnrLo is used)");
#endif
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
assert(opr->fpu_regnrLo() == opr->fpu_regnrHi() + 1, "assumed in calculation (only fpu_regnrHi is used)");
#endif
#ifdef ARM32
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp 2017-06-07 15:54:50.281886668 +0300
@@ -2053,7 +2053,7 @@
Value recv = has_receiver ? apop() : NULL;
int vtable_index = Method::invalid_vtable_index;
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// Currently only supported on Sparc.
// The UseInlineCaches only controls dispatch to invokevirtuals for
// loaded classes which we weren't able to statically bind.
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp 2017-06-07 15:55:57.572666060 +0300
@@ -3426,7 +3426,7 @@
tty->print_cr("stack_base: " INTPTR_FORMAT, (uintptr_t) this->_stack_base);
tty->print_cr("stack_limit: " INTPTR_FORMAT, (uintptr_t) this->_stack_limit);
tty->print_cr("monitor_base: " INTPTR_FORMAT, (uintptr_t) this->_monitor_base);
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
tty->print_cr("last_Java_pc: " INTPTR_FORMAT, (uintptr_t) this->_last_Java_pc);
tty->print_cr("frame_bottom: " INTPTR_FORMAT, (uintptr_t) this->_frame_bottom);
tty->print_cr("&native_fresult: " INTPTR_FORMAT, (uintptr_t) &this->_native_fresult);
--- a/hotspot/src/share/vm/utilities/macros.hpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/utilities/macros.hpp 2017-06-07 15:56:45.326638242 +0300
@@ -412,7 +412,7 @@
#define NOT_S390(code) code
#endif
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
#define SPARC_ONLY(code) code
#define NOT_SPARC(code)
#else
--- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp 2017-06-07 15:57:33.732637088 +0300
@@ -206,7 +206,7 @@
// checking for nanness
#ifdef SOLARIS
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
inline int g_isnan(float f) { return isnanf(f); }
#else
// isnanf() broken on Intel Solaris use isnand()
--- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp 2017-06-07 15:58:30.734990739 +0300
@@ -220,7 +220,7 @@
// checking for nanness
#ifdef SOLARIS
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
inline int g_isnan(float f) { return isnanf(f); }
#else
// isnanf() broken on Intel Solaris use isnand()
--- a/hotspot/src/share/vm/adlc/output_h.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/adlc/output_h.cpp 2017-06-07 15:59:20.705053657 +0300
@@ -742,7 +742,7 @@
fprintf(fp_hpp, "class Pipeline_Use_Cycle_Mask {\n");
if (_pipeline->_maxcycleused <=
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
64
#else
32
--- a/hotspot/src/share/vm/adlc/formssel.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/adlc/formssel.cpp 2017-06-07 16:00:23.795658018 +0300
@@ -1054,7 +1054,7 @@
const char *opType = NULL;
while (_matrule->base_operand(position, globals, result, name, opType)) {
if ( strcmp(opType,"ConP") == 0 ) {
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
reloc_entries += 2; // 1 for sethi + 1 for setlo
#else
++reloc_entries;
@@ -1092,7 +1092,7 @@
// Check for any component being an immediate float or double.
Form::DataType data_type = is_chain_of_constant(globals);
if( data_type==idealD || data_type==idealF ) {
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// sparc required more relocation entries for floating constants
// (expires 9/98)
reloc_entries += 6;
--- a/hotspot/src/share/vm/adlc/output_c.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/adlc/output_c.cpp 2017-06-07 16:01:26.386241521 +0300
@@ -724,7 +724,7 @@
/* Do Nothing */;
else if (_pipeline->_maxcycleused <=
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
64
#else
32
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp~ 2017-05-11 15:11:42.000000000 +0300
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp 2017-06-07 16:07:11.220458274 +0300
@@ -1196,7 +1196,7 @@
RelocIterator iter(nm, (address)instr_pc, (address)(instr_pc + 1));
relocInfo::change_reloc_info_for_address(&iter, (address) instr_pc,
relocInfo::none, rtype);
-#ifdef SPARC
+#if defined(SPARC) && !defined(ZERO)
// Sparc takes two relocations for an metadata so update the second one.
address instr_pc2 = instr_pc + NativeMovConstReg::add_offset;
RelocIterator iter2(nm, instr_pc2, instr_pc2 + 1);