author | dlong |
Wed, 22 Nov 2017 09:27:06 -0800 | |
changeset 48024 | 6199dfaf72da |
parent 47687 | fb290fd1f9d4 |
child 50113 | caf115bb98ad |
permissions | -rw-r--r-- |
1 | 1 |
/* |
46727
6e4a84748e2c
8183039: Re-examine methodHandle methods uninlined by 8144256
coleenp
parents:
46542
diff
changeset
|
2 |
* Copyright (c) 1999, 2017, 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 |
||
7397 | 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" |
|
29582 | 35 |
#include "trace/tracing.hpp" |
7397 | 36 |
|
1 | 37 |
class ciMethodBlocks; |
38 |
class MethodLiveness; |
|
39 |
class Arena; |
|
40 |
class BCEscapeAnalyzer; |
|
29582 | 41 |
class InlineTree; |
1 | 42 |
|
46542
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
43 |
// 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
|
44 |
// null |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
45 |
enum ProfilePtrKind { |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
46 |
ProfileAlwaysNull, |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
47 |
ProfileNeverNull, |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
48 |
ProfileMaybeNull |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
49 |
}; |
73dd19b96b5d
8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents:
44738
diff
changeset
|
50 |
|
1 | 51 |
// ciMethod |
52 |
// |
|
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
53 |
// This class represents a Method* in the HotSpot virtual |
1 | 54 |
// machine. |
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
55 |
class ciMethod : public ciMetadata { |
1 | 56 |
friend class CompileBroker; |
57 |
CI_PACKAGE_ACCESS |
|
58 |
friend class ciEnv; |
|
59 |
friend class ciExceptionHandlerStream; |
|
4567
7fc02fbe5c7a
6893268: additional dynamic language related optimizations in C2
twisti
parents:
4566
diff
changeset
|
60 |
friend class ciBytecodeStream; |
7fc02fbe5c7a
6893268: additional dynamic language related optimizations in C2
twisti
parents:
4566
diff
changeset
|
61 |
friend class ciMethodHandle; |
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
62 |
friend class ciReplay; |
29582 | 63 |
friend class InlineTree; |
1 | 64 |
|
65 |
private: |
|
66 |
// General method information. |
|
67 |
ciFlags _flags; |
|
68 |
ciSymbol* _name; |
|
69 |
ciInstanceKlass* _holder; |
|
70 |
ciSignature* _signature; |
|
71 |
ciMethodData* _method_data; |
|
72 |
ciMethodBlocks* _method_blocks; |
|
73 |
||
74 |
// Code attributes. |
|
75 |
int _code_size; |
|
76 |
int _max_stack; |
|
77 |
int _max_locals; |
|
78 |
vmIntrinsics::ID _intrinsic_id; |
|
79 |
int _handler_count; |
|
24442
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
80 |
int _nmethod_age; |
1 | 81 |
int _interpreter_invocation_count; |
82 |
int _interpreter_throwout_count; |
|
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
83 |
int _instructions_size; |
24018
77b156916bab
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
23525
diff
changeset
|
84 |
int _size_of_parameters; |
1 | 85 |
|
86 |
bool _uses_monitors; |
|
87 |
bool _balanced_monitors; |
|
6453 | 88 |
bool _is_c1_compilable; |
89 |
bool _is_c2_compilable; |
|
48024
6199dfaf72da
8191688: Assert failed in > 200 tests: failed dependencies, but counter didn't change
dlong
parents:
47687
diff
changeset
|
90 |
bool _can_be_parsed; |
1 | 91 |
bool _can_be_statically_bound; |
35071
a0910b1d3e0d
8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents:
34169
diff
changeset
|
92 |
bool _has_reserved_stack_access; |
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 |
||
1 | 129 |
public: |
33451
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
130 |
void check_is_loaded() const { assert(is_loaded(), "not loaded"); } |
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
131 |
|
1 | 132 |
// Basic method information. |
133 |
ciFlags flags() const { check_is_loaded(); return _flags; } |
|
134 |
ciSymbol* name() const { return _name; } |
|
135 |
ciInstanceKlass* holder() const { return _holder; } |
|
136 |
ciMethodData* method_data(); |
|
7432
f06f1253c317
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents:
7397
diff
changeset
|
137 |
ciMethodData* method_data_or_null(); |
1 | 138 |
|
139 |
// Signature information. |
|
140 |
ciSignature* signature() const { return _signature; } |
|
141 |
ciType* return_type() const { return _signature->return_type(); } |
|
142 |
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
|
143 |
// 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
|
144 |
int arg_size() const { |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
145 |
check_is_loaded(); |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
146 |
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
|
147 |
} |
43437
90e15b78684e
8168926: C2: Bytecode escape analyzer crashes due to stack overflow
zmajo
parents:
41698
diff
changeset
|
148 |
// 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
|
149 |
// 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
|
150 |
// 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
|
151 |
// 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
|
152 |
// 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
|
153 |
// 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
|
154 |
// 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
|
155 |
// 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
|
156 |
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
|
157 |
if (is_loaded()) { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
158 |
return arg_size(); |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
159 |
} else { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
160 |
int arg_size = _signature->size(); |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
161 |
if (code != Bytecodes::_invokestatic && |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
162 |
code != Bytecodes::_invokedynamic) { |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
163 |
arg_size++; |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
164 |
} |
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
165 |
return arg_size; |
9329
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
166 |
} |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
167 |
} |
79c74b9e2afe
7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents:
9323
diff
changeset
|
168 |
|
29582 | 169 |
Method* get_Method() const { |
170 |
Method* m = (Method*)_metadata; |
|
171 |
assert(m != NULL, "illegal use of unloaded method"); |
|
172 |
return m; |
|
173 |
} |
|
1 | 174 |
|
175 |
// Method code and related information. |
|
176 |
address code() { if (_code == NULL) load_code(); return _code; } |
|
177 |
int code_size() const { check_is_loaded(); return _code_size; } |
|
178 |
int max_stack() const { check_is_loaded(); return _max_stack; } |
|
179 |
int max_locals() const { check_is_loaded(); return _max_locals; } |
|
180 |
vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; } |
|
181 |
bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; } |
|
182 |
int exception_table_length() const { check_is_loaded(); return _handler_count; } |
|
183 |
int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; } |
|
184 |
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
|
185 |
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
|
186 |
int nmethod_age() const { check_is_loaded(); return _nmethod_age; } |
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
187 |
|
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
188 |
// Should the method be compiled with an age counter? |
4d4ae31dea26
8032463: VirtualDispatch test timeout with DeoptimizeALot
iveresov
parents:
24018
diff
changeset
|
189 |
bool profile_aging() const; |
1 | 190 |
|
10506
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
191 |
// Code size for inlining decisions. |
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
192 |
int code_size_for_inlining(); |
575ad9bccff5
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
10014
diff
changeset
|
193 |
|
31587
e48945b7849c
8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents:
31228
diff
changeset
|
194 |
bool caller_sensitive() const { return get_Method()->caller_sensitive(); } |
e48945b7849c
8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents:
31228
diff
changeset
|
195 |
bool force_inline() const { return get_Method()->force_inline(); } |
e48945b7849c
8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents:
31228
diff
changeset
|
196 |
bool dont_inline() const { return get_Method()->dont_inline(); } |
e48945b7849c
8076112: Add @HotSpotIntrinsicCandidate annotation to indicate methods for which Java Runtime has intrinsics
zmajo
parents:
31228
diff
changeset
|
197 |
bool intrinsic_candidate() const { return get_Method()->intrinsic_candidate(); } |
13291
9de3b1387cb8
6711908: JVM needs direct access to some annotations
jrose
parents:
11193
diff
changeset
|
198 |
|
6453 | 199 |
int comp_level(); |
10014
a5c2141ee857
7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents:
9329
diff
changeset
|
200 |
int highest_osr_comp_level(); |
6453 | 201 |
|
1 | 202 |
Bytecodes::Code java_code_at_bci(int bci) { |
203 |
address bcp = code() + bci; |
|
7913 | 204 |
return Bytecodes::java_code_at(NULL, bcp); |
1 | 205 |
} |
19710
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
206 |
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
|
207 |
address bcp = code() + bci; |
2f8ca425504e
7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents:
17383
diff
changeset
|
208 |
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
|
209 |
} |
1 | 210 |
BCEscapeAnalyzer *get_bcea(); |
211 |
ciMethodBlocks *get_method_blocks(); |
|
212 |
||
213 |
bool has_linenumber_table() const; // length unknown until decompression |
|
214 |
u_char* compressed_linenumber_table() const; // not preserved by gc |
|
215 |
||
216 |
int line_number_from_bci(int bci) const; |
|
217 |
||
218 |
// Runtime information. |
|
219 |
int vtable_index(); |
|
220 |
address native_entry(); |
|
221 |
address interpreter_entry(); |
|
222 |
||
223 |
// Analysis and profiling. |
|
224 |
// |
|
225 |
// Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks. |
|
226 |
bool has_monitor_bytecodes() const { return _uses_monitors; } |
|
227 |
bool has_balanced_monitors(); |
|
228 |
||
3910 | 229 |
// Returns a bitmap indicating which locals are required to be |
230 |
// maintained as live for deopt. raw_liveness_at_bci is always the |
|
231 |
// direct output of the liveness computation while liveness_at_bci |
|
232 |
// may mark all locals as live to improve support for debugging Java |
|
233 |
// code by maintaining the state of as many locals as possible. |
|
234 |
MethodLivenessResult raw_liveness_at_bci(int bci); |
|
1 | 235 |
MethodLivenessResult liveness_at_bci(int bci); |
236 |
||
237 |
// Get the interpreters viewpoint on oop liveness. MethodLiveness is |
|
238 |
// conservative in the sense that it may consider locals to be live which |
|
239 |
// cannot be live, like in the case where a local could contain an oop or |
|
240 |
// a primitive along different paths. In that case the local must be |
|
241 |
// dead when those paths merge. Since the interpreter's viewpoint is |
|
242 |
// used when gc'ing an interpreter frame we need to use its viewpoint |
|
243 |
// during OSR when loading the locals. |
|
244 |
||
38177 | 245 |
ResourceBitMap live_local_oops_at_bci(int bci); |
1 | 246 |
|
247 |
#ifdef COMPILER1 |
|
38177 | 248 |
const BitMap& bci_block_start(); |
1 | 249 |
#endif |
250 |
||
251 |
ciTypeFlow* get_flow_analysis(); |
|
252 |
ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point |
|
253 |
ciCallProfile call_profile_at_bci(int bci); |
|
254 |
int interpreter_call_site_count(int bci); |
|
255 |
||
23525
e3eb08ead679
8031755: Type speculation should be used to optimize explicit null checks
roland
parents:
22243
diff
changeset
|
256 |
// 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
|
257 |
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
|
258 |
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
|
259 |
bool return_profiled_type(int bci, ciKlass*& type, ProfilePtrKind& ptr_kind); |
21099 | 260 |
|
14621
fd9265ab0f67
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
14478
diff
changeset
|
261 |
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
|
262 |
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
|
263 |
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
|
264 |
bool ignored_will_link; |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
265 |
ciSignature* ignored_declared_signature; |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
266 |
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
|
267 |
} |
bbf32241d851
8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents:
34169
diff
changeset
|
268 |
|
41698
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
269 |
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
|
270 |
bool ignored_will_link; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
271 |
ciSignature* declared_signature; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
272 |
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
|
273 |
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
|
274 |
return declared_signature; |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
275 |
} |
a3f113541801
8134389: Crash in HotSpot with jvm.dll+0x42b48 ciObjectFactory::create_new_metadata
jcm
parents:
40664
diff
changeset
|
276 |
|
1 | 277 |
// Given a certain calling environment, find the monomorphic target |
278 |
// for the call. Return NULL if the call is not monomorphic in |
|
279 |
// its calling environment. |
|
280 |
ciMethod* find_monomorphic_target(ciInstanceKlass* caller, |
|
281 |
ciInstanceKlass* callee_holder, |
|
30223
82ab7b6b4927
8062280: C2: inlining failure due to access checks being too strict
vlivanov
parents:
29582
diff
changeset
|
282 |
ciInstanceKlass* actual_receiver, |
82ab7b6b4927
8062280: C2: inlining failure due to access checks being too strict
vlivanov
parents:
29582
diff
changeset
|
283 |
bool check_access = true); |
1 | 284 |
|
285 |
// Given a known receiver klass, find the target for the call. |
|
286 |
// 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
|
287 |
ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access = true); |
1 | 288 |
|
289 |
// Find the proper vtable index to invoke this method. |
|
290 |
int resolve_vtable_index(ciKlass* caller, ciKlass* receiver); |
|
291 |
||
292 |
bool has_option(const char *option); |
|
33451
0712796e4039
8137167: JEP165: Compiler Control: Implementation task
neliasso
parents:
33069
diff
changeset
|
293 |
bool has_option_value(const char* option, double& value); |
1 | 294 |
bool can_be_compiled(); |
48024
6199dfaf72da
8191688: Assert failed in > 200 tests: failed dependencies, but counter didn't change
dlong
parents:
47687
diff
changeset
|
295 |
bool can_be_parsed() const { return _can_be_parsed; } |
1 | 296 |
bool can_be_osr_compiled(int entry_bci); |
15479 | 297 |
void set_not_compilable(const char* reason = NULL); |
1 | 298 |
bool has_compiled_code(); |
299 |
void log_nmethod_identity(xmlStream* log); |
|
300 |
bool is_not_reached(int bci); |
|
301 |
bool was_executed_more_than(int times); |
|
302 |
bool has_unloaded_classes_in_signature(); |
|
303 |
bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const; |
|
304 |
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
|
305 |
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
|
306 |
MethodCounters* ensure_method_counters(); |
14477
95e66ea71f71
6830717: replay of compilations would help with debugging
minqi
parents:
13728
diff
changeset
|
307 |
int instructions_size(); |
1 | 308 |
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
|
309 |
|
16617
6235d2c7549f
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
15479
diff
changeset
|
310 |
// Stack walking support |
6235d2c7549f
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
15479
diff
changeset
|
311 |
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
|
312 |
|
4581
e89fbd1bcb3d
6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents:
4567
diff
changeset
|
313 |
// JSR 292 support |
13391
30245956af37
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13291
diff
changeset
|
314 |
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
|
315 |
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
|
316 |
bool has_member_arg() const; |
1 | 317 |
|
318 |
// What kind of ciObject is this? |
|
13728
882756847a04
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
13391
diff
changeset
|
319 |
bool is_method() const { return true; } |
1 | 320 |
|
321 |
// Java access flags |
|
322 |
bool is_public () const { return flags().is_public(); } |
|
323 |
bool is_private () const { return flags().is_private(); } |
|
324 |
bool is_protected () const { return flags().is_protected(); } |
|
325 |
bool is_static () const { return flags().is_static(); } |
|
326 |
bool is_final () const { return flags().is_final(); } |
|
327 |
bool is_synchronized() const { return flags().is_synchronized(); } |
|
328 |
bool is_native () const { return flags().is_native(); } |
|
329 |
bool is_interface () const { return flags().is_interface(); } |
|
330 |
bool is_abstract () const { return flags().is_abstract(); } |
|
331 |
bool is_strict () const { return flags().is_strict(); } |
|
332 |
||
333 |
// Other flags |
|
334 |
bool is_empty_method() const; |
|
335 |
bool is_vanilla_constructor() const; |
|
336 |
bool is_final_method() const { return is_final() || holder()->is_final(); } |
|
337 |
bool has_loops () const; |
|
338 |
bool has_jsrs () const; |
|
34169
b0b7187852b7
8140650: Method::is_accessor should cover getters and setters for all types
shade
parents:
33451
diff
changeset
|
339 |
bool is_getter () const; |
b0b7187852b7
8140650: Method::is_accessor should cover getters and setters for all types
shade
parents:
33451
diff
changeset
|
340 |
bool is_setter () const; |
1 | 341 |
bool is_accessor () const; |
342 |
bool is_initializer () const; |
|
343 |
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
|
344 |
bool has_reserved_stack_access() const { return _has_reserved_stack_access; } |
17383 | 345 |
bool is_boxing_method() const; |
346 |
bool is_unboxing_method() const; |
|
44738 | 347 |
bool is_object_initializer() const; |
1 | 348 |
|
22243 | 349 |
// Replay data methods |
350 |
void dump_name_as_ascii(outputStream* st); |
|
351 |
void dump_replay_data(outputStream* st); |
|
352 |
||
1 | 353 |
// Print the bytecodes of this method. |
354 |
void print_codes_on(outputStream* st); |
|
355 |
void print_codes() { |
|
356 |
print_codes_on(tty); |
|
357 |
} |
|
358 |
void print_codes_on(int from, int to, outputStream* st); |
|
359 |
||
360 |
// Print the name of this method in various incarnations. |
|
361 |
void print_name(outputStream* st = tty); |
|
362 |
void print_short_name(outputStream* st = tty); |
|
29582 | 363 |
|
43947
a52ee13998f3
8174721: C1: Inlining through MH invokers/linkers in unreachable code is unsafe
vlivanov
parents:
43437
diff
changeset
|
364 |
static bool is_consistent_info(ciMethod* declared_method, ciMethod* resolved_method); |
a52ee13998f3
8174721: C1: Inlining through MH invokers/linkers in unreachable code is unsafe
vlivanov
parents:
43437
diff
changeset
|
365 |
|
29582 | 366 |
#if INCLUDE_TRACE |
40664
1ec65b303bb7
8164523: Clean up metadata for event based tracing
egahlin
parents:
38177
diff
changeset
|
367 |
TraceStructCalleeMethod to_trace_struct() const; |
29582 | 368 |
#endif |
1 | 369 |
}; |
7397 | 370 |
|
371 |
#endif // SHARE_VM_CI_CIMETHOD_HPP |