Mercurial > hg > truffle
comparison src/cpu/x86/vm/assembler_x86.cpp @ 1583:02e771df338e
6958254: -XX:+VerifyOops is broken on x86
Summary: save and restore r10 in verify_oop().
Reviewed-by: never
author | kvn |
---|---|
date | Thu, 03 Jun 2010 14:20:27 -0700 |
parents | e9ff18c4ace7 |
children | 66c5dadb4d61 |
comparison
equal
deleted
inserted
replaced
1579:e9ff18c4ace7 | 1583:02e771df338e |
---|---|
7641 if (!VerifyOops) return; | 7641 if (!VerifyOops) return; |
7642 | 7642 |
7643 // Pass register number to verify_oop_subroutine | 7643 // Pass register number to verify_oop_subroutine |
7644 char* b = new char[strlen(s) + 50]; | 7644 char* b = new char[strlen(s) + 50]; |
7645 sprintf(b, "verify_oop: %s: %s", reg->name(), s); | 7645 sprintf(b, "verify_oop: %s: %s", reg->name(), s); |
7646 #ifdef _LP64 | |
7647 push(rscratch1); // save r10, trashed by movptr() | |
7648 #endif | |
7646 push(rax); // save rax, | 7649 push(rax); // save rax, |
7647 push(reg); // pass register argument | 7650 push(reg); // pass register argument |
7648 ExternalAddress buffer((address) b); | 7651 ExternalAddress buffer((address) b); |
7649 // avoid using pushptr, as it modifies scratch registers | 7652 // avoid using pushptr, as it modifies scratch registers |
7650 // and our contract is not to modify anything | 7653 // and our contract is not to modify anything |
7651 movptr(rax, buffer.addr()); | 7654 movptr(rax, buffer.addr()); |
7652 push(rax); | 7655 push(rax); |
7653 // call indirectly to solve generation ordering problem | 7656 // call indirectly to solve generation ordering problem |
7654 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); | 7657 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); |
7655 call(rax); | 7658 call(rax); |
7659 // Caller pops the arguments (oop, message) and restores rax, r10 | |
7656 } | 7660 } |
7657 | 7661 |
7658 | 7662 |
7659 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, | 7663 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, |
7660 Register tmp, | 7664 Register tmp, |
7765 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord); | 7769 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord); |
7766 // Pass register number to verify_oop_subroutine | 7770 // Pass register number to verify_oop_subroutine |
7767 char* b = new char[strlen(s) + 50]; | 7771 char* b = new char[strlen(s) + 50]; |
7768 sprintf(b, "verify_oop_addr: %s", s); | 7772 sprintf(b, "verify_oop_addr: %s", s); |
7769 | 7773 |
7774 #ifdef _LP64 | |
7775 push(rscratch1); // save r10, trashed by movptr() | |
7776 #endif | |
7770 push(rax); // save rax, | 7777 push(rax); // save rax, |
7771 // addr may contain rsp so we will have to adjust it based on the push | 7778 // addr may contain rsp so we will have to adjust it based on the push |
7772 // we just did | 7779 // we just did |
7773 // NOTE: 64bit seemed to have had a bug in that it did movq(addr, rax); which | 7780 // NOTE: 64bit seemed to have had a bug in that it did movq(addr, rax); which |
7774 // stores rax into addr which is backwards of what was intended. | 7781 // stores rax into addr which is backwards of what was intended. |
7787 push(rax); | 7794 push(rax); |
7788 | 7795 |
7789 // call indirectly to solve generation ordering problem | 7796 // call indirectly to solve generation ordering problem |
7790 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); | 7797 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address())); |
7791 call(rax); | 7798 call(rax); |
7792 // Caller pops the arguments and restores rax, from the stack | 7799 // Caller pops the arguments (addr, message) and restores rax, r10. |
7793 } | 7800 } |
7794 | 7801 |
7795 void MacroAssembler::verify_tlab() { | 7802 void MacroAssembler::verify_tlab() { |
7796 #ifdef ASSERT | 7803 #ifdef ASSERT |
7797 if (UseTLAB && VerifyOops) { | 7804 if (UseTLAB && VerifyOops) { |