--- a/src/hotspot/cpu/arm/interpreterRT_arm.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/arm/interpreterRT_arm.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -82,11 +82,12 @@
// For ARM, the fast signature handler only needs to know whether
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
// be distinguished from each other and all other return values
- // behave like integers with respect to the handler.
+ // behave like integers with respect to the handler except T_BOOLEAN
+ // which must be mapped to the range 0..1.
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
if (unbox) {
ret_type = T_OBJECT;
- } else {
+ } else if (ret_type != T_BOOLEAN) {
ret_type = T_INT;
}
result |= ((uint64_t) ret_type) << shift;
@@ -226,9 +227,6 @@
address result_handler = Interpreter::result_handler(result_type);
- // Check that result handlers are not real handler on ARM (0 or -1).
- // This ensures the signature handlers do not need symbolic information.
- assert((result_handler == NULL)||(result_handler==(address)0xffffffff),"");
__ mov_slow(R0, (intptr_t)result_handler);
__ ret();
--- a/src/hotspot/cpu/arm/macroAssembler_arm.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/arm/macroAssembler_arm.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -941,6 +941,12 @@
bind(done);
}
+void MacroAssembler::c2bool(Register x)
+{
+ tst(x, 0xff); // Only look at the lowest byte
+ mov(x, 1, ne);
+}
+
void MacroAssembler::null_check(Register reg, Register tmp, int offset) {
if (needs_explicit_null_check(offset)) {
assert_different_registers(reg, tmp);
--- a/src/hotspot/cpu/arm/macroAssembler_arm.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/arm/macroAssembler_arm.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -853,6 +853,8 @@
sub(dst, r1, AsmOperand(r2, lsl, shift));
}
+ // C 'boolean' to Java boolean: x == 0 ? 0 : 1
+ void c2bool(Register x);
// klass oop manipulations if compressed
--- a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -1211,6 +1211,11 @@
__ restore_default_fp_mode();
}
+ // Ensure a Boolean result is mapped to 0..1
+ if (ret_type == T_BOOLEAN) {
+ __ c2bool(R0);
+ }
+
// Do a safepoint check while thread is in transition state
InlinedAddress safepoint_state(SafepointSynchronize::address_of_state());
Label call_safepoint_runtime, return_to_java;
--- a/src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -316,13 +316,27 @@
}
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
- // Result handlers are not used on 32-bit ARM
- // since the returned value is already in appropriate format.
- __ should_not_reach_here(); // to avoid empty code block
+ address entry = __ pc();
- // The result handler non-zero indicates an object is returned and this is
- // used in the native entry code.
- return type == T_OBJECT ? (address)(-1) : NULL;
+ switch (type) {
+ case T_CHAR : /* Nothing to do */ break;
+ case T_BYTE : /* Nothing to do */ break;
+ case T_SHORT : /* Nothing to do */ break;
+ case T_INT : /* Nothing to do */ break;
+ case T_LONG : /* Nothing to do */ break;
+ case T_VOID : /* Nothing to do */ break;
+ case T_DOUBLE : /* Nothing to do */ break;
+ case T_FLOAT : /* Nothing to do */ break;
+ case T_BOOLEAN : __ c2bool(R0); break;
+ case T_OBJECT :
+ __ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
+ __ verify_oop(R0);
+ break;
+ default : __ should_not_reach_here(); break;
+ }
+
+ __ ret();
+ return entry;
}
address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
@@ -985,8 +999,9 @@
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
{
Label Lnot_oop;
- // For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
- __ cbz(Rresult_handler, Lnot_oop);
+ __ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
+ __ cmp(Rtemp, Rresult_handler);
+ __ b(Lnot_oop, ne);
Register value = Rsaved_result_lo;
__ resolve_jobject(value, // value
Rtemp, // tmp1
@@ -1028,10 +1043,9 @@
// not properly paired (was bug - gri 11/22/99).
__ notify_method_exit(vtos, InterpreterMacroAssembler::NotifyJVMTI, true, Rsaved_result_lo, Rsaved_result_hi, saved_result_fp);
- // Restore the result. Oop result is restored from the stack.
- __ cmp(Rresult_handler, 0);
- __ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
- __ mov(R0, Rsaved_result_lo, eq);
+ // Restore the result. Oop result is restored from the stack by the
+ // result handler.
+ __ mov(R0, Rsaved_result_lo);
__ mov(R1, Rsaved_result_hi);
#ifdef __ABI_HARD__
@@ -1039,15 +1053,7 @@
__ fcpyd(D0, D8);
#endif // __ABI_HARD__
-#ifdef ASSERT
- if (VerifyOops) {
- Label L;
- __ cmp(Rresult_handler, 0);
- __ b(L, eq);
- __ verify_oop(R0);
- __ bind(L);
- }
-#endif // ASSERT
+ __ blx(Rresult_handler);
// Restore FP/LR, sender_sp and return
__ mov(Rtemp, FP);
--- a/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -292,11 +292,11 @@
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
assert(left != result, "should be different registers");
if (is_power_of_2(c + 1)) {
- __ shift_left(left, log2_intptr(c + 1), result);
+ __ shift_left(left, log2_int(c + 1), result);
__ sub(result, left, result);
return true;
} else if (is_power_of_2(c - 1)) {
- __ shift_left(left, log2_intptr(c - 1), result);
+ __ shift_left(left, log2_int(c - 1), result);
__ add(result, left, result);
return true;
}
--- a/src/hotspot/cpu/s390/c1_LIRGenerator_s390.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/s390/c1_LIRGenerator_s390.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -227,12 +227,12 @@
if (tmp->is_valid()) {
if (is_power_of_2(c + 1)) {
__ move(left, tmp);
- __ shift_left(left, log2_intptr(c + 1), left);
+ __ shift_left(left, log2_int(c + 1), left);
__ sub(left, tmp, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ move(left, tmp);
- __ shift_left(left, log2_intptr(c - 1), left);
+ __ shift_left(left, log2_int(c - 1), left);
__ add(left, tmp, result);
return true;
}
--- a/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -502,7 +502,7 @@
__ and3(Rscratch, divisor - 1, Rscratch);
}
__ add(Rdividend, Rscratch, Rscratch);
- __ sra(Rscratch, log2_intptr(divisor), Rresult);
+ __ sra(Rscratch, log2_int(divisor), Rresult);
return;
} else {
if (divisor == 2) {
--- a/src/hotspot/cpu/sparc/c1_LIRGenerator_sparc.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/sparc/c1_LIRGenerator_sparc.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -284,11 +284,11 @@
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
assert(left != result, "should be different registers");
if (is_power_of_2(c + 1)) {
- __ shift_left(left, log2_intptr(c + 1), result);
+ __ shift_left(left, log2_int(c + 1), result);
__ sub(result, left, result);
return true;
} else if (is_power_of_2(c - 1)) {
- __ shift_left(left, log2_intptr(c - 1), result);
+ __ shift_left(left, log2_int(c - 1), result);
__ add(result, left, result);
return true;
}
--- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -2555,7 +2555,7 @@
Register dreg = result->as_register();
if (right->is_constant()) {
- int divisor = right->as_constant_ptr()->as_jint();
+ jint divisor = right->as_constant_ptr()->as_jint();
assert(divisor > 0 && is_power_of_2(divisor), "must be");
if (code == lir_idiv) {
assert(lreg == rax, "must be rax,");
@@ -2567,7 +2567,7 @@
__ andl(rdx, divisor - 1);
__ addl(lreg, rdx);
}
- __ sarl(lreg, log2_intptr(divisor));
+ __ sarl(lreg, log2_jint(divisor));
move_regs(lreg, dreg);
} else if (code == lir_irem) {
Label done;
--- a/src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -244,12 +244,12 @@
if (tmp->is_valid() && c > 0 && c < max_jint) {
if (is_power_of_2(c + 1)) {
__ move(left, tmp);
- __ shift_left(left, log2_intptr(c + 1), left);
+ __ shift_left(left, log2_jint(c + 1), left);
__ sub(left, tmp, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ move(left, tmp);
- __ shift_left(left, log2_intptr(c - 1), left);
+ __ shift_left(left, log2_jint(c - 1), left);
__ add(left, tmp, result);
return true;
}
--- a/src/hotspot/share/code/dependencyContext.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/code/dependencyContext.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -118,13 +118,13 @@
// Safepoints are forbidden during DC lifetime. GC can invalidate
// _dependency_context_addr if it relocates the holder
// (e.g. CallSiteContext Java object).
- int _safepoint_counter;
+ uint64_t _safepoint_counter;
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr),
- _safepoint_counter(SafepointSynchronize::_safepoint_counter) {}
+ _safepoint_counter(SafepointSynchronize::safepoint_counter()) {}
~DependencyContext() {
- assert(_safepoint_counter == SafepointSynchronize::_safepoint_counter, "safepoint happened");
+ assert(_safepoint_counter == SafepointSynchronize::safepoint_counter(), "safepoint happened");
}
#else
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr) {}
--- a/src/hotspot/share/gc/g1/g1Allocator.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1Allocator.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -262,8 +262,9 @@
// Create the _archive_region_map which is used to identify archive objects.
static inline void enable_archive_object_check();
- // Set the regions containing the specified address range as archive/non-archive.
+ // Mark regions containing the specified address range as archive/non-archive.
static inline void set_range_archive(MemRegion range, bool open);
+ static inline void clear_range_archive(MemRegion range, bool open);
// Check if the object is in closed archive
static inline bool is_closed_archive_object(oop object);
--- a/src/hotspot/share/gc/g1/g1Allocator.inline.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1Allocator.inline.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -109,6 +109,10 @@
// Set the regions containing the specified address range as archive.
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
assert(_archive_check_enabled, "archive range check not enabled");
+ log_info(gc, cds)("Mark %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
+ open ? "open" : "closed",
+ p2i(range.start()),
+ p2i(range.last()));
if (open) {
_open_archive_region_map.set_by_address(range, true);
} else {
@@ -116,6 +120,20 @@
}
}
+// Clear the archive regions map containing the specified address range.
+inline void G1ArchiveAllocator::clear_range_archive(MemRegion range, bool open) {
+ assert(_archive_check_enabled, "archive range check not enabled");
+ log_info(gc, cds)("Clear %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
+ open ? "open" : "closed",
+ p2i(range.start()),
+ p2i(range.last()));
+ if (open) {
+ _open_archive_region_map.set_by_address(range, false);
+ } else {
+ _closed_archive_region_map.set_by_address(range, false);
+ }
+}
+
// Check if an object is in a closed archive region using the _archive_region_map.
inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
// This is the out-of-line part of is_closed_archive_object test, done separately
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -753,7 +753,7 @@
return result;
}
-void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
+void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count, bool is_open) {
assert(!is_init_completed(), "Expect to be called at JVM init time");
assert(ranges != NULL, "MemRegion array NULL");
assert(count != 0, "No MemRegions provided");
@@ -815,7 +815,7 @@
}
// Notify mark-sweep that this is no longer an archive range.
- G1ArchiveAllocator::set_range_archive(ranges[i], false);
+ G1ArchiveAllocator::clear_range_archive(ranges[i], is_open);
}
if (uncommitted_regions != 0) {
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -683,7 +683,7 @@
// which had been allocated by alloc_archive_regions. This should be called
// rather than fill_archive_regions at JVM init time if the archive file
// mapping failed, with the same non-overlapping and sorted MemRegion array.
- void dealloc_archive_regions(MemRegion* range, size_t count);
+ void dealloc_archive_regions(MemRegion* range, size_t count, bool is_open);
oop materialize_archived_object(oop obj);
--- a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "code/nmethod.hpp"
#include "gc/g1/g1Allocator.inline.hpp"
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1ConcurrentMarkThread.hpp"
--- a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -447,6 +447,7 @@
if (registered_symbol == NULL) {
registered_symbol = SymbolTable::lookup_only(registered_constant, sizeof registered_constant - 1, unused_hash);
if (registered_symbol == NULL) {
+ untypedEventHandler = true;
return false;
}
}
--- a/src/hotspot/share/jfr/metadata/metadata.xml Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/jfr/metadata/metadata.xml Mon Nov 26 08:55:24 2018 +0100
@@ -67,7 +67,7 @@
<Event name="BiasedLockRevocation" category="Java Application" label="Biased Lock Revocation" description="Revoked bias of object" thread="true"
stackTrace="true">
<Field type="Class" name="lockClass" label="Lock Class" description="Class of object whose biased lock was revoked" />
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
<Field type="Thread" name="previousOwner" label="Previous Owner" description="Thread owning the bias before revocation" />
</Event>
@@ -80,7 +80,7 @@
thread="true" stackTrace="true">
<Field type="Class" name="revokedClass" label="Revoked Class" description="Class whose biased locks were revoked" />
<Field type="boolean" name="disableBiasing" label="Disable Further Biasing" description="Whether further biasing for instances of this class will be allowed" />
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
</Event>
<Event name="ReservedStackActivation" category="Java Virtual Machine, Runtime" label="Reserved Stack Activation"
@@ -519,14 +519,14 @@
</Event>
<Event name="SafepointBegin" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint Begin" description="Safepointing begin" thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
<Field type="int" name="totalThreadCount" label="Total Threads" description="The total number of threads at the start of safe point" />
<Field type="int" name="jniCriticalThreadCount" label="JNI Critical Threads" description="The number of threads in JNI critical sections" />
</Event>
<Event name="SafepointStateSynchronization" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint State Synchronization" description="Synchronize run state of threads"
thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
<Field type="int" name="initialThreadCount" label="Initial Threads" description="The number of threads running at the beginning of state check" />
<Field type="int" name="runningThreadCount" label="Running Threads" description="The number of threads still running" />
<Field type="int" name="iterations" label="Iterations" description="Number of state check iterations" />
@@ -534,23 +534,23 @@
<Event name="SafepointWaitBlocked" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint Wait Blocked" description="Safepointing begin waiting on running threads to block"
thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
<Field type="int" name="runningThreadCount" label="Running Threads" description="The number running of threads wait for safe point" />
</Event>
<Event name="SafepointCleanup" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint Cleanup" description="Safepointing begin running cleanup tasks"
thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
</Event>
<Event name="SafepointCleanupTask" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint Cleanup Task" description="Safepointing begin running cleanup tasks"
thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
<Field type="string" name="name" label="Task Name" description="The task name" />
</Event>
<Event name="SafepointEnd" category="Java Virtual Machine, Runtime, Safepoint" label="Safepoint End" description="Safepointing end" thread="true">
- <Field type="int" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" relation="SafepointId" />
</Event>
<Event name="ExecuteVMOperation" category="Java Virtual Machine, Runtime" label="VM Operation" description="Execution of a VM Operation" thread="true">
@@ -559,7 +559,7 @@
<Field type="boolean" name="blocking" label="Caller Blocked" description="If the calling thread was blocked until the operation was complete" />
<Field type="Thread" name="caller" label="Caller" transition="from"
description="Thread requesting operation. If non-blocking, will be set to 0 indicating thread is unknown" />
- <Field type="int" name="safepointId" label="Safepoint Identifier" description="The safepoint (if any) under which this operation was completed"
+ <Field type="ulong" name="safepointId" label="Safepoint Identifier" description="The safepoint (if any) under which this operation was completed"
relation="SafepointId" />
</Event>
--- a/src/hotspot/share/memory/filemap.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/memory/filemap.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -1096,7 +1096,7 @@
si->_allow_exec);
if (base == NULL || base != addr) {
// dealloc the regions from java heap
- dealloc_archive_heap_regions(regions, region_num);
+ dealloc_archive_heap_regions(regions, region_num, is_open_archive);
log_info(cds)("UseSharedSpaces: Unable to map at required address in java heap. "
INTPTR_FORMAT ", size = " SIZE_FORMAT " bytes",
p2i(addr), regions[i].byte_size());
@@ -1106,7 +1106,7 @@
if (!verify_mapped_heap_regions(first, region_num)) {
// dealloc the regions from java heap
- dealloc_archive_heap_regions(regions, region_num);
+ dealloc_archive_heap_regions(regions, region_num, is_open_archive);
log_info(cds)("UseSharedSpaces: mapped heap regions are corrupt");
return false;
}
@@ -1171,10 +1171,10 @@
}
// dealloc the archive regions from java heap
-void FileMapInfo::dealloc_archive_heap_regions(MemRegion* regions, int num) {
+void FileMapInfo::dealloc_archive_heap_regions(MemRegion* regions, int num, bool is_open) {
if (num > 0) {
assert(regions != NULL, "Null archive ranges array with non-zero count");
- G1CollectedHeap::heap()->dealloc_archive_regions(regions, num);
+ G1CollectedHeap::heap()->dealloc_archive_regions(regions, num, is_open);
}
}
#endif // INCLUDE_CDS_JAVA_HEAP
@@ -1428,9 +1428,11 @@
// Dealloc the archive heap regions only without unmapping. The regions are part
// of the java heap. Unmapping of the heap regions are managed by GC.
map_info->dealloc_archive_heap_regions(open_archive_heap_ranges,
- num_open_archive_heap_ranges);
+ num_open_archive_heap_ranges,
+ true);
map_info->dealloc_archive_heap_regions(closed_archive_heap_ranges,
- num_closed_archive_heap_ranges);
+ num_closed_archive_heap_ranges,
+ false);
} else if (DumpSharedSpaces) {
fail_stop("%s", msg);
}
--- a/src/hotspot/share/memory/filemap.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/memory/filemap.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -327,7 +327,7 @@
bool map_heap_data(MemRegion **heap_mem, int first, int max, int* num,
bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false);
bool verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false);
- void dealloc_archive_heap_regions(MemRegion* regions, int num) NOT_CDS_JAVA_HEAP_RETURN;
+ void dealloc_archive_heap_regions(MemRegion* regions, int num, bool is_open) NOT_CDS_JAVA_HEAP_RETURN;
CDSFileMapRegion* space_at(int i) {
return _header->space_at(i);
--- a/src/hotspot/share/memory/iterator.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/memory/iterator.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, 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
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "code/nmethod.hpp"
#include "memory/iterator.inline.hpp"
#include "memory/universe.hpp"
#include "oops/oop.inline.hpp"
--- a/src/hotspot/share/opto/divnode.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/opto/divnode.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -133,7 +133,7 @@
}
// Add rounding to the shift to handle the sign bit
- int l = log2_intptr(d-1)+1;
+ int l = log2_jint(d-1)+1;
if (needs_rounding) {
// Divide-by-power-of-2 can be made into a shift, but you have to do
// more math for the rounding. You need to add 0 for positive
--- a/src/hotspot/share/opto/mulnode.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/opto/mulnode.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -199,21 +199,21 @@
Node *res = NULL;
unsigned int bit1 = abs_con & (0-abs_con); // Extract low bit
if (bit1 == abs_con) { // Found a power of 2?
- res = new LShiftINode(in(1), phase->intcon(log2_intptr(bit1)));
+ res = new LShiftINode(in(1), phase->intcon(log2_uint(bit1)));
} else {
// Check for constant with 2 bits set
unsigned int bit2 = abs_con-bit1;
bit2 = bit2 & (0-bit2); // Extract 2nd bit
if (bit2 + bit1 == abs_con) { // Found all bits in con?
- Node *n1 = phase->transform( new LShiftINode(in(1), phase->intcon(log2_intptr(bit1))));
- Node *n2 = phase->transform( new LShiftINode(in(1), phase->intcon(log2_intptr(bit2))));
+ Node *n1 = phase->transform( new LShiftINode(in(1), phase->intcon(log2_uint(bit1))));
+ Node *n2 = phase->transform( new LShiftINode(in(1), phase->intcon(log2_uint(bit2))));
res = new AddINode(n2, n1);
} else if (is_power_of_2(abs_con+1)) {
// Sleezy: power-of-2 -1. Next time be generic.
unsigned int temp = abs_con + 1;
- Node *n1 = phase->transform(new LShiftINode(in(1), phase->intcon(log2_intptr(temp))));
+ Node *n1 = phase->transform(new LShiftINode(in(1), phase->intcon(log2_uint(temp))));
res = new SubINode(n1, in(1));
} else {
return MulNode::Ideal(phase, can_reshape);
@@ -445,7 +445,7 @@
// Masking off high bits which are always zero is useless.
const TypeInt* t1 = phase->type( in(1) )->isa_int();
if (t1 != NULL && t1->_lo >= 0) {
- jint t1_support = right_n_bits(1 + log2_intptr(t1->_hi));
+ jint t1_support = right_n_bits(1 + log2_jint(t1->_hi));
if ((t1_support & con) == t1_support)
return in1;
}
--- a/src/hotspot/share/runtime/compilationPolicy.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/compilationPolicy.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -228,7 +228,7 @@
// Example: if CICompilerCountPerCPU is true, then we get
// max(log2(8)-1,1) = 2 compiler threads on an 8-way machine.
// May help big-app startup time.
- _compiler_count = MAX2(log2_intptr(os::active_processor_count())-1,1);
+ _compiler_count = MAX2(log2_int(os::active_processor_count())-1,1);
// Make sure there is enough space in the code cache to hold all the compiler buffers
size_t buffer_size = 1;
#ifdef COMPILER1
--- a/src/hotspot/share/runtime/safepoint.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/safepoint.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -141,7 +141,7 @@
SafepointSynchronize::SynchronizeState volatile SafepointSynchronize::_state = SafepointSynchronize::_not_synchronized;
volatile int SafepointSynchronize::_waiting_to_block = 0;
-volatile int SafepointSynchronize::_safepoint_counter = 0;
+volatile uint64_t SafepointSynchronize::_safepoint_counter = 0;
int SafepointSynchronize::_current_jni_active_count = 0;
long SafepointSynchronize::_end_of_last_safepoint = 0;
int SafepointSynchronize::_defer_thr_suspend_loop_count = 4000;
--- a/src/hotspot/share/runtime/safepoint.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/safepoint.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -25,13 +25,10 @@
#ifndef SHARE_VM_RUNTIME_SAFEPOINT_HPP
#define SHARE_VM_RUNTIME_SAFEPOINT_HPP
-#include "asm/assembler.hpp"
-#include "code/nmethod.hpp"
#include "memory/allocation.hpp"
-#include "runtime/atomic.hpp"
-#include "runtime/extendedPC.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
+#include "utilities/globalDefinitions.hpp"
#include "utilities/ostream.hpp"
//
@@ -50,8 +47,7 @@
class ThreadSafepointState;
-class SnippetCache;
-class nmethod;
+class JavaThread;
//
// Implements roll-forward to safepoint (safepoint synchronization)
@@ -101,11 +97,11 @@
// safepoint. The fact that Threads_lock is held throughout each pair of
// increments (at the beginning and end of each safepoint) guarantees
// race freedom.
-public:
- static volatile int _safepoint_counter;
+ static volatile uint64_t _safepoint_counter;
+
private:
- static long _end_of_last_safepoint; // Time of last safepoint in milliseconds
- static julong _coalesced_vmop_count; // coalesced vmop count
+ static long _end_of_last_safepoint; // Time of last safepoint in milliseconds
+ static julong _coalesced_vmop_count; // coalesced vmop count
// Statistics
static void begin_statistics(int nof_threads, int nof_running);
@@ -132,9 +128,9 @@
static void check_for_lazy_critical_native(JavaThread *thread, JavaThreadState state);
// Query
- inline static bool is_at_safepoint() { return _state == _synchronized; }
- inline static bool is_synchronizing() { return _state == _synchronizing; }
- inline static int safepoint_counter() { return _safepoint_counter; }
+ inline static bool is_at_safepoint() { return _state == _synchronized; }
+ inline static bool is_synchronizing() { return _state == _synchronizing; }
+ inline static uint64_t safepoint_counter() { return _safepoint_counter; }
inline static void increment_jni_active_count() {
assert_locked_or_safepoint(Safepoint_lock);
@@ -176,8 +172,17 @@
// Assembly support
static address address_of_state() { return (address)&_state; }
- static address safepoint_counter_addr() { return (address)&_safepoint_counter; }
-
+ // Only used for making sure that no safepoint has happened in
+ // JNI_FastGetField. Therefore only the low 32-bits are needed
+ // even if this is a 64-bit counter.
+ static address safepoint_counter_addr() {
+#ifdef VM_LITTLE_ENDIAN
+ return (address)&_safepoint_counter;
+#else /* BIG */
+ // Return pointer to the 32 LSB:
+ return (address) (((uint32_t*)(&_safepoint_counter)) + 1);
+#endif
+ }
};
// Some helper assert macros for safepoint checks.
--- a/src/hotspot/share/runtime/thread.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/thread.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -26,6 +26,7 @@
#define SHARE_VM_RUNTIME_THREAD_HPP
#include "jni.h"
+#include "code/compiledMethod.hpp"
#include "gc/shared/gcThreadLocalData.hpp"
#include "gc/shared/threadLocalAllocBuffer.hpp"
#include "memory/allocation.hpp"
@@ -40,7 +41,6 @@
#include "runtime/os.hpp"
#include "runtime/osThread.hpp"
#include "runtime/park.hpp"
-#include "runtime/safepoint.hpp"
#include "runtime/stubRoutines.hpp"
#include "runtime/threadHeapSampler.hpp"
#include "runtime/threadLocalStorage.hpp"
@@ -994,7 +994,7 @@
public: // Expose _thread_state for SafeFetchInt()
volatile JavaThreadState _thread_state;
private:
- ThreadSafepointState *_safepoint_state; // Holds information about a thread during a safepoint
+ ThreadSafepointState* _safepoint_state; // Holds information about a thread during a safepoint
address _saved_exception_pc; // Saved pc of instruction where last implicit exception happened
// JavaThread termination support
@@ -1226,9 +1226,9 @@
inline JavaThreadState thread_state() const;
inline void set_thread_state(JavaThreadState s);
#endif
- ThreadSafepointState *safepoint_state() const { return _safepoint_state; }
- void set_safepoint_state(ThreadSafepointState *state) { _safepoint_state = state; }
- bool is_at_poll_safepoint() { return _safepoint_state->is_at_poll_safepoint(); }
+ inline ThreadSafepointState* safepoint_state() const;
+ inline void set_safepoint_state(ThreadSafepointState* state);
+ inline bool is_at_poll_safepoint();
// JavaThread termination and lifecycle support:
void smr_delete();
@@ -1751,13 +1751,7 @@
// JNI critical regions. These can nest.
bool in_critical() { return _jni_active_critical > 0; }
bool in_last_critical() { return _jni_active_critical == 1; }
- void enter_critical() {
- assert(Thread::current() == this ||
- (Thread::current()->is_VM_thread() &&
- SafepointSynchronize::is_synchronizing()),
- "this must be current thread or synchronizing");
- _jni_active_critical++;
- }
+ inline void enter_critical();
void exit_critical() {
assert(Thread::current() == this, "this must be current thread");
_jni_active_critical--;
--- a/src/hotspot/share/runtime/thread.inline.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/thread.inline.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -29,6 +29,7 @@
#include "runtime/globals.hpp"
#include "runtime/orderAccess.hpp"
#include "runtime/os.inline.hpp"
+#include "runtime/safepoint.hpp"
#include "runtime/thread.hpp"
inline void Thread::set_suspend_flag(SuspendFlags f) {
@@ -130,6 +131,26 @@
}
#endif
+ThreadSafepointState* JavaThread::safepoint_state() const {
+ return _safepoint_state;
+}
+
+void JavaThread::set_safepoint_state(ThreadSafepointState *state) {
+ _safepoint_state = state;
+}
+
+bool JavaThread::is_at_poll_safepoint() {
+ return _safepoint_state->is_at_poll_safepoint();
+}
+
+void JavaThread::enter_critical() {
+ assert(Thread::current() == this ||
+ (Thread::current()->is_VM_thread() &&
+ SafepointSynchronize::is_synchronizing()),
+ "this must be current thread or synchronizing");
+ _jni_active_critical++;
+}
+
inline void JavaThread::set_done_attaching_via_jni() {
_jni_attach_state = _attached_via_jni;
OrderAccess::fence();
--- a/src/hotspot/share/runtime/tieredThresholdPolicy.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/runtime/tieredThresholdPolicy.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -226,8 +226,8 @@
}
if (CICompilerCountPerCPU) {
// Simple log n seems to grow too slowly for tiered, try something faster: log n * log log n
- int log_cpu = log2_intptr(os::active_processor_count());
- int loglog_cpu = log2_intptr(MAX2(log_cpu, 1));
+ int log_cpu = log2_int(os::active_processor_count());
+ int loglog_cpu = log2_int(MAX2(log_cpu, 1));
count = MAX2(log_cpu * loglog_cpu * 3 / 2, 2);
// Make sure there is enough space in the code cache to hold all the compiler buffers
size_t c1_size = Compiler::code_buffer_size();
--- a/src/hotspot/share/services/threadService.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/services/threadService.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -31,6 +31,7 @@
#include "runtime/jniHandles.hpp"
#include "runtime/objectMonitor.hpp"
#include "runtime/perfData.hpp"
+#include "runtime/safepoint.hpp"
#include "runtime/thread.hpp"
#include "runtime/threadSMR.hpp"
#include "services/management.hpp"
--- a/src/hotspot/share/utilities/globalDefinitions.hpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/utilities/globalDefinitions.hpp Mon Nov 26 08:55:24 2018 +0100
@@ -1032,7 +1032,6 @@
}
// Returns largest i such that 2^i <= x.
-// If x < 0, the function returns 31 on a 32-bit machine and 63 on a 64-bit machine.
// If x == 0, the function returns -1.
inline int log2_intptr(uintptr_t x) {
int i = -1;
@@ -1047,8 +1046,7 @@
}
//* largest i such that 2^i <= x
-// A negative value of 'x' will return '63'
-inline int log2_long(unsigned long x) {
+inline int log2_long(julong x) {
int i = -1;
julong p = 1;
while (p != 0 && p <= x) {
@@ -1060,20 +1058,30 @@
return i;
}
+// If x < 0, the function returns 31 on a 32-bit machine and 63 on a 64-bit machine.
inline int log2_intptr(intptr_t x) {
return log2_intptr((uintptr_t)x);
}
-inline int log2_intptr(int x) {
+inline int log2_int(int x) {
+ STATIC_ASSERT(sizeof(int) <= sizeof(uintptr_t));
+ return log2_intptr((uintptr_t)x);
+}
+
+inline int log2_jint(jint x) {
+ STATIC_ASSERT(sizeof(jint) <= sizeof(uintptr_t));
return log2_intptr((uintptr_t)x);
}
-inline int log2_intptr(uint x) {
+inline int log2_uint(uint x) {
+ STATIC_ASSERT(sizeof(uint) <= sizeof(uintptr_t));
return log2_intptr((uintptr_t)x);
}
-inline int log2_long(jlong x) {
- return log2_long((unsigned long)x);
+// A negative value of 'x' will return '63'
+inline int log2_jlong(jlong x) {
+ STATIC_ASSERT(sizeof(jlong) <= sizeof(julong));
+ return log2_long((julong)x);
}
//* the argument must be exactly a power of 2
--- a/src/hotspot/share/utilities/hashtable.cpp Fri Nov 23 20:06:18 2018 +0100
+++ b/src/hotspot/share/utilities/hashtable.cpp Mon Nov 26 08:55:24 2018 +0100
@@ -31,6 +31,7 @@
#include "classfile/placeholders.hpp"
#include "classfile/protectionDomainCache.hpp"
#include "classfile/stringTable.hpp"
+#include "code/nmethod.hpp"
#include "logging/log.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/resourceArea.hpp"
@@ -62,7 +63,7 @@
if (_first_free_entry + _entry_size >= _end_block) {
int block_size = MIN2(512, MAX2((int)_table_size / 2, (int)_number_of_entries));
int len = _entry_size * block_size;
- len = 1 << log2_intptr(len); // round down to power of 2
+ len = 1 << log2_int(len); // round down to power of 2
assert(len >= _entry_size, "");
_first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC);
_entry_blocks->append(_first_free_entry);
--- a/src/jdk.crypto.ec/share/native/libsunec/impl/ec.c Fri Nov 23 20:06:18 2018 +0100
+++ b/src/jdk.crypto.ec/share/native/libsunec/impl/ec.c Mon Nov 26 08:55:24 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
* This library is free software; you can redistribute it and/or
@@ -43,11 +43,11 @@
#include <sys/types.h>
#ifndef _KERNEL
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32
-#include <stdio.h>
#include <strings.h>
#endif /* _WIN32 */
@@ -109,16 +109,16 @@
printf("\n");
if (k1 != NULL) {
- mp_tohex(k1, mpstr);
+ mp_tohex((mp_int*)k1, mpstr);
printf("ec_points_mul: scalar k1: %s\n", mpstr);
- mp_todecimal(k1, mpstr);
+ mp_todecimal((mp_int*)k1, mpstr);
printf("ec_points_mul: scalar k1: %s (dec)\n", mpstr);
}
if (k2 != NULL) {
- mp_tohex(k2, mpstr);
+ mp_tohex((mp_int*)k2, mpstr);
printf("ec_points_mul: scalar k2: %s\n", mpstr);
- mp_todecimal(k2, mpstr);
+ mp_todecimal((mp_int*)k2, mpstr);
printf("ec_points_mul: scalar k2: %s (dec)\n", mpstr);
}
--- a/src/jdk.crypto.ec/share/native/libsunec/impl/ecdecode.c Fri Nov 23 20:06:18 2018 +0100
+++ b/src/jdk.crypto.ec/share/native/libsunec/impl/ecdecode.c Mon Nov 26 08:55:24 2018 +0100
@@ -49,6 +49,7 @@
#ifdef _KERNEL
#include <sys/kmem.h>
#else
+#include <stdio.h>
#include <string.h>
#endif
#include "ec.h"
--- a/test/hotspot/jtreg/ProblemList.txt Fri Nov 23 20:06:18 2018 +0100
+++ b/test/hotspot/jtreg/ProblemList.txt Mon Nov 26 08:55:24 2018 +0100
@@ -61,6 +61,8 @@
compiler/runtime/Test8168712.java 8211769,8211771 generic-ppc64,generic-ppc64le,linux-s390x
+compiler/intrinsics/mathexact/MulExactLConstantTest.java 8214189 windows-all
+
#############################################################################
# :hotspot_gc
--- a/test/jdk/jdk/jfr/event/runtime/TestBiasedLockRevocationEvents.java Fri Nov 23 20:06:18 2018 +0100
+++ b/test/jdk/jdk/jfr/event/runtime/TestBiasedLockRevocationEvents.java Mon Nov 26 08:55:24 2018 +0100
@@ -275,13 +275,13 @@
List<RecordedEvent> events = Events.fromRecording(recording);
// Determine which safepoints included single and bulk revocation VM operations
- Set<Integer> vmOperationsSingle = new HashSet<>();
- Set<Integer> vmOperationsBulk = new HashSet<>();
+ Set<Long> vmOperationsSingle = new HashSet<>();
+ Set<Long> vmOperationsBulk = new HashSet<>();
for (RecordedEvent event : events) {
if (event.getEventType().getName().equals(EventNames.ExecuteVMOperation)) {
String operation = event.getValue("operation");
- Integer safepointId = event.getValue("safepointId");
+ Long safepointId = event.getValue("safepointId");
if (operation.equals("RevokeBias")) {
vmOperationsSingle.add(safepointId);
@@ -297,14 +297,14 @@
// Match all revoke events to a corresponding VMOperation event
for (RecordedEvent event : events) {
if (event.getEventType().getName().equals(EventNames.BiasedLockRevocation)) {
- Integer safepointId = event.getValue("safepointId");
+ Long safepointId = event.getValue("safepointId");
String lockClass = ((RecordedClass)event.getValue("lockClass")).getName();
if (lockClass.equals(MyLock.class.getName())) {
Asserts.assertTrue(vmOperationsSingle.contains(safepointId));
revokeCount++;
}
} else if (event.getEventType().getName().equals(EventNames.BiasedLockClassRevocation)) {
- Integer safepointId = event.getValue("safepointId");
+ Long safepointId = event.getValue("safepointId");
String lockClass = ((RecordedClass)event.getValue("revokedClass")).getName();
if (lockClass.toString().equals(MyLock.class.getName())) {
Asserts.assertTrue(vmOperationsBulk.contains(safepointId));
--- a/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java Fri Nov 23 20:06:18 2018 +0100
+++ b/test/jdk/jdk/jfr/event/runtime/TestSafepointEvents.java Mon Nov 26 08:55:24 2018 +0100
@@ -84,9 +84,9 @@
}
// Collect all events grouped by safepoint id
- SortedMap<Integer, Set<String>> safepointIds = new TreeMap<>();
+ SortedMap<Long, Set<String>> safepointIds = new TreeMap<>();
for (RecordedEvent event : Events.fromRecording(recording)) {
- Integer safepointId = event.getValue("safepointId");
+ Long safepointId = event.getValue("safepointId");
if (!safepointIds.containsKey(safepointId)) {
safepointIds.put(safepointId, new HashSet<>());
}