Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 8976:4fc644c79b9f
Correctly restore registers after runtime calls that create exceptions.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Tue, 09 Apr 2013 21:55:58 +0200 |
parents | e41c32a4d573 |
children | bb2447c64055 |
comparison
equal
deleted
inserted
replaced
8975:ed49e2135abe | 8976:4fc644c79b9f |
---|---|
928 __ enter(); | 928 __ enter(); |
929 oop_maps = new OopMapSet(); | 929 oop_maps = new OopMapSet(); |
930 OopMap* oop_map = save_live_registers(sasm, 0); | 930 OopMap* oop_map = save_live_registers(sasm, 0); |
931 int call_offset = __ call_RT(rax, noreg, (address)create_null_exception, 0); | 931 int call_offset = __ call_RT(rax, noreg, (address)create_null_exception, 0); |
932 oop_maps->add_gc_map(call_offset, oop_map); | 932 oop_maps->add_gc_map(call_offset, oop_map); |
933 restore_live_registers_except_rax(sasm); | |
933 __ leave(); | 934 __ leave(); |
934 __ ret(0); | 935 __ ret(0); |
935 break; | 936 break; |
936 } | 937 } |
937 | 938 |
938 case create_out_of_bounds_exception_id: { | 939 case create_out_of_bounds_exception_id: { |
939 __ enter(); | 940 __ enter(); |
940 oop_maps = new OopMapSet(); | 941 oop_maps = new OopMapSet(); |
941 OopMap* oop_map = save_live_registers(sasm, 0); | 942 OopMap* oop_map = save_live_registers(sasm, 1); |
942 int call_offset = __ call_RT(rax, noreg, (address)create_out_of_bounds_exception, j_rarg0); | 943 int call_offset = __ call_RT(rax, noreg, (address)create_out_of_bounds_exception, j_rarg0); |
943 oop_maps->add_gc_map(call_offset, oop_map); | 944 oop_maps->add_gc_map(call_offset, oop_map); |
945 restore_live_registers_except_rax(sasm); | |
944 __ leave(); | 946 __ leave(); |
945 __ ret(0); | 947 __ ret(0); |
946 break; | 948 break; |
947 } | 949 } |
948 | 950 |
949 case vm_error_id: { | 951 case vm_error_id: { |
950 __ enter(); | 952 __ enter(); |
951 oop_maps = new OopMapSet(); | 953 oop_maps = new OopMapSet(); |
952 OopMap* oop_map = save_live_registers(sasm, 0); | 954 OopMap* oop_map = save_live_registers(sasm, 3); |
953 int call_offset = __ call_RT(noreg, noreg, (address)vm_error, j_rarg0, j_rarg1, j_rarg2); | 955 int call_offset = __ call_RT(noreg, noreg, (address)vm_error, j_rarg0, j_rarg1, j_rarg2); |
954 oop_maps->add_gc_map(call_offset, oop_map); | 956 oop_maps->add_gc_map(call_offset, oop_map); |
955 restore_live_registers(sasm); | 957 restore_live_registers(sasm); |
956 __ leave(); | 958 __ leave(); |
957 __ ret(0); | 959 __ ret(0); |
959 } | 961 } |
960 | 962 |
961 case log_printf_id: { | 963 case log_printf_id: { |
962 __ enter(); | 964 __ enter(); |
963 oop_maps = new OopMapSet(); | 965 oop_maps = new OopMapSet(); |
964 OopMap* oop_map = save_live_registers(sasm, 0); | 966 OopMap* oop_map = save_live_registers(sasm, 4); |
965 int call_offset = __ call_RT(noreg, noreg, (address)log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3); | 967 int call_offset = __ call_RT(noreg, noreg, (address)log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3); |
966 oop_maps->add_gc_map(call_offset, oop_map); | 968 oop_maps->add_gc_map(call_offset, oop_map); |
967 restore_live_registers(sasm); | 969 restore_live_registers(sasm); |
968 __ leave(); | 970 __ leave(); |
969 __ ret(0); | 971 __ ret(0); |
971 } | 973 } |
972 | 974 |
973 case log_primitive_id: { | 975 case log_primitive_id: { |
974 __ enter(); | 976 __ enter(); |
975 oop_maps = new OopMapSet(); | 977 oop_maps = new OopMapSet(); |
976 OopMap* oop_map = save_live_registers(sasm, 0); | 978 OopMap* oop_map = save_live_registers(sasm, 3); |
977 int call_offset = __ call_RT(noreg, noreg, (address)log_primitive, j_rarg0, j_rarg1, j_rarg2); | 979 int call_offset = __ call_RT(noreg, noreg, (address)log_primitive, j_rarg0, j_rarg1, j_rarg2); |
978 oop_maps->add_gc_map(call_offset, oop_map); | 980 oop_maps->add_gc_map(call_offset, oop_map); |
979 restore_live_registers(sasm); | 981 restore_live_registers(sasm); |
980 __ leave(); | 982 __ leave(); |
981 __ ret(0); | 983 __ ret(0); |
983 } | 985 } |
984 | 986 |
985 case log_object_id: { | 987 case log_object_id: { |
986 __ enter(); | 988 __ enter(); |
987 oop_maps = new OopMapSet(); | 989 oop_maps = new OopMapSet(); |
988 OopMap* oop_map = save_live_registers(sasm, 0); | 990 OopMap* oop_map = save_live_registers(sasm, 2); |
989 int call_offset = __ call_RT(noreg, noreg, (address)log_object, j_rarg0, j_rarg1); | 991 int call_offset = __ call_RT(noreg, noreg, (address)log_object, j_rarg0, j_rarg1); |
990 oop_maps->add_gc_map(call_offset, oop_map); | 992 oop_maps->add_gc_map(call_offset, oop_map); |
991 restore_live_registers(sasm); | 993 restore_live_registers(sasm); |
992 __ leave(); | 994 __ leave(); |
993 __ ret(0); | 995 __ ret(0); |