comparison src/share/vm/runtime/frame.cpp @ 1506:2338d41fbd81

6943304: remove tagged stack interpreter Reviewed-by: coleenp, never, gbenson
author twisti
date Fri, 30 Apr 2010 08:37:24 -0700
parents e3a4305c6bc3
children df736661d0c8
comparison
equal deleted inserted replaced
1505:0c5b3cf3c1f5 1506:2338d41fbd81
466 intptr_t* frame::interpreter_frame_local_at(int index) const { 466 intptr_t* frame::interpreter_frame_local_at(int index) const {
467 const int n = Interpreter::local_offset_in_bytes(index)/wordSize; 467 const int n = Interpreter::local_offset_in_bytes(index)/wordSize;
468 return &((*interpreter_frame_locals_addr())[n]); 468 return &((*interpreter_frame_locals_addr())[n]);
469 } 469 }
470 470
471 frame::Tag frame::interpreter_frame_local_tag(int index) const {
472 const int n = Interpreter::local_tag_offset_in_bytes(index)/wordSize;
473 return (Tag)(*interpreter_frame_locals_addr()) [n];
474 }
475
476 void frame::interpreter_frame_set_local_tag(int index, Tag tag) const {
477 const int n = Interpreter::local_tag_offset_in_bytes(index)/wordSize;
478 (*interpreter_frame_locals_addr())[n] = (intptr_t)tag;
479 }
480
481 intptr_t* frame::interpreter_frame_expression_stack_at(jint offset) const { 471 intptr_t* frame::interpreter_frame_expression_stack_at(jint offset) const {
482 const int i = offset * interpreter_frame_expression_stack_direction(); 472 const int i = offset * interpreter_frame_expression_stack_direction();
483 const int n = ((i * Interpreter::stackElementSize()) + 473 const int n = i * Interpreter::stackElementWords;
484 Interpreter::value_offset_in_bytes())/wordSize;
485 return &(interpreter_frame_expression_stack()[n]); 474 return &(interpreter_frame_expression_stack()[n]);
486 }
487
488 frame::Tag frame::interpreter_frame_expression_stack_tag(jint offset) const {
489 const int i = offset * interpreter_frame_expression_stack_direction();
490 const int n = ((i * Interpreter::stackElementSize()) +
491 Interpreter::tag_offset_in_bytes())/wordSize;
492 return (Tag)(interpreter_frame_expression_stack()[n]);
493 }
494
495 void frame::interpreter_frame_set_expression_stack_tag(jint offset,
496 Tag tag) const {
497 const int i = offset * interpreter_frame_expression_stack_direction();
498 const int n = ((i * Interpreter::stackElementSize()) +
499 Interpreter::tag_offset_in_bytes())/wordSize;
500 interpreter_frame_expression_stack()[n] = (intptr_t)tag;
501 } 475 }
502 476
503 jint frame::interpreter_frame_expression_stack_size() const { 477 jint frame::interpreter_frame_expression_stack_size() const {
504 // Number of elements on the interpreter expression stack 478 // Number of elements on the interpreter expression stack
505 // Callers should span by stackElementWords 479 // Callers should span by stackElementWords
506 int element_size = Interpreter::stackElementWords(); 480 int element_size = Interpreter::stackElementWords;
507 if (frame::interpreter_frame_expression_stack_direction() < 0) { 481 if (frame::interpreter_frame_expression_stack_direction() < 0) {
508 return (interpreter_frame_expression_stack() - 482 return (interpreter_frame_expression_stack() -
509 interpreter_frame_tos_address() + 1)/element_size; 483 interpreter_frame_tos_address() + 1)/element_size;
510 } else { 484 } else {
511 return (interpreter_frame_tos_address() - 485 return (interpreter_frame_tos_address() -
583 assert(is_interpreted_frame(), "Not an interpreted frame"); 557 assert(is_interpreted_frame(), "Not an interpreted frame");
584 jint i; 558 jint i;
585 for (i = 0; i < interpreter_frame_method()->max_locals(); i++ ) { 559 for (i = 0; i < interpreter_frame_method()->max_locals(); i++ ) {
586 intptr_t x = *interpreter_frame_local_at(i); 560 intptr_t x = *interpreter_frame_local_at(i);
587 st->print(" - local [" INTPTR_FORMAT "]", x); 561 st->print(" - local [" INTPTR_FORMAT "]", x);
588 if (TaggedStackInterpreter) {
589 Tag x = interpreter_frame_local_tag(i);
590 st->print(" - local tag [" INTPTR_FORMAT "]", x);
591 }
592 st->fill_to(23); 562 st->fill_to(23);
593 st->print_cr("; #%d", i); 563 st->print_cr("; #%d", i);
594 } 564 }
595 for (i = interpreter_frame_expression_stack_size() - 1; i >= 0; --i ) { 565 for (i = interpreter_frame_expression_stack_size() - 1; i >= 0; --i ) {
596 intptr_t x = *interpreter_frame_expression_stack_at(i); 566 intptr_t x = *interpreter_frame_expression_stack_at(i);
597 st->print(" - stack [" INTPTR_FORMAT "]", x); 567 st->print(" - stack [" INTPTR_FORMAT "]", x);
598 if (TaggedStackInterpreter) {
599 Tag x = interpreter_frame_expression_stack_tag(i);
600 st->print(" - stack tag [" INTPTR_FORMAT "]", x);
601 }
602 st->fill_to(23); 568 st->fill_to(23);
603 st->print_cr("; #%d", i); 569 st->print_cr("; #%d", i);
604 } 570 }
605 // locks for synchronization 571 // locks for synchronization
606 for (BasicObjectLock* current = interpreter_frame_monitor_end(); 572 for (BasicObjectLock* current = interpreter_frame_monitor_end();
948 oops_interpreted_arguments_do(signature, has_receiver, f); 914 oops_interpreted_arguments_do(signature, has_receiver, f);
949 } 915 }
950 } 916 }
951 } 917 }
952 918
953 if (TaggedStackInterpreter) { 919 InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f);
954 // process locals & expression stack 920
955 InterpreterOopMap *mask = NULL; 921 // process locals & expression stack
956 #ifdef ASSERT 922 InterpreterOopMap mask;
957 InterpreterOopMap oopmap_mask; 923 if (query_oop_map_cache) {
958 OopMapCache::compute_one_oop_map(m, bci, &oopmap_mask); 924 m->mask_for(bci, &mask);
959 mask = &oopmap_mask;
960 #endif // ASSERT
961 oops_interpreted_locals_do(f, max_locals, mask);
962 oops_interpreted_expressions_do(f, signature, has_receiver,
963 m->max_stack(),
964 max_locals, mask);
965 } else { 925 } else {
966 InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f); 926 OopMapCache::compute_one_oop_map(m, bci, &mask);
967 927 }
968 // process locals & expression stack 928 mask.iterate_oop(&blk);
969 InterpreterOopMap mask; 929 }
970 if (query_oop_map_cache) { 930
971 m->mask_for(bci, &mask);
972 } else {
973 OopMapCache::compute_one_oop_map(m, bci, &mask);
974 }
975 mask.iterate_oop(&blk);
976 }
977 }
978
979
980 void frame::oops_interpreted_locals_do(OopClosure *f,
981 int max_locals,
982 InterpreterOopMap *mask) {
983 // Process locals then interpreter expression stack
984 for (int i = 0; i < max_locals; i++ ) {
985 Tag tag = interpreter_frame_local_tag(i);
986 if (tag == TagReference) {
987 oop* addr = (oop*) interpreter_frame_local_at(i);
988 assert((intptr_t*)addr >= sp(), "must be inside the frame");
989 f->do_oop(addr);
990 #ifdef ASSERT
991 } else {
992 assert(tag == TagValue, "bad tag value for locals");
993 oop* p = (oop*) interpreter_frame_local_at(i);
994 // Not always true - too bad. May have dead oops without tags in locals.
995 // assert(*p == NULL || !(*p)->is_oop(), "oop not tagged on interpreter locals");
996 assert(*p == NULL || !mask->is_oop(i), "local oop map mismatch");
997 #endif // ASSERT
998 }
999 }
1000 }
1001
1002 void frame::oops_interpreted_expressions_do(OopClosure *f,
1003 symbolHandle signature,
1004 bool has_receiver,
1005 int max_stack,
1006 int max_locals,
1007 InterpreterOopMap *mask) {
1008 // There is no stack no matter what the esp is pointing to (native methods
1009 // might look like expression stack is nonempty).
1010 if (max_stack == 0) return;
1011
1012 // Point the top of the expression stack above arguments to a call so
1013 // arguments aren't gc'ed as both stack values for callee and callee
1014 // arguments in callee's locals.
1015 int args_size = 0;
1016 if (!signature.is_null()) {
1017 args_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0);
1018 }
1019
1020 intptr_t *tos_addr = interpreter_frame_tos_at(args_size);
1021 assert(args_size != 0 || tos_addr == interpreter_frame_tos_address(), "these are same");
1022 intptr_t *frst_expr = interpreter_frame_expression_stack_at(0);
1023 // In case of exceptions, the expression stack is invalid and the esp
1024 // will be reset to express this condition. Therefore, we call f only
1025 // if addr is 'inside' the stack (i.e., addr >= esp for Intel).
1026 bool in_stack;
1027 if (interpreter_frame_expression_stack_direction() > 0) {
1028 in_stack = (intptr_t*)frst_expr <= tos_addr;
1029 } else {
1030 in_stack = (intptr_t*)frst_expr >= tos_addr;
1031 }
1032 if (!in_stack) return;
1033
1034 jint stack_size = interpreter_frame_expression_stack_size() - args_size;
1035 for (int j = 0; j < stack_size; j++) {
1036 Tag tag = interpreter_frame_expression_stack_tag(j);
1037 if (tag == TagReference) {
1038 oop *addr = (oop*) interpreter_frame_expression_stack_at(j);
1039 f->do_oop(addr);
1040 #ifdef ASSERT
1041 } else {
1042 assert(tag == TagValue, "bad tag value for stack element");
1043 oop *p = (oop*) interpreter_frame_expression_stack_at((j));
1044 assert(*p == NULL || !mask->is_oop(j+max_locals), "stack oop map mismatch");
1045 #endif // ASSERT
1046 }
1047 }
1048 }
1049 931
1050 void frame::oops_interpreted_arguments_do(symbolHandle signature, bool has_receiver, OopClosure* f) { 932 void frame::oops_interpreted_arguments_do(symbolHandle signature, bool has_receiver, OopClosure* f) {
1051 InterpretedArgumentOopFinder finder(signature, has_receiver, this, f); 933 InterpretedArgumentOopFinder finder(signature, has_receiver, this, f);
1052 finder.oops_do(); 934 finder.oops_do();
1053 } 935 }
1304 methodOop m = interpreter_frame_method(); 1186 methodOop m = interpreter_frame_method();
1305 int bci = interpreter_frame_bci(); 1187 int bci = interpreter_frame_bci();
1306 1188
1307 int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals(); 1189 int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals();
1308 1190
1309 if (TaggedStackInterpreter) { 1191 // process dynamic part
1310 InterpreterOopMap *mask = NULL; 1192 InterpreterFrameClosure value_blk(this, max_locals, m->max_stack(),
1311 #ifdef ASSERT 1193 &_check_value);
1312 InterpreterOopMap oopmap_mask; 1194 InterpreterFrameClosure oop_blk(this, max_locals, m->max_stack(),
1313 methodHandle method(thread, m); 1195 &_check_oop );
1314 OopMapCache::compute_one_oop_map(method, bci, &oopmap_mask); 1196 InterpreterFrameClosure dead_blk(this, max_locals, m->max_stack(),
1315 mask = &oopmap_mask; 1197 &_zap_dead );
1316 #endif // ASSERT 1198
1317 oops_interpreted_locals_do(&_check_oop, max_locals, mask); 1199 // get frame map
1318 } else { 1200 InterpreterOopMap mask;
1319 // process dynamic part 1201 m->mask_for(bci, &mask);
1320 InterpreterFrameClosure value_blk(this, max_locals, m->max_stack(), 1202 mask.iterate_all( &oop_blk, &value_blk, &dead_blk);
1321 &_check_value);
1322 InterpreterFrameClosure oop_blk(this, max_locals, m->max_stack(),
1323 &_check_oop );
1324 InterpreterFrameClosure dead_blk(this, max_locals, m->max_stack(),
1325 &_zap_dead );
1326
1327 // get frame map
1328 InterpreterOopMap mask;
1329 m->mask_for(bci, &mask);
1330 mask.iterate_all( &oop_blk, &value_blk, &dead_blk);
1331 }
1332 } 1203 }
1333 1204
1334 1205
1335 void frame::zap_dead_compiled_locals(JavaThread* thread, const RegisterMap* reg_map) { 1206 void frame::zap_dead_compiled_locals(JavaThread* thread, const RegisterMap* reg_map) {
1336 1207