changeset 6446:c8759f9f9e3c

added Log.printf() for more flexibility in debugging snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 26 Sep 2012 18:15:11 +0200
parents a2299c2fc0c6
children d7bcbdf4749c
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java src/cpu/x86/vm/c1_Runtime1_x86.cpp src/share/vm/c1/c1_Runtime1.cpp src/share/vm/c1/c1_Runtime1.hpp src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalJavaAccess.hpp
diffstat 7 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java	Wed Sep 26 13:56:27 2012 +0200
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java	Wed Sep 26 18:15:11 2012 +0200
@@ -49,6 +49,7 @@
     public static final RuntimeCall ArithmeticTan = new RuntimeCall("ArithmeticTan", Double, false, Double);
     public static final RuntimeCall ArithmeticSin = new RuntimeCall("ArithmeticSin", Double, false, Double);
     public static final RuntimeCall GenericCallback = new RuntimeCall("GenericCallback", Object, true, Object, Object);
+    public static final RuntimeCall LogPrintf = new RuntimeCall("LogPrintf", Void, false, Object, Long);
     public static final RuntimeCall LogPrimitive = new RuntimeCall("LogPrimitive", Void, false, Int, Long, Boolean);
     public static final RuntimeCall LogObject = new RuntimeCall("LogObject", Void, false, Object, Int);
 
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java	Wed Sep 26 13:56:27 2012 +0200
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java	Wed Sep 26 18:15:11 2012 +0200
@@ -52,6 +52,12 @@
         throw new UnsupportedOperationException("This method may only be compiled with the Graal compiler");
     }
 
+    @SuppressWarnings("unused")
+    @NodeIntrinsic(RuntimeCallNode.class)
+    private static void printf(@ConstantNodeParameter RuntimeCall logPrintf, String format, long value) {
+        throw new UnsupportedOperationException("This method may only be compiled with the Graal compiler");
+    }
+
     public static void print(boolean value) {
         log(RuntimeCall.LogPrimitive, Kind.Boolean.typeChar, value ? 1L : 0L, false);
     }
@@ -76,6 +82,13 @@
         log(RuntimeCall.LogPrimitive, Kind.Long.typeChar, value, false);
     }
 
+    /**
+     * @param format a C style printf format value - must be between 0 and 1024 characters
+     */
+    public static void printf(String format, long value) {
+        printf(RuntimeCall.LogPrintf, format, value);
+    }
+
     public static void print(float value) {
         if (Float.isNaN(value)) {
             print("NaN");
--- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Wed Sep 26 13:56:27 2012 +0200
+++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Wed Sep 26 18:15:11 2012 +0200
@@ -1917,6 +1917,18 @@
       break;
     }
 
+    case graal_log_printf_id: {
+      __ enter();
+      oop_maps = new OopMapSet();
+      OopMap* oop_map = save_live_registers(sasm, 0);
+      int call_offset = __ call_RT(noreg, noreg, (address)graal_log_printf, j_rarg0, j_rarg1, j_rarg2);
+      oop_maps->add_gc_map(call_offset, oop_map);
+      restore_live_registers(sasm);
+      __ leave();
+      __ ret(0);
+      break;
+    }
+
     case graal_log_primitive_id: {
       __ enter();
       oop_maps = new OopMapSet();
--- a/src/share/vm/c1/c1_Runtime1.cpp	Wed Sep 26 13:56:27 2012 +0200
+++ b/src/share/vm/c1/c1_Runtime1.cpp	Wed Sep 26 18:15:11 2012 +0200
@@ -805,6 +805,27 @@
   }
 JRT_END
 
+JRT_ENTRY(void, Runtime1::graal_log_printf(JavaThread* thread, oop format, jlong val))
+  char buf[1025];
+  assert(format != NULL && java_lang_String::is_instance(format), "must be");
+
+  typeArrayOop value  = java_lang_String::value(format);
+  int          offset = java_lang_String::offset(format);
+  int          length = java_lang_String::length(format);
+
+  assert(value != NULL, "fmtString must be a literal");
+  assert(length >= 0 && length <= 1024, "format must be between 0 and 1024 characters");
+  length = MIN2(length, 1024);
+
+  int index = 0;
+  while (index < length) {
+    buf[index] = value->char_at(index + offset);
+    index++;
+  }
+  buf[index++] = 0;
+  tty->print(buf, val);
+JRT_END
+
 JRT_ENTRY(void, Runtime1::graal_log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline))
   union {
       jlong l;
--- a/src/share/vm/c1/c1_Runtime1.hpp	Wed Sep 26 13:56:27 2012 +0200
+++ b/src/share/vm/c1/c1_Runtime1.hpp	Wed Sep 26 18:15:11 2012 +0200
@@ -82,6 +82,7 @@
   stub(graal_create_out_of_bounds_exception) \
   stub(graal_generic_callback)       \
   stub(graal_log_object)             \
+  stub(graal_log_printf)             \
   stub(graal_log_primitive)          \
   last_entry(number_of_ids)
 #else
@@ -206,6 +207,7 @@
   static void graal_generic_callback(JavaThread* thread, oop _callback, oop _argument);
   static void graal_monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock);
   static void graal_monitorexit (JavaThread* thread, oopDesc* obj, BasicLock* lock);
+  static void graal_log_printf(JavaThread* thread, oop format, jlong value);
   static void graal_log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline);
 
   // Note: Must be kept in sync with constants in com.oracle.graal.snippets.Log
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Wed Sep 26 13:56:27 2012 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Wed Sep 26 18:15:11 2012 +0200
@@ -578,6 +578,9 @@
   } else if (runtime_call == RuntimeCall::LogPrimitive()) {
     target_addr = Runtime1::entry_for(Runtime1::graal_log_primitive_id);
     TRACE_graal_3("RuntimeCall::LogPrimitive()");
+  } else if (runtime_call == RuntimeCall::LogPrintf()) {
+    target_addr = Runtime1::entry_for(Runtime1::graal_log_printf_id);
+    TRACE_graal_3("RuntimeCall::LogPrintf()");
   } else if (runtime_call == RuntimeCall::LogObject()) {
     target_addr = Runtime1::entry_for(Runtime1::graal_log_object_id);
     TRACE_graal_3("RuntimeCall::LogObject()");
--- a/src/share/vm/graal/graalJavaAccess.hpp	Wed Sep 26 13:56:27 2012 +0200
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Wed Sep 26 18:15:11 2012 +0200
@@ -203,6 +203,7 @@
     static_oop_field(RuntimeCall, ArithmeticSin, "Lcom/oracle/graal/api/code/RuntimeCall;");   \
     static_oop_field(RuntimeCall, Deoptimize, "Lcom/oracle/graal/api/code/RuntimeCall;");      \
     static_oop_field(RuntimeCall, GenericCallback, "Lcom/oracle/graal/api/code/RuntimeCall;"); \
+    static_oop_field(RuntimeCall, LogPrintf, "Lcom/oracle/graal/api/code/RuntimeCall;");       \
     static_oop_field(RuntimeCall, LogPrimitive, "Lcom/oracle/graal/api/code/RuntimeCall;");    \
     static_oop_field(RuntimeCall, LogObject, "Lcom/oracle/graal/api/code/RuntimeCall;");       \
   end_class                                                                             \