src/share/vm/ci/ciMethod.cpp

Thu, 02 Dec 2010 17:21:12 -0800

author
iveresov
date
Thu, 02 Dec 2010 17:21:12 -0800
changeset 2349
5ddfcf4b079e
parent 2314
f95d63e2154a
child 2497
3582bf76420e
permissions
-rw-r--r--

7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation.
Reviewed-by: kvn, never

     1 /*
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "ci/ciCallProfile.hpp"
    27 #include "ci/ciExceptionHandler.hpp"
    28 #include "ci/ciInstanceKlass.hpp"
    29 #include "ci/ciMethod.hpp"
    30 #include "ci/ciMethodBlocks.hpp"
    31 #include "ci/ciMethodData.hpp"
    32 #include "ci/ciMethodKlass.hpp"
    33 #include "ci/ciStreams.hpp"
    34 #include "ci/ciSymbol.hpp"
    35 #include "ci/ciUtilities.hpp"
    36 #include "classfile/systemDictionary.hpp"
    37 #include "compiler/abstractCompiler.hpp"
    38 #include "compiler/compilerOracle.hpp"
    39 #include "compiler/methodLiveness.hpp"
    40 #include "interpreter/interpreter.hpp"
    41 #include "interpreter/linkResolver.hpp"
    42 #include "interpreter/oopMapCache.hpp"
    43 #include "memory/allocation.inline.hpp"
    44 #include "memory/resourceArea.hpp"
    45 #include "oops/generateOopMap.hpp"
    46 #include "oops/oop.inline.hpp"
    47 #include "prims/nativeLookup.hpp"
    48 #include "runtime/deoptimization.hpp"
    49 #include "utilities/bitMap.inline.hpp"
    50 #include "utilities/xmlstream.hpp"
    51 #ifdef COMPILER2
    52 #include "ci/bcEscapeAnalyzer.hpp"
    53 #include "ci/ciTypeFlow.hpp"
    54 #include "oops/methodOop.hpp"
    55 #endif
    56 #ifdef SHARK
    57 #include "ci/ciTypeFlow.hpp"
    58 #include "oops/methodOop.hpp"
    59 #endif
    61 // ciMethod
    62 //
    63 // This class represents a methodOop in the HotSpot virtual
    64 // machine.
    67 // ------------------------------------------------------------------
    68 // ciMethod::ciMethod
    69 //
    70 // Loaded method.
    71 ciMethod::ciMethod(methodHandle h_m) : ciObject(h_m) {
    72   assert(h_m() != NULL, "no null method");
    74   // These fields are always filled in in loaded methods.
    75   _flags = ciFlags(h_m()->access_flags());
    77   // Easy to compute, so fill them in now.
    78   _max_stack          = h_m()->max_stack();
    79   _max_locals         = h_m()->max_locals();
    80   _code_size          = h_m()->code_size();
    81   _intrinsic_id       = h_m()->intrinsic_id();
    82   _handler_count      = h_m()->exception_table()->length() / 4;
    83   _uses_monitors      = h_m()->access_flags().has_monitor_bytecodes();
    84   _balanced_monitors  = !_uses_monitors || h_m()->access_flags().is_monitor_matching();
    85   _is_c1_compilable   = !h_m()->is_not_c1_compilable();
    86   _is_c2_compilable   = !h_m()->is_not_c2_compilable();
    87   // Lazy fields, filled in on demand.  Require allocation.
    88   _code               = NULL;
    89   _exception_handlers = NULL;
    90   _liveness           = NULL;
    91   _method_blocks = NULL;
    92 #if defined(COMPILER2) || defined(SHARK)
    93   _flow               = NULL;
    94   _bcea               = NULL;
    95 #endif // COMPILER2 || SHARK
    97   ciEnv *env = CURRENT_ENV;
    98   if (env->jvmti_can_hotswap_or_post_breakpoint() && can_be_compiled()) {
    99     // 6328518 check hotswap conditions under the right lock.
   100     MutexLocker locker(Compile_lock);
   101     if (Dependencies::check_evol_method(h_m()) != NULL) {
   102       _is_c1_compilable = false;
   103       _is_c2_compilable = false;
   104     }
   105   } else {
   106     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
   107   }
   109   if (instanceKlass::cast(h_m()->method_holder())->is_linked()) {
   110     _can_be_statically_bound = h_m()->can_be_statically_bound();
   111   } else {
   112     // Have to use a conservative value in this case.
   113     _can_be_statically_bound = false;
   114   }
   116   // Adjust the definition of this condition to be more useful:
   117   // %%% take these conditions into account in vtable generation
   118   if (!_can_be_statically_bound && h_m()->is_private())
   119     _can_be_statically_bound = true;
   120   if (_can_be_statically_bound && h_m()->is_abstract())
   121     _can_be_statically_bound = false;
   123   // generating _signature may allow GC and therefore move m.
   124   // These fields are always filled in.
   125   _name = env->get_object(h_m()->name())->as_symbol();
   126   _holder = env->get_object(h_m()->method_holder())->as_instance_klass();
   127   ciSymbol* sig_symbol = env->get_object(h_m()->signature())->as_symbol();
   128   _signature = new (env->arena()) ciSignature(_holder, sig_symbol);
   129   _method_data = NULL;
   130   // Take a snapshot of these values, so they will be commensurate with the MDO.
   131   if (ProfileInterpreter || TieredCompilation) {
   132     int invcnt = h_m()->interpreter_invocation_count();
   133     // if the value overflowed report it as max int
   134     _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ;
   135     _interpreter_throwout_count   = h_m()->interpreter_throwout_count();
   136   } else {
   137     _interpreter_invocation_count = 0;
   138     _interpreter_throwout_count = 0;
   139   }
   140   if (_interpreter_invocation_count == 0)
   141     _interpreter_invocation_count = 1;
   142 }
   145 // ------------------------------------------------------------------
   146 // ciMethod::ciMethod
   147 //
   148 // Unloaded method.
   149 ciMethod::ciMethod(ciInstanceKlass* holder,
   150                    ciSymbol* name,
   151                    ciSymbol* signature) : ciObject(ciMethodKlass::make()) {
   152   // These fields are always filled in.
   153   _name = name;
   154   _holder = holder;
   155   _signature = new (CURRENT_ENV->arena()) ciSignature(_holder, signature);
   156   _intrinsic_id = vmIntrinsics::_none;
   157   _liveness = NULL;
   158   _can_be_statically_bound = false;
   159   _method_blocks = NULL;
   160   _method_data = NULL;
   161 #if defined(COMPILER2) || defined(SHARK)
   162   _flow = NULL;
   163   _bcea = NULL;
   164 #endif // COMPILER2 || SHARK
   165 }
   168 // ------------------------------------------------------------------
   169 // ciMethod::load_code
   170 //
   171 // Load the bytecodes and exception handler table for this method.
   172 void ciMethod::load_code() {
   173   VM_ENTRY_MARK;
   174   assert(is_loaded(), "only loaded methods have code");
   176   methodOop me = get_methodOop();
   177   Arena* arena = CURRENT_THREAD_ENV->arena();
   179   // Load the bytecodes.
   180   _code = (address)arena->Amalloc(code_size());
   181   memcpy(_code, me->code_base(), code_size());
   183   // Revert any breakpoint bytecodes in ci's copy
   184   if (me->number_of_breakpoints() > 0) {
   185     BreakpointInfo* bp = instanceKlass::cast(me->method_holder())->breakpoints();
   186     for (; bp != NULL; bp = bp->next()) {
   187       if (bp->match(me)) {
   188         code_at_put(bp->bci(), bp->orig_bytecode());
   189       }
   190     }
   191   }
   193   // And load the exception table.
   194   typeArrayOop exc_table = me->exception_table();
   196   // Allocate one extra spot in our list of exceptions.  This
   197   // last entry will be used to represent the possibility that
   198   // an exception escapes the method.  See ciExceptionHandlerStream
   199   // for details.
   200   _exception_handlers =
   201     (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*)
   202                                          * (_handler_count + 1));
   203   if (_handler_count > 0) {
   204     for (int i=0; i<_handler_count; i++) {
   205       int base = i*4;
   206       _exception_handlers[i] = new (arena) ciExceptionHandler(
   207                                 holder(),
   208             /* start    */      exc_table->int_at(base),
   209             /* limit    */      exc_table->int_at(base+1),
   210             /* goto pc  */      exc_table->int_at(base+2),
   211             /* cp index */      exc_table->int_at(base+3));
   212     }
   213   }
   215   // Put an entry at the end of our list to represent the possibility
   216   // of exceptional exit.
   217   _exception_handlers[_handler_count] =
   218     new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0);
   220   if (CIPrintMethodCodes) {
   221     print_codes();
   222   }
   223 }
   226 // ------------------------------------------------------------------
   227 // ciMethod::has_linenumber_table
   228 //
   229 // length unknown until decompression
   230 bool    ciMethod::has_linenumber_table() const {
   231   check_is_loaded();
   232   VM_ENTRY_MARK;
   233   return get_methodOop()->has_linenumber_table();
   234 }
   237 // ------------------------------------------------------------------
   238 // ciMethod::compressed_linenumber_table
   239 u_char* ciMethod::compressed_linenumber_table() const {
   240   check_is_loaded();
   241   VM_ENTRY_MARK;
   242   return get_methodOop()->compressed_linenumber_table();
   243 }
   246 // ------------------------------------------------------------------
   247 // ciMethod::line_number_from_bci
   248 int ciMethod::line_number_from_bci(int bci) const {
   249   check_is_loaded();
   250   VM_ENTRY_MARK;
   251   return get_methodOop()->line_number_from_bci(bci);
   252 }
   255 // ------------------------------------------------------------------
   256 // ciMethod::vtable_index
   257 //
   258 // Get the position of this method's entry in the vtable, if any.
   259 int ciMethod::vtable_index() {
   260   check_is_loaded();
   261   assert(holder()->is_linked(), "must be linked");
   262   VM_ENTRY_MARK;
   263   return get_methodOop()->vtable_index();
   264 }
   267 #ifdef SHARK
   268 // ------------------------------------------------------------------
   269 // ciMethod::itable_index
   270 //
   271 // Get the position of this method's entry in the itable, if any.
   272 int ciMethod::itable_index() {
   273   check_is_loaded();
   274   assert(holder()->is_linked(), "must be linked");
   275   VM_ENTRY_MARK;
   276   return klassItable::compute_itable_index(get_methodOop());
   277 }
   278 #endif // SHARK
   281 // ------------------------------------------------------------------
   282 // ciMethod::native_entry
   283 //
   284 // Get the address of this method's native code, if any.
   285 address ciMethod::native_entry() {
   286   check_is_loaded();
   287   assert(flags().is_native(), "must be native method");
   288   VM_ENTRY_MARK;
   289   methodOop method = get_methodOop();
   290   address entry = method->native_function();
   291   assert(entry != NULL, "must be valid entry point");
   292   return entry;
   293 }
   296 // ------------------------------------------------------------------
   297 // ciMethod::interpreter_entry
   298 //
   299 // Get the entry point for running this method in the interpreter.
   300 address ciMethod::interpreter_entry() {
   301   check_is_loaded();
   302   VM_ENTRY_MARK;
   303   methodHandle mh(THREAD, get_methodOop());
   304   return Interpreter::entry_for_method(mh);
   305 }
   308 // ------------------------------------------------------------------
   309 // ciMethod::uses_balanced_monitors
   310 //
   311 // Does this method use monitors in a strict stack-disciplined manner?
   312 bool ciMethod::has_balanced_monitors() {
   313   check_is_loaded();
   314   if (_balanced_monitors) return true;
   316   // Analyze the method to see if monitors are used properly.
   317   VM_ENTRY_MARK;
   318   methodHandle method(THREAD, get_methodOop());
   319   assert(method->has_monitor_bytecodes(), "should have checked this");
   321   // Check to see if a previous compilation computed the
   322   // monitor-matching analysis.
   323   if (method->guaranteed_monitor_matching()) {
   324     _balanced_monitors = true;
   325     return true;
   326   }
   328   {
   329     EXCEPTION_MARK;
   330     ResourceMark rm(THREAD);
   331     GeneratePairingInfo gpi(method);
   332     gpi.compute_map(CATCH);
   333     if (!gpi.monitor_safe()) {
   334       return false;
   335     }
   336     method->set_guaranteed_monitor_matching();
   337     _balanced_monitors = true;
   338   }
   339   return true;
   340 }
   343 // ------------------------------------------------------------------
   344 // ciMethod::get_flow_analysis
   345 ciTypeFlow* ciMethod::get_flow_analysis() {
   346 #if defined(COMPILER2) || defined(SHARK)
   347   if (_flow == NULL) {
   348     ciEnv* env = CURRENT_ENV;
   349     _flow = new (env->arena()) ciTypeFlow(env, this);
   350     _flow->do_flow();
   351   }
   352   return _flow;
   353 #else // COMPILER2 || SHARK
   354   ShouldNotReachHere();
   355   return NULL;
   356 #endif // COMPILER2 || SHARK
   357 }
   360 // ------------------------------------------------------------------
   361 // ciMethod::get_osr_flow_analysis
   362 ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
   363 #if defined(COMPILER2) || defined(SHARK)
   364   // OSR entry points are always place after a call bytecode of some sort
   365   assert(osr_bci >= 0, "must supply valid OSR entry point");
   366   ciEnv* env = CURRENT_ENV;
   367   ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
   368   flow->do_flow();
   369   return flow;
   370 #else // COMPILER2 || SHARK
   371   ShouldNotReachHere();
   372   return NULL;
   373 #endif // COMPILER2 || SHARK
   374 }
   376 // ------------------------------------------------------------------
   377 // ciMethod::raw_liveness_at_bci
   378 //
   379 // Which local variables are live at a specific bci?
   380 MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
   381   check_is_loaded();
   382   if (_liveness == NULL) {
   383     // Create the liveness analyzer.
   384     Arena* arena = CURRENT_ENV->arena();
   385     _liveness = new (arena) MethodLiveness(arena, this);
   386     _liveness->compute_liveness();
   387   }
   388   return _liveness->get_liveness_at(bci);
   389 }
   391 // ------------------------------------------------------------------
   392 // ciMethod::liveness_at_bci
   393 //
   394 // Which local variables are live at a specific bci?  When debugging
   395 // will return true for all locals in some cases to improve debug
   396 // information.
   397 MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
   398   MethodLivenessResult result = raw_liveness_at_bci(bci);
   399   if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
   400     // Keep all locals live for the user's edification and amusement.
   401     result.at_put_range(0, result.size(), true);
   402   }
   403   return result;
   404 }
   406 // ciMethod::live_local_oops_at_bci
   407 //
   408 // find all the live oops in the locals array for a particular bci
   409 // Compute what the interpreter believes by using the interpreter
   410 // oopmap generator. This is used as a double check during osr to
   411 // guard against conservative result from MethodLiveness making us
   412 // think a dead oop is live.  MethodLiveness is conservative in the
   413 // sense that it may consider locals to be live which cannot be live,
   414 // like in the case where a local could contain an oop or  a primitive
   415 // along different paths.  In that case the local must be dead when
   416 // those paths merge. Since the interpreter's viewpoint is used when
   417 // gc'ing an interpreter frame we need to use its viewpoint  during
   418 // OSR when loading the locals.
   420 BitMap ciMethod::live_local_oops_at_bci(int bci) {
   421   VM_ENTRY_MARK;
   422   InterpreterOopMap mask;
   423   OopMapCache::compute_one_oop_map(get_methodOop(), bci, &mask);
   424   int mask_size = max_locals();
   425   BitMap result(mask_size);
   426   result.clear();
   427   int i;
   428   for (i = 0; i < mask_size ; i++ ) {
   429     if (mask.is_oop(i)) result.set_bit(i);
   430   }
   431   return result;
   432 }
   435 #ifdef COMPILER1
   436 // ------------------------------------------------------------------
   437 // ciMethod::bci_block_start
   438 //
   439 // Marks all bcis where a new basic block starts
   440 const BitMap ciMethod::bci_block_start() {
   441   check_is_loaded();
   442   if (_liveness == NULL) {
   443     // Create the liveness analyzer.
   444     Arena* arena = CURRENT_ENV->arena();
   445     _liveness = new (arena) MethodLiveness(arena, this);
   446     _liveness->compute_liveness();
   447   }
   449   return _liveness->get_bci_block_start();
   450 }
   451 #endif // COMPILER1
   454 // ------------------------------------------------------------------
   455 // ciMethod::call_profile_at_bci
   456 //
   457 // Get the ciCallProfile for the invocation of this method.
   458 // Also reports receiver types for non-call type checks (if TypeProfileCasts).
   459 ciCallProfile ciMethod::call_profile_at_bci(int bci) {
   460   ResourceMark rm;
   461   ciCallProfile result;
   462   if (method_data() != NULL && method_data()->is_mature()) {
   463     ciProfileData* data = method_data()->bci_to_data(bci);
   464     if (data != NULL && data->is_CounterData()) {
   465       // Every profiled call site has a counter.
   466       int count = data->as_CounterData()->count();
   468       if (!data->is_ReceiverTypeData()) {
   469         result._receiver_count[0] = 0;  // that's a definite zero
   470       } else { // ReceiverTypeData is a subclass of CounterData
   471         ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
   472         // In addition, virtual call sites have receiver type information
   473         int receivers_count_total = 0;
   474         int morphism = 0;
   475         // Precompute morphism for the possible fixup
   476         for (uint i = 0; i < call->row_limit(); i++) {
   477           ciKlass* receiver = call->receiver(i);
   478           if (receiver == NULL)  continue;
   479           morphism++;
   480         }
   481         int epsilon = 0;
   482         if (TieredCompilation && ProfileInterpreter) {
   483           // Interpreter and C1 treat final and special invokes differently.
   484           // C1 will record a type, whereas the interpreter will just
   485           // increment the count. Detect this case.
   486           if (morphism == 1 && count > 0) {
   487             epsilon = count;
   488             count = 0;
   489           }
   490         }
   491         for (uint i = 0; i < call->row_limit(); i++) {
   492           ciKlass* receiver = call->receiver(i);
   493           if (receiver == NULL)  continue;
   494           int rcount = call->receiver_count(i) + epsilon;
   495           if (rcount == 0) rcount = 1; // Should be valid value
   496           receivers_count_total += rcount;
   497           // Add the receiver to result data.
   498           result.add_receiver(receiver, rcount);
   499           // If we extend profiling to record methods,
   500           // we will set result._method also.
   501         }
   502         // Determine call site's morphism.
   503         // The call site count is 0 with known morphism (onlt 1 or 2 receivers)
   504         // or < 0 in the case of a type check failured for checkcast, aastore, instanceof.
   505         // The call site count is > 0 in the case of a polymorphic virtual call.
   506         if (morphism > 0 && morphism == result._limit) {
   507            // The morphism <= MorphismLimit.
   508            if ((morphism <  ciCallProfile::MorphismLimit) ||
   509                (morphism == ciCallProfile::MorphismLimit && count == 0)) {
   510 #ifdef ASSERT
   511              if (count > 0) {
   512                this->print_short_name(tty);
   513                tty->print_cr(" @ bci:%d", bci);
   514                this->print_codes();
   515                assert(false, "this call site should not be polymorphic");
   516              }
   517 #endif
   518              result._morphism = morphism;
   519            }
   520         }
   521         // Make the count consistent if this is a call profile. If count is
   522         // zero or less, presume that this is a typecheck profile and
   523         // do nothing.  Otherwise, increase count to be the sum of all
   524         // receiver's counts.
   525         if (count >= 0) {
   526           count += receivers_count_total;
   527         }
   528       }
   529       result._count = count;
   530     }
   531   }
   532   return result;
   533 }
   535 // ------------------------------------------------------------------
   536 // Add new receiver and sort data by receiver's profile count.
   537 void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
   538   // Add new receiver and sort data by receiver's counts when we have space
   539   // for it otherwise replace the less called receiver (less called receiver
   540   // is placed to the last array element which is not used).
   541   // First array's element contains most called receiver.
   542   int i = _limit;
   543   for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
   544     _receiver[i] = _receiver[i-1];
   545     _receiver_count[i] = _receiver_count[i-1];
   546   }
   547   _receiver[i] = receiver;
   548   _receiver_count[i] = receiver_count;
   549   if (_limit < MorphismLimit) _limit++;
   550 }
   552 // ------------------------------------------------------------------
   553 // ciMethod::find_monomorphic_target
   554 //
   555 // Given a certain calling environment, find the monomorphic target
   556 // for the call.  Return NULL if the call is not monomorphic in
   557 // its calling environment, or if there are only abstract methods.
   558 // The returned method is never abstract.
   559 // Note: If caller uses a non-null result, it must inform dependencies
   560 // via assert_unique_concrete_method or assert_leaf_type.
   561 ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
   562                                             ciInstanceKlass* callee_holder,
   563                                             ciInstanceKlass* actual_recv) {
   564   check_is_loaded();
   566   if (actual_recv->is_interface()) {
   567     // %%% We cannot trust interface types, yet.  See bug 6312651.
   568     return NULL;
   569   }
   571   ciMethod* root_m = resolve_invoke(caller, actual_recv);
   572   if (root_m == NULL) {
   573     // Something went wrong looking up the actual receiver method.
   574     return NULL;
   575   }
   576   assert(!root_m->is_abstract(), "resolve_invoke promise");
   578   // Make certain quick checks even if UseCHA is false.
   580   // Is it private or final?
   581   if (root_m->can_be_statically_bound()) {
   582     return root_m;
   583   }
   585   if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
   586     // Easy case.  There is no other place to put a method, so don't bother
   587     // to go through the VM_ENTRY_MARK and all the rest.
   588     return root_m;
   589   }
   591   // Array methods (clone, hashCode, etc.) are always statically bound.
   592   // If we were to see an array type here, we'd return root_m.
   593   // However, this method processes only ciInstanceKlasses.  (See 4962591.)
   594   // The inline_native_clone intrinsic narrows Object to T[] properly,
   595   // so there is no need to do the same job here.
   597   if (!UseCHA)  return NULL;
   599   VM_ENTRY_MARK;
   601   methodHandle target;
   602   {
   603     MutexLocker locker(Compile_lock);
   604     klassOop context = actual_recv->get_klassOop();
   605     target = Dependencies::find_unique_concrete_method(context,
   606                                                        root_m->get_methodOop());
   607     // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
   608   }
   610 #ifndef PRODUCT
   611   if (TraceDependencies && target() != NULL && target() != root_m->get_methodOop()) {
   612     tty->print("found a non-root unique target method");
   613     tty->print_cr("  context = %s", instanceKlass::cast(actual_recv->get_klassOop())->external_name());
   614     tty->print("  method  = ");
   615     target->print_short_name(tty);
   616     tty->cr();
   617   }
   618 #endif //PRODUCT
   620   if (target() == NULL) {
   621     return NULL;
   622   }
   623   if (target() == root_m->get_methodOop()) {
   624     return root_m;
   625   }
   626   if (!root_m->is_public() &&
   627       !root_m->is_protected()) {
   628     // If we are going to reason about inheritance, it's easiest
   629     // if the method in question is public, protected, or private.
   630     // If the answer is not root_m, it is conservatively correct
   631     // to return NULL, even if the CHA encountered irrelevant
   632     // methods in other packages.
   633     // %%% TO DO: Work out logic for package-private methods
   634     // with the same name but different vtable indexes.
   635     return NULL;
   636   }
   637   return CURRENT_THREAD_ENV->get_object(target())->as_method();
   638 }
   640 // ------------------------------------------------------------------
   641 // ciMethod::resolve_invoke
   642 //
   643 // Given a known receiver klass, find the target for the call.
   644 // Return NULL if the call has no target or the target is abstract.
   645 ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
   646    check_is_loaded();
   647    VM_ENTRY_MARK;
   649    KlassHandle caller_klass (THREAD, caller->get_klassOop());
   650    KlassHandle h_recv       (THREAD, exact_receiver->get_klassOop());
   651    KlassHandle h_resolved   (THREAD, holder()->get_klassOop());
   652    symbolHandle h_name      (THREAD, name()->get_symbolOop());
   653    symbolHandle h_signature (THREAD, signature()->get_symbolOop());
   655    methodHandle m;
   656    // Only do exact lookup if receiver klass has been linked.  Otherwise,
   657    // the vtable has not been setup, and the LinkResolver will fail.
   658    if (h_recv->oop_is_javaArray()
   659         ||
   660        instanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
   661      if (holder()->is_interface()) {
   662        m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
   663      } else {
   664        m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
   665      }
   666    }
   668    if (m.is_null()) {
   669      // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
   670      return NULL;
   671    }
   673    ciMethod* result = this;
   674    if (m() != get_methodOop()) {
   675      result = CURRENT_THREAD_ENV->get_object(m())->as_method();
   676    }
   678    // Don't return abstract methods because they aren't
   679    // optimizable or interesting.
   680    if (result->is_abstract()) {
   681      return NULL;
   682    } else {
   683      return result;
   684    }
   685 }
   687 // ------------------------------------------------------------------
   688 // ciMethod::resolve_vtable_index
   689 //
   690 // Given a known receiver klass, find the vtable index for the call.
   691 // Return methodOopDesc::invalid_vtable_index if the vtable_index is unknown.
   692 int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
   693    check_is_loaded();
   695    int vtable_index = methodOopDesc::invalid_vtable_index;
   696    // Only do lookup if receiver klass has been linked.  Otherwise,
   697    // the vtable has not been setup, and the LinkResolver will fail.
   698    if (!receiver->is_interface()
   699        && (!receiver->is_instance_klass() ||
   700            receiver->as_instance_klass()->is_linked())) {
   701      VM_ENTRY_MARK;
   703      KlassHandle caller_klass (THREAD, caller->get_klassOop());
   704      KlassHandle h_recv       (THREAD, receiver->get_klassOop());
   705      symbolHandle h_name      (THREAD, name()->get_symbolOop());
   706      symbolHandle h_signature (THREAD, signature()->get_symbolOop());
   708      vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
   709      if (vtable_index == methodOopDesc::nonvirtual_vtable_index) {
   710        // A statically bound method.  Return "no such index".
   711        vtable_index = methodOopDesc::invalid_vtable_index;
   712      }
   713    }
   715    return vtable_index;
   716 }
   718 // ------------------------------------------------------------------
   719 // ciMethod::interpreter_call_site_count
   720 int ciMethod::interpreter_call_site_count(int bci) {
   721   if (method_data() != NULL) {
   722     ResourceMark rm;
   723     ciProfileData* data = method_data()->bci_to_data(bci);
   724     if (data != NULL && data->is_CounterData()) {
   725       return scale_count(data->as_CounterData()->count());
   726     }
   727   }
   728   return -1;  // unknown
   729 }
   731 // ------------------------------------------------------------------
   732 // Adjust a CounterData count to be commensurate with
   733 // interpreter_invocation_count.  If the MDO exists for
   734 // only 25% of the time the method exists, then the
   735 // counts in the MDO should be scaled by 4X, so that
   736 // they can be usefully and stably compared against the
   737 // invocation counts in methods.
   738 int ciMethod::scale_count(int count, float prof_factor) {
   739   if (count > 0 && method_data() != NULL) {
   740     int counter_life;
   741     int method_life = interpreter_invocation_count();
   742     if (TieredCompilation) {
   743       // In tiered the MDO's life is measured directly, so just use the snapshotted counters
   744       counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
   745     } else {
   746       int current_mileage = method_data()->current_mileage();
   747       int creation_mileage = method_data()->creation_mileage();
   748       counter_life = current_mileage - creation_mileage;
   749     }
   751     // counter_life due to backedge_counter could be > method_life
   752     if (counter_life > method_life)
   753       counter_life = method_life;
   754     if (0 < counter_life && counter_life <= method_life) {
   755       count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
   756       count = (count > 0) ? count : 1;
   757     }
   758   }
   759   return count;
   760 }
   762 // ------------------------------------------------------------------
   763 // invokedynamic support
   765 // ------------------------------------------------------------------
   766 // ciMethod::is_method_handle_invoke
   767 //
   768 // Return true if the method is an instance of one of the two
   769 // signature-polymorphic MethodHandle methods, invokeExact or invokeGeneric.
   770 bool ciMethod::is_method_handle_invoke() const {
   771   if (!is_loaded()) {
   772     bool flag = (holder()->name() == ciSymbol::java_dyn_MethodHandle() &&
   773                  methodOopDesc::is_method_handle_invoke_name(name()->sid()));
   774     return flag;
   775   }
   776   VM_ENTRY_MARK;
   777   return get_methodOop()->is_method_handle_invoke();
   778 }
   780 // ------------------------------------------------------------------
   781 // ciMethod::is_method_handle_adapter
   782 //
   783 // Return true if the method is a generated MethodHandle adapter.
   784 // These are built by MethodHandleCompiler.
   785 bool ciMethod::is_method_handle_adapter() const {
   786   if (!is_loaded())  return false;
   787   VM_ENTRY_MARK;
   788   return get_methodOop()->is_method_handle_adapter();
   789 }
   791 ciInstance* ciMethod::method_handle_type() {
   792   check_is_loaded();
   793   VM_ENTRY_MARK;
   794   oop mtype = get_methodOop()->method_handle_type();
   795   return CURRENT_THREAD_ENV->get_object(mtype)->as_instance();
   796 }
   799 // ------------------------------------------------------------------
   800 // ciMethod::ensure_method_data
   801 //
   802 // Generate new methodDataOop objects at compile time.
   803 // Return true if allocation was successful or no MDO is required.
   804 bool ciMethod::ensure_method_data(methodHandle h_m) {
   805   EXCEPTION_CONTEXT;
   806   if (is_native() || is_abstract() || h_m()->is_accessor()) return true;
   807   if (h_m()->method_data() == NULL) {
   808     methodOopDesc::build_interpreter_method_data(h_m, THREAD);
   809     if (HAS_PENDING_EXCEPTION) {
   810       CLEAR_PENDING_EXCEPTION;
   811     }
   812   }
   813   if (h_m()->method_data() != NULL) {
   814     _method_data = CURRENT_ENV->get_object(h_m()->method_data())->as_method_data();
   815     _method_data->load_data();
   816     return true;
   817   } else {
   818     _method_data = CURRENT_ENV->get_empty_methodData();
   819     return false;
   820   }
   821 }
   823 // public, retroactive version
   824 bool ciMethod::ensure_method_data() {
   825   bool result = true;
   826   if (_method_data == NULL || _method_data->is_empty()) {
   827     GUARDED_VM_ENTRY({
   828       result = ensure_method_data(get_methodOop());
   829     });
   830   }
   831   return result;
   832 }
   835 // ------------------------------------------------------------------
   836 // ciMethod::method_data
   837 //
   838 ciMethodData* ciMethod::method_data() {
   839   if (_method_data != NULL) {
   840     return _method_data;
   841   }
   842   VM_ENTRY_MARK;
   843   ciEnv* env = CURRENT_ENV;
   844   Thread* my_thread = JavaThread::current();
   845   methodHandle h_m(my_thread, get_methodOop());
   847   if (h_m()->method_data() != NULL) {
   848     _method_data = CURRENT_ENV->get_object(h_m()->method_data())->as_method_data();
   849     _method_data->load_data();
   850   } else {
   851     _method_data = CURRENT_ENV->get_empty_methodData();
   852   }
   853   return _method_data;
   855 }
   857 // ------------------------------------------------------------------
   858 // ciMethod::method_data_or_null
   859 // Returns a pointer to ciMethodData if MDO exists on the VM side,
   860 // NULL otherwise.
   861 ciMethodData* ciMethod::method_data_or_null() {
   862   ciMethodData *md = method_data();
   863   if (md->is_empty()) return NULL;
   864   return md;
   865 }
   867 // ------------------------------------------------------------------
   868 // ciMethod::will_link
   869 //
   870 // Will this method link in a specific calling context?
   871 bool ciMethod::will_link(ciKlass* accessing_klass,
   872                          ciKlass* declared_method_holder,
   873                          Bytecodes::Code bc) {
   874   if (!is_loaded()) {
   875     // Method lookup failed.
   876     return false;
   877   }
   879   // The link checks have been front-loaded into the get_method
   880   // call.  This method (ciMethod::will_link()) will be removed
   881   // in the future.
   883   return true;
   884 }
   886 // ------------------------------------------------------------------
   887 // ciMethod::should_exclude
   888 //
   889 // Should this method be excluded from compilation?
   890 bool ciMethod::should_exclude() {
   891   check_is_loaded();
   892   VM_ENTRY_MARK;
   893   methodHandle mh(THREAD, get_methodOop());
   894   bool ignore;
   895   return CompilerOracle::should_exclude(mh, ignore);
   896 }
   898 // ------------------------------------------------------------------
   899 // ciMethod::should_inline
   900 //
   901 // Should this method be inlined during compilation?
   902 bool ciMethod::should_inline() {
   903   check_is_loaded();
   904   VM_ENTRY_MARK;
   905   methodHandle mh(THREAD, get_methodOop());
   906   return CompilerOracle::should_inline(mh);
   907 }
   909 // ------------------------------------------------------------------
   910 // ciMethod::should_not_inline
   911 //
   912 // Should this method be disallowed from inlining during compilation?
   913 bool ciMethod::should_not_inline() {
   914   check_is_loaded();
   915   VM_ENTRY_MARK;
   916   methodHandle mh(THREAD, get_methodOop());
   917   return CompilerOracle::should_not_inline(mh);
   918 }
   920 // ------------------------------------------------------------------
   921 // ciMethod::should_print_assembly
   922 //
   923 // Should the compiler print the generated code for this method?
   924 bool ciMethod::should_print_assembly() {
   925   check_is_loaded();
   926   VM_ENTRY_MARK;
   927   methodHandle mh(THREAD, get_methodOop());
   928   return CompilerOracle::should_print(mh);
   929 }
   931 // ------------------------------------------------------------------
   932 // ciMethod::break_at_execute
   933 //
   934 // Should the compiler insert a breakpoint into the generated code
   935 // method?
   936 bool ciMethod::break_at_execute() {
   937   check_is_loaded();
   938   VM_ENTRY_MARK;
   939   methodHandle mh(THREAD, get_methodOop());
   940   return CompilerOracle::should_break_at(mh);
   941 }
   943 // ------------------------------------------------------------------
   944 // ciMethod::has_option
   945 //
   946 bool ciMethod::has_option(const char* option) {
   947   check_is_loaded();
   948   VM_ENTRY_MARK;
   949   methodHandle mh(THREAD, get_methodOop());
   950   return CompilerOracle::has_option_string(mh, option);
   951 }
   953 // ------------------------------------------------------------------
   954 // ciMethod::can_be_compiled
   955 //
   956 // Have previous compilations of this method succeeded?
   957 bool ciMethod::can_be_compiled() {
   958   check_is_loaded();
   959   ciEnv* env = CURRENT_ENV;
   960   if (is_c1_compile(env->comp_level())) {
   961     return _is_c1_compilable;
   962   }
   963   return _is_c2_compilable;
   964 }
   966 // ------------------------------------------------------------------
   967 // ciMethod::set_not_compilable
   968 //
   969 // Tell the VM that this method cannot be compiled at all.
   970 void ciMethod::set_not_compilable() {
   971   check_is_loaded();
   972   VM_ENTRY_MARK;
   973   ciEnv* env = CURRENT_ENV;
   974   if (is_c1_compile(env->comp_level())) {
   975     _is_c1_compilable = false;
   976   } else {
   977     _is_c2_compilable = false;
   978   }
   979   get_methodOop()->set_not_compilable(env->comp_level());
   980 }
   982 // ------------------------------------------------------------------
   983 // ciMethod::can_be_osr_compiled
   984 //
   985 // Have previous compilations of this method succeeded?
   986 //
   987 // Implementation note: the VM does not currently keep track
   988 // of failed OSR compilations per bci.  The entry_bci parameter
   989 // is currently unused.
   990 bool ciMethod::can_be_osr_compiled(int entry_bci) {
   991   check_is_loaded();
   992   VM_ENTRY_MARK;
   993   ciEnv* env = CURRENT_ENV;
   994   return !get_methodOop()->is_not_osr_compilable(env->comp_level());
   995 }
   997 // ------------------------------------------------------------------
   998 // ciMethod::has_compiled_code
   999 bool ciMethod::has_compiled_code() {
  1000   VM_ENTRY_MARK;
  1001   return get_methodOop()->code() != NULL;
  1004 int ciMethod::comp_level() {
  1005   check_is_loaded();
  1006   VM_ENTRY_MARK;
  1007   nmethod* nm = get_methodOop()->code();
  1008   if (nm != NULL) return nm->comp_level();
  1009   return 0;
  1012 // ------------------------------------------------------------------
  1013 // ciMethod::instructions_size
  1014 //
  1015 // This is a rough metric for "fat" methods, compared before inlining
  1016 // with InlineSmallCode.  The CodeBlob::code_size accessor includes
  1017 // junk like exception handler, stubs, and constant table, which are
  1018 // not highly relevant to an inlined method.  So we use the more
  1019 // specific accessor nmethod::insts_size.
  1020 int ciMethod::instructions_size(int comp_level) {
  1021   GUARDED_VM_ENTRY(
  1022     nmethod* code = get_methodOop()->code();
  1023     if (code != NULL && (comp_level == CompLevel_any || comp_level == code->comp_level())) {
  1024       return code->insts_end() - code->verified_entry_point();
  1026     return 0;
  1030 // ------------------------------------------------------------------
  1031 // ciMethod::log_nmethod_identity
  1032 void ciMethod::log_nmethod_identity(xmlStream* log) {
  1033   GUARDED_VM_ENTRY(
  1034     nmethod* code = get_methodOop()->code();
  1035     if (code != NULL) {
  1036       code->log_identity(log);
  1041 // ------------------------------------------------------------------
  1042 // ciMethod::is_not_reached
  1043 bool ciMethod::is_not_reached(int bci) {
  1044   check_is_loaded();
  1045   VM_ENTRY_MARK;
  1046   return Interpreter::is_not_reached(
  1047                methodHandle(THREAD, get_methodOop()), bci);
  1050 // ------------------------------------------------------------------
  1051 // ciMethod::was_never_executed
  1052 bool ciMethod::was_executed_more_than(int times) {
  1053   VM_ENTRY_MARK;
  1054   return get_methodOop()->was_executed_more_than(times);
  1057 // ------------------------------------------------------------------
  1058 // ciMethod::has_unloaded_classes_in_signature
  1059 bool ciMethod::has_unloaded_classes_in_signature() {
  1060   VM_ENTRY_MARK;
  1062     EXCEPTION_MARK;
  1063     methodHandle m(THREAD, get_methodOop());
  1064     bool has_unloaded = methodOopDesc::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
  1065     if( HAS_PENDING_EXCEPTION ) {
  1066       CLEAR_PENDING_EXCEPTION;
  1067       return true;     // Declare that we may have unloaded classes
  1069     return has_unloaded;
  1073 // ------------------------------------------------------------------
  1074 // ciMethod::is_klass_loaded
  1075 bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
  1076   VM_ENTRY_MARK;
  1077   return get_methodOop()->is_klass_loaded(refinfo_index, must_be_resolved);
  1080 // ------------------------------------------------------------------
  1081 // ciMethod::check_call
  1082 bool ciMethod::check_call(int refinfo_index, bool is_static) const {
  1083   VM_ENTRY_MARK;
  1085     EXCEPTION_MARK;
  1086     HandleMark hm(THREAD);
  1087     constantPoolHandle pool (THREAD, get_methodOop()->constants());
  1088     methodHandle spec_method;
  1089     KlassHandle  spec_klass;
  1090     LinkResolver::resolve_method(spec_method, spec_klass, pool, refinfo_index, THREAD);
  1091     if (HAS_PENDING_EXCEPTION) {
  1092       CLEAR_PENDING_EXCEPTION;
  1093       return false;
  1094     } else {
  1095       return (spec_method->is_static() == is_static);
  1098   return false;
  1101 // ------------------------------------------------------------------
  1102 // ciMethod::print_codes
  1103 //
  1104 // Print the bytecodes for this method.
  1105 void ciMethod::print_codes_on(outputStream* st) {
  1106   check_is_loaded();
  1107   GUARDED_VM_ENTRY(get_methodOop()->print_codes_on(st);)
  1111 #define FETCH_FLAG_FROM_VM(flag_accessor) { \
  1112   check_is_loaded(); \
  1113   VM_ENTRY_MARK; \
  1114   return get_methodOop()->flag_accessor(); \
  1117 bool ciMethod::is_empty_method() const {         FETCH_FLAG_FROM_VM(is_empty_method); }
  1118 bool ciMethod::is_vanilla_constructor() const {  FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
  1119 bool ciMethod::has_loops      () const {         FETCH_FLAG_FROM_VM(has_loops); }
  1120 bool ciMethod::has_jsrs       () const {         FETCH_FLAG_FROM_VM(has_jsrs);  }
  1121 bool ciMethod::is_accessor    () const {         FETCH_FLAG_FROM_VM(is_accessor); }
  1122 bool ciMethod::is_initializer () const {         FETCH_FLAG_FROM_VM(is_initializer); }
  1124 BCEscapeAnalyzer  *ciMethod::get_bcea() {
  1125 #ifdef COMPILER2
  1126   if (_bcea == NULL) {
  1127     _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
  1129   return _bcea;
  1130 #else // COMPILER2
  1131   ShouldNotReachHere();
  1132   return NULL;
  1133 #endif // COMPILER2
  1136 ciMethodBlocks  *ciMethod::get_method_blocks() {
  1137   Arena *arena = CURRENT_ENV->arena();
  1138   if (_method_blocks == NULL) {
  1139     _method_blocks = new (arena) ciMethodBlocks(arena, this);
  1141   return _method_blocks;
  1144 #undef FETCH_FLAG_FROM_VM
  1147 // ------------------------------------------------------------------
  1148 // ciMethod::print_codes
  1149 //
  1150 // Print a range of the bytecodes for this method.
  1151 void ciMethod::print_codes_on(int from, int to, outputStream* st) {
  1152   check_is_loaded();
  1153   GUARDED_VM_ENTRY(get_methodOop()->print_codes_on(from, to, st);)
  1156 // ------------------------------------------------------------------
  1157 // ciMethod::print_name
  1158 //
  1159 // Print the name of this method, including signature and some flags.
  1160 void ciMethod::print_name(outputStream* st) {
  1161   check_is_loaded();
  1162   GUARDED_VM_ENTRY(get_methodOop()->print_name(st);)
  1165 // ------------------------------------------------------------------
  1166 // ciMethod::print_short_name
  1167 //
  1168 // Print the name of this method, without signature.
  1169 void ciMethod::print_short_name(outputStream* st) {
  1170   check_is_loaded();
  1171   GUARDED_VM_ENTRY(get_methodOop()->print_short_name(st);)
  1174 // ------------------------------------------------------------------
  1175 // ciMethod::print_impl
  1176 //
  1177 // Implementation of the print method.
  1178 void ciMethod::print_impl(outputStream* st) {
  1179   ciObject::print_impl(st);
  1180   st->print(" name=");
  1181   name()->print_symbol_on(st);
  1182   st->print(" holder=");
  1183   holder()->print_name_on(st);
  1184   st->print(" signature=");
  1185   signature()->as_symbol()->print_symbol_on(st);
  1186   if (is_loaded()) {
  1187     st->print(" loaded=true flags=");
  1188     flags().print_member_flags(st);
  1189   } else {
  1190     st->print(" loaded=false");

mercurial