151
152 private static void registerStringLatin1Plugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
153 if (JAVA_SPECIFICATION_VERSION >= 9) {
154 Registration r = new Registration(plugins, "java.lang.StringLatin1", replacementsBytecodeProvider);
155 r.setAllowOverwrite(true);
156 r.registerMethodSubstitution(AArch64StringLatin1Substitutions.class, "compareTo", byte[].class, byte[].class);
157 r.registerMethodSubstitution(AArch64StringLatin1Substitutions.class, "compareToUTF16", byte[].class, byte[].class);
158 }
159 }
160
161 private static void registerStringUTF16Plugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
162 if (JAVA_SPECIFICATION_VERSION >= 9) {
163 Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
164 r.setAllowOverwrite(true);
165 r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
166 r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
167 }
168 }
169
170 private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
171 Registration r;
172 JavaKind[] unsafeJavaKinds;
173 if (Java8OrEarlier) {
174 r = new Registration(plugins, Unsafe.class);
175 unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
176 } else {
177 r = new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider);
178 unsafeJavaKinds = new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object};
179 }
180
181 for (JavaKind kind : unsafeJavaKinds) {
182 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
183 String kindName = (kind == JavaKind.Object && !Java11OrEarlier) ? "Reference" : kind.name();
184 r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
185 @Override
186 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) {
187 // Emits a null-check for the otherwise unused receiver
188 unsafe.get();
189 b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any()));
190 b.getGraph().markUnsafeAccess();
191 return true;
192 }
193 });
194
195 if (kind != JavaKind.Boolean && kind.isNumericInteger()) {
196 r.register4("getAndAdd" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
197 @Override
198 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) {
199 // Emits a null-check for the otherwise unused receiver
|
151
152 private static void registerStringLatin1Plugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
153 if (JAVA_SPECIFICATION_VERSION >= 9) {
154 Registration r = new Registration(plugins, "java.lang.StringLatin1", replacementsBytecodeProvider);
155 r.setAllowOverwrite(true);
156 r.registerMethodSubstitution(AArch64StringLatin1Substitutions.class, "compareTo", byte[].class, byte[].class);
157 r.registerMethodSubstitution(AArch64StringLatin1Substitutions.class, "compareToUTF16", byte[].class, byte[].class);
158 }
159 }
160
161 private static void registerStringUTF16Plugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
162 if (JAVA_SPECIFICATION_VERSION >= 9) {
163 Registration r = new Registration(plugins, "java.lang.StringUTF16", replacementsBytecodeProvider);
164 r.setAllowOverwrite(true);
165 r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareTo", byte[].class, byte[].class);
166 r.registerMethodSubstitution(AArch64StringUTF16Substitutions.class, "compareToLatin1", byte[].class, byte[].class);
167 }
168 }
169
170 private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementsBytecodeProvider) {
171 registerUnsafePlugins(new Registration(plugins, Unsafe.class), new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object});
172 if (!Java8OrEarlier) {
173 registerUnsafePlugins(new Registration(plugins, "jdk.internal.misc.Unsafe", replacementsBytecodeProvider), new JavaKind[]{JavaKind.Int, JavaKind.Long, JavaKind.Object});
174 }
175 }
176
177 private static void registerUnsafePlugins(Registration r, JavaKind[] unsafeJavaKinds) {
178
179 for (JavaKind kind : unsafeJavaKinds) {
180 Class<?> javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass();
181 String kindName = (kind == JavaKind.Object && !Java11OrEarlier) ? "Reference" : kind.name();
182 r.register4("getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
183 @Override
184 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) {
185 // Emits a null-check for the otherwise unused receiver
186 unsafe.get();
187 b.addPush(kind, new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any()));
188 b.getGraph().markUnsafeAccess();
189 return true;
190 }
191 });
192
193 if (kind != JavaKind.Boolean && kind.isNumericInteger()) {
194 r.register4("getAndAdd" + kindName, Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
195 @Override
196 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) {
197 // Emits a null-check for the otherwise unused receiver
|