diff src/share/vm/graal/graalCompiler.cpp @ 6948:e522a00b91aa

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
author Doug Simon <doug.simon@oracle.com>
date Mon, 12 Nov 2012 23:14:12 +0100
parents d79098b9db3b
children 41938af2b3d8
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompiler.cpp	Mon Nov 12 18:11:17 2012 +0100
+++ b/src/share/vm/graal/graalCompiler.cpp	Mon Nov 12 23:14:12 2012 +0100
@@ -31,7 +31,6 @@
 #include "graal/graalVmIds.hpp"
 #include "graal/graalEnv.hpp"
 #include "c1/c1_Runtime1.hpp"
-#include "compiler/compilerOracle.hpp"
 #include "runtime/arguments.hpp"
 #include "runtime/compilationPolicy.hpp"
 
@@ -159,13 +158,14 @@
     method->backedge_counter()->reset();
     return;
   }
+
   assert(_initialized, "must already be initialized");
   ResourceMark rm;
   ciEnv* current_env = JavaThread::current()->env();
   JavaThread::current()->set_env(NULL);
   JavaThread::current()->set_compiling(true);
-  Handle hotspot_method = GraalCompiler::createHotSpotResolvedJavaMethod(method, CHECK);
-  jboolean success = VMToCompiler::compileMethod(hotspot_method, entry_bci, blocking, method->graal_priority());
+  Handle holder = GraalCompiler::createHotSpotResolvedJavaType(method, CHECK);
+  jboolean success = VMToCompiler::compileMethod(method(), holder, entry_bci, blocking, method->graal_priority());
   JavaThread::current()->set_compiling(false);
   JavaThread::current()->set_env(current_env);
   if (success != JNI_TRUE) {
@@ -191,12 +191,11 @@
 }
 
 Handle GraalCompiler::get_JavaType(Symbol* klass_name, TRAPS) {
-   return VMToCompiler::createJavaType(VmIds::toString<Handle>(klass_name, THREAD), THREAD);
+   return VMToCompiler::createUnresolvedJavaType(VmIds::toString<Handle>(klass_name, THREAD), THREAD);
 }
 
-Handle GraalCompiler::get_JavaTypeFromSignature(constantPoolHandle cp, int index, KlassHandle loading_klass, TRAPS) {
+Handle GraalCompiler::get_JavaTypeFromSignature(Symbol* signature, KlassHandle loading_klass, TRAPS) {
   
-  Symbol* signature = cp->symbol_at(index);
   BasicType field_type = FieldType::basic_type(signature);
   // If the field is a pointer type, get the klass of the
   // field.
@@ -218,21 +217,23 @@
   KlassHandle klass = GraalEnv::get_klass_by_index(cp, index, is_accessible, loading_klass);
   oop catch_class = NULL;
   if (klass.is_null()) {
-    // We have to lock the cpool to keep the oop from being resolved
-    // while we are accessing it.
-    ObjectLocker ol(cp, THREAD);
-
     Symbol* klass_name = NULL;
-    constantTag tag = cp->tag_at(index);
-    if (tag.is_klass()) {
-      // The klass has been inserted into the constant pool
-      // very recently.
-      return GraalCompiler::get_JavaType(cp->resolved_klass_at(index), CHECK_NULL);
-    } else if (tag.is_symbol()) {
-      klass_name = cp->symbol_at(index);
-    } else {
-      assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag");
-      klass_name = cp->unresolved_klass_at(index);
+    {
+      // We have to lock the cpool to keep the oop from being resolved
+      // while we are accessing it. But we must release the lock before
+      // calling up into Java.
+      MonitorLockerEx ml(cp->lock());
+      constantTag tag = cp->tag_at(index);
+      if (tag.is_klass()) {
+        // The klass has been inserted into the constant pool
+        // very recently.
+        return GraalCompiler::get_JavaType(cp->resolved_klass_at(index), CHECK_NULL);
+      } else if (tag.is_symbol()) {
+        klass_name = cp->symbol_at(index);
+      } else {
+        assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag");
+        klass_name = cp->unresolved_klass_at(index);
+      }
     }
     return GraalCompiler::get_JavaType(klass_name, CHECK_NULL);
   } else {
@@ -245,7 +246,7 @@
     BasicType basicType = java_lang_Class::primitive_type(javaClassHandle());
     return VMToCompiler::createPrimitiveJavaType((int) basicType, THREAD);
   } else {
-    KlassHandle klass = java_lang_Class::as_klassOop(javaClassHandle());
+    KlassHandle klass = java_lang_Class::as_Klass(javaClassHandle());
     Handle name = java_lang_String::create_from_symbol(klass->name(), CHECK_NULL);
     return GraalCompiler::createHotSpotResolvedJavaType(klass, name, CHECK_NULL);
   }
@@ -258,103 +259,52 @@
 
 Handle GraalCompiler::get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, TRAPS) {
   Handle name = VmIds::toString<Handle>(field_name, CHECK_NULL);
-  return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, CHECK_NULL);
+  return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, false, CHECK_NULL);
+}
+
+Handle GraalCompiler::createHotSpotResolvedJavaType(methodHandle method, TRAPS) {
+  KlassHandle klass = method->method_holder();
+  oop java_class = klass->java_mirror();
+  oop graal_mirror = java_lang_Class::graal_mirror(java_class);
+  if (graal_mirror != NULL) {
+    assert(graal_mirror->is_a(HotSpotResolvedJavaType::klass()), "unexpected class...");
+    return graal_mirror;
+  }
+  Handle name = java_lang_String::create_from_symbol(klass->name(), CHECK_NULL);
+  return GraalCompiler::createHotSpotResolvedJavaType(klass, name, CHECK_NULL);
 }
 
 Handle GraalCompiler::createHotSpotResolvedJavaType(KlassHandle klass, Handle name, TRAPS) {
-  ObjectLocker ol(klass, THREAD);
-
-  if (klass->graal_mirror() != NULL) {
-    return klass->graal_mirror();
+  oop java_class = klass->java_mirror();
+  oop graal_mirror = java_lang_Class::graal_mirror(java_class);
+  if (graal_mirror != NULL) {
+    assert(graal_mirror->is_a(HotSpotResolvedJavaType::klass()), "unexpected class...");
+    return graal_mirror;
   }
 
-  instanceKlass::cast(HotSpotResolvedJavaType::klass())->initialize(CHECK_NULL);
-  Handle obj = instanceKlass::cast(HotSpotResolvedJavaType::klass())->allocate_instance(CHECK_NULL);
-  assert(obj() != NULL, "must succeed in allocating instance");
-
+  Handle simpleName = name;
   if (klass->oop_is_instance()) {
     ResourceMark rm;
-    instanceKlass* ik = (instanceKlass*)klass()->klass_part();
-    Handle full_name = java_lang_String::create_from_str(ik->signature_name(), CHECK_NULL);
-    HotSpotJavaType::set_name(obj, full_name());
-  } else {
-    HotSpotJavaType::set_name(obj, name());
-  }
-
-  HotSpotResolvedJavaType::set_javaMirror(obj, klass->java_mirror());
-  HotSpotResolvedJavaType::set_simpleName(obj, name());
-  HotSpotResolvedJavaType::set_accessFlags(obj, klass->access_flags().as_int());
-  HotSpotResolvedJavaType::set_isInterface(obj, klass->is_interface());
-  HotSpotResolvedJavaType::set_superCheckOffset(obj, klass->super_check_offset());
-  HotSpotResolvedJavaType::set_isInstanceClass(obj, klass->oop_is_instance() && !klass->is_interface());
-
-  if (klass->oop_is_javaArray()) {
-    HotSpotResolvedJavaType::set_isArrayClass(obj, true);
-  } else {
-    int size = instanceKlass::cast(klass())->size_helper() * HeapWordSize;
-    if (!instanceKlass::cast(klass())->can_be_fastpath_allocated()) {
-      size = -size;
-    }
-    HotSpotResolvedJavaType::set_isArrayClass(obj, false);
-    HotSpotResolvedJavaType::set_instanceSize(obj, size);
-    HotSpotResolvedJavaType::set_hasFinalizer(obj, klass->has_finalizer());
+    InstanceKlass* ik = (InstanceKlass*) klass();
+    name = java_lang_String::create_from_str(ik->signature_name(), CHECK_NULL);
   }
 
-  // TODO replace these with correct values
-  HotSpotResolvedJavaType::set_hasFinalizableSubclass(obj, false);
-
-  klass->set_graal_mirror(obj());
-
-  return obj;
-}
-
-Handle GraalCompiler::createHotSpotResolvedJavaMethod(methodHandle method, TRAPS) {
-  if (method->graal_mirror() != NULL) {
-    assert(method->graal_mirror()->is_a(HotSpotResolvedJavaMethod::klass()), "unexpected class...");
-    return method->graal_mirror();
-  }
-  Handle name = VmIds::toString<Handle>(method->name(), CHECK_NULL);
-
-  instanceKlass::cast(HotSpotResolvedJavaMethod::klass())->initialize(CHECK_NULL);
-  Handle obj = instanceKlass::cast(HotSpotResolvedJavaMethod::klass())->allocate_instance(CHECK_NULL);
-  assert(obj() != NULL, "must succeed in allocating instance");
+  // TODO replace this with the correct value
+  bool hasFinalizableSubclass = false;
 
-  // (thomaswue) Cannot use reflection here, because the compiler thread could dead lock with the running application.
-  // oop reflected = getReflectedMethod(method(), CHECK_NULL);
-  HotSpotResolvedJavaMethod::set_javaMirror(obj, method());
-  HotSpotResolvedJavaMethod::set_name(obj, name());
-  
-  KlassHandle klass = method->method_holder();
-  Handle holder_name = VmIds::toString<Handle>(klass->name(), CHECK_NULL);
-  Handle holder = GraalCompiler::createHotSpotResolvedJavaType(klass, holder_name, CHECK_NULL);
-  HotSpotResolvedJavaMethod::set_holder(obj, holder());
-  
-  HotSpotResolvedJavaMethod::set_codeSize(obj, method->code_size());
-  HotSpotResolvedJavaMethod::set_accessFlags(obj, method->access_flags().as_int());
-  HotSpotResolvedJavaMethod::set_maxLocals(obj, method->max_locals());
-  HotSpotResolvedJavaMethod::set_maxStackSize(obj, method->max_stack());
-  HotSpotResolvedJavaMethod::set_canBeInlined(obj, !method->is_not_compilable() && !CompilerOracle::should_not_inline(method));
-  
-  method->set_graal_mirror(obj());
-  return obj;
-}
-
-Handle GraalCompiler::createHotSpotMethodData(methodDataHandle method_data, TRAPS) {
-  if(method_data->graal_mirror() != NULL) {
-    assert(method_data->graal_mirror()->is_a(HotSpotMethodData::klass()), "unexpected class");
-    return method_data->graal_mirror();
+  int sizeOrSpecies;
+  if (klass->is_interface()) {
+    sizeOrSpecies = (int) 0x80000000; // see HotSpotResolvedJavaType.INTERFACE_SPECIES_VALUE
+  } else if (klass->oop_is_array()) {
+    sizeOrSpecies = (int) 0x7fffffff; // see HotSpotResolvedJavaType.ARRAY_SPECIES_VALUE
+  } else {
+    sizeOrSpecies = InstanceKlass::cast(klass())->size_helper() * HeapWordSize;
+    if (!InstanceKlass::cast(klass())->can_be_fastpath_allocated()) {
+      sizeOrSpecies = -sizeOrSpecies;
+    }
   }
 
-  instanceKlass::cast(HotSpotMethodData::klass())->initialize(CHECK_NULL);
-  Handle obj = instanceKlass::cast(HotSpotMethodData::klass())->allocate_instance(CHECK_NULL);
-  assert(obj.not_null(), "must succeed in allocating instance");
-  
-  HotSpotMethodData::set_hotspotMirror(obj, method_data());
-  HotSpotMethodData::set_normalDataSize(obj, method_data()->data_size());
-  HotSpotMethodData::set_extraDataSize(obj, method_data()->extra_data_size());
-
-  method_data->set_graal_mirror(obj());
-  return obj;
+  return VMToCompiler::createResolvedJavaType(klass(), name, simpleName, java_class, hasFinalizableSubclass, sizeOrSpecies, CHECK_NULL);
 }
 
 BasicType GraalCompiler::kindToBasicType(jchar ch) {