diff src/share/vm/c1x/c1x_VMEntries.cpp @ 1465:2c754f3a2722

Inlining of static final field values. Java mirror instead of VmID. Support for PrintMetrics option.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Thu, 18 Nov 2010 17:27:43 +0100
parents 7bc14f75a077
children ef7761803480
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_VMEntries.cpp	Mon Nov 15 11:06:38 2010 +0100
+++ b/src/share/vm/c1x/c1x_VMEntries.cpp	Thu Nov 18 17:27:43 2010 +0100
@@ -168,7 +168,8 @@
   oop result = NULL;
   constantTag tag = cp->tag_at(index);
   if (tag.is_int()) {
-    result = VMExits::createCiConstantInt(cp->int_at(index), CHECK_0);
+    result = VMExits::createCiConstantLong(cp->int_at(index), CHECK_0);
+    CiValue::set_kind(result, CiKind::Int());
   } else if (tag.is_long()) {
     result = VMExits::createCiConstantLong(cp->long_at(index), CHECK_0);
   } else if (tag.is_float()) {
@@ -188,10 +189,7 @@
         return NULL;
       }
     }
-    jlong id = VmIds::add<oop>(string);
-//    tty->print("\n\nstring: 0x%08x%08x\n", string, id>>32, id);
-//    string->print();
-    result = VMExits::createCiConstantObject(id, CHECK_0);
+    result = VMExits::createCiConstantObject(string, CHECK_0);
   } else if (tag.is_klass() || tag.is_unresolved_klass()) {
     bool ignore;
     ciInstanceKlass* accessor = (ciInstanceKlass*) ciEnv::current()->get_object(cp->pool_holder());
@@ -200,7 +198,7 @@
   } else if (tag.is_object()) {
     oop obj = cp->object_at(index);
     assert(obj->is_instance(), "must be an instance");
-    result = VMExits::createCiConstantObject(VmIds::add<oop>(obj), CHECK_NULL);
+    result = VMExits::createCiConstantObject(obj, CHECK_NULL);
   } else {
     ShouldNotReachHere();
   }
@@ -256,7 +254,57 @@
   ciInstanceKlass* loading_klass = (ciInstanceKlass *) CURRENT_ENV->get_object(cp->pool_holder());
   ciField *field = CURRENT_ENV->get_field_by_index(loading_klass, index);
   Bytecodes::Code code = (Bytecodes::Code)(((int) byteCode) & 0xFF);
-  return JNIHandles::make_local(THREAD, C1XCompiler::get_RiField(field, loading_klass, cp->pool_holder(), code, THREAD));
+  Handle field_handle = C1XCompiler::get_RiField(field, loading_klass, cp->pool_holder(), code, THREAD);
+  if (field->is_constant() && field->is_static()) {
+    ciConstant constant = field->constant_value();
+    oop constant_object = NULL;
+    switch (constant.basic_type()) {
+      case T_OBJECT:
+      case T_ARRAY:
+        {
+          ciObject* obj = constant.as_object();
+          if (obj->is_null_object()) {
+            constant_object = VMExits::createCiConstantObject(NULL, CHECK_0);
+          } else if (obj->can_be_constant()) {
+            constant_object = VMExits::createCiConstantObject(constant.as_object()->get_oop(), CHECK_0);
+          }
+        }
+        break;
+      case T_DOUBLE:
+        constant_object = VMExits::createCiConstantDouble(constant.as_double(), CHECK_0);
+        break;
+      case T_LONG:
+        constant_object = VMExits::createCiConstantLong(constant.as_long(), CHECK_0);
+        break;
+      case T_INT:
+        constant_object = VMExits::createCiConstantLong(constant.as_int(), CHECK_0);
+        CiValue::set_kind(constant_object, CiKind::Int());
+        break;
+      case T_SHORT:
+        constant_object = VMExits::createCiConstantLong(constant.as_int(), CHECK_0);
+        CiValue::set_kind(constant_object, CiKind::Short());
+        break;
+      case T_CHAR:
+        constant_object = VMExits::createCiConstantLong(constant.as_int(), CHECK_0);
+        CiValue::set_kind(constant_object, CiKind::Char());
+        break;
+      case T_BYTE:
+        constant_object = VMExits::createCiConstantLong(constant.as_int(), CHECK_0);
+        CiValue::set_kind(constant_object, CiKind::Byte());
+        break;
+      case T_BOOLEAN:
+        constant_object = VMExits::createCiConstantLong(constant.as_int(), CHECK_0);
+        CiValue::set_kind(constant_object, CiKind::Boolean());
+        break;
+      default:
+        constant.print();
+        fatal("Unhandled constant");
+    }
+    if (constant_object != NULL) {
+      HotSpotField::set_constant(field_handle, constant_object);
+    }
+  }
+  return JNIHandles::make_local(THREAD, field_handle());
 }
 
 // public RiConstantPool RiType_constantPool(long vmId);