< prev index next >
src/hotspot/share/jvmci/jvmciRuntime.hpp
Print this page
*** 30,39 ****
--- 30,40 ----
#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,93 ****
--- 85,95 ----
};
// 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,110 ****
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;
JVMCIObject _HotSpotJVMCIRuntime_instance;
! bool _shutdown_called;
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,
--- 97,131 ----
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:
!
! enum InitState {
! uninitialized,
! being_initialized,
! fully_initialized
! };
!
! // Initialization state of this JVMCIRuntime.
! InitState _init_state;
JVMCIObject _HotSpotJVMCIRuntime_instance;
! // 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,176 ****
Symbol* name,
Symbol* sig,
Bytecodes::Code bc,
constantTag tag);
public:
! JVMCIRuntime() {
! _initialized = false;
! _being_initialized = false;
! _shutdown_called = false;
! }
! /**
! * Compute offsets and construct any state required before executing JVMCI code.
! */
void initialize(JVMCIEnv* jvmciEnv);
! /**
! * Gets the singleton HotSpotJVMCIRuntime instance, initializing it if necessary
! */
JVMCIObject get_HotSpotJVMCIRuntime(JVMCI_TRAPS);
bool is_HotSpotJVMCIRuntime_initialized() {
return _HotSpotJVMCIRuntime_instance.is_non_null();
}
! /**
! * Trigger initialization of HotSpotJVMCIRuntime through JVMCI.getRuntime()
! */
void initialize_JVMCI(JVMCI_TRAPS);
! /**
! * Explicitly initialize HotSpotJVMCIRuntime itself
! */
void initialize_HotSpotJVMCIRuntime(JVMCI_TRAPS);
void call_getCompiler(TRAPS);
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,
--- 149,229 ----
Symbol* name,
Symbol* sig,
Bytecodes::Code bc,
constantTag tag);
+ static OopStorage* create_object_handles(int id);
+
public:
! JVMCIRuntime(int id);
!
! int id() const { return _id; }
! // 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);
! // 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();
}
! // 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
void initialize_HotSpotJVMCIRuntime(JVMCI_TRAPS);
void call_getCompiler(TRAPS);
+ // Shuts down this runtime by calling HotSpotJVMCIRuntime.shutdown().
void shutdown();
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,245 ****
JVMCIObject nmethod_mirror,
FailedSpeculation** failed_speculations,
char* speculations,
int speculations_len);
! /**
! * 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); \
--- 286,296 ----
JVMCIObject nmethod_mirror,
FailedSpeculation** failed_speculations,
char* speculations,
int speculations_len);
! // 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,359 ****
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);
};
// 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
#endif // SHARE_VM_JVMCI_JVMCI_RUNTIME_HPP
--- 389,416 ----
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_(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 >