< prev index next >
src/hotspot/share/jvmci/jvmciRuntime.hpp
Print this page
@@ -30,10 +30,11 @@
#include "jvmci/jvmciObject.hpp"
class JVMCIEnv;
class JVMCICompiler;
class JVMCICompileState;
+class MetadataHandles;
// Encapsulates the JVMCI metadata for an nmethod.
// JVMCINMethodData objects are inlined into nmethods
// at nmethod::_jvmci_data_offset.
class JVMCINMethodData {
@@ -84,10 +85,11 @@
};
// A top level class that represents an initialized JVMCI runtime.
// There is one instance of this class per HotSpotJVMCIRuntime object.
class JVMCIRuntime: public CHeapObj<mtJVMCI> {
+ friend class JVMCI;
public:
// Constants describing whether JVMCI wants to be able to adjust the compilation
// level selected for a method by the VM compilation policy and if so, based on
// what information about the method being schedule for compilation.
enum CompLevelAdjustment {
@@ -95,16 +97,35 @@
by_holder = 1, // adjust based on declaring class of method
by_full_signature = 2 // adjust based on declaring class, name and signature of method
};
private:
- volatile bool _being_initialized;
- volatile bool _initialized;
+
+ enum InitState {
+ uninitialized,
+ being_initialized,
+ fully_initialized
+ };
+
+ // Initialization state of this JVMCIRuntime.
+ InitState _init_state;
JVMCIObject _HotSpotJVMCIRuntime_instance;
- bool _shutdown_called;
+ // Result of calling JNI_CreateJavaVM in the JVMCI shared library.
+ // Must only be modified under JVMCI_lock.
+ volatile JavaVM* _shared_library_javavm;
+
+ // The HotSpot heap based runtime will have an id of -1 and the
+ // JVMCI shared library runtime will have an id of 0.
+ int _id;
+
+ // Handles to objects in the HotSpot heap.
+ OopStorage* _object_handles;
+
+ // Handles to Metadata objects.
+ MetadataHandles* _metadata_handles;
JVMCIObject create_jvmci_primitive_type(BasicType type, JVMCI_TRAPS);
// Implementation methods for loading and constant pool access.
static Klass* get_klass_by_name_impl(Klass*& accessing_klass,
@@ -128,49 +149,81 @@
Symbol* name,
Symbol* sig,
Bytecodes::Code bc,
constantTag tag);
+ static OopStorage* create_object_handles(int id);
+
public:
- JVMCIRuntime() {
- _initialized = false;
- _being_initialized = false;
- _shutdown_called = false;
- }
+ JVMCIRuntime(int id);
+
+ int id() const { return _id; }
- /**
- * Compute offsets and construct any state required before executing JVMCI code.
- */
+ // Ensures that a JVMCI shared library JavaVM exists for this runtime.
+ // If the JavaVM was created by this call, then the thread-local JNI
+ // interface pointer for the JavaVM is returned otherwise NULL is returned.
+ JNIEnv* init_shared_library_javavm();
+
+ // Determines if the JVMCI shared library JavaVM exists for this runtime.
+ bool has_shared_library_javavm() { return _shared_library_javavm != NULL; }
+
+ // Copies info about the JVMCI shared library JavaVM associated with this
+ // runtime into `info` as follows:
+ // {
+ // javaVM, // the {@code JavaVM*} value
+ // javaVM->functions->reserved0,
+ // javaVM->functions->reserved1,
+ // javaVM->functions->reserved2
+ // }
+ void init_JavaVM_info(jlongArray info, JVMCI_TRAPS);
+
+ // Wrappers for calling Invocation Interface functions on the
+ // JVMCI shared library JavaVM associated with this runtime.
+ // These wrappers ensure all required thread state transitions are performed.
+ jint AttachCurrentThread(JavaThread* thread, void **penv, void *args);
+ jint AttachCurrentThreadAsDaemon(JavaThread* thread, void **penv, void *args);
+ jint DetachCurrentThread(JavaThread* thread);
+ jint GetEnv(JavaThread* thread, void **penv, jint version);
+
+ // Compute offsets and construct any state required before executing JVMCI code.
void initialize(JVMCIEnv* jvmciEnv);
- /**
- * Gets the singleton HotSpotJVMCIRuntime instance, initializing it if necessary
- */
+ // Allocation and management of JNI global object handles.
+ jobject make_global(const Handle& obj);
+ void destroy_global(jobject handle);
+ bool is_global_handle(jobject handle);
+
+ // Allocation and management of matadata handles.
+ jmetadata allocate_handle(const methodHandle& handle);
+ jmetadata allocate_handle(const constantPoolHandle& handle);
+ void release_handle(jmetadata handle);
+
+ // Gets the HotSpotJVMCIRuntime instance for this runtime,
+ // initializing it first if necessary.
JVMCIObject get_HotSpotJVMCIRuntime(JVMCI_TRAPS);
bool is_HotSpotJVMCIRuntime_initialized() {
return _HotSpotJVMCIRuntime_instance.is_non_null();
}
- /**
- * Trigger initialization of HotSpotJVMCIRuntime through JVMCI.getRuntime()
- */
+ // Gets the current HotSpotJVMCIRuntime instance for this runtime which
+ // may be a "null" JVMCIObject value.
+ JVMCIObject probe_HotSpotJVMCIRuntime() {
+ return _HotSpotJVMCIRuntime_instance;
+ }
+
+ // Trigger initialization of HotSpotJVMCIRuntime through JVMCI.getRuntime()
void initialize_JVMCI(JVMCI_TRAPS);
- /**
- * Explicitly initialize HotSpotJVMCIRuntime itself
- */
+ // Explicitly initialize HotSpotJVMCIRuntime itself
void initialize_HotSpotJVMCIRuntime(JVMCI_TRAPS);
void call_getCompiler(TRAPS);
+ // Shuts down this runtime by calling HotSpotJVMCIRuntime.shutdown().
void shutdown();
- bool shutdown_called() {
- return _shutdown_called;
- }
-
void bootstrap_finished(TRAPS);
// Look up a klass by name from a particular class loader (the accessor's).
// If require_local, result must be defined in that class loader, or NULL.
// If !require_local, a result from remote class loader may be reported,
@@ -233,13 +286,11 @@
JVMCIObject nmethod_mirror,
FailedSpeculation** failed_speculations,
char* speculations,
int speculations_len);
- /**
- * Exits the VM due to an unexpected exception.
- */
+ // Exits the VM due to an unexpected exception.
static void exit_on_pending_exception(JVMCIEnv* JVMCIENV, const char* message);
static void describe_pending_hotspot_exception(JavaThread* THREAD, bool clear);
#define CHECK_EXIT THREAD); \
@@ -338,22 +389,28 @@
static int throw_klass_external_name_exception(JavaThread* thread, const char* exception, Klass* klass);
static int throw_class_cast_exception(JavaThread* thread, const char* exception, Klass* caster_klass, Klass* target_klass);
// Test only function
static jint test_deoptimize_call_int(JavaThread* thread, int value);
+
+ // Emits the following on tty:
+ // "JVMCITrace-" <level> "[" <current thread name> "]:" <padding of width `level`>
+ // Returns true.
+ static bool trace_prefix(int level);
};
// Tracing macros.
#define IF_TRACE_jvmci_1 if (!(JVMCITraceLevel >= 1)) ; else
#define IF_TRACE_jvmci_2 if (!(JVMCITraceLevel >= 2)) ; else
#define IF_TRACE_jvmci_3 if (!(JVMCITraceLevel >= 3)) ; else
#define IF_TRACE_jvmci_4 if (!(JVMCITraceLevel >= 4)) ; else
#define IF_TRACE_jvmci_5 if (!(JVMCITraceLevel >= 5)) ; else
-#define TRACE_jvmci_1 if (!(JVMCITraceLevel >= 1 && (tty->print(PTR_FORMAT " JVMCITrace-1: ", p2i(JavaThread::current())), true))) ; else tty->print_cr
-#define TRACE_jvmci_2 if (!(JVMCITraceLevel >= 2 && (tty->print(PTR_FORMAT " JVMCITrace-2: ", p2i(JavaThread::current())), true))) ; else tty->print_cr
-#define TRACE_jvmci_3 if (!(JVMCITraceLevel >= 3 && (tty->print(PTR_FORMAT " JVMCITrace-3: ", p2i(JavaThread::current())), true))) ; else tty->print_cr
-#define TRACE_jvmci_4 if (!(JVMCITraceLevel >= 4 && (tty->print(PTR_FORMAT " JVMCITrace-4: ", p2i(JavaThread::current())), true))) ; else tty->print_cr
-#define TRACE_jvmci_5 if (!(JVMCITraceLevel >= 5 && (tty->print(PTR_FORMAT " JVMCITrace-5: ", p2i(JavaThread::current())), true))) ; else tty->print_cr
+#define TRACE_jvmci_(n) if (!(JVMCITraceLevel >= n && JVMCIRuntime::trace_prefix(n))) ; else tty->print_cr
+#define TRACE_jvmci_1 TRACE_jvmci_(1)
+#define TRACE_jvmci_2 TRACE_jvmci_(2)
+#define TRACE_jvmci_3 TRACE_jvmci_(3)
+#define TRACE_jvmci_4 TRACE_jvmci_(4)
+#define TRACE_jvmci_5 TRACE_jvmci_(5)
#endif // SHARE_VM_JVMCI_JVMCI_RUNTIME_HPP
< prev index next >