src/hotspot/share/jvmci/jvmciRuntime.hpp
Index
Unified diffs
Context diffs
Sdiffs
Frames
Patch
New
Old
Previous File
Next File
open Cdiff src/hotspot/share/jvmci/jvmciRuntime.hpp
src/hotspot/share/jvmci/jvmciRuntime.hpp
Print this page
*** 23,48 ****
#ifndef SHARE_JVMCI_JVMCIRUNTIME_HPP
#define SHARE_JVMCI_JVMCIRUNTIME_HPP
#include "interpreter/interpreter.hpp"
#include "memory/allocation.hpp"
#include "runtime/arguments.hpp"
#include "runtime/deoptimization.hpp"
! #define JVMCI_ERROR(...) \
! { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return; }
! #define JVMCI_ERROR_(ret, ...) \
! { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return ret; }
! #define JVMCI_ERROR_0(...) JVMCI_ERROR_(0, __VA_ARGS__)
! #define JVMCI_ERROR_NULL(...) JVMCI_ERROR_(NULL, __VA_ARGS__)
! #define JVMCI_ERROR_OK(...) JVMCI_ERROR_(JVMCIEnv::ok, __VA_ARGS__)
! #define CHECK_OK CHECK_(JVMCIEnv::ok)
! class JVMCIRuntime: public AllStatic {
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 {
--- 23,94 ----
#ifndef SHARE_JVMCI_JVMCIRUNTIME_HPP
#define SHARE_JVMCI_JVMCIRUNTIME_HPP
#include "interpreter/interpreter.hpp"
+ #include "jvmci/jvmci.hpp"
#include "memory/allocation.hpp"
#include "runtime/arguments.hpp"
#include "runtime/deoptimization.hpp"
! class JVMCIObject;
! class JVMCIEnv;
! class JVMCICompileState;
!
! // Encapsulates the JVMCI metadata for an nmethod.
! // JVMCINMethodData objects are inlined into nmethods
! // at nmethod::_jvmci_data_offset.
! class JVMCINMethodData {
! // Index for the HotSpotNmethod mirror in the nmethod's oops table.
! // This is -1 if there is no mirror in the oops table.
! int _nmethod_mirror_index;
!
! // Is HotSpotNmethod.name non-null? If so, the value is
! // embedded in the end of this object.
! bool _has_name;
!
! // Address of the failed speculations list to which a speculation
! // is appended when it causes a deoptimization.
! FailedSpeculation** _failed_speculations;
!
! public:
! // Computes the size of a JVMCINMethodData object
! static int compute_size(const char* nmethod_mirror_name) {
! int size = sizeof(JVMCINMethodData);
! if (nmethod_mirror_name != NULL) {
! size += (int) strlen(nmethod_mirror_name) + 1;
! }
! return size;
! }
!
! void initialize(int nmethod_mirror_index,
! const char* name,
! FailedSpeculation** failed_speculations);
!
! // Adds `speculation` to the failed speculations list.
! void add_failed_speculation(nmethod* nm, jlong speculation);
!
! // Gets the JVMCI name of the nmethod (which may be NULL).
! const char* name() { return _has_name ? (char*)(((address) this) + sizeof(JVMCINMethodData)) : NULL; }
! // Clears the HotSpotNmethod.address field in the mirror. If nm
! // is dead, the HotSpotNmethod.entryPoint field is also cleared.
! void invalidate_nmethod_mirror(nmethod* nm);
! // Gets the mirror from nm's oops table.
! oop get_nmethod_mirror(nmethod* nm);
! // Sets the mirror in nm's oops table.
! void set_nmethod_mirror(nmethod* nm, oop mirror);
!
! // Clears the mirror in nm's oops table.
! void clear_nmethod_mirror(nmethod* nm);
! };
!
! // A top level class that represents an initialized JVMCI runtime.
! // There is one instance of this class per HotSpotJVMCIRuntime object.
! class JVMCIRuntime: public CHeapObj<mtCompiler> {
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 {
*** 50,113 ****
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:
! static jobject _HotSpotJVMCIRuntime_instance;
! static bool _HotSpotJVMCIRuntime_initialized;
! static bool _well_known_classes_initialized;
! static CompLevelAdjustment _comp_level_adjustment;
! static bool _shutdown_called;
! static CompLevel adjust_comp_level_inner(const methodHandle& method, bool is_osr, CompLevel level, JavaThread* thread);
public:
! static bool is_HotSpotJVMCIRuntime_initialized() {
! return _HotSpotJVMCIRuntime_initialized;
}
/**
! * Gets the singleton HotSpotJVMCIRuntime instance, initializing it if necessary
*/
! static Handle get_HotSpotJVMCIRuntime(TRAPS);
!
! static jobject get_HotSpotJVMCIRuntime_jobject(TRAPS) {
! initialize_JVMCI(CHECK_NULL);
! assert(_HotSpotJVMCIRuntime_initialized, "must be");
! return _HotSpotJVMCIRuntime_instance;
! }
!
! static Handle callStatic(const char* className, const char* methodName, const char* returnType, JavaCallArguments* args, TRAPS);
/**
! * Determines if the VM is sufficiently booted to initialize JVMCI.
*/
! static bool can_initialize_JVMCI();
/**
* Trigger initialization of HotSpotJVMCIRuntime through JVMCI.getRuntime()
*/
! static void initialize_JVMCI(TRAPS);
/**
* Explicitly initialize HotSpotJVMCIRuntime itself
*/
! static void initialize_HotSpotJVMCIRuntime(TRAPS);
!
! static void initialize_well_known_classes(TRAPS);
! static void metadata_do(void f(Metadata*));
!
! static void shutdown(TRAPS);
!
! static void bootstrap_finished(TRAPS);
!
! static bool shutdown_called() {
! return _shutdown_called;
! }
/**
* Lets JVMCI modify the compilation level currently selected for a method by
* the VM compilation policy.
*
--- 96,175 ----
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;
! CompLevelAdjustment _comp_level_adjustment;
! bool _shutdown_called;
! CompLevel adjust_comp_level_inner(methodHandle method, bool is_osr, CompLevel level, JavaThread* thread);
!
! 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,
! const constantPoolHandle& cpool,
! Symbol* klass_name,
! bool require_local);
! static Klass* get_klass_by_index_impl(const constantPoolHandle& cpool,
! int klass_index,
! bool& is_accessible,
! Klass* loading_klass);
! static void get_field_by_index_impl(InstanceKlass* loading_klass, fieldDescriptor& fd,
! int field_index);
! static methodHandle get_method_by_index_impl(const constantPoolHandle& cpool,
! int method_index, Bytecodes::Code bc,
! InstanceKlass* loading_klass);
!
! // Helper methods
! static bool check_klass_accessibility(Klass* accessing_klass, Klass* resolved_klass);
! static methodHandle lookup_method(InstanceKlass* accessor,
! Klass* holder,
! Symbol* name,
! Symbol* sig,
! Bytecodes::Code bc,
! constantTag tag);
public:
! JVMCIRuntime() {
! _comp_level_adjustment = JVMCIRuntime::none;
! _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);
/**
* Lets JVMCI modify the compilation level currently selected for a method by
* the VM compilation policy.
*
*** 115,125 ****
* @param is_osr specifies if the compilation is an OSR compilation
* @param level the compilation level currently selected by the VM compilation policy
* @param thread the current thread
* @return the compilation level to use for the compilation
*/
! static CompLevel adjust_comp_level(const methodHandle& method, bool is_osr, CompLevel level, JavaThread* thread);
static BasicType kindToBasicType(Handle kind, TRAPS);
static void new_instance_common(JavaThread* thread, Klass* klass, bool null_on_fail);
static void new_array_common(JavaThread* thread, Klass* klass, jint length, bool null_on_fail);
--- 177,301 ----
* @param is_osr specifies if the compilation is an OSR compilation
* @param level the compilation level currently selected by the VM compilation policy
* @param thread the current thread
* @return the compilation level to use for the compilation
*/
! CompLevel adjust_comp_level(methodHandle method, bool is_osr, CompLevel level, JavaThread* thread);
!
! 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,
! // if sufficient class loader constraints exist such that initiating
! // a class loading request from the given loader is bound to return
! // the class defined in the remote loader (or throw an error).
! //
! // Return an unloaded klass if !require_local and no class at all is found.
! //
! // The CI treats a klass as loaded if it is consistently defined in
! // another loader, even if it hasn't yet been loaded in all loaders
! // that could potentially see it via delegation.
! static Klass* get_klass_by_name(Klass* accessing_klass,
! Symbol* klass_name,
! bool require_local);
!
! // Constant pool access.
! static Klass* get_klass_by_index(const constantPoolHandle& cpool,
! int klass_index,
! bool& is_accessible,
! Klass* loading_klass);
! static void get_field_by_index(InstanceKlass* loading_klass, fieldDescriptor& fd,
! int field_index);
! static methodHandle get_method_by_index(const constantPoolHandle& cpool,
! int method_index, Bytecodes::Code bc,
! InstanceKlass* loading_klass);
!
! // converts the Klass* representing the holder of a method into a
! // InstanceKlass*. This is needed since the holder of a method in
! // the bytecodes could be an array type. Basically this converts
! // array types into java/lang/Object and other types stay as they are.
! static InstanceKlass* get_instance_klass_for_declared_method_holder(Klass* klass);
!
! // Helper routine for determining the validity of a compilation
! // with respect to concurrent class loading.
! static JVMCI::CodeInstallResult validate_compile_task_dependencies(Dependencies* target, JVMCICompileState* task, char** failure_detail);
!
! // Compiles `target` with the JVMCI compiler.
! void compile_method(JVMCIEnv* JVMCIENV, JVMCICompiler* compiler, const methodHandle& target, int entry_bci);
!
! // Register the result of a compilation.
! JVMCI::CodeInstallResult register_method(JVMCIEnv* JVMCIENV,
! const methodHandle& target,
! nmethod*& nm,
! int entry_bci,
! CodeOffsets* offsets,
! int orig_pc_offset,
! CodeBuffer* code_buffer,
! int frame_words,
! OopMapSet* oop_map_set,
! ExceptionHandlerTable* handler_table,
! AbstractCompiler* compiler,
! DebugInformationRecorder* debug_info,
! Dependencies* dependencies,
! int compile_id,
! bool has_unsafe_access,
! bool has_wide_vector,
! JVMCIObject compiled_code,
! 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); \
! if (HAS_PENDING_EXCEPTION) { \
! char buf[256]; \
! jio_snprintf(buf, 256, "Uncaught exception at %s:%d", __FILE__, __LINE__); \
! JVMCIRuntime::exit_on_pending_exception(NULL, buf); \
! return; \
! } \
! (void)(0
!
! #define CHECK_EXIT_(v) THREAD); \
! if (HAS_PENDING_EXCEPTION) { \
! char buf[256]; \
! jio_snprintf(buf, 256, "Uncaught exception at %s:%d", __FILE__, __LINE__); \
! JVMCIRuntime::exit_on_pending_exception(NULL, buf); \
! return v; \
! } \
! (void)(0
!
! #define JVMCI_CHECK_EXIT JVMCIENV); \
! if (JVMCIENV->has_pending_exception()) { \
! char buf[256]; \
! jio_snprintf(buf, 256, "Uncaught exception at %s:%d", __FILE__, __LINE__); \
! JVMCIRuntime::exit_on_pending_exception(JVMCIENV, buf); \
! return; \
! } \
! (void)(0
!
! #define JVMCI_CHECK_EXIT_(result) JVMCIENV); \
! if (JVMCIENV->has_pending_exception()) { \
! char buf[256]; \
! jio_snprintf(buf, 256, "Uncaught exception at %s:%d", __FILE__, __LINE__); \
! JVMCIRuntime::exit_on_pending_exception(JVMCIENV, buf); \
! return result; \
! } \
! (void)(0
static BasicType kindToBasicType(Handle kind, TRAPS);
static void new_instance_common(JavaThread* thread, Klass* klass, bool null_on_fail);
static void new_array_common(JavaThread* thread, Klass* klass, jint length, bool null_on_fail);
*** 177,203 ****
static void throw_and_post_jvmti_exception(JavaThread* thread, const char* exception, const char* message);
// helper methods to throw exception with complex messages
static void throw_klass_external_name_exception(JavaThread* thread, const char* exception, Klass* klass);
static void throw_class_cast_exception(JavaThread* thread, const char* exception, Klass* caster_klass, Klass* target_klass);
- // Forces initialization of the JVMCI runtime.
- static void force_initialization(TRAPS);
-
// Test only function
! static int 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("JVMCITrace-1: "), true))) ; else tty->print_cr
! #define TRACE_jvmci_2 if (!(JVMCITraceLevel >= 2 && (tty->print(" JVMCITrace-2: "), true))) ; else tty->print_cr
! #define TRACE_jvmci_3 if (!(JVMCITraceLevel >= 3 && (tty->print(" JVMCITrace-3: "), true))) ; else tty->print_cr
! #define TRACE_jvmci_4 if (!(JVMCITraceLevel >= 4 && (tty->print(" JVMCITrace-4: "), true))) ; else tty->print_cr
! #define TRACE_jvmci_5 if (!(JVMCITraceLevel >= 5 && (tty->print(" JVMCITrace-5: "), true))) ; else tty->print_cr
#endif // SHARE_JVMCI_JVMCIRUNTIME_HPP
--- 353,376 ----
static void throw_and_post_jvmti_exception(JavaThread* thread, const char* exception, const char* message);
// helper methods to throw exception with complex messages
static void throw_klass_external_name_exception(JavaThread* thread, const char* exception, Klass* klass);
static void 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_JVMCI_JVMCIRUNTIME_HPP
src/hotspot/share/jvmci/jvmciRuntime.hpp
Index
Unified diffs
Context diffs
Sdiffs
Frames
Patch
New
Old
Previous File
Next File