@@ -1021,9 +1021,6 @@
x86_64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
- aarch64:Linux:*:*)
- echo aarch64-unknown-linux-gnu
- exit ;;
xtensa*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for OpenJDK jdk8.
+# Generated by GNU Autoconf 2.69 for OpenJDK jdk8.
#
# Report bugs to <build-dev@openjdk.java.net>.
#
@@ -242,11 +242,18 @@
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
@@ -654,7 +661,6 @@
X_LIBS
X_PRE_LIBS
X_CFLAGS
-XMKMF
CXXFLAGS_DEBUG_SYMBOLS
CFLAGS_DEBUG_SYMBOLS
ZIP_DEBUGINFO_FILES
@@ -1023,7 +1029,6 @@
with_override_hotspot
with_override_nashorn
with_override_jdk
-with_override_nashorn
with_import_hotspot
with_msvcr_dll
with_dxsdk
@@ -1071,7 +1076,6 @@
OBJCFLAGS
CPP
CXXCPP
-XMKMF
FREETYPE2_CFLAGS
FREETYPE2_LIBS
ALSA_CFLAGS
@@ -1778,7 +1782,6 @@
--with-override-hotspot use this hotspot dir for the build
--with-override-nashorn use this nashorn dir for the build
--with-override-jdk use this jdk dir for the build
- --with-override-nashorn use this nashorn dir for the build
--with-import-hotspot import hotspot binaries from this jdk image or
hotspot build dist dir instead of building from
source
@@ -1840,7 +1843,6 @@
OBJCFLAGS Objective C compiler flags
CPP C preprocessor
CXXCPP C++ preprocessor
- XMKMF Path to xmkmf, Makefile generator for X Window System
FREETYPE2_CFLAGS
C compiler flags for FREETYPE2, overriding pkg-config
FREETYPE2_LIBS
@@ -1919,7 +1921,7 @@
if $ac_init_version; then
cat <<\_ACEOF
OpenJDK configure jdk8
-generated by GNU Autoconf 2.67
+generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
@@ -2615,7 +2617,7 @@
running configure, to aid debugging if configure makes a mistake.
It was created by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.67. Invocation command line was
+generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2847,7 +2849,6 @@
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
# We do not want a PATH search for config.site.
case $CONFIG_SITE in #((
@@ -2855,14 +2856,8 @@
*/*) ac_site_file1=$CONFIG_SITE;;
*) ac_site_file1=./$CONFIG_SITE;;
esac
-elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+fi
+for ac_site_file in $ac_site_file1
do
test "x$ac_site_file" = xNONE && continue
if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
@@ -3813,7 +3808,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1379504921
+DATE_WHEN_GENERATED=1381411006
###############################################################################
#
@@ -5202,7 +5197,6 @@
-if test "${ac_cv_path_THEPWDCMD+set}" = set; then :
for ac_prog in rm
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -6677,8 +6671,9 @@
# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
- test "$program_prefix$program_suffix$program_transform_name" = \
- NONENONEs,x,x, &&
+ test "$target_alias" != "$host_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
program_prefix=${target_alias}-
# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target"
@@ -16225,6 +16220,8 @@
withval=$with_override_jdk;
fi
+
+
# Check whether --with-override-nashorn was given.
if test "${with_override_nashorn+set}" = set; then :
withval=$with_override_nashorn;
@@ -29384,6 +29381,9 @@
s390)
ZERO_ARCHFLAG="-m31"
;;
+ aarch64)
+ ZERO_ARCHFLAG=""
+ ;;
*)
ZERO_ARCHFLAG="-m${OPENJDK_TARGET_CPU_BITS}"
esac
@@ -29759,85 +29759,9 @@
else
# One or both of the vars are not set, and there is no cached value.
ac_x_includes=no ac_x_libraries=no
-rm -f -r conftest.dir
-if mkdir conftest.dir; then
- cd conftest.dir
- cat >Imakefile <<'_ACEOF'
-incroot:
- @echo incroot='${INCROOT}'
-usrlibdir:
- @echo usrlibdir='${USRLIBDIR}'
-libdir:
- @echo libdir='${LIBDIR}'
-_ACEOF
- if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
- # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
- for ac_var in incroot usrlibdir libdir; do
- eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
- done
- # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
- for ac_extension in a so sl dylib la dll; do
- if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
- test -f "$ac_im_libdir/libX11.$ac_extension"; then
- ac_im_usrlibdir=$ac_im_libdir; break
- fi
- done
- # Screen out bogus values from the imake configuration. They are
- # bogus both because they are the default anyway, and because
- # using them would break gcc on systems where it needs fixed includes.
- case $ac_im_incroot in
- /usr/include) ac_x_includes= ;;
- *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
- esac
- case $ac_im_usrlibdir in
- /usr/lib | /usr/lib64 | /lib | /lib64) ;;
- *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
- esac
- fi
- cd ..
- rm -f -r conftest.dir
-fi
-
# Standard set of common directories for X headers.
# Check X11 before X11Rn because it is often a symlink to the current release.
-ac_x_header_dirs='
-/usr/X11/include
-/usr/X11R7/include
-/usr/X11R6/include
-/usr/X11R5/include
-/usr/X11R4/include
-
-/usr/include/X11
-/usr/include/X11R7
-/usr/include/X11R6
-/usr/include/X11R5
-/usr/include/X11R4
-
-/usr/local/X11/include
-/usr/local/X11R7/include
-/usr/local/X11R6/include
-/usr/local/X11R5/include
-/usr/local/X11R4/include
-
-/usr/local/include/X11
-/usr/local/include/X11R7
-/usr/local/include/X11R6
-/usr/local/include/X11R5
-/usr/local/include/X11R4
-
-/usr/X386/include
-/usr/x386/include
-/usr/XFree86/include/X11
-
-/usr/include
-/usr/local/include
-/usr/unsupported/include
-/usr/athena/include
-/usr/local/x11r5/include
-/usr/lpp/Xamples/include
-
-/usr/openwin/include
-/usr/openwin/share/include'
+ac_x_header_dirs=''
if test "$ac_x_includes" = no; then
# Guess where to find include files, by looking for Xlib.h.
@@ -33751,7 +33675,7 @@
# values after options handling.
ac_log="
This file was extended by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.67. Invocation command line was
+generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -33814,7 +33738,7 @@
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
OpenJDK config.status jdk8
-configured by $0, generated by GNU Autoconf 2.67,
+configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
Copyright (C) 2012 Free Software Foundation, Inc.
# HG changeset patch
# User Edward Nevill edward.nevill@linaro.org
# Date 1381491589 -3600
# Fri Oct 11 12:39:49 2013 +0100
# Node ID 0b5e450b23211722398beb850e34f144809152e7
# Parent a84cf0dd740c1953eca84ae630b5bf18343076ff
aarch64 specific changes for merge to jdk8-b110
@@ -30,7 +30,7 @@
CFLAGS += -DVM_LITTLE_ENDIAN
ifeq ($(BUILTIN_SIM), true)
-CFLAGS += -DBUILTIN_SIM
+CFLAGS += -DBUILTIN_SIM -DALLOW_OPERATOR_NEW_USAGE
endif
# CFLAGS += -D_LP64=1
@@ -1408,7 +1408,7 @@
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
st->print_cr("# MachUEPNode");
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
st->print_cr("\tldrw rscratch1, j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
if (Universe::narrow_klass_shift() != 0) {
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
@@ -418,6 +418,10 @@
target = Runtime1::entry_for(Runtime1::load_mirror_patching_id);
reloc_type = relocInfo::oop_type;
break;
+ case load_appendix_id:
+ target = Runtime1::entry_for(Runtime1::load_appendix_patching_id);
+ reloc_type = relocInfo::oop_type;
+ break;
default: ShouldNotReachHere();
}
@@ -294,7 +294,7 @@
Register receiver = FrameMap::receiver_opr->as_register();
Register ic_klass = IC_Klass;
const int ic_cmp_size = 4 * 4;
- const bool do_post_padding = VerifyOops || UseCompressedKlassPointers;
+ const bool do_post_padding = VerifyOops || UseCompressedClassPointers;
if (!do_post_padding) {
// insert some nops so that the verified entry point is aligned on CodeEntryAlignment
while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
@@ -337,7 +337,8 @@
void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo *info) {
// Allocate a new index in table to hold the object once it's been patched
int oop_index = __ oop_recorder()->allocate_oop_index(NULL);
- PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_mirror_id, oop_index);
+// PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_mirror_id, oop_index);
+ PatchingStub* patch = new PatchingStub(_masm, patching_id(info), oop_index);
RelocationHolder rspec = oop_Relocation::spec(oop_index);
address const_ptr = int_constant(-1);
@@ -985,7 +986,7 @@
// FIXME: OMG this is a horrible kludge. Any offset from an
// address that matches klass_offset_in_bytes() will be loaded
// as a word, not a long.
- if (UseCompressedKlassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
+ if (UseCompressedClassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
__ ldrw(dest->as_register(), as_Address(from_addr));
} else {
__ ldr(dest->as_register(), as_Address(from_addr));
@@ -1032,7 +1033,7 @@
__ verify_oop(dest->as_register());
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ decode_klass_not_null(dest->as_register());
}
#endif
@@ -1350,7 +1351,7 @@
} else if (obj == klass_RInfo) {
klass_RInfo = dst;
}
- if (k->is_loaded() && !UseCompressedKlassPointers) {
+ if (k->is_loaded() && !UseCompressedClassPointers) {
select_different_registers(obj, dst, k_RInfo, klass_RInfo);
} else {
Rtmp1 = op->tmp3()->as_register();
@@ -1358,14 +1359,6 @@
}
assert_different_registers(obj, k_RInfo, klass_RInfo);
- if (!k->is_loaded()) {
- klass2reg_with_patching(k_RInfo, op->info_for_patch());
- } else {
-#ifdef _LP64
- __ mov_metadata(k_RInfo, k->constant_encoding());
-#endif // _LP64
- }
- assert(obj != k_RInfo, "must be different");
if (op->should_profile()) {
Label not_null;
@@ -1384,6 +1377,13 @@
__ cbz(obj, *obj_is_null);
}
+ if (!k->is_loaded()) {
+ klass2reg_with_patching(k_RInfo, op->info_for_patch());
+ } else {
+#ifdef _LP64
+ __ mov_metadata(k_RInfo, k->constant_encoding());
+#endif // _LP64
+ }
__ verify_oop(obj);
if (op->fast_check()) {
@@ -2295,7 +2295,7 @@
// We don't know the array types are compatible
if (basic_type != T_OBJECT) {
// Simple test for basic type arrays
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ ldrw(tmp, src_klass_addr);
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
@@ -2426,14 +2426,14 @@
Label known_ok, halt;
__ mov_metadata(tmp, default_type->constant_encoding());
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ encode_klass_not_null(tmp);
}
#endif
if (basic_type != T_OBJECT) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
@@ -2441,7 +2441,7 @@
__ cmp(tmp, rscratch1);
}
__ br(Assembler::NE, halt);
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ ldrw(rscratch1, src_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
@@ -2450,7 +2450,7 @@
}
__ br(Assembler::EQ, known_ok);
} else {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ ldrw(rscratch1, dst_klass_addr);
__ cmpw(tmp, rscratch1);
} else {
@@ -2614,6 +2614,9 @@
__ lea(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no));
}
+void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) {
+ fatal("CRC32 intrinsic is not implemented on this platform");
+}
void LIR_Assembler::align_backward_branch_target() {
}
@@ -2828,7 +2831,7 @@
}
__ verify_oop(dest->as_register());
} else if (type == T_ADDRESS && from_addr->disp() == oopDesc::klass_offset_in_bytes()) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ decode_klass_not_null(dest->as_register());
}
}
@@ -957,6 +957,9 @@
__ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(), length.result(), tmp, expected_type, flags, info); // does add_safepoint
}
+void LIRGenerator::do_update_CRC32(Intrinsic* x) {
+ fatal("CRC32 intrinsic is not implemented on this platform");
+}
// _i2l, _i2f, _i2d, _l2i, _l2f, _l2d, _f2i, _f2l, _f2d, _d2i, _d2l, _d2f
// _i2b, _i2c, _i2s
@@ -1157,7 +1160,7 @@
}
LIR_Opr reg = rlock_result(x);
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
- if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
+ if (!x->klass()->is_loaded() || UseCompressedClassPointers) {
tmp3 = new_register(objectType);
}
__ checkcast(reg, obj.result(), x->klass(),
@@ -1178,7 +1181,7 @@
}
obj.load_item();
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
- if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
+ if (!x->klass()->is_loaded() || UseCompressedClassPointers) {
tmp3 = new_register(objectType);
}
__ instanceof(reg, obj.result(), x->klass(),
@@ -188,7 +188,7 @@
}
str(t1, Address(obj, oopDesc::mark_offset_in_bytes()));
- if (UseCompressedKlassPointers) { // Take care not to kill klass
+ if (UseCompressedClassPointers) { // Take care not to kill klass
encode_klass_not_null(t1, klass);
strw(t1, Address(obj, oopDesc::klass_offset_in_bytes()));
} else {
@@ -197,7 +197,7 @@
if (len->is_valid()) {
strw(len, Address(obj, arrayOopDesc::length_offset_in_bytes()));
- } else if (UseCompressedKlassPointers) {
+ } else if (UseCompressedClassPointers) {
store_klass_gap(obj, zr);
}
}
@@ -432,7 +432,7 @@
b(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
bind(dont);
const int ic_cmp_size = 4 * 4;
- assert(UseCompressedKlassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
+ assert(UseCompressedClassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
}
@@ -1113,6 +1113,13 @@
}
break;
+ case load_appendix_patching_id:
+ { StubFrame f(sasm, "load_appendix_patching", dont_gc_arguments);
+ // we should set up register map
+ oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
+ }
+ break;
+
case handle_exception_nofpu_id:
case handle_exception_id:
{ StubFrame f(sasm, "handle_exception", dont_gc_arguments);
@@ -1179,10 +1186,10 @@
Bytecodes::Code code = field_access.code();
// We must load class, initialize class and resolvethe field
- FieldAccessInfo result; // initialize class if needed
+ fieldDescriptor result; // initialize class if needed
constantPoolHandle constants(THREAD, caller->constants());
- LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK_NULL);
- return result.klass()();
+ LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK_NULL);
+ return result.field_holder();
}
@@ -1252,7 +1259,7 @@
KlassHandle init_klass(THREAD, NULL); // klass needed by load_klass_patching code
KlassHandle load_klass(THREAD, NULL); // klass needed by load_klass_patching code
Handle mirror(THREAD, NULL); // oop needed by load_mirror_patching code
- FieldAccessInfo result; // initialize class if needed
+ fieldDescriptor result; // initialize class if needed
bool load_klass_or_mirror_patch_id =
(stub_id == Runtime1::load_klass_patching_id || stub_id == Runtime1::load_mirror_patching_id);
@@ -1260,11 +1267,11 @@
if (stub_id == Runtime1::access_field_patching_id) {
Bytecode_field field_access(caller_method, bci);
- FieldAccessInfo result; // initialize class if needed
+ fieldDescriptor result; // initialize class if needed
Bytecodes::Code code = field_access.code();
constantPoolHandle constants(THREAD, caller_method->constants());
- LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK);
- patch_field_offset = result.field_offset();
+ LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK);
+ patch_field_offset = result.offset();
// If we're patching a field which is volatile then at compile it
// must not have been known to be volatile, so the generated code
@@ -1495,6 +1502,25 @@
return caller_is_deopted();
}
+int Runtime1::move_appendix_patching(JavaThread* thread) {
+//
+// NOTE: we are still in Java
+//
+ Thread* THREAD = thread;
+ debug_only(NoHandleMark nhm;)
+ {
+ // Enter VM mode
+
+ ResetNoHandleMark rnhm;
+ patch_code(thread, load_appendix_patching_id);
+ }
+ // Back in JAVA, use no oops DON'T safepoint
+
+ // Return true if calling code is deoptimized
+
+ return caller_is_deopted();
+}
+
int Runtime1::move_klass_patching(JavaThread* thread) {
//
// NOTE: we are still in Java
@@ -59,8 +59,9 @@
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
define_pd_global(bool, ProfileInterpreter, false);
define_pd_global(intx, CodeCacheExpansionSize, 32*K );
-define_pd_global(uintx,CodeCacheMinBlockLength, 1);
-define_pd_global(uintx,MetaspaceSize, 12*M );
+define_pd_global(uintx, CodeCacheMinBlockLength, 1);
+define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
+define_pd_global(uintx, MetaspaceSize, 12*M );
define_pd_global(bool, NeverActAsServerClassMachine, true );
define_pd_global(uint64_t,MaxRAM, 1ULL*G);
define_pd_global(bool, CICompileOSR, true );
@@ -46,7 +46,7 @@
#else
define_pd_global(bool, ProfileInterpreter, true);
#endif // CC_INTERP
-define_pd_global(bool, TieredCompilation, false);
+define_pd_global(bool, TieredCompilation, trueInTiered);
define_pd_global(intx, CompileThreshold, 10000);
define_pd_global(intx, BackEdgeThreshold, 100000);
@@ -54,6 +54,7 @@
define_pd_global(intx, ConditionalMoveLimit, 3);
define_pd_global(intx, FLOATPRESSURE, 30);
define_pd_global(intx, FreqInlineSize, 325);
+define_pd_global(intx, MinJumpTableSize, 10);
define_pd_global(intx, INTPRESSURE, 23);
define_pd_global(intx, InteriorEntryAlignment, 16);
define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K));
@@ -74,7 +75,8 @@
define_pd_global(bool, OptoBundling, false);
define_pd_global(intx, ReservedCodeCacheSize, 48*M);
-define_pd_global(uintx,CodeCacheMinBlockLength, 4);
+define_pd_global(uintx, CodeCacheMinBlockLength, 4);
+define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
// Heap related flags
define_pd_global(uintx,MetaspaceSize, ScaleForWordSize(16*M));
@@ -46,10 +46,12 @@
void generate_more_monitors();
void generate_deopt_handling();
+#if 0
address generate_interpreter_frame_manager(bool synchronized); // C++ interpreter only
void generate_compute_interpreter_state(const Register state,
const Register prev_state,
const Register sender_sp,
bool native); // C++ interpreter only
+#endif
#endif // CPU_AARCH64_VM_CPPINTERPRETERGENERATOR_AARCH64_HPP
@@ -35,6 +35,7 @@
#include "runtime/handles.inline.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/monitorChunk.hpp"
+#include "runtime/os.hpp"
#include "runtime/signature.hpp"
#include "runtime/stubCodeGenerator.hpp"
#include "runtime/stubRoutines.hpp"
@@ -56,16 +57,22 @@
address sp = (address)_sp;
address fp = (address)_fp;
address unextended_sp = (address)_unextended_sp;
- // sp must be within the stack
- bool sp_safe = (sp <= thread->stack_base()) &&
- (sp >= thread->stack_base() - thread->stack_size());
+
+ // consider stack guards when trying to determine "safe" stack pointers
+ static size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackYellowPages + StackRedPages) * os::vm_page_size() : 0;
+ size_t usable_stack_size = thread->stack_size() - stack_guard_size;
+
+ // sp must be within the usable part of the stack (not in guards)
+ bool sp_safe = (sp < thread->stack_base()) &&
+ (sp >= thread->stack_base() - usable_stack_size);
+
if (!sp_safe) {
return false;
}
// unextended sp must be within the stack and above or equal sp
- bool unextended_sp_safe = (unextended_sp <= thread->stack_base()) &&
+ bool unextended_sp_safe = (unextended_sp < thread->stack_base()) &&
(unextended_sp >= sp);
if (!unextended_sp_safe) {
@@ -73,7 +80,8 @@
}
// an fp must be within the stack and above (but not equal) sp
- bool fp_safe = (fp <= thread->stack_base()) && (fp > sp);
+ // second evaluation on fp+ is added to handle situation where fp is -1
+ bool fp_safe = (fp < thread->stack_base() && (fp > sp) && (((fp + (return_addr_offset * sizeof(void*))) < thread->stack_base())));
// We know sp/unextended_sp are safe only fp is questionable here
@@ -88,6 +96,13 @@
// other generic buffer blobs are more problematic so we just assume they are
// ok. adapter blobs never have a frame complete and are never ok.
+ // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc
+
+ if (!Interpreter::contains(_pc) && _cb->frame_size() <= 0) {
+ //assert(0, "Invalid frame_size");
+ return false;
+ }
+
if (!_cb->is_frame_complete_at(_pc)) {
if (_cb->is_nmethod() || _cb->is_adapter_blob() || _cb->is_runtime_stub()) {
return false;
@@ -109,7 +124,7 @@
address jcw = (address)entry_frame_call_wrapper();
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > fp);
+ bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp);
return jcw_safe;
@@ -135,12 +150,6 @@
sender_pc = (address) *(sender_sp-1);
}
- // We must always be able to find a recognizable pc
- CodeBlob* sender_blob = CodeCache::find_blob_unsafe(sender_pc);
- if (sender_pc == NULL || sender_blob == NULL) {
- return false;
- }
-
// If the potential sender is the interpreter then we can do some more checking
if (Interpreter::contains(sender_pc)) {
@@ -150,7 +159,7 @@
// is really a frame pointer.
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
- bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp > sender_sp);
+ bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
return false;
@@ -164,6 +173,17 @@
}
+ // We must always be able to find a recognizable pc
+ CodeBlob* sender_blob = CodeCache::find_blob_unsafe(sender_pc);
+ if (sender_pc == NULL || sender_blob == NULL) {
+ return false;
+ }
+
+ // Could be a zombie method
+ if (sender_blob->is_zombie() || sender_blob->is_unloaded()) {
+ return false;
+ }
+
// Could just be some random pointer within the codeBlob
if (!sender_blob->code_contains(sender_pc)) {
return false;
@@ -175,10 +195,9 @@
}
// Could be the call_stub
-
if (StubRoutines::returns_to_call_stub(sender_pc)) {
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
- bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp > sender_sp);
+ bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
return false;
@@ -191,15 +210,24 @@
// Validate the JavaCallWrapper an entry frame must have
address jcw = (address)sender.entry_frame_call_wrapper();
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > (address)sender.fp());
+ bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp());
return jcw_safe;
}
- // If the frame size is 0 something is bad because every nmethod has a non-zero frame size
+ if (sender_blob->is_nmethod()) {
+ nmethod* nm = sender_blob->as_nmethod_or_null();
+ if (nm != NULL) {
+ if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc)) {
+ return false;
+ }
+ }
+ }
+
+ // If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size
// because the return address counts against the callee's frame.
- if (sender_blob->frame_size() == 0) {
+ if (sender_blob->frame_size() <= 0) {
assert(!sender_blob->is_nmethod(), "should count return address at least");
return false;
}
@@ -209,7 +237,9 @@
// should not be anything but the call stub (already covered), the interpreter (already covered)
// or an nmethod.
- assert(sender_blob->is_nmethod(), "Impossible call chain");
+ if (!sender_blob->is_nmethod()) {
+ return false;
+ }
// Could put some more validation for the potential non-interpreted sender
// frame we'd create by calling sender if I could think of any. Wait for next crash in forte...
@@ -238,8 +268,6 @@
}
-
-
void frame::patch_pc(Thread* thread, address pc) {
address* pc_addr = &(((address*) sp())[-1]);
if (TracePcPatching) {
@@ -559,11 +587,9 @@
return false;
}
- // validate constantPoolCacheOop
-
+ // validate constantPoolCache*
ConstantPoolCache* cp = *interpreter_frame_cache_addr();
-
- if (cp == NULL || !cp->is_metadata()) return false;
+ if (cp == NULL || !cp->is_metaspace_object()) return false;
// validate locals
@@ -294,8 +294,8 @@
// Entry frames
-inline JavaCallWrapper* frame::entry_frame_call_wrapper() const {
- return (JavaCallWrapper*)at(entry_frame_call_wrapper_offset);
+inline JavaCallWrapper** frame::entry_frame_call_wrapper_addr() const {
+ return (JavaCallWrapper**)addr_at(entry_frame_call_wrapper_offset);
}
@@ -69,7 +69,7 @@
define_pd_global(bool, UseMembar, true);
// GC Ergo Flags
-define_pd_global(intx, CMSYoungGenPerWorker, 64*M); // default max size of CMS young gen, per GC worker thread
+define_pd_global(uintx, CMSYoungGenPerWorker, 64*M); // default max size of CMS young gen, per GC worker thread
// avoid biased locking while we are bootstrapping the aarch64 build
define_pd_global(bool, UseBiasedLocking, false);
@@ -339,7 +339,7 @@
assert(java_thread == rthread, "unexpected register");
#ifdef ASSERT
// TraceBytecodes does not use r12 but saves it over the call, so don't verify
- // if ((UseCompressedOops || UseCompressedKlassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");
+ // if ((UseCompressedOops || UseCompressedClassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");
#endif // ASSERT
assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result");
@@ -1550,7 +1550,7 @@
#ifdef ASSERT
void MacroAssembler::verify_heapbase(const char* msg) {
#if 0
- assert (UseCompressedOops || UseCompressedKlassPointers, "should be compressed");
+ assert (UseCompressedOops || UseCompressedClassPointers, "should be compressed");
assert (Universe::heap() != NULL, "java heap should be initialized");
if (CheckCompressedOops) {
Label ok;
@@ -1641,79 +1641,6 @@
}
}
-#ifdef ASSERT
-static Register spill_registers[] = {
- rheapbase,
- rcpool,
- rmonitors,
- rlocals,
- rmethod
-};
-
-#define spill_msg(_reg) \
- "register " _reg " invalid after call"
-
-static const char *spill_error_msgs[] = {
- spill_msg("rheapbase"),
- spill_msg("rcpool"),
- spill_msg("rmonitors"),
- spill_msg("rlocals"),
- spill_msg("rmethod")
-};
-
-#define SPILL_FRAME_COUNT (sizeof(spill_registers)/sizeof(spill_registers[0]))
-
-#define SPILL_FRAME_BYTESIZE (SPILL_FRAME_COUNT * wordSize)
-
-void MacroAssembler::spill(Register rscratcha, Register rscratchb)
-{
-#if 0
- Label bumped;
- // load and bump spill pointer
- ldr(rscratcha, Address(rthread, JavaThread::spill_stack_offset()));
- sub(rscratcha, rscratcha, SPILL_FRAME_BYTESIZE);
- // check for overflow
- ldr(rscratchb, Address(rthread, JavaThread::spill_stack_limit_offset()));
- cmp(rscratcha, rscratchb);
- br(Assembler::GE, bumped);
- stop("oops! ran out of register spill area");
- // spill registers
- bind(bumped);
- for (int i = 0; i < (int)SPILL_FRAME_COUNT; i++) {
- Register r = spill_registers[i];
- assert(r != rscratcha && r != rscratchb, "invalid scratch reg in spill");
- str(r, Address(rscratcha, (i * wordSize)));
- }
- // store new spill pointer
- str(rscratcha, (Address(rthread, JavaThread::spill_stack_offset())));
-#endif
-}
-
-void MacroAssembler::spillcheck(Register rscratcha, Register rscratchb)
-{
-#if 0
- // load spill pointer
- ldr(rscratcha, (Address(rthread, JavaThread::spill_stack_offset())));
- // check registers
- for (int i = 0; i < (int)SPILL_FRAME_COUNT; i++) {
- Register r = spill_registers[i];
- assert(r != rscratcha && r != rscratchb, "invalid scratch reg in spillcheck");
- // native code is allowed to modify rcpool
- Label valid;
- ldr(rscratchb, Address(rscratcha, (i * wordSize)));
- cmp(r, rscratchb);
- br(Assembler::EQ, valid);
- stop(spill_error_msgs[i]);
- bind(valid);
- }
- // decrement and store new spill pointer
- add(rscratcha, rscratcha, SPILL_FRAME_BYTESIZE);
- str(rscratcha, Address(rthread, JavaThread::spill_stack_offset()));
-#endif
-}
-
-#endif // ASSERT
-
void MacroAssembler::reinit_heapbase()
{
if (UseCompressedOops) {
@@ -1994,7 +1921,7 @@
}
void MacroAssembler::load_klass(Register dst, Register src) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));
decode_klass_not_null(dst);
} else {
@@ -2003,7 +1930,7 @@
}
void MacroAssembler::store_klass(Register dst, Register src) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
encode_klass_not_null(src);
strw(src, Address(dst, oopDesc::klass_offset_in_bytes()));
} else {
@@ -2012,7 +1939,7 @@
}
void MacroAssembler::store_klass_gap(Register dst, Register src) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// Store to klass gap in destination
str(src, Address(dst, oopDesc::klass_gap_offset_in_bytes()));
}
@@ -2152,7 +2079,6 @@
}
void MacroAssembler::encode_klass_not_null(Register r) {
- assert(Metaspace::is_initialized(), "metaspace should be initialized");
#ifdef ASSERT
verify_heapbase("MacroAssembler::encode_klass_not_null: heap base corrupted?");
#endif
@@ -2166,7 +2092,6 @@
}
void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
- assert(Metaspace::is_initialized(), "metaspace should be initialized");
#ifdef ASSERT
verify_heapbase("MacroAssembler::encode_klass_not_null2: heap base corrupted?");
#endif
@@ -2183,9 +2108,8 @@
}
void MacroAssembler::decode_klass_not_null(Register r) {
- assert(Metaspace::is_initialized(), "metaspace should be initialized");
// Note: it will change flags
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
// Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
@@ -2202,9 +2126,8 @@
}
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
- assert(Metaspace::is_initialized(), "metaspace should be initialized");
// Note: it will change flags
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
// Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit.
// Also do not verify_oop as this is called by verify_oop.
@@ -2242,7 +2165,7 @@
void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
mov_metadata(dst, k);
encode_klass_not_null(dst);
@@ -535,14 +535,6 @@
void enter();
void leave();
- // debug only support for spilling and restoring/checking callee
- // save registers around a Java method call
-
-#ifdef ASSERT
- void spill(Register rscratcha, Register rscratchb);
- void spillcheck(Register rscratcha, Register rscratchb);
-#endif // ASSERT
-
// Support for getting the JavaThread pointer (i.e.; a reference to thread-local information)
// The pointer will be loaded into the thread register.
void get_thread(Register thread);
@@ -58,13 +58,6 @@
return MacroAssembler::pd_call_destination(addr());
}
-int Relocation::pd_breakpoint_size() { Unimplemented(); return 0; }
-
-void Relocation::pd_swap_in_breakpoint(address x, short* instrs, int instrlen) { Unimplemented(); }
-
-
-void Relocation::pd_swap_out_breakpoint(address x, short* instrs, int instrlen) { Unimplemented(); }
-
void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
// fprintf(stderr, "Try to fix poll reloc at %p to %p\n", addr(), dest);
if (NativeInstruction::maybe_cpool_ref(addr())) {
@@ -71,7 +71,7 @@
private:
#ifdef PRODUCT
-#define inc_counter_np(counter) (0)
+#define inc_counter_np(counter) ((void)0)
#else
void inc_counter_np_(int& counter) {
__ lea(rscratch2, ExternalAddress((address)&counter));
@@ -751,7 +751,6 @@
// make sure klass is 'reasonable', which is not zero.
__ load_klass(r0, r0); // get klass
__ cbz(r0, error); // if klass is NULL it is broken
- // TODO: Future assert that klass is lower 4g memory for UseCompressedKlassPointers
// return if everything seems ok
__ bind(exit);
@@ -1714,6 +1713,47 @@
void generate_math_stubs() { Unimplemented(); }
+#ifndef BUILTIN_SIM
+ // Safefetch stubs.
+ void generate_safefetch(const char* name, int size, address* entry,
+ address* fault_pc, address* continuation_pc) {
+ // safefetch signatures:
+ // int SafeFetch32(int* adr, int errValue);
+ // intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue);
+ //
+ // arguments:
+ // c_rarg0 = adr
+ // c_rarg1 = errValue
+ //
+ // result:
+ // PPC_RET = *adr or errValue
+
+ StubCodeMark mark(this, "StubRoutines", name);
+
+ // Entry point, pc or function descriptor.
+ *entry = __ pc();
+
+ // Load *adr into c_rarg1, may fault.
+ *fault_pc = __ pc();
+ switch (size) {
+ case 4:
+ // int32_t
+ __ ldrw(c_rarg0, Address(c_rarg0, 0));
+ break;
+ case 8:
+ // int64_t
+ __ ldr(c_rarg0, Address(c_rarg0, 0));
+ break;
+ default:
+ ShouldNotReachHere();
+ }
+
+ // return errValue or *adr
+ *continuation_pc = __ pc();
+ __ ret(lr);
+ }
+#endif
+
#undef __
#define __ masm->
@@ -1917,6 +1957,16 @@
// arraycopy stubs used by compilers
generate_arraycopy_stubs();
+
+#ifndef BUILTIN_SIM
+ // Safefetch stubs.
+ generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry,
+ &StubRoutines::_safefetch32_fault_pc,
+ &StubRoutines::_safefetch32_continuation_pc);
+ generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry,
+ &StubRoutines::_safefetchN_fault_pc,
+ &StubRoutines::_safefetchN_continuation_pc);
+#endif
}
public:
@@ -208,9 +208,6 @@
__ sub(rscratch1, rscratch2, rscratch1, ext::uxtw, 3);
__ andr(sp, rscratch1, -16);
-#ifdef ASSERT
- __ spillcheck(rscratch1, rscratch2);
-#endif // ASSERT
#ifndef PRODUCT
// tell the simulator that the method has been reentered
if (NotifySimulator) {
@@ -1435,8 +1432,7 @@
-(frame::interpreter_frame_initial_sp_offset) + entry_size;
const int stub_code = frame::entry_frame_after_call_words;
- const int extra_stack = Method::extra_stack_entries();
- const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
+ const int method_stack = (method->max_locals() + method->max_stack()) *
Interpreter::stackElementWords;
return (overhead_size + method_stack + stub_code);
}
@@ -1711,6 +1707,27 @@
__ str(zr, Address(rthread, JavaThread::popframe_condition_offset()));
assert(JavaThread::popframe_inactive == 0, "fix popframe_inactive");
+#if INCLUDE_JVMTI
+ if (EnableInvokeDynamic) {
+ Label L_done;
+
+ __ ldrb(rscratch1, Address(r13, 0));
+ __ cmpw(r1, Bytecodes::_invokestatic);
+ __ br(Assembler::EQ, L_done);
+
+ // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
+ // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
+
+ __ ldr(c_rarg0, Address(rlocals, 0));
+ __ call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), c_rarg0, rmethod, rscratch1);
+
+ __ cbz(r0, L_done);
+
+ __ str(r0, Address(esp, 0));
+ __ bind(L_done);
+ }
+#endif // INCLUDE_JVMTI
+
__ dispatch_next(vtos);
// end of PopFrame support
@@ -2955,10 +2955,6 @@
transition(vtos, vtos);
assert(byte_no == f2_byte, "use this argument");
-#ifdef ASSERT
- __ spill(rscratch1, rscratch2);
-#endif // ASSERT
-
prepare_invoke(byte_no, rmethod, noreg, r2, r3);
// rmethod: index (actually a Method*)
@@ -2973,10 +2969,6 @@
transition(vtos, vtos);
assert(byte_no == f1_byte, "use this argument");
-#ifdef ASSERT
- __ spill(rscratch1, rscratch2);
-#endif // ASSERT
-
prepare_invoke(byte_no, rmethod, noreg, // get f1 Method*
r2); // get receiver also for null check
__ verify_oop(r2);
@@ -2991,10 +2983,6 @@
transition(vtos, vtos);
assert(byte_no == f1_byte, "use this argument");
-#ifdef ASSERT
- __ spill(rscratch1, rscratch2);
-#endif // ASSERT
-
prepare_invoke(byte_no, rmethod); // get f1 Method*
// do the call
__ profile_call(r0);
@@ -3010,10 +2998,6 @@
transition(vtos, vtos);
assert(byte_no == f1_byte, "use this argument");
-#ifdef ASSERT
- __ spill(rscratch1, rscratch2);
-#endif // ASSERT
-
prepare_invoke(byte_no, r0, rmethod, // get f1 Klass*, f2 itable index
r2, r3); // recv, flags
@@ -3325,9 +3325,9 @@
// format has been changed), we'll use the largest page size supported by
// the processor.
-#if !defined(ZERO)
+#ifndef ZERO
large_page_size = IA32_ONLY(4 * M) AMD64_ONLY(2 * M) IA64_ONLY(256 * M) SPARC_ONLY(4 * M)
- ARM_ONLY(2 * M) PPC_ONLY(4 * M);
+ ARM_ONLY(2 * M) PPC_ONLY(4 * M) AARCH64_ONLY(2 * M);
#endif // ZERO
FILE *fp = fopen("/proc/meminfo", "r");
@@ -1,28 +1,4 @@
- .text
-
-#ifndef BUILTIN_SIM
-
- .globl SafeFetch32, Fetch32PFI, Fetch32Resume
- .align 16
- .type SafeFetch32,@function
- // Prototype: int SafeFetch32 (int * Adr, int ErrValue)
-SafeFetch32:
-Fetch32PFI:
- ldr w0, [x0]
-Fetch32Resume:
- ret
-
- .globl SafeFetchN, FetchNPFI, FetchNResume
- .align 16
- .type SafeFetchN,@function
- // Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
-SafeFetchN:
-FetchNPFI:
- ldr x0, [x0]
-FetchNResume:
- ret
-
-#else
+#ifdef BUILTIN_SIM
.globl SafeFetch32, Fetch32PFI, Fetch32Resume
.align 16
@@ -104,21 +104,6 @@
}
void os::initialize_thread(Thread *thr) {
-#ifdef ASSERT
- if (!thr->is_Java_thread()) {
- // Nothing to do!
- return;
- }
-
- JavaThread *java_thread = (JavaThread *)thr;
- // spill frames are a fixed size of N (== 6?) saved registers at 8
- // bytes per register a 64K byte stack allows a call depth of 8K / N
-#define SPILL_STACK_SIZE (1 << 16)
- // initalise the spill stack so we cna check callee-save registers
- address spill_stack = new unsigned char[SPILL_STACK_SIZE];
- java_thread->set_spill_stack(spill_stack + SPILL_STACK_SIZE);
- java_thread->set_spill_stack_limit(spill_stack);
-#endif // ASSERT
}
address os::Linux::ucontext_get_pc(ucontext_t * uc) {
@@ -219,10 +204,12 @@
trap_page_fault = 0xE
};
+#ifdef BUILTIN_SIM
extern "C" void Fetch32PFI () ;
extern "C" void Fetch32Resume () ;
extern "C" void FetchNPFI () ;
extern "C" void FetchNResume () ;
+#endif
extern "C" JNIEXPORT int
JVM_handle_linux_signal(int sig,
@@ -233,6 +220,10 @@
Thread* t = ThreadLocalStorage::get_thread_slow();
+ // Must do this before SignalHandlerMark, if crash protection installed we will longjmp away
+ // (no destructors can be run)
+ os::WatcherThreadCrashProtection::check_crash_protection(sig, t);
+
SignalHandlerMark shm(t);
// Note: it's not uncommon that JNI code uses signal/sigset to install
@@ -286,22 +277,31 @@
if (info != NULL && uc != NULL && thread != NULL) {
pc = (address) os::Linux::ucontext_get_pc(uc);
+#ifdef BUILTIN_SIM
if (pc == (address) Fetch32PFI) {
-#ifdef BUILTIN_SIM
uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ;
-#else
- uc->uc_mcontext.pc = intptr_t(Fetch32Resume) ;
-#endif
return 1 ;
}
if (pc == (address) FetchNPFI) {
-#ifdef BUILTIN_SIM
uc->uc_mcontext.gregs[REG_PC] = intptr_t (FetchNResume) ;
-#else
- uc->uc_mcontext.pc = intptr_t (FetchNResume) ;
-#endif
return 1 ;
}
+#else
+ if (StubRoutines::is_safefetch_fault(pc)) {
+ uc->uc_mcontext.pc = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
+ return 1;
+ }
+#endif
+
+#ifndef AMD64
+ // Halt if SI_KERNEL before more crashes get misdiagnosed as Java bugs
+ // This can happen in any running code (currently more frequently in
+ // interpreter code but has been seen in compiled code)
+ if (sig == SIGSEGV && info->si_addr == 0 && info->si_code == SI_KERNEL) {
+ fatal("An irrecoverable SI_KERNEL SIGSEGV has occurred due "
+ "to unstable signal handling in this distribution.");
+ }
+#endif // AMD64
// Handle ALL stack overflow variations here
if (sig == SIGSEGV) {
@@ -32,8 +32,15 @@
void* ucontext, bool isInJava) {
assert(Thread::current() == this, "caller must be current thread");
+ return pd_get_top_frame(fr_addr, ucontext, isInJava);
+}
+
+bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
+ return pd_get_top_frame(fr_addr, ucontext, isInJava);
+}
+
+bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
assert(this->is_Java_thread(), "must be JavaThread");
-
JavaThread* jt = (JavaThread *)this;
// If we have a last_Java_frame, then we should use it even if
@@ -71,21 +71,15 @@
bool pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext,
bool isInJava);
+ bool pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava);
+private:
+ bool pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava);
+public:
+
// These routines are only used on cpu architectures that
// have separate register stacks (Itanium).
static bool register_stack_overflow() { return false; }
static void enable_register_stack_guard() {}
static void disable_register_stack_guard() {}
-#ifdef ASSERT
- void set_spill_stack(address base) { _spill_stack = _spill_stack_base = base; }
- void set_spill_stack_limit(address limit) { _spill_stack_limit = limit; }
- static ByteSize spill_stack_offset() {
- return byte_offset_of(JavaThread, _spill_stack) ;
- };
- static ByteSize spill_stack_limit_offset() {
- return byte_offset_of(JavaThread, _spill_stack_limit) ;
- };
-#endif
-
#endif // OS_CPU_LINUX_AARCH64_VM_THREAD_LINUX_AARCH64_HPP
@@ -28,7 +28,6 @@
*/
#include <config.h>
-#endif
#include <libiberty.h>
#include <bfd.h>
#include <dis-asm.h>
@@ -343,8 +343,10 @@
// 3 bytes per character. We concatenate three such strings.
// Yes, I know this is ridiculous, but it's debug code and glibc
// allocates large arrays very efficiently.
- size_t len = (65536 * 3) * 3;
- char *name = new char[len];
+// size_t len = (65536 * 3) * 3;
+// char *name = new char[len];
+ size_t len = 1024;
+ char name[1024];
strncpy(name, _method->holder()->name()->as_utf8(), len);
strncat(name, ".", len);
@@ -352,7 +354,7 @@
strncat(name, _method->signature()->as_symbol()->as_utf8(), len);
unsigned char *base = code()->insts()->start();
AArch64Simulator::get_current(UseSimulatorCache, DisableBCCheck)->notifyCompile(name, base);
- delete[] name;
+// delete[] name;
}
#endif
@@ -235,8 +235,10 @@
sasm->must_gc_arguments());
#ifdef BUILTIN_SIM
if (NotifySimulator) {
- size_t len = 65536;
- char *name = new char[len];
+// size_t len = 65536;
+// char *name = new char[len];
+ size_t len = 1024;
+ char name[1024];
// tell the sim about the new stub code
AArch64Simulator *simulator = AArch64Simulator::get_current(UseSimulatorCache, DisableBCCheck);
@@ -249,7 +251,7 @@
simulator->notifyCompile(name, base);
// code does not get relocated so just pass offset 0 and the code is live
simulator->notifyRelocate(base, 0);
- delete[] name;
+// delete[] name;
}
#endif
// install blob
@@ -1067,7 +1069,7 @@
ShouldNotReachHere();
}
-#if defined(SPARC) || defined(PPC) || defined(TARGET_ARCH_aarch64)
+#if defined(SPARC) || defined(PPC) || defined(AARCH64)
if (load_klass_or_mirror_patch_id ||
stub_id == Runtime1::load_appendix_patching_id) {
// Update the location in the nmethod with the proper
@@ -1139,7 +1141,9 @@
ICache::invalidate_range(instr_pc, *byte_count);
NativeGeneralJump::replace_mt_safe(instr_pc, copy_buff);
- if (load_klass_or_mirror_patch_id) {
+ if (load_klass_or_mirror_patch_id
+ || stub_id == Runtime1::load_appendix_patching_id
+ || stub_id == Runtime1::access_field_patching_id) {
relocInfo::relocType rtype;
switch(stub_id) {
case Runtime1::load_klass_patching_id:
@@ -1459,7 +1459,6 @@
#endif // ZERO
}
-
// NOTE: set_use_compressed_klass_ptrs() must be called after calling
// set_use_compressed_oops().
void Arguments::set_use_compressed_klass_ptrs() {
@@ -1472,10 +1471,13 @@
}
FLAG_SET_DEFAULT(UseCompressedClassPointers, false);
} else {
+// ECN: FIXME - UseCompressedClassPointers is temporarily broken
+#ifndef AARCH64
// Turn on UseCompressedClassPointers too
if (FLAG_IS_DEFAULT(UseCompressedClassPointers)) {
FLAG_SET_ERGO(bool, UseCompressedClassPointers, true);
}
+#endif
// Check the CompressedClassSpaceSize to make sure we use compressed klass ptrs.
if (UseCompressedClassPointers) {
if (CompressedClassSpaceSize > KlassEncodingMetaspaceMax) {
@@ -959,5 +959,9 @@
// It'd also be eligible for inlining on many platforms.
extern "C" int SpinPause();
+#ifdef BUILTIN_SIM
+extern "C" int SafeFetch32(int * adr, int errValue) ;
+extern "C" intptr_t SafeFetchN(intptr_t * adr, intptr_t errValue) ;
+#endif
#endif // SHARE_VM_RUNTIME_OS_HPP
@@ -374,8 +374,9 @@
}
klass = klass->array_klass(dim, CHECK_NULL);
oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);
- // obj may be NULL is one of the dimensions is 0
- assert(obj == NULL || obj->is_array(), "just checking");
+ // ECN: obj may be NULL if one of the dimensions is 0?
+ assert(obj != NULL, "can obj be NULL here?");
+ assert(obj->is_array(), "just checking");
return arrayOop(obj);
}
@@ -136,12 +136,14 @@
double (* StubRoutines::_intrinsic_cos )(double) = NULL;
double (* StubRoutines::_intrinsic_tan )(double) = NULL;
+#ifndef BUILTIN_SIM
address StubRoutines::_safefetch32_entry = NULL;
address StubRoutines::_safefetch32_fault_pc = NULL;
address StubRoutines::_safefetch32_continuation_pc = NULL;
address StubRoutines::_safefetchN_entry = NULL;
address StubRoutines::_safefetchN_fault_pc = NULL;
address StubRoutines::_safefetchN_continuation_pc = NULL;
+#endif
// Initialization
//
@@ -227,6 +227,7 @@
static double (*_intrinsic_cos)(double);
static double (*_intrinsic_tan)(double);
+#ifndef BUILTIN_SIM
// Safefetch stubs.
static address _safefetch32_entry;
static address _safefetch32_fault_pc;
@@ -234,6 +235,7 @@
static address _safefetchN_entry;
static address _safefetchN_fault_pc;
static address _safefetchN_continuation_pc;
+#endif
public:
// Initialization/Testing
@@ -395,10 +397,10 @@
return _intrinsic_tan(d);
}
+#ifndef BUILTIN_SIM
//
// Safefetch stub support
//
-
typedef int (*SafeFetch32Stub)(int* adr, int errValue);
typedef intptr_t (*SafeFetchNStub) (intptr_t* adr, intptr_t errValue);
@@ -422,6 +424,7 @@
ShouldNotReachHere();
return NULL;
}
+#endif
//
// Default versions of the above arraycopy functions for platforms which do
@@ -442,6 +445,7 @@
static void arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count);
};
+#ifndef BUILTIN_SIM
// Safefetch allows to load a value from a location that's not known
// to be valid. If the load causes a fault, the error value is returned.
inline int SafeFetch32(int* adr, int errValue) {
@@ -452,5 +456,6 @@
assert(StubRoutines::SafeFetchN_stub(), "stub not yet generated");
return StubRoutines::SafeFetchN_stub()(adr, errValue);
}
+#endif
#endif // SHARE_VM_RUNTIME_STUBROUTINES_HPP
@@ -31,14 +31,14 @@
* @bug 8023476
* @summary Tests that a MemoryPoolMXBeans and PerfCounters for metaspace
* report the same data.
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedKlassPointers -XX:+UseSerialGC -XX:+UsePerfData TestPerfCountersAndMemoryPools
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UseSerialGC -XX:+UsePerfData TestPerfCountersAndMemoryPools
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UseSerialGC -XX:+UsePerfData TestPerfCountersAndMemoryPools
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UseSerialGC -XX:+UsePerfData TestPerfCountersAndMemoryPools
*/
public class TestPerfCountersAndMemoryPools {
public static void main(String[] args) throws Exception {
checkMemoryUsage("Metaspace", "sun.gc.metaspace");
- if (InputArguments.contains("-XX:+UseCompressedKlassPointers") && Platform.is64bit()) {
+ if (InputArguments.contains("-XX:+UseCompressedClassPointers") && Platform.is64bit()) {
checkMemoryUsage("Compressed Class Space", "sun.gc.compressedclassspace");
}
}