Mercurial > hg > truffle
changeset 9919:af909f4b80a9
options are grouped per top level class/interface when accessed via the service mechanism
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 06 Jun 2013 23:16:45 +0200 |
parents | ab90954e5fec |
children | 44fcf49b746f |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotOptions.java graal/com.oracle.graal.options/src/com/oracle/graal/options/Option.java graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionDescriptor.java graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProvider.java graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionValue.java graal/com.oracle.graal.options/src/com/oracle/graal/options/Options.java graal/com.oracle.graal.options/src/com/oracle/graal/options/StableOptionValue.java make/build-graal.xml |
diffstat | 9 files changed, 270 insertions(+), 276 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotOptions.java Thu Jun 06 21:22:43 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotOptions.java Thu Jun 06 23:16:45 2013 +0200 @@ -30,15 +30,17 @@ public class HotSpotOptions { - private static final Map<String, OptionProvider> options = new HashMap<>(); + private static final Map<String, OptionDescriptor> options = new HashMap<>(); static { - ServiceLoader<OptionProvider> sl = ServiceLoader.loadInstalled(OptionProvider.class); - for (OptionProvider provider : sl) { - if (provider.getClass().getName().startsWith("com.oracle.graal")) { - String name = provider.getName(); - OptionProvider existing = options.put(name, provider); - assert existing == null : name + " option has multiple definitions: " + existing.getClass() + " and " + provider.getClass(); + ServiceLoader<Options> sl = ServiceLoader.loadInstalled(Options.class); + for (Options opts : sl) { + for (OptionDescriptor desc : opts) { + if (desc.getClass().getName().startsWith("com.oracle.graal")) { + String name = desc.getName(); + OptionDescriptor existing = options.put(name, desc); + assert existing == null : "Option named \"" + name + "\" has multiple definitions: " + existing.getLocation() + " and " + desc.getLocation(); + } } } } @@ -73,13 +75,13 @@ } } - OptionProvider optionProvider = options.get(optionName); - if (optionProvider == null) { + OptionDescriptor desc = options.get(optionName); + if (desc == null) { Logger.info("Could not find option " + optionName + " (use -G:+PrintFlags to see Graal options)"); return false; } - Class<?> optionType = optionProvider.getType(); + Class<?> optionType = desc.getType(); if (value == null) { if (optionType == Boolean.TYPE || optionType == Boolean.class) { @@ -109,7 +111,7 @@ } if (value != null) { - OptionValue<?> optionValue = optionProvider.getOptionValue(); + OptionValue<?> optionValue = desc.getOptionValue(); optionValue.setValue(value); // Logger.info("Set option " + fieldName + " to " + value); } else { @@ -122,12 +124,12 @@ private static void printFlags() { Logger.info("[Graal flags]"); - SortedMap<String, OptionProvider> sortedOptions = new TreeMap<>(options); - for (Map.Entry<String, OptionProvider> e : sortedOptions.entrySet()) { + SortedMap<String, OptionDescriptor> sortedOptions = new TreeMap<>(options); + for (Map.Entry<String, OptionDescriptor> e : sortedOptions.entrySet()) { e.getKey(); - OptionProvider opt = e.getValue(); - Object value = opt.getOptionValue().getValue(); - Logger.info(String.format("%9s %-40s = %-14s %s", opt.getType().getSimpleName(), e.getKey(), value, opt.getHelp())); + OptionDescriptor desc = e.getValue(); + Object value = desc.getOptionValue().getValue(); + Logger.info(String.format("%9s %-40s = %-14s %s", desc.getType().getSimpleName(), e.getKey(), value, desc.getHelp())); } System.exit(0);
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/Option.java Thu Jun 06 21:22:43 2013 +0200 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/Option.java Thu Jun 06 23:16:45 2013 +0200 @@ -27,6 +27,9 @@ /** * Describes the attributes of an option whose {@link OptionValue value} is in a static field * annotated by this annotation type. + * + * @see OptionProcessor + * @see OptionDescriptor */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.FIELD)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionDescriptor.java Thu Jun 06 23:16:45 2013 +0200 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.options; + +/** + * Describes the attributes of a static field {@linkplain Option option} and provides access to its + * {@linkplain OptionValue value}. + */ +public class OptionDescriptor { + + protected final String name; + protected final Class type; + protected final String help; + protected final OptionValue<?> option; + protected final String location; + + public OptionDescriptor(String name, Class type, String help, String location, OptionValue<?> option) { + this.name = name; + this.type = type; + this.help = help; + this.option = option; + this.location = location; + } + + /** + * Gets the type of values stored in the option. + */ + public Class getType() { + return type; + } + + /** + * Gets a descriptive help message for the option. + */ + public String getHelp() { + return help; + } + + /** + * Gets the name of the option. It's up to the client of this object how to use the name to get + * a user specified value for the option from the environment. + */ + public String getName() { + return name; + } + + /** + * Gets the boxed option value. + */ + public OptionValue<?> getOptionValue() { + return option; + } + + /** + * Gets a description of the location where this option is stored. + */ + public String getLocation() { + return location; + + } +}
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java Thu Jun 06 21:22:43 2013 +0200 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProcessor.java Thu Jun 06 23:16:45 2013 +0200 @@ -23,26 +23,25 @@ package com.oracle.graal.options; import java.io.*; -import java.lang.reflect.*; import java.util.*; import javax.annotation.processing.*; import javax.lang.model.*; import javax.lang.model.element.*; -import javax.lang.model.element.Modifier; import javax.lang.model.type.*; import javax.lang.model.util.*; import javax.tools.Diagnostic.Kind; import javax.tools.*; /** - * Processes static fields annotated with {@link Option}. An {@link OptionProvider} is generated for - * each such field that can be accessed as a {@linkplain ServiceLoader service} as follows: + * Processes static fields annotated with {@link Option}. An {@link Options} service is generated + * for each top level class containing at least one such field. These service objects can be + * retrieved as follows: * * <pre> - * ServiceLoader<OptionProvider> sl = ServiceLoader.loadInstalled(OptionProvider.class); - * for (OptionProvider provider : sl) { - * // use provider + * ServiceLoader<Options> sl = ServiceLoader.loadInstalled(Options.class); + * for (OptionDescriptor desc : sl) { + * // use desc * } * </pre> */ @@ -52,11 +51,7 @@ private final Set<Element> processed = new HashSet<>(); - private void processElement(Element element) { - if (processed.contains(element)) { - return; - } - processed.add(element); + private void processElement(Element element, OptionsInfo info) { if (!element.getModifiers().contains(Modifier.STATIC)) { processingEnv.getMessager().printMessage(Kind.ERROR, "Option field must be static", element); @@ -102,74 +97,92 @@ optionType = optionType.substring("java.lang.".length()); } - String pkg = null; Element enclosing = element.getEnclosingElement(); String declaringClass = ""; String separator = ""; - List<Element> originatingElementsList = new ArrayList<>(); + Set<Element> originatingElementsList = info.originatingElements; originatingElementsList.add(field); while (enclosing != null) { - originatingElementsList.add(enclosing); if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE) { if (enclosing.getModifiers().contains(Modifier.PRIVATE)) { String msg = String.format("Option field cannot be declared in a private %s %s", enclosing.getKind().name().toLowerCase(), enclosing); processingEnv.getMessager().printMessage(Kind.ERROR, msg, element); return; } + originatingElementsList.add(enclosing); declaringClass = enclosing.getSimpleName() + separator + declaringClass; separator = "."; } else { assert enclosing.getKind() == ElementKind.PACKAGE; - pkg = ((PackageElement) enclosing).getQualifiedName().toString(); } enclosing = enclosing.getEnclosingElement(); } - String providerClassName = declaringClass.replace('.', '_') + "_" + fieldName; - Element[] originatingElements = originatingElementsList.toArray(new Element[originatingElementsList.size()]); + info.options.add(new OptionInfo(optionName, annotation.help(), optionType, declaringClass, field)); + } + + private void createFiles(OptionsInfo info) { + String pkg = ((PackageElement) info.topDeclaringType.getEnclosingElement()).getQualifiedName().toString(); + Name declaringClass = info.topDeclaringType.getSimpleName(); + + String optionsClassName = declaringClass + "_" + Options.class.getSimpleName(); + Element[] originatingElements = info.originatingElements.toArray(new Element[info.originatingElements.size()]); Filer filer = processingEnv.getFiler(); - try (PrintWriter out = createSourceFile(pkg, providerClassName, filer, originatingElements)) { + try (PrintWriter out = createSourceFile(pkg, optionsClassName, filer, originatingElements)) { out.println("// CheckStyle: stop header check"); + out.println("// GENERATED CONTENT - DO NOT EDIT"); + out.println("// Source: " + declaringClass + ".java"); out.println("package " + pkg + ";"); out.println(""); - if (element.getModifiers().contains(Modifier.PRIVATE)) { - out.println("import " + Field.class.getName() + ";"); + out.println("import java.util.*;"); + out.println("import " + Options.class.getPackage().getName() + ".*;"); + out.println(""); + out.println("public class " + optionsClassName + " implements " + Options.class.getSimpleName() + " {"); + out.println(" @Override"); + out.println(" public Iterator<" + OptionDescriptor.class.getSimpleName() + "> iterator() {"); + out.println(" List<" + OptionDescriptor.class.getSimpleName() + "> options = Arrays.asList("); + + boolean needPrivateFieldAccessor = false; + int i = 0; + for (OptionInfo option : info.options) { + String optionValue; + if (option.field.getModifiers().contains(Modifier.PRIVATE)) { + needPrivateFieldAccessor = true; + optionValue = "field(" + option.declaringClass + ".class, \"" + option.field.getSimpleName() + "\")"; + } else { + optionValue = option.declaringClass + "." + option.field.getSimpleName(); + } + String name = option.name; + String type = option.type; + String help = option.help; + String location = pkg + "." + option.declaringClass + "." + option.field.getSimpleName(); + String comma = i == info.options.size() - 1 ? "" : ","; + out.printf(" new %s(\"%s\", %s.class, \"%s\", \"%s\", %s)%s%n", OptionDescriptor.class.getSimpleName(), name, type, help, location, optionValue, comma); + i++; } - out.println("import " + OptionValue.class.getName() + ";"); - out.println("import " + OptionProvider.class.getName() + ";"); - out.println(""); - out.println("public class " + providerClassName + " implements " + OptionProvider.class.getSimpleName() + " {"); - out.println(" public String getHelp() {"); - out.println(" return \"" + annotation.help() + "\";"); + out.println(" );"); + out.println(" return options.iterator();"); out.println(" }"); - out.println(" public String getName() {"); - out.println(" return \"" + optionName + "\";"); - out.println(" }"); - out.println(" public Class getType() {"); - out.println(" return " + optionType + ".class;"); - out.println(" }"); - out.println(" public " + OptionValue.class.getSimpleName() + "<?> getOptionValue() {"); - if (!element.getModifiers().contains(Modifier.PRIVATE)) { - out.println(" return " + declaringClass + "." + fieldName + ";"); - } else { + if (needPrivateFieldAccessor) { + out.println(" private static " + OptionValue.class.getSimpleName() + " field(Class<?> declaringClass, String fieldName) {"); out.println(" try {"); - out.println(" Field field = " + declaringClass + ".class.getDeclaredField(\"" + fieldName + "\");"); + out.println(" java.lang.reflect.Field field = declaringClass.getDeclaredField(fieldName);"); out.println(" field.setAccessible(true);"); out.println(" return (" + OptionValue.class.getSimpleName() + ") field.get(null);"); out.println(" } catch (Exception e) {"); out.println(" throw (InternalError) new InternalError().initCause(e);"); out.println(" }"); + out.println(" }"); } - out.println(" }"); out.println("}"); } try { - createProviderFile(pkg, providerClassName, originatingElements); + createProviderFile(pkg, optionsClassName, originatingElements); } catch (IOException e) { - processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), field); + processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), info.topDeclaringType); } } @@ -177,7 +190,7 @@ String filename = "META-INF/providers/" + pkg + "." + providerClassName; FileObject file = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", filename, originatingElements); PrintWriter writer = new PrintWriter(new OutputStreamWriter(file.openOutputStream(), "UTF-8")); - writer.println(OptionProvider.class.getName()); + writer.println(Options.class.getName()); writer.close(); } @@ -197,14 +210,84 @@ } } + static class OptionInfo { + + final String name; + final String help; + final String type; + final String declaringClass; + final VariableElement field; + + public OptionInfo(String name, String help, String type, String declaringClass, VariableElement field) { + this.name = name; + this.help = help; + this.type = type; + this.declaringClass = declaringClass; + this.field = field; + } + + @Override + public String toString() { + return declaringClass + "." + field; + } + } + + static class OptionsInfo { + + final Element topDeclaringType; + final List<OptionInfo> options = new ArrayList<>(); + final Set<Element> originatingElements = new HashSet<>(); + + public OptionsInfo(Element topDeclaringType) { + this.topDeclaringType = topDeclaringType; + } + } + + private static Element topDeclaringType(Element element) { + Element enclosing = element.getEnclosingElement(); + if (element == null || enclosing.getKind() == ElementKind.PACKAGE) { + assert element.getKind() == ElementKind.CLASS || element.getKind() == ElementKind.INTERFACE; + return element; + } + return topDeclaringType(enclosing); + } + @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { return true; } + Map<Element, OptionsInfo> map = new HashMap<>(); for (Element element : roundEnv.getElementsAnnotatedWith(Option.class)) { - processElement(element); + if (!processed.contains(element)) { + processed.add(element); + Element topDeclaringType = topDeclaringType(element); + OptionsInfo options = map.get(topDeclaringType); + if (options == null) { + options = new OptionsInfo(topDeclaringType); + map.put(topDeclaringType, options); + } + processElement(element, options); + } + } + + boolean ok = true; + Map<String, OptionInfo> uniqueness = new HashMap<>(); + for (OptionsInfo info : map.values()) { + for (OptionInfo option : info.options) { + OptionInfo conflict = uniqueness.put(option.name, option); + if (conflict != null) { + processingEnv.getMessager().printMessage(Kind.ERROR, "Duplicate option names for " + option + " and " + conflict, option.field); + ok = false; + } + } + } + + if (ok) { + for (OptionsInfo info : map.values()) { + createFiles(info); + } } return true;
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionProvider.java Thu Jun 06 21:22:43 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.options; - -import java.util.*; - -/** - * Describes the attributes of an {@linkplain Option option} and provides access to its - * {@linkplain OptionValue value}. The {@link OptionProcessor} auto-generates instances of this - * interface that are accessible as a {@linkplain ServiceLoader service}. - */ -public interface OptionProvider { - - /** - * Gets the type of values stored in the option. - */ - Class getType(); - - /** - * Gets a descriptive help message for the option. - */ - String getHelp(); - - /** - * Gets the name of the option. It's up to the client of this object how to use the name to get - * a user specified value for the option from the environment. - */ - String getName(); - - /** - * Gets the boxed option value. - */ - OptionValue<?> getOptionValue(); -}
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionValue.java Thu Jun 06 21:22:43 2013 +0200 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/OptionValue.java Thu Jun 06 23:16:45 2013 +0200 @@ -22,14 +22,8 @@ */ package com.oracle.graal.options; -import java.util.*; - /** - * A settable option value. - * <p> - * To access {@link OptionProvider} instances via a {@link ServiceLoader} for working with options, - * instances of this class should be assigned to static final fields that are annotated with - * {@link Option}. + * An option value. */ public class OptionValue<T> {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/Options.java Thu Jun 06 23:16:45 2013 +0200 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.options; + +import java.util.*; + +/** + * A {@linkplain ServiceLoader service} for accessing a set of {@link OptionDescriptor}s. + */ +public interface Options extends Iterable<OptionDescriptor> { +}
--- a/graal/com.oracle.graal.options/src/com/oracle/graal/options/StableOptionValue.java Thu Jun 06 21:22:43 2013 +0200 +++ b/graal/com.oracle.graal.options/src/com/oracle/graal/options/StableOptionValue.java Thu Jun 06 23:16:45 2013 +0200 @@ -23,7 +23,7 @@ package com.oracle.graal.options; /** - * A settable option that always returns the same {@linkplain #getValue() value}. + * An option that always returns the same {@linkplain #getValue() value}. */ public class StableOptionValue<T> extends OptionValue<T> {
--- a/make/build-graal.xml Thu Jun 06 21:22:43 2013 +0200 +++ b/make/build-graal.xml Thu Jun 06 23:16:45 2013 +0200 @@ -81,161 +81,15 @@ <provider classname="com.oracle.graal.hotspot.replacements.HotSpotNmethodIntrinsics"/> <provider classname="com.oracle.graal.replacements.GraalMethodSubstitutions"/> </service> - <service type="com.oracle.graal.options.OptionProvider"> - <provider classname="com.oracle.graal.compiler.GraalCompiler_Inline"/> - <provider classname="com.oracle.graal.compiler.GraalCompiler_VerifyUsageWithEquals"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_DebugEnabled"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_DetailedAsserts"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_Dump"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_DumpOnError"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_Log"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_Meter"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_MethodFilter"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_PerThreadDebugValues"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_SummarizeDebugValues"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_SummarizePerPhase"/> - <provider classname="com.oracle.graal.compiler.GraalDebugConfig_Time"/> - <provider classname="com.oracle.graal.hotspot.CompilationTask_SlowQueueCutoff"/> - <provider classname="com.oracle.graal.hotspot.HotSpotGraalRuntime_GraalRuntime"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_BenchmarkDynamicCounters"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_GenericDynamicCounters"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_LogFile"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_PrintQueue"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_PriorityCompileQueue"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_SlowCompileThreads"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_Threads"/> - <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_TimedBootstrap"/> - <provider classname="com.oracle.graal.phases.GraalOptions_AlignCallsForPatching"/> - <provider classname="com.oracle.graal.phases.GraalOptions_AlwaysInlineVTableStubs"/> - <provider classname="com.oracle.graal.phases.GraalOptions_BoostInliningForEscapeAnalysis"/> - <provider classname="com.oracle.graal.phases.GraalOptions_BootstrapReplacements"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CacheGraphs"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CanOmitFrame"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CapInheritedRelevance"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CheckcastMaxHints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CheckcastMinHintHitProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CompileTheWorld"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CompileTheWorldStartAt"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CompileTheWorldStopAt"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ConditionalElimination"/> - <provider classname="com.oracle.graal.phases.GraalOptions_CullFrameStates"/> - <provider classname="com.oracle.graal.phases.GraalOptions_DeoptALot"/> - <provider classname="com.oracle.graal.phases.GraalOptions_DeoptsToDisableOptimisticOptimization"/> - <provider classname="com.oracle.graal.phases.GraalOptions_DynamicCompilePriority"/> - <provider classname="com.oracle.graal.phases.GraalOptions_EscapeAnalysisHistogram"/> - <provider classname="com.oracle.graal.phases.GraalOptions_EscapeAnalysisIterations"/> - <provider classname="com.oracle.graal.phases.GraalOptions_EscapeAnalyzeOnly"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ExactFullUnrollMaxNodes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ExitVMOnBailout"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ExitVMOnException"/> - <provider classname="com.oracle.graal.phases.GraalOptions_FullUnroll"/> - <provider classname="com.oracle.graal.phases.GraalOptions_FullUnrollMaxNodes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_GenAssertionCode"/> - <provider classname="com.oracle.graal.phases.GraalOptions_GenLoopSafepoints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_GenSafepoints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_GraphCacheSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_HotSpotPrintCompilation"/> - <provider classname="com.oracle.graal.phases.GraalOptions_HotSpotPrintInlining"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InlineMegamorphicCalls"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InlineMonomorphicCalls"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InlinePolymorphicCalls"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InlineVTableStubs"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InstanceOfMaxHints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_InstanceOfMinHintHitProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_Intrinsify"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyAESMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyArrayCopy"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyCallSiteTarget"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyClassMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyInstalledCodeMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyMathMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyObjectClone"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyObjectMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyReflectionMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifySystemMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyThreadMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IntrinsifyUnsafeMethods"/> - <provider classname="com.oracle.graal.phases.GraalOptions_IterativeInlining"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LimitInlinedInvokes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LoopMaxUnswitch"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LoopPeeling"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LoopUnswitch"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LoopUnswitchMaxIncrease"/> - <provider classname="com.oracle.graal.phases.GraalOptions_LoopUnswitchUncertaintyBoost"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MatureExecutionsBranch"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MatureExecutionsPerSwitchCase"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MatureExecutionsTypeProfile"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MaximumDesiredSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MaximumEscapeAnalysisArrayLength"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MaximumInliningSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MaximumRecursiveInlining"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MegamorphicInliningMinMethodProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MemoryAwareScheduling"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MinTableSwitchDensity"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MinimumJumpTableSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_MinimumPeelProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OmitHotExceptionStacktrace"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptAssumptions"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptCanonicalizeReads"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptCanonicalizer"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptConvertDeoptsToGuards"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptDevirtualizeInvokesOptimistically"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptEarlyReadElimination"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptEliminateGuards"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptEliminatePartiallyRedundantGuards"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptEliminateSafepoints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptFilterProfiledTypes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptFloatingReads"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptImplicitNullChecks"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptLivenessAnalysis"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptLoopTransform"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptPushThroughPi"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptReadElimination"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptScheduleOutOfLoops"/> - <provider classname="com.oracle.graal.phases.GraalOptions_OptTailDuplication"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PEAInliningHints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PartialEscapeAnalysis"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintBailout"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintBinaryGraphPort"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintBinaryGraphs"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintCFG"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintCodeBytes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintCompilation"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintFilter"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintGraphCache"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintIRWithLIR"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintIdealGraphAddress"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintIdealGraphFile"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintIdealGraphPort"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintProfilingInformation"/> - <provider classname="com.oracle.graal.phases.GraalOptions_PrintStackTraceOnException"/> - <provider classname="com.oracle.graal.phases.GraalOptions_RangeTestsSwitchDensity"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ReassociateInvariants"/> - <provider classname="com.oracle.graal.phases.GraalOptions_RegisterPressure"/> - <provider classname="com.oracle.graal.phases.GraalOptions_RelevanceCapForInlining"/> - <provider classname="com.oracle.graal.phases.GraalOptions_RemoveNeverExecutedCode"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ResolveClassBeforeStaticInvoke"/> - <provider classname="com.oracle.graal.phases.GraalOptions_SafepointPollOffset"/> - <provider classname="com.oracle.graal.phases.GraalOptions_SmallCompiledLowLevelGraphSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_SnippetCounters"/> - <provider classname="com.oracle.graal.phases.GraalOptions_StackShadowPages"/> - <provider classname="com.oracle.graal.phases.GraalOptions_SupportJsrBytecodes"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TailDuplicationProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TailDuplicationTrivialSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TraceBytecodeParserLevel"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TraceEscapeAnalysis"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TraceLIRGeneratorLevel"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TraceLinearScanLevel"/> - <provider classname="com.oracle.graal.phases.GraalOptions_TrivialInliningSize"/> - <provider classname="com.oracle.graal.phases.GraalOptions_UseExceptionProbability"/> - <provider classname="com.oracle.graal.phases.GraalOptions_UseExceptionProbabilityForOperations"/> - <provider classname="com.oracle.graal.phases.GraalOptions_UseLoopLimitChecks"/> - <provider classname="com.oracle.graal.phases.GraalOptions_UseProfilingInformation"/> - <provider classname="com.oracle.graal.phases.GraalOptions_UseTypeCheckHints"/> - <provider classname="com.oracle.graal.phases.GraalOptions_VerifyPhases"/> - <provider classname="com.oracle.graal.phases.GraalOptions_ZapStackOnMethodEntry"/> - <provider classname="com.oracle.graal.phases.common.InliningPhase_AlwaysInlineIntrinsics"/> - <provider classname="com.oracle.graal.phases.tiers.Suites_CompilerConfiguration"/> + <service type="com.oracle.graal.options.Options"> + <provider classname="com.oracle.graal.compiler.GraalCompiler_Options"/> + <provider classname="com.oracle.graal.compiler.GraalDebugConfig_Options"/> + <provider classname="com.oracle.graal.hotspot.CompilationTask_Options"/> + <provider classname="com.oracle.graal.hotspot.HotSpotGraalRuntime_Options"/> + <provider classname="com.oracle.graal.hotspot.bridge.VMToCompilerImpl_Options"/> + <provider classname="com.oracle.graal.phases.GraalOptions_Options"/> + <provider classname="com.oracle.graal.phases.common.InliningPhase_Options"/> + <provider classname="com.oracle.graal.phases.tiers.Suites_Options"/> </service> <service type="com.oracle.graal.phases.tiers.CompilerConfiguration"> <provider classname="com.oracle.graal.compiler.phases.BasicCompilerConfiguration"/>