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&lt;OptionProvider&gt; sl = ServiceLoader.loadInstalled(OptionProvider.class);
- * for (OptionProvider provider : sl) {
- *     // use provider
+ * ServiceLoader&lt;Options&gt; 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"/>