hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java
author iveresov
Tue, 18 Apr 2017 20:17:22 -0700
changeset 46393 d497d892ab11
child 46459 7d4e637d3f21
permissions -rw-r--r--
8178864: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     1
/*
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     2
 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     4
 *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     8
 *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    13
 * accompanied this code).
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    14
 *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    18
 *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    21
 * questions.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    22
 */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    23
package org.graalvm.compiler.hotspot.test;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    24
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    25
import static java.util.Collections.singletonList;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    26
import static org.graalvm.compiler.core.GraalCompilerOptions.ExitVMOnException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    27
import static org.graalvm.compiler.core.GraalCompilerOptions.PrintBailout;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    28
import static org.graalvm.compiler.core.GraalCompilerOptions.PrintStackTraceOnException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    29
import static org.graalvm.compiler.core.common.util.Util.Java8OrEarlier;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    30
import static org.graalvm.compiler.core.test.ReflectionOptionDescriptors.extractEntries;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    31
import static org.graalvm.compiler.hotspot.test.CompileTheWorld.Options.DESCRIPTORS;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    32
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    33
import java.io.Closeable;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    34
import java.io.File;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    35
import java.io.IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    36
import java.lang.annotation.Annotation;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    37
import java.lang.reflect.Constructor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    38
import java.lang.reflect.Method;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    39
import java.lang.reflect.Modifier;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    40
import java.net.URI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    41
import java.net.URL;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    42
import java.net.URLClassLoader;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    43
import java.nio.file.FileSystem;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    44
import java.nio.file.FileSystems;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    45
import java.nio.file.FileVisitResult;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    46
import java.nio.file.Files;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    47
import java.nio.file.Path;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    48
import java.nio.file.SimpleFileVisitor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    49
import java.nio.file.attribute.BasicFileAttributes;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    50
import java.util.ArrayList;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    51
import java.util.Arrays;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    52
import java.util.Collections;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    53
import java.util.Enumeration;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    54
import java.util.HashSet;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    55
import java.util.List;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    56
import java.util.ServiceLoader;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    57
import java.util.Set;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    58
import java.util.concurrent.ExecutionException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    59
import java.util.concurrent.Future;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    60
import java.util.concurrent.LinkedBlockingQueue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    61
import java.util.concurrent.ThreadPoolExecutor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    62
import java.util.concurrent.TimeUnit;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    63
import java.util.concurrent.atomic.AtomicLong;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    64
import java.util.jar.JarEntry;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    65
import java.util.jar.JarFile;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    66
import java.util.stream.Collectors;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    67
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    68
import org.graalvm.compiler.api.replacements.Snippet;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    69
import org.graalvm.compiler.bytecode.Bytecodes;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    70
import org.graalvm.compiler.core.CompilerThreadFactory;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    71
import org.graalvm.compiler.core.CompilerThreadFactory.DebugConfigAccess;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    72
import org.graalvm.compiler.core.common.util.Util;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    73
import org.graalvm.compiler.core.test.ReflectionOptionDescriptors;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    74
import org.graalvm.compiler.debug.DebugEnvironment;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    75
import org.graalvm.compiler.debug.GraalDebugConfig;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    76
import org.graalvm.compiler.debug.GraalError;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    77
import org.graalvm.compiler.debug.MethodFilter;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    78
import org.graalvm.compiler.debug.TTY;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    79
import org.graalvm.compiler.debug.internal.MemUseTrackerImpl;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    80
import org.graalvm.compiler.hotspot.CompilationTask;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    81
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    82
import org.graalvm.compiler.hotspot.HotSpotGraalCompiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    83
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    84
import org.graalvm.compiler.options.OptionDescriptors;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    85
import org.graalvm.compiler.options.OptionKey;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    86
import org.graalvm.compiler.options.OptionValues;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    87
import org.graalvm.compiler.options.OptionsParser;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    88
import org.graalvm.util.EconomicMap;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    89
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    90
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    91
import jdk.vm.ci.hotspot.HotSpotCompilationRequest;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    92
import jdk.vm.ci.hotspot.HotSpotInstalledCode;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    93
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    94
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    95
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    96
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    97
import jdk.vm.ci.meta.ConstantPool;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    98
import jdk.vm.ci.meta.MetaAccessProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    99
import jdk.vm.ci.runtime.JVMCI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   100
import jdk.vm.ci.runtime.JVMCICompiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   101
import jdk.vm.ci.services.Services;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   102
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   103
/**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   104
 * This class implements compile-the-world functionality with JVMCI.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   105
 */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   106
public final class CompileTheWorld {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   107
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   108
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   109
     * Magic token to denote that JDK classes are to be compiled. If {@link Util#Java8OrEarlier},
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   110
     * then the classes in {@code rt.jar} are compiled. Otherwise the classes in the Java runtime
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   111
     * image are compiled.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   112
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   113
    public static final String SUN_BOOT_CLASS_PATH = "sun.boot.class.path";
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   114
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   115
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   116
     * Magic token to denote the classes in the Java runtime image (i.e. in the {@code jrt:/} file
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   117
     * system).
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   118
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   119
    public static final String JRT_CLASS_PATH_ENTRY = "<jrt>";
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   120
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   121
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   122
     * @param options a space separated set of option value settings with each option setting in a
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   123
     *            {@code -Dgraal.<name>=<value>} format but without the leading {@code -Dgraal.}.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   124
     *            Ignored if null.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   125
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   126
    public static EconomicMap<OptionKey<?>, Object> parseOptions(String options) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   127
        if (options != null) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   128
            EconomicMap<String, String> optionSettings = EconomicMap.create();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   129
            for (String optionSetting : options.split("\\s+|#")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   130
                OptionsParser.parseOptionSettingTo(optionSetting, optionSettings);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   131
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   132
            EconomicMap<OptionKey<?>, Object> values = OptionValues.newOptionMap();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   133
            ServiceLoader<OptionDescriptors> loader = ServiceLoader.load(OptionDescriptors.class, OptionDescriptors.class.getClassLoader());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   134
            OptionsParser.parseOptions(optionSettings, values, loader);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   135
            return values;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   136
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   137
        return EconomicMap.create();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   138
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   139
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   140
    private final HotSpotJVMCIRuntimeProvider jvmciRuntime;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   141
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   142
    private final HotSpotGraalCompiler compiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   143
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   144
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   145
     * Class path denoting classes to compile.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   146
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   147
     * @see Options#Classpath
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   148
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   149
    private final String inputClassPath;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   150
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   151
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   152
     * Class index to start compilation at.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   153
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   154
     * @see Options#StartAt
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   155
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   156
    private final int startAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   157
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   158
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   159
     * Class index to stop compilation at.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   160
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   161
     * @see Options#StopAt
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   162
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   163
    private final int stopAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   164
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   165
    /** Only compile methods matching one of the filters in this array if the array is non-null. */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   166
    private final MethodFilter[] methodFilters;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   167
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   168
    /** Exclude methods matching one of the filters in this array if the array is non-null. */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   169
    private final MethodFilter[] excludeMethodFilters;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   170
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   171
    // Counters
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   172
    private int classFileCounter = 0;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   173
    private AtomicLong compiledMethodsCounter = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   174
    private AtomicLong compileTime = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   175
    private AtomicLong memoryUsed = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   176
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   177
    private boolean verbose;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   178
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   179
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   180
     * Signal that the threads should start compiling in multithreaded mode.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   181
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   182
    private boolean running;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   183
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   184
    private ThreadPoolExecutor threadPool;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   185
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   186
    private OptionValues currentOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   187
    private final EconomicMap<OptionKey<?>, Object> compilationOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   188
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   189
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   190
     * Creates a compile-the-world instance.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   191
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   192
     * @param files {@link File#pathSeparator} separated list of Zip/Jar files to compile
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   193
     * @param startAt index of the class file to start compilation at
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   194
     * @param stopAt index of the class file to stop compilation at
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   195
     * @param methodFilters
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   196
     * @param excludeMethodFilters
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   197
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   198
    public CompileTheWorld(HotSpotJVMCIRuntimeProvider jvmciRuntime, HotSpotGraalCompiler compiler, String files, int startAt, int stopAt, String methodFilters, String excludeMethodFilters,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   199
                    boolean verbose, OptionValues initialOptions, EconomicMap<OptionKey<?>, Object> compilationOptions) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   200
        this.jvmciRuntime = jvmciRuntime;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   201
        this.compiler = compiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   202
        this.inputClassPath = files;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   203
        this.startAt = startAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   204
        this.stopAt = stopAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   205
        this.methodFilters = methodFilters == null || methodFilters.isEmpty() ? null : MethodFilter.parse(methodFilters);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   206
        this.excludeMethodFilters = excludeMethodFilters == null || excludeMethodFilters.isEmpty() ? null : MethodFilter.parse(excludeMethodFilters);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   207
        this.verbose = verbose;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   208
        EconomicMap<OptionKey<?>, Object> compilationOptionsCopy = EconomicMap.create(compilationOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   209
        this.currentOptions = initialOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   210
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   211
        // We don't want the VM to exit when a method fails to compile...
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   212
        ExitVMOnException.update(compilationOptionsCopy, false);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   213
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   214
        // ...but we want to see exceptions.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   215
        PrintBailout.update(compilationOptionsCopy, true);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   216
        PrintStackTraceOnException.update(compilationOptionsCopy, true);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   217
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   218
        // By default only report statistics for the CTW threads themselves
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   219
        if (!GraalDebugConfig.Options.DebugValueThreadFilter.hasBeenSet(initialOptions)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   220
            GraalDebugConfig.Options.DebugValueThreadFilter.update(compilationOptionsCopy, "^CompileTheWorld");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   221
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   222
        this.compilationOptions = EconomicMap.create(compilationOptionsCopy);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   223
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   224
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   225
    public CompileTheWorld(HotSpotJVMCIRuntimeProvider jvmciRuntime, HotSpotGraalCompiler compiler, OptionValues options) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   226
        this(jvmciRuntime, compiler, Options.Classpath.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   227
                        Options.StartAt.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   228
                        Options.StopAt.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   229
                        Options.MethodFilter.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   230
                        Options.ExcludeMethodFilter.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   231
                        Options.Verbose.getValue(options),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   232
                        options,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   233
                        parseOptions(Options.Config.getValue(options)));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   234
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   235
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   236
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   237
     * Compiles all methods in all classes in {@link #inputClassPath}. If {@link #inputClassPath}
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   238
     * equals {@link #SUN_BOOT_CLASS_PATH} the boot classes are used.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   239
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   240
    public void compile() throws Throwable {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   241
        if (SUN_BOOT_CLASS_PATH.equals(inputClassPath)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   242
            String bcpEntry = null;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   243
            if (Java8OrEarlier) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   244
                final String[] entries = System.getProperty(SUN_BOOT_CLASS_PATH).split(File.pathSeparator);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   245
                for (int i = 0; i < entries.length && bcpEntry == null; i++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   246
                    String entry = entries[i];
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   247
                    File entryFile = new File(entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   248
                    if (entryFile.getName().endsWith("rt.jar") && entryFile.isFile()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   249
                        bcpEntry = entry;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   250
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   251
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   252
                if (bcpEntry == null) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   253
                    throw new GraalError("Could not find rt.jar on boot class path %s", System.getProperty(SUN_BOOT_CLASS_PATH));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   254
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   255
            } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   256
                bcpEntry = JRT_CLASS_PATH_ENTRY;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   257
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   258
            compile(bcpEntry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   259
        } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   260
            compile(inputClassPath);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   261
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   262
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   263
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   264
    public void println() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   265
        println("");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   266
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   267
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   268
    public void println(String format, Object... args) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   269
        println(String.format(format, args));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   270
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   271
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   272
    public void println(String s) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   273
        println(verbose, s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   274
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   275
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   276
    public static void println(boolean cond, String s) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   277
        if (cond) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   278
            TTY.println(s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   279
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   280
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   281
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   282
    public void printStackTrace(Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   283
        if (verbose) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   284
            t.printStackTrace(TTY.out);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   285
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   286
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   287
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   288
    @SuppressWarnings("unused")
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   289
    private static void dummy() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   290
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   291
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   292
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   293
     * Abstraction over different types of class path entries.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   294
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   295
    abstract static class ClassPathEntry implements Closeable {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   296
        final String name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   297
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   298
        ClassPathEntry(String name) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   299
            this.name = name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   300
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   301
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   302
        /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   303
         * Creates a {@link ClassLoader} for loading classes from this entry.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   304
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   305
        public abstract ClassLoader createClassLoader() throws IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   306
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   307
        /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   308
         * Gets the list of classes available under this entry.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   309
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   310
        public abstract List<String> getClassNames() throws IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   311
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   312
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   313
        public String toString() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   314
            return name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   315
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   316
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   317
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   318
        public void close() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   319
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   320
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   321
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   322
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   323
     * A class path entry that is a normal file system directory.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   324
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   325
    static class DirClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   326
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   327
        private final File dir;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   328
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   329
        DirClassPathEntry(String name) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   330
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   331
            dir = new File(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   332
            assert dir.isDirectory();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   333
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   334
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   335
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   336
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   337
            URL url = dir.toURI().toURL();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   338
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   339
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   340
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   341
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   342
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   343
            List<String> classNames = new ArrayList<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   344
            String root = dir.getPath();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   345
            SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   346
                @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   347
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   348
                    if (attrs.isRegularFile()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   349
                        File path = file.toFile();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   350
                        if (path.getName().endsWith(".class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   351
                            String pathString = path.getPath();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   352
                            assert pathString.startsWith(root);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   353
                            String classFile = pathString.substring(root.length() + 1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   354
                            String className = classFile.replace(File.separatorChar, '.');
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   355
                            classNames.add(className.replace('/', '.').substring(0, className.length() - ".class".length()));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   356
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   357
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   358
                    return super.visitFile(file, attrs);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   359
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   360
            };
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   361
            Files.walkFileTree(dir.toPath(), visitor);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   362
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   363
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   364
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   365
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   366
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   367
     * A class path entry that is a jar or zip file.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   368
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   369
    static class JarClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   370
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   371
        private final JarFile jarFile;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   372
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   373
        JarClassPathEntry(String name) throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   374
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   375
            jarFile = new JarFile(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   376
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   377
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   378
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   379
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   380
            URL url = new URL("jar", "", "file:" + name + "!/");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   381
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   382
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   383
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   384
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   385
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   386
            Enumeration<JarEntry> e = jarFile.entries();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   387
            List<String> classNames = new ArrayList<>(jarFile.size());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   388
            while (e.hasMoreElements()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   389
                JarEntry je = e.nextElement();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   390
                if (je.isDirectory() || !je.getName().endsWith(".class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   391
                    continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   392
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   393
                String className = je.getName().substring(0, je.getName().length() - ".class".length());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   394
                classNames.add(className.replace('/', '.'));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   395
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   396
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   397
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   398
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   399
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   400
        public void close() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   401
            jarFile.close();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   402
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   403
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   404
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   405
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   406
     * A class path entry representing the {@code jrt:/} file system.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   407
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   408
    static class JRTClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   409
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   410
        private final String limitModules;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   411
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   412
        JRTClassPathEntry(String name, String limitModules) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   413
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   414
            this.limitModules = limitModules;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   415
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   416
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   417
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   418
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   419
            URL url = URI.create("jrt:/").toURL();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   420
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   421
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   422
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   423
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   424
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   425
            Set<String> negative = new HashSet<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   426
            Set<String> positive = new HashSet<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   427
            if (limitModules != null && !limitModules.isEmpty()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   428
                for (String s : limitModules.split(",")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   429
                    if (s.startsWith("~")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   430
                        negative.add(s.substring(1));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   431
                    } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   432
                        positive.add(s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   433
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   434
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   435
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   436
            List<String> classNames = new ArrayList<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   437
            FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), Collections.emptyMap());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   438
            Path top = fs.getPath("/modules/");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   439
            Files.find(top, Integer.MAX_VALUE,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   440
                            (path, attrs) -> attrs.isRegularFile()).forEach(p -> {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   441
                                int nameCount = p.getNameCount();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   442
                                if (nameCount > 2) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   443
                                    String base = p.getName(nameCount - 1).toString();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   444
                                    if (base.endsWith(".class") && !base.equals("module-info.class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   445
                                        String module = p.getName(1).toString();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   446
                                        if (positive.isEmpty() || positive.contains(module)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   447
                                            if (negative.isEmpty() || !negative.contains(module)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   448
                                                // Strip module prefix and convert to dotted form
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   449
                                                String className = p.subpath(2, nameCount).toString().replace('/', '.');
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   450
                                                // Strip ".class" suffix
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   451
                                                className = className.replace('/', '.').substring(0, className.length() - ".class".length());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   452
                                                classNames.add(className);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   453
                                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   454
                                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   455
                                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   456
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   457
                            });
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   458
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   459
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   460
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   461
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   462
    private boolean isClassIncluded(String className) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   463
        if (methodFilters != null && !MethodFilter.matchesClassName(methodFilters, className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   464
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   465
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   466
        if (excludeMethodFilters != null && MethodFilter.matchesClassName(excludeMethodFilters, className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   467
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   468
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   469
        return true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   470
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   471
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   472
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   473
     * Compiles all methods in all classes in a given class path.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   474
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   475
     * @param classPath class path denoting classes to compile
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   476
     * @throws IOException
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   477
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   478
    @SuppressWarnings("try")
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   479
    private void compile(String classPath) throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   480
        final String[] entries = classPath.split(File.pathSeparator);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   481
        long start = System.currentTimeMillis();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   482
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   483
        try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   484
            // compile dummy method to get compiler initialized outside of the
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   485
            // config debug override.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   486
            HotSpotResolvedJavaMethod dummyMethod = (HotSpotResolvedJavaMethod) JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess().lookupJavaMethod(
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   487
                            CompileTheWorld.class.getDeclaredMethod("dummy"));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   488
            int entryBCI = JVMCICompiler.INVOCATION_ENTRY_BCI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   489
            boolean useProfilingInfo = false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   490
            boolean installAsDefault = false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   491
            CompilationTask task = new CompilationTask(jvmciRuntime, compiler, new HotSpotCompilationRequest(dummyMethod, entryBCI, 0L), useProfilingInfo, installAsDefault, currentOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   492
            task.runCompilation();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   493
        } catch (NoSuchMethodException | SecurityException e1) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   494
            printStackTrace(e1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   495
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   496
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   497
        /*
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   498
         * Always use a thread pool, even for single threaded mode since it simplifies the use of
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   499
         * DebugValueThreadFilter to filter on the thread names.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   500
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   501
        int threadCount = 1;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   502
        if (Options.MultiThreaded.getValue(currentOptions)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   503
            threadCount = Options.Threads.getValue(currentOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   504
            if (threadCount == 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   505
                threadCount = Runtime.getRuntime().availableProcessors();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   506
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   507
        } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   508
            running = true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   509
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   510
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   511
        OptionValues savedOptions = currentOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   512
        currentOptions = new OptionValues(savedOptions, compilationOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   513
        threadPool = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   514
                        new CompilerThreadFactory("CompileTheWorld", new DebugConfigAccess() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   515
                            @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   516
                            public GraalDebugConfig getDebugConfig() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   517
                                return DebugEnvironment.ensureInitialized(currentOptions, compiler.getGraalRuntime().getHostProviders().getSnippetReflection());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   518
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   519
                        }));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   520
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   521
        try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   522
            for (int i = 0; i < entries.length; i++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   523
                final String entry = entries[i];
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   524
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   525
                ClassPathEntry cpe;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   526
                if (entry.endsWith(".zip") || entry.endsWith(".jar")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   527
                    cpe = new JarClassPathEntry(entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   528
                } else if (entry.equals(JRT_CLASS_PATH_ENTRY)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   529
                    cpe = new JRTClassPathEntry(entry, Options.LimitModules.getValue(currentOptions));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   530
                } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   531
                    if (!new File(entry).isDirectory()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   532
                        println("CompileTheWorld : Skipped classes in " + entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   533
                        println();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   534
                        continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   535
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   536
                    cpe = new DirClassPathEntry(entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   537
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   538
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   539
                if (methodFilters == null || methodFilters.length == 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   540
                    println("CompileTheWorld : Compiling all classes in " + entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   541
                } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   542
                    String include = Arrays.asList(methodFilters).stream().map(MethodFilter::toString).collect(Collectors.joining(", "));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   543
                    println("CompileTheWorld : Compiling all methods in " + entry + " matching one of the following filters: " + include);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   544
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   545
                if (excludeMethodFilters != null && excludeMethodFilters.length > 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   546
                    String exclude = Arrays.asList(excludeMethodFilters).stream().map(MethodFilter::toString).collect(Collectors.joining(", "));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   547
                    println("CompileTheWorld : Excluding all methods matching one of the following filters: " + exclude);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   548
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   549
                println();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   550
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   551
                ClassLoader loader = cpe.createClassLoader();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   552
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   553
                for (String className : cpe.getClassNames()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   554
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   555
                    // Are we done?
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   556
                    if (classFileCounter >= stopAt) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   557
                        break;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   558
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   559
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   560
                    classFileCounter++;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   561
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   562
                    if (className.startsWith("jdk.management.") || className.startsWith("jdk.internal.cmm.*")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   563
                        continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   564
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   565
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   566
                    try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   567
                        // Load and initialize class
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   568
                        Class<?> javaClass = Class.forName(className, true, loader);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   569
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   570
                        // Pre-load all classes in the constant pool.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   571
                        try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   572
                            HotSpotResolvedObjectType objectType = HotSpotResolvedObjectType.fromObjectClass(javaClass);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   573
                            ConstantPool constantPool = objectType.getConstantPool();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   574
                            for (int cpi = 1; cpi < constantPool.length(); cpi++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   575
                                constantPool.loadReferencedType(cpi, Bytecodes.LDC);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   576
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   577
                        } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   578
                            // If something went wrong during pre-loading we just ignore it.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   579
                            if (isClassIncluded(className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   580
                                println("Preloading failed for (%d) %s: %s", classFileCounter, className, t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   581
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   582
                            continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   583
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   584
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   585
                        /*
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   586
                         * Only check filters after class loading and resolution to mitigate impact
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   587
                         * on reproducibility.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   588
                         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   589
                        if (!isClassIncluded(className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   590
                            continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   591
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   592
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   593
                        // Are we compiling this class?
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   594
                        MetaAccessProvider metaAccess = JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   595
                        if (classFileCounter >= startAt) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   596
                            println("CompileTheWorld (%d) : %s", classFileCounter, className);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   597
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   598
                            // Compile each constructor/method in the class.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   599
                            for (Constructor<?> constructor : javaClass.getDeclaredConstructors()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   600
                                HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(constructor);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   601
                                if (canBeCompiled(javaMethod, constructor.getModifiers())) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   602
                                    compileMethod(javaMethod);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   603
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   604
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   605
                            for (Method method : javaClass.getDeclaredMethods()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   606
                                HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   607
                                if (canBeCompiled(javaMethod, method.getModifiers())) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   608
                                    compileMethod(javaMethod);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   609
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   610
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   611
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   612
                            // Also compile the class initializer if it exists
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   613
                            HotSpotResolvedJavaMethod clinit = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaType(javaClass).getClassInitializer();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   614
                            if (clinit != null && canBeCompiled(clinit, clinit.getModifiers())) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   615
                                compileMethod(clinit);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   616
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   617
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   618
                    } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   619
                        if (isClassIncluded(className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   620
                            println("CompileTheWorld (%d) : Skipping %s %s", classFileCounter, className, t.toString());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   621
                            printStackTrace(t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   622
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   623
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   624
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   625
                cpe.close();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   626
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   627
        } finally {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   628
            currentOptions = savedOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   629
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   630
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   631
        if (!running) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   632
            startThreads();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   633
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   634
        int wakeups = 0;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   635
        while (threadPool.getCompletedTaskCount() != threadPool.getTaskCount()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   636
            if (wakeups % 15 == 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   637
                TTY.println("CompileTheWorld : Waiting for " + (threadPool.getTaskCount() - threadPool.getCompletedTaskCount()) + " compiles");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   638
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   639
            try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   640
                threadPool.awaitTermination(1, TimeUnit.SECONDS);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   641
                wakeups++;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   642
            } catch (InterruptedException e) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   643
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   644
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   645
        threadPool = null;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   646
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   647
        long elapsedTime = System.currentTimeMillis() - start;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   648
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   649
        println();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   650
        if (Options.MultiThreaded.getValue(currentOptions)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   651
            TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms elapsed, %d ms compile time, %d bytes of memory used)", classFileCounter, compiledMethodsCounter.get(), elapsedTime,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   652
                            compileTime.get(), memoryUsed.get());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   653
        } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   654
            TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms, %d bytes of memory used)", classFileCounter, compiledMethodsCounter.get(), compileTime.get(), memoryUsed.get());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   655
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   656
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   657
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   658
    private synchronized void startThreads() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   659
        running = true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   660
        // Wake up any waiting threads
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   661
        notifyAll();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   662
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   663
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   664
    private synchronized void waitToRun() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   665
        while (!running) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   666
            try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   667
                wait();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   668
            } catch (InterruptedException e) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   669
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   670
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   671
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   672
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   673
    @SuppressWarnings("try")
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   674
    private void compileMethod(HotSpotResolvedJavaMethod method) throws InterruptedException, ExecutionException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   675
        if (methodFilters != null && !MethodFilter.matches(methodFilters, method)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   676
            return;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   677
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   678
        if (excludeMethodFilters != null && MethodFilter.matches(excludeMethodFilters, method)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   679
            return;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   680
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   681
        Future<?> task = threadPool.submit(new Runnable() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   682
            @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   683
            public void run() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   684
                waitToRun();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   685
                OptionValues savedOptions = currentOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   686
                currentOptions = new OptionValues(savedOptions, compilationOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   687
                try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   688
                    compileMethod(method, classFileCounter);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   689
                } finally {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   690
                    currentOptions = savedOptions;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   691
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   692
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   693
        });
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   694
        if (threadPool.getCorePoolSize() == 1) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   695
            task.get();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   696
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   697
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   698
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   699
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   700
     * Compiles a method and gathers some statistics.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   701
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   702
    private void compileMethod(HotSpotResolvedJavaMethod method, int counter) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   703
        try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   704
            long start = System.currentTimeMillis();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   705
            long allocatedAtStart = MemUseTrackerImpl.getCurrentThreadAllocatedBytes();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   706
            int entryBCI = JVMCICompiler.INVOCATION_ENTRY_BCI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   707
            HotSpotCompilationRequest request = new HotSpotCompilationRequest(method, entryBCI, 0L);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   708
            // For more stable CTW execution, disable use of profiling information
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   709
            boolean useProfilingInfo = false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   710
            boolean installAsDefault = false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   711
            CompilationTask task = new CompilationTask(jvmciRuntime, compiler, request, useProfilingInfo, installAsDefault, currentOptions);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   712
            task.runCompilation();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   713
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   714
            // Invalidate the generated code so the code cache doesn't fill up
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   715
            HotSpotInstalledCode installedCode = task.getInstalledCode();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   716
            if (installedCode != null) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   717
                installedCode.invalidate();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   718
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   719
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   720
            memoryUsed.getAndAdd(MemUseTrackerImpl.getCurrentThreadAllocatedBytes() - allocatedAtStart);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   721
            compileTime.getAndAdd(System.currentTimeMillis() - start);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   722
            compiledMethodsCounter.incrementAndGet();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   723
        } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   724
            // Catch everything and print a message
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   725
            println("CompileTheWorld (%d) : Error compiling method: %s", counter, method.format("%H.%n(%p):%r"));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   726
            printStackTrace(t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   727
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   728
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   729
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   730
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   731
     * Determines if a method should be compiled (Cf. CompilationPolicy::can_be_compiled).
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   732
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   733
     * @return true if it can be compiled, false otherwise
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   734
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   735
    private boolean canBeCompiled(HotSpotResolvedJavaMethod javaMethod, int modifiers) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   736
        if (Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   737
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   738
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   739
        GraalHotSpotVMConfig c = compiler.getGraalRuntime().getVMConfig();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   740
        if (c.dontCompileHugeMethods && javaMethod.getCodeSize() > c.hugeMethodLimit) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   741
            println(verbose || methodFilters != null,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   742
                            String.format("CompileTheWorld (%d) : Skipping huge method %s (use -XX:-DontCompileHugeMethods or -XX:HugeMethodLimit=%d to include it)", classFileCounter,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   743
                                            javaMethod.format("%H.%n(%p):%r"),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   744
                                            javaMethod.getCodeSize()));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   745
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   746
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   747
        // Allow use of -XX:CompileCommand=dontinline to exclude problematic methods
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   748
        if (!javaMethod.canBeInlined()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   749
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   750
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   751
        // Skip @Snippets for now
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   752
        for (Annotation annotation : javaMethod.getAnnotations()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   753
            if (annotation.annotationType().equals(Snippet.class)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   754
                return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   755
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   756
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   757
        return true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   758
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   759
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   760
    static class Options {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   761
        // @formatter:off
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   762
        public static final OptionKey<Boolean> Help = new OptionKey<>(false);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   763
        public static final OptionKey<String> Classpath = new OptionKey<>(CompileTheWorld.SUN_BOOT_CLASS_PATH);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   764
        public static final OptionKey<Boolean> Verbose = new OptionKey<>(true);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   765
        /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   766
         * Ignore Graal classes by default to avoid problems associated with compiling
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   767
         * snippets and method substitutions.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   768
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   769
        public static final OptionKey<String> LimitModules = new OptionKey<>("~jdk.internal.vm.compiler");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   770
        public static final OptionKey<Integer> Iterations = new OptionKey<>(1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   771
        public static final OptionKey<String> MethodFilter = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   772
        public static final OptionKey<String> ExcludeMethodFilter = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   773
        public static final OptionKey<Integer> StartAt = new OptionKey<>(1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   774
        public static final OptionKey<Integer> StopAt = new OptionKey<>(Integer.MAX_VALUE);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   775
        public static final OptionKey<String> Config = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   776
        public static final OptionKey<Boolean> MultiThreaded = new OptionKey<>(false);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   777
        public static final OptionKey<Integer> Threads = new OptionKey<>(0);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   778
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   779
        static final ReflectionOptionDescriptors DESCRIPTORS = new ReflectionOptionDescriptors(Options.class,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   780
                           "Help", "List options and their help messages and then exit.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   781
                      "Classpath", "Class path denoting methods to compile. Default is to compile boot classes.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   782
                        "Verbose", "Verbose operation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   783
                   "LimitModules", "Comma separated list of module names to which compilation should be limited. " +
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   784
                                   "Module names can be prefixed with \"~\" to exclude the named module.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   785
                     "Iterations", "The number of iterations to perform.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   786
                   "MethodFilter", "Only compile methods matching this filter.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   787
            "ExcludeMethodFilter", "Exclude methods matching this filter from compilation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   788
                        "StartAt", "First class to consider for compilation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   789
                         "StopAt", "Last class to consider for compilation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   790
                         "Config", "Option value overrides to use during compile the world. For example, " +
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   791
                                   "to disable inlining and partial escape analysis specify 'PartialEscapeAnalysis=false Inline=false'. " +
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   792
                                   "The format for each option is the same as on the command line just without the '-Dgraal.' prefix.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   793
                  "MultiThreaded", "Run using multiple threads for compilation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   794
                        "Threads", "Number of threads to use for multithreaded execution. Defaults to Runtime.getRuntime().availableProcessors().");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   795
        // @formatter:on
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   796
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   797
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   798
    public static OptionValues loadOptions(OptionValues initialValues) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   799
        EconomicMap<OptionKey<?>, Object> values = OptionValues.newOptionMap();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   800
        List<OptionDescriptors> loader = singletonList(DESCRIPTORS);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   801
        OptionsParser.parseOptions(extractEntries(System.getProperties(), "CompileTheWorld.", true), values, loader);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   802
        OptionValues options = new OptionValues(initialValues, values);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   803
        if (Options.Help.getValue(options)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   804
            options.printHelp(loader, System.out, "CompileTheWorld.");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   805
            System.exit(0);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   806
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   807
        return options;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   808
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   809
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   810
    public static void main(String[] args) throws Throwable {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   811
        Services.exportJVMCITo(CompileTheWorld.class);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   812
        HotSpotJVMCIRuntime jvmciRuntime = HotSpotJVMCIRuntime.runtime();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   813
        HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) jvmciRuntime.getCompiler();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   814
        HotSpotGraalRuntimeProvider graalRuntime = compiler.getGraalRuntime();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   815
        HotSpotCodeCacheProvider codeCache = graalRuntime.getHostProviders().getCodeCache();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   816
        OptionValues options = loadOptions(graalRuntime.getOptions());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   817
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   818
        int iterations = Options.Iterations.getValue(options);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   819
        for (int i = 0; i < iterations; i++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   820
            codeCache.resetCompilationStatistics();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   821
            TTY.println("CompileTheWorld : iteration " + i);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   822
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   823
            CompileTheWorld ctw = new CompileTheWorld(jvmciRuntime, compiler, options);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   824
            ctw.compile();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   825
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   826
        // This is required as non-daemon threads can be started by class initializers
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   827
        System.exit(0);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   828
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   829
}