annotate src/share/vm/ci/ciMethod.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 119875f0fc67
children 6a528388c7da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1152
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1152
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1152
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #ifndef SHARE_VM_CI_CIMETHOD_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #define SHARE_VM_CI_CIMETHOD_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "ci/ciFlags.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "ci/ciInstanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "ci/ciObject.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "ci/ciSignature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "utilities/bitMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class ciMethodBlocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class MethodLiveness;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class BitMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class Arena;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class BCEscapeAnalyzer;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // ciMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
45 // This class represents a Method* in the HotSpot virtual
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // machine.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
47 class ciMethod : public ciMetadata {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 friend class CompileBroker;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 CI_PACKAGE_ACCESS
a61af66fc99e Initial load
duke
parents:
diff changeset
50 friend class ciEnv;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 friend class ciExceptionHandlerStream;
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
52 friend class ciBytecodeStream;
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
53 friend class ciMethodHandle;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6725
diff changeset
54 friend class ciReplay;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // General method information.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 ciFlags _flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 ciSymbol* _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 ciInstanceKlass* _holder;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 ciSignature* _signature;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ciMethodData* _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 ciMethodBlocks* _method_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Code attributes.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int _code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 int _max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 int _max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 vmIntrinsics::ID _intrinsic_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 int _handler_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 int _interpreter_invocation_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 int _interpreter_throwout_count;
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6725
diff changeset
73 int _instructions_size;
17980
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
74 int _size_of_parameters;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 bool _uses_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bool _balanced_monitors;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
78 bool _is_c1_compilable;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
79 bool _is_c2_compilable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 bool _can_be_statically_bound;
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Lazy fields, filled in on demand
a61af66fc99e Initial load
duke
parents:
diff changeset
83 address _code;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 ciExceptionHandler** _exception_handlers;
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Optional liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
87 MethodLiveness* _liveness;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
88 #if defined(COMPILER2) || defined(SHARK)
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1552
diff changeset
89 ciTypeFlow* _flow;
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1552
diff changeset
90 BCEscapeAnalyzer* _bcea;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 ciMethod(methodHandle h_m);
4001
5eb9169b1a14 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 3897
diff changeset
94 ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature, ciInstanceKlass* accessor);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
96 Method* get_Method() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
97 Method* m = (Method*)_metadata;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 assert(m != NULL, "illegal use of unloaded method");
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 oop loader() const { return _holder->loader(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 const char* type_string() { return "ciMethod"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void print_impl(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 void load_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void check_is_loaded() const { assert(is_loaded(), "not loaded"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
112 bool ensure_method_data(methodHandle h_m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void code_at_put(int bci, Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 Bytecodes::check(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert(0 <= bci && bci < code_size(), "valid bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 address bcp = _code + bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 *bcp = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
121 // Check bytecode and profile data collected are compatible
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
122 void assert_virtual_call_type_ok(int bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
123 void assert_call_type_ok(int bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
124
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Basic method information.
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ciFlags flags() const { check_is_loaded(); return _flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 ciSymbol* name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 ciInstanceKlass* holder() const { return _holder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 ciMethodData* method_data();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
131 ciMethodData* method_data_or_null();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // Signature information.
a61af66fc99e Initial load
duke
parents:
diff changeset
134 ciSignature* signature() const { return _signature; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 ciType* return_type() const { return _signature->return_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 int arg_size_no_receiver() const { return _signature->size(); }
3280
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
137 // Can only be used on loaded ciMethods
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
138 int arg_size() const {
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
139 check_is_loaded();
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
140 return _signature->size() + (_flags.is_static() ? 0 : 1);
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
141 }
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
142 // Report the number of elements on stack when invoking this method.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
143 // This is different than the regular arg_size because invokedynamic
3280
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
144 // has an implicit receiver.
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
145 int invoke_arg_size(Bytecodes::Code code) const {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
146 if (is_loaded()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
147 return arg_size();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
148 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
149 int arg_size = _signature->size();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
150 // Add a receiver argument, maybe:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
151 if (code != Bytecodes::_invokestatic &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
152 code != Bytecodes::_invokedynamic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
153 arg_size++;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
154 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
155 return arg_size;
3280
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
156 }
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
157 }
548597e74aa4 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 3274
diff changeset
158
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Method code and related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 address code() { if (_code == NULL) load_code(); return _code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 int code_size() const { check_is_loaded(); return _code_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int max_stack() const { check_is_loaded(); return _max_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 int max_locals() const { check_is_loaded(); return _max_locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
167 int exception_table_length() const { check_is_loaded(); return _handler_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
168 int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; }
17980
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
170 int size_of_parameters() const { check_is_loaded(); return _size_of_parameters; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171
3897
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
172 // Code size for inlining decisions.
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
173 int code_size_for_inlining();
de847cac9235 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 3791
diff changeset
174
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
175 bool caller_sensitive() { return get_Method()->caller_sensitive(); }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
176 bool force_inline() { return get_Method()->force_inline(); }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
177 bool dont_inline() { return get_Method()->dont_inline(); }
6222
6d8f36bcef55 6711908: JVM needs direct access to some annotations
jrose
parents: 4117
diff changeset
178
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
179 int comp_level();
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3280
diff changeset
180 int highest_osr_comp_level();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
181
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 Bytecodes::Code java_code_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 address bcp = code() + bci;
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2007
diff changeset
184 return Bytecodes::java_code_at(NULL, bcp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
12160
f98f5d48f511 7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents: 10278
diff changeset
186 Bytecodes::Code raw_code_at_bci(int bci) {
f98f5d48f511 7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents: 10278
diff changeset
187 address bcp = code() + bci;
f98f5d48f511 7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents: 10278
diff changeset
188 return Bytecodes::code_at(NULL, bcp);
f98f5d48f511 7199175: JSR 292: C1 needs patching when invokedynamic/invokehandle call site is not linked
roland
parents: 10278
diff changeset
189 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 BCEscapeAnalyzer *get_bcea();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 ciMethodBlocks *get_method_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 bool has_linenumber_table() const; // length unknown until decompression
a61af66fc99e Initial load
duke
parents:
diff changeset
194 u_char* compressed_linenumber_table() const; // not preserved by gc
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 int line_number_from_bci(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Runtime information.
a61af66fc99e Initial load
duke
parents:
diff changeset
199 int vtable_index();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
200 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
201 int itable_index();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
202 #endif // SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
203 address native_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 address interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Analysis and profiling.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 //
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 bool has_monitor_bytecodes() const { return _uses_monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool has_balanced_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
211
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
212 // Returns a bitmap indicating which locals are required to be
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
213 // maintained as live for deopt. raw_liveness_at_bci is always the
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
214 // direct output of the liveness computation while liveness_at_bci
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
215 // may mark all locals as live to improve support for debugging Java
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
216 // code by maintaining the state of as many locals as possible.
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
217 MethodLivenessResult raw_liveness_at_bci(int bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 MethodLivenessResult liveness_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Get the interpreters viewpoint on oop liveness. MethodLiveness is
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // conservative in the sense that it may consider locals to be live which
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // cannot be live, like in the case where a local could contain an oop or
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // a primitive along different paths. In that case the local must be
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // dead when those paths merge. Since the interpreter's viewpoint is
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // used when gc'ing an interpreter frame we need to use its viewpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // during OSR when loading the locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 BitMap live_local_oops_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
231 const BitMap bci_block_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 ciTypeFlow* get_flow_analysis();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
236 ciCallProfile call_profile_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 int interpreter_call_site_count(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
238
12966
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
239 // Does type profiling provide a useful type at this point?
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
240 ciKlass* argument_profiled_type(int bci, int i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
241 ciKlass* parameter_profiled_type(int i);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
242 ciKlass* return_profiled_type(int bci);
b2ee5dc63353 8024070: C2 needs some form of type speculation
roland
parents: 12868
diff changeset
243
7194
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
244 ciField* get_field_at_bci( int bci, bool &will_link);
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6973
diff changeset
245 ciMethod* get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // Given a certain calling environment, find the monomorphic target
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // for the call. Return NULL if the call is not monomorphic in
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // its calling environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
249 ciMethod* find_monomorphic_target(ciInstanceKlass* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
250 ciInstanceKlass* callee_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
251 ciInstanceKlass* actual_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // Given a known receiver klass, find the target for the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // Return NULL if the call has no target or is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
255 ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Find the proper vtable index to invoke this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
258 int resolve_vtable_index(ciKlass* caller, ciKlass* receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Compilation directives
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool should_exclude();
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool should_inline();
a61af66fc99e Initial load
duke
parents:
diff changeset
263 bool should_not_inline();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 bool should_print_assembly();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 bool break_at_execute();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool has_option(const char *option);
20430
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
267 template<typename T>
119875f0fc67 8056964: JDK-8055286 changes are incomplete.
kvn
parents: 17980
diff changeset
268 bool has_option_value(const char* option, T& value);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 bool can_be_compiled();
a61af66fc99e Initial load
duke
parents:
diff changeset
270 bool can_be_osr_compiled(int entry_bci);
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7194
diff changeset
271 void set_not_compilable(const char* reason = NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
272 bool has_compiled_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 void log_nmethod_identity(xmlStream* log);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 bool is_not_reached(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 bool was_executed_more_than(int times);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 bool has_unloaded_classes_in_signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 bool check_call(int refinfo_index, bool is_static) const;
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 1972
diff changeset
279 bool ensure_method_data(); // make sure it exists in the VM also
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12160
diff changeset
280 MethodCounters* ensure_method_counters();
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6725
diff changeset
281 int instructions_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
283
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
284 // Stack walking support
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
285 bool is_ignored_by_security_stack_walk() const;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 7998
diff changeset
286
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
287 // JSR 292 support
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
288 bool is_method_handle_intrinsic() const;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
289 bool is_compiled_lambda_form() const;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6222
diff changeset
290 bool has_member_arg() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // What kind of ciObject is this?
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
293 bool is_method() const { return true; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Java access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
296 bool is_public () const { return flags().is_public(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 bool is_private () const { return flags().is_private(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool is_protected () const { return flags().is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool is_static () const { return flags().is_static(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 bool is_final () const { return flags().is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool is_synchronized() const { return flags().is_synchronized(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 bool is_native () const { return flags().is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 bool is_interface () const { return flags().is_interface(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 bool is_abstract () const { return flags().is_abstract(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 bool is_strict () const { return flags().is_strict(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Other flags
a61af66fc99e Initial load
duke
parents:
diff changeset
308 bool is_empty_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 bool is_vanilla_constructor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool is_final_method() const { return is_final() || holder()->is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 bool has_loops () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool has_jsrs () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool is_accessor () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 bool is_initializer () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 bool can_be_statically_bound() const { return _can_be_statically_bound; }
10278
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10198
diff changeset
316 bool is_boxing_method() const;
6f3fd5150b67 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 10198
diff changeset
317 bool is_unboxing_method() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
319 // Replay data methods
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
320 void dump_name_as_ascii(outputStream* st);
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
321 void dump_replay_data(outputStream* st);
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12966
diff changeset
322
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Print the bytecodes of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void print_codes_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 void print_codes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 print_codes_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 void print_codes_on(int from, int to, outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Print the name of this method in various incarnations.
a61af66fc99e Initial load
duke
parents:
diff changeset
331 void print_name(outputStream* st = tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
332 void print_short_name(outputStream* st = tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
334
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
335 #endif // SHARE_VM_CI_CIMETHOD_HPP