1 /* 2 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 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 24 25 package org.graalvm.compiler.phases.util; 26 27 import org.graalvm.compiler.core.common.spi.ArrayOffsetProvider; 28 import org.graalvm.compiler.core.common.spi.CodeGenProviders; 29 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider; 30 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider; 31 import org.graalvm.compiler.nodes.spi.LoweringProvider; 32 import org.graalvm.compiler.nodes.spi.Replacements; 33 import org.graalvm.compiler.nodes.spi.StampProvider; 34 import org.graalvm.compiler.phases.tiers.PhaseContext; 35 36 import jdk.vm.ci.code.CodeCacheProvider; 37 import jdk.vm.ci.meta.ConstantReflectionProvider; 38 import jdk.vm.ci.meta.MetaAccessProvider; 39 40 /** 41 * A set of providers, some of which may not be present (i.e., null). 42 */ 43 public class Providers implements CodeGenProviders { 44 45 private final MetaAccessProvider metaAccess; 46 private final CodeCacheProvider codeCache; 47 private final LoweringProvider lowerer; 48 private final ConstantReflectionProvider constantReflection; 49 private final ConstantFieldProvider constantFieldProvider; 50 private final ForeignCallsProvider foreignCalls; 51 private final Replacements replacements; 52 private final StampProvider stampProvider; 53 54 public Providers(MetaAccessProvider metaAccess, CodeCacheProvider codeCache, ConstantReflectionProvider constantReflection, ConstantFieldProvider constantFieldProvider, 55 ForeignCallsProvider foreignCalls, LoweringProvider lowerer, Replacements replacements, StampProvider stampProvider) { 56 this.metaAccess = metaAccess; 57 this.codeCache = codeCache; 58 this.constantReflection = constantReflection; 59 this.constantFieldProvider = constantFieldProvider; 60 this.foreignCalls = foreignCalls; 61 this.lowerer = lowerer; 62 this.replacements = replacements; 63 this.stampProvider = stampProvider; 64 } 65 66 public Providers(Providers copyFrom) { 67 this(copyFrom.getMetaAccess(), copyFrom.getCodeCache(), copyFrom.getConstantReflection(), copyFrom.getConstantFieldProvider(), copyFrom.getForeignCalls(), copyFrom.getLowerer(), 68 copyFrom.getReplacements(), copyFrom.getStampProvider()); 69 } 70 71 public Providers(PhaseContext copyFrom) { 72 this(copyFrom.getMetaAccess(), null, copyFrom.getConstantReflection(), copyFrom.getConstantFieldProvider(), null, copyFrom.getLowerer(), copyFrom.getReplacements(), 73 copyFrom.getStampProvider()); 74 } 75 76 @Override 77 public MetaAccessProvider getMetaAccess() { 78 return metaAccess; 79 } 80 81 @Override 82 public CodeCacheProvider getCodeCache() { 83 return codeCache; 84 } 85 86 @Override 87 public ForeignCallsProvider getForeignCalls() { 88 return foreignCalls; 89 } 90 91 public LoweringProvider getLowerer() { 92 return lowerer; 93 } 94 95 @Override 96 public ArrayOffsetProvider getArrayOffsetProvider() { 97 return lowerer; 98 } 99 100 @Override 101 public ConstantReflectionProvider getConstantReflection() { 102 return constantReflection; 103 } 104 105 public ConstantFieldProvider getConstantFieldProvider() { 106 return constantFieldProvider; 107 } 108 109 public Replacements getReplacements() { 110 return replacements; 111 } 112 113 public StampProvider getStampProvider() { 114 return stampProvider; 115 } 116 117 public Providers copyWith(MetaAccessProvider substitution) { 118 return new Providers(substitution, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider); 119 } 120 121 public Providers copyWith(CodeCacheProvider substitution) { 122 return new Providers(metaAccess, substitution, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider); 123 } 124 125 public Providers copyWith(ConstantReflectionProvider substitution) { 126 return new Providers(metaAccess, codeCache, substitution, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider); 127 } 128 129 public Providers copyWith(ConstantFieldProvider substitution) { 130 return new Providers(metaAccess, codeCache, constantReflection, substitution, foreignCalls, lowerer, replacements, stampProvider); 131 } 132 133 public Providers copyWith(ForeignCallsProvider substitution) { 134 return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, substitution, lowerer, replacements, stampProvider); 135 } 136 137 public Providers copyWith(LoweringProvider substitution) { 138 return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, substitution, replacements, stampProvider); 139 } 140 141 public Providers copyWith(Replacements substitution) { 142 return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, substitution, stampProvider); 143 } 144 145 public Providers copyWith(StampProvider substitution) { 146 return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, substitution); 147 } 148 }