# HG changeset patch # User Andrew John Hughes # Date 1395876217 0 # Node ID 92ea9fe535057e075c877638c98f78d323b431df # Parent c412c251e4c0292d42a7408b57e780eb7fa9e8df Include zero patches directory in tarball and backport post-7023639 ARM32 JIT patch. 2014-03-26 Andrew John Hughes * Makefile.am: (ICEDTEA_PATCHES): Add ARM hs24 support patch. (EXTRA_DIST): Include zero patches directory. * NEWS: Mention PR1626. * patches/zero/arm-7023639.patch: Backport of most of PR1626, as applicable to hs23 + S7023639. diff -r c412c251e4c0 -r 92ea9fe53505 ChangeLog --- a/ChangeLog Wed Mar 26 14:45:38 2014 +0000 +++ b/ChangeLog Wed Mar 26 23:23:37 2014 +0000 @@ -1,3 +1,13 @@ +2014-03-26 Andrew John Hughes + + * Makefile.am: + (ICEDTEA_PATCHES): Add ARM hs24 support patch. + (EXTRA_DIST): Include zero patches directory. + * NEWS: Mention PR1626. + * patches/zero/arm-7023639.patch: Backport of + most of PR1626, as applicable to hs23 + + S7023639. + 2014-03-26 Andrew John Hughes * NEWS: Set release date to today. diff -r c412c251e4c0 -r 92ea9fe53505 Makefile.am --- a/Makefile.am Wed Mar 26 14:45:38 2014 +0000 +++ b/Makefile.am Wed Mar 26 23:23:37 2014 +0000 @@ -316,7 +316,8 @@ patches/zero/7196242-loopsandthreads_crashed.patch \ patches/zero/7192406-exact_return_type_info.patch \ patches/zero/7200949-jruby_fail.patch \ - patches/zero/8029507-jvm_method_processing.patch + patches/zero/8029507-jvm_method_processing.patch \ + patches/zero/arm-7023639.patch endif ICEDTEA_PATCHES += $(DISTRIBUTION_PATCHES) @@ -778,6 +779,7 @@ $(top_srcdir)/patches/boot/*.patch \ $(top_srcdir)/patches/cacao/*.patch \ $(top_srcdir)/patches/jamvm/*.patch \ + $(top_srcdir)/patches/zero/*.patch \ tools-copy contrib overlays \ javaws.png javaws.desktop \ jconsole.desktop policytool.desktop \ diff -r c412c251e4c0 -r 92ea9fe53505 NEWS --- a/NEWS Wed Mar 26 14:45:38 2014 +0000 +++ b/NEWS Wed Mar 26 23:23:37 2014 +0000 @@ -53,6 +53,7 @@ - S8035893: JVM_GetVersionInfo fails to zero structure * Bug fixes - Fix broken bootstrap build by updating ecj-multicatch.patch + - PR1626: ARM32 assembler update for hsx24. - PR1654: ppc32 needs a larger ThreadStackSize to build - PR1677, G498288: Update PaX support to detect running PaX kernel and use newer tools - PR1679: Allow OpenJDK to build on PaX-enabled kernels diff -r c412c251e4c0 -r 92ea9fe53505 patches/zero/arm-7023639.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/zero/arm-7023639.patch Wed Mar 26 23:23:37 2014 +0000 @@ -0,0 +1,361 @@ +diff -r ad4c46e70192 src/cpu/zero/vm/asm_helper.cpp +--- openjdk/hotspot/src/cpu/zero/vm/asm_helper.cpp Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/asm_helper.cpp Wed Mar 12 13:34:40 2014 +0000 +@@ -23,6 +23,10 @@ + #define ARCH_VFP (1<<17) + #define ARCH_CLZ (1<<18) + ++/* A workaround for private and protected fields */ ++#define private public ++#define protected public ++ + #include "precompiled.hpp" + #include "asm/assembler.hpp" + #include "interp_masm_zero.hpp" +@@ -33,8 +37,10 @@ + #include "oops/methodDataOop.hpp" + #include "oops/methodOop.hpp" + #include "oops/oop.inline.hpp" ++#include "oops/klassOop.hpp" + #include "prims/jvmtiExport.hpp" + #include "prims/jvmtiThreadState.hpp" ++#include "runtime/frame.hpp" + #include "runtime/deoptimization.hpp" + #include "runtime/frame.inline.hpp" + #include "runtime/sharedRuntime.hpp" +@@ -68,11 +74,22 @@ + // particular method. + #define NAME1 "sun.nio.ch.FileChannelImpl$Unmapper.run()V" + #define EQ(S1, S2) (S1 && (strncmp(S1, S2, strlen(S2)) == 0)) +-extern "C" void my_trace(void *jpc, void *istate) ++extern "C" void my_trace(void *jpc, interpreterState istate) + { +- char *name = meth((interpreterState)istate); +- if (EQ(name, NAME1)); +- asm volatile("nop"); // Somewhere to put a breakpoint ++ JavaThread *jt = istate->thread(); ++ if (jt->zero_stack()->sp() && jt->top_zero_frame()) { ++ bool has_last_Java_frame = jt->has_last_Java_frame(); ++ if (!has_last_Java_frame) ++ jt->set_last_Java_frame(); ++ ++ StackFrameStream sfs(jt); ++ for(int i = 0; !sfs.is_done(); sfs.next(), i++) { ++ } ++ ++ // Reset the frame anchor if necessary ++ if (!has_last_Java_frame) ++ jt->reset_last_Java_frame(); ++ } + } + + extern "C" unsigned hwcap(void) +@@ -603,7 +620,7 @@ + print_def("CONSTANTPOOL_CACHE", offset_of(constantPoolOopDesc, _cache)); + print_def("CONSTANTPOOL_POOL_HOLDER", offset_of(constantPoolOopDesc, _pool_holder)); + print_def("CONSTANTPOOL_BASE", sizeof(constantPoolOopDesc)); +- print_def("CP_CACHE_VOLATILE_FIELD_FLAG_BIT", ConstantPoolCacheEntry::volatileField); ++ print_def("CP_CACHE_VOLATILE_FIELD_FLAG_BIT", ConstantPoolCacheEntry::is_volatile_shift); + print_def("CP_CACHE_FLAGS", offset_of(ConstantPoolCacheEntry, _flags)); + nl(); + print_def("CP_OFFSET", in_bytes(constantPoolCacheOopDesc::base_offset())); +@@ -704,10 +721,10 @@ + print_def("class_fully_initialized", instanceKlass::fully_initialized); + print_def("class_init_error", instanceKlass::initialization_error); + nl(); +- print_def("flag_methodInterface", 1 << ConstantPoolCacheEntry::methodInterface); +- print_def("flag_volatileField", 1 << ConstantPoolCacheEntry::volatileField); +- print_def("flag_vfinalMethod", 1 << ConstantPoolCacheEntry::vfinalMethod); +- print_def("flag_finalField", 1 << ConstantPoolCacheEntry::finalField); ++ print_def("flag_methodInterface", 1 << ConstantPoolCacheEntry::has_method_type_shift); ++ print_def("flag_volatileField", 1 << ConstantPoolCacheEntry::is_volatile_shift); ++ print_def("flag_vfinalMethod", 1 << ConstantPoolCacheEntry::is_vfinal_shift); ++ print_def("flag_finalField", 1 << ConstantPoolCacheEntry::is_final_shift); + nl(); + print_def("INVOCATIONCOUNTER_COUNTINCREMENT", InvocationCounter::count_increment); + nl(); +diff -r ad4c46e70192 src/cpu/zero/vm/bytecodes_arm.def +--- openjdk/hotspot/src/cpu/zero/vm/bytecodes_arm.def Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/bytecodes_arm.def Wed Mar 12 13:34:40 2014 +0000 +@@ -1950,7 +1950,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [r2, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + add r1, r2, #4 + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + +@@ -1981,7 +1981,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [stack, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + str r1, [stack, r0, lsl #2]! +@@ -2008,7 +2008,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [r2, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + add r1, r2, #4 + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + +@@ -3993,7 +3996,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [stack, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + str r1, [stack, r0, lsl #2]! + +@@ -4022,7 +4025,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [stack, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + str r1, [stack, r0, lsl #2]! + +@@ -4429,7 +4432,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [stack, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + str r1, [stack, r0, lsl #2]! + +diff -r ad4c46e70192 src/cpu/zero/vm/cppInterpreter_arm.S +--- openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Wed Mar 12 13:34:40 2014 +0000 +@@ -3431,7 +3444,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_FP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [r2, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + add r1, r2, #4 + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + +@@ -3560,7 +3573,7 @@ + str r3, [thread, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [r2, #0] +- ldrh r0, [r0, #40] ++ ldrh r0, [r0, #METHOD_MAXLOCALS] + add r1, r2, #4 + str r3, [thread, #THREAD_TOP_ZERO_FRAME] + +diff -r ad4c46e70192 src/cpu/zero/vm/cppInterpreter_zero.cpp +--- openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Wed Mar 12 13:34:40 2014 +0000 +@@ -1,6 +1,6 @@ + /* +- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. +- * Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. ++ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013 Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -66,9 +66,10 @@ + CALL_VM_NOCHECK_NOFIX(func) \ + fixup_after_potential_safepoint() + +- +-#ifdef z_CPPDEBUG ++//#define CPPIDEBUG 1 ++#ifdef CPPIDEBUG + #define CPPINT_DEBUG( Z_code_ ) Z_code_ ++CPPINT_DEBUG ( static const char *FFng_Zero_Flag = "CPPINT_DEBUG_ON\n"; ) + #else + #define CPPINT_DEBUG( Z_code_ ) + #endif +@@ -618,6 +619,25 @@ + return 0; + } + ++int CppInterpreter::method_handle_entry(methodOop method, ++ intptr_t UNUSED, TRAPS) { ++ JavaThread *thread = (JavaThread *) THREAD; ++ ZeroStack *stack = thread->zero_stack(); ++ CPPINT_DEBUG( tty->print_cr( "method_handle : 0x%x , thread: 0x%x , stack: %0x%x.", \ ++ method, thread, stack ); ) ++ ++ return MethodHandles::method_handle_entry_invokeBasic(method, UNUSED, THREAD); ++} ++ ++void CppInterpreter::process_method_handle(oop method_handle, TRAPS) { ++ JavaThread *thread = (JavaThread *) THREAD; ++ ZeroStack *stack = thread->zero_stack(); ++ CPPINT_DEBUG( tty->print_cr( "process_method_handle : 0x%x , thread: 0x%x , stack: %0x%x.", \ ++ method_handle, thread, stack ); ) ++ methodOop method = (methodOop) java_lang_invoke_MemberName::vmtarget(method_handle); ++ MethodHandles::invoke_target(method, THREAD); ++} ++ + // The new slots will be inserted before slot insert_before. + // Slots < insert_before will have the same slot number after the insert. + // Slots >= insert_before will become old_slot + num_slots. +diff -r ad4c46e70192 src/cpu/zero/vm/cppInterpreter_zero.hpp +--- openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp Wed Mar 12 13:34:40 2014 +0000 +@@ -1,6 +1,6 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. +- * Copyright 2007, 2008, 2010, 2011 Red Hat, Inc. ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -37,6 +37,7 @@ + static int accessor_entry(methodOop method, intptr_t UNUSED, TRAPS); + static int empty_entry(methodOop method, intptr_t UNUSED, TRAPS); + static int method_handle_entry(methodOop method, intptr_t UNUSED, TRAPS); ++ static void process_method_handle(oop method_handle, TRAPS); + + public: + // Main loop of normal_entry +@@ -44,7 +45,6 @@ + + private: + // Helpers for method_handle_entry +- static void process_method_handle(oop method_handle, TRAPS); + static void insert_vmslots(int insert_before, int num_slots, TRAPS); + static void remove_vmslots(int first_slot, int num_slots, TRAPS); + static BasicType result_type_of_handle(oop method_handle); +diff -r ad4c46e70192 src/cpu/zero/vm/methodHandles_zero.hpp +--- openjdk/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp Wed Mar 12 13:34:40 2014 +0000 +@@ -1,6 +1,6 @@ + /* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +- * Copyright 2011, 2012 Red Hat, Inc. ++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,10 +29,11 @@ + adapter_code_size = sizeof(ZeroEntry) * (Interpreter::method_handle_invoke_LAST - Interpreter::method_handle_invoke_FIRST + 1) + }; + ++public: ++ static void invoke_target(methodOop method, TRAPS); ++ static int method_handle_entry_invokeBasic(methodOop method, intptr_t UNUSED, TRAPS); + private: + static oop popFromStack(TRAPS); +- static void invoke_target(methodOop method, TRAPS); +- static int method_handle_entry_invokeBasic(methodOop method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToStaticOrSpecial(methodOop method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToVirtual(methodOop method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToInterface(methodOop method, intptr_t UNUSED, TRAPS); +diff -r ad4c46e70192 src/cpu/zero/vm/thumb2.cpp +--- openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp Tue Mar 11 15:45:00 2014 +0000 ++++ openjdk/hotspot/src/cpu/zero/vm/thumb2.cpp Wed Mar 12 13:34:40 2014 +0000 +@@ -430,13 +430,15 @@ + + #ifdef PRODUCT + +-#define JASSERT(cond, msg) 0 ++#define JASSERT(cond, msg) + #define J_Unimplemented() longjmp(compiler_error_env, COMPILER_RESULT_FATAL) ++#define JDEBUG_( _j_ ) + + #else + + #define JASSERT(cond, msg) do { if (!(cond)) fatal(msg); } while (0) + #define J_Unimplemented() { report_unimplemented(__FILE__, __LINE__); BREAKPOINT; } ++#define JDEBUG_( _j_ ) _j_ + + #endif // PRODUCT + +@@ -4571,7 +4573,7 @@ + if (!cache->is_resolved((Bytecodes::Code)opc_getfield)) return 0; + + TosState tos_type = cache->flag_state(); +- int field_offset = cache->f2(); ++ int field_offset = cache->f2_as_index(); + + // Slow entry point - callee save + // R0 = method +@@ -5886,7 +5890,7 @@ + } + + TosState tos_type = cache->flag_state(); +- int field_offset = cache->f2(); ++ int field_offset = cache->f2_as_index(); + + if (tos_type == ltos || tos_type == dtos) { + Reg r_lo, r_hi; +@@ -5949,7 +5953,8 @@ + } + + TosState tos_type = cache->flag_state(); +- int field_offset = cache->f2(); ++ int field_offset = cache->f2_as_index(); ++ JDEBUG_( tty->print("f2_as_index getstatic %d: %s: %s %d\n", index , name->as_C_string(), sig->as_C_string(), field_offset); ); + + if (tos_type == ltos || tos_type == dtos) { + Reg r_lo, r_hi, r_addr; +@@ -6018,7 +6023,7 @@ + storeBarrier(jinfo->codebuf); + + TosState tos_type = cache->flag_state(); +- int field_offset = cache->f2(); ++ int field_offset = cache->f2_as_index(); + + if (tos_type == ltos || tos_type == dtos) { + Reg r_lo, r_hi; +@@ -6083,7 +6088,7 @@ + storeBarrier(jinfo->codebuf); + + TosState tos_type = cache->flag_state(); +- int field_offset = cache->f2(); ++ int field_offset = cache->f2_as_index(); + Reg r_obj; + + if (tos_type == ltos || tos_type == dtos) { +@@ -6163,7 +6168,7 @@ + break; + } + +- callee = opcode == opc_invokevirtual ? (methodOop)cache->f2() : (methodOop)cache->f1(); ++ callee = opcode == opc_invokevirtual ? (methodOop)cache->f2_as_index() : (methodOop)cache->f1_as_instance(); + + if (opcode != opc_invokevirtual || cache->is_vfinal()) { + if (handle_special_method(callee, jinfo, stackdepth)) +@@ -6181,7 +6186,7 @@ + JASSERT(cache->parameter_size() == 1, "not 1 parameter to accessor"); + + TosState tos_type = entry->flag_state(); +- int field_offset = entry->f2(); ++ int field_offset = entry->f2_as_index(); + + JASSERT(tos_type == btos || tos_type == ctos || tos_type == stos || tos_type == atos || tos_type == itos, "not itos or atos"); + +@@ -6228,7 +6233,7 @@ + ldr_imm(jinfo->codebuf, ARM_R0, ARM_R0, + CP_OFFSET + (index << 4) + (opcode == opc_invokevirtual ? 8 : 4), 1, 0); + else +- ldr_imm(jinfo->codebuf, ARM_R0, ARM_R3, INSTANCEKLASS_VTABLE_OFFSET + cache->f2() * 4, 1, 0); ++ ldr_imm(jinfo->codebuf, ARM_R0, ARM_R3, INSTANCEKLASS_VTABLE_OFFSET + cache->f2_as_index() * 4, 1, 0); + add_imm(jinfo->codebuf, ARM_R2, ARM_R2, bci+CONSTMETHOD_CODEOFFSET); + str_imm(jinfo->codebuf, ARM_R1, Rthread, THREAD_LAST_JAVA_SP, 1, 0); + str_imm(jinfo->codebuf, ARM_R1, Rthread, THREAD_LAST_JAVA_FP, 1, 0); +@@ -6298,7 +6303,7 @@ + int r = JSTACK_REG(jstack); + PUSH(jstack, r); + ldr_imm(jinfo->codebuf, r, Ristate, ISTATE_CONSTANTS, 1, 0); +- ldr_imm(jinfo->codebuf, r, r, CP_OFFSET + (index << 4) + 4, 1, 0); // offset to cache->f1() ++ ldr_imm(jinfo->codebuf, r, r, CP_OFFSET + (index << 4) + 4, 1, 0); // offset to cache->f1_as_instance() + } else { + Thumb2_Exit(jinfo, H_EXIT_TO_INTERPRETER, bci, stackdepth); + }