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