src/share/vm/oops/methodOop.hpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2637
799d8ccf63cf
child 2698
38fea01eb669
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

duke@435 1 /*
never@2462 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_OOPS_METHODOOP_HPP
stefank@2314 26 #define SHARE_VM_OOPS_METHODOOP_HPP
stefank@2314 27
stefank@2314 28 #include "classfile/vmSymbols.hpp"
stefank@2314 29 #include "code/compressedStream.hpp"
stefank@2314 30 #include "compiler/oopMap.hpp"
stefank@2314 31 #include "interpreter/invocationCounter.hpp"
stefank@2314 32 #include "oops/constMethodOop.hpp"
stefank@2314 33 #include "oops/constantPoolOop.hpp"
stefank@2314 34 #include "oops/instanceKlass.hpp"
stefank@2314 35 #include "oops/oop.hpp"
stefank@2314 36 #include "oops/typeArrayOop.hpp"
stefank@2314 37 #include "utilities/accessFlags.hpp"
stefank@2314 38 #include "utilities/growableArray.hpp"
stefank@2314 39
duke@435 40 // A methodOop represents a Java method.
duke@435 41 //
duke@435 42 // Memory layout (each line represents a word). Note that most applications load thousands of methods,
duke@435 43 // so keeping the size of this structure small has a big impact on footprint.
duke@435 44 //
duke@435 45 // We put all oops and method_size first for better gc cache locality.
duke@435 46 //
duke@435 47 // The actual bytecodes are inlined after the end of the methodOopDesc struct.
duke@435 48 //
duke@435 49 // There are bits in the access_flags telling whether inlined tables are present.
duke@435 50 // Note that accessing the line number and local variable tables is not performance critical at all.
duke@435 51 // Accessing the checked exceptions table is used by reflection, so we put that last to make access
duke@435 52 // to it fast.
duke@435 53 //
duke@435 54 // The line number table is compressed and inlined following the byte codes. It is found as the first
duke@435 55 // byte following the byte codes. The checked exceptions table and the local variable table are inlined
duke@435 56 // after the line number table, and indexed from the end of the method. We do not compress the checked
duke@435 57 // exceptions table since the average length is less than 2, and do not bother to compress the local
duke@435 58 // variable table either since it is mostly absent.
duke@435 59 //
duke@435 60 // Note that native_function and signature_handler has to be at fixed offsets (required by the interpreter)
duke@435 61 //
duke@435 62 // |------------------------------------------------------|
duke@435 63 // | header |
duke@435 64 // | klass |
duke@435 65 // |------------------------------------------------------|
duke@435 66 // | constMethodOop (oop) |
duke@435 67 // | constants (oop) |
duke@435 68 // |------------------------------------------------------|
duke@435 69 // | methodData (oop) |
duke@435 70 // | interp_invocation_count |
duke@435 71 // |------------------------------------------------------|
duke@435 72 // | access_flags |
duke@435 73 // | vtable_index |
duke@435 74 // |------------------------------------------------------|
duke@435 75 // | result_index (C++ interpreter only) |
duke@435 76 // |------------------------------------------------------|
duke@435 77 // | method_size | max_stack |
duke@435 78 // | max_locals | size_of_parameters |
duke@435 79 // |------------------------------------------------------|
iveresov@2138 80 // | intrinsic_id, (unused) | throwout_count |
duke@435 81 // |------------------------------------------------------|
iveresov@2138 82 // | num_breakpoints | (unused) |
duke@435 83 // |------------------------------------------------------|
duke@435 84 // | invocation_counter |
duke@435 85 // | backedge_counter |
duke@435 86 // |------------------------------------------------------|
iveresov@2630 87 // | prev_time (tiered only, 64 bit wide) |
iveresov@2630 88 // | |
iveresov@2630 89 // |------------------------------------------------------|
iveresov@2630 90 // | rate (tiered) |
iveresov@2630 91 // |------------------------------------------------------|
duke@435 92 // | code (pointer) |
duke@435 93 // | i2i (pointer) |
duke@435 94 // | adapter (pointer) |
duke@435 95 // | from_compiled_entry (pointer) |
duke@435 96 // | from_interpreted_entry (pointer) |
duke@435 97 // |------------------------------------------------------|
duke@435 98 // | native_function (present only if native) |
duke@435 99 // | signature_handler (present only if native) |
duke@435 100 // |------------------------------------------------------|
duke@435 101
duke@435 102
duke@435 103 class CheckedExceptionElement;
duke@435 104 class LocalVariableTableElement;
duke@435 105 class AdapterHandlerEntry;
duke@435 106 class methodDataOopDesc;
duke@435 107
duke@435 108 class methodOopDesc : public oopDesc {
duke@435 109 friend class methodKlass;
duke@435 110 friend class VMStructs;
duke@435 111 private:
duke@435 112 constMethodOop _constMethod; // Method read-only data.
duke@435 113 constantPoolOop _constants; // Constant pool
duke@435 114 methodDataOop _method_data;
iveresov@2138 115 int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
duke@435 116 AccessFlags _access_flags; // Access flags
duke@435 117 int _vtable_index; // vtable index of this method (see VtableIndexFlag)
duke@435 118 // note: can have vtables with >2**16 elements (because of inheritance)
duke@435 119 #ifdef CC_INTERP
duke@435 120 int _result_index; // C++ interpreter needs for converting results to/from stack
duke@435 121 #endif
duke@435 122 u2 _method_size; // size of this object
duke@435 123 u2 _max_stack; // Maximum number of entries on the expression stack
duke@435 124 u2 _max_locals; // Number of local variables used by this method
duke@435 125 u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words
jrose@1291 126 u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none)
duke@435 127 u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
duke@435 128 u2 _number_of_breakpoints; // fullspeed debugging support
duke@435 129 InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations
duke@435 130 InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations
iveresov@2138 131
iveresov@2630 132 #ifdef TIERED
iveresov@2630 133 jlong _prev_time; // Previous time the rate was acquired
iveresov@2630 134 float _rate; // Events (invocation and backedge counter increments) per millisecond
iveresov@2630 135 #endif
iveresov@2630 136
duke@435 137 #ifndef PRODUCT
duke@435 138 int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging)
duke@435 139 #endif
duke@435 140 // Entry point for calling both from and to the interpreter.
duke@435 141 address _i2i_entry; // All-args-on-stack calling convention
duke@435 142 // Adapter blob (i2c/c2i) for this methodOop. Set once when method is linked.
duke@435 143 AdapterHandlerEntry* _adapter;
duke@435 144 // Entry point for calling from compiled code, to compiled code if it exists
duke@435 145 // or else the interpreter.
duke@435 146 volatile address _from_compiled_entry; // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
duke@435 147 // The entry point for calling both from and to compiled code is
duke@435 148 // "_code->entry_point()". Because of tiered compilation and de-opt, this
duke@435 149 // field can come and go. It can transition from NULL to not-null at any
duke@435 150 // time (whenever a compile completes). It can transition from not-null to
duke@435 151 // NULL only at safepoints (because of a de-opt).
duke@435 152 nmethod* volatile _code; // Points to the corresponding piece of native code
duke@435 153 volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
duke@435 154
duke@435 155 public:
jmasa@953 156
duke@435 157 // accessors for instance variables
duke@435 158 constMethodOop constMethod() const { return _constMethod; }
duke@435 159 void set_constMethod(constMethodOop xconst) { oop_store_without_check((oop*)&_constMethod, (oop)xconst); }
duke@435 160
duke@435 161
duke@435 162 static address make_adapters(methodHandle mh, TRAPS);
duke@435 163 volatile address from_compiled_entry() const { return (address)OrderAccess::load_ptr_acquire(&_from_compiled_entry); }
duke@435 164 volatile address from_interpreted_entry() const{ return (address)OrderAccess::load_ptr_acquire(&_from_interpreted_entry); }
duke@435 165
duke@435 166 // access flag
duke@435 167 AccessFlags access_flags() const { return _access_flags; }
duke@435 168 void set_access_flags(AccessFlags flags) { _access_flags = flags; }
duke@435 169
duke@435 170 // name
coleenp@2497 171 Symbol* name() const { return _constants->symbol_at(name_index()); }
duke@435 172 int name_index() const { return constMethod()->name_index(); }
duke@435 173 void set_name_index(int index) { constMethod()->set_name_index(index); }
duke@435 174
duke@435 175 // signature
coleenp@2497 176 Symbol* signature() const { return _constants->symbol_at(signature_index()); }
duke@435 177 int signature_index() const { return constMethod()->signature_index(); }
duke@435 178 void set_signature_index(int index) { constMethod()->set_signature_index(index); }
duke@435 179
duke@435 180 // generics support
coleenp@2497 181 Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? _constants->symbol_at(idx) : (Symbol*)NULL); }
duke@435 182 int generic_signature_index() const { return constMethod()->generic_signature_index(); }
duke@435 183 void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); }
duke@435 184
duke@435 185 // annotations support
duke@435 186 typeArrayOop annotations() const { return instanceKlass::cast(method_holder())->get_method_annotations_of(method_idnum()); }
duke@435 187 typeArrayOop parameter_annotations() const { return instanceKlass::cast(method_holder())->get_method_parameter_annotations_of(method_idnum()); }
duke@435 188 typeArrayOop annotation_default() const { return instanceKlass::cast(method_holder())->get_method_default_annotations_of(method_idnum()); }
duke@435 189
duke@435 190 #ifdef CC_INTERP
duke@435 191 void set_result_index(BasicType type);
duke@435 192 int result_index() { return _result_index; }
duke@435 193 #endif
duke@435 194
duke@435 195 // Helper routine: get klass name + "." + method name + signature as
duke@435 196 // C string, for the purpose of providing more useful NoSuchMethodErrors
duke@435 197 // and fatal error handling. The string is allocated in resource
duke@435 198 // area if a buffer is not provided by the caller.
duke@435 199 char* name_and_sig_as_C_string();
duke@435 200 char* name_and_sig_as_C_string(char* buf, int size);
duke@435 201
duke@435 202 // Static routine in the situations we don't have a methodOop
coleenp@2497 203 static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature);
coleenp@2497 204 static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size);
duke@435 205
never@2462 206 Bytecodes::Code java_code_at(int bci) const {
never@2462 207 return Bytecodes::java_code_at(this, bcp_from(bci));
never@2462 208 }
never@2462 209 Bytecodes::Code code_at(int bci) const {
never@2462 210 return Bytecodes::code_at(this, bcp_from(bci));
never@2462 211 }
never@2462 212
duke@435 213 // JVMTI breakpoints
never@2462 214 Bytecodes::Code orig_bytecode_at(int bci) const;
duke@435 215 void set_orig_bytecode_at(int bci, Bytecodes::Code code);
duke@435 216 void set_breakpoint(int bci);
duke@435 217 void clear_breakpoint(int bci);
duke@435 218 void clear_all_breakpoints();
duke@435 219 // Tracking number of breakpoints, for fullspeed debugging.
duke@435 220 // Only mutated by VM thread.
duke@435 221 u2 number_of_breakpoints() const { return _number_of_breakpoints; }
duke@435 222 void incr_number_of_breakpoints() { ++_number_of_breakpoints; }
duke@435 223 void decr_number_of_breakpoints() { --_number_of_breakpoints; }
duke@435 224 // Initialization only
duke@435 225 void clear_number_of_breakpoints() { _number_of_breakpoints = 0; }
duke@435 226
duke@435 227 // index into instanceKlass methods() array
duke@435 228 u2 method_idnum() const { return constMethod()->method_idnum(); }
duke@435 229 void set_method_idnum(u2 idnum) { constMethod()->set_method_idnum(idnum); }
duke@435 230
duke@435 231 // code size
duke@435 232 int code_size() const { return constMethod()->code_size(); }
duke@435 233
duke@435 234 // method size
duke@435 235 int method_size() const { return _method_size; }
duke@435 236 void set_method_size(int size) {
duke@435 237 assert(0 <= size && size < (1 << 16), "invalid method size");
duke@435 238 _method_size = size;
duke@435 239 }
duke@435 240
duke@435 241 // constant pool for klassOop holding this method
duke@435 242 constantPoolOop constants() const { return _constants; }
duke@435 243 void set_constants(constantPoolOop c) { oop_store_without_check((oop*)&_constants, c); }
duke@435 244
duke@435 245 // max stack
duke@435 246 int max_stack() const { return _max_stack; }
duke@435 247 void set_max_stack(int size) { _max_stack = size; }
duke@435 248
duke@435 249 // max locals
duke@435 250 int max_locals() const { return _max_locals; }
duke@435 251 void set_max_locals(int size) { _max_locals = size; }
iveresov@2138 252
iveresov@2138 253 int highest_comp_level() const;
iveresov@2138 254 void set_highest_comp_level(int level);
iveresov@2138 255 int highest_osr_comp_level() const;
iveresov@2138 256 void set_highest_osr_comp_level(int level);
duke@435 257
duke@435 258 // Count of times method was exited via exception while interpreting
duke@435 259 void interpreter_throwout_increment() {
duke@435 260 if (_interpreter_throwout_count < 65534) {
duke@435 261 _interpreter_throwout_count++;
duke@435 262 }
duke@435 263 }
duke@435 264
duke@435 265 int interpreter_throwout_count() const { return _interpreter_throwout_count; }
duke@435 266 void set_interpreter_throwout_count(int count) { _interpreter_throwout_count = count; }
duke@435 267
duke@435 268 // size of parameters
duke@435 269 int size_of_parameters() const { return _size_of_parameters; }
duke@435 270
duke@435 271 bool has_stackmap_table() const {
duke@435 272 return constMethod()->has_stackmap_table();
duke@435 273 }
duke@435 274
duke@435 275 typeArrayOop stackmap_data() const {
duke@435 276 return constMethod()->stackmap_data();
duke@435 277 }
duke@435 278
kamg@2232 279 void set_stackmap_data(typeArrayOop sd) {
kamg@2232 280 constMethod()->set_stackmap_data(sd);
kamg@2232 281 }
kamg@2232 282
duke@435 283 // exception handler table
duke@435 284 typeArrayOop exception_table() const
duke@435 285 { return constMethod()->exception_table(); }
duke@435 286 void set_exception_table(typeArrayOop e)
duke@435 287 { constMethod()->set_exception_table(e); }
duke@435 288 bool has_exception_handler() const
duke@435 289 { return constMethod()->has_exception_handler(); }
duke@435 290
duke@435 291 // Finds the first entry point bci of an exception handler for an
duke@435 292 // exception of klass ex_klass thrown at throw_bci. A value of NULL
duke@435 293 // for ex_klass indicates that the exception klass is not known; in
duke@435 294 // this case it matches any constraint class. Returns -1 if the
duke@435 295 // exception cannot be handled in this method. The handler
duke@435 296 // constraint classes are loaded if necessary. Note that this may
duke@435 297 // throw an exception if loading of the constraint classes causes
duke@435 298 // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
duke@435 299 // If an exception is thrown, returns the bci of the
duke@435 300 // exception handler which caused the exception to be thrown, which
duke@435 301 // is needed for proper retries. See, for example,
duke@435 302 // InterpreterRuntime::exception_handler_for_exception.
duke@435 303 int fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS);
duke@435 304
duke@435 305 // method data access
duke@435 306 methodDataOop method_data() const {
duke@435 307 return _method_data;
duke@435 308 }
duke@435 309 void set_method_data(methodDataOop data) {
duke@435 310 oop_store_without_check((oop*)&_method_data, (oop)data);
duke@435 311 }
duke@435 312
duke@435 313 // invocation counter
iveresov@2138 314 InvocationCounter* invocation_counter() { return &_invocation_counter; }
iveresov@2138 315 InvocationCounter* backedge_counter() { return &_backedge_counter; }
iveresov@2138 316
iveresov@2630 317 #ifdef TIERED
iveresov@2630 318 // We are reusing interpreter_invocation_count as a holder for the previous event count!
iveresov@2630 319 // We can do that since interpreter_invocation_count is not used in tiered.
iveresov@2630 320 int prev_event_count() const { return _interpreter_invocation_count; }
iveresov@2630 321 void set_prev_event_count(int count) { _interpreter_invocation_count = count; }
iveresov@2630 322 jlong prev_time() const { return _prev_time; }
iveresov@2630 323 void set_prev_time(jlong time) { _prev_time = time; }
iveresov@2630 324 float rate() const { return _rate; }
iveresov@2630 325 void set_rate(float rate) { _rate = rate; }
iveresov@2630 326 #endif
iveresov@2630 327
iveresov@2138 328 int invocation_count();
iveresov@2138 329 int backedge_count();
iveresov@2138 330
iveresov@2138 331 bool was_executed_more_than(int n);
iveresov@2138 332 bool was_never_executed() { return !was_executed_more_than(0); }
duke@435 333
duke@435 334 static void build_interpreter_method_data(methodHandle method, TRAPS);
duke@435 335
iveresov@2138 336 int interpreter_invocation_count() {
iveresov@2138 337 if (TieredCompilation) return invocation_count();
iveresov@2138 338 else return _interpreter_invocation_count;
iveresov@2138 339 }
duke@435 340 void set_interpreter_invocation_count(int count) { _interpreter_invocation_count = count; }
iveresov@2138 341 int increment_interpreter_invocation_count() {
iveresov@2138 342 if (TieredCompilation) ShouldNotReachHere();
iveresov@2138 343 return ++_interpreter_invocation_count;
iveresov@2138 344 }
duke@435 345
duke@435 346 #ifndef PRODUCT
iveresov@2138 347 int compiled_invocation_count() const { return _compiled_invocation_count; }
duke@435 348 void set_compiled_invocation_count(int count) { _compiled_invocation_count = count; }
duke@435 349 #endif // not PRODUCT
duke@435 350
twisti@1040 351 // Clear (non-shared space) pointers which could not be relevant
duke@435 352 // if this (shared) method were mapped into another JVM.
duke@435 353 void remove_unshareable_info();
duke@435 354
duke@435 355 // nmethod/verified compiler entry
duke@435 356 address verified_code_entry();
duke@435 357 bool check_code() const; // Not inline to avoid circular ref
duke@435 358 nmethod* volatile code() const { assert( check_code(), "" ); return (nmethod *)OrderAccess::load_ptr_acquire(&_code); }
duke@435 359 void clear_code(); // Clear out any compiled code
kvn@1637 360 static void set_code(methodHandle mh, nmethod* code);
duke@435 361 void set_adapter_entry(AdapterHandlerEntry* adapter) { _adapter = adapter; }
duke@435 362 address get_i2c_entry();
duke@435 363 address get_c2i_entry();
duke@435 364 address get_c2i_unverified_entry();
duke@435 365 AdapterHandlerEntry* adapter() { return _adapter; }
duke@435 366 // setup entry points
duke@435 367 void link_method(methodHandle method, TRAPS);
duke@435 368 // clear entry points. Used by sharing code
duke@435 369 void unlink_method();
duke@435 370
duke@435 371 // vtable index
duke@435 372 enum VtableIndexFlag {
duke@435 373 // Valid vtable indexes are non-negative (>= 0).
duke@435 374 // These few negative values are used as sentinels.
jrose@1145 375 highest_unused_vtable_index_value = -5,
duke@435 376 invalid_vtable_index = -4, // distinct from any valid vtable index
duke@435 377 garbage_vtable_index = -3, // not yet linked; no vtable layout yet
duke@435 378 nonvirtual_vtable_index = -2 // there is no need for vtable dispatch
duke@435 379 // 6330203 Note: Do not use -1, which was overloaded with many meanings.
duke@435 380 };
duke@435 381 DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; })
duke@435 382 int vtable_index() const { assert(valid_vtable_index(), "");
duke@435 383 return _vtable_index; }
duke@435 384 void set_vtable_index(int index) { _vtable_index = index; }
duke@435 385
duke@435 386 // interpreter entry
duke@435 387 address interpreter_entry() const { return _i2i_entry; }
duke@435 388 // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry
duke@435 389 void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; }
duke@435 390 int interpreter_kind(void) {
duke@435 391 return constMethod()->interpreter_kind();
duke@435 392 }
duke@435 393 void set_interpreter_kind();
duke@435 394 void set_interpreter_kind(int kind) {
duke@435 395 constMethod()->set_interpreter_kind(kind);
duke@435 396 }
duke@435 397
duke@435 398 // native function (used for native methods only)
duke@435 399 enum {
duke@435 400 native_bind_event_is_interesting = true
duke@435 401 };
duke@435 402 address native_function() const { return *(native_function_addr()); }
duke@435 403 // Must specify a real function (not NULL).
duke@435 404 // Use clear_native_function() to unregister.
duke@435 405 void set_native_function(address function, bool post_event_flag);
duke@435 406 bool has_native_function() const;
duke@435 407 void clear_native_function();
duke@435 408
duke@435 409 // signature handler (used for native methods only)
duke@435 410 address signature_handler() const { return *(signature_handler_addr()); }
duke@435 411 void set_signature_handler(address handler);
duke@435 412
duke@435 413 // Interpreter oopmap support
duke@435 414 void mask_for(int bci, InterpreterOopMap* mask);
duke@435 415
duke@435 416 #ifndef PRODUCT
duke@435 417 // operations on invocation counter
iveresov@2138 418 void print_invocation_count();
duke@435 419 #endif
duke@435 420
duke@435 421 // byte codes
twisti@1573 422 void set_code(address code) { return constMethod()->set_code(code); }
duke@435 423 address code_base() const { return constMethod()->code_base(); }
duke@435 424 bool contains(address bcp) const { return constMethod()->contains(bcp); }
duke@435 425
duke@435 426 // prints byte codes
duke@435 427 void print_codes() const { print_codes_on(tty); }
duke@435 428 void print_codes_on(outputStream* st) const PRODUCT_RETURN;
duke@435 429 void print_codes_on(int from, int to, outputStream* st) const PRODUCT_RETURN;
duke@435 430
duke@435 431 // checked exceptions
duke@435 432 int checked_exceptions_length() const
duke@435 433 { return constMethod()->checked_exceptions_length(); }
duke@435 434 CheckedExceptionElement* checked_exceptions_start() const
duke@435 435 { return constMethod()->checked_exceptions_start(); }
duke@435 436
duke@435 437 // localvariable table
duke@435 438 bool has_localvariable_table() const
duke@435 439 { return constMethod()->has_localvariable_table(); }
duke@435 440 int localvariable_table_length() const
duke@435 441 { return constMethod()->localvariable_table_length(); }
duke@435 442 LocalVariableTableElement* localvariable_table_start() const
duke@435 443 { return constMethod()->localvariable_table_start(); }
duke@435 444
duke@435 445 bool has_linenumber_table() const
duke@435 446 { return constMethod()->has_linenumber_table(); }
duke@435 447 u_char* compressed_linenumber_table() const
duke@435 448 { return constMethod()->compressed_linenumber_table(); }
duke@435 449
duke@435 450 // method holder (the klassOop holding this method)
duke@435 451 klassOop method_holder() const { return _constants->pool_holder(); }
duke@435 452
duke@435 453 void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments)
coleenp@2497 454 Symbol* klass_name() const; // returns the name of the method holder
duke@435 455 BasicType result_type() const; // type of the method result
duke@435 456 int result_type_index() const; // type index of the method result
duke@435 457 bool is_returning_oop() const { BasicType r = result_type(); return (r == T_OBJECT || r == T_ARRAY); }
duke@435 458 bool is_returning_fp() const { BasicType r = result_type(); return (r == T_FLOAT || r == T_DOUBLE); }
duke@435 459
duke@435 460 // Checked exceptions thrown by this method (resolved to mirrors)
duke@435 461 objArrayHandle resolved_checked_exceptions(TRAPS) { return resolved_checked_exceptions_impl(this, THREAD); }
duke@435 462
duke@435 463 // Access flags
duke@435 464 bool is_public() const { return access_flags().is_public(); }
duke@435 465 bool is_private() const { return access_flags().is_private(); }
duke@435 466 bool is_protected() const { return access_flags().is_protected(); }
duke@435 467 bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); }
duke@435 468 bool is_static() const { return access_flags().is_static(); }
duke@435 469 bool is_final() const { return access_flags().is_final(); }
duke@435 470 bool is_synchronized() const { return access_flags().is_synchronized();}
duke@435 471 bool is_native() const { return access_flags().is_native(); }
duke@435 472 bool is_abstract() const { return access_flags().is_abstract(); }
duke@435 473 bool is_strict() const { return access_flags().is_strict(); }
duke@435 474 bool is_synthetic() const { return access_flags().is_synthetic(); }
duke@435 475
duke@435 476 // returns true if contains only return operation
duke@435 477 bool is_empty_method() const;
duke@435 478
duke@435 479 // returns true if this is a vanilla constructor
duke@435 480 bool is_vanilla_constructor() const;
duke@435 481
duke@435 482 // checks method and its method holder
duke@435 483 bool is_final_method() const;
duke@435 484 bool is_strict_method() const;
duke@435 485
duke@435 486 // true if method needs no dynamic dispatch (final and/or no vtable entry)
duke@435 487 bool can_be_statically_bound() const;
duke@435 488
duke@435 489 // returns true if the method has any backward branches.
duke@435 490 bool has_loops() {
duke@435 491 return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag();
duke@435 492 };
duke@435 493
duke@435 494 bool compute_has_loops_flag();
duke@435 495
duke@435 496 bool has_jsrs() {
duke@435 497 return access_flags().has_jsrs();
duke@435 498 };
duke@435 499 void set_has_jsrs() {
duke@435 500 _access_flags.set_has_jsrs();
duke@435 501 }
duke@435 502
duke@435 503 // returns true if the method has any monitors.
duke@435 504 bool has_monitors() const { return is_synchronized() || access_flags().has_monitor_bytecodes(); }
duke@435 505 bool has_monitor_bytecodes() const { return access_flags().has_monitor_bytecodes(); }
duke@435 506
duke@435 507 void set_has_monitor_bytecodes() { _access_flags.set_has_monitor_bytecodes(); }
duke@435 508
duke@435 509 // monitor matching. This returns a conservative estimate of whether the monitorenter/monitorexit bytecodes
duke@435 510 // propererly nest in the method. It might return false, even though they actually nest properly, since the info.
duke@435 511 // has not been computed yet.
duke@435 512 bool guaranteed_monitor_matching() const { return access_flags().is_monitor_matching(); }
duke@435 513 void set_guaranteed_monitor_matching() { _access_flags.set_monitor_matching(); }
duke@435 514
duke@435 515 // returns true if the method is an accessor function (setter/getter).
duke@435 516 bool is_accessor() const;
duke@435 517
duke@435 518 // returns true if the method is an initializer (<init> or <clinit>).
duke@435 519 bool is_initializer() const;
duke@435 520
kamg@2616 521 // returns true if the method is static OR if the classfile version < 51
kamg@2616 522 bool has_valid_initializer_flags() const;
kamg@2616 523
kamg@2616 524 // returns true if the method name is <clinit> and the method has
kamg@2616 525 // valid static initializer flags.
kamg@2616 526 bool is_static_initializer() const;
kamg@2616 527
duke@435 528 // compiled code support
duke@435 529 // NOTE: code() is inherently racy as deopt can be clearing code
duke@435 530 // simultaneously. Use with caution.
duke@435 531 bool has_compiled_code() const { return code() != NULL; }
duke@435 532
duke@435 533 // sizing
duke@435 534 static int object_size(bool is_native);
duke@435 535 static int header_size() { return sizeof(methodOopDesc)/HeapWordSize; }
duke@435 536 int object_size() const { return method_size(); }
duke@435 537
duke@435 538 bool object_is_parsable() const { return method_size() > 0; }
duke@435 539
duke@435 540 // interpreter support
duke@435 541 static ByteSize const_offset() { return byte_offset_of(methodOopDesc, _constMethod ); }
duke@435 542 static ByteSize constants_offset() { return byte_offset_of(methodOopDesc, _constants ); }
duke@435 543 static ByteSize access_flags_offset() { return byte_offset_of(methodOopDesc, _access_flags ); }
duke@435 544 #ifdef CC_INTERP
duke@435 545 static ByteSize result_index_offset() { return byte_offset_of(methodOopDesc, _result_index ); }
duke@435 546 #endif /* CC_INTERP */
duke@435 547 static ByteSize size_of_locals_offset() { return byte_offset_of(methodOopDesc, _max_locals ); }
duke@435 548 static ByteSize size_of_parameters_offset() { return byte_offset_of(methodOopDesc, _size_of_parameters); }
duke@435 549 static ByteSize from_compiled_offset() { return byte_offset_of(methodOopDesc, _from_compiled_entry); }
duke@435 550 static ByteSize code_offset() { return byte_offset_of(methodOopDesc, _code); }
duke@435 551 static ByteSize invocation_counter_offset() { return byte_offset_of(methodOopDesc, _invocation_counter); }
duke@435 552 static ByteSize backedge_counter_offset() { return byte_offset_of(methodOopDesc, _backedge_counter); }
duke@435 553 static ByteSize method_data_offset() {
duke@435 554 return byte_offset_of(methodOopDesc, _method_data);
duke@435 555 }
duke@435 556 static ByteSize interpreter_invocation_counter_offset() { return byte_offset_of(methodOopDesc, _interpreter_invocation_count); }
duke@435 557 #ifndef PRODUCT
duke@435 558 static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(methodOopDesc, _compiled_invocation_count); }
duke@435 559 #endif // not PRODUCT
duke@435 560 static ByteSize native_function_offset() { return in_ByteSize(sizeof(methodOopDesc)); }
duke@435 561 static ByteSize from_interpreted_offset() { return byte_offset_of(methodOopDesc, _from_interpreted_entry ); }
duke@435 562 static ByteSize interpreter_entry_offset() { return byte_offset_of(methodOopDesc, _i2i_entry ); }
duke@435 563 static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(methodOopDesc) + wordSize); }
duke@435 564 static ByteSize max_stack_offset() { return byte_offset_of(methodOopDesc, _max_stack ); }
duke@435 565
duke@435 566 // for code generation
duke@435 567 static int method_data_offset_in_bytes() { return offset_of(methodOopDesc, _method_data); }
duke@435 568 static int interpreter_invocation_counter_offset_in_bytes()
duke@435 569 { return offset_of(methodOopDesc, _interpreter_invocation_count); }
jrose@2148 570 static int intrinsic_id_offset_in_bytes() { return offset_of(methodOopDesc, _intrinsic_id); }
jrose@2148 571 static int intrinsic_id_size_in_bytes() { return sizeof(u1); }
duke@435 572
duke@435 573 // Static methods that are used to implement member methods where an exposed this pointer
duke@435 574 // is needed due to possible GCs
duke@435 575 static objArrayHandle resolved_checked_exceptions_impl(methodOop this_oop, TRAPS);
duke@435 576
duke@435 577 // Returns the byte code index from the byte code pointer
duke@435 578 int bci_from(address bcp) const;
duke@435 579 address bcp_from(int bci) const;
duke@435 580 int validate_bci_from_bcx(intptr_t bcx) const;
duke@435 581
duke@435 582 // Returns the line number for a bci if debugging information for the method is prowided,
duke@435 583 // -1 is returned otherwise.
duke@435 584 int line_number_from_bci(int bci) const;
duke@435 585
duke@435 586 // Reflection support
duke@435 587 bool is_overridden_in(klassOop k) const;
duke@435 588
jrose@1145 589 // JSR 292 support
jrose@1145 590 bool is_method_handle_invoke() const { return access_flags().is_method_handle_invoke(); }
jrose@1862 591 static bool is_method_handle_invoke_name(vmSymbols::SID name_sid);
coleenp@2497 592 static bool is_method_handle_invoke_name(Symbol* name) {
jrose@1862 593 return is_method_handle_invoke_name(vmSymbols::find_sid(name));
jrose@1862 594 }
twisti@1587 595 // Tests if this method is an internal adapter frame from the
twisti@1587 596 // MethodHandleCompiler.
twisti@1587 597 bool is_method_handle_adapter() const;
jrose@1145 598 static methodHandle make_invoke_method(KlassHandle holder,
coleenp@2497 599 Symbol* name, //invokeExact or invokeGeneric
coleenp@2497 600 Symbol* signature, //anything at all
jrose@1145 601 Handle method_type,
jrose@1145 602 TRAPS);
jrose@1145 603 // these operate only on invoke methods:
jrose@1145 604 oop method_handle_type() const;
jrose@1145 605 static jint* method_type_offsets_chain(); // series of pointer-offsets, terminated by -1
jrose@1145 606 // presize interpreter frames for extra interpreter stack entries, if needed
jrose@1161 607 // method handles want to be able to push a few extra values (e.g., a bound receiver), and
jrose@1161 608 // invokedynamic sometimes needs to push a bootstrap method, call site, and arglist,
jrose@1161 609 // all without checking for a stack overflow
jrose@1161 610 static int extra_stack_entries() { return (EnableMethodHandles ? (int)MethodHandlePushLimit : 0) + (EnableInvokeDynamic ? 3 : 0); }
jrose@1145 611 static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize()
twisti@1587 612
duke@435 613 // RedefineClasses() support:
duke@435 614 bool is_old() const { return access_flags().is_old(); }
duke@435 615 void set_is_old() { _access_flags.set_is_old(); }
duke@435 616 bool is_obsolete() const { return access_flags().is_obsolete(); }
duke@435 617 void set_is_obsolete() { _access_flags.set_is_obsolete(); }
dcubed@483 618 // see the definition in methodOop.cpp for the gory details
dcubed@483 619 bool should_not_be_cached() const;
duke@435 620
duke@435 621 // JVMTI Native method prefixing support:
duke@435 622 bool is_prefixed_native() const { return access_flags().is_prefixed_native(); }
duke@435 623 void set_is_prefixed_native() { _access_flags.set_is_prefixed_native(); }
duke@435 624
duke@435 625 // Rewriting support
duke@435 626 static methodHandle clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
duke@435 627 u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS);
duke@435 628
duke@435 629 // Get this method's jmethodID -- allocate if it doesn't exist
duke@435 630 jmethodID jmethod_id() { methodHandle this_h(this);
dcubed@1412 631 return instanceKlass::get_jmethod_id(method_holder(), this_h); }
duke@435 632
duke@435 633 // Lookup the jmethodID for this method. Return NULL if not found.
duke@435 634 // NOTE that this function can be called from a signal handler
duke@435 635 // (see AsyncGetCallTrace support for Forte Analyzer) and this
duke@435 636 // needs to be async-safe. No allocation should be done and
duke@435 637 // so handles are not used to avoid deadlock.
duke@435 638 jmethodID find_jmethod_id_or_null() { return instanceKlass::cast(method_holder())->jmethod_id_or_null(this); }
duke@435 639
duke@435 640 // JNI static invoke cached itable index accessors
duke@435 641 int cached_itable_index() { return instanceKlass::cast(method_holder())->cached_itable_index(method_idnum()); }
duke@435 642 void set_cached_itable_index(int index) { instanceKlass::cast(method_holder())->set_cached_itable_index(method_idnum(), index); }
duke@435 643
duke@435 644 // Support for inlining of intrinsic methods
jrose@1291 645 vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; }
jrose@1291 646 void set_intrinsic_id(vmIntrinsics::ID id) { _intrinsic_id = (u1) id; }
jrose@1291 647
jrose@1291 648 // Helper routines for intrinsic_id() and vmIntrinsics::method().
jrose@1291 649 void init_intrinsic_id(); // updates from _none if a match
jrose@1291 650 static vmSymbols::SID klass_id_for_intrinsics(klassOop holder);
duke@435 651
duke@435 652 // On-stack replacement support
iveresov@2138 653 bool has_osr_nmethod(int level, bool match_level) {
iveresov@2138 654 return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL;
iveresov@2138 655 }
iveresov@2138 656
iveresov@2138 657 nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) {
iveresov@2138 658 return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, bci, level, match_level);
iveresov@2138 659 }
duke@435 660
duke@435 661 // Inline cache support
duke@435 662 void cleanup_inline_caches();
duke@435 663
duke@435 664 // Find if klass for method is loaded
duke@435 665 bool is_klass_loaded_by_klass_index(int klass_index) const;
duke@435 666 bool is_klass_loaded(int refinfo_index, bool must_be_resolved = false) const;
duke@435 667
duke@435 668 // Indicates whether compilation failed earlier for this method, or
duke@435 669 // whether it is not compilable for another reason like having a
duke@435 670 // breakpoint set in it.
iveresov@2138 671 bool is_not_compilable(int comp_level = CompLevel_any) const;
iveresov@2138 672 void set_not_compilable(int comp_level = CompLevel_all, bool report = true);
iveresov@2138 673 void set_not_compilable_quietly(int comp_level = CompLevel_all) {
kvn@1643 674 set_not_compilable(comp_level, false);
kvn@1643 675 }
iveresov@2138 676 bool is_not_osr_compilable(int comp_level = CompLevel_any) const {
iveresov@2138 677 return is_not_compilable(comp_level) || access_flags().is_not_osr_compilable();
iveresov@2138 678 }
iveresov@2138 679 void set_not_osr_compilable() { _access_flags.set_not_osr_compilable(); }
iveresov@2138 680 bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
iveresov@2138 681 void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
iveresov@2138 682 bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); }
iveresov@2138 683 void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); }
duke@435 684
duke@435 685 // Background compilation support
iveresov@2138 686 bool queued_for_compilation() const { return access_flags().queued_for_compilation(); }
iveresov@2138 687 void set_queued_for_compilation() { _access_flags.set_queued_for_compilation(); }
iveresov@2138 688 void clear_queued_for_compilation() { _access_flags.clear_queued_for_compilation(); }
duke@435 689
duke@435 690 // Resolve all classes in signature, return 'true' if successful
duke@435 691 static bool load_signature_classes(methodHandle m, TRAPS);
duke@435 692
duke@435 693 // Return if true if not all classes references in signature, including return type, has been loaded
duke@435 694 static bool has_unloaded_classes_in_signature(methodHandle m, TRAPS);
duke@435 695
duke@435 696 // Printing
duke@435 697 void print_short_name(outputStream* st) /*PRODUCT_RETURN*/; // prints as klassname::methodname; Exposed so field engineers can debug VM
duke@435 698 void print_name(outputStream* st) PRODUCT_RETURN; // prints as "virtual void foo(int)"
duke@435 699
duke@435 700 // Helper routine used for method sorting
duke@435 701 static void sort_methods(objArrayOop methods,
duke@435 702 objArrayOop methods_annotations,
duke@435 703 objArrayOop methods_parameter_annotations,
duke@435 704 objArrayOop methods_default_annotations,
duke@435 705 bool idempotent = false);
duke@435 706
duke@435 707 // size of parameters
duke@435 708 void set_size_of_parameters(int size) { _size_of_parameters = size; }
duke@435 709 private:
duke@435 710
duke@435 711 // Inlined elements
duke@435 712 address* native_function_addr() const { assert(is_native(), "must be native"); return (address*) (this+1); }
duke@435 713 address* signature_handler_addr() const { return native_function_addr() + 1; }
duke@435 714
duke@435 715 // Garbage collection support
duke@435 716 oop* adr_constMethod() const { return (oop*)&_constMethod; }
duke@435 717 oop* adr_constants() const { return (oop*)&_constants; }
duke@435 718 oop* adr_method_data() const { return (oop*)&_method_data; }
duke@435 719 };
duke@435 720
duke@435 721
duke@435 722 // Utility class for compressing line number tables
duke@435 723
duke@435 724 class CompressedLineNumberWriteStream: public CompressedWriteStream {
duke@435 725 private:
duke@435 726 int _bci;
duke@435 727 int _line;
duke@435 728 public:
duke@435 729 // Constructor
duke@435 730 CompressedLineNumberWriteStream(int initial_size) : CompressedWriteStream(initial_size), _bci(0), _line(0) {}
duke@435 731 CompressedLineNumberWriteStream(u_char* buffer, int initial_size) : CompressedWriteStream(buffer, initial_size), _bci(0), _line(0) {}
duke@435 732
duke@435 733 // Write (bci, line number) pair to stream
duke@435 734 void write_pair_regular(int bci_delta, int line_delta);
duke@435 735
duke@435 736 inline void write_pair_inline(int bci, int line) {
duke@435 737 int bci_delta = bci - _bci;
duke@435 738 int line_delta = line - _line;
duke@435 739 _bci = bci;
duke@435 740 _line = line;
duke@435 741 // Skip (0,0) deltas - they do not add information and conflict with terminator.
duke@435 742 if (bci_delta == 0 && line_delta == 0) return;
duke@435 743 // Check if bci is 5-bit and line number 3-bit unsigned.
duke@435 744 if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) {
duke@435 745 // Compress into single byte.
duke@435 746 jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta;
duke@435 747 // Check that value doesn't match escape character.
duke@435 748 if (value != 0xFF) {
duke@435 749 write_byte(value);
duke@435 750 return;
duke@435 751 }
duke@435 752 }
duke@435 753 write_pair_regular(bci_delta, line_delta);
duke@435 754 }
duke@435 755
duke@435 756 // Windows AMD64 + Apr 2005 PSDK with /O2 generates bad code for write_pair.
duke@435 757 // Disabling optimization doesn't work for methods in header files
duke@435 758 // so we force it to call through the non-optimized version in the .cpp.
duke@435 759 // It's gross, but it's the only way we can ensure that all callers are
sla@2540 760 // fixed. _MSC_VER is defined by the windows compiler
sla@2540 761 #if defined(_M_AMD64) && _MSC_VER >= 1400
duke@435 762 void write_pair(int bci, int line);
duke@435 763 #else
duke@435 764 void write_pair(int bci, int line) { write_pair_inline(bci, line); }
duke@435 765 #endif
duke@435 766
duke@435 767 // Write end-of-stream marker
duke@435 768 void write_terminator() { write_byte(0); }
duke@435 769 };
duke@435 770
duke@435 771
duke@435 772 // Utility class for decompressing line number tables
duke@435 773
duke@435 774 class CompressedLineNumberReadStream: public CompressedReadStream {
duke@435 775 private:
duke@435 776 int _bci;
duke@435 777 int _line;
duke@435 778 public:
duke@435 779 // Constructor
duke@435 780 CompressedLineNumberReadStream(u_char* buffer);
duke@435 781 // Read (bci, line number) pair from stream. Returns false at end-of-stream.
duke@435 782 bool read_pair();
duke@435 783 // Accessing bci and line number (after calling read_pair)
duke@435 784 int bci() const { return _bci; }
duke@435 785 int line() const { return _line; }
duke@435 786 };
duke@435 787
duke@435 788
duke@435 789 /// Fast Breakpoints.
duke@435 790
duke@435 791 // If this structure gets more complicated (because bpts get numerous),
duke@435 792 // move it into its own header.
duke@435 793
duke@435 794 // There is presently no provision for concurrent access
duke@435 795 // to breakpoint lists, which is only OK for JVMTI because
duke@435 796 // breakpoints are written only at safepoints, and are read
duke@435 797 // concurrently only outside of safepoints.
duke@435 798
duke@435 799 class BreakpointInfo : public CHeapObj {
duke@435 800 friend class VMStructs;
duke@435 801 private:
duke@435 802 Bytecodes::Code _orig_bytecode;
duke@435 803 int _bci;
duke@435 804 u2 _name_index; // of method
duke@435 805 u2 _signature_index; // of method
duke@435 806 BreakpointInfo* _next; // simple storage allocation
duke@435 807
duke@435 808 public:
duke@435 809 BreakpointInfo(methodOop m, int bci);
duke@435 810
duke@435 811 // accessors
duke@435 812 Bytecodes::Code orig_bytecode() { return _orig_bytecode; }
duke@435 813 void set_orig_bytecode(Bytecodes::Code code) { _orig_bytecode = code; }
duke@435 814 int bci() { return _bci; }
duke@435 815
duke@435 816 BreakpointInfo* next() const { return _next; }
duke@435 817 void set_next(BreakpointInfo* n) { _next = n; }
duke@435 818
duke@435 819 // helps for searchers
never@2462 820 bool match(const methodOopDesc* m, int bci) {
duke@435 821 return bci == _bci && match(m);
duke@435 822 }
duke@435 823
never@2462 824 bool match(const methodOopDesc* m) {
duke@435 825 return _name_index == m->name_index() &&
duke@435 826 _signature_index == m->signature_index();
duke@435 827 }
duke@435 828
duke@435 829 void set(methodOop method);
duke@435 830 void clear(methodOop method);
duke@435 831 };
stefank@2314 832
stefank@2314 833 #endif // SHARE_VM_OOPS_METHODOOP_HPP

mercurial