author | chegar |
Thu, 17 Oct 2019 20:54:25 +0100 | |
branch | datagramsocketimpl-branch |
changeset 58679 | 9c3209ff7550 |
parent 58678 | 9cf78a70fa4f |
parent 55252 | 6502d6a92fe2 |
permissions | -rw-r--r-- |
1 | 1 |
/* |
53244
9807daeb47c4
8216167: Update include guards to reflect correct directories
coleenp
parents:
50113
diff
changeset
|
2 |
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. |
1 | 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 |
* |
|
5547
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
4581
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
4581
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
f4b087cbb361
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
4581
diff
changeset
|
21 |
* questions. |
1 | 22 |
* |
23 |
*/ |
|
24 |
||
53244
9807daeb47c4
8216167: Update include guards to reflect correct directories
coleenp
parents:
50113
diff
changeset
|
25 |
#ifndef SHARE_CI_CIMETHOD_HPP |
9807daeb47c4
8216167: Update include guards to reflect correct directories
coleenp
parents:
50113
diff
changeset
|
26 |
#define SHARE_CI_CIMETHOD_HPP |
7397 | 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 |
||
1 | 36 |
class ciMethodBlocks; |
37 |
class MethodLiveness; |
|
38 |
class Arena; |
|
39 |
class BCEscapeAnalyzer; |
|
29582 | 40 |
class InlineTree; |
1 | 41 |
|
46542
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
42 |
// Whether profiling found an oop to be always, never or sometimes |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
43 |
// null |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
44 |
enum ProfilePtrKind { |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
45 |
ProfileAlwaysNull, |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
46 |
ProfileNeverNull, |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
47 |
ProfileMaybeNull |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
48 |
}; |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
49 |
|
1 | 50 |
// ciMethod |
51 |
// |
|
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
52 |
// This class represents a Method* in the HotSpot virtual |
1 | 53 |
// machine. |
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
54 |
class ciMethod : public ciMetadata { |
1 | 55 |
friend class CompileBroker; |
56 |
CI_PACKAGE_ACCESS |
|
57 |
friend class ciEnv; |
|
58 |
friend class ciExceptionHandlerStream; |
|
4567
7fc02fbe5c7a
6893268: additional dynamic language related optimizations in C2
twisti
parents:
4566
diff
changeset
|
59 |
friend class ciBytecodeStream; |
7fc02fbe5c7a
6893268: additional dynamic language related optimizations in C2
twisti
parents:
4566
diff
changeset
|
60 |
friend class ciMethodHandle; |
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
61 |
friend class ciReplay; |
29582 | 62 |
friend class InlineTree; |
1 | 63 |
|
64 |
private: |
|
65 |
// General method information. |
|
66 |
ciFlags _flags; |
|
67 |
ciSymbol* _name; |
|
68 |
ciInstanceKlass* _holder; |
|
69 |
ciSignature* _signature; |
|
70 |
ciMethodData* _method_data; |
|
71 |
ciMethodBlocks* _method_blocks; |
|
72 |
||
73 |
// Code attributes. |
|
74 |
int _code_size; |
|
75 |
int _max_stack; |
|
76 |
int _max_locals; |
|
77 |
vmIntrinsics::ID _intrinsic_id; |
|
78 |
int _handler_count; |
|
24442
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
79 |
int _nmethod_age; |
1 | 80 |
int _interpreter_invocation_count; |
81 |
int _interpreter_throwout_count; |
|
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
82 |
int _instructions_size; |
24018
77b156916bab
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
23525
diff
changeset
|
83 |
int _size_of_parameters; |
1 | 84 |
|
85 |
bool _uses_monitors; |
|
86 |
bool _balanced_monitors; |
|
6453 | 87 |
bool _is_c1_compilable; |
88 |
bool _is_c2_compilable; |
|
48024
6199dfaf72da
8191688: Assert failed in > 200 tests: failed dependencies, but counter didn't change
dlong
parents:
47687
diff
changeset
|
89 |
bool _can_be_parsed; |
1 | 90 |
bool _can_be_statically_bound; |
35071
a0910b1d3e0d
8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents:
34169
diff
changeset
|
91 |
bool _has_reserved_stack_access; |
53595 | 92 |
bool _is_overpass; |
1 | 93 |
|
94 |
// Lazy fields, filled in on demand |
|
95 |
address _code; |
|
96 |
ciExceptionHandler** _exception_handlers; |
|
97 |
||
98 |
// Optional liveness analyzer. |
|
99 |
MethodLiveness* _liveness; |
|
47687 | 100 |
#if defined(COMPILER2) |
5928
f6e69b46e9e3
6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents:
5547
diff
changeset
|
101 |
ciTypeFlow* _flow; |
f6e69b46e9e3
6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents:
5547
diff
changeset
|
102 |
BCEscapeAnalyzer* _bcea; |
1 | 103 |
#endif |
104 |
||
46727
6e4a84748e2c
8183039: Re-examine methodHandle methods uninlined by 8144256
coleenp
parents:
46542
diff
changeset
|
105 |
ciMethod(const methodHandle& h_m, ciInstanceKlass* holder); |
10734
065435337883
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
10506
diff
changeset
|
106 |
ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature, ciInstanceKlass* accessor); |
1 | 107 |
|
108 |
oop loader() const { return _holder->loader(); } |
|
109 |
||
110 |
const char* type_string() { return "ciMethod"; } |
|
111 |
||
112 |
void print_impl(outputStream* st); |
|
113 |
||
114 |
void load_code(); |
|
115 |
||
46727
6e4a84748e2c
8183039: Re-examine methodHandle methods uninlined by 8144256
coleenp
parents:
46542
diff
changeset
|
116 |
bool ensure_method_data(const methodHandle& h_m); |
1 | 117 |
|
118 |
void code_at_put(int bci, Bytecodes::Code code) { |
|
119 |
Bytecodes::check(code); |
|
120 |
assert(0 <= bci && bci < code_size(), "valid bci"); |
|
121 |
address bcp = _code + bci; |
|
122 |
*bcp = code; |
|
123 |
} |
|
124 |
||
21099 | 125 |
// Check bytecode and profile data collected are compatible |
126 |
void assert_virtual_call_type_ok(int bci); |
|
127 |
void assert_call_type_ok(int bci); |
|
128 |
||
55252
6502d6a92fe2
8224162: assert(profile.count() == 0) failed: sanity in InlineTree::is_not_reached
jiefu
parents:
55105
diff
changeset
|
129 |
// Check and update the profile counter in case of overflow |
6502d6a92fe2
8224162: assert(profile.count() == 0) failed: sanity in InlineTree::is_not_reached
jiefu
parents:
55105
diff
changeset
|
130 |
static int check_overflow(int c, Bytecodes::Code code); |
6502d6a92fe2
8224162: assert(profile.count() == 0) failed: sanity in InlineTree::is_not_reached
jiefu
parents:
55105
diff
changeset
|
131 |
|
1 | 132 |
public: |
33451
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
133 |
void check_is_loaded() const { assert(is_loaded(), "not loaded"); } |
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
134 |
|
1 | 135 |
// Basic method information. |
136 |
ciFlags flags() const { check_is_loaded(); return _flags; } |
|
137 |
ciSymbol* name() const { return _name; } |
|
138 |
ciInstanceKlass* holder() const { return _holder; } |
|
139 |
ciMethodData* method_data(); |
|
7432
f06f1253c317
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents:
7397
diff
changeset
|
140 |
ciMethodData* method_data_or_null(); |
1 | 141 |
|
142 |
// Signature information. |
|
143 |
ciSignature* signature() const { return _signature; } |
|
144 |
ciType* return_type() const { return _signature->return_type(); } |
|
145 |
int arg_size_no_receiver() const { return _signature->size(); } |
|
9329
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
146 |
// Can only be used on loaded ciMethods |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
147 |
int arg_size() const { |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
148 |
check_is_loaded(); |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
149 |
return _signature->size() + (_flags.is_static() ? 0 : 1); |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
150 |
} |
43437
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
151 |
// Report the number of elements on stack when invoking the current method. |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
152 |
// If the method is loaded, arg_size() gives precise information about the |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
153 |
// number of stack elements (using the method's signature and its flags). |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
154 |
// However, if the method is not loaded, the number of stack elements must |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
155 |
// be determined differently, as the method's flags are not yet available. |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
156 |
// The invoke_arg_size() method assumes in that case that all bytecodes except |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
157 |
// invokestatic and invokedynamic have a receiver that is also pushed onto the |
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
158 |
// stack by the caller of the current method. |
9329
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
159 |
int invoke_arg_size(Bytecodes::Code code) const { |
13391
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
160 |
if (is_loaded()) { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
161 |
return arg_size(); |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
162 |
} else { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
163 |
int arg_size = _signature->size(); |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
164 |
if (code != Bytecodes::_invokestatic && |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
165 |
code != Bytecodes::_invokedynamic) { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
166 |
arg_size++; |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
167 |
} |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
168 |
return arg_size; |
9329
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
169 |
} |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
170 |
} |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
171 |
|
29582 | 172 |
Method* get_Method() const { |
173 |
Method* m = (Method*)_metadata; |
|
174 |
assert(m != NULL, "illegal use of unloaded method"); |
|
175 |
return m; |
|
176 |
} |
|
1 | 177 |
|
178 |
// Method code and related information. |
|
179 |
address code() { if (_code == NULL) load_code(); return _code; } |
|
180 |
int code_size() const { check_is_loaded(); return _code_size; } |
|
181 |
int max_stack() const { check_is_loaded(); return _max_stack; } |
|
182 |
int max_locals() const { check_is_loaded(); return _max_locals; } |
|
183 |
vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; } |
|
184 |
bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; } |
|
185 |
int exception_table_length() const { check_is_loaded(); return _handler_count; } |
|
186 |
int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; } |
|
187 |
int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; } |
|
24018
77b156916bab
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
23525
diff
changeset
|
188 |
int size_of_parameters() const { check_is_loaded(); return _size_of_parameters; } |
24442
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
189 |
int nmethod_age() const { check_is_loaded(); return _nmethod_age; } |
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
190 |
|
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
191 |
// Should the method be compiled with an age counter? |
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
192 |
bool profile_aging() const; |
1 | 193 |
|
10506
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
194 |
// Code size for inlining decisions. |
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
195 |
int code_size_for_inlining(); |
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
196 |
|
53632
d620a4a1d5ed
8188133: C2: Static field accesses in clinit can trigger deoptimizations
vlivanov
parents:
53595
diff
changeset
|
197 |
bool caller_sensitive() const { return get_Method()->caller_sensitive(); } |
d620a4a1d5ed
8188133: C2: Static field accesses in clinit can trigger deoptimizations
vlivanov
parents:
53595
diff
changeset
|
198 |
bool force_inline() const { return get_Method()->force_inline(); } |
d620a4a1d5ed
8188133: C2: Static field accesses in clinit can trigger deoptimizations
vlivanov
parents:
53595
diff
changeset
|
199 |
bool dont_inline() const { return get_Method()->dont_inline(); } |
d620a4a1d5ed
8188133: C2: Static field accesses in clinit can trigger deoptimizations
vlivanov
parents:
53595
diff
changeset
|
200 |
bool intrinsic_candidate() const { return get_Method()->intrinsic_candidate(); } |
d620a4a1d5ed
8188133: C2: Static field accesses in clinit can trigger deoptimizations
vlivanov
parents:
53595
diff
changeset
|
201 |
bool is_static_initializer() const { return get_Method()->is_static_initializer(); } |
13291
9de3b1387cb8
6711908: JVM needs direct access to some annotations
jrose
parents:
11193
diff
changeset
|
202 |
|
6453 | 203 |
int comp_level(); |
10014
a5c2141ee857
7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents:
9329
diff
changeset
|
204 |
int highest_osr_comp_level(); |
6453 | 205 |
|
1 | 206 |
Bytecodes::Code java_code_at_bci(int bci) { |
207 |
address bcp = code() + bci; |
|
7913 | 208 |
return Bytecodes::java_code_at(NULL, bcp); |
1 | 209 |
} |
19710
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
210 |
Bytecodes::Code raw_code_at_bci(int bci) { |
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
211 |
address bcp = code() + bci; |
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
212 |
return Bytecodes::code_at(NULL, bcp); |
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
213 |
} |
1 | 214 |
BCEscapeAnalyzer *get_bcea(); |
215 |
ciMethodBlocks *get_method_blocks(); |
|
216 |
||
217 |
bool has_linenumber_table() const; // length unknown until decompression |
|
218 |
u_char* compressed_linenumber_table() const; // not preserved by gc |
|
219 |
||
220 |
int line_number_from_bci(int bci) const; |
|
221 |
||
222 |
// Runtime information. |
|
223 |
int vtable_index(); |
|
224 |
address native_entry(); |
|
225 |
address interpreter_entry(); |
|
226 |
||
227 |
// Analysis and profiling. |
|
228 |
// |
|
229 |
// Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks. |
|
230 |
bool has_monitor_bytecodes() const { return _uses_monitors; } |
|
231 |
bool has_balanced_monitors(); |
|
232 |
||
3910 | 233 |
// Returns a bitmap indicating which locals are required to be |
234 |
// maintained as live for deopt. raw_liveness_at_bci is always the |
|
235 |
// direct output of the liveness computation while liveness_at_bci |
|
236 |
// may mark all locals as live to improve support for debugging Java |
|
237 |
// code by maintaining the state of as many locals as possible. |
|
238 |
MethodLivenessResult raw_liveness_at_bci(int bci); |
|
1 | 239 |
MethodLivenessResult liveness_at_bci(int bci); |
240 |
||
241 |
// Get the interpreters viewpoint on oop liveness. MethodLiveness is |
|
242 |
// conservative in the sense that it may consider locals to be live which |
|
243 |
// cannot be live, like in the case where a local could contain an oop or |
|
244 |
// a primitive along different paths. In that case the local must be |
|
245 |
// dead when those paths merge. Since the interpreter's viewpoint is |
|
246 |
// used when gc'ing an interpreter frame we need to use its viewpoint |
|
247 |
// during OSR when loading the locals. |
|
248 |
||
38177 | 249 |
ResourceBitMap live_local_oops_at_bci(int bci); |
1 | 250 |
|
55105
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
54721
diff
changeset
|
251 |
bool needs_clinit_barrier() const; |
9ad765641e8f
8223213: Implement fast class initialization checks on x86-64
vlivanov
parents:
54721
diff
changeset
|
252 |
|
1 | 253 |
#ifdef COMPILER1 |
38177 | 254 |
const BitMap& bci_block_start(); |
1 | 255 |
#endif |
256 |
||
257 |
ciTypeFlow* get_flow_analysis(); |
|
258 |
ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point |
|
259 |
ciCallProfile call_profile_at_bci(int bci); |
|
260 |
int interpreter_call_site_count(int bci); |
|
261 |
||
23525
e3eb08ead679
8031755: Type speculation should be used to optimize explicit null checks
roland
parents:
22243
diff
changeset
|
262 |
// Does type profiling provide any useful information at this point? |
46542
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
263 |
bool argument_profiled_type(int bci, int i, ciKlass*& type, ProfilePtrKind& ptr_kind); |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
264 |
bool parameter_profiled_type(int i, ciKlass*& type, ProfilePtrKind& ptr_kind); |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
265 |
bool return_profiled_type(int bci, ciKlass*& type, ProfilePtrKind& ptr_kind); |
21099 | 266 |
|
14621
fd9265ab0f67
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
14478
diff
changeset
|
267 |
ciField* get_field_at_bci( int bci, bool &will_link); |
fd9265ab0f67
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
14478
diff
changeset
|
268 |
ciMethod* get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature); |
35086
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
269 |
ciMethod* get_method_at_bci(int bci) { |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
270 |
bool ignored_will_link; |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
271 |
ciSignature* ignored_declared_signature; |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
272 |
return get_method_at_bci(bci, ignored_will_link, &ignored_declared_signature); |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
273 |
} |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
274 |
|
53595 | 275 |
ciKlass* get_declared_method_holder_at_bci(int bci); |
276 |
||
41698
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
277 |
ciSignature* get_declared_signature_at_bci(int bci) { |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
278 |
bool ignored_will_link; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
279 |
ciSignature* declared_signature; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
280 |
get_method_at_bci(bci, ignored_will_link, &declared_signature); |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
281 |
assert(declared_signature != NULL, "cannot be null"); |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
282 |
return declared_signature; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
283 |
} |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
284 |
|
1 | 285 |
// Given a certain calling environment, find the monomorphic target |
286 |
// for the call. Return NULL if the call is not monomorphic in |
|
287 |
// its calling environment. |
|
288 |
ciMethod* find_monomorphic_target(ciInstanceKlass* caller, |
|
289 |
ciInstanceKlass* callee_holder, |
|
30223
82ab7b6b4927
8062280: C2: inlining failure due to access checks being too strict
vlivanov
parents:
29582
diff
changeset
|
290 |
ciInstanceKlass* actual_receiver, |
82ab7b6b4927
8062280: C2: inlining failure due to access checks being too strict
vlivanov
parents:
29582
diff
changeset
|
291 |
bool check_access = true); |
1 | 292 |
|
293 |
// Given a known receiver klass, find the target for the call. |
|
294 |
// Return NULL if the call has no target or is abstract. |
|
30223
82ab7b6b4927
8062280: C2: inlining failure due to access checks being too strict
vlivanov
parents:
29582
diff
changeset
|
295 |
ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access = true); |
1 | 296 |
|
297 |
// Find the proper vtable index to invoke this method. |
|
298 |
int resolve_vtable_index(ciKlass* caller, ciKlass* receiver); |
|
299 |
||
300 |
bool has_option(const char *option); |
|
33451
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
301 |
bool has_option_value(const char* option, double& value); |
1 | 302 |
bool can_be_compiled(); |
48024
6199dfaf72da
8191688: Assert failed in > 200 tests: failed dependencies, but counter didn't change
dlong
parents:
47687
diff
changeset
|
303 |
bool can_be_parsed() const { return _can_be_parsed; } |
1 | 304 |
bool can_be_osr_compiled(int entry_bci); |
15479 | 305 |
void set_not_compilable(const char* reason = NULL); |
1 | 306 |
bool has_compiled_code(); |
307 |
void log_nmethod_identity(xmlStream* log); |
|
308 |
bool is_not_reached(int bci); |
|
309 |
bool was_executed_more_than(int times); |
|
310 |
bool has_unloaded_classes_in_signature(); |
|
311 |
bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const; |
|
312 |
bool check_call(int refinfo_index, bool is_static) const; |
|
7432
f06f1253c317
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents:
7397
diff
changeset
|
313 |
bool ensure_method_data(); // make sure it exists in the VM also |
20695
4f5a5e95090b
8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents:
19710
diff
changeset
|
314 |
MethodCounters* ensure_method_counters(); |
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
315 |
int instructions_size(); |
1 | 316 |
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC |
4581
e89fbd1bcb3d
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
4567
diff
changeset
|
317 |
|
16617
6235d2c7549f
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
15479
diff
changeset
|
318 |
// Stack walking support |
6235d2c7549f
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
15479
diff
changeset
|
319 |
bool is_ignored_by_security_stack_walk() const; |
6235d2c7549f
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
15479
diff
changeset
|
320 |
|
4581
e89fbd1bcb3d
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
4567
diff
changeset
|
321 |
// JSR 292 support |
13391
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
322 |
bool is_method_handle_intrinsic() const; |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
323 |
bool is_compiled_lambda_form() const; |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
324 |
bool has_member_arg() const; |
1 | 325 |
|
326 |
// What kind of ciObject is this? |
|
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
327 |
bool is_method() const { return true; } |
1 | 328 |
|
329 |
// Java access flags |
|
330 |
bool is_public () const { return flags().is_public(); } |
|
331 |
bool is_private () const { return flags().is_private(); } |
|
332 |
bool is_protected () const { return flags().is_protected(); } |
|
333 |
bool is_static () const { return flags().is_static(); } |
|
334 |
bool is_final () const { return flags().is_final(); } |
|
335 |
bool is_synchronized() const { return flags().is_synchronized(); } |
|
336 |
bool is_native () const { return flags().is_native(); } |
|
337 |
bool is_interface () const { return flags().is_interface(); } |
|
338 |
bool is_abstract () const { return flags().is_abstract(); } |
|
339 |
bool is_strict () const { return flags().is_strict(); } |
|
340 |
||
341 |
// Other flags |
|
342 |
bool is_empty_method() const; |
|
343 |
bool is_vanilla_constructor() const; |
|
344 |
bool is_final_method() const { return is_final() || holder()->is_final(); } |
|
53595 | 345 |
bool is_default_method() const { return !is_abstract() && !is_private() && |
346 |
holder()->is_interface(); } |
|
347 |
bool is_overpass () const { check_is_loaded(); return _is_overpass; } |
|
1 | 348 |
bool has_loops () const; |
349 |
bool has_jsrs () const; |
|
34169
b0b7187852b7
8140650: Method::is_accessor should cover getters and setters for all types
shade
parents:
33451
diff
changeset
|
350 |
bool is_getter () const; |
b0b7187852b7
8140650: Method::is_accessor should cover getters and setters for all types
shade
parents:
33451
diff
changeset
|
351 |
bool is_setter () const; |
1 | 352 |
bool is_accessor () const; |
353 |
bool is_initializer () const; |
|
354 |
bool can_be_statically_bound() const { return _can_be_statically_bound; } |
|
35071
a0910b1d3e0d
8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents:
34169
diff
changeset
|
355 |
bool has_reserved_stack_access() const { return _has_reserved_stack_access; } |
17383 | 356 |
bool is_boxing_method() const; |
357 |
bool is_unboxing_method() const; |
|
44738 | 358 |
bool is_object_initializer() const; |
1 | 359 |
|
54721
3661ad97da8f
8223171: Redundant nmethod dependencies for effectively final methods
vlivanov
parents:
53632
diff
changeset
|
360 |
bool can_be_statically_bound(ciInstanceKlass* context) const; |
3661ad97da8f
8223171: Redundant nmethod dependencies for effectively final methods
vlivanov
parents:
53632
diff
changeset
|
361 |
|
22243 | 362 |
// Replay data methods |
363 |
void dump_name_as_ascii(outputStream* st); |
|
364 |
void dump_replay_data(outputStream* st); |
|
365 |
||
1 | 366 |
// Print the bytecodes of this method. |
367 |
void print_codes_on(outputStream* st); |
|
368 |
void print_codes() { |
|
369 |
print_codes_on(tty); |
|
370 |
} |
|
371 |
void print_codes_on(int from, int to, outputStream* st); |
|
372 |
||
373 |
// Print the name of this method in various incarnations. |
|
374 |
void print_name(outputStream* st = tty); |
|
375 |
void print_short_name(outputStream* st = tty); |
|
29582 | 376 |
|
43947
a52ee13998f3
8174721: C1: Inlining through MH invokers/linkers in unreachable code is unsafe
vlivanov
parents:
43437
diff
changeset
|
377 |
static bool is_consistent_info(ciMethod* declared_method, ciMethod* resolved_method); |
1 | 378 |
}; |
7397 | 379 |
|
53244
9807daeb47c4
8216167: Update include guards to reflect correct directories
coleenp
parents:
50113
diff
changeset
|
380 |
#endif // SHARE_CI_CIMETHOD_HPP |