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 */ 23 package org.graalvm.compiler.hotspot.meta; 24 25 import org.graalvm.compiler.core.common.spi.JavaConstantFieldProvider; 26 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; 27 28 import jdk.vm.ci.hotspot.HotSpotResolvedJavaField; 29 import jdk.vm.ci.meta.MetaAccessProvider; 30 import jdk.vm.ci.meta.ResolvedJavaField; 31 import jdk.vm.ci.meta.ResolvedJavaType; 32 33 /** 34 * Implements the default constant folding semantics for Java fields in the HotSpot VM. 35 */ 36 public class HotSpotConstantFieldProvider extends JavaConstantFieldProvider { 37 38 private final GraalHotSpotVMConfig config; 39 40 public HotSpotConstantFieldProvider(GraalHotSpotVMConfig config, MetaAccessProvider metaAccess) { 41 super(metaAccess); 42 this.config = config; 43 } 44 45 @Override 46 protected boolean isStableField(ResolvedJavaField field, ConstantFieldTool<?> tool) { 47 if (!config.foldStableValues) { 48 return false; 49 } 50 if (field.isStatic() && !isStaticFieldConstant(field)) { 51 return false; 52 } 53 54 if (((HotSpotResolvedJavaField) field).isStable()) { 55 return true; 56 } 57 return super.isStableField(field, tool); 58 } 59 60 @Override 61 protected boolean isFinalField(ResolvedJavaField field, ConstantFieldTool<?> tool) { 62 if (field.isStatic() && !isStaticFieldConstant(field)) { 63 return false; 64 } 65 66 return super.isFinalField(field, tool); 67 } 68 69 private static final String SystemClassName = "Ljava/lang/System;"; 70 71 protected boolean isStaticFieldConstant(ResolvedJavaField field) { 72 ResolvedJavaType declaringClass = field.getDeclaringClass(); 73 return declaringClass.isInitialized() && !declaringClass.getName().equals(SystemClassName); 74 } 75 } | 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 */ 23 package org.graalvm.compiler.hotspot.meta; 24 25 import org.graalvm.compiler.core.common.spi.JavaConstantFieldProvider; 26 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; 27 import org.graalvm.compiler.options.OptionValues; 28 29 import jdk.vm.ci.hotspot.HotSpotResolvedJavaField; 30 import jdk.vm.ci.meta.MetaAccessProvider; 31 import jdk.vm.ci.meta.ResolvedJavaField; 32 import jdk.vm.ci.meta.ResolvedJavaType; 33 34 /** 35 * Implements the default constant folding semantics for Java fields in the HotSpot VM. 36 */ 37 public class HotSpotConstantFieldProvider extends JavaConstantFieldProvider { 38 39 private final GraalHotSpotVMConfig config; 40 41 public HotSpotConstantFieldProvider(GraalHotSpotVMConfig config, MetaAccessProvider metaAccess) { 42 super(metaAccess); 43 this.config = config; 44 } 45 46 @Override 47 protected boolean isStableField(ResolvedJavaField field, ConstantFieldTool<?> tool) { 48 if (!config.foldStableValues) { 49 return false; 50 } 51 if (field.isStatic() && !isStaticFieldConstant(field, tool.getOptions())) { 52 return false; 53 } 54 55 if (((HotSpotResolvedJavaField) field).isStable()) { 56 return true; 57 } 58 return super.isStableField(field, tool); 59 } 60 61 @Override 62 protected boolean isFinalField(ResolvedJavaField field, ConstantFieldTool<?> tool) { 63 if (field.isStatic() && !isStaticFieldConstant(field, tool.getOptions())) { 64 return false; 65 } 66 67 return super.isFinalField(field, tool); 68 } 69 70 private static final String SystemClassName = "Ljava/lang/System;"; 71 72 protected boolean isStaticFieldConstant(ResolvedJavaField field, @SuppressWarnings("unused") OptionValues options) { 73 ResolvedJavaType declaringClass = field.getDeclaringClass(); 74 return declaringClass.isInitialized() && !declaringClass.getName().equals(SystemClassName); 75 } 76 } |