diff src/share/vm/c1x/c1x_VMEntries.cpp @ 1413:1ecc8f0aad00

Draft implementation of HotSpot CRI / first method compiling without exception.
author Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
date Tue, 18 May 2010 17:43:37 +0200
parents 9195b99c841b
children e1a275dbc8cd
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_VMEntries.cpp	Mon May 17 16:37:23 2010 +0200
+++ b/src/share/vm/c1x/c1x_VMEntries.cpp	Tue May 18 17:43:37 2010 +0200
@@ -25,16 +25,309 @@
 
 # include "incls/_precompiled.incl"
 # include "incls/_c1x_VMEntries.cpp.incl"
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_code
+* Signature: (Ljava/lang/Object;)[B
+*/
+JNIEXPORT jbyteArray JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code(JNIEnv *env, jclass, jobject method) {
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  int code_size = m->code_size();
+  jbyteArray result = env->NewByteArray(code_size);
+  env->SetByteArrayRegion(result, 0, code_size, (const jbyte *)m->code_base());
+  return result;
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_maxStackSize
+* Signature: (Ljava/lang/Object;)I
+*/
+JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize(JNIEnv *, jclass, jobject method) {
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  return m->max_stack();
+}
 
-JNIEXPORT jbyteArray JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code
-(JNIEnv *, jclass, jobject) {
-  tty->print_cr("hello world");
-  return NULL;
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_maxLocals
+* Signature: (Ljava/lang/Object;)I
+*/
+JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals(JNIEnv *, jclass, jobject method) {
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  return m->max_locals();
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_holder
+* Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder(JNIEnv *, jclass, jobject method) {
+  VM_ENTRY_MARK
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  klassOop k = m->method_holder();
+  return JNIHandles::make_local(Thread::current(), C1XCompiler::get_RiType(k));
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_signature
+* Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiSignature;
+*/
+JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature(JNIEnv *env, jclass, jobject method) {
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  return env->NewStringUTF(m->signature()->as_utf8());
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiMethod_name
+* Signature: (Ljava/lang/Object;)Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name(JNIEnv *env, jclass, jobject method) {
+  methodOop m = (methodOop)JNIHandles::resolve(method);
+  return env->NewStringUTF(m->name()->as_utf8());
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiSignature_lookupType
+* Signature: (Ljava/lang/String;Lcom/sun/cri/ri/RiType;)Lcom/sun/cri/ri/RiType;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *, jclass, jstring name, jobject accessor) {
+  VM_ENTRY_MARK
+  klassOop k = (klassOop)JNIHandles::resolve(accessor);
+  oop n = JNIHandles::resolve_external_guard(name);
+  if (n == NULL) {
+    THROW_MSG_(vmSymbols::java_lang_NullPointerException(), "Name must not be null.", NULL);
+  }
+  char* utf8 = java_lang_String::as_utf8_string(n);
+  symbolOop symbol = oopFactory::new_symbol(utf8, java_lang_String::length(n), THREAD);
+  oop result = C1XCompiler::get_RiType(symbol, k);
+  return JNIHandles::make_local(THREAD, result);
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiSignature_symbolToString
+* Signature: (Ljava/lang/Object;)Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1symbolToString(JNIEnv *env, jclass, jobject symbol) {
+  symbolOop s = (symbolOop)JNIHandles::resolve(symbol);
+  return env->NewStringUTF(s->as_utf8());
 }
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiType_javaClass
+* Signature: (Ljava/lang/Object;)Ljava/lang/Class;
+*/
+JNIEXPORT jclass JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass(JNIEnv *, jclass, jobject klass) {
+  klassOop k = (klassOop)JNIHandles::resolve(klass);
+  oop result = k->klass_part()->java_mirror();
+  return (jclass) JNIHandles::make_local(Thread::current(), result);
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiType_name
+* Signature: (Ljava/lang/Object;)Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1name(JNIEnv *env, jclass, jobject klass) {
+  klassOop k = (klassOop)JNIHandles::resolve(klass);
+  return env->NewStringUTF(k->klass_part()->name()->as_utf8());
+}
+
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiConstantPool_lookupConstant
+* Signature: (Ljava/lang/Object;I)Ljava/lang/Object;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant(JNIEnv *env, jclass, jobject cpHandle, jint index) {
+
+  VM_ENTRY_MARK;
+  constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle);
+
+  oop result = NULL;
+  constantTag tag = cp->tag_at(index);
+  if (tag.is_int()) {
+    result = VMExits::createCiConstantInt(cp->int_at(index));
+  } else if (tag.is_long()) {
+    result = VMExits::createCiConstantLong(cp->long_at(index));
+  } else if (tag.is_float()) {
+    result = VMExits::createCiConstantFloat(cp->float_at(index));
+  } else if (tag.is_double()) {
+    result = VMExits::createCiConstantDouble(cp->double_at(index));
+  } else if (tag.is_string() || tag.is_unresolved_string()) {
+    oop string = NULL;
+    if (cp->is_pseudo_string_at(index)) {
+      string = cp->pseudo_string_at(index);
+    } else {
+      string = cp->string_at(index, THREAD);
+      if (HAS_PENDING_EXCEPTION) {
+        CLEAR_PENDING_EXCEPTION;
+        // TODO: Gracefully exit compilation.
+        fatal("out of memory during compilation!");
+        return NULL;
+      }
+    }
+    result = VMExits::createCiConstantObject(string);
+  } else if (tag.is_klass() || tag.is_unresolved_klass()) {
+    
+    // TODO: Return RiType object
+    ShouldNotReachHere();
+    // 4881222: allow ldc to take a class type
+    //bool ignore;
+    //ciKlass* klass = get_klass_by_index_impl(cpool, index, ignore, accessor);
+    //if (HAS_PENDING_EXCEPTION) {
+    //  CLEAR_PENDING_EXCEPTION;
+    //  record_out_of_memory_failure();
+    //  return ciConstant();
+    //}
+    //assert (klass->is_instance_klass() || klass->is_array_klass(),
+    //  "must be an instance or array klass ");
+    //return ciConstant(T_OBJECT, klass);
+  } else if (tag.is_object()) {
+    oop obj = cp->object_at(index);
+    assert(obj->is_instance(), "must be an instance");
+    result = VMExits::createCiConstantObject(obj);
+  } else {
+    ShouldNotReachHere();
+  }
+
+  return JNIHandles::make_local(THREAD, result);
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiConstantPool_lookupMethod
+* Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiMethod;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod(JNIEnv *env, jclass, jobject cpHandle, jint index, jbyte byteCode) {
+  VM_ENTRY_MARK;
+  constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle);
+  Bytecodes::Code bc = (Bytecodes::Code)byteCode;
+  ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder());
+  ciMethod *method = CURRENT_ENV->get_method_by_index(cp, index, bc, loading_klass);
+  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiMethod(method));
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiConstantPool_lookupSignature
+* Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature(JNIEnv *env, jclass, jobject cpHandle, jint index) {
+  fatal("currently unsupported");
+  return NULL;
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiConstantPool_lookupType
+* Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiType;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType(JNIEnv *env, jclass, jobject cpHandle, jint index) {
+  VM_ENTRY_MARK;
+  constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle);
+  ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder());
+  bool is_accessible = false;
+  ciKlass *klass = CURRENT_ENV->get_klass_by_index(cp, index, is_accessible, loading_klass);
+  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiType(klass));
+
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiConstantPool_lookupField
+* Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiField;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField(JNIEnv *env, jclass, jobject cpHandle, jint index) {
+  VM_ENTRY_MARK;
+  constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle);
+  ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder());
+  ciField *field = CURRENT_ENV->get_field_by_index(loading_klass, index);
+  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiField(field));
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    findRiType
+* Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_findRiType(JNIEnv *, jclass, jobject klass) {
+  VM_ENTRY_MARK;
+  klassOop o = (klassOop)JNIHandles::resolve(klass);
+  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiType(o));
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiRuntime_getConstantPool
+* Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool;
+*/
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool(JNIEnv *, jclass, jobject klass) {
+  VM_ENTRY_MARK;
+  klassOop o = (klassOop)JNIHandles::resolve(klass);
+  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiConstantPool(((instanceKlass*)o->klass_part())->constants()));
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiType_isArrayClass
+* Signature: (Ljava/lang/Object;)Z
+*/
+JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass(JNIEnv *, jclass, jobject klass) {
+  klassOop o = (klassOop)JNIHandles::resolve(klass);
+  o->print();
+  bool result = o->klass_part()->oop_is_array();
+  tty->print_cr("result=%d", (int)result);
+  return result;
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiType_isInstanceClass
+* Signature: (Ljava/lang/Object;)Z
+*/
+JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass(JNIEnv *, jclass, jobject klass) {
+  klassOop o = (klassOop)JNIHandles::resolve(klass);
+  return o->klass_part()->oop_is_instanceKlass();
+}
+
+/*
+* Class:     com_sun_hotspot_c1x_VMEntries
+* Method:    RiType_isInterface
+* Signature: (Ljava/lang/Object;)Z
+*/
+JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface(JNIEnv *, jclass, jobject klass) {
+  klassOop o = (klassOop)JNIHandles::resolve(klass);
+  return o->klass_part()->is_interface();
+}
 
 
 JNINativeMethod VMEntries_methods[] = {
-  {CC"RiMethod_code",            CC"(Ljava/lang/Object;)[B",                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code)}
+  {CC"RiMethod_code",                   CC"(Ljava/lang/Object;)[B",                                                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code)},
+  {CC"RiMethod_maxStackSize",           CC"(Ljava/lang/Object;)I",                                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize)},
+  {CC"RiMethod_maxLocals",              CC"(Ljava/lang/Object;)I",                                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals)},
+  {CC"RiMethod_holder",                 CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;",                            FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder)},
+  {CC"RiMethod_signature",              CC"(Ljava/lang/Object;)Ljava/lang/String;",                                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature)},
+  {CC"RiMethod_name",                   CC"(Ljava/lang/Object;)Ljava/lang/String;",                                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name)},
+  {CC"RiSignature_lookupType",          CC"(Ljava/lang/String;Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;",          FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)},
+  {CC"RiType_javaClass",                CC"(Ljava/lang/Object;)Ljava/lang/Class;",                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass)},
+  {CC"RiType_name",                     CC"(Ljava/lang/Object;)Ljava/lang/String;",                                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1name)},
+  {CC"RiConstantPool_lookupConstant",   CC"(Ljava/lang/Object;I)Ljava/lang/Object;",                                FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)},
+  {CC"RiConstantPool_lookupMethod",     CC"(Ljava/lang/Object;IB)Lcom/sun/cri/ri/RiMethod;",                        FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)},
+  {CC"RiConstantPool_lookupSignature",  CC"(Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature;",                      FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature)},
+  {CC"RiConstantPool_lookupType",       CC"(Ljava/lang/Object;I)Lcom/sun/cri/ri/RiType;",                           FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType)},
+  {CC"RiConstantPool_lookupField",      CC"(Ljava/lang/Object;I)Lcom/sun/cri/ri/RiField;",                          FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField)},
+  {CC"RiRuntime_getConstantPool",       CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool;",                    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool)},
+  {CC"RiType_isArrayClass",             CC"(Ljava/lang/Object;)Z",                                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass)},
+  {CC"RiType_isInstanceClass",          CC"(Ljava/lang/Object;)Z",                                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass)},
+  {CC"RiType_isInterface",              CC"(Ljava/lang/Object;)Z",                                                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface)}
 };
 
 int VMEntries_methods_count() {