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_VM_INTERPRETER_INTERPRETERRUNTIME_HPP
26 #define SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP
27
28 #include "interpreter/bytecode.hpp"
29 #include "interpreter/linkResolver.hpp"
30 #include "memory/universe.hpp"
31 #include "oops/method.hpp"
32 #include "runtime/frame.inline.hpp"
33 #include "runtime/signature.hpp"
34 #include "runtime/thread.hpp"
35 #include "utilities/macros.hpp"
36
37 // The InterpreterRuntime is called by the interpreter for everything
38 // that cannot/should not be dealt with in assembly and needs C support.
39
40 class InterpreterRuntime: AllStatic {
41 friend class BytecodeClosure; // for method and bcp
42 friend class PrintingClosure; // for method and bcp
43
44 private:
45 // Helper class to access current interpreter state
46 class LastFrameAccessor : public StackObj {
47 frame _last_frame;
48 public:
49 LastFrameAccessor(JavaThread* thread) {
50 assert(thread == Thread::current(), "sanity");
51 _last_frame = thread->last_frame();
52 }
53 bool is_interpreted_frame() const { return _last_frame.is_interpreted_frame(); }
54 Method* method() const { return _last_frame.interpreter_frame_method(); }
55 address bcp() const { return _last_frame.interpreter_frame_bcp(); }
56 int bci() const { return _last_frame.interpreter_frame_bci(); }
57 address mdp() const { return _last_frame.interpreter_frame_mdp(); }
58
59 void set_bcp(address bcp) { _last_frame.interpreter_frame_set_bcp(bcp); }
60 void set_mdp(address dp) { _last_frame.interpreter_frame_set_mdp(dp); }
61
62 // pass method to avoid calling unsafe bcp_to_method (partial fix 4926272)
63 Bytecodes::Code code() const { return Bytecodes::code_at(method(), bcp()); }
64
65 Bytecode bytecode() const { return Bytecode(method(), bcp()); }
66 int get_index_u1(Bytecodes::Code bc) const { return bytecode().get_index_u1(bc); }
67 int get_index_u2(Bytecodes::Code bc) const { return bytecode().get_index_u2(bc); }
68 int get_index_u2_cpcache(Bytecodes::Code bc) const
69 { return bytecode().get_index_u2_cpcache(bc); }
70 int get_index_u4(Bytecodes::Code bc) const { return bytecode().get_index_u4(bc); }
71 int number_of_dimensions() const { return bcp()[3]; }
72 ConstantPoolCacheEntry* cache_entry_at(int i) const
73 { return method()->constants()->cache()->entry_at(i); }
74 ConstantPoolCacheEntry* cache_entry() const { return cache_entry_at(Bytes::get_native_u2(bcp() + 1)); }
75
76 oop callee_receiver(Symbol* signature) {
77 return _last_frame.interpreter_callee_receiver(signature);
78 }
79 BasicObjectLock* monitor_begin() const {
80 return _last_frame.interpreter_frame_monitor_begin();
81 }
82 BasicObjectLock* monitor_end() const {
83 return _last_frame.interpreter_frame_monitor_end();
84 }
85 BasicObjectLock* next_monitor(BasicObjectLock* current) const {
86 return _last_frame.next_monitor_in_interpreter_frame(current);
87 }
88
89 frame& get_frame() { return _last_frame; }
90 };
91
92 static void set_bcp_and_mdp(address bcp, JavaThread*thread);
93 static void note_trap_inner(JavaThread* thread, int reason,
94 const methodHandle& trap_method, int trap_bci, TRAPS);
95 static void note_trap(JavaThread *thread, int reason, TRAPS);
96 #ifdef CC_INTERP
97 // Profile traps in C++ interpreter.
98 static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci);
99 #endif // CC_INTERP
100
101 // Inner work method for Interpreter's frequency counter overflow.
102 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp);
103
104 public:
105 // Constants
106 static void ldc (JavaThread* thread, bool wide);
107 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode);
108
109 // Allocation
110 static void _new (JavaThread* thread, ConstantPool* pool, int index);
155 // Statics & fields
156 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode);
157
158 // Calls
159 static void resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode);
160 static void resolve_invokehandle (JavaThread* thread);
161 static void resolve_invokedynamic(JavaThread* thread);
162
163 public:
164 // Synchronization
165 static void monitorenter(JavaThread* thread, BasicObjectLock* elem);
166 static void monitorexit (JavaThread* thread, BasicObjectLock* elem);
167
168 static void throw_illegal_monitor_state_exception(JavaThread* thread);
169 static void new_illegal_monitor_state_exception(JavaThread* thread);
170
171 // Breakpoints
172 static void _breakpoint(JavaThread* thread, Method* method, address bcp);
173 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, Method* method, address bcp);
174 static void set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code);
175 static bool is_breakpoint(JavaThread *thread) { return Bytecodes::code_or_bp_at(LastFrameAccessor(thread).bcp()) == Bytecodes::_breakpoint; }
176
177 // Safepoints
178 static void at_safepoint(JavaThread* thread);
179
180 // Debugger support
181 static void post_field_access(JavaThread *thread, oopDesc* obj,
182 ConstantPoolCacheEntry *cp_entry);
183 static void post_field_modification(JavaThread *thread, oopDesc* obj,
184 ConstantPoolCacheEntry *cp_entry, jvalue *value);
185 static void post_method_entry(JavaThread *thread);
186 static void post_method_exit (JavaThread *thread);
187 static int interpreter_contains(address pc);
188
189 // Native signature handlers
190 static void prepare_native_call(JavaThread* thread, Method* method);
191 static address slow_signature_handler(JavaThread* thread,
192 Method* method,
193 intptr_t* from, intptr_t* to);
194
195 #if defined(IA32) || defined(AMD64) || defined(ARM)
|
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_VM_INTERPRETER_INTERPRETERRUNTIME_HPP
26 #define SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP
27
28 #include "interpreter/bytecode.hpp"
29 #include "interpreter/linkResolver.hpp"
30 #include "memory/universe.hpp"
31 #include "oops/method.hpp"
32 #include "runtime/frame.hpp"
33 #include "runtime/signature.hpp"
34 #include "runtime/thread.hpp"
35 #include "utilities/macros.hpp"
36
37 // The InterpreterRuntime is called by the interpreter for everything
38 // that cannot/should not be dealt with in assembly and needs C support.
39
40 class InterpreterRuntime: AllStatic {
41 friend class BytecodeClosure; // for method and bcp
42 friend class PrintingClosure; // for method and bcp
43
44 private:
45
46 static void set_bcp_and_mdp(address bcp, JavaThread*thread);
47 static void note_trap_inner(JavaThread* thread, int reason,
48 const methodHandle& trap_method, int trap_bci, TRAPS);
49 static void note_trap(JavaThread *thread, int reason, TRAPS);
50 #ifdef CC_INTERP
51 // Profile traps in C++ interpreter.
52 static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci);
53 #endif // CC_INTERP
54
55 // Inner work method for Interpreter's frequency counter overflow.
56 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp);
57
58 public:
59 // Constants
60 static void ldc (JavaThread* thread, bool wide);
61 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode);
62
63 // Allocation
64 static void _new (JavaThread* thread, ConstantPool* pool, int index);
109 // Statics & fields
110 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode);
111
112 // Calls
113 static void resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode);
114 static void resolve_invokehandle (JavaThread* thread);
115 static void resolve_invokedynamic(JavaThread* thread);
116
117 public:
118 // Synchronization
119 static void monitorenter(JavaThread* thread, BasicObjectLock* elem);
120 static void monitorexit (JavaThread* thread, BasicObjectLock* elem);
121
122 static void throw_illegal_monitor_state_exception(JavaThread* thread);
123 static void new_illegal_monitor_state_exception(JavaThread* thread);
124
125 // Breakpoints
126 static void _breakpoint(JavaThread* thread, Method* method, address bcp);
127 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, Method* method, address bcp);
128 static void set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code);
129 static bool is_breakpoint(JavaThread *thread);
130
131 // Safepoints
132 static void at_safepoint(JavaThread* thread);
133
134 // Debugger support
135 static void post_field_access(JavaThread *thread, oopDesc* obj,
136 ConstantPoolCacheEntry *cp_entry);
137 static void post_field_modification(JavaThread *thread, oopDesc* obj,
138 ConstantPoolCacheEntry *cp_entry, jvalue *value);
139 static void post_method_entry(JavaThread *thread);
140 static void post_method_exit (JavaThread *thread);
141 static int interpreter_contains(address pc);
142
143 // Native signature handlers
144 static void prepare_native_call(JavaThread* thread, Method* method);
145 static address slow_signature_handler(JavaThread* thread,
146 Method* method,
147 intptr_t* from, intptr_t* to);
148
149 #if defined(IA32) || defined(AMD64) || defined(ARM)
|