Skip to content

Commit

Permalink
8300829: Make CtwRunner available as an independent tool
Browse files Browse the repository at this point in the history
Reviewed-by: xliu, phh
  • Loading branch information
caojoshua authored and Paul Hohensee committed Apr 7, 2023
1 parent 0a34018 commit 314e9b3
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 44 deletions.
1 change: 1 addition & 0 deletions test/hotspot/jtreg/testlibrary/ctw/.gitignore
@@ -0,0 +1 @@
dist/
19 changes: 12 additions & 7 deletions test/hotspot/jtreg/testlibrary/ctw/Makefile
Expand Up @@ -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 \
Expand All @@ -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

Expand All @@ -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)
Expand Down
@@ -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
Expand Down Expand Up @@ -34,6 +34,7 @@
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;
Expand All @@ -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 {
Expand Down Expand Up @@ -258,43 +267,51 @@ private String[] cmd(long classStart, long classStop) {
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);
}
Expand Down

1 comment on commit 314e9b3

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.