# HG changeset patch # User twisti # Date 1386889012 28800 # Node ID dfb7800809232826917faae0e79a1142136eed7d # Parent a63d65b682a8030cb6974a99c42e91084394442a moved most CompilerToVM.getLocalVariableTable to Java diff -r a63d65b682a8 -r dfb780080923 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 Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Thu Dec 12 14:56:52 2013 -0800 @@ -867,12 +867,15 @@ */ @Stable public int extraStackEntries; + @HotSpotVMField(name = "ConstMethod::_constants", type = "ConstantPool*", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodConstantsOffset; + @HotSpotVMField(name = "ConstMethod::_flags", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodFlagsOffset; @HotSpotVMField(name = "ConstMethod::_code_size", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodCodeSizeOffset; @HotSpotVMField(name = "ConstMethod::_name_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodNameIndexOffset; @HotSpotVMField(name = "ConstMethod::_signature_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodSignatureIndexOffset; @HotSpotVMField(name = "ConstMethod::_max_stack", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodMaxStackOffset; @HotSpotVMField(name = "ConstMethod::_max_locals", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int methodMaxLocalsOffset; - @HotSpotVMField(name = "ConstMethod::_constants", type = "ConstantPool*", get = HotSpotVMField.Type.OFFSET) @Stable public int constMethodConstantsOffset; + + @HotSpotVMConstant(name = "ConstMethod::_has_localvariable_table") @Stable public int constMethodHasLocalVariableTable; @HotSpotVMType(name = "ExceptionTableElement", get = HotSpotVMType.Type.SIZE) @Stable public int exceptionTableElementSize; @HotSpotVMField(name = "ExceptionTableElement::start_pc", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int exceptionTableElementStartPcOffset; @@ -880,6 +883,14 @@ @HotSpotVMField(name = "ExceptionTableElement::handler_pc", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int exceptionTableElementHandlerPcOffset; @HotSpotVMField(name = "ExceptionTableElement::catch_type_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int exceptionTableElementCatchTypeIndexOffset; + @HotSpotVMType(name = "LocalVariableTableElement", get = HotSpotVMType.Type.SIZE) @Stable public int localVariableTableElementSize; + @HotSpotVMField(name = "LocalVariableTableElement::start_bci", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementStartBciOffset; + @HotSpotVMField(name = "LocalVariableTableElement::length", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementLengthOffset; + @HotSpotVMField(name = "LocalVariableTableElement::name_cp_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementNameCpIndexOffset; + @HotSpotVMField(name = "LocalVariableTableElement::descriptor_cp_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementDescriptorCpIndexOffset; + @HotSpotVMField(name = "LocalVariableTableElement::signature_cp_index", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementSignatureCpIndexOffset; + @HotSpotVMField(name = "LocalVariableTableElement::slot", type = "u2", get = HotSpotVMField.Type.OFFSET) @Stable public int localVariableTableElementSlotOffset; + @HotSpotVMType(name = "ConstantPool", get = HotSpotVMType.Type.SIZE) @Stable public int constantPoolSize; @HotSpotVMField(name = "ConstantPool::_tags", type = "Array*", get = HotSpotVMField.Type.OFFSET) @Stable public int constantPoolTagsOffset; @HotSpotVMField(name = "ConstantPool::_pool_holder", type = "InstanceKlass*", get = HotSpotVMField.Type.OFFSET) @Stable public int constantPoolHolderOffset; diff -r a63d65b682a8 -r dfb780080923 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 Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Thu Dec 12 14:56:52 2013 -0800 @@ -233,7 +233,9 @@ long[] getLineNumberTable(HotSpotResolvedJavaMethod method); - Local[] getLocalVariableTable(HotSpotResolvedJavaMethod method); + long getLocalVariableTableStart(HotSpotResolvedJavaMethod method); + + int getLocalVariableTableLength(HotSpotResolvedJavaMethod method); String getFileName(HotSpotResolvedJavaType method); diff -r a63d65b682a8 -r dfb780080923 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 Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Thu Dec 12 14:56:52 2013 -0800 @@ -123,7 +123,10 @@ public native long[] getLineNumberTable(HotSpotResolvedJavaMethod method); @Override - public native Local[] getLocalVariableTable(HotSpotResolvedJavaMethod method); + public native long getLocalVariableTableStart(HotSpotResolvedJavaMethod method); + + @Override + public native int getLocalVariableTableLength(HotSpotResolvedJavaMethod method); @Override public native String getFileName(HotSpotResolvedJavaType method); diff -r a63d65b682a8 -r dfb780080923 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompiler.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompiler.java Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompiler.java Thu Dec 12 14:56:52 2013 -0800 @@ -26,8 +26,6 @@ import java.io.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.hotspot.debug.*; -import com.oracle.graal.hotspot.meta.*; /** * Calls from HotSpot into Java. @@ -72,6 +70,4 @@ * type */ ResolvedJavaType createResolvedJavaType(long metaspaceKlass, String name, String simpleName, Class javaMirror, int sizeOrSpecies); - - LocalImpl createLocalImpl(String name, String type, HotSpotResolvedObjectType holder, int bciStart, int bciEnd, int slot); } diff -r a63d65b682a8 -r dfb780080923 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Thu Dec 12 14:56:52 2013 -0800 @@ -652,11 +652,6 @@ return type; } - @Override - public LocalImpl createLocalImpl(String name, String type, HotSpotResolvedObjectType holder, int bciStart, int bciEnd, int slot) { - return new LocalImpl(name, type, holder, bciStart, bciEnd, slot); - } - public PhasePlan createPhasePlan(HotSpotProviders providers, OptimisticOptimizations optimisticOpts, boolean onStackReplacement) { PhasePlan phasePlan = new PhasePlan(); MetaAccessProvider metaAccess = providers.getMetaAccess(); diff -r a63d65b682a8 -r dfb780080923 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/LocalImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/LocalImpl.java Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/LocalImpl.java Thu Dec 12 14:56:52 2013 -0800 @@ -30,15 +30,15 @@ public class LocalImpl implements Local { private final String name; - private final int bciStart; - private final int bciEnd; + private final int startBci; + private final int endBci; private final int slot; private final ResolvedJavaType resolvedType; - public LocalImpl(String name, String type, HotSpotResolvedObjectType holder, int bciStart, int bciEnd, int slot) { + public LocalImpl(String name, String type, HotSpotResolvedObjectType holder, int startBci, int endBci, int slot) { this.name = name; - this.bciStart = bciStart; - this.bciEnd = bciEnd; + this.startBci = startBci; + this.endBci = endBci; this.slot = slot; JavaType t = runtime().lookupType(type, holder, true); if (t instanceof ResolvedJavaType) { @@ -50,12 +50,12 @@ @Override public int getStartBCI() { - return bciStart; + return startBci; } @Override public int getEndBCI() { - return bciEnd; + return endBci; } @Override @@ -72,4 +72,23 @@ public int getSlot() { return slot; } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof LocalImpl)) { + return false; + } + LocalImpl that = (LocalImpl) obj; + return this.name.equals(that.name) && this.startBci == that.startBci && this.endBci == that.endBci && this.slot == that.slot && this.resolvedType.equals(that.resolvedType); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + return "LocalImpl"; + } } diff -r a63d65b682a8 -r dfb780080923 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Wed Dec 11 20:42:50 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Thu Dec 12 14:56:52 2013 -0800 @@ -131,6 +131,15 @@ return unsafe.getAddress(metaspaceMethod + runtime().getConfig().methodConstMethodOffset); } + /** + * Returns this method's constant method flags ({@code ConstMethod::_flags}). + * + * @return flags of this method's ConstMethod + */ + private long getConstMethodFlags() { + return unsafe.getChar(getConstMethod() + runtime().getConfig().constMethodFlagsOffset); + } + @Override public ResolvedJavaType getDeclaringClass() { return holder; @@ -512,12 +521,42 @@ return new LineNumberTableImpl(line, bci); } + /** + * Returns whether or not this method has a local variable table. + * + * @return true if this method has a local variable table + */ + private boolean hasLocalVariableTable() { + return (getConstMethodFlags() & runtime().getConfig().constMethodHasLocalVariableTable) != 0; + } + @Override public LocalVariableTable getLocalVariableTable() { - Local[] locals = runtime().getCompilerToVM().getLocalVariableTable(this); - if (locals == null) { + if (!hasLocalVariableTable()) { return null; } + + HotSpotVMConfig config = runtime().getConfig(); + long localVariableTableElement = runtime().getCompilerToVM().getLocalVariableTableStart(this); + final int localVariableTableLength = runtime().getCompilerToVM().getLocalVariableTableLength(this); + Local[] locals = new Local[localVariableTableLength]; + + for (int i = 0; i < localVariableTableLength; i++) { + final int startBci = unsafe.getChar(localVariableTableElement + config.localVariableTableElementStartBciOffset); + final int endBci = startBci + unsafe.getChar(localVariableTableElement + config.localVariableTableElementLengthOffset); + final int nameCpIndex = unsafe.getChar(localVariableTableElement + config.localVariableTableElementNameCpIndexOffset); + final int typeCpIndex = unsafe.getChar(localVariableTableElement + config.localVariableTableElementDescriptorCpIndexOffset); + final int slot = unsafe.getChar(localVariableTableElement + config.localVariableTableElementSlotOffset); + + String localName = getConstantPool().lookupUtf8(nameCpIndex); + String localType = getConstantPool().lookupUtf8(typeCpIndex); + + locals[i] = new LocalImpl(localName, localType, holder, startBci, endBci, slot); + + // Go to the next LocalVariableTableElement + localVariableTableElement += config.localVariableTableElementSize; + } + return new LocalVariableTableImpl(locals); } @@ -541,6 +580,11 @@ return getVtableIndex() >= 0; } + /** + * Returns this method's virtual table index. + * + * @return virtual table index + */ private int getVtableIndex() { HotSpotVMConfig config = runtime().getConfig(); return unsafe.getInt(metaspaceMethod + config.methodVtableIndexOffset); diff -r a63d65b682a8 -r dfb780080923 src/share/vm/classfile/systemDictionary.hpp --- a/src/share/vm/classfile/systemDictionary.hpp Wed Dec 11 20:42:50 2013 -0800 +++ b/src/share/vm/classfile/systemDictionary.hpp Thu Dec 12 14:56:52 2013 -0800 @@ -200,7 +200,6 @@ do_klass(HotSpotResolvedJavaMethod_klass, com_oracle_graal_hotspot_meta_HotSpotResolvedJavaMethod, Opt) \ do_klass(HotSpotResolvedObjectType_klass, com_oracle_graal_hotspot_meta_HotSpotResolvedObjectType, Opt) \ do_klass(HotSpotMonitorValue_klass, com_oracle_graal_hotspot_meta_HotSpotMonitorValue, Opt) \ - do_klass(LocalImpl_klass, com_oracle_graal_hotspot_debug_LocalImpl, Opt) \ do_klass(CompilerThread_klass, com_oracle_graal_hotspot_CompilerThread, Opt) \ /* graal.api.code */ \ do_klass(Assumptions_klass, com_oracle_graal_api_code_Assumptions, Opt) \ diff -r a63d65b682a8 -r dfb780080923 src/share/vm/classfile/vmSymbols.hpp --- a/src/share/vm/classfile/vmSymbols.hpp Wed Dec 11 20:42:50 2013 -0800 +++ b/src/share/vm/classfile/vmSymbols.hpp Thu Dec 12 14:56:52 2013 -0800 @@ -312,7 +312,6 @@ template(com_oracle_graal_hotspot_meta_HotSpotResolvedJavaMethod, "com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod") \ template(com_oracle_graal_hotspot_meta_HotSpotResolvedObjectType, "com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType") \ template(com_oracle_graal_hotspot_meta_HotSpotMonitorValue, "com/oracle/graal/hotspot/meta/HotSpotMonitorValue") \ - template(com_oracle_graal_hotspot_debug_LocalImpl, "com/oracle/graal/hotspot/debug/LocalImpl") \ template(com_oracle_graal_hotspot_CompilerThread, "com/oracle/graal/hotspot/CompilerThread") \ /* graal.api.meta */ \ template(com_oracle_graal_api_meta_Constant, "com/oracle/graal/api/meta/Constant") \ @@ -373,8 +372,6 @@ template(createResolvedJavaType_signature, "(JLjava/lang/String;Ljava/lang/String;Ljava/lang/Class;I)Lcom/oracle/graal/api/meta/ResolvedJavaType;") \ template(createPrimitiveJavaType_name, "createPrimitiveJavaType") \ template(createPrimitiveJavaType_signature, "(I)Lcom/oracle/graal/api/meta/JavaType;") \ - template(createLocalImpl_name, "createLocalImpl") \ - template(createLocalImpl_signature, "(Ljava/lang/String;Ljava/lang/String;Lcom/oracle/graal/hotspot/meta/HotSpotResolvedObjectType;III)Lcom/oracle/graal/hotspot/debug/LocalImpl;") \ template(getVMToCompiler_name, "getVMToCompiler") \ template(getVMToCompiler_signature, "()Lcom/oracle/graal/hotspot/bridge/VMToCompiler;") \ template(runtime_name, "runtime") \ diff -r a63d65b682a8 -r dfb780080923 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Dec 11 20:42:50 2013 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Thu Dec 12 14:56:52 2013 -0800 @@ -784,38 +784,20 @@ return result; C2V_END -C2V_VMENTRY(jobject, getLocalVariableTable, (JNIEnv *, jobject, jobject hotspot_method)) +C2V_VMENTRY(jlong, getLocalVariableTableStart, (JNIEnv *, jobject, jobject hotspot_method)) ResourceMark rm; - Method* method = getMethodFromHotSpotMethod(JNIHandles::resolve(hotspot_method)); if (!method->has_localvariable_table()) { - return NULL; + return 0; } - int localvariable_table_length = method->localvariable_table_length(); - - objArrayHandle local_array = oopFactory::new_objArray(SystemDictionary::LocalImpl_klass(), localvariable_table_length, CHECK_NULL); - LocalVariableTableElement* table = method->localvariable_table_start(); - for (int i = 0; i < localvariable_table_length; i++) { - u2 start_bci = table[i].start_bci; - u4 end_bci = (u4)(start_bci + table[i].length); - u2 nameCPIdx = table[i].name_cp_index; - u2 typeCPIdx = table[i].descriptor_cp_index; - u2 slot = table[i].slot; - - char* name = method->constants()->symbol_at(nameCPIdx)->as_C_string(); - Handle nameHandle = java_lang_String::create_from_str(name, CHECK_NULL); - - char* typeInfo = method->constants()->symbol_at(typeCPIdx)->as_C_string(); - Handle typeHandle = java_lang_String::create_from_str(typeInfo, CHECK_NULL); - - Handle holderHandle = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0); - Handle local = VMToCompiler::createLocal(nameHandle, typeHandle, (int) start_bci, (int) end_bci, (int) slot, holderHandle, Thread::current()); - local_array->obj_at_put(i, local()); - } - - return JNIHandles::make_local(local_array()); + return (jlong) (address) method->localvariable_table_start(); C2V_END +C2V_VMENTRY(jint, getLocalVariableTableLength, (JNIEnv *, jobject, jobject hotspot_method)) + ResourceMark rm; + Method* method = getMethodFromHotSpotMethod(JNIHandles::resolve(hotspot_method)); + return method->localvariable_table_length(); +C2V_END C2V_VMENTRY(void, reprofile, (JNIEnv *env, jobject, jlong metaspace_method)) Method* method = asMethod(metaspace_method); @@ -882,7 +864,6 @@ #define CONSTANT_POOL "Lcom/oracle/graal/api/meta/ConstantPool;" #define CONSTANT "Lcom/oracle/graal/api/meta/Constant;" #define KIND "Lcom/oracle/graal/api/meta/Kind;" -#define LOCAL "Lcom/oracle/graal/api/meta/Local;" #define RUNTIME_CALL "Lcom/oracle/graal/api/code/RuntimeCall;" #define REFLECT_METHOD "Ljava/lang/reflect/Method;" #define REFLECT_CONSTRUCTOR "Ljava/lang/reflect/Constructor;" @@ -932,7 +913,8 @@ {CC"executeCompiledMethodVarargs", CC"(["OBJECT HS_INSTALLED_CODE")"OBJECT, FN_PTR(executeCompiledMethodVarargs)}, {CC"getDeoptedLeafGraphIds", CC"()[J", FN_PTR(getDeoptedLeafGraphIds)}, {CC"getLineNumberTable", CC"("HS_RESOLVED_METHOD")[J", FN_PTR(getLineNumberTable)}, - {CC"getLocalVariableTable", CC"("HS_RESOLVED_METHOD")["LOCAL, FN_PTR(getLocalVariableTable)}, + {CC"getLocalVariableTableStart", CC"("HS_RESOLVED_METHOD")J", FN_PTR(getLocalVariableTableStart)}, + {CC"getLocalVariableTableLength", CC"("HS_RESOLVED_METHOD")I", FN_PTR(getLocalVariableTableLength)}, {CC"reprofile", CC"("METASPACE_METHOD")V", FN_PTR(reprofile)}, {CC"invalidateInstalledCode", CC"("HS_INSTALLED_CODE")V", FN_PTR(invalidateInstalledCode)}, {CC"readUnsafeUncompressedPointer", CC"("OBJECT"J)"OBJECT, FN_PTR(readUnsafeUncompressedPointer)}, diff -r a63d65b682a8 -r dfb780080923 src/share/vm/graal/graalVMToCompiler.cpp --- a/src/share/vm/graal/graalVMToCompiler.cpp Wed Dec 11 20:42:50 2013 -0800 +++ b/src/share/vm/graal/graalVMToCompiler.cpp Thu Dec 12 14:56:52 2013 -0800 @@ -254,21 +254,3 @@ check_pending_exception("Error while calling createResolvedJavaType"); return (oop) result.get_jobject(); } - -oop VMToCompiler::createLocal(Handle name, Handle typeInfo, int bci_start, int bci_end, int slot, Handle holder, TRAPS) { - JavaValue result(T_OBJECT); - JavaCallArguments args; - args.push_oop(instance()); - args.push_oop(name); - args.push_oop(typeInfo); - args.push_oop(holder); - args.push_int(bci_start); - args.push_int(bci_end); - args.push_int(slot); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::createLocalImpl_name(), vmSymbols::createLocalImpl_signature(), &args, THREAD); - check_pending_exception("Error while calling createConstantFloat"); - return (oop) result.get_jobject(); - -} - - diff -r a63d65b682a8 -r dfb780080923 src/share/vm/graal/graalVMToCompiler.hpp --- a/src/share/vm/graal/graalVMToCompiler.hpp Wed Dec 11 20:42:50 2013 -0800 +++ b/src/share/vm/graal/graalVMToCompiler.hpp Thu Dec 12 14:56:52 2013 -0800 @@ -92,21 +92,6 @@ // public abstract JavaType createPrimitiveJavaType(int basicType); static oop createPrimitiveJavaType(int basicType, TRAPS); - - // public abstract Constant createConstant(Kind kind, long value); - static oop createConstant(Handle kind, jlong value, TRAPS); - - // public abstract Constant createConstantFloat(float value); - static oop createConstantFloat(jfloat value, TRAPS); - - // public abstract Constant createConstantDouble(double value); - static oop createConstantDouble(jdouble value, TRAPS); - - // public abstract Constant createConstantObject(long vmId); - static oop createConstantObject(Handle object, TRAPS); - - // public abstract Local createLocal(String name, int bci_start, int bci_end); - static oop createLocal(Handle name, Handle type, int bci_start, int bci_end, int slot, Handle holder, TRAPS); }; inline void check_pending_exception(const char* message, bool dump_core = false) {