Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/ci/ciMethod.hpp
32285 views
1
/*
2
* Copyright (c) 1999, 2016, 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_VM_CI_CIMETHOD_HPP
26
#define SHARE_VM_CI_CIMETHOD_HPP
27
28
#include "ci/ciFlags.hpp"
29
#include "ci/ciInstanceKlass.hpp"
30
#include "ci/ciObject.hpp"
31
#include "ci/ciSignature.hpp"
32
#include "compiler/methodLiveness.hpp"
33
#include "prims/methodHandles.hpp"
34
#include "utilities/bitMap.hpp"
35
36
class ciMethodBlocks;
37
class MethodLiveness;
38
class BitMap;
39
class Arena;
40
class BCEscapeAnalyzer;
41
42
43
// ciMethod
44
//
45
// This class represents a Method* in the HotSpot virtual
46
// machine.
47
class ciMethod : public ciMetadata {
48
friend class CompileBroker;
49
CI_PACKAGE_ACCESS
50
friend class ciEnv;
51
friend class ciExceptionHandlerStream;
52
friend class ciBytecodeStream;
53
friend class ciMethodHandle;
54
friend class ciReplay;
55
56
private:
57
// General method information.
58
ciFlags _flags;
59
ciSymbol* _name;
60
ciInstanceKlass* _holder;
61
ciSignature* _signature;
62
ciMethodData* _method_data;
63
ciMethodBlocks* _method_blocks;
64
65
// Code attributes.
66
int _code_size;
67
int _max_stack;
68
int _max_locals;
69
vmIntrinsics::ID _intrinsic_id;
70
int _handler_count;
71
int _interpreter_invocation_count;
72
int _interpreter_throwout_count;
73
int _instructions_size;
74
int _size_of_parameters;
75
76
bool _uses_monitors;
77
bool _balanced_monitors;
78
bool _is_c1_compilable;
79
bool _is_c2_compilable;
80
bool _can_be_statically_bound;
81
82
// Lazy fields, filled in on demand
83
address _code;
84
ciExceptionHandler** _exception_handlers;
85
86
// Optional liveness analyzer.
87
MethodLiveness* _liveness;
88
#if defined(COMPILER2) || defined(SHARK)
89
ciTypeFlow* _flow;
90
BCEscapeAnalyzer* _bcea;
91
#endif
92
93
ciMethod(methodHandle h_m, ciInstanceKlass* holder);
94
ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature, ciInstanceKlass* accessor);
95
96
oop loader() const { return _holder->loader(); }
97
98
const char* type_string() { return "ciMethod"; }
99
100
void print_impl(outputStream* st);
101
102
void load_code();
103
104
void check_is_loaded() const { assert(is_loaded(), "not loaded"); }
105
106
bool ensure_method_data(methodHandle h_m);
107
108
void code_at_put(int bci, Bytecodes::Code code) {
109
Bytecodes::check(code);
110
assert(0 <= bci && bci < code_size(), "valid bci");
111
address bcp = _code + bci;
112
*bcp = code;
113
}
114
115
// Check bytecode and profile data collected are compatible
116
void assert_virtual_call_type_ok(int bci);
117
void assert_call_type_ok(int bci);
118
119
public:
120
// Basic method information.
121
ciFlags flags() const { check_is_loaded(); return _flags; }
122
ciSymbol* name() const { return _name; }
123
ciInstanceKlass* holder() const { return _holder; }
124
ciMethodData* method_data();
125
ciMethodData* method_data_or_null();
126
127
// Signature information.
128
ciSignature* signature() const { return _signature; }
129
ciType* return_type() const { return _signature->return_type(); }
130
int arg_size_no_receiver() const { return _signature->size(); }
131
// Can only be used on loaded ciMethods
132
int arg_size() const {
133
check_is_loaded();
134
return _signature->size() + (_flags.is_static() ? 0 : 1);
135
}
136
// Report the number of elements on stack when invoking this method.
137
// This is different than the regular arg_size because invokedynamic
138
// has an implicit receiver.
139
int invoke_arg_size(Bytecodes::Code code) const {
140
if (is_loaded()) {
141
return arg_size();
142
} else {
143
int arg_size = _signature->size();
144
// Add a receiver argument, maybe:
145
if (code != Bytecodes::_invokestatic &&
146
code != Bytecodes::_invokedynamic) {
147
arg_size++;
148
}
149
return arg_size;
150
}
151
}
152
153
Method* get_Method() const {
154
Method* m = (Method*)_metadata;
155
assert(m != NULL, "illegal use of unloaded method");
156
return m;
157
}
158
159
// Method code and related information.
160
address code() { if (_code == NULL) load_code(); return _code; }
161
int code_size() const { check_is_loaded(); return _code_size; }
162
int max_stack() const { check_is_loaded(); return _max_stack; }
163
int max_locals() const { check_is_loaded(); return _max_locals; }
164
vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; }
165
bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; }
166
int exception_table_length() const { check_is_loaded(); return _handler_count; }
167
int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; }
168
int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; }
169
int size_of_parameters() const { check_is_loaded(); return _size_of_parameters; }
170
171
// Code size for inlining decisions.
172
int code_size_for_inlining();
173
174
bool caller_sensitive() const { return get_Method()->caller_sensitive(); }
175
bool force_inline() const { return get_Method()->force_inline(); }
176
bool dont_inline() const { return get_Method()->dont_inline(); }
177
178
int comp_level();
179
int highest_osr_comp_level();
180
181
Bytecodes::Code java_code_at_bci(int bci) {
182
address bcp = code() + bci;
183
return Bytecodes::java_code_at(NULL, bcp);
184
}
185
Bytecodes::Code raw_code_at_bci(int bci) {
186
address bcp = code() + bci;
187
return Bytecodes::code_at(NULL, bcp);
188
}
189
BCEscapeAnalyzer *get_bcea();
190
ciMethodBlocks *get_method_blocks();
191
192
bool has_linenumber_table() const; // length unknown until decompression
193
u_char* compressed_linenumber_table() const; // not preserved by gc
194
195
int line_number_from_bci(int bci) const;
196
197
// Runtime information.
198
int vtable_index();
199
#ifdef SHARK
200
int itable_index();
201
#endif // SHARK
202
address native_entry();
203
address interpreter_entry();
204
205
// Analysis and profiling.
206
//
207
// Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks.
208
bool has_monitor_bytecodes() const { return _uses_monitors; }
209
bool has_balanced_monitors();
210
211
// Returns a bitmap indicating which locals are required to be
212
// maintained as live for deopt. raw_liveness_at_bci is always the
213
// direct output of the liveness computation while liveness_at_bci
214
// may mark all locals as live to improve support for debugging Java
215
// code by maintaining the state of as many locals as possible.
216
MethodLivenessResult raw_liveness_at_bci(int bci);
217
MethodLivenessResult liveness_at_bci(int bci);
218
219
// Get the interpreters viewpoint on oop liveness. MethodLiveness is
220
// conservative in the sense that it may consider locals to be live which
221
// cannot be live, like in the case where a local could contain an oop or
222
// a primitive along different paths. In that case the local must be
223
// dead when those paths merge. Since the interpreter's viewpoint is
224
// used when gc'ing an interpreter frame we need to use its viewpoint
225
// during OSR when loading the locals.
226
227
BitMap live_local_oops_at_bci(int bci);
228
229
#ifdef COMPILER1
230
const BitMap bci_block_start();
231
#endif
232
233
ciTypeFlow* get_flow_analysis();
234
ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point
235
ciCallProfile call_profile_at_bci(int bci);
236
int interpreter_call_site_count(int bci);
237
238
// Does type profiling provide a useful type at this point?
239
ciKlass* argument_profiled_type(int bci, int i);
240
ciKlass* parameter_profiled_type(int i);
241
ciKlass* return_profiled_type(int bci);
242
243
ciField* get_field_at_bci( int bci, bool &will_link);
244
ciMethod* get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature);
245
246
ciSignature* get_declared_signature_at_bci(int bci) {
247
bool ignored_will_link;
248
ciSignature* declared_signature;
249
get_method_at_bci(bci, ignored_will_link, &declared_signature);
250
assert(declared_signature != NULL, "cannot be null");
251
return declared_signature;
252
}
253
254
ciMethod* get_method_at_bci(int bci) {
255
bool ignored_will_link;
256
ciSignature* ignored_declared_signature;
257
return get_method_at_bci(bci, ignored_will_link, &ignored_declared_signature);
258
}
259
260
// Given a certain calling environment, find the monomorphic target
261
// for the call. Return NULL if the call is not monomorphic in
262
// its calling environment.
263
ciMethod* find_monomorphic_target(ciInstanceKlass* caller,
264
ciInstanceKlass* callee_holder,
265
ciInstanceKlass* actual_receiver,
266
bool check_access = true);
267
268
// Given a known receiver klass, find the target for the call.
269
// Return NULL if the call has no target or is abstract.
270
ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access = true);
271
272
// Find the proper vtable index to invoke this method.
273
int resolve_vtable_index(ciKlass* caller, ciKlass* receiver);
274
275
// Compilation directives
276
bool should_exclude();
277
bool should_inline();
278
bool should_not_inline();
279
bool should_print_assembly();
280
bool break_at_execute();
281
bool has_option(const char *option);
282
template<typename T>
283
bool has_option_value(const char* option, T& value);
284
bool can_be_compiled();
285
bool can_be_osr_compiled(int entry_bci);
286
void set_not_compilable(const char* reason = NULL);
287
bool has_compiled_code();
288
void log_nmethod_identity(xmlStream* log);
289
bool is_not_reached(int bci);
290
bool was_executed_more_than(int times);
291
bool has_unloaded_classes_in_signature();
292
bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
293
bool check_call(int refinfo_index, bool is_static) const;
294
bool ensure_method_data(); // make sure it exists in the VM also
295
MethodCounters* ensure_method_counters();
296
int instructions_size();
297
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
298
299
// Stack walking support
300
bool is_ignored_by_security_stack_walk() const;
301
302
// JSR 292 support
303
bool is_method_handle_intrinsic() const;
304
bool is_compiled_lambda_form() const;
305
bool has_member_arg() const;
306
307
// What kind of ciObject is this?
308
bool is_method() const { return true; }
309
310
// Java access flags
311
bool is_public () const { return flags().is_public(); }
312
bool is_private () const { return flags().is_private(); }
313
bool is_protected () const { return flags().is_protected(); }
314
bool is_static () const { return flags().is_static(); }
315
bool is_final () const { return flags().is_final(); }
316
bool is_synchronized() const { return flags().is_synchronized(); }
317
bool is_native () const { return flags().is_native(); }
318
bool is_interface () const { return flags().is_interface(); }
319
bool is_abstract () const { return flags().is_abstract(); }
320
bool is_strict () const { return flags().is_strict(); }
321
322
// Other flags
323
bool is_empty_method() const;
324
bool is_vanilla_constructor() const;
325
bool is_final_method() const { return is_final() || holder()->is_final(); }
326
bool has_loops () const;
327
bool has_jsrs () const;
328
bool is_accessor () const;
329
bool is_initializer () const;
330
bool can_be_statically_bound() const { return _can_be_statically_bound; }
331
bool is_boxing_method() const;
332
bool is_unboxing_method() const;
333
bool is_object_initializer() const;
334
335
// Replay data methods
336
void dump_name_as_ascii(outputStream* st);
337
void dump_replay_data(outputStream* st);
338
339
// Print the bytecodes of this method.
340
void print_codes_on(outputStream* st);
341
void print_codes() {
342
print_codes_on(tty);
343
}
344
void print_codes_on(int from, int to, outputStream* st);
345
346
// Print the name of this method in various incarnations.
347
void print_name(outputStream* st = tty);
348
void print_short_name(outputStream* st = tty);
349
};
350
351
#endif // SHARE_VM_CI_CIMETHOD_HPP
352
353