diff --git a/src/hotspot/share/precompiled/precompiled.hpp b/src/hotspot/share/precompiled/precompiled.hpp index a5f42a0fe8688..6750ad0877efa 100644 --- a/src/hotspot/share/precompiled/precompiled.hpp +++ b/src/hotspot/share/precompiled/precompiled.hpp @@ -26,52 +26,356 @@ // --disable-precompiled-headers to configure. // These header files are included in at least 130 C++ files, as of -// measurements made in November 2018. This list excludes files named -// *.inline.hpp, since including them decreased build performance. +// measurements made in August 2025. -#include "classfile/classLoaderData.hpp" -#include "classfile/javaClasses.hpp" -#include "classfile/systemDictionary.hpp" +#include "asm/assembler.hpp" +#include "asm/codeBuffer.hpp" +#include "asm/macroAssembler.hpp" +#include "asm/register.hpp" +#include "c1/c1_globals.hpp" +#include "cds/aotLinkedClassBulkLoader.hpp" +#include "cds/cds_globals.hpp" +#include "classfile/classLoaderData.inline.hpp" +#include "classfile/compactHashtable.hpp" +#include "classfile/javaClasses.inline.hpp" +#include "classfile/vmClassID.hpp" +#include "classfile/vmClassMacros.hpp" +#include "classfile/vmClasses.hpp" +#include "classfile/vmIntrinsics.hpp" +#include "code/codeBlob.inline.hpp" +#include "code/codeCache.inline.hpp" +#include "code/compressedStream.hpp" +#include "code/debugInfo.hpp" +#include "code/location.hpp" +#include "code/nativeInst.hpp" +#include "code/nmethod.inline.hpp" +#include "code/oopRecorder.hpp" +#include "code/pcDesc.hpp" +#include "code/relocInfo.hpp" +#include "code/stubs.hpp" +#include "code/vmreg.inline.hpp" +#include "code/vmregTypes.hpp" +#include "compiler/compilerDefinitions.hpp" +#include "compiler/compiler_globals.hpp" +#include "compiler/compiler_globals_pd.hpp" +#include "compiler/oopMap.inline.hpp" +#include "gc/serial/serial_globals.hpp" +#include "gc/shared/barrierSet.inline.hpp" +#include "gc/shared/barrierSetConfig.inline.hpp" +#include "gc/shared/barrierSetStackChunk.hpp" +#include "gc/shared/cardTable.hpp" +#include "gc/shared/cardTableBarrierSet.inline.hpp" #include "gc/shared/collectedHeap.hpp" +#include "gc/shared/gcBehaviours.hpp" #include "gc/shared/gcCause.hpp" +#include "gc/shared/gcId.hpp" +#include "gc/shared/gcThreadLocalData.hpp" +#include "gc/shared/gcUtil.hpp" +#include "gc/shared/gcWhen.hpp" +#include "gc/shared/gc_globals.hpp" +#include "gc/shared/modRefBarrierSet.inline.hpp" +#include "gc/shared/oopStorage.inline.hpp" +#include "gc/shared/referenceDiscoverer.hpp" +#include "gc/shared/referencePolicy.hpp" +#include "gc/shared/referenceProcessor.hpp" +#include "gc/shared/referenceProcessorStats.hpp" +#include "gc/shared/softRefPolicy.hpp" +#include "gc/shared/threadLocalAllocBuffer.hpp" +#include "gc/shared/verifyOption.hpp" +#include "gc/shared/workerThread.hpp" +#include "interpreter/abstractInterpreter.hpp" +#include "interpreter/bootstrapInfo.hpp" +#include "interpreter/bytecodes.hpp" +#include "interpreter/interp_masm.hpp" +#include "interpreter/interpreter.hpp" +#include "interpreter/invocationCounter.hpp" +#include "interpreter/linkResolver.hpp" +#include "interpreter/templateInterpreter.hpp" +#include "interpreter/templateTable.hpp" +#include "interpreter/zero/zeroInterpreter.hpp" +#include "jfr/jfr.hpp" +#include "jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp" +#include "jfr/periodic/sampling/jfrSampleRequest.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceIdMacros.hpp" +#include "jfr/recorder/storage/jfrBuffer.hpp" +#include "jfr/support/jfrIntrinsics.hpp" +#include "jfr/support/jfrKlassExtension.hpp" +#include "jfr/support/jfrThreadExtension.hpp" +#include "jfr/support/jfrThreadId.hpp" +#include "jfr/support/jfrThreadLocal.hpp" +#include "jfr/support/jfrTraceIdExtension.hpp" +#include "jfr/utilities/jfrAllocation.hpp" +#include "jfr/utilities/jfrBlob.hpp" +#include "jfr/utilities/jfrRefCountPointer.hpp" +#include "jfr/utilities/jfrTime.hpp" +#include "jfr/utilities/jfrTypes.hpp" +#include "jvmci/jvmci_globals.hpp" #include "logging/log.hpp" +#include "logging/logDecorations.hpp" +#include "logging/logDecorators.hpp" +#include "logging/logHandle.hpp" +#include "logging/logLevel.hpp" +#include "logging/logMessage.hpp" +#include "logging/logMessageBuffer.hpp" +#include "logging/logOutputList.hpp" +#include "logging/logPrefix.hpp" +#include "logging/logSelection.hpp" +#include "logging/logStream.hpp" +#include "logging/logTag.hpp" +#include "logging/logTagSet.hpp" +#include "memory/allStatic.hpp" #include "memory/allocation.hpp" -#include "memory/iterator.hpp" +#include "memory/arena.hpp" +#include "memory/classLoaderMetaspace.hpp" +#include "memory/heap.hpp" +#include "memory/iterator.inline.hpp" #include "memory/memRegion.hpp" +#include "memory/metadataFactory.hpp" +#include "memory/metaspace.hpp" +#include "memory/metaspaceClosure.hpp" +#include "memory/padded.hpp" +#include "memory/referenceType.hpp" +#include "memory/reservedSpace.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" -#include "nmt/memTracker.hpp" -#include "oops/instanceKlass.hpp" -#include "oops/klass.hpp" +#include "memory/virtualspace.hpp" +#include "metaprogramming/enableIf.hpp" +#include "metaprogramming/primitiveConversions.hpp" +#include "nmt/memTag.hpp" +#include "oops/access.inline.hpp" +#include "oops/accessBackend.inline.hpp" +#include "oops/accessDecorators.hpp" +#include "oops/annotations.hpp" +#include "oops/array.inline.hpp" +#include "oops/arrayKlass.hpp" +#include "oops/arrayOop.hpp" +#include "oops/compressedKlass.inline.hpp" +#include "oops/compressedOops.inline.hpp" +#include "oops/constMethod.hpp" +#include "oops/constMethodFlags.hpp" +#include "oops/constantPool.hpp" +#include "oops/cpCache.hpp" +#include "oops/fieldInfo.inline.hpp" +#include "oops/instanceClassLoaderKlass.inline.hpp" +#include "oops/instanceKlass.inline.hpp" +#include "oops/instanceKlassFlags.hpp" +#include "oops/instanceMirrorKlass.inline.hpp" +#include "oops/instanceOop.hpp" +#include "oops/instanceRefKlass.inline.hpp" +#include "oops/instanceStackChunkKlass.inline.hpp" +#include "oops/klass.inline.hpp" +#include "oops/klassFlags.hpp" +#include "oops/klassVtable.hpp" +#include "oops/markWord.inline.hpp" +#include "oops/metadata.hpp" #include "oops/method.hpp" -#include "oops/objArrayKlass.hpp" -#include "oops/objArrayOop.hpp" -#include "oops/oop.hpp" +#include "oops/methodData.hpp" +#include "oops/methodFlags.hpp" +#include "oops/objArrayKlass.inline.hpp" +#include "oops/objArrayOop.inline.hpp" +#include "oops/objLayout.inline.hpp" +#include "oops/oop.inline.hpp" +#include "oops/oopHandle.inline.hpp" #include "oops/oopsHierarchy.hpp" +#include "oops/stackChunkOop.inline.hpp" +#include "oops/symbol.hpp" +#include "oops/typeArrayKlass.inline.hpp" +#include "oops/typeArrayOop.inline.hpp" +#include "oops/weakHandle.inline.hpp" +#include "opto/adlcVMDeps.hpp" +#include "opto/c2_globals.hpp" +#include "prims/vectorSupport.hpp" +#include "runtime/abstract_vm_version.hpp" #include "runtime/atomic.hpp" +#include "runtime/basicLock.hpp" +#include "runtime/continuation.hpp" +#include "runtime/continuationEntry.hpp" +#include "runtime/continuationJavaClasses.inline.hpp" +#include "runtime/deoptimization.hpp" +#include "runtime/flags/flagSetting.hpp" +#include "runtime/frame.inline.hpp" #include "runtime/globals.hpp" -#include "runtime/handles.hpp" +#include "runtime/globals_shared.hpp" +#include "runtime/handles.inline.hpp" +#include "runtime/handshake.hpp" +#include "runtime/icache.hpp" +#include "runtime/javaFrameAnchor.hpp" #include "runtime/javaThread.hpp" +#include "runtime/lockStack.hpp" +#include "runtime/monitorChunk.hpp" #include "runtime/mutex.hpp" +#include "runtime/mutexLocker.hpp" +#include "runtime/nonJavaThread.hpp" +#include "runtime/objectMonitor.hpp" #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" +#include "runtime/osInfo.hpp" +#include "runtime/park.hpp" +#include "runtime/perfDataTypes.hpp" +#include "runtime/registerMap.hpp" +#include "runtime/safepoint.hpp" +#include "runtime/safepointMechanism.hpp" +#include "runtime/semaphore.hpp" +#include "runtime/sharedRuntime.hpp" +#include "runtime/smallRegisterMap.inline.hpp" +#include "runtime/stackChunkFrameStream.hpp" +#include "runtime/stackOverflow.hpp" +#include "runtime/stackWatermarkKind.hpp" +#include "runtime/stackWatermarkSet.hpp" +#include "runtime/stubCodeGenerator.hpp" +#include "runtime/stubDeclarations.hpp" +#include "runtime/stubInfo.hpp" +#include "runtime/stubRoutines.hpp" +#include "runtime/suspendResumeManager.hpp" +#include "runtime/task.hpp" +#include "runtime/thread.hpp" +#include "runtime/threadHeapSampler.hpp" +#include "runtime/threadIdentifier.hpp" +#include "runtime/threadLocalStorage.hpp" +#include "runtime/threadStatisticalInfo.hpp" +#include "runtime/threadWXSetters.inline.hpp" #include "runtime/timer.hpp" +#include "runtime/unhandledOops.hpp" +#include "runtime/vmOperation.hpp" +#include "runtime/vmThread.hpp" +#include "runtime/vm_version.hpp" +#include "services/memoryUsage.hpp" +#include "utilities/accessFlags.hpp" #include "utilities/align.hpp" -#include "utilities/bitMap.hpp" +#include "utilities/autoRestore.hpp" +#include "utilities/bitMap.inline.hpp" +#include "utilities/breakpoint.hpp" +#include "utilities/bytes.hpp" +#include "utilities/byteswap.hpp" +#include "utilities/checkedCast.hpp" +#include "utilities/compilerWarnings.hpp" +#include "utilities/constantTag.hpp" #include "utilities/copy.hpp" +#include "utilities/count_leading_zeros.hpp" +#include "utilities/count_trailing_zeros.hpp" #include "utilities/debug.hpp" +#include "utilities/devirtualizer.inline.hpp" +#include "utilities/enumIterator.hpp" #include "utilities/exceptions.hpp" +#include "utilities/fakeRttiSupport.hpp" +#include "utilities/filterQueue.hpp" +#include "utilities/forbiddenFunctions.hpp" +#include "utilities/formatBuffer.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/growableArray.hpp" +#include "utilities/linkedlist.hpp" #include "utilities/macros.hpp" +#include "utilities/numberSeq.hpp" #include "utilities/ostream.hpp" +#include "utilities/population_count.hpp" +#include "utilities/powerOfTwo.hpp" +#include "utilities/resizeableResourceHash.hpp" +#include "utilities/resourceHash.hpp" +#include "utilities/rotate_bits.hpp" +#include "utilities/singleWriterSynchronizer.hpp" +#include "utilities/sizes.hpp" +#include "utilities/tableStatistics.hpp" #include "utilities/ticks.hpp" +#include "utilities/unsigned5.hpp" +#include "utilities/utf8.hpp" +#include "utilities/vmEnums.hpp" +#include "utilities/waitBarrier.hpp" +#include "utilities/waitBarrier_generic.hpp" -#ifdef TARGET_COMPILER_visCPP -// For Visual Studio, including the *.inline.hpp files actually -// increased performance. -#include "memory/allocation.inline.hpp" -#include "oops/access.inline.hpp" -#include "oops/oop.inline.hpp" -#include "runtime/handles.inline.hpp" -#endif // TARGET_COMPILER_visCPP +#ifdef COMPILER2 +#include "asm/assembler.hpp" +#include "asm/codeBuffer.hpp" +#include "cds/cds_globals.hpp" +#include "classfile/vmIntrinsics.hpp" +#include "code/codeBlob.hpp" +#include "code/debugInfo.hpp" +#include "code/location.hpp" +#include "code/nmethod.hpp" +#include "code/oopRecorder.hpp" +#include "code/pcDesc.hpp" +#include "code/relocInfo.hpp" +#include "compiler/compiler_globals.hpp" +#include "jfr/support/jfrIntrinsics.hpp" +#include "logging/logDecorations.hpp" +#include "logging/logHandle.hpp" +#include "logging/logMessage.hpp" +#include "logging/logMessageBuffer.hpp" +#include "logging/logStream.hpp" +#include "opto/adlcVMDeps.hpp" +#include "opto/c2_globals.hpp" +#include "runtime/nonJavaThread.hpp" +#include "runtime/stubDeclarations.hpp" +#include "runtime/stubInfo.hpp" +#include "utilities/resizeableResourceHash.hpp" +#endif + +#if INCLUDE_JFR +#include "asm/assembler.hpp" +#include "asm/codeBuffer.hpp" +#include "cds/cds_globals.hpp" +#include "classfile/vmIntrinsics.hpp" +#include "code/codeBlob.hpp" +#include "code/nmethod.hpp" +#include "code/oopRecorder.hpp" +#include "code/pcDesc.hpp" +#include "code/relocInfo.hpp" +#include "code/vmreg.inline.hpp" +#include "compiler/compiler_globals.hpp" +#include "gc/epsilon/epsilon_globals.hpp" +#include "gc/shared/gc_globals.hpp" +#include "jfr/jfr.hpp" +#include "jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp" +#include "jfr/periodic/sampling/jfrSampleRequest.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.hpp" +#include "jfr/recorder/checkpoint/types/traceid/jfrTraceIdMacros.hpp" +#include "jfr/recorder/storage/jfrBuffer.hpp" +#include "jfr/support/jfrIntrinsics.hpp" +#include "jfr/support/jfrKlassExtension.hpp" +#include "jfr/support/jfrThreadExtension.hpp" +#include "jfr/support/jfrThreadId.hpp" +#include "jfr/support/jfrThreadLocal.hpp" +#include "jfr/support/jfrTraceIdExtension.hpp" +#include "jfr/utilities/jfrAllocation.hpp" +#include "jfr/utilities/jfrBlob.hpp" +#include "jfr/utilities/jfrRefCountPointer.hpp" +#include "jfr/utilities/jfrTime.hpp" +#include "jfr/utilities/jfrTypes.hpp" +#include "logging/logDecorations.hpp" +#include "logging/logHandle.hpp" +#include "logging/logMessage.hpp" +#include "logging/logMessageBuffer.hpp" +#include "logging/logStream.hpp" +#include "runtime/nonJavaThread.hpp" +#include "runtime/stubDeclarations.hpp" +#include "runtime/stubInfo.hpp" +#include "utilities/resizeableResourceHash.hpp" +#endif + +#if INCLUDE_G1GC +#include "asm/codeBuffer.hpp" +#include "code/oopRecorder.hpp" +#include "code/relocInfo.hpp" +#include "compiler/compiler_globals.hpp" +#include "logging/logDecorations.hpp" +#include "logging/logMessageBuffer.hpp" +#include "utilities/resizeableResourceHash.hpp" +#endif + +#if INCLUDE_SHENANDOAHGC +#include "asm/codeBuffer.hpp" +#include "code/codeBlob.hpp" +#include "code/oopRecorder.hpp" +#include "code/relocInfo.hpp" +#include "compiler/compiler_globals.hpp" +#include "logging/logDecorations.hpp" +#include "logging/logHandle.hpp" +#include "logging/logMessage.hpp" +#include "logging/logMessageBuffer.hpp" +#include "logging/logStream.hpp" +#include "utilities/resizeableResourceHash.hpp" +#endif + +#if INCLUDE_ZGC +#include "compiler/compiler_globals.hpp" +#endif diff --git a/src/utils/PrecompiledHeaders/PrecompiledHeaders.java b/src/utils/PrecompiledHeaders/PrecompiledHeaders.java new file mode 100644 index 0000000000000..addbc49dffa49 --- /dev/null +++ b/src/utils/PrecompiledHeaders/PrecompiledHeaders.java @@ -0,0 +1,152 @@ + +/* + * Copyright (c) 2025, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public final class PrecompiledHeaders { + + private static final Pattern DEPENDENCY_LINE_PATTERN = Pattern.compile("\\s*(\\S+.hpp)\\s*\\\\?"); + private static final Pattern INCLUDE_PATTERN = Pattern.compile("^#\\s*include \"([^\"]+)\"$"); + private static final String PRECOMPILED_HPP_NAME = "precompiled.hpp"; + private static final String PRECOMPILED_HPP_PATH = "src/hotspot/share/precompiled/" + PRECOMPILED_HPP_NAME; + private static final String INLINE_HPP_SUFFIX = ".inline.hpp"; + private static final String HOTSPOT_SOURCE_PREFIX = "/jdk/src/hotspot/share/"; + + private PrecompiledHeaders() { + throw new UnsupportedOperationException("Instances not allowed"); + } + + public static void main(String[] args) throws IOException { + if (args.length < 2 || args.length > 3) { + System.err.println("Usage: min_inclusion_count build_root [jdk_root=.]"); + System.exit(1); + } + + int minInclusionCount = Integer.parseInt(args[0]); + Path buildRoot = Path.of(args[1]).toAbsolutePath(); + if (!Files.isDirectory(buildRoot)) { + throw new IllegalArgumentException("build_root is not a directory: " + buildRoot); + } + Path jdkRoot = Path.of(args.length == 3 ? args[2] : ".").toAbsolutePath(); + if (!Files.isDirectory(jdkRoot)) { + throw new IllegalArgumentException("jdk_root is not a directory: " + jdkRoot); + } + + Path hotspotBuild = buildRoot.resolve("hotspot"); + if (!Files.isDirectory(hotspotBuild)) { + throw new IllegalArgumentException("Could not find 'hotspot' directory: " + hotspotBuild); + } + Path objs = getVariantDirectory(hotspotBuild).resolve("objs"); + + // Count inclusion times for each header + Map occurrences; + try (Stream files = Files.list(objs)) { + occurrences = files + .filter(file -> file.getFileName().toString().endsWith(".d")) + .filter(Predicate.not(file -> file.getFileName().toString().startsWith("BUILD_LIBJVM"))) + .filter(Predicate.not(file -> file.getFileName().toString().contains(PRECOMPILED_HPP_NAME))) + .flatMap(file -> { + try { + // The first line contains the object name + return Files.lines(file).skip(1).distinct(); + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + }) + .map(DEPENDENCY_LINE_PATTERN::matcher) + .filter(Matcher::matches) + .map(matcher -> matcher.group(1)) + .filter(dependency -> dependency.startsWith(HOTSPOT_SOURCE_PREFIX)) + // Avoid compiler specific headers + .filter(Predicate.not(dependency -> dependency.endsWith("_gcc.hpp"))) + .filter(Predicate.not(dependency -> dependency.endsWith("_visCPP.hpp"))) + .filter(Predicate.not(dependency -> dependency.endsWith("/" + PRECOMPILED_HPP_NAME))) + .map(dependency -> dependency.replace(HOTSPOT_SOURCE_PREFIX, "")) + .collect(Collectors.toMap(Function.identity(), s -> 1, Integer::sum)); + } + + // Keep only the headers which are included at least 'minInclusionCount' times + Set headers = occurrences.entrySet().stream() + .filter(entry -> entry.getValue() >= minInclusionCount) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + + List inlineIncludes = occurrences.keySet().stream() + .filter(s -> s.endsWith(INLINE_HPP_SUFFIX)) + .toList(); + // If both inline and non-inline headers are to be included, prefer the inline header + for (String inlineInclude : inlineIncludes) { + if (headers.contains(inlineInclude)) { + String noInlineInclude = inlineInclude.replace(INLINE_HPP_SUFFIX, ".hpp"); + headers.remove(noInlineInclude); + } + } + + Path precompiledHpp = jdkRoot.resolve(PRECOMPILED_HPP_PATH); + try (Stream lines = Files.lines(precompiledHpp)) { + String precompiledHppHeader = lines + .takeWhile(Predicate.not(s -> INCLUDE_PATTERN.matcher(s).matches())) + .collect(Collectors.joining(System.lineSeparator())); + Files.write(precompiledHpp, precompiledHppHeader.getBytes()); + } + + String headerLines = headers.stream() + .sorted() + .map(header -> String.format("#include \"%s\"", header)) + .collect(Collectors.joining(System.lineSeparator())); + Files.write(precompiledHpp, + (System.lineSeparator() + headerLines + System.lineSeparator()).getBytes(), + StandardOpenOption.APPEND); + } + + private static Path getVariantDirectory(Path hotspotBuild) { + try (DirectoryStream stream = Files.newDirectoryStream(hotspotBuild, "variant-*")) { + for (Path variant : stream) { + Path libjvmDirectory = variant.resolve("libjvm"); + if (Files.isDirectory(libjvmDirectory)) { + return libjvmDirectory; + } + } + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + throw new IllegalArgumentException("'variant-*/libjvm' not found in " + hotspotBuild); + } + +} diff --git a/src/utils/PrecompiledHeaders/README.md b/src/utils/PrecompiledHeaders/README.md new file mode 100644 index 0000000000000..83fe991ad220a --- /dev/null +++ b/src/utils/PrecompiledHeaders/README.md @@ -0,0 +1,26 @@ +# Hotspot precompiled headers + +This directory contains a simple tool to refresh the current set of precompiled headers +in `src/hotspot`. The headers are selected according to how frequently they are included +in Hotspot source code. + +## Usage + +The script requires two parameters: +- The minimum inclusion count a header must reach in order to be precompiled; +- The path to a build, which will be used to extract dependency information for each Hotspot + source file. +Optionally, the root path to the JDK project can be specified as the second parameter. + +```bash +$ javac src/utils/PrecompiledHeaders/PrecompiledHeaders.java +$ java -cp src/utils/PrecompiledHeaders PrecompiledHeaders min_inclusion_count build_root [jdk_root=.] +``` + +The script will write to `src/hotspot/share/precompiled/precompiled.hpp` the new set of +headers selected to be precompiled. + +## Related tickets + +- [JDK-8213339](https://bugs.openjdk.org/browse/JDK-8213339) +- [JDK-8365053](https://bugs.openjdk.org/browse/JDK-8365053)