OpenJDK / jdk / hs
changeset 49255:689ebcfe04fd
8199685: Access arraycopy build failure with GCC 7.3.1
Reviewed-by: rkennke, pliden
author | eosterlund |
---|---|
date | Fri, 16 Mar 2018 14:47:53 +0100 |
parents | c8ab058dcf1f |
children | 848864ed9b17 |
files | src/hotspot/share/oops/access.inline.hpp src/hotspot/share/oops/accessBackend.hpp src/hotspot/share/oops/accessBackend.inline.hpp |
diffstat | 3 files changed, 45 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/oops/access.inline.hpp Mon Mar 19 11:38:45 2018 +0100 +++ b/src/hotspot/share/oops/access.inline.hpp Fri Mar 16 14:47:53 2018 +0100 @@ -675,7 +675,6 @@ inline static typename EnableIf< !HasDecorator<decorators, AS_RAW>::value, T>::type atomic_cmpxchg(T new_value, void* addr, T compare_value) { - typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; if (is_hardwired_primitive<decorators>()) { const DecoratorSet expanded_decorators = decorators | AS_RAW; return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); @@ -761,17 +760,33 @@ template <DecoratorSet decorators, typename T> inline static typename EnableIf< - HasDecorator<decorators, AS_RAW>::value, bool>::type - arraycopy(arrayOop src_obj, arrayOop dst_obj, T *src, T* dst, size_t length) { + HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value, bool>::type + arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; - return Raw::arraycopy(src_obj, dst_obj, src, dst, length); + if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { + return Raw::oop_arraycopy(src_obj, dst_obj, src, dst, length); + } else { + return Raw::arraycopy(src_obj, dst_obj, src, dst, length); + } + } + + template <DecoratorSet decorators, typename T> + inline static typename EnableIf< + HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value, bool>::type + arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { + if (UseCompressedOops) { + const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; + return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, src, dst, length); + } else { + const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; + return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, src, dst, length); + } } template <DecoratorSet decorators, typename T> inline static typename EnableIf< !HasDecorator<decorators, AS_RAW>::value, bool>::type - arraycopy(arrayOop src_obj, arrayOop dst_obj, T *src, T* dst, size_t length) { - typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; + arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { if (is_hardwired_primitive<decorators>()) { const DecoratorSet expanded_decorators = decorators | AS_RAW; return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, src, dst, length); @@ -947,6 +962,24 @@ return PreRuntimeDispatch::load<expanded_decorators, oop>(addr); } + template <DecoratorSet decorators, typename T> + inline bool arraycopy_reduce_types(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { + return PreRuntimeDispatch::arraycopy<decorators>(src_obj, dst_obj, src, dst, length); + } + + template <DecoratorSet decorators> + inline bool arraycopy_reduce_types(arrayOop src_obj, arrayOop dst_obj, HeapWord* src, HeapWord* dst, size_t length) { + const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; + return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, src, dst, length); + } + + template <DecoratorSet decorators> + inline bool arraycopy_reduce_types(arrayOop src_obj, arrayOop dst_obj, narrowOop* src, narrowOop* dst, size_t length) { + const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | + INTERNAL_RT_USE_COMPRESSED_OOPS; + return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, src, dst, length); + } + // Step 1: Set default decorators. This step remembers if a type was volatile // and then sets the MO_VOLATILE decorator by default. Otherwise, a default // memory ordering is set for the access, and the implied decorator rules @@ -1077,18 +1110,16 @@ } template <DecoratorSet decorators, typename T> - inline bool arraycopy(arrayOop src_obj, arrayOop dst_obj, T *src, T *dst, size_t length) { + inline bool arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { STATIC_ASSERT((HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value || (IsSame<T, void>::value || IsIntegral<T>::value) || IsFloatingPoint<T>::value)); // arraycopy allows type erased void elements typedef typename Decay<T>::type DecayedT; - const DecoratorSet expanded_decorators = DecoratorFixup<decorators | IN_HEAP_ARRAY | IN_HEAP | - (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value ? - INTERNAL_CONVERT_COMPRESSED_OOP : INTERNAL_EMPTY)>::value; - return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, dst_obj, - const_cast<DecayedT*>(src), - const_cast<DecayedT*>(dst), - length); + const DecoratorSet expanded_decorators = DecoratorFixup<decorators | IN_HEAP_ARRAY | IN_HEAP>::value; + return arraycopy_reduce_types<expanded_decorators>(src_obj, dst_obj, + const_cast<DecayedT*>(src), + const_cast<DecayedT*>(dst), + length); } template <DecoratorSet decorators>
--- a/src/hotspot/share/oops/accessBackend.hpp Mon Mar 19 11:38:45 2018 +0100 +++ b/src/hotspot/share/oops/accessBackend.hpp Fri Mar 16 14:47:53 2018 +0100 @@ -384,7 +384,6 @@ template <typename T> static bool oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length); - static bool oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, HeapWord* src, HeapWord* dst, size_t length); static void clone(oop src, oop dst, size_t size);
--- a/src/hotspot/share/oops/accessBackend.inline.hpp Mon Mar 19 11:38:45 2018 +0100 +++ b/src/hotspot/share/oops/accessBackend.inline.hpp Fri Mar 16 14:47:53 2018 +0100 @@ -122,17 +122,6 @@ } template <DecoratorSet decorators> -inline bool RawAccessBarrier<decorators>::oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, HeapWord* src, HeapWord* dst, size_t length) { - bool needs_oop_compress = HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value && - HasDecorator<decorators, INTERNAL_RT_USE_COMPRESSED_OOPS>::value; - if (needs_oop_compress) { - return arraycopy(reinterpret_cast<narrowOop*>(src), reinterpret_cast<narrowOop*>(dst), length); - } else { - return arraycopy(reinterpret_cast<oop*>(src), reinterpret_cast<oop*>(dst), length); - } -} - -template <DecoratorSet decorators> template <DecoratorSet ds, typename T> inline typename EnableIf< HasDecorator<ds, MO_SEQ_CST>::value, T>::type