changeset 59346:7631df99930a

8244093: Move all IDE support into coherent structure in make directory Reviewed-by: mcimadamore, jlahoda, chegar, erikj
author ihse
date Tue, 19 May 2020 15:49:46 +0200
parents be14f631436c
children 0c1aa8020424
files bin/idea.sh make/Main.gmk make/hotspot/ide/CreateVSProject.gmk make/hotspot/src/classes/build/tools/projectcreator/ArgsParser.java make/hotspot/src/classes/build/tools/projectcreator/BuildConfig.java make/hotspot/src/classes/build/tools/projectcreator/FileTreeCreator.java make/hotspot/src/classes/build/tools/projectcreator/FileTreeCreatorVC10.java make/hotspot/src/classes/build/tools/projectcreator/ProjectCreator.java make/hotspot/src/classes/build/tools/projectcreator/Util.java make/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatform.java make/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatformVC10.java make/ide/idea/jdk/build.xml make/ide/idea/jdk/idea.gmk make/ide/idea/jdk/template/.name make/ide/idea/jdk/template/ant.xml make/ide/idea/jdk/template/compiler.xml make/ide/idea/jdk/template/copyright/profiles_settings.xml make/ide/idea/jdk/template/jdk.iml make/ide/idea/jdk/template/misc.xml make/ide/idea/jdk/template/modules.xml make/ide/idea/jdk/template/scopes/scope_settings.xml make/ide/idea/jdk/template/src/idea/IdeaLoggerWrapper.java make/ide/idea/jdk/template/src/idea/JdkIdeaAntLogger.java make/ide/idea/jdk/template/vcs.xml make/ide/idea/jdk/template/workspace.xml make/ide/idea/langtools/build.xml make/ide/idea/langtools/template/ant.xml make/ide/idea/langtools/template/codeStyleSettings.xml make/ide/idea/langtools/template/compiler.xml make/ide/idea/langtools/template/copyright/langtools.xml make/ide/idea/langtools/template/copyright/profiles_settings.xml make/ide/idea/langtools/template/inspectionProfiles/langtools.xml make/ide/idea/langtools/template/inspectionProfiles/profiles_settings.xml make/ide/idea/langtools/template/langtools.iml make/ide/idea/langtools/template/misc.xml make/ide/idea/langtools/template/modules.xml make/ide/idea/langtools/template/runConfigurations/javac.xml make/ide/idea/langtools/template/runConfigurations/javadoc.xml make/ide/idea/langtools/template/runConfigurations/javap.xml make/ide/idea/langtools/template/runConfigurations/jshell.xml make/ide/idea/langtools/template/runConfigurations/sjavac.xml make/ide/idea/langtools/template/src/idea/IdeaLoggerWrapper.java make/ide/idea/langtools/template/src/idea/LangtoolsIdeaAntLogger.java make/ide/idea/langtools/template/vcs.xml make/ide/idea/langtools/template/workspace.xml make/ide/netbeans/hotspot/nbproject/configurations.xml make/ide/netbeans/hotspot/nbproject/project.xml make/ide/netbeans/langtools/README make/ide/netbeans/langtools/build.xml make/ide/netbeans/langtools/nbproject/project.properties make/ide/netbeans/langtools/nbproject/project.xml make/ide/visualstudio/hotspot/CreateVSProject.gmk make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/ArgsParser.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/BuildConfig.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/FileTreeCreator.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/FileTreeCreatorVC10.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/ProjectCreator.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/Util.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatform.java make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatformVC10.java make/ide/vscode/hotspot/CreateVSCodeProject.gmk make/ide/vscode/hotspot/indexers/ccls-extensions.txt make/ide/vscode/hotspot/indexers/ccls-notes.txt make/ide/vscode/hotspot/indexers/ccls-settings.txt make/ide/vscode/hotspot/indexers/clangd-extensions.txt make/ide/vscode/hotspot/indexers/clangd-notes.txt make/ide/vscode/hotspot/indexers/clangd-settings.txt make/ide/vscode/hotspot/indexers/cpptools-extensions.txt make/ide/vscode/hotspot/indexers/cpptools-settings.txt make/ide/vscode/hotspot/indexers/rtags-extensions.txt make/ide/vscode/hotspot/indexers/rtags-settings.txt make/ide/vscode/hotspot/template-launch.jsonc make/ide/vscode/hotspot/template-tasks.jsonc make/ide/vscode/hotspot/template-workspace-folder.txt make/ide/vscode/hotspot/template-workspace.jsonc make/idea/build.xml make/idea/idea.gmk make/idea/template/.name make/idea/template/ant.xml make/idea/template/compiler.xml make/idea/template/copyright/profiles_settings.xml make/idea/template/jdk.iml make/idea/template/misc.xml make/idea/template/modules.xml make/idea/template/scopes/scope_settings.xml make/idea/template/src/idea/IdeaLoggerWrapper.java make/idea/template/src/idea/JdkIdeaAntLogger.java make/idea/template/vcs.xml make/idea/template/workspace.xml make/jdk/netbeans/README make/jdk/netbeans/awt2d/README make/jdk/netbeans/awt2d/build.properties make/jdk/netbeans/awt2d/build.xml make/jdk/netbeans/awt2d/nbproject/project.xml make/jdk/netbeans/client_sanity/README make/jdk/netbeans/client_sanity/build.xml make/jdk/netbeans/client_sanity/manifest.mf make/jdk/netbeans/client_sanity/nbproject/build-impl.xml make/jdk/netbeans/client_sanity/nbproject/genfiles.properties make/jdk/netbeans/client_sanity/nbproject/project.properties make/jdk/netbeans/client_sanity/nbproject/project.xml make/jdk/netbeans/common/README-ent make/jdk/netbeans/common/architectures/README make/jdk/netbeans/common/architectures/arch-amd64.properties make/jdk/netbeans/common/architectures/arch-i386.properties make/jdk/netbeans/common/architectures/arch-sparc.properties make/jdk/netbeans/common/architectures/arch-x86.properties make/jdk/netbeans/common/architectures/arch-x86_64.properties make/jdk/netbeans/common/architectures/name-Bsd.properties make/jdk/netbeans/common/architectures/name-Linux.properties make/jdk/netbeans/common/architectures/name-Macosx.properties make/jdk/netbeans/common/architectures/name-SunOS.properties make/jdk/netbeans/common/build-folder.ent make/jdk/netbeans/common/closed-share-sources.ent make/jdk/netbeans/common/closed-share-view.ent make/jdk/netbeans/common/demo-sources.ent make/jdk/netbeans/common/demo-view.ent make/jdk/netbeans/common/file-view.ent make/jdk/netbeans/common/java-data-native.ent make/jdk/netbeans/common/java-data-no-native.ent make/jdk/netbeans/common/jtreg-sources.ent make/jdk/netbeans/common/jtreg-view.ent make/jdk/netbeans/common/macosx-sources.ent make/jdk/netbeans/common/macosx-view.ent make/jdk/netbeans/common/make.xml make/jdk/netbeans/common/properties.ent make/jdk/netbeans/common/sample-sources.ent make/jdk/netbeans/common/sample-view.ent make/jdk/netbeans/common/share-sources.ent make/jdk/netbeans/common/share-view.ent make/jdk/netbeans/common/shared.xml make/jdk/netbeans/common/standard-actions.ent make/jdk/netbeans/common/standard-bindings.ent make/jdk/netbeans/common/unix-sources.ent make/jdk/netbeans/common/unix-view.ent make/jdk/netbeans/common/windows-sources.ent make/jdk/netbeans/common/windows-view.ent make/jdk/netbeans/j2se/README make/jdk/netbeans/j2se/build.properties make/jdk/netbeans/j2se/build.xml make/jdk/netbeans/j2se/nbproject/project.xml make/jdk/netbeans/jarzip/README make/jdk/netbeans/jarzip/build.properties make/jdk/netbeans/jarzip/build.xml make/jdk/netbeans/jarzip/nbproject/project.xml make/jdk/netbeans/jconsole/README make/jdk/netbeans/jconsole/build.properties make/jdk/netbeans/jconsole/build.xml make/jdk/netbeans/jconsole/nbproject/project.xml make/jdk/netbeans/jdbc/README make/jdk/netbeans/jdbc/build.properties make/jdk/netbeans/jdbc/build.xml make/jdk/netbeans/jdbc/nbproject/project.xml make/jdk/netbeans/jdwpgen/build.xml make/jdk/netbeans/jdwpgen/nbproject/build-impl.xml make/jdk/netbeans/jdwpgen/nbproject/findbugs.settings make/jdk/netbeans/jdwpgen/nbproject/genfiles.properties make/jdk/netbeans/jdwpgen/nbproject/project.properties make/jdk/netbeans/jdwpgen/nbproject/project.xml make/jdk/netbeans/jdwpgen/nbproject/sqe.properties make/jdk/netbeans/jmx/README make/jdk/netbeans/jmx/build.properties make/jdk/netbeans/jmx/build.xml make/jdk/netbeans/jmx/nbproject/project.xml make/jdk/netbeans/swing/README make/jdk/netbeans/swing/build.properties make/jdk/netbeans/swing/build.xml make/jdk/netbeans/swing/nbproject/project.xml make/jdk/netbeans/world/README make/jdk/netbeans/world/build.properties make/jdk/netbeans/world/build.xml make/jdk/netbeans/world/nbproject/project.xml make/langtools/build.xml make/langtools/intellij/build.xml make/langtools/intellij/template/ant.xml make/langtools/intellij/template/codeStyleSettings.xml make/langtools/intellij/template/compiler.xml make/langtools/intellij/template/copyright/langtools.xml make/langtools/intellij/template/copyright/profiles_settings.xml make/langtools/intellij/template/inspectionProfiles/langtools.xml make/langtools/intellij/template/inspectionProfiles/profiles_settings.xml make/langtools/intellij/template/langtools.iml make/langtools/intellij/template/misc.xml make/langtools/intellij/template/modules.xml make/langtools/intellij/template/runConfigurations/javac.xml make/langtools/intellij/template/runConfigurations/javadoc.xml make/langtools/intellij/template/runConfigurations/javap.xml make/langtools/intellij/template/runConfigurations/jshell.xml make/langtools/intellij/template/runConfigurations/sjavac.xml make/langtools/intellij/template/src/idea/IdeaLoggerWrapper.java make/langtools/intellij/template/src/idea/LangtoolsIdeaAntLogger.java make/langtools/intellij/template/vcs.xml make/langtools/intellij/template/workspace.xml make/langtools/netbeans/README make/langtools/netbeans/langtools/build.xml make/langtools/netbeans/langtools/nbproject/project.properties make/langtools/netbeans/langtools/nbproject/project.xml make/nb_native/nbproject/configurations.xml make/nb_native/nbproject/project.xml make/vscode/CreateVSCodeProject.gmk make/vscode/indexers/ccls-extensions.txt make/vscode/indexers/ccls-notes.txt make/vscode/indexers/ccls-settings.txt make/vscode/indexers/clangd-extensions.txt make/vscode/indexers/clangd-notes.txt make/vscode/indexers/clangd-settings.txt make/vscode/indexers/cpptools-extensions.txt make/vscode/indexers/cpptools-settings.txt make/vscode/indexers/rtags-extensions.txt make/vscode/indexers/rtags-settings.txt make/vscode/template-launch.jsonc make/vscode/template-tasks.jsonc make/vscode/template-workspace-folder.txt make/vscode/template-workspace.jsonc
diffstat 214 files changed, 5223 insertions(+), 12435 deletions(-) [+]
line wrap: on
line diff
--- a/bin/idea.sh	Tue May 19 15:11:58 2020 +0200
+++ b/bin/idea.sh	Tue May 19 15:49:46 2020 +0200
@@ -74,7 +74,7 @@
 fi
 
 MAKE_DIR="$SCRIPT_DIR/../make"
-IDEA_MAKE="$MAKE_DIR/idea"
+IDEA_MAKE="$MAKE_DIR/ide/idea/jdk"
 IDEA_TEMPLATE="$IDEA_MAKE/template"
 
 cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT"
--- a/make/Main.gmk	Tue May 19 15:11:58 2020 +0200
+++ b/make/Main.gmk	Tue May 19 15:49:46 2020 +0200
@@ -261,7 +261,7 @@
 $(foreach v, $(JVM_VARIANTS), $(eval $(call DeclareHotspotLibsRecipe,$v)))
 
 $(eval $(call SetupTarget, hotspot-ide-project, \
-    MAKEFILE := hotspot/ide/CreateVSProject, \
+    MAKEFILE := ide/visualstudio/hotspot/CreateVSProject, \
     DEPS := hotspot exploded-image, \
     ARGS := -I$(TOPDIR)/make/hotspot, \
 ))
@@ -302,25 +302,25 @@
 # VS Code projects
 
 $(eval $(call SetupTarget, vscode-project, \
-    MAKEFILE := CreateVSCodeProject, \
+    MAKEFILE := ide/vscode/hotspot/CreateVSCodeProject, \
     ARGS := VSCODE_INDEXER=cpptools, \
     DEPS := compile-commands, \
 ))
 
 $(eval $(call SetupTarget, vscode-project-clangd, \
-    MAKEFILE := CreateVSCodeProject, \
+    MAKEFILE := ide/vscode/hotspot/CreateVSCodeProject, \
     ARGS := VSCODE_INDEXER=clangd, \
     DEPS := compile-commands, \
 ))
 
 $(eval $(call SetupTarget, vscode-project-rtags, \
-    MAKEFILE := CreateVSCodeProject, \
+    MAKEFILE := ide/vscode/hotspot/CreateVSCodeProject, \
     ARGS := VSCODE_INDEXER=rtags, \
     DEPS := compile-commands, \
 ))
 
 $(eval $(call SetupTarget, vscode-project-ccls, \
-    MAKEFILE := CreateVSCodeProject, \
+    MAKEFILE := ide/vscode/hotspot/CreateVSCodeProject, \
     ARGS := VSCODE_INDEXER=ccls, \
     DEPS := compile-commands, \
 ))
--- a/make/hotspot/ide/CreateVSProject.gmk	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-#
-# Copyright (c) 2016, 2020, 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.  Oracle designates this
-# particular file as subject to the "Classpath" exception as provided
-# by Oracle in the LICENSE file that accompanied this code.
-#
-# 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.
-#
-
-# This must be the first rule
-default: all
-
-include $(SPEC)
-include MakeBase.gmk
-include JavaCompilation.gmk
-include Execute.gmk
-
-ifeq ($(call isTargetOs, windows), true)
-  # The next part is a bit hacky. We include the CompileJvm.gmk to be
-  # able to extact flags, but we do not wish to execute the rules.
-
-  # Use server as base for defines and includes
-  JVM_VARIANT=server
-
-  include HotspotCommon.gmk
-  include lib/CompileJvm.gmk
-
-  # Reset targets so we don't build libjvm.
-  TARGETS :=
-
-  # Helper macro to convert a unix path to a Windows path, suitable for
-  # inclusion in a command line.
-  ifeq ($(call isBuildOsEnv, windows.cygwin), true)
-    FixPath = \
-        $(strip $(subst \,\\,$(shell $(CYGPATH) -w $1)))
-    FixLinuxExecutable = \
-        $(call FixPath, $1)
-  else ifeq ($(call isBuildOsEnv, windows.wsl), true)
-    FixPath = \
-        $(strip $(subst \,\\,$(shell $(WSLPATH) -w $1)))
-    FixLinuxExecutable = \
-        "%windir%\Sysnative\wsl.exe $1"
-  endif
-
-  JVM_DEFINES_client := $(patsubst -D%,%, $(filter -D%, $(JVM_CFLAGS)))
-  EXTRACTED_DEFINES_client := $(addprefix -define , $(JVM_DEFINES_client))
-
-  JVM_INCLUDES_client := $(patsubst -I%,%, $(filter -I%, $(JVM_CFLAGS)))
-  EXTRACTED_INCLUDES_client := $(foreach path, $(JVM_INCLUDES_client), -absoluteInclude $(call FixPath, $(path)))
-
-  # Hand-code variant-specific arguments, based on the fact that we use
-  # client for general arguments. Not optimal but other solutions require
-  # major changes in ProjectCreator.
-  ADDITIONAL_VARIANT_ARGS := \
-      -define_server COMPILER2 \
-      -ignorePath_client adfiles \
-      -ignorePath_client c2_ \
-      -ignorePath_client runtime_ \
-      -ignorePath_client libadt \
-      -ignorePath_client opto \
-      #
-
-  IGNORED_PLATFORMS_ARGS := \
-    -ignorePath aarch64 \
-    -ignorePath aix \
-    -ignorePath arm \
-    -ignorePath bsd \
-    -ignorePath linux \
-    -ignorePath posix \
-    -ignorePath ppc \
-    -ignorePath solaris \
-    -ignorePath sparc \
-    -ignorePath x86_32 \
-    -ignorePath zero \
-      #
-
-  ################################################################################
-  # Build the ProjectCreator java tool.
-
-  TOOLS_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/support/tools_classes
-
-  $(eval $(call SetupJavaCompilation, BUILD_PROJECT_CREATOR, \
-      TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
-      DISABLED_WARNINGS := auxiliaryclass deprecation rawtypes unchecked cast options, \
-      SRC := $(TOPDIR)/make/hotspot/src/classes, \
-      BIN := $(TOOLS_OUTPUTDIR), \
-      JAVAC_FLAGS := -XDstringConcat=inline, \
-  ))
-
-  TARGETS += $(BUILD_PROJECT_CREATOR)
-
-  # Run the ProjectCreator tool
-  PROJECT_CREATOR_TOOL := $(JAVA_SMALL) -cp $(TOOLS_OUTPUTDIR) build.tools.projectcreator.ProjectCreator
-
-  IDE_OUTPUTDIR := $(OUTPUTDIR)/ide/hotspot-visualstudio
-
-  VCPROJ_FILE := $(IDE_OUTPUTDIR)/jvm.vcxproj
-
-  PROJECT_CREATOR_CLASS := build.tools.projectcreator.WinGammaPlatformVC10
-
-  # We hard-code gensrc dir to server (since this includes adfiles)
-  PROJECT_CREATOR_ARGS := \
-      -sourceBase $(call FixPath, $(TOPDIR)/src) \
-      -startAt hotspot \
-      -relativeSrcInclude hotspot \
-      -hidePath .hg \
-      -hidePath .jcheck \
-      -hidePath jdk.aot \
-      -hidePath jdk.hotspot.agent \
-      -hidePath jdk.internal.vm.ci \
-      -hidePath jdk.internal.vm.compiler \
-      -hidePath jdk.jfr \
-      -compiler VC10 \
-      -jdkTargetRoot $(call FixPath, $(JDK_OUTPUTDIR)) \
-      -platformName x64 \
-      -buildBase $(call FixPath, $(IDE_OUTPUTDIR)/vs-output) \
-      -buildSpace $(call FixPath, $(IDE_OUTPUTDIR)) \
-      -makeBinary $(call FixLinuxExecutable, $(MAKE)) \
-      -makeOutput $(call FixPath, $(JDK_OUTPUTDIR)/bin/server) \
-      -absoluteInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
-      -absoluteSrcInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
-      $(EXTRACTED_DEFINES_client) \
-      $(EXTRACTED_INCLUDES_client) \
-      $(ADDITIONAL_VARIANT_ARGS) \
-      $(IGNORED_PLATFORMS_ARGS) \
-      #
-
-  VCPROJ_VARDEPS := $(PROJECT_CREATOR_CLASS) $(PROJECT_CREATOR_ARGS)
-  VCPROJ_VARDEPS_FILE := $(call DependOnVariable, VCPROJ_VARDEPS, \
-    $(VCPROJ_FILE).vardeps)
-
-  $(eval $(call SetupExecute, vcproj_file, \
-      INFO := Generating Visual Studio project file, \
-      DEPS := $(BUILD_PROJECT_CREATOR) $(VCPROJ_VARDEPS_FILE), \
-      OUTPUT_FILE := $(VCPROJ_FILE), \
-      COMMAND := $(PROJECT_CREATOR_TOOL) $(PROJECT_CREATOR_CLASS) \
-          $(PROJECT_CREATOR_ARGS) -projectFileName $(call FixPath, $(VCPROJ_FILE)) \
-          $(LOG_INFO), \
-  ))
-
-  TARGETS += $(vcproj_file_TARGET)
-
-  all: $(TARGETS)
-
-else
-  all:
-	$(info Hotspot Visual Studio generation only supported on Windows)
-endif
-
-.PHONY: all
--- a/make/hotspot/src/classes/build/tools/projectcreator/ArgsParser.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2005, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-class ArgIterator {
-    String[] args;
-    int i;
-    ArgIterator(String[] args) {
-        this.args = args;
-        this.i = 0;
-    }
-    String get() { return args[i]; }
-    boolean hasMore() { return args != null && i  < args.length; }
-    boolean next() { return ++i < args.length; }
-}
-
-abstract class ArgHandler {
-    public abstract void handle(ArgIterator it);
-
-}
-
-class ArgRule {
-    String arg;
-    ArgHandler handler;
-    ArgRule(String arg, ArgHandler handler) {
-        this.arg = arg;
-        this.handler = handler;
-    }
-
-    boolean process(ArgIterator it) {
-        if (match(it.get(), arg)) {
-            handler.handle(it);
-            return true;
-        }
-        return false;
-    }
-    boolean match(String rule_pattern, String arg) {
-        return arg.equals(rule_pattern);
-    }
-}
-
-class ArgsParser {
-    ArgsParser(String[] args,
-               ArgRule[] rules,
-               ArgHandler defaulter) {
-        ArgIterator ai = new ArgIterator(args);
-        while (ai.hasMore()) {
-            boolean processed = false;
-            for (int i=0; i<rules.length; i++) {
-                processed |= rules[i].process(ai);
-                if (processed) {
-                    break;
-                }
-            }
-            if (!processed) {
-                if (defaulter != null) {
-                    defaulter.handle(ai);
-                } else {
-                    System.err.println("ERROR: unparsed \""+ai.get()+"\"");
-                    ai.next();
-                }
-            }
-        }
-    }
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/BuildConfig.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,624 +0,0 @@
-/*
- * Copyright (c) 2005, 2018, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-class BuildConfig {
-    @SuppressWarnings("rawtypes")
-    Hashtable vars;
-    Vector<String> basicNames, basicPaths;
-    String[] context;
-
-    static CompilerInterface ci;
-    static CompilerInterface getCI() {
-        if (ci == null) {
-            String comp = (String)getField(null, "CompilerVersion");
-            try {
-                ci = (CompilerInterface)Class.forName("build.tools.projectcreator.CompilerInterface" + comp).newInstance();
-            } catch (Exception cnfe) {
-                System.err.println("Cannot find support for compiler " + comp);
-                throw new RuntimeException(cnfe.toString());
-            }
-        }
-        return ci;
-    }
-
-    @SuppressWarnings("rawtypes")
-    protected void initNames(String flavour, String build, String outDll) {
-        if (vars == null) vars = new Hashtable();
-
-        String flavourBuild =  flavour + "_" + build;
-        String platformName = getFieldString(null, "PlatformName");
-        System.out.println();
-        System.out.println(flavourBuild);
-
-        put("Name", getCI().makeCfgName(flavourBuild, platformName));
-        put("Flavour", flavour);
-        put("Build", build);
-        put("PlatformName", platformName);
-
-        // ones mentioned above were needed to expand format
-        String buildBase = expandFormat(getFieldString(null, "BuildBase"));
-        String sourceBase = getFieldString(null, "SourceBase");
-        String buildSpace = getFieldString(null, "BuildSpace");
-        String outDir = buildBase;
-        String jdkTargetRoot = getFieldString(null, "JdkTargetRoot");
-        String makeBinary = getFieldString(null, "MakeBinary");
-        String makeOutput = expandFormat(getFieldString(null, "MakeOutput"));
-
-        put("Id", flavourBuild);
-        put("OutputDir", outDir);
-        put("SourceBase", sourceBase);
-        put("BuildBase", buildBase);
-        put("BuildSpace", buildSpace);
-        put("OutputDll", outDir + Util.sep + outDll);
-        put("JdkTargetRoot", jdkTargetRoot);
-        put("MakeBinary", makeBinary);
-        put("MakeOutput", makeOutput);
-
-        context = new String [] {flavourBuild, flavour, build, null};
-    }
-
-    protected void init(Vector<String> includes, Vector<String> defines) {
-        initDefaultDefines(defines);
-        initDefaultCompilerFlags(includes);
-        initDefaultLinkerFlags();
-        //handleDB();
-    }
-
-
-    protected void initDefaultCompilerFlags(Vector<String> includes) {
-        Vector compilerFlags = new Vector();
-
-        compilerFlags.addAll(getCI().getBaseCompilerFlags(getV("Define"),
-                                                          includes,
-                                                          get("OutputDir")));
-
-        put("CompilerFlags", compilerFlags);
-    }
-
-    protected void initDefaultLinkerFlags() {
-        Vector linkerFlags = new Vector();
-
-        linkerFlags.addAll(getCI().getBaseLinkerFlags( get("OutputDir"), get("OutputDll"), get("PlatformName")));
-
-        put("LinkerFlags", linkerFlags);
-    }
-
-    public boolean matchesIgnoredPath(String path) {
-        Vector<String> rv = new Vector<String>();
-        collectRelevantVectors(rv, "IgnorePath");
-        for (String pathPart : rv) {
-            if (path.contains(pathPart))  {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean matchesHidePath(String path) {
-        Vector<String> rv = new Vector<String>();
-        collectRelevantVectors(rv, "HidePath");
-        for (String pathPart : rv) {
-            if (path.contains(Util.normalize(pathPart)))  {
-                return true;
-            }
-        }
-        return false;
-    }
-
-   public Vector<String> matchesAdditionalGeneratedPath(String fullPath) {
-        Vector<String> rv = new Vector<String>();
-        Hashtable<String, String> v = (Hashtable<String, String>)BuildConfig.getField(this.toString(), "AdditionalGeneratedFile");
-        if (v != null) {
-            for (Enumeration<String> e=v.keys(); e.hasMoreElements(); ) {
-                String key = e.nextElement();
-                String val = v.get(key);
-
-                if (fullPath.endsWith(expandFormat(key))) {
-                    rv.add(expandFormat(val));
-                }
-            }
-        }
-        return rv;
-    }
-
-    // Returns true if the specified path refers to a relative alternate
-    // source file. RelativeAltSrcInclude is usually "src\closed".
-    public static boolean matchesRelativeAltSrcInclude(String path) {
-        String relativeAltSrcInclude =
-            getFieldString(null, "RelativeAltSrcInclude");
-        Vector<String> v = getFieldVector(null, "AltRelativeInclude");
-        if (v != null) {
-            for (String pathPart : v) {
-                if (path.contains(relativeAltSrcInclude + Util.sep + pathPart))  {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    // Returns the relative alternate source file for the specified path.
-    // Null is returned if the specified path does not have a matching
-    // alternate source file.
-    public static String getMatchingRelativeAltSrcFile(String path) {
-        Vector<String> v = getFieldVector(null, "RelativeAltSrcFileList");
-        if (v == null) {
-            return null;
-        }
-        for (String pathPart : v) {
-            if (path.endsWith(pathPart)) {
-                String relativeAltSrcInclude =
-                    getFieldString(null, "RelativeAltSrcInclude");
-                return relativeAltSrcInclude + Util.sep + pathPart;
-            }
-        }
-        return null;
-    }
-
-    // Returns true if the specified path has a matching alternate
-    // source file.
-    public static boolean matchesRelativeAltSrcFile(String path) {
-        return getMatchingRelativeAltSrcFile(path) != null;
-    }
-
-    // Track the specified alternate source file. The source file is
-    // tracked without the leading .*<sep><RelativeAltSrcFileList><sep>
-    // part to make matching regular source files easier.
-    public static void trackRelativeAltSrcFile(String path) {
-        String pattern = getFieldString(null, "RelativeAltSrcInclude") +
-            Util.sep;
-        int altSrcInd = path.indexOf(pattern);
-        if (altSrcInd == -1) {
-            // not an AltSrc path
-            return;
-        }
-
-        altSrcInd += pattern.length();
-        if (altSrcInd >= path.length()) {
-            // not a valid AltSrc path
-            return;
-        }
-
-        String altSrcFile = path.substring(altSrcInd);
-        Vector v = getFieldVector(null, "RelativeAltSrcFileList");
-        if (v == null || !v.contains(altSrcFile)) {
-            addFieldVector(null, "RelativeAltSrcFileList", altSrcFile);
-        }
-    }
-
-    void addTo(Hashtable ht, String key, String value) {
-        ht.put(expandFormat(key), expandFormat(value));
-    }
-
-    void initDefaultDefines(Vector defines) {
-        Vector sysDefines = new Vector();
-        sysDefines.add("WIN32");
-        sysDefines.add("_WINDOWS");
-        sysDefines.add("HOTSPOT_BUILD_USER=\\\""+System.getProperty("user.name")+"\\\"");
-        sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\"");
-        sysDefines.add("INCLUDE_JFR=1");
-        sysDefines.add("_JNI_IMPLEMENTATION_");
-        if (vars.get("PlatformName").equals("Win32")) {
-            sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\"");
-        } else {
-            sysDefines.add("HOTSPOT_LIB_ARCH=\\\"amd64\\\"");
-        }
-        sysDefines.add("DEBUG_LEVEL=\\\"" + get("Build")+"\\\"");
-        sysDefines.addAll(defines);
-
-        put("Define", sysDefines);
-    }
-
-    String get(String key) {
-        return (String)vars.get(key);
-    }
-
-    Vector getV(String key) {
-        return (Vector)vars.get(key);
-    }
-
-    Object getO(String key) {
-        return vars.get(key);
-    }
-
-    Hashtable getH(String key) {
-        return (Hashtable)vars.get(key);
-    }
-
-    Object getFieldInContext(String field) {
-        for (int i=0; i<context.length; i++) {
-            Object rv = getField(context[i], field);
-            if (rv != null) {
-                return rv;
-            }
-        }
-        return null;
-    }
-
-    Object lookupHashFieldInContext(String field, String key) {
-        for (int i=0; i<context.length; i++) {
-            Hashtable ht = (Hashtable)getField(context[i], field);
-            if (ht != null) {
-                Object rv = ht.get(key);
-                if (rv != null) {
-                    return rv;
-                }
-            }
-        }
-        return null;
-    }
-
-    void put(String key, String value) {
-        vars.put(key, value);
-    }
-
-    void put(String key, Vector vvalue) {
-        vars.put(key, vvalue);
-    }
-
-    void add(String key, Vector vvalue) {
-        getV(key).addAll(vvalue);
-    }
-
-    String flavour() {
-        return get("Flavour");
-    }
-
-    String build() {
-        return get("Build");
-    }
-
-    Object getSpecificField(String field) {
-        return getField(get("Id"), field);
-    }
-
-    void putSpecificField(String field, Object value) {
-        putField(get("Id"), field, value);
-    }
-
-    void collectRelevantVectors(Vector rv, String field) {
-        for (String ctx : context) {
-            Vector<String> v = getFieldVector(ctx, field);
-            if (v != null) {
-                for (String val : v) {
-                    rv.add(expandFormat(val).replace('/', '\\'));
-                }
-            }
-        }
-    }
-
-    void collectRelevantHashes(Hashtable rv, String field) {
-        for (String ctx : context) {
-            Hashtable v = (Hashtable)getField(ctx, field);
-            if (v != null) {
-                for (Enumeration e=v.keys(); e.hasMoreElements(); ) {
-                    String key = (String)e.nextElement();
-                    String val =  (String)v.get(key);
-                    addTo(rv, key, val);
-                }
-            }
-        }
-    }
-
-
-    Vector getDefines() {
-        Vector rv = new Vector();
-        collectRelevantVectors(rv, "Define");
-        return rv;
-    }
-
-    Vector getIncludes() {
-        Vector rv = new Vector();
-        collectRelevantVectors(rv, "AbsoluteInclude");
-        rv.addAll(getSourceIncludes());
-        return rv;
-    }
-
-    private Vector getSourceIncludes() {
-        Vector<String> rv = new Vector<String>();
-        String sourceBase = getFieldString(null, "SourceBase");
-
-        // add relative alternate source include values:
-        String relativeAltSrcInclude =
-            getFieldString(null, "RelativeAltSrcInclude");
-        Vector<String> asri = new Vector<String>();
-        collectRelevantVectors(asri, "AltRelativeInclude");
-        for (String f : asri) {
-            rv.add(sourceBase + Util.sep + relativeAltSrcInclude +
-                   Util.sep + f);
-        }
-
-        Vector<String> ri = new Vector<String>();
-        collectRelevantVectors(ri, "RelativeInclude");
-        for (String f : ri) {
-            rv.add(sourceBase + Util.sep + f);
-        }
-        return rv;
-    }
-
-    static Hashtable cfgData = new Hashtable();
-    static Hashtable globalData = new Hashtable();
-
-    static boolean appliesToTieredBuild(String cfg) {
-        return (cfg != null &&
-                cfg.startsWith("server"));
-    }
-
-    // Filters out the IgnoreFile and IgnorePaths since they are
-    // handled specially for tiered builds.
-    static boolean appliesToTieredBuild(String cfg, String key) {
-        return (appliesToTieredBuild(cfg))&& (key != null && !key.startsWith("Ignore"));
-    }
-
-    static String getTieredBuildCfg(String cfg) {
-        assert appliesToTieredBuild(cfg) : "illegal configuration " + cfg;
-        return "server";
-    }
-
-    static Object getField(String cfg, String field) {
-        if (cfg == null) {
-            return globalData.get(field);
-        }
-
-        Hashtable ht =  (Hashtable)cfgData.get(cfg);
-        return ht == null ? null : ht.get(field);
-    }
-
-    static String getFieldString(String cfg, String field) {
-        return (String)getField(cfg, field);
-    }
-
-    static Vector getFieldVector(String cfg, String field) {
-        return (Vector)getField(cfg, field);
-    }
-
-    static void putField(String cfg, String field, Object value) {
-        putFieldImpl(cfg, field, value);
-        if (appliesToTieredBuild(cfg, field)) {
-            putFieldImpl(getTieredBuildCfg(cfg), field, value);
-        }
-    }
-
-    private static void putFieldImpl(String cfg, String field, Object value) {
-        if (cfg == null) {
-            globalData.put(field, value);
-            return;
-        }
-
-        Hashtable ht = (Hashtable)cfgData.get(cfg);
-        if (ht == null) {
-            ht = new Hashtable();
-            cfgData.put(cfg, ht);
-        }
-
-        ht.put(field, value);
-    }
-
-    static Object getFieldHash(String cfg, String field, String name) {
-        Hashtable ht = (Hashtable)getField(cfg, field);
-
-        return ht == null ? null : ht.get(name);
-    }
-
-    static void putFieldHash(String cfg, String field, String name, Object val) {
-        putFieldHashImpl(cfg, field, name, val);
-        if (appliesToTieredBuild(cfg, field)) {
-            putFieldHashImpl(getTieredBuildCfg(cfg), field, name, val);
-        }
-    }
-
-    private static void putFieldHashImpl(String cfg, String field, String name, Object val) {
-        Hashtable ht = (Hashtable)getField(cfg, field);
-
-        if (ht == null) {
-            ht = new Hashtable();
-            putFieldImpl(cfg, field, ht);
-        }
-
-        ht.put(name, val);
-    }
-
-    static void addFieldVector(String cfg, String field, String element) {
-        addFieldVectorImpl(cfg, field, element);
-        if (appliesToTieredBuild(cfg, field)) {
-            addFieldVectorImpl(getTieredBuildCfg(cfg), field, element);
-        }
-    }
-
-    private static void addFieldVectorImpl(String cfg, String field, String element) {
-        Vector v = (Vector)getField(cfg, field);
-
-        if (v == null) {
-            v = new Vector();
-            putFieldImpl(cfg, field, v);
-        }
-
-        v.add(element);
-    }
-
-    String expandFormat(String format) {
-        if (format == null) {
-            return null;
-        }
-
-        if (format.indexOf('%') == -1) {
-            return format;
-        }
-
-        StringBuffer sb = new StringBuffer();
-        int len = format.length();
-        for (int i=0; i<len; i++) {
-            char ch = format.charAt(i);
-            if (ch == '%') {
-                char ch1 = format.charAt(i+1);
-                switch (ch1) {
-                case '%':
-                    sb.append(ch1);
-                    break;
-                case 'b':
-                    sb.append(build());
-                    break;
-                case 'f':
-                    sb.append(flavour());
-                    break;
-                default:
-                    sb.append(ch);
-                    sb.append(ch1);
-                }
-                i++;
-            } else {
-                sb.append(ch);
-            }
-        }
-
-        return sb.toString();
-    }
-}
-
-abstract class GenericDebugConfig extends BuildConfig {
-    abstract String getOptFlag();
-
-    protected void init(Vector includes, Vector defines) {
-        defines.add("_DEBUG");
-        defines.add("ASSERT");
-
-        super.init(includes, defines);
-
-        getV("CompilerFlags").addAll(getCI().getDebugCompilerFlags(getOptFlag(), get("PlatformName")));
-        getV("LinkerFlags").addAll(getCI().getDebugLinkerFlags());
-   }
-}
-
-abstract class GenericDebugNonKernelConfig extends GenericDebugConfig {
-    protected void init(Vector includes, Vector defines) {
-        super.init(includes, defines);
-        if (get("PlatformName").equals("Win32")) {
-            getCI().getAdditionalNonKernelLinkerFlags(getV("LinkerFlags"));
-        }
-   }
-}
-
-class C1DebugConfig extends GenericDebugNonKernelConfig {
-    String getOptFlag() {
-        return getCI().getNoOptFlag();
-    }
-
-    C1DebugConfig() {
-        initNames("client", "debug", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-class C1FastDebugConfig extends GenericDebugNonKernelConfig {
-    String getOptFlag() {
-        return getCI().getOptFlag();
-    }
-
-    C1FastDebugConfig() {
-        initNames("client", "fastdebug", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-class TieredDebugConfig extends GenericDebugNonKernelConfig {
-    String getOptFlag() {
-        return getCI().getNoOptFlag();
-    }
-
-    TieredDebugConfig() {
-        initNames("server", "debug", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-class TieredFastDebugConfig extends GenericDebugNonKernelConfig {
-    String getOptFlag() {
-        return getCI().getOptFlag();
-    }
-
-    TieredFastDebugConfig() {
-        initNames("server", "fastdebug", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-abstract class ProductConfig extends BuildConfig {
-    protected void init(Vector includes, Vector defines) {
-        defines.add("NDEBUG");
-        defines.add("PRODUCT");
-
-        super.init(includes, defines);
-
-        getV("CompilerFlags").addAll(getCI().getProductCompilerFlags());
-        getV("LinkerFlags").addAll(getCI().getProductLinkerFlags());
-    }
-}
-
-class C1ProductConfig extends ProductConfig {
-    C1ProductConfig() {
-        initNames("client", "product", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-class TieredProductConfig extends ProductConfig {
-    TieredProductConfig() {
-        initNames("server", "product", "jvm.dll");
-        init(getIncludes(), getDefines());
-    }
-}
-
-
-abstract class CompilerInterface {
-    abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
-    abstract Vector getBaseLinkerFlags(String outDir, String outDll, String platformName);
-    abstract Vector getDebugCompilerFlags(String opt, String platformName);
-    abstract Vector getDebugLinkerFlags();
-    abstract void   getAdditionalNonKernelLinkerFlags(Vector rv);
-    abstract Vector getProductCompilerFlags();
-    abstract Vector getProductLinkerFlags();
-    abstract String getOptFlag();
-    abstract String getNoOptFlag();
-    abstract String makeCfgName(String flavourBuild, String platformName);
-
-    void addAttr(Vector receiver, String attr, String value) {
-        receiver.add(attr); receiver.add(value);
-    }
-    void extAttr(Vector receiver, String attr, String value) {
-        int attr_pos=receiver.indexOf(attr) ;
-        if ( attr_pos == -1) {
-          // If attr IS NOT present in the Vector - add it
-          receiver.add(attr); receiver.add(value);
-        } else {
-          // If attr IS present in the Vector - append value to it
-          receiver.set(attr_pos+1,receiver.get(attr_pos+1)+value);
-        }
-    }
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/FileTreeCreator.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2012, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.util.HashSet;
-import java.util.Stack;
-import java.util.Vector;
-
-public class FileTreeCreator extends SimpleFileVisitor<Path>
-{
-   Path vcProjLocation;
-   Path startDir;
-   final int startDirLength;
-   Stack<DirAttributes> attributes = new Stack<DirAttributes>();
-   Vector<BuildConfig> allConfigs;
-   WinGammaPlatform wg;
-   WinGammaPlatformVC10 wg10;
-
-   public FileTreeCreator(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
-      super();
-      this.wg = wg;
-      if (wg instanceof WinGammaPlatformVC10) {
-          wg10 = (WinGammaPlatformVC10)wg;
-      }
-      this.allConfigs = allConfigs;
-      this.startDir = startDir;
-      startDirLength = startDir.toAbsolutePath().toString().length();
-      vcProjLocation = FileSystems.getDefault().getPath(allConfigs.firstElement().get("BuildSpace"));
-      attributes.push(new DirAttributes());
-   }
-
-   public class DirAttributes {
-
-      private HashSet<BuildConfig> ignores;
-      private HashSet<BuildConfig> disablePch;
-
-      public DirAttributes() {
-         ignores = new HashSet<BuildConfig>();
-         disablePch = new HashSet<BuildConfig>();
-      }
-
-      public DirAttributes(HashSet<BuildConfig> excludes2, HashSet<BuildConfig> disablePch2) {
-         ignores = excludes2;
-         disablePch = disablePch2;
-      }
-
-      @SuppressWarnings("unchecked")
-      public DirAttributes clone() {
-         return new DirAttributes((HashSet<BuildConfig>)this.ignores.clone(), (HashSet<BuildConfig>)this.disablePch.clone());
-      }
-
-      public void setIgnore(BuildConfig conf) {
-         ignores.add(conf);
-      }
-
-      public boolean hasIgnore(BuildConfig cfg) {
-         return ignores.contains(cfg);
-      }
-
-      public void removeFromIgnored(BuildConfig cfg) {
-         ignores.remove(cfg);
-      }
-
-      public void setDisablePch(BuildConfig conf) {
-         disablePch.add(conf);
-      }
-
-      public boolean hasDisablePch(BuildConfig cfg) {
-         return disablePch.contains(cfg);
-      }
-
-      public void removeFromDisablePch(BuildConfig cfg) {
-         disablePch.remove(cfg);
-      }
-
-   }
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/FileTreeCreatorVC10.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 2012, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import static java.nio.file.FileVisitResult.CONTINUE;
-
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Stack;
-import java.util.Vector;
-
-public class FileTreeCreatorVC10 extends FileTreeCreator {
-
-      public FileTreeCreatorVC10(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
-         super(startDir, allConfigs, wg);
-      }
-
-      @Override
-      public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
-         DirAttributes currentFileAttr = attributes.peek().clone();
-         boolean usePch = false;
-         boolean disablePch = false;
-         boolean useIgnore = false;
-         boolean isAltSrc = false;  // only needed as a debugging crumb
-         boolean isReplacedByAltSrc = false;
-         String fileName = file.getFileName().toString();
-
-         // TODO hideFile
-
-         // usePch applies to all configs for a file.
-         if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
-            usePch = true;
-         }
-
-         String fileLoc = vcProjLocation.relativize(file).toString();
-
-         // isAltSrc and isReplacedByAltSrc applies to all configs for a file
-         if (BuildConfig.matchesRelativeAltSrcInclude(
-               file.toAbsolutePath().toString())) {
-            // current file is an alternate source file so track it
-            isAltSrc = true;
-            BuildConfig.trackRelativeAltSrcFile(
-                file.toAbsolutePath().toString());
-         } else if (BuildConfig.matchesRelativeAltSrcFile(
-                    file.toAbsolutePath().toString())) {
-            // current file is a regular file that matches an alternate
-            // source file so yack about replacing the regular file
-            isReplacedByAltSrc = true;
-            System.out.println("INFO: alternate source file '" +
-                               BuildConfig.getMatchingRelativeAltSrcFile(
-                                   file.toAbsolutePath().toString()) +
-                               "' replaces '" + fileLoc + "'");
-         }
-
-         for (BuildConfig cfg : allConfigs) {
-            if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
-               useIgnore = true;
-               currentFileAttr.setIgnore(cfg);
-            } else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
-               useIgnore = true;
-               currentFileAttr.setIgnore(cfg);
-            }
-
-            if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
-               disablePch = true;
-               currentFileAttr.setDisablePch(cfg);
-            }
-
-            Vector<String> rv = new Vector<String>();
-            cfg.collectRelevantVectors(rv, "AdditionalFile");
-            for(String addFile : rv) {
-               if (addFile.equals(fileName)) {
-                  // supress any ignore
-                  // TODO - may need some adjustments
-                  if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) {
-                     currentFileAttr.removeFromIgnored(cfg);
-                  }
-               }
-            }
-         }
-
-         String tagName = wg10.getFileTagFromSuffix(fileName);
-
-         if (!useIgnore && !disablePch && !usePch && !isReplacedByAltSrc) {
-            wg.tag(tagName, new String[] { "Include", fileLoc});
-         } else {
-            wg.startTag(
-                  tagName,
-                  new String[] { "Include", fileLoc});
-
-            for (BuildConfig cfg : allConfigs) {
-               boolean ignore = currentFileAttr.hasIgnore(cfg);
-               if (ignore) {
-                  wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
-               }
-               if (usePch) {
-                  wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
-               }
-               if (disablePch) {
-                  wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
-               }
-               if (isReplacedByAltSrc) {
-                  wg.tagData("ExcludedFromBuild", "true", "Condition",
-                             "'$(Configuration)|$(Platform)'=='" +
-                             cfg.get("Name") + "'");
-               }
-            }
-            wg.endTag();
-         }
-
-         String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
-         wg10.addFilterDependency(fileLoc, filter);
-
-         return CONTINUE;
-      }
-
-      @Override
-      public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
-            throws IOException {
-         Boolean hide = false;
-         // TODO remove attrs, if path is matched in this dir, then it is too in every subdir.
-         // And we will check anyway
-         DirAttributes newAttr = attributes.peek().clone();
-
-         // check per config ignorePaths!
-         for (BuildConfig cfg : allConfigs) {
-            if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
-               newAttr.setIgnore(cfg);
-            }
-
-            // Hide is always on all configs. And additional files are never hiddden
-            if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
-               hide = true;
-               break;
-            }
-         }
-
-         if (!hide) {
-            String name = startDir.relativize(path.toAbsolutePath()).toString();
-            if (!"".equals(name)) {
-               wg10.addFilter(name);
-            }
-
-            attributes.push(newAttr);
-            return super.preVisitDirectory(path, attrs);
-         } else {
-            return FileVisitResult.SKIP_SUBTREE;
-         }
-      }
-
-      @Override
-      public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
-         //end matching attributes set by ignorepath
-         attributes.pop();
-         return CONTINUE;
-      }
-
-      @Override
-      public FileVisitResult visitFileFailed(Path file, IOException exc) {
-         return CONTINUE;
-      }
-
-      public void writeFileTree() throws IOException {
-         Files.walkFileTree(this.startDir, this);
-      }
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/ProjectCreator.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 1999, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-public class ProjectCreator {
-
-   public static void usage() {
-      System.out.println("ProjectCreator options:");
-      System.err.println("WinGammaPlatform platform-specific options:");
-      System.err.println("  -sourceBase <path to directory (workspace) "
-            + "containing source files; no trailing slash>");
-      System.err.println("  -dspFileName <full pathname to which .dsp file "
-            + "will be written; all parent directories must "
-            + "already exist>");
-      System.err.println("  -envVar <environment variable to be inserted "
-            + "into .dsp file, substituting for path given in "
-            + "-sourceBase. Example: HotSpotWorkSpace>");
-      System.err.println("  -dllLoc <path to directory in which to put "
-            + "jvm.dll; no trailing slash>");
-      System.err.println("  If any of the above are specified, "
-            + "they must all be.");
-      System.err.println("  Note: if '-altRelativeInclude' option below is "
-            + "used, then the '-relativeAltSrcInclude' option must be used "
-            + "to specify the alternate source dir, e.g., 'src\\closed'");
-      System.err.println("  Additional, optional arguments, which can be "
-            + "specified multiple times:");
-      System.err.println("    -absoluteInclude <string containing absolute "
-            + "path to include directory>");
-      System.err.println("    -altRelativeInclude <string containing "
-            + "alternate include directory relative to -envVar>");
-      System.err.println("    -relativeInclude <string containing include "
-            + "directory relative to -envVar>");
-      System.err.println("    -define <preprocessor flag to be #defined "
-            + "(note: doesn't yet support " + "#define (flag) (value))>");
-      System.err.println("    -perFileLine <file> <line>");
-      System.err.println("    -conditionalPerFileLine <file> <line for "
-            + "release build> <line for debug build>");
-      System.err.println("  (NOTE: To work around a bug in nmake, where "
-            + "you can't have a '#' character in a quoted "
-            + "string, all of the lines outputted have \"#\"" + "prepended)");
-      System.err.println("    -startAt <subdir of sourceBase>");
-      System.err.println("    -ignoreFile <file which won't be able to be "
-            + "found in the sourceBase because it's generated " + "later>");
-      System.err.println("    -additionalFile <file not in database but "
-            + "which should show up in .dsp file>");
-      System.err
-            .println("    -additionalGeneratedFile <environment variable of "
-                  + "generated file's location> <relative path to "
-                  + "directory containing file; no trailing slash> "
-                  + "<name of file generated later in the build process>");
-      System.err.println("    -prelink <build> <desc> <cmds>:");
-      System.err
-            .println(" Generate a set of prelink commands for the given BUILD");
-      System.err
-            .println(" (\"Debug\" or \"Release\"). The prelink description and commands");
-      System.err.println(" are both quoted strings.");
-      System.err.println("    Default includes: \".\"");
-      System.err
-            .println("    Default defines: WIN32, _WINDOWS, \"HOTSPOT_BUILD_USER=$(USERNAME)\"");
-   }
-
-   public static void main(String[] args) {
-      try {
-         if (args.length < 3) {
-            usage();
-            System.exit(1);
-         }
-
-         String platformName = args[0];
-         Class platformClass = Class.forName(platformName);
-         WinGammaPlatform platform = (WinGammaPlatform) platformClass
-               .newInstance();
-
-         String[] platformArgs = new String[args.length - 1];
-         System.arraycopy(args, 1, platformArgs, 0, platformArgs.length);
-
-         // Allow the platform to write platform-specific files
-         platform.createVcproj(platformArgs);
-      } catch (Exception e) {
-         e.printStackTrace();
-         System.exit(1);
-      }
-   }
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/Util.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2005, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import java.util.*;
-import java.io.File;
-
-public class Util {
-
-    static String join(String padder, Vector<String> v) {
-        return join(padder, v, false);
-    }
-
-    static String join(String padder, Vector<String> v, boolean quoted) {
-        StringBuffer sb = new StringBuffer();
-
-        for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
-            if (quoted) {
-                sb.append('"');
-            }
-            sb.append(iter.next());
-            if (quoted) {
-                sb.append('"');
-            }
-            if (iter.hasNext()) sb.append(padder);
-        }
-
-        return sb.toString();
-    }
-
-
-    static String prefixed_join(String padder, Vector<String> v, boolean quoted) {
-        StringBuffer sb = new StringBuffer();
-
-        for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
-            sb.append(padder);
-
-            if (quoted) {
-                sb.append('"');
-            }
-            sb.append((String)iter.next());
-            if (quoted) {
-                sb.append('"');
-            }
-        }
-
-        return sb.toString();
-    }
-
-
-    static String normalize(String file) {
-        file = file.replace('\\', '/');
-        if (file.length() > 2) {
-            if (file.charAt(1) == ':' && file.charAt(2) == '/') {
-                // convert drive letter to uppercase
-                String drive = file.substring(0, 1).toUpperCase();
-                return drive + file.substring(1);
-            }
-        }
-        return file;
-    }
-
-    static String sep = File.separator;
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatform.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,685 +0,0 @@
-/*
- * Copyright (c) 1999, 2016, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Stack;
-import java.util.Vector;
-
-abstract class HsArgHandler extends ArgHandler {
-    static final int STRING = 1;
-    static final int VECTOR = 2;
-    static final int HASH   = 3;
-
-    boolean nextNotKey(ArgIterator it) {
-        if (it.next()) {
-            String s = it.get();
-            return (s.length() == 0) || (s.charAt(0) != '-');
-        } else {
-            return false;
-        }
-    }
-
-    void empty(String key, String message) {
-        if (key != null) {
-            System.err.println("** Error: empty " + key);
-        }
-        if (message != null) {
-            System.err.println(message);
-        }
-        WinGammaPlatform.usage();
-    }
-
-    static String getCfg(String val) {
-        int under = val.indexOf('_');
-        int len = val.length();
-        if (under != -1 && under < len - 1) {
-            return val.substring(under+1, len);
-        } else {
-            return null;
-        }
-    }
-}
-
-class ArgRuleSpecific extends ArgRule {
-    ArgRuleSpecific(String arg, ArgHandler handler) {
-        super(arg, handler);
-    }
-
-    boolean match(String rulePattern, String arg) {
-        return rulePattern.startsWith(arg);
-    }
-}
-
-
-class SpecificHsArgHandler extends HsArgHandler {
-
-    String message, argKey, valKey;
-    int type;
-
-    public void handle(ArgIterator it) {
-        String cfg = getCfg(it.get());
-        if (nextNotKey(it)) {
-            String val = it.get();
-            switch (type) {
-            case VECTOR:
-                BuildConfig.addFieldVector(cfg, valKey, val);
-                break;
-            case HASH:
-                BuildConfig.putFieldHash(cfg, valKey, val, "1");
-                break;
-            case STRING:
-                BuildConfig.putField(cfg, valKey, val);
-                break;
-            default:
-                empty(valKey, "Unknown type: "+type);
-            }
-            it.next();
-
-        } else {
-            empty(argKey, message);
-        }
-    }
-
-    SpecificHsArgHandler(String argKey, String valKey, String message, int type) {
-        this.argKey = argKey;
-        this.valKey = valKey;
-        this.message = message;
-        this.type = type;
-    }
-}
-
-
-class HsArgRule extends ArgRuleSpecific {
-
-    HsArgRule(String argKey, String valKey, String message, int type) {
-        super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type));
-    }
-
-}
-
-public abstract class WinGammaPlatform {
-
-    public boolean fileNameStringEquality(String s1, String s2) {
-        return s1.equalsIgnoreCase(s2);
-    }
-
-    static void usage() throws IllegalArgumentException {
-        System.err.println("WinGammaPlatform platform-specific options:");
-        System.err.println("  -sourceBase <path to directory (workspace) " +
-                           "containing source files; no trailing slash>");
-        System.err.println("  -projectFileName <full pathname to which project file " +
-                           "will be written; all parent directories must " +
-                           "already exist>");
-        System.err.println("  If any of the above are specified, "+
-                           "they must all be.");
-        System.err.println("  Note: if '-altRelativeInclude' option below " +
-                           "is used, then the '-relativeAltSrcInclude' " +
-                           "option must be used to specify the alternate " +
-                           "source dir, e.g., 'src\\closed'");
-        System.err.println("  Additional, optional arguments, which can be " +
-                           "specified multiple times:");
-        System.err.println("    -absoluteInclude <string containing absolute " +
-                           "path to include directory>");
-        System.err.println("    -altRelativeInclude <string containing " +
-                           "alternate include directory relative to " +
-                           "-sourceBase>");
-        System.err.println("    -relativeInclude <string containing include " +
-                           "directory relative to -sourceBase>");
-        System.err.println("    -define <preprocessor flag to be #defined " +
-                           "(note: doesn't yet support " +
-                           "#define (flag) (value))>");
-        System.err.println("    -startAt <subdir of sourceBase>");
-        System.err.println("    -additionalFile <file not in database but " +
-                           "which should show up in project file>");
-        System.err.println("    -additionalGeneratedFile <absolute path to " +
-                           "directory containing file; no trailing slash> " +
-                           "<name of file generated later in the build process>");
-        throw new IllegalArgumentException();
-    }
-
-
-    public void addPerFileLine(Hashtable table,
-                               String fileName,
-                               String line) {
-        Vector v = (Vector) table.get(fileName);
-        if (v != null) {
-            v.add(line);
-        } else {
-            v = new Vector();
-            v.add(line);
-            table.put(fileName, v);
-        }
-    }
-
-    protected static class PerFileCondData {
-        public String releaseString;
-        public String debugString;
-    }
-
-    protected void addConditionalPerFileLine(Hashtable table,
-                                           String fileName,
-                                           String releaseLine,
-                                           String debugLine) {
-        PerFileCondData data = new PerFileCondData();
-        data.releaseString = releaseLine;
-        data.debugString = debugLine;
-        Vector v = (Vector) table.get(fileName);
-        if (v != null) {
-            v.add(data);
-        } else {
-            v = new Vector();
-            v.add(data);
-            table.put(fileName, v);
-        }
-    }
-
-    protected static class PrelinkCommandData {
-      String description;
-      String commands;
-    }
-
-    protected void addPrelinkCommand(Hashtable table,
-                                     String build,
-                                     String description,
-                                     String commands) {
-      PrelinkCommandData data = new PrelinkCommandData();
-      data.description = description;
-      data.commands = commands;
-      table.put(build, data);
-    }
-
-    public boolean findString(Vector v, String s) {
-        for (Iterator iter = v.iterator(); iter.hasNext(); ) {
-            if (((String) iter.next()).equals(s)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-     String getProjectName(String fullPath, String extension)
-        throws IllegalArgumentException, IOException {
-        File file = new File(fullPath).getCanonicalFile();
-        fullPath = file.getCanonicalPath();
-        String parent = file.getParent();
-
-        if (!fullPath.endsWith(extension)) {
-            throw new IllegalArgumentException("project file name \"" +
-                                               fullPath +
-                                               "\" does not end in "+extension);
-        }
-
-        if ((parent != null) &&
-            (!fullPath.startsWith(parent))) {
-            throw new RuntimeException(
-                "Internal error: parent of file name \"" + parent +
-                "\" does not match file name \"" + fullPath + "\""
-            );
-        }
-
-        int len = parent.length();
-        if (!parent.endsWith(Util.sep)) {
-            len += Util.sep.length();
-        }
-
-        int end = fullPath.length() - extension.length();
-
-        if (len == end) {
-            throw new RuntimeException(
-                "Internal error: file name was empty"
-            );
-        }
-
-        return fullPath.substring(len, end);
-    }
-
-    protected abstract String getProjectExt();
-
-    public void createVcproj(String[] args)
-        throws IllegalArgumentException, IOException {
-
-        parseArguments(args);
-
-        String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName");
-        String ext = getProjectExt();
-
-        String projectName = getProjectName(projectFileName, ext);
-
-        writeProjectFile(projectFileName, projectName, createAllConfigs(BuildConfig.getFieldString(null, "PlatformName")));
-    }
-
-    protected void writePrologue(String[] args) {
-        System.err.println("WinGammaPlatform platform-specific arguments:");
-        for (int i = 0; i < args.length; i++) {
-            System.err.print(args[i] + " ");
-        }
-        System.err.println();
-    }
-
-
-    void parseArguments(String[] args) {
-        new ArgsParser(args,
-                       new ArgRule[]
-            {
-                new ArgRule("-sourceBase",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                   String cfg = getCfg(it.get());
-                                   if (nextNotKey(it)) {
-                                      String sb = (String) it.get();
-                                      if (sb.endsWith(Util.sep)) {
-                                         sb = sb.substring(0, sb.length() - 1);
-                                      }
-                                      BuildConfig.putField(cfg, "SourceBase", sb);
-                                      it.next();
-                                   } else {
-                                      empty("-sourceBase", null);
-                                   }
-                                }
-                            }
-                            ),
-
-                new HsArgRule("-buildBase",
-                              "BuildBase",
-                              "   (Did you set the HotSpotBuildSpace environment variable?)",
-                              HsArgHandler.STRING
-                              ),
-
-               new HsArgRule("-buildSpace",
-                              "BuildSpace",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-               new HsArgRule("-makeBinary",
-                              "MakeBinary",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-               new HsArgRule("-makeOutput",
-                              "MakeOutput",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-              new HsArgRule("-platformName",
-                              "PlatformName",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-              new HsArgRule("-projectFileName",
-                              "ProjectFileName",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-                new HsArgRule("-jdkTargetRoot",
-                              "JdkTargetRoot",
-                              "   (Did you set the HotSpotJDKDist environment variable?)",
-                              HsArgHandler.STRING
-                              ),
-
-                new HsArgRule("-compiler",
-                              "CompilerVersion",
-                              "   (Did you set the VcVersion correctly?)",
-                              HsArgHandler.STRING
-                              ),
-
-                new HsArgRule("-absoluteInclude",
-                              "AbsoluteInclude",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-altRelativeInclude",
-                              "AltRelativeInclude",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-relativeInclude",
-                              "RelativeInclude",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-absoluteSrcInclude",
-                              "AbsoluteSrcInclude",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-relativeAltSrcInclude",
-                              "RelativeAltSrcInclude",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-                new HsArgRule("-relativeSrcInclude",
-                              "RelativeSrcInclude",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-define",
-                              "Define",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-useToGeneratePch",
-                              "UseToGeneratePch",
-                              null,
-                              HsArgHandler.STRING
-                              ),
-
-                new ArgRuleSpecific("-perFileLine",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    String cfg = getCfg(it.get());
-                                    if (nextNotKey(it)) {
-                                        String fileName = it.get();
-                                        if (nextNotKey(it)) {
-                                            String line = it.get();
-                                            BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line);
-                                            it.next();
-                                            return;
-                                        }
-                                    }
-                                    empty(null, "** Error: wrong number of args to -perFileLine");
-                                }
-                            }
-                            ),
-
-                new ArgRuleSpecific("-conditionalPerFileLine",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    String cfg = getCfg(it.get());
-                                    if (nextNotKey(it)) {
-                                        String fileName = it.get();
-                                        if (nextNotKey(it)) {
-                                            String productLine = it.get();
-                                            if (nextNotKey(it)) {
-                                                String debugLine = it.get();
-                                                BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine",
-                                                                         fileName, debugLine);
-                                                BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine",
-                                                                         fileName, productLine);
-                                                it.next();
-                                                return;
-                                            }
-                                        }
-                                    }
-
-                                    empty(null, "** Error: wrong number of args to -conditionalPerFileLine");
-                                }
-                            }
-                            ),
-
-                new HsArgRule("-disablePch",
-                              "DisablePch",
-                              null,
-                              HsArgHandler.HASH
-                              ),
-
-                new ArgRule("-startAt",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    if (BuildConfig.getField(null, "StartAt") != null) {
-                                        empty(null, "** Error: multiple -startAt");
-                                    }
-                                    if (nextNotKey(it)) {
-                                        BuildConfig.putField(null, "StartAt", it.get());
-                                        it.next();
-                                    } else {
-                                        empty("-startAt", null);
-                                    }
-                                }
-                            }
-                            ),
-
-                new HsArgRule("-ignoreFile",
-                                      "IgnoreFile",
-                                      null,
-                                      HsArgHandler.HASH
-                                      ),
-
-                new HsArgRule("-ignorePath",
-                              "IgnorePath",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new HsArgRule("-hidePath",
-                      "HidePath",
-                      null,
-                      HsArgHandler.VECTOR
-                      ),
-
-                new HsArgRule("-additionalFile",
-                              "AdditionalFile",
-                              null,
-                              HsArgHandler.VECTOR
-                              ),
-
-                new ArgRuleSpecific("-additionalGeneratedFile",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    String cfg = getCfg(it.get());
-                                    if (nextNotKey(it)) {
-                                        String dir = it.get();
-                                        if (nextNotKey(it)) {
-                                            String fileName = it.get();
-                                            BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile",
-                                                                     Util.normalize(dir + Util.sep + fileName),
-                                                                     fileName);
-                                            it.next();
-                                            return;
-                                        }
-                                    }
-                                    empty(null, "** Error: wrong number of args to -additionalGeneratedFile");
-                                }
-                            }
-                            ),
-
-                new ArgRule("-prelink",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    if (nextNotKey(it)) {
-                                        if (nextNotKey(it)) {
-                                            String description = it.get();
-                                            if (nextNotKey(it)) {
-                                                String command = it.get();
-                                                BuildConfig.putField(null, "PrelinkDescription", description);
-                                                BuildConfig.putField(null, "PrelinkCommand", command);
-                                                it.next();
-                                                return;
-                                            }
-                                        }
-                                    }
-
-                                    empty(null,  "** Error: wrong number of args to -prelink");
-                                }
-                            }
-                            ),
-
-                new ArgRule("-postbuild",
-                            new HsArgHandler() {
-                                public void handle(ArgIterator it) {
-                                    if (nextNotKey(it)) {
-                                        if (nextNotKey(it)) {
-                                            String description = it.get();
-                                            if (nextNotKey(it)) {
-                                                String command = it.get();
-                                                BuildConfig.putField(null, "PostbuildDescription", description);
-                                                BuildConfig.putField(null, "PostbuildCommand", command);
-                                                it.next();
-                                                return;
-                                            }
-                                        }
-                                    }
-
-                                    empty(null,  "** Error: wrong number of args to -postbuild");
-                                }
-                            }
-                            ),
-            },
-                                       new ArgHandler() {
-                                           public void handle(ArgIterator it) {
-
-                                               throw new RuntimeException("Arg Parser: unrecognized option "+it.get());
-                                           }
-                                       }
-                                       );
-        if (BuildConfig.getField(null, "SourceBase") == null      ||
-            BuildConfig.getField(null, "BuildBase") == null       ||
-            BuildConfig.getField(null, "ProjectFileName") == null ||
-            BuildConfig.getField(null, "CompilerVersion") == null) {
-            usage();
-        }
-
-        BuildConfig.putField(null, "PlatformObject", this);
-    }
-
-    Vector createAllConfigs(String platform) {
-        Vector allConfigs = new Vector();
-
-        allConfigs.add(new C1DebugConfig());
-        allConfigs.add(new C1FastDebugConfig());
-        allConfigs.add(new C1ProductConfig());
-
-        allConfigs.add(new TieredDebugConfig());
-        allConfigs.add(new TieredFastDebugConfig());
-        allConfigs.add(new TieredProductConfig());
-
-        return allConfigs;
-    }
-
-    PrintWriter printWriter;
-
-    public void writeProjectFile(String projectFileName, String projectName,
-                                 Vector<BuildConfig> allConfigs) throws IOException {
-        throw new RuntimeException("use compiler version specific version");
-    }
-
-    int indent;
-    private Stack<String> tagStack = new Stack<String>();
-
-    private void startTagPrim(String name, String[] attrs, boolean close) {
-       startTagPrim(name, attrs, close, true);
-    }
-
-    private void startTagPrim(String name, String[] attrs, boolean close,
-          boolean newline) {
-       doIndent();
-       printWriter.print("<" + name);
-       indent++;
-
-       if (attrs != null && attrs.length > 0) {
-          for (int i = 0; i < attrs.length; i += 2) {
-             printWriter.print(" " + attrs[i] + "=\"" + attrs[i + 1] + "\"");
-             if (i < attrs.length - 2) {
-             }
-          }
-       }
-
-       if (close) {
-          indent--;
-          printWriter.print(" />");
-       } else {
-          // TODO push tag name, and change endTag to pop and print.
-          tagStack.push(name);
-          printWriter.print(">");
-       }
-       if (newline) {
-          printWriter.println();
-       }
-    }
-
-    void startTag(String name, String... attrs) {
-       startTagPrim(name, attrs, false);
-    }
-
-    void startTagV(String name, Vector attrs) {
-       String s[] = new String[attrs.size()];
-       for (int i = 0; i < attrs.size(); i++) {
-          s[i] = (String) attrs.elementAt(i);
-       }
-       startTagPrim(name, s, false);
-    }
-
-    void endTag() {
-       String name = tagStack.pop();
-       indent--;
-       doIndent();
-       printWriter.println("</" + name + ">");
-    }
-
-    private void endTagNoIndent() {
-       String name = tagStack.pop();
-       indent--;
-       printWriter.println("</" + name + ">");
-    }
-
-    void tag(String name, String... attrs) {
-       startTagPrim(name, attrs, true);
-    }
-
-    void tagData(String name, String data) {
-       startTagPrim(name, null, false, false);
-       printWriter.print(data);
-       endTagNoIndent();
-    }
-
-    void tagData(String name, String data, String... attrs) {
-       startTagPrim(name, attrs, false, false);
-       printWriter.print(data);
-       endTagNoIndent();
-    }
-
-    void tagV(String name, Vector attrs) {
-       String s[] = new String[attrs.size()];
-       for (int i = 0; i < attrs.size(); i++) {
-          s[i] = (String) attrs.elementAt(i);
-       }
-       startTagPrim(name, s, true);
-    }
-
-    void doIndent() {
-       for (int i = 0; i < indent; i++) {
-          printWriter.print("  ");
-       }
-    }
-
-
-}
--- a/make/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatformVC10.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,470 +0,0 @@
-/*
- * Copyright (c) 2011, 2017, 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.
- *
- */
-
-package build.tools.projectcreator;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.nio.file.FileSystems;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.UUID;
-import java.util.Vector;
-
-public class WinGammaPlatformVC10 extends WinGammaPlatform {
-
-
-   LinkedList <String>filters = new LinkedList<String>();
-   LinkedList <String[]>filterDeps = new LinkedList<String[]>();
-
-    @Override
-    protected String getProjectExt() {
-        return ".vcxproj";
-    }
-
-    @Override
-    public void writeProjectFile(String projectFileName, String projectName,
-            Vector<BuildConfig> allConfigs) throws IOException {
-        System.out.println();
-        System.out.println("    Writing .vcxproj file: " + projectFileName);
-
-        String projDir = Util.normalize(new File(projectFileName).getParent());
-
-        printWriter = new PrintWriter(projectFileName, "UTF-8");
-        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-        startTag("Project",
-                "DefaultTargets", "Build",
-                "ToolsVersion", "4.0",
-                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
-        startTag("ItemGroup",
-                "Label", "ProjectConfigurations");
-        for (BuildConfig cfg : allConfigs) {
-            startTag("ProjectConfiguration",
-                    "Include", cfg.get("Name"));
-            tagData("Configuration", cfg.get("Id"));
-            tagData("Platform", cfg.get("PlatformName"));
-            endTag();
-        }
-        endTag();
-
-        startTag("PropertyGroup", "Label", "Globals");
-        tagData("ProjectGuid", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}");
-        tagData("Keyword", "MakeFileProj");
-        tag("SccProjectName");
-        tag("SccLocalPath");
-        endTag();
-
-        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props");
-
-        for (BuildConfig cfg : allConfigs) {
-            startTag(cfg, "PropertyGroup", "Label", "Configuration");
-            tagData("ConfigurationType", "Makefile");
-            tagData("UseDebugLibraries", "true");
-            endTag();
-        }
-
-        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.props");
-        startTag("ImportGroup", "Label", "ExtensionSettings");
-        endTag();
-        for (BuildConfig cfg : allConfigs) {
-            startTag(cfg, "ImportGroup", "Label", "PropertySheets");
-            tag("Import",
-                    "Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props",
-                    "Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')",
-                    "Label", "LocalAppDataPlatform");
-            endTag();
-        }
-
-        tag("PropertyGroup", "Label", "UserMacros");
-
-        startTag("PropertyGroup");
-        tagData("_ProjectFileVersion", "10.0.30319.1");
-        for (BuildConfig cfg : allConfigs) {
-            tagData(cfg, "OutDir", cfg.get("OutputDir") + Util.sep);
-            tagData(cfg, "IntDir", cfg.get("OutputDir") + Util.sep);
-            tagData(cfg, "LinkIncremental", "false");
-        }
-        for (BuildConfig cfg : allConfigs) {
-            tagData(cfg, "CodeAnalysisRuleSet", "AllRules.ruleset");
-            tag(cfg, "CodeAnalysisRules");
-            tag(cfg, "CodeAnalysisRuleAssemblies");
-        }
-        for (BuildConfig cfg : allConfigs) {
-            tagData(cfg, "NMakeBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile hotspot LOG=info");
-            tagData(cfg, "NMakeReBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot hotspot LOG=info");
-            tagData(cfg, "NMakeCleanCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot LOG=info");
-            tagData(cfg, "NMakeOutput", cfg.get("MakeOutput") + Util.sep + "jvm.dll");
-            tagData(cfg, "NMakePreprocessorDefinitions", Util.join(";", cfg.getDefines()));
-            tagData(cfg, "NMakeIncludeSearchPath", Util.join(";", cfg.getIncludes()));
-        }
-        endTag();
-
-        for (BuildConfig cfg : allConfigs) {
-            startTag(cfg, "ItemDefinitionGroup");
-            startTag("ClCompile");
-            tagV(cfg.getV("CompilerFlags"));
-            endTag();
-
-            startTag("Link");
-            tagV(cfg.getV("LinkerFlags"));
-            endTag();
-
-            endTag();
-        }
-
-        writeFiles(allConfigs, projDir);
-
-        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets");
-        startTag("ImportGroup", "Label", "ExtensionTargets");
-        endTag();
-
-        endTag();
-        printWriter.close();
-        System.out.println("    Done writing .vcxproj file.");
-
-        writeFilterFile(projectFileName, projectName, allConfigs, projDir);
-        writeUserFile(projectFileName, allConfigs);
-    }
-
-
-    private void writeUserFile(String projectFileName, Vector<BuildConfig> allConfigs) throws FileNotFoundException, UnsupportedEncodingException {
-        String userFileName = projectFileName + ".user";
-        if (new File(userFileName).exists()) {
-            return;
-        }
-        System.out.print("    Writing .vcxproj.user file: " + userFileName);
-        printWriter = new PrintWriter(userFileName, "UTF-8");
-
-        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-        startTag("Project",
-                "ToolsVersion", "4.0",
-                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
-
-        for (BuildConfig cfg : allConfigs) {
-            startTag(cfg, "PropertyGroup");
-            tagData("LocalDebuggerCommand", cfg.get("JdkTargetRoot") + "\\bin\\java.exe");
-            // Since we run "make hotspot-import", we get the correct jvm.dll by java.exe.
-            // The '-XX:+PauseAtExit' option
-            // causes the VM to wait for key press before exiting; this
-            // allows any stdout or stderr messages to be seen before
-            // the cmdtool exits.
-            tagData("LocalDebuggerCommandArguments",
-                    "-XX:+UnlockDiagnosticVMOptions -XX:+PauseAtExit");
-            tagData("LocalDebuggerEnvironment", "JAVA_HOME=" + cfg.get("JdkTargetRoot"));
-            endTag();
-        }
-
-        endTag();
-        printWriter.close();
-        System.out.println("    Done.");
-    }
-
-    public void addFilter(String rPath) {
-       filters.add(rPath);
-    }
-
-    public void addFilterDependency(String fileLoc, String filter) {
-      filterDeps.add(new String[] {fileLoc, filter});
-    }
-
-    private void writeFilterFile(String projectFileName, String projectName,
-            Vector<BuildConfig> allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException {
-        String filterFileName = projectFileName + ".filters";
-        System.out.print("    Writing .vcxproj.filters file: " + filterFileName);
-        printWriter = new PrintWriter(filterFileName, "UTF-8");
-
-        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-        startTag("Project",
-                "ToolsVersion", "4.0",
-                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
-
-        startTag("ItemGroup");
-        for (String filter : filters) {
-           startTag("Filter", "Include",filter);
-           UUID uuid = UUID.randomUUID();
-           tagData("UniqueIdentifier", "{" + uuid.toString() + "}");
-           endTag();
-        }
-        endTag();
-
-        //TODO - do I need to split cpp and hpp files?
-
-        // then all files
-        startTag("ItemGroup");
-        for (String[] dep : filterDeps) {
-           String tagName = getFileTagFromSuffix(dep[0]);
-
-           startTag(tagName, "Include", dep[0]);
-           tagData("Filter", dep[1]);
-           endTag();
-        }
-        endTag();
-
-        endTag();
-        printWriter.close();
-        System.out.println("    Done.");
-    }
-
-    public String getFileTagFromSuffix(String fileName) {
-       if (fileName.endsWith(".cpp")) {
-          return"ClCompile";
-       } else if (fileName.endsWith(".c")) {
-          return "ClCompile";
-       } else if (fileName.endsWith(".hpp")) {
-          return"ClInclude";
-       } else if (fileName.endsWith(".h")) {
-          return "ClInclude";
-       } else {
-          return"None";
-       }
-    }
-
-    void writeFiles(Vector<BuildConfig> allConfigs, String projDir) {
-       // This code assummes there are no config specific includes.
-       startTag("ItemGroup");
-
-       String sourceBase = BuildConfig.getFieldString(null, "SourceBase");
-
-       // Use first config for all global absolute includes.
-       BuildConfig baseConfig = allConfigs.firstElement();
-       Vector<String> rv = new Vector<String>();
-
-       // Then use first config for all relative includes
-       Vector<String> ri = new Vector<String>();
-       baseConfig.collectRelevantVectors(ri, "RelativeSrcInclude");
-       for (String f : ri) {
-          rv.add(sourceBase + Util.sep + f);
-       }
-
-       baseConfig.collectRelevantVectors(rv, "AbsoluteSrcInclude");
-
-       handleIncludes(rv, allConfigs);
-
-       endTag();
-    }
-
-    // Will visit file tree for each include
-    private void handleIncludes(Vector<String> includes, Vector<BuildConfig> allConfigs) {
-       for (String path : includes)  {
-          FileTreeCreatorVC10 ftc = new FileTreeCreatorVC10(FileSystems.getDefault().getPath(path) , allConfigs, this);
-          try {
-             ftc.writeFileTree();
-          } catch (IOException e) {
-             e.printStackTrace();
-          }
-       }
-    }
-
-    String buildCond(BuildConfig cfg) {
-        return "'$(Configuration)|$(Platform)'=='"+cfg.get("Name")+"'";
-    }
-
-    void tagV(Vector<String> v) {
-        Iterator<String> i = v.iterator();
-        while(i.hasNext()) {
-            String name = i.next();
-            String data = i.next();
-            tagData(name, data);
-        }
-    }
-
-    void tagData(BuildConfig cfg, String name, String data) {
-        tagData(name, data, "Condition", buildCond(cfg));
-    }
-
-    void tag(BuildConfig cfg, String name, String... attrs) {
-        String[] ss = new String[attrs.length + 2];
-        ss[0] = "Condition";
-        ss[1] = buildCond(cfg);
-        System.arraycopy(attrs, 0, ss, 2, attrs.length);
-
-        tag(name, ss);
-    }
-
-    void startTag(BuildConfig cfg, String name, String... attrs) {
-        String[] ss = new String[attrs.length + 2];
-        ss[0] = "Condition";
-        ss[1] = buildCond(cfg);
-        System.arraycopy(attrs, 0, ss, 2, attrs.length);
-
-        startTag(name, ss);
-    }
-
-}
-
-class CompilerInterfaceVC10 extends CompilerInterface {
-
-    @Override
-    Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) {
-        Vector rv = new Vector();
-
-        addAttr(rv, "AdditionalIncludeDirectories", Util.join(";", includes));
-        addAttr(rv, "PreprocessorDefinitions",
-                Util.join(";", defines).replace("\\\"", "\""));
-        addAttr(rv, "PrecompiledHeaderFile", "precompiled.hpp");
-        addAttr(rv, "PrecompiledHeaderOutputFile", outDir+Util.sep+"vm.pch");
-        addAttr(rv, "AssemblerListingLocation", outDir);
-        addAttr(rv, "ObjectFileName", outDir+Util.sep);
-        addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb");
-        // Set /nologo option
-        addAttr(rv, "SuppressStartupBanner", "true");
-        // Surpass the default /Tc or /Tp.
-        addAttr(rv, "CompileAs", "Default");
-        // Set /W3 option.
-        addAttr(rv, "WarningLevel", "Level3");
-        // Set /WX option,
-        addAttr(rv, "TreatWarningAsError", "true");
-        // Set /GS option
-        addAttr(rv, "BufferSecurityCheck", "false");
-        // Set /Zi option.
-        addAttr(rv, "DebugInformationFormat", "ProgramDatabase");
-        // Set /Yu option.
-        addAttr(rv, "PrecompiledHeader", "Use");
-        // Set /EHsc- option
-        addAttr(rv, "ExceptionHandling", "");
-
-        addAttr(rv, "MultiProcessorCompilation", "true");
-
-        return rv;
-    }
-
-    @Override
-    Vector getDebugCompilerFlags(String opt, String platformName) {
-        Vector rv = new Vector();
-
-        // Set /On option
-        addAttr(rv, "Optimization", opt);
-        // Set /MD option.
-        addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
-        // Set /Oy- option
-        addAttr(rv, "OmitFramePointers", "false");
-        // Set /homeparams for x64 debug builds
-        if(platformName.equals("x64")) {
-            addAttr(rv, "AdditionalOptions", "/homeparams");
-        }
-
-        return rv;
-    }
-
-    @Override
-    Vector getProductCompilerFlags() {
-        Vector rv = new Vector();
-
-        // Set /O2 option.
-        addAttr(rv, "Optimization", "MaxSpeed");
-        // Set /Oy- option
-        addAttr(rv, "OmitFramePointers", "false");
-        // Set /Ob option.  1 is expandOnlyInline
-        addAttr(rv, "InlineFunctionExpansion", "OnlyExplicitInline");
-        // Set /GF option.
-        addAttr(rv, "StringPooling", "true");
-        // Set /MD option. 2 is rtMultiThreadedDLL
-        addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
-        // Set /Gy option
-        addAttr(rv, "FunctionLevelLinking", "true");
-
-        return rv;
-    }
-
-    @Override
-    Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
-        Vector rv = new Vector();
-
-        if(platformName.equals("Win32")) {
-            addAttr(rv, "AdditionalOptions",
-                    "/export:JNI_GetDefaultJavaVMInitArgs " +
-                    "/export:JNI_CreateJavaVM " +
-                    "/export:JVM_FindClassFromBootLoader "+
-                    "/export:JNI_GetCreatedJavaVMs "+
-                    "/export:jio_snprintf /export:jio_printf "+
-                    "/export:jio_fprintf /export:jio_vfprintf "+
-                    "/export:jio_vsnprintf "+
-                    "/export:JVM_InitAgentProperties");
-        }
-        addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib;psapi.lib;version.lib");
-        addAttr(rv, "OutputFile", outDll);
-        addAttr(rv, "SuppressStartupBanner", "true");
-        addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def");
-        addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb");
-        addAttr(rv, "SubSystem", "Windows");
-        addAttr(rv, "BaseAddress", "0x8000000");
-        addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib");
-
-        if(platformName.equals("Win32")) {
-            addAttr(rv, "TargetMachine", "MachineX86");
-        } else {
-            addAttr(rv, "TargetMachine", "MachineX64");
-        }
-
-        // We always want the /DEBUG option to get full symbol information in the pdb files
-        addAttr(rv, "GenerateDebugInformation", "true");
-
-        return rv;
-    }
-
-    @Override
-    Vector getDebugLinkerFlags() {
-        Vector rv = new Vector();
-
-        // Empty now that /DEBUG option is used by all configs
-
-        return rv;
-    }
-
-    @Override
-    Vector getProductLinkerFlags() {
-        Vector rv = new Vector();
-
-        // Set /OPT:REF option.
-        addAttr(rv, "OptimizeReferences", "true");
-        // Set /OPT:ICF option.
-        addAttr(rv, "EnableCOMDATFolding", "true");
-
-        return rv;
-    }
-
-    @Override
-    void getAdditionalNonKernelLinkerFlags(Vector rv) {
-        extAttr(rv, "AdditionalOptions", " /export:AsyncGetCallTrace");
-    }
-
-    @Override
-    String getOptFlag() {
-        return "MaxSpeed";
-    }
-
-    @Override
-    String getNoOptFlag() {
-        return "Disabled";
-    }
-
-    @Override
-    String makeCfgName(String flavourBuild, String platform) {
-        return  flavourBuild + "|" + platform;
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/build.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,42 @@
+<!-- importing.xml -->
+<project name="jdk">
+
+    <taskdef name="wrapLogger" classname="idea.IdeaLoggerWrapper" classpath="${idea.dir}/classes"/>
+
+    <wrapLogger/>
+
+    <macrodef name="call-make">
+        <attribute name="dir"/>
+        <attribute name="args"/>
+        <sequential>
+            <exec executable="make" dir="@{dir}" failonerror="true">
+                <arg line="@{args}"/>
+                <env key="CLASSPATH" value = ""/>
+            </exec>
+        </sequential>
+    </macrodef>
+
+    <target name="cond-clean" unless="${intellij.ismake}">
+        <antcall target="clean"/>
+    </target>
+
+    <target name="post-make" depends="cond-clean, build-module"/>
+
+    <!--
+        **** Global JDK Build Targets
+    -->
+
+    <target name="clean">
+        <echo message="base = ${basedir}"/>
+        <call-make dir = "${build.target.dir}" args = "reconfigure"/>
+        <call-make dir = "${build.target.dir}" args = "clean"/>
+    </target>
+
+    <target name="images">
+        <call-make dir = "${build.target.dir}" args = "images"/>
+    </target>
+
+    <target name="build-module">
+        <call-make dir = "${build.target.dir}" args = "${module.name}"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/idea.gmk	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2016, 2020, 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.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# 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.
+#
+
+include Makefile
+include make/MainSupport.gmk
+
+.PHONY: idea
+
+ifeq ($(SPEC),)
+  ifneq ($(words $(SPECS)),1)
+	@echo "Error: Multiple build specification files found. Please select one explicitly."
+	@exit 2
+  endif
+  idea:
+	@cd $(topdir)
+	@$(MAKE) $(MFLAGS) $(MAKE_LOG_FLAGS) -r -R -j 1 -f $(topdir)/make/ide/idea/jdk/idea.gmk SPEC=$(SPECS) HAS_SPEC=true ACTUAL_TOPDIR=$(topdir) MODULES="$(MODULES)" idea
+else #with SPEC
+  include make/common/Modules.gmk
+
+  ifeq ($(MODULES),)
+    SEL_MODULES := $(call FindAllModules)
+  else
+    SEL_MODULES := $(MODULES)
+  endif
+
+  idea:
+	$(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT)
+	$(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindModuleSrcDirs,$(mod)))\"" >> $(OUT)
+	$(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT)
+	$(ECHO) "SEL_MODULES=\"$(SEL_MODULES)\"" >> $(OUT)
+	$(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT)
+	$(ECHO) "CYGPATH=\"$(CYGPATH)\"" >> $(OUT)
+	$(ECHO) "SPEC=\"$(SPEC)\"" >> $(OUT)
+	$(ECHO) "JT_HOME=\"$(JT_HOME)\"" >> $(OUT)
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/.name	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,1 @@
+jdk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/ant.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AntConfiguration">
+    <buildFile url="file://###ROOT_DIR###/make/ide/idea/jdk/build.xml">
+      <properties>
+        <property name="intellij.ismake" value="$IsMake$" />
+        <property name="build.target.dir" value="###BUILD_DIR###" />
+        <property name="module.name" value="###MODULE_NAMES###" />
+        <property name="idea.dir" value="###IDEA_DIR###" />
+      </properties>
+      <executeOn event="afterCompilation" target="post-make" />
+    </buildFile>
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/compiler.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <excludeFromCompile>
+      <directory url="file://###ROOT_DIR###/src" includeSubdirectories="true" />
+      <directory url="file://###ROOT_DIR###/build" includeSubdirectories="true" />
+      <directory url="file://###ROOT_DIR###/make" includeSubdirectories="true" />
+      <directory url="file://###ROOT_DIR###/test" includeSubdirectories="true" />
+    </excludeFromCompile>
+    <resourceExtensions />
+    <wildcardResourcePatterns>
+      <entry name="!?*.java" />
+      <entry name="!?*.form" />
+      <entry name="!?*.class" />
+      <entry name="!?*.groovy" />
+      <entry name="!?*.scala" />
+      <entry name="!?*.flex" />
+      <entry name="!?*.kt" />
+      <entry name="!?*.clj" />
+    </wildcardResourcePatterns>
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="false">
+        <processorPath useClasspath="true" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/copyright/profiles_settings.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,3 @@
+<component name="CopyrightManager">
+  <settings default="" />
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/jdk.iml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://###ROOT_DIR###">
+      ###SOURCE_ROOTS###
+      <excludeFolder url="file://###ROOT_DIR###/build" />
+      <excludeFolder url="file://###ROOT_DIR###/make" />
+    </content>
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="inheritedJdk" />
+  </component>
+</module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/misc.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="EntryPointsManager">
+    <entry_points version="2.0" />
+  </component>
+  <component name="JTRegService">
+    <path>###JTREG_HOME###</path>
+    <workDir>###BUILD_DIR###</workDir>
+    <jre alt="true" value="###IMAGES_DIR###" />
+    <options></options>
+    <ant>
+      <target file="file://###ROOT_DIR###/make/ide/idea/jdk/build.xml" name="images" />
+    </ant>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_9" assert-keyword="true" jdk-15="true">
+    <output url="file://###BUILD_DIR###" />
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/modules.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/jdk.iml" filepath="$PROJECT_DIR$/.idea/jdk.iml" />
+    </modules>
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/scopes/scope_settings.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,5 @@
+<component name="DependencyValidationManager">
+  <state>
+    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+  </state>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/src/idea/IdeaLoggerWrapper.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,13 @@
+package idea;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * This class implements a custom Ant task which replaces the standard Intellij IDEA Ant logger
+ * with a custom one which generates tighter output.
+ */
+public class IdeaLoggerWrapper extends Task {
+    public void execute() {
+        new JdkIdeaAntLogger(getProject());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/src/idea/JdkIdeaAntLogger.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,375 @@
+/*
+ * Copyright (c) 2014, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package idea;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+
+import java.util.EnumSet;
+import java.util.Stack;
+
+import static org.apache.tools.ant.Project.*;
+
+/**
+ * This class is used to wrap the IntelliJ ant logger in order to provide more meaningful
+ * output when building langtools. The basic ant output in IntelliJ can be quite cumbersome to
+ * work with, as it provides two separate views: (i) a tree view, which is good to display build task
+ * in a hierarchical fashion as they are processed; and a (ii) plain text view, which gives you
+ * the full ant output. The main problem is that javac-related messages are buried into the
+ * ant output (which is made very verbose by IntelliJ in order to support the tree view). It is
+ * not easy to figure out which node to expand in order to see the error message; switching
+ * to plain text doesn't help either, as now the output is totally flat.
+ *
+ * This logger class removes a lot of verbosity from the IntelliJ ant logger by not propagating
+ * all the events to the IntelliJ's logger. In addition, certain events are handled in a custom
+ * fashion, to generate better output during the build.
+ */
+public final class JdkIdeaAntLogger extends DefaultLogger {
+
+    /**
+     * This is just a way to pass in customized binary string predicates;
+     *
+     * TODO: replace with @code{BiPredicate<String, String>} and method reference when moving to 8
+     */
+    enum StringBinaryPredicate {
+        CONTAINS() {
+            @Override
+            boolean apply(String s1, String s2) {
+                return s1.contains(s2);
+            }
+        },
+        STARTS_WITH {
+            @Override
+            boolean apply(String s1, String s2) {
+                return s1.startsWith(s2);
+            }
+        },
+        MATCHES {
+            @Override
+            boolean apply(String s1, String s2) {
+                return s1.matches(s2);
+            }
+        };
+
+        abstract boolean apply(String s1, String s2);
+    }
+
+    /**
+     * Various kinds of ant messages that we shall intercept
+     */
+    enum MessageKind {
+
+        /** a make error */
+        MAKE_ERROR(StringBinaryPredicate.CONTAINS, MSG_ERR, "error:", "compiler.err"),
+        /** a make warning */
+        MAKE_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"),
+        /** a make note */
+        MAKE_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"),
+        /** std make output */
+        MAKE_OTHER(StringBinaryPredicate.MATCHES, MSG_INFO, ".*"),
+        /** a javac crash */
+        JAVAC_CRASH(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "An exception has occurred in the compiler"),
+        /** jtreg test success */
+        JTREG_TEST_PASSED(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Passed: "),
+        /** jtreg test failure */
+        JTREG_TEST_FAILED(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "FAILED: "),
+        /** jtreg test error */
+        JTREG_TEST_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "Error: "),
+        /** jtreg report */
+        JTREG_TEST_REPORT(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Report written");
+
+        StringBinaryPredicate sbp;
+        int priority;
+        String[] keys;
+
+        MessageKind(StringBinaryPredicate sbp, int priority, String... keys) {
+            this.sbp = sbp;
+            this.priority = priority;
+            this.keys = keys;
+        }
+
+        /**
+         * Does a given message string matches this kind?
+         */
+        boolean matches(String s) {
+            for (String key : keys) {
+                if (sbp.apply(s, key)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * This enum is used to represent the list of tasks we need to keep track of during logging.
+     */
+    enum Task {
+        /** javac task - invoked during compilation */
+        MAKE("exec", MessageKind.MAKE_ERROR, MessageKind.MAKE_WARNING, MessageKind.MAKE_NOTE,
+                       MessageKind.MAKE_OTHER, MessageKind.JAVAC_CRASH),
+        /** jtreg task - invoked during test execution */
+        JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR, MessageKind.JTREG_TEST_REPORT),
+        /** initial synthetic task when the logger is created */
+        ROOT("") {
+            @Override
+            boolean matches(String s) {
+                return false;
+            }
+        },
+        /** synthetic task catching any other tasks not in this list */
+        ANY("") {
+            @Override
+            boolean matches(String s) {
+                return true;
+            }
+        };
+
+        String taskName;
+        MessageKind[] msgs;
+
+        Task(String taskName, MessageKind... msgs) {
+            this.taskName = taskName;
+            this.msgs = msgs;
+        }
+
+        boolean matches(String s) {
+            return s.equals(taskName);
+        }
+    }
+
+    /**
+     * This enum is used to represent the list of targets we need to keep track of during logging.
+     * A regular expression is used to match a given target name.
+     */
+    enum Target {
+        /** jtreg target - executed when launching tests */
+        JTREG("jtreg") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Running jtreg tests: " + e.getProject().getProperty("jtreg.tests");
+            }
+        },
+        /** build selected modules */
+        BUILD_MODULE("build-module") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Building modules: " + e.getProject().getProperty("module.name") + "...";
+            }
+        },
+        /** build images */
+        BUILD_IMAGES("images") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Building images...";
+            }
+        },
+        /** build images */
+        CONFIGURE("-do-configure") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Configuring build...";
+            }
+        },
+        /** synthetic target catching any other target not in this list */
+        ANY("") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Executing Ant target(s): " + e.getProject().getProperty("ant.project.invoked-targets");
+            }
+            @Override
+            boolean matches(String msg) {
+                return true;
+            }
+        };
+
+        String targetRegex;
+
+        Target(String targetRegex) {
+            this.targetRegex = targetRegex;
+        }
+
+        boolean matches(String msg) {
+            return msg.matches(targetRegex);
+        }
+
+        abstract String getDisplayMessage(BuildEvent e);
+    }
+
+    /**
+     * A custom build event used to represent status changes which should be notified inside
+     * Intellij
+     */
+    static class StatusEvent extends BuildEvent {
+
+        /** the target to which the status update refers */
+        Target target;
+
+        StatusEvent(BuildEvent e, Target target) {
+            super(new StatusTask(e, target.getDisplayMessage(e)));
+            this.target = target;
+            setMessage(getTask().getTaskName(), 2);
+        }
+
+        /**
+         * A custom task used to channel info regarding a status change
+         */
+        static class StatusTask extends org.apache.tools.ant.Task {
+            StatusTask(BuildEvent event, String msg) {
+                setProject(event.getProject());
+                setOwningTarget(event.getTarget());
+                setTaskName(msg);
+            }
+        }
+    }
+
+    /** wrapped ant logger (IntelliJ's own logger) */
+    DefaultLogger logger;
+
+    /** flag - is this the first target we encounter? */
+    boolean firstTarget = true;
+
+    /** flag - should subsequenet failures be suppressed ? */
+    boolean suppressTaskFailures = false;
+
+    /** flag - have we ran into a javac crash ? */
+    boolean crashFound = false;
+
+    /** stack of status changes associated with pending targets */
+    Stack<StatusEvent> statusEvents = new Stack<>();
+
+    /** stack of pending tasks */
+    Stack<Task> tasks = new Stack<>();
+
+    public JdkIdeaAntLogger(Project project) {
+        for (Object o : project.getBuildListeners()) {
+            if (o instanceof DefaultLogger) {
+                this.logger = (DefaultLogger)o;
+                project.removeBuildListener((BuildListener)o);
+                project.addBuildListener(this);
+            }
+        }
+        tasks.push(Task.ROOT);
+    }
+
+    @Override
+    public void buildStarted(BuildEvent event) {
+        //do nothing
+    }
+
+    @Override
+    public void buildFinished(BuildEvent event) {
+        //do nothing
+    }
+
+    @Override
+    public void targetStarted(BuildEvent event) {
+        EnumSet<Target> statusKinds = firstTarget ?
+                EnumSet.allOf(Target.class) :
+                EnumSet.complementOf(EnumSet.of(Target.ANY));
+
+        String targetName = event.getTarget().getName();
+
+        for (Target statusKind : statusKinds) {
+            if (statusKind.matches(targetName)) {
+                StatusEvent statusEvent = new StatusEvent(event, statusKind);
+                statusEvents.push(statusEvent);
+                logger.taskStarted(statusEvent);
+                firstTarget = false;
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void targetFinished(BuildEvent event) {
+        if (!statusEvents.isEmpty()) {
+            StatusEvent lastEvent = statusEvents.pop();
+            if (lastEvent.target.matches(event.getTarget().getName())) {
+                logger.taskFinished(lastEvent);
+            }
+        }
+    }
+
+    @Override
+    public void taskStarted(BuildEvent event) {
+        String taskName = event.getTask().getTaskName();
+        System.err.println("task started " + taskName);
+        for (Task task : Task.values()) {
+            if (task.matches(taskName)) {
+                tasks.push(task);
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void taskFinished(BuildEvent event) {
+        if (tasks.peek() == Task.ROOT) {
+            //we need to 'close' the root task to get nicer output
+            logger.taskFinished(event);
+        } else if (!suppressTaskFailures && event.getException() != null) {
+            //the first (innermost) task failure should always be logged
+            event.setMessage(event.getException().toString(), 0);
+            event.setException(null);
+            //note: we turn this into a plain message to avoid stack trace being logged by Idea
+            logger.messageLogged(event);
+            suppressTaskFailures = true;
+        }
+        tasks.pop();
+    }
+
+    @Override
+    public void messageLogged(BuildEvent event) {
+        String msg = event.getMessage();
+
+        boolean processed = false;
+
+        if (!tasks.isEmpty()) {
+            Task task = tasks.peek();
+            for (MessageKind messageKind : task.msgs) {
+                if (messageKind.matches(msg)) {
+                    event.setMessage(msg, messageKind.priority);
+                    processed = true;
+                    if (messageKind == MessageKind.JAVAC_CRASH) {
+                        crashFound = true;
+                    }
+                    break;
+                }
+            }
+        }
+
+        if (event.getPriority() == MSG_ERR || crashFound) {
+            //we log errors regardless of owning task
+            logger.messageLogged(event);
+            suppressTaskFailures = true;
+        } else if (processed) {
+            logger.messageLogged(event);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/vcs.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="###ROOT_DIR###" vcs="###VCS_TYPE###" />
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/jdk/template/workspace.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <ignored path="jdk.iws" />
+    <ignored path="###ROOT_DIR###/build/idea/out/" />
+    <ignored path=".idea/" />
+  </component>
+  <component name="StructureViewFactory">
+    <option name="ACTIVE_ACTIONS" value=",ALPHA_COMPARATOR" />
+  </component>
+  <component name="antWorkspaceConfiguration">
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
+    <option name="FILTER_TARGETS" value="false" />
+    <buildFile url="file://###ROOT_DIR###/make/ide/idea/jdk/build.xml">
+      <runInBackground value="false" />
+      <targetFilters>
+        <filter targetName="clean" isVisible="true" />
+        <filter targetName="images" isVisible="true" />
+      </targetFilters>
+      <treeView value="false" />
+      <expanded value="true" />
+    </buildFile>
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="jdk" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="PackagesPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="jdk" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="jdk" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="Scope" />
+    </panes>
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/build.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,15 @@
+<!-- importing.xml -->
+<project name="langtools" basedir = "../../../..">
+
+    <taskdef name="wrapLogger" classname="idea.IdeaLoggerWrapper" classpath=".idea/classes"/>
+
+    <wrapLogger/>
+
+    <import file="../../../langtools/build.xml"/>
+
+    <target name="cond-clean" unless="${intellij.ismake}">
+        <antcall target="clean"/>
+    </target>
+
+    <target name="post-make" depends="cond-clean, build-all-tools"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/ant.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AntConfiguration">
+    <buildFile url="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml">
+      <properties>
+	    <property name="langtools.jdk.home" value="@IDEA_TARGET_JDK@" />
+        <property name="intellij.ismake" value="$IsMake$" />
+      </properties>
+      <executeOn event="afterCompilation" target="post-make" />
+    </buildFile>
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/codeStyleSettings.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectCodeStyleSettingsManager">
+    <option name="PER_PROJECT_SETTINGS">
+      <value>
+        <option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
+        <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
+        <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
+        <option name="RIGHT_MARGIN" value="100" />
+        <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
+        <XML>
+          <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
+        </XML>
+        <codeStyleSettings language="JAVA">
+          <option name="SPACE_AFTER_TYPE_CAST" value="false" />
+        </codeStyleSettings>
+      </value>
+    </option>
+    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/compiler.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <option name="DEFAULT_COMPILER" value="Javac" />
+    <excludeFromCompile>
+      <directory url="file://$PROJECT_DIR$/src" includeSubdirectories="true" />
+      <directory url="file://$PROJECT_DIR$/test" includeSubdirectories="true" />
+      <directory url="file://$PROJECT_DIR$/build" includeSubdirectories="true" />
+      <directory url="file://$PROJECT_DIR$/make" includeSubdirectories="true" />
+    </excludeFromCompile>
+    <resourceExtensions />
+    <wildcardResourcePatterns />
+    <annotationProcessing>
+      <profile default="true" name="Default" enabled="false">
+        <processorPath useClasspath="true" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/copyright/langtools.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,9 @@
+<component name="CopyrightManager">
+  <copyright>
+    <option name="notice" value="Copyright (c) &amp;#36;today.year, Oracle and/or its affiliates. All rights reserved.&#10;DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.&#10;&#10;This code is free software; you can redistribute it and/or modify it&#10;under the terms of the GNU General Public License version 2 only, as&#10;published by the Free Software Foundation.  Oracle designates this&#10;particular file as subject to the &quot;Classpath&quot; exception as provided&#10;by Oracle in the LICENSE file that accompanied this code.&#10;&#10;This code is distributed in the hope that it will be useful, but WITHOUT&#10;ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or&#10;FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License&#10;version 2 for more details (a copy is included in the LICENSE file that&#10;accompanied this code).&#10;&#10;You should have received a copy of the GNU General Public License version&#10;2 along with this work; if not, write to the Free Software Foundation,&#10;Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.&#10;&#10;Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA&#10;or visit www.oracle.com if you need additional information or have any&#10;questions." />
+    <option name="keyword" value="Copyright" />
+    <option name="allowReplaceKeyword" value="" />
+    <option name="myName" value="langtools" />
+    <option name="myLocal" value="true" />
+  </copyright>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/copyright/profiles_settings.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,7 @@
+<component name="CopyrightManager">
+  <settings default="langtools">
+    <LanguageOptions name="JAVA">
+      <option name="fileLocation" value="1" />
+    </LanguageOptions>
+  </settings>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/inspectionProfiles/langtools.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,30 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0" is_locked="false">
+    <option name="myName" value="langtools" />
+    <option name="myLocal" value="false" />
+    <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
+      <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
+    </inspection_tool>
+    <inspection_tool class="MismatchedCollectionQueryUpdate" enabled="false" level="WARNING" enabled_by_default="false">
+      <option name="queryNames">
+        <value />
+      </option>
+      <option name="updateNames">
+        <value />
+      </option>
+    </inspection_tool>
+    <inspection_tool class="RawUseOfParameterizedType" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoreObjectConstruction" value="false" />
+      <option name="ignoreUncompilable" value="true" />
+    </inspection_tool>
+    <inspection_tool class="SpellCheckingInspection" enabled="true" level="TYPO" enabled_by_default="true">
+      <option name="processCode" value="false" />
+      <option name="processLiterals" value="false" />
+      <option name="processComments" value="false" />
+    </inspection_tool>
+    <inspection_tool class="SuspiciousMethodCalls" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="REPORT_CONVERTIBLE_METHOD_CALLS" value="false" />
+    </inspection_tool>
+  </profile>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/inspectionProfiles/profiles_settings.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,7 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="PROJECT_PROFILE" value="langtools" />
+    <option name="USE_PROJECT_PROFILE" value="true" />
+    <version value="1.0" />
+  </settings>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/langtools.iml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/java.compiler/share/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.compiler/share/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.javadoc/share/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.jdeps/share/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.jshell/share/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.compiler" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.javadoc" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.jdeps" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/make/langtools/tools" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/make/langtools/src/classes" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.compiler" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.javadoc" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.jdeps" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/build/langtools/gensrc/jdk.jshell" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.compiler" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/java.compiler" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.jdeps" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.jshell" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/jdk.javadoc" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+    </content>
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="inheritedJdk" />
+  </component>
+</module>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/misc.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="EntryPointsManager">
+    <entry_points version="2.0" />
+  </component>
+  <component name="JTRegService">
+    <path>@IDEA_JTREG_HOME@</path>
+    <workDir>build</workDir>
+    <jre alt="true" value="@IDEA_TARGET_JDK@" />
+    <options>@XPATCH@</options>
+    <ant>
+      <target file="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" name="build-all-classes" />
+    </ant>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build" />
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/modules.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/langtools.iml" filepath="$PROJECT_DIR$/.idea/langtools.iml" />
+    </modules>
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/runConfigurations/javac.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="javac" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="com.sun.tools.javac.Main" />
+    <option name="VM_PARAMETERS" value='@XPATCH@' />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
+    <option name="ALTERNATIVE_JRE_PATH" value="@IDEA_TARGET_JDK@" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="langtools" />
+    <envs />
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" target="build-all-classes" />
+    </method>
+  </configuration>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/runConfigurations/javadoc.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="javadoc" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="jdk.javadoc.internal.tool.Main" />
+    <option name="VM_PARAMETERS" value='@XPATCH@ --add-exports=jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED' />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
+    <option name="ALTERNATIVE_JRE_PATH" value="@IDEA_TARGET_JDK@" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="langtools" />
+    <envs />
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" target="build-all-classes" />
+    </method>
+  </configuration>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/runConfigurations/javap.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="javap" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="com.sun.tools.javap.Main" />
+    <option name="VM_PARAMETERS" value='@XPATCH@ --add-exports=jdk.jdeps/com.sun.tools.javap=ALL-UNNAMED' />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
+    <option name="ALTERNATIVE_JRE_PATH" value="@IDEA_TARGET_JDK@" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="langtools" />
+    <envs />
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" target="build-all-classes" />
+    </method>
+  </configuration>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/runConfigurations/jshell.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,20 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="jshell" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="jdk.internal.jshell.tool.JShellToolProvider" />
+    <option name="VM_PARAMETERS" value='@XPATCH@ --add-exports=jdk.jshell/jdk.internal.jshell.tool=ALL-UNNAMED' />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
+    <option name="ALTERNATIVE_JRE_PATH" value="@IDEA_TARGET_JDK@" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="langtools" />
+    <envs />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" target="build-all-classes" />
+    </method>
+  </configuration>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/runConfigurations/sjavac.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="sjavac" type="Application" factoryName="Application">
+    <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
+    <option name="MAIN_CLASS_NAME" value="com.sun.tools.sjavac.Main" />
+    <option name="VM_PARAMETERS" value='@XPATCH@ --add-exports=jdk.compiler/com.sun.tools.sjavac=ALL-UNNAMED' />
+    <option name="PROGRAM_PARAMETERS" value="" />
+    <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
+    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
+    <option name="ALTERNATIVE_JRE_PATH" value="@IDEA_TARGET_JDK@" />
+    <option name="ENABLE_SWING_INSPECTOR" value="false" />
+    <option name="ENV_VARIABLES" />
+    <option name="PASS_PARENT_ENVS" value="true" />
+    <module name="langtools" />
+    <envs />
+    <RunnerSettings RunnerId="Run" />
+    <ConfigurationWrapper RunnerId="Run" />
+    <method>
+      <option name="Make" enabled="false" />
+      <option name="AntTarget" enabled="true" antfile="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml" target="build-all-classes" />
+    </method>
+  </configuration>
+</component>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/src/idea/IdeaLoggerWrapper.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,13 @@
+package idea;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * This class implements a custom Ant task which replaces the standard Intellij IDEA Ant logger
+ * with a custom one which generates tighter output.
+ */
+public class IdeaLoggerWrapper extends Task {
+    public void execute() {
+        new LangtoolsIdeaAntLogger(getProject());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/src/idea/LangtoolsIdeaAntLogger.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,364 @@
+/*
+ * Copyright (c) 2014, 2018, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package idea;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+
+import java.util.EnumSet;
+import java.util.Stack;
+
+import static org.apache.tools.ant.Project.*;
+
+/**
+ * This class is used to wrap the IntelliJ ant logger in order to provide more meaningful
+ * output when building langtools. The basic ant output in IntelliJ can be quite cumbersome to
+ * work with, as it provides two separate views: (i) a tree view, which is good to display build task
+ * in a hierarchical fashion as they are processed; and a (ii) plain text view, which gives you
+ * the full ant output. The main problem is that javac-related messages are buried into the
+ * ant output (which is made very verbose by IntelliJ in order to support the tree view). It is
+ * not easy to figure out which node to expand in order to see the error message; switching
+ * to plain text doesn't help either, as now the output is totally flat.
+ *
+ * This logger class removes a lot of verbosity from the IntelliJ ant logger by not propagating
+ * all the events to the IntelliJ's logger. In addition, certain events are handled in a custom
+ * fashion, to generate better output during the build.
+ */
+public final class LangtoolsIdeaAntLogger extends DefaultLogger {
+
+    /**
+     * This is just a way to pass in customized binary string predicates;
+     *
+     * TODO: replace with @code{BiPredicate<String, String>} and method reference when moving to 8
+     */
+    enum StringBinaryPredicate {
+        CONTAINS() {
+            @Override
+            boolean apply(String s1, String s2) {
+                return s1.contains(s2);
+            }
+        },
+        STARTS_WITH {
+            @Override
+            boolean apply(String s1, String s2) {
+                return s1.startsWith(s2);
+            }
+        };
+
+        abstract boolean apply(String s1, String s2);
+    }
+
+    /**
+     * Various kinds of ant messages that we shall intercept
+     */
+    enum MessageKind {
+
+        /** a javac error */
+        JAVAC_ERROR(StringBinaryPredicate.CONTAINS, MSG_ERR, "error:", "compiler.err"),
+        /** a javac warning */
+        JAVAC_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"),
+        /** a javac note */
+        JAVAC_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"),
+        /** a javac raw error (these typically come from a build misconfiguration - such as a bad javac flag) */
+        JAVAC_RAW_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "javac: "),
+        /** continuation of some javac error message */
+        JAVAC_NESTED_DIAG(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "  "),
+        /** a javac crash */
+        JAVAC_CRASH(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "An exception has occurred in the compiler"),
+        /** jtreg test success */
+        JTREG_TEST_PASSED(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Passed: "),
+        /** jtreg test failure */
+        JTREG_TEST_FAILED(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "FAILED: "),
+        /** jtreg test error */
+        JTREG_TEST_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "Error: "),
+        /** jtreg report */
+        JTREG_TEST_REPORT(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Report written");
+
+        StringBinaryPredicate sbp;
+        int priority;
+        String[] keys;
+
+        MessageKind(StringBinaryPredicate sbp, int priority, String... keys) {
+            this.sbp = sbp;
+            this.priority = priority;
+            this.keys = keys;
+        }
+
+        /**
+         * Does a given message string matches this kind?
+         */
+        boolean matches(String s) {
+            for (String key : keys) {
+                if (sbp.apply(s, key)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * This enum is used to represent the list of tasks we need to keep track of during logging.
+     */
+    enum Task {
+        /** exec task - invoked during compilation */
+        JAVAC("exec", MessageKind.JAVAC_ERROR, MessageKind.JAVAC_WARNING, MessageKind.JAVAC_NOTE,
+                       MessageKind.JAVAC_RAW_ERROR, MessageKind.JAVAC_NESTED_DIAG, MessageKind.JAVAC_CRASH),
+        /** jtreg task - invoked during test execution */
+        JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR, MessageKind.JTREG_TEST_REPORT),
+        /** initial synthetic task when the logger is created */
+        ROOT("") {
+            @Override
+            boolean matches(String s) {
+                return false;
+            }
+        },
+        /** synthetic task catching any other tasks not in this list */
+        ANY("") {
+            @Override
+            boolean matches(String s) {
+                return true;
+            }
+        };
+
+        String taskName;
+        MessageKind[] msgs;
+
+        Task(String taskName, MessageKind... msgs) {
+            this.taskName = taskName;
+            this.msgs = msgs;
+        }
+
+        boolean matches(String s) {
+            return s.equals(taskName);
+        }
+    }
+
+    /**
+     * This enum is used to represent the list of targets we need to keep track of during logging.
+     * A regular expression is used to match a given target name.
+     */
+    enum Target {
+        /** jtreg target - executed when launching tests */
+        JTREG("jtreg") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Running jtreg tests: " + e.getProject().getProperty("jtreg.tests");
+            }
+        },
+        /** build bootstrap tool target - executed when bootstrapping javac */
+        BUILD_BOOTSTRAP_JAVAC("build-bootstrap-javac-classes") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Building bootstrap javac...";
+            }
+        },
+        /** build classes target - executed when building classes of given tool */
+        BUILD_ALL_CLASSES("build-all-classes") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Building all classes...";
+            }
+        },
+        /** synthetic target catching any other target not in this list */
+        ANY("") {
+            @Override
+            String getDisplayMessage(BuildEvent e) {
+                return "Executing Ant target(s): " + e.getProject().getProperty("ant.project.invoked-targets");
+            }
+            @Override
+            boolean matches(String msg) {
+                return true;
+            }
+        };
+
+        String targetName;
+
+        Target(String targetName) {
+            this.targetName = targetName;
+        }
+
+        boolean matches(String msg) {
+            return msg.equals(targetName);
+        }
+
+        abstract String getDisplayMessage(BuildEvent e);
+    }
+
+    /**
+     * A custom build event used to represent status changes which should be notified inside
+     * Intellij
+     */
+    static class StatusEvent extends BuildEvent {
+
+        /** the target to which the status update refers */
+        Target target;
+
+        StatusEvent(BuildEvent e, Target target) {
+            super(new StatusTask(e, target.getDisplayMessage(e)));
+            this.target = target;
+            setMessage(getTask().getTaskName(), 2);
+        }
+
+        /**
+         * A custom task used to channel info regarding a status change
+         */
+        static class StatusTask extends org.apache.tools.ant.Task {
+            StatusTask(BuildEvent event, String msg) {
+                setProject(event.getProject());
+                setOwningTarget(event.getTarget());
+                setTaskName(msg);
+            }
+        }
+    }
+
+    /** wrapped ant logger (IntelliJ's own logger) */
+    DefaultLogger logger;
+
+    /** flag - is this the first target we encounter? */
+    boolean firstTarget = true;
+
+    /** flag - should subsequenet failures be suppressed ? */
+    boolean suppressTaskFailures = false;
+
+    /** flag - have we ran into a javac crash ? */
+    boolean crashFound = false;
+
+    /** stack of status changes associated with pending targets */
+    Stack<StatusEvent> statusEvents = new Stack<>();
+
+    /** stack of pending tasks */
+    Stack<Task> tasks = new Stack<>();
+
+    public LangtoolsIdeaAntLogger(Project project) {
+        for (Object o : project.getBuildListeners()) {
+            if (o instanceof DefaultLogger) {
+                this.logger = (DefaultLogger)o;
+                project.removeBuildListener((BuildListener)o);
+                project.addBuildListener(this);
+            }
+        }
+        logger.setMessageOutputLevel(3);
+        tasks.push(Task.ROOT);
+    }
+
+    @Override
+    public void buildStarted(BuildEvent event) {
+        //do nothing
+    }
+
+    @Override
+    public void buildFinished(BuildEvent event) {
+        //do nothing
+    }
+
+    @Override
+    public void targetStarted(BuildEvent event) {
+        EnumSet<Target> statusKinds = firstTarget ?
+                EnumSet.allOf(Target.class) :
+                EnumSet.complementOf(EnumSet.of(Target.ANY));
+
+        String targetName = event.getTarget().getName();
+
+        for (Target statusKind : statusKinds) {
+            if (statusKind.matches(targetName)) {
+                StatusEvent statusEvent = new StatusEvent(event, statusKind);
+                statusEvents.push(statusEvent);
+                logger.taskStarted(statusEvent);
+                firstTarget = false;
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void targetFinished(BuildEvent event) {
+        if (!statusEvents.isEmpty()) {
+            StatusEvent lastEvent = statusEvents.pop();
+            if (lastEvent.target.matches(event.getTarget().getName())) {
+                logger.taskFinished(lastEvent);
+            }
+        }
+    }
+
+    @Override
+    public void taskStarted(BuildEvent event) {
+        String taskName = event.getTask().getTaskName();
+        for (Task task : Task.values()) {
+            if (task.matches(taskName)) {
+                tasks.push(task);
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void taskFinished(BuildEvent event) {
+        if (tasks.peek() == Task.ROOT) {
+            //we need to 'close' the root task to get nicer output
+            logger.taskFinished(event);
+        } else if (!suppressTaskFailures && event.getException() != null) {
+            //the first (innermost) task failure should always be logged
+            event.setMessage(event.getException().toString(), 0);
+            event.setException(null);
+            //note: we turn this into a plain message to avoid stack trace being logged by Idea
+            logger.messageLogged(event);
+            suppressTaskFailures = true;
+        }
+        tasks.pop();
+    }
+
+    @Override
+    public void messageLogged(BuildEvent event) {
+        String msg = event.getMessage();
+
+        boolean processed = false;
+
+        if (!tasks.isEmpty()) {
+            Task task = tasks.peek();
+            for (MessageKind messageKind : task.msgs) {
+                if (messageKind.matches(msg)) {
+                    event.setMessage(msg, messageKind.priority);
+                    processed = true;
+                    if (messageKind == MessageKind.JAVAC_CRASH) {
+                        crashFound = true;
+                    }
+                    break;
+                }
+            }
+        }
+
+        if (event.getPriority() == MSG_ERR || crashFound) {
+            //we log errors regardless of owning task
+            logger.messageLogged(event);
+            suppressTaskFailures = true;
+        } else if (processed) {
+            logger.messageLogged(event);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/vcs.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="hg4idea" />
+  </component>
+</project>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/idea/langtools/template/workspace.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="StructureViewFactory">
+    <option name="ACTIVE_ACTIONS" value=",ALPHA_COMPARATOR" />
+  </component>
+  <component name="antWorkspaceConfiguration">
+    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
+    <option name="FILTER_TARGETS" value="false" />
+    <buildFile url="file://$PROJECT_DIR$/make/ide/idea/langtools/build.xml">
+      <runInBackground value="false" />
+      <targetFilters>
+        <filter targetName="build-all-tools" isVisible="true" />
+        <filter targetName="build-all-classes" isVisible="true" />
+        <filter targetName="clean" isVisible="true" />
+        <filter targetName="crules" isVisible="true" />
+      </targetFilters>
+      <viewClosedWhenNoErrors value="true" />
+      <expanded value="false" />
+      <treeView value="false" />
+    </buildFile>
+  </component>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/hotspot/nbproject/configurations.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurationDescriptor version="100">
+  <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
+    <df root="../.." name="0">
+    </df>
+    <logicalFolder name="ExternalFiles"
+                   displayName="Important Files"
+                   projectFiles="false"
+                   kind="IMPORTANT_FILES_FOLDER">
+      <itemPath>../../Makefile</itemPath>
+    </logicalFolder>
+  </logicalFolder>
+  <sourceFolderFilter>^(nbproject|build)$</sourceFolderFilter>
+  <sourceRootList>
+    <Elem>../..</Elem>
+  </sourceRootList>
+  <projectmakefile>../../Makefile</projectmakefile>
+  <confs>
+    <conf name="Mac_64" type="0">
+      <makefileType>
+        <makeTool>
+          <buildCommandWorkingDir>../..</buildCommandWorkingDir>
+          <buildCommand>${MAKE} -f Makefile images</buildCommand>
+          <cleanCommand>${MAKE} -f Makefile clean</cleanCommand>
+        </makeTool>
+        <preBuild>
+          <preBuildCommandWorkingDir>../..</preBuildCommandWorkingDir>
+          <preBuildCommand>sh configure --with-debug-level=slowdebug</preBuildCommand>
+        </preBuild>
+      </makefileType>
+    </conf>
+    <conf name="Linux_64" type="0">
+      <makefileType>
+        <makeTool>
+          <buildCommandWorkingDir>../..</buildCommandWorkingDir>
+          <buildCommand>${MAKE} -f Makefile images</buildCommand>
+          <cleanCommand>${MAKE} -f Makefile clean</cleanCommand>
+        </makeTool>
+        <preBuild>
+          <preBuildCommandWorkingDir>../..</preBuildCommandWorkingDir>
+          <preBuildCommand>sh configure --with-debug-level=slowdebug</preBuildCommand>
+        </preBuild>
+      </makefileType>
+    </conf>
+    <conf name="Solaris_64" type="0">
+      <makefileType>
+        <makeTool>
+          <buildCommandWorkingDir>../..</buildCommandWorkingDir>
+          <buildCommand>gmake -f Makefile images</buildCommand>
+          <cleanCommand>gmake -f Makefile clean</cleanCommand>
+        </makeTool>
+        <preBuild>
+          <preBuildCommandWorkingDir>../..</preBuildCommandWorkingDir>
+          <preBuildCommand>sh configure --with-debug-level=slowdebug</preBuildCommand>
+        </preBuild>
+      </makefileType>
+    </conf>
+    <conf name="Windws64" type="0">
+      <makefileType>
+        <makeTool>
+          <buildCommandWorkingDir>../../../output</buildCommandWorkingDir>
+          <buildCommand>make images</buildCommand>
+          <cleanCommand>make clean</cleanCommand>
+          <executablePath></executablePath>
+        </makeTool>
+        <preBuild>
+          <preBuildCommandWorkingDir>../../../output</preBuildCommandWorkingDir>
+          <preBuildCommand></preBuildCommand>
+          <preBuildFirst>true</preBuildFirst>
+        </preBuild>
+      </makefileType>
+    </conf>
+  </confs>
+</configurationDescriptor>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/hotspot/nbproject/project.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.cnd.makeproject</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/make-project/1">
+            <name>OpenJDK (Native)</name>
+            <c-extensions>c,m</c-extensions>
+            <cpp-extensions>cc,cpp</cpp-extensions>
+            <header-extensions>ad,h,hh,hpp,in_out,map,txt</header-extensions>
+            <sourceEncoding>UTF-8</sourceEncoding>
+            <make-dep-projects/>
+            <sourceRootList>
+                <sourceRootElem>../..</sourceRootElem>
+            </sourceRootList>
+            <confList>
+                <confElem>
+                    <name>Mac_64</name>
+                    <type>0</type>
+                </confElem>
+                <confElem>
+                    <name>Linux_64</name>
+                    <type>0</type>
+                </confElem>
+                <confElem>
+                    <name>Solaris_64</name>
+                    <type>0</type>
+                </confElem>
+                <confElem>
+                    <name>Windws64</name>
+                    <type>0</type>
+                </confElem>
+            </confList>
+            <formatting>
+                <project-formatting-style>false</project-formatting-style>
+            </formatting>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/langtools/README	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,39 @@
+Using NetBeans to work on the langtools repository.
+
+Netbeans 6.0 or later is recommended.
+
+The "langtools" project in this directory allows you to
+edit, run, test and debug the tools in the OpenJDK langtools
+repository.
+
+The repository contains a number of tools:
+    javac, javadoc and its doclets, and javap.
+
+Build Properties.
+
+To build this repository, you must set some properties for Ant.
+You can set these properties in a number of ways:
+
+- Set the properties in the Properties panel under Tool> Options> Ant.
+  Properties set this way will apply globally to all the langtools 
+  repositories you may be working on.
+
+- Create a file build.properties in the root directory of a
+  langtools repository, and set the properties in that file.
+  These properties will be specific to that repository.
+
+To build the repository, at a minimum you must set the "boot.java.home"
+property.  To run the tools, you must also set "target.java.home". To
+run the regression tests, you must set "jtreg.home".
+
+By default, the build and test targets will build and test all
+of these tools. The run and debug targets will prompt you for the
+name of a tool to execute.
+
+As an alternative, you can focus on a single tool.  When you do
+this, you will still see all the source code for all the tools,
+but the various Ant targets will now be focussed on the selected tool.
+To focus on a tool, bring up the context menu on the "langtools"
+project (i.e. right-click on the project) and select "Select Tool".
+This brings up a dialog which allows you to specify which tool you
+wish to work on, and the arguments to use if and when you run it.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/langtools/build.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project name="langtools-netbeans" default="build" basedir="../../..">
+
+    <property name="langtools.properties"
+        location="make/netbeans/langtools/nbproject/private/langtools.properties"/>
+
+    <!--
+        Instead of importing the main build file, we could call it when needed.
+        That would reduce the list of Ant targets that get displayed for this
+        file, but it also complicates the interface between the project build
+        file and the main build file. For example, some imported targets
+        would have to be reclared, properties would have to be restructured,
+        and it would be harder to run results (e.g. in properties) from nested
+        targets.
+     -->
+    <import file="../../build.xml"/>
+
+    <!-- Build project. (action: build; F11) -->
+
+    <!-- Compile a single file. (action: compile.single; F9) -->
+
+    <target name="compile-single" depends="-get-tool-if-set,-check-langtools.jdk.home">
+        <fail unless="includes">Must set property 'includes'</fail>
+        <mkdir dir="${build.dir}/${module.name}/classes" />
+        <javac fork="true" executable="${java.home}/bin/javac"
+               srcdir="${basedir}/src/${module.name}/share/classes"
+               destdir="${build.dir}/${module.name}/classes"
+               includes="${includes}"
+               sourcepath=""
+               classpath="${langtools.classes}"
+               includeAntRuntime="no"
+               source="${javac.source}"
+               target="${javac.target}"
+               debug="${javac.debug}"
+               debuglevel="${javac.debuglevel}">
+        </javac>
+    </target>
+
+    <!-- Run tool. (action: run; F6)
+        Use langtools.tool.name and langtools.tool.args properties if set; otherwise prompt
+        the user.
+    -->
+
+    <target name="run" depends="-check-langtools.jdk.home,-build-classes,-def-run,-get-tool-and-args,-def-resolve-main-class"
+            description="run tool">
+        <echo level="info" message="Run ${langtools.tool.name} with args ${langtools.tool.args}"/>
+        <resolve-main-class tool.name="${langtools.tool.name}" />
+        <run mainclass="${langtools.main.class}" args="${langtools.tool.args}"/>
+    </target>
+
+    <target name="-def-resolve-main-class">
+        <macrodef name="resolve-main-class">
+          <attribute name="tool.name"/>
+          <sequential>
+            <condition property="langtools.main.class"
+                    value="jdk.javadoc.internal.tool.Main"
+                    else="${tool.@{tool.name}.main.class}">
+                <equals arg1="${langtools.tool.name}" arg2="javadoc"/>
+            </condition>
+          </sequential>
+        </macrodef>
+    </target>
+
+    <target name="-build-classes" depends="-get-tool-if-set,-build-classes-all" />
+    <target name="-build-classes-all">
+        <antcall target="build-all-classes"/>
+    </target>
+
+    <!-- Run a selected class. (action: run.single;  shift-F6) -->
+
+    <target name="run-single" depends="-check-langtools.jdk.home,-def-run">
+        <fail unless="run.classname">Must set property 'run.classname' </fail>
+        <echo level="info" message="run ${run.classname}"/>
+        <run mainclass="${run.classname}" args=""/>
+    </target>
+
+    <!-- Test project, and display results if tests failed. (action: test; Alt-F6)
+        If langtools.tool.name is set, then just test that tool; otherwise
+        test all tools.
+    -->
+
+    <target name="jtreg" depends="-get-tool-if-set,-jtreg-all"
+        description="Test langtools tools"
+        />
+
+    <target name="-jtreg-all">
+        <echo level="info" message="Testing all tools"/>
+        <antcall>
+            <target name="langtools.jtreg"/>
+            <target name="-show-jtreg"/>
+        </antcall>
+    </target>
+
+    <target name="-show-jtreg-single-detect" if="netbeans.home" unless="jtreg.passed">
+        <dirname property="netbeans.jtreg.tests.dir.temp" file="${jtreg.report}/../work/${jtreg.tests}"/>
+        <basename property="netbeans.jtreg.tests.basename.temp" file="${jtreg.tests}" suffix=".java"/>
+        <property name="netbeans.jtreg.single.jtr" value="${netbeans.jtreg.tests.dir.temp}/${netbeans.jtreg.tests.basename.temp}.jtr"/>
+        <condition property="netbeans.jtreg.single">
+            <available file="${netbeans.jtreg.single.jtr}" />
+        </condition>
+        <condition property="netbeans.jtreg.multiple">
+            <not>
+                <available file="${netbeans.jtreg.single.jtr}" />
+            </not>
+        </condition>
+    </target>
+
+    <target name="-show-jtreg-single" if="netbeans.jtreg.single" depends="-show-jtreg-single-detect">
+        <nbbrowse file="${netbeans.jtreg.single.jtr}"/>
+        <fail>Some tests failed; see report for details.</fail>
+    </target>
+
+    <target name="-show-jtreg-multiple" if="netbeans.jtreg.multiple" depends="-show-jtreg-single-detect">
+        <nbbrowse url="file://${jtreg.report}/html/report.html#Results"/>
+        <fail>Some tests failed; see report for details.</fail>
+    </target>
+
+    <target name="-show-jtreg" depends="-show-jtreg-single-detect,-show-jtreg-single,-show-jtreg-multiple" />
+
+    <!-- Debug tool in NetBeans. -->
+
+    <target name="debug" depends="-check-langtools.jdk.home,-def-run,-def-start-debugger,-get-tool-and-args,-build-classes,-def-resolve-main-class" if="netbeans.home">
+        <echo level="info" message="Debug ${langtools.tool.name} with args ${langtools.tool.args}"/>
+        <start-debugger/>
+        <resolve-main-class tool.name="${langtools.tool.name}" />
+        <run mainclass="${langtools.main.class}" args="${langtools.tool.args}" jpda.jvmargs="${jpda.jvmargs}"/>
+    </target>
+
+    <!-- Debug a selected class . -->
+    <target name="debug-single" depends="-check-langtools.jdk.home,-def-start-debugger,-def-run">
+        <fail unless="debug.classname">Must set property 'debug.classname'</fail>
+        <start-debugger/>
+        <run mainclass="${debug.classname}" args="" jpda.jvmargs="${jpda.jvmargs}"/>
+    </target>
+
+    <!-- Debug a jtreg test. -->
+    <target name="debug-jtreg" depends="-check-langtools.jdk.home,-def-start-debugger,-def-jtreg,-get-tool-if-set">
+        <fail unless="jtreg.tests">Must set property 'jtreg.tests'</fail>
+        <start-debugger/>
+        <jtreg-tool name="debug"
+                    tests="${jtreg.tests}"
+                    jpda.jvmargs="${jpda.jvmargs}"/>
+    </target>
+
+    <!-- Update a class being debugged. -->
+
+    <target name="debug-fix" depends="-get-tool-if-set">
+        <fail unless="class">Must set property 'class'
+        </fail>
+        <antcall target="compile-single">
+            <param name="includes" value="${class}.java"/>
+        </antcall>
+        <property name="build.classes.dir" value="${build.dir}/${module.name}/classes" />
+        <nbjpdareload>
+            <fileset dir="${build.classes.dir}">
+                <include name="${class}.class"/>
+            </fileset>
+        </nbjpdareload>
+    </target>
+
+    <!-- Prompt for values. -->
+
+    <target name="-get-tool-if-set" depends="-def-select-tool">
+        <select-tool
+            toolproperty="langtools.tool.name"
+            propertyfile="${langtools.properties}"
+            askIfUnset="false"
+            />
+    </target>
+
+    <target name="-get-tool-and-args" depends="-def-select-tool">
+        <select-tool
+            toolproperty="langtools.tool.name"
+            argsproperty="langtools.tool.args"
+            propertyfile="${langtools.properties}"
+            askIfUnset="true"
+            />
+    </target>
+
+    <!-- Macro to run a tool or selected class - used by run* and debug* tasks -->
+    <target name="-def-run">
+        <macrodef name="run">
+            <attribute name="mainclass"/>
+            <attribute name="args" default=""/>
+            <attribute name="build.modules" default="${build.modules}"/>
+            <attribute name="jpda.jvmargs" default=""/>
+
+            <sequential>
+                <java fork="true" jvm="${langtools.jdk.home}/bin/java" classname="@{mainclass}">
+                    <jvmarg line="--patch-module=java.compiler=@{build.modules}/java.compiler"/>
+                    <jvmarg line="--patch-module=jdk.compiler=@{build.modules}/jdk.compiler"/>
+                    <jvmarg line="--patch-module=jdk.javadoc=@{build.modules}/jdk.javadoc"/>
+                    <jvmarg line="--patch-module=jdk.jdeps=@{build.modules}/jdk.jdeps"/>
+                    <jvmarg line="--patch-module=jdk.jshell=@{build.modules}/jdk.jshell"/>
+                    <jvmarg line="@{jpda.jvmargs}"/>
+                    <arg line="@{args}"/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+
+    <!-- Macro to start the debugger and set a property containg the args needed by the run task -->
+    <target name="-def-start-debugger" if="netbeans.home">
+        <macrodef name="start-debugger">
+            <attribute name="jpda.jvmargs.property" default="jpda.jvmargs"/>
+            <sequential>
+                <nbjpdastart name="${ant.project.name}" addressproperty="jpda.address" transport="dt_socket">
+                    <bootclasspath>
+                        <pathelement path="${langtools.classes}"/>
+                    </bootclasspath>
+                </nbjpdastart>
+                <property
+                    name="@{jpda.jvmargs.property}"
+                    value="-Xdebug -Xnoagent -Djava.compiler=none -Xrunjdwp:transport=dt_socket,address=${jpda.address}"
+                />
+            </sequential>
+        </macrodef>
+    </target>
+
+    <target name="-def-select-tool">
+        <property name="build.toolclasses.dir" location="${build.dir}/toolclasses"/>
+        <mkdir dir="${build.toolclasses.dir}"/>
+        <javac srcdir="${make.tools.dir}"
+               includes="anttasks/SelectTool*"
+               destdir="${build.toolclasses.dir}/"
+               classpath="${ant.core.lib}"
+               includeantruntime="false"
+               debug="${javac.debug}"
+               debuglevel="${javac.debuglevel}">
+                   <compilerarg line="-Xlint"/>
+        </javac>
+        <taskdef name="select-tool"
+                 classname="anttasks.SelectToolTask"
+                 classpath="${build.toolclasses.dir}/"/>
+    </target>
+
+    <target name="select-tool" depends="-def-select-tool">
+        <select-tool propertyfile="${langtools.properties}"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/langtools/nbproject/project.properties	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   - Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#
+#   - Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+#   - Neither the name of Oracle nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=100
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=java;javax;*;static java;static javax;static *
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importInnerClasses=true
+auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateStaticImports=true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/netbeans/langtools/nbproject/project.xml	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+
+   - Neither the name of Oracle nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>langtools</name>
+        </general-data>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2">
+            <!-- Do not use Project Properties customizer when editing this file manually. -->
+            <name>langtools</name>
+            <properties>
+                <property name="root">../../../..</property>
+            </properties>
+            <folders>
+                <source-folder>
+                    <label>langtools</label>
+                    <location>${root}</location>
+                </source-folder>
+                <source-folder>
+                    <label>Test files</label>
+                    <type>tests</type>
+                    <location>${root}/test/langtools</location>
+                </source-folder>
+                <source-folder>
+                    <label>Build files</label>
+                    <type>build</type>
+                    <location>${root}/make/langtools</location>
+                </source-folder>
+                <source-folder>
+                    <label>Source files - java.compiler</label>
+                    <type>java</type>
+                    <location>${root}/src/java.compiler/share/classes</location>
+                </source-folder>
+                <source-folder>
+                    <label>Source files - jdk.compiler</label>
+                    <type>java</type>
+                    <location>${root}/src/jdk.compiler/share/classes</location>
+                </source-folder>
+                <source-folder>
+                    <label>Source files - jdk.jdeps</label>
+                    <type>java</type>
+                    <location>${root}/src/jdk.jdeps/share/classes</location>
+                </source-folder>
+                <source-folder>
+                    <label>Source files - jdk.javadoc</label>
+                    <type>java</type>
+                    <location>${root}/src/jdk.javadoc/share/classes</location>
+                </source-folder>
+                <source-folder>
+                    <label>Source files - jdk.jshell</label>
+                    <type>java</type>
+                    <location>${root}/src/jdk.jshell/share/classes</location>
+                </source-folder>
+                <build-file>
+                    <location>${root}/build/classes</location>
+                </build-file>
+            </folders>
+            <ide-actions>
+                <!--
+ This section defines the standard actions accepted by langtools projects.
+
+ For information on these actions, see
+   - NetBeans: Setting Up Projects
+     at http://www.netbeans.org/kb/55/using-netbeans/project_setup.html
+   - NetBeans: Advanced Freeform Project Configuration
+     at http://www.netbeans.org/kb/41/freeform-config.html
+-->
+                <action name="build">
+                    <target>build</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>build</target>
+                </action>
+                <action name="compile.single">
+                    <target>compile-single</target>
+                    <property name="module.name">java.compiler</property>
+                    <context>
+                        <property>includes</property>
+                        <folder>${root}/src/java.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="compile.single">
+                    <target>compile-single</target>
+                    <property name="module.name">jdk.compiler</property>
+                    <context>
+                        <property>includes</property>
+                        <folder>${root}/src/jdk.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="compile.single">
+                    <target>compile-single</target>
+                    <property name="module.name">jdk.jdeps</property>
+                    <context>
+                        <property>includes</property>
+                        <folder>${root}/src/jdk.jdeps/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="compile.single">
+                    <target>compile-single</target>
+                    <property name="module.name">jdk.javadoc</property>
+                    <context>
+                        <property>includes</property>
+                        <folder>${root}/src/jdk.javadoc/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="compile.single">
+                    <target>compile-single</target>
+                    <property name="module.name">jdk.jshell</property>
+                    <context>
+                        <property>includes</property>
+                        <folder>${root}/src/jdk.jshell/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run">
+                    <target>run</target>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/jdk.base/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/java.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/jdk.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/jdk.jdeps/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/jdk.javadoc/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="run.single">
+                    <target>run-single</target>
+                    <context>
+                        <property>run.classname</property>
+                        <folder>${root}/src/jdk.jshell/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <!--
+ Note: NetBeans does not appear to support context menu items
+ on shell scripts :-(
+-->
+                <action name="run.single">
+                    <target>jtreg</target>
+                    <context>
+                        <property>jtreg.tests</property>
+                        <folder>${root}/test/langtools</folder>
+                        <pattern>\.(java|sh)$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files> </separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="test">
+                    <target>jtreg</target>
+                </action>
+                <action name="debug">
+                    <target>debug</target>
+                </action>
+                <action name="debug.single">
+                    <target>debug-single</target>
+                    <context>
+                        <property>debug.classname</property>
+                        <folder>${root}/src/java.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <target>debug-single</target>
+                    <context>
+                        <property>debug.classname</property>
+                        <folder>${root}/src/jdk.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <target>debug-single</target>
+                    <context>
+                        <property>debug.classname</property>
+                        <folder>${root}/src/jdk.jdeps/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <target>debug-single</target>
+                    <context>
+                        <property>debug.classname</property>
+                        <folder>${root}/src/jdk.javadoc/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.single">
+                    <target>debug-single</target>
+                    <context>
+                        <property>debug.classname</property>
+                        <folder>${root}/src/jdk.jshell/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <!--
+ Note: NetBeans does not appear to support context menu items
+ on shell scripts :-(
+-->
+                <action name="debug.single">
+                    <target>debug-jtreg</target>
+                    <context>
+                        <property>jtreg.tests</property>
+                        <folder>${root}/test/langtools</folder>
+                        <pattern>\.(java|sh)$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <target>debug-fix</target>
+                    <property name="module.name">java.compiler</property>
+                    <context>
+                        <property>class</property>
+                        <folder>${root}/src/java.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <target>debug-fix</target>
+                    <property name="module.name">jdk.compiler</property>
+                    <context>
+                        <property>class</property>
+                        <folder>${root}/src/jdk.compiler/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <target>debug-fix</target>
+                    <property name="module.name">jdk.jdeps</property>
+                    <context>
+                        <property>class</property>
+                        <folder>${root}/src/jdk.jdeps/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <target>debug-fix</target>
+                    <property name="module.name">jdk.javadoc</property>
+                    <context>
+                        <property>class</property>
+                        <folder>${root}/src/jdk.javadoc/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="debug.fix">
+                    <target>debug-fix</target>
+                    <property name="module.name">jdk.jshell</property>
+                    <context>
+                        <property>class</property>
+                        <folder>${root}/src/jdk.jshell/share/classes</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path-noext</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="select-tool">
+                    <target>select-tool</target>
+                </action>
+                <action name="test-select-tool-1">
+                    <target>test-select-tool-1</target>
+                </action>
+                <action name="test-select-tool-2">
+                    <target>test-select-tool-2</target>
+                </action>
+            </ide-actions>
+            <export>
+                <type>folder</type>
+                <location>${root}/build/classes</location>
+                <build-target>build</build-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="tree">
+                        <label>Source files - java.compiler</label>
+                        <location>${root}/src/java.compiler/share/classes</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Source files - jdk.compiler</label>
+                        <location>${root}/src/jdk.compiler/share/classes</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Source files - jdk.jdeps</label>
+                        <location>${root}/src/jdk.jdeps/share/classes</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Source files - jdk.javadoc</label>
+                        <location>${root}/src/jdk.javadoc/share/classes</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Source files - jdk.jshell</label>
+                        <location>${root}/src/jdk.jshell/share/classes</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Test files</label>
+                        <location>${root}/test/langtools</location>
+                    </source-folder>
+                    <source-folder style="tree">
+                        <label>Build files</label>
+                        <location>${root}/make</location>
+                    </source-folder>
+                    <source-file>
+                        <label>README</label>
+                        <location>README</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <!--
+ This section defines the actions that will appear on the project's context
+ menu, in the Projects viewer.
+
+ For information on these actions, see
+   - NetBeans: Setting Up Projects
+     at http://www.netbeans.org/kb/55/using-netbeans/project_setup.html
+   - NetBeans: Advanced Freeform Project Configuration
+     at http://www.netbeans.org/kb/41/freeform-config.html
+-->
+                    <ide-action name="select-tool"/>
+                    <separator/>
+                    <ide-action name="build"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="clean"/>
+                    <separator/>
+                    <ide-action name="run"/>
+                    <ide-action name="debug"/>
+                    <separator/>
+                    <ide-action name="test"/>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/4">
+            <compilation-unit>
+                <package-root>${root}/src/java.compiler/share/classes</package-root>
+                <package-root>${root}/build/gensrc/java.compiler</package-root>
+                <built-to>${root}/build/java.compiler/classes</built-to>
+                <source-level>1.8</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>${root}/src/jdk.compiler/share/classes</package-root>
+                <package-root>${root}/build/gensrc/jdk.compiler</package-root>
+                <classpath mode="compile">${root}/build/java.compiler/classes</classpath>
+                <built-to>${root}/build/jdk.compiler/classes</built-to>
+                <source-level>1.8</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>${root}/src/jdk.jdeps/share/classes</package-root>
+                <package-root>${root}/build/gensrc/jdk.jdeps</package-root>
+                <classpath mode="compile">${root}/build/java.compiler/classes:${root}/build/jdk.compiler/classes</classpath>
+                <built-to>${root}/build/jdk.jdeps/classes</built-to>
+                <source-level>1.8</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>${root}/src/jdk.javadoc/share/classes</package-root>
+                <package-root>${root}/build/gensrc/jdk.javadoc</package-root>
+                <classpath mode="compile">${root}/build/java.compiler/classes:${root}/build/jdk.compiler/classes</classpath>
+                <built-to>${root}/build/jdk.javadoc/classes</built-to>
+                <source-level>1.8</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>${root}/src/jdk.jshell/share/classes</package-root>
+                <package-root>${root}/build/gensrc/jdk.jshell</package-root>
+                <classpath mode="compile">${root}/build/java.compiler/classes:${root}/build/jdk.compiler/classes</classpath>
+                <built-to>${root}/build/jdk.jshell/classes</built-to>
+                <source-level>1.8</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/CreateVSProject.gmk	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,166 @@
+#
+# Copyright (c) 2016, 2020, 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.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# 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.
+#
+
+# This must be the first rule
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+include JavaCompilation.gmk
+include Execute.gmk
+
+ifeq ($(call isTargetOs, windows), true)
+  # The next part is a bit hacky. We include the CompileJvm.gmk to be
+  # able to extact flags, but we do not wish to execute the rules.
+
+  # Use server as base for defines and includes
+  JVM_VARIANT=server
+
+  include HotspotCommon.gmk
+  include lib/CompileJvm.gmk
+
+  # Reset targets so we don't build libjvm.
+  TARGETS :=
+
+  # Helper macro to convert a unix path to a Windows path, suitable for
+  # inclusion in a command line.
+  ifeq ($(call isBuildOsEnv, windows.cygwin), true)
+    FixPath = \
+        $(strip $(subst \,\\,$(shell $(CYGPATH) -w $1)))
+    FixLinuxExecutable = \
+        $(call FixPath, $1)
+  else ifeq ($(call isBuildOsEnv, windows.wsl), true)
+    FixPath = \
+        $(strip $(subst \,\\,$(shell $(WSLPATH) -w $1)))
+    FixLinuxExecutable = \
+        "%windir%\Sysnative\wsl.exe $1"
+  endif
+
+  JVM_DEFINES_client := $(patsubst -D%,%, $(filter -D%, $(JVM_CFLAGS)))
+  EXTRACTED_DEFINES_client := $(addprefix -define , $(JVM_DEFINES_client))
+
+  JVM_INCLUDES_client := $(patsubst -I%,%, $(filter -I%, $(JVM_CFLAGS)))
+  EXTRACTED_INCLUDES_client := $(foreach path, $(JVM_INCLUDES_client), -absoluteInclude $(call FixPath, $(path)))
+
+  # Hand-code variant-specific arguments, based on the fact that we use
+  # client for general arguments. Not optimal but other solutions require
+  # major changes in ProjectCreator.
+  ADDITIONAL_VARIANT_ARGS := \
+      -define_server COMPILER2 \
+      -ignorePath_client adfiles \
+      -ignorePath_client c2_ \
+      -ignorePath_client runtime_ \
+      -ignorePath_client libadt \
+      -ignorePath_client opto \
+      #
+
+  IGNORED_PLATFORMS_ARGS := \
+    -ignorePath aarch64 \
+    -ignorePath aix \
+    -ignorePath arm \
+    -ignorePath bsd \
+    -ignorePath linux \
+    -ignorePath posix \
+    -ignorePath ppc \
+    -ignorePath solaris \
+    -ignorePath sparc \
+    -ignorePath x86_32 \
+    -ignorePath zero \
+      #
+
+  ################################################################################
+  # Build the ProjectCreator java tool.
+
+  TOOLS_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/support/ide_classes
+
+  $(eval $(call SetupJavaCompilation, BUILD_PROJECT_CREATOR, \
+      TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
+      DISABLED_WARNINGS := auxiliaryclass deprecation rawtypes unchecked cast options, \
+      SRC := $(TOPDIR)/make/ide/visualstudio/hotspot/src/classes, \
+      BIN := $(TOOLS_OUTPUTDIR), \
+      JAVAC_FLAGS := -XDstringConcat=inline, \
+  ))
+
+  TARGETS += $(BUILD_PROJECT_CREATOR)
+
+  # Run the ProjectCreator tool
+  PROJECT_CREATOR_TOOL := $(JAVA_SMALL) -cp $(TOOLS_OUTPUTDIR) build.tools.projectcreator.ProjectCreator
+
+  IDE_OUTPUTDIR := $(OUTPUTDIR)/ide/hotspot-visualstudio
+
+  VCPROJ_FILE := $(IDE_OUTPUTDIR)/jvm.vcxproj
+
+  PROJECT_CREATOR_CLASS := build.tools.projectcreator.WinGammaPlatformVC10
+
+  # We hard-code gensrc dir to server (since this includes adfiles)
+  PROJECT_CREATOR_ARGS := \
+      -sourceBase $(call FixPath, $(TOPDIR)/src) \
+      -startAt hotspot \
+      -relativeSrcInclude hotspot \
+      -hidePath .hg \
+      -hidePath .jcheck \
+      -hidePath jdk.aot \
+      -hidePath jdk.hotspot.agent \
+      -hidePath jdk.internal.vm.ci \
+      -hidePath jdk.internal.vm.compiler \
+      -hidePath jdk.jfr \
+      -compiler VC10 \
+      -jdkTargetRoot $(call FixPath, $(JDK_OUTPUTDIR)) \
+      -platformName x64 \
+      -buildBase $(call FixPath, $(IDE_OUTPUTDIR)/vs-output) \
+      -buildSpace $(call FixPath, $(IDE_OUTPUTDIR)) \
+      -makeBinary $(call FixLinuxExecutable, $(MAKE)) \
+      -makeOutput $(call FixPath, $(JDK_OUTPUTDIR)/bin/server) \
+      -absoluteInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
+      -absoluteSrcInclude $(call FixPath, $(HOTSPOT_OUTPUTDIR)/variant-server/gensrc) \
+      $(EXTRACTED_DEFINES_client) \
+      $(EXTRACTED_INCLUDES_client) \
+      $(ADDITIONAL_VARIANT_ARGS) \
+      $(IGNORED_PLATFORMS_ARGS) \
+      #
+
+  VCPROJ_VARDEPS := $(PROJECT_CREATOR_CLASS) $(PROJECT_CREATOR_ARGS)
+  VCPROJ_VARDEPS_FILE := $(call DependOnVariable, VCPROJ_VARDEPS, \
+    $(VCPROJ_FILE).vardeps)
+
+  $(eval $(call SetupExecute, vcproj_file, \
+      INFO := Generating Visual Studio project file, \
+      DEPS := $(BUILD_PROJECT_CREATOR) $(VCPROJ_VARDEPS_FILE), \
+      OUTPUT_FILE := $(VCPROJ_FILE), \
+      COMMAND := $(PROJECT_CREATOR_TOOL) $(PROJECT_CREATOR_CLASS) \
+          $(PROJECT_CREATOR_ARGS) -projectFileName $(call FixPath, $(VCPROJ_FILE)) \
+          $(LOG_INFO), \
+  ))
+
+  TARGETS += $(vcproj_file_TARGET)
+
+  all: $(TARGETS)
+
+else
+  all:
+	$(info Hotspot Visual Studio generation only supported on Windows)
+endif
+
+.PHONY: all
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/ArgsParser.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2005, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+class ArgIterator {
+    String[] args;
+    int i;
+    ArgIterator(String[] args) {
+        this.args = args;
+        this.i = 0;
+    }
+    String get() { return args[i]; }
+    boolean hasMore() { return args != null && i  < args.length; }
+    boolean next() { return ++i < args.length; }
+}
+
+abstract class ArgHandler {
+    public abstract void handle(ArgIterator it);
+
+}
+
+class ArgRule {
+    String arg;
+    ArgHandler handler;
+    ArgRule(String arg, ArgHandler handler) {
+        this.arg = arg;
+        this.handler = handler;
+    }
+
+    boolean process(ArgIterator it) {
+        if (match(it.get(), arg)) {
+            handler.handle(it);
+            return true;
+        }
+        return false;
+    }
+    boolean match(String rule_pattern, String arg) {
+        return arg.equals(rule_pattern);
+    }
+}
+
+class ArgsParser {
+    ArgsParser(String[] args,
+               ArgRule[] rules,
+               ArgHandler defaulter) {
+        ArgIterator ai = new ArgIterator(args);
+        while (ai.hasMore()) {
+            boolean processed = false;
+            for (int i=0; i<rules.length; i++) {
+                processed |= rules[i].process(ai);
+                if (processed) {
+                    break;
+                }
+            }
+            if (!processed) {
+                if (defaulter != null) {
+                    defaulter.handle(ai);
+                } else {
+                    System.err.println("ERROR: unparsed \""+ai.get()+"\"");
+                    ai.next();
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/BuildConfig.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,624 @@
+/*
+ * Copyright (c) 2005, 2018, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+class BuildConfig {
+    @SuppressWarnings("rawtypes")
+    Hashtable vars;
+    Vector<String> basicNames, basicPaths;
+    String[] context;
+
+    static CompilerInterface ci;
+    static CompilerInterface getCI() {
+        if (ci == null) {
+            String comp = (String)getField(null, "CompilerVersion");
+            try {
+                ci = (CompilerInterface)Class.forName("build.tools.projectcreator.CompilerInterface" + comp).newInstance();
+            } catch (Exception cnfe) {
+                System.err.println("Cannot find support for compiler " + comp);
+                throw new RuntimeException(cnfe.toString());
+            }
+        }
+        return ci;
+    }
+
+    @SuppressWarnings("rawtypes")
+    protected void initNames(String flavour, String build, String outDll) {
+        if (vars == null) vars = new Hashtable();
+
+        String flavourBuild =  flavour + "_" + build;
+        String platformName = getFieldString(null, "PlatformName");
+        System.out.println();
+        System.out.println(flavourBuild);
+
+        put("Name", getCI().makeCfgName(flavourBuild, platformName));
+        put("Flavour", flavour);
+        put("Build", build);
+        put("PlatformName", platformName);
+
+        // ones mentioned above were needed to expand format
+        String buildBase = expandFormat(getFieldString(null, "BuildBase"));
+        String sourceBase = getFieldString(null, "SourceBase");
+        String buildSpace = getFieldString(null, "BuildSpace");
+        String outDir = buildBase;
+        String jdkTargetRoot = getFieldString(null, "JdkTargetRoot");
+        String makeBinary = getFieldString(null, "MakeBinary");
+        String makeOutput = expandFormat(getFieldString(null, "MakeOutput"));
+
+        put("Id", flavourBuild);
+        put("OutputDir", outDir);
+        put("SourceBase", sourceBase);
+        put("BuildBase", buildBase);
+        put("BuildSpace", buildSpace);
+        put("OutputDll", outDir + Util.sep + outDll);
+        put("JdkTargetRoot", jdkTargetRoot);
+        put("MakeBinary", makeBinary);
+        put("MakeOutput", makeOutput);
+
+        context = new String [] {flavourBuild, flavour, build, null};
+    }
+
+    protected void init(Vector<String> includes, Vector<String> defines) {
+        initDefaultDefines(defines);
+        initDefaultCompilerFlags(includes);
+        initDefaultLinkerFlags();
+        //handleDB();
+    }
+
+
+    protected void initDefaultCompilerFlags(Vector<String> includes) {
+        Vector compilerFlags = new Vector();
+
+        compilerFlags.addAll(getCI().getBaseCompilerFlags(getV("Define"),
+                                                          includes,
+                                                          get("OutputDir")));
+
+        put("CompilerFlags", compilerFlags);
+    }
+
+    protected void initDefaultLinkerFlags() {
+        Vector linkerFlags = new Vector();
+
+        linkerFlags.addAll(getCI().getBaseLinkerFlags( get("OutputDir"), get("OutputDll"), get("PlatformName")));
+
+        put("LinkerFlags", linkerFlags);
+    }
+
+    public boolean matchesIgnoredPath(String path) {
+        Vector<String> rv = new Vector<String>();
+        collectRelevantVectors(rv, "IgnorePath");
+        for (String pathPart : rv) {
+            if (path.contains(pathPart))  {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean matchesHidePath(String path) {
+        Vector<String> rv = new Vector<String>();
+        collectRelevantVectors(rv, "HidePath");
+        for (String pathPart : rv) {
+            if (path.contains(Util.normalize(pathPart)))  {
+                return true;
+            }
+        }
+        return false;
+    }
+
+   public Vector<String> matchesAdditionalGeneratedPath(String fullPath) {
+        Vector<String> rv = new Vector<String>();
+        Hashtable<String, String> v = (Hashtable<String, String>)BuildConfig.getField(this.toString(), "AdditionalGeneratedFile");
+        if (v != null) {
+            for (Enumeration<String> e=v.keys(); e.hasMoreElements(); ) {
+                String key = e.nextElement();
+                String val = v.get(key);
+
+                if (fullPath.endsWith(expandFormat(key))) {
+                    rv.add(expandFormat(val));
+                }
+            }
+        }
+        return rv;
+    }
+
+    // Returns true if the specified path refers to a relative alternate
+    // source file. RelativeAltSrcInclude is usually "src\closed".
+    public static boolean matchesRelativeAltSrcInclude(String path) {
+        String relativeAltSrcInclude =
+            getFieldString(null, "RelativeAltSrcInclude");
+        Vector<String> v = getFieldVector(null, "AltRelativeInclude");
+        if (v != null) {
+            for (String pathPart : v) {
+                if (path.contains(relativeAltSrcInclude + Util.sep + pathPart))  {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    // Returns the relative alternate source file for the specified path.
+    // Null is returned if the specified path does not have a matching
+    // alternate source file.
+    public static String getMatchingRelativeAltSrcFile(String path) {
+        Vector<String> v = getFieldVector(null, "RelativeAltSrcFileList");
+        if (v == null) {
+            return null;
+        }
+        for (String pathPart : v) {
+            if (path.endsWith(pathPart)) {
+                String relativeAltSrcInclude =
+                    getFieldString(null, "RelativeAltSrcInclude");
+                return relativeAltSrcInclude + Util.sep + pathPart;
+            }
+        }
+        return null;
+    }
+
+    // Returns true if the specified path has a matching alternate
+    // source file.
+    public static boolean matchesRelativeAltSrcFile(String path) {
+        return getMatchingRelativeAltSrcFile(path) != null;
+    }
+
+    // Track the specified alternate source file. The source file is
+    // tracked without the leading .*<sep><RelativeAltSrcFileList><sep>
+    // part to make matching regular source files easier.
+    public static void trackRelativeAltSrcFile(String path) {
+        String pattern = getFieldString(null, "RelativeAltSrcInclude") +
+            Util.sep;
+        int altSrcInd = path.indexOf(pattern);
+        if (altSrcInd == -1) {
+            // not an AltSrc path
+            return;
+        }
+
+        altSrcInd += pattern.length();
+        if (altSrcInd >= path.length()) {
+            // not a valid AltSrc path
+            return;
+        }
+
+        String altSrcFile = path.substring(altSrcInd);
+        Vector v = getFieldVector(null, "RelativeAltSrcFileList");
+        if (v == null || !v.contains(altSrcFile)) {
+            addFieldVector(null, "RelativeAltSrcFileList", altSrcFile);
+        }
+    }
+
+    void addTo(Hashtable ht, String key, String value) {
+        ht.put(expandFormat(key), expandFormat(value));
+    }
+
+    void initDefaultDefines(Vector defines) {
+        Vector sysDefines = new Vector();
+        sysDefines.add("WIN32");
+        sysDefines.add("_WINDOWS");
+        sysDefines.add("HOTSPOT_BUILD_USER=\\\""+System.getProperty("user.name")+"\\\"");
+        sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\"");
+        sysDefines.add("INCLUDE_JFR=1");
+        sysDefines.add("_JNI_IMPLEMENTATION_");
+        if (vars.get("PlatformName").equals("Win32")) {
+            sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\"");
+        } else {
+            sysDefines.add("HOTSPOT_LIB_ARCH=\\\"amd64\\\"");
+        }
+        sysDefines.add("DEBUG_LEVEL=\\\"" + get("Build")+"\\\"");
+        sysDefines.addAll(defines);
+
+        put("Define", sysDefines);
+    }
+
+    String get(String key) {
+        return (String)vars.get(key);
+    }
+
+    Vector getV(String key) {
+        return (Vector)vars.get(key);
+    }
+
+    Object getO(String key) {
+        return vars.get(key);
+    }
+
+    Hashtable getH(String key) {
+        return (Hashtable)vars.get(key);
+    }
+
+    Object getFieldInContext(String field) {
+        for (int i=0; i<context.length; i++) {
+            Object rv = getField(context[i], field);
+            if (rv != null) {
+                return rv;
+            }
+        }
+        return null;
+    }
+
+    Object lookupHashFieldInContext(String field, String key) {
+        for (int i=0; i<context.length; i++) {
+            Hashtable ht = (Hashtable)getField(context[i], field);
+            if (ht != null) {
+                Object rv = ht.get(key);
+                if (rv != null) {
+                    return rv;
+                }
+            }
+        }
+        return null;
+    }
+
+    void put(String key, String value) {
+        vars.put(key, value);
+    }
+
+    void put(String key, Vector vvalue) {
+        vars.put(key, vvalue);
+    }
+
+    void add(String key, Vector vvalue) {
+        getV(key).addAll(vvalue);
+    }
+
+    String flavour() {
+        return get("Flavour");
+    }
+
+    String build() {
+        return get("Build");
+    }
+
+    Object getSpecificField(String field) {
+        return getField(get("Id"), field);
+    }
+
+    void putSpecificField(String field, Object value) {
+        putField(get("Id"), field, value);
+    }
+
+    void collectRelevantVectors(Vector rv, String field) {
+        for (String ctx : context) {
+            Vector<String> v = getFieldVector(ctx, field);
+            if (v != null) {
+                for (String val : v) {
+                    rv.add(expandFormat(val).replace('/', '\\'));
+                }
+            }
+        }
+    }
+
+    void collectRelevantHashes(Hashtable rv, String field) {
+        for (String ctx : context) {
+            Hashtable v = (Hashtable)getField(ctx, field);
+            if (v != null) {
+                for (Enumeration e=v.keys(); e.hasMoreElements(); ) {
+                    String key = (String)e.nextElement();
+                    String val =  (String)v.get(key);
+                    addTo(rv, key, val);
+                }
+            }
+        }
+    }
+
+
+    Vector getDefines() {
+        Vector rv = new Vector();
+        collectRelevantVectors(rv, "Define");
+        return rv;
+    }
+
+    Vector getIncludes() {
+        Vector rv = new Vector();
+        collectRelevantVectors(rv, "AbsoluteInclude");
+        rv.addAll(getSourceIncludes());
+        return rv;
+    }
+
+    private Vector getSourceIncludes() {
+        Vector<String> rv = new Vector<String>();
+        String sourceBase = getFieldString(null, "SourceBase");
+
+        // add relative alternate source include values:
+        String relativeAltSrcInclude =
+            getFieldString(null, "RelativeAltSrcInclude");
+        Vector<String> asri = new Vector<String>();
+        collectRelevantVectors(asri, "AltRelativeInclude");
+        for (String f : asri) {
+            rv.add(sourceBase + Util.sep + relativeAltSrcInclude +
+                   Util.sep + f);
+        }
+
+        Vector<String> ri = new Vector<String>();
+        collectRelevantVectors(ri, "RelativeInclude");
+        for (String f : ri) {
+            rv.add(sourceBase + Util.sep + f);
+        }
+        return rv;
+    }
+
+    static Hashtable cfgData = new Hashtable();
+    static Hashtable globalData = new Hashtable();
+
+    static boolean appliesToTieredBuild(String cfg) {
+        return (cfg != null &&
+                cfg.startsWith("server"));
+    }
+
+    // Filters out the IgnoreFile and IgnorePaths since they are
+    // handled specially for tiered builds.
+    static boolean appliesToTieredBuild(String cfg, String key) {
+        return (appliesToTieredBuild(cfg))&& (key != null && !key.startsWith("Ignore"));
+    }
+
+    static String getTieredBuildCfg(String cfg) {
+        assert appliesToTieredBuild(cfg) : "illegal configuration " + cfg;
+        return "server";
+    }
+
+    static Object getField(String cfg, String field) {
+        if (cfg == null) {
+            return globalData.get(field);
+        }
+
+        Hashtable ht =  (Hashtable)cfgData.get(cfg);
+        return ht == null ? null : ht.get(field);
+    }
+
+    static String getFieldString(String cfg, String field) {
+        return (String)getField(cfg, field);
+    }
+
+    static Vector getFieldVector(String cfg, String field) {
+        return (Vector)getField(cfg, field);
+    }
+
+    static void putField(String cfg, String field, Object value) {
+        putFieldImpl(cfg, field, value);
+        if (appliesToTieredBuild(cfg, field)) {
+            putFieldImpl(getTieredBuildCfg(cfg), field, value);
+        }
+    }
+
+    private static void putFieldImpl(String cfg, String field, Object value) {
+        if (cfg == null) {
+            globalData.put(field, value);
+            return;
+        }
+
+        Hashtable ht = (Hashtable)cfgData.get(cfg);
+        if (ht == null) {
+            ht = new Hashtable();
+            cfgData.put(cfg, ht);
+        }
+
+        ht.put(field, value);
+    }
+
+    static Object getFieldHash(String cfg, String field, String name) {
+        Hashtable ht = (Hashtable)getField(cfg, field);
+
+        return ht == null ? null : ht.get(name);
+    }
+
+    static void putFieldHash(String cfg, String field, String name, Object val) {
+        putFieldHashImpl(cfg, field, name, val);
+        if (appliesToTieredBuild(cfg, field)) {
+            putFieldHashImpl(getTieredBuildCfg(cfg), field, name, val);
+        }
+    }
+
+    private static void putFieldHashImpl(String cfg, String field, String name, Object val) {
+        Hashtable ht = (Hashtable)getField(cfg, field);
+
+        if (ht == null) {
+            ht = new Hashtable();
+            putFieldImpl(cfg, field, ht);
+        }
+
+        ht.put(name, val);
+    }
+
+    static void addFieldVector(String cfg, String field, String element) {
+        addFieldVectorImpl(cfg, field, element);
+        if (appliesToTieredBuild(cfg, field)) {
+            addFieldVectorImpl(getTieredBuildCfg(cfg), field, element);
+        }
+    }
+
+    private static void addFieldVectorImpl(String cfg, String field, String element) {
+        Vector v = (Vector)getField(cfg, field);
+
+        if (v == null) {
+            v = new Vector();
+            putFieldImpl(cfg, field, v);
+        }
+
+        v.add(element);
+    }
+
+    String expandFormat(String format) {
+        if (format == null) {
+            return null;
+        }
+
+        if (format.indexOf('%') == -1) {
+            return format;
+        }
+
+        StringBuffer sb = new StringBuffer();
+        int len = format.length();
+        for (int i=0; i<len; i++) {
+            char ch = format.charAt(i);
+            if (ch == '%') {
+                char ch1 = format.charAt(i+1);
+                switch (ch1) {
+                case '%':
+                    sb.append(ch1);
+                    break;
+                case 'b':
+                    sb.append(build());
+                    break;
+                case 'f':
+                    sb.append(flavour());
+                    break;
+                default:
+                    sb.append(ch);
+                    sb.append(ch1);
+                }
+                i++;
+            } else {
+                sb.append(ch);
+            }
+        }
+
+        return sb.toString();
+    }
+}
+
+abstract class GenericDebugConfig extends BuildConfig {
+    abstract String getOptFlag();
+
+    protected void init(Vector includes, Vector defines) {
+        defines.add("_DEBUG");
+        defines.add("ASSERT");
+
+        super.init(includes, defines);
+
+        getV("CompilerFlags").addAll(getCI().getDebugCompilerFlags(getOptFlag(), get("PlatformName")));
+        getV("LinkerFlags").addAll(getCI().getDebugLinkerFlags());
+   }
+}
+
+abstract class GenericDebugNonKernelConfig extends GenericDebugConfig {
+    protected void init(Vector includes, Vector defines) {
+        super.init(includes, defines);
+        if (get("PlatformName").equals("Win32")) {
+            getCI().getAdditionalNonKernelLinkerFlags(getV("LinkerFlags"));
+        }
+   }
+}
+
+class C1DebugConfig extends GenericDebugNonKernelConfig {
+    String getOptFlag() {
+        return getCI().getNoOptFlag();
+    }
+
+    C1DebugConfig() {
+        initNames("client", "debug", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+class C1FastDebugConfig extends GenericDebugNonKernelConfig {
+    String getOptFlag() {
+        return getCI().getOptFlag();
+    }
+
+    C1FastDebugConfig() {
+        initNames("client", "fastdebug", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+class TieredDebugConfig extends GenericDebugNonKernelConfig {
+    String getOptFlag() {
+        return getCI().getNoOptFlag();
+    }
+
+    TieredDebugConfig() {
+        initNames("server", "debug", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+class TieredFastDebugConfig extends GenericDebugNonKernelConfig {
+    String getOptFlag() {
+        return getCI().getOptFlag();
+    }
+
+    TieredFastDebugConfig() {
+        initNames("server", "fastdebug", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+abstract class ProductConfig extends BuildConfig {
+    protected void init(Vector includes, Vector defines) {
+        defines.add("NDEBUG");
+        defines.add("PRODUCT");
+
+        super.init(includes, defines);
+
+        getV("CompilerFlags").addAll(getCI().getProductCompilerFlags());
+        getV("LinkerFlags").addAll(getCI().getProductLinkerFlags());
+    }
+}
+
+class C1ProductConfig extends ProductConfig {
+    C1ProductConfig() {
+        initNames("client", "product", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+class TieredProductConfig extends ProductConfig {
+    TieredProductConfig() {
+        initNames("server", "product", "jvm.dll");
+        init(getIncludes(), getDefines());
+    }
+}
+
+
+abstract class CompilerInterface {
+    abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
+    abstract Vector getBaseLinkerFlags(String outDir, String outDll, String platformName);
+    abstract Vector getDebugCompilerFlags(String opt, String platformName);
+    abstract Vector getDebugLinkerFlags();
+    abstract void   getAdditionalNonKernelLinkerFlags(Vector rv);
+    abstract Vector getProductCompilerFlags();
+    abstract Vector getProductLinkerFlags();
+    abstract String getOptFlag();
+    abstract String getNoOptFlag();
+    abstract String makeCfgName(String flavourBuild, String platformName);
+
+    void addAttr(Vector receiver, String attr, String value) {
+        receiver.add(attr); receiver.add(value);
+    }
+    void extAttr(Vector receiver, String attr, String value) {
+        int attr_pos=receiver.indexOf(attr) ;
+        if ( attr_pos == -1) {
+          // If attr IS NOT present in the Vector - add it
+          receiver.add(attr); receiver.add(value);
+        } else {
+          // If attr IS present in the Vector - append value to it
+          receiver.set(attr_pos+1,receiver.get(attr_pos+1)+value);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/FileTreeCreator.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2012, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.util.HashSet;
+import java.util.Stack;
+import java.util.Vector;
+
+public class FileTreeCreator extends SimpleFileVisitor<Path>
+{
+   Path vcProjLocation;
+   Path startDir;
+   final int startDirLength;
+   Stack<DirAttributes> attributes = new Stack<DirAttributes>();
+   Vector<BuildConfig> allConfigs;
+   WinGammaPlatform wg;
+   WinGammaPlatformVC10 wg10;
+
+   public FileTreeCreator(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
+      super();
+      this.wg = wg;
+      if (wg instanceof WinGammaPlatformVC10) {
+          wg10 = (WinGammaPlatformVC10)wg;
+      }
+      this.allConfigs = allConfigs;
+      this.startDir = startDir;
+      startDirLength = startDir.toAbsolutePath().toString().length();
+      vcProjLocation = FileSystems.getDefault().getPath(allConfigs.firstElement().get("BuildSpace"));
+      attributes.push(new DirAttributes());
+   }
+
+   public class DirAttributes {
+
+      private HashSet<BuildConfig> ignores;
+      private HashSet<BuildConfig> disablePch;
+
+      public DirAttributes() {
+         ignores = new HashSet<BuildConfig>();
+         disablePch = new HashSet<BuildConfig>();
+      }
+
+      public DirAttributes(HashSet<BuildConfig> excludes2, HashSet<BuildConfig> disablePch2) {
+         ignores = excludes2;
+         disablePch = disablePch2;
+      }
+
+      @SuppressWarnings("unchecked")
+      public DirAttributes clone() {
+         return new DirAttributes((HashSet<BuildConfig>)this.ignores.clone(), (HashSet<BuildConfig>)this.disablePch.clone());
+      }
+
+      public void setIgnore(BuildConfig conf) {
+         ignores.add(conf);
+      }
+
+      public boolean hasIgnore(BuildConfig cfg) {
+         return ignores.contains(cfg);
+      }
+
+      public void removeFromIgnored(BuildConfig cfg) {
+         ignores.remove(cfg);
+      }
+
+      public void setDisablePch(BuildConfig conf) {
+         disablePch.add(conf);
+      }
+
+      public boolean hasDisablePch(BuildConfig cfg) {
+         return disablePch.contains(cfg);
+      }
+
+      public void removeFromDisablePch(BuildConfig cfg) {
+         disablePch.remove(cfg);
+      }
+
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/FileTreeCreatorVC10.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2012, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Stack;
+import java.util.Vector;
+
+public class FileTreeCreatorVC10 extends FileTreeCreator {
+
+      public FileTreeCreatorVC10(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
+         super(startDir, allConfigs, wg);
+      }
+
+      @Override
+      public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
+         DirAttributes currentFileAttr = attributes.peek().clone();
+         boolean usePch = false;
+         boolean disablePch = false;
+         boolean useIgnore = false;
+         boolean isAltSrc = false;  // only needed as a debugging crumb
+         boolean isReplacedByAltSrc = false;
+         String fileName = file.getFileName().toString();
+
+         // TODO hideFile
+
+         // usePch applies to all configs for a file.
+         if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
+            usePch = true;
+         }
+
+         String fileLoc = vcProjLocation.relativize(file).toString();
+
+         // isAltSrc and isReplacedByAltSrc applies to all configs for a file
+         if (BuildConfig.matchesRelativeAltSrcInclude(
+               file.toAbsolutePath().toString())) {
+            // current file is an alternate source file so track it
+            isAltSrc = true;
+            BuildConfig.trackRelativeAltSrcFile(
+                file.toAbsolutePath().toString());
+         } else if (BuildConfig.matchesRelativeAltSrcFile(
+                    file.toAbsolutePath().toString())) {
+            // current file is a regular file that matches an alternate
+            // source file so yack about replacing the regular file
+            isReplacedByAltSrc = true;
+            System.out.println("INFO: alternate source file '" +
+                               BuildConfig.getMatchingRelativeAltSrcFile(
+                                   file.toAbsolutePath().toString()) +
+                               "' replaces '" + fileLoc + "'");
+         }
+
+         for (BuildConfig cfg : allConfigs) {
+            if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
+               useIgnore = true;
+               currentFileAttr.setIgnore(cfg);
+            } else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
+               useIgnore = true;
+               currentFileAttr.setIgnore(cfg);
+            }
+
+            if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
+               disablePch = true;
+               currentFileAttr.setDisablePch(cfg);
+            }
+
+            Vector<String> rv = new Vector<String>();
+            cfg.collectRelevantVectors(rv, "AdditionalFile");
+            for(String addFile : rv) {
+               if (addFile.equals(fileName)) {
+                  // supress any ignore
+                  // TODO - may need some adjustments
+                  if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) {
+                     currentFileAttr.removeFromIgnored(cfg);
+                  }
+               }
+            }
+         }
+
+         String tagName = wg10.getFileTagFromSuffix(fileName);
+
+         if (!useIgnore && !disablePch && !usePch && !isReplacedByAltSrc) {
+            wg.tag(tagName, new String[] { "Include", fileLoc});
+         } else {
+            wg.startTag(
+                  tagName,
+                  new String[] { "Include", fileLoc});
+
+            for (BuildConfig cfg : allConfigs) {
+               boolean ignore = currentFileAttr.hasIgnore(cfg);
+               if (ignore) {
+                  wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
+               }
+               if (usePch) {
+                  wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
+               }
+               if (disablePch) {
+                  wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
+               }
+               if (isReplacedByAltSrc) {
+                  wg.tagData("ExcludedFromBuild", "true", "Condition",
+                             "'$(Configuration)|$(Platform)'=='" +
+                             cfg.get("Name") + "'");
+               }
+            }
+            wg.endTag();
+         }
+
+         String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
+         wg10.addFilterDependency(fileLoc, filter);
+
+         return CONTINUE;
+      }
+
+      @Override
+      public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
+            throws IOException {
+         Boolean hide = false;
+         // TODO remove attrs, if path is matched in this dir, then it is too in every subdir.
+         // And we will check anyway
+         DirAttributes newAttr = attributes.peek().clone();
+
+         // check per config ignorePaths!
+         for (BuildConfig cfg : allConfigs) {
+            if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
+               newAttr.setIgnore(cfg);
+            }
+
+            // Hide is always on all configs. And additional files are never hiddden
+            if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
+               hide = true;
+               break;
+            }
+         }
+
+         if (!hide) {
+            String name = startDir.relativize(path.toAbsolutePath()).toString();
+            if (!"".equals(name)) {
+               wg10.addFilter(name);
+            }
+
+            attributes.push(newAttr);
+            return super.preVisitDirectory(path, attrs);
+         } else {
+            return FileVisitResult.SKIP_SUBTREE;
+         }
+      }
+
+      @Override
+      public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+         //end matching attributes set by ignorepath
+         attributes.pop();
+         return CONTINUE;
+      }
+
+      @Override
+      public FileVisitResult visitFileFailed(Path file, IOException exc) {
+         return CONTINUE;
+      }
+
+      public void writeFileTree() throws IOException {
+         Files.walkFileTree(this.startDir, this);
+      }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/ProjectCreator.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 1999, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+public class ProjectCreator {
+
+   public static void usage() {
+      System.out.println("ProjectCreator options:");
+      System.err.println("WinGammaPlatform platform-specific options:");
+      System.err.println("  -sourceBase <path to directory (workspace) "
+            + "containing source files; no trailing slash>");
+      System.err.println("  -dspFileName <full pathname to which .dsp file "
+            + "will be written; all parent directories must "
+            + "already exist>");
+      System.err.println("  -envVar <environment variable to be inserted "
+            + "into .dsp file, substituting for path given in "
+            + "-sourceBase. Example: HotSpotWorkSpace>");
+      System.err.println("  -dllLoc <path to directory in which to put "
+            + "jvm.dll; no trailing slash>");
+      System.err.println("  If any of the above are specified, "
+            + "they must all be.");
+      System.err.println("  Note: if '-altRelativeInclude' option below is "
+            + "used, then the '-relativeAltSrcInclude' option must be used "
+            + "to specify the alternate source dir, e.g., 'src\\closed'");
+      System.err.println("  Additional, optional arguments, which can be "
+            + "specified multiple times:");
+      System.err.println("    -absoluteInclude <string containing absolute "
+            + "path to include directory>");
+      System.err.println("    -altRelativeInclude <string containing "
+            + "alternate include directory relative to -envVar>");
+      System.err.println("    -relativeInclude <string containing include "
+            + "directory relative to -envVar>");
+      System.err.println("    -define <preprocessor flag to be #defined "
+            + "(note: doesn't yet support " + "#define (flag) (value))>");
+      System.err.println("    -perFileLine <file> <line>");
+      System.err.println("    -conditionalPerFileLine <file> <line for "
+            + "release build> <line for debug build>");
+      System.err.println("  (NOTE: To work around a bug in nmake, where "
+            + "you can't have a '#' character in a quoted "
+            + "string, all of the lines outputted have \"#\"" + "prepended)");
+      System.err.println("    -startAt <subdir of sourceBase>");
+      System.err.println("    -ignoreFile <file which won't be able to be "
+            + "found in the sourceBase because it's generated " + "later>");
+      System.err.println("    -additionalFile <file not in database but "
+            + "which should show up in .dsp file>");
+      System.err
+            .println("    -additionalGeneratedFile <environment variable of "
+                  + "generated file's location> <relative path to "
+                  + "directory containing file; no trailing slash> "
+                  + "<name of file generated later in the build process>");
+      System.err.println("    -prelink <build> <desc> <cmds>:");
+      System.err
+            .println(" Generate a set of prelink commands for the given BUILD");
+      System.err
+            .println(" (\"Debug\" or \"Release\"). The prelink description and commands");
+      System.err.println(" are both quoted strings.");
+      System.err.println("    Default includes: \".\"");
+      System.err
+            .println("    Default defines: WIN32, _WINDOWS, \"HOTSPOT_BUILD_USER=$(USERNAME)\"");
+   }
+
+   public static void main(String[] args) {
+      try {
+         if (args.length < 3) {
+            usage();
+            System.exit(1);
+         }
+
+         String platformName = args[0];
+         Class platformClass = Class.forName(platformName);
+         WinGammaPlatform platform = (WinGammaPlatform) platformClass
+               .newInstance();
+
+         String[] platformArgs = new String[args.length - 1];
+         System.arraycopy(args, 1, platformArgs, 0, platformArgs.length);
+
+         // Allow the platform to write platform-specific files
+         platform.createVcproj(platformArgs);
+      } catch (Exception e) {
+         e.printStackTrace();
+         System.exit(1);
+      }
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/Util.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2005, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import java.util.*;
+import java.io.File;
+
+public class Util {
+
+    static String join(String padder, Vector<String> v) {
+        return join(padder, v, false);
+    }
+
+    static String join(String padder, Vector<String> v, boolean quoted) {
+        StringBuffer sb = new StringBuffer();
+
+        for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
+            if (quoted) {
+                sb.append('"');
+            }
+            sb.append(iter.next());
+            if (quoted) {
+                sb.append('"');
+            }
+            if (iter.hasNext()) sb.append(padder);
+        }
+
+        return sb.toString();
+    }
+
+
+    static String prefixed_join(String padder, Vector<String> v, boolean quoted) {
+        StringBuffer sb = new StringBuffer();
+
+        for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
+            sb.append(padder);
+
+            if (quoted) {
+                sb.append('"');
+            }
+            sb.append((String)iter.next());
+            if (quoted) {
+                sb.append('"');
+            }
+        }
+
+        return sb.toString();
+    }
+
+
+    static String normalize(String file) {
+        file = file.replace('\\', '/');
+        if (file.length() > 2) {
+            if (file.charAt(1) == ':' && file.charAt(2) == '/') {
+                // convert drive letter to uppercase
+                String drive = file.substring(0, 1).toUpperCase();
+                return drive + file.substring(1);
+            }
+        }
+        return file;
+    }
+
+    static String sep = File.separator;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatform.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,685 @@
+/*
+ * Copyright (c) 1999, 2016, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Stack;
+import java.util.Vector;
+
+abstract class HsArgHandler extends ArgHandler {
+    static final int STRING = 1;
+    static final int VECTOR = 2;
+    static final int HASH   = 3;
+
+    boolean nextNotKey(ArgIterator it) {
+        if (it.next()) {
+            String s = it.get();
+            return (s.length() == 0) || (s.charAt(0) != '-');
+        } else {
+            return false;
+        }
+    }
+
+    void empty(String key, String message) {
+        if (key != null) {
+            System.err.println("** Error: empty " + key);
+        }
+        if (message != null) {
+            System.err.println(message);
+        }
+        WinGammaPlatform.usage();
+    }
+
+    static String getCfg(String val) {
+        int under = val.indexOf('_');
+        int len = val.length();
+        if (under != -1 && under < len - 1) {
+            return val.substring(under+1, len);
+        } else {
+            return null;
+        }
+    }
+}
+
+class ArgRuleSpecific extends ArgRule {
+    ArgRuleSpecific(String arg, ArgHandler handler) {
+        super(arg, handler);
+    }
+
+    boolean match(String rulePattern, String arg) {
+        return rulePattern.startsWith(arg);
+    }
+}
+
+
+class SpecificHsArgHandler extends HsArgHandler {
+
+    String message, argKey, valKey;
+    int type;
+
+    public void handle(ArgIterator it) {
+        String cfg = getCfg(it.get());
+        if (nextNotKey(it)) {
+            String val = it.get();
+            switch (type) {
+            case VECTOR:
+                BuildConfig.addFieldVector(cfg, valKey, val);
+                break;
+            case HASH:
+                BuildConfig.putFieldHash(cfg, valKey, val, "1");
+                break;
+            case STRING:
+                BuildConfig.putField(cfg, valKey, val);
+                break;
+            default:
+                empty(valKey, "Unknown type: "+type);
+            }
+            it.next();
+
+        } else {
+            empty(argKey, message);
+        }
+    }
+
+    SpecificHsArgHandler(String argKey, String valKey, String message, int type) {
+        this.argKey = argKey;
+        this.valKey = valKey;
+        this.message = message;
+        this.type = type;
+    }
+}
+
+
+class HsArgRule extends ArgRuleSpecific {
+
+    HsArgRule(String argKey, String valKey, String message, int type) {
+        super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type));
+    }
+
+}
+
+public abstract class WinGammaPlatform {
+
+    public boolean fileNameStringEquality(String s1, String s2) {
+        return s1.equalsIgnoreCase(s2);
+    }
+
+    static void usage() throws IllegalArgumentException {
+        System.err.println("WinGammaPlatform platform-specific options:");
+        System.err.println("  -sourceBase <path to directory (workspace) " +
+                           "containing source files; no trailing slash>");
+        System.err.println("  -projectFileName <full pathname to which project file " +
+                           "will be written; all parent directories must " +
+                           "already exist>");
+        System.err.println("  If any of the above are specified, "+
+                           "they must all be.");
+        System.err.println("  Note: if '-altRelativeInclude' option below " +
+                           "is used, then the '-relativeAltSrcInclude' " +
+                           "option must be used to specify the alternate " +
+                           "source dir, e.g., 'src\\closed'");
+        System.err.println("  Additional, optional arguments, which can be " +
+                           "specified multiple times:");
+        System.err.println("    -absoluteInclude <string containing absolute " +
+                           "path to include directory>");
+        System.err.println("    -altRelativeInclude <string containing " +
+                           "alternate include directory relative to " +
+                           "-sourceBase>");
+        System.err.println("    -relativeInclude <string containing include " +
+                           "directory relative to -sourceBase>");
+        System.err.println("    -define <preprocessor flag to be #defined " +
+                           "(note: doesn't yet support " +
+                           "#define (flag) (value))>");
+        System.err.println("    -startAt <subdir of sourceBase>");
+        System.err.println("    -additionalFile <file not in database but " +
+                           "which should show up in project file>");
+        System.err.println("    -additionalGeneratedFile <absolute path to " +
+                           "directory containing file; no trailing slash> " +
+                           "<name of file generated later in the build process>");
+        throw new IllegalArgumentException();
+    }
+
+
+    public void addPerFileLine(Hashtable table,
+                               String fileName,
+                               String line) {
+        Vector v = (Vector) table.get(fileName);
+        if (v != null) {
+            v.add(line);
+        } else {
+            v = new Vector();
+            v.add(line);
+            table.put(fileName, v);
+        }
+    }
+
+    protected static class PerFileCondData {
+        public String releaseString;
+        public String debugString;
+    }
+
+    protected void addConditionalPerFileLine(Hashtable table,
+                                           String fileName,
+                                           String releaseLine,
+                                           String debugLine) {
+        PerFileCondData data = new PerFileCondData();
+        data.releaseString = releaseLine;
+        data.debugString = debugLine;
+        Vector v = (Vector) table.get(fileName);
+        if (v != null) {
+            v.add(data);
+        } else {
+            v = new Vector();
+            v.add(data);
+            table.put(fileName, v);
+        }
+    }
+
+    protected static class PrelinkCommandData {
+      String description;
+      String commands;
+    }
+
+    protected void addPrelinkCommand(Hashtable table,
+                                     String build,
+                                     String description,
+                                     String commands) {
+      PrelinkCommandData data = new PrelinkCommandData();
+      data.description = description;
+      data.commands = commands;
+      table.put(build, data);
+    }
+
+    public boolean findString(Vector v, String s) {
+        for (Iterator iter = v.iterator(); iter.hasNext(); ) {
+            if (((String) iter.next()).equals(s)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+     String getProjectName(String fullPath, String extension)
+        throws IllegalArgumentException, IOException {
+        File file = new File(fullPath).getCanonicalFile();
+        fullPath = file.getCanonicalPath();
+        String parent = file.getParent();
+
+        if (!fullPath.endsWith(extension)) {
+            throw new IllegalArgumentException("project file name \"" +
+                                               fullPath +
+                                               "\" does not end in "+extension);
+        }
+
+        if ((parent != null) &&
+            (!fullPath.startsWith(parent))) {
+            throw new RuntimeException(
+                "Internal error: parent of file name \"" + parent +
+                "\" does not match file name \"" + fullPath + "\""
+            );
+        }
+
+        int len = parent.length();
+        if (!parent.endsWith(Util.sep)) {
+            len += Util.sep.length();
+        }
+
+        int end = fullPath.length() - extension.length();
+
+        if (len == end) {
+            throw new RuntimeException(
+                "Internal error: file name was empty"
+            );
+        }
+
+        return fullPath.substring(len, end);
+    }
+
+    protected abstract String getProjectExt();
+
+    public void createVcproj(String[] args)
+        throws IllegalArgumentException, IOException {
+
+        parseArguments(args);
+
+        String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName");
+        String ext = getProjectExt();
+
+        String projectName = getProjectName(projectFileName, ext);
+
+        writeProjectFile(projectFileName, projectName, createAllConfigs(BuildConfig.getFieldString(null, "PlatformName")));
+    }
+
+    protected void writePrologue(String[] args) {
+        System.err.println("WinGammaPlatform platform-specific arguments:");
+        for (int i = 0; i < args.length; i++) {
+            System.err.print(args[i] + " ");
+        }
+        System.err.println();
+    }
+
+
+    void parseArguments(String[] args) {
+        new ArgsParser(args,
+                       new ArgRule[]
+            {
+                new ArgRule("-sourceBase",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                   String cfg = getCfg(it.get());
+                                   if (nextNotKey(it)) {
+                                      String sb = (String) it.get();
+                                      if (sb.endsWith(Util.sep)) {
+                                         sb = sb.substring(0, sb.length() - 1);
+                                      }
+                                      BuildConfig.putField(cfg, "SourceBase", sb);
+                                      it.next();
+                                   } else {
+                                      empty("-sourceBase", null);
+                                   }
+                                }
+                            }
+                            ),
+
+                new HsArgRule("-buildBase",
+                              "BuildBase",
+                              "   (Did you set the HotSpotBuildSpace environment variable?)",
+                              HsArgHandler.STRING
+                              ),
+
+               new HsArgRule("-buildSpace",
+                              "BuildSpace",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+               new HsArgRule("-makeBinary",
+                              "MakeBinary",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+               new HsArgRule("-makeOutput",
+                              "MakeOutput",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+              new HsArgRule("-platformName",
+                              "PlatformName",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+              new HsArgRule("-projectFileName",
+                              "ProjectFileName",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+                new HsArgRule("-jdkTargetRoot",
+                              "JdkTargetRoot",
+                              "   (Did you set the HotSpotJDKDist environment variable?)",
+                              HsArgHandler.STRING
+                              ),
+
+                new HsArgRule("-compiler",
+                              "CompilerVersion",
+                              "   (Did you set the VcVersion correctly?)",
+                              HsArgHandler.STRING
+                              ),
+
+                new HsArgRule("-absoluteInclude",
+                              "AbsoluteInclude",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-altRelativeInclude",
+                              "AltRelativeInclude",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-relativeInclude",
+                              "RelativeInclude",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-absoluteSrcInclude",
+                              "AbsoluteSrcInclude",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-relativeAltSrcInclude",
+                              "RelativeAltSrcInclude",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+                new HsArgRule("-relativeSrcInclude",
+                              "RelativeSrcInclude",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-define",
+                              "Define",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-useToGeneratePch",
+                              "UseToGeneratePch",
+                              null,
+                              HsArgHandler.STRING
+                              ),
+
+                new ArgRuleSpecific("-perFileLine",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    String cfg = getCfg(it.get());
+                                    if (nextNotKey(it)) {
+                                        String fileName = it.get();
+                                        if (nextNotKey(it)) {
+                                            String line = it.get();
+                                            BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line);
+                                            it.next();
+                                            return;
+                                        }
+                                    }
+                                    empty(null, "** Error: wrong number of args to -perFileLine");
+                                }
+                            }
+                            ),
+
+                new ArgRuleSpecific("-conditionalPerFileLine",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    String cfg = getCfg(it.get());
+                                    if (nextNotKey(it)) {
+                                        String fileName = it.get();
+                                        if (nextNotKey(it)) {
+                                            String productLine = it.get();
+                                            if (nextNotKey(it)) {
+                                                String debugLine = it.get();
+                                                BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine",
+                                                                         fileName, debugLine);
+                                                BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine",
+                                                                         fileName, productLine);
+                                                it.next();
+                                                return;
+                                            }
+                                        }
+                                    }
+
+                                    empty(null, "** Error: wrong number of args to -conditionalPerFileLine");
+                                }
+                            }
+                            ),
+
+                new HsArgRule("-disablePch",
+                              "DisablePch",
+                              null,
+                              HsArgHandler.HASH
+                              ),
+
+                new ArgRule("-startAt",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    if (BuildConfig.getField(null, "StartAt") != null) {
+                                        empty(null, "** Error: multiple -startAt");
+                                    }
+                                    if (nextNotKey(it)) {
+                                        BuildConfig.putField(null, "StartAt", it.get());
+                                        it.next();
+                                    } else {
+                                        empty("-startAt", null);
+                                    }
+                                }
+                            }
+                            ),
+
+                new HsArgRule("-ignoreFile",
+                                      "IgnoreFile",
+                                      null,
+                                      HsArgHandler.HASH
+                                      ),
+
+                new HsArgRule("-ignorePath",
+                              "IgnorePath",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new HsArgRule("-hidePath",
+                      "HidePath",
+                      null,
+                      HsArgHandler.VECTOR
+                      ),
+
+                new HsArgRule("-additionalFile",
+                              "AdditionalFile",
+                              null,
+                              HsArgHandler.VECTOR
+                              ),
+
+                new ArgRuleSpecific("-additionalGeneratedFile",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    String cfg = getCfg(it.get());
+                                    if (nextNotKey(it)) {
+                                        String dir = it.get();
+                                        if (nextNotKey(it)) {
+                                            String fileName = it.get();
+                                            BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile",
+                                                                     Util.normalize(dir + Util.sep + fileName),
+                                                                     fileName);
+                                            it.next();
+                                            return;
+                                        }
+                                    }
+                                    empty(null, "** Error: wrong number of args to -additionalGeneratedFile");
+                                }
+                            }
+                            ),
+
+                new ArgRule("-prelink",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    if (nextNotKey(it)) {
+                                        if (nextNotKey(it)) {
+                                            String description = it.get();
+                                            if (nextNotKey(it)) {
+                                                String command = it.get();
+                                                BuildConfig.putField(null, "PrelinkDescription", description);
+                                                BuildConfig.putField(null, "PrelinkCommand", command);
+                                                it.next();
+                                                return;
+                                            }
+                                        }
+                                    }
+
+                                    empty(null,  "** Error: wrong number of args to -prelink");
+                                }
+                            }
+                            ),
+
+                new ArgRule("-postbuild",
+                            new HsArgHandler() {
+                                public void handle(ArgIterator it) {
+                                    if (nextNotKey(it)) {
+                                        if (nextNotKey(it)) {
+                                            String description = it.get();
+                                            if (nextNotKey(it)) {
+                                                String command = it.get();
+                                                BuildConfig.putField(null, "PostbuildDescription", description);
+                                                BuildConfig.putField(null, "PostbuildCommand", command);
+                                                it.next();
+                                                return;
+                                            }
+                                        }
+                                    }
+
+                                    empty(null,  "** Error: wrong number of args to -postbuild");
+                                }
+                            }
+                            ),
+            },
+                                       new ArgHandler() {
+                                           public void handle(ArgIterator it) {
+
+                                               throw new RuntimeException("Arg Parser: unrecognized option "+it.get());
+                                           }
+                                       }
+                                       );
+        if (BuildConfig.getField(null, "SourceBase") == null      ||
+            BuildConfig.getField(null, "BuildBase") == null       ||
+            BuildConfig.getField(null, "ProjectFileName") == null ||
+            BuildConfig.getField(null, "CompilerVersion") == null) {
+            usage();
+        }
+
+        BuildConfig.putField(null, "PlatformObject", this);
+    }
+
+    Vector createAllConfigs(String platform) {
+        Vector allConfigs = new Vector();
+
+        allConfigs.add(new C1DebugConfig());
+        allConfigs.add(new C1FastDebugConfig());
+        allConfigs.add(new C1ProductConfig());
+
+        allConfigs.add(new TieredDebugConfig());
+        allConfigs.add(new TieredFastDebugConfig());
+        allConfigs.add(new TieredProductConfig());
+
+        return allConfigs;
+    }
+
+    PrintWriter printWriter;
+
+    public void writeProjectFile(String projectFileName, String projectName,
+                                 Vector<BuildConfig> allConfigs) throws IOException {
+        throw new RuntimeException("use compiler version specific version");
+    }
+
+    int indent;
+    private Stack<String> tagStack = new Stack<String>();
+
+    private void startTagPrim(String name, String[] attrs, boolean close) {
+       startTagPrim(name, attrs, close, true);
+    }
+
+    private void startTagPrim(String name, String[] attrs, boolean close,
+          boolean newline) {
+       doIndent();
+       printWriter.print("<" + name);
+       indent++;
+
+       if (attrs != null && attrs.length > 0) {
+          for (int i = 0; i < attrs.length; i += 2) {
+             printWriter.print(" " + attrs[i] + "=\"" + attrs[i + 1] + "\"");
+             if (i < attrs.length - 2) {
+             }
+          }
+       }
+
+       if (close) {
+          indent--;
+          printWriter.print(" />");
+       } else {
+          // TODO push tag name, and change endTag to pop and print.
+          tagStack.push(name);
+          printWriter.print(">");
+       }
+       if (newline) {
+          printWriter.println();
+       }
+    }
+
+    void startTag(String name, String... attrs) {
+       startTagPrim(name, attrs, false);
+    }
+
+    void startTagV(String name, Vector attrs) {
+       String s[] = new String[attrs.size()];
+       for (int i = 0; i < attrs.size(); i++) {
+          s[i] = (String) attrs.elementAt(i);
+       }
+       startTagPrim(name, s, false);
+    }
+
+    void endTag() {
+       String name = tagStack.pop();
+       indent--;
+       doIndent();
+       printWriter.println("</" + name + ">");
+    }
+
+    private void endTagNoIndent() {
+       String name = tagStack.pop();
+       indent--;
+       printWriter.println("</" + name + ">");
+    }
+
+    void tag(String name, String... attrs) {
+       startTagPrim(name, attrs, true);
+    }
+
+    void tagData(String name, String data) {
+       startTagPrim(name, null, false, false);
+       printWriter.print(data);
+       endTagNoIndent();
+    }
+
+    void tagData(String name, String data, String... attrs) {
+       startTagPrim(name, attrs, false, false);
+       printWriter.print(data);
+       endTagNoIndent();
+    }
+
+    void tagV(String name, Vector attrs) {
+       String s[] = new String[attrs.size()];
+       for (int i = 0; i < attrs.size(); i++) {
+          s[i] = (String) attrs.elementAt(i);
+       }
+       startTagPrim(name, s, true);
+    }
+
+    void doIndent() {
+       for (int i = 0; i < indent; i++) {
+          printWriter.print("  ");
+       }
+    }
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/visualstudio/hotspot/src/classes/build/tools/projectcreator/WinGammaPlatformVC10.java	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,470 @@
+/*
+ * Copyright (c) 2011, 2017, 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.
+ *
+ */
+
+package build.tools.projectcreator;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.file.FileSystems;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.UUID;
+import java.util.Vector;
+
+public class WinGammaPlatformVC10 extends WinGammaPlatform {
+
+
+   LinkedList <String>filters = new LinkedList<String>();
+   LinkedList <String[]>filterDeps = new LinkedList<String[]>();
+
+    @Override
+    protected String getProjectExt() {
+        return ".vcxproj";
+    }
+
+    @Override
+    public void writeProjectFile(String projectFileName, String projectName,
+            Vector<BuildConfig> allConfigs) throws IOException {
+        System.out.println();
+        System.out.println("    Writing .vcxproj file: " + projectFileName);
+
+        String projDir = Util.normalize(new File(projectFileName).getParent());
+
+        printWriter = new PrintWriter(projectFileName, "UTF-8");
+        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        startTag("Project",
+                "DefaultTargets", "Build",
+                "ToolsVersion", "4.0",
+                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
+        startTag("ItemGroup",
+                "Label", "ProjectConfigurations");
+        for (BuildConfig cfg : allConfigs) {
+            startTag("ProjectConfiguration",
+                    "Include", cfg.get("Name"));
+            tagData("Configuration", cfg.get("Id"));
+            tagData("Platform", cfg.get("PlatformName"));
+            endTag();
+        }
+        endTag();
+
+        startTag("PropertyGroup", "Label", "Globals");
+        tagData("ProjectGuid", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}");
+        tagData("Keyword", "MakeFileProj");
+        tag("SccProjectName");
+        tag("SccLocalPath");
+        endTag();
+
+        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props");
+
+        for (BuildConfig cfg : allConfigs) {
+            startTag(cfg, "PropertyGroup", "Label", "Configuration");
+            tagData("ConfigurationType", "Makefile");
+            tagData("UseDebugLibraries", "true");
+            endTag();
+        }
+
+        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.props");
+        startTag("ImportGroup", "Label", "ExtensionSettings");
+        endTag();
+        for (BuildConfig cfg : allConfigs) {
+            startTag(cfg, "ImportGroup", "Label", "PropertySheets");
+            tag("Import",
+                    "Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props",
+                    "Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')",
+                    "Label", "LocalAppDataPlatform");
+            endTag();
+        }
+
+        tag("PropertyGroup", "Label", "UserMacros");
+
+        startTag("PropertyGroup");
+        tagData("_ProjectFileVersion", "10.0.30319.1");
+        for (BuildConfig cfg : allConfigs) {
+            tagData(cfg, "OutDir", cfg.get("OutputDir") + Util.sep);
+            tagData(cfg, "IntDir", cfg.get("OutputDir") + Util.sep);
+            tagData(cfg, "LinkIncremental", "false");
+        }
+        for (BuildConfig cfg : allConfigs) {
+            tagData(cfg, "CodeAnalysisRuleSet", "AllRules.ruleset");
+            tag(cfg, "CodeAnalysisRules");
+            tag(cfg, "CodeAnalysisRuleAssemblies");
+        }
+        for (BuildConfig cfg : allConfigs) {
+            tagData(cfg, "NMakeBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile hotspot LOG=info");
+            tagData(cfg, "NMakeReBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot hotspot LOG=info");
+            tagData(cfg, "NMakeCleanCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot LOG=info");
+            tagData(cfg, "NMakeOutput", cfg.get("MakeOutput") + Util.sep + "jvm.dll");
+            tagData(cfg, "NMakePreprocessorDefinitions", Util.join(";", cfg.getDefines()));
+            tagData(cfg, "NMakeIncludeSearchPath", Util.join(";", cfg.getIncludes()));
+        }
+        endTag();
+
+        for (BuildConfig cfg : allConfigs) {
+            startTag(cfg, "ItemDefinitionGroup");
+            startTag("ClCompile");
+            tagV(cfg.getV("CompilerFlags"));
+            endTag();
+
+            startTag("Link");
+            tagV(cfg.getV("LinkerFlags"));
+            endTag();
+
+            endTag();
+        }
+
+        writeFiles(allConfigs, projDir);
+
+        tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets");
+        startTag("ImportGroup", "Label", "ExtensionTargets");
+        endTag();
+
+        endTag();
+        printWriter.close();
+        System.out.println("    Done writing .vcxproj file.");
+
+        writeFilterFile(projectFileName, projectName, allConfigs, projDir);
+        writeUserFile(projectFileName, allConfigs);
+    }
+
+
+    private void writeUserFile(String projectFileName, Vector<BuildConfig> allConfigs) throws FileNotFoundException, UnsupportedEncodingException {
+        String userFileName = projectFileName + ".user";
+        if (new File(userFileName).exists()) {
+            return;
+        }
+        System.out.print("    Writing .vcxproj.user file: " + userFileName);
+        printWriter = new PrintWriter(userFileName, "UTF-8");
+
+        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        startTag("Project",
+                "ToolsVersion", "4.0",
+                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
+
+        for (BuildConfig cfg : allConfigs) {
+            startTag(cfg, "PropertyGroup");
+            tagData("LocalDebuggerCommand", cfg.get("JdkTargetRoot") + "\\bin\\java.exe");
+            // Since we run "make hotspot-import", we get the correct jvm.dll by java.exe.
+            // The '-XX:+PauseAtExit' option
+            // causes the VM to wait for key press before exiting; this
+            // allows any stdout or stderr messages to be seen before
+            // the cmdtool exits.
+            tagData("LocalDebuggerCommandArguments",
+                    "-XX:+UnlockDiagnosticVMOptions -XX:+PauseAtExit");
+            tagData("LocalDebuggerEnvironment", "JAVA_HOME=" + cfg.get("JdkTargetRoot"));
+            endTag();
+        }
+
+        endTag();
+        printWriter.close();
+        System.out.println("    Done.");
+    }
+
+    public void addFilter(String rPath) {
+       filters.add(rPath);
+    }
+
+    public void addFilterDependency(String fileLoc, String filter) {
+      filterDeps.add(new String[] {fileLoc, filter});
+    }
+
+    private void writeFilterFile(String projectFileName, String projectName,
+            Vector<BuildConfig> allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException {
+        String filterFileName = projectFileName + ".filters";
+        System.out.print("    Writing .vcxproj.filters file: " + filterFileName);
+        printWriter = new PrintWriter(filterFileName, "UTF-8");
+
+        printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        startTag("Project",
+                "ToolsVersion", "4.0",
+                "xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
+
+        startTag("ItemGroup");
+        for (String filter : filters) {
+           startTag("Filter", "Include",filter);
+           UUID uuid = UUID.randomUUID();
+           tagData("UniqueIdentifier", "{" + uuid.toString() + "}");
+           endTag();
+        }
+        endTag();
+
+        //TODO - do I need to split cpp and hpp files?
+
+        // then all files
+        startTag("ItemGroup");
+        for (String[] dep : filterDeps) {
+           String tagName = getFileTagFromSuffix(dep[0]);
+
+           startTag(tagName, "Include", dep[0]);
+           tagData("Filter", dep[1]);
+           endTag();
+        }
+        endTag();
+
+        endTag();
+        printWriter.close();
+        System.out.println("    Done.");
+    }
+
+    public String getFileTagFromSuffix(String fileName) {
+       if (fileName.endsWith(".cpp")) {
+          return"ClCompile";
+       } else if (fileName.endsWith(".c")) {
+          return "ClCompile";
+       } else if (fileName.endsWith(".hpp")) {
+          return"ClInclude";
+       } else if (fileName.endsWith(".h")) {
+          return "ClInclude";
+       } else {
+          return"None";
+       }
+    }
+
+    void writeFiles(Vector<BuildConfig> allConfigs, String projDir) {
+       // This code assummes there are no config specific includes.
+       startTag("ItemGroup");
+
+       String sourceBase = BuildConfig.getFieldString(null, "SourceBase");
+
+       // Use first config for all global absolute includes.
+       BuildConfig baseConfig = allConfigs.firstElement();
+       Vector<String> rv = new Vector<String>();
+
+       // Then use first config for all relative includes
+       Vector<String> ri = new Vector<String>();
+       baseConfig.collectRelevantVectors(ri, "RelativeSrcInclude");
+       for (String f : ri) {
+          rv.add(sourceBase + Util.sep + f);
+       }
+
+       baseConfig.collectRelevantVectors(rv, "AbsoluteSrcInclude");
+
+       handleIncludes(rv, allConfigs);
+
+       endTag();
+    }
+
+    // Will visit file tree for each include
+    private void handleIncludes(Vector<String> includes, Vector<BuildConfig> allConfigs) {
+       for (String path : includes)  {
+          FileTreeCreatorVC10 ftc = new FileTreeCreatorVC10(FileSystems.getDefault().getPath(path) , allConfigs, this);
+          try {
+             ftc.writeFileTree();
+          } catch (IOException e) {
+             e.printStackTrace();
+          }
+       }
+    }
+
+    String buildCond(BuildConfig cfg) {
+        return "'$(Configuration)|$(Platform)'=='"+cfg.get("Name")+"'";
+    }
+
+    void tagV(Vector<String> v) {
+        Iterator<String> i = v.iterator();
+        while(i.hasNext()) {
+            String name = i.next();
+            String data = i.next();
+            tagData(name, data);
+        }
+    }
+
+    void tagData(BuildConfig cfg, String name, String data) {
+        tagData(name, data, "Condition", buildCond(cfg));
+    }
+
+    void tag(BuildConfig cfg, String name, String... attrs) {
+        String[] ss = new String[attrs.length + 2];
+        ss[0] = "Condition";
+        ss[1] = buildCond(cfg);
+        System.arraycopy(attrs, 0, ss, 2, attrs.length);
+
+        tag(name, ss);
+    }
+
+    void startTag(BuildConfig cfg, String name, String... attrs) {
+        String[] ss = new String[attrs.length + 2];
+        ss[0] = "Condition";
+        ss[1] = buildCond(cfg);
+        System.arraycopy(attrs, 0, ss, 2, attrs.length);
+
+        startTag(name, ss);
+    }
+
+}
+
+class CompilerInterfaceVC10 extends CompilerInterface {
+
+    @Override
+    Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) {
+        Vector rv = new Vector();
+
+        addAttr(rv, "AdditionalIncludeDirectories", Util.join(";", includes));
+        addAttr(rv, "PreprocessorDefinitions",
+                Util.join(";", defines).replace("\\\"", "\""));
+        addAttr(rv, "PrecompiledHeaderFile", "precompiled.hpp");
+        addAttr(rv, "PrecompiledHeaderOutputFile", outDir+Util.sep+"vm.pch");
+        addAttr(rv, "AssemblerListingLocation", outDir);
+        addAttr(rv, "ObjectFileName", outDir+Util.sep);
+        addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb");
+        // Set /nologo option
+        addAttr(rv, "SuppressStartupBanner", "true");
+        // Surpass the default /Tc or /Tp.
+        addAttr(rv, "CompileAs", "Default");
+        // Set /W3 option.
+        addAttr(rv, "WarningLevel", "Level3");
+        // Set /WX option,
+        addAttr(rv, "TreatWarningAsError", "true");
+        // Set /GS option
+        addAttr(rv, "BufferSecurityCheck", "false");
+        // Set /Zi option.
+        addAttr(rv, "DebugInformationFormat", "ProgramDatabase");
+        // Set /Yu option.
+        addAttr(rv, "PrecompiledHeader", "Use");
+        // Set /EHsc- option
+        addAttr(rv, "ExceptionHandling", "");
+
+        addAttr(rv, "MultiProcessorCompilation", "true");
+
+        return rv;
+    }
+
+    @Override
+    Vector getDebugCompilerFlags(String opt, String platformName) {
+        Vector rv = new Vector();
+
+        // Set /On option
+        addAttr(rv, "Optimization", opt);
+        // Set /MD option.
+        addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
+        // Set /Oy- option
+        addAttr(rv, "OmitFramePointers", "false");
+        // Set /homeparams for x64 debug builds
+        if(platformName.equals("x64")) {
+            addAttr(rv, "AdditionalOptions", "/homeparams");
+        }
+
+        return rv;
+    }
+
+    @Override
+    Vector getProductCompilerFlags() {
+        Vector rv = new Vector();
+
+        // Set /O2 option.
+        addAttr(rv, "Optimization", "MaxSpeed");
+        // Set /Oy- option
+        addAttr(rv, "OmitFramePointers", "false");
+        // Set /Ob option.  1 is expandOnlyInline
+        addAttr(rv, "InlineFunctionExpansion", "OnlyExplicitInline");
+        // Set /GF option.
+        addAttr(rv, "StringPooling", "true");
+        // Set /MD option. 2 is rtMultiThreadedDLL
+        addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
+        // Set /Gy option
+        addAttr(rv, "FunctionLevelLinking", "true");
+
+        return rv;
+    }
+
+    @Override
+    Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
+        Vector rv = new Vector();
+
+        if(platformName.equals("Win32")) {
+            addAttr(rv, "AdditionalOptions",
+                    "/export:JNI_GetDefaultJavaVMInitArgs " +
+                    "/export:JNI_CreateJavaVM " +
+                    "/export:JVM_FindClassFromBootLoader "+
+                    "/export:JNI_GetCreatedJavaVMs "+
+                    "/export:jio_snprintf /export:jio_printf "+
+                    "/export:jio_fprintf /export:jio_vfprintf "+
+                    "/export:jio_vsnprintf "+
+                    "/export:JVM_InitAgentProperties");
+        }
+        addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib;psapi.lib;version.lib");
+        addAttr(rv, "OutputFile", outDll);
+        addAttr(rv, "SuppressStartupBanner", "true");
+        addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def");
+        addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb");
+        addAttr(rv, "SubSystem", "Windows");
+        addAttr(rv, "BaseAddress", "0x8000000");
+        addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib");
+
+        if(platformName.equals("Win32")) {
+            addAttr(rv, "TargetMachine", "MachineX86");
+        } else {
+            addAttr(rv, "TargetMachine", "MachineX64");
+        }
+
+        // We always want the /DEBUG option to get full symbol information in the pdb files
+        addAttr(rv, "GenerateDebugInformation", "true");
+
+        return rv;
+    }
+
+    @Override
+    Vector getDebugLinkerFlags() {
+        Vector rv = new Vector();
+
+        // Empty now that /DEBUG option is used by all configs
+
+        return rv;
+    }
+
+    @Override
+    Vector getProductLinkerFlags() {
+        Vector rv = new Vector();
+
+        // Set /OPT:REF option.
+        addAttr(rv, "OptimizeReferences", "true");
+        // Set /OPT:ICF option.
+        addAttr(rv, "EnableCOMDATFolding", "true");
+
+        return rv;
+    }
+
+    @Override
+    void getAdditionalNonKernelLinkerFlags(Vector rv) {
+        extAttr(rv, "AdditionalOptions", " /export:AsyncGetCallTrace");
+    }
+
+    @Override
+    String getOptFlag() {
+        return "MaxSpeed";
+    }
+
+    @Override
+    String getNoOptFlag() {
+        return "Disabled";
+    }
+
+    @Override
+    String makeCfgName(String flavourBuild, String platform) {
+        return  flavourBuild + "|" + platform;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/CreateVSCodeProject.gmk	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,113 @@
+#
+# Copyright (c) 2019, 2020, 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.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# 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.
+#
+
+# This must be the first rule
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+
+################################################################################
+# Return the full path to an indexer-specific file fragment.
+#
+# Param 1: Fragment name
+################################################################################
+GetIndexerFragment = \
+    $(TOPDIR)/make/ide/vscode/hotspot/indexers/$(VSCODE_INDEXER)-$(1).txt
+
+################################################################################
+# Show indexer-specific notes if they exist, otherwise do nothing
+################################################################################
+ifneq (,$(wildcard $(call GetIndexerFragment,notes)))
+  ShowIndexerNotes = $(CAT) $(call GetIndexerFragment,notes)
+else
+  ShowIndexerNotes =
+endif
+
+################################################################################
+# Return the platform-dependent preferred debug engine name.
+################################################################################
+ifeq ($(call isTargetOs, windows), true)
+  DebugEngineName = cppvsdbg
+else
+  DebugEngineName = cppdbg
+endif
+
+################################################################################
+# Return an additional configuration fragment if the WORKSPACE_ROOT is different
+# from TOPDIR.
+################################################################################
+ifneq ($(WORKSPACE_ROOT),$(TOPDIR))
+  GetExtraWorkspaceRoot = $(TOPDIR)/make/ide/vscode/hotspot/template-workspace-folder.txt
+else
+  GetExtraWorkspaceRoot = /dev/null
+endif
+
+################################################################################
+# Create a project configuration from a given template, replacing a known set
+# of variables.
+#
+# Param 1: Template
+# Param 2: Output
+################################################################################
+define CreateFromTemplate
+	$(call LogInfo, Generating $2)
+	$(call MakeDir, $(dir $2))
+	$(SED) -e '/{{INDEXER_EXTENSIONS}}/r $(call GetIndexerFragment,extensions)' \
+	    -e '/{{INDEXER_SETTINGS}}/r $(call GetIndexerFragment,settings)' \
+	    -e '/{{EXTRA_WORKSPACE_ROOT}}/r $(call GetExtraWorkspaceRoot)' $1 | \
+	$(SED) -e 's!{{TOPDIR}}!$(call FixPath,$(TOPDIR))!g' \
+	    -e 's!{{TOPDIR_RELATIVE}}!$(call FixPath,$(strip \
+	        $(call RelativePath,$(OUTPUTDIR),$(TOPDIR))))!g' \
+	    -e 's!{{WORKSPACE_ROOT}}!$(call FixPath,$(WORKSPACE_ROOT))!g' \
+	    -e 's!{{OUTPUTDIR}}!$(call FixPath,$(OUTPUTDIR))!g' \
+	    -e 's!{{CONF_NAME}}!$(CONF_NAME)!g' \
+	    -e 's!{{COMPILER}}!$(call FixPath,$(CXX)) $(SYSROOT_CFLAGS)!g' \
+	    -e 's!{{MAKE}}!$(call FixPath,$(MAKE))!g' \
+	    -e 's!{{PATH}}!$(call FixPathList,$(PATH))!g' \
+	    -e 's!{{DEBUGENGINENAME}}!$(call DebugEngineName)!g' \
+	    -e '/{{INDEXER_EXTENSIONS}}/d' \
+	    -e '/{{INDEXER_SETTINGS}}/d' \
+	    -e '/{{EXTRA_WORKSPACE_ROOT}}/d' \
+	    > $2
+endef
+
+$(OUTPUTDIR)/jdk.code-workspace:
+	$(call LogWarn, Creating workspace $@)
+	$(call CreateFromTemplate, $(TOPDIR)/make/ide/vscode/hotspot/template-workspace.jsonc, $@)
+	$(call ShowIndexerNotes)
+
+$(OUTPUTDIR)/.vscode/tasks.json:
+	$(call CreateFromTemplate, $(TOPDIR)/make/ide/vscode/hotspot/template-tasks.jsonc, $@)
+
+$(OUTPUTDIR)/.vscode/launch.json:
+	$(call CreateFromTemplate, $(TOPDIR)/make/ide/vscode/hotspot/template-launch.jsonc, $@)
+
+TARGETS := $(OUTPUTDIR)/jdk.code-workspace $(OUTPUTDIR)/.vscode/tasks.json \
+    $(OUTPUTDIR)/.vscode/launch.json
+
+all: $(TARGETS)
+
+.PHONY: all $(TARGETS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/ccls-extensions.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,2 @@
+			"ms-vscode.cpptools",
+			"ccls-project.ccls"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/ccls-notes.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,3 @@
+
+* The "ccls" indexer must be present in PATH, or configured with "ccls.launch.command" in user preferences.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/ccls-settings.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,28 @@
+		// Configure cpptools IntelliSense
+		"C_Cpp.intelliSenseCachePath": "{{OUTPUTDIR}}/.vscode",
+		"C_Cpp.default.compileCommands": "{{OUTPUTDIR}}/compile_commands.json",
+		"C_Cpp.default.cppStandard": "c++03",
+		"C_Cpp.default.compilerPath": "{{COMPILER}}",
+
+		// Configure ccls
+		"ccls.misc.compilationDatabaseDirectory": "{{TOPDIR_RELATIVE}}",
+		"ccls.cache.hierarchicalPath": true,
+		"ccls.cache.directory": "{{OUTPUTDIR}}/.vscode/ccls",
+
+		// Avoid issues with precompiled headers
+		"ccls.clang.excludeArgs": [
+			// Windows / MSVC
+			"-Fp{{OUTPUTDIR}}/hotspot/variant-server/libjvm/objs/BUILD_LIBJVM.pch",
+			"-Fp{{OUTPUTDIR}}/hotspot/variant-server/libjvm/gtest/objs/BUILD_GTEST_LIBJVM.pch",
+			"-Yuprecompiled.hpp",
+			// MacOS / clang
+			"{{OUTPUTDIR}}/hotspot/variant-server/libjvm/objs/precompiled/precompiled.hpp.pch",
+			"{{OUTPUTDIR}}/hotspot/variant-server/libjvm/gtest/objs/precompiled/precompiled.hpp.pch",
+			"-include-pch"
+		],
+
+		// Disable conflicting features from cpptools
+		"C_Cpp.autocomplete": "Disabled",
+		"C_Cpp.errorSquiggles": "Disabled",
+		"C_Cpp.formatting": "Disabled",
+		"C_Cpp.intelliSenseEngine": "Disabled",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/clangd-extensions.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,2 @@
+			"ms-vscode.cpptools",
+			"llvm-vs-code-extensions.vscode-clangd"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/clangd-notes.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,4 @@
+
+* The "clangd" indexer must be present in PATH, or configured with "clangd.path" in user preferences.
+* If building with clang (default on OSX), precompiled headers must be disabled.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/clangd-settings.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,17 @@
+		// Configure cpptools IntelliSense
+		"C_Cpp.intelliSenseCachePath": "{{OUTPUTDIR}}/.vscode",
+		"C_Cpp.default.compileCommands": "{{OUTPUTDIR}}/compile_commands.json",
+		"C_Cpp.default.cppStandard": "c++03",
+		"C_Cpp.default.compilerPath": "{{COMPILER}}",
+
+		// Configure clangd
+		"clangd.arguments": [
+			"-background-index",
+			"-compile-commands-dir={{OUTPUTDIR}}"
+		],
+
+		// Disable conflicting features from cpptools
+		"C_Cpp.autocomplete": "Disabled",
+		"C_Cpp.errorSquiggles": "Disabled",
+		"C_Cpp.formatting": "Disabled",
+		"C_Cpp.intelliSenseEngine": "Disabled",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/cpptools-extensions.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,1 @@
+			"ms-vscode.cpptools"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/cpptools-settings.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,5 @@
+		// Configure cpptools IntelliSense
+		"C_Cpp.intelliSenseCachePath": "{{OUTPUTDIR}}/.vscode",
+		"C_Cpp.default.compileCommands": "{{OUTPUTDIR}}/compile_commands.json",
+		"C_Cpp.default.cppStandard": "c++03",
+		"C_Cpp.default.compilerPath": "{{COMPILER}}",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/rtags-extensions.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,2 @@
+			"ms-vscode.cpptools",
+			"jomiller.rtags-client"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/indexers/rtags-settings.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,14 @@
+		// Configure cpptools IntelliSense
+		"C_Cpp.intelliSenseCachePath": "{{OUTPUTDIR}}/.vscode",
+		"C_Cpp.default.compileCommands": "{{OUTPUTDIR}}/compile_commands.json",
+		"C_Cpp.default.cppStandard": "c++03",
+		"C_Cpp.default.compilerPath": "{{COMPILER}}",
+
+		// Configure RTags
+		"rtags.misc.compilationDatabaseDirectory": "{{OUTPUTDIR}}",
+
+		// Disable conflicting features from cpptools
+		"C_Cpp.autocomplete": "Disabled",
+		"C_Cpp.errorSquiggles": "Disabled",
+		"C_Cpp.formatting": "Disabled",
+		"C_Cpp.intelliSenseEngine": "Disabled",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/template-launch.jsonc	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,55 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "gtestLauncher",
+            "type": "{{DEBUGENGINENAME}}",
+            "request": "launch",
+            "program": "{{OUTPUTDIR}}/hotspot/variant-server/libjvm/gtest/gtestLauncher",
+            "args": ["-jdk:{{OUTPUTDIR}}/jdk"],
+            "stopAtEntry": false,
+            "cwd": "{{WORKSPACE_ROOT}}",
+            "environment": [],
+            "externalConsole": false,
+            "preLaunchTask": "Make 'exploded-image'",
+            "osx": {
+                "MIMode": "lldb",
+                "internalConsoleOptions": "openOnSessionStart",
+                "args": ["--gtest_color=no", "-jdk:{{OUTPUTDIR}}/jdk"]
+            },
+            "linux": {
+                "MIMode": "gdb",
+                "setupCommands": [
+                    {
+                        "text": "handle SIGSEGV noprint nostop",
+                        "description": "Disable stopping on signals handled by the JVM"
+                    }
+                ]
+            }
+        },
+        {
+            "name": "java",
+            "type": "{{DEBUGENGINENAME}}",
+            "request": "launch",
+            "program": "{{OUTPUTDIR}}/jdk/bin/java",
+            "stopAtEntry": false,
+            "cwd": "{{WORKSPACE_ROOT}}",
+            "environment": [],
+            "externalConsole": false,
+            "preLaunchTask": "Make 'exploded-image'",
+            "osx": {
+                "MIMode": "lldb",
+                "internalConsoleOptions": "openOnSessionStart",
+            },
+            "linux": {
+                "MIMode": "gdb",
+                "setupCommands": [
+                    {
+                        "text": "handle SIGSEGV noprint nostop",
+                        "description": "Disable stopping on signals handled by the JVM"
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/template-tasks.jsonc	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,55 @@
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "Update compilation database (compile_commands.json)",
+            "type": "shell",
+            "options": {
+                "env": {
+                    "PATH": "{{PATH}}"
+                },
+                "cwd": "{{WORKSPACE_ROOT}}"
+            },
+            "command": "{{MAKE}} CONF_NAME={{CONF_NAME}} compile-commands",
+            "problemMatcher": []
+        },
+        {
+            "label": "Make 'hotspot'",
+            "type": "shell",
+            "options": {
+                "env": {
+                    "PATH": "{{PATH}}"
+                },
+                "cwd": "{{WORKSPACE_ROOT}}"
+            },
+            "command": "{{MAKE}} CONF_NAME={{CONF_NAME}} hotspot",
+            "problemMatcher": ["$gcc"]
+        },
+        {
+            "label": "Make 'exploded-image'",
+            "type": "shell",
+            "options": {
+                "env": {
+                    "PATH": "{{PATH}}"
+                },
+                "cwd": "{{WORKSPACE_ROOT}}"
+            },
+            "command": "{{MAKE}} CONF_NAME={{CONF_NAME}} exploded-image",
+            "problemMatcher": ["$gcc"]
+        },
+        {
+            "label": "Make 'jdk'",
+            "type": "shell",
+            "options": {
+                "env": {
+                    "PATH": "{{PATH}}"
+                },
+                "cwd": "{{WORKSPACE_ROOT}}"
+            },
+            "command": "{{MAKE}} CONF_NAME={{CONF_NAME}} jdk",
+            "problemMatcher": ["$gcc"]
+        }
+    ]
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/template-workspace-folder.txt	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,4 @@
+		{
+			"name": "Additional sources",
+			"path": "{{WORKSPACE_ROOT}}"
+		},
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/ide/vscode/hotspot/template-workspace.jsonc	Tue May 19 15:49:46 2020 +0200
@@ -0,0 +1,63 @@
+{
+	"folders": [
+		{
+			"name": "Source root",
+			"path": "{{TOPDIR}}"
+		},
+		// {{EXTRA_WORKSPACE_ROOT}}
+		{
+			"name": "Build artifacts",
+			"path": "{{OUTPUTDIR}}"
+		}
+	],
+	"extensions": {
+		"recommendations": [
+			// {{INDEXER_EXTENSIONS}}
+		]
+	},
+	"settings": {
+		// {{INDEXER_SETTINGS}}
+
+		// Additional conventions
+		"files.associations": {
+			"*.gmk": "makefile"
+		},
+
+		// Having these enabled slow down task execution
+		"typescript.tsc.autoDetect": "off",
+		"gulp.autoDetect": "off",
+		"npm.autoDetect": "off",
+		"grunt.autoDetect": "off",
+		"jake.autoDetect": "off",
+
+		// Certain types of files are not relevant for the file browser
+		"files.exclude": {
+			"**/.git": true,
+			"**/.hg": true,
+			"**/.DS_Store": true,
+		},
+
+		// Files that may be interesting to browse manually, but avoided during searches
+		"search.exclude": {
+			"**/*.class": true,
+			"**/*.jsa": true,
+			"**/*.vardeps": true,
+			"**/*.o": true,
+			"**/*.obj": true,
+			"**/*.d": true,
+			"**/*.d.*": true,
+			"**/*_batch*": true,
+			"**/*.marker": true,
+			"**/compile-commands/": true,
+			"**/objs": true,
+			"**/launcher-objs": true,
+			"**/*.cmdline": true,
+			"**/*.log": true,
+			".vscode": true,
+			".clangd": true
+		},
+
+		// Trailing whitespace should never be used in this project
+		"files.trimTrailingWhitespace": true
+	}
+}
\ No newline at end of file
--- a/make/idea/build.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-<!-- importing.xml -->
-<project name="jdk">
-
-    <taskdef name="wrapLogger" classname="idea.IdeaLoggerWrapper" classpath="${idea.dir}/classes"/>
-
-    <wrapLogger/>
-
-    <macrodef name="call-make">
-        <attribute name="dir"/>
-        <attribute name="args"/>
-        <sequential>
-            <exec executable="make" dir="@{dir}" failonerror="true">
-                <arg line="@{args}"/>
-                <env key="CLASSPATH" value = ""/>
-            </exec>
-        </sequential>
-    </macrodef>
-
-    <target name="cond-clean" unless="${intellij.ismake}">
-        <antcall target="clean"/>
-    </target>
-
-    <target name="post-make" depends="cond-clean, build-module"/>
-
-    <!--
-        **** Global JDK Build Targets
-    -->
-
-    <target name="clean">
-        <echo message="base = ${basedir}"/>
-        <call-make dir = "${build.target.dir}" args = "reconfigure"/>
-        <call-make dir = "${build.target.dir}" args = "clean"/>
-    </target>
-
-    <target name="images">
-        <call-make dir = "${build.target.dir}" args = "images"/>
-    </target>
-
-    <target name="build-module">
-        <call-make dir = "${build.target.dir}" args = "${module.name}"/>
-    </target>
-</project>
--- a/make/idea/idea.gmk	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-include Makefile
-include make/MainSupport.gmk
-
-.PHONY: idea
-
-ifeq ($(SPEC),)
-  ifneq ($(words $(SPECS)),1)
-	@echo "Error: Multiple build specification files found. Please select one explicitly."
-	@exit 2
-  endif
-  idea:
-	@cd $(topdir)
-	@$(MAKE) $(MFLAGS) $(MAKE_LOG_FLAGS) -r -R -j 1 -f $(topdir)/make/idea/idea.gmk SPEC=$(SPECS) HAS_SPEC=true ACTUAL_TOPDIR=$(topdir) MODULES="$(MODULES)" idea
-else #with SPEC
-  include make/common/Modules.gmk
-
-  ifeq ($(MODULES),)
-    SEL_MODULES := $(call FindAllModules)
-  else
-    SEL_MODULES := $(MODULES)
-  endif
-
-  idea:
-	$(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT)
-	$(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindModuleSrcDirs,$(mod)))\"" >> $(OUT)
-	$(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT)
-	$(ECHO) "SEL_MODULES=\"$(SEL_MODULES)\"" >> $(OUT)
-	$(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT)
-	$(ECHO) "CYGPATH=\"$(CYGPATH)\"" >> $(OUT)
-	$(ECHO) "SPEC=\"$(SPEC)\"" >> $(OUT)
-	$(ECHO) "JT_HOME=\"$(JT_HOME)\"" >> $(OUT)
-
-endif
--- a/make/idea/template/.name	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-jdk
--- a/make/idea/template/ant.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="AntConfiguration">
-    <buildFile url="file://###ROOT_DIR###/make/idea/build.xml">
-      <properties>
-        <property name="intellij.ismake" value="$IsMake$" />
-        <property name="build.target.dir" value="###BUILD_DIR###" />
-        <property name="module.name" value="###MODULE_NAMES###" />
-        <property name="idea.dir" value="###IDEA_DIR###" />
-      </properties>
-      <executeOn event="afterCompilation" target="post-make" />
-    </buildFile>
-  </component>
-</project>
--- a/make/idea/template/compiler.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <option name="DEFAULT_COMPILER" value="Javac" />
-    <excludeFromCompile>
-      <directory url="file://###ROOT_DIR###/src" includeSubdirectories="true" />
-      <directory url="file://###ROOT_DIR###/build" includeSubdirectories="true" />
-      <directory url="file://###ROOT_DIR###/make" includeSubdirectories="true" />
-      <directory url="file://###ROOT_DIR###/test" includeSubdirectories="true" />
-    </excludeFromCompile>
-    <resourceExtensions />
-    <wildcardResourcePatterns>
-      <entry name="!?*.java" />
-      <entry name="!?*.form" />
-      <entry name="!?*.class" />
-      <entry name="!?*.groovy" />
-      <entry name="!?*.scala" />
-      <entry name="!?*.flex" />
-      <entry name="!?*.kt" />
-      <entry name="!?*.clj" />
-    </wildcardResourcePatterns>
-    <annotationProcessing>
-      <profile default="true" name="Default" enabled="false">
-        <processorPath useClasspath="true" />
-      </profile>
-    </annotationProcessing>
-  </component>
-</project>
-
--- a/make/idea/template/copyright/profiles_settings.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-<component name="CopyrightManager">
-  <settings default="" />
-</component>
--- a/make/idea/template/jdk.iml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://###ROOT_DIR###">
-      ###SOURCE_ROOTS###
-      <excludeFolder url="file://###ROOT_DIR###/build" />
-      <excludeFolder url="file://###ROOT_DIR###/make" />
-    </content>
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="inheritedJdk" />
-  </component>
-</module>
--- a/make/idea/template/misc.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="EntryPointsManager">
-    <entry_points version="2.0" />
-  </component>
-  <component name="JTRegService">
-    <path>###JTREG_HOME###</path>
-    <workDir>###BUILD_DIR###</workDir>
-    <jre alt="true" value="###IMAGES_DIR###" />
-    <options></options>
-    <ant>
-      <target file="file://###ROOT_DIR###/make/idea/build.xml" name="images" />
-    </ant>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_9" assert-keyword="true" jdk-15="true">
-    <output url="file://###BUILD_DIR###" />
-  </component>
-</project>
--- a/make/idea/template/modules.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/jdk.iml" filepath="$PROJECT_DIR$/.idea/jdk.iml" />
-    </modules>
-  </component>
-</project>
-
--- a/make/idea/template/scopes/scope_settings.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<component name="DependencyValidationManager">
-  <state>
-    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
-  </state>
-</component>
--- a/make/idea/template/src/idea/IdeaLoggerWrapper.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package idea;
-
-import org.apache.tools.ant.Task;
-
-/**
- * This class implements a custom Ant task which replaces the standard Intellij IDEA Ant logger
- * with a custom one which generates tighter output.
- */
-public class IdeaLoggerWrapper extends Task {
-    public void execute() {
-        new JdkIdeaAntLogger(getProject());
-    }
-}
--- a/make/idea/template/src/idea/JdkIdeaAntLogger.java	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,375 +0,0 @@
-/*
- * Copyright (c) 2014, 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.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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.
- */
-
-package idea;
-
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.DefaultLogger;
-import org.apache.tools.ant.Project;
-
-import java.util.EnumSet;
-import java.util.Stack;
-
-import static org.apache.tools.ant.Project.*;
-
-/**
- * This class is used to wrap the IntelliJ ant logger in order to provide more meaningful
- * output when building langtools. The basic ant output in IntelliJ can be quite cumbersome to
- * work with, as it provides two separate views: (i) a tree view, which is good to display build task
- * in a hierarchical fashion as they are processed; and a (ii) plain text view, which gives you
- * the full ant output. The main problem is that javac-related messages are buried into the
- * ant output (which is made very verbose by IntelliJ in order to support the tree view). It is
- * not easy to figure out which node to expand in order to see the error message; switching
- * to plain text doesn't help either, as now the output is totally flat.
- *
- * This logger class removes a lot of verbosity from the IntelliJ ant logger by not propagating
- * all the events to the IntelliJ's logger. In addition, certain events are handled in a custom
- * fashion, to generate better output during the build.
- */
-public final class JdkIdeaAntLogger extends DefaultLogger {
-
-    /**
-     * This is just a way to pass in customized binary string predicates;
-     *
-     * TODO: replace with @code{BiPredicate<String, String>} and method reference when moving to 8
-     */
-    enum StringBinaryPredicate {
-        CONTAINS() {
-            @Override
-            boolean apply(String s1, String s2) {
-                return s1.contains(s2);
-            }
-        },
-        STARTS_WITH {
-            @Override
-            boolean apply(String s1, String s2) {
-                return s1.startsWith(s2);
-            }
-        },
-        MATCHES {
-            @Override
-            boolean apply(String s1, String s2) {
-                return s1.matches(s2);
-            }
-        };
-
-        abstract boolean apply(String s1, String s2);
-    }
-
-    /**
-     * Various kinds of ant messages that we shall intercept
-     */
-    enum MessageKind {
-
-        /** a make error */
-        MAKE_ERROR(StringBinaryPredicate.CONTAINS, MSG_ERR, "error:", "compiler.err"),
-        /** a make warning */
-        MAKE_WARNING(StringBinaryPredicate.CONTAINS, MSG_WARN, "warning:", "compiler.warn"),
-        /** a make note */
-        MAKE_NOTE(StringBinaryPredicate.CONTAINS, MSG_INFO, "note:", "compiler.note"),
-        /** std make output */
-        MAKE_OTHER(StringBinaryPredicate.MATCHES, MSG_INFO, ".*"),
-        /** a javac crash */
-        JAVAC_CRASH(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "An exception has occurred in the compiler"),
-        /** jtreg test success */
-        JTREG_TEST_PASSED(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Passed: "),
-        /** jtreg test failure */
-        JTREG_TEST_FAILED(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "FAILED: "),
-        /** jtreg test error */
-        JTREG_TEST_ERROR(StringBinaryPredicate.STARTS_WITH, MSG_ERR, "Error: "),
-        /** jtreg report */
-        JTREG_TEST_REPORT(StringBinaryPredicate.STARTS_WITH, MSG_INFO, "Report written");
-
-        StringBinaryPredicate sbp;
-        int priority;
-        String[] keys;
-
-        MessageKind(StringBinaryPredicate sbp, int priority, String... keys) {
-            this.sbp = sbp;
-            this.priority = priority;
-            this.keys = keys;
-        }
-
-        /**
-         * Does a given message string matches this kind?
-         */
-        boolean matches(String s) {
-            for (String key : keys) {
-                if (sbp.apply(s, key)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * This enum is used to represent the list of tasks we need to keep track of during logging.
-     */
-    enum Task {
-        /** javac task - invoked during compilation */
-        MAKE("exec", MessageKind.MAKE_ERROR, MessageKind.MAKE_WARNING, MessageKind.MAKE_NOTE,
-                       MessageKind.MAKE_OTHER, MessageKind.JAVAC_CRASH),
-        /** jtreg task - invoked during test execution */
-        JTREG("jtreg", MessageKind.JTREG_TEST_PASSED, MessageKind.JTREG_TEST_FAILED, MessageKind.JTREG_TEST_ERROR, MessageKind.JTREG_TEST_REPORT),
-        /** initial synthetic task when the logger is created */
-        ROOT("") {
-            @Override
-            boolean matches(String s) {
-                return false;
-            }
-        },
-        /** synthetic task catching any other tasks not in this list */
-        ANY("") {
-            @Override
-            boolean matches(String s) {
-                return true;
-            }
-        };
-
-        String taskName;
-        MessageKind[] msgs;
-
-        Task(String taskName, MessageKind... msgs) {
-            this.taskName = taskName;
-            this.msgs = msgs;
-        }
-
-        boolean matches(String s) {
-            return s.equals(taskName);
-        }
-    }
-
-    /**
-     * This enum is used to represent the list of targets we need to keep track of during logging.
-     * A regular expression is used to match a given target name.
-     */
-    enum Target {
-        /** jtreg target - executed when launching tests */
-        JTREG("jtreg") {
-            @Override
-            String getDisplayMessage(BuildEvent e) {
-                return "Running jtreg tests: " + e.getProject().getProperty("jtreg.tests");
-            }
-        },
-        /** build selected modules */
-        BUILD_MODULE("build-module") {
-            @Override
-            String getDisplayMessage(BuildEvent e) {
-                return "Building modules: " + e.getProject().getProperty("module.name") + "...";
-            }
-        },
-        /** build images */
-        BUILD_IMAGES("images") {
-            @Override
-            String getDisplayMessage(BuildEvent e) {
-                return "Building images...";
-            }
-        },
-        /** build images */
-        CONFIGURE("-do-configure") {
-            @Override
-            String getDisplayMessage(BuildEvent e) {
-                return "Configuring build...";
-            }
-        },
-        /** synthetic target catching any other target not in this list */
-        ANY("") {
-            @Override
-            String getDisplayMessage(BuildEvent e) {
-                return "Executing Ant target(s): " + e.getProject().getProperty("ant.project.invoked-targets");
-            }
-            @Override
-            boolean matches(String msg) {
-                return true;
-            }
-        };
-
-        String targetRegex;
-
-        Target(String targetRegex) {
-            this.targetRegex = targetRegex;
-        }
-
-        boolean matches(String msg) {
-            return msg.matches(targetRegex);
-        }
-
-        abstract String getDisplayMessage(BuildEvent e);
-    }
-
-    /**
-     * A custom build event used to represent status changes which should be notified inside
-     * Intellij
-     */
-    static class StatusEvent extends BuildEvent {
-
-        /** the target to which the status update refers */
-        Target target;
-
-        StatusEvent(BuildEvent e, Target target) {
-            super(new StatusTask(e, target.getDisplayMessage(e)));
-            this.target = target;
-            setMessage(getTask().getTaskName(), 2);
-        }
-
-        /**
-         * A custom task used to channel info regarding a status change
-         */
-        static class StatusTask extends org.apache.tools.ant.Task {
-            StatusTask(BuildEvent event, String msg) {
-                setProject(event.getProject());
-                setOwningTarget(event.getTarget());
-                setTaskName(msg);
-            }
-        }
-    }
-
-    /** wrapped ant logger (IntelliJ's own logger) */
-    DefaultLogger logger;
-
-    /** flag - is this the first target we encounter? */
-    boolean firstTarget = true;
-
-    /** flag - should subsequenet failures be suppressed ? */
-    boolean suppressTaskFailures = false;
-
-    /** flag - have we ran into a javac crash ? */
-    boolean crashFound = false;
-
-    /** stack of status changes associated with pending targets */
-    Stack<StatusEvent> statusEvents = new Stack<>();
-
-    /** stack of pending tasks */
-    Stack<Task> tasks = new Stack<>();
-
-    public JdkIdeaAntLogger(Project project) {
-        for (Object o : project.getBuildListeners()) {
-            if (o instanceof DefaultLogger) {
-                this.logger = (DefaultLogger)o;
-                project.removeBuildListener((BuildListener)o);
-                project.addBuildListener(this);
-            }
-        }
-        tasks.push(Task.ROOT);
-    }
-
-    @Override
-    public void buildStarted(BuildEvent event) {
-        //do nothing
-    }
-
-    @Override
-    public void buildFinished(BuildEvent event) {
-        //do nothing
-    }
-
-    @Override
-    public void targetStarted(BuildEvent event) {
-        EnumSet<Target> statusKinds = firstTarget ?
-                EnumSet.allOf(Target.class) :
-                EnumSet.complementOf(EnumSet.of(Target.ANY));
-
-        String targetName = event.getTarget().getName();
-
-        for (Target statusKind : statusKinds) {
-            if (statusKind.matches(targetName)) {
-                StatusEvent statusEvent = new StatusEvent(event, statusKind);
-                statusEvents.push(statusEvent);
-                logger.taskStarted(statusEvent);
-                firstTarget = false;
-                return;
-            }
-        }
-    }
-
-    @Override
-    public void targetFinished(BuildEvent event) {
-        if (!statusEvents.isEmpty()) {
-            StatusEvent lastEvent = statusEvents.pop();
-            if (lastEvent.target.matches(event.getTarget().getName())) {
-                logger.taskFinished(lastEvent);
-            }
-        }
-    }
-
-    @Override
-    public void taskStarted(BuildEvent event) {
-        String taskName = event.getTask().getTaskName();
-        System.err.println("task started " + taskName);
-        for (Task task : Task.values()) {
-            if (task.matches(taskName)) {
-                tasks.push(task);
-                return;
-            }
-        }
-    }
-
-    @Override
-    public void taskFinished(BuildEvent event) {
-        if (tasks.peek() == Task.ROOT) {
-            //we need to 'close' the root task to get nicer output
-            logger.taskFinished(event);
-        } else if (!suppressTaskFailures && event.getException() != null) {
-            //the first (innermost) task failure should always be logged
-            event.setMessage(event.getException().toString(), 0);
-            event.setException(null);
-            //note: we turn this into a plain message to avoid stack trace being logged by Idea
-            logger.messageLogged(event);
-            suppressTaskFailures = true;
-        }
-        tasks.pop();
-    }
-
-    @Override
-    public void messageLogged(BuildEvent event) {
-        String msg = event.getMessage();
-
-        boolean processed = false;
-
-        if (!tasks.isEmpty()) {
-            Task task = tasks.peek();
-            for (MessageKind messageKind : task.msgs) {
-                if (messageKind.matches(msg)) {
-                    event.setMessage(msg, messageKind.priority);
-                    processed = true;
-                    if (messageKind == MessageKind.JAVAC_CRASH) {
-                        crashFound = true;
-                    }
-                    break;
-                }
-            }
-        }
-
-        if (event.getPriority() == MSG_ERR || crashFound) {
-            //we log errors regardless of owning task
-            logger.messageLogged(event);
-            suppressTaskFailures = true;
-        } else if (processed) {
-            logger.messageLogged(event);
-        }
-    }
-}
--- a/make/idea/template/vcs.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="###ROOT_DIR###" vcs="###VCS_TYPE###" />
-  </component>
-</project>
--- a/make/idea/template/workspace.xml	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <ignored path="jdk.iws" />
-    <ignored path="###ROOT_DIR###/build/idea/out/" />
-    <ignored path=".idea/" />
-  </component>
-  <component name="StructureViewFactory">
-    <option name="ACTIVE_ACTIONS" value=",ALPHA_COMPARATOR" />
-  </component>
-  <component name="antWorkspaceConfiguration">
-    <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
-    <option name="FILTER_TARGETS" value="false" />
-    <buildFile url="file://###ROOT_DIR###/make/idea/build.xml">
-      <runInBackground value="false" />
-      <targetFilters>
-        <filter targetName="clean" isVisible="true" />
-        <filter targetName="images" isVisible="true" />
-      </targetFilters>
-      <treeView value="false" />
-      <expanded value="true" />
-    </buildFile>
-  </component>
-  <component name="ProjectView">
-    <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
-      <showMembers />
-      <showModules />
-      <showLibraryContents />
-      <hideEmptyPackages />
-      <abbreviatePackageNames />
-      <autoscrollToSource />
-      <autoscrollFromSource />
-      <sortByType />
-    </navigator>
-    <panes>
-      <pane id="ProjectPane">
-        <subPane>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="jdk" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
-      <pane id="PackagesPane">
-        <subPane>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="jdk" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="jdk" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
-      <pane id="Scope" />
-    </panes>
-  </component>
-</project>
--- a/make/jdk/netbeans/README	Tue May 19 15:11:58 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,622 +0,0 @@
-Working on OpenJDK using NetBeans
-    This note describes how to work on the OpenJDK from NetBeans. We've
-    provided several NetBeans projects as starting points. Below we'll
-    describe how to use them, as well as how to create your own.
-
-Getting Started
-    In addition to the source bundle for Open JDK, you'll need to download
-    and install copies of the JDK and of NetBeans. And if you want to run
-    tests on the JDK (you do want to run tests, right?), you'll need to
-    install the jtreg test harness.
-
-    In this note, when pathnames are not fully specified, they should be
-    interpreted as being relative to the directory containing this README
-    and the NetBeans projects themselves.
-
-        The JDK build process is largely make-based, and is not
-        exceptionally tolerant of pathnames with spaces in them (such as
-        "Program Files". Please be sure to install everything in a
-        directories whose paths don't have any spaces!
-
-    Downloading the JDK
-        You've probably done this a million times. Download and install it
-        from http://www.oracle.com/technetwork/java/javase/overview/index.html
-
-    Downloading the OpenJDK sources
-        Since you're reading this, d you've already downloaded the OpenJDK
-        source bundle.  Later in this document we'll refer to the location
-        where you installed the Open JDK sources as *install-dir*.
-
-    Downloading a pre-built, JDK 8
-        This will be necessary to do builds of some of the projects.  In
-        general, you want to download and install a pre-built JDK that
-        corresponds to the OpenJDK sources you download.  Building the entire
-        OpenJDK depends on a few parts of the pre-built JDK.  Get this from
-        http://download.java.net/jdk8/binaries
-
-        Note: For working on certain projects, like JMX and JConsole, you
-              may find convenient to use a pre-built version of JDK 8 (or
-              OpenJDK) rather than building your own. This will allow you
-              to build only that part of the OpenJDK sources which correspond
-              to that project.
-
-    NetBeans 7.0 or later
-        Older versions may also work but are unsupported.
-
-    jtreg
-        "jtreg" is the test harness for running OpenJDK's regression tests.
-        Get it from http://openjdk.java.net/jtreg
-
-    Ant
-       NetBeans comes with ant, but if you use a separately-installed copy
-       please make sure that it is at least version 1.8.1.
-
-Configuring
-    Building OpenJDK is hard and complex. No, strike that. While it's not
-    exactly "easy", we've got it down to *relatively* small set of
-    properties you need to set.
-
-    The NetBeans projects provided here share a fair amount of common
-    structure. They share properties values where it makes sense. Each
-    project loads properties from these properties files, in this order
-
-        ${basedir}/nbproject/private/build.properties
-        $HOME/.openjdk/${ant.project.name}-build.properties
-        $HOME/.openjdk/build.properties
-        ${basedir}/build.properties
-
-    (${basedir} refers to the directory containing a particular NetBeans
-    project.) The first time a property defined determines value: it is
-    *not* overridden if it is read from properties files read later. The net
-    result is that by carefully choosing where to define a property, you can
-    have it for a specific project, all uses of a specific project (useful
-    if you work on multiple copies of the OpenJDK sources), all projects, or
-    only projects in a specific sandbox.
-
-    With that in mind, please set the following properties. Presuming you
-    want the same values for all your work, set them in
-    $HOME/.openjdk/build.properties.
-
-    * bootstrap.jdk
-        Set to the location where you installed JDK 7.
-
-    * jtreg.home
-        Set to the location where you installed jtreg.
-
-    * make.options
-        Some of the projects invoke "make", since they compile native code.
-        The make.options property is for passing information about what you
-        installed where to make.  Change the paths to fit your particular
-        situation:
-