HotSpotClassInitializationPlugin.java revision 12657:6ef01bd40ce2
1298948Sadrian/*
2298948Sadrian * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3298948Sadrian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4298948Sadrian *
5298948Sadrian * This code is free software; you can redistribute it and/or modify it
6298948Sadrian * under the terms of the GNU General Public License version 2 only, as
7298948Sadrian * published by the Free Software Foundation.
8298948Sadrian *
9298948Sadrian * This code is distributed in the hope that it will be useful, but WITHOUT
10298948Sadrian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11298948Sadrian * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12298948Sadrian * version 2 for more details (a copy is included in the LICENSE file that
13298948Sadrian * accompanied this code).
14298948Sadrian *
15298948Sadrian * You should have received a copy of the GNU General Public License version
16298948Sadrian * 2 along with this work; if not, write to the Free Software Foundation,
17298948Sadrian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18298948Sadrian *
19298948Sadrian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20298948Sadrian * or visit www.oracle.com if you need additional information or have any
21298948Sadrian * questions.
22298948Sadrian */
23298948Sadrianpackage org.graalvm.compiler.hotspot.meta;
24298948Sadrian
25298948Sadrianimport org.graalvm.compiler.core.common.type.ObjectStamp;
26298948Sadrianimport org.graalvm.compiler.core.common.type.Stamp;
27298948Sadrianimport org.graalvm.compiler.core.common.type.StampFactory;
28298948Sadrianimport org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
29298948Sadrianimport org.graalvm.compiler.nodes.ConstantNode;
30298948Sadrianimport org.graalvm.compiler.nodes.FrameState;
31298948Sadrianimport org.graalvm.compiler.nodes.ValueNode;
32298948Sadrianimport org.graalvm.compiler.nodes.graphbuilderconf.ClassInitializationPlugin;
33298948Sadrianimport org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
34298948Sadrian
35298948Sadrianimport jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
36298948Sadrianimport jdk.vm.ci.meta.ResolvedJavaMethod;
37298948Sadrianimport jdk.vm.ci.meta.ResolvedJavaType;
38298948Sadrian
39298948Sadrianpublic final class HotSpotClassInitializationPlugin implements ClassInitializationPlugin {
40298948Sadrian    @Override
41298948Sadrian    public boolean shouldApply(GraphBuilderContext builder, ResolvedJavaType type) {
42298948Sadrian        if (!builder.parsingIntrinsic()) {
43298948Sadrian            ResolvedJavaMethod method = builder.getGraph().method();
44298948Sadrian            ResolvedJavaType methodHolder = method.getDeclaringClass();
45298948Sadrian            // We can elide initialization nodes if type >=: methodHolder.
46298948Sadrian            // The type is already initialized by either "new" or "invokestatic".
47298948Sadrian
48298948Sadrian            // Emit initialization node if type is an interface since:
49298948Sadrian            // JLS 12.4: Before a class is initialized, its direct superclass must be initialized,
50298948Sadrian            // but interfaces implemented by the class are not initialized.
51298948Sadrian            // and a class or interface type T will be initialized immediately
52298948Sadrian            // before the first occurrence of accesses listed in JLS 12.4.1.
53299752Sadrian
54299752Sadrian            return !type.isAssignableFrom(methodHolder) || type.isInterface();
55299752Sadrian        }
56298948Sadrian        return false;
57298948Sadrian    }
58298948Sadrian
59298948Sadrian    @Override
60298948Sadrian    public ValueNode apply(GraphBuilderContext builder, ResolvedJavaType type, FrameState frameState) {
61298948Sadrian        assert shouldApply(builder, type);
62298948Sadrian        Stamp hubStamp = builder.getStampProvider().createHubStamp((ObjectStamp) StampFactory.objectNonNull());
63298948Sadrian        ConstantNode hub = builder.append(ConstantNode.forConstant(hubStamp, ((HotSpotResolvedObjectType) type).klass(), builder.getMetaAccess(), builder.getGraph()));
64298948Sadrian        InitializeKlassNode initialize = builder.append(new InitializeKlassNode(hub));
65298948Sadrian        initialize.setStateBefore(frameState);
66298948Sadrian        return initialize;
67298948Sadrian    }
68298948Sadrian}
69299752Sadrian