25 import java.util.Map;
26
27 import jdk.vm.ci.code.BailoutException;
28 import jdk.vm.ci.code.BytecodeFrame;
29 import jdk.vm.ci.code.CodeCacheProvider;
30 import jdk.vm.ci.code.CompiledCode;
31 import jdk.vm.ci.code.InstalledCode;
32 import jdk.vm.ci.code.RegisterConfig;
33 import jdk.vm.ci.code.TargetDescription;
34 import jdk.vm.ci.code.site.Call;
35 import jdk.vm.ci.code.site.Mark;
36 import jdk.vm.ci.meta.ResolvedJavaMethod;
37 import jdk.vm.ci.meta.SpeculationLog;
38
39 /**
40 * HotSpot implementation of {@link CodeCacheProvider}.
41 */
42 public class HotSpotCodeCacheProvider implements CodeCacheProvider {
43
44 protected final HotSpotJVMCIRuntime runtime;
45 protected final HotSpotVMConfig config;
46 protected final TargetDescription target;
47 protected final RegisterConfig regConfig;
48
49 public HotSpotCodeCacheProvider(HotSpotJVMCIRuntime runtime, HotSpotVMConfig config, TargetDescription target, RegisterConfig regConfig) {
50 this.runtime = runtime;
51 this.config = config;
52 this.target = target;
53 this.regConfig = regConfig;
54 }
55
56 @Override
57 public String getMarkName(Mark mark) {
58 int markId = (int) mark.id;
59 HotSpotVMConfigStore store = runtime.getConfigStore();
60 for (Map.Entry<String, Long> e : store.getConstants().entrySet()) {
61 String name = e.getKey();
62 if (name.startsWith("MARKID_") && e.getValue() == markId) {
63 return name;
64 }
65 }
66 return CodeCacheProvider.super.getMarkName(mark);
67 }
68
69 /**
70 * Decodes a call target to a mnemonic if possible.
71 */
74 if (call.target instanceof HotSpotForeignCallTarget) {
75 long address = ((HotSpotForeignCallTarget) call.target).address;
76 HotSpotVMConfigStore store = runtime.getConfigStore();
77 for (Map.Entry<String, VMField> e : store.getFields().entrySet()) {
78 VMField field = e.getValue();
79 if (field.isStatic() && field.value != null && field.value instanceof Long && ((Long) field.value) == address) {
80 return e.getValue() + ":0x" + Long.toHexString(address);
81 }
82 }
83 }
84 return CodeCacheProvider.super.getTargetName(call);
85 }
86
87 @Override
88 public RegisterConfig getRegisterConfig() {
89 return regConfig;
90 }
91
92 @Override
93 public int getMinimumOutgoingSize() {
94 return runtime.getConfig().runtimeCallStackSize;
95 }
96
97 private InstalledCode logOrDump(InstalledCode installedCode, CompiledCode compiledCode) {
98 runtime.notifyInstall(this, installedCode, compiledCode);
99 return installedCode;
100 }
101
102 @Override
103 public InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault) {
104 InstalledCode resultInstalledCode;
105 if (installedCode == null) {
106 if (method == null) {
107 // Must be a stub
108 resultInstalledCode = new HotSpotRuntimeStub(((HotSpotCompiledCode) compiledCode).getName());
109 } else {
110 resultInstalledCode = new HotSpotNmethod((HotSpotResolvedJavaMethod) method, ((HotSpotCompiledCode) compiledCode).getName(), isDefault);
111 }
112 } else {
113 resultInstalledCode = installedCode;
114 }
|
25 import java.util.Map;
26
27 import jdk.vm.ci.code.BailoutException;
28 import jdk.vm.ci.code.BytecodeFrame;
29 import jdk.vm.ci.code.CodeCacheProvider;
30 import jdk.vm.ci.code.CompiledCode;
31 import jdk.vm.ci.code.InstalledCode;
32 import jdk.vm.ci.code.RegisterConfig;
33 import jdk.vm.ci.code.TargetDescription;
34 import jdk.vm.ci.code.site.Call;
35 import jdk.vm.ci.code.site.Mark;
36 import jdk.vm.ci.meta.ResolvedJavaMethod;
37 import jdk.vm.ci.meta.SpeculationLog;
38
39 /**
40 * HotSpot implementation of {@link CodeCacheProvider}.
41 */
42 public class HotSpotCodeCacheProvider implements CodeCacheProvider {
43
44 protected final HotSpotJVMCIRuntime runtime;
45 private final HotSpotVMConfig config;
46 protected final TargetDescription target;
47 protected final RegisterConfig regConfig;
48
49 public HotSpotCodeCacheProvider(HotSpotJVMCIRuntime runtime, TargetDescription target, RegisterConfig regConfig) {
50 this.runtime = runtime;
51 this.config = runtime.getConfig();
52 this.target = target;
53 this.regConfig = regConfig;
54 }
55
56 @Override
57 public String getMarkName(Mark mark) {
58 int markId = (int) mark.id;
59 HotSpotVMConfigStore store = runtime.getConfigStore();
60 for (Map.Entry<String, Long> e : store.getConstants().entrySet()) {
61 String name = e.getKey();
62 if (name.startsWith("MARKID_") && e.getValue() == markId) {
63 return name;
64 }
65 }
66 return CodeCacheProvider.super.getMarkName(mark);
67 }
68
69 /**
70 * Decodes a call target to a mnemonic if possible.
71 */
74 if (call.target instanceof HotSpotForeignCallTarget) {
75 long address = ((HotSpotForeignCallTarget) call.target).address;
76 HotSpotVMConfigStore store = runtime.getConfigStore();
77 for (Map.Entry<String, VMField> e : store.getFields().entrySet()) {
78 VMField field = e.getValue();
79 if (field.isStatic() && field.value != null && field.value instanceof Long && ((Long) field.value) == address) {
80 return e.getValue() + ":0x" + Long.toHexString(address);
81 }
82 }
83 }
84 return CodeCacheProvider.super.getTargetName(call);
85 }
86
87 @Override
88 public RegisterConfig getRegisterConfig() {
89 return regConfig;
90 }
91
92 @Override
93 public int getMinimumOutgoingSize() {
94 return config.runtimeCallStackSize;
95 }
96
97 private InstalledCode logOrDump(InstalledCode installedCode, CompiledCode compiledCode) {
98 runtime.notifyInstall(this, installedCode, compiledCode);
99 return installedCode;
100 }
101
102 @Override
103 public InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault) {
104 InstalledCode resultInstalledCode;
105 if (installedCode == null) {
106 if (method == null) {
107 // Must be a stub
108 resultInstalledCode = new HotSpotRuntimeStub(((HotSpotCompiledCode) compiledCode).getName());
109 } else {
110 resultInstalledCode = new HotSpotNmethod((HotSpotResolvedJavaMethod) method, ((HotSpotCompiledCode) compiledCode).getName(), isDefault);
111 }
112 } else {
113 resultInstalledCode = installedCode;
114 }
|