Mercurial > hg > graal-compiler
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), |