equal
deleted
inserted
replaced
1 /* |
1 /* |
2 * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
122 uint64_t nm; /* _nmethod */ |
122 uint64_t nm; /* _nmethod */ |
123 uint64_t pc; |
123 uint64_t pc; |
124 uint64_t pc_desc; |
124 uint64_t pc_desc; |
125 |
125 |
126 int32_t orig_pc_offset; /* _orig_pc_offset */ |
126 int32_t orig_pc_offset; /* _orig_pc_offset */ |
127 int32_t instrs_beg; /* _code_offset */ |
127 uint64_t instrs_beg; /* _code_offset */ |
128 int32_t instrs_end; |
128 uint64_t instrs_end; |
129 int32_t deopt_beg; /* _deoptimize_offset */ |
129 uint64_t deopt_beg; /* _deoptimize_offset */ |
130 int32_t scopes_data_beg; /* _scopes_data_offset */ |
130 uint64_t scopes_data_beg; /* _scopes_data_offset */ |
131 int32_t scopes_data_end; |
131 int32_t scopes_data_end; |
132 int32_t metadata_beg; /* _metadata_offset */ |
132 int32_t metadata_beg; /* _metadata_offset */ |
133 int32_t metadata_end; |
133 int32_t metadata_end; |
134 int32_t scopes_pcs_beg; /* _scopes_pcs_offset */ |
134 int32_t scopes_pcs_beg; /* _scopes_pcs_offset */ |
135 int32_t scopes_pcs_end; |
135 int32_t scopes_pcs_end; |
615 |
615 |
616 if (debug > 2 ) |
616 if (debug > 2 ) |
617 fprintf(stderr, "\t nmethod_info: BEGIN \n"); |
617 fprintf(stderr, "\t nmethod_info: BEGIN \n"); |
618 |
618 |
619 /* Instructions */ |
619 /* Instructions */ |
620 err = ps_pread(J->P, nm + OFFSET_CodeBlob_code_offset, &N->instrs_beg, SZ32); |
620 err = read_pointer(J, base + OFFSET_VMStructEntryaddress, &vmp->address); |
621 CHECK_FAIL(err); |
621 err = read_pointer(J, nm + OFFSET_CodeBlob_code_begin, &N->instrs_beg); |
622 err = ps_pread(J->P, nm + OFFSET_CodeBlob_data_offset, &N->instrs_end, SZ32); |
622 CHECK_FAIL(err); |
623 CHECK_FAIL(err); |
623 err = read_pointer(J, nm + OFFSET_CodeBlob_code_end, &N->instrs_end); |
624 err = ps_pread(J->P, nm + OFFSET_nmethod_deoptimize_offset, &N->deopt_beg, SZ32); |
624 CHECK_FAIL(err); |
|
625 err = read_pointer(J, nm + OFFSET_nmethod_deopt_handler_begin, &N->deopt_beg); |
625 CHECK_FAIL(err); |
626 CHECK_FAIL(err); |
626 err = ps_pread(J->P, nm + OFFSET_nmethod_orig_pc_offset, &N->orig_pc_offset, SZ32); |
627 err = ps_pread(J->P, nm + OFFSET_nmethod_orig_pc_offset, &N->orig_pc_offset, SZ32); |
627 CHECK_FAIL(err); |
628 CHECK_FAIL(err); |
628 |
629 |
629 /* Metadata */ |
630 /* Metadata */ |
637 CHECK_FAIL(err); |
638 CHECK_FAIL(err); |
638 err = ps_pread(J->P, nm + OFFSET_nmethod_dependencies_offset, &N->scopes_pcs_end, SZ32); |
639 err = ps_pread(J->P, nm + OFFSET_nmethod_dependencies_offset, &N->scopes_pcs_end, SZ32); |
639 CHECK_FAIL(err); |
640 CHECK_FAIL(err); |
640 |
641 |
641 /* scopes_data */ |
642 /* scopes_data */ |
642 err = ps_pread(J->P, nm + OFFSET_nmethod_scopes_data_offset, &N->scopes_data_beg, SZ32); |
643 err = ps_pread(J->P, nm + OFFSET_nmethod_scopes_data_begin, &N->scopes_data_beg, POINTER_SIZE); |
643 CHECK_FAIL(err); |
644 CHECK_FAIL(err); |
644 |
645 |
645 if (debug > 2 ) { |
646 if (debug > 2 ) { |
646 N->scopes_data_end = N->scopes_pcs_beg; |
647 N->scopes_data_end = N->scopes_pcs_beg; |
647 |
648 |
866 int32_t err; |
867 int32_t err; |
867 |
868 |
868 err = ps_pread(N->J->P, pc_desc + OFFSET_PcDesc_pc_offset, &pc_offset, SZ32); |
869 err = ps_pread(N->J->P, pc_desc + OFFSET_PcDesc_pc_offset, &pc_offset, SZ32); |
869 CHECK_FAIL(err); |
870 CHECK_FAIL(err); |
870 |
871 |
871 *real_pc = N->nm + N->instrs_beg + pc_offset; |
872 *real_pc = N->instrs_beg + pc_offset; |
872 if (debug > 2) { |
873 if (debug > 2) { |
873 fprintf(stderr, "\t\t get_real_pc: pc_offset: %lx, real_pc: %llx\n", |
874 fprintf(stderr, "\t\t get_real_pc: pc_offset: %lx, real_pc: %llx\n", |
874 pc_offset, *real_pc); |
875 pc_offset, *real_pc); |
875 } |
876 } |
876 return PS_OK; |
877 return PS_OK; |
940 |
941 |
941 if (debug > 2) { |
942 if (debug > 2) { |
942 fprintf(stderr, "\t\t scope_desc_at: BEGIN \n"); |
943 fprintf(stderr, "\t\t scope_desc_at: BEGIN \n"); |
943 } |
944 } |
944 |
945 |
945 buffer = N->nm + N->scopes_data_beg + decode_offset; |
946 buffer = N->scopes_data_beg + decode_offset; |
946 |
947 |
947 err = raw_read_int(N->J, &buffer, &vf->sender_decode_offset); |
948 err = raw_read_int(N->J, &buffer, &vf->sender_decode_offset); |
948 CHECK_FAIL(err); |
949 CHECK_FAIL(err); |
949 |
950 |
950 err = raw_read_int(N->J, &buffer, &vf->methodIdx); |
951 err = raw_read_int(N->J, &buffer, &vf->methodIdx); |
1050 |
1051 |
1051 err = nmethod_info(N); |
1052 err = nmethod_info(N); |
1052 CHECK_FAIL(err); |
1053 CHECK_FAIL(err); |
1053 if (debug) { |
1054 if (debug) { |
1054 fprintf(stderr, "name_for_nmethod: pc: %#llx, deopt_pc: %#llx\n", |
1055 fprintf(stderr, "name_for_nmethod: pc: %#llx, deopt_pc: %#llx\n", |
1055 pc, N->nm + N->deopt_beg); |
1056 pc, N->deopt_beg); |
1056 } |
1057 } |
1057 |
1058 |
1058 /* check for a deoptimized frame */ |
1059 /* check for a deoptimized frame */ |
1059 if ( pc == N->nm + N->deopt_beg) { |
1060 if ( pc == N->deopt_beg) { |
1060 uint64_t base; |
1061 uint64_t base; |
1061 if (debug) { |
1062 if (debug) { |
1062 fprintf(stderr, "name_for_nmethod: found deoptimized frame\n"); |
1063 fprintf(stderr, "name_for_nmethod: found deoptimized frame\n"); |
1063 } |
1064 } |
1064 if (J->prev_fr.sender_sp != 0) { |
1065 if (J->prev_fr.sender_sp != 0) { |