src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/CompileTheWorld.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58299 6df94ce3ab2f
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
     1
/*
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
     2
 * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
46393
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
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 49873
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 49873
diff changeset
    24
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    25
package org.graalvm.compiler.hotspot.test;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    26
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    27
import static java.util.Collections.singletonList;
46680
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
    28
import static org.graalvm.compiler.core.CompilationWrapper.ExceptionAction.Print;
54204
55c262f4f5a1 8220389: Update Graal
jwilhelm
parents: 54084
diff changeset
    29
import static org.graalvm.compiler.core.GraalCompilerOptions.CompilationBailoutAsFailure;
46680
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
    30
import static org.graalvm.compiler.core.GraalCompilerOptions.CompilationFailureAction;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    31
import static org.graalvm.compiler.core.test.ReflectionOptionDescriptors.extractEntries;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
    32
import static org.graalvm.compiler.debug.MemUseTrackerKey.getCurrentThreadAllocatedBytes;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    33
import static org.graalvm.compiler.hotspot.CompilationTask.CompilationTime;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    34
import static org.graalvm.compiler.hotspot.CompilationTask.CompiledAndInstalledBytecodes;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    35
import static org.graalvm.compiler.hotspot.test.CompileTheWorld.Options.DESCRIPTORS;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    36
import static org.graalvm.compiler.hotspot.test.CompileTheWorld.Options.InvalidateInstalledCode;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
    37
import static sun.misc.Unsafe.ARRAY_BYTE_BASE_OFFSET;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    38
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
    39
import java.io.ByteArrayOutputStream;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    40
import java.io.Closeable;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    41
import java.io.File;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    42
import java.io.IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    43
import java.lang.annotation.Annotation;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    44
import java.lang.reflect.Constructor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    45
import java.lang.reflect.Method;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    46
import java.lang.reflect.Modifier;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    47
import java.net.URI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    48
import java.net.URL;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    49
import java.net.URLClassLoader;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    50
import java.nio.file.FileSystem;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    51
import java.nio.file.FileSystems;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    52
import java.nio.file.FileVisitResult;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    53
import java.nio.file.Files;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    54
import java.nio.file.Path;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    55
import java.nio.file.SimpleFileVisitor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    56
import java.nio.file.attribute.BasicFileAttributes;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    57
import java.util.ArrayList;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    58
import java.util.Arrays;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    59
import java.util.Collections;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    60
import java.util.Enumeration;
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
    61
import java.util.HashMap;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    62
import java.util.HashSet;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    63
import java.util.List;
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
    64
import java.util.Map;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    65
import java.util.ServiceLoader;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    66
import java.util.Set;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    67
import java.util.concurrent.ExecutionException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    68
import java.util.concurrent.Future;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    69
import java.util.concurrent.LinkedBlockingQueue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    70
import java.util.concurrent.ThreadPoolExecutor;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    71
import java.util.concurrent.TimeUnit;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    72
import java.util.concurrent.atomic.AtomicLong;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    73
import java.util.jar.JarEntry;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    74
import java.util.jar.JarFile;
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    75
import java.util.regex.Matcher;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    76
import java.util.regex.Pattern;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    77
import java.util.stream.Collectors;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    78
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
    79
import jdk.internal.vm.compiler.collections.EconomicMap;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
    80
import jdk.internal.vm.compiler.collections.UnmodifiableMapCursor;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    81
import org.graalvm.compiler.api.replacements.Snippet;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    82
import org.graalvm.compiler.bytecode.Bytecodes;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    83
import org.graalvm.compiler.core.CompilerThreadFactory;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
    84
import org.graalvm.compiler.core.phases.HighTier;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    85
import org.graalvm.compiler.core.test.ReflectionOptionDescriptors;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
    86
import org.graalvm.compiler.debug.DebugOptions;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    87
import org.graalvm.compiler.debug.GlobalMetrics;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    88
import org.graalvm.compiler.debug.GraalError;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    89
import org.graalvm.compiler.debug.MethodFilter;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    90
import org.graalvm.compiler.debug.MetricKey;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    91
import org.graalvm.compiler.debug.TTY;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    92
import org.graalvm.compiler.hotspot.CompilationTask;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    93
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    94
import org.graalvm.compiler.hotspot.HotSpotGraalCompiler;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    95
import org.graalvm.compiler.hotspot.HotSpotGraalRuntime;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    96
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
    97
import org.graalvm.compiler.hotspot.test.CompileTheWorld.LibGraalParams.StackTraceBuffer;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    98
import org.graalvm.compiler.options.OptionDescriptors;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
    99
import org.graalvm.compiler.options.OptionKey;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   100
import org.graalvm.compiler.options.OptionValues;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   101
import org.graalvm.compiler.options.OptionsParser;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   102
import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   103
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   104
import org.graalvm.compiler.test.ModuleSupport;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   105
import jdk.internal.vm.compiler.libgraal.LibGraal;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   106
import jdk.internal.vm.compiler.libgraal.LibGraalScope;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   107
import jdk.internal.vm.compiler.libgraal.OptionsEncoder;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   108
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   109
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   110
import jdk.vm.ci.hotspot.HotSpotCompilationRequest;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   111
import jdk.vm.ci.hotspot.HotSpotInstalledCode;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   112
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   113
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   114
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   115
import jdk.vm.ci.meta.ConstantPool;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   116
import jdk.vm.ci.meta.MetaAccessProvider;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   117
import jdk.vm.ci.runtime.JVMCI;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   118
import jdk.vm.ci.runtime.JVMCICompiler;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   119
import sun.misc.Unsafe;
46393
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
 * This class implements compile-the-world functionality with JVMCI.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   123
 */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   124
public final class CompileTheWorld {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   125
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   126
    static {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   127
        ModuleSupport.exportAndOpenAllPackagesToUnnamed("jdk.internal.vm.compiler");
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   128
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   129
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   130
    /**
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   131
     * Magic token to denote that JDK classes are to be compiled. For JDK 8, the classes in
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   132
     * {@code rt.jar} are compiled. Otherwise the classes in the Java runtime image are compiled.
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   133
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   134
    public static final String SUN_BOOT_CLASS_PATH = "sun.boot.class.path";
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   135
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   136
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   137
     * 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
   138
     * system).
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   139
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   140
    public static final String JRT_CLASS_PATH_ENTRY = "<jrt>";
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   141
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   142
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   143
     * @param options a space separated set of option value settings with each option setting in a
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   144
     *            {@code -Dgraal.<name>=<value>} format but without the leading {@code -Dgraal.}.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   145
     *            Ignored if null.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   146
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   147
    public static EconomicMap<OptionKey<?>, Object> parseOptions(String options) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   148
        EconomicMap<OptionKey<?>, Object> values = OptionValues.newOptionMap();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   149
        if (options != null) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   150
            EconomicMap<String, String> optionSettings = EconomicMap.create();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   151
            for (String optionSetting : options.split("\\s+|#")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   152
                OptionsParser.parseOptionSettingTo(optionSetting, optionSettings);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   153
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   154
            ServiceLoader<OptionDescriptors> loader = ServiceLoader.load(OptionDescriptors.class, OptionDescriptors.class.getClassLoader());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   155
            OptionsParser.parseOptions(optionSettings, values, loader);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   156
        }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   157
        if (!values.containsKey(HighTier.Options.Inline)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   158
            values.put(HighTier.Options.Inline, false);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   159
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   160
        return values;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   161
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   162
50858
2d3e99a72541 8205824: Update Graal
never
parents: 49873
diff changeset
   163
    private final HotSpotJVMCIRuntime jvmciRuntime;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   164
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   165
    private final HotSpotGraalCompiler compiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   166
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   167
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   168
     * Class path denoting classes to compile.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   169
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   170
     * @see Options#Classpath
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   171
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   172
    private final String inputClassPath;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   173
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   174
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   175
     * Class index to start compilation at.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   176
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   177
     * @see Options#StartAt
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   178
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   179
    private final int startAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   180
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   181
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   182
     * Class index to stop compilation at.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   183
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   184
     * @see Options#StopAt
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   185
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   186
    private final int stopAt;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   187
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   188
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   189
     * Max classes to compile.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   190
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   191
     * @see Options#MaxClasses
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   192
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   193
    private final int maxClasses;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   194
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   195
    /** 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
   196
    private final MethodFilter[] methodFilters;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   197
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   198
    /** Exclude methods matching one of the filters in this array if the array is non-null. */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   199
    private final MethodFilter[] excludeMethodFilters;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   200
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   201
    // Counters
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   202
    private int classFileCounter = 0;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   203
    private AtomicLong compiledMethodsCounter = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   204
    private AtomicLong compileTime = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   205
    private AtomicLong memoryUsed = new AtomicLong();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   206
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   207
    private boolean verbose;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   208
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   209
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   210
     * Signal that the threads should start compiling in multithreaded mode.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   211
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   212
    private boolean running;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   213
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   214
    private ThreadPoolExecutor threadPool;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   215
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   216
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   217
     * Values for {@link CompileTheWorld.Options}.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   218
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   219
    private final OptionValues harnessOptions;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   220
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   221
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   222
     * Option values used during compilation.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   223
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   224
    private final OptionValues compilerOptions;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   225
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   226
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   227
     * Manages native memory buffers for passing arguments into libgraal and receiving return
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   228
     * values. The native memory buffers are freed when this object is {@linkplain #close() closed}.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   229
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   230
    static class LibGraalParams implements AutoCloseable {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   231
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   232
        static {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   233
            LibGraal.registerNativeMethods(HotSpotJVMCIRuntime.runtime(), CompileTheWorld.class);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   234
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   235
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   236
        /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   237
         * Native memory containing {@linkplain OptionsEncoder encoded} {@link OptionValues}.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   238
         */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   239
        static class OptionsBuffer {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   240
            private long address;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   241
            final int size;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   242
            final int hash;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   243
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   244
            OptionsBuffer(OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   245
                Map<String, Object> map = new HashMap<>();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   246
                UnmodifiableMapCursor<OptionKey<?>, Object> cursor = options.getMap().getEntries();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   247
                while (cursor.advance()) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   248
                    final OptionKey<?> key = cursor.getKey();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   249
                    Object value = cursor.getValue();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   250
                    map.put(key.getName(), value);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   251
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   252
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   253
                byte[] encoded = OptionsEncoder.encode(map);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   254
                size = encoded.length;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   255
                hash = Arrays.hashCode(encoded);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   256
                address = UNSAFE.allocateMemory(encoded.length);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   257
                UNSAFE.copyMemory(encoded, ARRAY_BYTE_BASE_OFFSET, null, address, size);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   258
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   259
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   260
            long getAddress() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   261
                if (address == 0) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   262
                    throw new IllegalStateException();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   263
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   264
                return address;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   265
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   266
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   267
            void free() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   268
                if (address != 0) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   269
                    UNSAFE.freeMemory(address);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   270
                    address = 0;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   271
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   272
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   273
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   274
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   275
        /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   276
         * Manages native memory for receiving a {@linkplain Throwable#printStackTrace() stack
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   277
         * trace} from libgraal serialized via {@link ByteArrayOutputStream} to a byte array.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   278
         */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   279
        static class StackTraceBuffer {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   280
            final int size;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   281
            private long address;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   282
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   283
            StackTraceBuffer(int size) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   284
                this.size = size;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   285
                address = UNSAFE.allocateMemory(size);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   286
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   287
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   288
            void free() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   289
                if (address != 0L) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   290
                    UNSAFE.freeMemory(address);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   291
                    address = 0L;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   292
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   293
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   294
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   295
            long getAddress() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   296
                if (address == 0) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   297
                    throw new IllegalStateException();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   298
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   299
                return address;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   300
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   301
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   302
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   303
        final OptionsBuffer options;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   304
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   305
        private final List<StackTraceBuffer> stackTraceBuffers = new ArrayList<>();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   306
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   307
        /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   308
         * Gets a stack trace buffer for the current thread.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   309
         */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   310
        StackTraceBuffer getStackTraceBuffer() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   311
            return stackTraceBuffer.get();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   312
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   313
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   314
        private final ThreadLocal<StackTraceBuffer> stackTraceBuffer = new ThreadLocal<StackTraceBuffer>() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   315
            @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   316
            protected StackTraceBuffer initialValue() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   317
                StackTraceBuffer buffer = new StackTraceBuffer(10_000);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   318
                synchronized (stackTraceBuffers) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   319
                    stackTraceBuffers.add(buffer);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   320
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   321
                return buffer;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   322
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   323
        };
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   324
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   325
        LibGraalParams(OptionValues options) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   326
            this.options = new OptionsBuffer(options);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   327
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   328
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   329
        @Override
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   330
        public void close() {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   331
            options.free();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   332
            synchronized (stackTraceBuffers) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   333
                for (StackTraceBuffer buffer : stackTraceBuffers) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   334
                    buffer.free();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   335
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   336
                stackTraceBuffers.clear();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   337
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   338
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   339
    }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   340
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   341
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   342
     * Creates a compile-the-world instance.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   343
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   344
     * @param files {@link File#pathSeparator} separated list of Zip/Jar files to compile
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   345
     * @param startAt index of the class file to start compilation at
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   346
     * @param stopAt index of the class file to stop compilation at
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   347
     * @param maxClasses maximum number of classes to process
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   348
     * @param methodFilters
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   349
     * @param excludeMethodFilters
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   350
     * @param harnessOptions values for {@link CompileTheWorld.Options}
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   351
     * @param compilerOptions option values used by the compiler
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   352
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   353
    public CompileTheWorld(HotSpotJVMCIRuntime jvmciRuntime,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   354
                    HotSpotGraalCompiler compiler,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   355
                    String files,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   356
                    int startAt,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   357
                    int stopAt,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   358
                    int maxClasses,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   359
                    String methodFilters,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   360
                    String excludeMethodFilters,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   361
                    boolean verbose,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   362
                    OptionValues harnessOptions,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   363
                    OptionValues compilerOptions) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   364
        this.jvmciRuntime = jvmciRuntime;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   365
        this.compiler = compiler;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   366
        this.inputClassPath = files;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   367
        this.startAt = Math.max(startAt, 1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   368
        this.stopAt = Math.max(stopAt, 1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   369
        this.maxClasses = Math.max(maxClasses, 1);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   370
        this.methodFilters = methodFilters == null || methodFilters.isEmpty() ? null : MethodFilter.parse(methodFilters);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   371
        this.excludeMethodFilters = excludeMethodFilters == null || excludeMethodFilters.isEmpty() ? null : MethodFilter.parse(excludeMethodFilters);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   372
        this.verbose = verbose;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   373
        this.harnessOptions = harnessOptions;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   374
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46393
diff changeset
   375
        // Copy the initial options and add in any extra options
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   376
        EconomicMap<OptionKey<?>, Object> compilerOptionsMap = EconomicMap.create(compilerOptions.getMap());
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46393
diff changeset
   377
46680
2894e4262fd6 8184768: Update Graal
iveresov
parents: 46640
diff changeset
   378
        // We want to see stack traces when a method fails to compile
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   379
        CompilationBailoutAsFailure.putIfAbsent(compilerOptionsMap, true);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   380
        CompilationFailureAction.putIfAbsent(compilerOptionsMap, Print);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   381
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   382
        // By default only report statistics for the CTW threads themselves
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   383
        DebugOptions.MetricsThreadFilter.putIfAbsent(compilerOptionsMap, "^CompileTheWorld");
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   384
        this.compilerOptions = new OptionValues(compilerOptionsMap);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   385
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   386
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   387
    public CompileTheWorld(HotSpotJVMCIRuntime jvmciRuntime,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   388
                    HotSpotGraalCompiler compiler,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   389
                    OptionValues harnessOptions,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   390
                    OptionValues compilerOptions) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   391
        this(jvmciRuntime, compiler, Options.Classpath.getValue(harnessOptions),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   392
                        Options.StartAt.getValue(harnessOptions),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   393
                        Options.StopAt.getValue(harnessOptions),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   394
                        Options.MaxClasses.getValue(harnessOptions),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   395
                        Options.MethodFilter.getValue(harnessOptions),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   396
                        Options.ExcludeMethodFilter.getValue(harnessOptions),
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   397
                        Options.Verbose.hasBeenSet(harnessOptions) ? Options.Verbose.getValue(harnessOptions) : !Options.MultiThreaded.getValue(harnessOptions),
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   398
                        harnessOptions,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   399
                        new OptionValues(compilerOptions, parseOptions(Options.Config.getValue(harnessOptions))));
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   400
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   401
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   402
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   403
     * Compiles all methods in all classes in {@link #inputClassPath}. If {@link #inputClassPath}
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   404
     * equals {@link #SUN_BOOT_CLASS_PATH} the boot classes are used.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   405
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   406
    @SuppressWarnings("try")
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   407
    public void compile() throws Throwable {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   408
        try (LibGraalParams libgraal = LibGraal.isAvailable() ? new LibGraalParams(compilerOptions) : null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   409
            if (SUN_BOOT_CLASS_PATH.equals(inputClassPath)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   410
                String bcpEntry = null;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   411
                if (JavaVersionUtil.JAVA_SPEC <= 8) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   412
                    final String[] entries = System.getProperty(SUN_BOOT_CLASS_PATH).split(File.pathSeparator);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   413
                    for (int i = 0; i < entries.length && bcpEntry == null; i++) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   414
                        String entry = entries[i];
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   415
                        File entryFile = new File(entry);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   416
                        if (entryFile.getName().endsWith("rt.jar") && entryFile.isFile()) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   417
                            bcpEntry = entry;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   418
                        }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   419
                    }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   420
                    if (bcpEntry == null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   421
                        throw new GraalError("Could not find rt.jar on boot class path %s", System.getProperty(SUN_BOOT_CLASS_PATH));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   422
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   423
                } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   424
                    bcpEntry = JRT_CLASS_PATH_ENTRY;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   425
                }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   426
                compile(bcpEntry, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   427
            } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   428
                compile(inputClassPath, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   429
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   430
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   431
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   432
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   433
    public void println() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   434
        println("");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   435
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   436
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   437
    public void println(String format, Object... args) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   438
        println(String.format(format, args));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   439
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   440
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   441
    public void println(String s) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   442
        println(verbose, s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   443
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   444
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   445
    public static void println(boolean cond, String s) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   446
        if (cond) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   447
            TTY.println(s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   448
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   449
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   450
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   451
    public void printStackTrace(Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   452
        if (verbose) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   453
            t.printStackTrace(TTY.out);
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
    @SuppressWarnings("unused")
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   458
    private static void dummy() {
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
     * Abstraction over different types of class path entries.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   463
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   464
    abstract static class ClassPathEntry implements Closeable {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   465
        final String name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   466
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   467
        ClassPathEntry(String name) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   468
            this.name = name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   469
        }
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
         * Creates a {@link ClassLoader} for loading classes from this entry.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   473
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   474
        public abstract ClassLoader createClassLoader() throws IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   475
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   476
        /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   477
         * Gets the list of classes available under this entry.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   478
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   479
        public abstract List<String> getClassNames() throws IOException;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   480
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   481
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   482
        public String toString() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   483
            return name;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   484
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   485
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   486
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   487
        public void close() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   488
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   489
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   490
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   491
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   492
     * A class path entry that is a normal file system directory.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   493
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   494
    static class DirClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   495
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   496
        private final File dir;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   497
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   498
        DirClassPathEntry(String name) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   499
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   500
            dir = new File(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   501
            assert dir.isDirectory();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   502
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   503
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   504
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   505
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   506
            URL url = dir.toURI().toURL();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   507
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   508
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   509
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   510
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   511
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   512
            List<String> classNames = new ArrayList<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   513
            String root = dir.getPath();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   514
            SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   515
                @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   516
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   517
                    if (attrs.isRegularFile()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   518
                        File path = file.toFile();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   519
                        if (path.getName().endsWith(".class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   520
                            String pathString = path.getPath();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   521
                            assert pathString.startsWith(root);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   522
                            String classFile = pathString.substring(root.length() + 1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   523
                            String className = classFile.replace(File.separatorChar, '.');
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   524
                            classNames.add(className.replace('/', '.').substring(0, className.length() - ".class".length()));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   525
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   526
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   527
                    return super.visitFile(file, attrs);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   528
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   529
            };
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   530
            Files.walkFileTree(dir.toPath(), visitor);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   531
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   532
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   533
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   534
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   535
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   536
     * A class path entry that is a jar or zip file.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   537
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   538
    static class JarClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   539
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   540
        private final JarFile jarFile;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   541
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   542
        JarClassPathEntry(String name) throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   543
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   544
            jarFile = new JarFile(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   545
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   546
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   547
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   548
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   549
            URL url = new URL("jar", "", "file:" + name + "!/");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   550
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   551
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   552
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   553
        /**
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   554
         * @see "https://docs.oracle.com/javase/9/docs/specs/jar/jar.html#Multi-release"
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   555
         */
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   556
        static Pattern MultiReleaseJarVersionedClassRE = Pattern.compile("META-INF/versions/[1-9][0-9]*/(.+)");
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   557
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   558
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   559
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   560
            Enumeration<JarEntry> e = jarFile.entries();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   561
            List<String> classNames = new ArrayList<>(jarFile.size());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   562
            while (e.hasMoreElements()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   563
                JarEntry je = e.nextElement();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   564
                if (je.isDirectory() || !je.getName().endsWith(".class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   565
                    continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   566
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   567
                String className = je.getName().substring(0, je.getName().length() - ".class".length());
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   568
                if (className.equals("module-info")) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   569
                    continue;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   570
                }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   571
                if (className.startsWith("META-INF/versions/")) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   572
                    Matcher m = MultiReleaseJarVersionedClassRE.matcher(className);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   573
                    if (m.matches()) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   574
                        className = m.group(1);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   575
                    } else {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   576
                        continue;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   577
                    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   578
                }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   579
                classNames.add(className.replace('/', '.'));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   580
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   581
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   582
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   583
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   584
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   585
        public void close() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   586
            jarFile.close();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   587
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   588
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   589
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   590
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   591
     * A class path entry representing the {@code jrt:/} file system.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   592
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   593
    static class JRTClassPathEntry extends ClassPathEntry {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   594
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   595
        private final String limitModules;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   596
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   597
        JRTClassPathEntry(String name, String limitModules) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   598
            super(name);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   599
            this.limitModules = limitModules;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   600
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   601
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   602
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   603
        public ClassLoader createClassLoader() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   604
            URL url = URI.create("jrt:/").toURL();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   605
            return new URLClassLoader(new URL[]{url});
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   606
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   607
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   608
        @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   609
        public List<String> getClassNames() throws IOException {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   610
            Set<String> negative = new HashSet<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   611
            Set<String> positive = new HashSet<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   612
            if (limitModules != null && !limitModules.isEmpty()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   613
                for (String s : limitModules.split(",")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   614
                    if (s.startsWith("~")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   615
                        negative.add(s.substring(1));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   616
                    } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   617
                        positive.add(s);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   618
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   619
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   620
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   621
            List<String> classNames = new ArrayList<>();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   622
            FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), Collections.emptyMap());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   623
            Path top = fs.getPath("/modules/");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   624
            Files.find(top, Integer.MAX_VALUE,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   625
                            (path, attrs) -> attrs.isRegularFile()).forEach(p -> {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   626
                                int nameCount = p.getNameCount();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   627
                                if (nameCount > 2) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   628
                                    String base = p.getName(nameCount - 1).toString();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   629
                                    if (base.endsWith(".class") && !base.equals("module-info.class")) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   630
                                        String module = p.getName(1).toString();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   631
                                        if (positive.isEmpty() || positive.contains(module)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   632
                                            if (negative.isEmpty() || !negative.contains(module)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   633
                                                // Strip module prefix and convert to dotted form
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   634
                                                String className = p.subpath(2, nameCount).toString().replace('/', '.');
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   635
                                                // Strip ".class" suffix
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   636
                                                className = className.replace('/', '.').substring(0, className.length() - ".class".length());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   637
                                                classNames.add(className);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   638
                                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   639
                                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   640
                                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   641
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   642
                            });
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   643
            return classNames;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   644
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   645
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   646
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   647
    private boolean isClassIncluded(String className) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   648
        if (methodFilters != null && !MethodFilter.matchesClassName(methodFilters, className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   649
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   650
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   651
        if (excludeMethodFilters != null && MethodFilter.matchesClassName(excludeMethodFilters, className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   652
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   653
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   654
        return true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   655
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   656
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   657
    private ClassPathEntry openClassPathEntry(String entry) throws IOException {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   658
        if (entry.endsWith(".zip") || entry.endsWith(".jar")) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   659
            return new JarClassPathEntry(entry);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   660
        } else if (entry.equals(JRT_CLASS_PATH_ENTRY)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   661
            return new JRTClassPathEntry(entry, Options.LimitModules.getValue(harnessOptions));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   662
        } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   663
            if (!new File(entry).isDirectory()) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   664
                return null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   665
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   666
            return new DirClassPathEntry(entry);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   667
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   668
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   669
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   670
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   671
     * Compiles all methods in all classes in a given class path.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   672
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   673
     * @param classPath class path denoting classes to compile
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   674
     * @throws IOException
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   675
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   676
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   677
    private void compile(String classPath, LibGraalParams libgraal) throws IOException {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   678
        final String[] entries = classPath.split(File.pathSeparator);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   679
        long start = System.nanoTime();
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   680
        Map<Thread, StackTraceElement[]> initialThreads = Thread.getAllStackTraces();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   681
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   682
        if (libgraal == null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   683
            try {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   684
                // compile dummy method to get compiler initialized outside of the
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   685
                // config debug override.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   686
                HotSpotResolvedJavaMethod dummyMethod = (HotSpotResolvedJavaMethod) JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess().lookupJavaMethod(
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   687
                                CompileTheWorld.class.getDeclaredMethod("dummy"));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   688
                int entryBCI = JVMCICompiler.INVOCATION_ENTRY_BCI;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   689
                boolean useProfilingInfo = false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   690
                boolean installAsDefault = false;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   691
                CompilationTask task = new CompilationTask(jvmciRuntime, compiler, new HotSpotCompilationRequest(dummyMethod, entryBCI, 0L), useProfilingInfo, installAsDefault);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   692
                task.runCompilation(compilerOptions);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   693
            } catch (NoSuchMethodException | SecurityException e1) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   694
                printStackTrace(e1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   695
            }
46393
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
         * Always use a thread pool, even for single threaded mode since it simplifies the use of
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   700
         * DebugValueThreadFilter to filter on the thread names.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   701
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   702
        int threadCount = 1;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   703
        if (Options.MultiThreaded.getValue(harnessOptions)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   704
            threadCount = Options.Threads.getValue(harnessOptions);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   705
            if (threadCount == 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   706
                threadCount = Runtime.getRuntime().availableProcessors();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   707
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   708
        } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   709
            running = true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   710
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   711
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   712
        threadPool = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new CompilerThreadFactory("CompileTheWorld"));
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   713
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   714
        int compileStartAt = startAt;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   715
        int compileStopAt = stopAt;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   716
        int compileStep = 1;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   717
        if (maxClasses != Integer.MAX_VALUE) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   718
            int totalClassFileCount = 0;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   719
            for (String entry : entries) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   720
                try (ClassPathEntry cpe = openClassPathEntry(entry)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   721
                    if (cpe != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   722
                        totalClassFileCount += cpe.getClassNames().size();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   723
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   724
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   725
            }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   726
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   727
            int lastClassFile = totalClassFileCount - 1;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   728
            compileStartAt = Math.min(startAt, lastClassFile);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   729
            compileStopAt = Math.min(stopAt, lastClassFile);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   730
            int range = compileStopAt - compileStartAt + 1;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   731
            if (maxClasses < range) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   732
                compileStep = range / maxClasses;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   733
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   734
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   735
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   736
        for (int i = 0; i < entries.length; i++) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   737
            final String entry = entries[i];
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   738
            try (ClassPathEntry cpe = openClassPathEntry(entry)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   739
                if (cpe == null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   740
                    println("CompileTheWorld : Skipped classes in " + entry);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   741
                    println();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   742
                    continue;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   743
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   744
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   745
                if (methodFilters == null || methodFilters.length == 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   746
                    println("CompileTheWorld : Compiling all classes in " + entry);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   747
                } else {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   748
                    String include = Arrays.asList(methodFilters).stream().map(MethodFilter::toString).collect(Collectors.joining(", "));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   749
                    println("CompileTheWorld : Compiling all methods in " + entry + " matching one of the following filters: " + include);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   750
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   751
                if (excludeMethodFilters != null && excludeMethodFilters.length > 0) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   752
                    String exclude = Arrays.asList(excludeMethodFilters).stream().map(MethodFilter::toString).collect(Collectors.joining(", "));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   753
                    println("CompileTheWorld : Excluding all methods matching one of the following filters: " + exclude);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   754
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   755
                println();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   756
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   757
                ClassLoader loader = cpe.createClassLoader();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   758
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   759
                for (String className : cpe.getClassNames()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   760
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   761
                    // Are we done?
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   762
                    if (classFileCounter >= compileStopAt) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   763
                        break;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   764
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   765
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   766
                    classFileCounter++;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   767
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   768
                    if (compileStep > 1 && ((classFileCounter - compileStartAt) % compileStep) != 0) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   769
                        continue;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   770
                    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   771
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   772
                    if (className.startsWith("jdk.management.") ||
49451
e06f9607f370 8198969: Update Graal
iveresov
parents: 49028
diff changeset
   773
                                    className.startsWith("jdk.internal.cmm.*") ||
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   774
                                    // GR-5881: The class initializer for
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   775
                                    // sun.tools.jconsole.OutputViewer
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   776
                                    // spawns non-daemon threads for redirecting sysout and syserr.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   777
                                    // These threads tend to cause deadlock at VM exit
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   778
                                    className.startsWith("sun.tools.jconsole.")) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   779
                        continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   780
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   781
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   782
                    if (!isClassIncluded(className)) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   783
                        continue;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   784
                    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 49451
diff changeset
   785
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   786
                    try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   787
                        // Load and initialize class
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   788
                        Class<?> javaClass = Class.forName(className, true, loader);
50858
2d3e99a72541 8205824: Update Graal
never
parents: 49873
diff changeset
   789
                        MetaAccessProvider metaAccess = JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   790
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   791
                        // Pre-load all classes in the constant pool.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   792
                        try {
50858
2d3e99a72541 8205824: Update Graal
never
parents: 49873
diff changeset
   793
                            HotSpotResolvedObjectType objectType = (HotSpotResolvedObjectType) metaAccess.lookupJavaType(javaClass);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   794
                            ConstantPool constantPool = objectType.getConstantPool();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   795
                            for (int cpi = 1; cpi < constantPool.length(); cpi++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   796
                                constantPool.loadReferencedType(cpi, Bytecodes.LDC);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   797
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   798
                        } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   799
                            // If something went wrong during pre-loading we just ignore it.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   800
                            if (isClassIncluded(className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   801
                                println("Preloading failed for (%d) %s: %s", classFileCounter, className, t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   802
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   803
                            continue;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   804
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   805
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   806
                        // Are we compiling this class?
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   807
                        if (classFileCounter >= compileStartAt) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   808
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   809
                            long start0 = System.nanoTime();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   810
                            // Compile each constructor/method in the class.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   811
                            for (Constructor<?> constructor : javaClass.getDeclaredConstructors()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   812
                                HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(constructor);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   813
                                if (canBeCompiled(javaMethod, constructor.getModifiers())) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   814
                                    compileMethod(javaMethod, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   815
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   816
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   817
                            for (Method method : javaClass.getDeclaredMethods()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   818
                                HotSpotResolvedJavaMethod javaMethod = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaMethod(method);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   819
                                if (canBeCompiled(javaMethod, method.getModifiers())) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   820
                                    compileMethod(javaMethod, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   821
                                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   822
                            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   823
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   824
                            // Also compile the class initializer if it exists
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   825
                            HotSpotResolvedJavaMethod clinit = (HotSpotResolvedJavaMethod) metaAccess.lookupJavaType(javaClass).getClassInitializer();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   826
                            if (clinit != null && canBeCompiled(clinit, clinit.getModifiers())) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   827
                                compileMethod(clinit, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   828
                            }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   829
                            println("CompileTheWorld (%d) : %s (%d us)", classFileCounter, className, (System.nanoTime() - start0) / 1000);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   830
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   831
                    } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   832
                        if (isClassIncluded(className)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   833
                            println("CompileTheWorld (%d) : Skipping %s %s", classFileCounter, className, t.toString());
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   834
                            printStackTrace(t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   835
                        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   836
                    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   837
                }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   838
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   839
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   840
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   841
        if (!running) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   842
            startThreads();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   843
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   844
        int wakeups = 0;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   845
        long lastCompletedTaskCount = 0;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   846
        for (long completedTaskCount = threadPool.getCompletedTaskCount(); completedTaskCount != threadPool.getTaskCount(); completedTaskCount = threadPool.getCompletedTaskCount()) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   847
            if (wakeups % 15 == 0) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   848
                TTY.printf("CompileTheWorld : Waiting for %d compiles, just completed %d compiles%n", threadPool.getTaskCount() - completedTaskCount, completedTaskCount - lastCompletedTaskCount);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   849
                lastCompletedTaskCount = completedTaskCount;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   850
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   851
            try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   852
                threadPool.awaitTermination(1, TimeUnit.SECONDS);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   853
                wakeups++;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   854
            } catch (InterruptedException e) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   855
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   856
        }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   857
        threadPool.shutdown();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   858
        threadPool = null;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   859
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   860
        long elapsedTime = System.nanoTime() - start;
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   861
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   862
        println();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   863
        int compiledClasses = classFileCounter > compileStartAt ? classFileCounter - compileStartAt : 0;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   864
        if (Options.MultiThreaded.getValue(harnessOptions)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   865
            TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms elapsed, %d ms compile time, %d bytes of memory used)", compiledClasses, compiledMethodsCounter.get(), elapsedTime,
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   866
                            compileTime.get() / 1000000, memoryUsed.get());
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   867
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   868
            TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms, %d bytes of memory used)", compiledClasses, compiledMethodsCounter.get(), compileTime.get(), memoryUsed.get());
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   869
        }
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   870
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   871
        GlobalMetrics metricValues = ((HotSpotGraalRuntime) compiler.getGraalRuntime()).getMetricValues();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   872
        EconomicMap<MetricKey, Long> map = metricValues.asKeyValueMap();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   873
        Long compiledAndInstalledBytecodes = map.get(CompiledAndInstalledBytecodes);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   874
        Long compilationTime = map.get(CompilationTime);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   875
        if (compiledAndInstalledBytecodes != null && compilationTime != null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   876
            TTY.println("CompileTheWorld : Aggregate compile speed %d bytecodes per second (%d / %d)", (int) (compiledAndInstalledBytecodes / (compilationTime / 1000000000.0)),
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   877
                            compiledAndInstalledBytecodes, compilationTime);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   878
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   879
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   880
        metricValues.print(compilerOptions);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   881
        metricValues.clear();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   882
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   883
        // Apart from the main thread, there should be only be daemon threads
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   884
        // alive now. If not, then a class initializer has probably started
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   885
        // a thread that could cause a deadlock while trying to exit the VM.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   886
        // One known example of this is sun.tools.jconsole.OutputViewer which
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   887
        // spawns threads to redirect sysout and syserr. To help debug such
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   888
        // scenarios, the stacks of potentially problematic threads are dumped.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   889
        Map<Thread, StackTraceElement[]> suspiciousThreads = new HashMap<>();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   890
        for (Map.Entry<Thread, StackTraceElement[]> e : Thread.getAllStackTraces().entrySet()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   891
            Thread thread = e.getKey();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   892
            if (thread != Thread.currentThread() && !initialThreads.containsKey(thread) && !thread.isDaemon() && thread.isAlive()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   893
                suspiciousThreads.put(thread, e.getValue());
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   894
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   895
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   896
        if (!suspiciousThreads.isEmpty()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   897
            TTY.println("--- Non-daemon threads started during CTW ---");
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   898
            for (Map.Entry<Thread, StackTraceElement[]> e : suspiciousThreads.entrySet()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   899
                Thread thread = e.getKey();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   900
                if (thread.isAlive()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   901
                    TTY.println(thread.toString() + " " + thread.getState());
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   902
                    for (StackTraceElement ste : e.getValue()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   903
                        TTY.println("\tat " + ste);
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   904
                    }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   905
                }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   906
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   907
            TTY.println("---------------------------------------------");
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   908
        }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   909
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   910
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   911
    private synchronized void startThreads() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   912
        running = true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   913
        // Wake up any waiting threads
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   914
        notifyAll();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   915
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   916
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   917
    private synchronized void waitToRun() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   918
        while (!running) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   919
            try {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   920
                wait();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   921
            } catch (InterruptedException e) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   922
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   923
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   924
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   925
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   926
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   927
    private void compileMethod(HotSpotResolvedJavaMethod method, LibGraalParams libgraal) throws InterruptedException, ExecutionException {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   928
        if (methodFilters != null && !MethodFilter.matches(methodFilters, method)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   929
            return;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   930
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   931
        if (excludeMethodFilters != null && MethodFilter.matches(excludeMethodFilters, method)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   932
            return;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   933
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   934
        Future<?> task = threadPool.submit(new Runnable() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   935
            @Override
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   936
            public void run() {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   937
                waitToRun();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   938
                compileMethod(method, classFileCounter, libgraal);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   939
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   940
        });
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   941
        if (threadPool.getCorePoolSize() == 1) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   942
            task.get();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   943
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   944
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   945
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   946
    private static final Unsafe UNSAFE = GraalUnsafeAccess.getUnsafe();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   947
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   948
    /**
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   949
     * Implemented by
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   950
     * {@code com.oracle.svm.graal.hotspot.libgraal.LibGraalEntryPoints.compileMethod}.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   951
     */
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   952
    static native long compileMethodInLibgraal(long isolateThread,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   953
                    long methodHandle,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   954
                    boolean useProfilingInfo,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   955
                    boolean installAsDefault,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   956
                    long optionsAddress,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   957
                    int optionsSize,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   958
                    int optionsHash,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   959
                    long encodedThrowableBufferAddress,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   960
                    int encodedThrowableBufferSize);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   961
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   962
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   963
     * Compiles a method and gathers some statistics.
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   964
     */
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   965
    @SuppressWarnings("try")
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   966
    private void compileMethod(HotSpotResolvedJavaMethod method, int counter, LibGraalParams libgraal) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   967
        try {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   968
            long start = System.nanoTime();
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   969
            long allocatedAtStart = getCurrentThreadAllocatedBytes();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   970
            // For more stable CTW execution, disable use of profiling information
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   971
            boolean useProfilingInfo = false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
   972
            boolean installAsDefault = false;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   973
            HotSpotInstalledCode installedCode;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   974
            if (libgraal != null) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   975
                HotSpotJVMCIRuntime runtime = HotSpotJVMCIRuntime.runtime();
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   976
                try (LibGraalScope scope = new LibGraalScope(runtime)) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   977
                    long methodHandle = LibGraal.translate(runtime, method);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   978
                    long isolateThread = LibGraalScope.getIsolateThread();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   979
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   980
                    StackTraceBuffer stackTraceBuffer = libgraal.getStackTraceBuffer();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   981
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   982
                    long stackTraceBufferAddress = stackTraceBuffer.getAddress();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   983
                    long installedCodeHandle = compileMethodInLibgraal(isolateThread,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   984
                                    methodHandle,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   985
                                    useProfilingInfo,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   986
                                    installAsDefault,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   987
                                    libgraal.options.getAddress(),
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   988
                                    libgraal.options.size,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   989
                                    libgraal.options.hash,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   990
                                    stackTraceBufferAddress,
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   991
                                    stackTraceBuffer.size);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
   992
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   993
                    installedCode = LibGraal.unhand(runtime, HotSpotInstalledCode.class, installedCodeHandle);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   994
                    if (installedCode == null) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   995
                        int length = UNSAFE.getInt(stackTraceBufferAddress);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   996
                        byte[] data = new byte[length];
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   997
                        UNSAFE.copyMemory(null, stackTraceBufferAddress + Integer.BYTES, data, ARRAY_BYTE_BASE_OFFSET, length);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   998
                        String stackTrace = new String(data).trim();
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   999
                        println(true, String.format("CompileTheWorld (%d) : Error compiling method: %s", counter, method.format("%H.%n(%p):%r")));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1000
                        println(true, stackTrace);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1001
                    }
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1002
                }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1003
            } else {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1004
                int entryBCI = JVMCICompiler.INVOCATION_ENTRY_BCI;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1005
                HotSpotCompilationRequest request = new HotSpotCompilationRequest(method, entryBCI, 0L);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1006
                CompilationTask task = new CompilationTask(jvmciRuntime, compiler, request, useProfilingInfo, installAsDefault);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1007
                task.runCompilation(compilerOptions);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1008
                installedCode = task.getInstalledCode();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1009
            }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1010
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1011
            // Invalidate the generated code so the code cache doesn't fill up
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1012
            if (installedCode != null && InvalidateInstalledCode.getValue(compilerOptions)) {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1013
                installedCode.invalidate();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1014
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1015
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
  1016
            memoryUsed.getAndAdd(getCurrentThreadAllocatedBytes() - allocatedAtStart);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1017
            compileTime.getAndAdd(System.nanoTime() - start);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1018
            compiledMethodsCounter.incrementAndGet();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1019
        } catch (Throwable t) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1020
            // Catch everything and print a message
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1021
            println("CompileTheWorld (%d) : Error compiling method: %s", counter, method.format("%H.%n(%p):%r"));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1022
            printStackTrace(t);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1023
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1024
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1025
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1026
    /**
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1027
     * Determines if a method should be compiled (Cf. CompilationPolicy::can_be_compiled).
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1028
     *
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1029
     * @return true if it can be compiled, false otherwise
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1030
     */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1031
    private boolean canBeCompiled(HotSpotResolvedJavaMethod javaMethod, int modifiers) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1032
        if (Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1033
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1034
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1035
        GraalHotSpotVMConfig c = compiler.getGraalRuntime().getVMConfig();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1036
        if (c.dontCompileHugeMethods && javaMethod.getCodeSize() > c.hugeMethodLimit) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1037
            println(verbose || methodFilters != null,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1038
                            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
  1039
                                            javaMethod.format("%H.%n(%p):%r"),
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1040
                                            javaMethod.getCodeSize()));
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1041
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1042
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1043
        // Allow use of -XX:CompileCommand=dontinline to exclude problematic methods
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1044
        if (!javaMethod.canBeInlined()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1045
            return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1046
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1047
        // Skip @Snippets for now
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1048
        for (Annotation annotation : javaMethod.getAnnotations()) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1049
            if (annotation.annotationType().equals(Snippet.class)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1050
                return false;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1051
            }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1052
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1053
        return true;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1054
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1055
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1056
    static class Options {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1057
        public static final OptionKey<Boolean> Help = new OptionKey<>(false);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1058
        public static final OptionKey<String> Classpath = new OptionKey<>(CompileTheWorld.SUN_BOOT_CLASS_PATH);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1059
        public static final OptionKey<Boolean> Verbose = new OptionKey<>(true);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1060
        /**
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1061
         * Ignore Graal classes by default to avoid problems associated with compiling snippets and
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1062
         * method substitutions.
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1063
         */
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1064
        public static final OptionKey<String> LimitModules = new OptionKey<>("~jdk.internal.vm.compiler");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1065
        public static final OptionKey<Integer> Iterations = new OptionKey<>(1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1066
        public static final OptionKey<String> MethodFilter = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1067
        public static final OptionKey<String> ExcludeMethodFilter = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1068
        public static final OptionKey<Integer> StartAt = new OptionKey<>(1);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1069
        public static final OptionKey<Integer> StopAt = new OptionKey<>(Integer.MAX_VALUE);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1070
        public static final OptionKey<Integer> MaxClasses = new OptionKey<>(Integer.MAX_VALUE);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1071
        public static final OptionKey<String> Config = new OptionKey<>(null);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1072
        public static final OptionKey<Boolean> MultiThreaded = new OptionKey<>(false);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1073
        public static final OptionKey<Integer> Threads = new OptionKey<>(0);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1074
        public static final OptionKey<Boolean> InvalidateInstalledCode = new OptionKey<>(false);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1075
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1076
        // @formatter:off
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1077
        static final ReflectionOptionDescriptors DESCRIPTORS = new ReflectionOptionDescriptors(Options.class,
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1078
                           "Help", "List options and their help messages and then exit.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1079
                      "Classpath", "Class path denoting methods to compile. Default is to compile boot classes.",
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1080
                        "Verbose", "Verbose operation. Default is !MultiThreaded.",
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1081
                   "LimitModules", "Comma separated list of module names to which compilation should be limited. " +
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1082
                                   "Module names can be prefixed with \"~\" to exclude the named module.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1083
                     "Iterations", "The number of iterations to perform.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1084
                   "MethodFilter", "Only compile methods matching this filter.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1085
            "ExcludeMethodFilter", "Exclude methods matching this filter from compilation.",
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1086
                        "StartAt", "First class to consider for compilation (default = 1).",
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1087
                         "StopAt", "Last class to consider for compilation (default = <number of classes>).",
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1088
                     "MaxClasses", "Maximum number of classes to process (default = <number of classes>). " +
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1089
                                   "Ignored if less than (StopAt - StartAt + 1).",
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1090
                         "Config", "Option values to use during compile the world compilations. For example, " +
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1091
                                   "to disable partial escape analysis and print compilations specify " +
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1092
                                   "'PartialEscapeAnalysis=false PrintCompilation=true'. " +
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1093
                                   "Unless explicitly enabled with 'Inline=true' here, inlining is disabled.",
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1094
                  "MultiThreaded", "Run using multiple threads for compilation.",
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1095
                        "Threads", "Number of threads to use for multithreaded execution. Defaults to Runtime.getRuntime().availableProcessors().");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1096
        // @formatter:on
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1097
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1098
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1099
    public static OptionValues loadHarnessOptions() {
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1100
        EconomicMap<OptionKey<?>, Object> values = OptionValues.newOptionMap();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1101
        List<OptionDescriptors> loader = singletonList(DESCRIPTORS);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1102
        OptionsParser.parseOptions(extractEntries(System.getProperties(), "CompileTheWorld.", true), values, loader);
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1103
        OptionValues options = new OptionValues(values);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1104
        if (Options.Help.getValue(options)) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1105
            options.printHelp(loader, System.out, "CompileTheWorld.");
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1106
            System.exit(0);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1107
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1108
        return options;
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1109
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1110
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1111
    public static void main(String[] args) throws Throwable {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1112
        HotSpotJVMCIRuntime jvmciRuntime = HotSpotJVMCIRuntime.runtime();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1113
        HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) jvmciRuntime.getCompiler();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1114
        HotSpotGraalRuntimeProvider graalRuntime = compiler.getGraalRuntime();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1115
        HotSpotCodeCacheProvider codeCache = graalRuntime.getHostProviders().getCodeCache();
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1116
        OptionValues harnessOptions = loadHarnessOptions();
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1117
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1118
        int iterations = Options.Iterations.getValue(harnessOptions);
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1119
        for (int i = 0; i < iterations; i++) {
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1120
            codeCache.resetCompilationStatistics();
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1121
            TTY.println("CompileTheWorld : iteration " + i);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1122
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54204
diff changeset
  1123
            CompileTheWorld ctw = new CompileTheWorld(jvmciRuntime, compiler, harnessOptions, graalRuntime.getOptions());
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1124
            ctw.compile();
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1125
            if (iterations > 1) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1126
                // Force a GC to encourage reclamation of nmethods when their InstalledCode
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1127
                // reference has been dropped.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1128
                System.gc();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1129
            }
46393
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1130
        }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1131
        // This is required as non-daemon threads can be started by class initializers
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1132
        System.exit(0);
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1133
    }
d497d892ab11 8178864: Update Graal
iveresov
parents:
diff changeset
  1134
}