annotate jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMetaAccessProvider.java @ 22679:4688478ecb7b

Make space in frame for native callee to spill outgoing parameters
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 13 Oct 2015 17:07:59 +0200
parents 1bbd4a7c274b
children 2d1ca131b8be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1 /*
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
2 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
4 *
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
8 *
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
13 * accompanied this code).
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
14 *
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
18 *
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
21 * questions.
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
22 */
22672
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
23 package jdk.vm.ci.hotspot;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
24
22672
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
26 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
27 import static jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.fromObjectClass;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
28 import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
29
22569
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
30 import java.lang.reflect.Array;
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
31 import java.lang.reflect.Constructor;
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
32 import java.lang.reflect.Executable;
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
33 import java.lang.reflect.Field;
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
34 import java.lang.reflect.Method;
ec96f33a101d updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22555
diff changeset
35 import java.lang.reflect.Modifier;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
36
22672
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
37 import jdk.vm.ci.code.CodeUtil;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
38 import jdk.vm.ci.code.TargetDescription;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
39 import jdk.vm.ci.common.JVMCIError;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
40 import jdk.vm.ci.meta.DeoptimizationAction;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
41 import jdk.vm.ci.meta.DeoptimizationReason;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
42 import jdk.vm.ci.meta.JavaConstant;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
43 import jdk.vm.ci.meta.JavaKind;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
44 import jdk.vm.ci.meta.JavaType;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
45 import jdk.vm.ci.meta.MetaAccessProvider;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
46 import jdk.vm.ci.meta.ResolvedJavaField;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
47 import jdk.vm.ci.meta.ResolvedJavaMethod;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
48 import jdk.vm.ci.meta.ResolvedJavaType;
1bbd4a7c274b Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22570
diff changeset
49 import jdk.vm.ci.meta.Signature;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
50
21665
6166968c6359 Add missing JaCoCo excludes
Josef Eisl <josef.eisl@jku.at>
parents: 21556
diff changeset
51 // JaCoCo Exclude
6166968c6359 Add missing JaCoCo excludes
Josef Eisl <josef.eisl@jku.at>
parents: 21556
diff changeset
52
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
53 /**
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
54 * HotSpot implementation of {@link MetaAccessProvider}.
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
55 */
18867
7f4cb7587f4c localized replay compilation marker interface to HotSpot specific code
Doug Simon <doug.simon@oracle.com>
parents: 18544
diff changeset
56 public class HotSpotMetaAccessProvider implements MetaAccessProvider, HotSpotProxified {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
57
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
58 protected final HotSpotJVMCIRuntimeProvider runtime;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
59
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
60 public HotSpotMetaAccessProvider(HotSpotJVMCIRuntimeProvider runtime) {
12431
7080a96be216 rename: graalRuntime -> runtime, getGraalRuntime -> getRuntime
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
61 this.runtime = runtime;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
62 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
63
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
64 public ResolvedJavaType lookupJavaType(Class<?> clazz) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
65 if (clazz == null) {
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
66 throw new IllegalArgumentException("Class parameter was null");
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
67 }
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
68 return runtime.fromClass(clazz);
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
69 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
70
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
71 public HotSpotResolvedObjectType lookupJavaType(JavaConstant constant) {
15909
e43591136d9f Support for compressed constants.
Roland Schatz <roland.schatz@oracle.com>
parents: 15291
diff changeset
72 if (constant.isNull() || !(constant instanceof HotSpotObjectConstant)) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
73 return null;
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
74 }
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
75 return ((HotSpotObjectConstant) constant).getType();
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
76 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
77
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
78 public Signature parseMethodDescriptor(String signature) {
18540
21384a8fbb64 removed static accesses to HotSpotGraalRuntime from some HotSpot meta API classes
Doug Simon <doug.simon@oracle.com>
parents: 18530
diff changeset
79 return new HotSpotSignature(runtime, signature);
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
80 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
81
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
82 /**
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
83 * {@link Field} object of {@link Method#slot}.
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
84 */
22531
99dc98466321 removed no longer necessary applications of @SuppressWarnings("javadoc")
Doug Simon <doug.simon@oracle.com>
parents: 22454
diff changeset
85 private Field reflectionMethodSlot = getReflectionSlotField(Method.class);
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
86
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
87 /**
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
88 * {@link Field} object of {@link Constructor#slot}.
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
89 */
22531
99dc98466321 removed no longer necessary applications of @SuppressWarnings("javadoc")
Doug Simon <doug.simon@oracle.com>
parents: 22454
diff changeset
90 private Field reflectionConstructorSlot = getReflectionSlotField(Constructor.class);
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
91
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
92 private static Field getReflectionSlotField(Class<?> reflectionClass) {
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
93 try {
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
94 Field field = reflectionClass.getDeclaredField("slot");
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
95 field.setAccessible(true);
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
96 return field;
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
97 } catch (NoSuchFieldException | SecurityException e) {
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
98 throw new JVMCIError(e);
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
99 }
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
100 }
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
101
18373
91283d4a1218 Use the base class Executable (introduced in Java 8) to unify the handling of Method and Constructor in MetaAccessProvider
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18290
diff changeset
102 public ResolvedJavaMethod lookupJavaMethod(Executable reflectionMethod) {
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
103 try {
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
104 Class<?> holder = reflectionMethod.getDeclaringClass();
18373
91283d4a1218 Use the base class Executable (introduced in Java 8) to unify the handling of Method and Constructor in MetaAccessProvider
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18290
diff changeset
105 Field slotField = reflectionMethod instanceof Constructor ? reflectionConstructorSlot : reflectionMethodSlot;
91283d4a1218 Use the base class Executable (introduced in Java 8) to unify the handling of Method and Constructor in MetaAccessProvider
Christian Wimmer <christian.wimmer@oracle.com>
parents: 18290
diff changeset
106 final int slot = slotField.getInt(reflectionMethod);
22454
76af33d4d504 Make jvmci redefinition safe
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22422
diff changeset
107 return runtime.getCompilerToVM().getResolvedJavaMethodAtSlot(holder, slot);
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
108 } catch (IllegalArgumentException | IllegalAccessException e) {
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
109 throw new JVMCIError(e);
13264
b23cbfb4366a merged CompilerToVM.getMetaspaceConstructor into CompilerToVM.getMetaspaceMethod
twisti
parents: 13263
diff changeset
110 }
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
111 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
112
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
113 public ResolvedJavaField lookupJavaField(Field reflectionField) {
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
114 String name = reflectionField.getName();
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
115 Class<?> fieldHolder = reflectionField.getDeclaringClass();
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
116 Class<?> fieldType = reflectionField.getType();
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
117 // java.lang.reflect.Field's modifiers should be enough here since VM internal modifier bits
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
118 // are not used (yet).
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
119 final int modifiers = reflectionField.getModifiers();
22542
15579668ec3a renamed constant field to UNSAFE
Doug Simon <doug.simon@oracle.com>
parents: 22541
diff changeset
120 final long offset = Modifier.isStatic(modifiers) ? UNSAFE.staticFieldOffset(reflectionField) : UNSAFE.objectFieldOffset(reflectionField);
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
121
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
122 HotSpotResolvedObjectType holder = fromObjectClass(fieldHolder);
22422
a98a02bad801 Add simple interface to control caching policy for ResolvedJavaTypes
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22054
diff changeset
123 JavaType type = runtime.fromClass(fieldType);
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
124
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
125 if (offset != -1) {
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
126 HotSpotResolvedObjectType resolved = holder;
14012
1f34717ccafa remove CompilerToVM.getInstanceFields
twisti
parents: 13966
diff changeset
127 return resolved.createField(name, type, offset, modifiers);
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
128 } else {
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
129 throw new JVMCIError("unresolved field %s", reflectionField);
13263
81055aacb98d removed CompilerToVM.getJavaField
twisti
parents: 13257
diff changeset
130 }
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
131 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
132
12757
a36839dafe50 Remove some useless short casts, synchronize deoptimization.hpp with HotSpotMetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12719
diff changeset
133 private static int intMaskRight(int n) {
a36839dafe50 Remove some useless short casts, synchronize deoptimization.hpp with HotSpotMetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12719
diff changeset
134 assert n <= 32;
a36839dafe50 Remove some useless short casts, synchronize deoptimization.hpp with HotSpotMetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12719
diff changeset
135 return n == 32 ? -1 : (1 << n) - 1;
a36839dafe50 Remove some useless short casts, synchronize deoptimization.hpp with HotSpotMetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12719
diff changeset
136 }
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
137
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
138 @Override
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
139 public JavaConstant encodeDeoptActionAndReason(DeoptimizationAction action, DeoptimizationReason reason, int debugId) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
140 HotSpotVMConfig config = runtime.getConfig();
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
141 int actionValue = convertDeoptAction(action);
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
142 int reasonValue = convertDeoptReason(reason);
13677
45fcb3ec0d43 Rename more 'speculation id' to 'debug id'. Add decodeDebugId to MetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13641
diff changeset
143 int debugValue = debugId & intMaskRight(config.deoptimizationDebugIdBits);
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
144 JavaConstant c = JavaConstant.forInt(~((debugValue << config.deoptimizationDebugIdShift) | (reasonValue << config.deoptimizationReasonShift) | (actionValue << config.deoptimizationActionShift)));
12717
dd856c84a75c Mask the speculation id correctly in HotSpotMetaAccessProvider.encodeDeoptActionAndReason
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12699
diff changeset
145 assert c.asInt() < 0;
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
146 return c;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
147 }
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
148
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
149 public DeoptimizationReason decodeDeoptReason(JavaConstant constant) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
150 HotSpotVMConfig config = runtime.getConfig();
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
151 int reasonValue = ((~constant.asInt()) >> config.deoptimizationReasonShift) & intMaskRight(config.deoptimizationReasonBits);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
152 DeoptimizationReason reason = convertDeoptReason(reasonValue);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
153 return reason;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
154 }
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
155
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
156 public DeoptimizationAction decodeDeoptAction(JavaConstant constant) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
157 HotSpotVMConfig config = runtime.getConfig();
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
158 int actionValue = ((~constant.asInt()) >> config.deoptimizationActionShift) & intMaskRight(config.deoptimizationActionBits);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
159 DeoptimizationAction action = convertDeoptAction(actionValue);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
160 return action;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
161 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
162
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
163 public int decodeDebugId(JavaConstant constant) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
164 HotSpotVMConfig config = runtime.getConfig();
13677
45fcb3ec0d43 Rename more 'speculation id' to 'debug id'. Add decodeDebugId to MetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13641
diff changeset
165 return ((~constant.asInt()) >> config.deoptimizationDebugIdShift) & intMaskRight(config.deoptimizationDebugIdBits);
12699
38b84d5a66fd Start passing down a 'speculation id' to deoptimizations.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12484
diff changeset
166 }
38b84d5a66fd Start passing down a 'speculation id' to deoptimizations.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12484
diff changeset
167
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
168 public int convertDeoptAction(DeoptimizationAction action) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
169 HotSpotVMConfig config = runtime.getConfig();
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
170 switch (action) {
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
171 case None:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
172 return config.deoptActionNone;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
173 case RecompileIfTooManyDeopts:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
174 return config.deoptActionMaybeRecompile;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
175 case InvalidateReprofile:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
176 return config.deoptActionReinterpret;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
177 case InvalidateRecompile:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
178 return config.deoptActionMakeNotEntrant;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
179 case InvalidateStopCompiling:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
180 return config.deoptActionMakeNotCompilable;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
181 default:
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
182 throw new JVMCIError("%s", action);
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
183 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
184 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
185
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
186 public DeoptimizationAction convertDeoptAction(int action) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
187 HotSpotVMConfig config = runtime.getConfig();
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
188 if (action == config.deoptActionNone) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
189 return DeoptimizationAction.None;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
190 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
191 if (action == config.deoptActionMaybeRecompile) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
192 return DeoptimizationAction.RecompileIfTooManyDeopts;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
193 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
194 if (action == config.deoptActionReinterpret) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
195 return DeoptimizationAction.InvalidateReprofile;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
196 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
197 if (action == config.deoptActionMakeNotEntrant) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
198 return DeoptimizationAction.InvalidateRecompile;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
199 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
200 if (action == config.deoptActionMakeNotCompilable) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
201 return DeoptimizationAction.InvalidateStopCompiling;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
202 }
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
203 throw new JVMCIError("%d", action);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
204 }
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
205
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
206 public int convertDeoptReason(DeoptimizationReason reason) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
207 HotSpotVMConfig config = runtime.getConfig();
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
208 switch (reason) {
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
209 case None:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
210 return config.deoptReasonNone;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
211 case NullCheckException:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
212 return config.deoptReasonNullCheck;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
213 case BoundsCheckException:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
214 return config.deoptReasonRangeCheck;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
215 case ClassCastException:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
216 return config.deoptReasonClassCheck;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
217 case ArrayStoreException:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
218 return config.deoptReasonArrayCheck;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
219 case UnreachedCode:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
220 return config.deoptReasonUnreached0;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
221 case TypeCheckedInliningViolated:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
222 return config.deoptReasonTypeCheckInlining;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
223 case OptimizedTypeCheckViolated:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
224 return config.deoptReasonOptimizedTypeCheck;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
225 case NotCompiledExceptionHandler:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
226 return config.deoptReasonNotCompiledExceptionHandler;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
227 case Unresolved:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
228 return config.deoptReasonUnresolved;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
229 case JavaSubroutineMismatch:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
230 return config.deoptReasonJsrMismatch;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
231 case ArithmeticException:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
232 return config.deoptReasonDiv0Check;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
233 case RuntimeConstraint:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
234 return config.deoptReasonConstraint;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
235 case LoopLimitCheck:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
236 return config.deoptReasonLoopLimitCheck;
13155
1dd9aa5a9ee5 Deoptimization reason for failed aliasing assumptions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12757
diff changeset
237 case Aliasing:
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
238 return config.deoptReasonAliasing;
16535
ada0a7729b6f Truffle: introduce debug option to print the stack trace when transferring to the interpreter
Andreas Woess <andreas.woess@jku.at>
parents: 15909
diff changeset
239 case TransferToInterpreter:
ada0a7729b6f Truffle: introduce debug option to print the stack trace when transferring to the interpreter
Andreas Woess <andreas.woess@jku.at>
parents: 15909
diff changeset
240 return config.deoptReasonTransferToInterpreter;
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
241 default:
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
242 throw new JVMCIError("%s", reason);
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
243 }
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
244 }
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
245
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
246 public DeoptimizationReason convertDeoptReason(int reason) {
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
247 HotSpotVMConfig config = runtime.getConfig();
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
248 if (reason == config.deoptReasonNone) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
249 return DeoptimizationReason.None;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
250 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
251 if (reason == config.deoptReasonNullCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
252 return DeoptimizationReason.NullCheckException;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
253 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
254 if (reason == config.deoptReasonRangeCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
255 return DeoptimizationReason.BoundsCheckException;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
256 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
257 if (reason == config.deoptReasonClassCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
258 return DeoptimizationReason.ClassCastException;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
259 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
260 if (reason == config.deoptReasonArrayCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
261 return DeoptimizationReason.ArrayStoreException;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
262 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
263 if (reason == config.deoptReasonUnreached0) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
264 return DeoptimizationReason.UnreachedCode;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
265 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
266 if (reason == config.deoptReasonTypeCheckInlining) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
267 return DeoptimizationReason.TypeCheckedInliningViolated;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
268 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
269 if (reason == config.deoptReasonOptimizedTypeCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
270 return DeoptimizationReason.OptimizedTypeCheckViolated;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
271 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
272 if (reason == config.deoptReasonNotCompiledExceptionHandler) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
273 return DeoptimizationReason.NotCompiledExceptionHandler;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
274 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
275 if (reason == config.deoptReasonUnresolved) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
276 return DeoptimizationReason.Unresolved;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
277 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
278 if (reason == config.deoptReasonJsrMismatch) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
279 return DeoptimizationReason.JavaSubroutineMismatch;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
280 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
281 if (reason == config.deoptReasonDiv0Check) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
282 return DeoptimizationReason.ArithmeticException;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
283 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
284 if (reason == config.deoptReasonConstraint) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
285 return DeoptimizationReason.RuntimeConstraint;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
286 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
287 if (reason == config.deoptReasonLoopLimitCheck) {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
288 return DeoptimizationReason.LoopLimitCheck;
13257
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
289 }
4eacfd0767ed get deoptimization constants in HotSpotMetaAccessProvider from HotSpotVMConfig
twisti
parents: 13155
diff changeset
290 if (reason == config.deoptReasonAliasing) {
13155
1dd9aa5a9ee5 Deoptimization reason for failed aliasing assumptions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12757
diff changeset
291 return DeoptimizationReason.Aliasing;
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
292 }
16535
ada0a7729b6f Truffle: introduce debug option to print the stack trace when transferring to the interpreter
Andreas Woess <andreas.woess@jku.at>
parents: 15909
diff changeset
293 if (reason == config.deoptReasonTransferToInterpreter) {
ada0a7729b6f Truffle: introduce debug option to print the stack trace when transferring to the interpreter
Andreas Woess <andreas.woess@jku.at>
parents: 15909
diff changeset
294 return DeoptimizationReason.TransferToInterpreter;
ada0a7729b6f Truffle: introduce debug option to print the stack trace when transferring to the interpreter
Andreas Woess <andreas.woess@jku.at>
parents: 15909
diff changeset
295 }
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
296 throw new JVMCIError("%x", reason);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12431
diff changeset
297 }
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
298
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
299 @Override
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18167
diff changeset
300 public long getMemorySize(JavaConstant constant) {
22536
dc1aeef79e7e Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents: 22531
diff changeset
301 if (constant.getJavaKind() == JavaKind.Object) {
18544
17b5e453ab41 replaced concrete types with interface types to support replay compilation
Doug Simon <doug.simon@oracle.com>
parents: 18540
diff changeset
302 HotSpotResolvedObjectType lookupJavaType = lookupJavaType(constant);
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
303
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
304 if (lookupJavaType == null) {
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
305 return 0;
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
306 } else {
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
307 if (lookupJavaType.isArray()) {
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
308 // TODO(tw): Add compressed pointer support.
18290
e7d219e9d01f removed HotSpotObjectConstantImpl.asObject()
Doug Simon <doug.simon@oracle.com>
parents: 18262
diff changeset
309 int length = Array.getLength(((HotSpotObjectConstantImpl) constant).object());
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
310 ResolvedJavaType elementType = lookupJavaType.getComponentType();
22536
dc1aeef79e7e Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents: 22531
diff changeset
311 JavaKind elementKind = elementType.getJavaKind();
22555
2fe06375f2d3 made HotSpotJVMCIRuntimeProvider.getArrayBaseOffset and HotSpotJVMCIRuntimeProvider.getArrayIndexScale static
Doug Simon <doug.simon@oracle.com>
parents: 22542
diff changeset
312 final int headerSize = getArrayBaseOffset(elementKind);
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
313 TargetDescription target = runtime.getHostJVMCIBackend().getTarget();
22570
425950fdcccb Use arrayIndexScale instead of element size to calculate memory consumption of arrays.
Roland Schatz <roland.schatz@oracle.com>
parents: 22569
diff changeset
314 int sizeOfElement = getArrayIndexScale(elementKind);
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
315 int alignment = target.wordSize;
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
316 int log2ElementSize = CodeUtil.log2(sizeOfElement);
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
317 return computeArrayAllocationSize(length, alignment, headerSize, log2ElementSize);
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
318 }
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
319 return lookupJavaType.instanceSize();
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
320 }
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
321 } else {
22536
dc1aeef79e7e Refactoring: Rename Kind to JavaKind.
Roland Schatz <roland.schatz@oracle.com>
parents: 22531
diff changeset
322 return constant.getJavaKind().getByteCount();
13966
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
323 }
be0d961e3a88 New methods for querying memory usage of individual objects and object graphs in Graal API (MetaAccessProvider#getMemorySize, MetaUtil#getMemorySizeRecursive).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 13677
diff changeset
324 }
21552
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
325
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
326 /**
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
327 * Computes the size of the memory chunk allocated for an array. This size accounts for the
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
328 * array header size, body size and any padding after the last element to satisfy object
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
329 * alignment requirements.
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
330 *
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
331 * @param length the number of elements in the array
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
332 * @param alignment the object alignment requirement
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
333 * @param headerSize the size of the array header
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
334 * @param log2ElementSize log2 of the size of an element in the array
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
335 */
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
336 public static int computeArrayAllocationSize(int length, int alignment, int headerSize, int log2ElementSize) {
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
337 int size = (length << log2ElementSize) + headerSize + (alignment - 1);
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
338 int mask = ~(alignment - 1);
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
339 return size & mask;
9579a3c62a9e use skeleton findbugs jar containing only SuppresFBWarnings to avoid external dependency for JVMCI classes (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 18867
diff changeset
340 }
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
341 }