8300829: Make CtwRunner available as an independent tool

Reviewed-by: xliu, phh
This commit is contained in:
Joshua Cao
2023-04-07 00:28:04 +00:00
committed by Paul Hohensee
parent 0a34018797
commit 314e9b3dcc
3 changed files with 67 additions and 44 deletions

View File

@@ -0,0 +1 @@
dist/

View File

@@ -48,6 +48,8 @@ LIB_FILES = $(shell find $(TESTLIBRARY_DIR)/jdk/test/lib/ \
$(TESTLIBRARY_DIR)/jtreg \
-maxdepth 1 -name '*.java')
WB_SRC_FILES = $(shell find $(TESTLIBRARY_DIR)/jdk/test/lib/compiler $(TESTLIBRARY_DIR)/jdk/test/whitebox -name '*.java')
WB_CLASS_FILES := $(subst $(TESTLIBRARY_DIR)/,,$(WB_SRC_FILES))
WB_CLASS_FILES := $(patsubst %.java,%.class,$(WB_CLASS_FILES))
EXPORTS=--add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
--add-exports java.base/jdk.internal.module=ALL-UNNAMED \
@@ -58,7 +60,8 @@ EXPORTS=--add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \
--add-exports java.base/jdk.internal.classfile.java.lang.constant=ALL-UNNAMED \
--add-exports java.base/jdk.internal.access=ALL-UNNAMED
MAIN_CLASS = sun.hotspot.tools.ctw.CompileTheWorld
CTW_MAIN_CLASS = sun.hotspot.tools.ctw.CompileTheWorld
CTWRUNNER_MAIN_CLASS = sun.hotspot.tools.ctw.CtwRunner
.PHONY: clean cleantmp
@@ -78,22 +81,24 @@ $(DST_DIR)/ctw.sh: $(DST_DIR)
echo '$${JAVA_HOME}/bin/java $${JAVA_OPTIONS} $(EXPORTS) -XX:-UseCounterDecay -Xbatch "-XX:CompileCommand=exclude,java/lang/invoke/MethodHandle.*" -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:wb.jar -jar ctw.jar $$@' > $@
chmod a+x $@
$(DST_DIR)/ctwrunner.sh: $(DST_DIR)
echo '$${JAVA_HOME}/bin/java $${JAVA_OPTIONS} -Dtest.jdk=$${JAVA_HOME} -cp ctw.jar $(CTWRUNNER_MAIN_CLASS) $$@' > $@
chmod a+x $@
$(DST_DIR)/ctw.jar: filelist $(DST_DIR)/wb.jar
@mkdir -p $(OUTPUT_DIR)
$(JAVAC) $(EXPORTS) -sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp $(DST_DIR)/wb.jar @filelist
$(JAR) --create --file=$@ --main-class $(MAIN_CLASS) -C $(OUTPUT_DIR) .
$(JAR) --create --file=$@ --main-class $(CTW_MAIN_CLASS) -C $(OUTPUT_DIR) .
@rm -rf $(OUTPUT_DIR)
$(DST_DIR)/wb.jar: wb_filelist $(DST_DIR)
@mkdir -p $(OUTPUT_DIR)
$(JAVAC) -sourcepath $(TESTLIBRARY_DIR) \
-d $(OUTPUT_DIR) \
-d $(DST_DIR) \
-cp $(OUTPUT_DIR) \
@wb_filelist
$(JAR) --create --file=$@ -C $(OUTPUT_DIR) .
@rm -rf $(OUTPUT_DIR)
cd $(DST_DIR); $(JAR) --create --file=wb.jar $(WB_CLASS_FILES)
$(DST_DIR)/ctw.zip: $(DST_DIR)/ctw.sh $(DST_DIR)/wb.jar $(DST_DIR)/ctw.jar
$(DST_DIR)/ctw.zip: $(DST_DIR)/ctw.sh $(DST_DIR)/ctwrunner.sh $(DST_DIR)/wb.jar $(DST_DIR)/ctw.jar $(DST_DIR)/ctwrunner.sh
zip -j $@ $?
wb_filelist: $(WB_SRC_FILES)

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
@@ -52,6 +53,14 @@ public class CtwRunner {
private static final Predicate<String> IS_CLASS_LINE = Pattern.compile(
"^\\[\\d+\\]\\s*\\S+\\s*$").asPredicate();
/**
* Value of {@code -Dsun.hotspot.tools.ctwrunner.ctw_extra_args}. Extra
* comma-separated arguments to pass to CTW subprocesses.
*/
private static final String CTW_EXTRA_ARGS
= System.getProperty("sun.hotspot.tools.ctwrunner.ctw_extra_args", "");
private static final String USAGE = "Usage: CtwRunner <artifact to compile> [start[%] stop[%]]";
public static void main(String[] args) throws Exception {
@@ -258,43 +267,51 @@ public class CtwRunner {
String phase = phaseName(classStart);
Path file = Paths.get(phase + ".cmd");
var rng = Utils.getRandomInstance();
ArrayList<String> Args = new ArrayList<String>(Arrays.asList(
"-Xbatch",
"-XX:-UseCounterDecay",
"-XX:-ShowMessageBoxOnError",
"-XX:+UnlockDiagnosticVMOptions",
// redirect VM output to cerr so it won't collide w/ ctw output
"-XX:+DisplayVMOutputToStderr",
// define phase start
"-DCompileTheWorldStartAt=" + classStart,
"-DCompileTheWorldStopAt=" + classStop,
// CTW library uses WhiteBox API
"-XX:+WhiteBoxAPI", "-Xbootclasspath/a:.",
// export jdk.internal packages used by CTW library
"--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.access=ALL-UNNAMED",
// enable diagnostic logging
"-XX:+LogCompilation",
// use phase specific log, hs_err and ciReplay files
String.format("-XX:LogFile=hotspot_%s_%%p.log", phase),
String.format("-XX:ErrorFile=hs_err_%s_%%p.log", phase),
String.format("-XX:ReplayDataFile=replay_%s_%%p.log", phase),
// MethodHandle MUST NOT be compiled
"-XX:CompileCommand=exclude,java/lang/invoke/MethodHandle.*",
// Stress* are c2-specific stress flags, so IgnoreUnrecognizedVMOptions is needed
"-XX:+IgnoreUnrecognizedVMOptions",
"-XX:+StressLCM",
"-XX:+StressGCM",
"-XX:+StressIGVN",
"-XX:+StressCCP",
// StressSeed is uint
"-XX:StressSeed=" + Math.abs(rng.nextInt())));
for (String arg : CTW_EXTRA_ARGS.split(",")) {
Args.add(arg);
}
// CTW entry point
Args.add(CompileTheWorld.class.getName());
Args.add(target);
try {
Files.write(file, List.of(
"-Xbatch",
"-XX:-UseCounterDecay",
"-XX:-ShowMessageBoxOnError",
"-XX:+UnlockDiagnosticVMOptions",
// redirect VM output to cerr so it won't collide w/ ctw output
"-XX:+DisplayVMOutputToStderr",
// define phase start
"-DCompileTheWorldStartAt=" + classStart,
"-DCompileTheWorldStopAt=" + classStop,
// CTW library uses WhiteBox API
"-XX:+WhiteBoxAPI", "-Xbootclasspath/a:.",
// export jdk.internal packages used by CTW library
"--add-exports", "java.base/jdk.internal.jimage=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED",
"--add-exports", "java.base/jdk.internal.access=ALL-UNNAMED",
// enable diagnostic logging
"-XX:+LogCompilation",
// use phase specific log, hs_err and ciReplay files
String.format("-XX:LogFile=hotspot_%s_%%p.log", phase),
String.format("-XX:ErrorFile=hs_err_%s_%%p.log", phase),
String.format("-XX:ReplayDataFile=replay_%s_%%p.log", phase),
// MethodHandle MUST NOT be compiled
"-XX:CompileCommand=exclude,java/lang/invoke/MethodHandle.*",
// Stress* are c2-specific stress flags, so IgnoreUnrecognizedVMOptions is needed
"-XX:+IgnoreUnrecognizedVMOptions",
"-XX:+StressLCM",
"-XX:+StressGCM",
"-XX:+StressIGVN",
"-XX:+StressCCP",
// StressSeed is uint
"-XX:StressSeed=" + Math.abs(rng.nextInt()),
// CTW entry point
CompileTheWorld.class.getName(),
target));
Files.write(file, Args);
} catch (IOException e) {
throw new Error("can't create " + file, e);
}