This commit is contained in:
Jesper Wilhelmsson 2017-01-09 15:10:25 +01:00
commit f175ea37aa
79 changed files with 699 additions and 495 deletions

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -121,7 +121,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
-buildBase $(call FixPath, $(IDE_OUTPUTDIR)/vs-output) \ -buildBase $(call FixPath, $(IDE_OUTPUTDIR)/vs-output) \
-buildSpace $(call FixPath, $(IDE_OUTPUTDIR)) \ -buildSpace $(call FixPath, $(IDE_OUTPUTDIR)) \
-makeBinary $(call FixPath, $(MAKE)) \ -makeBinary $(call FixPath, $(MAKE)) \
-makeOutput $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-%f/libjvm) \ -makeOutput $(call FixPath, $(JDK_OUTPUTDIR)/bin/server) \
-absoluteInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \ -absoluteInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
-absoluteSrcInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \ -absoluteSrcInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
$(EXTRACTED_DEFINES_client) \ $(EXTRACTED_DEFINES_client) \

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -114,8 +114,8 @@ public class WinGammaPlatformVC10 extends WinGammaPlatform {
tag(cfg, "CodeAnalysisRuleAssemblies"); tag(cfg, "CodeAnalysisRuleAssemblies");
} }
for (BuildConfig cfg : allConfigs) { for (BuildConfig cfg : allConfigs) {
tagData(cfg, "NMakeBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile import-hotspot LOG=info"); tagData(cfg, "NMakeBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile hotspot LOG=info");
tagData(cfg, "NMakeReBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot import-hotspot LOG=info"); tagData(cfg, "NMakeReBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot hotspot LOG=info");
tagData(cfg, "NMakeCleanCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot LOG=info"); tagData(cfg, "NMakeCleanCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot LOG=info");
tagData(cfg, "NMakeOutput", cfg.get("MakeOutput") + Util.sep + "jvm.dll"); tagData(cfg, "NMakeOutput", cfg.get("MakeOutput") + Util.sep + "jvm.dll");
tagData(cfg, "NMakePreprocessorDefinitions", Util.join(";", cfg.getDefines())); tagData(cfg, "NMakePreprocessorDefinitions", Util.join(";", cfg.getDefines()));

View File

@ -2569,7 +2569,7 @@ void MacroAssembler::rtm_retry_lock_on_abort(Register retry_count_Reg, Register
} }
// Spin and retry if lock is busy. // Spin and retry if lock is busy.
// inputs: box_Reg (monitor address) // inputs: owner_addr_Reg (monitor address)
// : retry_count_Reg // : retry_count_Reg
// output: retry_count_Reg decremented by 1 // output: retry_count_Reg decremented by 1
// CTR is killed // CTR is killed
@ -2577,15 +2577,22 @@ void MacroAssembler::rtm_retry_lock_on_busy(Register retry_count_Reg, Register o
Label SpinLoop, doneRetry; Label SpinLoop, doneRetry;
addic_(retry_count_Reg, retry_count_Reg, -1); addic_(retry_count_Reg, retry_count_Reg, -1);
blt(CCR0, doneRetry); blt(CCR0, doneRetry);
li(R0, RTMSpinLoopCount);
mtctr(R0); if (RTMSpinLoopCount > 1) {
li(R0, RTMSpinLoopCount);
mtctr(R0);
}
bind(SpinLoop); bind(SpinLoop);
smt_yield(); // Can't use waitrsv(). No permission (SIGILL). smt_yield(); // Can't use waitrsv(). No permission (SIGILL).
bdz(retryLabel);
ld(R0, 0, owner_addr_Reg); if (RTMSpinLoopCount > 1) {
cmpdi(CCR0, R0, 0); bdz(retryLabel);
bne(CCR0, SpinLoop); ld(R0, 0, owner_addr_Reg);
cmpdi(CCR0, R0, 0);
bne(CCR0, SpinLoop);
}
b(retryLabel); b(retryLabel);
bind(doneRetry); bind(doneRetry);

View File

@ -327,7 +327,10 @@ void VM_Version::initialize() {
warning("RTMAbortRatio must be in the range 0 to 100, resetting it to 50"); warning("RTMAbortRatio must be in the range 0 to 100, resetting it to 50");
FLAG_SET_DEFAULT(RTMAbortRatio, 50); FLAG_SET_DEFAULT(RTMAbortRatio, 50);
} }
guarantee(RTMSpinLoopCount > 0, "unsupported"); if (RTMSpinLoopCount < 0) {
warning("RTMSpinLoopCount must not be a negative value, resetting it to 0");
FLAG_SET_DEFAULT(RTMSpinLoopCount, 0);
}
#else #else
// Only C2 does RTM locking optimization. // Only C2 does RTM locking optimization.
// Can't continue because UseRTMLocking affects UseBiasedLocking flag // Can't continue because UseRTMLocking affects UseBiasedLocking flag

View File

@ -1105,16 +1105,16 @@ void LIR_Assembler::reg2mem(LIR_Opr from, LIR_Opr dest_opr, BasicType type,
} }
case T_FLOAT : case T_FLOAT :
if (short_disp) { if (short_disp) {
__ z_ste(from->as_float_reg(), disp_value, disp_reg, dest); __ z_ste(from->as_float_reg(), disp_value, disp_reg, dest);
} else { } else {
__ z_stey(from->as_float_reg(), disp_value, disp_reg, dest); __ z_stey(from->as_float_reg(), disp_value, disp_reg, dest);
} }
break; break;
case T_DOUBLE: case T_DOUBLE:
if (short_disp) { if (short_disp) {
__ z_std(from->as_double_reg(), disp_value, disp_reg, dest); __ z_std(from->as_double_reg(), disp_value, disp_reg, dest);
} else { } else {
__ z_stdy(from->as_double_reg(), disp_value, disp_reg, dest); __ z_stdy(from->as_double_reg(), disp_value, disp_reg, dest);
} }
break; break;
default: ShouldNotReachHere(); default: ShouldNotReachHere();
@ -1148,6 +1148,10 @@ void LIR_Assembler::return_op(LIR_Opr result) {
__ restore_return_pc(); __ restore_return_pc();
} }
if (StackReservedPages > 0 && compilation()->has_reserved_stack_access()) {
__ reserved_stack_check(Z_R14);
}
// We need to mark the code position where the load from the safepoint // We need to mark the code position where the load from the safepoint
// polling page was emitted as relocInfo::poll_return_type here. // polling page was emitted as relocInfo::poll_return_type here.
__ relocate(relocInfo::poll_return_type); __ relocate(relocInfo::poll_return_type);

View File

@ -52,4 +52,6 @@ const bool CCallingConventionRequiresIntsAsLongs = true;
// The expected size in bytes of a cache line, used to pad data structures. // The expected size in bytes of a cache line, used to pad data structures.
#define DEFAULT_CACHE_LINE_SIZE 256 #define DEFAULT_CACHE_LINE_SIZE 256
#define SUPPORT_RESERVED_STACK_AREA
#endif // CPU_S390_VM_GLOBALDEFINITIONS_S390_HPP #endif // CPU_S390_VM_GLOBALDEFINITIONS_S390_HPP

View File

@ -56,7 +56,7 @@ define_pd_global(intx, InlineSmallCode, 2000);
// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the // Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the
// stack. To pass stack overflow tests we need 20 shadow pages. // stack. To pass stack overflow tests we need 20 shadow pages.
#define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2)) #define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2))
#define DEFAULT_STACK_RESERVED_PAGES (0) #define DEFAULT_STACK_RESERVED_PAGES (1)
#define MIN_STACK_YELLOW_PAGES DEFAULT_STACK_YELLOW_PAGES #define MIN_STACK_YELLOW_PAGES DEFAULT_STACK_YELLOW_PAGES
#define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES #define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES

View File

@ -860,16 +860,39 @@ void InterpreterMacroAssembler::remove_activation(TosState state,
bool throw_monitor_exception, bool throw_monitor_exception,
bool install_monitor_exception, bool install_monitor_exception,
bool notify_jvmti) { bool notify_jvmti) {
BLOCK_COMMENT("remove_activation {");
unlock_if_synchronized_method(state, throw_monitor_exception, install_monitor_exception); unlock_if_synchronized_method(state, throw_monitor_exception, install_monitor_exception);
// Save result (push state before jvmti call and pop it afterwards) and notify jvmti. // Save result (push state before jvmti call and pop it afterwards) and notify jvmti.
notify_method_exit(false, state, notify_jvmti ? NotifyJVMTI : SkipNotifyJVMTI); notify_method_exit(false, state, notify_jvmti ? NotifyJVMTI : SkipNotifyJVMTI);
if (StackReservedPages > 0) {
BLOCK_COMMENT("reserved_stack_check:");
// Test if reserved zone needs to be enabled.
Label no_reserved_zone_enabling;
// Compare frame pointers. There is no good stack pointer, as with stack
// frame compression we can get different SPs when we do calls. A subsequent
// call could have a smaller SP, so that this compare succeeds for an
// inner call of the method annotated with ReservedStack.
z_lg(Z_R0, Address(Z_SP, (intptr_t)_z_abi(callers_sp)));
z_clg(Z_R0, Address(Z_thread, JavaThread::reserved_stack_activation_offset())); // Compare with frame pointer in memory.
z_brl(no_reserved_zone_enabling);
// Enable reserved zone again, throw stack overflow exception.
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), Z_thread);
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_delayed_StackOverflowError));
should_not_reach_here();
bind(no_reserved_zone_enabling);
}
verify_oop(Z_tos, state); verify_oop(Z_tos, state);
verify_thread(); verify_thread();
pop_interpreter_frame(return_pc, Z_ARG2, Z_ARG3); pop_interpreter_frame(return_pc, Z_ARG2, Z_ARG3);
BLOCK_COMMENT("} remove_activation");
} }
// lock object // lock object

View File

@ -2666,6 +2666,32 @@ void MacroAssembler::bang_stack_with_offset(int offset) {
} }
} }
void MacroAssembler::reserved_stack_check(Register return_pc) {
// Test if reserved zone needs to be enabled.
Label no_reserved_zone_enabling;
assert(return_pc == Z_R14, "Return pc must be in R14 before z_br() to StackOverflow stub.");
BLOCK_COMMENT("reserved_stack_check {");
z_clg(Z_SP, Address(Z_thread, JavaThread::reserved_stack_activation_offset()));
z_brl(no_reserved_zone_enabling);
// Enable reserved zone again, throw stack overflow exception.
save_return_pc();
push_frame_abi160(0);
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), Z_thread);
pop_frame();
restore_return_pc();
load_const_optimized(Z_R1, StubRoutines::throw_delayed_StackOverflowError_entry());
// Don't use call() or z_basr(), they will invalidate Z_R14 which contains the return pc.
z_br(Z_R1);
should_not_reach_here();
bind(no_reserved_zone_enabling);
BLOCK_COMMENT("} reserved_stack_check");
}
// Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes. // Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
void MacroAssembler::tlab_allocate(Register obj, void MacroAssembler::tlab_allocate(Register obj,
Register var_size_in_bytes, Register var_size_in_bytes,

View File

@ -627,6 +627,11 @@ class MacroAssembler: public Assembler {
// Stack overflow checking // Stack overflow checking
void bang_stack_with_offset(int offset); void bang_stack_with_offset(int offset);
// Check for reserved stack access in method being exited. If the reserved
// stack area was accessed, protect it again and throw StackOverflowError.
// Uses Z_R1.
void reserved_stack_check(Register return_pc);
// Atomics // Atomics
// -- none? // -- none?

View File

@ -909,15 +909,8 @@ void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
// If this does safepoint polling, then do it here. // If this does safepoint polling, then do it here.
bool need_polling = do_polling() && C->is_method_compilation(); bool need_polling = do_polling() && C->is_method_compilation();
// Touch the polling page.
// Part 1: get the page's address.
if (need_polling) {
AddressLiteral pp(os::get_polling_page());
__ load_const_optimized(Z_R1_scratch, pp);
}
// Pop frame, restore return_pc, and all stuff needed by interpreter. // Pop frame, restore return_pc, and all stuff needed by interpreter.
// Pop frame by add insted of load (a penny saved is a penny got :-). // Pop frame by add instead of load (a penny saved is a penny got :-).
int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes); int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes);
int retPC_offset = frame_size_in_bytes + _z_abi16(return_pc); int retPC_offset = frame_size_in_bytes + _z_abi16(return_pc);
if (Displacement::is_validDisp(retPC_offset)) { if (Displacement::is_validDisp(retPC_offset)) {
@ -928,9 +921,14 @@ void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
__ restore_return_pc(); __ restore_return_pc();
} }
// Touch the polling page, if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
// part 2: touch the page now. __ reserved_stack_check(Z_R14);
}
// Touch the polling page.
if (need_polling) { if (need_polling) {
AddressLiteral pp(os::get_polling_page());
__ load_const_optimized(Z_R1_scratch, pp);
// We need to mark the code position where the load from the safepoint // We need to mark the code position where the load from the safepoint
// polling page was emitted as relocInfo::poll_return_type here. // polling page was emitted as relocInfo::poll_return_type here.
__ relocate(relocInfo::poll_return_type); __ relocate(relocInfo::poll_return_type);
@ -939,7 +937,7 @@ void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
} }
uint MachEpilogNode::size(PhaseRegAlloc *ra_) const { uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
// variable size. determine dynamically. // Variable size. determine dynamically.
return MachNode::size(ra_); return MachNode::size(ra_);
} }

View File

@ -2433,13 +2433,12 @@ class StubGenerator: public StubCodeGenerator {
StubRoutines::_throw_StackOverflowError_entry = StubRoutines::_throw_StackOverflowError_entry =
generate_throw_exception("StackOverflowError throw_exception", generate_throw_exception("StackOverflowError throw_exception",
CAST_FROM_FN_PTR(address, SharedRuntime::throw_StackOverflowError), false); CAST_FROM_FN_PTR(address, SharedRuntime::throw_StackOverflowError), false);
StubRoutines::_throw_delayed_StackOverflowError_entry =
generate_throw_exception("delayed StackOverflowError throw_exception",
CAST_FROM_FN_PTR(address, SharedRuntime::throw_delayed_StackOverflowError), false);
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Entry points that are platform specific. // Entry points that are platform specific.
// Build this early so it's available for the interpreter.
StubRoutines::_throw_StackOverflowError_entry =
generate_throw_exception("StackOverflowError throw_exception",
CAST_FROM_FN_PTR(address, SharedRuntime::throw_StackOverflowError), false);
if (UseCRC32Intrinsics) { if (UseCRC32Intrinsics) {
// We have no CRC32 table on z/Architecture. // We have no CRC32 table on z/Architecture.

View File

@ -1112,16 +1112,21 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
// top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state // top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
__ add2reg(top_frame_size, __ add2reg(top_frame_size,
frame::z_top_ijava_frame_abi_size + frame::z_top_ijava_frame_abi_size +
frame::z_ijava_state_size + frame::z_ijava_state_size +
frame::interpreter_frame_monitor_size() * wordSize, frame::interpreter_frame_monitor_size() * wordSize,
max_stack); max_stack);
// Check if there's room for the new frame... if (!native_call) {
Register frame_size = max_stack; // Reuse the regiser for max_stack. // Stack overflow check.
__ z_lgr(frame_size, Z_SP); // Native calls don't need the stack size check since they have no
__ z_sgr(frame_size, sp_after_resize); // expression stack and the arguments are already on the stack and
__ z_agr(frame_size, top_frame_size); // we only add a handful of words to the stack.
generate_stack_overflow_check(frame_size, fp/*tmp1*/); Register frame_size = max_stack; // Reuse the regiser for max_stack.
__ z_lgr(frame_size, Z_SP);
__ z_sgr(frame_size, sp_after_resize);
__ z_agr(frame_size, top_frame_size);
generate_stack_overflow_check(frame_size, fp/*tmp1*/);
}
DEBUG_ONLY(__ z_cg(Z_R14, _z_abi16(return_pc), Z_SP)); DEBUG_ONLY(__ z_cg(Z_R14, _z_abi16(return_pc), Z_SP));
__ asm_assert_eq("killed Z_R14", 0); __ asm_assert_eq("killed Z_R14", 0);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -694,6 +694,7 @@ void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) {
int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned) { int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType type, bool wide, bool unaligned) {
int store_offset; int store_offset;
if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) { if (!Assembler::is_simm13(offset + (type == T_LONG) ? wordSize : 0)) {
assert(base != O7, "destroying register");
assert(!unaligned, "can't handle this"); assert(!unaligned, "can't handle this");
// for offsets larger than a simm13 we setup the offset in O7 // for offsets larger than a simm13 we setup the offset in O7
__ set(offset, O7); __ set(offset, O7);
@ -712,9 +713,12 @@ int LIR_Assembler::store(LIR_Opr from_reg, Register base, int offset, BasicType
case T_LONG : case T_LONG :
#ifdef _LP64 #ifdef _LP64
if (unaligned || PatchALot) { if (unaligned || PatchALot) {
__ srax(from_reg->as_register_lo(), 32, O7); // Don't use O7 here because it may be equal to 'base' (see LIR_Assembler::reg2mem)
assert(G3_scratch != base, "can't handle this");
assert(G3_scratch != from_reg->as_register_lo(), "can't handle this");
__ srax(from_reg->as_register_lo(), 32, G3_scratch);
__ stw(from_reg->as_register_lo(), base, offset + lo_word_offset_in_bytes); __ stw(from_reg->as_register_lo(), base, offset + lo_word_offset_in_bytes);
__ stw(O7, base, offset + hi_word_offset_in_bytes); __ stw(G3_scratch, base, offset + hi_word_offset_in_bytes);
} else { } else {
__ stx(from_reg->as_register_lo(), base, offset); __ stx(from_reg->as_register_lo(), base, offset);
} }
@ -821,7 +825,7 @@ int LIR_Assembler::load(Register base, int offset, LIR_Opr to_reg, BasicType typ
case T_SHORT : __ ldsh(base, offset, to_reg->as_register()); break; case T_SHORT : __ ldsh(base, offset, to_reg->as_register()); break;
case T_INT : __ ld(base, offset, to_reg->as_register()); break; case T_INT : __ ld(base, offset, to_reg->as_register()); break;
case T_LONG : case T_LONG :
if (!unaligned) { if (!unaligned && !PatchALot) {
#ifdef _LP64 #ifdef _LP64
__ ldx(base, offset, to_reg->as_register_lo()); __ ldx(base, offset, to_reg->as_register_lo());
#else #else
@ -1297,7 +1301,7 @@ void LIR_Assembler::mem2reg(LIR_Opr src_opr, LIR_Opr dest, BasicType type,
disp_reg = O7; disp_reg = O7;
} }
} else if (unaligned || PatchALot) { } else if (unaligned || PatchALot) {
__ add(src, addr->index()->as_register(), O7); __ add(src, addr->index()->as_pointer_register(), O7);
src = O7; src = O7;
} else { } else {
disp_reg = addr->index()->as_pointer_register(); disp_reg = addr->index()->as_pointer_register();
@ -1424,7 +1428,7 @@ void LIR_Assembler::reg2mem(LIR_Opr from_reg, LIR_Opr dest, BasicType type,
disp_reg = O7; disp_reg = O7;
} }
} else if (unaligned || PatchALot) { } else if (unaligned || PatchALot) {
__ add(src, addr->index()->as_register(), O7); __ add(src, addr->index()->as_pointer_register(), O7);
src = O7; src = O7;
} else { } else {
disp_reg = addr->index()->as_pointer_register(); disp_reg = addr->index()->as_pointer_register();

View File

@ -3499,12 +3499,12 @@ void MacroAssembler::movdqu(XMMRegister dst, XMMRegister src) {
} }
} }
void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src) { void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg) {
if (reachable(src)) { if (reachable(src)) {
movdqu(dst, as_Address(src)); movdqu(dst, as_Address(src));
} else { } else {
lea(rscratch1, src); lea(scratchReg, src);
movdqu(dst, Address(rscratch1, 0)); movdqu(dst, Address(scratchReg, 0));
} }
} }

View File

@ -1085,7 +1085,7 @@ public:
void movdqu(Address dst, XMMRegister src); void movdqu(Address dst, XMMRegister src);
void movdqu(XMMRegister dst, Address src); void movdqu(XMMRegister dst, Address src);
void movdqu(XMMRegister dst, XMMRegister src); void movdqu(XMMRegister dst, XMMRegister src);
void movdqu(XMMRegister dst, AddressLiteral src); void movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg = rscratch1);
// AVX Unaligned forms // AVX Unaligned forms
void vmovdqu(Address dst, XMMRegister src); void vmovdqu(Address dst, XMMRegister src);
void vmovdqu(XMMRegister dst, Address src); void vmovdqu(XMMRegister dst, Address src);

View File

@ -817,7 +817,7 @@ enum {
movl(d, Address(CTX, 4*3)); movl(d, Address(CTX, 4*3));
movl(e, Address(CTX, 4*4)); movl(e, Address(CTX, 4*4));
movl(f, Address(CTX, 4*5)); movl(f, Address(CTX, 4*5));
movl(g, Address(CTX, 4*6)); // load g - r10 after it is used as scratch
movl(h, Address(CTX, 4*7)); movl(h, Address(CTX, 4*7));
pshuffle_byte_flip_mask_addr = pshuffle_byte_flip_mask; pshuffle_byte_flip_mask_addr = pshuffle_byte_flip_mask;
@ -825,6 +825,8 @@ enum {
vmovdqu(SHUF_00BA, ExternalAddress(pshuffle_byte_flip_mask_addr + 32)); //[_SHUF_00BA wrt rip] vmovdqu(SHUF_00BA, ExternalAddress(pshuffle_byte_flip_mask_addr + 32)); //[_SHUF_00BA wrt rip]
vmovdqu(SHUF_DC00, ExternalAddress(pshuffle_byte_flip_mask_addr + 64)); //[_SHUF_DC00 wrt rip] vmovdqu(SHUF_DC00, ExternalAddress(pshuffle_byte_flip_mask_addr + 64)); //[_SHUF_DC00 wrt rip]
movl(g, Address(CTX, 4*6));
movq(Address(rsp, _CTX), CTX); // store movq(Address(rsp, _CTX), CTX); // store
bind(loop0); bind(loop0);
@ -977,7 +979,7 @@ bind(only_one_block);
movl(d, Address(CTX, 4*3)); // 0xa54ff53a movl(d, Address(CTX, 4*3)); // 0xa54ff53a
movl(e, Address(CTX, 4*4)); // 0x510e527f movl(e, Address(CTX, 4*4)); // 0x510e527f
movl(f, Address(CTX, 4*5)); // 0x9b05688c movl(f, Address(CTX, 4*5)); // 0x9b05688c
movl(g, Address(CTX, 4*6)); // 0x1f83d9ab // load g - r10 after use as scratch
movl(h, Address(CTX, 4*7)); // 0x5be0cd19 movl(h, Address(CTX, 4*7)); // 0x5be0cd19
@ -986,6 +988,8 @@ bind(only_one_block);
vmovdqu(SHUF_00BA, ExternalAddress(pshuffle_byte_flip_mask_addr + 32)); //[_SHUF_00BA wrt rip] vmovdqu(SHUF_00BA, ExternalAddress(pshuffle_byte_flip_mask_addr + 32)); //[_SHUF_00BA wrt rip]
vmovdqu(SHUF_DC00, ExternalAddress(pshuffle_byte_flip_mask_addr + 64)); //[_SHUF_DC00 wrt rip] vmovdqu(SHUF_DC00, ExternalAddress(pshuffle_byte_flip_mask_addr + 64)); //[_SHUF_DC00 wrt rip]
movl(g, Address(CTX, 4*6)); // 0x1f83d9ab
movq(Address(rsp, _CTX), CTX); movq(Address(rsp, _CTX), CTX);
jmpb(do_last_block); jmpb(do_last_block);
@ -1154,9 +1158,8 @@ void MacroAssembler::sha512_AVX2_one_round_and_schedule(
// Move to appropriate lanes for calculating w[16] and w[17] // Move to appropriate lanes for calculating w[16] and w[17]
vperm2f128(xmm4, xmm0, xmm0, 0); //xmm4 = W[-16] + W[-7] + s0{ BABA } vperm2f128(xmm4, xmm0, xmm0, 0); //xmm4 = W[-16] + W[-7] + s0{ BABA }
address MASK_YMM_LO = StubRoutines::x86::pshuffle_byte_flip_mask_addr_sha512();
//Move to appropriate lanes for calculating w[18] and w[19] //Move to appropriate lanes for calculating w[18] and w[19]
vpand(xmm0, xmm0, ExternalAddress(MASK_YMM_LO + 32), AVX_256bit); //xmm0 = W[-16] + W[-7] + s0{ DC00 } vpand(xmm0, xmm0, xmm10, AVX_256bit); //xmm0 = W[-16] + W[-7] + s0{ DC00 }
//Calculate w[16] and w[17] in both 128 bit lanes //Calculate w[16] and w[17] in both 128 bit lanes
//Calculate sigma1 for w[16] and w[17] on both 128 bit lanes //Calculate sigma1 for w[16] and w[17] on both 128 bit lanes
vperm2f128(xmm2, xmm7, xmm7, 17); //xmm2 = W[-2] {BABA} vperm2f128(xmm2, xmm7, xmm7, 17); //xmm2 = W[-2] {BABA}
@ -1250,6 +1253,7 @@ void MacroAssembler::sha512_AVX2(XMMRegister msg, XMMRegister state0, XMMRegiste
const XMMRegister& XFER = xmm0; // YTMP0 const XMMRegister& XFER = xmm0; // YTMP0
const XMMRegister& BYTE_FLIP_MASK = xmm9; // ymm9 const XMMRegister& BYTE_FLIP_MASK = xmm9; // ymm9
const XMMRegister& YMM_MASK_LO = xmm10; // ymm10
#ifdef _WIN64 #ifdef _WIN64
const Register& INP = rcx; //1st arg const Register& INP = rcx; //1st arg
const Register& CTX = rdx; //2nd arg const Register& CTX = rdx; //2nd arg
@ -1368,11 +1372,14 @@ void MacroAssembler::sha512_AVX2(XMMRegister msg, XMMRegister state0, XMMRegiste
movq(d, Address(CTX, 8 * 3)); movq(d, Address(CTX, 8 * 3));
movq(e, Address(CTX, 8 * 4)); movq(e, Address(CTX, 8 * 4));
movq(f, Address(CTX, 8 * 5)); movq(f, Address(CTX, 8 * 5));
movq(g, Address(CTX, 8 * 6)); // load g - r10 after it is used as scratch
movq(h, Address(CTX, 8 * 7)); movq(h, Address(CTX, 8 * 7));
pshuffle_byte_flip_mask_addr = pshuffle_byte_flip_mask_sha512; pshuffle_byte_flip_mask_addr = pshuffle_byte_flip_mask_sha512;
vmovdqu(BYTE_FLIP_MASK, ExternalAddress(pshuffle_byte_flip_mask_addr + 0)); //PSHUFFLE_BYTE_FLIP_MASK wrt rip vmovdqu(BYTE_FLIP_MASK, ExternalAddress(pshuffle_byte_flip_mask_addr + 0)); //PSHUFFLE_BYTE_FLIP_MASK wrt rip
vmovdqu(YMM_MASK_LO, ExternalAddress(pshuffle_byte_flip_mask_addr + 32));
movq(g, Address(CTX, 8 * 6));
bind(loop0); bind(loop0);
lea(TBL, ExternalAddress(K512_W)); lea(TBL, ExternalAddress(K512_W));

View File

@ -3207,7 +3207,7 @@ class StubGenerator: public StubCodeGenerator {
const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16)
#else #else
const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64 const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64
const Register len_reg = r10; // pick the first volatile windows register const Register len_reg = r11; // pick the volatile windows register
#endif #endif
const Register pos = rax; const Register pos = rax;
@ -3404,7 +3404,7 @@ class StubGenerator: public StubCodeGenerator {
const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16)
#else #else
const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64 const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64
const Register len_reg = r10; // pick the first volatile windows register const Register len_reg = r11; // pick the volatile windows register
#endif #endif
const Register pos = rax; const Register pos = rax;
@ -3930,7 +3930,7 @@ class StubGenerator: public StubCodeGenerator {
__ push(rbx); // Save RBX __ push(rbx); // Save RBX
__ movdqu(xmm_curr_counter, Address(counter, 0x00)); // initialize counter with initial counter __ movdqu(xmm_curr_counter, Address(counter, 0x00)); // initialize counter with initial counter
__ movdqu(xmm_counter_shuf_mask, ExternalAddress(StubRoutines::x86::counter_shuffle_mask_addr())); __ movdqu(xmm_counter_shuf_mask, ExternalAddress(StubRoutines::x86::counter_shuffle_mask_addr()), pos); // pos as scratch
__ pshufb(xmm_curr_counter, xmm_counter_shuf_mask); //counter is shuffled __ pshufb(xmm_curr_counter, xmm_counter_shuf_mask); //counter is shuffled
__ movptr(pos, 0); __ movptr(pos, 0);
@ -3953,7 +3953,7 @@ class StubGenerator: public StubCodeGenerator {
__ movl(Address(used_addr, 0), used); __ movl(Address(used_addr, 0), used);
// key length could be only {11, 13, 15} * 4 = {44, 52, 60} // key length could be only {11, 13, 15} * 4 = {44, 52, 60}
__ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr()), rbx); // rbx as scratch
__ movl(rbx, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); __ movl(rbx, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)));
__ cmpl(rbx, 52); __ cmpl(rbx, 52);
__ jcc(Assembler::equal, L_multiBlock_loopTop[1]); __ jcc(Assembler::equal, L_multiBlock_loopTop[1]);

View File

@ -37,6 +37,7 @@ import jdk.tools.jaotc.binformat.Symbol.Binding;
import jdk.tools.jaotc.binformat.Symbol.Kind; import jdk.tools.jaotc.binformat.Symbol.Kind;
import jdk.tools.jaotc.binformat.elf.JELFRelocObject; import jdk.tools.jaotc.binformat.elf.JELFRelocObject;
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
/** /**
* A format-agnostic container class that holds various components of a binary. * A format-agnostic container class that holds various components of a binary.
@ -257,9 +258,9 @@ public class BinaryContainer implements SymbolTable {
* prefix {@code prefix}. It also initializes internal code container, symbol table and * prefix {@code prefix}. It also initializes internal code container, symbol table and
* relocation tables. * relocation tables.
*/ */
public BinaryContainer(GraalHotSpotVMConfig config, String jvmVersion) { public BinaryContainer(GraalHotSpotVMConfig graalHotSpotVMConfig, GraphBuilderConfiguration graphBuilderConfig, String jvmVersion) {
this.codeSegmentSize = config.codeSegmentSize; this.codeSegmentSize = graalHotSpotVMConfig.codeSegmentSize;
this.codeEntryAlignment = config.codeEntryAlignment; this.codeEntryAlignment = graalHotSpotVMConfig.codeEntryAlignment;
// read only, code // read only, code
codeContainer = new CodeContainer(".text", this); codeContainer = new CodeContainer(".text", this);
@ -289,30 +290,31 @@ public class BinaryContainer implements SymbolTable {
addGlobalSymbols(); addGlobalSymbols();
recordConfiguration(config); recordConfiguration(graalHotSpotVMConfig, graphBuilderConfig);
} }
private void recordConfiguration(GraalHotSpotVMConfig config) { private void recordConfiguration(GraalHotSpotVMConfig graalHotSpotVMConfig, GraphBuilderConfiguration graphBuilderConfig) {
// @formatter:off // @formatter:off
boolean[] booleanFlags = { config.cAssertions, // Debug VM boolean[] booleanFlags = { graalHotSpotVMConfig.cAssertions, // Debug VM
config.useCompressedOops, graalHotSpotVMConfig.useCompressedOops,
config.useCompressedClassPointers, graalHotSpotVMConfig.useCompressedClassPointers,
config.compactFields, graalHotSpotVMConfig.compactFields,
config.useG1GC, graalHotSpotVMConfig.useG1GC,
config.useCMSGC, graalHotSpotVMConfig.useCMSGC,
config.useTLAB, graalHotSpotVMConfig.useTLAB,
config.useBiasedLocking, graalHotSpotVMConfig.useBiasedLocking,
TieredAOT.getValue(), TieredAOT.getValue(),
config.enableContended, graalHotSpotVMConfig.enableContended,
config.restrictContended, graalHotSpotVMConfig.restrictContended,
graphBuilderConfig.omitAssertions()
}; };
int[] intFlags = { config.narrowOopShift, int[] intFlags = { graalHotSpotVMConfig.narrowOopShift,
config.narrowKlassShift, graalHotSpotVMConfig.narrowKlassShift,
config.contendedPaddingWidth, graalHotSpotVMConfig.contendedPaddingWidth,
config.fieldsAllocationStyle, graalHotSpotVMConfig.fieldsAllocationStyle,
config.objectAlignment, graalHotSpotVMConfig.objectAlignment,
config.codeSegmentSize, graalHotSpotVMConfig.codeSegmentSize,
}; };
// @formatter:on // @formatter:on

View File

@ -77,10 +77,14 @@ public class AOTBackend {
this.filters = filters; this.filters = filters;
providers = backend.getProviders(); providers = backend.getProviders();
codeCache = providers.getCodeCache(); codeCache = providers.getCodeCache();
graphBuilderSuite = initGraphBuilderSuite(backend); graphBuilderSuite = initGraphBuilderSuite(backend, main.options.compileWithAssertions);
highTierContext = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.ALL); highTierContext = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.ALL);
} }
public PhaseSuite<HighTierContext> getGraphBuilderSuite() {
return graphBuilderSuite;
}
private Suites getSuites() { private Suites getSuites() {
// create suites every time, as we modify options for the compiler // create suites every time, as we modify options for the compiler
return backend.getSuites().getDefaultSuites(); return backend.getSuites().getDefaultSuites();
@ -146,14 +150,14 @@ public class AOTBackend {
return backend.getRuntime().getVMConfig().cAssertions; return backend.getRuntime().getVMConfig().cAssertions;
} }
private static PhaseSuite<HighTierContext> initGraphBuilderSuite(HotSpotBackend backend) { private static PhaseSuite<HighTierContext> initGraphBuilderSuite(HotSpotBackend backend, boolean compileWithAssertions) {
PhaseSuite<HighTierContext> graphBuilderSuite = backend.getSuites().getDefaultGraphBuilderSuite().copy(); PhaseSuite<HighTierContext> graphBuilderSuite = backend.getSuites().getDefaultGraphBuilderSuite().copy();
ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class); ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class);
GraphBuilderConfiguration baseConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig(); GraphBuilderConfiguration baseConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig();
// Use all default plugins. // Use all default plugins.
Plugins plugins = baseConfig.getPlugins(); Plugins plugins = baseConfig.getPlugins();
GraphBuilderConfiguration aotConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration aotConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true).withOmitAssertions(!compileWithAssertions);
iterator.next(); iterator.next();
iterator.remove(); iterator.remove();

View File

@ -45,6 +45,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -54,8 +55,14 @@ import jdk.tools.jaotc.collect.ClassCollector;
import jdk.tools.jaotc.utils.Timer; import jdk.tools.jaotc.utils.Timer;
import org.graalvm.compiler.api.runtime.GraalJVMCICompiler; import org.graalvm.compiler.api.runtime.GraalJVMCICompiler;
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
import org.graalvm.compiler.hotspot.HotSpotHostBackend; import org.graalvm.compiler.hotspot.HotSpotHostBackend;
import org.graalvm.compiler.java.GraphBuilderPhase;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
import org.graalvm.compiler.phases.BasePhase;
import org.graalvm.compiler.phases.PhaseSuite;
import org.graalvm.compiler.phases.tiers.HighTierContext;
import org.graalvm.compiler.runtime.RuntimeProvider; import org.graalvm.compiler.runtime.RuntimeProvider;
import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.MetaAccessProvider;
@ -144,11 +151,16 @@ public class Main implements LogPrinter {
void process(Main task, String opt, String arg) { void process(Main task, String opt, String arg) {
task.options.methodList = arg; task.options.methodList = arg;
} }
}, new Option(" --compile-for-tiered Generated profiling code for tiered compilation", false, "--compile-for-tiered") { }, new Option(" --compile-for-tiered Generate profiling code for tiered compilation", false, "--compile-for-tiered") {
@Override @Override
void process(Main task, String opt, String arg) { void process(Main task, String opt, String arg) {
TieredAOT.setValue(true); TieredAOT.setValue(true);
} }
}, new Option(" --compile-with-assertions Compile assertions", false, "--compile-with-assertions") {
@Override
void process(Main task, String opt, String arg) {
task.options.compileWithAssertions = true;
}
}, new Option(" --classpath <path> Specify where to find user class files", true, "--classpath", "--class-path") { }, new Option(" --classpath <path> Specify where to find user class files", true, "--classpath", "--class-path") {
@Override @Override
void process(Main task, String opt, String arg) { void process(Main task, String opt, String arg) {
@ -225,15 +237,16 @@ public class Main implements LogPrinter {
*/ */
private static final int COMPILER_THREADS = 16; private static final int COMPILER_THREADS = 16;
int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors()); public int threads = Integer.min(COMPILER_THREADS, Runtime.getRuntime().availableProcessors());
public boolean ignoreClassLoadingErrors; public boolean ignoreClassLoadingErrors;
public boolean exitOnError; public boolean exitOnError;
boolean info; public boolean info;
boolean verbose; public boolean verbose;
boolean debug; public boolean debug;
boolean help; public boolean help;
boolean version; public boolean version;
public boolean compileWithAssertions;
} }
/* package */final Options options = new Options(); /* package */final Options options = new Options();
@ -356,6 +369,11 @@ public class Main implements LogPrinter {
AOTCompiler compiler = new AOTCompiler(this, aotBackend, options.threads); AOTCompiler compiler = new AOTCompiler(this, aotBackend, options.threads);
classes = compiler.compileClasses(classes); classes = compiler.compileClasses(classes);
GraalHotSpotVMConfig graalHotSpotVMConfig = runtime.getVMConfig();
PhaseSuite<HighTierContext> graphBuilderSuite = aotBackend.getGraphBuilderSuite();
ListIterator<BasePhase<? super HighTierContext>> iterator = graphBuilderSuite.findPhase(GraphBuilderPhase.class);
GraphBuilderConfiguration graphBuilderConfig = ((GraphBuilderPhase) iterator.previous()).getGraphBuilderConfig();
// Free memory! // Free memory!
try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) { try (Timer t = options.verbose ? new Timer(this, "Freeing memory") : null) {
printMemoryUsage(); printMemoryUsage();
@ -364,7 +382,7 @@ public class Main implements LogPrinter {
System.gc(); System.gc();
} }
BinaryContainer binaryContainer = new BinaryContainer(runtime.getVMConfig(), JVM_VERSION); BinaryContainer binaryContainer = new BinaryContainer(graalHotSpotVMConfig, graphBuilderConfig, JVM_VERSION);
DataBuilder dataBuilder = new DataBuilder(this, backend, classes, binaryContainer); DataBuilder dataBuilder = new DataBuilder(this, backend, classes, binaryContainer);
dataBuilder.prepareData(); dataBuilder.prepareData();

View File

@ -22,7 +22,6 @@
*/ */
package org.graalvm.compiler.hotspot.meta; package org.graalvm.compiler.hotspot.meta;
import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode; import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode;
import static org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider.FieldReadEnabledInImmutableCode; import static org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider.FieldReadEnabledInImmutableCode;
@ -112,11 +111,6 @@ public final class HotSpotNodePlugin implements NodePlugin, TypePlugin {
return true; return true;
} }
} }
if (GeneratePIC.getValue()) {
if (field.isSynthetic() && field.getName().startsWith("$assertionsDisabled")) {
return tryReadField(b, field, null);
}
}
if (b.parsingIntrinsic() && wordOperationPlugin.handleLoadStaticField(b, field)) { if (b.parsingIntrinsic() && wordOperationPlugin.handleLoadStaticField(b, field)) {
return true; return true;
} }

View File

@ -144,6 +144,42 @@ frame os::fetch_frame_from_context(const void* ucVoid) {
return frame(sp, epc.pc()); return frame(sp, epc.pc());
} }
bool os::Linux::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
address pc = (address) os::Linux::ucontext_get_pc(uc);
if (Interpreter::contains(pc)) {
// Interpreter performs stack banging after the fixed frame header has
// been generated while the compilers perform it before. To maintain
// semantic consistency between interpreted and compiled frames, the
// method returns the Java sender of the current frame.
*fr = os::fetch_frame_from_context(uc);
if (!fr->is_first_java_frame()) {
assert(fr->safe_for_sender(thread), "Safety check");
*fr = fr->java_sender();
}
} else {
// More complex code with compiled code.
assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
CodeBlob* cb = CodeCache::find_blob(pc);
if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
// Not sure where the pc points to, fallback to default
// stack overflow handling. In compiled code, we bang before
// the frame is complete.
return false;
} else {
intptr_t* fp = os::Linux::ucontext_get_fp(uc);
intptr_t* sp = os::Linux::ucontext_get_sp(uc);
*fr = frame(sp, (address)*sp);
if (!fr->is_java_frame()) {
assert(fr->safe_for_sender(thread), "Safety check");
assert(!fr->is_first_frame(), "Safety check");
*fr = fr->java_sender();
}
}
}
assert(fr->is_java_frame(), "Safety check");
return true;
}
frame os::get_sender_for_C_frame(frame* fr) { frame os::get_sender_for_C_frame(frame* fr) {
if (*fr->sp() == 0) { if (*fr->sp() == 0) {
// fr is the last C frame. // fr is the last C frame.
@ -279,13 +315,31 @@ JVM_handle_linux_signal(int sig,
if (thread->on_local_stack(addr)) { if (thread->on_local_stack(addr)) {
// stack overflow // stack overflow
if (thread->in_stack_yellow_reserved_zone(addr)) { if (thread->in_stack_yellow_reserved_zone(addr)) {
thread->disable_stack_yellow_reserved_zone();
if (thread->thread_state() == _thread_in_Java) { if (thread->thread_state() == _thread_in_Java) {
if (thread->in_stack_reserved_zone(addr)) {
frame fr;
if (os::Linux::get_frame_at_stack_banging_point(thread, uc, &fr)) {
assert(fr.is_java_frame(), "Must be a Javac frame");
frame activation =
SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr);
if (activation.sp() != NULL) {
thread->disable_stack_reserved_zone();
if (activation.is_interpreted_frame()) {
thread->set_reserved_stack_activation((address)activation.fp());
} else {
thread->set_reserved_stack_activation((address)activation.unextended_sp());
}
return 1;
}
}
}
// Throw a stack overflow exception. // Throw a stack overflow exception.
// Guard pages will be reenabled while unwinding the stack. // Guard pages will be reenabled while unwinding the stack.
thread->disable_stack_yellow_reserved_zone();
stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW); stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
} else { } else {
// Thread was in the vm or native code. Return and try to finish. // Thread was in the vm or native code. Return and try to finish.
thread->disable_stack_yellow_reserved_zone();
return 1; return 1;
} }
} else if (thread->in_stack_red_zone(addr)) { } else if (thread->in_stack_red_zone(addr)) {

View File

@ -650,6 +650,7 @@ bool InstructForm::is_wide_memory_kill(FormDict &globals) const {
if( strcmp(_matrule->_opType,"MemBarReleaseLock") == 0 ) return true; if( strcmp(_matrule->_opType,"MemBarReleaseLock") == 0 ) return true;
if( strcmp(_matrule->_opType,"MemBarAcquireLock") == 0 ) return true; if( strcmp(_matrule->_opType,"MemBarAcquireLock") == 0 ) return true;
if( strcmp(_matrule->_opType,"MemBarStoreStore") == 0 ) return true; if( strcmp(_matrule->_opType,"MemBarStoreStore") == 0 ) return true;
if( strcmp(_matrule->_opType,"MemBarVolatile") == 0 ) return true;
if( strcmp(_matrule->_opType,"StoreFence") == 0 ) return true; if( strcmp(_matrule->_opType,"StoreFence") == 0 ) return true;
if( strcmp(_matrule->_opType,"LoadFence") == 0 ) return true; if( strcmp(_matrule->_opType,"LoadFence") == 0 ) return true;

View File

@ -25,6 +25,7 @@
#include "aot/aotCodeHeap.hpp" #include "aot/aotCodeHeap.hpp"
#include "aot/aotLoader.hpp" #include "aot/aotLoader.hpp"
#include "classfile/javaAssertions.hpp"
#include "gc/g1/heapRegion.hpp" #include "gc/g1/heapRegion.hpp"
#include "gc/shared/gcLocker.hpp" #include "gc/shared/gcLocker.hpp"
#include "interpreter/abstractInterpreter.hpp" #include "interpreter/abstractInterpreter.hpp"
@ -294,6 +295,8 @@ void AOTCodeHeap::publish_aot(const methodHandle& mh, AOTMethodData* method_data
// When the AOT compiler compiles something big we fail to generate metadata // When the AOT compiler compiles something big we fail to generate metadata
// in CodeInstaller::gather_metadata. In that case the scopes_pcs_begin == scopes_pcs_end. // in CodeInstaller::gather_metadata. In that case the scopes_pcs_begin == scopes_pcs_end.
// In all successful cases we always have 2 entries of scope pcs. // In all successful cases we always have 2 entries of scope pcs.
log_info(aot, class, resolve)("Failed to load %s (no metadata available)", mh->name_and_sig_as_C_string());
_code_to_aot[code_id]._state = invalid;
return; return;
} }
@ -706,6 +709,12 @@ bool AOTCodeHeap::load_klass_data(instanceKlassHandle kh, Thread* thread) {
return false; return false;
} }
if (_lib->config()->_omitAssertions && JavaAssertions::enabled(kh->name()->as_C_string(), kh->class_loader() == NULL)) {
log_trace(aot, class, load)("class %s in %s does not have java assertions in compiled code, but assertions are enabled for this execution.", kh->internal_name(), _lib->name());
sweep_dependent_methods(klass_data);
return false;
}
NOT_PRODUCT( aot_klasses_found++; ) NOT_PRODUCT( aot_klasses_found++; )
log_trace(aot, class, load)("found %s in %s for classloader %p tid=" INTPTR_FORMAT, kh->internal_name(), _lib->name(), kh->class_loader_data(), p2i(thread)); log_trace(aot, class, load)("found %s in %s for classloader %p tid=" INTPTR_FORMAT, kh->internal_name(), _lib->name(), kh->class_loader_data(), p2i(thread));
@ -714,7 +723,7 @@ bool AOTCodeHeap::load_klass_data(instanceKlassHandle kh, Thread* thread) {
// Set klass's Resolve (second) got cell. // Set klass's Resolve (second) got cell.
_metaspace_got[klass_data->_got_index] = kh(); _metaspace_got[klass_data->_got_index] = kh();
// Initialize global symbols of the DSO to the correspondingVM symbol values. // Initialize global symbols of the DSO to the corresponding VM symbol values.
link_global_lib_symbols(); link_global_lib_symbols();
int methods_offset = klass_data->_compiled_methods_offset; int methods_offset = klass_data->_compiled_methods_offset;

View File

@ -88,7 +88,7 @@ typedef struct {
} AOTHeader; } AOTHeader;
typedef struct { typedef struct {
enum { CONFIG_SIZE = 11 + 7 * 4 }; enum { CONFIG_SIZE = 12 + 7 * 4 };
int _config_size; int _config_size;
int _narrowOopShift; int _narrowOopShift;
int _narrowKlassShift; int _narrowKlassShift;
@ -108,6 +108,7 @@ typedef struct {
bool _tieredAOT; bool _tieredAOT;
bool _enableContended; bool _enableContended;
bool _restrictContended; bool _restrictContended;
bool _omitAssertions;
} AOTConfiguration; } AOTConfiguration;
class AOTLib : public CHeapObj<mtCode> { class AOTLib : public CHeapObj<mtCode> {

View File

@ -94,7 +94,7 @@ ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Depen
_metaspace(NULL), _unloading(false), _klasses(NULL), _metaspace(NULL), _unloading(false), _klasses(NULL),
_modules(NULL), _packages(NULL), _modules(NULL), _packages(NULL),
_claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
_next(NULL), _dependencies(dependencies), _shared_class_loader_id(-1), _next(NULL), _dependencies(dependencies),
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true, _metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true,
Monitor::_safepoint_check_never)) { Monitor::_safepoint_check_never)) {
TRACE_INIT_ID(this); TRACE_INIT_ID(this);

View File

@ -204,9 +204,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
// Support for walking class loader data objects // Support for walking class loader data objects
ClassLoaderData* _next; /// Next loader_datas created ClassLoaderData* _next; /// Next loader_datas created
// CDS
int _shared_class_loader_id;
// ReadOnly and ReadWrite metaspaces (static because only on the null // ReadOnly and ReadWrite metaspaces (static because only on the null
// class loader for now). // class loader for now).
static Metaspace* _ro_metaspace; static Metaspace* _ro_metaspace;
@ -338,15 +335,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
Metaspace* rw_metaspace(); Metaspace* rw_metaspace();
void initialize_shared_metaspaces(); void initialize_shared_metaspaces();
int shared_class_loader_id() const {
return _shared_class_loader_id;
}
void set_shared_class_loader_id(int id) {
assert(id >= 0, "sanity");
assert(_shared_class_loader_id <0, "cannot be assigned more than once");
_shared_class_loader_id = id;
}
TRACE_DEFINE_TRACE_ID_METHODS; TRACE_DEFINE_TRACE_ID_METHODS;
}; };

View File

@ -163,8 +163,8 @@ void java_lang_String::compute_offsets() {
Klass* k = SystemDictionary::String_klass(); Klass* k = SystemDictionary::String_klass();
compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::byte_array_signature()); compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::byte_array_signature());
compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); compute_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature());
compute_optional_offset(coder_offset, k, vmSymbols::coder_name(), vmSymbols::byte_signature()); compute_offset(coder_offset, k, vmSymbols::coder_name(), vmSymbols::byte_signature());
initialized = true; initialized = true;
} }
@ -3977,12 +3977,8 @@ void JavaClasses::check_offsets() {
// java.lang.String // java.lang.String
CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B"); CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B");
if (java_lang_String::has_hash_field()) { CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B");
}
if (java_lang_String::has_coder_field()) {
CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B");
}
// java.lang.Class // java.lang.Class

View File

@ -81,15 +81,6 @@ class java_lang_String : AllStatic {
static Handle create_from_platform_dependent_str(const char* str, TRAPS); static Handle create_from_platform_dependent_str(const char* str, TRAPS);
static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS); static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);
static bool has_hash_field() {
assert(initialized, "Must be initialized");
return (hash_offset > 0);
}
static bool has_coder_field() {
assert(initialized, "Must be initialized");
return (coder_offset > 0);
}
static void set_compact_strings(bool value); static void set_compact_strings(bool value);
static int value_offset_in_bytes() { static int value_offset_in_bytes() {

View File

@ -30,10 +30,8 @@
#include "oops/oopsHierarchy.hpp" #include "oops/oopsHierarchy.hpp"
void java_lang_String::set_coder(oop string, jbyte coder) { void java_lang_String::set_coder(oop string, jbyte coder) {
assert(initialized, "Must be initialized"); assert(initialized && (coder_offset > 0), "Must be initialized");
if (coder_offset > 0) { string->byte_field_put(coder_offset, coder);
string->byte_field_put(coder_offset, coder);
}
} }
void java_lang_String::set_value_raw(oop string, typeArrayOop buffer) { void java_lang_String::set_value_raw(oop string, typeArrayOop buffer) {
@ -61,15 +59,11 @@ unsigned int java_lang_String::hash(oop java_string) {
return java_string->int_field(hash_offset); return java_string->int_field(hash_offset);
} }
bool java_lang_String::is_latin1(oop java_string) { bool java_lang_String::is_latin1(oop java_string) {
assert(initialized, "Must be initialized"); assert(initialized && (coder_offset > 0), "Must be initialized");
assert(is_instance(java_string), "must be java_string"); assert(is_instance(java_string), "must be java_string");
if (coder_offset > 0) { jbyte coder = java_string->byte_field(coder_offset);
jbyte coder = java_string->byte_field(coder_offset); assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings");
assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings"); return coder == CODER_LATIN1;
return coder == CODER_LATIN1;
} else {
return false;
}
} }
int java_lang_String::length(oop java_string) { int java_lang_String::length(oop java_string) {
assert(initialized, "Must be initialized"); assert(initialized, "Must be initialized");

View File

@ -29,7 +29,6 @@
#include "classfile/dictionary.hpp" #include "classfile/dictionary.hpp"
class ClassFileStream; class ClassFileStream;
class SerializeClosure;
class SystemDictionaryShared: public SystemDictionary { class SystemDictionaryShared: public SystemDictionary {
public: public:
@ -79,8 +78,6 @@ public:
return NULL; return NULL;
} }
static void serialize(SerializeClosure* soc) {}
// The (non-application) CDS implementation supports only classes in the boot // The (non-application) CDS implementation supports only classes in the boot
// class loader, which ensures that the verification constraints are the same // class loader, which ensures that the verification constraints are the same
// during archive creation time and runtime. Thus we can do the constraint checks // during archive creation time and runtime. Thus we can do the constraint checks

View File

@ -149,16 +149,17 @@ void CodeCache::check_heap_sizes(size_t non_nmethod_size, size_t profiled_size,
size_t total_size = non_nmethod_size + profiled_size + non_profiled_size; size_t total_size = non_nmethod_size + profiled_size + non_profiled_size;
// Prepare error message // Prepare error message
const char* error = "Invalid code heap sizes"; const char* error = "Invalid code heap sizes";
err_msg message("NonNMethodCodeHeapSize (%zuK) + ProfiledCodeHeapSize (%zuK) + NonProfiledCodeHeapSize (%zuK) = %zuK", err_msg message("NonNMethodCodeHeapSize (" SIZE_FORMAT "K) + ProfiledCodeHeapSize (" SIZE_FORMAT "K)"
" + NonProfiledCodeHeapSize (" SIZE_FORMAT "K) = " SIZE_FORMAT "K",
non_nmethod_size/K, profiled_size/K, non_profiled_size/K, total_size/K); non_nmethod_size/K, profiled_size/K, non_profiled_size/K, total_size/K);
if (total_size > cache_size) { if (total_size > cache_size) {
// Some code heap sizes were explicitly set: total_size must be <= cache_size // Some code heap sizes were explicitly set: total_size must be <= cache_size
message.append(" is greater than ReservedCodeCacheSize (%zuK).", cache_size/K); message.append(" is greater than ReservedCodeCacheSize (" SIZE_FORMAT "K).", cache_size/K);
vm_exit_during_initialization(error, message); vm_exit_during_initialization(error, message);
} else if (all_set && total_size != cache_size) { } else if (all_set && total_size != cache_size) {
// All code heap sizes were explicitly set: total_size must equal cache_size // All code heap sizes were explicitly set: total_size must equal cache_size
message.append(" is not equal to ReservedCodeCacheSize (%zuK).", cache_size/K); message.append(" is not equal to ReservedCodeCacheSize (" SIZE_FORMAT "K).", cache_size/K);
vm_exit_during_initialization(error, message); vm_exit_during_initialization(error, message);
} }
} }
@ -267,7 +268,7 @@ void CodeCache::initialize_heaps() {
uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3); uint min_code_cache_size = CodeCacheMinimumUseSpace DEBUG_ONLY(* 3);
if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) { if (non_nmethod_size < (min_code_cache_size + code_buffers_size)) {
vm_exit_during_initialization(err_msg( vm_exit_during_initialization(err_msg(
"Not enough space in non-nmethod code heap to run VM: %zuK < %zuK", "Not enough space in non-nmethod code heap to run VM: " SIZE_FORMAT "K < " SIZE_FORMAT "K",
non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K)); non_nmethod_size/K, (min_code_cache_size + code_buffers_size)/K));
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -69,12 +69,12 @@ protected:
void initialize(HeapWord* bottom, HeapWord* end, size_t target_elem_size_in_bytes, size_t mapping_granularity_in_bytes) { void initialize(HeapWord* bottom, HeapWord* end, size_t target_elem_size_in_bytes, size_t mapping_granularity_in_bytes) {
assert(mapping_granularity_in_bytes > 0, "just checking"); assert(mapping_granularity_in_bytes > 0, "just checking");
assert(is_power_of_2(mapping_granularity_in_bytes), assert(is_power_of_2(mapping_granularity_in_bytes),
"mapping granularity must be power of 2, is %zd", mapping_granularity_in_bytes); "mapping granularity must be power of 2, is " SIZE_FORMAT, mapping_granularity_in_bytes);
assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0, assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0,
"bottom mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, "bottom mapping area address must be a multiple of mapping granularity " SIZE_FORMAT ", is " PTR_FORMAT,
mapping_granularity_in_bytes, p2i(bottom)); mapping_granularity_in_bytes, p2i(bottom));
assert((uintptr_t)end % mapping_granularity_in_bytes == 0, assert((uintptr_t)end % mapping_granularity_in_bytes == 0,
"end mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, "end mapping area address must be a multiple of mapping granularity " SIZE_FORMAT ", is " PTR_FORMAT,
mapping_granularity_in_bytes, p2i(end)); mapping_granularity_in_bytes, p2i(end));
size_t num_target_elems = pointer_delta(end, bottom, mapping_granularity_in_bytes); size_t num_target_elems = pointer_delta(end, bottom, mapping_granularity_in_bytes);
idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes; idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes;

View File

@ -554,7 +554,7 @@ JVMCIEnv::CodeInstallResult CodeInstaller::gather_metadata(Handle target, Handle
_constants = buffer.consts(); _constants = buffer.consts();
initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK); initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK); JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, false, CHECK_OK);
if (result != JVMCIEnv::ok) { if (result != JVMCIEnv::ok) {
return result; return result;
} }
@ -587,7 +587,7 @@ JVMCIEnv::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler, Hand
_constants = buffer.consts(); _constants = buffer.consts();
initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK); initialize_fields(target(), JNIHandles::resolve(compiled_code_obj), CHECK_OK);
JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, CHECK_OK); JVMCIEnv::CodeInstallResult result = initialize_buffer(buffer, true, CHECK_OK);
if (result != JVMCIEnv::ok) { if (result != JVMCIEnv::ok) {
return result; return result;
} }
@ -726,7 +726,7 @@ int CodeInstaller::estimate_stubs_size(TRAPS) {
} }
// perform data and call relocation on the CodeBuffer // perform data and call relocation on the CodeBuffer
JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer, TRAPS) { JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer, bool check_size, TRAPS) {
HandleMark hm; HandleMark hm;
objArrayHandle sites = this->sites(); objArrayHandle sites = this->sites();
int locs_buffer_size = sites->length() * (relocInfo::length_limit + sizeof(relocInfo)); int locs_buffer_size = sites->length() * (relocInfo::length_limit + sizeof(relocInfo));
@ -738,7 +738,7 @@ JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer,
int stubs_size = estimate_stubs_size(CHECK_OK); int stubs_size = estimate_stubs_size(CHECK_OK);
int total_size = round_to(_code_size, buffer.insts()->alignment()) + round_to(_constants_size, buffer.consts()->alignment()) + round_to(stubs_size, buffer.stubs()->alignment()); int total_size = round_to(_code_size, buffer.insts()->alignment()) + round_to(_constants_size, buffer.consts()->alignment()) + round_to(stubs_size, buffer.stubs()->alignment());
if (total_size > JVMCINMethodSizeLimit) { if (check_size && total_size > JVMCINMethodSizeLimit) {
return JVMCIEnv::code_too_large; return JVMCIEnv::code_too_large;
} }

View File

@ -227,7 +227,7 @@ protected:
int estimate_stubs_size(TRAPS); int estimate_stubs_size(TRAPS);
// perform data and call relocation on the CodeBuffer // perform data and call relocation on the CodeBuffer
JVMCIEnv::CodeInstallResult initialize_buffer(CodeBuffer& buffer, TRAPS); JVMCIEnv::CodeInstallResult initialize_buffer(CodeBuffer& buffer, bool check_size, TRAPS);
void assumption_NoFinalizableSubclass(Handle assumption); void assumption_NoFinalizableSubclass(Handle assumption);
void assumption_ConcreteSubtype(Handle assumption); void assumption_ConcreteSubtype(Handle assumption);

View File

@ -478,7 +478,7 @@ void LogConfiguration::describe(outputStream* out) {
void LogConfiguration::print_command_line_help(FILE* out) { void LogConfiguration::print_command_line_help(FILE* out) {
jio_fprintf(out, "-Xlog Usage: -Xlog[:[what][:[output][:[decorators][:output-options]]]]\n" jio_fprintf(out, "-Xlog Usage: -Xlog[:[what][:[output][:[decorators][:output-options]]]]\n"
"\t where 'what' is a combination of tags and levels on the form tag1[+tag2...][*][=level][,...]\n" "\t where 'what' is a combination of tags and levels of the form tag1[+tag2...][*][=level][,...]\n"
"\t Unless wildcard (*) is specified, only log messages tagged with exactly the tags specified will be matched.\n\n"); "\t Unless wildcard (*) is specified, only log messages tagged with exactly the tags specified will be matched.\n\n");
jio_fprintf(out, "Available log levels:\n"); jio_fprintf(out, "Available log levels:\n");
@ -514,6 +514,14 @@ void LogConfiguration::print_command_line_help(FILE* out) {
" -Xlog:gc\n" " -Xlog:gc\n"
"\t Log messages tagged with 'gc' tag using 'info' level to stdout, with default decorations.\n\n" "\t Log messages tagged with 'gc' tag using 'info' level to stdout, with default decorations.\n\n"
" -Xlog:gc,safepoint\n"
"\t Log messages tagged either with 'gc' or 'safepoint' tags, both using 'info' level, to stdout, with default decorations.\n"
"\t (Messages tagged with both 'gc' and 'safepoint' will not be logged.)\n\n"
" -Xlog:gc+ref=debug\n"
"\t Log messages tagged with both 'gc' and 'ref' tags, using 'debug' level, to stdout, with default decorations.\n"
"\t (Messages tagged only with one of the two tags will not be logged.)\n\n"
" -Xlog:gc=debug:file=gc.txt:none\n" " -Xlog:gc=debug:file=gc.txt:none\n"
"\t Log messages tagged with 'gc' tag using 'debug' level to file 'gc.txt' with no decorations.\n\n" "\t Log messages tagged with 'gc' tag using 'debug' level to file 'gc.txt' with no decorations.\n\n"

View File

@ -145,10 +145,6 @@ void MetaspaceShared::serialize(SerializeClosure* soc, GrowableArray<MemRegion>
StringTable::serialize(soc, string_space, space_size); StringTable::serialize(soc, string_space, space_size);
soc->do_tag(--tag); soc->do_tag(--tag);
// Dump/restore the misc information for system dictionary
SystemDictionaryShared::serialize(soc);
soc->do_tag(--tag);
soc->do_tag(666); soc->do_tag(666);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -2139,8 +2139,6 @@ void InstanceKlass::release_C_heap_structures(InstanceKlass* ik) {
} }
void InstanceKlass::release_C_heap_structures() { void InstanceKlass::release_C_heap_structures() {
assert(!this->is_shared(), "should not be called for a shared class");
// Can't release the constant pool here because the constant pool can be // Can't release the constant pool here because the constant pool can be
// deallocated separately from the InstanceKlass for default methods and // deallocated separately from the InstanceKlass for default methods and
// redefine classes. // redefine classes.
@ -2191,7 +2189,7 @@ void InstanceKlass::release_C_heap_structures() {
} }
// deallocate the cached class file // deallocate the cached class file
if (_cached_class_file != NULL) { if (_cached_class_file != NULL && !MetaspaceShared::is_in_shared_space(_cached_class_file)) {
os::free(_cached_class_file); os::free(_cached_class_file);
_cached_class_file = NULL; _cached_class_file = NULL;
} }

View File

@ -4348,20 +4348,16 @@ Node* GraphKit::load_String_value(Node* ctrl, Node* str) {
} }
Node* GraphKit::load_String_coder(Node* ctrl, Node* str) { Node* GraphKit::load_String_coder(Node* ctrl, Node* str) {
if (java_lang_String::has_coder_field()) { if (!CompactStrings) {
if (!CompactStrings) { return intcon(java_lang_String::CODER_UTF16);
return intcon(java_lang_String::CODER_UTF16);
}
int coder_offset = java_lang_String::coder_offset_in_bytes();
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
int coder_field_idx = C->get_alias_index(coder_field_type);
return make_load(ctrl, basic_plus_adr(str, str, coder_offset),
TypeInt::BYTE, T_BYTE, coder_field_idx, MemNode::unordered);
} else {
return intcon(0); // false
} }
int coder_offset = java_lang_String::coder_offset_in_bytes();
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
int coder_field_idx = C->get_alias_index(coder_field_type);
return make_load(ctrl, basic_plus_adr(str, str, coder_offset),
TypeInt::BYTE, T_BYTE, coder_field_idx, MemNode::unordered);
} }
void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) { void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) {

View File

@ -6335,7 +6335,7 @@ bool LibraryCallKit::inline_counterMode_AESCrypt(vmIntrinsics::ID id) {
//------------------------------get_key_start_from_aescrypt_object----------------------- //------------------------------get_key_start_from_aescrypt_object-----------------------
Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) { Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
#ifdef PPC64 #if defined(PPC64) || defined(S390)
// MixColumns for decryption can be reduced by preprocessing MixColumns with round keys. // MixColumns for decryption can be reduced by preprocessing MixColumns with round keys.
// Intel's extention is based on this optimization and AESCrypt generates round keys by preprocessing MixColumns. // Intel's extention is based on this optimization and AESCrypt generates round keys by preprocessing MixColumns.
// However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption. // However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption.

View File

@ -238,8 +238,8 @@ functionExit(JavaThread* thr)
size_t live_handles = handles->get_number_of_live_handles(); size_t live_handles = handles->get_number_of_live_handles();
if (live_handles > planned_capacity) { if (live_handles > planned_capacity) {
IN_VM( IN_VM(
tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu", tty->print_cr("WARNING: JNI local refs: " SIZE_FORMAT ", exceeds capacity: " SIZE_FORMAT,
live_handles, planned_capacity); live_handles, planned_capacity);
thr->print_stack(); thr->print_stack();
) )
// Complain just the once, reset to current + warn threshold // Complain just the once, reset to current + warn threshold

View File

@ -1246,7 +1246,7 @@ static jvmtiError JNICALL
<xsl:param name="name"/> <xsl:param name="name"/>
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<xsl:value-of select="$name"/> <xsl:value-of select="$name"/>
<xsl:text>=0x%zx</xsl:text> <xsl:text>=" SIZE_FORMAT_HEX "</xsl:text>
</xsl:template> </xsl:template>
<xsl:template match="jfloat|jdouble" mode="traceInFormat"> <xsl:template match="jfloat|jdouble" mode="traceInFormat">

View File

@ -469,14 +469,18 @@ void Flag::print_on(outputStream* st, bool withComments, bool printRanges) {
} }
if (!printRanges) { if (!printRanges) {
// Use some named constants to make code more readable.
const unsigned int nSpaces = 10;
const unsigned int maxFlagLen = 40 + nSpaces;
// The print below assumes that the flag name is 40 characters or less. // The print below assumes that the flag name is 40 characters or less.
// This works for most flags, but there are exceptions. Our longest flag // This works for most flags, but there are exceptions. Our longest flag
// name right now is UseAdaptiveGenerationSizePolicyAtMajorCollection and // name right now is UseAdaptiveGenerationSizePolicyAtMajorCollection and
// its minor collection buddy. These are 48 characters. We use a buffer of // its minor collection buddy. These are 48 characters. We use a buffer of
// 10 spaces below to adjust the space between the flag value and the // nSpaces spaces below to adjust the space between the flag value and the
// column of flag type and origin that is printed in the end of the line. // column of flag type and origin that is printed in the end of the line.
char spaces[10 + 1] = " "; char spaces[nSpaces + 1] = " ";
st->print("%9s %-40s = ", _type, _name); st->print("%9s %-*s = ", _type, maxFlagLen-nSpaces, _name);
if (is_bool()) { if (is_bool()) {
st->print("%-20s", get_bool() ? "true" : "false"); st->print("%-20s", get_bool() ? "true" : "false");
@ -509,9 +513,12 @@ void Flag::print_on(outputStream* st, bool withComments, bool printRanges) {
} }
else st->print("%-20s", ""); else st->print("%-20s", "");
} }
assert(strlen(_name) < 50, "Flag name is longer than expected"); // Make sure we do not punch a '\0' at a negative char array index.
spaces[50 - MAX2((size_t)40, strlen(_name))] = '\0'; unsigned int nameLen = (unsigned int)strlen(_name);
st->print("%s", spaces); if (nameLen <= maxFlagLen) {
spaces[maxFlagLen - MAX2(maxFlagLen-nSpaces, nameLen)] = '\0';
st->print("%s", spaces);
}
print_kind_and_origin(st); print_kind_and_origin(st);
#ifndef PRODUCT #ifndef PRODUCT

View File

@ -292,7 +292,7 @@ void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) {
char *opt = (char *)os::malloc(opt_len, mtInternal); char *opt = (char *)os::malloc(opt_len, mtInternal);
if (opt == NULL) { if (opt == NULL) {
output()->print_cr("JVMTI agent attach failed: " output()->print_cr("JVMTI agent attach failed: "
"Could not allocate %zu bytes for argument.", "Could not allocate " SIZE_FORMAT " bytes for argument.",
opt_len); opt_len);
return; return;
} }

View File

@ -214,7 +214,7 @@ private:
case 2: do_conjoint_swap<uint16_t,D>(src, dst, byte_count); break; case 2: do_conjoint_swap<uint16_t,D>(src, dst, byte_count); break;
case 4: do_conjoint_swap<uint32_t,D>(src, dst, byte_count); break; case 4: do_conjoint_swap<uint32_t,D>(src, dst, byte_count); break;
case 8: do_conjoint_swap<uint64_t,D>(src, dst, byte_count); break; case 8: do_conjoint_swap<uint64_t,D>(src, dst, byte_count); break;
default: guarantee(false, "do_conjoint_swap: Invalid elem_size %zd\n", elem_size); default: guarantee(false, "do_conjoint_swap: Invalid elem_size " SIZE_FORMAT "\n", elem_size);
} }
} }
}; };

View File

@ -55,7 +55,6 @@ compiler/types/correctness/OffTest.java 8066173 generic-all
gc/g1/humongousObjects/objectGraphTest/TestObjectGraphAfterGC.java 8156755 generic-all gc/g1/humongousObjects/objectGraphTest/TestObjectGraphAfterGC.java 8156755 generic-all
gc/survivorAlignment/TestPromotionToSurvivor.java 8129886 generic-all gc/survivorAlignment/TestPromotionToSurvivor.java 8129886 generic-all
gc/stress/TestStressG1Humongous.java 8171045 generic-all
############################################################################# #############################################################################

View File

@ -46,6 +46,7 @@ requires.properties= \
vm.gc.Parallel \ vm.gc.Parallel \
vm.gc.ConcMarkSweep \ vm.gc.ConcMarkSweep \
vm.jvmci \ vm.jvmci \
vm.cpu.features \
vm.debug vm.debug
# Tests using jtreg 4.2 b04 features # Tests using jtreg 4.2 b04 features

View File

@ -93,6 +93,7 @@ public class AotCompiler {
} }
} }
List<String> args = new ArrayList<>(); List<String> args = new ArrayList<>();
args.add("--compile-with-assertions");
args.add("--output"); args.add("--output");
args.add(libName); args.add(libName);
if (file != null) { if (file != null) {

View File

@ -33,6 +33,7 @@
* @run main compiler.aot.AotCompiler -libname libRecompilationTest1.so * @run main compiler.aot.AotCompiler -libname libRecompilationTest1.so
* -class compiler.whitebox.SimpleTestCaseHelper * -class compiler.whitebox.SimpleTestCaseHelper
* -extraopt -Dgraal.TieredAOT=true -extraopt -Dgraal.ProfileSimpleMethods=true * -extraopt -Dgraal.TieredAOT=true -extraopt -Dgraal.ProfileSimpleMethods=true
* -extraopt -Dgraal.ProbabilisticProfiling=false
* -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:. * -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
* -extraopt -XX:-UseCompressedOops * -extraopt -XX:-UseCompressedOops
* -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::* * -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::*

View File

@ -44,6 +44,7 @@ public class JaotcTestHelper {
for (String vmOpt : Utils.getTestJavaOpts()) { for (String vmOpt : Utils.getTestJavaOpts()) {
launcher.addVMArg(vmOpt); launcher.addVMArg(vmOpt);
} }
launcher.addToolArg("--compile-with-assertions");
for (String arg : args) { for (String arg : args) {
launcher.addToolArg(arg); launcher.addToolArg(arg);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -23,7 +23,7 @@
/* /*
* @test * @test
* @bug 8150102 8150514 8150534 * @bug 8150102 8150514 8150534 8171435
* @summary C1 crashes in Canonicalizer::do_ArrayLength() after fix for JDK-8150102 * @summary C1 crashes in Canonicalizer::do_ArrayLength() after fix for JDK-8150102
* *
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
@ -31,7 +31,7 @@
* -XX:-BackgroundCompilation * -XX:-BackgroundCompilation
* compiler.c1.CanonicalizeArrayLength * compiler.c1.CanonicalizeArrayLength
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
* -XX:CompileThreshold=100 -XX:+TieredCompilation -XX:TieredStopAtLevel=1 * -XX:CompileThreshold=100 -XX:+TieredCompilation -XX:TieredStopAtLevel=3
* -XX:-BackgroundCompilation * -XX:-BackgroundCompilation
* -XX:+PatchALot * -XX:+PatchALot
* compiler.c1.CanonicalizeArrayLength * compiler.c1.CanonicalizeArrayLength

View File

@ -1,132 +0,0 @@
#!/bin/sh
#
# Copyright (c) 2012, 2015, 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.
#
#
## some tests require path to find test source dir
if [ "${TESTSRC}" = "" ]
then
TESTSRC=${PWD}
echo "TESTSRC not set. Using "${TESTSRC}" as default"
fi
echo "TESTSRC=${TESTSRC}"
## Adding common setup Variables for running shell tests.
. ${TESTSRC}/../../../test_env.sh
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -Xinternalversion | sed 's/amd64/x86/' | grep "x86" | grep "Server VM" | grep "debug"
# Only test fastdebug Server VM on x86
if [ $? != 0 ]
then
echo "Test Passed"
exit 0
fi
# grep for support integer multiply vectors (cpu with SSE4.1)
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -XX:+PrintMiscellaneous -XX:+Verbose -version | grep "cores per cpu" | grep "sse4.1"
if [ $? != 0 ]
then
SSE=2
else
SSE=4
fi
cp ${TESTSRC}${FS}TestIntVect.java .
${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} -d . TestIntVect.java
# CICompilerCount must be at least 2 with -TieredCompilation
${TESTJAVA}${FS}bin${FS}java ${TESTOPTS} -Xbatch -XX:-TieredCompilation \
-XX:CICompilerCount=2 -XX:+PrintCompilation -XX:+TraceNewVectors \
compiler.c2.cr7200264.TestIntVect > test.out 2>&1
COUNT=`grep AddVI test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 4 ]
then
echo "Test Failed: AddVI $COUNT < 4"
exit 1
fi
# AddVI is generated for test_subc
COUNT=`grep SubVI test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 4 ]
then
echo "Test Failed: SubVI $COUNT < 4"
exit 1
fi
# MulVI is only supported with SSE4.1.
if [ $SSE -gt 3 ]
then
# LShiftVI+SubVI is generated for test_mulc
COUNT=`grep MulVI test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 2 ]
then
echo "Test Failed: MulVI $COUNT < 2"
exit 1
fi
fi
COUNT=`grep AndV test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 3 ]
then
echo "Test Failed: AndV $COUNT < 3"
exit 1
fi
COUNT=`grep OrV test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 3 ]
then
echo "Test Failed: OrV $COUNT < 3"
exit 1
fi
COUNT=`grep XorV test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 3 ]
then
echo "Test Failed: XorV $COUNT < 3"
exit 1
fi
# LShiftVI+SubVI is generated for test_mulc
COUNT=`grep LShiftVI test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 5 ]
then
echo "Test Failed: LShiftVI $COUNT < 5"
exit 1
fi
COUNT=`grep RShiftVI test.out | sed '/URShiftVI/d' | wc -l | awk '{print $1}'`
if [ $COUNT -lt 3 ]
then
echo "Test Failed: RShiftVI $COUNT < 3"
exit 1
fi
COUNT=`grep URShiftVI test.out | wc -l | awk '{print $1}'`
if [ $COUNT -lt 3 ]
then
echo "Test Failed: URShiftVI $COUNT < 3"
exit 1
fi

View File

@ -0,0 +1,68 @@
/*
* Copyright (c) 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.
*/
package compiler.c2.cr7200264;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import jdk.test.lib.Asserts;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
public class TestDriver {
private final Map<String, Long> expectedVectorizationNumbers
= new HashMap<>();
public void addExpectedVectorization(String v, long num) {
expectedVectorizationNumbers.put(v, num);
}
public void run() throws Throwable {
verifyVectorizationNumber(executeApplication());
}
private List<String> executeApplication() throws Throwable {
OutputAnalyzer outputAnalyzer = ProcessTools.executeTestJvmAllArgs(
"-Xbatch",
"-XX:-TieredCompilation",
"-XX:+PrintCompilation",
"-XX:+TraceNewVectors",
TestIntVect.class.getName());
outputAnalyzer.shouldHaveExitValue(0);
return outputAnalyzer.asLines();
}
private void verifyVectorizationNumber(List<String> vectorizationLog) {
for (Map.Entry<String, Long> entry : expectedVectorizationNumbers.entrySet()) {
String v = "\t" + entry.getKey();
long actualNum = vectorizationLog.stream()
.filter(s -> s.contains(v)).count();
long expectedNum = entry.getValue();
Asserts.assertGTE(actualNum, expectedNum,
"Unexpected " + entry.getKey() + " number");
}
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -21,14 +21,6 @@
* questions. * questions.
*/ */
/**
* @test
* @bug 7200264
* @summary 7192963 changes disabled shift vectors
*
* @run shell Test7200264.sh
*/
package compiler.c2.cr7200264; package compiler.c2.cr7200264;
/* /*
* Copy of test/compiler/6340864/TestIntVect.java without performance tests. * Copy of test/compiler/6340864/TestIntVect.java without performance tests.

View File

@ -0,0 +1,48 @@
/*
* Copyright (c) 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.
*/
/**
* @test
* @bug 7200264
* @summary 7192963 changes disabled shift vectors
* @requires vm.cpu.features ~= ".*sse2.*" & vm.debug & vm.flavor == "server"
* @library /test/lib /
* @run driver compiler.c2.cr7200264.TestSSE2IntVect
*/
package compiler.c2.cr7200264;
public class TestSSE2IntVect {
public static void main(String[] args) throws Throwable {
TestDriver test = new TestDriver();
test.addExpectedVectorization("AddVI", 4);
test.addExpectedVectorization("SubVI", 4);
test.addExpectedVectorization("AndV", 3);
test.addExpectedVectorization("OrV", 3);
test.addExpectedVectorization("XorV", 3);
test.addExpectedVectorization("LShiftVI", 5);
test.addExpectedVectorization("RShiftVI", 3);
test.addExpectedVectorization("URShiftVI", 3);
test.run();
}
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 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.
*/
/**
* @test
* @bug 7200264
* @summary 7192963 changes disabled shift vectors
* @requires vm.cpu.features ~= ".*sse4\\.1.*" & vm.debug & vm.flavor == "server"
* @library /test/lib /
* @run driver compiler.c2.cr7200264.TestSSE4IntVect
*/
package compiler.c2.cr7200264;
public class TestSSE4IntVect {
public static void main(String[] args) throws Throwable {
TestDriver test = new TestDriver();
test.addExpectedVectorization("MulVI", 2);
test.run();
}
}

View File

@ -65,7 +65,11 @@ public class TestVMNoCompLevel extends CiReplayBase {
throw new Error("Failed to read/write replay data: " + ioe, ioe); throw new Error("Failed to read/write replay data: " + ioe, ioe);
} }
if (CLIENT_VM_AVAILABLE) { if (CLIENT_VM_AVAILABLE) {
negativeTest(CLIENT_VM_OPTION); if (SERVER_VM_AVAILABLE) {
negativeTest(CLIENT_VM_OPTION);
} else {
positiveTest(CLIENT_VM_OPTION);
}
} }
if (SERVER_VM_AVAILABLE) { if (SERVER_VM_AVAILABLE) {
positiveTest(TIERED_DISABLED_VM_OPTION, SERVER_VM_OPTION); positiveTest(TIERED_DISABLED_VM_OPTION, SERVER_VM_OPTION);

View File

@ -27,7 +27,7 @@
* @requires vm.gc.G1 * @requires vm.gc.G1
* @summary Verify that heap shrinks after GC in the presence of fragmentation * @summary Verify that heap shrinks after GC in the presence of fragmentation
* due to humongous objects * due to humongous objects
* @library /test/lib * @library /test/lib /
* @modules java.base/jdk.internal.misc * @modules java.base/jdk.internal.misc
* @modules java.management/sun.management * @modules java.management/sun.management
* @run main/othervm -XX:-ExplicitGCInvokesConcurrent -XX:MinHeapFreeRatio=10 * @run main/othervm -XX:-ExplicitGCInvokesConcurrent -XX:MinHeapFreeRatio=10
@ -40,6 +40,8 @@ import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage; import java.lang.management.MemoryUsage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.text.NumberFormat;
import gc.testlibrary.Helpers;
import static jdk.test.lib.Asserts.*; import static jdk.test.lib.Asserts.*;
public class TestHumongousShrinkHeap { public class TestHumongousShrinkHeap {
@ -70,9 +72,9 @@ public class TestHumongousShrinkHeap {
System.out.format("Running with %s initial heap size of %s maximum heap size. " System.out.format("Running with %s initial heap size of %s maximum heap size. "
+ "Will allocate humongous object of %s size %d times.%n", + "Will allocate humongous object of %s size %d times.%n",
MemoryUsagePrinter.humanReadableByteCount(TOTAL_MEMORY, false), MemoryUsagePrinter.NF.format(TOTAL_MEMORY),
MemoryUsagePrinter.humanReadableByteCount(MAX_MEMORY, false), MemoryUsagePrinter.NF.format(MAX_MEMORY),
MemoryUsagePrinter.humanReadableByteCount(HUMON_SIZE, false), MemoryUsagePrinter.NF.format(HUMON_SIZE),
HUMON_COUNT HUMON_COUNT
); );
new TestHumongousShrinkHeap().test(); new TestHumongousShrinkHeap().test();
@ -134,24 +136,16 @@ public class TestHumongousShrinkHeap {
*/ */
class MemoryUsagePrinter { class MemoryUsagePrinter {
public static String humanReadableByteCount(long bytes, boolean si) { public static final NumberFormat NF = Helpers.numberFormatter();
int unit = si ? 1000 : 1024;
if (bytes < unit) {
return bytes + " B";
}
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
public static void printMemoryUsage(String label) { public static void printMemoryUsage(String label) {
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
label, label,
humanReadableByteCount(memusage.getInit(), false), NF.format(memusage.getInit()),
humanReadableByteCount(memusage.getUsed(), false), NF.format(memusage.getUsed()),
humanReadableByteCount(memusage.getCommitted(), false), NF.format(memusage.getCommitted()),
freeratio * 100 freeratio * 100
); );
} }

View File

@ -31,7 +31,7 @@
* "..................................H" * "..................................H"
* 3. invoke gc and check that memory returned to the system (amount of committed memory got down) * 3. invoke gc and check that memory returned to the system (amount of committed memory got down)
* *
* @library /test/lib * @library /test/lib /
* @modules java.base/jdk.internal.misc * @modules java.base/jdk.internal.misc
* java.management/sun.management * java.management/sun.management
*/ */
@ -39,10 +39,12 @@ import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage; import java.lang.management.MemoryUsage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.text.NumberFormat;
import static jdk.test.lib.Asserts.*; import static jdk.test.lib.Asserts.*;
import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.ProcessTools;
import com.sun.management.HotSpotDiagnosticMXBean; import com.sun.management.HotSpotDiagnosticMXBean;
import gc.testlibrary.Helpers;
public class TestShrinkDefragmentedHeap { public class TestShrinkDefragmentedHeap {
// Since we store all the small objects, they become old and old regions are also allocated at the bottom of the heap // Since we store all the small objects, they become old and old regions are also allocated at the bottom of the heap
@ -114,8 +116,8 @@ public class TestShrinkDefragmentedHeap {
private void allocate() { private void allocate() {
System.out.format("Will allocate objects of small size = %s and humongous size = %s", System.out.format("Will allocate objects of small size = %s and humongous size = %s",
MemoryUsagePrinter.humanReadableByteCount(SMALL_OBJS_SIZE, false), MemoryUsagePrinter.NF.format(SMALL_OBJS_SIZE),
MemoryUsagePrinter.humanReadableByteCount(HUMONG_OBJS_SIZE, false) MemoryUsagePrinter.NF.format(HUMONG_OBJS_SIZE)
); );
for (int i = 0; i < ALLOCATE_COUNT; i++) { for (int i = 0; i < ALLOCATE_COUNT; i++) {
@ -170,24 +172,16 @@ public class TestShrinkDefragmentedHeap {
*/ */
static class MemoryUsagePrinter { static class MemoryUsagePrinter {
public static String humanReadableByteCount(long bytes, boolean si) { public static final NumberFormat NF = Helpers.numberFormatter();
int unit = si ? 1000 : 1024;
if (bytes < unit) {
return bytes + " B";
}
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
public static void printMemoryUsage(String label) { public static void printMemoryUsage(String label) {
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
label, label,
humanReadableByteCount(memusage.getInit(), false), NF.format(memusage.getInit()),
humanReadableByteCount(memusage.getUsed(), false), NF.format(memusage.getUsed()),
humanReadableByteCount(memusage.getCommitted(), false), NF.format(memusage.getCommitted()),
freeratio * 100 freeratio * 100
); );
} }

View File

@ -28,15 +28,17 @@
* @summary Verify that the heap shrinks after full GC according to the current values of the Min/MaxHeapFreeRatio flags * @summary Verify that the heap shrinks after full GC according to the current values of the Min/MaxHeapFreeRatio flags
* @modules java.base/jdk.internal.misc * @modules java.base/jdk.internal.misc
* @modules jdk.management * @modules jdk.management
* @library /test/lib * @library /test/lib /
* @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -Xmx1g -verbose:gc TestDynShrinkHeap * @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -Xmx1g -verbose:gc TestDynShrinkHeap
*/ */
import jdk.test.lib.DynamicVMOption; import jdk.test.lib.DynamicVMOption;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage; import java.lang.management.MemoryUsage;
import java.util.ArrayList; import java.util.ArrayList;
import java.text.NumberFormat;
import static jdk.test.lib.Asserts.assertLessThan; import static jdk.test.lib.Asserts.assertLessThan;
import com.sun.management.HotSpotDiagnosticMXBean; import com.sun.management.HotSpotDiagnosticMXBean;
import gc.testlibrary.Helpers;
public class TestDynShrinkHeap { public class TestDynShrinkHeap {
@ -101,24 +103,16 @@ public class TestDynShrinkHeap {
*/ */
class MemoryUsagePrinter { class MemoryUsagePrinter {
public static String humanReadableByteCount(long bytes, boolean si) { public static final NumberFormat NF = Helpers.numberFormatter();
int unit = si ? 1000 : 1024;
if (bytes < unit) {
return bytes + " B";
}
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
public static void printMemoryUsage(String label) { public static void printMemoryUsage(String label) {
MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted();
System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n",
label, label,
humanReadableByteCount(memusage.getInit(), true), NF.format(memusage.getInit()),
humanReadableByteCount(memusage.getUsed(), true), NF.format(memusage.getUsed()),
humanReadableByteCount(memusage.getCommitted(), true), NF.format(memusage.getCommitted()),
freeratio * 100 freeratio * 100
); );
} }

View File

@ -28,14 +28,9 @@
* @summary Stress G1 by humongous allocations in situation near OOM * @summary Stress G1 by humongous allocations in situation near OOM
* @requires vm.gc.G1 * @requires vm.gc.G1
* @requires !vm.flightRecorder * @requires !vm.flightRecorder
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=4m * @library /test/lib
* -Dtimeout=120 -Dthreads=3 -Dhumongoussize=1.1 -Dregionsize=4 TestStressG1Humongous * @modules java.base/jdk.internal.misc
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=16m * @run driver/timeout=1300 TestStressG1Humongous
* -Dtimeout=120 -Dthreads=5 -Dhumongoussize=2.1 -Dregionsize=16 TestStressG1Humongous
* @run main/othervm/timeout=200 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=32m
* -Dtimeout=120 -Dthreads=4 -Dhumongoussize=0.6 -Dregionsize=32 TestStressG1Humongous
* @run main/othervm/timeout=700 -Xlog:gc=debug -Xmx1g -XX:+UseG1GC -XX:G1HeapRegionSize=1m
* -Dtimeout=600 -Dthreads=7 -Dhumongoussize=0.6 -Dregionsize=1 TestStressG1Humongous
*/ */
import java.util.ArrayList; import java.util.ArrayList;
@ -44,8 +39,45 @@ import java.util.Collections;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class TestStressG1Humongous { import jdk.test.lib.Platform;
import jdk.test.lib.Utils;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
public class TestStressG1Humongous{
public static void main(String[] args) throws Exception {
// Limit heap size on 32-bit platforms
int heapSize = Platform.is32bit() ? 512 : 1024;
// Heap size, region size, threads, humongous size, timeout
run(heapSize, 4, 3, 1.1, 120);
run(heapSize, 16, 5, 2.1, 120);
run(heapSize, 32, 4, 0.6, 120);
run(heapSize, 1, 7, 0.6, 600);
}
private static void run(int heapSize, int regionSize, int threads, double humongousSize, int timeout)
throws Exception {
ArrayList<String> options = new ArrayList<>();
Collections.addAll(options, Utils.getTestJavaOpts());
Collections.addAll(options,
"-Xlog:gc=debug",
"-Xmx" + heapSize + "m",
"-XX:+UseG1GC",
"-XX:G1HeapRegionSize=" + regionSize + "m",
"-Dtimeout=" + timeout,
"-Dthreads=" + threads,
"-Dhumongoussize=" + humongousSize,
"-Dregionsize=" + regionSize,
TestStressG1HumongousImpl.class.getName()
);
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(options.toArray(new String[options.size()]));
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
}
}
class TestStressG1HumongousImpl {
// Timeout in seconds // Timeout in seconds
private static final int TIMEOUT = Integer.getInteger("timeout", 60); private static final int TIMEOUT = Integer.getInteger("timeout", 60);
private static final int THREAD_COUNT = Integer.getInteger("threads", 2); private static final int THREAD_COUNT = Integer.getInteger("threads", 2);
@ -60,10 +92,10 @@ public class TestStressG1Humongous {
public static final List<Object> GARBAGE = Collections.synchronizedList(new ArrayList<>()); public static final List<Object> GARBAGE = Collections.synchronizedList(new ArrayList<>());
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
new TestStressG1Humongous().run(); new TestStressG1HumongousImpl().run();
} }
public TestStressG1Humongous() { public TestStressG1HumongousImpl() {
isRunning = true; isRunning = true;
threads = new Thread[THREAD_COUNT]; threads = new Thread[THREAD_COUNT];
alocatedObjectsCount = new AtomicInteger(0); alocatedObjectsCount = new AtomicInteger(0);

View File

@ -31,6 +31,9 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
public class Helpers { public class Helpers {
@ -320,4 +323,16 @@ public class Helpers {
} }
} }
/**
* @return a number formatter instance which prints numbers in a human
* readable form, like 9_223_372_036_854_775_807.
*/
public static NumberFormat numberFormatter() {
DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
dfs.setGroupingSeparator('_');
dfs.setDecimalSeparator('.');
df.setDecimalFormatSymbols(dfs);
return df;
}
} }

View File

@ -86,7 +86,7 @@ static void test_remove_dependent_nmethod(int id, bool delete_immediately) {
NOT_PRODUCT(ASSERT_FALSE(depContext.is_dependent_nmethod(nm))); NOT_PRODUCT(ASSERT_FALSE(depContext.is_dependent_nmethod(nm)));
} }
TEST(code, dependency_context) { TEST_VM(code, dependency_context) {
test_remove_dependent_nmethod(0, false); test_remove_dependent_nmethod(0, false);
test_remove_dependent_nmethod(1, false); test_remove_dependent_nmethod(1, false);
test_remove_dependent_nmethod(2, false); test_remove_dependent_nmethod(2, false);

View File

@ -123,19 +123,19 @@ class BasicWorkerDataArrayTest : public WorkerDataArrayTest<size_t> {
} }
}; };
TEST_F(BasicWorkerDataArrayTest, sum_test) { TEST_VM_F(BasicWorkerDataArrayTest, sum_test) {
ASSERT_EQ(15u, array.sum()); ASSERT_EQ(15u, array.sum());
} }
TEST_F(BasicWorkerDataArrayTest, average_test) { TEST_VM_F(BasicWorkerDataArrayTest, average_test) {
ASSERT_NEAR(5.0, array.average(), epsilon); ASSERT_NEAR(5.0, array.average(), epsilon);
} }
TEST_F(BasicWorkerDataArrayTest, print_summary_on_test) { TEST_VM_F(BasicWorkerDataArrayTest, print_summary_on_test) {
ASSERT_STREQ(print_expected_summary(), print_summary()); ASSERT_STREQ(print_expected_summary(), print_summary());
} }
TEST_F(BasicWorkerDataArrayTest, print_details_on_test) { TEST_VM_F(BasicWorkerDataArrayTest, print_details_on_test) {
ASSERT_STREQ(print_expected_details(), print_details()); ASSERT_STREQ(print_expected_details(), print_details());
} }
@ -161,19 +161,19 @@ class AddWorkerDataArrayTest : public WorkerDataArrayTest<size_t> {
} }
}; };
TEST_F(AddWorkerDataArrayTest, sum_test) { TEST_VM_F(AddWorkerDataArrayTest, sum_test) {
ASSERT_EQ(18u, array.sum()); ASSERT_EQ(18u, array.sum());
} }
TEST_F(AddWorkerDataArrayTest, average_test) { TEST_VM_F(AddWorkerDataArrayTest, average_test) {
ASSERT_NEAR(6.0, array.average(), epsilon); ASSERT_NEAR(6.0, array.average(), epsilon);
} }
TEST_F(AddWorkerDataArrayTest, print_summary_on_test) { TEST_VM_F(AddWorkerDataArrayTest, print_summary_on_test) {
ASSERT_STREQ(print_expected_summary(), print_summary()); ASSERT_STREQ(print_expected_summary(), print_summary());
} }
TEST_F(AddWorkerDataArrayTest, print_details_on_test) { TEST_VM_F(AddWorkerDataArrayTest, print_details_on_test) {
ASSERT_STREQ(print_expected_details(), print_details()); ASSERT_STREQ(print_expected_details(), print_details());
} }
@ -195,19 +195,19 @@ class UninitializedElementWorkerDataArrayTest : public WorkerDataArrayTest<size_
} }
}; };
TEST_F(UninitializedElementWorkerDataArrayTest, sum_test) { TEST_VM_F(UninitializedElementWorkerDataArrayTest, sum_test) {
ASSERT_EQ(12u, array.sum()); ASSERT_EQ(12u, array.sum());
} }
TEST_F(UninitializedElementWorkerDataArrayTest, average_test) { TEST_VM_F(UninitializedElementWorkerDataArrayTest, average_test) {
ASSERT_NEAR(6.0, array.average(), epsilon); ASSERT_NEAR(6.0, array.average(), epsilon);
} }
TEST_F(UninitializedElementWorkerDataArrayTest, print_summary_on_test) { TEST_VM_F(UninitializedElementWorkerDataArrayTest, print_summary_on_test) {
ASSERT_STREQ(print_expected_summary(), print_summary()); ASSERT_STREQ(print_expected_summary(), print_summary());
} }
TEST_F(UninitializedElementWorkerDataArrayTest, print_details_on_test) { TEST_VM_F(UninitializedElementWorkerDataArrayTest, print_details_on_test) {
ASSERT_STREQ(print_expected_details(), print_details()); ASSERT_STREQ(print_expected_details(), print_details());
} }
@ -229,19 +229,19 @@ class UninitializedWorkerDataArrayTest : public WorkerDataArrayTest<size_t> {
} }
}; };
TEST_F(UninitializedWorkerDataArrayTest, sum_test) { TEST_VM_F(UninitializedWorkerDataArrayTest, sum_test) {
ASSERT_EQ(0u, array.sum()); ASSERT_EQ(0u, array.sum());
} }
TEST_F(UninitializedWorkerDataArrayTest, average_test) { TEST_VM_F(UninitializedWorkerDataArrayTest, average_test) {
ASSERT_NEAR(0.0, array.average(), epsilon); ASSERT_NEAR(0.0, array.average(), epsilon);
} }
TEST_F(UninitializedWorkerDataArrayTest, print_summary_on_test) { TEST_VM_F(UninitializedWorkerDataArrayTest, print_summary_on_test) {
ASSERT_STREQ(print_expected_summary(), print_summary()); ASSERT_STREQ(print_expected_summary(), print_summary());
} }
TEST_F(UninitializedWorkerDataArrayTest, print_details_on_test) { TEST_VM_F(UninitializedWorkerDataArrayTest, print_details_on_test) {
ASSERT_STREQ(print_expected_details(), print_details()); ASSERT_STREQ(print_expected_details(), print_details());
} }
@ -265,18 +265,18 @@ class UninitializedDoubleElementWorkerDataArrayTest : public WorkerDataArrayTest
} }
}; };
TEST_F(UninitializedDoubleElementWorkerDataArrayTest, sum_test) { TEST_VM_F(UninitializedDoubleElementWorkerDataArrayTest, sum_test) {
ASSERT_NEAR(12.3 / MILLIUNITS, array.sum(), epsilon); ASSERT_NEAR(12.3 / MILLIUNITS, array.sum(), epsilon);
} }
TEST_F(UninitializedDoubleElementWorkerDataArrayTest, average_test) { TEST_VM_F(UninitializedDoubleElementWorkerDataArrayTest, average_test) {
ASSERT_NEAR(6.15 / MILLIUNITS, array.average(), epsilon); ASSERT_NEAR(6.15 / MILLIUNITS, array.average(), epsilon);
} }
TEST_F(UninitializedDoubleElementWorkerDataArrayTest, print_summary_on_test) { TEST_VM_F(UninitializedDoubleElementWorkerDataArrayTest, print_summary_on_test) {
ASSERT_STREQ(print_expected_summary(), print_summary()); ASSERT_STREQ(print_expected_summary(), print_summary());
} }
TEST_F(UninitializedDoubleElementWorkerDataArrayTest, print_details_on_test) { TEST_VM_F(UninitializedDoubleElementWorkerDataArrayTest, print_details_on_test) {
ASSERT_STREQ(print_expected_details(), print_details()); ASSERT_STREQ(print_expected_details(), print_details());
} }

View File

@ -41,14 +41,14 @@ size_t Test_log_prefix_prefixer(char* buf, size_t len) {
} }
#ifdef ASSERT // 'test' tag is debug only #ifdef ASSERT // 'test' tag is debug only
TEST_F(LogTest, prefix) { TEST_VM_F(LogTest, prefix) {
set_log_config(TestLogFileName, "logging+test=trace"); set_log_config(TestLogFileName, "logging+test=trace");
log_trace(logging, test)(LOG_LINE_STR); log_trace(logging, test)(LOG_LINE_STR);
EXPECT_TRUE(file_contains_substring(TestLogFileName, LOG_PREFIX_STR LOG_LINE_STR)); EXPECT_TRUE(file_contains_substring(TestLogFileName, LOG_PREFIX_STR LOG_LINE_STR));
} }
#endif #endif
TEST_F(LogTest, large_message) { TEST_VM_F(LogTest, large_message) {
char big_msg[4096] = {0}; char big_msg[4096] = {0};
char Xchar = '~'; char Xchar = '~';
@ -68,7 +68,7 @@ TEST_F(LogTest, large_message) {
EXPECT_EQ(sizeof(big_msg) - 1, count); EXPECT_EQ(sizeof(big_msg) - 1, count);
} }
TEST_F(LogTest, enabled_logtarget) { TEST_VM_F(LogTest, enabled_logtarget) {
set_log_config(TestLogFileName, "gc=debug"); set_log_config(TestLogFileName, "gc=debug");
LogTarget(Debug, gc) log; LogTarget(Debug, gc) log;
@ -80,7 +80,7 @@ TEST_F(LogTest, enabled_logtarget) {
EXPECT_TRUE(file_contains_substring(TestLogFileName, LOG_TEST_STRING_LITERAL)); EXPECT_TRUE(file_contains_substring(TestLogFileName, LOG_TEST_STRING_LITERAL));
} }
TEST_F(LogTest, disabled_logtarget) { TEST_VM_F(LogTest, disabled_logtarget) {
set_log_config(TestLogFileName, "gc=info"); set_log_config(TestLogFileName, "gc=info");
LogTarget(Debug, gc) log; LogTarget(Debug, gc) log;
@ -95,7 +95,7 @@ TEST_F(LogTest, disabled_logtarget) {
EXPECT_FALSE(file_contains_substring(TestLogFileName, LOG_TEST_STRING_LITERAL)); EXPECT_FALSE(file_contains_substring(TestLogFileName, LOG_TEST_STRING_LITERAL));
} }
TEST_F(LogTest, enabled_loghandle) { TEST_VM_F(LogTest, enabled_loghandle) {
set_log_config(TestLogFileName, "gc=debug"); set_log_config(TestLogFileName, "gc=debug");
Log(gc) log; Log(gc) log;
@ -109,7 +109,7 @@ TEST_F(LogTest, enabled_loghandle) {
EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers")); EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers"));
} }
TEST_F(LogTest, disabled_loghandle) { TEST_VM_F(LogTest, disabled_loghandle) {
set_log_config(TestLogFileName, "gc=info"); set_log_config(TestLogFileName, "gc=info");
Log(gc) log; Log(gc) log;
@ -126,7 +126,7 @@ TEST_F(LogTest, disabled_loghandle) {
EXPECT_FALSE(file_contains_substring(TestLogFileName, "3 workers")); EXPECT_FALSE(file_contains_substring(TestLogFileName, "3 workers"));
} }
TEST_F(LogTest, enabled_logtargethandle) { TEST_VM_F(LogTest, enabled_logtargethandle) {
set_log_config(TestLogFileName, "gc=debug"); set_log_config(TestLogFileName, "gc=debug");
LogTarget(Debug, gc) log; LogTarget(Debug, gc) log;
@ -140,7 +140,7 @@ TEST_F(LogTest, enabled_logtargethandle) {
EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers")); EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers"));
} }
TEST_F(LogTest, disabled_logtargethandle) { TEST_VM_F(LogTest, disabled_logtargethandle) {
set_log_config(TestLogFileName, "gc=info"); set_log_config(TestLogFileName, "gc=info");
LogTarget(Debug, gc) log; LogTarget(Debug, gc) log;

View File

@ -297,7 +297,7 @@ TEST_VM_F(LogConfigurationTest, parse_log_arguments) {
} }
} }
TEST_F(LogConfigurationTest, configure_stdout) { TEST_VM_F(LogConfigurationTest, configure_stdout) {
// Start out with all logging disabled // Start out with all logging disabled
LogConfiguration::disable_logging(); LogConfiguration::disable_logging();
@ -355,7 +355,7 @@ static void Test_logconfiguration_subscribe_helper() {
Test_logconfiguration_subscribe_triggered++; Test_logconfiguration_subscribe_triggered++;
} }
TEST_F(LogConfigurationTest, subscribe) { TEST_VM_F(LogConfigurationTest, subscribe) {
ResourceMark rm; ResourceMark rm;
Log(logging) log; Log(logging) log;
set_log_config("stdout", "logging*=trace"); set_log_config("stdout", "logging*=trace");

View File

@ -65,7 +65,7 @@ LogMessageTest::~LogMessageTest() {
// Verify that messages with multiple levels are written // Verify that messages with multiple levels are written
// to outputs configured for all the corresponding levels // to outputs configured for all the corresponding levels
TEST_F(LogMessageTest, level_inclusion) { TEST_VM_F(LogMessageTest, level_inclusion) {
const size_t message_count = 10; const size_t message_count = 10;
LogMessageBuffer msg[message_count]; LogMessageBuffer msg[message_count];
@ -119,7 +119,7 @@ LOG_LEVEL_LIST
} }
// Verify that messages are logged in the order they are added to the log message // Verify that messages are logged in the order they are added to the log message
TEST_F(LogMessageTest, line_order) { TEST_VM_F(LogMessageTest, line_order) {
LogMessageBuffer msg; LogMessageBuffer msg;
msg.info("info line").error("error line").trace("trace line") msg.info("info line").error("error line").trace("trace line")
.error("another error").warning("warning line").debug("debug line"); .error("another error").warning("warning line").debug("debug line");
@ -131,7 +131,7 @@ TEST_F(LogMessageTest, line_order) {
<< "output missing or in incorrect order"; << "output missing or in incorrect order";
} }
TEST_F(LogMessageTest, long_message) { TEST_VM_F(LogMessageTest, long_message) {
// Write 10K bytes worth of log data // Write 10K bytes worth of log data
LogMessageBuffer msg; LogMessageBuffer msg;
const size_t size = 10 * K; const size_t size = 10 * K;
@ -155,7 +155,7 @@ TEST_F(LogMessageTest, long_message) {
FREE_C_HEAP_ARRAY(char, data); FREE_C_HEAP_ARRAY(char, data);
} }
TEST_F(LogMessageTest, message_with_many_lines) { TEST_VM_F(LogMessageTest, message_with_many_lines) {
const size_t lines = 100; const size_t lines = 100;
const size_t line_length = 16; const size_t line_length = 16;
@ -188,7 +188,7 @@ static size_t dummy_prefixer(char* buf, size_t len) {
return prefix_len; return prefix_len;
} }
TEST_F(LogMessageTest, prefixing) { TEST_VM_F(LogMessageTest, prefixing) {
LogMessageBuffer msg; LogMessageBuffer msg;
msg.set_prefix(dummy_prefixer); msg.set_prefix(dummy_prefixer);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@ -209,7 +209,7 @@ TEST_F(LogMessageTest, prefixing) {
<< "error in prefixed output"; << "error in prefixed output";
} }
TEST_F(LogMessageTest, scoped_messages) { TEST_VM_F(LogMessageTest, scoped_messages) {
{ {
LogMessage(logging) msg; LogMessage(logging) msg;
msg.info("scoped info"); msg.info("scoped info");
@ -223,7 +223,7 @@ TEST_F(LogMessageTest, scoped_messages) {
<< "missing output from scoped log message"; << "missing output from scoped log message";
} }
TEST_F(LogMessageTest, scoped_flushing) { TEST_VM_F(LogMessageTest, scoped_flushing) {
{ {
LogMessage(logging) msg; LogMessage(logging) msg;
msg.info("manual flush info"); msg.info("manual flush info");
@ -236,7 +236,7 @@ TEST_F(LogMessageTest, scoped_flushing) {
<< "log file contains duplicate lines from single scoped log message"; << "log file contains duplicate lines from single scoped log message";
} }
TEST_F(LogMessageTest, scoped_reset) { TEST_VM_F(LogMessageTest, scoped_reset) {
{ {
LogMessage(logging) msg, partial; LogMessage(logging) msg, partial;
msg.info("%s", "info reset msg"); msg.info("%s", "info reset msg");

View File

@ -30,7 +30,7 @@
#include "unittest.hpp" #include "unittest.hpp"
#include "utilities/ostream.hpp" #include "utilities/ostream.hpp"
TEST(LogTagSetDescriptions, describe) { TEST_VM(LogTagSetDescriptions, describe) {
for (LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) { for (LogTagSetDescription* d = tagset_descriptions; d->tagset != NULL; d++) {
char expected[1 * K]; char expected[1 * K];
d->tagset->label(expected, sizeof(expected), "+"); d->tagset->label(expected, sizeof(expected), "+");
@ -46,7 +46,7 @@ TEST(LogTagSetDescriptions, describe) {
} }
} }
TEST(LogTagSetDescriptions, command_line_help) { TEST_VM(LogTagSetDescriptions, command_line_help) {
const char* filename = "logtagset_descriptions"; const char* filename = "logtagset_descriptions";
FILE* fp = fopen(filename, "w+"); FILE* fp = fopen(filename, "w+");
ASSERT_NE((void*)NULL, fp); ASSERT_NE((void*)NULL, fp);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -48,20 +48,23 @@ public class RedefinePreviousVersions {
public static String newRunning = public static String newRunning =
"class RedefinePreviousVersions$Running {" + "class RedefinePreviousVersions$Running {" +
" public static volatile boolean stop = true;" + " public static volatile boolean stop = true;" +
" public static volatile boolean running = true;" +
" static void localSleep() { }" + " static void localSleep() { }" +
" public static void infinite() { }" + " public static void infinite() { }" +
"}"; "}";
static class Running { static class Running {
public static volatile boolean stop = false; public static volatile boolean stop = false;
public static volatile boolean running = false;
static void localSleep() { static void localSleep() {
try{ try{
Thread.currentThread().sleep(10);//sleep for 10 ms Thread.sleep(10); // sleep for 10 ms
} catch(InterruptedException ie) { } catch(InterruptedException ie) {
} }
} }
public static void infinite() { public static void infinite() {
running = true;
while (!stop) { localSleep(); } while (!stop) { localSleep(); }
} }
} }
@ -70,8 +73,6 @@ public class RedefinePreviousVersions {
if (args.length > 0) { if (args.length > 0) {
String jarFile = System.getProperty("test.src") + "/testcase.jar";
// java -javaagent:redefineagent.jar -Xlog:stuff RedefinePreviousVersions // java -javaagent:redefineagent.jar -Xlog:stuff RedefinePreviousVersions
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( "-javaagent:redefineagent.jar", ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( "-javaagent:redefineagent.jar",
"-Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace", "-Xlog:redefine+class+iklass+add=trace,redefine+class+iklass+purge=trace",
@ -100,6 +101,10 @@ public class RedefinePreviousVersions {
} }
}.start(); }.start();
while (!Running.running) {
Thread.sleep(10); // sleep for 10 ms
}
// Since a method of newRunning is running, this class should be added to the previous_version_list // Since a method of newRunning is running, this class should be added to the previous_version_list
// of Running, and _has_previous_versions should return true at class unloading. // of Running, and _has_previous_versions should return true at class unloading.
RedefineClassHelper.redefineClass(Running.class, newRunning); RedefineClassHelper.redefineClass(Running.class, newRunning);

View File

@ -199,7 +199,8 @@ public class ReservedStackTest {
// corruptions are still possible. // corruptions are still possible.
boolean supportedPlatform = boolean supportedPlatform =
Platform.isAix() || Platform.isAix() ||
(Platform.isLinux() && (Platform.isPPC() || Platform.isX64() || Platform.isX86())) || (Platform.isLinux() &&
(Platform.isPPC() || Platform.isS390x() || Platform.isX64() || Platform.isX86())) ||
Platform.isOSX() || Platform.isOSX() ||
Platform.isSolaris(); Platform.isSolaris();
if (supportedPlatform && !result.contains("PASSED")) { if (supportedPlatform && !result.contains("PASSED")) {

View File

@ -21,12 +21,9 @@
* questions. * questions.
*/ */
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import jdk.test.lib.process.ProcessTools;
import sun.management.VMManagement; import sun.management.VMManagement;
@ -38,7 +35,7 @@ public class JMapHProfLargeHeapProc {
buildLargeHeap(args); buildLargeHeap(args);
// Print our pid on stdout // Print our pid on stdout
System.out.println("PID[" + getProcessId() + "]"); System.out.println("PID[" + ProcessTools.getProcessId() + "]");
// Wait for input before termination // Wait for input before termination
System.in.read(); System.in.read();
@ -50,22 +47,4 @@ public class JMapHProfLargeHeapProc {
} }
} }
public static int getProcessId() throws Exception {
// Get the current process id using a reflection hack
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime);
Method pid_method = mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);
int pid = (Integer) pid_method.invoke(mgmt);
return pid;
}
} }

View File

@ -90,6 +90,9 @@ public class JMapHProfLargeHeapTest {
try (Scanner largeHeapScanner = new Scanner( try (Scanner largeHeapScanner = new Scanner(
largeHeapProc.getInputStream());) { largeHeapProc.getInputStream());) {
String pidstring = null; String pidstring = null;
if (!largeHeapScanner.hasNext()) {
throw new RuntimeException ("Test failed: could not open largeHeapScanner.");
}
while ((pidstring = largeHeapScanner.findInLine("PID\\[[0-9].*\\]")) == null) { while ((pidstring = largeHeapScanner.findInLine("PID\\[[0-9].*\\]")) == null) {
Thread.sleep(500); Thread.sleep(500);
} }

View File

@ -59,6 +59,8 @@ public class CompileTheWorld {
OUT = os; OUT = os;
} }
boolean passed = false;
try { try {
try { try {
if (ManagementFactory.getCompilationMXBean() == null) { if (ManagementFactory.getCompilationMXBean() == null) {
@ -84,10 +86,10 @@ public class CompileTheWorld {
PathHandler.getClassCount(), PathHandler.getClassCount(),
Compiler.getMethodCount(), Compiler.getMethodCount(),
System.currentTimeMillis() - start); System.currentTimeMillis() - start);
passed = true;
} finally { } finally {
if (os != null) { // <clinit> might have started new threads
os.close(); System.exit(passed ? 0 : 1);
}
} }
} }

View File

@ -30,11 +30,11 @@
* java.base/jdk.internal.reflect * java.base/jdk.internal.reflect
* java.management * java.management
* @build sun.hotspot.WhiteBox Foo Bar * @build sun.hotspot.WhiteBox Foo Bar
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar * @run driver ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
* sun.hotspot.WhiteBox$WhiteBoxPermission * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main ClassesDirTest prepare * @run driver ClassesDirTest prepare
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes * @run driver ClassesDirTest compile classes
* @run main ClassesDirTest check ctw.log * @run driver ClassesDirTest check
* @summary testing of CompileTheWorld :: classes in directory * @summary testing of CompileTheWorld :: classes in directory
* @author igor.ignatyev@oracle.com * @author igor.ignatyev@oracle.com
*/ */

View File

@ -30,11 +30,11 @@
* java.base/jdk.internal.reflect * java.base/jdk.internal.reflect
* java.management * java.management
* @build sun.hotspot.WhiteBox Foo Bar * @build sun.hotspot.WhiteBox Foo Bar
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar * @run driver ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
* sun.hotspot.WhiteBox$WhiteBoxPermission * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main ClassesListTest prepare * @run driver ClassesListTest prepare
* @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes.lst * @run driver/timeout=600 ClassesListTest compile classes.lst
* @run main ClassesListTest check ctw.log * @run driver ClassesListTest check
* @summary testing of CompileTheWorld :: list of classes in file * @summary testing of CompileTheWorld :: list of classes in file
* @author igor.ignatyev@oracle.com * @author igor.ignatyev@oracle.com
*/ */

View File

@ -21,6 +21,7 @@
* questions. * questions.
*/ */
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Collections; import java.util.Collections;
import java.util.ArrayList; import java.util.ArrayList;
@ -38,8 +39,20 @@ import java.nio.charset.Charset;
import jdk.test.lib.JDKToolFinder; import jdk.test.lib.JDKToolFinder;
import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
public abstract class CtwTest { public abstract class CtwTest {
private static final String LOG_FILE = "ctw.log";
private static final String[] CTW_COMMAND = {
"-Xbootclasspath/a:.",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-Dsun.hotspot.tools.ctw.logfile=" + LOG_FILE,
"--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED",
sun.hotspot.tools.ctw.CompileTheWorld.class.getName(),
};
protected final String[] shouldContain; protected final String[] shouldContain;
protected CtwTest(String[] shouldContain) { protected CtwTest(String[] shouldContain) {
this.shouldContain = shouldContain; this.shouldContain = shouldContain;
@ -54,7 +67,10 @@ public abstract class CtwTest {
prepare(); prepare();
break; break;
case "check": case "check":
check(args); check();
break;
case "compile":
compile(args);
break; break;
default: default:
throw new Error("unregonized action -- " + args[0]); throw new Error("unregonized action -- " + args[0]);
@ -63,20 +79,27 @@ public abstract class CtwTest {
protected void prepare() throws Exception { } protected void prepare() throws Exception { }
protected void check(String[] args) throws Exception { protected void check() throws Exception {
if (args.length < 2) { try (BufferedReader r = Files.newBufferedReader(Paths.get(LOG_FILE),
throw new Error("logfile isn't specified");
}
String logfile = args[1];
try (BufferedReader r = Files.newBufferedReader(Paths.get(logfile),
Charset.defaultCharset())) { Charset.defaultCharset())) {
OutputAnalyzer output = readOutput(r); OutputAnalyzer output = readOutput(r);
for (String test : shouldContain) { for (String test : shouldContain) {
output.shouldContain(test); output.shouldContain(test);
} }
} }
} }
protected void compile(String[] args) throws Exception {
// concat CTW_COMMAND and args w/o 0th element
String[] cmd = Arrays.copyOf(CTW_COMMAND, CTW_COMMAND.length + args.length - 1);
System.arraycopy(args, 1, cmd, CTW_COMMAND.length, args.length - 1);
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmd);
OutputAnalyzer output = new OutputAnalyzer(pb.start());
dump(output, "compile");
output.shouldHaveExitValue(0);
}
private static OutputAnalyzer readOutput(BufferedReader reader) private static OutputAnalyzer readOutput(BufferedReader reader)
throws IOException { throws IOException {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@ -32,11 +32,11 @@
* java.management * java.management
* jdk.jvmstat/sun.jvmstat.monitor * jdk.jvmstat/sun.jvmstat.monitor
* @build sun.hotspot.WhiteBox Foo Bar * @build sun.hotspot.WhiteBox Foo Bar
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar * @run driver ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
* sun.hotspot.WhiteBox$WhiteBoxPermission * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main JarDirTest prepare * @run driver JarDirTest prepare
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld jars/* * @run driver JarDirTest compile jars/*
* @run main JarDirTest check ctw.log * @run driver JarDirTest check
* @summary testing of CompileTheWorld :: jars in directory * @summary testing of CompileTheWorld :: jars in directory
* @author igor.ignatyev@oracle.com * @author igor.ignatyev@oracle.com
*/ */

View File

@ -32,11 +32,11 @@
* java.management * java.management
* jdk.jvmstat/sun.jvmstat.monitor * jdk.jvmstat/sun.jvmstat.monitor
* @build sun.hotspot.WhiteBox Foo Bar * @build sun.hotspot.WhiteBox Foo Bar
* @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar * @run driver ClassFileInstaller sun.hotspot.WhiteBox Foo Bar
* sun.hotspot.WhiteBox$WhiteBoxPermission * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main JarsTest prepare * @run driver JarsTest prepare
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld foo.jar bar.jar * @run driver JarsTest compile foo.jar bar.jar
* @run main JarsTest check ctw.log * @run driver JarsTest check
* @summary testing of CompileTheWorld :: jars * @summary testing of CompileTheWorld :: jars
* @author igor.ignatyev@oracle.com * @author igor.ignatyev@oracle.com
*/ */