Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/stubGenerator_x86_64.cpp @ 124:b130b98db9cf
6689060: Escape Analysis does not work with Compressed Oops
Summary: 64-bits VM crashes with -XX:+AggresiveOpts (Escape Analysis + Compressed Oops)
Reviewed-by: never, sgoldman
author | kvn |
---|---|
date | Wed, 23 Apr 2008 11:20:36 -0700 |
parents | ba764ed4b6f2 |
children | d1605aabd0a1 37f87013dfd8 |
comparison
equal
deleted
inserted
replaced
123:9e5a7340635e | 124:b130b98db9cf |
---|---|
911 // all args on stack! | 911 // all args on stack! |
912 // | 912 // |
913 // Stack after saving c_rarg3: | 913 // Stack after saving c_rarg3: |
914 // [tos + 0]: saved c_rarg3 | 914 // [tos + 0]: saved c_rarg3 |
915 // [tos + 1]: saved c_rarg2 | 915 // [tos + 1]: saved c_rarg2 |
916 // [tos + 2]: saved flags | 916 // [tos + 2]: saved r12 (several TemplateTable methods use it) |
917 // [tos + 3]: return address | 917 // [tos + 3]: saved flags |
918 // * [tos + 4]: error message (char*) | 918 // [tos + 4]: return address |
919 // * [tos + 5]: object to verify (oop) | 919 // * [tos + 5]: error message (char*) |
920 // * [tos + 6]: saved rax - saved by caller and bashed | 920 // * [tos + 6]: object to verify (oop) |
921 // * [tos + 7]: saved rax - saved by caller and bashed | |
921 // * = popped on exit | 922 // * = popped on exit |
922 address generate_verify_oop() { | 923 address generate_verify_oop() { |
923 StubCodeMark mark(this, "StubRoutines", "verify_oop"); | 924 StubCodeMark mark(this, "StubRoutines", "verify_oop"); |
924 address start = __ pc(); | 925 address start = __ pc(); |
925 | 926 |
926 Label exit, error; | 927 Label exit, error; |
927 | 928 |
928 __ pushfq(); | 929 __ pushfq(); |
929 __ incrementl(ExternalAddress((address) StubRoutines::verify_oop_count_addr())); | 930 __ incrementl(ExternalAddress((address) StubRoutines::verify_oop_count_addr())); |
930 | 931 |
932 __ pushq(r12); | |
933 | |
931 // save c_rarg2 and c_rarg3 | 934 // save c_rarg2 and c_rarg3 |
932 __ pushq(c_rarg2); | 935 __ pushq(c_rarg2); |
933 __ pushq(c_rarg3); | 936 __ pushq(c_rarg3); |
934 | 937 |
938 enum { | |
939 // After previous pushes. | |
940 oop_to_verify = 6 * wordSize, | |
941 saved_rax = 7 * wordSize, | |
942 | |
943 // Before the call to MacroAssembler::debug(), see below. | |
944 return_addr = 16 * wordSize, | |
945 error_msg = 17 * wordSize | |
946 }; | |
947 | |
935 // get object | 948 // get object |
936 __ movq(rax, Address(rsp, 5 * wordSize)); | 949 __ movq(rax, Address(rsp, oop_to_verify)); |
937 | 950 |
938 // make sure object is 'reasonable' | 951 // make sure object is 'reasonable' |
939 __ testq(rax, rax); | 952 __ testq(rax, rax); |
940 __ jcc(Assembler::zero, exit); // if obj is NULL it is OK | 953 __ jcc(Assembler::zero, exit); // if obj is NULL it is OK |
941 // Check if the oop is in the right area of memory | 954 // Check if the oop is in the right area of memory |
943 __ movptr(c_rarg3, (int64_t) Universe::verify_oop_mask()); | 956 __ movptr(c_rarg3, (int64_t) Universe::verify_oop_mask()); |
944 __ andq(c_rarg2, c_rarg3); | 957 __ andq(c_rarg2, c_rarg3); |
945 __ movptr(c_rarg3, (int64_t) Universe::verify_oop_bits()); | 958 __ movptr(c_rarg3, (int64_t) Universe::verify_oop_bits()); |
946 __ cmpq(c_rarg2, c_rarg3); | 959 __ cmpq(c_rarg2, c_rarg3); |
947 __ jcc(Assembler::notZero, error); | 960 __ jcc(Assembler::notZero, error); |
961 | |
962 // set r12 to heapbase for load_klass() | |
963 __ reinit_heapbase(); | |
948 | 964 |
949 // make sure klass is 'reasonable' | 965 // make sure klass is 'reasonable' |
950 __ load_klass(rax, rax); // get klass | 966 __ load_klass(rax, rax); // get klass |
951 __ testq(rax, rax); | 967 __ testq(rax, rax); |
952 __ jcc(Assembler::zero, error); // if klass is NULL it is broken | 968 __ jcc(Assembler::zero, error); // if klass is NULL it is broken |
969 __ cmpq(rax, c_rarg3); | 985 __ cmpq(rax, c_rarg3); |
970 __ jcc(Assembler::notZero, error); | 986 __ jcc(Assembler::notZero, error); |
971 | 987 |
972 // return if everything seems ok | 988 // return if everything seems ok |
973 __ bind(exit); | 989 __ bind(exit); |
974 __ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back | 990 __ movq(rax, Address(rsp, saved_rax)); // get saved rax back |
975 __ popq(c_rarg3); // restore c_rarg3 | 991 __ popq(c_rarg3); // restore c_rarg3 |
976 __ popq(c_rarg2); // restore c_rarg2 | 992 __ popq(c_rarg2); // restore c_rarg2 |
993 __ popq(r12); // restore r12 | |
977 __ popfq(); // restore flags | 994 __ popfq(); // restore flags |
978 __ ret(3 * wordSize); // pop caller saved stuff | 995 __ ret(3 * wordSize); // pop caller saved stuff |
979 | 996 |
980 // handle errors | 997 // handle errors |
981 __ bind(error); | 998 __ bind(error); |
982 __ movq(rax, Address(rsp, 6 * wordSize)); // get saved rax back | 999 __ movq(rax, Address(rsp, saved_rax)); // get saved rax back |
983 __ popq(c_rarg3); // get saved c_rarg3 back | 1000 __ popq(c_rarg3); // get saved c_rarg3 back |
984 __ popq(c_rarg2); // get saved c_rarg2 back | 1001 __ popq(c_rarg2); // get saved c_rarg2 back |
1002 __ popq(r12); // get saved r12 back | |
985 __ popfq(); // get saved flags off stack -- | 1003 __ popfq(); // get saved flags off stack -- |
986 // will be ignored | 1004 // will be ignored |
987 | 1005 |
988 __ pushaq(); // push registers | 1006 __ pushaq(); // push registers |
989 // (rip is already | 1007 // (rip is already |
990 // already pushed) | 1008 // already pushed) |
991 // debug(char* msg, int64_t regs[]) | 1009 // debug(char* msg, int64_t pc, int64_t regs[]) |
992 // We've popped the registers we'd saved (c_rarg3, c_rarg2 and flags), and | 1010 // We've popped the registers we'd saved (c_rarg3, c_rarg2 and flags), and |
993 // pushed all the registers, so now the stack looks like: | 1011 // pushed all the registers, so now the stack looks like: |
994 // [tos + 0] 16 saved registers | 1012 // [tos + 0] 16 saved registers |
995 // [tos + 16] return address | 1013 // [tos + 16] return address |
996 // [tos + 17] error message (char*) | 1014 // * [tos + 17] error message (char*) |
997 | 1015 // * [tos + 18] object to verify (oop) |
998 __ movq(c_rarg0, Address(rsp, 17 * wordSize)); // pass address of error message | 1016 // * [tos + 19] saved rax - saved by caller and bashed |
999 __ movq(c_rarg1, rsp); // pass address of regs on stack | 1017 // * = popped on exit |
1018 | |
1019 __ movq(c_rarg0, Address(rsp, error_msg)); // pass address of error message | |
1020 __ movq(c_rarg1, Address(rsp, return_addr)); // pass return address | |
1021 __ movq(c_rarg2, rsp); // pass address of regs on stack | |
1000 __ movq(r12, rsp); // remember rsp | 1022 __ movq(r12, rsp); // remember rsp |
1001 __ subq(rsp, frame::arg_reg_save_area_bytes);// windows | 1023 __ subq(rsp, frame::arg_reg_save_area_bytes);// windows |
1002 __ andq(rsp, -16); // align stack as required by ABI | 1024 __ andq(rsp, -16); // align stack as required by ABI |
1003 BLOCK_COMMENT("call MacroAssembler::debug"); | 1025 BLOCK_COMMENT("call MacroAssembler::debug"); |
1004 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug))); | 1026 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug))); |
1005 __ movq(rsp, r12); // restore rsp | 1027 __ movq(rsp, r12); // restore rsp |
1006 __ reinit_heapbase(); // r12 is heapbase | 1028 __ popaq(); // pop registers (includes r12) |
1007 __ popaq(); // pop registers | |
1008 __ ret(3 * wordSize); // pop caller saved stuff | 1029 __ ret(3 * wordSize); // pop caller saved stuff |
1009 | 1030 |
1010 return start; | 1031 return start; |
1011 } | 1032 } |
1012 | 1033 |
1036 #ifdef ASSERT | 1057 #ifdef ASSERT |
1037 Label L; | 1058 Label L; |
1038 assert_different_registers(Rtmp, Rint); | 1059 assert_different_registers(Rtmp, Rint); |
1039 __ movslq(Rtmp, Rint); | 1060 __ movslq(Rtmp, Rint); |
1040 __ cmpq(Rtmp, Rint); | 1061 __ cmpq(Rtmp, Rint); |
1041 __ jccb(Assembler::equal, L); | 1062 __ jcc(Assembler::equal, L); |
1042 __ stop("high 32-bits of int value are not 0"); | 1063 __ stop("high 32-bits of int value are not 0"); |
1043 __ bind(L); | 1064 __ bind(L); |
1044 #endif | 1065 #endif |
1045 } | 1066 } |
1046 | 1067 |