annotate src/share/vm/code/nmethod.hpp @ 1754:e967bad2a9ab

6941275: G1: The MemoryPools are incorrectly supported for G1 Summary: The way we were caluclating the max value meant that it might fluctuate during the run and this broke some assumptions inside the MBeans framework. This change sets the max value of each pool to -1, which means undefined according to the spec. Reviewed-by: mchung, johnc
author tonyp
date Wed, 25 Aug 2010 08:44:58 -0400
parents 71faaa8e3ccc
children 3e8fbc61cee8
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: 1538
diff changeset
2 * Copyright (c) 1997, 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: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
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: 1538
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // This class is used internally by nmethods, to cache
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // exception/pc/handler information.
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class ExceptionCache : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
29 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
31 static address _unwind_handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 enum { cache_size = 16 };
a61af66fc99e Initial load
duke
parents:
diff changeset
33 klassOop _exception_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 address _pc[cache_size];
a61af66fc99e Initial load
duke
parents:
diff changeset
35 address _handler[cache_size];
a61af66fc99e Initial load
duke
parents:
diff changeset
36 int _count;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 ExceptionCache* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 address pc_at(int index) { assert(index >= 0 && index < count(),""); return _pc[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
40 void set_pc_at(int index, address a) { assert(index >= 0 && index < cache_size,""); _pc[index] = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
41 address handler_at(int index) { assert(index >= 0 && index < count(),""); return _handler[index]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
42 void set_handler_at(int index, address a) { assert(index >= 0 && index < cache_size,""); _handler[index] = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
43 int count() { return _count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
44 void increment_count() { _count++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 ExceptionCache(Handle exception, address pc, address handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 klassOop exception_type() { return _exception_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
51 klassOop* exception_type_addr() { return &_exception_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
52 ExceptionCache* next() { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void set_next(ExceptionCache *ec) { _next = ec; }
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 address match(Handle exception, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 bool match_exception_with_space(Handle exception) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 address test_address(address addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
58 bool add_address_and_handler(address addr, address handler) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 static address unwind_handler() { return _unwind_handler; }
a61af66fc99e Initial load
duke
parents:
diff changeset
61 };
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // cache pc descs found in earlier inquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class PcDescCache VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
68 enum { cache_size = 4 };
a61af66fc99e Initial load
duke
parents:
diff changeset
69 PcDesc* _last_pc_desc; // most recent pc_desc found
a61af66fc99e Initial load
duke
parents:
diff changeset
70 PcDesc* _pc_descs[cache_size]; // last cache_size pc_descs found
a61af66fc99e Initial load
duke
parents:
diff changeset
71 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
72 PcDescCache() { debug_only(_last_pc_desc = NULL); }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void reset_to(PcDesc* initial_pc_desc);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 PcDesc* find_pc_desc(int pc_offset, bool approximate);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void add_pc_desc(PcDesc* pc_desc);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 PcDesc* last_pc_desc() { return _last_pc_desc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 };
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // nmethods (native methods) are the compiled code versions of Java methods.
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
81 //
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
82 // An nmethod contains:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // - header (the nmethod structure)
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // [Relocation]
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // - relocation information
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // - constant part (doubles, longs and floats used in nmethod)
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
87 // - oop table
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // [Code]
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // - code body
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // - exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // - stub code
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // [Debugging information]
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // - oop array
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // - data array
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // - pcs
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // [Exception handler table]
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // - handler entry point array
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // [Implicit Null Pointer exception table]
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // - implicit null table array
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 class Dependencies;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 class ExceptionHandlerTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 class ImplicitExceptionTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 class AbstractCompiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 class xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 class nmethod : public CodeBlob {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 friend class NMethodSweeper;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
110 friend class CodeCache; // non-perm oops
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Shared fields for all nmethod's
a61af66fc99e Initial load
duke
parents:
diff changeset
113 methodOop _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 int _entry_bci; // != InvocationEntryBci if this nmethod is an on-stack replacement method
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1579
diff changeset
115 jmethodID _jmethod_id; // Cache of method()->jmethod_id()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
117 // To support simple linked-list chaining of nmethods:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
118 nmethod* _osr_link; // from instanceKlass::osr_nmethods_head
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
119 nmethod* _scavenge_root_link; // from CodeCache::scavenge_root_nmethods
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
120 nmethod* _saved_nmethod_link; // from CodeCache::speculatively_disconnect
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
121
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
122 static nmethod* volatile _oops_do_mark_nmethods;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
123 nmethod* volatile _oops_do_mark_link;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 AbstractCompiler* _compiler; // The compiler which compiled this nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
126
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
127 // offsets for entry points
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
128 address _entry_point; // entry point with class check
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
129 address _verified_entry_point; // entry point without class check
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
130 address _osr_entry_point; // entry point for on stack replacement
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
131
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Offsets for different nmethod parts
a61af66fc99e Initial load
duke
parents:
diff changeset
133 int _exception_offset;
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
134 // All deoptee's will resume execution at this location described by
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
135 // this offset.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136 int _deoptimize_offset;
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
137 // All deoptee's at a MethodHandle call site will resume execution
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
138 // at this location described by this offset.
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
139 int _deoptimize_mh_offset;
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
140 // Offset of the unwind handler if it exists
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
141 int _unwind_handler_offset;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
142
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
143 #ifdef HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
144 int _trap_offset;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
145 #endif // def HAVE_DTRACE_H
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 int _stub_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 int _consts_offset;
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
148 int _oops_offset; // offset to where embedded oop table begins (inside data)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int _scopes_data_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 int _scopes_pcs_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 int _dependencies_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 int _handler_table_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 int _nul_chk_table_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int _nmethod_end_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // location in frame (offset for sp) that deopt can store the original
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // pc during a deopt.
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int _orig_pc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
159
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
160 int _compile_id; // which compilation made this nmethod
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
161 int _comp_level; // compilation level
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
162
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
163 // protected by CodeCache_lock
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
164 bool _has_flushed_dependencies; // Used for maintenance of dependencies (CodeCache_lock)
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
165 bool _speculatively_disconnected; // Marked for potential unload
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
166
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
167 bool _marked_for_reclamation; // Used by NMethodSweeper (set only by sweeper)
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
168 bool _marked_for_deoptimization; // Used for stack deoptimization
0
a61af66fc99e Initial load
duke
parents:
diff changeset
169
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
170 // used by jvmti to track if an unload event has been posted for this nmethod.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
171 bool _unload_reported;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
173 // set during construction
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
174 unsigned int _has_unsafe_access:1; // May fault due to unsafe access.
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
175 unsigned int _has_method_handle_invokes:1; // Has this method MethodHandle invokes?
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
176
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
177 // Protected by Patching_lock
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
178 unsigned char _state; // {alive, not_entrant, zombie, unloaded)
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
179
1726
71faaa8e3ccc 6974176: ShouldNotReachHere, instanceKlass.cpp:1426
never
parents: 1692
diff changeset
180 #ifdef ASSERT
71faaa8e3ccc 6974176: ShouldNotReachHere, instanceKlass.cpp:1426
never
parents: 1692
diff changeset
181 bool _oops_are_stale; // indicates that it's no longer safe to access oops section
71faaa8e3ccc 6974176: ShouldNotReachHere, instanceKlass.cpp:1426
never
parents: 1692
diff changeset
182 #endif
71faaa8e3ccc 6974176: ShouldNotReachHere, instanceKlass.cpp:1426
never
parents: 1692
diff changeset
183
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 enum { alive = 0,
605
98cb887364d3 6810672: Comment typos
twisti
parents: 196
diff changeset
185 not_entrant = 1, // uncommon trap has happened but activations may still exist
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 zombie = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
187 unloaded = 3 };
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
190 jbyte _scavenge_root_state;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
191
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 NOT_PRODUCT(bool _has_debug_info; )
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Nmethod Flushing lock (if non-zero, then the nmethod is not removed)
a61af66fc99e Initial load
duke
parents:
diff changeset
195 jint _lock_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // not_entrant method removal. Each mark_sweep pass will update
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // this mark to current sweep invocation count if it is seen on the
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // stack. An not_entrant method can be removed when there is no
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // more activations, i.e., when the _stack_traversal_mark is less than
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // current sweep traversal index.
a61af66fc99e Initial load
duke
parents:
diff changeset
202 long _stack_traversal_mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 ExceptionCache *_exception_cache;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 PcDescCache _pc_desc_cache;
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // These are only used for compiled synchronized native methods to
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // locate the owner and stack slot for the BasicLock so that we can
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // properly revoke the bias of the owner if necessary. They are
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // needed because there is no debug information for compiled native
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // wrappers and the oop maps are insufficient to allow
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // frame::retrieve_receiver() to work. Currently they are expected
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // to be byte offsets from the Java stack pointer for maximum code
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // sharing between platforms. Note that currently biased locking
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // will never cause Class instances to be biased but this code
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // handles the static synchronized case as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 ByteSize _compiled_synchronized_native_basic_lock_owner_sp_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 ByteSize _compiled_synchronized_native_basic_lock_sp_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 friend class nmethodLocker;
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // For native wrappers
a61af66fc99e Initial load
duke
parents:
diff changeset
223 nmethod(methodOop method,
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int nmethod_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
225 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
226 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
227 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
228 ByteSize basic_lock_owner_sp_offset, /* synchronized natives only */
a61af66fc99e Initial load
duke
parents:
diff changeset
229 ByteSize basic_lock_sp_offset, /* synchronized natives only */
a61af66fc99e Initial load
duke
parents:
diff changeset
230 OopMapSet* oop_maps);
a61af66fc99e Initial load
duke
parents:
diff changeset
231
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
232 #ifdef HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
233 // For native wrappers
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
234 nmethod(methodOop method,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
235 int nmethod_size,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
236 CodeOffsets* offsets,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
237 CodeBuffer *code_buffer,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
238 int frame_size);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
239 #endif // def HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
240
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Creation support
a61af66fc99e Initial load
duke
parents:
diff changeset
242 nmethod(methodOop method,
a61af66fc99e Initial load
duke
parents:
diff changeset
243 int nmethod_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
244 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
245 int entry_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
246 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
247 int orig_pc_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
248 DebugInformationRecorder *recorder,
a61af66fc99e Initial load
duke
parents:
diff changeset
249 Dependencies* dependencies,
a61af66fc99e Initial load
duke
parents:
diff changeset
250 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
251 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
252 OopMapSet* oop_maps,
a61af66fc99e Initial load
duke
parents:
diff changeset
253 ExceptionHandlerTable* handler_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
254 ImplicitExceptionTable* nul_chk_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
255 AbstractCompiler* compiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int comp_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // helper methods
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void* operator new(size_t size, int nmethod_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 const char* reloc_string_for(u_char* begin, u_char* end);
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
262 // Returns true if this thread changed the state of the nmethod or
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
263 // false if another thread performed the transition.
1141
b1f619d38249 6914002: unsigned compare problem after 5057818
never
parents: 1135
diff changeset
264 bool make_not_entrant_or_zombie(unsigned int state);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
265 void inc_decompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Used to manipulate the exception cache
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void add_exception_cache_entry(ExceptionCache* new_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 ExceptionCache* exception_cache_entry_for_exception(Handle exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // Inform external interfaces that a compiled method has been unloaded
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
272 void post_compiled_method_unload();
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
273
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
274 // Initailize fields to their default values
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
275 void init_defaults();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // create nmethod with entry_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
279 static nmethod* new_nmethod(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
280 int compile_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
281 int entry_bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
282 CodeOffsets* offsets,
a61af66fc99e Initial load
duke
parents:
diff changeset
283 int orig_pc_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
284 DebugInformationRecorder* recorder,
a61af66fc99e Initial load
duke
parents:
diff changeset
285 Dependencies* dependencies,
a61af66fc99e Initial load
duke
parents:
diff changeset
286 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
287 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
288 OopMapSet* oop_maps,
a61af66fc99e Initial load
duke
parents:
diff changeset
289 ExceptionHandlerTable* handler_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
290 ImplicitExceptionTable* nul_chk_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
291 AbstractCompiler* compiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
292 int comp_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 static nmethod* new_native_nmethod(methodHandle method,
a61af66fc99e Initial load
duke
parents:
diff changeset
295 CodeBuffer *code_buffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
296 int vep_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
297 int frame_complete,
a61af66fc99e Initial load
duke
parents:
diff changeset
298 int frame_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
299 ByteSize receiver_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
300 ByteSize basic_lock_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
301 OopMapSet* oop_maps);
a61af66fc99e Initial load
duke
parents:
diff changeset
302
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
303 #ifdef HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
304 // The method we generate for a dtrace probe has to look
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
305 // like an nmethod as far as the rest of the system is concerned
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
306 // which is somewhat unfortunate.
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
307 static nmethod* new_dtrace_nmethod(methodHandle method,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
308 CodeBuffer *code_buffer,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
309 int vep_offset,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
310 int trap_offset,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
311 int frame_complete,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
312 int frame_size);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
313
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
314 int trap_offset() const { return _trap_offset; }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
315 address trap_address() const { return code_begin() + _trap_offset; }
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
316
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
317 #endif // def HAVE_DTRACE_H
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 100
diff changeset
318
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
320 methodOop method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 AbstractCompiler* compiler() const { return _compiler; }
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
324 bool has_debug_info() const { return _has_debug_info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 void set_has_debug_info(bool f) { _has_debug_info = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 #endif // NOT PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // type info
a61af66fc99e Initial load
duke
parents:
diff changeset
329 bool is_nmethod() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 bool is_java_method() const { return !method()->is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 bool is_native_method() const { return method()->is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 bool is_osr_method() const { return _entry_bci != InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 bool is_compiled_by_c1() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 bool is_compiled_by_c2() const;
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1681
diff changeset
336 bool is_compiled_by_shark() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // boundaries for different parts
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
339 address code_begin () const { return _entry_point; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
340 address code_end () const { return header_begin() + _stub_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
341 address exception_begin () const { return header_begin() + _exception_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
342 address deopt_handler_begin () const { return header_begin() + _deoptimize_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
343 address deopt_mh_handler_begin() const { return header_begin() + _deoptimize_mh_offset ; }
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
344 address unwind_handler_begin () const { return _unwind_handler_offset != -1 ? (header_begin() + _unwind_handler_offset) : NULL; }
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
345 address stub_begin () const { return header_begin() + _stub_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
346 address stub_end () const { return header_begin() + _consts_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
347 address consts_begin () const { return header_begin() + _consts_offset ; }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
348 address consts_end () const { return header_begin() + _oops_offset ; }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
349 oop* oops_begin () const { return (oop*) (header_begin() + _oops_offset) ; }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
350 oop* oops_end () const { return (oop*) (header_begin() + _scopes_data_offset) ; }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
351
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
352 address scopes_data_begin () const { return header_begin() + _scopes_data_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
353 address scopes_data_end () const { return header_begin() + _scopes_pcs_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
354 PcDesc* scopes_pcs_begin () const { return (PcDesc*)(header_begin() + _scopes_pcs_offset ); }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
355 PcDesc* scopes_pcs_end () const { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
356 address dependencies_begin () const { return header_begin() + _dependencies_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
357 address dependencies_end () const { return header_begin() + _handler_table_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
358 address handler_table_begin () const { return header_begin() + _handler_table_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
359 address handler_table_end () const { return header_begin() + _nul_chk_table_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
360 address nul_chk_table_begin () const { return header_begin() + _nul_chk_table_offset ; }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
361 address nul_chk_table_end () const { return header_begin() + _nmethod_end_offset ; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
362
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
363 // Sizes
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
364 int code_size () const { return code_end () - code_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
365 int stub_size () const { return stub_end () - stub_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
366 int consts_size () const { return consts_end () - consts_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
367 int oops_size () const { return (address) oops_end () - (address) oops_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
368 int scopes_data_size () const { return scopes_data_end () - scopes_data_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
369 int scopes_pcs_size () const { return (intptr_t) scopes_pcs_end () - (intptr_t) scopes_pcs_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
370 int dependencies_size () const { return dependencies_end () - dependencies_begin (); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
371 int handler_table_size() const { return handler_table_end() - handler_table_begin(); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
372 int nul_chk_table_size() const { return nul_chk_table_end() - nul_chk_table_begin(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 int total_size () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
375
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
376 // Containment
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 bool code_contains (address addr) const { return code_begin () <= addr && addr < code_end (); }
a61af66fc99e Initial load
duke
parents:
diff changeset
378 bool stub_contains (address addr) const { return stub_begin () <= addr && addr < stub_end (); }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 bool consts_contains (address addr) const { return consts_begin () <= addr && addr < consts_end (); }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
380 bool oops_contains (oop* addr) const { return oops_begin () <= addr && addr < oops_end (); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
381 bool scopes_data_contains (address addr) const { return scopes_data_begin () <= addr && addr < scopes_data_end (); }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 bool scopes_pcs_contains (PcDesc* addr) const { return scopes_pcs_begin () <= addr && addr < scopes_pcs_end (); }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
387 address entry_point() const { return _entry_point; } // normal entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
388 address verified_entry_point() const { return _verified_entry_point; } // if klass is correct
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // flag accessing and manipulation
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
391 bool is_in_use() const { return _state == alive; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
392 bool is_alive() const { return _state == alive || _state == not_entrant; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
393 bool is_not_entrant() const { return _state == not_entrant; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
394 bool is_zombie() const { return _state == zombie; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
395 bool is_unloaded() const { return _state == unloaded; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
397 // Make the nmethod non entrant. The nmethod will continue to be
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
398 // alive. It is used when an uncommon trap happens. Returns true
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
399 // if this thread changed the state of the nmethod or false if
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
400 // another thread performed the transition.
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
401 bool make_not_entrant() { return make_not_entrant_or_zombie(not_entrant); }
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
402 bool make_zombie() { return make_not_entrant_or_zombie(zombie); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // used by jvmti to track if the unload event has been reported
a61af66fc99e Initial load
duke
parents:
diff changeset
405 bool unload_reported() { return _unload_reported; }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void set_unload_reported() { _unload_reported = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
408 bool is_marked_for_deoptimization() const { return _marked_for_deoptimization; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
409 void mark_for_deoptimization() { _marked_for_deoptimization = true; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 void make_unloaded(BoolObjectClosure* is_alive, oop cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 bool has_dependencies() { return dependencies_size() != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void flush_dependencies(BoolObjectClosure* is_alive);
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
415 bool has_flushed_dependencies() { return _has_flushed_dependencies; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
416 void set_has_flushed_dependencies() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
417 assert(!has_flushed_dependencies(), "should only happen once");
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
418 _has_flushed_dependencies = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
421 bool is_marked_for_reclamation() const { return _marked_for_reclamation; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
422 void mark_for_reclamation() { _marked_for_reclamation = 1; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
423
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
424 bool has_unsafe_access() const { return _has_unsafe_access; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
425 void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
426
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
427 bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
428 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
430 bool is_speculatively_disconnected() const { return _speculatively_disconnected; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1616
diff changeset
431 void set_speculatively_disconnected(bool z) { _speculatively_disconnected = z; }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
432
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 int comp_level() const { return _comp_level; }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
435 // Support for oops in scopes and relocs:
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
436 // Note: index 0 is reserved for null.
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
437 oop oop_at(int index) const { return index == 0 ? (oop) NULL: *oop_addr_at(index); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
438 oop* oop_addr_at(int index) const { // for GC
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
439 // relocation indexes are biased by 1 (because 0 is reserved)
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
440 assert(index > 0 && index <= oops_size(), "must be a valid non-zero index");
1726
71faaa8e3ccc 6974176: ShouldNotReachHere, instanceKlass.cpp:1426
never
parents: 1692
diff changeset
441 assert(!_oops_are_stale, "oops are stale");
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
442 return &oops_begin()[index - 1];
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
443 }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
444
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
445 void copy_oops(GrowableArray<jobject>* oops);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
446
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
447 // Relocation support
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
448 private:
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
449 void fix_oop_relocations(address begin, address end, bool initialize_immediates);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
450 inline void initialize_immediate_oop(oop* dest, jobject handle);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
451
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
452 public:
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
453 void fix_oop_relocations(address begin, address end) { fix_oop_relocations(begin, end, false); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
454 void fix_oop_relocations() { fix_oop_relocations(NULL, NULL, false); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
455
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
456 bool is_at_poll_return(address pc);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
457 bool is_at_poll_or_poll_return(address pc);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
458
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
459 // Non-perm oop support
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
460 bool on_scavenge_root_list() const { return (_scavenge_root_state & 1) != 0; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
461 protected:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
462 enum { npl_on_list = 0x01, npl_marked = 0x10 };
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
463 void set_on_scavenge_root_list() { _scavenge_root_state = npl_on_list; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
464 void clear_on_scavenge_root_list() { _scavenge_root_state = 0; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
465 // assertion-checking and pruning logic uses the bits of _scavenge_root_state
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
466 #ifndef PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
467 void set_scavenge_root_marked() { _scavenge_root_state |= npl_marked; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
468 void clear_scavenge_root_marked() { _scavenge_root_state &= ~npl_marked; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
469 bool scavenge_root_not_marked() { return (_scavenge_root_state &~ npl_on_list) == 0; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
470 // N.B. there is no positive marked query, and we only use the not_marked query for asserts.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
471 #endif //PRODUCT
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
472 nmethod* scavenge_root_link() const { return _scavenge_root_link; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
473 void set_scavenge_root_link(nmethod *n) { _scavenge_root_link = n; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
474
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
475 nmethod* saved_nmethod_link() const { return _saved_nmethod_link; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
476 void set_saved_nmethod_link(nmethod *n) { _saved_nmethod_link = n; }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1201
diff changeset
477
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
478 public:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
479
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Sweeper support
a61af66fc99e Initial load
duke
parents:
diff changeset
481 long stack_traversal_mark() { return _stack_traversal_mark; }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 void set_stack_traversal_mark(long l) { _stack_traversal_mark = l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Exception cache support
a61af66fc99e Initial load
duke
parents:
diff changeset
485 ExceptionCache* exception_cache() const { return _exception_cache; }
a61af66fc99e Initial load
duke
parents:
diff changeset
486 void set_exception_cache(ExceptionCache *ec) { _exception_cache = ec; }
a61af66fc99e Initial load
duke
parents:
diff changeset
487 address handler_for_exception_and_pc(Handle exception, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void add_handler_for_exception_and_pc(Handle exception, address pc, address handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 void remove_from_exception_cache(ExceptionCache* ec);
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // implicit exceptions support
a61af66fc99e Initial load
duke
parents:
diff changeset
492 address continuation_for_implicit_exception(address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // On-stack replacement support
a61af66fc99e Initial load
duke
parents:
diff changeset
495 int osr_entry_bci() const { assert(_entry_bci != InvocationEntryBci, "wrong kind of nmethod"); return _entry_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 address osr_entry() const { assert(_entry_bci != InvocationEntryBci, "wrong kind of nmethod"); return _osr_entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void invalidate_osr_method();
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
498 nmethod* osr_link() const { return _osr_link; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
499 void set_osr_link(nmethod *n) { _osr_link = n; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // tells whether frames described by this nmethod can be deoptimized
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // note: native wrappers cannot be deoptimized.
a61af66fc99e Initial load
duke
parents:
diff changeset
503 bool can_be_deoptimized() const { return is_java_method(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // Inline cache support
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void clear_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
507 void cleanup_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
508 bool inlinecache_check_contains(address addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 return (addr >= instructions_begin() && addr < verified_entry_point());
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // unlink and deallocate this nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // Only NMethodSweeper class is expected to use this. NMethodSweeper is not
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // expected to use any other private methods/data in this class.
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
517 void flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // If returning true, it is unsafe to remove this nmethod even though it is a zombie
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // nmethod, since the VM might have a reference to it. Should only be called from a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 bool is_locked_by_vm() const { return _lock_count >0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // See comment at definition of _last_seen_on_stack
a61af66fc99e Initial load
duke
parents:
diff changeset
525 void mark_as_seen_on_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 bool can_not_entrant_be_converted();
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // Evolution support. We make old (discarded) compiled methods point to new methodOops.
a61af66fc99e Initial load
duke
parents:
diff changeset
529 void set_method(methodOop method) { _method = method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void do_unloading(BoolObjectClosure* is_alive, OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
533 bool unloading_occurred);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 bool can_unload(BoolObjectClosure* is_alive, OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
535 oop* root, bool unloading_occurred);
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
538 OopClosure* f);
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
539 void oops_do(OopClosure* f) { oops_do(f, false); }
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 1538
diff changeset
540 void oops_do(OopClosure* f, bool do_strong_roots_only);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
541 bool detect_scavenge_root_oops();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
542 void verify_scavenge_root_oops() PRODUCT_RETURN;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
543
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
544 bool test_set_oops_do_mark();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
545 static void oops_do_marking_prologue();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
546 static void oops_do_marking_epilogue();
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
547 static bool oops_do_marking_is_active() { return _oops_do_mark_nmethods != NULL; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 605
diff changeset
548 DEBUG_ONLY(bool test_oops_do_mark() { return _oops_do_mark_link != NULL; })
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // ScopeDesc for an instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
551 ScopeDesc* scope_desc_at(address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
554 ScopeDesc* scope_desc_in(address begin, address end);
a61af66fc99e Initial load
duke
parents:
diff changeset
555
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
556 address* orig_pc_addr(const frame* fr) { return (address*) ((address)fr->unextended_sp() + _orig_pc_offset); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 PcDesc* find_pc_desc_internal(address pc, bool approximate);
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 PcDesc* find_pc_desc(address pc, bool approximate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 PcDesc* desc = _pc_desc_cache.last_pc_desc();
a61af66fc99e Initial load
duke
parents:
diff changeset
562 if (desc != NULL && desc->pc_offset() == pc - instructions_begin()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 return desc;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 return find_pc_desc_internal(pc, approximate);
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // ScopeDesc retrieval operation
a61af66fc99e Initial load
duke
parents:
diff changeset
570 PcDesc* pc_desc_at(address pc) { return find_pc_desc(pc, false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // pc_desc_near returns the first PcDesc at or after the givne pc.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 PcDesc* pc_desc_near(address pc) { return find_pc_desc(pc, true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // copying of debugging information
a61af66fc99e Initial load
duke
parents:
diff changeset
576 void copy_scopes_pcs(PcDesc* pcs, int count);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void copy_scopes_data(address buffer, int size);
a61af66fc99e Initial load
duke
parents:
diff changeset
578
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
579 // Deopt
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
580 // Return true is the PC is one would expect if the frame is being deopted.
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
581 bool is_deopt_pc (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
582 bool is_deopt_entry (address pc) { return pc == deopt_handler_begin(); }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
583 bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // Accessor/mutator for the original pc of a frame before a frame was deopted.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 address get_original_pc(const frame* fr) { return *orig_pc_addr(fr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 void set_original_pc(const frame* fr, address pc) { *orig_pc_addr(fr) = pc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
588 static address get_deopt_original_pc(const frame* fr);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1202
diff changeset
589
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
590 // MethodHandle
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
591 bool is_method_handle_return(address return_pc);
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1109
diff changeset
592
0
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // jvmti support:
a61af66fc99e Initial load
duke
parents:
diff changeset
594 void post_compiled_method_load_event();
1616
38e8278318ca 6656830: assert((*p)->is_oop(),"expected an oop while scanning weak refs")
never
parents: 1579
diff changeset
595 jmethodID get_and_cache_jmethod_id();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // verify operations
a61af66fc99e Initial load
duke
parents:
diff changeset
598 void verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void verify_scopes();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void verify_interrupt_point(address interrupt_point);
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // printing support
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
603 void print() const;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
604 void print_code();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
605 void print_relocations() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 void print_pcs() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 void print_scopes() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void print_dependencies() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void print_value_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 void print_calls(outputStream* st) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void print_handler_table() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void print_nul_chk_table() PRODUCT_RETURN;
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
613 void print_nmethod(bool print_code);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
615 // need to re-define this from CodeBlob else the overload hides it
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
616 virtual void print_on(outputStream* st) const { CodeBlob::print_on(st); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 void print_on(outputStream* st, const char* title) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Logging
a61af66fc99e Initial load
duke
parents:
diff changeset
620 void log_identity(xmlStream* log) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void log_new_nmethod() const;
1109
032260830071 5057818: codecache full and compiler disabled in bigapps fastdebug run
never
parents: 1000
diff changeset
622 void log_state_change() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623
1155
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
624 // Prints block-level comments, including nmethod specific block labels:
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
625 virtual void print_block_comment(outputStream* stream, address block_begin) {
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
626 print_nmethod_labels(stream, block_begin);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
627 CodeBlob::print_block_comment(stream, block_begin);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
628 }
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
629 void print_nmethod_labels(outputStream* stream, address block_begin);
4e6abf09f540 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 1141
diff changeset
630
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // Prints a comment for one native instruction (reloc info, pc desc)
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
632 void print_code_comment_on(outputStream* st, int column, address begin, address end);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 static void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Compiler task identification. Note that all OSR methods
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // are numbered in an independent sequence if CICountOSR is true,
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // and native method wrappers are also numbered independently if
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // CICountNative is true.
a61af66fc99e Initial load
duke
parents:
diff changeset
639 int compile_id() const { return _compile_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
640 const char* compile_kind() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // For debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // CompiledIC* IC_at(char* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // PrimitiveIC* primitiveIC_at(char* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 oop embeddedOop_at(address p);
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // tells if any of this method's dependencies have been invalidated
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // (this is expensive!)
a61af66fc99e Initial load
duke
parents:
diff changeset
649 bool check_all_dependencies();
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // tells if this compiled method is dependent on the given changes,
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // and the changes have invalidated it
a61af66fc99e Initial load
duke
parents:
diff changeset
653 bool check_dependency_on(DepChange& changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Evolution support. Tells if this compiled method is dependent on any of
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // methods m() of class dependee, such that if m() in dependee is replaced,
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // this compiled method will have to be deoptimized.
a61af66fc99e Initial load
duke
parents:
diff changeset
658 bool is_evol_dependent_on(klassOop dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // Fast breakpoint support. Tells if this compiled method is
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // dependent on the given method. Returns true if this nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // corresponds to the given method as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
663 bool is_dependent_on_method(methodOop dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // is it ok to patch at address?
a61af66fc99e Initial load
duke
parents:
diff changeset
666 bool is_patchable_at(address instr_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // UseBiasedLocking support
a61af66fc99e Initial load
duke
parents:
diff changeset
669 ByteSize compiled_synchronized_native_basic_lock_owner_sp_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 return _compiled_synchronized_native_basic_lock_owner_sp_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672 ByteSize compiled_synchronized_native_basic_lock_sp_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 return _compiled_synchronized_native_basic_lock_sp_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // support for code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
677 static int verified_entry_point_offset() { return offset_of(nmethod, _verified_entry_point); }
a61af66fc99e Initial load
duke
parents:
diff changeset
678 static int osr_entry_point_offset() { return offset_of(nmethod, _osr_entry_point); }
a61af66fc99e Initial load
duke
parents:
diff changeset
679 static int entry_bci_offset() { return offset_of(nmethod, _entry_bci); }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 };
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // Locks an nmethod so its code will not get removed, even if it is a zombie/not_entrant method
a61af66fc99e Initial load
duke
parents:
diff changeset
684 class nmethodLocker : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 nmethod* _nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687 static void lock_nmethod(nmethod* nm); // note: nm can be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
688 static void unlock_nmethod(nmethod* nm); // (ditto)
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
691 nmethodLocker(address pc); // derive nm from pc
a61af66fc99e Initial load
duke
parents:
diff changeset
692 nmethodLocker(nmethod *nm) { _nm = nm; lock_nmethod(_nm); }
a61af66fc99e Initial load
duke
parents:
diff changeset
693 nmethodLocker() { _nm = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 ~nmethodLocker() { unlock_nmethod(_nm); }
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 nmethod* code() { return _nm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 void set_code(nmethod* new_nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 unlock_nmethod(_nm); // note: This works even if _nm==new_nm.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 _nm = new_nm;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 lock_nmethod(_nm);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702 };