--- a/hotspot/agent/src/os/linux/ps_proc.c Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/agent/src/os/linux/ps_proc.c Mon Feb 16 08:47:39 2015 -0800
@@ -27,9 +27,11 @@
#include <string.h>
#include <signal.h>
#include <errno.h>
+#include <elf.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
+#include <sys/uio.h>
#include "libproc_impl.h"
#if defined(x86_64) && !defined(amd64)
@@ -138,6 +140,15 @@
return false;
}
return true;
+#elif defined(PTRACE_GETREGSET)
+ struct iovec iov;
+ iov.iov_base = user;
+ iov.iov_len = sizeof(*user);
+ if (ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, (void*) &iov) < 0) {
+ print_debug("ptrace(PTRACE_GETREGSET, ...) failed for lwp %d\n", pid);
+ return false;
+ }
+ return true;
#else
print_debug("ptrace(PTRACE_GETREGS, ...) not supported\n");
return false;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java Mon Feb 16 08:47:39 2015 -0800
@@ -423,12 +423,22 @@
protected void writeMethods() throws IOException {
MethodArray methods = klass.getMethods();
- final int len = methods.length();
+ ArrayList<Method> valid_methods = new ArrayList<Method>();
+ for (int i = 0; i < methods.length(); i++) {
+ Method m = methods.at(i);
+ long accessFlags = m.getAccessFlags();
+ // overpass method
+ if (accessFlags == (JVM_ACC_PUBLIC | JVM_ACC_SYNTHETIC | JVM_ACC_BRIDGE)) {
+ continue;
+ }
+ valid_methods.add(m);
+ }
+ final int len = valid_methods.size();
// write number of methods
dos.writeShort((short) len);
if (DEBUG) debugMessage("number of methods = " + len);
for (int m = 0; m < len; m++) {
- writeMethod(methods.at(m));
+ writeMethod(valid_methods.get(m));
}
}
--- a/hotspot/make/aix/makefiles/mapfile-vers-debug Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/aix/makefiles/mapfile-vers-debug Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/aix/makefiles/mapfile-vers-product Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/aix/makefiles/mapfile-vers-product Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/bsd/makefiles/mapfile-vers-darwin-debug Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-darwin-debug Mon Feb 16 08:47:39 2015 -0800
@@ -60,11 +60,6 @@
_JVM_DefineClassWithSourceCond
_JVM_DesiredAssertionStatus
_JVM_DoPrivileged
- _JVM_DTraceGetVersion
- _JVM_DTraceActivate
- _JVM_DTraceIsProbeEnabled
- _JVM_DTraceIsSupported
- _JVM_DTraceDispose
_JVM_DumpAllStacks
_JVM_DumpThreads
_JVM_FillInStackTrace
--- a/hotspot/make/bsd/makefiles/mapfile-vers-darwin-product Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-darwin-product Mon Feb 16 08:47:39 2015 -0800
@@ -60,11 +60,6 @@
_JVM_DefineClassWithSourceCond
_JVM_DesiredAssertionStatus
_JVM_DoPrivileged
- _JVM_DTraceGetVersion
- _JVM_DTraceActivate
- _JVM_DTraceIsProbeEnabled
- _JVM_DTraceIsSupported
- _JVM_DTraceDispose
_JVM_DumpAllStacks
_JVM_DumpThreads
_JVM_FillInStackTrace
--- a/hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/bsd/makefiles/mapfile-vers-product Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-product Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/make/solaris/makefiles/dtrace.make Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/solaris/makefiles/dtrace.make Mon Feb 16 08:47:39 2015 -0800
@@ -336,16 +336,10 @@
.PHONY: dtraceCheck
-SYSTEM_DTRACE_H = /usr/include/dtrace.h
SYSTEM_DTRACE_PROG = /usr/sbin/dtrace
PATCH_DTRACE_PROG = /opt/SUNWdtrd/sbin/dtrace
systemDtraceFound := $(wildcard ${SYSTEM_DTRACE_PROG})
patchDtraceFound := $(wildcard ${PATCH_DTRACE_PROG})
-systemDtraceHdrFound := $(wildcard $(SYSTEM_DTRACE_H))
-
-ifneq ("$(systemDtraceHdrFound)", "")
-CFLAGS += -DHAVE_DTRACE_H
-endif
ifneq ("$(patchDtraceFound)", "")
DTRACE_PROG=$(PATCH_DTRACE_PROG)
--- a/hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/make/solaris/makefiles/mapfile-vers Mon Feb 16 08:47:39 2015 -0800
@@ -62,11 +62,6 @@
JVM_DefineClassWithSourceCond;
JVM_DesiredAssertionStatus;
JVM_DoPrivileged;
- JVM_DTraceGetVersion;
- JVM_DTraceActivate;
- JVM_DTraceIsProbeEnabled;
- JVM_DTraceIsSupported;
- JVM_DTraceDispose;
JVM_DumpAllStacks;
JVM_DumpThreads;
JVM_FillInStackTrace;
--- a/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad Mon Feb 16 08:47:39 2015 -0800
@@ -6365,58 +6365,6 @@
// Prefetch instructions.
// Must be safe to execute with invalid address (cannot fault).
-instruct prefetchr(indirectMemory mem, iRegLsrc src) %{
- match(PrefetchRead (AddP mem src));
- ins_cost(MEMORY_REF_COST);
-
- format %{ "PREFETCH $mem, 0, $src \t// Prefetch read-many" %}
- size(4);
- ins_encode %{
- // TODO: PPC port $archOpcode(ppc64Opcode_dcbt);
- __ dcbt($src$$Register, $mem$$base$$Register);
- %}
- ins_pipe(pipe_class_memory);
-%}
-
-instruct prefetchr_no_offset(indirectMemory mem) %{
- match(PrefetchRead mem);
- ins_cost(MEMORY_REF_COST);
-
- format %{ "PREFETCH $mem" %}
- size(4);
- ins_encode %{
- // TODO: PPC port $archOpcode(ppc64Opcode_dcbt);
- __ dcbt($mem$$base$$Register);
- %}
- ins_pipe(pipe_class_memory);
-%}
-
-instruct prefetchw(indirectMemory mem, iRegLsrc src) %{
- match(PrefetchWrite (AddP mem src));
- ins_cost(MEMORY_REF_COST);
-
- format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many (and read)" %}
- size(4);
- ins_encode %{
- // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst);
- __ dcbtst($src$$Register, $mem$$base$$Register);
- %}
- ins_pipe(pipe_class_memory);
-%}
-
-instruct prefetchw_no_offset(indirectMemory mem) %{
- match(PrefetchWrite mem);
- ins_cost(MEMORY_REF_COST);
-
- format %{ "PREFETCH $mem" %}
- size(4);
- ins_encode %{
- // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst);
- __ dcbtst($mem$$base$$Register);
- %}
- ins_pipe(pipe_class_memory);
-%}
-
// Special prefetch versions which use the dcbz instruction.
instruct prefetch_alloc_zero(indirectMemory mem, iRegLsrc src) %{
match(PrefetchAllocation (AddP mem src));
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -1436,26 +1436,6 @@
}
-void LIR_Assembler::prefetchr(LIR_Opr src) {
- LIR_Address* addr = src->as_address_ptr();
- Address from_addr = as_Address(addr);
-
- if (VM_Version::has_v9()) {
- __ prefetch(from_addr, Assembler::severalReads);
- }
-}
-
-
-void LIR_Assembler::prefetchw(LIR_Opr src) {
- LIR_Address* addr = src->as_address_ptr();
- Address from_addr = as_Address(addr);
-
- if (VM_Version::has_v9()) {
- __ prefetch(from_addr, Assembler::severalWritesAndPossiblyReads);
- }
-}
-
-
void LIR_Assembler::stack2reg(LIR_Opr src, LIR_Opr dest, BasicType type) {
Address addr;
if (src->is_single_word()) {
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.inline.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.inline.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -630,7 +630,12 @@
inline void MacroAssembler::ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset) {
relocate(a.rspec(offset));
- ldf(w, a.base(), a.disp() + offset, d);
+ if (a.has_index()) {
+ assert(offset == 0, "");
+ ldf(w, a.base(), a.index(), d);
+ } else {
+ ldf(w, a.base(), a.disp() + offset, d);
+ }
}
// returns if membar generates anything, obviously this code should mirror
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -36,11 +36,6 @@
#include "c1/c1_Runtime1.hpp"
#endif
-
-bool NativeInstruction::is_dtrace_trap() {
- return !is_nop();
-}
-
void NativeInstruction::set_data64_sethi(address instaddr, intptr_t x) {
ResourceMark rm;
CodeBuffer buf(instaddr, 10 * BytesPerInstWord );
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -51,7 +51,6 @@
nop_instruction_size = 4
};
- bool is_dtrace_trap();
bool is_nop() { return long_at(0) == nop_instruction(); }
bool is_call() { return is_op(long_at(0), Assembler::call_op); }
bool is_sethi() { return (is_op2(long_at(0), Assembler::sethi_op2)
--- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -2758,540 +2758,6 @@
}
-#ifdef HAVE_DTRACE_H
-// ---------------------------------------------------------------------------
-// Generate a dtrace nmethod for a given signature. The method takes arguments
-// in the Java compiled code convention, marshals them to the native
-// abi and then leaves nops at the position you would expect to call a native
-// function. When the probe is enabled the nops are replaced with a trap
-// instruction that dtrace inserts and the trace will cause a notification
-// to dtrace.
-//
-// The probes are only able to take primitive types and java/lang/String as
-// arguments. No other java types are allowed. Strings are converted to utf8
-// strings so that from dtrace point of view java strings are converted to C
-// strings. There is an arbitrary fixed limit on the total space that a method
-// can use for converting the strings. (256 chars per string in the signature).
-// So any java string larger then this is truncated.
-
-static int fp_offset[ConcreteRegisterImpl::number_of_registers] = { 0 };
-static bool offsets_initialized = false;
-
-nmethod *SharedRuntime::generate_dtrace_nmethod(
- MacroAssembler *masm, methodHandle method) {
-
-
- // generate_dtrace_nmethod is guarded by a mutex so we are sure to
- // be single threaded in this method.
- assert(AdapterHandlerLibrary_lock->owned_by_self(), "must be");
-
- // Fill in the signature array, for the calling-convention call.
- int total_args_passed = method->size_of_parameters();
-
- BasicType* in_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed);
- VMRegPair *in_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed);
-
- // The signature we are going to use for the trap that dtrace will see
- // java/lang/String is converted. We drop "this" and any other object
- // is converted to NULL. (A one-slot java/lang/Long object reference
- // is converted to a two-slot long, which is why we double the allocation).
- BasicType* out_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed * 2);
- VMRegPair* out_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed * 2);
-
- int i=0;
- int total_strings = 0;
- int first_arg_to_pass = 0;
- int total_c_args = 0;
-
- // Skip the receiver as dtrace doesn't want to see it
- if( !method->is_static() ) {
- in_sig_bt[i++] = T_OBJECT;
- first_arg_to_pass = 1;
- }
-
- SignatureStream ss(method->signature());
- for ( ; !ss.at_return_type(); ss.next()) {
- BasicType bt = ss.type();
- in_sig_bt[i++] = bt; // Collect remaining bits of signature
- out_sig_bt[total_c_args++] = bt;
- if( bt == T_OBJECT) {
- Symbol* s = ss.as_symbol_or_null();
- if (s == vmSymbols::java_lang_String()) {
- total_strings++;
- out_sig_bt[total_c_args-1] = T_ADDRESS;
- } else if (s == vmSymbols::java_lang_Boolean() ||
- s == vmSymbols::java_lang_Byte()) {
- out_sig_bt[total_c_args-1] = T_BYTE;
- } else if (s == vmSymbols::java_lang_Character() ||
- s == vmSymbols::java_lang_Short()) {
- out_sig_bt[total_c_args-1] = T_SHORT;
- } else if (s == vmSymbols::java_lang_Integer() ||
- s == vmSymbols::java_lang_Float()) {
- out_sig_bt[total_c_args-1] = T_INT;
- } else if (s == vmSymbols::java_lang_Long() ||
- s == vmSymbols::java_lang_Double()) {
- out_sig_bt[total_c_args-1] = T_LONG;
- out_sig_bt[total_c_args++] = T_VOID;
- }
- } else if ( bt == T_LONG || bt == T_DOUBLE ) {
- in_sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
- // We convert double to long
- out_sig_bt[total_c_args-1] = T_LONG;
- out_sig_bt[total_c_args++] = T_VOID;
- } else if ( bt == T_FLOAT) {
- // We convert float to int
- out_sig_bt[total_c_args-1] = T_INT;
- }
- }
-
- assert(i==total_args_passed, "validly parsed signature");
-
- // Now get the compiled-Java layout as input arguments
- int comp_args_on_stack;
- comp_args_on_stack = SharedRuntime::java_calling_convention(
- in_sig_bt, in_regs, total_args_passed, false);
-
- // We have received a description of where all the java arg are located
- // on entry to the wrapper. We need to convert these args to where
- // the a native (non-jni) function would expect them. To figure out
- // where they go we convert the java signature to a C signature and remove
- // T_VOID for any long/double we might have received.
-
-
- // Now figure out where the args must be stored and how much stack space
- // they require (neglecting out_preserve_stack_slots but space for storing
- // the 1st six register arguments). It's weird see int_stk_helper.
- //
- int out_arg_slots;
- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
-
- // Calculate the total number of stack slots we will need.
-
- // First count the abi requirement plus all of the outgoing args
- int stack_slots = SharedRuntime::out_preserve_stack_slots() + out_arg_slots;
-
- // Plus a temp for possible converion of float/double/long register args
-
- int conversion_temp = stack_slots;
- stack_slots += 2;
-
-
- // Now space for the string(s) we must convert
-
- int string_locs = stack_slots;
- stack_slots += total_strings *
- (max_dtrace_string_size / VMRegImpl::stack_slot_size);
-
- // Ok The space we have allocated will look like:
- //
- //
- // FP-> | |
- // |---------------------|
- // | string[n] |
- // |---------------------| <- string_locs[n]
- // | string[n-1] |
- // |---------------------| <- string_locs[n-1]
- // | ... |
- // | ... |
- // |---------------------| <- string_locs[1]
- // | string[0] |
- // |---------------------| <- string_locs[0]
- // | temp |
- // |---------------------| <- conversion_temp
- // | outbound memory |
- // | based arguments |
- // | |
- // |---------------------|
- // | |
- // SP-> | out_preserved_slots |
- //
- //
-
- // Now compute actual number of stack words we need rounding to make
- // stack properly aligned.
- stack_slots = round_to(stack_slots, 4 * VMRegImpl::slots_per_word);
-
- int stack_size = stack_slots * VMRegImpl::stack_slot_size;
-
- intptr_t start = (intptr_t)__ pc();
-
- // First thing make an ic check to see if we should even be here
-
- {
- Label L;
- const Register temp_reg = G3_scratch;
- AddressLiteral ic_miss(SharedRuntime::get_ic_miss_stub());
- __ verify_oop(O0);
- __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), temp_reg);
- __ cmp_and_brx_short(temp_reg, G5_inline_cache_reg, Assembler::equal, Assembler::pt, L);
-
- __ jump_to(ic_miss, temp_reg);
- __ delayed()->nop();
- __ align(CodeEntryAlignment);
- __ bind(L);
- }
-
- int vep_offset = ((intptr_t)__ pc()) - start;
-
-
- // The instruction at the verified entry point must be 5 bytes or longer
- // because it can be patched on the fly by make_non_entrant. The stack bang
- // instruction fits that requirement.
-
- // Generate stack overflow check before creating frame
- __ generate_stack_overflow_check(stack_size);
-
- assert(((intptr_t)__ pc() - start - vep_offset) >= 5,
- "valid size for make_non_entrant");
-
- // Generate a new frame for the wrapper.
- __ save(SP, -stack_size, SP);
-
- // Frame is now completed as far a size and linkage.
-
- int frame_complete = ((intptr_t)__ pc()) - start;
-
-#ifdef ASSERT
- bool reg_destroyed[RegisterImpl::number_of_registers];
- bool freg_destroyed[FloatRegisterImpl::number_of_registers];
- for ( int r = 0 ; r < RegisterImpl::number_of_registers ; r++ ) {
- reg_destroyed[r] = false;
- }
- for ( int f = 0 ; f < FloatRegisterImpl::number_of_registers ; f++ ) {
- freg_destroyed[f] = false;
- }
-
-#endif /* ASSERT */
-
- VMRegPair zero;
- const Register g0 = G0; // without this we get a compiler warning (why??)
- zero.set2(g0->as_VMReg());
-
- int c_arg, j_arg;
-
- Register conversion_off = noreg;
-
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
-
- VMRegPair src = in_regs[j_arg];
- VMRegPair dst = out_regs[c_arg];
-
-#ifdef ASSERT
- if (src.first()->is_Register()) {
- assert(!reg_destroyed[src.first()->as_Register()->encoding()], "ack!");
- } else if (src.first()->is_FloatRegister()) {
- assert(!freg_destroyed[src.first()->as_FloatRegister()->encoding(
- FloatRegisterImpl::S)], "ack!");
- }
- if (dst.first()->is_Register()) {
- reg_destroyed[dst.first()->as_Register()->encoding()] = true;
- } else if (dst.first()->is_FloatRegister()) {
- freg_destroyed[dst.first()->as_FloatRegister()->encoding(
- FloatRegisterImpl::S)] = true;
- }
-#endif /* ASSERT */
-
- switch (in_sig_bt[j_arg]) {
- case T_ARRAY:
- case T_OBJECT:
- {
- if (out_sig_bt[c_arg] == T_BYTE || out_sig_bt[c_arg] == T_SHORT ||
- out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) {
- // need to unbox a one-slot value
- Register in_reg = L0;
- Register tmp = L2;
- if ( src.first()->is_reg() ) {
- in_reg = src.first()->as_Register();
- } else {
- assert(Assembler::is_simm13(reg2offset(src.first()) + STACK_BIAS),
- "must be");
- __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, in_reg);
- }
- // If the final destination is an acceptable register
- if ( dst.first()->is_reg() ) {
- if ( dst.is_single_phys_reg() || out_sig_bt[c_arg] != T_LONG ) {
- tmp = dst.first()->as_Register();
- }
- }
-
- Label skipUnbox;
- if ( wordSize == 4 && out_sig_bt[c_arg] == T_LONG ) {
- __ mov(G0, tmp->successor());
- }
- __ br_null(in_reg, true, Assembler::pn, skipUnbox);
- __ delayed()->mov(G0, tmp);
-
- BasicType bt = out_sig_bt[c_arg];
- int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt);
- switch (bt) {
- case T_BYTE:
- __ ldub(in_reg, box_offset, tmp); break;
- case T_SHORT:
- __ lduh(in_reg, box_offset, tmp); break;
- case T_INT:
- __ ld(in_reg, box_offset, tmp); break;
- case T_LONG:
- __ ld_long(in_reg, box_offset, tmp); break;
- default: ShouldNotReachHere();
- }
-
- __ bind(skipUnbox);
- // If tmp wasn't final destination copy to final destination
- if (tmp == L2) {
- VMRegPair tmp_as_VM = reg64_to_VMRegPair(L2);
- if (out_sig_bt[c_arg] == T_LONG) {
- long_move(masm, tmp_as_VM, dst);
- } else {
- move32_64(masm, tmp_as_VM, out_regs[c_arg]);
- }
- }
- if (out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // move over the T_VOID to keep the loop indices in sync
- }
- } else if (out_sig_bt[c_arg] == T_ADDRESS) {
- Register s =
- src.first()->is_reg() ? src.first()->as_Register() : L2;
- Register d =
- dst.first()->is_reg() ? dst.first()->as_Register() : L2;
-
- // We store the oop now so that the conversion pass can reach
- // while in the inner frame. This will be the only store if
- // the oop is NULL.
- if (s != L2) {
- // src is register
- if (d != L2) {
- // dst is register
- __ mov(s, d);
- } else {
- assert(Assembler::is_simm13(reg2offset(dst.first()) +
- STACK_BIAS), "must be");
- __ st_ptr(s, SP, reg2offset(dst.first()) + STACK_BIAS);
- }
- } else {
- // src not a register
- assert(Assembler::is_simm13(reg2offset(src.first()) +
- STACK_BIAS), "must be");
- __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, d);
- if (d == L2) {
- assert(Assembler::is_simm13(reg2offset(dst.first()) +
- STACK_BIAS), "must be");
- __ st_ptr(d, SP, reg2offset(dst.first()) + STACK_BIAS);
- }
- }
- } else if (out_sig_bt[c_arg] != T_VOID) {
- // Convert the arg to NULL
- if (dst.first()->is_reg()) {
- __ mov(G0, dst.first()->as_Register());
- } else {
- assert(Assembler::is_simm13(reg2offset(dst.first()) +
- STACK_BIAS), "must be");
- __ st_ptr(G0, SP, reg2offset(dst.first()) + STACK_BIAS);
- }
- }
- }
- break;
- case T_VOID:
- break;
-
- case T_FLOAT:
- if (src.first()->is_stack()) {
- // Stack to stack/reg is simple
- move32_64(masm, src, dst);
- } else {
- if (dst.first()->is_reg()) {
- // freg -> reg
- int off =
- STACK_BIAS + conversion_temp * VMRegImpl::stack_slot_size;
- Register d = dst.first()->as_Register();
- if (Assembler::is_simm13(off)) {
- __ stf(FloatRegisterImpl::S, src.first()->as_FloatRegister(),
- SP, off);
- __ ld(SP, off, d);
- } else {
- if (conversion_off == noreg) {
- __ set(off, L6);
- conversion_off = L6;
- }
- __ stf(FloatRegisterImpl::S, src.first()->as_FloatRegister(),
- SP, conversion_off);
- __ ld(SP, conversion_off , d);
- }
- } else {
- // freg -> mem
- int off = STACK_BIAS + reg2offset(dst.first());
- if (Assembler::is_simm13(off)) {
- __ stf(FloatRegisterImpl::S, src.first()->as_FloatRegister(),
- SP, off);
- } else {
- if (conversion_off == noreg) {
- __ set(off, L6);
- conversion_off = L6;
- }
- __ stf(FloatRegisterImpl::S, src.first()->as_FloatRegister(),
- SP, conversion_off);
- }
- }
- }
- break;
-
- case T_DOUBLE:
- assert( j_arg + 1 < total_args_passed &&
- in_sig_bt[j_arg + 1] == T_VOID &&
- out_sig_bt[c_arg+1] == T_VOID, "bad arg list");
- if (src.first()->is_stack()) {
- // Stack to stack/reg is simple
- long_move(masm, src, dst);
- } else {
- Register d = dst.first()->is_reg() ? dst.first()->as_Register() : L2;
-
- // Destination could be an odd reg on 32bit in which case
- // we can't load direct to the destination.
-
- if (!d->is_even() && wordSize == 4) {
- d = L2;
- }
- int off = STACK_BIAS + conversion_temp * VMRegImpl::stack_slot_size;
- if (Assembler::is_simm13(off)) {
- __ stf(FloatRegisterImpl::D, src.first()->as_FloatRegister(),
- SP, off);
- __ ld_long(SP, off, d);
- } else {
- if (conversion_off == noreg) {
- __ set(off, L6);
- conversion_off = L6;
- }
- __ stf(FloatRegisterImpl::D, src.first()->as_FloatRegister(),
- SP, conversion_off);
- __ ld_long(SP, conversion_off, d);
- }
- if (d == L2) {
- long_move(masm, reg64_to_VMRegPair(L2), dst);
- }
- }
- break;
-
- case T_LONG :
- // 32bit can't do a split move of something like g1 -> O0, O1
- // so use a memory temp
- if (src.is_single_phys_reg() && wordSize == 4) {
- Register tmp = L2;
- if (dst.first()->is_reg() &&
- (wordSize == 8 || dst.first()->as_Register()->is_even())) {
- tmp = dst.first()->as_Register();
- }
-
- int off = STACK_BIAS + conversion_temp * VMRegImpl::stack_slot_size;
- if (Assembler::is_simm13(off)) {
- __ stx(src.first()->as_Register(), SP, off);
- __ ld_long(SP, off, tmp);
- } else {
- if (conversion_off == noreg) {
- __ set(off, L6);
- conversion_off = L6;
- }
- __ stx(src.first()->as_Register(), SP, conversion_off);
- __ ld_long(SP, conversion_off, tmp);
- }
-
- if (tmp == L2) {
- long_move(masm, reg64_to_VMRegPair(L2), dst);
- }
- } else {
- long_move(masm, src, dst);
- }
- break;
-
- case T_ADDRESS: assert(false, "found T_ADDRESS in java args");
-
- default:
- move32_64(masm, src, dst);
- }
- }
-
-
- // If we have any strings we must store any register based arg to the stack
- // This includes any still live xmm registers too.
-
- if (total_strings > 0 ) {
-
- // protect all the arg registers
- __ save_frame(0);
- __ mov(G2_thread, L7_thread_cache);
- const Register L2_string_off = L2;
-
- // Get first string offset
- __ set(string_locs * VMRegImpl::stack_slot_size, L2_string_off);
-
- for (c_arg = 0 ; c_arg < total_c_args ; c_arg++ ) {
- if (out_sig_bt[c_arg] == T_ADDRESS) {
-
- VMRegPair dst = out_regs[c_arg];
- const Register d = dst.first()->is_reg() ?
- dst.first()->as_Register()->after_save() : noreg;
-
- // It's a string the oop and it was already copied to the out arg
- // position
- if (d != noreg) {
- __ mov(d, O0);
- } else {
- assert(Assembler::is_simm13(reg2offset(dst.first()) + STACK_BIAS),
- "must be");
- __ ld_ptr(FP, reg2offset(dst.first()) + STACK_BIAS, O0);
- }
- Label skip;
-
- __ br_null(O0, false, Assembler::pn, skip);
- __ delayed()->add(FP, L2_string_off, O1);
-
- if (d != noreg) {
- __ mov(O1, d);
- } else {
- assert(Assembler::is_simm13(reg2offset(dst.first()) + STACK_BIAS),
- "must be");
- __ st_ptr(O1, FP, reg2offset(dst.first()) + STACK_BIAS);
- }
-
- __ call(CAST_FROM_FN_PTR(address, SharedRuntime::get_utf),
- relocInfo::runtime_call_type);
- __ delayed()->add(L2_string_off, max_dtrace_string_size, L2_string_off);
-
- __ bind(skip);
-
- }
-
- }
- __ mov(L7_thread_cache, G2_thread);
- __ restore();
-
- }
-
-
- // Ok now we are done. Need to place the nop that dtrace wants in order to
- // patch in the trap
-
- int patch_offset = ((intptr_t)__ pc()) - start;
-
- __ nop();
-
-
- // Return
-
- __ ret();
- __ delayed()->restore();
-
- __ flush();
-
- nmethod *nm = nmethod::new_dtrace_nmethod(
- method, masm->code(), vep_offset, patch_offset, frame_complete,
- stack_slots / VMRegImpl::slots_per_word);
- return nm;
-
-}
-
-#endif // HAVE_DTRACE_H
-
// this function returns the adjust size (in number of words) to a c2i adapter
// activation for use during deoptimization
int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals) {
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Mon Feb 16 08:47:39 2015 -0800
@@ -889,8 +889,6 @@
!(n->ideal_Opcode()==Op_LoadD_unaligned && ld_op==Op_LoadF) &&
!(n->ideal_Opcode()==Op_ConvI2F && ld_op==Op_LoadF) &&
!(n->ideal_Opcode()==Op_ConvI2D && ld_op==Op_LoadF) &&
- !(n->ideal_Opcode()==Op_PrefetchRead && ld_op==Op_LoadI) &&
- !(n->ideal_Opcode()==Op_PrefetchWrite && ld_op==Op_LoadI) &&
!(n->ideal_Opcode()==Op_PrefetchAllocation && ld_op==Op_LoadI) &&
!(n->ideal_Opcode()==Op_LoadVector && ld_op==Op_LoadD) &&
!(n->rule() == loadUB_rule)) {
@@ -6316,33 +6314,9 @@
ins_pipe(loadConFD);
%}
-// Prefetch instructions.
+// Prefetch instructions for allocation.
// Must be safe to execute with invalid address (cannot fault).
-instruct prefetchr( memory mem ) %{
- match( PrefetchRead mem );
- ins_cost(MEMORY_REF_COST);
- size(4);
-
- format %{ "PREFETCH $mem,0\t! Prefetch read-many" %}
- opcode(Assembler::prefetch_op3);
- ins_encode( form3_mem_prefetch_read( mem ) );
- ins_pipe(iload_mem);
-%}
-
-instruct prefetchw( memory mem ) %{
- match( PrefetchWrite mem );
- ins_cost(MEMORY_REF_COST);
- size(4);
-
- format %{ "PREFETCH $mem,2\t! Prefetch write-many (and read)" %}
- opcode(Assembler::prefetch_op3);
- ins_encode( form3_mem_prefetch_write( mem ) );
- ins_pipe(iload_mem);
-%}
-
-// Prefetch instructions for allocation.
-
instruct prefetchAlloc( memory mem ) %{
predicate(AllocatePrefetchInstr == 0);
match( PrefetchAllocation mem );
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -1398,50 +1398,6 @@
}
-void LIR_Assembler::prefetchr(LIR_Opr src) {
- LIR_Address* addr = src->as_address_ptr();
- Address from_addr = as_Address(addr);
-
- if (VM_Version::supports_sse()) {
- switch (ReadPrefetchInstr) {
- case 0:
- __ prefetchnta(from_addr); break;
- case 1:
- __ prefetcht0(from_addr); break;
- case 2:
- __ prefetcht2(from_addr); break;
- default:
- ShouldNotReachHere(); break;
- }
- } else if (VM_Version::supports_3dnow_prefetch()) {
- __ prefetchr(from_addr);
- }
-}
-
-
-void LIR_Assembler::prefetchw(LIR_Opr src) {
- LIR_Address* addr = src->as_address_ptr();
- Address from_addr = as_Address(addr);
-
- if (VM_Version::supports_sse()) {
- switch (AllocatePrefetchInstr) {
- case 0:
- __ prefetchnta(from_addr); break;
- case 1:
- __ prefetcht0(from_addr); break;
- case 2:
- __ prefetcht2(from_addr); break;
- case 3:
- __ prefetchw(from_addr); break;
- default:
- ShouldNotReachHere(); break;
- }
- } else if (VM_Version::supports_3dnow_prefetch()) {
- __ prefetchw(from_addr);
- }
-}
-
-
NEEDS_CLEANUP; // This could be static?
Address::ScaleFactor LIR_Assembler::array_element_size(BasicType type) const {
int elem_size = type2aelembytes(type);
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -90,9 +90,6 @@
product(intx, FenceInstruction, 0, \
"(Unsafe,Unstable) Experimental") \
\
- product(intx, ReadPrefetchInstr, 0, \
- "Prefetch instruction to prefetch ahead") \
- \
product(bool, UseStoreImmI16, true, \
"Use store immediate 16-bits value instruction on x86") \
\
--- a/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -602,7 +602,3 @@
else
return addr_at(0) + length + sbyte_at(offset);
}
-
-bool NativeInstruction::is_dtrace_trap() {
- return (*(int32_t*)this & 0xff) == 0xcc;
-}
--- a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -59,7 +59,6 @@
};
bool is_nop() { return ubyte_at(0) == nop_instruction_code; }
- bool is_dtrace_trap();
inline bool is_call();
inline bool is_illegal();
inline bool is_return();
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -2415,381 +2415,6 @@
}
-#ifdef HAVE_DTRACE_H
-// ---------------------------------------------------------------------------
-// Generate a dtrace nmethod for a given signature. The method takes arguments
-// in the Java compiled code convention, marshals them to the native
-// abi and then leaves nops at the position you would expect to call a native
-// function. When the probe is enabled the nops are replaced with a trap
-// instruction that dtrace inserts and the trace will cause a notification
-// to dtrace.
-//
-// The probes are only able to take primitive types and java/lang/String as
-// arguments. No other java types are allowed. Strings are converted to utf8
-// strings so that from dtrace point of view java strings are converted to C
-// strings. There is an arbitrary fixed limit on the total space that a method
-// can use for converting the strings. (256 chars per string in the signature).
-// So any java string larger then this is truncated.
-
-nmethod *SharedRuntime::generate_dtrace_nmethod(
- MacroAssembler *masm, methodHandle method) {
-
- // generate_dtrace_nmethod is guarded by a mutex so we are sure to
- // be single threaded in this method.
- assert(AdapterHandlerLibrary_lock->owned_by_self(), "must be");
-
- // Fill in the signature array, for the calling-convention call.
- int total_args_passed = method->size_of_parameters();
-
- BasicType* in_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed);
- VMRegPair *in_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed);
-
- // The signature we are going to use for the trap that dtrace will see
- // java/lang/String is converted. We drop "this" and any other object
- // is converted to NULL. (A one-slot java/lang/Long object reference
- // is converted to a two-slot long, which is why we double the allocation).
- BasicType* out_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed * 2);
- VMRegPair* out_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed * 2);
-
- int i=0;
- int total_strings = 0;
- int first_arg_to_pass = 0;
- int total_c_args = 0;
-
- if( !method->is_static() ) { // Pass in receiver first
- in_sig_bt[i++] = T_OBJECT;
- first_arg_to_pass = 1;
- }
-
- // We need to convert the java args to where a native (non-jni) function
- // would expect them. To figure out where they go we convert the java
- // signature to a C signature.
-
- SignatureStream ss(method->signature());
- for ( ; !ss.at_return_type(); ss.next()) {
- BasicType bt = ss.type();
- in_sig_bt[i++] = bt; // Collect remaining bits of signature
- out_sig_bt[total_c_args++] = bt;
- if( bt == T_OBJECT) {
- Symbol* s = ss.as_symbol_or_null(); // symbol is created
- if (s == vmSymbols::java_lang_String()) {
- total_strings++;
- out_sig_bt[total_c_args-1] = T_ADDRESS;
- } else if (s == vmSymbols::java_lang_Boolean() ||
- s == vmSymbols::java_lang_Character() ||
- s == vmSymbols::java_lang_Byte() ||
- s == vmSymbols::java_lang_Short() ||
- s == vmSymbols::java_lang_Integer() ||
- s == vmSymbols::java_lang_Float()) {
- out_sig_bt[total_c_args-1] = T_INT;
- } else if (s == vmSymbols::java_lang_Long() ||
- s == vmSymbols::java_lang_Double()) {
- out_sig_bt[total_c_args-1] = T_LONG;
- out_sig_bt[total_c_args++] = T_VOID;
- }
- } else if ( bt == T_LONG || bt == T_DOUBLE ) {
- in_sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
- out_sig_bt[total_c_args++] = T_VOID;
- }
- }
-
- assert(i==total_args_passed, "validly parsed signature");
-
- // Now get the compiled-Java layout as input arguments
- int comp_args_on_stack;
- comp_args_on_stack = SharedRuntime::java_calling_convention(
- in_sig_bt, in_regs, total_args_passed, false);
-
- // Now figure out where the args must be stored and how much stack space
- // they require (neglecting out_preserve_stack_slots).
-
- int out_arg_slots;
- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
-
- // Calculate the total number of stack slots we will need.
-
- // First count the abi requirement plus all of the outgoing args
- int stack_slots = SharedRuntime::out_preserve_stack_slots() + out_arg_slots;
-
- // Now space for the string(s) we must convert
-
- int* string_locs = NEW_RESOURCE_ARRAY(int, total_strings + 1);
- for (i = 0; i < total_strings ; i++) {
- string_locs[i] = stack_slots;
- stack_slots += max_dtrace_string_size / VMRegImpl::stack_slot_size;
- }
-
- // + 2 for return address (which we own) and saved rbp,
-
- stack_slots += 2;
-
- // Ok The space we have allocated will look like:
- //
- //
- // FP-> | |
- // |---------------------|
- // | string[n] |
- // |---------------------| <- string_locs[n]
- // | string[n-1] |
- // |---------------------| <- string_locs[n-1]
- // | ... |
- // | ... |
- // |---------------------| <- string_locs[1]
- // | string[0] |
- // |---------------------| <- string_locs[0]
- // | outbound memory |
- // | based arguments |
- // | |
- // |---------------------|
- // | |
- // SP-> | out_preserved_slots |
- //
- //
-
- // Now compute actual number of stack words we need rounding to make
- // stack properly aligned.
- stack_slots = round_to(stack_slots, 2 * VMRegImpl::slots_per_word);
-
- int stack_size = stack_slots * VMRegImpl::stack_slot_size;
-
- intptr_t start = (intptr_t)__ pc();
-
- // First thing make an ic check to see if we should even be here
-
- // We are free to use all registers as temps without saving them and
- // restoring them except rbp. rbp, is the only callee save register
- // as far as the interpreter and the compiler(s) are concerned.
-
- const Register ic_reg = rax;
- const Register receiver = rcx;
- Label hit;
- Label exception_pending;
-
-
- __ verify_oop(receiver);
- __ cmpl(ic_reg, Address(receiver, oopDesc::klass_offset_in_bytes()));
- __ jcc(Assembler::equal, hit);
-
- __ jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
-
- // verified entry must be aligned for code patching.
- // and the first 5 bytes must be in the same cache line
- // if we align at 8 then we will be sure 5 bytes are in the same line
- __ align(8);
-
- __ bind(hit);
-
- int vep_offset = ((intptr_t)__ pc()) - start;
-
-
- // The instruction at the verified entry point must be 5 bytes or longer
- // because it can be patched on the fly by make_non_entrant. The stack bang
- // instruction fits that requirement.
-
- // Generate stack overflow check
-
-
- if (UseStackBanging) {
- if (stack_size <= StackShadowPages*os::vm_page_size()) {
- __ bang_stack_with_offset(StackShadowPages*os::vm_page_size());
- } else {
- __ movl(rax, stack_size);
- __ bang_stack_size(rax, rbx);
- }
- } else {
- // need a 5 byte instruction to allow MT safe patching to non-entrant
- __ fat_nop();
- }
-
- assert(((int)__ pc() - start - vep_offset) >= 5,
- "valid size for make_non_entrant");
-
- // Generate a new frame for the wrapper.
- __ enter();
-
- // -2 because return address is already present and so is saved rbp,
- if (stack_size - 2*wordSize != 0) {
- __ subl(rsp, stack_size - 2*wordSize);
- }
-
- // Frame is now completed as far a size and linkage.
-
- int frame_complete = ((intptr_t)__ pc()) - start;
-
- // First thing we do store all the args as if we are doing the call.
- // Since the C calling convention is stack based that ensures that
- // all the Java register args are stored before we need to convert any
- // string we might have.
-
- int sid = 0;
- int c_arg, j_arg;
- int string_reg = 0;
-
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
-
- VMRegPair src = in_regs[j_arg];
- VMRegPair dst = out_regs[c_arg];
- assert(dst.first()->is_stack() || in_sig_bt[j_arg] == T_VOID,
- "stack based abi assumed");
-
- switch (in_sig_bt[j_arg]) {
-
- case T_ARRAY:
- case T_OBJECT:
- if (out_sig_bt[c_arg] == T_ADDRESS) {
- // Any register based arg for a java string after the first
- // will be destroyed by the call to get_utf so we store
- // the original value in the location the utf string address
- // will eventually be stored.
- if (src.first()->is_reg()) {
- if (string_reg++ != 0) {
- simple_move32(masm, src, dst);
- }
- }
- } else if (out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) {
- // need to unbox a one-word value
- Register in_reg = rax;
- if ( src.first()->is_reg() ) {
- in_reg = src.first()->as_Register();
- } else {
- simple_move32(masm, src, in_reg->as_VMReg());
- }
- Label skipUnbox;
- __ movl(Address(rsp, reg2offset_out(dst.first())), NULL_WORD);
- if ( out_sig_bt[c_arg] == T_LONG ) {
- __ movl(Address(rsp, reg2offset_out(dst.second())), NULL_WORD);
- }
- __ testl(in_reg, in_reg);
- __ jcc(Assembler::zero, skipUnbox);
- assert(dst.first()->is_stack() &&
- (!dst.second()->is_valid() || dst.second()->is_stack()),
- "value(s) must go into stack slots");
-
- BasicType bt = out_sig_bt[c_arg];
- int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt);
- if ( bt == T_LONG ) {
- __ movl(rbx, Address(in_reg,
- box_offset + VMRegImpl::stack_slot_size));
- __ movl(Address(rsp, reg2offset_out(dst.second())), rbx);
- }
- __ movl(in_reg, Address(in_reg, box_offset));
- __ movl(Address(rsp, reg2offset_out(dst.first())), in_reg);
- __ bind(skipUnbox);
- } else {
- // Convert the arg to NULL
- __ movl(Address(rsp, reg2offset_out(dst.first())), NULL_WORD);
- }
- if (out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // Move over the T_VOID To keep the loop indices in sync
- }
- break;
-
- case T_VOID:
- break;
-
- case T_FLOAT:
- float_move(masm, src, dst);
- break;
-
- case T_DOUBLE:
- assert( j_arg + 1 < total_args_passed &&
- in_sig_bt[j_arg + 1] == T_VOID, "bad arg list");
- double_move(masm, src, dst);
- break;
-
- case T_LONG :
- long_move(masm, src, dst);
- break;
-
- case T_ADDRESS: assert(false, "found T_ADDRESS in java args");
-
- default:
- simple_move32(masm, src, dst);
- }
- }
-
- // Now we must convert any string we have to utf8
- //
-
- for (sid = 0, j_arg = first_arg_to_pass, c_arg = 0 ;
- sid < total_strings ; j_arg++, c_arg++ ) {
-
- if (out_sig_bt[c_arg] == T_ADDRESS) {
-
- Address utf8_addr = Address(
- rsp, string_locs[sid++] * VMRegImpl::stack_slot_size);
- __ leal(rax, utf8_addr);
-
- // The first string we find might still be in the original java arg
- // register
- VMReg orig_loc = in_regs[j_arg].first();
- Register string_oop;
-
- // This is where the argument will eventually reside
- Address dest = Address(rsp, reg2offset_out(out_regs[c_arg].first()));
-
- if (sid == 1 && orig_loc->is_reg()) {
- string_oop = orig_loc->as_Register();
- assert(string_oop != rax, "smashed arg");
- } else {
-
- if (orig_loc->is_reg()) {
- // Get the copy of the jls object
- __ movl(rcx, dest);
- } else {
- // arg is still in the original location
- __ movl(rcx, Address(rbp, reg2offset_in(orig_loc)));
- }
- string_oop = rcx;
-
- }
- Label nullString;
- __ movl(dest, NULL_WORD);
- __ testl(string_oop, string_oop);
- __ jcc(Assembler::zero, nullString);
-
- // Now we can store the address of the utf string as the argument
- __ movl(dest, rax);
-
- // And do the conversion
- __ call_VM_leaf(CAST_FROM_FN_PTR(
- address, SharedRuntime::get_utf), string_oop, rax);
- __ bind(nullString);
- }
-
- if (in_sig_bt[j_arg] == T_OBJECT && out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // Move over the T_VOID To keep the loop indices in sync
- }
- }
-
-
- // Ok now we are done. Need to place the nop that dtrace wants in order to
- // patch in the trap
-
- int patch_offset = ((intptr_t)__ pc()) - start;
-
- __ nop();
-
-
- // Return
-
- __ leave();
- __ ret(0);
-
- __ flush();
-
- nmethod *nm = nmethod::new_dtrace_nmethod(
- method, masm->code(), vep_offset, patch_offset, frame_complete,
- stack_slots / VMRegImpl::slots_per_word);
- return nm;
-
-}
-
-#endif // HAVE_DTRACE_H
-
// this function returns the adjust size (in number of words) to a c2i adapter
// activation for use during deoptimization
int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals ) {
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -2650,630 +2650,6 @@
}
-#ifdef HAVE_DTRACE_H
-// ---------------------------------------------------------------------------
-// Generate a dtrace nmethod for a given signature. The method takes arguments
-// in the Java compiled code convention, marshals them to the native
-// abi and then leaves nops at the position you would expect to call a native
-// function. When the probe is enabled the nops are replaced with a trap
-// instruction that dtrace inserts and the trace will cause a notification
-// to dtrace.
-//
-// The probes are only able to take primitive types and java/lang/String as
-// arguments. No other java types are allowed. Strings are converted to utf8
-// strings so that from dtrace point of view java strings are converted to C
-// strings. There is an arbitrary fixed limit on the total space that a method
-// can use for converting the strings. (256 chars per string in the signature).
-// So any java string larger then this is truncated.
-
-static int fp_offset[ConcreteRegisterImpl::number_of_registers] = { 0 };
-static bool offsets_initialized = false;
-
-
-nmethod *SharedRuntime::generate_dtrace_nmethod(MacroAssembler *masm,
- methodHandle method) {
-
-
- // generate_dtrace_nmethod is guarded by a mutex so we are sure to
- // be single threaded in this method.
- assert(AdapterHandlerLibrary_lock->owned_by_self(), "must be");
-
- if (!offsets_initialized) {
- fp_offset[c_rarg0->as_VMReg()->value()] = -1 * wordSize;
- fp_offset[c_rarg1->as_VMReg()->value()] = -2 * wordSize;
- fp_offset[c_rarg2->as_VMReg()->value()] = -3 * wordSize;
- fp_offset[c_rarg3->as_VMReg()->value()] = -4 * wordSize;
- fp_offset[c_rarg4->as_VMReg()->value()] = -5 * wordSize;
- fp_offset[c_rarg5->as_VMReg()->value()] = -6 * wordSize;
-
- fp_offset[c_farg0->as_VMReg()->value()] = -7 * wordSize;
- fp_offset[c_farg1->as_VMReg()->value()] = -8 * wordSize;
- fp_offset[c_farg2->as_VMReg()->value()] = -9 * wordSize;
- fp_offset[c_farg3->as_VMReg()->value()] = -10 * wordSize;
- fp_offset[c_farg4->as_VMReg()->value()] = -11 * wordSize;
- fp_offset[c_farg5->as_VMReg()->value()] = -12 * wordSize;
- fp_offset[c_farg6->as_VMReg()->value()] = -13 * wordSize;
- fp_offset[c_farg7->as_VMReg()->value()] = -14 * wordSize;
-
- offsets_initialized = true;
- }
- // Fill in the signature array, for the calling-convention call.
- int total_args_passed = method->size_of_parameters();
-
- BasicType* in_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed);
- VMRegPair *in_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed);
-
- // The signature we are going to use for the trap that dtrace will see
- // java/lang/String is converted. We drop "this" and any other object
- // is converted to NULL. (A one-slot java/lang/Long object reference
- // is converted to a two-slot long, which is why we double the allocation).
- BasicType* out_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed * 2);
- VMRegPair* out_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed * 2);
-
- int i=0;
- int total_strings = 0;
- int first_arg_to_pass = 0;
- int total_c_args = 0;
-
- // Skip the receiver as dtrace doesn't want to see it
- if( !method->is_static() ) {
- in_sig_bt[i++] = T_OBJECT;
- first_arg_to_pass = 1;
- }
-
- // We need to convert the java args to where a native (non-jni) function
- // would expect them. To figure out where they go we convert the java
- // signature to a C signature.
-
- SignatureStream ss(method->signature());
- for ( ; !ss.at_return_type(); ss.next()) {
- BasicType bt = ss.type();
- in_sig_bt[i++] = bt; // Collect remaining bits of signature
- out_sig_bt[total_c_args++] = bt;
- if( bt == T_OBJECT) {
- Symbol* s = ss.as_symbol_or_null(); // symbol is created
- if (s == vmSymbols::java_lang_String()) {
- total_strings++;
- out_sig_bt[total_c_args-1] = T_ADDRESS;
- } else if (s == vmSymbols::java_lang_Boolean() ||
- s == vmSymbols::java_lang_Character() ||
- s == vmSymbols::java_lang_Byte() ||
- s == vmSymbols::java_lang_Short() ||
- s == vmSymbols::java_lang_Integer() ||
- s == vmSymbols::java_lang_Float()) {
- out_sig_bt[total_c_args-1] = T_INT;
- } else if (s == vmSymbols::java_lang_Long() ||
- s == vmSymbols::java_lang_Double()) {
- out_sig_bt[total_c_args-1] = T_LONG;
- out_sig_bt[total_c_args++] = T_VOID;
- }
- } else if ( bt == T_LONG || bt == T_DOUBLE ) {
- in_sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
- // We convert double to long
- out_sig_bt[total_c_args-1] = T_LONG;
- out_sig_bt[total_c_args++] = T_VOID;
- } else if ( bt == T_FLOAT) {
- // We convert float to int
- out_sig_bt[total_c_args-1] = T_INT;
- }
- }
-
- assert(i==total_args_passed, "validly parsed signature");
-
- // Now get the compiled-Java layout as input arguments
- int comp_args_on_stack;
- comp_args_on_stack = SharedRuntime::java_calling_convention(
- in_sig_bt, in_regs, total_args_passed, false);
-
- // Now figure out where the args must be stored and how much stack space
- // they require (neglecting out_preserve_stack_slots but space for storing
- // the 1st six register arguments). It's weird see int_stk_helper.
-
- int out_arg_slots;
- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
-
- // Calculate the total number of stack slots we will need.
-
- // First count the abi requirement plus all of the outgoing args
- int stack_slots = SharedRuntime::out_preserve_stack_slots() + out_arg_slots;
-
- // Now space for the string(s) we must convert
- int* string_locs = NEW_RESOURCE_ARRAY(int, total_strings + 1);
- for (i = 0; i < total_strings ; i++) {
- string_locs[i] = stack_slots;
- stack_slots += max_dtrace_string_size / VMRegImpl::stack_slot_size;
- }
-
- // Plus the temps we might need to juggle register args
- // regs take two slots each
- stack_slots += (Argument::n_int_register_parameters_c +
- Argument::n_float_register_parameters_c) * 2;
-
-
- // + 4 for return address (which we own) and saved rbp,
-
- stack_slots += 4;
-
- // Ok The space we have allocated will look like:
- //
- //
- // FP-> | |
- // |---------------------|
- // | string[n] |
- // |---------------------| <- string_locs[n]
- // | string[n-1] |
- // |---------------------| <- string_locs[n-1]
- // | ... |
- // | ... |
- // |---------------------| <- string_locs[1]
- // | string[0] |
- // |---------------------| <- string_locs[0]
- // | outbound memory |
- // | based arguments |
- // | |
- // |---------------------|
- // | |
- // SP-> | out_preserved_slots |
- //
- //
-
- // Now compute actual number of stack words we need rounding to make
- // stack properly aligned.
- stack_slots = round_to(stack_slots, 4 * VMRegImpl::slots_per_word);
-
- int stack_size = stack_slots * VMRegImpl::stack_slot_size;
-
- intptr_t start = (intptr_t)__ pc();
-
- // First thing make an ic check to see if we should even be here
-
- // We are free to use all registers as temps without saving them and
- // restoring them except rbp. rbp, is the only callee save register
- // as far as the interpreter and the compiler(s) are concerned.
-
- const Register ic_reg = rax;
- const Register receiver = rcx;
- Label hit;
- Label exception_pending;
-
-
- __ verify_oop(receiver);
- __ cmpl(ic_reg, Address(receiver, oopDesc::klass_offset_in_bytes()));
- __ jcc(Assembler::equal, hit);
-
- __ jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
-
- // verified entry must be aligned for code patching.
- // and the first 5 bytes must be in the same cache line
- // if we align at 8 then we will be sure 5 bytes are in the same line
- __ align(8);
-
- __ bind(hit);
-
- int vep_offset = ((intptr_t)__ pc()) - start;
-
-
- // The instruction at the verified entry point must be 5 bytes or longer
- // because it can be patched on the fly by make_non_entrant. The stack bang
- // instruction fits that requirement.
-
- // Generate stack overflow check
-
- if (UseStackBanging) {
- if (stack_size <= StackShadowPages*os::vm_page_size()) {
- __ bang_stack_with_offset(StackShadowPages*os::vm_page_size());
- } else {
- __ movl(rax, stack_size);
- __ bang_stack_size(rax, rbx);
- }
- } else {
- // need a 5 byte instruction to allow MT safe patching to non-entrant
- __ fat_nop();
- }
-
- assert(((uintptr_t)__ pc() - start - vep_offset) >= 5,
- "valid size for make_non_entrant");
-
- // Generate a new frame for the wrapper.
- __ enter();
-
- // -4 because return address is already present and so is saved rbp,
- if (stack_size - 2*wordSize != 0) {
- __ subq(rsp, stack_size - 2*wordSize);
- }
-
- // Frame is now completed as far a size and linkage.
-
- int frame_complete = ((intptr_t)__ pc()) - start;
-
- int c_arg, j_arg;
-
- // State of input register args
-
- bool live[ConcreteRegisterImpl::number_of_registers];
-
- live[j_rarg0->as_VMReg()->value()] = false;
- live[j_rarg1->as_VMReg()->value()] = false;
- live[j_rarg2->as_VMReg()->value()] = false;
- live[j_rarg3->as_VMReg()->value()] = false;
- live[j_rarg4->as_VMReg()->value()] = false;
- live[j_rarg5->as_VMReg()->value()] = false;
-
- live[j_farg0->as_VMReg()->value()] = false;
- live[j_farg1->as_VMReg()->value()] = false;
- live[j_farg2->as_VMReg()->value()] = false;
- live[j_farg3->as_VMReg()->value()] = false;
- live[j_farg4->as_VMReg()->value()] = false;
- live[j_farg5->as_VMReg()->value()] = false;
- live[j_farg6->as_VMReg()->value()] = false;
- live[j_farg7->as_VMReg()->value()] = false;
-
-
- bool rax_is_zero = false;
-
- // All args (except strings) destined for the stack are moved first
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
- VMRegPair src = in_regs[j_arg];
- VMRegPair dst = out_regs[c_arg];
-
- // Get the real reg value or a dummy (rsp)
-
- int src_reg = src.first()->is_reg() ?
- src.first()->value() :
- rsp->as_VMReg()->value();
-
- bool useless = in_sig_bt[j_arg] == T_ARRAY ||
- (in_sig_bt[j_arg] == T_OBJECT &&
- out_sig_bt[c_arg] != T_INT &&
- out_sig_bt[c_arg] != T_ADDRESS &&
- out_sig_bt[c_arg] != T_LONG);
-
- live[src_reg] = !useless;
-
- if (dst.first()->is_stack()) {
-
- // Even though a string arg in a register is still live after this loop
- // after the string conversion loop (next) it will be dead so we take
- // advantage of that now for simpler code to manage live.
-
- live[src_reg] = false;
- switch (in_sig_bt[j_arg]) {
-
- case T_ARRAY:
- case T_OBJECT:
- {
- Address stack_dst(rsp, reg2offset_out(dst.first()));
-
- if (out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) {
- // need to unbox a one-word value
- Register in_reg = rax;
- if ( src.first()->is_reg() ) {
- in_reg = src.first()->as_Register();
- } else {
- __ movq(rax, Address(rbp, reg2offset_in(src.first())));
- rax_is_zero = false;
- }
- Label skipUnbox;
- __ movptr(Address(rsp, reg2offset_out(dst.first())),
- (int32_t)NULL_WORD);
- __ testq(in_reg, in_reg);
- __ jcc(Assembler::zero, skipUnbox);
-
- BasicType bt = out_sig_bt[c_arg];
- int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt);
- Address src1(in_reg, box_offset);
- if ( bt == T_LONG ) {
- __ movq(in_reg, src1);
- __ movq(stack_dst, in_reg);
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // skip over T_VOID to keep the loop indices in sync
- } else {
- __ movl(in_reg, src1);
- __ movl(stack_dst, in_reg);
- }
-
- __ bind(skipUnbox);
- } else if (out_sig_bt[c_arg] != T_ADDRESS) {
- // Convert the arg to NULL
- if (!rax_is_zero) {
- __ xorq(rax, rax);
- rax_is_zero = true;
- }
- __ movq(stack_dst, rax);
- }
- }
- break;
-
- case T_VOID:
- break;
-
- case T_FLOAT:
- // This does the right thing since we know it is destined for the
- // stack
- float_move(masm, src, dst);
- break;
-
- case T_DOUBLE:
- // This does the right thing since we know it is destined for the
- // stack
- double_move(masm, src, dst);
- break;
-
- case T_LONG :
- long_move(masm, src, dst);
- break;
-
- case T_ADDRESS: assert(false, "found T_ADDRESS in java args");
-
- default:
- move32_64(masm, src, dst);
- }
- }
-
- }
-
- // If we have any strings we must store any register based arg to the stack
- // This includes any still live xmm registers too.
-
- int sid = 0;
-
- if (total_strings > 0 ) {
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
- VMRegPair src = in_regs[j_arg];
- VMRegPair dst = out_regs[c_arg];
-
- if (src.first()->is_reg()) {
- Address src_tmp(rbp, fp_offset[src.first()->value()]);
-
- // string oops were left untouched by the previous loop even if the
- // eventual (converted) arg is destined for the stack so park them
- // away now (except for first)
-
- if (out_sig_bt[c_arg] == T_ADDRESS) {
- Address utf8_addr = Address(
- rsp, string_locs[sid++] * VMRegImpl::stack_slot_size);
- if (sid != 1) {
- // The first string arg won't be killed until after the utf8
- // conversion
- __ movq(utf8_addr, src.first()->as_Register());
- }
- } else if (dst.first()->is_reg()) {
- if (in_sig_bt[j_arg] == T_FLOAT || in_sig_bt[j_arg] == T_DOUBLE) {
-
- // Convert the xmm register to an int and store it in the reserved
- // location for the eventual c register arg
- XMMRegister f = src.first()->as_XMMRegister();
- if (in_sig_bt[j_arg] == T_FLOAT) {
- __ movflt(src_tmp, f);
- } else {
- __ movdbl(src_tmp, f);
- }
- } else {
- // If the arg is an oop type we don't support don't bother to store
- // it remember string was handled above.
- bool useless = in_sig_bt[j_arg] == T_ARRAY ||
- (in_sig_bt[j_arg] == T_OBJECT &&
- out_sig_bt[c_arg] != T_INT &&
- out_sig_bt[c_arg] != T_LONG);
-
- if (!useless) {
- __ movq(src_tmp, src.first()->as_Register());
- }
- }
- }
- }
- if (in_sig_bt[j_arg] == T_OBJECT && out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // skip over T_VOID to keep the loop indices in sync
- }
- }
-
- // Now that the volatile registers are safe, convert all the strings
- sid = 0;
-
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
- if (out_sig_bt[c_arg] == T_ADDRESS) {
- // It's a string
- Address utf8_addr = Address(
- rsp, string_locs[sid++] * VMRegImpl::stack_slot_size);
- // The first string we find might still be in the original java arg
- // register
-
- VMReg src = in_regs[j_arg].first();
-
- // We will need to eventually save the final argument to the trap
- // in the von-volatile location dedicated to src. This is the offset
- // from fp we will use.
- int src_off = src->is_reg() ?
- fp_offset[src->value()] : reg2offset_in(src);
-
- // This is where the argument will eventually reside
- VMRegPair dst = out_regs[c_arg];
-
- if (src->is_reg()) {
- if (sid == 1) {
- __ movq(c_rarg0, src->as_Register());
- } else {
- __ movq(c_rarg0, utf8_addr);
- }
- } else {
- // arg is still in the original location
- __ movq(c_rarg0, Address(rbp, reg2offset_in(src)));
- }
- Label done, convert;
-
- // see if the oop is NULL
- __ testq(c_rarg0, c_rarg0);
- __ jcc(Assembler::notEqual, convert);
-
- if (dst.first()->is_reg()) {
- // Save the ptr to utf string in the origina src loc or the tmp
- // dedicated to it
- __ movq(Address(rbp, src_off), c_rarg0);
- } else {
- __ movq(Address(rsp, reg2offset_out(dst.first())), c_rarg0);
- }
- __ jmp(done);
-
- __ bind(convert);
-
- __ lea(c_rarg1, utf8_addr);
- if (dst.first()->is_reg()) {
- __ movq(Address(rbp, src_off), c_rarg1);
- } else {
- __ movq(Address(rsp, reg2offset_out(dst.first())), c_rarg1);
- }
- // And do the conversion
- __ call(RuntimeAddress(
- CAST_FROM_FN_PTR(address, SharedRuntime::get_utf)));
-
- __ bind(done);
- }
- if (in_sig_bt[j_arg] == T_OBJECT && out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // skip over T_VOID to keep the loop indices in sync
- }
- }
- // The get_utf call killed all the c_arg registers
- live[c_rarg0->as_VMReg()->value()] = false;
- live[c_rarg1->as_VMReg()->value()] = false;
- live[c_rarg2->as_VMReg()->value()] = false;
- live[c_rarg3->as_VMReg()->value()] = false;
- live[c_rarg4->as_VMReg()->value()] = false;
- live[c_rarg5->as_VMReg()->value()] = false;
-
- live[c_farg0->as_VMReg()->value()] = false;
- live[c_farg1->as_VMReg()->value()] = false;
- live[c_farg2->as_VMReg()->value()] = false;
- live[c_farg3->as_VMReg()->value()] = false;
- live[c_farg4->as_VMReg()->value()] = false;
- live[c_farg5->as_VMReg()->value()] = false;
- live[c_farg6->as_VMReg()->value()] = false;
- live[c_farg7->as_VMReg()->value()] = false;
- }
-
- // Now we can finally move the register args to their desired locations
-
- rax_is_zero = false;
-
- for (j_arg = first_arg_to_pass, c_arg = 0 ;
- j_arg < total_args_passed ; j_arg++, c_arg++ ) {
-
- VMRegPair src = in_regs[j_arg];
- VMRegPair dst = out_regs[c_arg];
-
- // Only need to look for args destined for the interger registers (since we
- // convert float/double args to look like int/long outbound)
- if (dst.first()->is_reg()) {
- Register r = dst.first()->as_Register();
-
- // Check if the java arg is unsupported and thereofre useless
- bool useless = in_sig_bt[j_arg] == T_ARRAY ||
- (in_sig_bt[j_arg] == T_OBJECT &&
- out_sig_bt[c_arg] != T_INT &&
- out_sig_bt[c_arg] != T_ADDRESS &&
- out_sig_bt[c_arg] != T_LONG);
-
-
- // If we're going to kill an existing arg save it first
- if (live[dst.first()->value()]) {
- // you can't kill yourself
- if (src.first() != dst.first()) {
- __ movq(Address(rbp, fp_offset[dst.first()->value()]), r);
- }
- }
- if (src.first()->is_reg()) {
- if (live[src.first()->value()] ) {
- if (in_sig_bt[j_arg] == T_FLOAT) {
- __ movdl(r, src.first()->as_XMMRegister());
- } else if (in_sig_bt[j_arg] == T_DOUBLE) {
- __ movdq(r, src.first()->as_XMMRegister());
- } else if (r != src.first()->as_Register()) {
- if (!useless) {
- __ movq(r, src.first()->as_Register());
- }
- }
- } else {
- // If the arg is an oop type we don't support don't bother to store
- // it
- if (!useless) {
- if (in_sig_bt[j_arg] == T_DOUBLE ||
- in_sig_bt[j_arg] == T_LONG ||
- in_sig_bt[j_arg] == T_OBJECT ) {
- __ movq(r, Address(rbp, fp_offset[src.first()->value()]));
- } else {
- __ movl(r, Address(rbp, fp_offset[src.first()->value()]));
- }
- }
- }
- live[src.first()->value()] = false;
- } else if (!useless) {
- // full sized move even for int should be ok
- __ movq(r, Address(rbp, reg2offset_in(src.first())));
- }
-
- // At this point r has the original java arg in the final location
- // (assuming it wasn't useless). If the java arg was an oop
- // we have a bit more to do
-
- if (in_sig_bt[j_arg] == T_ARRAY || in_sig_bt[j_arg] == T_OBJECT ) {
- if (out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) {
- // need to unbox a one-word value
- Label skip;
- __ testq(r, r);
- __ jcc(Assembler::equal, skip);
- BasicType bt = out_sig_bt[c_arg];
- int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt);
- Address src1(r, box_offset);
- if ( bt == T_LONG ) {
- __ movq(r, src1);
- } else {
- __ movl(r, src1);
- }
- __ bind(skip);
-
- } else if (out_sig_bt[c_arg] != T_ADDRESS) {
- // Convert the arg to NULL
- __ xorq(r, r);
- }
- }
-
- // dst can longer be holding an input value
- live[dst.first()->value()] = false;
- }
- if (in_sig_bt[j_arg] == T_OBJECT && out_sig_bt[c_arg] == T_LONG) {
- assert(out_sig_bt[c_arg+1] == T_VOID, "must be");
- ++c_arg; // skip over T_VOID to keep the loop indices in sync
- }
- }
-
-
- // Ok now we are done. Need to place the nop that dtrace wants in order to
- // patch in the trap
- int patch_offset = ((intptr_t)__ pc()) - start;
-
- __ nop();
-
-
- // Return
-
- __ leave();
- __ ret(0);
-
- __ flush();
-
- nmethod *nm = nmethod::new_dtrace_nmethod(
- method, masm->code(), vep_offset, patch_offset, frame_complete,
- stack_slots / VMRegImpl::slots_per_word);
- return nm;
-
-}
-
-#endif // HAVE_DTRACE_H
-
// this function returns the adjust size (in number of words) to a c2i adapter
// activation for use during deoptimization
int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals ) {
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -924,15 +924,9 @@
}
#endif // COMPILER2
- assert(0 <= ReadPrefetchInstr && ReadPrefetchInstr <= 3, "invalid value");
assert(0 <= AllocatePrefetchInstr && AllocatePrefetchInstr <= 3, "invalid value");
// set valid Prefetch instruction
- if( ReadPrefetchInstr < 0 ) ReadPrefetchInstr = 0;
- if( ReadPrefetchInstr > 3 ) ReadPrefetchInstr = 3;
- if( ReadPrefetchInstr == 3 && !supports_3dnow_prefetch() ) ReadPrefetchInstr = 0;
- if( !supports_sse() && supports_3dnow_prefetch() ) ReadPrefetchInstr = 3;
-
if( AllocatePrefetchInstr < 0 ) AllocatePrefetchInstr = 0;
if( AllocatePrefetchInstr > 3 ) AllocatePrefetchInstr = 3;
if( AllocatePrefetchInstr == 3 && !supports_3dnow_prefetch() ) AllocatePrefetchInstr=0;
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
//
-// Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 1997, 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
@@ -6061,103 +6061,9 @@
ins_pipe( fpu_reg_mem );
%}
-// Prefetch instructions.
+// Prefetch instructions for allocation.
// Must be safe to execute with invalid address (cannot fault).
-instruct prefetchr0( memory mem ) %{
- predicate(UseSSE==0 && !VM_Version::supports_3dnow_prefetch());
- match(PrefetchRead mem);
- ins_cost(0);
- size(0);
- format %{ "PREFETCHR (non-SSE is empty encoding)" %}
- ins_encode();
- ins_pipe(empty);
-%}
-
-instruct prefetchr( memory mem ) %{
- predicate(UseSSE==0 && VM_Version::supports_3dnow_prefetch() || ReadPrefetchInstr==3);
- match(PrefetchRead mem);
- ins_cost(100);
-
- format %{ "PREFETCHR $mem\t! Prefetch into level 1 cache for read" %}
- ins_encode %{
- __ prefetchr($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrNTA( memory mem ) %{
- predicate(UseSSE>=1 && ReadPrefetchInstr==0);
- match(PrefetchRead mem);
- ins_cost(100);
-
- format %{ "PREFETCHNTA $mem\t! Prefetch into non-temporal cache for read" %}
- ins_encode %{
- __ prefetchnta($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrT0( memory mem ) %{
- predicate(UseSSE>=1 && ReadPrefetchInstr==1);
- match(PrefetchRead mem);
- ins_cost(100);
-
- format %{ "PREFETCHT0 $mem\t! Prefetch into L1 and L2 caches for read" %}
- ins_encode %{
- __ prefetcht0($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrT2( memory mem ) %{
- predicate(UseSSE>=1 && ReadPrefetchInstr==2);
- match(PrefetchRead mem);
- ins_cost(100);
-
- format %{ "PREFETCHT2 $mem\t! Prefetch into L2 cache for read" %}
- ins_encode %{
- __ prefetcht2($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchw0( memory mem ) %{
- predicate(UseSSE==0 && !VM_Version::supports_3dnow_prefetch());
- match(PrefetchWrite mem);
- ins_cost(0);
- size(0);
- format %{ "Prefetch (non-SSE is empty encoding)" %}
- ins_encode();
- ins_pipe(empty);
-%}
-
-instruct prefetchw( memory mem ) %{
- predicate(UseSSE==0 && VM_Version::supports_3dnow_prefetch());
- match( PrefetchWrite mem );
- ins_cost(100);
-
- format %{ "PREFETCHW $mem\t! Prefetch into L1 cache and mark modified" %}
- ins_encode %{
- __ prefetchw($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchwNTA( memory mem ) %{
- predicate(UseSSE>=1);
- match(PrefetchWrite mem);
- ins_cost(100);
-
- format %{ "PREFETCHNTA $mem\t! Prefetch into non-temporal cache for write" %}
- ins_encode %{
- __ prefetchnta($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-// Prefetch instructions for allocation.
-
instruct prefetchAlloc0( memory mem ) %{
predicate(UseSSE==0 && AllocatePrefetchInstr!=3);
match(PrefetchAllocation mem);
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+// Copyright (c) 2003, 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
@@ -5319,70 +5319,9 @@
ins_pipe(pipe_slow); // XXX
%}
-// Prefetch instructions.
+// Prefetch instructions for allocation.
// Must be safe to execute with invalid address (cannot fault).
-instruct prefetchr( memory mem ) %{
- predicate(ReadPrefetchInstr==3);
- match(PrefetchRead mem);
- ins_cost(125);
-
- format %{ "PREFETCHR $mem\t# Prefetch into level 1 cache" %}
- ins_encode %{
- __ prefetchr($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrNTA( memory mem ) %{
- predicate(ReadPrefetchInstr==0);
- match(PrefetchRead mem);
- ins_cost(125);
-
- format %{ "PREFETCHNTA $mem\t# Prefetch into non-temporal cache for read" %}
- ins_encode %{
- __ prefetchnta($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrT0( memory mem ) %{
- predicate(ReadPrefetchInstr==1);
- match(PrefetchRead mem);
- ins_cost(125);
-
- format %{ "PREFETCHT0 $mem\t# prefetch into L1 and L2 caches for read" %}
- ins_encode %{
- __ prefetcht0($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchrT2( memory mem ) %{
- predicate(ReadPrefetchInstr==2);
- match(PrefetchRead mem);
- ins_cost(125);
-
- format %{ "PREFETCHT2 $mem\t# prefetch into L2 caches for read" %}
- ins_encode %{
- __ prefetcht2($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-instruct prefetchwNTA( memory mem ) %{
- match(PrefetchWrite mem);
- ins_cost(125);
-
- format %{ "PREFETCHNTA $mem\t# Prefetch to non-temporal cache for write" %}
- ins_encode %{
- __ prefetchnta($mem$$Address);
- %}
- ins_pipe(ialu_mem);
-%}
-
-// Prefetch instructions for allocation.
-
instruct prefetchAlloc( memory mem ) %{
predicate(AllocatePrefetchInstr==3);
match(PrefetchAllocation mem);
--- a/hotspot/src/os/aix/vm/vmError_aix.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/os/aix/vm/vmError_aix.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -80,7 +80,6 @@
}
int VMError::get_resetted_sigflags(int sig) {
- // Handle all program errors.
for (int i = 0; i < NUM_SIGNALS; i++) {
if (SIGNALS[i] == sig) {
return resettedSigflags[i];
@@ -90,7 +89,6 @@
}
address VMError::get_resetted_sighandler(int sig) {
- // Handle all program errors.
for (int i = 0; i < NUM_SIGNALS; i++) {
if (SIGNALS[i] == sig) {
return resettedSighandler[i];
@@ -100,12 +98,19 @@
}
static void crash_handler(int sig, siginfo_t* info, void* ucVoid) {
+
// Unmask current signal.
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, sig);
+ // and all other synchronous signals too.
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ sigthreadmask(SIG_UNBLOCK, &newset, NULL);
- Unimplemented();
+ VMError err(NULL, sig, NULL, info, ucVoid);
+ err.report_and_die();
}
void VMError::reset_signal_handlers() {
--- a/hotspot/src/os/bsd/vm/dtraceJSDT_bsd.cpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 1997, 2010, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "code/codeBlob.hpp"
-#include "memory/allocation.hpp"
-#include "prims/jvm.h"
-#include "runtime/dtraceJSDT.hpp"
-#include "runtime/jniHandles.hpp"
-#include "runtime/os.hpp"
-#include "runtime/signature.hpp"
-#include "utilities/globalDefinitions.hpp"
-
-/*
- * JSDT java dtrace probes have never been implemented in macosx. It is unknown if the solaris implementation
- * is close or if significant implementation work is necessary. The future of the solaris implementation also
- * appears to be unclear since compiling code with JSDT probes produces the following warning:
- * "warning: ProviderFactory is internal proprietary API and may be removed in a future release"
- */
-
-int DTraceJSDT::pd_activate(
- void* baseAddress, jstring module,
- jint providers_count, JVM_DTraceProvider* providers) {
- return -1;
-}
-
-void DTraceJSDT::pd_dispose(int handle) {
-}
-
-jboolean DTraceJSDT::pd_is_supported() {
- return false;
-}
--- a/hotspot/src/os/bsd/vm/vmError_bsd.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/os/bsd/vm/vmError_bsd.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -63,9 +63,15 @@
} while (yes);
}
+// handle all synchronous program error signals which may happen during error
+// reporting. They must be unblocked, caught, handled.
+
+static const int SIGNALS[] = { SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP }; // add more if needed
+static const int NUM_SIGNALS = sizeof(SIGNALS) / sizeof(int);
+
// Space for our "saved" signal flags and handlers
-static int resettedSigflags[2];
-static address resettedSighandler[2];
+static int resettedSigflags[NUM_SIGNALS];
+static address resettedSighandler[NUM_SIGNALS];
static void save_signal(int idx, int sig)
{
@@ -78,19 +84,19 @@
}
int VMError::get_resetted_sigflags(int sig) {
- if(SIGSEGV == sig) {
- return resettedSigflags[0];
- } else if(SIGBUS == sig) {
- return resettedSigflags[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSigflags[i];
+ }
}
return -1;
}
address VMError::get_resetted_sighandler(int sig) {
- if(SIGSEGV == sig) {
- return resettedSighandler[0];
- } else if(SIGBUS == sig) {
- return resettedSighandler[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSighandler[i];
+ }
}
return NULL;
}
@@ -100,16 +106,25 @@
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, sig);
- sigprocmask(SIG_UNBLOCK, &newset, NULL);
+ // also unmask other synchronous signals
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ pthread_sigmask(SIG_UNBLOCK, &newset, NULL);
VMError err(NULL, sig, NULL, info, ucVoid);
err.report_and_die();
}
void VMError::reset_signal_handlers() {
- // Save sigflags for resetted signals
- save_signal(0, SIGSEGV);
- save_signal(1, SIGBUS);
- os::signal(SIGSEGV, CAST_FROM_FN_PTR(void *, crash_handler));
- os::signal(SIGBUS, CAST_FROM_FN_PTR(void *, crash_handler));
+ // install signal handlers for all synchronous program error signals
+ sigset_t newset;
+ sigemptyset(&newset);
+
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ save_signal(i, SIGNALS[i]);
+ os::signal(SIGNALS[i], CAST_FROM_FN_PTR(void *, crash_handler));
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ pthread_sigmask(SIG_UNBLOCK, &newset, NULL);
}
--- a/hotspot/src/os/linux/vm/dtraceJSDT_linux.cpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 1997, 2010, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "code/codeBlob.hpp"
-#include "memory/allocation.hpp"
-#include "prims/jvm.h"
-#include "runtime/dtraceJSDT.hpp"
-#include "runtime/jniHandles.hpp"
-#include "runtime/os.hpp"
-#include "runtime/signature.hpp"
-#include "utilities/globalDefinitions.hpp"
-
-int DTraceJSDT::pd_activate(
- void* baseAddress, jstring module,
- jint providers_count, JVM_DTraceProvider* providers) {
- return -1;
-}
-
-void DTraceJSDT::pd_dispose(int handle) {
-}
-
-jboolean DTraceJSDT::pd_is_supported() {
- return false;
-}
--- a/hotspot/src/os/linux/vm/vmError_linux.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/os/linux/vm/vmError_linux.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -63,9 +63,15 @@
} while (yes);
}
+// handle all synchronous program error signals which may happen during error
+// reporting. They must be unblocked, caught, handled.
+
+static const int SIGNALS[] = { SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP }; // add more if needed
+static const int NUM_SIGNALS = sizeof(SIGNALS) / sizeof(int);
+
// Space for our "saved" signal flags and handlers
-static int resettedSigflags[2];
-static address resettedSighandler[2];
+static int resettedSigflags[NUM_SIGNALS];
+static address resettedSighandler[NUM_SIGNALS];
static void save_signal(int idx, int sig)
{
@@ -78,19 +84,19 @@
}
int VMError::get_resetted_sigflags(int sig) {
- if(SIGSEGV == sig) {
- return resettedSigflags[0];
- } else if(SIGBUS == sig) {
- return resettedSigflags[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSigflags[i];
+ }
}
return -1;
}
address VMError::get_resetted_sighandler(int sig) {
- if(SIGSEGV == sig) {
- return resettedSighandler[0];
- } else if(SIGBUS == sig) {
- return resettedSighandler[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSighandler[i];
+ }
}
return NULL;
}
@@ -100,16 +106,26 @@
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, sig);
- sigprocmask(SIG_UNBLOCK, &newset, NULL);
+ // also unmask other synchronous signals
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ pthread_sigmask(SIG_UNBLOCK, &newset, NULL);
VMError err(NULL, sig, NULL, info, ucVoid);
err.report_and_die();
}
void VMError::reset_signal_handlers() {
- // Save sigflags for resetted signals
- save_signal(0, SIGSEGV);
- save_signal(1, SIGBUS);
- os::signal(SIGSEGV, CAST_FROM_FN_PTR(void *, crash_handler));
- os::signal(SIGBUS, CAST_FROM_FN_PTR(void *, crash_handler));
+ // install signal handlers for all synchronous program error signals
+ sigset_t newset;
+ sigemptyset(&newset);
+
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ save_signal(i, SIGNALS[i]);
+ os::signal(SIGNALS[i], CAST_FROM_FN_PTR(void *, crash_handler));
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ pthread_sigmask(SIG_UNBLOCK, &newset, NULL);
+
}
--- a/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,655 +0,0 @@
-/*
- * Copyright (c) 2005, 2012, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "code/codeBlob.hpp"
-#include "memory/allocation.hpp"
-#include "prims/jvm.h"
-#include "runtime/dtraceJSDT.hpp"
-#include "runtime/jniHandles.hpp"
-#include "runtime/os.hpp"
-#include "runtime/signature.hpp"
-#include "utilities/globalDefinitions.hpp"
-
-#ifdef HAVE_DTRACE_H
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dtrace.h>
-
-static const char* devname = "/dev/dtrace/helper";
-static const char* olddevname = "/devices/pseudo/dtrace@0:helper";
-
-static const char* string_sig = "uintptr_t";
-static const char* int_sig = "long";
-static const char* long_sig = "long long";
-
-static void printDOFHelper(dof_helper_t* helper);
-
-static int dofhelper_open() {
- int fd;
- if ((fd = open64(devname, O_RDWR)) < 0) {
- // Optimize next calls
- devname = olddevname;
- if ((fd = open64(devname, O_RDWR)) < 0) {
- return -1;
- }
- }
- return fd;
-}
-
-static jint dof_register(jstring module, uint8_t* dof, void* modaddr) {
- int probe;
- dof_helper_t dh;
- int fd;
-
- memset(&dh, 0, sizeof(dh));
-
- char* module_name = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(module));
- jio_snprintf(dh.dofhp_mod, sizeof(dh.dofhp_mod), "%s", module_name);
- dh.dofhp_dof = (uint64_t)dof;
- dh.dofhp_addr = (uint64_t)modaddr;
-
- fd = dofhelper_open();
- if (fd < 0)
- return -1;
- probe = ioctl(fd, DTRACEHIOC_ADDDOF, &dh);
- close(fd);
- if (PrintDTraceDOF) {
- printDOFHelper(&dh);
- tty->print_cr("DOF helper id = %d", probe);
- }
- return probe;
-}
-
-int DTraceJSDT::pd_activate(
- void* moduleBaseAddress, jstring module,
- jint providers_count, JVM_DTraceProvider* providers) {
-
- // We need sections:
- // (1) STRTAB
- // (
- // (2) PROVIDER
- // (3) PROBES
- // (4) PROBOFFS
- // (5) PROBARGS
- // ) * Number of Providers
-
- // Type of sections we create
- enum {
- STRTAB = 0,
- PROVIDERS = 1,
- PROBES = 2,
- PROBE_OFFSETS = 3,
- ARG_OFFSETS = 4,
- NUM_SECTIONS = 5
- };
-
- static int alignment_for[NUM_SECTIONS] = { 1, 4, 8, 4, 1 };
-
- ResourceMark rm;
-
- uint32_t num_sections = 1 + 4 * providers_count;
- uint32_t offset = sizeof(dof_hdr_t) + (num_sections * sizeof(dof_sec_t));
- uint32_t* secoffs = NEW_RESOURCE_ARRAY(uint32_t, num_sections);
- uint32_t* secsize = NEW_RESOURCE_ARRAY(uint32_t, num_sections);
-
- // Store offsets of all strings here in such order:
- // zero-string (always 0)
- // provider1-name
- // probe1-function
- // probe1-name
- // arg-1
- // arg-2
- // ...
- // probe2-function
- // probe2-name
- // arg-1
- // arg-2
- // provider2-name
- // ...
-
- uint32_t strcount = 0;
- // Count the number of strings we'll need
- for(int prvc = 0; prvc < providers_count; ++prvc) {
- JVM_DTraceProvider* provider = &providers[prvc];
- // Provider name
- ++strcount;
- for(int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* p = &(provider->probes[prbc]);
- Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();
- // function + name + one per argument
- strcount += 2 + ArgumentCount(sig).size();
- }
- }
-
- // Create place for string offsets
- uint32_t* stroffs = NEW_RESOURCE_ARRAY(uint32_t, strcount + 1);
- uint32_t string_index = 0;
- uint32_t curstr = 0;
-
- // First we need an empty string: ""
- stroffs[curstr++] = string_index;
- string_index += strlen("") + 1;
-
- for(int prvc = 0; prvc < providers_count; ++prvc) {
- JVM_DTraceProvider* provider = &providers[prvc];
- char* provider_name = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(provider->name));
- stroffs[curstr++] = string_index;
- string_index += strlen(provider_name) + 1;
-
- // All probes
- for(int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* p = &(provider->probes[prbc]);
-
- char* function = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(p->function));
- stroffs[curstr++] = string_index;
- string_index += strlen(function) + 1;
-
- char* name = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(p->name));
- stroffs[curstr++] = string_index;
- string_index += strlen(name) + 1;
-
- Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();
- SignatureStream ss(sig);
- for ( ; !ss.at_return_type(); ss.next()) {
- BasicType bt = ss.type();
- const char* t = NULL;
- if (bt == T_OBJECT &&
- ss.as_symbol_or_null() == vmSymbols::java_lang_String()) {
- t = string_sig;
- } else if (bt == T_LONG) {
- t = long_sig;
- } else {
- t = int_sig;
- }
- stroffs[curstr++] = string_index;
- string_index += strlen(t) + 1;
- }
- }
- }
- secoffs[STRTAB] = offset;
- secsize[STRTAB] = string_index;
- offset += string_index;
-
- // Calculate the size of the rest
- for(int prvc = 0; prvc < providers_count; ++prvc) {
- JVM_DTraceProvider* provider = &providers[prvc];
- size_t provider_sec = PROVIDERS + prvc * 4;
- size_t probe_sec = PROBES + prvc * 4;
- size_t probeoffs_sec = PROBE_OFFSETS + prvc * 4;
- size_t argoffs_sec = ARG_OFFSETS + prvc * 4;
-
- // Allocate space for the provider data struction
- secoffs[provider_sec] = align_size_up(offset, alignment_for[PROVIDERS]);
- secsize[provider_sec] = sizeof(dof_provider_t);
- offset = secoffs[provider_sec] + secsize[provider_sec];
-
- // Allocate space for all the probes
- secoffs[probe_sec] = align_size_up(offset, alignment_for[PROBES]);
- secsize[probe_sec] = sizeof(dof_probe_t) * provider->probe_count;
- offset = secoffs[probe_sec] + secsize[probe_sec];
-
- // Allocate space for the probe offsets
- secoffs[probeoffs_sec] = align_size_up(offset, alignment_for[PROBE_OFFSETS]);
- secsize[probeoffs_sec] = sizeof(uint32_t) * provider->probe_count;
- offset = secoffs[probeoffs_sec] + secsize[probeoffs_sec];
-
- // We need number of arguments argoffs
- uint32_t argscount = 0;
- for(int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* p = &(provider->probes[prbc]);
- Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();
- argscount += ArgumentCount(sig).size();
- }
- secoffs[argoffs_sec] = align_size_up(offset, alignment_for[ARG_OFFSETS]);
- secsize[argoffs_sec] = sizeof(uint8_t) * argscount;
- offset = secoffs[argoffs_sec] + secsize[argoffs_sec];
- }
-
- uint32_t size = offset;
-
- uint8_t* dof = NEW_RESOURCE_ARRAY(uint8_t, size);
- if (!dof) {
- return -1;
- }
- memset((void*)dof, 0, size);
-
- // Fill memory with proper values
- dof_hdr_t* hdr = (dof_hdr_t*)dof;
- hdr->dofh_ident[DOF_ID_MAG0] = DOF_MAG_MAG0;
- hdr->dofh_ident[DOF_ID_MAG1] = DOF_MAG_MAG1;
- hdr->dofh_ident[DOF_ID_MAG2] = DOF_MAG_MAG2;
- hdr->dofh_ident[DOF_ID_MAG3] = DOF_MAG_MAG3;
- hdr->dofh_ident[DOF_ID_MODEL] = DOF_MODEL_NATIVE; // No variants
- hdr->dofh_ident[DOF_ID_ENCODING] = DOF_ENCODE_NATIVE; // No variants
- hdr->dofh_ident[DOF_ID_VERSION] = DOF_VERSION_1; // No variants
- hdr->dofh_ident[DOF_ID_DIFVERS] = DIF_VERSION_2; // No variants
- // all other fields of ident to zero
-
- hdr->dofh_flags = 0;
- hdr->dofh_hdrsize = sizeof(dof_hdr_t);
- hdr->dofh_secsize = sizeof(dof_sec_t);
- hdr->dofh_secnum = num_sections;
- hdr->dofh_secoff = sizeof(dof_hdr_t);
- hdr->dofh_loadsz = size;
- hdr->dofh_filesz = size;
-
- // First section: STRTAB
- dof_sec_t* sec = (dof_sec_t*)(dof + sizeof(dof_hdr_t));
- sec->dofs_type = DOF_SECT_STRTAB;
- sec->dofs_align = alignment_for[STRTAB];
- sec->dofs_flags = DOF_SECF_LOAD;
- sec->dofs_entsize = 0;
- sec->dofs_offset = secoffs[STRTAB];
- sec->dofs_size = secsize[STRTAB];
- // Make data for this section
- char* str = (char*)(dof + sec->dofs_offset);
-
- *str = 0; str += 1; // ""
-
- // Run through all strings again
- for(int prvc = 0; prvc < providers_count; ++prvc) {
- JVM_DTraceProvider* provider = &providers[prvc];
- char* provider_name = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(provider->name));
- strcpy(str, provider_name);
- str += strlen(provider_name) + 1;
-
- // All probes
- for(int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* p = &(provider->probes[prbc]);
-
- char* function = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(p->function));
- strcpy(str, function);
- str += strlen(str) + 1;
-
- char* name = java_lang_String::as_utf8_string(
- JNIHandles::resolve_non_null(p->name));
- strcpy(str, name);
- str += strlen(name) + 1;
-
- Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();
- SignatureStream ss(sig);
- for ( ; !ss.at_return_type(); ss.next()) {
- BasicType bt = ss.type();
- const char* t;
- if (bt == T_OBJECT &&
- ss.as_symbol_or_null() == vmSymbols::java_lang_String()) {
- t = string_sig;
- } else if (bt == T_LONG) {
- t = long_sig;
- } else {
- t = int_sig;
- }
- strcpy(str, t);
- str += strlen(t) + 1;
- }
- }
- }
-
- curstr = 1;
- for(int prvc = 0; prvc < providers_count; ++prvc) {
- JVM_DTraceProvider* provider = &providers[prvc];
- size_t provider_sec = PROVIDERS + prvc * 4;
- size_t probe_sec = PROBES + prvc * 4;
- size_t probeoffs_sec = PROBE_OFFSETS + prvc * 4;
- size_t argoffs_sec = ARG_OFFSETS + prvc * 4;
-
- // PROVIDER ///////////////////////////////////////////////////////////////
- // Section header
- sec = (dof_sec_t*)
- (dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * provider_sec);
- sec->dofs_type = DOF_SECT_PROVIDER;
- sec->dofs_align = alignment_for[PROVIDERS];
- sec->dofs_flags = DOF_SECF_LOAD;
- sec->dofs_entsize = 0;
- sec->dofs_offset = secoffs[provider_sec];
- sec->dofs_size = secsize[provider_sec];
- // Make provider decriiption
- dof_provider_t* prv = (dof_provider_t*)(dof + sec->dofs_offset);
- prv->dofpv_strtab = STRTAB;
- prv->dofpv_probes = probe_sec;
- prv->dofpv_prargs = argoffs_sec;
- prv->dofpv_proffs = probeoffs_sec;
- prv->dofpv_name = stroffs[curstr++]; // Index in string table
- prv->dofpv_provattr = DOF_ATTR(
- provider->providerAttributes.nameStability,
- provider->providerAttributes.dataStability,
- provider->providerAttributes.dependencyClass);
- prv->dofpv_modattr = DOF_ATTR(
- provider->moduleAttributes.nameStability,
- provider->moduleAttributes.dataStability,
- provider->moduleAttributes.dependencyClass);
- prv->dofpv_funcattr = DOF_ATTR(
- provider->functionAttributes.nameStability,
- provider->functionAttributes.dataStability,
- provider->functionAttributes.dependencyClass);
- prv->dofpv_nameattr = DOF_ATTR(
- provider->nameAttributes.nameStability,
- provider->nameAttributes.dataStability,
- provider->nameAttributes.dependencyClass);
- prv->dofpv_argsattr = DOF_ATTR(
- provider->argsAttributes.nameStability,
- provider->argsAttributes.dataStability,
- provider->argsAttributes.dependencyClass);
-
- // PROBES /////////////////////////////////////////////////////////////////
- // Section header
- sec = (dof_sec_t*)
- (dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * probe_sec);
- sec->dofs_type = DOF_SECT_PROBES;
- sec->dofs_align = alignment_for[PROBES];
- sec->dofs_flags = DOF_SECF_LOAD;
- sec->dofs_entsize = sizeof(dof_probe_t);
- sec->dofs_offset = secoffs[probe_sec];
- sec->dofs_size = secsize[probe_sec];
- // Make probes descriptions
- uint32_t argsoffs = 0;
- for(int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* probe = &(provider->probes[prbc]);
- Method* m = Method::resolve_jmethod_id(probe->method);
- int arg_count = ArgumentCount(m->signature()).size();
- assert(m->code() != NULL, "must have an nmethod");
-
- dof_probe_t* prb =
- (dof_probe_t*)(dof + sec->dofs_offset + prbc * sizeof(dof_probe_t));
-
- prb->dofpr_addr = (uint64_t)m->code()->entry_point();
- prb->dofpr_func = stroffs[curstr++]; // Index in string table
- prb->dofpr_name = stroffs[curstr++]; // Index in string table
- prb->dofpr_nargv = stroffs[curstr ]; // Index in string table
- // We spent siglen strings here
- curstr += arg_count;
- prb->dofpr_xargv = prb->dofpr_nargv; // Same bunch of strings
- prb->dofpr_argidx = argsoffs;
- prb->dofpr_offidx = prbc;
- prb->dofpr_nargc = arg_count;
- prb->dofpr_xargc = arg_count;
- prb->dofpr_noffs = 1; // Number of offsets
- // Next bunch of offsets
- argsoffs += arg_count;
- }
-
- // PROFFS /////////////////////////////////////////////////////////////////
- // Section header
- sec = (dof_sec_t*)
- (dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * probeoffs_sec);
- sec->dofs_type = DOF_SECT_PROFFS;
- sec->dofs_align = alignment_for[PROBE_OFFSETS];
- sec->dofs_flags = DOF_SECF_LOAD;
- sec->dofs_entsize = sizeof(uint32_t);
- sec->dofs_offset = secoffs[probeoffs_sec];
- sec->dofs_size = secsize[probeoffs_sec];
- // Make offsets
- for (int prbc = 0; prbc < provider->probe_count; ++prbc) {
- uint32_t* pof =
- (uint32_t*)(dof + sec->dofs_offset + sizeof(uint32_t) * prbc);
- JVM_DTraceProbe* probe = &(provider->probes[prbc]);
- Method* m = Method::resolve_jmethod_id(probe->method);
- *pof = m->code()->trap_offset();
- }
-
- // PRARGS /////////////////////////////////////////////////////////////////
- // Section header
- sec = (dof_sec_t*)
- (dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * argoffs_sec);
- sec->dofs_type = DOF_SECT_PRARGS;
- sec->dofs_align = alignment_for[ARG_OFFSETS];
- sec->dofs_flags = DOF_SECF_LOAD;
- sec->dofs_entsize = sizeof(uint8_t);
- sec->dofs_offset = secoffs[argoffs_sec];
- sec->dofs_size = secsize[argoffs_sec];
- // Make arguments
- uint8_t* par = (uint8_t*)(dof + sec->dofs_offset);
- for (int prbc = 0; prbc < provider->probe_count; ++prbc) {
- JVM_DTraceProbe* p = &(provider->probes[prbc]);
- Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();
- uint8_t count = (uint8_t)ArgumentCount(sig).size();
- for (uint8_t i = 0; i < count; ++i) {
- *par++ = i;
- }
- }
- }
-
- // Register module
- return dof_register(module, dof, moduleBaseAddress);
-}
-
-
-void DTraceJSDT::pd_dispose(int handle) {
- int fd;
- if (handle == -1) {
- return;
- }
- fd = dofhelper_open();
- if (fd < 0)
- return;
- ioctl(fd, DTRACEHIOC_REMOVE, handle);
- close(fd);
-}
-
-jboolean DTraceJSDT::pd_is_supported() {
- int fd = dofhelper_open();
- if (fd < 0) {
- return false;
- }
- close(fd);
- return true;
-}
-
-static const char* dofSecTypeFor(uint32_t type) {
- switch (type) {
- case 0: return "DOF_SECT_NONE";
- case 1: return "DOF_SECT_COMMENTS";
- case 2: return "DOF_SECT_SOURCE";
- case 3: return "DOF_SECT_ECBDESC";
- case 4: return "DOF_SECT_PROBEDESC";
- case 5: return "DOF_SECT_ACTDESC";
- case 6: return "DOF_SECT_DIFOHDR";
- case 7: return "DOF_SECT_DIF";
- case 8: return "DOF_SECT_STRTAB";
- case 9: return "DOF_SECT_VARTAB";
- case 10: return "DOF_SECT_RELTAB";
- case 11: return "DOF_SECT_TYPETAB";
- case 12: return "DOF_SECT_URELHDR";
- case 13: return "DOF_SECT_KRELHDR";
- case 14: return "DOF_SECT_OPTDESC";
- case 15: return "DOF_SECT_PROVIDER";
- case 16: return "DOF_SECT_PROBES";
- case 17: return "DOF_SECT_PRARGS";
- case 18: return "DOF_SECT_PROFFS";
- case 19: return "DOF_SECT_INTTAB";
- case 20: return "DOF_SECT_UTSNAME";
- case 21: return "DOF_SECT_XLTAB";
- case 22: return "DOF_SECT_XLMEMBERS";
- case 23: return "DOF_SECT_XLIMPORT";
- case 24: return "DOF_SECT_XLEXPORT";
- case 25: return "DOF_SECT_PREXPORT";
- case 26: return "DOF_SECT_PRENOFFS";
- default: return "<unknown>";
- }
-}
-
-static void printDOFStringTabSec(void* dof, dof_sec_t* sec) {
- size_t tab = sec->dofs_offset;
- size_t limit = sec->dofs_size;
- tty->print_cr("// String Table:");
- for (size_t idx = 0; idx < limit; /*empty*/) {
- char* str = ((char*)dof) + tab + idx;
- tty->print_cr("// [0x%x + 0x%x] '%s'", tab, idx, str);
- idx += strlen(str) + 1;
- }
-}
-
-static void printDOFProviderSec(void* dof, dof_sec_t* sec) {
- dof_provider_t* prov = (dof_provider_t*)((char*)dof + sec->dofs_offset);
- tty->print_cr("// dof_provider_t {");
- tty->print_cr("// dofpv_strtab = %d", prov->dofpv_strtab);
- tty->print_cr("// dofpv_probes = %d", prov->dofpv_probes);
- tty->print_cr("// dofpv_prargs = %d", prov->dofpv_prargs);
- tty->print_cr("// dofpv_proffs = %d", prov->dofpv_proffs);
- tty->print_cr("// dofpv_name = 0x%x", prov->dofpv_name);
- tty->print_cr("// dofpv_provattr = 0x%08x", prov->dofpv_provattr);
- tty->print_cr("// dofpv_modattr = 0x%08x", prov->dofpv_modattr);
- tty->print_cr("// dofpv_funcattr = 0x%08x", prov->dofpv_funcattr);
- tty->print_cr("// dofpv_nameattr = 0x%08x", prov->dofpv_nameattr);
- tty->print_cr("// dofpv_argsattr = 0x%08x", prov->dofpv_argsattr);
- tty->print_cr("// }");
-}
-
-static void printDOFProbesSec(void* dof, dof_sec_t* sec) {
- size_t idx = sec->dofs_offset;
- size_t limit = idx + sec->dofs_size;
- for (size_t idx = sec->dofs_offset; idx < limit; idx += sec->dofs_entsize) {
- dof_probe_t* prb = (dof_probe_t*)((char*)dof + idx);
- tty->print_cr("// dof_probe_t {");
- tty->print_cr("// dofpr_addr = 0x%016llx", prb->dofpr_addr);
- tty->print_cr("// dofpr_func = 0x%x", prb->dofpr_func);
- tty->print_cr("// dofpr_name = 0x%x", prb->dofpr_name);
- tty->print_cr("// dofpr_nargv = 0x%x", prb->dofpr_nargv);
- tty->print_cr("// dofpr_xargv = 0x%x", prb->dofpr_xargv);
- tty->print_cr("// dofpr_argidx = 0x%x", prb->dofpr_argidx);
- tty->print_cr("// dofpr_offidx = 0x%x", prb->dofpr_offidx);
- tty->print_cr("// dofpr_nargc = %d", prb->dofpr_nargc);
- tty->print_cr("// dofpr_xargc = %d", prb->dofpr_xargc);
- tty->print_cr("// dofpr_noffs = %d", prb->dofpr_noffs);
- tty->print_cr("// }");
- }
-}
-
-static void printDOFOffsetsSec(void* dof, dof_sec_t* sec) {
- size_t tab = sec->dofs_offset;
- size_t limit = sec->dofs_size;
- tty->print_cr("// Offsets:");
- for (size_t idx = 0; idx < limit; idx += sec->dofs_entsize) {
- uint32_t* off = (uint32_t*)((char*)dof + tab + idx);
- tty->print_cr("// [0x%x + 0x%x]: %d", tab, idx, *off);
- }
-}
-
-static void printDOFArgsSec(void* dof, dof_sec_t* sec) {
- size_t tab = sec->dofs_offset;
- size_t limit = sec->dofs_size;
- tty->print_cr("// Arguments:");
- for (size_t idx = 0; idx < limit; idx += sec->dofs_entsize) {
- uint8_t* arg = (uint8_t*)((char*)dof + tab + idx);
- tty->print_cr("// [0x%x + 0x%x]: %d", tab, idx, *arg);
- }
-}
-
-static void printDOFSection(void* dof, dof_sec_t* sec) {
- tty->print_cr("// dof_sec_t {");
- tty->print_cr("// dofs_type = 0x%x /* %s */",
- sec->dofs_type, dofSecTypeFor(sec->dofs_type));
- tty->print_cr("// dofs_align = %d", sec->dofs_align);
- tty->print_cr("// dofs_flags = 0x%x", sec->dofs_flags);
- tty->print_cr("// dofs_entsize = %d", sec->dofs_entsize);
- tty->print_cr("// dofs_offset = 0x%llx", sec->dofs_offset);
- tty->print_cr("// dofs_size = %lld", sec->dofs_size);
- tty->print_cr("// }");
- switch (sec->dofs_type) {
- case DOF_SECT_STRTAB: printDOFStringTabSec(dof, sec); break;
- case DOF_SECT_PROVIDER: printDOFProviderSec(dof, sec); break;
- case DOF_SECT_PROBES: printDOFProbesSec(dof, sec); break;
- case DOF_SECT_PROFFS: printDOFOffsetsSec(dof, sec); break;
- case DOF_SECT_PRARGS: printDOFArgsSec(dof, sec); break;
- default: tty->print_cr("// <section type not recognized>");
- }
-}
-
-static void printDOFHeader(dof_hdr_t* hdr) {
- tty->print_cr("// dof_hdr_t {");
- tty->print_cr("// dofh_ident[DOF_ID_MAG0] = 0x%x",
- hdr->dofh_ident[DOF_ID_MAG0]);
- tty->print_cr("// dofh_ident[DOF_ID_MAG1] = 0x%x",
- hdr->dofh_ident[DOF_ID_MAG1]);
- tty->print_cr("// dofh_ident[DOF_ID_MAG2] = 0x%x",
- hdr->dofh_ident[DOF_ID_MAG2]);
- tty->print_cr("// dofh_ident[DOF_ID_MAG3] = 0x%x",
- hdr->dofh_ident[DOF_ID_MAG3]);
- tty->print_cr("// dofh_ident[DOF_ID_MODEL] = 0x%x",
- hdr->dofh_ident[DOF_ID_MODEL]);
- tty->print_cr("// dofh_ident[DOF_ID_ENCODING] = 0x%x",
- hdr->dofh_ident[DOF_ID_ENCODING]);
- tty->print_cr("// dofh_ident[DOF_ID_VERSION] = 0x%x",
- hdr->dofh_ident[DOF_ID_VERSION]);
- tty->print_cr("// dofh_ident[DOF_ID_DIFVERS] = 0x%x",
- hdr->dofh_ident[DOF_ID_DIFVERS]);
- tty->print_cr("// dofh_flags = 0x%x", hdr->dofh_flags);
- tty->print_cr("// dofh_hdrsize = %d", hdr->dofh_hdrsize);
- tty->print_cr("// dofh_secsize = %d", hdr->dofh_secsize);
- tty->print_cr("// dofh_secnum = %d", hdr->dofh_secnum);
- tty->print_cr("// dofh_secoff = %lld", hdr->dofh_secoff);
- tty->print_cr("// dofh_loadsz = %lld", hdr->dofh_loadsz);
- tty->print_cr("// dofh_filesz = %lld", hdr->dofh_filesz);
- tty->print_cr("// }");
-}
-
-static void printDOF(void* dof) {
- dof_hdr_t* hdr = (dof_hdr_t*)dof;
- printDOFHeader(hdr);
- for (int i = 0; i < hdr->dofh_secnum; ++i) {
- dof_sec_t* sec =
- (dof_sec_t*)((char*)dof + sizeof(dof_hdr_t) + i * sizeof(dof_sec_t));
- tty->print_cr("// [Section #%d]", i);
- printDOFSection(dof, sec);
- }
-}
-
-static void printDOFHelper(dof_helper_t* helper) {
- tty->print_cr("// dof_helper_t {");
- tty->print_cr("// dofhp_mod = \"%s\"", helper->dofhp_mod);
- tty->print_cr("// dofhp_addr = 0x%016llx", helper->dofhp_addr);
- tty->print_cr("// dofhp_dof = 0x%016llx", helper->dofhp_dof);
- printDOF((void*)helper->dofhp_dof);
- tty->print_cr("// }");
- size_t len = ((dof_hdr_t*)helper)->dofh_loadsz;
- tty->print_data((void*)helper->dofhp_dof, len, true);
-}
-
-#else // ndef HAVE_DTRACE_H
-
-// Get here if we're not building on at least Solaris 10
-int DTraceJSDT::pd_activate(
- void* baseAddress, jstring module,
- jint provider_count, JVM_DTraceProvider* providers) {
- return -1;
-}
-
-void DTraceJSDT::pd_dispose(int handle) {
-}
-
-jboolean DTraceJSDT::pd_is_supported() {
- return false;
-}
-#endif
--- a/hotspot/src/os/solaris/vm/vmError_solaris.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/os/solaris/vm/vmError_solaris.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/wait.h>
+#include <thread.h>
#include <signal.h>
void VMError::show_message_box(char *buf, int buflen) {
@@ -59,9 +60,15 @@
} while (yes);
}
+// handle all synchronous program error signals which may happen during error
+// reporting. They must be unblocked, caught, handled.
+
+static const int SIGNALS[] = { SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP }; // add more if needed
+static const int NUM_SIGNALS = sizeof(SIGNALS) / sizeof(int);
+
// Space for our "saved" signal flags and handlers
-static int resettedSigflags[2];
-static address resettedSighandler[2];
+static int resettedSigflags[NUM_SIGNALS];
+static address resettedSighandler[NUM_SIGNALS];
static void save_signal(int idx, int sig)
{
@@ -74,19 +81,19 @@
}
int VMError::get_resetted_sigflags(int sig) {
- if(SIGSEGV == sig) {
- return resettedSigflags[0];
- } else if(SIGBUS == sig) {
- return resettedSigflags[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSigflags[i];
+ }
}
return -1;
}
address VMError::get_resetted_sighandler(int sig) {
- if(SIGSEGV == sig) {
- return resettedSighandler[0];
- } else if(SIGBUS == sig) {
- return resettedSighandler[1];
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ if (SIGNALS[i] == sig) {
+ return resettedSighandler[i];
+ }
}
return NULL;
}
@@ -96,16 +103,25 @@
sigset_t newset;
sigemptyset(&newset);
sigaddset(&newset, sig);
- sigprocmask(SIG_UNBLOCK, &newset, NULL);
+ // also unmask other synchronous signals
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ thr_sigsetmask(SIG_UNBLOCK, &newset, NULL);
VMError err(NULL, sig, NULL, info, ucVoid);
err.report_and_die();
}
void VMError::reset_signal_handlers() {
- // Save sigflags for resetted signals
- save_signal(0, SIGSEGV);
- save_signal(1, SIGBUS);
- os::signal(SIGSEGV, CAST_FROM_FN_PTR(void *, crash_handler));
- os::signal(SIGBUS, CAST_FROM_FN_PTR(void *, crash_handler));
+ // install signal handlers for all synchronous program error signals
+ sigset_t newset;
+ sigemptyset(&newset);
+
+ for (int i = 0; i < NUM_SIGNALS; i++) {
+ save_signal(i, SIGNALS[i]);
+ os::signal(SIGNALS[i], CAST_FROM_FN_PTR(void *, crash_handler));
+ sigaddset(&newset, SIGNALS[i]);
+ }
+ thr_sigsetmask(SIG_UNBLOCK, &newset, NULL);
}
--- a/hotspot/src/os/windows/vm/dtraceJSDT_windows.cpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 1997, 2010, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "code/codeBlob.hpp"
-#include "memory/allocation.hpp"
-#include "prims/jvm.h"
-#include "runtime/dtraceJSDT.hpp"
-#include "runtime/jniHandles.hpp"
-#include "runtime/os.hpp"
-#include "runtime/signature.hpp"
-#include "utilities/globalDefinitions.hpp"
-
-int DTraceJSDT::pd_activate(
- void* baseAddress, jstring module,
- jint providers_count, JVM_DTraceProvider* providers) {
- return -1;
-}
-
-void DTraceJSDT::pd_dispose(int handle) {
-}
-
-jboolean DTraceJSDT::pd_is_supported() {
- return false;
-}
--- a/hotspot/src/share/vm/adlc/formssel.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -3489,9 +3489,7 @@
"GetAndAddL", "GetAndSetL", "GetAndSetN",
};
int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*);
- if( strcmp(_opType,"PrefetchRead")==0 ||
- strcmp(_opType,"PrefetchWrite")==0 ||
- strcmp(_opType,"PrefetchAllocation")==0 )
+ if( strcmp(_opType,"PrefetchAllocation")==0 )
return 1;
if( _lChild ) {
const char *opType = _lChild->_opType;
--- a/hotspot/src/share/vm/asm/codeBuffer.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/asm/codeBuffer.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -42,7 +42,6 @@
Verified_Entry,
Frame_Complete, // Offset in the code where the frame setup is (for forte stackwalks) is complete
OSR_Entry,
- Dtrace_trap = OSR_Entry, // dtrace probes can never have an OSR entry so reuse it
Exceptions, // Offset where exception handler lives
Deopt, // Offset where deopt handler lives
DeoptMH, // Offset where MethodHandle deopt handler lives
--- a/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -964,8 +964,6 @@
void Canonicalizer::do_UnsafeGetObject(UnsafeGetObject* x) {}
void Canonicalizer::do_UnsafePutObject(UnsafePutObject* x) {}
void Canonicalizer::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {}
-void Canonicalizer::do_UnsafePrefetchRead (UnsafePrefetchRead* x) {}
-void Canonicalizer::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {}
void Canonicalizer::do_ProfileCall(ProfileCall* x) {}
void Canonicalizer::do_ProfileReturnType(ProfileReturnType* x) {}
void Canonicalizer::do_ProfileInvoke(ProfileInvoke* x) {}
--- a/hotspot/src/share/vm/c1/c1_Canonicalizer.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Canonicalizer.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -101,8 +101,6 @@
virtual void do_UnsafeGetObject(UnsafeGetObject* x);
virtual void do_UnsafePutObject(UnsafePutObject* x);
virtual void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x);
- virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x);
- virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
virtual void do_ProfileCall (ProfileCall* x);
virtual void do_ProfileReturnType (ProfileReturnType* x);
virtual void do_ProfileInvoke (ProfileInvoke* x);
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -3497,11 +3497,6 @@
case vmIntrinsics::_putFloat_raw : return append_unsafe_put_raw(callee, T_FLOAT);
case vmIntrinsics::_putDouble_raw : return append_unsafe_put_raw(callee, T_DOUBLE);
- case vmIntrinsics::_prefetchRead : return append_unsafe_prefetch(callee, false, false);
- case vmIntrinsics::_prefetchWrite : return append_unsafe_prefetch(callee, false, true);
- case vmIntrinsics::_prefetchReadStatic : return append_unsafe_prefetch(callee, true, false);
- case vmIntrinsics::_prefetchWriteStatic : return append_unsafe_prefetch(callee, true, true);
-
case vmIntrinsics::_checkIndex :
if (!InlineNIOCheckIndex) return false;
preserves_state = true;
@@ -4258,27 +4253,6 @@
}
-bool GraphBuilder::append_unsafe_prefetch(ciMethod* callee, bool is_static, bool is_store) {
- if (InlineUnsafeOps) {
- Values* args = state()->pop_arguments(callee->arg_size());
- int obj_arg_index = 1; // Assume non-static case
- if (is_static) {
- obj_arg_index = 0;
- } else {
- null_check(args->at(0));
- }
- Instruction* offset = args->at(obj_arg_index + 1);
-#ifndef _LP64
- offset = append(new Convert(Bytecodes::_l2i, offset, as_ValueType(T_INT)));
-#endif
- Instruction* op = is_store ? append(new UnsafePrefetchWrite(args->at(obj_arg_index), offset))
- : append(new UnsafePrefetchRead (args->at(obj_arg_index), offset));
- compilation()->set_has_unsafe_access(true);
- }
- return InlineUnsafeOps;
-}
-
-
void GraphBuilder::append_unsafe_CAS(ciMethod* callee) {
ValueStack* state_before = copy_state_for_exception();
ValueType* result_type = as_ValueType(callee->return_type());
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -368,7 +368,6 @@
bool append_unsafe_put_obj(ciMethod* callee, BasicType t, bool is_volatile);
bool append_unsafe_get_raw(ciMethod* callee, BasicType t);
bool append_unsafe_put_raw(ciMethod* callee, BasicType t);
- bool append_unsafe_prefetch(ciMethod* callee, bool is_store, bool is_static);
void append_unsafe_CAS(ciMethod* callee);
bool append_unsafe_get_and_set_obj(ciMethod* callee, bool is_add);
--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -103,9 +103,6 @@
class UnsafeGetObject;
class UnsafePutObject;
class UnsafeGetAndSetObject;
-class UnsafePrefetch;
-class UnsafePrefetchRead;
-class UnsafePrefetchWrite;
class ProfileCall;
class ProfileReturnType;
class ProfileInvoke;
@@ -209,8 +206,6 @@
virtual void do_UnsafeGetObject(UnsafeGetObject* x) = 0;
virtual void do_UnsafePutObject(UnsafePutObject* x) = 0;
virtual void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) = 0;
- virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x) = 0;
- virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) = 0;
virtual void do_ProfileCall (ProfileCall* x) = 0;
virtual void do_ProfileReturnType (ProfileReturnType* x) = 0;
virtual void do_ProfileInvoke (ProfileInvoke* x) = 0;
@@ -2442,34 +2437,6 @@
f->visit(&_value); }
};
-BASE(UnsafePrefetch, UnsafeObjectOp)
- public:
- UnsafePrefetch(Value object, Value offset)
- : UnsafeObjectOp(T_VOID, object, offset, false, false)
- {
- }
-};
-
-
-LEAF(UnsafePrefetchRead, UnsafePrefetch)
- public:
- UnsafePrefetchRead(Value object, Value offset)
- : UnsafePrefetch(object, offset)
- {
- ASSERT_VALUES
- }
-};
-
-
-LEAF(UnsafePrefetchWrite, UnsafePrefetch)
- public:
- UnsafePrefetchWrite(Value object, Value offset)
- : UnsafePrefetch(object, offset)
- {
- ASSERT_VALUES
- }
-};
-
LEAF(ProfileCall, Instruction)
private:
ciMethod* _method;
--- a/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -853,11 +853,6 @@
output()->put(')');
}
-void InstructionPrinter::do_UnsafePrefetchRead(UnsafePrefetchRead* x) {
- print_unsafe_object_op(x, "UnsafePrefetchRead");
- output()->put(')');
-}
-
void InstructionPrinter::do_RangeCheckPredicate(RangeCheckPredicate* x) {
if (x->x() != NULL && x->y() != NULL) {
@@ -880,11 +875,6 @@
}
#endif
-void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
- print_unsafe_object_op(x, "UnsafePrefetchWrite");
- output()->put(')');
-}
-
void InstructionPrinter::do_ProfileCall(ProfileCall* x) {
output()->print("profile ");
print_value(x->recv());
--- a/hotspot/src/share/vm/c1/c1_InstructionPrinter.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_InstructionPrinter.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -129,8 +129,6 @@
virtual void do_UnsafeGetObject(UnsafeGetObject* x);
virtual void do_UnsafePutObject(UnsafePutObject* x);
virtual void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x);
- virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x);
- virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
virtual void do_ProfileCall (ProfileCall* x);
virtual void do_ProfileReturnType (ProfileReturnType* x);
virtual void do_ProfileInvoke (ProfileInvoke* x);
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -527,8 +527,6 @@
case lir_move: // input and result always valid, may have info
case lir_pack64: // input and result always valid
case lir_unpack64: // input and result always valid
- case lir_prefetchr: // input always valid, result and info always invalid
- case lir_prefetchw: // input always valid, result and info always invalid
{
assert(op->as_Op1() != NULL, "must be");
LIR_Op1* op1 = (LIR_Op1*)op;
@@ -1266,13 +1264,6 @@
}
-void LIR_List::prefetch(LIR_Address* addr, bool is_store) {
- append(new LIR_Op1(
- is_store ? lir_prefetchw : lir_prefetchr,
- LIR_OprFact::address(addr)));
-}
-
-
void LIR_List::store_mem_int(jint v, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code) {
append(new LIR_Op1(
lir_move,
--- a/hotspot/src/share/vm/c1/c1_LIR.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIR.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -925,8 +925,6 @@
, lir_branch
, lir_cond_float_branch
, lir_move
- , lir_prefetchr
- , lir_prefetchw
, lir_convert
, lir_alloc_object
, lir_monaddr
@@ -2212,8 +2210,6 @@
void load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
- void prefetch(LIR_Address* addr, bool is_store);
-
void store_mem_int(jint v, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
void store_mem_oop(jobject o, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
void store(LIR_Opr src, LIR_Address* addr, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -503,14 +503,6 @@
}
break;
- case lir_prefetchr:
- prefetchr(op->in_opr());
- break;
-
- case lir_prefetchw:
- prefetchw(op->in_opr());
- break;
-
case lir_roundfp: {
LIR_OpRoundFP* round_op = op->as_OpRoundFP();
roundfp_op(round_op->in_opr(), round_op->tmp(), round_op->result_opr(), round_op->pop_fpu_stack());
--- a/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -182,9 +182,6 @@
LIR_PatchCode patch_code,
CodeEmitInfo* info, bool wide, bool unaligned);
- void prefetchr (LIR_Opr src);
- void prefetchw (LIR_Opr src);
-
void shift_op(LIR_Code code, LIR_Opr left, LIR_Opr count, LIR_Opr dest, LIR_Opr tmp);
void shift_op(LIR_Code code, LIR_Opr left, jint count, LIR_Opr dest);
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -2385,35 +2385,6 @@
}
-void LIRGenerator::do_UnsafePrefetch(UnsafePrefetch* x, bool is_store) {
- LIRItem src(x->object(), this);
- LIRItem off(x->offset(), this);
-
- src.load_item();
- if (off.is_constant() && can_inline_as_constant(x->offset())) {
- // let it be a constant
- off.dont_load_item();
- } else {
- off.load_item();
- }
-
- set_no_result(x);
-
- LIR_Address* addr = generate_address(src.result(), off.result(), 0, 0, T_BYTE);
- __ prefetch(addr, is_store);
-}
-
-
-void LIRGenerator::do_UnsafePrefetchRead(UnsafePrefetchRead* x) {
- do_UnsafePrefetch(x, false);
-}
-
-
-void LIRGenerator::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
- do_UnsafePrefetch(x, true);
-}
-
-
void LIRGenerator::do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux) {
int lng = x->length();
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -251,8 +251,6 @@
void do_Reference_get(Intrinsic* x);
void do_update_CRC32(Intrinsic* x);
- void do_UnsafePrefetch(UnsafePrefetch* x, bool is_store);
-
LIR_Opr call_runtime(BasicTypeArray* signature, LIRItemList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
LIR_Opr call_runtime(BasicTypeArray* signature, LIR_OprList* args, address entry, ValueType* result_type, CodeEmitInfo* info);
@@ -539,8 +537,6 @@
virtual void do_UnsafeGetObject(UnsafeGetObject* x);
virtual void do_UnsafePutObject(UnsafePutObject* x);
virtual void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x);
- virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x);
- virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
virtual void do_ProfileCall (ProfileCall* x);
virtual void do_ProfileReturnType (ProfileReturnType* x);
virtual void do_ProfileInvoke (ProfileInvoke* x);
--- a/hotspot/src/share/vm/c1/c1_Optimizer.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_Optimizer.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -528,8 +528,6 @@
void do_UnsafeGetObject(UnsafeGetObject* x);
void do_UnsafePutObject(UnsafePutObject* x);
void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x);
- void do_UnsafePrefetchRead (UnsafePrefetchRead* x);
- void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
void do_ProfileCall (ProfileCall* x);
void do_ProfileReturnType (ProfileReturnType* x);
void do_ProfileInvoke (ProfileInvoke* x);
@@ -716,8 +714,6 @@
void NullCheckVisitor::do_UnsafeGetObject(UnsafeGetObject* x) {}
void NullCheckVisitor::do_UnsafePutObject(UnsafePutObject* x) {}
void NullCheckVisitor::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {}
-void NullCheckVisitor::do_UnsafePrefetchRead (UnsafePrefetchRead* x) {}
-void NullCheckVisitor::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {}
void NullCheckVisitor::do_ProfileCall (ProfileCall* x) { nce()->clear_last_explicit_null_check();
nce()->handle_ProfileCall(x); }
void NullCheckVisitor::do_ProfileReturnType (ProfileReturnType* x) { nce()->handle_ProfileReturnType(x); }
--- a/hotspot/src/share/vm/c1/c1_RangeCheckElimination.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_RangeCheckElimination.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -159,8 +159,6 @@
void do_UnsafeGetRaw (UnsafeGetRaw* x) { /* nothing to do */ };
void do_UnsafeGetObject(UnsafeGetObject* x) { /* nothing to do */ };
void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) { /* nothing to do */ };
- void do_UnsafePrefetchRead (UnsafePrefetchRead* x) { /* nothing to do */ };
- void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) { /* nothing to do */ };
void do_ProfileCall (ProfileCall* x) { /* nothing to do */ };
void do_ProfileReturnType (ProfileReturnType* x) { /* nothing to do */ };
void do_ProfileInvoke (ProfileInvoke* x) { /* nothing to do */ };
--- a/hotspot/src/share/vm/c1/c1_ValueMap.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -200,8 +200,6 @@
void do_RoundFP (RoundFP* x) { /* nothing to do */ }
void do_UnsafeGetRaw (UnsafeGetRaw* x) { /* nothing to do */ }
void do_UnsafeGetObject(UnsafeGetObject* x) { /* nothing to do */ }
- void do_UnsafePrefetchRead (UnsafePrefetchRead* x) { /* nothing to do */ }
- void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) { /* nothing to do */ }
void do_ProfileCall (ProfileCall* x) { /* nothing to do */ }
void do_ProfileReturnType (ProfileReturnType* x) { /* nothing to do */ }
void do_ProfileInvoke (ProfileInvoke* x) { /* nothing to do */ };
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -501,32 +501,31 @@
return fields;
}
-void ciInstanceKlass::compute_injected_fields_helper() {
+bool ciInstanceKlass::compute_injected_fields_helper() {
ASSERT_IN_VM;
InstanceKlass* k = get_instanceKlass();
for (InternalFieldStream fs(k); !fs.done(); fs.next()) {
if (fs.access_flags().is_static()) continue;
- _has_injected_fields++;
- break;
+ return true;
}
+ return false;
}
-bool ciInstanceKlass::compute_injected_fields() {
- assert(_has_injected_fields == -1, "shouldn't be initialized yet");
+void ciInstanceKlass::compute_injected_fields() {
assert(is_loaded(), "must be loaded");
+ int has_injected_fields = 0;
if (super() != NULL && super()->has_injected_fields()) {
- _has_injected_fields = 1;
- return true;
+ has_injected_fields = 1;
+ } else {
+ GUARDED_VM_ENTRY({
+ has_injected_fields = compute_injected_fields_helper() ? 1 : 0;
+ });
}
-
- _has_injected_fields = 0;
- GUARDED_VM_ENTRY({
- compute_injected_fields_helper();
- });
-
- return _has_injected_fields > 0 ? true : false;
+ // may be concurrently initialized for shared ciInstanceKlass objects
+ assert(_has_injected_fields == -1 || _has_injected_fields == has_injected_fields, "broken concurrent initialization");
+ _has_injected_fields = has_injected_fields;
}
// ------------------------------------------------------------------
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -72,8 +72,8 @@
// Itsef: more than one implementors.
ciInstanceKlass* _implementor;
- bool compute_injected_fields();
- void compute_injected_fields_helper();
+ void compute_injected_fields();
+ bool compute_injected_fields_helper();
protected:
ciInstanceKlass(KlassHandle h_k);
@@ -193,7 +193,7 @@
bool has_injected_fields() {
if (_has_injected_fields == -1) {
- return compute_injected_fields();
+ compute_injected_fields();
}
return _has_injected_fields > 0 ? true : false;
}
--- a/hotspot/src/share/vm/ci/ciMethod.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -70,7 +70,8 @@
// Loaded method.
ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) :
ciMetadata(h_m()),
- _holder(holder)
+ _holder(holder),
+ _has_injected_profile(false)
{
assert(h_m() != NULL, "no null method");
@@ -168,7 +169,8 @@
_liveness( NULL),
_can_be_statically_bound(false),
_method_blocks( NULL),
- _method_data( NULL)
+ _method_data( NULL),
+ _has_injected_profile( false)
#if defined(COMPILER2) || defined(SHARK)
,
_flow( NULL),
--- a/hotspot/src/share/vm/ci/ciMethod.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/ci/ciMethod.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -79,6 +79,7 @@
bool _is_c1_compilable;
bool _is_c2_compilable;
bool _can_be_statically_bound;
+ bool _has_injected_profile;
// Lazy fields, filled in on demand
address _code;
@@ -286,6 +287,9 @@
int instructions_size();
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
+ bool has_injected_profile() const { return _has_injected_profile; }
+ void set_injected_profile(bool x) { _has_injected_profile = x; }
+
// Stack walking support
bool is_ignored_by_security_stack_walk() const;
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -243,7 +243,6 @@
template(returnType_name, "returnType") \
template(signature_name, "signature") \
template(slot_name, "slot") \
- template(selectAlternative_name, "selectAlternative") \
\
/* Support for annotations (JDK 1.5 and above) */ \
\
@@ -295,8 +294,7 @@
template(setTarget_signature, "(Ljava/lang/invoke/MethodHandle;)V") \
NOT_LP64( do_alias(intptr_signature, int_signature) ) \
LP64_ONLY( do_alias(intptr_signature, long_signature) ) \
- template(selectAlternative_signature, "(ZLjava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;") \
- \
+ \
/* common method and field names */ \
template(object_initializer_name, "<init>") \
template(class_initializer_name, "<clinit>") \
@@ -868,6 +866,12 @@
do_name( fullFence_name, "fullFence") \
do_alias( fullFence_signature, void_method_signature) \
\
+ /* Custom branch frequencies profiling support for JSR292 */ \
+ do_class(java_lang_invoke_MethodHandleImpl, "java/lang/invoke/MethodHandleImpl") \
+ do_intrinsic(_profileBoolean, java_lang_invoke_MethodHandleImpl, profileBoolean_name, profileBoolean_signature, F_S) \
+ do_name( profileBoolean_name, "profileBoolean") \
+ do_signature(profileBoolean_signature, "(Z[I)Z") \
+ \
/* unsafe memory references (there are a lot of them...) */ \
do_signature(getObject_signature, "(Ljava/lang/Object;J)Ljava/lang/Object;") \
do_signature(putObject_signature, "(Ljava/lang/Object;JLjava/lang/Object;)V") \
@@ -1017,18 +1021,6 @@
do_intrinsic(_getAndSetObject, sun_misc_Unsafe, getAndSetObject_name, getAndSetObject_signature, F_R)\
do_name( getAndSetObject_name, "getAndSetObject") \
do_signature(getAndSetObject_signature, "(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;" ) \
- \
- /* prefetch_signature is shared by all prefetch variants */ \
- do_signature( prefetch_signature, "(Ljava/lang/Object;J)V") \
- \
- do_intrinsic(_prefetchRead, sun_misc_Unsafe, prefetchRead_name, prefetch_signature, F_RN) \
- do_name( prefetchRead_name, "prefetchRead") \
- do_intrinsic(_prefetchWrite, sun_misc_Unsafe, prefetchWrite_name, prefetch_signature, F_RN) \
- do_name( prefetchWrite_name, "prefetchWrite") \
- do_intrinsic(_prefetchReadStatic, sun_misc_Unsafe, prefetchReadStatic_name, prefetch_signature, F_SN) \
- do_name( prefetchReadStatic_name, "prefetchReadStatic") \
- do_intrinsic(_prefetchWriteStatic, sun_misc_Unsafe, prefetchWriteStatic_name, prefetch_signature, F_SN) \
- do_name( prefetchWriteStatic_name, "prefetchWriteStatic") \
/*== LAST_COMPILER_INLINE*/ \
/*the compiler does have special inlining code for these; bytecode inline is just fine */ \
\
@@ -1203,7 +1195,7 @@
#undef VM_INTRINSIC_ENUM
ID_LIMIT,
- LAST_COMPILER_INLINE = _prefetchWriteStatic,
+ LAST_COMPILER_INLINE = _getAndSetObject,
FIRST_MH_SIG_POLY = _invokeGeneric,
FIRST_MH_STATIC = _linkToVirtual,
LAST_MH_SIG_POLY = _linkToInterface,
--- a/hotspot/src/share/vm/code/nmethod.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/code/nmethod.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -477,9 +477,6 @@
#if INCLUDE_RTM_OPT
_rtm_state = NoRTM;
#endif
-#ifdef HAVE_DTRACE_H
- _trap_offset = 0;
-#endif // def HAVE_DTRACE_H
}
nmethod* nmethod::new_native_nmethod(methodHandle method,
@@ -520,44 +517,6 @@
return nm;
}
-#ifdef HAVE_DTRACE_H
-nmethod* nmethod::new_dtrace_nmethod(methodHandle method,
- CodeBuffer *code_buffer,
- int vep_offset,
- int trap_offset,
- int frame_complete,
- int frame_size) {
- code_buffer->finalize_oop_references(method);
- // create nmethod
- nmethod* nm = NULL;
- {
- MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
- int nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
- CodeOffsets offsets;
- offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
- offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
- offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
-
- nm = new (nmethod_size, CompLevel_none) nmethod(method(), nmethod_size,
- &offsets, code_buffer, frame_size);
-
- NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
- if (PrintAssembly && nm != NULL) {
- Disassembler::decode(nm);
- }
- }
- // verify nmethod
- debug_only(if (nm) nm->verify();) // might block
-
- if (nm != NULL) {
- nm->log_new_nmethod();
- }
-
- return nm;
-}
-
-#endif // def HAVE_DTRACE_H
-
nmethod* nmethod::new_nmethod(methodHandle method,
int compile_id,
int entry_bci,
@@ -718,91 +677,6 @@
}
}
-// For dtrace wrappers
-#ifdef HAVE_DTRACE_H
-nmethod::nmethod(
- Method* method,
- int nmethod_size,
- CodeOffsets* offsets,
- CodeBuffer* code_buffer,
- int frame_size)
- : CodeBlob("dtrace nmethod", code_buffer, sizeof(nmethod),
- nmethod_size, offsets->value(CodeOffsets::Frame_Complete), frame_size, NULL),
- _native_receiver_sp_offset(in_ByteSize(-1)),
- _native_basic_lock_sp_offset(in_ByteSize(-1))
-{
- {
- debug_only(No_Safepoint_Verifier nsv;)
- assert_locked_or_safepoint(CodeCache_lock);
-
- init_defaults();
- _method = method;
- _entry_bci = InvocationEntryBci;
- // We have no exception handler or deopt handler make the
- // values something that will never match a pc like the nmethod vtable entry
- _exception_offset = 0;
- _deoptimize_offset = 0;
- _deoptimize_mh_offset = 0;
- _unwind_handler_offset = -1;
- _trap_offset = offsets->value(CodeOffsets::Dtrace_trap);
- _orig_pc_offset = 0;
- _consts_offset = data_offset();
- _stub_offset = data_offset();
- _oops_offset = data_offset();
- _metadata_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize);
- _scopes_data_offset = _metadata_offset + round_to(code_buffer->total_metadata_size(), wordSize);
- _scopes_pcs_offset = _scopes_data_offset;
- _dependencies_offset = _scopes_pcs_offset;
- _handler_table_offset = _dependencies_offset;
- _nul_chk_table_offset = _handler_table_offset;
- _nmethod_end_offset = _nul_chk_table_offset;
- _compile_id = 0; // default
- _comp_level = CompLevel_none;
- _entry_point = code_begin() + offsets->value(CodeOffsets::Entry);
- _verified_entry_point = code_begin() + offsets->value(CodeOffsets::Verified_Entry);
- _osr_entry_point = NULL;
- _exception_cache = NULL;
- _pc_desc_cache.reset_to(NULL);
- _hotness_counter = NMethodSweeper::hotness_counter_reset_val();
-
- code_buffer->copy_values_to(this);
- if (ScavengeRootsInCode) {
- if (detect_scavenge_root_oops()) {
- CodeCache::add_scavenge_root_nmethod(this);
- }
- Universe::heap()->register_nmethod(this);
- }
- DEBUG_ONLY(verify_scavenge_root_oops();)
- CodeCache::commit(this);
- }
-
- if (PrintNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) {
- ttyLocker ttyl; // keep the following output all in one block
- // This output goes directly to the tty, not the compiler log.
- // To enable tools to match it up with the compilation activity,
- // be sure to tag this tty output with the compile ID.
- if (xtty != NULL) {
- xtty->begin_head("print_dtrace_nmethod");
- xtty->method(_method);
- xtty->stamp();
- xtty->end_head(" address='" INTPTR_FORMAT "'", (intptr_t) this);
- }
- // print the header part first
- print();
- // then print the requested information
- if (PrintNMethods) {
- print_code();
- }
- if (PrintRelocations) {
- print_relocations();
- }
- if (xtty != NULL) {
- xtty->tail("print_dtrace_nmethod");
- }
- }
-}
-#endif // def HAVE_DTRACE_H
-
void* nmethod::operator new(size_t size, int nmethod_size, int comp_level) throw () {
return CodeCache::allocate(nmethod_size, CodeCache::get_code_blob_type(comp_level));
}
@@ -2310,17 +2184,6 @@
#endif // !SHARK
}
-
-oop nmethod::embeddedOop_at(u_char* p) {
- RelocIterator iter(this, p, p + 1);
- while (iter.next())
- if (iter.type() == relocInfo::oop_type) {
- return iter.oop_reloc()->oop_value();
- }
- return NULL;
-}
-
-
inline bool includes(void* p, void* from, void* to) {
return from <= p && p < to;
}
--- a/hotspot/src/share/vm/code/nmethod.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/code/nmethod.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -157,9 +157,6 @@
// Offset of the unwind handler if it exists
int _unwind_handler_offset;
-#ifdef HAVE_DTRACE_H
- int _trap_offset;
-#endif // def HAVE_DTRACE_H
int _consts_offset;
int _stub_offset;
int _oops_offset; // offset to where embedded oop table begins (inside data)
@@ -261,15 +258,6 @@
ByteSize basic_lock_sp_offset, /* synchronized natives only */
OopMapSet* oop_maps);
-#ifdef HAVE_DTRACE_H
- // For native wrappers
- nmethod(Method* method,
- int nmethod_size,
- CodeOffsets* offsets,
- CodeBuffer *code_buffer,
- int frame_size);
-#endif // def HAVE_DTRACE_H
-
// Creation support
nmethod(Method* method,
int nmethod_size,
@@ -333,22 +321,6 @@
ByteSize basic_lock_sp_offset,
OopMapSet* oop_maps);
-#ifdef HAVE_DTRACE_H
- // The method we generate for a dtrace probe has to look
- // like an nmethod as far as the rest of the system is concerned
- // which is somewhat unfortunate.
- static nmethod* new_dtrace_nmethod(methodHandle method,
- CodeBuffer *code_buffer,
- int vep_offset,
- int trap_offset,
- int frame_complete,
- int frame_size);
-
- int trap_offset() const { return _trap_offset; }
- address trap_address() const { return insts_begin() + _trap_offset; }
-
-#endif // def HAVE_DTRACE_H
-
// accessors
Method* method() const { return _method; }
AbstractCompiler* compiler() const { return _compiler; }
@@ -730,11 +702,6 @@
int compile_id() const { return _compile_id; }
const char* compile_kind() const;
- // For debugging
- // CompiledIC* IC_at(char* p) const;
- // PrimitiveIC* primitiveIC_at(char* p) const;
- oop embeddedOop_at(address p);
-
// tells if any of this method's dependencies have been invalidated
// (this is expensive!)
static void check_all_dependencies(DepChange& changes);
--- a/hotspot/src/share/vm/compiler/disassembler.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/compiler/disassembler.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -345,21 +345,6 @@
if (WizardMode) st->print(" " INTPTR_FORMAT, (intptr_t)adr);
return;
}
-
- oop obj;
- if (_nm != NULL
- && (obj = _nm->embeddedOop_at(cur_insn())) != NULL
- && (address) obj == adr
- && Universe::heap()->is_in(obj)
- && Universe::heap()->is_in(obj->klass())) {
- julong c = st->count();
- obj->print_value_on(st);
- if (st->count() == c) {
- // No output. (Can happen in product builds.)
- st->print("(a %s)", obj->klass()->external_name());
- }
- return;
- }
}
// Fall through to a simple (hexadecimal) numeral.
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -308,7 +308,7 @@
inline ParScanThreadState& thread_state(int i);
- void trace_promotion_failed(YoungGCTracer& gc_tracer);
+ void trace_promotion_failed(const YoungGCTracer* gc_tracer);
void reset(int active_workers, bool promotion_failed);
void flush();
@@ -357,10 +357,10 @@
return ((ParScanThreadState*)_data)[i];
}
-void ParScanThreadStateSet::trace_promotion_failed(YoungGCTracer& gc_tracer) {
+void ParScanThreadStateSet::trace_promotion_failed(const YoungGCTracer* gc_tracer) {
for (int i = 0; i < length(); ++i) {
if (thread_state(i).promotion_failed()) {
- gc_tracer.report_promotion_failed(thread_state(i).promotion_failed_info());
+ gc_tracer->report_promotion_failed(thread_state(i).promotion_failed_info());
thread_state(i).promotion_failed_info().reset();
}
}
@@ -883,7 +883,7 @@
// A Generation that does parallel young-gen collection.
-void ParNewGeneration::handle_promotion_failed(GenCollectedHeap* gch, ParScanThreadStateSet& thread_state_set, ParNewTracer& gc_tracer) {
+void ParNewGeneration::handle_promotion_failed(GenCollectedHeap* gch, ParScanThreadStateSet& thread_state_set) {
assert(_promo_failure_scan_stack.is_empty(), "post condition");
_promo_failure_scan_stack.clear(true); // Clear cached segments.
@@ -899,10 +899,10 @@
_next_gen->promotion_failure_occurred();
// Trace promotion failure in the parallel GC threads
- thread_state_set.trace_promotion_failed(gc_tracer);
+ thread_state_set.trace_promotion_failed(gc_tracer());
// Single threaded code may have reported promotion failure to the global state
if (_promotion_failed_info.has_failed()) {
- gc_tracer.report_promotion_failed(_promotion_failed_info);
+ _gc_tracer.report_promotion_failed(_promotion_failed_info);
}
// Reset the PromotionFailureALot counters.
NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
@@ -941,9 +941,8 @@
}
assert(to()->is_empty(), "Else not collection_attempt_is_safe");
- ParNewTracer gc_tracer;
- gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
- gch->trace_heap_before_gc(&gc_tracer);
+ _gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
+ gch->trace_heap_before_gc(gc_tracer());
init_assuming_no_promotion_failure();
@@ -952,7 +951,7 @@
size_policy->minor_collection_begin();
}
- GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL, gc_tracer.gc_id());
+ GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL, _gc_tracer.gc_id());
// Capture heap used before collection (for printing).
size_t gch_prev_used = gch->used();
@@ -994,7 +993,7 @@
// Trace and reset failed promotion info.
if (promotion_failed()) {
- thread_state_set.trace_promotion_failed(gc_tracer);
+ thread_state_set.trace_promotion_failed(gc_tracer());
}
// Process (weak) reference objects found during scavenge.
@@ -1015,16 +1014,16 @@
ParNewRefProcTaskExecutor task_executor(*this, thread_state_set);
stats = rp->process_discovered_references(&is_alive, &keep_alive,
&evacuate_followers, &task_executor,
- _gc_timer, gc_tracer.gc_id());
+ _gc_timer, _gc_tracer.gc_id());
} else {
thread_state_set.flush();
gch->set_par_threads(0); // 0 ==> non-parallel.
gch->save_marks();
stats = rp->process_discovered_references(&is_alive, &keep_alive,
&evacuate_followers, NULL,
- _gc_timer, gc_tracer.gc_id());
+ _gc_timer, _gc_tracer.gc_id());
}
- gc_tracer.report_gc_reference_stats(stats);
+ _gc_tracer.report_gc_reference_stats(stats);
if (!promotion_failed()) {
// Swap the survivor spaces.
eden()->clear(SpaceDecorator::Mangle);
@@ -1049,7 +1048,7 @@
adjust_desired_tenuring_threshold();
} else {
- handle_promotion_failed(gch, thread_state_set, gc_tracer);
+ handle_promotion_failed(gch, thread_state_set);
}
// set new iteration safe limit for the survivor spaces
from()->set_concurrent_iteration_safe_limit(from()->top());
@@ -1088,12 +1087,12 @@
}
rp->verify_no_references_recorded();
- gch->trace_heap_after_gc(&gc_tracer);
- gc_tracer.report_tenuring_threshold(tenuring_threshold());
+ gch->trace_heap_after_gc(gc_tracer());
+ _gc_tracer.report_tenuring_threshold(tenuring_threshold());
_gc_timer->register_gc_end();
- gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
+ _gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
}
static int sum;
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -333,6 +333,9 @@
// references to live referent.
DefNewGeneration::IsAliveClosure _is_alive_closure;
+ // GC tracer that should be used during collection.
+ ParNewTracer _gc_tracer;
+
static oop real_forwardee_slow(oop obj);
static void waste_some_time();
@@ -340,7 +343,7 @@
// word being overwritten with a self-forwarding-pointer.
void preserve_mark_if_necessary(oop obj, markOop m);
- void handle_promotion_failed(GenCollectedHeap* gch, ParScanThreadStateSet& thread_state_set, ParNewTracer& gc_tracer);
+ void handle_promotion_failed(GenCollectedHeap* gch, ParScanThreadStateSet& thread_state_set);
protected:
@@ -411,6 +414,10 @@
return _plab_stats.desired_plab_sz();
}
+ const ParNewTracer* gc_tracer() const {
+ return &_gc_tracer;
+ }
+
static oop real_forwardee(oop obj);
DEBUG_ONLY(static bool is_legal_forward_ptr(oop p);)
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -663,7 +663,7 @@
}
}
-void ParallelScavengeHeap::trace_heap(GCWhen::Type when, GCTracer* gc_tracer) {
+void ParallelScavengeHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) {
const PSHeapSummary& heap_summary = create_ps_heap_summary();
gc_tracer->report_gc_heap_summary(when, heap_summary);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -64,7 +64,7 @@
// The task manager
static GCTaskManager* _gc_task_manager;
- void trace_heap(GCWhen::Type when, GCTracer* tracer);
+ void trace_heap(GCWhen::Type when, const GCTracer* tracer);
protected:
static inline size_t total_invocations();
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -162,7 +162,7 @@
_tenuring_threshold = UNSET_TENURING_THRESHOLD;
}
-void YoungGCTracer::report_promotion_failed(const PromotionFailedInfo& pf_info) {
+void YoungGCTracer::report_promotion_failed(const PromotionFailedInfo& pf_info) const {
assert_set_gc_id();
send_promotion_failed_event(pf_info);
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -153,7 +153,7 @@
virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
public:
- void report_promotion_failed(const PromotionFailedInfo& pf_info);
+ void report_promotion_failed(const PromotionFailedInfo& pf_info) const;
void report_tenuring_threshold(const uint tenuring_threshold);
/*
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -132,7 +132,7 @@
assert_locked_or_safepoint(CodeCache_lock);
}
-void CollectedHeap::trace_heap(GCWhen::Type when, GCTracer* gc_tracer) {
+void CollectedHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) {
const GCHeapSummary& heap_summary = create_heap_summary();
gc_tracer->report_gc_heap_summary(when, heap_summary);
@@ -140,11 +140,11 @@
gc_tracer->report_metaspace_summary(when, metaspace_summary);
}
-void CollectedHeap::trace_heap_before_gc(GCTracer* gc_tracer) {
+void CollectedHeap::trace_heap_before_gc(const GCTracer* gc_tracer) {
trace_heap(GCWhen::BeforeGC, gc_tracer);
}
-void CollectedHeap::trace_heap_after_gc(GCTracer* gc_tracer) {
+void CollectedHeap::trace_heap_after_gc(const GCTracer* gc_tracer) {
trace_heap(GCWhen::AfterGC, gc_tracer);
}
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -175,7 +175,7 @@
// Fill with a single object (either an int array or a java.lang.Object).
static inline void fill_with_object_impl(HeapWord* start, size_t words, bool zap = true);
- virtual void trace_heap(GCWhen::Type when, GCTracer* tracer);
+ virtual void trace_heap(GCWhen::Type when, const GCTracer* tracer);
// Verification functions
virtual void check_for_bad_heap_word_value(HeapWord* addr, size_t size)
@@ -606,8 +606,8 @@
virtual void register_nmethod(nmethod* nm);
virtual void unregister_nmethod(nmethod* nm);
- void trace_heap_before_gc(GCTracer* gc_tracer);
- void trace_heap_after_gc(GCTracer* gc_tracer);
+ void trace_heap_before_gc(const GCTracer* gc_tracer);
+ void trace_heap_after_gc(const GCTracer* gc_tracer);
// Heap verification
virtual void verify(bool silent, VerifyOption option) = 0;
--- a/hotspot/src/share/vm/gc_interface/gcCause.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_interface/gcCause.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -103,9 +103,6 @@
case _last_ditch_collection:
return "Last ditch collection";
- case _dcmd_gc_run:
- return "Diagnostic Command";
-
case _last_gc_cause:
return "ILLEGAL VALUE - last gc cause - ILLEGAL VALUE";
--- a/hotspot/src/share/vm/gc_interface/gcCause.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/gc_interface/gcCause.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -74,9 +74,6 @@
_g1_humongous_allocation,
_last_ditch_collection,
-
- _dcmd_gc_run,
-
_last_gc_cause
};
--- a/hotspot/src/share/vm/memory/allocation.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/memory/allocation.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -275,31 +275,30 @@
Chunk* cur = NULL;
Chunk* next;
{
- // if we have more than n chunks, free all of them
- ThreadCritical tc;
- if (_num_chunks > n) {
- // free chunks at end of queue, for better locality
+ // if we have more than n chunks, free all of them
+ ThreadCritical tc;
+ if (_num_chunks > n) {
+ // free chunks at end of queue, for better locality
cur = _first;
- for (size_t i = 0; i < (n - 1) && cur != NULL; i++) cur = cur->next();
+ for (size_t i = 0; i < (n - 1) && cur != NULL; i++) cur = cur->next();
- if (cur != NULL) {
+ if (cur != NULL) {
next = cur->next();
- cur->set_next(NULL);
- cur = next;
+ cur->set_next(NULL);
+ cur = next;
- _num_chunks = n;
+ // Free all remaining chunks while in ThreadCritical lock
+ // so NMT adjustment is stable.
+ while(cur != NULL) {
+ next = cur->next();
+ os::free(cur);
+ _num_chunks--;
+ cur = next;
+ }
}
}
}
-
- // Free all remaining chunks, outside of ThreadCritical
- // to avoid deadlock with NMT
- while(cur != NULL) {
- next = cur->next();
- os::free(cur);
- cur = next;
- }
- }
+ }
// Accessors to preallocated pool's
static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; }
@@ -384,7 +383,9 @@
case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break;
case Chunk::init_size: ChunkPool::small_pool()->free(c); break;
case Chunk::tiny_size: ChunkPool::tiny_pool()->free(c); break;
- default: os::free(c);
+ default:
+ ThreadCritical tc; // Free chunks under TC lock so that NMT adjustment is stable.
+ os::free(c);
}
}
--- a/hotspot/src/share/vm/memory/filemap.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/memory/filemap.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -388,7 +388,8 @@
remove(_full_path);
int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
if (fd < 0) {
- fail_stop("Unable to create shared archive file %s.", _full_path);
+ fail_stop("Unable to create shared archive file %s: (%s).", _full_path,
+ strerror(errno));
}
_fd = fd;
_file_offset = 0;
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -108,12 +108,11 @@
// Allocate space for the heap.
char* heap_address;
- size_t total_reserved = 0;
ReservedSpace heap_rs;
size_t heap_alignment = collector_policy()->heap_alignment();
- heap_address = allocate(heap_alignment, &total_reserved, &heap_rs);
+ heap_address = allocate(heap_alignment, &heap_rs);
if (!heap_rs.is_reserved()) {
vm_shutdown_during_initialization(
@@ -149,7 +148,6 @@
char* GenCollectedHeap::allocate(size_t alignment,
- size_t* _total_reserved,
ReservedSpace* heap_rs){
const char overflow_msg[] = "The size of the object heap + VM data exceeds "
"the maximum representable size";
@@ -171,8 +169,6 @@
err_msg("Gen size; total_reserved=" SIZE_FORMAT ", alignment="
SIZE_FORMAT, total_reserved, alignment));
- *_total_reserved = total_reserved;
-
*heap_rs = Universe::reserve_heap(total_reserved, alignment);
return heap_rs->base();
}
--- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -124,7 +124,9 @@
// Returns JNI_OK on success
virtual jint initialize();
- char* allocate(size_t alignment, size_t* _total_reserved, ReservedSpace* heap_rs);
+
+ // Reserve aligned space for the heap as needed by the contained generations.
+ char* allocate(size_t alignment, ReservedSpace* heap_rs);
// Does operations required after initialization has been done.
void post_initialize();
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -25,7 +25,6 @@
#include "precompiled.hpp"
#include "gc_implementation/shared/collectorCounters.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
-#include "gc_implementation/shared/parGCAllocBuffer.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/blockOffsetTable.inline.hpp"
#include "memory/cardGeneration.inline.hpp"
--- a/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/callnode.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1982,6 +1982,7 @@
Node *ArrayCopyNode::Ideal(PhaseGVN *phase, bool can_reshape) {
+ if (remove_dead_region(phase, can_reshape)) return this;
if (StressArrayCopyMacroNode && !can_reshape) return NULL;
--- a/hotspot/src/share/vm/opto/classes.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/classes.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -200,6 +200,7 @@
macro(Opaque1)
macro(Opaque2)
macro(Opaque3)
+macro(ProfileBoolean)
macro(OrI)
macro(OrL)
macro(OverflowAddI)
@@ -216,8 +217,6 @@
macro(PopCountL)
macro(PowD)
macro(PrefetchAllocation)
-macro(PrefetchRead)
-macro(PrefetchWrite)
macro(Proj)
macro(RShiftI)
macro(RShiftL)
--- a/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/compile.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -3105,6 +3105,7 @@
default:
assert( !n->is_Call(), "" );
assert( !n->is_Mem(), "" );
+ assert( nop != Op_ProfileBoolean, "should be eliminated during IGVN");
break;
}
@@ -3321,6 +3322,9 @@
bool Compile::too_many_traps(ciMethod* method,
int bci,
Deoptimization::DeoptReason reason) {
+ if (method->has_injected_profile()) {
+ return false;
+ }
ciMethodData* md = method->method_data();
if (md->is_empty()) {
// Assume the trap has not occurred, or that it occurred only
@@ -3370,6 +3374,9 @@
bool Compile::too_many_recompiles(ciMethod* method,
int bci,
Deoptimization::DeoptReason reason) {
+ if (method->has_injected_profile()) {
+ return false;
+ }
ciMethodData* md = method->method_data();
if (md->is_empty()) {
// Assume the trap has not occurred, or that it occurred only
--- a/hotspot/src/share/vm/opto/divnode.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/divnode.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -219,7 +219,7 @@
static bool magic_long_divide_constants(jlong d, jlong &M, jint &s) {
int64_t p;
uint64_t ad, anc, delta, q1, r1, q2, r2, t;
- const uint64_t two63 = 0x8000000000000000LL; // 2**63.
+ const uint64_t two63 = UCONST64(0x8000000000000000); // 2**63.
ad = ABS(d);
if (d == 0 || d == 1) return false;
--- a/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/escape.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -206,6 +206,11 @@
_verify = false;
}
#endif
+ // Bytecode analyzer BCEscapeAnalyzer, used for Call nodes
+ // processing, calls to CI to resolve symbols (types, fields, methods)
+ // referenced in bytecode. During symbol resolution VM may throw
+ // an exception which CI cleans and converts to compilation failure.
+ if (C->failing()) return false;
// 2. Finish Graph construction by propagating references to all
// java objects through graph.
--- a/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1986,6 +1986,11 @@
Deoptimization::trap_request_index(trap_request) < 0 &&
too_many_recompiles(reason)) {
// This BCI is causing too many recompilations.
+ if (C->log() != NULL) {
+ C->log()->elem("observe that='trap_action_change' reason='%s' from='%s' to='none'",
+ Deoptimization::trap_reason_name(reason),
+ Deoptimization::trap_action_name(action));
+ }
action = Deoptimization::Action_none;
trap_request = Deoptimization::make_trap_request(reason, action);
} else {
@@ -2760,7 +2765,7 @@
Deoptimization::DeoptReason reason = Deoptimization::reason_class_check(spec_klass != NULL);
// Make sure we haven't already deoptimized from this tactic.
- if (too_many_traps(reason))
+ if (too_many_traps(reason) || too_many_recompiles(reason))
return NULL;
// (No, this isn't a call, but it's enough like a virtual call
@@ -2782,8 +2787,7 @@
&exact_obj);
{ PreserveJVMState pjvms(this);
set_control(slow_ctl);
- uncommon_trap(reason,
- Deoptimization::Action_maybe_recompile);
+ uncommon_trap_exact(reason, Deoptimization::Action_maybe_recompile);
}
if (safe_for_replace) {
replace_in_map(not_null_obj, exact_obj);
@@ -2812,8 +2816,12 @@
if (type != NULL) {
Deoptimization::DeoptReason class_reason = Deoptimization::Reason_speculate_class_check;
Deoptimization::DeoptReason null_reason = Deoptimization::Reason_speculate_null_check;
- if (!too_many_traps(null_reason) &&
- !too_many_traps(class_reason)) {
+ ciMethod* trap_method = (sfpt == NULL) ? method() : sfpt->jvms()->method();
+ int trap_bci = (sfpt == NULL) ? bci() : sfpt->jvms()->bci();
+
+ if (!too_many_traps(null_reason) && !too_many_recompiles(null_reason) &&
+ !C->too_many_traps(trap_method, trap_bci, class_reason) &&
+ !C->too_many_recompiles(trap_method, trap_bci, class_reason)) {
Node* not_null_obj = NULL;
// not_null is true if we know the object is not null and
// there's no need for a null check
@@ -2833,19 +2841,18 @@
GraphKit kit(sfpt->jvms());
PreserveJVMState pjvms(&kit);
kit.set_control(slow_ctl);
- kit.uncommon_trap(class_reason,
- Deoptimization::Action_maybe_recompile);
+ kit.uncommon_trap_exact(class_reason, Deoptimization::Action_maybe_recompile);
} else {
PreserveJVMState pjvms(this);
set_control(slow_ctl);
- uncommon_trap(class_reason,
- Deoptimization::Action_maybe_recompile);
+ uncommon_trap_exact(class_reason, Deoptimization::Action_maybe_recompile);
}
replace_in_map(not_null_obj, exact_obj);
obj = exact_obj;
}
} else {
- if (!too_many_traps(Deoptimization::Reason_null_assert)) {
+ if (!too_many_traps(Deoptimization::Reason_null_assert) &&
+ !too_many_recompiles(Deoptimization::Reason_null_assert)) {
Node* exact_obj = null_assert(obj);
replace_in_map(obj, exact_obj);
obj = exact_obj;
--- a/hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -714,6 +714,15 @@
klass, reason_string, must_throw, keep_exact_action);
}
+ // Bail out to the interpreter and keep exact action (avoid switching to Action_none).
+ void uncommon_trap_exact(Deoptimization::DeoptReason reason,
+ Deoptimization::DeoptAction action,
+ ciKlass* klass = NULL, const char* reason_string = NULL,
+ bool must_throw = false) {
+ uncommon_trap(Deoptimization::make_trap_request(reason, action),
+ klass, reason_string, must_throw, /*keep_exact_action=*/true);
+ }
+
// SP when bytecode needs to be reexecuted.
virtual int reexecute_sp() { return sp(); }
--- a/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -145,10 +145,18 @@
Node* v = u->fast_out(k); // User of the phi
// CNC - Allow only really simple patterns.
// In particular I disallow AddP of the Phi, a fairly common pattern
- if( v == cmp ) continue; // The compare is OK
- if( (v->is_ConstraintCast()) &&
- v->in(0)->in(0) == iff )
- continue; // CastPP/II of the IfNode is OK
+ if (v == cmp) continue; // The compare is OK
+ if (v->is_ConstraintCast()) {
+ // If the cast is derived from data flow edges, it may not have a control edge.
+ // If so, it should be safe to split. But follow-up code can not deal with
+ // this (l. 359). So skip.
+ if (v->in(0) == NULL) {
+ return NULL;
+ }
+ if (v->in(0)->in(0) == iff) {
+ continue; // CastPP/II of the IfNode is OK
+ }
+ }
// Disabled following code because I cannot tell if exactly one
// path dominates without a real dominator check. CNC 9/9/1999
//uint vop = v->Opcode();
--- a/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/library_call.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -41,6 +41,7 @@
#include "opto/movenode.hpp"
#include "opto/mulnode.hpp"
#include "opto/narrowptrnode.hpp"
+#include "opto/opaquenode.hpp"
#include "opto/parse.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
@@ -232,7 +233,6 @@
// Unsafe.getObject should be recorded in an SATB log buffer.
void insert_pre_barrier(Node* base_oop, Node* offset, Node* pre_val, bool need_mem_bar);
bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile);
- bool inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static);
static bool klass_needs_init_guard(Node* kls);
bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory();
@@ -287,6 +287,8 @@
bool inline_updateBytesCRC32();
bool inline_updateByteBufferCRC32();
bool inline_multiplyToLen();
+
+ bool inline_profileBoolean();
};
@@ -796,11 +798,6 @@
case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile);
case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile);
- case vmIntrinsics::_prefetchRead: return inline_unsafe_prefetch(!is_native_ptr, !is_store, !is_static);
- case vmIntrinsics::_prefetchWrite: return inline_unsafe_prefetch(!is_native_ptr, is_store, !is_static);
- case vmIntrinsics::_prefetchReadStatic: return inline_unsafe_prefetch(!is_native_ptr, !is_store, is_static);
- case vmIntrinsics::_prefetchWriteStatic: return inline_unsafe_prefetch(!is_native_ptr, is_store, is_static);
-
case vmIntrinsics::_compareAndSwapObject: return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg);
case vmIntrinsics::_compareAndSwapInt: return inline_unsafe_load_store(T_INT, LS_cmpxchg);
case vmIntrinsics::_compareAndSwapLong: return inline_unsafe_load_store(T_LONG, LS_cmpxchg);
@@ -900,6 +897,9 @@
case vmIntrinsics::_updateByteBufferCRC32:
return inline_updateByteBufferCRC32();
+ case vmIntrinsics::_profileBoolean:
+ return inline_profileBoolean();
+
default:
// If you get here, it may be that someone has added a new intrinsic
// to the list in vmSymbols.hpp without implementing it here.
@@ -2506,7 +2506,7 @@
Node* receiver = argument(0); // type: oop
- // Build address expression. See the code in inline_unsafe_prefetch.
+ // Build address expression.
Node* adr;
Node* heap_base_oop = top();
Node* offset = top();
@@ -2695,73 +2695,6 @@
return true;
}
-//----------------------------inline_unsafe_prefetch----------------------------
-
-bool LibraryCallKit::inline_unsafe_prefetch(bool is_native_ptr, bool is_store, bool is_static) {
-#ifndef PRODUCT
- {
- ResourceMark rm;
- // Check the signatures.
- ciSignature* sig = callee()->signature();
-#ifdef ASSERT
- // Object getObject(Object base, int/long offset), etc.
- BasicType rtype = sig->return_type()->basic_type();
- if (!is_native_ptr) {
- assert(sig->count() == 2, "oop prefetch has 2 arguments");
- assert(sig->type_at(0)->basic_type() == T_OBJECT, "prefetch base is object");
- assert(sig->type_at(1)->basic_type() == T_LONG, "prefetcha offset is correct");
- } else {
- assert(sig->count() == 1, "native prefetch has 1 argument");
- assert(sig->type_at(0)->basic_type() == T_LONG, "prefetch base is long");
- }
-#endif // ASSERT
- }
-#endif // !PRODUCT
-
- C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe".
-
- const int idx = is_static ? 0 : 1;
- if (!is_static) {
- null_check_receiver();
- if (stopped()) {
- return true;
- }
- }
-
- // Build address expression. See the code in inline_unsafe_access.
- Node *adr;
- if (!is_native_ptr) {
- // The base is either a Java object or a value produced by Unsafe.staticFieldBase
- Node* base = argument(idx + 0); // type: oop
- // The offset is a value produced by Unsafe.staticFieldOffset or Unsafe.objectFieldOffset
- Node* offset = argument(idx + 1); // type: long
- // We currently rely on the cookies produced by Unsafe.xxxFieldOffset
- // to be plain byte offsets, which are also the same as those accepted
- // by oopDesc::field_base.
- assert(Unsafe_field_offset_to_byte_offset(11) == 11,
- "fieldOffset must be byte-scaled");
- // 32-bit machines ignore the high half!
- offset = ConvL2X(offset);
- adr = make_unsafe_address(base, offset);
- } else {
- Node* ptr = argument(idx + 0); // type: long
- ptr = ConvL2X(ptr); // adjust Java long to machine word
- adr = make_unsafe_address(NULL, ptr);
- }
-
- // Generate the read or write prefetch
- Node *prefetch;
- if (is_store) {
- prefetch = new PrefetchWriteNode(i_o(), adr);
- } else {
- prefetch = new PrefetchReadNode(i_o(), adr);
- }
- prefetch->init_req(0, control());
- set_i_o(_gvn.transform(prefetch));
-
- return true;
-}
-
//----------------------------inline_unsafe_load_store----------------------------
// This method serves a couple of different customers (depending on LoadStoreKind):
//
@@ -4734,6 +4667,8 @@
// tightly_coupled_allocation()
AllocateArrayNode* alloc = tightly_coupled_allocation(dest, NULL);
+ ciMethod* trap_method = method();
+ int trap_bci = bci();
SafePointNode* sfpt = NULL;
if (alloc != NULL) {
// The JVM state for uncommon traps between the allocation and
@@ -4758,6 +4693,9 @@
sfpt->set_i_o(map()->i_o());
sfpt->set_memory(map()->memory());
+
+ trap_method = jvms->method();
+ trap_bci = jvms->bci();
}
bool validated = false;
@@ -4862,7 +4800,7 @@
}
}
- if (!too_many_traps(Deoptimization::Reason_intrinsic) && !src->is_top() && !dest->is_top()) {
+ if (!C->too_many_traps(trap_method, trap_bci, Deoptimization::Reason_intrinsic) && !src->is_top() && !dest->is_top()) {
// validate arguments: enables transformation the ArrayCopyNode
validated = true;
@@ -5867,3 +5805,47 @@
return instof_false; // even if it is NULL
}
+
+bool LibraryCallKit::inline_profileBoolean() {
+ Node* counts = argument(1);
+ const TypeAryPtr* ary = NULL;
+ ciArray* aobj = NULL;
+ if (counts->is_Con()
+ && (ary = counts->bottom_type()->isa_aryptr()) != NULL
+ && (aobj = ary->const_oop()->as_array()) != NULL
+ && (aobj->length() == 2)) {
+ // Profile is int[2] where [0] and [1] correspond to false and true value occurrences respectively.
+ jint false_cnt = aobj->element_value(0).as_int();
+ jint true_cnt = aobj->element_value(1).as_int();
+
+ method()->set_injected_profile(true);
+
+ if (C->log() != NULL) {
+ C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
+ false_cnt, true_cnt);
+ }
+
+ if (false_cnt + true_cnt == 0) {
+ // According to profile, never executed.
+ uncommon_trap_exact(Deoptimization::Reason_intrinsic,
+ Deoptimization::Action_reinterpret);
+ return true;
+ }
+ // Stop profiling.
+ // MethodHandleImpl::profileBoolean() has profiling logic in it's bytecode.
+ // By replacing method's body with profile data (represented as ProfileBooleanNode
+ // on IR level) we effectively disable profiling.
+ // It enables full speed execution once optimized code is generated.
+ Node* profile = _gvn.transform(new ProfileBooleanNode(argument(0), false_cnt, true_cnt));
+ C->record_for_igvn(profile);
+ set_result(profile);
+ return true;
+ } else {
+ // Continue profiling.
+ // Profile data isn't available at the moment. So, execute method's bytecode version.
+ // Usually, when GWT LambdaForms are profiled it means that a stand-alone nmethod
+ // is compiled and counters aren't available since corresponding MethodHandle
+ // isn't a compile-time constant.
+ return false;
+ }
+}
--- a/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/matcher.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -884,8 +884,6 @@
// %%% Kludgery. Instead, fix ideal adr_type methods for all these cases:
if (nidx == Compile::AliasIdxTop && midx == Compile::AliasIdxRaw) {
switch (n->Opcode()) {
- case Op_PrefetchRead:
- case Op_PrefetchWrite:
case Op_PrefetchAllocation:
nidx = Compile::AliasIdxRaw;
nat = TypeRawPtr::BOTTOM;
--- a/hotspot/src/share/vm/opto/memnode.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/memnode.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -1376,26 +1376,6 @@
//------------------------------Prefetch---------------------------------------
-// Non-faulting prefetch load. Prefetch for many reads.
-class PrefetchReadNode : public Node {
-public:
- PrefetchReadNode(Node *abio, Node *adr) : Node(0,abio,adr) {}
- virtual int Opcode() const;
- virtual uint ideal_reg() const { return NotAMachineReg; }
- virtual uint match_edge(uint idx) const { return idx==2; }
- virtual const Type *bottom_type() const { return Type::ABIO; }
-};
-
-// Non-faulting prefetch load. Prefetch for many reads & many writes.
-class PrefetchWriteNode : public Node {
-public:
- PrefetchWriteNode(Node *abio, Node *adr) : Node(0,abio,adr) {}
- virtual int Opcode() const;
- virtual uint ideal_reg() const { return NotAMachineReg; }
- virtual uint match_edge(uint idx) const { return idx==2; }
- virtual const Type *bottom_type() const { return Type::ABIO; }
-};
-
// Allocation prefetch which may fault, TLAB size have to be adjusted.
class PrefetchAllocationNode : public Node {
public:
--- a/hotspot/src/share/vm/opto/opaquenode.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/opaquenode.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -60,4 +60,27 @@
return (&n == this); // Always fail except on self
}
+//=============================================================================
+uint ProfileBooleanNode::hash() const { return NO_HASH; }
+uint ProfileBooleanNode::cmp( const Node &n ) const {
+ return (&n == this);
+}
+
+Node *ProfileBooleanNode::Ideal(PhaseGVN *phase, bool can_reshape) {
+ if (can_reshape && _delay_removal) {
+ _delay_removal = false;
+ return this;
+ } else {
+ return NULL;
+ }
+}
+
+Node *ProfileBooleanNode::Identity( PhaseTransform *phase ) {
+ if (_delay_removal) {
+ return this;
+ } else {
+ assert(_consumed, "profile should be consumed before elimination");
+ return in(1);
+ }
+}
--- a/hotspot/src/share/vm/opto/opaquenode.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/opaquenode.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -87,5 +87,31 @@
bool rtm_opt() const { return (_opt == RTM_OPT); }
};
+//------------------------------ProfileBooleanNode-------------------------------
+// A node represents value profile for a boolean during parsing.
+// Once parsing is over, the node goes away (during IGVN).
+// It is used to override branch frequencies from MDO (see has_injected_profile in parse2.cpp).
+class ProfileBooleanNode : public Node {
+ uint _false_cnt;
+ uint _true_cnt;
+ bool _consumed;
+ bool _delay_removal;
+ virtual uint hash() const ; // { return NO_HASH; }
+ virtual uint cmp( const Node &n ) const;
+ public:
+ ProfileBooleanNode(Node *n, uint false_cnt, uint true_cnt) : Node(0, n),
+ _false_cnt(false_cnt), _true_cnt(true_cnt), _delay_removal(true), _consumed(false) {}
+
+ uint false_count() const { return _false_cnt; }
+ uint true_count() const { return _true_cnt; }
+
+ void consume() { _consumed = true; }
+
+ virtual int Opcode() const;
+ virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
+ virtual Node *Identity(PhaseTransform *phase);
+ virtual const Type *bottom_type() const { return TypeInt::BOOL; }
+};
+
#endif // SHARE_VM_OPTO_OPAQUENODE_HPP
--- a/hotspot/src/share/vm/opto/parse.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -555,8 +555,8 @@
void do_jsr();
void do_ret();
- float dynamic_branch_prediction(float &cnt);
- float branch_prediction(float &cnt, BoolTest::mask btest, int target_bci);
+ float dynamic_branch_prediction(float &cnt, BoolTest::mask btest, Node* test);
+ float branch_prediction(float &cnt, BoolTest::mask btest, int target_bci, Node* test);
bool seems_never_taken(float prob) const;
bool path_is_suitable_for_uncommon_trap(float prob) const;
bool seems_stable_comparison() const;
--- a/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse2.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -37,6 +37,7 @@
#include "opto/matcher.hpp"
#include "opto/memnode.hpp"
#include "opto/mulnode.hpp"
+#include "opto/opaquenode.hpp"
#include "opto/parse.hpp"
#include "opto/runtime.hpp"
#include "runtime/deoptimization.hpp"
@@ -763,35 +764,64 @@
merge_common(target, pnum);
}
+static bool has_injected_profile(BoolTest::mask btest, Node* test, int& taken, int& not_taken) {
+ if (btest != BoolTest::eq && btest != BoolTest::ne) {
+ // Only ::eq and ::ne are supported for profile injection.
+ return false;
+ }
+ if (test->is_Cmp() &&
+ test->in(1)->Opcode() == Op_ProfileBoolean) {
+ ProfileBooleanNode* profile = (ProfileBooleanNode*)test->in(1);
+ int false_cnt = profile->false_count();
+ int true_cnt = profile->true_count();
+
+ // Counts matching depends on the actual test operation (::eq or ::ne).
+ // No need to scale the counts because profile injection was designed
+ // to feed exact counts into VM.
+ taken = (btest == BoolTest::eq) ? false_cnt : true_cnt;
+ not_taken = (btest == BoolTest::eq) ? true_cnt : false_cnt;
+
+ profile->consume();
+ return true;
+ }
+ return false;
+}
//--------------------------dynamic_branch_prediction--------------------------
// Try to gather dynamic branch prediction behavior. Return a probability
// of the branch being taken and set the "cnt" field. Returns a -1.0
// if we need to use static prediction for some reason.
-float Parse::dynamic_branch_prediction(float &cnt) {
+float Parse::dynamic_branch_prediction(float &cnt, BoolTest::mask btest, Node* test) {
ResourceMark rm;
cnt = COUNT_UNKNOWN;
- // Use MethodData information if it is available
- // FIXME: free the ProfileData structure
- ciMethodData* methodData = method()->method_data();
- if (!methodData->is_mature()) return PROB_UNKNOWN;
- ciProfileData* data = methodData->bci_to_data(bci());
- if (!data->is_JumpData()) return PROB_UNKNOWN;
+ int taken = 0;
+ int not_taken = 0;
+
+ bool use_mdo = !has_injected_profile(btest, test, taken, not_taken);
- // get taken and not taken values
- int taken = data->as_JumpData()->taken();
- int not_taken = 0;
- if (data->is_BranchData()) {
- not_taken = data->as_BranchData()->not_taken();
+ if (use_mdo) {
+ // Use MethodData information if it is available
+ // FIXME: free the ProfileData structure
+ ciMethodData* methodData = method()->method_data();
+ if (!methodData->is_mature()) return PROB_UNKNOWN;
+ ciProfileData* data = methodData->bci_to_data(bci());
+ if (!data->is_JumpData()) return PROB_UNKNOWN;
+
+ // get taken and not taken values
+ taken = data->as_JumpData()->taken();
+ not_taken = 0;
+ if (data->is_BranchData()) {
+ not_taken = data->as_BranchData()->not_taken();
+ }
+
+ // scale the counts to be commensurate with invocation counts:
+ taken = method()->scale_count(taken);
+ not_taken = method()->scale_count(not_taken);
}
- // scale the counts to be commensurate with invocation counts:
- taken = method()->scale_count(taken);
- not_taken = method()->scale_count(not_taken);
-
// Give up if too few (or too many, in which case the sum will overflow) counts to be meaningful.
- // We also check that individual counters are positive first, overwise the sum can become positive.
+ // We also check that individual counters are positive first, otherwise the sum can become positive.
if (taken < 0 || not_taken < 0 || taken + not_taken < 40) {
if (C->log() != NULL) {
C->log()->elem("branch target_bci='%d' taken='%d' not_taken='%d'", iter().get_dest(), taken, not_taken);
@@ -841,8 +871,9 @@
//-----------------------------branch_prediction-------------------------------
float Parse::branch_prediction(float& cnt,
BoolTest::mask btest,
- int target_bci) {
- float prob = dynamic_branch_prediction(cnt);
+ int target_bci,
+ Node* test) {
+ float prob = dynamic_branch_prediction(cnt, btest, test);
// If prob is unknown, switch to static prediction
if (prob != PROB_UNKNOWN) return prob;
@@ -932,7 +963,7 @@
Block* next_block = successor_for_bci(iter().next_bci());
float cnt;
- float prob = branch_prediction(cnt, btest, target_bci);
+ float prob = branch_prediction(cnt, btest, target_bci, c);
if (prob == PROB_UNKNOWN) {
// (An earlier version of do_ifnull omitted this trap for OSR methods.)
#ifndef PRODUCT
@@ -1013,7 +1044,7 @@
Block* next_block = successor_for_bci(iter().next_bci());
float cnt;
- float prob = branch_prediction(cnt, btest, target_bci);
+ float prob = branch_prediction(cnt, btest, target_bci, c);
float untaken_prob = 1.0 - prob;
if (prob == PROB_UNKNOWN) {
--- a/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvm.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -45,7 +45,6 @@
#include "prims/privilegedStack.hpp"
#include "runtime/arguments.hpp"
#include "runtime/atomic.inline.hpp"
-#include "runtime/dtraceJSDT.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/init.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -304,7 +303,7 @@
// java.lang.System, but we choose to keep it here so that it stays next
// to JVM_CurrentTimeMillis and JVM_NanoTime
-const jlong MAX_DIFF_SECS = 0x0100000000LL; // 2^32
+const jlong MAX_DIFF_SECS = CONST64(0x0100000000); // 2^32
const jlong MIN_DIFF_SECS = -MAX_DIFF_SECS; // -2^32
JVM_LEAF(jlong, JVM_GetNanoTimeAdjustment(JNIEnv *env, jclass ignored, jlong offset_secs))
@@ -3562,36 +3561,6 @@
return VM_Version::supports_cx8();
JVM_END
-// DTrace ///////////////////////////////////////////////////////////////////
-
-JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env))
- JVMWrapper("JVM_DTraceGetVersion");
- return (jint)JVM_TRACING_DTRACE_VERSION;
-JVM_END
-
-JVM_ENTRY(jlong,JVM_DTraceActivate(
- JNIEnv* env, jint version, jstring module_name, jint providers_count,
- JVM_DTraceProvider* providers))
- JVMWrapper("JVM_DTraceActivate");
- return DTraceJSDT::activate(
- version, module_name, providers_count, providers, THREAD);
-JVM_END
-
-JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method))
- JVMWrapper("JVM_DTraceIsProbeEnabled");
- return DTraceJSDT::is_probe_enabled(method);
-JVM_END
-
-JVM_ENTRY(void,JVM_DTraceDispose(JNIEnv* env, jlong handle))
- JVMWrapper("JVM_DTraceDispose");
- DTraceJSDT::dispose(handle);
-JVM_END
-
-JVM_ENTRY(jboolean,JVM_DTraceIsSupported(JNIEnv* env))
- JVMWrapper("JVM_DTraceIsSupported");
- return DTraceJSDT::is_supported();
-JVM_END
-
// Returns an array of all live Thread objects (VM internal JavaThreads,
// jvmti agent threads, and JNI attaching threads are skipped)
// See CR 6404306 regarding JNI attaching threads
--- a/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvm.h Mon Feb 16 08:47:39 2015 -0800
@@ -568,83 +568,6 @@
JNIEXPORT jboolean JNICALL
JVM_SupportsCX8(void);
-/*
- * com.sun.dtrace.jsdt support
- */
-
-#define JVM_TRACING_DTRACE_VERSION 1
-
-/*
- * Structure to pass one probe description to JVM.
- *
- * The VM will overwrite the definition of the referenced method with
- * code that will fire the probe.
- */
-typedef struct {
- jmethodID method;
- jstring function;
- jstring name;
- void* reserved[4]; // for future use
-} JVM_DTraceProbe;
-
-/**
- * Encapsulates the stability ratings for a DTrace provider field
- */
-typedef struct {
- jint nameStability;
- jint dataStability;
- jint dependencyClass;
-} JVM_DTraceInterfaceAttributes;
-
-/*
- * Structure to pass one provider description to JVM
- */
-typedef struct {
- jstring name;
- JVM_DTraceProbe* probes;
- jint probe_count;
- JVM_DTraceInterfaceAttributes providerAttributes;
- JVM_DTraceInterfaceAttributes moduleAttributes;
- JVM_DTraceInterfaceAttributes functionAttributes;
- JVM_DTraceInterfaceAttributes nameAttributes;
- JVM_DTraceInterfaceAttributes argsAttributes;
- void* reserved[4]; // for future use
-} JVM_DTraceProvider;
-
-/*
- * Get the version number the JVM was built with
- */
-JNIEXPORT jint JNICALL
-JVM_DTraceGetVersion(JNIEnv* env);
-
-/*
- * Register new probe with given signature, return global handle
- *
- * The version passed in is the version that the library code was
- * built with.
- */
-JNIEXPORT jlong JNICALL
-JVM_DTraceActivate(JNIEnv* env, jint version, jstring module_name,
- jint providers_count, JVM_DTraceProvider* providers);
-
-/*
- * Check JSDT probe
- */
-JNIEXPORT jboolean JNICALL
-JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method);
-
-/*
- * Destroy custom DOF
- */
-JNIEXPORT void JNICALL
-JVM_DTraceDispose(JNIEnv* env, jlong handle);
-
-/*
- * Check to see if DTrace is supported by OS
- */
-JNIEXPORT jboolean JNICALL
-JVM_DTraceIsSupported(JNIEnv* env);
-
/*************************************************************************
PART 2: Support for the Verifier and Class File Format Checker
************************************************************************/
--- a/hotspot/src/share/vm/prims/unsafe.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -30,10 +30,8 @@
#include "runtime/atomic.inline.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
-#include "runtime/prefetch.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/reflection.hpp"
-#include "runtime/synchronizer.hpp"
#include "runtime/vm_version.hpp"
#include "services/threadService.hpp"
#include "trace/tracing.hpp"
@@ -596,17 +594,7 @@
os::free(p);
UNSAFE_END
-UNSAFE_ENTRY(void, Unsafe_SetMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size, jbyte value))
- UnsafeWrapper("Unsafe_SetMemory");
- size_t sz = (size_t)size;
- if (sz != (julong)size || size < 0) {
- THROW(vmSymbols::java_lang_IllegalArgumentException());
- }
- char* p = (char*) addr_from_java(addr);
- Copy::fill_to_memory_atomic(p, sz, value);
-UNSAFE_END
-
-UNSAFE_ENTRY(void, Unsafe_SetMemory2(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong size, jbyte value))
+UNSAFE_ENTRY(void, Unsafe_SetMemory(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong size, jbyte value))
UnsafeWrapper("Unsafe_SetMemory");
size_t sz = (size_t)size;
if (sz != (julong)size || size < 0) {
@@ -617,21 +605,7 @@
Copy::fill_to_memory_atomic(p, sz, value);
UNSAFE_END
-UNSAFE_ENTRY(void, Unsafe_CopyMemory(JNIEnv *env, jobject unsafe, jlong srcAddr, jlong dstAddr, jlong size))
- UnsafeWrapper("Unsafe_CopyMemory");
- if (size == 0) {
- return;
- }
- size_t sz = (size_t)size;
- if (sz != (julong)size || size < 0) {
- THROW(vmSymbols::java_lang_IllegalArgumentException());
- }
- void* src = addr_from_java(srcAddr);
- void* dst = addr_from_java(dstAddr);
- Copy::conjoint_memory_atomic(src, dst, sz);
-UNSAFE_END
-
-UNSAFE_ENTRY(void, Unsafe_CopyMemory2(JNIEnv *env, jobject unsafe, jobject srcObj, jlong srcOffset, jobject dstObj, jlong dstOffset, jlong size))
+UNSAFE_ENTRY(void, Unsafe_CopyMemory(JNIEnv *env, jobject unsafe, jobject srcObj, jlong srcOffset, jobject dstObj, jlong dstOffset, jlong size))
UnsafeWrapper("Unsafe_CopyMemory");
if (size == 0) {
return;
@@ -725,24 +699,6 @@
return JNIHandles::make_local(env, mirror);
UNSAFE_END
-//@deprecated
-UNSAFE_ENTRY(jint, Unsafe_FieldOffset(JNIEnv *env, jobject unsafe, jobject field))
- UnsafeWrapper("Unsafe_FieldOffset");
- // tries (but fails) to be polymorphic between static and non-static:
- jlong offset = find_field_offset(field, -1, THREAD);
- guarantee(offset == (jint)offset, "offset fits in 32 bits");
- return (jint)offset;
-UNSAFE_END
-
-//@deprecated
-UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromClass(JNIEnv *env, jobject unsafe, jobject clazz))
- UnsafeWrapper("Unsafe_StaticFieldBase");
- if (clazz == NULL) {
- THROW_0(vmSymbols::java_lang_NullPointerException());
- }
- return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz));
-UNSAFE_END
-
UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) {
UnsafeWrapper("Unsafe_EnsureClassInitialized");
if (clazz == NULL) {
@@ -915,31 +871,7 @@
}
UNSAFE_END
-static jobject get_class_loader(JNIEnv* env, jclass cls) {
- if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
- return NULL;
- }
- Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
- oop loader = k->class_loader();
- return JNIHandles::make_local(env, loader);
-}
-UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length))
- UnsafeWrapper("Unsafe_DefineClass");
- {
- ThreadToNativeFromVM ttnfv(thread);
-
- int depthFromDefineClass0 = 1;
- jclass caller = JVM_GetCallerClass(env, depthFromDefineClass0);
- jobject loader = (caller == NULL) ? NULL : get_class_loader(env, caller);
- jobject pd = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller);
-
- return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd);
- }
-UNSAFE_END
-
-
-#define DAC_Args CLS"[B["OBJ
// define a class but do not make it known to the class loader or system dictionary
// - host_class: supplies context for linkage, access control, protection domain, and class loader
// - data: bytes of a class file, a raw memory address (length gives the number of bytes)
@@ -1233,20 +1165,6 @@
return ret;
UNSAFE_END
-UNSAFE_ENTRY(void, Unsafe_PrefetchRead(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
- UnsafeWrapper("Unsafe_PrefetchRead");
- oop p = JNIHandles::resolve(obj);
- void* addr = index_oop_from_field_offset_long(p, 0);
- Prefetch::read(addr, (intx)offset);
-UNSAFE_END
-
-UNSAFE_ENTRY(void, Unsafe_PrefetchWrite(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
- UnsafeWrapper("Unsafe_PrefetchWrite");
- oop p = JNIHandles::resolve(obj);
- void* addr = index_oop_from_field_offset_long(p, 0);
- Prefetch::write(addr, (intx)offset);
-UNSAFE_END
-
/// JVM_RegisterUnsafeMethods
@@ -1256,256 +1174,50 @@
#define OBJ LANG"Object;"
#define CLS LANG"Class;"
-#define CTR LANG"reflect/Constructor;"
#define FLD LANG"reflect/Field;"
-#define MTH LANG"reflect/Method;"
#define THR LANG"Throwable;"
-#define DC0_Args LANG"String;[BII"
-#define DC_Args DC0_Args LANG"ClassLoader;" "Ljava/security/ProtectionDomain;"
+#define DC_Args LANG"String;[BII" LANG"ClassLoader;" "Ljava/security/ProtectionDomain;"
+#define DAC_Args CLS"[B["OBJ
#define CC (char*) /*cast a literal from (const char*)*/
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
-// define deprecated accessors for compabitility with 1.4.0
-#define DECLARE_GETSETOOP_140(Boolean, Z) \
- {CC"get"#Boolean, CC"("OBJ"I)"#Z, FN_PTR(Unsafe_Get##Boolean##140)}, \
- {CC"put"#Boolean, CC"("OBJ"I"#Z")V", FN_PTR(Unsafe_Set##Boolean##140)}
-
-// Note: In 1.4.1, getObject and kin take both int and long offsets.
-#define DECLARE_GETSETOOP_141(Boolean, Z) \
- {CC"get"#Boolean, CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean)}, \
- {CC"put"#Boolean, CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean)}
-
-// Note: In 1.5.0, there are volatile versions too
-#define DECLARE_GETSETOOP(Boolean, Z) \
+#define DECLARE_GETPUTOOP(Boolean, Z) \
{CC"get"#Boolean, CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean)}, \
{CC"put"#Boolean, CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean)}, \
{CC"get"#Boolean"Volatile", CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean##Volatile)}, \
{CC"put"#Boolean"Volatile", CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean##Volatile)}
-#define DECLARE_GETSETNATIVE(Byte, B) \
+#define DECLARE_GETPUTNATIVE(Byte, B) \
{CC"get"#Byte, CC"("ADR")"#B, FN_PTR(Unsafe_GetNative##Byte)}, \
{CC"put"#Byte, CC"("ADR#B")V", FN_PTR(Unsafe_SetNative##Byte)}
-// These are the methods for 1.4.0
-static JNINativeMethod methods_140[] = {
- DECLARE_GETSETOOP_140(Boolean, Z),
- DECLARE_GETSETOOP_140(Byte, B),
- DECLARE_GETSETOOP_140(Short, S),
- DECLARE_GETSETOOP_140(Char, C),
- DECLARE_GETSETOOP_140(Int, I),
- DECLARE_GETSETOOP_140(Long, J),
- DECLARE_GETSETOOP_140(Float, F),
- DECLARE_GETSETOOP_140(Double, D),
-
- DECLARE_GETSETNATIVE(Byte, B),
- DECLARE_GETSETNATIVE(Short, S),
- DECLARE_GETSETNATIVE(Char, C),
- DECLARE_GETSETNATIVE(Int, I),
- DECLARE_GETSETNATIVE(Long, J),
- DECLARE_GETSETNATIVE(Float, F),
- DECLARE_GETSETNATIVE(Double, D),
-
- {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
- {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
-
- {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
- {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
- {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
-
- {CC"fieldOffset", CC"("FLD")I", FN_PTR(Unsafe_FieldOffset)},
- {CC"staticFieldBase", CC"("CLS")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromClass)},
- {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
- {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
- {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
- {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
- {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
-
- {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
- {CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
- {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
-};
-
-// These are the methods prior to the JSR 166 changes in 1.5.0
-static JNINativeMethod methods_141[] = {
- {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
- {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
-
- DECLARE_GETSETOOP_141(Boolean, Z),
- DECLARE_GETSETOOP_141(Byte, B),
- DECLARE_GETSETOOP_141(Short, S),
- DECLARE_GETSETOOP_141(Char, C),
- DECLARE_GETSETOOP_141(Int, I),
- DECLARE_GETSETOOP_141(Long, J),
- DECLARE_GETSETOOP_141(Float, F),
- DECLARE_GETSETOOP_141(Double, D),
-
- DECLARE_GETSETNATIVE(Byte, B),
- DECLARE_GETSETNATIVE(Short, S),
- DECLARE_GETSETNATIVE(Char, C),
- DECLARE_GETSETNATIVE(Int, I),
- DECLARE_GETSETNATIVE(Long, J),
- DECLARE_GETSETNATIVE(Float, F),
- DECLARE_GETSETNATIVE(Double, D),
-
- {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
- {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
-
- {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
- {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
- {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
-
- {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
- {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
- {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
- {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
- {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
- {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
- {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
- {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
-
- {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
- {CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
- {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
-
-};
-
-// These are the methods prior to the JSR 166 changes in 1.6.0
-static JNINativeMethod methods_15[] = {
+static JNINativeMethod methods[] = {
{CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
{CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
{CC"getObjectVolatile",CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObjectVolatile)},
{CC"putObjectVolatile",CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObjectVolatile)},
-
- DECLARE_GETSETOOP(Boolean, Z),
- DECLARE_GETSETOOP(Byte, B),
- DECLARE_GETSETOOP(Short, S),
- DECLARE_GETSETOOP(Char, C),
- DECLARE_GETSETOOP(Int, I),
- DECLARE_GETSETOOP(Long, J),
- DECLARE_GETSETOOP(Float, F),
- DECLARE_GETSETOOP(Double, D),
-
- DECLARE_GETSETNATIVE(Byte, B),
- DECLARE_GETSETNATIVE(Short, S),
- DECLARE_GETSETNATIVE(Char, C),
- DECLARE_GETSETNATIVE(Int, I),
- DECLARE_GETSETNATIVE(Long, J),
- DECLARE_GETSETNATIVE(Float, F),
- DECLARE_GETSETNATIVE(Double, D),
-
- {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
- {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
-
- {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
- {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
- {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
-
- {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
- {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
- {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
- {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
- {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
- {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
- {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
- {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
-
- {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
- {CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
- {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
- {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
- {CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
- {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)},
- {CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
- {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}
-
-};
-
-// These are the methods for 1.6.0 and 1.7.0
-static JNINativeMethod methods_16[] = {
- {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
- {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
- {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObjectVolatile)},
- {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObjectVolatile)},
-
- DECLARE_GETSETOOP(Boolean, Z),
- DECLARE_GETSETOOP(Byte, B),
- DECLARE_GETSETOOP(Short, S),
- DECLARE_GETSETOOP(Char, C),
- DECLARE_GETSETOOP(Int, I),
- DECLARE_GETSETOOP(Long, J),
- DECLARE_GETSETOOP(Float, F),
- DECLARE_GETSETOOP(Double, D),
+ DECLARE_GETPUTOOP(Boolean, Z),
+ DECLARE_GETPUTOOP(Byte, B),
+ DECLARE_GETPUTOOP(Short, S),
+ DECLARE_GETPUTOOP(Char, C),
+ DECLARE_GETPUTOOP(Int, I),
+ DECLARE_GETPUTOOP(Long, J),
+ DECLARE_GETPUTOOP(Float, F),
+ DECLARE_GETPUTOOP(Double, D),
- DECLARE_GETSETNATIVE(Byte, B),
- DECLARE_GETSETNATIVE(Short, S),
- DECLARE_GETSETNATIVE(Char, C),
- DECLARE_GETSETNATIVE(Int, I),
- DECLARE_GETSETNATIVE(Long, J),
- DECLARE_GETSETNATIVE(Float, F),
- DECLARE_GETSETNATIVE(Double, D),
-
- {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
- {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
-
- {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
- {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
- {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
-
- {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
- {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
- {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
- {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
- {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
- {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
- {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
- {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
-
- {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
- {CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
- {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
- {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
- {CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
- {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)},
- {CC"putOrderedObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetOrderedObject)},
- {CC"putOrderedInt", CC"("OBJ"JI)V", FN_PTR(Unsafe_SetOrderedInt)},
- {CC"putOrderedLong", CC"("OBJ"JJ)V", FN_PTR(Unsafe_SetOrderedLong)},
- {CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
- {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}
-};
-
-// These are the methods for 1.8.0
-static JNINativeMethod methods_18[] = {
- {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
- {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
- {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObjectVolatile)},
- {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObjectVolatile)},
-
- DECLARE_GETSETOOP(Boolean, Z),
- DECLARE_GETSETOOP(Byte, B),
- DECLARE_GETSETOOP(Short, S),
- DECLARE_GETSETOOP(Char, C),
- DECLARE_GETSETOOP(Int, I),
- DECLARE_GETSETOOP(Long, J),
- DECLARE_GETSETOOP(Float, F),
- DECLARE_GETSETOOP(Double, D),
-
- DECLARE_GETSETNATIVE(Byte, B),
- DECLARE_GETSETNATIVE(Short, S),
- DECLARE_GETSETNATIVE(Char, C),
- DECLARE_GETSETNATIVE(Int, I),
- DECLARE_GETSETNATIVE(Long, J),
- DECLARE_GETSETNATIVE(Float, F),
- DECLARE_GETSETNATIVE(Double, D),
+ DECLARE_GETPUTNATIVE(Byte, B),
+ DECLARE_GETPUTNATIVE(Short, S),
+ DECLARE_GETPUTNATIVE(Char, C),
+ DECLARE_GETPUTNATIVE(Int, I),
+ DECLARE_GETPUTNATIVE(Long, J),
+ DECLARE_GETPUTNATIVE(Float, F),
+ DECLARE_GETPUTNATIVE(Double, D),
{CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
{CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
@@ -1533,39 +1245,17 @@
{CC"putOrderedInt", CC"("OBJ"JI)V", FN_PTR(Unsafe_SetOrderedInt)},
{CC"putOrderedLong", CC"("OBJ"JJ)V", FN_PTR(Unsafe_SetOrderedLong)},
{CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
- {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}
-};
-
-JNINativeMethod loadavg_method[] = {
- {CC"getLoadAverage", CC"([DI)I", FN_PTR(Unsafe_Loadavg)}
-};
+ {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)},
-JNINativeMethod prefetch_methods[] = {
- {CC"prefetchRead", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
- {CC"prefetchWrite", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)},
- {CC"prefetchReadStatic", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
- {CC"prefetchWriteStatic",CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)}
-};
+ {CC"getLoadAverage", CC"([DI)I", FN_PTR(Unsafe_Loadavg)},
-JNINativeMethod memcopy_methods_17[] = {
- {CC"copyMemory", CC"("OBJ"J"OBJ"JJ)V", FN_PTR(Unsafe_CopyMemory2)},
- {CC"setMemory", CC"("OBJ"JJB)V", FN_PTR(Unsafe_SetMemory2)}
-};
-
-JNINativeMethod memcopy_methods_15[] = {
- {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
- {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)}
-};
+ {CC"copyMemory", CC"("OBJ"J"OBJ"JJ)V", FN_PTR(Unsafe_CopyMemory)},
+ {CC"setMemory", CC"("OBJ"JJB)V", FN_PTR(Unsafe_SetMemory)},
-JNINativeMethod anonk_methods[] = {
{CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)},
-};
-JNINativeMethod lform_methods[] = {
{CC"shouldBeInitialized",CC"("CLS")Z", FN_PTR(Unsafe_ShouldBeInitialized)},
-};
-JNINativeMethod fence_methods[] = {
{CC"loadFence", CC"()V", FN_PTR(Unsafe_LoadFence)},
{CC"storeFence", CC"()V", FN_PTR(Unsafe_StoreFence)},
{CC"fullFence", CC"()V", FN_PTR(Unsafe_FullFence)},
@@ -1578,35 +1268,13 @@
#undef LANG
#undef OBJ
#undef CLS
-#undef CTR
#undef FLD
-#undef MTH
#undef THR
-#undef DC0_Args
#undef DC_Args
-
-#undef DECLARE_GETSETOOP
-#undef DECLARE_GETSETNATIVE
-
+#undef DAC_Args
-/**
- * Helper method to register native methods.
- */
-static bool register_natives(const char* message, JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) {
- int status = env->RegisterNatives(clazz, methods, nMethods);
- if (status < 0 || env->ExceptionOccurred()) {
- if (PrintMiscellaneous && (Verbose || WizardMode)) {
- tty->print_cr("Unsafe: failed registering %s", message);
- }
- env->ExceptionClear();
- return false;
- } else {
- if (PrintMiscellaneous && (Verbose || WizardMode)) {
- tty->print_cr("Unsafe: successfully registered %s", message);
- }
- return true;
- }
-}
+#undef DECLARE_GETPUTOOP
+#undef DECLARE_GETPUTNATIVE
// This one function is exported, used by NativeLookup.
@@ -1614,57 +1282,12 @@
// The optimizer looks at names and signatures to recognize
// individual functions.
-JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafecls))
+JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafeclass))
UnsafeWrapper("JVM_RegisterUnsafeMethods");
{
ThreadToNativeFromVM ttnfv(thread);
- // Unsafe methods
- {
- bool success = false;
- // We need to register the 1.6 methods first because the 1.8 methods would register fine on 1.7 and 1.6
- if (!success) {
- success = register_natives("1.6 methods", env, unsafecls, methods_16, sizeof(methods_16)/sizeof(JNINativeMethod));
- }
- if (!success) {
- success = register_natives("1.8 methods", env, unsafecls, methods_18, sizeof(methods_18)/sizeof(JNINativeMethod));
- }
- if (!success) {
- success = register_natives("1.5 methods", env, unsafecls, methods_15, sizeof(methods_15)/sizeof(JNINativeMethod));
- }
- if (!success) {
- success = register_natives("1.4.1 methods", env, unsafecls, methods_141, sizeof(methods_141)/sizeof(JNINativeMethod));
- }
- if (!success) {
- success = register_natives("1.4.0 methods", env, unsafecls, methods_140, sizeof(methods_140)/sizeof(JNINativeMethod));
- }
- guarantee(success, "register unsafe natives");
- }
-
- // Unsafe.getLoadAverage
- register_natives("1.6 loadavg method", env, unsafecls, loadavg_method, sizeof(loadavg_method)/sizeof(JNINativeMethod));
-
- // Prefetch methods
- register_natives("1.6 prefetch methods", env, unsafecls, prefetch_methods, sizeof(prefetch_methods)/sizeof(JNINativeMethod));
-
- // Memory copy methods
- {
- bool success = false;
- if (!success) {
- success = register_natives("1.7 memory copy methods", env, unsafecls, memcopy_methods_17, sizeof(memcopy_methods_17)/sizeof(JNINativeMethod));
- }
- if (!success) {
- success = register_natives("1.5 memory copy methods", env, unsafecls, memcopy_methods_15, sizeof(memcopy_methods_15)/sizeof(JNINativeMethod));
- }
- }
-
- // Unsafe.defineAnonymousClass
- register_natives("1.7 define anonymous class method", env, unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod));
-
- // Unsafe.shouldBeInitialized
- register_natives("1.7 LambdaForm support", env, unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod));
-
- // Fence methods
- register_natives("1.8 fence methods", env, unsafecls, fence_methods, sizeof(fence_methods)/sizeof(JNINativeMethod));
+ int ok = env->RegisterNatives(unsafeclass, methods, sizeof(methods)/sizeof(JNINativeMethod));
+ guarantee(ok == 0, "register unsafe natives");
}
JVM_END
--- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1114,34 +1114,39 @@
}
#endif
+// Returns threshold scaled with the value of scale.
+// If scale < 0.0, threshold is returned without scaling.
intx Arguments::scaled_compile_threshold(intx threshold, double scale) {
- if (scale == 1.0 || scale <= 0.0) {
+ if (scale == 1.0 || scale < 0.0) {
return threshold;
} else {
return (intx)(threshold * scale);
}
}
-// Returns freq_log scaled with CompileThresholdScaling
+// Returns freq_log scaled with the value of scale.
+// Returned values are in the range of [0, InvocationCounter::number_of_count_bits + 1].
+// If scale < 0.0, freq_log is returned without scaling.
intx Arguments::scaled_freq_log(intx freq_log, double scale) {
- // Check if scaling is necessary or negative value was specified.
+ // Check if scaling is necessary or if negative value was specified.
if (scale == 1.0 || scale < 0.0) {
return freq_log;
}
-
- // Check value to avoid calculating log2 of 0.
- if (scale == 0.0) {
- return freq_log;
+ // Check values to avoid calculating log2 of 0.
+ if (scale == 0.0 || freq_log == 0) {
+ return 0;
}
-
- intx scaled_freq = scaled_compile_threshold((intx)1 << freq_log, scale);
// Determine the maximum notification frequency value currently supported.
// The largest mask value that the interpreter/C1 can handle is
// of length InvocationCounter::number_of_count_bits. Mask values are always
// one bit shorter then the value of the notification frequency. Set
// max_freq_bits accordingly.
intx max_freq_bits = InvocationCounter::number_of_count_bits + 1;
- if (scaled_freq > nth_bit(max_freq_bits)) {
+ intx scaled_freq = scaled_compile_threshold((intx)1 << freq_log, scale);
+ if (scaled_freq == 0) {
+ // Return 0 right away to avoid calculating log2 of 0.
+ return 0;
+ } else if (scaled_freq > nth_bit(max_freq_bits)) {
return max_freq_bits;
} else {
return log2_intptr(scaled_freq);
@@ -1192,8 +1197,9 @@
vm_exit_during_initialization("Negative value specified for CompileThresholdScaling", NULL);
}
- // Scale tiered compilation thresholds
- if (!FLAG_IS_DEFAULT(CompileThresholdScaling)) {
+ // Scale tiered compilation thresholds.
+ // CompileThresholdScaling == 0.0 is equivalent to -Xint and leaves compilation thresholds unchanged.
+ if (!FLAG_IS_DEFAULT(CompileThresholdScaling) && CompileThresholdScaling > 0.0) {
FLAG_SET_ERGO(intx, Tier0InvokeNotifyFreqLog, scaled_freq_log(Tier0InvokeNotifyFreqLog));
FLAG_SET_ERGO(intx, Tier0BackedgeNotifyFreqLog, scaled_freq_log(Tier0BackedgeNotifyFreqLog));
@@ -3912,7 +3918,8 @@
"Incompatible compilation policy selected", NULL);
}
// Scale CompileThreshold
- if (!FLAG_IS_DEFAULT(CompileThresholdScaling)) {
+ // CompileThresholdScaling == 0.0 is equivalent to -Xint and leaves CompileThreshold unchanged.
+ if (!FLAG_IS_DEFAULT(CompileThresholdScaling) && CompileThresholdScaling > 0.0) {
FLAG_SET_ERGO(intx, CompileThreshold, scaled_compile_threshold(CompileThreshold));
}
}
--- a/hotspot/src/share/vm/runtime/dtraceJSDT.cpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 1997, 2012, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "classfile/javaClasses.hpp"
-#include "code/codeBlob.hpp"
-#include "code/nativeInst.hpp"
-#include "memory/allocation.hpp"
-#include "prims/jvm.h"
-#include "runtime/dtraceJSDT.hpp"
-#include "runtime/jniHandles.hpp"
-#include "runtime/os.hpp"
-#include "utilities/exceptions.hpp"
-#include "utilities/globalDefinitions.hpp"
-#include "utilities/utf8.hpp"
-
-#ifdef HAVE_DTRACE_H
-
-jlong DTraceJSDT::activate(
- jint version, jstring module_name, jint providers_count,
- JVM_DTraceProvider* providers, TRAPS) {
-
- size_t count = 0;
- RegisteredProbes* probes = NULL;
-
- if (!is_supported()) {
- return 0;
- }
-
- assert(module_name != NULL, "valid module name");
- assert(providers != NULL, "valid provider array");
-
- for (int i = 0; i < providers_count; ++i) {
- count += providers[i].probe_count;
- }
- probes = new RegisteredProbes(count);
- count = 0;
-
- for (int i = 0; i < providers_count; ++i) {
- assert(providers[i].name != NULL, "valid provider name");
- assert(providers[i].probe_count == 0 || providers[i].probes != NULL,
- "valid probe count");
- for (int j = 0; j < providers[i].probe_count; ++j) {
- JVM_DTraceProbe* probe = &(providers[i].probes[j]);
- assert(probe != NULL, "valid probe");
- assert(probe->method != NULL, "valid method");
- assert(probe->name != NULL, "valid probe name");
- assert(probe->function != NULL, "valid probe function spec");
- methodHandle h_method =
- methodHandle(THREAD, Method::resolve_jmethod_id(probe->method));
- nmethod* nm = AdapterHandlerLibrary::create_dtrace_nmethod(h_method);
- if (nm == NULL) {
- delete probes;
- THROW_MSG_0(vmSymbols::java_lang_RuntimeException(),
- "Unable to register DTrace probes (CodeCache: no room for DTrace nmethods).");
- }
- h_method()->set_not_compilable();
- h_method()->set_code(h_method, nm);
- probes->nmethod_at_put(count++, nm);
- }
- }
-
- int handle = pd_activate((void*)probes,
- module_name, providers_count, providers);
- if (handle < 0) {
- delete probes;
- THROW_MSG_0(vmSymbols::java_lang_RuntimeException(),
- "Unable to register DTrace probes (internal error).");
- }
- probes->set_helper_handle(handle);
- return RegisteredProbes::toOpaqueProbes(probes);
-}
-
-jboolean DTraceJSDT::is_probe_enabled(jmethodID method) {
- Method* m = Method::resolve_jmethod_id(method);
- return nativeInstruction_at(m->code()->trap_address())->is_dtrace_trap();
-}
-
-void DTraceJSDT::dispose(OpaqueProbes probes) {
- RegisteredProbes* p = RegisteredProbes::toRegisteredProbes(probes);
- if (probes != -1 && p != NULL) {
- pd_dispose(p->helper_handle());
- delete p;
- }
-}
-
-jboolean DTraceJSDT::is_supported() {
- return pd_is_supported();
-}
-
-#else // HAVE_DTRACE_H
-
-jlong DTraceJSDT::activate(
- jint version, jstring module_name, jint providers_count,
- JVM_DTraceProvider* providers, TRAPS) {
- return 0;
-}
-
-jboolean DTraceJSDT::is_probe_enabled(jmethodID method) {
- return false;
-}
-
-void DTraceJSDT::dispose(OpaqueProbes probes) {
- return;
-}
-
-jboolean DTraceJSDT::is_supported() {
- return false;
-}
-
-#endif // ndef HAVE_DTRACE_H
--- a/hotspot/src/share/vm/runtime/dtraceJSDT.hpp Wed Jul 05 20:19:45 2017 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef SHARE_VM_RUNTIME_DTRACEJSDT_HPP
-#define SHARE_VM_RUNTIME_DTRACEJSDT_HPP
-
-#include "code/nmethod.hpp"
-
-class RegisteredProbes;
-typedef jlong OpaqueProbes;
-
-class DTraceJSDT : AllStatic {
- private:
-
- static int pd_activate(void* moduleBaseAddress, jstring module,
- jint providers_count, JVM_DTraceProvider* providers);
- static void pd_dispose(int handle);
- static jboolean pd_is_supported();
-
- public:
-
- static OpaqueProbes activate(
- jint version, jstring module_name, jint providers_count,
- JVM_DTraceProvider* providers, TRAPS);
- static jboolean is_probe_enabled(jmethodID method);
- static void dispose(OpaqueProbes handle);
- static jboolean is_supported();
-};
-
-class RegisteredProbes : public CHeapObj<mtInternal> {
- private:
- nmethod** _nmethods; // all the probe methods
- size_t _count; // number of probe methods
- int _helper_handle; // DTrace-assigned identifier
-
- public:
- RegisteredProbes(size_t count) {
- _count = count;
- _nmethods = NEW_C_HEAP_ARRAY(nmethod*, count, mtInternal);
- }
-
- ~RegisteredProbes() {
- for (size_t i = 0; i < _count; ++i) {
- // Let the sweeper reclaim it
- _nmethods[i]->make_not_entrant();
- _nmethods[i]->method()->clear_code();
- }
- FREE_C_HEAP_ARRAY(nmethod*, _nmethods);
- _nmethods = NULL;
- _count = 0;
- }
-
- static RegisteredProbes* toRegisteredProbes(OpaqueProbes p) {
- return (RegisteredProbes*)(intptr_t)p;
- }
-
- static OpaqueProbes toOpaqueProbes(RegisteredProbes* p) {
- return (OpaqueProbes)(intptr_t)p;
- }
-
- void set_helper_handle(int handle) { _helper_handle = handle; }
- int helper_handle() const { return _helper_handle; }
-
- nmethod* nmethod_at(size_t i) {
- assert(i >= 0 && i < _count, "bad nmethod index");
- return _nmethods[i];
- }
-
- void nmethod_at_put(size_t i, nmethod* nm) {
- assert(i >= 0 && i < _count, "bad nmethod index");
- _nmethods[i] = nm;
- }
-};
-
-#endif // SHARE_VM_RUNTIME_DTRACEJSDT_HPP
--- a/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/globals.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -905,6 +905,10 @@
"determines which error to provoke. See test_error_handler() " \
"in debug.cpp.") \
\
+ notproduct(uintx, TestCrashInErrorHandler, 0, \
+ "If > 0, provokes an error inside VM error handler (a secondary " \
+ "crash). see test_error_handler() in debug.cpp.") \
+ \
develop(bool, Verbose, false, \
"Print additional debugging information from other modes") \
\
@@ -1501,7 +1505,7 @@
\
product(bool, ExplicitGCInvokesConcurrent, false, \
"A System.gc() request invokes a concurrent collection; " \
- "(effective only when UseConcMarkSweepGC)") \
+ "(effective only when using concurrent collectors)") \
\
product(bool, ExplicitGCInvokesConcurrentAndUnloadsClasses, false, \
"A System.gc() request invokes a concurrent collection and " \
@@ -3531,7 +3535,7 @@
"(both with and without tiered compilation): " \
"values greater than 1.0 delay counter overflow, " \
"values between 0 and 1.0 rush counter overflow, " \
- "value of 1.0 leave compilation thresholds unchanged " \
+ "value of 1.0 leaves compilation thresholds unchanged " \
"value of 0.0 is equivalent to -Xint. " \
"" \
"Flag can be set as per-method option. " \
@@ -3843,9 +3847,6 @@
product(bool, RelaxAccessControlCheck, false, \
"Relax the access control checks in the verifier") \
\
- diagnostic(bool, PrintDTraceDOF, false, \
- "Print the DTrace DOF passed to the system for JSDT probes") \
- \
product(uintx, StringTableSize, defaultStringTableSize, \
"Number of buckets in the interned String table") \
\
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -2610,68 +2610,6 @@
GC_locker::unlock_critical(thread);
JRT_END
-#ifdef HAVE_DTRACE_H
-/**
- * Create a dtrace nmethod for this method. The wrapper converts the
- * Java-compiled calling convention to the native convention, makes a dummy call
- * (actually nops for the size of the call instruction, which become a trap if
- * probe is enabled), and finally returns to the caller. Since this all looks like a
- * leaf, no thread transition is needed.
- */
-nmethod *AdapterHandlerLibrary::create_dtrace_nmethod(methodHandle method) {
- ResourceMark rm;
- nmethod* nm = NULL;
-
- if (PrintCompilation) {
- ttyLocker ttyl;
- tty->print("--- n ");
- method->print_short_name(tty);
- if (method->is_static()) {
- tty->print(" (static)");
- }
- tty->cr();
- }
-
- {
- // perform the work while holding the lock, but perform any printing
- // outside the lock
- MutexLocker mu(AdapterHandlerLibrary_lock);
- // See if somebody beat us to it
- nm = method->code();
- if (nm) {
- return nm;
- }
-
- ResourceMark rm;
-
- BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache
- if (buf != NULL) {
- CodeBuffer buffer(buf);
- // Need a few relocation entries
- double locs_buf[20];
- buffer.insts()->initialize_shared_locs(
- (relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
- MacroAssembler _masm(&buffer);
-
- // Generate the compiled-to-native wrapper code
- nm = SharedRuntime::generate_dtrace_nmethod(&_masm, method);
- }
- }
- return nm;
-}
-
-// the dtrace method needs to convert java lang string to utf8 string.
-void SharedRuntime::get_utf(oopDesc* src, address dst) {
- typeArrayOop jlsValue = java_lang_String::value(src);
- int jlsOffset = java_lang_String::offset(src);
- int jlsLen = java_lang_String::length(src);
- jchar* jlsPos = (jlsLen == 0) ? NULL :
- jlsValue->char_at_addr(jlsOffset);
- assert(TypeArrayKlass::cast(jlsValue->klass())->element_type() == T_CHAR, "compressed string");
- (void) UNICODE::as_utf8(jlsPos, jlsLen, (char *)dst, max_dtrace_string_size);
-}
-#endif // ndef HAVE_DTRACE_H
-
int SharedRuntime::convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt) {
int argcnt = in_args_count;
if (CCallingConventionRequiresIntsAsLongs) {
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -466,19 +466,6 @@
// Block before entering a JNI critical method
static void block_for_jni_critical(JavaThread* thread);
-#ifdef HAVE_DTRACE_H
- // Generate a dtrace wrapper for a given method. The method takes arguments
- // in the Java compiled code convention, marshals them to the native
- // convention (handlizes oops, etc), transitions to native, makes the call,
- // returns to java state (possibly blocking), unhandlizes any result and
- // returns.
- static nmethod *generate_dtrace_nmethod(MacroAssembler* masm,
- methodHandle method);
-
- // dtrace support to convert a Java string to utf8
- static void get_utf(oopDesc* src, address dst);
-#endif // def HAVE_DTRACE_H
-
// A compiled caller has just called the interpreter, but compiled code
// exists. Patch the caller so he no longer calls into the interpreter.
static void fixup_callers_callsite(Method* moop, address ret_pc);
@@ -680,10 +667,6 @@
static void create_native_wrapper(methodHandle method);
static AdapterHandlerEntry* get_adapter(methodHandle method);
-#ifdef HAVE_DTRACE_H
- static nmethod* create_dtrace_nmethod (methodHandle method);
-#endif // HAVE_DTRACE_H
-
static void print_handler(CodeBlob* b) { print_handler_on(tty, b); }
static void print_handler_on(outputStream* st, CodeBlob* b);
static bool contains(CodeBlob* b);
--- a/hotspot/src/share/vm/runtime/virtualspace.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/virtualspace.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -503,11 +503,12 @@
// But leave room for the compressed class pointers, which is allocated above
// the heap.
char *zerobased_max = (char *)OopEncodingHeapMax;
+ const size_t class_space = align_size_up(CompressedClassSpaceSize, alignment);
// For small heaps, save some space for compressed class pointer
// space so it can be decoded with no base.
if (UseCompressedClassPointers && !UseSharedSpaces &&
- OopEncodingHeapMax <= KlassEncodingMetaspaceMax) {
- const size_t class_space = align_size_up(CompressedClassSpaceSize, alignment);
+ OopEncodingHeapMax <= KlassEncodingMetaspaceMax &&
+ (uint64_t)(aligned_heap_base_min_address + size + class_space) <= KlassEncodingMetaspaceMax) {
zerobased_max = (char *)OopEncodingHeapMax - class_space;
}
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1920,8 +1920,6 @@
declare_c2_type(CompareAndSwapINode, LoadStoreNode) \
declare_c2_type(CompareAndSwapPNode, LoadStoreNode) \
declare_c2_type(CompareAndSwapNNode, LoadStoreNode) \
- declare_c2_type(PrefetchReadNode, Node) \
- declare_c2_type(PrefetchWriteNode, Node) \
declare_c2_type(MulNode, Node) \
declare_c2_type(MulINode, MulNode) \
declare_c2_type(MulLNode, MulNode) \
--- a/hotspot/src/share/vm/services/attachListener.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/attachListener.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -35,6 +35,7 @@
#include "runtime/os.hpp"
#include "services/attachListener.hpp"
#include "services/diagnosticCommand.hpp"
+#include "services/writeableFlags.hpp"
#include "services/heapDumper.hpp"
volatile bool AttachListener::_initialized;
@@ -229,133 +230,6 @@
return JNI_OK;
}
-// set a boolean global flag using value from AttachOperation
-static jint set_bool_flag(const char* name, AttachOperation* op, outputStream* out) {
- bool value = true;
- const char* arg1;
- if ((arg1 = op->arg(1)) != NULL) {
- int tmp;
- int n = sscanf(arg1, "%d", &tmp);
- if (n != 1) {
- out->print_cr("flag value must be a boolean (1 or 0)");
- return JNI_ERR;
- }
- value = (tmp != 0);
- }
- bool res = CommandLineFlags::boolAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (! res) {
- out->print_cr("setting flag %s failed", name);
- }
- return res? JNI_OK : JNI_ERR;
-}
-
-// set a intx global flag using value from AttachOperation
-static jint set_intx_flag(const char* name, AttachOperation* op, outputStream* out) {
- intx value;
- const char* arg1;
- if ((arg1 = op->arg(1)) != NULL) {
- int n = sscanf(arg1, INTX_FORMAT, &value);
- if (n != 1) {
- out->print_cr("flag value must be an integer");
- return JNI_ERR;
- }
- }
- bool res = CommandLineFlags::intxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (! res) {
- out->print_cr("setting flag %s failed", name);
- }
-
- return res? JNI_OK : JNI_ERR;
-}
-
-// set a uintx global flag using value from AttachOperation
-static jint set_uintx_flag(const char* name, AttachOperation* op, outputStream* out) {
- uintx value;
- const char* arg1;
- if ((arg1 = op->arg(1)) != NULL) {
- int n = sscanf(arg1, UINTX_FORMAT, &value);
- if (n != 1) {
- out->print_cr("flag value must be an unsigned integer");
- return JNI_ERR;
- }
- }
-
- if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) {
- FormatBuffer<80> err_msg("%s", "");
- if (!Arguments::verify_MaxHeapFreeRatio(err_msg, value)) {
- out->print_cr("%s", err_msg.buffer());
- return JNI_ERR;
- }
- } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) {
- FormatBuffer<80> err_msg("%s", "");
- if (!Arguments::verify_MinHeapFreeRatio(err_msg, value)) {
- out->print_cr("%s", err_msg.buffer());
- return JNI_ERR;
- }
- }
- bool res = CommandLineFlags::uintxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (! res) {
- out->print_cr("setting flag %s failed", name);
- }
-
- return res? JNI_OK : JNI_ERR;
-}
-
-// set a uint64_t global flag using value from AttachOperation
-static jint set_uint64_t_flag(const char* name, AttachOperation* op, outputStream* out) {
- uint64_t value;
- const char* arg1;
- if ((arg1 = op->arg(1)) != NULL) {
- int n = sscanf(arg1, UINT64_FORMAT, &value);
- if (n != 1) {
- out->print_cr("flag value must be an unsigned 64-bit integer");
- return JNI_ERR;
- }
- }
- bool res = CommandLineFlags::uint64_tAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (! res) {
- out->print_cr("setting flag %s failed", name);
- }
-
- return res? JNI_OK : JNI_ERR;
-}
-
-// set a size_t global flag using value from AttachOperation
-static jint set_size_t_flag(const char* name, AttachOperation* op, outputStream* out) {
- size_t value;
- const char* arg1;
- if ((arg1 = op->arg(1)) != NULL) {
- int n = sscanf(arg1, SIZE_FORMAT, &value);
- if (n != 1) {
- out->print_cr("flag value must be an unsigned integer");
- return JNI_ERR;
- }
- }
- bool res = CommandLineFlags::size_tAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (! res) {
- out->print_cr("setting flag %s failed", name);
- }
-
- return res? JNI_OK : JNI_ERR;
-}
-
-// set a string global flag using value from AttachOperation
-static jint set_ccstr_flag(const char* name, AttachOperation* op, outputStream* out) {
- const char* value;
- if ((value = op->arg(1)) == NULL) {
- out->print_cr("flag value must be a string");
- return JNI_ERR;
- }
- bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
- if (res) {
- FREE_C_HEAP_ARRAY(char, value);
- } else {
- out->print_cr("setting flag %s failed", name);
- }
-
- return res? JNI_OK : JNI_ERR;
-}
-
// Implementation of "setflag" command
static jint set_flag(AttachOperation* op, outputStream* out) {
@@ -365,27 +239,21 @@
return JNI_ERR;
}
- Flag* f = Flag::find_flag((char*)name, strlen(name));
- if (f && f->is_external() && f->is_writeable()) {
- if (f->is_bool()) {
- return set_bool_flag(name, op, out);
- } else if (f->is_intx()) {
- return set_intx_flag(name, op, out);
- } else if (f->is_uintx()) {
- return set_uintx_flag(name, op, out);
- } else if (f->is_uint64_t()) {
- return set_uint64_t_flag(name, op, out);
- } else if (f->is_size_t()) {
- return set_size_t_flag(name, op, out);
- } else if (f->is_ccstr()) {
- return set_ccstr_flag(name, op, out);
+ FormatBuffer<80> err_msg("%s", "");
+
+ int ret = WriteableFlags::set_flag(op->arg(0), op->arg(1), Flag::ATTACH_ON_DEMAND, err_msg);
+ if (ret != WriteableFlags::SUCCESS) {
+ if (ret == WriteableFlags::NON_WRITABLE) {
+ // if the flag is not manageable try to change it through
+ // the platform dependent implementation
+ return AttachListener::pd_set_flag(op, out);
} else {
- ShouldNotReachHere();
- return JNI_ERR;
+ out->print_cr("%s", err_msg.buffer());
}
- } else {
- return AttachListener::pd_set_flag(op, out);
+
+ return JNI_ERR;
}
+ return JNI_OK;
}
// Implementation of "printflag" command
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -267,7 +267,7 @@
void SystemGCDCmd::execute(DCmdSource source, TRAPS) {
if (!DisableExplicitGC) {
- Universe::heap()->collect(GCCause::_dcmd_gc_run);
+ Universe::heap()->collect(GCCause::_java_lang_system_gc);
} else {
output()->print_cr("Explicit GC is disabled, no GC has been performed.");
}
--- a/hotspot/src/share/vm/services/mallocSiteTable.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/mallocSiteTable.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -136,7 +136,7 @@
MallocSite* MallocSiteTable::lookup_or_add(const NativeCallStack& key, size_t* bucket_idx,
size_t* pos_idx) {
int index = hash_to_index(key.hash());
- assert(index >= 0, "Negative index");
+ assert(index >= 0, err_msg("Negative index %d", index));
*bucket_idx = (size_t)index;
*pos_idx = 0;
--- a/hotspot/src/share/vm/services/mallocTracker.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/mallocTracker.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -52,7 +52,7 @@
}
// Make adjustment by subtracting chunks used by arenas
-// from total chunks to get total free chunck size
+// from total chunks to get total free chunk size
void MallocMemorySnapshot::make_adjustment() {
size_t arena_size = total_arena();
int chunk_idx = NMTUtil::flag_to_index(mtChunk);
--- a/hotspot/src/share/vm/services/mallocTracker.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/mallocTracker.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -29,6 +29,7 @@
#include "memory/allocation.hpp"
#include "runtime/atomic.hpp"
+#include "runtime/threadCritical.hpp"
#include "services/nmtCommon.hpp"
#include "utilities/nativeCallStack.hpp"
@@ -164,6 +165,10 @@
}
void copy_to(MallocMemorySnapshot* s) {
+ // Need to make sure that mtChunks don't get deallocated while the
+ // copy is going on, because their size is adjusted using this
+ // buffer in make_adjustment().
+ ThreadCritical tc;
s->_tracking_header = _tracking_header;
for (int index = 0; index < mt_number_of_types; index ++) {
s->_malloc[index] = _malloc[index];
--- a/hotspot/src/share/vm/services/management.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/management.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -43,6 +43,7 @@
#include "services/classLoadingService.hpp"
#include "services/diagnosticCommand.hpp"
#include "services/diagnosticFramework.hpp"
+#include "services/writeableFlags.hpp"
#include "services/heapDumper.hpp"
#include "services/jmm.h"
#include "services/lowMemoryDetector.hpp"
@@ -1698,56 +1699,21 @@
"The flag name cannot be null.");
}
char* name = java_lang_String::as_utf8_string(fn);
- Flag* flag = Flag::find_flag(name, strlen(name));
- if (flag == NULL) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- "Flag does not exist.");
- }
- if (!flag->is_writeable()) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- "This flag is not writeable.");
- }
- bool succeed = false;
- if (flag->is_bool()) {
- bool bvalue = (new_value.z == JNI_TRUE ? true : false);
- succeed = CommandLineFlags::boolAtPut(name, &bvalue, Flag::MANAGEMENT);
- } else if (flag->is_intx()) {
- intx ivalue = (intx)new_value.j;
- succeed = CommandLineFlags::intxAtPut(name, &ivalue, Flag::MANAGEMENT);
- } else if (flag->is_uintx()) {
- uintx uvalue = (uintx)new_value.j;
+ FormatBuffer<80> err_msg("%s", "");
+ int succeed = WriteableFlags::set_flag(name, new_value, Flag::MANAGEMENT, err_msg);
- if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) {
- FormatBuffer<80> err_msg("%s", "");
- if (!Arguments::verify_MaxHeapFreeRatio(err_msg, uvalue)) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer());
- }
- } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) {
- FormatBuffer<80> err_msg("%s", "");
- if (!Arguments::verify_MinHeapFreeRatio(err_msg, uvalue)) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer());
- }
- }
- succeed = CommandLineFlags::uintxAtPut(name, &uvalue, Flag::MANAGEMENT);
- } else if (flag->is_uint64_t()) {
- uint64_t uvalue = (uint64_t)new_value.j;
- succeed = CommandLineFlags::uint64_tAtPut(name, &uvalue, Flag::MANAGEMENT);
- } else if (flag->is_size_t()) {
- size_t svalue = (size_t)new_value.j;
- succeed = CommandLineFlags::size_tAtPut(name, &svalue, Flag::MANAGEMENT);
- } else if (flag->is_ccstr()) {
- oop str = JNIHandles::resolve_external_guard(new_value.l);
- if (str == NULL) {
+ if (succeed != WriteableFlags::SUCCESS) {
+ if (succeed == WriteableFlags::MISSING_VALUE) {
+ // missing value causes NPE to be thrown
THROW(vmSymbols::java_lang_NullPointerException());
- }
- ccstr svalue = java_lang_String::as_utf8_string(str);
- succeed = CommandLineFlags::ccstrAtPut(name, &svalue, Flag::MANAGEMENT);
- if (succeed) {
- FREE_C_HEAP_ARRAY(char, svalue);
+ } else {
+ // all the other errors are reported as IAE with the appropriate error message
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
+ err_msg.buffer());
}
}
- assert(succeed, "Setting flag should succeed");
+ assert(succeed == WriteableFlags::SUCCESS, "Setting flag should succeed");
JVM_END
class ThreadTimesClosure: public ThreadClosure {
--- a/hotspot/src/share/vm/services/nmtDCmd.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/services/nmtDCmd.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -137,8 +137,8 @@
}
} else if (_detail_diff.value()) {
if (!check_detail_tracking_level(output())) {
- return;
- }
+ return;
+ }
MemBaseline& baseline = MemTracker::get_baseline();
if (baseline.baseline_type() == MemBaseline::Detail_baselined) {
report_diff(false, scale_unit);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/services/writeableFlags.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "classfile/javaClasses.hpp"
+#include "runtime/arguments.hpp"
+#include "runtime/java.hpp"
+#include "runtime/jniHandles.hpp"
+#include "services/writeableFlags.hpp"
+
+// set a boolean global flag
+int WriteableFlags::set_bool_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ int value = true;
+
+ if (sscanf(arg, "%d", &value)) {
+ return set_bool_flag(name, value != 0, origin, err_msg);
+ }
+ err_msg.print("flag value must be a boolean (1 or 0)");
+ return WRONG_FORMAT;
+}
+
+int WriteableFlags::set_bool_flag(const char* name, bool value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return CommandLineFlags::boolAtPut((char*)name, &value, origin) ? SUCCESS : ERR_OTHER;
+}
+
+// set a intx global flag
+int WriteableFlags::set_intx_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ intx value;
+
+ if (sscanf(arg, INTX_FORMAT, &value)) {
+ return set_intx_flag(name, value, origin, err_msg);
+ }
+ err_msg.print("flag value must be an integer");
+ return WRONG_FORMAT;
+}
+
+int WriteableFlags::set_intx_flag(const char* name, intx value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return CommandLineFlags::intxAtPut((char*)name, &value, origin) ? SUCCESS : ERR_OTHER;
+}
+
+// set a uintx global flag
+int WriteableFlags::set_uintx_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ uintx value;
+
+ if (sscanf(arg, UINTX_FORMAT, &value)) {
+ return set_uintx_flag(name, value, origin, err_msg);
+ }
+ err_msg.print("flag value must be an unsigned integer");
+ return WRONG_FORMAT;
+}
+
+int WriteableFlags::set_uintx_flag(const char* name, uintx value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) {
+ if (!Arguments::verify_MaxHeapFreeRatio(err_msg, value)) {
+ return OUT_OF_BOUNDS;
+ }
+ } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) {
+ if (!Arguments::verify_MinHeapFreeRatio(err_msg, value)) {
+ return OUT_OF_BOUNDS;
+ }
+ }
+ return CommandLineFlags::uintxAtPut((char*)name, &value, origin) ? SUCCESS : ERR_OTHER;
+}
+
+// set a uint64_t global flag
+int WriteableFlags::set_uint64_t_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ uint64_t value;
+
+ if (sscanf(arg, UINT64_FORMAT, &value)) {
+ return set_uint64_t_flag(name, value, origin, err_msg);
+ }
+ err_msg.print("flag value must be an unsigned 64-bit integer");
+ return WRONG_FORMAT;
+}
+
+int WriteableFlags::set_uint64_t_flag(const char* name, uint64_t value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return CommandLineFlags::uint64_tAtPut((char*)name, &value, origin) ? SUCCESS : ERR_OTHER;
+}
+
+// set a size_t global flag
+int WriteableFlags::set_size_t_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ size_t value;
+
+ if (sscanf(arg, SIZE_FORMAT, &value)) {
+ return set_size_t_flag(name, value, origin, err_msg);
+ }
+ err_msg.print("flag value must be an unsigned integer");
+ return WRONG_FORMAT;
+}
+
+int WriteableFlags::set_size_t_flag(const char* name, size_t value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return CommandLineFlags::size_tAtPut((char*)name, &value, origin) ? SUCCESS : ERR_OTHER;
+}
+
+// set a string global flag using value from AttachOperation
+int WriteableFlags::set_ccstr_flag(const char* name, const char* arg, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ bool res = CommandLineFlags::ccstrAtPut((char*)name, &arg, origin);
+
+ return res? SUCCESS : ERR_OTHER;
+}
+
+/* sets a writeable flag to the provided value
+ *
+ * - return status is one of the WriteableFlags::err enum values
+ * - an eventual error message will be generated to the provided err_msg buffer
+ */
+int WriteableFlags::set_flag(const char* flag_name, const char* flag_value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return set_flag(flag_name, &flag_value, set_flag_from_char, origin, err_msg);
+}
+
+/* sets a writeable flag to the provided value
+ *
+ * - return status is one of the WriteableFlags::err enum values
+ * - an eventual error message will be generated to the provided err_msg buffer
+ */
+int WriteableFlags::set_flag(const char* flag_name, jvalue flag_value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ return set_flag(flag_name, &flag_value, set_flag_from_jvalue, origin, err_msg);
+}
+
+// a writeable flag setter accepting either 'jvalue' or 'char *' values
+int WriteableFlags::set_flag(const char* name, const void* value, int(*setter)(Flag*,const void*,Flag::Flags,FormatBuffer<80>&), Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ if (name == NULL) {
+ err_msg.print("flag name is missing");
+ return MISSING_NAME;
+ }
+ if (value == NULL) {
+ err_msg.print("flag value is missing");
+ return MISSING_VALUE;
+ }
+
+ Flag* f = Flag::find_flag((char*)name, strlen(name));
+ if (f) {
+ // only writeable flags are allowed to be set
+ if (f->is_writeable()) {
+ return setter(f, value, origin, err_msg);
+ } else {
+ err_msg.print("only 'writeable' flags can be set");
+ return NON_WRITABLE;
+ }
+ }
+
+ err_msg.print("flag %s does not exist", name);
+ return INVALID_FLAG;
+}
+
+// a writeable flag setter accepting 'char *' values
+int WriteableFlags::set_flag_from_char(Flag* f, const void* value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ char* flag_value = *(char**)value;
+ if (flag_value == NULL) {
+ err_msg.print("flag value is missing");
+ return MISSING_VALUE;
+ }
+ if (f->is_bool()) {
+ return set_bool_flag(f->_name, flag_value, origin, err_msg);
+ } else if (f->is_intx()) {
+ return set_intx_flag(f->_name, flag_value, origin, err_msg);
+ } else if (f->is_uintx()) {
+ return set_uintx_flag(f->_name, flag_value, origin, err_msg);
+ } else if (f->is_uint64_t()) {
+ return set_uint64_t_flag(f->_name, flag_value, origin, err_msg);
+ } else if (f->is_size_t()) {
+ return set_size_t_flag(f->_name, flag_value, origin, err_msg);
+ } else if (f->is_ccstr()) {
+ return set_ccstr_flag(f->_name, flag_value, origin, err_msg);
+ } else {
+ ShouldNotReachHere();
+ }
+ return ERR_OTHER;
+}
+
+// a writeable flag setter accepting 'jvalue' values
+int WriteableFlags::set_flag_from_jvalue(Flag* f, const void* value, Flag::Flags origin, FormatBuffer<80>& err_msg) {
+ jvalue new_value = *(jvalue*)value;
+ if (f->is_bool()) {
+ bool bvalue = (new_value.z == JNI_TRUE ? true : false);
+ return set_bool_flag(f->_name, bvalue, origin, err_msg);
+ } else if (f->is_intx()) {
+ intx ivalue = (intx)new_value.j;
+ return set_intx_flag(f->_name, ivalue, origin, err_msg);
+ } else if (f->is_uintx()) {
+ uintx uvalue = (uintx)new_value.j;
+ return set_uintx_flag(f->_name, uvalue, origin, err_msg);
+ } else if (f->is_uint64_t()) {
+ uint64_t uvalue = (uint64_t)new_value.j;
+ return set_uint64_t_flag(f->_name, uvalue, origin, err_msg);
+ } else if (f->is_size_t()) {
+ size_t svalue = (size_t)new_value.j;
+ return set_size_t_flag(f->_name, svalue, origin, err_msg);
+ } else if (f->is_ccstr()) {
+ oop str = JNIHandles::resolve_external_guard(new_value.l);
+ if (str == NULL) {
+ err_msg.print("flag value is missing");
+ return MISSING_VALUE;
+ }
+ ccstr svalue = java_lang_String::as_utf8_string(str);
+ int ret = WriteableFlags::set_ccstr_flag(f->_name, svalue, origin, err_msg);
+ if (ret != SUCCESS) {
+ FREE_C_HEAP_ARRAY(char, svalue);
+ }
+ return ret;
+ } else {
+ ShouldNotReachHere();
+ }
+ return ERR_OTHER;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/services/writeableFlags.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 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.
+ *
+ */
+
+#ifndef SHARE_VM_SERVICES_WRITEABLEFLAG_HPP
+#define SHARE_VM_SERVICES_WRITEABLEFLAG_HPP
+
+class WriteableFlags : AllStatic {
+public:
+ enum error {
+ // no error
+ SUCCESS,
+ // flag name is missing
+ MISSING_NAME,
+ // flag value is missing
+ MISSING_VALUE,
+ // error parsing the textual form of the value
+ WRONG_FORMAT,
+ // flag is not writeable
+ NON_WRITABLE,
+ // flag value is outside of its bounds
+ OUT_OF_BOUNDS,
+ // there is no flag with the given name
+ INVALID_FLAG,
+ // other, unspecified error related to setting the flag
+ ERR_OTHER
+ } err;
+
+private:
+ // a writeable flag setter accepting either 'jvalue' or 'char *' values
+ static int set_flag(const char* name, const void* value, int(*setter)(Flag*, const void*, Flag::Flags, FormatBuffer<80>&), Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // a writeable flag setter accepting 'char *' values
+ static int set_flag_from_char(Flag* f, const void* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // a writeable flag setter accepting 'jvalue' values
+ static int set_flag_from_jvalue(Flag* f, const void* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+
+ // set a boolean global flag
+ static int set_bool_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a intx global flag
+ static int set_intx_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a uintx global flag
+ static int set_uintx_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a uint64_t global flag
+ static int set_uint64_t_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a size_t global flag using value from AttachOperation
+ static int set_size_t_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a boolean global flag
+ static int set_bool_flag(const char* name, bool value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a intx global flag
+ static int set_intx_flag(const char* name, intx value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a uintx global flag
+ static int set_uintx_flag(const char* name, uintx value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a uint64_t global flag
+ static int set_uint64_t_flag(const char* name, uint64_t value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a size_t global flag using value from AttachOperation
+ static int set_size_t_flag(const char* name, size_t value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+ // set a string global flag
+ static int set_ccstr_flag(const char* name, const char* value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+
+public:
+ /* sets a writeable flag to the provided value
+ *
+ * - return status is one of the WriteableFlags::err enum values
+ * - an eventual error message will be generated to the provided err_msg buffer
+ */
+ static int set_flag(const char* flag_name, const char* flag_value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+
+ /* sets a writeable flag to the provided value
+ *
+ * - return status is one of the WriteableFlags::err enum values
+ * - an eventual error message will be generated to the provided err_msg buffer
+ */
+ static int set_flag(const char* flag_name, jvalue flag_value, Flag::Flags origin, FormatBuffer<80>& err_msg);
+};
+
+#endif /* SHARE_VM_SERVICES_WRITEABLEFLAG_HPP */
+
--- a/hotspot/src/share/vm/utilities/debug.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/utilities/debug.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -316,13 +316,47 @@
#ifndef PRODUCT
#include <signal.h>
+typedef void (*voidfun_t)();
+// Crash with an authentic sigfpe
+static void crash_with_sigfpe() {
+ // generate a native synchronous SIGFPE where possible;
+ // if that did not cause a signal (e.g. on ppc), just
+ // raise the signal.
+ volatile int x = 0;
+ volatile int y = 1/x;
+#ifndef _WIN32
+ raise(SIGFPE);
+#endif
+} // end: crash_with_sigfpe
+
+// crash with sigsegv at non-null address.
+static void crash_with_segfault() {
+
+ char* const crash_addr = (char*) get_segfault_address();
+ *crash_addr = 'X';
+
+} // end: crash_with_segfault
+
+// returns an address which is guaranteed to generate a SIGSEGV on read,
+// for test purposes, which is not NULL and contains bits in every word
+void* get_segfault_address() {
+ return (void*)
+#ifdef _LP64
+ 0xABC0000000000ABCULL;
+#else
+ 0x00000ABC;
+#endif
+}
+
void test_error_handler() {
- uintx test_num = ErrorHandlerTest;
- if (test_num == 0) return;
+ controlled_crash(ErrorHandlerTest);
+}
+
+void controlled_crash(int how) {
+ if (how == 0) return;
// If asserts are disabled, use the corresponding guarantee instead.
- size_t n = test_num;
- NOT_DEBUG(if (n <= 2) n += 2);
+ NOT_DEBUG(if (how <= 2) how += 2);
const char* const str = "hello";
const size_t num = (size_t)os::vm_page_size();
@@ -333,7 +367,7 @@
const void (*funcPtr)(void) = (const void(*)()) 0xF; // bad function pointer
// Keep this in sync with test/runtime/6888954/vmerrors.sh.
- switch (n) {
+ switch (how) {
case 1: vmassert(str == NULL, "expected null");
case 2: vmassert(num == 1023 && *str == 'X',
err_msg("num=" SIZE_FORMAT " str=\"%s\"", num, str));
@@ -358,8 +392,10 @@
// There's no guarantee the bad function pointer will crash us
// so "break" out to the ShouldNotReachHere().
case 13: (*funcPtr)(); break;
+ case 14: crash_with_segfault(); break;
+ case 15: crash_with_sigfpe(); break;
- default: tty->print_cr("ERROR: %d: unexpected test_num value.", n);
+ default: tty->print_cr("ERROR: %d: unexpected test_num value.", how);
}
ShouldNotReachHere();
}
--- a/hotspot/src/share/vm/utilities/debug.hpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/utilities/debug.hpp Mon Feb 16 08:47:39 2015 -0800
@@ -248,6 +248,24 @@
/* Test vmassert(), fatal(), guarantee(), etc. */
NOT_PRODUCT(void test_error_handler();)
+// crash in a controlled way:
+// how can be one of:
+// 1,2 - asserts
+// 3,4 - guarantee
+// 5-7 - fatal
+// 8 - vm_exit_out_of_memory
+// 9 - ShouldNotCallThis
+// 10 - ShouldNotReachHere
+// 11 - Unimplemented
+// 12,13 - (not guaranteed) crashes
+// 14 - SIGSEGV
+// 15 - SIGFPE
+NOT_PRODUCT(void controlled_crash(int how);)
+
+// returns an address which is guaranteed to generate a SIGSEGV on read,
+// for test purposes, which is not NULL and contains bits in every word
+NOT_PRODUCT(void* get_segfault_address();)
+
void pd_ps(frame f);
void pd_obfuscate_location(char *buf, size_t buflen);
--- a/hotspot/src/share/vm/utilities/vmError.cpp Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Mon Feb 16 08:47:39 2015 -0800
@@ -353,6 +353,26 @@
"Runtime Environment to continue.");
}
+#ifndef PRODUCT
+ // Error handler self tests
+
+ // test secondary error handling. Test it twice, to test that resetting
+ // error handler after a secondary crash works.
+ STEP(13, "(test secondary crash 1)")
+ if (_verbose && TestCrashInErrorHandler != 0) {
+ st->print_cr("Will crash now (TestCrashInErrorHandler=%d)...",
+ TestCrashInErrorHandler);
+ controlled_crash(TestCrashInErrorHandler);
+ }
+
+ STEP(14, "(test secondary crash 2)")
+ if (_verbose && TestCrashInErrorHandler != 0) {
+ st->print_cr("Will crash now (TestCrashInErrorHandler=%d)...",
+ TestCrashInErrorHandler);
+ controlled_crash(TestCrashInErrorHandler);
+ }
+#endif // PRODUCT
+
STEP(15, "(printing type of error)")
switch(_id) {
@@ -786,6 +806,15 @@
st->cr();
}
+#ifndef PRODUCT
+ // print a defined marker to show that error handling finished correctly.
+ STEP(290, "(printing end marker)" )
+
+ if (_verbose) {
+ st->print_cr("END.");
+ }
+#endif
+
END
# undef BEGIN
--- a/hotspot/test/TEST.ROOT Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/TEST.ROOT Mon Feb 16 08:47:39 2015 -0800
@@ -31,3 +31,6 @@
groups=TEST.groups [closed/TEST.groups]
requires.properties=sun.arch.data.model
+
+# Tests using jtreg 4.1 b10 features
+requiredVersion=4.1 b10
--- a/hotspot/test/TEST.groups Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/TEST.groups Mon Feb 16 08:47:39 2015 -0800
@@ -235,7 +235,8 @@
gc/metaspace/G1AddMetaspaceDependency.java \
gc/metaspace/TestMetaspacePerfCounters.java \
gc/startup_warnings/TestG1.java \
- gc/whitebox/TestConcMarkCycleWB.java
+ gc/whitebox/TestConcMarkCycleWB.java \
+ gc/arguments/TestG1ConcRefinementThreads.java
# All tests that explicitly set the serial GC
#
--- a/hotspot/test/compiler/arguments/CheckCompileThresholdScaling.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/arguments/CheckCompileThresholdScaling.java Mon Feb 16 08:47:39 2015 -0800
@@ -26,7 +26,7 @@
/*
* @test CheckCompileThresholdScaling
* @bug 8059604
- * @summary "Add CompileThresholdScalingPercentage flag to control when methods are first compiled (with +/-TieredCompilation)"
+ * @summary "Add CompileThresholdScaling flag to control when methods are first compiled (with +/-TieredCompilation)"
* @library /testlibrary
* @run main CheckCompileThresholdScaling
*/
--- a/hotspot/test/compiler/arraycopy/TestArrayCopyNoInit.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/arraycopy/TestArrayCopyNoInit.java Mon Feb 16 08:47:39 2015 -0800
@@ -29,8 +29,6 @@
*
*/
-import java.lang.invoke.*;
-
public class TestArrayCopyNoInit {
static int[] m1(int[] src) {
@@ -134,7 +132,7 @@
return dest;
}
- static public void main(String[] args) throws Throwable {
+ static public void main(String[] args) {
boolean success = true;
int[] src = new int[10];
TestArrayCopyNoInit[] src2 = new TestArrayCopyNoInit[10];
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/arraycopy/TestArrayCopyNoInitDeopt.java Mon Feb 16 08:47:39 2015 -0800
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 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.
+ */
+
+/*
+ * @test
+ * @bug 8072016
+ * @summary Infinite deoptimization/recompilation cycles in case of arraycopy with tightly coupled allocation
+ * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @build TestArrayCopyNoInitDeopt
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller com.oracle.java.testlibrary.Platform
+ * @run main/othervm -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TypeProfileLevel=020
+ * TestArrayCopyNoInitDeopt
+ *
+ */
+
+
+import sun.hotspot.WhiteBox;
+import sun.hotspot.code.NMethod;
+import com.oracle.java.testlibrary.Platform;
+import java.lang.reflect.*;
+
+public class TestArrayCopyNoInitDeopt {
+
+ public static int[] m1(Object src) {
+ if (src == null) return null;
+ int[] dest = new int[10];
+ try {
+ System.arraycopy(src, 0, dest, 0, 10);
+ } catch (ArrayStoreException npe) {
+ }
+ return dest;
+ }
+
+ static Object m2_src(Object src) {
+ return src;
+ }
+
+ public static int[] m2(Object src) {
+ if (src == null) return null;
+ src = m2_src(src);
+ int[] dest = new int[10];
+ try {
+ System.arraycopy(src, 0, dest, 0, 10);
+ } catch (ArrayStoreException npe) {
+ }
+ return dest;
+ }
+
+ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+
+ static boolean deoptimize(Method method, Object src_obj) throws Exception {
+ for (int i = 0; i < 10; i++) {
+ method.invoke(null, src_obj);
+ if (!WHITE_BOX.isMethodCompiled(method)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static public void main(String[] args) throws Exception {
+ if (Platform.isServer()) {
+ int[] src = new int[10];
+ Object src_obj = new Object();
+ Method method_m1 = TestArrayCopyNoInitDeopt.class.getMethod("m1", Object.class);
+ Method method_m2 = TestArrayCopyNoInitDeopt.class.getMethod("m2", Object.class);
+
+ // Warm up
+ for (int i = 0; i < 20000; i++) {
+ m1(src);
+ }
+
+ // And make sure m1 is compiled by C2
+ WHITE_BOX.enqueueMethodForCompilation(method_m1, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION);
+
+ if (!WHITE_BOX.isMethodCompiled(method_m1)) {
+ throw new RuntimeException("m1 not compiled");
+ }
+
+ // should deoptimize for type check
+ if (!deoptimize(method_m1, src_obj)) {
+ throw new RuntimeException("m1 not deoptimized");
+ }
+
+ WHITE_BOX.enqueueMethodForCompilation(method_m1, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION);
+
+ if (!WHITE_BOX.isMethodCompiled(method_m1)) {
+ throw new RuntimeException("m1 not recompiled");
+ }
+
+ if (deoptimize(method_m1, src_obj)) {
+ throw new RuntimeException("m1 deoptimized again");
+ }
+
+ // Same test as above but with speculative types
+
+ // Warm up & make sure we collect type profiling
+ for (int i = 0; i < 20000; i++) {
+ m2(src);
+ }
+
+ // And make sure m2 is compiled by C2
+ WHITE_BOX.enqueueMethodForCompilation(method_m2, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION);
+
+ if (!WHITE_BOX.isMethodCompiled(method_m2)) {
+ throw new RuntimeException("m2 not compiled");
+ }
+
+ // should deoptimize for speculative type check
+ if (!deoptimize(method_m2, src_obj)) {
+ throw new RuntimeException("m2 not deoptimized");
+ }
+
+ WHITE_BOX.enqueueMethodForCompilation(method_m2, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION);
+
+ if (!WHITE_BOX.isMethodCompiled(method_m2)) {
+ throw new RuntimeException("m2 not recompiled");
+ }
+
+ // should deoptimize for actual type check
+ if (!deoptimize(method_m2, src_obj)) {
+ throw new RuntimeException("m2 not deoptimized");
+ }
+
+ WHITE_BOX.enqueueMethodForCompilation(method_m2, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION);
+
+ if (!WHITE_BOX.isMethodCompiled(method_m2)) {
+ throw new RuntimeException("m2 not recompiled");
+ }
+
+ if (deoptimize(method_m2, src_obj)) {
+ throw new RuntimeException("m2 deoptimized again");
+ }
+ }
+ }
+}
--- a/hotspot/test/compiler/c2/6857159/Test6857159.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/c2/6857159/Test6857159.java Mon Feb 16 08:47:39 2015 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -26,15 +26,24 @@
* @test
* @bug 6857159
* @summary local schedule failed with checkcast of Thread.currentThread()
- *
- * @run shell Test6857159.sh
+ * @library /testlibrary
*/
-public class Test6857159 extends Thread {
- static class ct0 extends Test6857159 {
- public void message() {
- // System.out.println("message");
- }
+import com.oracle.java.testlibrary.*;
+
+public class Test6857159 {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbatch", "-XX:+PrintCompilation",
+ "-XX:CompileOnly=Test$ct.run", "Test");
+ OutputAnalyzer analyzer = new OutputAnalyzer(pb.start());
+ analyzer.shouldNotContain("COMPILE SKIPPED");
+ analyzer.shouldContain("Test$ct0::run (16 bytes)");
+ }
+}
+
+class Test extends Thread {
+ static class ct0 extends Test {
+ public void message() { }
public void run() {
message();
@@ -43,14 +52,10 @@
}
}
static class ct1 extends ct0 {
- public void message() {
- // System.out.println("message");
- }
+ public void message() { }
}
static class ct2 extends ct0 {
- public void message() {
- // System.out.println("message");
- }
+ public void message() { }
}
public static void main(String[] args) throws Exception {
--- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -36,7 +36,7 @@
* @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
* -XX:-MethodFlushing -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
* -XX:+SegmentedCodeCache -XX:CompileCommand=compileonly,null::*
- * InitialAndMaxUsageTest
+ * -XX:-UseLargePages InitialAndMaxUsageTest
* @summary testing of initial and max usage
*/
public class InitialAndMaxUsageTest {
--- a/hotspot/test/compiler/codecache/stress/OverloadCompileQueueTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/codecache/stress/OverloadCompileQueueTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -30,6 +30,7 @@
/*
* @test OverloadCompileQueueTest
* @library /testlibrary /../../test/lib
+ * @ignore 8071905
* @build OverloadCompileQueueTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
--- a/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -31,11 +31,11 @@
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -Xmixed
* -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method
- * -XX:-DeoptimizeRandom DeoptimizeFramesTest true
+ * -XX:-DeoptimizeRandom -XX:-DeoptimizeALot DeoptimizeFramesTest true
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -Xmixed
* -XX:CompileCommand=compileonly,DeoptimizeFramesTest$TestCaseImpl::method
- * -XX:-DeoptimizeRandom DeoptimizeFramesTest false
+ * -XX:-DeoptimizeRandom -XX:-DeoptimizeALot DeoptimizeFramesTest false
* @summary testing of WB::deoptimizeFrames()
*/
import java.lang.reflect.Executable;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/ErrorHandling/SecondaryErrorTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -0,0 +1,105 @@
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.regex.Pattern;
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.Platform;
+import com.oracle.java.testlibrary.ProcessTools;
+
+/*
+ * @test
+ * @bug 8065896
+ * @summary Synchronous signals during error reporting may terminate or hang VM process
+ * @library /testlibrary
+ * @author Thomas Stuefe (SAP)
+ */
+
+public class SecondaryErrorTest {
+
+
+ public static void main(String[] args) throws Exception {
+
+ // Do not execute for windows, nor for non-debug builds
+ if (Platform.isWindows()) {
+ return;
+ }
+
+ if (!Platform.isDebugBuild()) {
+ return;
+ }
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-Xmx100M",
+ "-XX:ErrorHandlerTest=15",
+ "-XX:TestCrashInErrorHandler=14",
+ "-version");
+
+ OutputAnalyzer output_detail = new OutputAnalyzer(pb.start());
+
+ // we should have crashed with a SIGFPE
+ output_detail.shouldMatch("# A fatal error has been detected by the Java Runtime Environment:.*");
+ output_detail.shouldMatch("# +SIGFPE.*");
+
+ // extract hs-err file
+ String hs_err_file = output_detail.firstMatch("# *(\\S*hs_err_pid\\d+\\.log)", 1);
+ if (hs_err_file == null) {
+ throw new RuntimeException("Did not find hs-err file in output.\n");
+ }
+
+ // scan hs-err file: File should contain the "[error occurred during error reporting..]"
+ // markers which show that the secondary error handling kicked in and handled the
+ // error successfully. As an added test, we check that the last line contains "END.",
+ // which is an end marker written in the last step and proves that hs-err file was
+ // completely written.
+ File f = new File(hs_err_file);
+ if (!f.exists()) {
+ throw new RuntimeException("hs-err file missing at "
+ + f.getAbsolutePath() + ".\n");
+ }
+
+ System.out.println("Found hs_err file. Scanning...");
+
+ FileInputStream fis = new FileInputStream(f);
+ BufferedReader br = new BufferedReader(new InputStreamReader(fis));
+ String line = null;
+
+ Pattern [] pattern = new Pattern[] {
+ Pattern.compile("Will crash now \\(TestCrashInErrorHandler=14\\)..."),
+ Pattern.compile("\\[error occurred during error reporting \\(test secondary crash 1\\).*\\]"),
+ Pattern.compile("Will crash now \\(TestCrashInErrorHandler=14\\)..."),
+ Pattern.compile("\\[error occurred during error reporting \\(test secondary crash 2\\).*\\]"),
+ };
+ int currentPattern = 0;
+
+ String lastLine = null;
+ while ((line = br.readLine()) != null) {
+ if (currentPattern < pattern.length) {
+ if (pattern[currentPattern].matcher(line).matches()) {
+ System.out.println("Found: " + line + ".");
+ currentPattern ++;
+ }
+ }
+ lastLine = line;
+ }
+ br.close();
+
+ if (currentPattern < pattern.length) {
+ throw new RuntimeException("hs-err file incomplete (first missing pattern: " + currentPattern + ")");
+ }
+
+ if (!lastLine.equals("END.")) {
+ throw new RuntimeException("hs-err file incomplete (missing END marker.)");
+ } else {
+ System.out.println("End marker found.");
+ }
+
+ System.out.println("OK.");
+
+ }
+
+}
+
+
--- a/hotspot/test/runtime/Unsafe/FieldOffset.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/FieldOffset.java Mon Feb 16 08:47:39 2015 -0800
@@ -37,18 +37,31 @@
public class FieldOffset {
public static void main(String args[]) throws Exception {
Unsafe unsafe = Utils.getUnsafe();
- Field fields[] = Test.class.getDeclaredFields();
+ Field[] fields = Test.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
- int offset = unsafe.fieldOffset(fields[i]);
+ long offset = unsafe.objectFieldOffset(fields[i]);
// Ensure we got a valid offset value back
assertNotEquals(offset, unsafe.INVALID_FIELD_OFFSET);
// Make sure the field offset is unique
for (int j = 0; j < i; j++) {
- assertNotEquals(offset, unsafe.fieldOffset(fields[j]));
+ assertNotEquals(offset, unsafe.objectFieldOffset(fields[j]));
}
}
+
+ fields = StaticTest.class.getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ long offset = unsafe.staticFieldOffset(fields[i]);
+ // Ensure we got a valid offset value back
+ assertNotEquals(offset, unsafe.INVALID_FIELD_OFFSET);
+
+ // Make sure the field offset is unique
+ for (int j = 0; j < i; j++) {
+ assertNotEquals(offset, unsafe.staticFieldOffset(fields[j]));
+ }
+ }
+
}
class Test {
@@ -62,4 +75,17 @@
Object objectField;
short shortField;
}
+
+ static class StaticTest {
+ static boolean booleanField;
+ static byte byteField;
+ static char charField;
+ static double doubleField;
+ static float floatField;
+ static int intField;
+ static long longField;
+ static Object objectField;
+ static short shortField;
+ }
+
}
--- a/hotspot/test/runtime/Unsafe/GetPutBoolean.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutBoolean.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("b1");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(false, unsafe.getBoolean(t, offset));
unsafe.putBoolean(t, offset, true);
assertEquals(true, unsafe.getBoolean(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutByte.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutByte.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("b");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals((byte)0, unsafe.getByte(t, offset));
unsafe.putByte(t, offset, (byte)1);
assertEquals((byte)1, unsafe.getByte(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutChar.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutChar.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("c");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals('\u0000', unsafe.getChar(t, offset));
unsafe.putChar(t, offset, '\u0001');
assertEquals('\u0001', unsafe.getChar(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutDouble.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutDouble.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("d");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(-1.0, unsafe.getDouble(t, offset));
unsafe.putDouble(t, offset, 0.0);
assertEquals(0.0, unsafe.getDouble(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutFloat.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutFloat.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("f");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(-1.0f, unsafe.getFloat(t, offset));
unsafe.putFloat(t, offset, 0.0f);
assertEquals(0.0f, unsafe.getFloat(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutInt.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutInt.java Mon Feb 16 08:47:39 2015 -0800
@@ -38,7 +38,7 @@
Test t = new Test();
Field field = Test.class.getField("i");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(-1, unsafe.getInt(t, offset));
unsafe.putInt(t, offset, 0);
assertEquals(0, unsafe.getInt(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutLong.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutLong.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("l");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(-1L, unsafe.getLong(t, offset));
unsafe.putLong(t, offset, 0L);
assertEquals(0L, unsafe.getLong(t, offset));
--- a/hotspot/test/runtime/Unsafe/GetPutObject.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutObject.java Mon Feb 16 08:47:39 2015 -0800
@@ -40,7 +40,7 @@
Object o = new Object();
Field field = Test.class.getField("o");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals(t.o, unsafe.getObject(t, offset));
unsafe.putObject(t, offset, o);
--- a/hotspot/test/runtime/Unsafe/GetPutShort.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/runtime/Unsafe/GetPutShort.java Mon Feb 16 08:47:39 2015 -0800
@@ -39,7 +39,7 @@
Test t = new Test();
Field field = Test.class.getField("s");
- int offset = unsafe.fieldOffset(field);
+ long offset = unsafe.objectFieldOffset(field);
assertEquals((short)-1, unsafe.getShort(t, offset));
unsafe.putShort(t, offset, (short)0);
assertEquals((short)0, unsafe.getShort(t, offset));
--- a/hotspot/test/serviceability/dcmd/framework/HelpTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/serviceability/dcmd/framework/HelpTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -33,6 +33,7 @@
* @test
* @summary Test of diagnostic command help (tests all DCMD executors)
* @library /testlibrary
+ * @ignore 8072440
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData HelpTest
--- a/hotspot/test/serviceability/dcmd/framework/InvalidCommandTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/serviceability/dcmd/framework/InvalidCommandTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -33,6 +33,7 @@
* @test
* @summary Test of invalid diagnostic command (tests all DCMD executors)
* @library /testlibrary
+ * @ignore 8072440
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData InvalidCommandTest
--- a/hotspot/test/serviceability/dcmd/framework/VMVersionTest.java Wed Jul 05 20:19:45 2017 +0200
+++ b/hotspot/test/serviceability/dcmd/framework/VMVersionTest.java Mon Feb 16 08:47:39 2015 -0800
@@ -34,6 +34,7 @@
* @test
* @summary Test of diagnostic command VM.version (tests all DCMD executors)
* @library /testlibrary
+ * @ignore 8072440
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData VMVersionTest