src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/GeneratedFoldPlugin.java
author dlong
Tue, 24 Sep 2019 12:47:15 -0400
changeset 58299 6df94ce3ab2f
parent 54601 c40b2a190173
permissions -rw-r--r--
8229201: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     1
/*
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 54601
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     4
 *
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     7
 * published by the Free Software Foundation.
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     8
 *
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    13
 * accompanied this code).
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    14
 *
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    18
 *
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    21
 * questions.
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    24
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    25
package org.graalvm.compiler.replacements.processor;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    26
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    27
import static org.graalvm.compiler.replacements.processor.FoldHandler.FOLD_CLASS_NAME;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    28
import static org.graalvm.compiler.replacements.processor.FoldHandler.INJECTED_PARAMETER_CLASS_NAME;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    29
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    30
import java.io.PrintWriter;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    31
import java.util.List;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    32
import java.util.Set;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    33
import java.util.TreeSet;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    34
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    35
import javax.lang.model.element.ExecutableElement;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    36
import javax.lang.model.element.Modifier;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    37
import javax.lang.model.element.TypeElement;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    38
import javax.lang.model.element.VariableElement;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    39
import javax.lang.model.type.DeclaredType;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    40
import javax.lang.model.type.TypeMirror;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    41
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    42
import org.graalvm.compiler.processor.AbstractProcessor;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    43
import org.graalvm.compiler.replacements.processor.InjectedDependencies.WellKnownDependency;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    44
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    45
/**
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    46
 * Create graph builder plugins for {@code Fold} methods.
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    47
 */
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    48
public class GeneratedFoldPlugin extends GeneratedPlugin {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    49
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    50
    public GeneratedFoldPlugin(ExecutableElement intrinsicMethod) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    51
        super(intrinsicMethod);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    52
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    53
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    54
    @Override
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    55
    protected TypeElement getAnnotationClass(AbstractProcessor processor) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    56
        return processor.getTypeElement(FOLD_CLASS_NAME);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    57
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    58
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    59
    @Override
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    60
    public void extraImports(Set<String> imports) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    61
        imports.add("jdk.vm.ci.meta.JavaConstant");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    62
        imports.add("jdk.vm.ci.meta.JavaKind");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    63
        imports.add("org.graalvm.compiler.nodes.ConstantNode");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    64
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    65
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    66
    @Override
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    67
    protected InjectedDependencies createExecute(AbstractProcessor processor, PrintWriter out) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    68
        InjectedDependencies deps = new InjectedDependencies();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    69
        List<? extends VariableElement> params = intrinsicMethod.getParameters();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    70
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    71
        int argCount = 0;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    72
        Object receiver;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    73
        if (intrinsicMethod.getModifiers().contains(Modifier.STATIC)) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    74
            receiver = intrinsicMethod.getEnclosingElement();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    75
        } else {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    76
            receiver = "arg0";
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    77
            TypeElement type = (TypeElement) intrinsicMethod.getEnclosingElement();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    78
            constantArgument(processor, out, deps, argCount, type.asType(), argCount);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    79
            argCount++;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    80
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    81
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    82
        int firstArg = argCount;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    83
        for (VariableElement param : params) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    84
            if (processor.getAnnotation(param, processor.getType(INJECTED_PARAMETER_CLASS_NAME)) == null) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    85
                constantArgument(processor, out, deps, argCount, param.asType(), argCount);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    86
            } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 52578
diff changeset
    87
                out.printf("        if (!checkInjectedArgument(b, args[%d], targetMethod)) {\n", argCount);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 52578
diff changeset
    88
                out.printf("            return false;\n");
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 52578
diff changeset
    89
                out.printf("        }\n", argCount);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    90
                out.printf("        %s arg%d = %s;\n", param.asType(), argCount, deps.use(processor, (DeclaredType) param.asType()));
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    91
            }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    92
            argCount++;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    93
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    94
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    95
        Set<String> suppressWarnings = new TreeSet<>();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    96
        if (intrinsicMethod.getAnnotation(Deprecated.class) != null) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    97
            suppressWarnings.add("deprecation");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    98
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
    99
        if (hasRawtypeWarning(intrinsicMethod.getReturnType())) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   100
            suppressWarnings.add("rawtypes");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   101
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   102
        for (VariableElement param : params) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   103
            if (hasUncheckedWarning(param.asType())) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   104
                suppressWarnings.add("unchecked");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   105
            }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   106
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   107
        if (suppressWarnings.size() > 0) {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   108
            out.printf("        @SuppressWarnings({");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   109
            String sep = "";
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   110
            for (String suppressWarning : suppressWarnings) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   111
                out.printf("%s\"%s\"", sep, suppressWarning);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   112
                sep = ", ";
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   113
            }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   114
            out.printf("})\n");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   115
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   116
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   117
        out.printf("        %s result = %s.%s(", getErasedType(intrinsicMethod.getReturnType()), receiver, intrinsicMethod.getSimpleName());
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   118
        if (argCount > firstArg) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   119
            out.printf("arg%d", firstArg);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   120
            for (int i = firstArg + 1; i < argCount; i++) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   121
                out.printf(", arg%d", i);
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   122
            }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   123
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   124
        out.printf(");\n");
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   125
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   126
        TypeMirror returnType = intrinsicMethod.getReturnType();
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   127
        switch (returnType.getKind()) {
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   128
            case BOOLEAN:
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   129
                out.printf("        JavaConstant constant = JavaConstant.forInt(result ? 1 : 0);\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   130
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   131
            case BYTE:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   132
            case SHORT:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   133
            case CHAR:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   134
            case INT:
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   135
                out.printf("        JavaConstant constant = JavaConstant.forInt(result);\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   136
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   137
            case LONG:
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   138
                out.printf("        JavaConstant constant = JavaConstant.forLong(result);\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   139
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   140
            case FLOAT:
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   141
                out.printf("        JavaConstant constant = JavaConstant.forFloat(result);\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   142
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   143
            case DOUBLE:
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   144
                out.printf("        JavaConstant constant = JavaConstant.forDouble(result);\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   145
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   146
            case ARRAY:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   147
            case TYPEVAR:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   148
            case DECLARED:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   149
                if (returnType.equals(processor.getType("java.lang.String"))) {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   150
                    out.printf("        JavaConstant constant = %s.forString(result);\n", deps.use(WellKnownDependency.CONSTANT_REFLECTION));
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   151
                } else {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   152
                    out.printf("        JavaConstant constant = %s.forObject(result);\n", deps.use(WellKnownDependency.SNIPPET_REFLECTION));
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   153
                }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   154
                break;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   155
            default:
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   156
                throw new IllegalArgumentException(returnType.toString());
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   157
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   158
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   159
        out.printf("        ConstantNode node = ConstantNode.forConstant(constant, %s, %s);\n", deps.use(WellKnownDependency.META_ACCESS), deps.use(WellKnownDependency.STRUCTURED_GRAPH));
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   160
        out.printf("        b.push(JavaKind.%s, node);\n", getReturnKind(intrinsicMethod));
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   161
        out.printf("        b.notifyReplacedCall(targetMethod, node);\n");
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   162
        out.printf("        return true;\n");
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   163
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   164
        return deps;
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   165
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents:
diff changeset
   166
}