# HG changeset patch # User Doug Simon # Date 1348676111 -7200 # Node ID c8759f9f9e3c0f14ad3ff0db8d29646ebfe2778c # Parent a2299c2fc0c6d07d5373f62f166c701633ee600a added Log.printf() for more flexibility in debugging snippets diff -r a2299c2fc0c6 -r c8759f9f9e3c graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java --- 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); diff -r a2299c2fc0c6 -r c8759f9f9e3c graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Log.java --- 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"); diff -r a2299c2fc0c6 -r c8759f9f9e3c src/cpu/x86/vm/c1_Runtime1_x86.cpp --- 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(); diff -r a2299c2fc0c6 -r c8759f9f9e3c src/share/vm/c1/c1_Runtime1.cpp --- 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; diff -r a2299c2fc0c6 -r c8759f9f9e3c src/share/vm/c1/c1_Runtime1.hpp --- 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 diff -r a2299c2fc0c6 -r c8759f9f9e3c src/share/vm/graal/graalCodeInstaller.cpp --- 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()"); diff -r a2299c2fc0c6 -r c8759f9f9e3c src/share/vm/graal/graalJavaAccess.hpp --- 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 \