src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options/src/org/graalvm/compiler/options/OptionKey.java
author iveresov
Fri, 02 Feb 2018 17:28:17 -0800
changeset 48861 47f19ff9903c
parent 47216 71c04702a3d5
child 49873 26ebfe8ce852
permissions -rw-r--r--
8194819: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     1
/*
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     2
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     4
 *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     8
 *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    13
 * accompanied this code).
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    14
 *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    18
 *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    21
 * questions.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    22
 */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    23
package org.graalvm.compiler.options;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    24
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    25
import java.util.Formatter;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    26
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    27
import org.graalvm.collections.EconomicMap;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    28
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    29
/**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    30
 * A key for an option. The value for an option is obtained from an {@link OptionValues} object.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    31
 */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    32
public class OptionKey<T> {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    33
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    34
    private final T defaultValue;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    35
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    36
    private OptionDescriptor descriptor;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    37
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    38
    public OptionKey(T defaultValue) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    39
        this.defaultValue = defaultValue;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    40
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    41
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    42
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    43
     * Sets the descriptor for this option.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    44
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    45
    public final void setDescriptor(OptionDescriptor descriptor) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    46
        assert this.descriptor == null : "Overwriting existing descriptor";
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    47
        this.descriptor = descriptor;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    48
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    49
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    50
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    51
     * Returns the descriptor for this option, if it has been set by
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    52
     * {@link #setDescriptor(OptionDescriptor)}.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    53
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    54
    public final OptionDescriptor getDescriptor() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    55
        return descriptor;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    56
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    57
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    58
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    59
     * Checks that a descriptor exists for this key after triggering loading of descriptors.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    60
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    61
    protected boolean checkDescriptorExists() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    62
        OptionKey.Lazy.init();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    63
        if (descriptor == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    64
            Formatter buf = new Formatter();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    65
            buf.format("Could not find a descriptor for an option key. The most likely cause is " +
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    66
                            "a dependency on the %s annotation without a dependency on the " +
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    67
                            "org.graalvm.compiler.options.processor.OptionProcessor annotation processor.", Option.class.getName());
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    68
            StackTraceElement[] stackTrace = new Exception().getStackTrace();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    69
            if (stackTrace.length > 2 &&
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    70
                            stackTrace[1].getClassName().equals(OptionKey.class.getName()) &&
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    71
                            stackTrace[1].getMethodName().equals("getValue")) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    72
                String caller = stackTrace[2].getClassName();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    73
                buf.format(" In suite.py, add GRAAL_OPTIONS_PROCESSOR to the \"annotationProcessors\" attribute of the project " +
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    74
                                "containing %s.", caller);
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    75
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    76
            throw new AssertionError(buf.toString());
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    77
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    78
        return true;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    79
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    80
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    81
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    82
     * Mechanism for lazily loading all available options which has the side effect of assigning
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    83
     * names to the options.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    84
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    85
    static class Lazy {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    86
        static {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    87
            for (OptionDescriptors opts : OptionsParser.getOptionsLoader()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    88
                for (OptionDescriptor desc : opts) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    89
                    desc.getName();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    90
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    91
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    92
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    93
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    94
        static void init() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    95
            /* Running the static class initializer does all the initialization. */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    96
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    97
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    98
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
    99
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   100
     * Gets the name of this option. The name for an option value with a null
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   101
     * {@linkplain #setDescriptor(OptionDescriptor) descriptor} is the value of
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   102
     * {@link Object#toString()}.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   103
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   104
    public final String getName() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   105
        if (descriptor == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   106
            // Trigger initialization of OptionsLoader to ensure all option values have
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   107
            // a descriptor which is required for them to have meaningful names.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   108
            Lazy.init();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   109
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   110
        return descriptor == null ? super.toString() : descriptor.getName();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   111
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   112
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   113
    @Override
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   114
    public String toString() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   115
        return getName();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   116
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   117
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   118
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   119
     * The initial value specified in source code.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   120
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   121
    public final T getDefaultValue() {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   122
        return defaultValue;
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   123
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   124
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   125
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   126
     * Returns true if the option has been set in any way. Note that this doesn't mean that the
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   127
     * current value is different than the default.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   128
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   129
    public boolean hasBeenSet(OptionValues values) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   130
        return values.containsKey(this);
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   131
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   132
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   133
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   134
     * Gets the value of this option in {@code values}.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   135
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   136
    public T getValue(OptionValues values) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   137
        assert checkDescriptorExists();
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   138
        return values.get(this);
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   139
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   140
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   141
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   142
     * Sets the value of this option in a given map. The
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   143
     * {@link #onValueUpdate(EconomicMap, Object, Object)} method is called once the value is set.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   144
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   145
     * @param values map of option values
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   146
     * @param v the value to set for this key in {@code map}
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   147
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   148
    @SuppressWarnings("unchecked")
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   149
    public void update(EconomicMap<OptionKey<?>, Object> values, Object v) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   150
        T oldValue = (T) values.put(this, v);
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   151
        onValueUpdate(values, oldValue, (T) v);
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   152
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   153
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   154
    /**
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   155
     * Sets the value of this option in a given map if it doesn't already have a value. The
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   156
     * {@link #onValueUpdate(EconomicMap, Object, Object)} method is called once the value is set.
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   157
     *
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   158
     * @param values map of option values
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   159
     * @param v the value to set for this key in {@code map}
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   160
     */
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   161
    @SuppressWarnings("unchecked")
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   162
    public void putIfAbsent(EconomicMap<OptionKey<?>, Object> values, Object v) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   163
        if (!values.containsKey(this)) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   164
            T oldValue = (T) values.put(this, v);
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   165
            onValueUpdate(values, oldValue, (T) v);
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   166
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   167
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   168
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46344
diff changeset
   169
    /**
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   170
     * Notifies this object when a value associated with this key is set or updated in
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   171
     * {@code values}.
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   172
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   173
     * @param values
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   174
     * @param oldValue
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   175
     * @param newValue
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   176
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   177
    protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, T oldValue, T newValue) {
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   178
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents:
diff changeset
   179
}