annotate src/share/vm/ci/ciMethod.hpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children 5ddfcf4b079e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1152
diff changeset
2 * Copyright (c) 1999, 2010, 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 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // This class represents a methodOop in the HotSpot virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ciMethod : public ciObject {
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;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // General method information.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 ciFlags _flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 ciSymbol* _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 ciInstanceKlass* _holder;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 ciSignature* _signature;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 ciMethodData* _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ciMethodBlocks* _method_blocks;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Code attributes.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 int _code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int _max_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 int _max_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 vmIntrinsics::ID _intrinsic_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 int _handler_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 int _interpreter_invocation_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 int _interpreter_throwout_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 bool _uses_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 bool _balanced_monitors;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
75 bool _is_c1_compilable;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
76 bool _is_c2_compilable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bool _can_be_statically_bound;
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Lazy fields, filled in on demand
a61af66fc99e Initial load
duke
parents:
diff changeset
80 address _code;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 ciExceptionHandler** _exception_handlers;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Optional liveness analyzer.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 MethodLiveness* _liveness;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
85 #if defined(COMPILER2) || defined(SHARK)
1648
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1552
diff changeset
86 ciTypeFlow* _flow;
8099e71601df 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 1552
diff changeset
87 BCEscapeAnalyzer* _bcea;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 ciMethod(methodHandle h_m);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 methodOop get_methodOop() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 methodOop m = (methodOop)get_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 assert(m != NULL, "illegal use of unloaded method");
a61af66fc99e Initial load
duke
parents:
diff changeset
96 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 oop loader() const { return _holder->loader(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 const char* type_string() { return "ciMethod"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void print_impl(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void load_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void check_is_loaded() const { assert(is_loaded(), "not loaded"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void build_method_data(methodHandle h_m);
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void code_at_put(int bci, Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 Bytecodes::check(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 assert(0 <= bci && bci < code_size(), "valid bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 address bcp = _code + bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 *bcp = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Basic method information.
a61af66fc99e Initial load
duke
parents:
diff changeset
120 ciFlags flags() const { check_is_loaded(); return _flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 ciSymbol* name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ciInstanceKlass* holder() const { return _holder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
123 ciMethodData* method_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Signature information.
a61af66fc99e Initial load
duke
parents:
diff changeset
126 ciSignature* signature() const { return _signature; }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ciType* return_type() const { return _signature->return_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 int arg_size_no_receiver() const { return _signature->size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 int arg_size() const { return _signature->size() + (_flags.is_static() ? 0 : 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Method code and related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
132 address code() { if (_code == NULL) load_code(); return _code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int code_size() const { check_is_loaded(); return _code_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 int max_stack() const { check_is_loaded(); return _max_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 int max_locals() const { check_is_loaded(); return _max_locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int exception_table_length() const { check_is_loaded(); return _handler_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
142 int comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
143
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144 Bytecodes::Code java_code_at_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 address bcp = code() + bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return Bytecodes::java_code_at(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 BCEscapeAnalyzer *get_bcea();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 ciMethodBlocks *get_method_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool has_linenumber_table() const; // length unknown until decompression
a61af66fc99e Initial load
duke
parents:
diff changeset
152 u_char* compressed_linenumber_table() const; // not preserved by gc
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int line_number_from_bci(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Runtime information.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 int vtable_index();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
158 #ifdef SHARK
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
159 int itable_index();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1648
diff changeset
160 #endif // SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
161 address native_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 address interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // Analysis and profiling.
a61af66fc99e Initial load
duke
parents:
diff changeset
165 //
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks.
a61af66fc99e Initial load
duke
parents:
diff changeset
167 bool uses_monitors() const { return _uses_monitors; } // this one should go away, it has a misleading name
a61af66fc99e Initial load
duke
parents:
diff changeset
168 bool has_monitor_bytecodes() const { return _uses_monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool has_balanced_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 710
diff changeset
171 // 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
172 // 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
173 // 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
174 // 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
175 // 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
176 MethodLivenessResult raw_liveness_at_bci(int bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
177 MethodLivenessResult liveness_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Get the interpreters viewpoint on oop liveness. MethodLiveness is
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // conservative in the sense that it may consider locals to be live which
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // cannot be live, like in the case where a local could contain an oop or
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // a primitive along different paths. In that case the local must be
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // dead when those paths merge. Since the interpreter's viewpoint is
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // used when gc'ing an interpreter frame we need to use its viewpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // during OSR when loading the locals.
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 BitMap live_local_oops_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
190 const BitMap bci_block_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 ciTypeFlow* get_flow_analysis();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
195 ciCallProfile call_profile_at_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 int interpreter_call_site_count(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Given a certain calling environment, find the monomorphic target
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // for the call. Return NULL if the call is not monomorphic in
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // its calling environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 ciMethod* find_monomorphic_target(ciInstanceKlass* caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
202 ciInstanceKlass* callee_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
203 ciInstanceKlass* actual_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Given a known receiver klass, find the target for the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Return NULL if the call has no target or is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Find the proper vtable index to invoke this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 int resolve_vtable_index(ciKlass* caller, ciKlass* receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Compilation directives
a61af66fc99e Initial load
duke
parents:
diff changeset
213 bool will_link(ciKlass* accessing_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
214 ciKlass* declared_method_holder,
a61af66fc99e Initial load
duke
parents:
diff changeset
215 Bytecodes::Code bc);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 bool should_exclude();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 bool should_inline();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 bool should_not_inline();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 bool should_print_assembly();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool break_at_execute();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool has_option(const char *option);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 bool can_be_compiled();
a61af66fc99e Initial load
duke
parents:
diff changeset
223 bool can_be_osr_compiled(int entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void set_not_compilable();
a61af66fc99e Initial load
duke
parents:
diff changeset
225 bool has_compiled_code();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
226 int instructions_size(int comp_level = CompLevel_any);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 void log_nmethod_identity(xmlStream* log);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 bool is_not_reached(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 bool was_executed_more_than(int times);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool has_unloaded_classes_in_signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
231 bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
232 bool check_call(int refinfo_index, bool is_static) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 void build_method_data(); // make sure it exists in the VM also
a61af66fc99e Initial load
duke
parents:
diff changeset
234 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
235
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
236 // JSR 292 support
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
237 bool is_method_handle_invoke() const;
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
238 bool is_method_handle_adapter() const;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
239 ciInstance* method_handle_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // What kind of ciObject is this?
a61af66fc99e Initial load
duke
parents:
diff changeset
242 bool is_method() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Java access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
245 bool is_public () const { return flags().is_public(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
246 bool is_private () const { return flags().is_private(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 bool is_protected () const { return flags().is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 bool is_static () const { return flags().is_static(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 bool is_final () const { return flags().is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 bool is_synchronized() const { return flags().is_synchronized(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 bool is_native () const { return flags().is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 bool is_interface () const { return flags().is_interface(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 bool is_abstract () const { return flags().is_abstract(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 bool is_strict () const { return flags().is_strict(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Other flags
a61af66fc99e Initial load
duke
parents:
diff changeset
257 bool is_empty_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 bool is_vanilla_constructor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 bool is_final_method() const { return is_final() || holder()->is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 bool has_loops () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool has_jsrs () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool is_accessor () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 bool is_initializer () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 bool can_be_statically_bound() const { return _can_be_statically_bound; }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Print the bytecodes of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 void print_codes_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void print_codes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 print_codes_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void print_codes_on(int from, int to, outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Print the name of this method in various incarnations.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void print_name(outputStream* st = tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 void print_short_name(outputStream* st = tty);
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
276
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
277 methodOop get_method_handle_target() {
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
278 klassOop receiver_limit_oop = NULL;
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
279 int flags = 0;
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
280 return MethodHandles::decode_method(get_oop(), receiver_limit_oop, flags);
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1137
diff changeset
281 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
283
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
284 #endif // SHARE_VM_CI_CIMETHOD_HPP