changeset 1407:09e7826ecf01

Can now call to Java code from the VM. Need to specify a JAR file with the classes from the Maxine subprojects C1X, CRI, and HotSpotVM in the bootclasspath. See HotSpotVM/README.txt in the Maxine sources for details.
author Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
date Tue, 11 May 2010 19:24:14 +0200
parents 35069ca331f2
children 0ba67bb5392c b30a2cd5e3a2
files src/share/vm/c1x/c1x_Compiler.cpp src/share/vm/classfile/systemDictionary.cpp src/share/vm/runtime/javaCalls.cpp
diffstat 3 files changed, 27 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_Compiler.cpp	Tue May 11 18:19:17 2010 +0200
+++ b/src/share/vm/c1x/c1x_Compiler.cpp	Tue May 11 19:24:14 2010 +0200
@@ -34,15 +34,32 @@
 
 // Compilation entry point for methods
 void C1XCompiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
-
+	VM_ENTRY_MARK;
+	
 	ResourceMark rm;
 	HandleMark hm;
 
 	TRACE_C1X_1("compile_method");
 
-	methodOop method = (methodOop)target->get_oop();
-	methodHandle m(Thread::current(), method);
-	TRACE_C1X_1("name = %s", m->name_and_sig_as_C_string());
+	methodHandle method(Thread::current(), (methodOop)target->get_oop());
+	TRACE_C1X_1("name = %s", method->name_and_sig_as_C_string());
+
+	JavaValue result(T_VOID);
+	symbolHandle syKlass = oopFactory::new_symbol("com/sun/hotspot/c1x/VMExits", CHECK);
+
+
+	Handle nullh;
+	KlassHandle k = SystemDictionary::resolve_or_null(syKlass, nullh, nullh, CHECK);
+	if (k.is_null()) {
+		tty->print_cr("not found");
+		return;//fatal("Could not find class com.sun.hotspot.c1x.VMExits");
+	}
+	symbolHandle syName = oopFactory::new_symbol("compileMethod", CHECK);
+	symbolHandle sySig = oopFactory::new_symbol("(Lcom/sun/cri/ri/RiMethod;I)V", CHECK);
+	JavaCallArguments args;
+	args.push_oop(method());
+	args.push_int(entry_bci);
+	JavaCalls::call_static(&result, k, syName, sySig, &args, CHECK);
 }
 
 // Print compilation timers and statistics
--- a/src/share/vm/classfile/systemDictionary.cpp	Tue May 11 18:19:17 2010 +0200
+++ b/src/share/vm/classfile/systemDictionary.cpp	Tue May 11 19:24:14 2010 +0200
@@ -161,7 +161,8 @@
 // Forwards to resolve_instance_class_or_null
 
 klassOop SystemDictionary::resolve_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS) {
-  assert(!THREAD->is_Compiler_thread(), "Can not load classes with the Compiler thread");
+  // (tw) May we do this?
+  // assert(!THREAD->is_Compiler_thread(), "Can not load classes with the Compiler thread");
   if (FieldType::is_array(class_name())) {
     return resolve_array_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
   } else {
--- a/src/share/vm/runtime/javaCalls.cpp	Tue May 11 18:19:17 2010 +0200
+++ b/src/share/vm/runtime/javaCalls.cpp	Tue May 11 19:24:14 2010 +0200
@@ -34,7 +34,8 @@
 
   guarantee(thread->is_Java_thread(), "crucial check - the VM thread cannot and must not escape to Java code");
   assert(!thread->owns_locks(), "must release all locks when leaving VM");
-  guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler");
+  // (tw) may we do this?
+  // guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler");
   _result   = result;
 
   // Allocate handle block for Java code. This must be done before we change thread_state to _thread_in_Java_or_stub,
@@ -328,7 +329,8 @@
 #endif
 
 
-  assert(!thread->is_Compiler_thread(), "cannot compile from the compiler");
+  // (tw) may we do this?
+  //assert(!thread->is_Compiler_thread(), "cannot compile from the compiler");
   if (CompilationPolicy::mustBeCompiled(method)) {
     CompileBroker::compile_method(method, InvocationEntryBci,
                                   methodHandle(), 0, "mustBeCompiled", CHECK);