# HG changeset patch # User twisti # Date 1394000604 28800 # Node ID 361acb279104eaddfe34a86fd0e3c49da9ed6bf0 # Parent e85575f63b606533b796786b2f12745d3fa9c108 moved to-constant-pool-index conversion up to Java diff -r e85575f63b60 -r 361acb279104 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Tue Mar 04 20:07:03 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Tue Mar 04 22:23:24 2014 -0800 @@ -1045,6 +1045,8 @@ @HotSpotVMField(name = "ConstantPool::_pool_holder", type = "InstanceKlass*", get = HotSpotVMField.Type.OFFSET) @Stable public int constantPoolHolderOffset; @HotSpotVMField(name = "ConstantPool::_length", type = "int", get = HotSpotVMField.Type.OFFSET) @Stable public int constantPoolLengthOffset; + @HotSpotVMConstant(name = "ConstantPool::CPCACHE_INDEX_TAG") @Stable public int constantPoolCpCacheIndexTag; + @HotSpotVMConstant(name = "JVM_CONSTANT_Utf8") @Stable public int jvmConstantUtf8; @HotSpotVMConstant(name = "JVM_CONSTANT_Integer") @Stable public int jvmConstantInteger; @HotSpotVMConstant(name = "JVM_CONSTANT_Long") @Stable public int jvmConstantLong; diff -r e85575f63b60 -r 361acb279104 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Mar 04 20:07:03 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Mar 04 22:23:24 2014 -0800 @@ -126,7 +126,7 @@ void lookupReferencedTypeInPool(long metaspaceConstantPool, int cpi, byte opcode); - Object lookupAppendixInPool(long metaspaceConstantPool, int cpi, byte opcode); + Object lookupAppendixInPool(long metaspaceConstantPool, int cpi); public enum CodeInstallResult { OK("ok"), DEPENDENCIES_FAILED("dependencies failed"), CACHE_FULL("code cache is full"), CODE_TOO_LARGE("code is too large"); diff -r e85575f63b60 -r 361acb279104 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Mar 04 20:07:03 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Mar 04 22:23:24 2014 -0800 @@ -77,7 +77,7 @@ public native void lookupReferencedTypeInPool(long metaspaceConstantPool, int cpi, byte opcode); @Override - public native Object lookupAppendixInPool(long metaspaceConstantPool, int cpi, byte opcode); + public native Object lookupAppendixInPool(long metaspaceConstantPool, int cpi); @Override public native void initializeConfiguration(HotSpotVMConfig config); diff -r e85575f63b60 -r 361acb279104 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Tue Mar 04 20:07:03 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Tue Mar 04 22:23:24 2014 -0800 @@ -47,6 +47,28 @@ } /** + * Converts a raw index from the bytecodes to a constant pool index by adding a + * {@link HotSpotVMConfig#constantPoolCpCacheIndexTag constant}. + * + * @param rawIndex index from the bytecode + * @param opcode bytecode to convert the index for + * @return constant pool index + */ + private static int toConstantPoolIndex(int rawIndex, int opcode) { + int index; + if (opcode == Bytecodes.INVOKEDYNAMIC) { + index = rawIndex; + // See: ConstantPool::is_invokedynamic_index + assert index < 0 : "not an invokedynamic constant pool index " + index; + } else { + assert opcode == Bytecodes.GETFIELD || opcode == Bytecodes.PUTFIELD || opcode == Bytecodes.GETSTATIC || opcode == Bytecodes.PUTSTATIC || opcode == Bytecodes.INVOKEINTERFACE || + opcode == Bytecodes.INVOKEVIRTUAL || opcode == Bytecodes.INVOKESPECIAL || opcode == Bytecodes.INVOKESTATIC : "unexpected invoke opcode " + Bytecodes.nameOf(opcode); + index = rawIndex + runtime().getConfig().constantPoolCpCacheIndexTag; + } + return index; + } + + /** * Returns the constant pool tag at index {@code index}. * * @param index constant pool index @@ -254,12 +276,14 @@ @Override public Object lookupAppendix(int cpi, int opcode) { assert Bytecodes.isInvoke(opcode); - return runtime().getCompilerToVM().lookupAppendixInPool(metaspaceConstantPool, cpi, (byte) opcode); + final int index = toConstantPoolIndex(cpi, opcode); + return runtime().getCompilerToVM().lookupAppendixInPool(metaspaceConstantPool, index); } @Override public JavaMethod lookupMethod(int cpi, int opcode) { - return runtime().getCompilerToVM().lookupMethodInPool(metaspaceConstantPool, cpi, (byte) opcode); + final int index = toConstantPoolIndex(cpi, opcode); + return runtime().getCompilerToVM().lookupMethodInPool(metaspaceConstantPool, index, (byte) opcode); } @Override @@ -269,11 +293,19 @@ @Override public JavaField lookupField(int cpi, int opcode) { - return runtime().getCompilerToVM().lookupFieldInPool(metaspaceConstantPool, cpi, (byte) opcode); + final int index = toConstantPoolIndex(cpi, opcode); + return runtime().getCompilerToVM().lookupFieldInPool(metaspaceConstantPool, index, (byte) opcode); } @Override public void loadReferencedType(int cpi, int opcode) { - runtime().getCompilerToVM().lookupReferencedTypeInPool(metaspaceConstantPool, cpi, (byte) opcode); + int index; + if (opcode != Bytecodes.CHECKCAST && opcode != Bytecodes.INSTANCEOF && opcode != Bytecodes.NEW && opcode != Bytecodes.ANEWARRAY && opcode != Bytecodes.MULTIANEWARRAY && + opcode != Bytecodes.LDC && opcode != Bytecodes.LDC_W && opcode != Bytecodes.LDC2_W) { + index = toConstantPoolIndex(cpi, opcode); + } else { + index = cpi; + } + runtime().getCompilerToVM().lookupReferencedTypeInPool(metaspaceConstantPool, index, (byte) opcode); } } diff -r e85575f63b60 -r 361acb279104 src/share/vm/graal/graalCompiler.hpp --- a/src/share/vm/graal/graalCompiler.hpp Tue Mar 04 20:07:03 2014 -0800 +++ b/src/share/vm/graal/graalCompiler.hpp Tue Mar 04 22:23:24 2014 -0800 @@ -78,26 +78,6 @@ static BasicType kindToBasicType(jchar ch); - static int to_cp_index_u2(int index) { - // Tag. - return index + ConstantPool::CPCACHE_INDEX_TAG; - } - - static int to_cp_index(int raw_index, Bytecodes::Code bc) { - int cp_index; - if (bc == Bytecodes::_invokedynamic) { - cp_index = raw_index; - assert(ConstantPool::is_invokedynamic_index(cp_index), "not an invokedynamic constant pool index"); - } else { - assert(bc == Bytecodes::_getfield || bc == Bytecodes::_putfield || - bc == Bytecodes::_getstatic || bc == Bytecodes::_putstatic || - bc == Bytecodes::_invokeinterface || bc == Bytecodes::_invokevirtual || - bc == Bytecodes::_invokespecial || bc == Bytecodes::_invokestatic, err_msg("unexpected invoke opcode: %d %s", bc, Bytecodes::name(bc))); - cp_index = to_cp_index_u2(raw_index); - } - return cp_index; - } - static BufferBlob* initialize_buffer_blob(); }; diff -r e85575f63b60 -r 361acb279104 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Tue Mar 04 20:07:03 2014 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Mar 04 22:23:24 2014 -0800 @@ -257,9 +257,7 @@ return JNIHandles::make_local(THREAD, result); C2V_END -C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv *env, jobject, jlong metaspace_constant_pool, jint index, jbyte opcode)) - Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); - index = GraalCompiler::to_cp_index(index, bc); +C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv *env, jobject, jlong metaspace_constant_pool, jint index)) constantPoolHandle cp = (ConstantPool*) metaspace_constant_pool; oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index); return JNIHandles::make_local(THREAD, appendix_oop); @@ -270,19 +268,18 @@ instanceKlassHandle pool_holder(cp->pool_holder()); Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); - int cp_index = GraalCompiler::to_cp_index(index, bc); - methodHandle method = GraalEnv::get_method_by_index(cp, cp_index, bc, pool_holder); + methodHandle method = GraalEnv::get_method_by_index(cp, index, bc, pool_holder); if (!method.is_null()) { Handle holder = VMToCompiler::createResolvedJavaType(method->method_holder()->java_mirror(), CHECK_NULL); return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD)); } else { // Get the method's name and signature. - Handle name = java_lang_String::create_from_symbol(cp->name_ref_at(cp_index), CHECK_NULL); - Handle signature = java_lang_String::create_from_symbol(cp->signature_ref_at(cp_index), CHECK_NULL); + Handle name = java_lang_String::create_from_symbol(cp->name_ref_at(index), CHECK_NULL); + Handle signature = java_lang_String::create_from_symbol(cp->signature_ref_at(index), CHECK_NULL); Handle type; if (bc != Bytecodes::_invokedynamic) { - int holder_index = cp->klass_ref_index_at(cp_index); + int holder_index = cp->klass_ref_index_at(index); type = GraalCompiler::get_JavaType(cp, holder_index, cp->pool_holder(), CHECK_NULL); } else { type = Handle(SystemDictionary::MethodHandle_klass()->java_mirror()); @@ -303,7 +300,7 @@ if (bc != Bytecodes::_checkcast && bc != Bytecodes::_instanceof && bc != Bytecodes::_new && bc != Bytecodes::_anewarray && bc != Bytecodes::_multianewarray && bc != Bytecodes::_ldc && bc != Bytecodes::_ldc_w && bc != Bytecodes::_ldc2_w) { - index = cp->remap_instruction_operand_from_cache(GraalCompiler::to_cp_index(index, bc)); + index = cp->remap_instruction_operand_from_cache(index); } constantTag tag = cp->tag_at(index); if (tag.is_field_or_method()) { @@ -322,15 +319,14 @@ C2V_VMENTRY(jobject, lookupFieldInPool, (JNIEnv *env, jobject, jlong metaspace_constant_pool, jint index, jbyte opcode)) ResourceMark rm; - int cp_index = GraalCompiler::to_cp_index_u2(index); constantPoolHandle cp = (ConstantPool*) metaspace_constant_pool; - int nt_index = cp->name_and_type_ref_index_at(cp_index); + int nt_index = cp->name_and_type_ref_index_at(index); int sig_index = cp->signature_ref_index_at(nt_index); Symbol* signature = cp->symbol_at(sig_index); int name_index = cp->name_ref_index_at(nt_index); Symbol* name = cp->symbol_at(name_index); - int holder_index = cp->klass_ref_index_at(cp_index); + int holder_index = cp->klass_ref_index_at(index); Handle holder = GraalCompiler::get_JavaType(cp, holder_index, cp->pool_holder(), CHECK_NULL); instanceKlassHandle holder_klass; @@ -339,7 +335,7 @@ AccessFlags flags; if (holder->klass() == SystemDictionary::HotSpotResolvedObjectType_klass()) { fieldDescriptor result; - LinkResolver::resolve_field_access(result, cp, cp_index, Bytecodes::java_code(code), true, false, Thread::current()); + LinkResolver::resolve_field_access(result, cp, index, Bytecodes::java_code(code), true, false, Thread::current()); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; @@ -869,7 +865,7 @@ {CC"getCompiledCodeSize", CC"("METASPACE_METHOD")I", FN_PTR(getCompiledCodeSize)}, {CC"lookupType", CC"("STRING CLASS"Z)"METASPACE_KLASS, FN_PTR(lookupType)}, {CC"lookupConstantInPool", CC"("METASPACE_CONSTANT_POOL"I)"OBJECT, FN_PTR(lookupConstantInPool)}, - {CC"lookupAppendixInPool", CC"("METASPACE_CONSTANT_POOL"IB)"OBJECT, FN_PTR(lookupAppendixInPool)}, + {CC"lookupAppendixInPool", CC"("METASPACE_CONSTANT_POOL"I)"OBJECT, FN_PTR(lookupAppendixInPool)}, {CC"lookupMethodInPool", CC"("METASPACE_CONSTANT_POOL"IB)"METHOD, FN_PTR(lookupMethodInPool)}, {CC"lookupTypeInPool", CC"("METASPACE_CONSTANT_POOL"I)"TYPE, FN_PTR(lookupTypeInPool)}, {CC"lookupReferencedTypeInPool", CC"("METASPACE_CONSTANT_POOL"IB)V", FN_PTR(lookupReferencedTypeInPool)}, diff -r e85575f63b60 -r 361acb279104 src/share/vm/runtime/vmStructs.cpp --- a/src/share/vm/runtime/vmStructs.cpp Tue Mar 04 20:07:03 2014 -0800 +++ b/src/share/vm/runtime/vmStructs.cpp Tue Mar 04 22:23:24 2014 -0800 @@ -2494,13 +2494,14 @@ \ declare_constant(Symbol::max_symbol_length) \ \ - /*************************************************/ \ - /* ConstantPool* layout enum for InvokeDynamic */ \ - /*************************************************/ \ + /***********************************************/ \ + /* ConstantPool* layout enum for InvokeDynamic */ \ + /***********************************************/ \ \ - declare_constant(ConstantPool::_indy_bsm_offset) \ - declare_constant(ConstantPool::_indy_argc_offset) \ - declare_constant(ConstantPool::_indy_argv_offset) \ + declare_constant(ConstantPool::_indy_bsm_offset) \ + declare_constant(ConstantPool::_indy_argc_offset) \ + declare_constant(ConstantPool::_indy_argv_offset) \ + declare_constant(ConstantPool::CPCACHE_INDEX_TAG) \ \ /********************************/ \ /* ConstantPoolCacheEntry enums */ \