# HG changeset patch # User jwilhelm # Date 1515186140 -3600 # Node ID 4f647519c8be24465ecea619aa57df280358cb20 # Parent 6a1c3a5e04f33818d4cdaa519863bb612419f4b2# Parent a5548cf242861a6defbb0f574b2930e57bcaba0f Merge diff -r 6a1c3a5e04f3 -r 4f647519c8be make/mapfiles/libjava/mapfile-vers --- a/make/mapfiles/libjava/mapfile-vers Fri Jan 12 11:06:24 2018 -0800 +++ b/make/mapfiles/libjava/mapfile-vers Fri Jan 05 22:02:20 2018 +0100 @@ -257,7 +257,6 @@ Java_jdk_internal_reflect_NativeConstructorAccessorImpl_newInstance0; Java_jdk_internal_reflect_NativeMethodAccessorImpl_invoke0; Java_jdk_internal_reflect_Reflection_getCallerClass__; - Java_jdk_internal_reflect_Reflection_getCallerClass__I; Java_jdk_internal_reflect_Reflection_getClassAccessFlags; Java_jdk_internal_misc_VM_latestUserDefinedLoader0; Java_jdk_internal_misc_VM_getuid; diff -r 6a1c3a5e04f3 -r 4f647519c8be make/mapfiles/libjava/reorder-sparc --- a/make/mapfiles/libjava/reorder-sparc Fri Jan 12 11:06:24 2018 -0800 +++ b/make/mapfiles/libjava/reorder-sparc Fri Jan 05 22:02:20 2018 +0100 @@ -27,7 +27,6 @@ text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; text: .text%Java_sun_reflect_Reflection_getCallerClass__; -text: .text%Java_sun_reflect_Reflection_getCallerClass__I; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_Object_getClass; text: .text%Java_sun_reflect_Reflection_getClassAccessFlags; diff -r 6a1c3a5e04f3 -r 4f647519c8be make/mapfiles/libjava/reorder-sparcv9 --- a/make/mapfiles/libjava/reorder-sparcv9 Fri Jan 12 11:06:24 2018 -0800 +++ b/make/mapfiles/libjava/reorder-sparcv9 Fri Jan 05 22:02:20 2018 +0100 @@ -26,7 +26,6 @@ text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; text: .text%Java_sun_reflect_Reflection_getCallerClass__; -text: .text%Java_sun_reflect_Reflection_getCallerClass__I; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_String_intern; text: .text%Java_java_lang_StringUTF16_isBigEndian; diff -r 6a1c3a5e04f3 -r 4f647519c8be make/mapfiles/libjava/reorder-x86 --- a/make/mapfiles/libjava/reorder-x86 Fri Jan 12 11:06:24 2018 -0800 +++ b/make/mapfiles/libjava/reorder-x86 Fri Jan 05 22:02:20 2018 +0100 @@ -27,7 +27,6 @@ text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; text: .text%Java_sun_reflect_Reflection_getCallerClass__; -text: .text%Java_sun_reflect_Reflection_getCallerClass__I; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_String_intern; text: .text%Java_java_lang_StringUTF16_isBigEndian; diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/aarch64.ad --- a/src/hotspot/cpu/aarch64/aarch64.ad Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/aarch64.ad Fri Jan 05 22:02:20 2018 +0100 @@ -5844,8 +5844,8 @@ operand immByteMapBase() %{ // Get base of card map - predicate((jbyte*)n->get_ptr() == - ((CardTableModRefBS*)(Universe::heap()->barrier_set()))->byte_map_base); + predicate(Universe::heap()->barrier_set()->is_a(BarrierSet::CardTableModRef) && + (jbyte*)n->get_ptr() == ((CardTableModRefBS*)(Universe::heap()->barrier_set()))->byte_map_base); match(ConP); op_cost(0); diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/assembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp Fri Jan 05 22:02:20 2018 +0100 @@ -848,7 +848,7 @@ // architecture. In debug mode we shrink it in order to test // trampolines, but not so small that branches in the interpreter // are out of range. - static const unsigned long branch_range = INCLUDE_JVMCI ? 128 * M : NOT_DEBUG(128 * M) DEBUG_ONLY(2 * M); + static const unsigned long branch_range = NOT_DEBUG(128 * M) DEBUG_ONLY(2 * M); static bool reachable_from_branch_at(address branch, address target) { return uabs(target - branch) < branch_range; diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp --- a/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp Fri Jan 05 22:02:20 2018 +0100 @@ -71,6 +71,13 @@ return 7 * NativeInstruction::instruction_size; } +int CompiledStaticCall::to_trampoline_stub_size() { + // Somewhat pessimistically, we count 3 instructions here (although + // there are only two) because we sometimes emit an alignment nop. + // Trampoline stubs are always word aligned. + return 3 * NativeInstruction::instruction_size + wordSize; +} + // Relocation entries for call stub, compiled java to interpreter. int CompiledStaticCall::reloc_to_interp_stub() { return 4; // 3 in emit_to_interp_stub + 1 in emit_call diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp --- a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp Fri Jan 05 22:02:20 2018 +0100 @@ -109,7 +109,7 @@ TRACE_jvmci_3("relocating (foreign call) at " PTR_FORMAT, p2i(inst)); } -void CodeInstaller::pd_relocate_JavaMethod(Handle hotspot_method, jint pc_offset, TRAPS) { +void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, Handle hotspot_method, jint pc_offset, TRAPS) { #ifdef ASSERT Method* method = NULL; // we need to check, this might also be an unresolved method @@ -124,22 +124,22 @@ case INVOKEINTERFACE: { assert(method == NULL || !method->is_static(), "cannot call static method with invokeinterface"); NativeCall* call = nativeCall_at(_instructions->start() + pc_offset); - call->set_destination(SharedRuntime::get_resolve_virtual_call_stub()); _instructions->relocate(call->instruction_address(), virtual_call_Relocation::spec(_invoke_mark_pc)); + call->trampoline_jump(cbuf, SharedRuntime::get_resolve_virtual_call_stub()); break; } case INVOKESTATIC: { assert(method == NULL || method->is_static(), "cannot call non-static method with invokestatic"); NativeCall* call = nativeCall_at(_instructions->start() + pc_offset); - call->set_destination(SharedRuntime::get_resolve_static_call_stub()); _instructions->relocate(call->instruction_address(), relocInfo::static_call_type); + call->trampoline_jump(cbuf, SharedRuntime::get_resolve_static_call_stub()); break; } case INVOKESPECIAL: { assert(method == NULL || !method->is_static(), "cannot call static method with invokespecial"); NativeCall* call = nativeCall_at(_instructions->start() + pc_offset); - call->set_destination(SharedRuntime::get_resolve_opt_virtual_call_stub()); _instructions->relocate(call->instruction_address(), relocInfo::opt_virtual_call_type); + call->trampoline_jump(cbuf, SharedRuntime::get_resolve_opt_virtual_call_stub()); break; } default: diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Fri Jan 05 22:02:20 2018 +0100 @@ -801,7 +801,7 @@ assert(is_NativeCallTrampolineStub_at(stub_start_addr), "doesn't look like a trampoline"); end_a_stub(); - return stub; + return stub_start_addr; } address MacroAssembler::ic_call(address entry, jint method_index) { diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp Fri Jan 05 22:02:20 2018 +0100 @@ -367,3 +367,24 @@ set_ptr_at(data_offset, new_destination); OrderAccess::release(); } + +// Generate a trampoline for a branch to dest. If there's no need for a +// trampoline, simply patch the call directly to dest. +address NativeCall::trampoline_jump(CodeBuffer &cbuf, address dest) { + MacroAssembler a(&cbuf); + address stub = NULL; + + if (a.far_branches() + && ! is_NativeCallTrampolineStub_at(instruction_address() + displacement())) { + stub = a.emit_trampoline_stub(instruction_address() - cbuf.insts()->start(), dest); + } + + if (stub == NULL) { + // If we generated no stub, patch this call directly to dest. + // This will happen if we don't need far branches or if there + // already was a trampoline. + set_destination(dest); + } + + return stub; +} diff -r 6a1c3a5e04f3 -r 4f647519c8be src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp Fri Jan 12 11:06:24 2018 -0800 +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp Fri Jan 05 22:02:20 2018 +0100 @@ -61,7 +61,7 @@ return uint_at(0); } - bool is_blr() const { return (encoding() & 0xfffffc1f) == 0xd63f0000; } + bool is_blr() const { return (encoding() & 0xff9ffc1f) == 0xd61f0000; } // blr(register) or br(register) bool is_adr_aligned() const { return (encoding() & 0xff000000) == 0x10000000; } // adr Xn,