1/*
2 * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24#ifndef SHARE_VM_JVMCI_JVMCI_RUNTIME_HPP
25#define SHARE_VM_JVMCI_JVMCI_RUNTIME_HPP
26
27#include "interpreter/interpreter.hpp"
28#include "memory/allocation.hpp"
29#include "runtime/arguments.hpp"
30#include "runtime/deoptimization.hpp"
31
32#define JVMCI_ERROR(...)       \
33  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return; }
34
35#define JVMCI_ERROR_(ret, ...) \
36  { Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::jdk_vm_ci_common_JVMCIError(), __VA_ARGS__); return ret; }
37
38#define JVMCI_ERROR_0(...)    JVMCI_ERROR_(0, __VA_ARGS__)
39#define JVMCI_ERROR_NULL(...) JVMCI_ERROR_(NULL, __VA_ARGS__)
40#define JVMCI_ERROR_OK(...)   JVMCI_ERROR_(JVMCIEnv::ok, __VA_ARGS__)
41#define CHECK_OK              CHECK_(JVMCIEnv::ok)
42
43class JVMCIRuntime: public AllStatic {
44 public:
45  // Constants describing whether JVMCI wants to be able to adjust the compilation
46  // level selected for a method by the VM compilation policy and if so, based on
47  // what information about the method being schedule for compilation.
48  enum CompLevelAdjustment {
49     none = 0,             // no adjustment
50     by_holder = 1,        // adjust based on declaring class of method
51     by_full_signature = 2 // adjust based on declaring class, name and signature of method
52  };
53
54 private:
55  static jobject _HotSpotJVMCIRuntime_instance;
56  static bool _HotSpotJVMCIRuntime_initialized;
57  static bool _well_known_classes_initialized;
58
59  static int _trivial_prefixes_count;
60  static char** _trivial_prefixes;
61
62  static CompLevelAdjustment _comp_level_adjustment;
63
64  static bool _shutdown_called;
65
66  static CompLevel adjust_comp_level_inner(const methodHandle& method, bool is_osr, CompLevel level, JavaThread* thread);
67
68 public:
69  static bool is_HotSpotJVMCIRuntime_initialized() {
70    return _HotSpotJVMCIRuntime_initialized;
71  }
72
73  /**
74   * Gets the singleton HotSpotJVMCIRuntime instance, initializing it if necessary
75   */
76  static Handle get_HotSpotJVMCIRuntime(TRAPS) {
77    initialize_JVMCI(CHECK_(Handle()));
78    return Handle(THREAD, JNIHandles::resolve_non_null(_HotSpotJVMCIRuntime_instance));
79  }
80
81  static jobject get_HotSpotJVMCIRuntime_jobject(TRAPS) {
82    initialize_JVMCI(CHECK_NULL);
83    assert(_HotSpotJVMCIRuntime_initialized, "must be");
84    return _HotSpotJVMCIRuntime_instance;
85  }
86
87  static Handle callStatic(const char* className, const char* methodName, const char* returnType, JavaCallArguments* args, TRAPS);
88
89  /**
90   * Determines if the VM is sufficiently booted to initialize JVMCI.
91   */
92  static bool can_initialize_JVMCI();
93
94  /**
95   * Trigger initialization of HotSpotJVMCIRuntime through JVMCI.getRuntime()
96   */
97  static void initialize_JVMCI(TRAPS);
98
99  /**
100   * Explicitly initialize HotSpotJVMCIRuntime itself
101   */
102  static void initialize_HotSpotJVMCIRuntime(TRAPS);
103
104  static void initialize_well_known_classes(TRAPS);
105
106  static void metadata_do(void f(Metadata*));
107
108  static void shutdown(TRAPS);
109
110  static void bootstrap_finished(TRAPS);
111
112  static bool shutdown_called() {
113    return _shutdown_called;
114  }
115
116  static bool treat_as_trivial(Method* method);
117
118  /**
119   * Lets JVMCI modify the compilation level currently selected for a method by
120   * the VM compilation policy.
121   *
122   * @param method the method being scheduled for compilation
123   * @param is_osr specifies if the compilation is an OSR compilation
124   * @param level the compilation level currently selected by the VM compilation policy
125   * @param thread the current thread
126   * @return the compilation level to use for the compilation
127   */
128  static CompLevel adjust_comp_level(const methodHandle& method, bool is_osr, CompLevel level, JavaThread* thread);
129
130  static BasicType kindToBasicType(Handle kind, TRAPS);
131
132  // The following routines are all called from compiled JVMCI code
133
134  static void new_instance(JavaThread* thread, Klass* klass);
135  static void new_array(JavaThread* thread, Klass* klass, jint length);
136  static void new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims);
137  static void dynamic_new_array(JavaThread* thread, oopDesc* element_mirror, jint length);
138  static void dynamic_new_instance(JavaThread* thread, oopDesc* type_mirror);
139  static jboolean thread_is_interrupted(JavaThread* thread, oopDesc* obj, jboolean clear_interrupted);
140  static void vm_message(jboolean vmError, jlong format, jlong v1, jlong v2, jlong v3);
141  static jint identity_hash_code(JavaThread* thread, oopDesc* obj);
142  static address exception_handler_for_pc(JavaThread* thread);
143  static void monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock);
144  static void monitorexit (JavaThread* thread, oopDesc* obj, BasicLock* lock);
145  static void vm_error(JavaThread* thread, jlong where, jlong format, jlong value);
146  static oopDesc* load_and_clear_exception(JavaThread* thread);
147  static void log_printf(JavaThread* thread, oopDesc* format, jlong v1, jlong v2, jlong v3);
148  static void log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline);
149  // Print the passed in object, optionally followed by a newline.  If
150  // as_string is true and the object is a java.lang.String then it
151  // printed as a string, otherwise the type of the object is printed
152  // followed by its address.
153  static void log_object(JavaThread* thread, oopDesc* object, bool as_string, bool newline);
154  static void write_barrier_pre(JavaThread* thread, oopDesc* obj);
155  static void write_barrier_post(JavaThread* thread, void* card);
156  static jboolean validate_object(JavaThread* thread, oopDesc* parent, oopDesc* child);
157  static void new_store_pre_barrier(JavaThread* thread);
158
159  // used to throw exceptions from compiled JVMCI code
160  static void throw_and_post_jvmti_exception(JavaThread* thread, const char* exception, const char* message);
161  // helper methods to throw exception with complex messages
162  static void throw_klass_external_name_exception(JavaThread* thread, const char* exception, Klass* klass);
163  static void throw_class_cast_exception(JavaThread* thread, const char* exception, Klass* caster_klass, Klass* target_klass);
164
165  // Forces initialization of the JVMCI runtime.
166  static void force_initialization(TRAPS);
167
168  // Test only function
169  static int test_deoptimize_call_int(JavaThread* thread, int value);
170};
171
172// Tracing macros.
173
174#define IF_TRACE_jvmci_1 if (!(JVMCITraceLevel >= 1)) ; else
175#define IF_TRACE_jvmci_2 if (!(JVMCITraceLevel >= 2)) ; else
176#define IF_TRACE_jvmci_3 if (!(JVMCITraceLevel >= 3)) ; else
177#define IF_TRACE_jvmci_4 if (!(JVMCITraceLevel >= 4)) ; else
178#define IF_TRACE_jvmci_5 if (!(JVMCITraceLevel >= 5)) ; else
179
180#define TRACE_jvmci_1 if (!(JVMCITraceLevel >= 1 && (tty->print("JVMCITrace-1: "), true))) ; else tty->print_cr
181#define TRACE_jvmci_2 if (!(JVMCITraceLevel >= 2 && (tty->print("   JVMCITrace-2: "), true))) ; else tty->print_cr
182#define TRACE_jvmci_3 if (!(JVMCITraceLevel >= 3 && (tty->print("      JVMCITrace-3: "), true))) ; else tty->print_cr
183#define TRACE_jvmci_4 if (!(JVMCITraceLevel >= 4 && (tty->print("         JVMCITrace-4: "), true))) ; else tty->print_cr
184#define TRACE_jvmci_5 if (!(JVMCITraceLevel >= 5 && (tty->print("            JVMCITrace-5: "), true))) ; else tty->print_cr
185
186#endif // SHARE_VM_JVMCI_JVMCI_RUNTIME_HPP
187