Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/interpreter/interpreterRuntime.hpp
40949 views
1
/*
2
* Copyright (c) 1997, 2021, 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
25
#ifndef SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
26
#define SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
27
28
#include "interpreter/bytecode.hpp"
29
#include "interpreter/linkResolver.hpp"
30
#include "oops/method.hpp"
31
#include "runtime/frame.hpp"
32
#include "runtime/signature.hpp"
33
#include "runtime/thread.hpp"
34
#include "utilities/macros.hpp"
35
36
class BufferBlob;
37
class CodeBuffer;
38
39
// The InterpreterRuntime is called by the interpreter for everything
40
// that cannot/should not be dealt with in assembly and needs C support.
41
42
class InterpreterRuntime: AllStatic {
43
friend class BytecodeClosure; // for method and bcp
44
friend class PrintingClosure; // for method and bcp
45
46
private:
47
48
static void set_bcp_and_mdp(address bcp, JavaThread* current);
49
static void note_trap_inner(JavaThread* current, int reason,
50
const methodHandle& trap_method, int trap_bci);
51
static void note_trap(JavaThread* current, int reason);
52
53
// Inner work method for Interpreter's frequency counter overflow.
54
static nmethod* frequency_counter_overflow_inner(JavaThread* current, address branch_bcp);
55
56
public:
57
// Constants
58
static void ldc (JavaThread* current, bool wide);
59
static void resolve_ldc (JavaThread* current, Bytecodes::Code bytecode);
60
61
// Allocation
62
static void _new (JavaThread* current, ConstantPool* pool, int index);
63
static void newarray (JavaThread* current, BasicType type, jint size);
64
static void anewarray (JavaThread* current, ConstantPool* pool, int index, jint size);
65
static void multianewarray(JavaThread* current, jint* first_size_address);
66
static void register_finalizer(JavaThread* current, oopDesc* obj);
67
68
// Quicken instance-of and check-cast bytecodes
69
static void quicken_io_cc(JavaThread* current);
70
71
// Exceptions thrown by the interpreter
72
static void throw_AbstractMethodError(JavaThread* current);
73
static void throw_AbstractMethodErrorWithMethod(JavaThread* current, Method* oop);
74
static void throw_AbstractMethodErrorVerbose(JavaThread* current,
75
Klass* recvKlass,
76
Method* missingMethod);
77
78
static void throw_IncompatibleClassChangeError(JavaThread* current);
79
static void throw_IncompatibleClassChangeErrorVerbose(JavaThread* current,
80
Klass* resc,
81
Klass* interfaceKlass);
82
static void throw_StackOverflowError(JavaThread* current);
83
static void throw_delayed_StackOverflowError(JavaThread* current);
84
static void throw_ArrayIndexOutOfBoundsException(JavaThread* current, arrayOopDesc* a, jint index);
85
static void throw_ClassCastException(JavaThread* current, oopDesc* obj);
86
static void throw_NullPointerException(JavaThread* current);
87
88
static void create_exception(JavaThread* current, char* name, char* message);
89
static void create_klass_exception(JavaThread* current, char* name, oopDesc* obj);
90
static address exception_handler_for_exception(JavaThread* current, oopDesc* exception);
91
#if INCLUDE_JVMTI
92
static void member_name_arg_or_null(JavaThread* current, address dmh, Method* m, address bcp);
93
#endif
94
static void throw_pending_exception(JavaThread* current);
95
96
static void resolve_from_cache(JavaThread* current, Bytecodes::Code bytecode);
97
private:
98
// Statics & fields
99
static void resolve_get_put(JavaThread* current, Bytecodes::Code bytecode);
100
101
// Calls
102
static void resolve_invoke(JavaThread* current, Bytecodes::Code bytecode);
103
static void resolve_invokehandle (JavaThread* current);
104
static void resolve_invokedynamic(JavaThread* current);
105
106
public:
107
// Synchronization
108
static void monitorenter(JavaThread* current, BasicObjectLock* elem);
109
static void monitorexit (BasicObjectLock* elem);
110
111
static void throw_illegal_monitor_state_exception(JavaThread* current);
112
static void new_illegal_monitor_state_exception(JavaThread* current);
113
114
// Breakpoints
115
static void _breakpoint(JavaThread* current, Method* method, address bcp);
116
static Bytecodes::Code get_original_bytecode_at(JavaThread* current, Method* method, address bcp);
117
static void set_original_bytecode_at(JavaThread* current, Method* method, address bcp, Bytecodes::Code new_code);
118
119
// Safepoints
120
static void at_safepoint(JavaThread* current);
121
static void at_unwind(JavaThread* current);
122
123
// Debugger support
124
static void post_field_access(JavaThread* current, oopDesc* obj,
125
ConstantPoolCacheEntry *cp_entry);
126
static void post_field_modification(JavaThread* current, oopDesc* obj,
127
ConstantPoolCacheEntry *cp_entry, jvalue *value);
128
static void post_method_entry(JavaThread* current);
129
static void post_method_exit (JavaThread* current);
130
static int interpreter_contains(address pc);
131
132
// Native signature handlers
133
static void prepare_native_call(JavaThread* current, Method* method);
134
static address slow_signature_handler(JavaThread* current,
135
Method* method,
136
intptr_t* from, intptr_t* to);
137
138
#if defined(IA32) || defined(AMD64) || defined(ARM)
139
// Popframe support (only needed on x86, AMD64 and ARM)
140
static void popframe_move_outgoing_args(JavaThread* current, void* src_address, void* dest_address);
141
#endif
142
143
// bytecode tracing is only used by the TraceBytecodes
144
static intptr_t trace_bytecode(JavaThread* current, intptr_t preserve_this_value, intptr_t tos, intptr_t tos2) PRODUCT_RETURN0;
145
146
// Platform dependent stuff
147
#include CPU_HEADER(interpreterRT)
148
149
// optional normalization of fingerprints to reduce the number of adapters
150
static uint64_t normalize_fast_native_fingerprint(uint64_t fingerprint);
151
152
// Interpreter's frequency counter overflow
153
static nmethod* frequency_counter_overflow(JavaThread* current, address branch_bcp);
154
155
// Interpreter profiling support
156
static jint bcp_to_di(Method* method, address cur_bcp);
157
static void update_mdp_for_ret(JavaThread* current, int bci);
158
#ifdef ASSERT
159
static void verify_mdp(Method* method, address bcp, address mdp);
160
#endif // ASSERT
161
static MethodCounters* build_method_counters(JavaThread* current, Method* m);
162
};
163
164
165
class SignatureHandlerLibrary: public AllStatic {
166
public:
167
enum { buffer_size = 1*K }; // the size of the temporary code buffer
168
enum { blob_size = 32*K }; // the size of a handler code blob.
169
170
private:
171
static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers
172
static address _handler; // next available address within _handler_blob;
173
static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection
174
static GrowableArray<address>* _handlers; // the corresponding handlers
175
static address _buffer; // the temporary code buffer
176
177
static address set_handler_blob();
178
static void initialize();
179
static address set_handler(CodeBuffer* buffer);
180
static void pd_set_handler(address handler);
181
182
public:
183
static void add(const methodHandle& method);
184
static void add(uint64_t fingerprint, address handler);
185
};
186
187
#endif // SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
188
189