comparison src/share/vm/code/nmethod.cpp @ 7660:0b646334c5f7

keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 01 Feb 2013 17:32:59 +0100
parents 5d0bb7d52783
children 826632227602
comparison
equal deleted inserted replaced
7656:01aeaf194641 7660:0b646334c5f7
584 CodeBuffer* code_buffer, int frame_size, 584 CodeBuffer* code_buffer, int frame_size,
585 OopMapSet* oop_maps, 585 OopMapSet* oop_maps,
586 ExceptionHandlerTable* handler_table, 586 ExceptionHandlerTable* handler_table,
587 ImplicitExceptionTable* nul_chk_table, 587 ImplicitExceptionTable* nul_chk_table,
588 AbstractCompiler* compiler, 588 AbstractCompiler* compiler,
589 int comp_level 589 int comp_level,
590 GrowableArray<jlong>* leaf_graph_ids
590 #ifdef GRAAL 591 #ifdef GRAAL
591 , Handle installed_code 592 , Handle installed_code
592 #endif 593 #endif
593 ) 594 )
594 { 595 {
595 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR"); 596 assert(debug_info->oop_recorder() == code_buffer->oop_recorder(), "shared OR");
596 code_buffer->finalize_oop_references(method); 597 code_buffer->finalize_oop_references(method);
598 size_t leaf_graph_ids_size = leaf_graph_ids == NULL ? 0 : round_to(sizeof(jlong) * leaf_graph_ids->length(), oopSize);
597 // create nmethod 599 // create nmethod
598 nmethod* nm = NULL; 600 nmethod* nm = NULL;
599 { MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); 601 { MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
600 int nmethod_size = 602 int nmethod_size =
601 allocation_size(code_buffer, sizeof(nmethod)) 603 allocation_size(code_buffer, sizeof(nmethod))
602 + adjust_pcs_size(debug_info->pcs_size()) 604 + adjust_pcs_size(debug_info->pcs_size())
603 + round_to(dependencies->size_in_bytes() , oopSize) 605 + round_to(dependencies->size_in_bytes() , oopSize)
604 + round_to(handler_table->size_in_bytes(), oopSize) 606 + round_to(handler_table->size_in_bytes(), oopSize)
605 + round_to(nul_chk_table->size_in_bytes(), oopSize) 607 + round_to(nul_chk_table->size_in_bytes(), oopSize)
606 + round_to(debug_info->data_size() , oopSize); 608 + round_to(debug_info->data_size() , oopSize)
609 + leaf_graph_ids_size;
607 nm = new (nmethod_size) 610 nm = new (nmethod_size)
608 nmethod(method(), nmethod_size, compile_id, entry_bci, offsets, 611 nmethod(method(), nmethod_size, compile_id, entry_bci, offsets,
609 orig_pc_offset, debug_info, dependencies, code_buffer, frame_size, 612 orig_pc_offset, debug_info, dependencies, code_buffer, frame_size,
610 oop_maps, 613 oop_maps,
611 handler_table, 614 handler_table,
612 nul_chk_table, 615 nul_chk_table,
613 compiler, 616 compiler,
614 comp_level 617 comp_level,
618 leaf_graph_ids
615 #ifdef GRAAL 619 #ifdef GRAAL
616 , installed_code 620 , installed_code
617 #endif 621 #endif
618 ); 622 );
619 if (nm != NULL) { 623 if (nm != NULL) {
691 _scopes_data_offset = _metadata_offset + round_to(code_buffer->total_metadata_size(), wordSize); 695 _scopes_data_offset = _metadata_offset + round_to(code_buffer->total_metadata_size(), wordSize);
692 _scopes_pcs_offset = _scopes_data_offset; 696 _scopes_pcs_offset = _scopes_data_offset;
693 _dependencies_offset = _scopes_pcs_offset; 697 _dependencies_offset = _scopes_pcs_offset;
694 _handler_table_offset = _dependencies_offset; 698 _handler_table_offset = _dependencies_offset;
695 _nul_chk_table_offset = _handler_table_offset; 699 _nul_chk_table_offset = _handler_table_offset;
696 _nmethod_end_offset = _nul_chk_table_offset; 700 _leaf_graph_ids_offset = _nul_chk_table_offset;
701 _nmethod_end_offset = _leaf_graph_ids_offset;
697 _compile_id = compile_id; 702 _compile_id = compile_id;
698 _comp_level = CompLevel_none; 703 _comp_level = CompLevel_none;
699 _entry_point = code_begin() + offsets->value(CodeOffsets::Entry); 704 _entry_point = code_begin() + offsets->value(CodeOffsets::Entry);
700 _verified_entry_point = code_begin() + offsets->value(CodeOffsets::Verified_Entry); 705 _verified_entry_point = code_begin() + offsets->value(CodeOffsets::Verified_Entry);
701 _osr_entry_point = NULL; 706 _osr_entry_point = NULL;
837 int frame_size, 842 int frame_size,
838 OopMapSet* oop_maps, 843 OopMapSet* oop_maps,
839 ExceptionHandlerTable* handler_table, 844 ExceptionHandlerTable* handler_table,
840 ImplicitExceptionTable* nul_chk_table, 845 ImplicitExceptionTable* nul_chk_table,
841 AbstractCompiler* compiler, 846 AbstractCompiler* compiler,
842 int comp_level 847 int comp_level,
848 GrowableArray<jlong>* leaf_graph_ids
843 #ifdef GRAAL 849 #ifdef GRAAL
844 , Handle installed_code 850 , Handle installed_code
845 #endif 851 #endif
846 ) 852 )
847 : CodeBlob("nmethod", code_buffer, sizeof(nmethod), 853 : CodeBlob("nmethod", code_buffer, sizeof(nmethod),
903 _unwind_handler_offset = code_offset() + offsets->value(CodeOffsets::UnwindHandler); 909 _unwind_handler_offset = code_offset() + offsets->value(CodeOffsets::UnwindHandler);
904 } else { 910 } else {
905 _unwind_handler_offset = -1; 911 _unwind_handler_offset = -1;
906 } 912 }
907 913
914 size_t leaf_graph_ids_size = leaf_graph_ids == NULL ? 0 : round_to(sizeof(jlong) * leaf_graph_ids->length(), oopSize);
915
908 _oops_offset = data_offset(); 916 _oops_offset = data_offset();
909 _metadata_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize); 917 _metadata_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize);
910 _scopes_data_offset = _metadata_offset + round_to(code_buffer->total_metadata_size(), wordSize); 918 _scopes_data_offset = _metadata_offset + round_to(code_buffer->total_metadata_size(), wordSize);
911 919
912 _scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize); 920 _scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize);
913 _dependencies_offset = _scopes_pcs_offset + adjust_pcs_size(debug_info->pcs_size()); 921 _dependencies_offset = _scopes_pcs_offset + adjust_pcs_size(debug_info->pcs_size());
914 _handler_table_offset = _dependencies_offset + round_to(dependencies->size_in_bytes (), oopSize); 922 _handler_table_offset = _dependencies_offset + round_to(dependencies->size_in_bytes (), oopSize);
915 _nul_chk_table_offset = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize); 923 _nul_chk_table_offset = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize);
916 _nmethod_end_offset = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize); 924 _leaf_graph_ids_offset = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize);
925 _nmethod_end_offset = _leaf_graph_ids_offset + leaf_graph_ids_size;
917 926
918 _entry_point = code_begin() + offsets->value(CodeOffsets::Entry); 927 _entry_point = code_begin() + offsets->value(CodeOffsets::Entry);
919 _verified_entry_point = code_begin() + offsets->value(CodeOffsets::Verified_Entry); 928 _verified_entry_point = code_begin() + offsets->value(CodeOffsets::Verified_Entry);
920 _osr_entry_point = code_begin() + offsets->value(CodeOffsets::OSR_Entry); 929 _osr_entry_point = code_begin() + offsets->value(CodeOffsets::OSR_Entry);
921 _exception_cache = NULL; 930 _exception_cache = NULL;
933 CodeCache::commit(this); 942 CodeCache::commit(this);
934 943
935 // Copy contents of ExceptionHandlerTable to nmethod 944 // Copy contents of ExceptionHandlerTable to nmethod
936 handler_table->copy_to(this); 945 handler_table->copy_to(this);
937 nul_chk_table->copy_to(this); 946 nul_chk_table->copy_to(this);
947
948 if (leaf_graph_ids != NULL && leaf_graph_ids_size > 0) {
949 memcpy(leaf_graph_ids_begin(), leaf_graph_ids->adr_at(0), leaf_graph_ids_size);
950 }
938 951
939 // we use the information of entry points to find out if a method is 952 // we use the information of entry points to find out if a method is
940 // static or non static 953 // static or non static
941 assert(compiler->is_c2() || 954 assert(compiler->is_c2() ||
942 _method->is_static() == (entry_point() == _verified_entry_point), 955 _method->is_static() == (entry_point() == _verified_entry_point),