From 314e9b3dcca16d84cf85851cb6f8f7af76ae88db Mon Sep 17 00:00:00 2001 From: Joshua Cao Date: Fri, 7 Apr 2023 00:28:04 +0000 Subject: [PATCH] 8300829: Make CtwRunner available as an independent tool Reviewed-by: xliu, phh --- test/hotspot/jtreg/testlibrary/ctw/.gitignore | 1 + test/hotspot/jtreg/testlibrary/ctw/Makefile | 19 ++-- .../src/sun/hotspot/tools/ctw/CtwRunner.java | 91 +++++++++++-------- 3 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 test/hotspot/jtreg/testlibrary/ctw/.gitignore diff --git a/test/hotspot/jtreg/testlibrary/ctw/.gitignore b/test/hotspot/jtreg/testlibrary/ctw/.gitignore new file mode 100644 index 00000000000..849ddff3b7e --- /dev/null +++ b/test/hotspot/jtreg/testlibrary/ctw/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/test/hotspot/jtreg/testlibrary/ctw/Makefile b/test/hotspot/jtreg/testlibrary/ctw/Makefile index 9170b566052..3eb68006595 100644 --- a/test/hotspot/jtreg/testlibrary/ctw/Makefile +++ b/test/hotspot/jtreg/testlibrary/ctw/Makefile @@ -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) diff --git a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java index 2f0dca67427..c23561b6d52 100644 --- a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java +++ b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java @@ -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 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 [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 Args = new ArrayList(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); }