Mercurial > hg > truffle
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsInstaller.java @ 8627:75db7afee829
implemented lazy installation of replacements (GRAAL-137)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 03 Apr 2013 21:51:44 +0200 |
parents | 1d6adefaea93 |
children |
rev | line source |
---|---|
7076 | 1 /* |
2 * Copyright (c) 2011, 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 */ | |
8415
2361bf148c06
rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents:
8414
diff
changeset
|
23 package com.oracle.graal.replacements; |
7076 | 24 |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
25 import static com.oracle.graal.api.meta.MetaUtil.*; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
26 |
7076 | 27 import java.lang.reflect.*; |
28 import java.util.*; | |
29 import java.util.concurrent.*; | |
30 | |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
31 import sun.misc.*; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
32 |
7076 | 33 import com.oracle.graal.api.code.*; |
34 import com.oracle.graal.api.meta.*; | |
8420
5d3fa6f949fb
created com.oracle.graal.api.replacements project and moved ClassSubstitution and MethodSubstitution there
Doug Simon <doug.simon@oracle.com>
parents:
8419
diff
changeset
|
35 import com.oracle.graal.api.replacements.*; |
7076 | 36 import com.oracle.graal.debug.*; |
37 import com.oracle.graal.graph.*; | |
38 import com.oracle.graal.java.*; | |
39 import com.oracle.graal.nodes.*; | |
40 import com.oracle.graal.nodes.extended.*; | |
41 import com.oracle.graal.nodes.java.*; | |
7300
2912b72d840a
More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents:
7295
diff
changeset
|
42 import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; |
7076 | 43 import com.oracle.graal.phases.*; |
44 import com.oracle.graal.phases.common.*; | |
8419
11bada5f81a6
refactored MethodSubstitution and MacroSubstitution into top level classes
Doug Simon <doug.simon@oracle.com>
parents:
8416
diff
changeset
|
45 import com.oracle.graal.replacements.Snippet.DefaultSnippetInliningPolicy; |
11bada5f81a6
refactored MethodSubstitution and MacroSubstitution into top level classes
Doug Simon <doug.simon@oracle.com>
parents:
8416
diff
changeset
|
46 import com.oracle.graal.replacements.Snippet.SnippetInliningPolicy; |
7300
2912b72d840a
More complete and reusable Word type
Christian Wimmer <christian.wimmer@oracle.com>
parents:
7295
diff
changeset
|
47 import com.oracle.graal.word.phases.*; |
7076 | 48 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
49 public class ReplacementsInstaller implements Replacements { |
7076 | 50 |
8199
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
51 protected final MetaAccessProvider runtime; |
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
52 protected final TargetDescription target; |
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
53 protected final Assumptions assumptions; |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
54 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
55 private BoxingMethodPool pool; |
7076 | 56 |
57 /** | |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
58 * A graph cache used by this installer to avoid using the compiler storage for each method |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
59 * processed during snippet installation. Without this, all processed methods are to be |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
60 * determined as {@linkplain InliningUtil#canIntrinsify intrinsifiable}. |
7076 | 61 */ |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
62 private final ConcurrentMap<ResolvedJavaMethod, StructuredGraph> graphCache; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
63 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
64 private final ConcurrentMap<ResolvedJavaMethod, ResolvedJavaMethod> originalToSubstitute; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
65 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
66 private final ConcurrentMap<ResolvedJavaMethod, Class<? extends FixedWithNextNode>> macroNodeClasses; |
7076 | 67 |
8410
e996a732c740
renamings as part of a move away from the overloading of the "snippet" term for various code replacement/substitution mechanisms towards it being solely for the concept of IR lowering
Doug Simon <doug.simon@oracle.com>
parents:
8409
diff
changeset
|
68 public ReplacementsInstaller(MetaAccessProvider runtime, Assumptions assumptions, TargetDescription target) { |
7076 | 69 this.runtime = runtime; |
70 this.target = target; | |
71 this.assumptions = assumptions; | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
72 this.graphCache = new ConcurrentHashMap<>(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
73 this.originalToSubstitute = new ConcurrentHashMap<>(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
74 this.macroNodeClasses = new ConcurrentHashMap<>(); |
7076 | 75 } |
76 | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
77 public void registerSnippets(Class<?> snippets) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
78 assert Snippets.class.isAssignableFrom(snippets); |
8413
d9347ee39fbe
rename: SnippetsInterface -> Snippets
Doug Simon <doug.simon@oracle.com>
parents:
8410
diff
changeset
|
79 for (Method method : snippets.getDeclaredMethods()) { |
7076 | 80 if (method.getAnnotation(Snippet.class) != null) { |
81 int modifiers = method.getModifiers(); | |
82 if (Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { | |
83 throw new RuntimeException("Snippet must not be abstract or native"); | |
84 } | |
85 ResolvedJavaMethod snippet = runtime.lookupJavaMethod(method); | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
86 graphCache.putIfAbsent(snippet, placeholder); |
7076 | 87 } |
88 } | |
89 } | |
90 | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
91 private final StructuredGraph placeholder = new StructuredGraph(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
92 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
93 public StructuredGraph getSnippet(ResolvedJavaMethod method) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
94 StructuredGraph graph = graphCache.get(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
95 if (graph == placeholder) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
96 graph = createGraphMaker(null, null).makeGraph(method, inliningPolicy(method)); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
97 assert graph == graphCache.get(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
98 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
99 return graph; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
100 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
101 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
102 public StructuredGraph getMethodSubstitution(ResolvedJavaMethod original) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
103 StructuredGraph graph = graphCache.get(original); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
104 if (graph == placeholder) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
105 ResolvedJavaMethod substitute = originalToSubstitute.get(original); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
106 if (substitute != null) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
107 graph = createGraphMaker(substitute, original).makeGraph(substitute, inliningPolicy(substitute)); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
108 assert graph == graphCache.get(substitute); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
109 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
110 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
111 return graph; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
112 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
113 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
114 public Class<? extends FixedWithNextNode> getMacroSubstitution(ResolvedJavaMethod method) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
115 return macroNodeClasses.get(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
116 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
117 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
118 public Assumptions getAssumptions() { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
119 return assumptions; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
120 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
121 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
122 public void registerSubstitutions(Class<?> substitutions) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
123 ClassSubstitution classSubstitution = substitutions.getAnnotation(ClassSubstitution.class); |
7545
b30b33d9da80
sanity checks for SnippetInstaller.installSubstitutions()
Doug Simon <doug.simon@oracle.com>
parents:
7530
diff
changeset
|
124 assert classSubstitution != null; |
8413
d9347ee39fbe
rename: SnippetsInterface -> Snippets
Doug Simon <doug.simon@oracle.com>
parents:
8410
diff
changeset
|
125 assert !Snippets.class.isAssignableFrom(substitutions); |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
126 for (Method substituteMethod : substitutions.getDeclaredMethods()) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
127 MethodSubstitution methodSubstitution = substituteMethod.getAnnotation(MethodSubstitution.class); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
128 MacroSubstitution macroSubstitution = substituteMethod.getAnnotation(MacroSubstitution.class); |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
129 if (methodSubstitution == null && macroSubstitution == null) { |
7076 | 130 continue; |
131 } | |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
132 |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
133 int modifiers = substituteMethod.getModifiers(); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
134 if (!Modifier.isStatic(modifiers)) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
135 throw new RuntimeException("Substitution methods must be static: " + substituteMethod); |
7076 | 136 } |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
137 |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
138 if (methodSubstitution != null) { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
139 if (Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
140 throw new RuntimeException("Substitution method must not be abstract or native: " + substituteMethod); |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
141 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
142 String originalName = originalName(substituteMethod, methodSubstitution.value()); |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
143 Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
144 Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
145 if (originalMethod != null) { |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
146 installMethodSubstitution(originalMethod, substituteMethod); |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
147 } |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
148 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
149 if (macroSubstitution != null) { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
150 String originalName = originalName(substituteMethod, macroSubstitution.value()); |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
151 Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
152 Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
153 if (originalMethod != null) { |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
154 installMacroSubstitution(originalMethod, macroSubstitution.macro()); |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
155 } |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
156 } |
7076 | 157 } |
158 } | |
159 | |
7373
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
160 /** |
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
161 * Installs a method substitution. |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
162 * |
8431
be5ce3e9d473
rename: originalMethod -> originalMember
Doug Simon <doug.simon@oracle.com>
parents:
8430
diff
changeset
|
163 * @param originalMember a method or constructor being substituted |
7373
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
164 * @param substituteMethod the substitute method |
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
165 */ |
8431
be5ce3e9d473
rename: originalMethod -> originalMember
Doug Simon <doug.simon@oracle.com>
parents:
8430
diff
changeset
|
166 protected void installMethodSubstitution(Member originalMember, Method substituteMethod) { |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
167 ResolvedJavaMethod substitute = runtime.lookupJavaMethod(substituteMethod); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
168 ResolvedJavaMethod original; |
8431
be5ce3e9d473
rename: originalMethod -> originalMember
Doug Simon <doug.simon@oracle.com>
parents:
8430
diff
changeset
|
169 if (originalMember instanceof Method) { |
be5ce3e9d473
rename: originalMethod -> originalMember
Doug Simon <doug.simon@oracle.com>
parents:
8430
diff
changeset
|
170 original = runtime.lookupJavaMethod((Method) originalMember); |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
171 } else { |
8431
be5ce3e9d473
rename: originalMethod -> originalMember
Doug Simon <doug.simon@oracle.com>
parents:
8430
diff
changeset
|
172 original = runtime.lookupJavaConstructor((Constructor) originalMember); |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
173 } |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
174 Debug.log("substitution: " + MetaUtil.format("%H.%n(%p)", original) + " --> " + MetaUtil.format("%H.%n(%p)", substitute)); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
175 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
176 graphCache.putIfAbsent(original, placeholder); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
177 originalToSubstitute.put(original, substitute); |
7373
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
178 } |
6b2c55fc9ba8
reworked mechanism for omitting intrinsics if the underlying hardware support is not available and used it to make intrinsification of Integer.bitCount() dependent on whether the POPCNT instruction is available
Doug Simon <doug.simon@oracle.com>
parents:
7360
diff
changeset
|
179 |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
180 /** |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
181 * Installs a macro substitution. |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
182 * |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
183 * @param originalMethod a method or constructor being substituted |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
184 * @param macro the substitute macro node class |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
185 */ |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
186 protected void installMacroSubstitution(Member originalMethod, Class<? extends FixedWithNextNode> macro) { |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
187 ResolvedJavaMethod originalJavaMethod; |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
188 if (originalMethod instanceof Method) { |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
189 originalJavaMethod = runtime.lookupJavaMethod((Method) originalMethod); |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
190 } else { |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
191 originalJavaMethod = runtime.lookupJavaConstructor((Constructor) originalMethod); |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
192 } |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
193 macroNodeClasses.put(originalJavaMethod, macro); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
194 } |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
195 |
7096
585fc9f79ebc
Remove ResolvedJavaType.isClass()
Christian Wimmer <christian.wimmer@oracle.com>
parents:
7076
diff
changeset
|
196 private SnippetInliningPolicy inliningPolicy(ResolvedJavaMethod method) { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
197 Class<? extends SnippetInliningPolicy> policyClass = SnippetInliningPolicy.class; |
7076 | 198 Snippet snippet = method.getAnnotation(Snippet.class); |
199 if (snippet != null) { | |
200 policyClass = snippet.inlining(); | |
201 } | |
202 if (policyClass == SnippetInliningPolicy.class) { | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
203 return new DefaultSnippetInliningPolicy(runtime, pool()); |
7076 | 204 } |
205 try { | |
206 return policyClass.getConstructor().newInstance(); | |
207 } catch (Exception e) { | |
208 throw new GraalInternalError(e); | |
209 } | |
210 } | |
211 | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
212 public StructuredGraph makeGraph(ResolvedJavaMethod method, SnippetInliningPolicy policy) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
213 return createGraphMaker(null, null).makeGraph(method, policy); |
8199
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
214 } |
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
215 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
216 protected GraphMaker createGraphMaker(ResolvedJavaMethod substitute, ResolvedJavaMethod original) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
217 return new GraphMaker(substitute, original); |
7076 | 218 } |
219 | |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
220 protected class GraphMaker { |
7076 | 221 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
222 // These fields are used to detect calls from the substitute method to the original method. |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
223 protected final ResolvedJavaMethod substitute; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
224 protected final ResolvedJavaMethod original; |
7076 | 225 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
226 boolean substituteCallsOriginal; |
8199
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
227 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
228 protected GraphMaker(ResolvedJavaMethod substitute, ResolvedJavaMethod original) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
229 this.substitute = substitute; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
230 this.original = original; |
8199
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
231 } |
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
232 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
233 /** |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
234 * Does final processing of a snippet graph. |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
235 */ |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
236 protected void finalizeGraph(ResolvedJavaMethod method, StructuredGraph graph) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
237 new NodeIntrinsificationPhase(runtime, pool()).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
238 assert SnippetTemplate.hasConstantParameter(method) || NodeIntrinsificationVerificationPhase.verify(graph); |
8199
a68310b2b8b8
made GraphBuilderPhase and SnippetInstaller more extensible (inspired by patch from Mick Jordan)
Doug Simon <doug.simon@oracle.com>
parents:
8175
diff
changeset
|
239 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
240 if (substitute == null) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
241 new SnippetFrameStateCleanupPhase().apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
242 new DeadCodeEliminationPhase().apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
243 new InsertStateAfterPlaceholderPhase().apply(graph); |
7383
36474f315a8a
added support for substitute methods to call the original/substituted methods
Doug Simon <doug.simon@oracle.com>
parents:
7373
diff
changeset
|
244 } else { |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
245 new DeadCodeEliminationPhase().apply(graph); |
7271
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
246 } |
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
247 } |
7076 | 248 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
249 public StructuredGraph makeGraph(final ResolvedJavaMethod method, final SnippetInliningPolicy policy) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
250 return Debug.scope("BuildSnippetGraph", new Object[]{method}, new Callable<StructuredGraph>() { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
251 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
252 @Override |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
253 public StructuredGraph call() throws Exception { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
254 StructuredGraph graph = parseGraph(method, policy); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
255 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
256 finalizeGraph(method, graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
257 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
258 Debug.dump(graph, "%s: Final", method.getName()); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
259 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
260 return graph; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
261 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
262 }); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
263 } |
7271
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
264 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
265 private StructuredGraph parseGraph(final ResolvedJavaMethod method, final SnippetInliningPolicy policy) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
266 StructuredGraph graph = graphCache.get(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
267 if (graph == null || graph == placeholder) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
268 graph = buildGraph(method, policy == null ? inliningPolicy(method) : policy); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
269 graphCache.put(method, graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
270 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
271 return graph; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
272 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
273 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
274 /** |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
275 * Builds the initial graph for a snippet. |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
276 */ |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
277 protected StructuredGraph buildInitialGraph(final ResolvedJavaMethod method) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
278 final StructuredGraph graph = new StructuredGraph(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
279 GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
280 GraphBuilderPhase graphBuilder = new GraphBuilderPhase(runtime, config, OptimisticOptimizations.NONE); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
281 graphBuilder.apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
282 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
283 Debug.dump(graph, "%s: %s", method.getName(), GraphBuilderPhase.class.getSimpleName()); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
284 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
285 new WordTypeVerificationPhase(runtime, target.wordKind).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
286 new NodeIntrinsificationPhase(runtime, pool()).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
287 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
288 return graph; |
7271
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
289 } |
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
290 |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
291 /** |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
292 * Called after a graph is inlined. |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
293 * |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
294 * @param caller the graph into which {@code callee} was inlined |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
295 * @param callee the graph that was inlined into {@code caller} |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
296 */ |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
297 protected void afterInline(StructuredGraph caller, StructuredGraph callee) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
298 if (GraalOptions.OptCanonicalizer) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
299 new WordTypeRewriterPhase(runtime, target.wordKind).apply(caller); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
300 new CanonicalizerPhase(runtime, assumptions).apply(caller); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
301 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
302 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
303 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
304 /** |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
305 * Called after all inlining for a given graph is complete. |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
306 */ |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
307 protected void afterInlining(StructuredGraph graph) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
308 new NodeIntrinsificationPhase(runtime, pool()).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
309 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
310 new WordTypeRewriterPhase(runtime, target.wordKind).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
311 |
7271
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
312 new DeadCodeEliminationPhase().apply(graph); |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
313 if (GraalOptions.OptCanonicalizer) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
314 new CanonicalizerPhase(runtime, assumptions).apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
315 } |
7271
9c06e8bd8769
added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
7229
diff
changeset
|
316 } |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
317 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
318 private StructuredGraph buildGraph(final ResolvedJavaMethod method, final SnippetInliningPolicy policy) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
319 assert !Modifier.isAbstract(method.getModifiers()) && !Modifier.isNative(method.getModifiers()) : method; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
320 final StructuredGraph graph = buildInitialGraph(method); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
321 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
322 for (Invoke invoke : graph.getInvokes()) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
323 MethodCallTargetNode callTarget = invoke.methodCallTarget(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
324 ResolvedJavaMethod callee = callTarget.targetMethod(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
325 if (callee == substitute) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
326 final StructuredGraph originalGraph = new StructuredGraph(original); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
327 new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), OptimisticOptimizations.NONE).apply(originalGraph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
328 InliningUtil.inline(invoke, originalGraph, true); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
329 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
330 Debug.dump(graph, "after inlining %s", callee); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
331 afterInline(graph, originalGraph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
332 substituteCallsOriginal = true; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
333 } else { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
334 if ((callTarget.invokeKind() == InvokeKind.Static || callTarget.invokeKind() == InvokeKind.Special) && policy.shouldInline(callee, method)) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
335 StructuredGraph targetGraph = parseGraph(callee, policy); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
336 InliningUtil.inline(invoke, targetGraph, true); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
337 Debug.dump(graph, "after inlining %s", callee); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
338 afterInline(graph, targetGraph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
339 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
340 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
341 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
342 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
343 afterInlining(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
344 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
345 for (LoopEndNode end : graph.getNodes(LoopEndNode.class)) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
346 end.disableSafepoint(); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
347 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
348 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
349 if (GraalOptions.ProbabilityAnalysis) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
350 new DeadCodeEliminationPhase().apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
351 new ComputeProbabilityPhase().apply(graph); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
352 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
353 return graph; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
354 } |
7076 | 355 } |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
356 |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
357 private static String originalName(Method substituteMethod, String methodSubstitution) { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
358 if (methodSubstitution.isEmpty()) { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
359 return substituteMethod.getName(); |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
360 } else { |
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
361 return methodSubstitution; |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
362 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
363 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
364 |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
365 /** |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
366 * Resolves a name to a class. |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
367 * |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
368 * @param className the name of the class to resolve |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
369 * @param optional if true, resolution failure returns null |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
370 * @return the resolved class or null if resolution fails and {@code optional} is true |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
371 */ |
8466
c7a2a937233f
added @Alias annotation for accessing fields and methods otherwise inaccessible due to Java access rules
Doug Simon <doug.simon@oracle.com>
parents:
8450
diff
changeset
|
372 static Class resolveType(String className, boolean optional) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
373 try { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
374 // Need to use launcher class path to handle classes |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
375 // that are not on the boot class path |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
376 ClassLoader cl = Launcher.getLauncher().getClassLoader(); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
377 return Class.forName(className, false, cl); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
378 } catch (ClassNotFoundException e) { |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
379 if (optional) { |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
380 return null; |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
381 } |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
382 throw new GraalInternalError("Could not resolve type " + className); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
383 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
384 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
385 |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
386 private static Class resolveType(JavaType type) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
387 JavaType base = type; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
388 int dimensions = 0; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
389 while (base.getComponentType() != null) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
390 base = base.getComponentType(); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
391 dimensions++; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
392 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
393 |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
394 Class baseClass = base.getKind() != Kind.Object ? base.getKind().toJavaClass() : resolveType(toJavaName(base), false); |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
395 return dimensions == 0 ? baseClass : Array.newInstance(baseClass, new int[dimensions]).getClass(); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
396 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
397 |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
398 private Class[] originalParameters(Method substituteMethod, String methodSubstitution, boolean isStatic) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
399 Class[] parameters; |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
400 if (methodSubstitution.isEmpty()) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
401 parameters = substituteMethod.getParameterTypes(); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
402 if (!isStatic) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
403 assert parameters.length > 0 : "must be a static method with the 'this' object as its first parameter"; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
404 parameters = Arrays.copyOfRange(parameters, 1, parameters.length); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
405 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
406 } else { |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7383
diff
changeset
|
407 Signature signature = runtime.parseMethodDescriptor(methodSubstitution); |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
408 parameters = new Class[signature.getParameterCount(false)]; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
409 for (int i = 0; i < parameters.length; i++) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
410 parameters[i] = resolveType(signature.getParameterType(i, null)); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
411 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
412 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
413 return parameters; |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
414 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
415 |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
416 private static Member originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
417 Class<?> originalClass = classSubstitution.value(); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
418 if (originalClass == ClassSubstitution.class) { |
8373
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
419 originalClass = resolveType(classSubstitution.className(), classSubstitution.optional()); |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
420 if (originalClass == null) { |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
421 // optional class was not found |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
422 return null; |
86a9e3ea8fe9
support substitutions for classes that made not be part of the runtime (GRAAL-123)
Doug Simon <doug.simon@oracle.com>
parents:
8360
diff
changeset
|
423 } |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
424 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
425 try { |
8360
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
426 if (name.equals("<init>")) { |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
427 return originalClass.getDeclaredConstructor(parameters); |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
428 } else { |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
429 return originalClass.getDeclaredMethod(name, parameters); |
fa5a670a1682
added support for substituting constructors
Doug Simon <doug.simon@oracle.com>
parents:
8199
diff
changeset
|
430 } |
7360
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
431 } catch (NoSuchMethodException | SecurityException e) { |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
432 throw new GraalInternalError(e); |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
433 } |
12bd634440d0
support substitution of methods that are not in the bootstrap class path and/or whose signature contains non-accessible types
Doug Simon <doug.simon@oracle.com>
parents:
7356
diff
changeset
|
434 } |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
435 |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
436 protected BoxingMethodPool pool() { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
437 if (pool == null) { |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
438 // A race to create the pool is ok |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
439 pool = new BoxingMethodPool(runtime); |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
440 } |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
441 return pool; |
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8484
diff
changeset
|
442 } |
7076 | 443 } |