comparison src/share/vm/oops/instanceKlass.cpp @ 7459:cc6a617fffd2

8005494: SIGSEGV in Rewriter::relocate_and_link() when testing Weblogic with CompressedOops and KlassPtrs Summary: Relocate functions with jsr's when rewriting so not repeated after reading shared archive Reviewed-by: twisti, jrose
author coleenp
date Wed, 02 Jan 2013 20:28:09 -0500
parents 35431a769282
children 37a3e8b7a1e9
comparison
equal deleted inserted replaced
7458:4daebd4cc1dd 7459:cc6a617fffd2
45 #include "oops/method.hpp" 45 #include "oops/method.hpp"
46 #include "oops/oop.inline.hpp" 46 #include "oops/oop.inline.hpp"
47 #include "oops/symbol.hpp" 47 #include "oops/symbol.hpp"
48 #include "prims/jvmtiExport.hpp" 48 #include "prims/jvmtiExport.hpp"
49 #include "prims/jvmtiRedefineClassesTrace.hpp" 49 #include "prims/jvmtiRedefineClassesTrace.hpp"
50 #include "prims/methodComparator.hpp"
50 #include "runtime/fieldDescriptor.hpp" 51 #include "runtime/fieldDescriptor.hpp"
51 #include "runtime/handles.inline.hpp" 52 #include "runtime/handles.inline.hpp"
52 #include "runtime/javaCalls.hpp" 53 #include "runtime/javaCalls.hpp"
53 #include "runtime/mutexLocker.hpp" 54 #include "runtime/mutexLocker.hpp"
54 #include "runtime/thread.inline.hpp" 55 #include "runtime/thread.inline.hpp"
600 // also sets rewritten 601 // also sets rewritten
601 this_oop->rewrite_class(CHECK_false); 602 this_oop->rewrite_class(CHECK_false);
602 } 603 }
603 604
604 // relocate jsrs and link methods after they are all rewritten 605 // relocate jsrs and link methods after they are all rewritten
605 this_oop->relocate_and_link_methods(CHECK_false); 606 this_oop->link_methods(CHECK_false);
606 607
607 // Initialize the vtable and interface table after 608 // Initialize the vtable and interface table after
608 // methods have been rewritten since rewrite may 609 // methods have been rewritten since rewrite may
609 // fabricate new Method*s. 610 // fabricate new Method*s.
610 // also does loader constraint checking 611 // also does loader constraint checking
648 } 649 }
649 650
650 // Now relocate and link method entry points after class is rewritten. 651 // Now relocate and link method entry points after class is rewritten.
651 // This is outside is_rewritten flag. In case of an exception, it can be 652 // This is outside is_rewritten flag. In case of an exception, it can be
652 // executed more than once. 653 // executed more than once.
653 void InstanceKlass::relocate_and_link_methods(TRAPS) { 654 void InstanceKlass::link_methods(TRAPS) {
654 assert(is_loaded(), "must be loaded"); 655 int len = methods()->length();
655 instanceKlassHandle this_oop(THREAD, this); 656 for (int i = len-1; i >= 0; i--) {
656 Rewriter::relocate_and_link(this_oop, CHECK); 657 methodHandle m(THREAD, methods()->at(i));
658
659 // Set up method entry points for compiler and interpreter .
660 m->link_method(m, CHECK);
661
662 // This is for JVMTI and unrelated to relocator but the last thing we do
663 #ifdef ASSERT
664 if (StressMethodComparator) {
665 ResourceMark rm(THREAD);
666 static int nmc = 0;
667 for (int j = i; j >= 0 && j >= i-4; j--) {
668 if ((++nmc % 1000) == 0) tty->print_cr("Have run MethodComparator %d times...", nmc);
669 bool z = MethodComparator::methods_EMCP(m(),
670 methods()->at(j));
671 if (j == i && !z) {
672 tty->print("MethodComparator FAIL: "); m->print(); m->print_codes();
673 assert(z, "method must compare equal to itself");
674 }
675 }
676 }
677 #endif //ASSERT
678 }
657 } 679 }
658 680
659 681
660 void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { 682 void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) {
661 // Make sure klass is linked (verified) before initialization 683 // Make sure klass is linked (verified) before initialization