hotspot/src/share/vm/c1/c1_Runtime1.cpp
changeset 7913 dd096a83bdbb
parent 7427 d7b79a367474
child 8067 f5f4eac4c48f
equal deleted inserted replaced
7901:ea3d83447861 7913:dd096a83bdbb
     1 /*
     1 /*
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   367   CompLevel level = (CompLevel)nm->comp_level();
   367   CompLevel level = (CompLevel)nm->comp_level();
   368   int bci = InvocationEntryBci;
   368   int bci = InvocationEntryBci;
   369   if (branch_bci != InvocationEntryBci) {
   369   if (branch_bci != InvocationEntryBci) {
   370     // Compute desination bci
   370     // Compute desination bci
   371     address pc = method()->code_base() + branch_bci;
   371     address pc = method()->code_base() + branch_bci;
   372     Bytecodes::Code branch = Bytecodes::code_at(pc, method());
   372     Bytecodes::Code branch = Bytecodes::code_at(method(), pc);
   373     int offset = 0;
   373     int offset = 0;
   374     switch (branch) {
   374     switch (branch) {
   375       case Bytecodes::_if_icmplt: case Bytecodes::_iflt:
   375       case Bytecodes::_if_icmplt: case Bytecodes::_iflt:
   376       case Bytecodes::_if_icmpgt: case Bytecodes::_ifgt:
   376       case Bytecodes::_if_icmpgt: case Bytecodes::_ifgt:
   377       case Bytecodes::_if_icmple: case Bytecodes::_ifle:
   377       case Bytecodes::_if_icmple: case Bytecodes::_ifle:
   657   }
   657   }
   658 JRT_END
   658 JRT_END
   659 
   659 
   660 
   660 
   661 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) {
   661 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) {
   662   Bytecode_field* field_access = Bytecode_field_at(caller, bci);
   662   Bytecode_field field_access(caller, bci);
   663   // This can be static or non-static field access
   663   // This can be static or non-static field access
   664   Bytecodes::Code code       = field_access->code();
   664   Bytecodes::Code code       = field_access.code();
   665 
   665 
   666   // We must load class, initialize class and resolvethe field
   666   // We must load class, initialize class and resolvethe field
   667   FieldAccessInfo result; // initialize class if needed
   667   FieldAccessInfo result; // initialize class if needed
   668   constantPoolHandle constants(THREAD, caller->constants());
   668   constantPoolHandle constants(THREAD, caller->constants());
   669   LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK_NULL);
   669   LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK_NULL);
   670   return result.klass()();
   670   return result.klass()();
   671 }
   671 }
   672 
   672 
   673 
   673 
   674 //
   674 //
   765 
   765 
   766   int bci = vfst.bci();
   766   int bci = vfst.bci();
   767 
   767 
   768   Events::log("patch_code @ " INTPTR_FORMAT , caller_frame.pc());
   768   Events::log("patch_code @ " INTPTR_FORMAT , caller_frame.pc());
   769 
   769 
   770   Bytecodes::Code code = Bytecode_at(caller_method->bcp_from(bci))->java_code();
   770   Bytecodes::Code code = caller_method()->java_code_at(bci);
   771 
   771 
   772 #ifndef PRODUCT
   772 #ifndef PRODUCT
   773   // this is used by assertions in the access_field_patching_id
   773   // this is used by assertions in the access_field_patching_id
   774   BasicType patch_field_type = T_ILLEGAL;
   774   BasicType patch_field_type = T_ILLEGAL;
   775 #endif // PRODUCT
   775 #endif // PRODUCT
   777   int patch_field_offset = -1;
   777   int patch_field_offset = -1;
   778   KlassHandle init_klass(THREAD, klassOop(NULL)); // klass needed by access_field_patching code
   778   KlassHandle init_klass(THREAD, klassOop(NULL)); // klass needed by access_field_patching code
   779   Handle load_klass(THREAD, NULL);                // oop needed by load_klass_patching code
   779   Handle load_klass(THREAD, NULL);                // oop needed by load_klass_patching code
   780   if (stub_id == Runtime1::access_field_patching_id) {
   780   if (stub_id == Runtime1::access_field_patching_id) {
   781 
   781 
   782     Bytecode_field* field_access = Bytecode_field_at(caller_method, bci);
   782     Bytecode_field field_access(caller_method, bci);
   783     FieldAccessInfo result; // initialize class if needed
   783     FieldAccessInfo result; // initialize class if needed
   784     Bytecodes::Code code = field_access->code();
   784     Bytecodes::Code code = field_access.code();
   785     constantPoolHandle constants(THREAD, caller_method->constants());
   785     constantPoolHandle constants(THREAD, caller_method->constants());
   786     LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK);
   786     LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK);
   787     patch_field_offset = result.field_offset();
   787     patch_field_offset = result.field_offset();
   788 
   788 
   789     // If we're patching a field which is volatile then at compile it
   789     // If we're patching a field which is volatile then at compile it
   790     // must not have been know to be volatile, so the generated code
   790     // must not have been know to be volatile, so the generated code
   791     // isn't correct for a volatile reference.  The nmethod has to be
   791     // isn't correct for a volatile reference.  The nmethod has to be
   809           init_klass = KlassHandle(THREAD, klass);
   809           init_klass = KlassHandle(THREAD, klass);
   810           k = klass;
   810           k = klass;
   811         }
   811         }
   812         break;
   812         break;
   813       case Bytecodes::_new:
   813       case Bytecodes::_new:
   814         { Bytecode_new* bnew = Bytecode_new_at(caller_method->bcp_from(bci));
   814         { Bytecode_new bnew(caller_method(), caller_method->bcp_from(bci));
   815           k = caller_method->constants()->klass_at(bnew->index(), CHECK);
   815           k = caller_method->constants()->klass_at(bnew.index(), CHECK);
   816         }
   816         }
   817         break;
   817         break;
   818       case Bytecodes::_multianewarray:
   818       case Bytecodes::_multianewarray:
   819         { Bytecode_multianewarray* mna = Bytecode_multianewarray_at(caller_method->bcp_from(bci));
   819         { Bytecode_multianewarray mna(caller_method(), caller_method->bcp_from(bci));
   820           k = caller_method->constants()->klass_at(mna->index(), CHECK);
   820           k = caller_method->constants()->klass_at(mna.index(), CHECK);
   821         }
   821         }
   822         break;
   822         break;
   823       case Bytecodes::_instanceof:
   823       case Bytecodes::_instanceof:
   824         { Bytecode_instanceof* io = Bytecode_instanceof_at(caller_method->bcp_from(bci));
   824         { Bytecode_instanceof io(caller_method(), caller_method->bcp_from(bci));
   825           k = caller_method->constants()->klass_at(io->index(), CHECK);
   825           k = caller_method->constants()->klass_at(io.index(), CHECK);
   826         }
   826         }
   827         break;
   827         break;
   828       case Bytecodes::_checkcast:
   828       case Bytecodes::_checkcast:
   829         { Bytecode_checkcast* cc = Bytecode_checkcast_at(caller_method->bcp_from(bci));
   829         { Bytecode_checkcast cc(caller_method(), caller_method->bcp_from(bci));
   830           k = caller_method->constants()->klass_at(cc->index(), CHECK);
   830           k = caller_method->constants()->klass_at(cc.index(), CHECK);
   831         }
   831         }
   832         break;
   832         break;
   833       case Bytecodes::_anewarray:
   833       case Bytecodes::_anewarray:
   834         { Bytecode_anewarray* anew = Bytecode_anewarray_at(caller_method->bcp_from(bci));
   834         { Bytecode_anewarray anew(caller_method(), caller_method->bcp_from(bci));
   835           klassOop ek = caller_method->constants()->klass_at(anew->index(), CHECK);
   835           klassOop ek = caller_method->constants()->klass_at(anew.index(), CHECK);
   836           k = Klass::cast(ek)->array_klass(CHECK);
   836           k = Klass::cast(ek)->array_klass(CHECK);
   837         }
   837         }
   838         break;
   838         break;
   839       case Bytecodes::_ldc:
   839       case Bytecodes::_ldc:
   840       case Bytecodes::_ldc_w:
   840       case Bytecodes::_ldc_w:
   841         {
   841         {
   842           Bytecode_loadconstant* cc = Bytecode_loadconstant_at(caller_method, bci);
   842           Bytecode_loadconstant cc(caller_method, bci);
   843           k = cc->resolve_constant(CHECK);
   843           k = cc.resolve_constant(CHECK);
   844           assert(k != NULL && !k->is_klass(), "must be class mirror or other Java constant");
   844           assert(k != NULL && !k->is_klass(), "must be class mirror or other Java constant");
   845         }
   845         }
   846         break;
   846         break;
   847       default: Unimplemented();
   847       default: Unimplemented();
   848     }
   848     }