1 /* |
1 /* |
2 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2000, 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. |
25 package sun.jvm.hotspot.code; |
25 package sun.jvm.hotspot.code; |
26 |
26 |
27 import java.io.*; |
27 import java.io.*; |
28 import java.util.*; |
28 import java.util.*; |
29 import sun.jvm.hotspot.debugger.*; |
29 import sun.jvm.hotspot.debugger.*; |
30 import sun.jvm.hotspot.memory.*; |
|
31 import sun.jvm.hotspot.oops.*; |
30 import sun.jvm.hotspot.oops.*; |
32 import sun.jvm.hotspot.runtime.*; |
31 import sun.jvm.hotspot.runtime.*; |
33 import sun.jvm.hotspot.types.*; |
32 import sun.jvm.hotspot.types.*; |
34 import sun.jvm.hotspot.utilities.*; |
33 import sun.jvm.hotspot.utilities.*; |
35 |
34 |
36 public class NMethod extends CodeBlob { |
35 public class NMethod extends CompiledMethod { |
37 private static long pcDescSize; |
36 private static long pcDescSize; |
38 private static AddressField methodField; |
|
39 /** != InvocationEntryBci if this nmethod is an on-stack replacement method */ |
37 /** != InvocationEntryBci if this nmethod is an on-stack replacement method */ |
40 private static CIntegerField entryBCIField; |
38 private static CIntegerField entryBCIField; |
41 /** To support simple linked-list chaining of nmethods */ |
39 /** To support simple linked-list chaining of nmethods */ |
42 private static AddressField osrLinkField; |
40 private static AddressField osrLinkField; |
43 private static AddressField scavengeRootLinkField; |
41 private static AddressField scavengeRootLinkField; |
44 private static JByteField scavengeRootStateField; |
42 private static JByteField scavengeRootStateField; |
45 |
43 |
46 /** Offsets for different nmethod parts */ |
44 /** Offsets for different nmethod parts */ |
47 private static CIntegerField exceptionOffsetField; |
45 private static CIntegerField exceptionOffsetField; |
48 private static CIntegerField deoptOffsetField; |
|
49 private static CIntegerField deoptMhOffsetField; |
|
50 private static CIntegerField origPCOffsetField; |
46 private static CIntegerField origPCOffsetField; |
51 private static CIntegerField stubOffsetField; |
47 private static CIntegerField stubOffsetField; |
52 private static CIntegerField oopsOffsetField; |
48 private static CIntegerField oopsOffsetField; |
53 private static CIntegerField metadataOffsetField; |
49 private static CIntegerField metadataOffsetField; |
54 private static CIntegerField scopesDataOffsetField; |
|
55 private static CIntegerField scopesPCsOffsetField; |
50 private static CIntegerField scopesPCsOffsetField; |
56 private static CIntegerField dependenciesOffsetField; |
51 private static CIntegerField dependenciesOffsetField; |
57 private static CIntegerField handlerTableOffsetField; |
52 private static CIntegerField handlerTableOffsetField; |
58 private static CIntegerField nulChkTableOffsetField; |
53 private static CIntegerField nulChkTableOffsetField; |
59 private static CIntegerField nmethodEndOffsetField; |
54 private static CIntegerField nmethodEndOffsetField; |
89 } |
84 } |
90 |
85 |
91 private static void initialize(TypeDataBase db) { |
86 private static void initialize(TypeDataBase db) { |
92 Type type = db.lookupType("nmethod"); |
87 Type type = db.lookupType("nmethod"); |
93 |
88 |
94 methodField = type.getAddressField("_method"); |
|
95 entryBCIField = type.getCIntegerField("_entry_bci"); |
89 entryBCIField = type.getCIntegerField("_entry_bci"); |
96 osrLinkField = type.getAddressField("_osr_link"); |
90 osrLinkField = type.getAddressField("_osr_link"); |
97 scavengeRootLinkField = type.getAddressField("_scavenge_root_link"); |
91 scavengeRootLinkField = type.getAddressField("_scavenge_root_link"); |
98 scavengeRootStateField = type.getJByteField("_scavenge_root_state"); |
92 scavengeRootStateField = type.getJByteField("_scavenge_root_state"); |
99 |
93 |
100 exceptionOffsetField = type.getCIntegerField("_exception_offset"); |
94 exceptionOffsetField = type.getCIntegerField("_exception_offset"); |
101 deoptOffsetField = type.getCIntegerField("_deoptimize_offset"); |
|
102 deoptMhOffsetField = type.getCIntegerField("_deoptimize_mh_offset"); |
|
103 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); |
95 origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); |
104 stubOffsetField = type.getCIntegerField("_stub_offset"); |
96 stubOffsetField = type.getCIntegerField("_stub_offset"); |
105 oopsOffsetField = type.getCIntegerField("_oops_offset"); |
97 oopsOffsetField = type.getCIntegerField("_oops_offset"); |
106 metadataOffsetField = type.getCIntegerField("_metadata_offset"); |
98 metadataOffsetField = type.getCIntegerField("_metadata_offset"); |
107 scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset"); |
|
108 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); |
99 scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); |
109 dependenciesOffsetField = type.getCIntegerField("_dependencies_offset"); |
100 dependenciesOffsetField = type.getCIntegerField("_dependencies_offset"); |
110 handlerTableOffsetField = type.getCIntegerField("_handler_table_offset"); |
101 handlerTableOffsetField = type.getCIntegerField("_handler_table_offset"); |
111 nulChkTableOffsetField = type.getCIntegerField("_nul_chk_table_offset"); |
102 nulChkTableOffsetField = type.getCIntegerField("_nul_chk_table_offset"); |
112 nmethodEndOffsetField = type.getCIntegerField("_nmethod_end_offset"); |
103 nmethodEndOffsetField = type.getCIntegerField("_nmethod_end_offset"); |
143 public Address constantsBegin() { return contentBegin(); } |
129 public Address constantsBegin() { return contentBegin(); } |
144 public Address constantsEnd() { return getEntryPoint(); } |
130 public Address constantsEnd() { return getEntryPoint(); } |
145 public Address instsBegin() { return codeBegin(); } |
131 public Address instsBegin() { return codeBegin(); } |
146 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } |
132 public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } |
147 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } |
133 public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } |
148 public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptOffset()); } |
|
149 public Address deoptMhHandlerBegin() { return headerBegin().addOffsetTo(getDeoptMhOffset()); } |
|
150 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } |
134 public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } |
151 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } |
135 public Address stubEnd() { return headerBegin().addOffsetTo(getOopsOffset()); } |
152 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } |
136 public Address oopsBegin() { return headerBegin().addOffsetTo(getOopsOffset()); } |
153 public Address oopsEnd() { return headerBegin().addOffsetTo(getMetadataOffset()); } |
137 public Address oopsEnd() { return headerBegin().addOffsetTo(getMetadataOffset()); } |
154 public Address metadataBegin() { return headerBegin().addOffsetTo(getMetadataOffset()); } |
138 public Address metadataBegin() { return headerBegin().addOffsetTo(getMetadataOffset()); } |
155 public Address metadataEnd() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
139 public Address metadataEnd() { return scopesDataBegin(); } |
156 public Address scopesDataBegin() { return headerBegin().addOffsetTo(getScopesDataOffset()); } |
|
157 public Address scopesDataEnd() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
140 public Address scopesDataEnd() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
158 public Address scopesPCsBegin() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
141 public Address scopesPCsBegin() { return headerBegin().addOffsetTo(getScopesPCsOffset()); } |
159 public Address scopesPCsEnd() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
142 public Address scopesPCsEnd() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
160 public Address dependenciesBegin() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
143 public Address dependenciesBegin() { return headerBegin().addOffsetTo(getDependenciesOffset()); } |
161 public Address dependenciesEnd() { return headerBegin().addOffsetTo(getHandlerTableOffset()); } |
144 public Address dependenciesEnd() { return headerBegin().addOffsetTo(getHandlerTableOffset()); } |
460 /** Support for code generation. Only here for proof-of-concept. */ |
443 /** Support for code generation. Only here for proof-of-concept. */ |
461 public static int getEntryPointOffset() { return (int) entryPointField.getOffset(); } |
444 public static int getEntryPointOffset() { return (int) entryPointField.getOffset(); } |
462 public static int getVerifiedEntryPointOffset() { return (int) verifiedEntryPointField.getOffset(); } |
445 public static int getVerifiedEntryPointOffset() { return (int) verifiedEntryPointField.getOffset(); } |
463 public static int getOSREntryPointOffset() { return (int) osrEntryPointField.getOffset(); } |
446 public static int getOSREntryPointOffset() { return (int) osrEntryPointField.getOffset(); } |
464 public static int getEntryBCIOffset() { return (int) entryBCIField.getOffset(); } |
447 public static int getEntryBCIOffset() { return (int) entryBCIField.getOffset(); } |
465 /** NOTE: renamed from "method_offset_in_bytes" */ |
|
466 public static int getMethodOffset() { return (int) methodField.getOffset(); } |
|
467 |
448 |
468 public void print() { |
449 public void print() { |
469 printOn(System.out); |
450 printOn(System.out); |
470 } |
451 } |
471 |
452 |
539 // Internals only below this point |
520 // Internals only below this point |
540 // |
521 // |
541 |
522 |
542 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } |
523 private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } |
543 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } |
524 private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } |
544 private int getDeoptOffset() { return (int) deoptOffsetField .getValue(addr); } |
|
545 private int getDeoptMhOffset() { return (int) deoptMhOffsetField .getValue(addr); } |
|
546 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } |
525 private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } |
547 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } |
526 private int getOopsOffset() { return (int) oopsOffsetField .getValue(addr); } |
548 private int getMetadataOffset() { return (int) metadataOffsetField .getValue(addr); } |
527 private int getMetadataOffset() { return (int) metadataOffsetField .getValue(addr); } |
549 private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } |
|
550 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } |
528 private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } |
551 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } |
529 private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); } |
552 private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); } |
530 private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); } |
553 private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } |
531 private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } |
554 private int getNMethodEndOffset() { return (int) nmethodEndOffsetField .getValue(addr); } |
532 private int getNMethodEndOffset() { return (int) nmethodEndOffsetField .getValue(addr); } |