1 /*
2  * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
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
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 package jdk.vm.ci.code;
24 
25 import jdk.vm.ci.code.site.Call;
26 import jdk.vm.ci.code.site.Mark;
27 import jdk.vm.ci.meta.ResolvedJavaMethod;
28 import jdk.vm.ci.meta.SpeculationLog;
29 
30 /**
31  * Access to code cache related details and requirements.
32  */
33 public interface CodeCacheProvider {
34 
35     /**
36      * Installs code for a given method based on a given compilation result without making it the
37      * default implementation of the method.
38      *
39      * @param method a method implemented by the installed code
40      * @param compiledCode the compiled code to be added
41      * @param log the speculation log to be used
42      * @param installedCode a predefined {@link InstalledCode} object to use as a reference to the
43      *            installed code. If {@code null}, a new {@link InstalledCode} object will be
44      *            created.
45      * @return a reference to the ready-to-run code
46      * @throws BailoutException if the code installation failed
47      */
addCode(ResolvedJavaMethod method, CompiledCode compiledCode, SpeculationLog log, InstalledCode installedCode)48     default InstalledCode addCode(ResolvedJavaMethod method, CompiledCode compiledCode, SpeculationLog log, InstalledCode installedCode) {
49         return installCode(method, compiledCode, installedCode, log, false);
50     }
51 
52     /**
53      * Installs code for a given method based on a given compilation result and makes it the default
54      * implementation of the method.
55      *
56      * @param method a method implemented by the installed code and for which the installed code
57      *            becomes the default implementation
58      * @param compiledCode the compiled code to be added
59      * @return a reference to the ready-to-run code
60      * @throws BailoutException if the code installation failed
61      */
setDefaultCode(ResolvedJavaMethod method, CompiledCode compiledCode)62     default InstalledCode setDefaultCode(ResolvedJavaMethod method, CompiledCode compiledCode) {
63         return installCode(method, compiledCode, null, null, true);
64     }
65 
66     /**
67      * Installs code based on a given compilation result.
68      *
69      * @param method the method compiled to produce {@code compiledCode} or {@code null} if the
70      *            input to {@code compResult} was not a {@link ResolvedJavaMethod}
71      * @param compiledCode the compiled code to be added
72      * @param installedCode a pre-allocated {@link InstalledCode} object to use as a reference to
73      *            the installed code. If {@code null}, a new {@link InstalledCode} object will be
74      *            created.
75      * @param log the speculation log to be used
76      * @param isDefault specifies if the installed code should be made the default implementation of
77      *            {@code compRequest.getMethod()}. The default implementation for a method is the
78      *            code executed for standard calls to the method. This argument is ignored if
79      *            {@code compRequest == null}.
80      * @return a reference to the compiled and ready-to-run installed code
81      * @throws BailoutException if the code installation failed
82      */
installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault)83     InstalledCode installCode(ResolvedJavaMethod method, CompiledCode compiledCode, InstalledCode installedCode, SpeculationLog log, boolean isDefault);
84 
85     /**
86      * Invalidates {@code installedCode} such that {@link InvalidInstalledCodeException} will be
87      * raised the next time {@code installedCode} is
88      * {@linkplain InstalledCode#executeVarargs(Object...) executed}.
89      */
invalidateInstalledCode(InstalledCode installedCode)90     void invalidateInstalledCode(InstalledCode installedCode);
91 
92     /**
93      * Gets a name for a {@link Mark} mark.
94      */
getMarkName(Mark mark)95     default String getMarkName(Mark mark) {
96         return String.valueOf(mark.id);
97     }
98 
99     /**
100      * Gets a name for the {@linkplain Call#target target} of a {@link Call}.
101      */
getTargetName(Call call)102     default String getTargetName(Call call) {
103         return String.valueOf(call.target);
104     }
105 
106     /**
107      * Gets the register configuration to use when compiling a given method.
108      */
getRegisterConfig()109     RegisterConfig getRegisterConfig();
110 
111     /**
112      * Minimum size of the stack area reserved for outgoing parameters. This area is reserved in all
113      * cases, even when the compiled method has no regular call instructions.
114      *
115      * @return the minimum size of the outgoing parameter area in bytes
116      */
getMinimumOutgoingSize()117     int getMinimumOutgoingSize();
118 
119     /**
120      * Gets a description of the target architecture.
121      */
getTarget()122     TargetDescription getTarget();
123 
124     /**
125      * Create a new speculation log for the target runtime.
126      */
createSpeculationLog()127     SpeculationLog createSpeculationLog();
128 
129     /**
130      * Returns the maximum absolute offset of a PC relative call to a given address from any
131      * position in the code cache or -1 when not applicable. Intended for determining the required
132      * size of address/offset fields.
133      */
getMaxCallTargetOffset(long address)134     long getMaxCallTargetOffset(long address);
135 
136     /**
137      * Determines if debug info should also be emitted at non-safepoint locations.
138      */
shouldDebugNonSafepoints()139     boolean shouldDebugNonSafepoints();
140 }
141