Hi,

I tried out your changes locally, and with Yasumasa's change and the following 
diff [1], I can confirm that this works on my setup (VS2019 devkit w/ Cygwin). 
I'll give a spin with WSL1 and WSL2, as well as VS2017.

[1] Diff to fix support for VS2019

--- a/make/autoconf/toolchain_microsoft.m4
+++ b/make/autoconf/toolchain_microsoft.m4
@@ -628,9 +606,9 @@ AC_DEFUN([TOOLCHAIN_SETUP_VS_RUNTIME_DLLS],
   fi

   AC_ARG_WITH(vcruntime-1-dll, [AS_HELP_STRING([--with-vcruntime-1-dll],
       [path to microsoft C++ runtime dll (vcruntime*_1.dll) (Windows x64 only) 
@<:@probed@:>@])])

-  if test "x$VCRUNTIME_1_NAME" != "x" && test "x$OPENJDK_TARGET_BITS" = x64; 
then
+  if test "x$VCRUNTIME_1_NAME" != "x" && test "x$OPENJDK_TARGET_CPU_BITS" = 
x64; then
     if test "x$with_vcruntime_1_dll" != x; then
       # If given explicitly by user, do not probe. If not present, fail 
directly.
       TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($VCRUNTIME_1_NAME, 
[$with_vcruntime_1_dll],

I also want to propose integrating the bits to support cross-compilation with 
the microsoft toolchain as part of your change, even without adding the 
targetting for Windows-AArch64. The following diff [2] integrates such support 
for cross-compilation without adding Windows-AArch64:

[2] Diff to add support for cross-compilation

commit c23c78e33e57955d3f344383619592f34b84169b
Author: Ludovic Henry <luhe...@microsoft.com>
Date:   Tue Jul 7 11:35:41 2020 -0700

    8248498: Add build system support for Windows AArch64 (Part 1)

    This adds support for cross-compilation on Windows, without adding the
    AArch64 specific bits.

    https://bugs.openjdk.java.net/browse/JDK-8248498

diff --git a/make/autoconf/basic.m4 b/make/autoconf/basic.m4
index 7248163242d..60b4097cba9 100644
--- a/make/autoconf/basic.m4
+++ b/make/autoconf/basic.m4
@@ -111,6 +111,16 @@ AC_DEFUN([BASIC_EVAL_DEVKIT_VARIABLE],
   fi
 ])

+###############################################################################
+# Evaluates platform specific overrides for build devkit variables.
+# $1: Name of variable
+AC_DEFUN([BASIC_EVAL_BUILD_DEVKIT_VARIABLE],
+[
+  if test "x[$]$1" = x; then
+    eval $1="\${$1_${OPENJDK_BUILD_CPU}}"
+  fi
+])
+
 ###############################################################################
 AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT],
 [
diff --git a/make/autoconf/flags-ldflags.m4 b/make/autoconf/flags-ldflags.m4
index a2a52f98ef7..8af9a20b5e8 100644
--- a/make/autoconf/flags-ldflags.m4
+++ b/make/autoconf/flags-ldflags.m4
@@ -164,15 +164,14 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_CPU_DEP],
     fi

   elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
-    if test "x${OPENJDK_$1_CPU}" = "xx86"; then
-      $1_CPU_LDFLAGS="-safeseh"
-      # NOTE: Old build added -machine. Probably not needed.
-      $1_CPU_LDFLAGS_JVM_ONLY="-machine:I386"
+    if test "x${OPENJDK_$1_CPU_BITS}" = "x32"; then
       $1_CPU_EXECUTABLE_LDFLAGS="-stack:327680"
-    else
-      $1_CPU_LDFLAGS_JVM_ONLY="-machine:AMD64"
+    elif test "x${OPENJDK_$1_CPU_BITS}" = "x64"; then
       $1_CPU_EXECUTABLE_LDFLAGS="-stack:1048576"
     fi
+    if test "x${OPENJDK_$1_CPU}" = "xx86"; then
+      $1_CPU_LDFLAGS="-safeseh"
+    fi
   fi

   # JVM_VARIANT_PATH depends on if this is build or target...
diff --git a/make/autoconf/flags.m4 b/make/autoconf/flags.m4
index 694d41052ba..8cbf306ab0c 100644
--- a/make/autoconf/flags.m4
+++ b/make/autoconf/flags.m4
@@ -204,32 +204,36 @@ AC_DEFUN_ONCE([FLAGS_SETUP_USER_SUPPLIED_FLAGS],
 # Param 1 - Optional prefix to all variables. (e.g BUILD_)
 AC_DEFUN([FLAGS_SETUP_SYSROOT_FLAGS],
 [
-  if test "x[$]$1SYSROOT" != "x"; then
-    if test "x$TOOLCHAIN_TYPE" = xgcc; then
-      $1SYSROOT_CFLAGS="--sysroot=[$]$1SYSROOT"
-      $1SYSROOT_LDFLAGS="--sysroot=[$]$1SYSROOT"
-    elif test "x$TOOLCHAIN_TYPE" = xclang; then
-      $1SYSROOT_CFLAGS="-isysroot [$]$1SYSROOT"
-      $1SYSROOT_LDFLAGS="-isysroot [$]$1SYSROOT"
-    fi
-  fi
-
-  if test "x$OPENJDK_TARGET_OS" = xmacosx; then
-    # We also need -iframework<path>/System/Library/Frameworks
-    $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -iframework 
[$]$1SYSROOT/System/Library/Frameworks"
-    $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -iframework 
[$]$1SYSROOT/System/Library/Frameworks"
-    # These always need to be set, or we can't find the frameworks embedded in 
JavaVM.framework
-    # set this here so it doesn't have to be peppered throughout the forest
-    $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -F 
[$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
-    $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -F 
[$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
-  fi
-
   # For the microsoft toolchain, we need to get the SYSROOT flags from the
   # Visual Studio environment. Currently we cannot handle this as a separate
   # build toolchain.
-  if test "x$1" = x && test "x$OPENJDK_BUILD_OS" = "xwindows" \
-      && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
-    TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV
+  if test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
+    # The BUILD_* flags are setup in TOOLCHAIN_SETUP_BUILD_COMPILERS
+    if test "x$1" = x; then
+      TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV
+    fi
+
+    TOOLCHAIN_SETUP_VISUAL_STUDIO_SYSROOT_FLAGS([$1])
+  else
+    if test "x[$]$1SYSROOT" != "x"; then
+      if test "x$TOOLCHAIN_TYPE" = xgcc; then
+        $1SYSROOT_CFLAGS="--sysroot=[$]$1SYSROOT"
+        $1SYSROOT_LDFLAGS="--sysroot=[$]$1SYSROOT"
+      elif test "x$TOOLCHAIN_TYPE" = xclang; then
+        $1SYSROOT_CFLAGS="-isysroot [$]$1SYSROOT"
+        $1SYSROOT_LDFLAGS="-isysroot [$]$1SYSROOT"
+      fi
+    fi
+
+    if test "x$OPENJDK_TARGET_OS" = xmacosx; then
+      # We also need -iframework<path>/System/Library/Frameworks
+      $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -iframework 
[$]$1SYSROOT/System/Library/Frameworks"
+      $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -iframework 
[$]$1SYSROOT/System/Library/Frameworks"
+      # These always need to be set, or we can't find the frameworks embedded 
in JavaVM.framework
+      # set this here so it doesn't have to be peppered throughout the forest
+      $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -F 
[$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
+      $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -F 
[$]$1SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks"
+    fi
   fi

   AC_SUBST($1SYSROOT_CFLAGS)
@@ -373,7 +377,8 @@ AC_DEFUN_ONCE([FLAGS_POST_TOOLCHAIN],
 [
   FLAGS_SETUP_TOOLCHAIN_CONTROL

-  if test "x$BUILD_SYSROOT" != x; then
+  if test "x$BUILD_SYSROOT" != x || \
+      test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
     FLAGS_SETUP_SYSROOT_FLAGS([BUILD_])
   else
     if test "x$COMPILE_TYPE" != "xcross"; then
diff --git a/make/autoconf/toolchain.m4 b/make/autoconf/toolchain.m4
index 14213f896d4..4a2462c2dd6 100644
--- a/make/autoconf/toolchain.m4
+++ b/make/autoconf/toolchain.m4
@@ -798,14 +798,18 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
           . $CONFIGURESUPPORT_OUTPUTDIR/build-devkit.info
           # This potentially sets the following:
           # A descriptive name of the devkit
-          BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_NAME])
+          BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_NAME])
           # Corresponds to --with-extra-path
-          BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_EXTRA_PATH])
+          BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_EXTRA_PATH])
           # Corresponds to --with-toolchain-path
-          BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_TOOLCHAIN_PATH])
+          BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_TOOLCHAIN_PATH])
           # Corresponds to --with-sysroot
-          BASIC_EVAL_DEVKIT_VARIABLE([BUILD_DEVKIT_SYSROOT])
-          # Skip the Window specific parts
+          BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_SYSROOT])
+
+          if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+            BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_VS_INCLUDE])
+            BASIC_EVAL_BUILD_DEVKIT_VARIABLE([BUILD_DEVKIT_VS_LIB])
+          fi
         fi

         AC_MSG_CHECKING([for build platform devkit])
@@ -817,11 +821,17 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],

         BUILD_SYSROOT="$BUILD_DEVKIT_SYSROOT"

-         # Fallback default of just /bin if DEVKIT_PATH is not defined
+        # Fallback default of just /bin if DEVKIT_PATH is not defined
         if test "x$BUILD_DEVKIT_TOOLCHAIN_PATH" = x; then
           BUILD_DEVKIT_TOOLCHAIN_PATH="$BUILD_DEVKIT_ROOT/bin"
         fi
-        PATH="$BUILD_DEVKIT_TOOLCHAIN_PATH:$BUILD_DEVKIT_EXTRA_PATH"
+
+        
UTIL_PREPEND_TO_PATH([PATH],"$BUILD_DEVKIT_TOOLCHAIN_PATH:$BUILD_DEVKIT_EXTRA_PATH")
+
+        if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+          BUILD_VS_INCLUDE="${BUILD_DEVKIT_VS_INCLUDE//;/:}"
+          BUILD_VS_LIB="${BUILD_DEVKIT_VS_LIB//;/:}"
+        fi
       fi
     fi

@@ -836,9 +846,27 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
     UTIL_LOOKUP_PROGS(BUILD_STRIP, strip)
     # Assume the C compiler is the assembler
     BUILD_AS="$BUILD_CC -c"
-    # Just like for the target compiler, use the compiler as linker
-    BUILD_LD="$BUILD_CC"
-    BUILD_LDCXX="$BUILD_CXX"
+    if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
+      # In the Microsoft toolchain we have a separate LD command "link".
+      UTIL_LOOKUP_TOOLCHAIN_PROGS(BUILD_LD, link)
+
+      # Make sure we did not pick up /usr/bin/link, which is the unix-style
+      # link executable.
+      AC_MSG_CHECKING([if the found link.exe is actually the Visual Studio 
linker])
+      $BUILD_LD --version > /dev/null
+      if test $? -eq 0 ; then
+        AC_MSG_RESULT([no])
+        AC_MSG_ERROR([This is the winenv link tool. Please check your PATH and 
rerun configure.])
+      else
+        AC_MSG_RESULT([yes])
+      fi
+
+      BUILD_LDCXX="$BUILD_LD"
+    else
+      # Just like for the target compiler, use the compiler as linker
+      BUILD_LD="$BUILD_CC"
+      BUILD_LDCXX="$BUILD_CXX"
+    fi

     PATH="$OLDPATH"

@@ -879,7 +907,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS],
   # Check for extra potential brokenness.
   if test  "x$TOOLCHAIN_TYPE" = xmicrosoft; then
     # On Windows, double-check that we got the right compiler.
-    CC_VERSION_OUTPUT=`$COMPILER 2>&1 1>/dev/null | $GREP -v 
'ERROR.*UtilTranslatePathList' | $HEAD -n 1 | $TR -d '\r'`
+    CC_VERSION_OUTPUT=`$CC 2>&1 1>/dev/null | $GREP -v 
'ERROR.*UtilTranslatePathList' | $HEAD -n 1 | $TR -d '\r'`
     COMPILER_CPU_TEST=`$ECHO $CC_VERSION_OUTPUT | $SED -n "s/^.* \(.*\)$/\1/p"`
     if test "x$OPENJDK_TARGET_CPU" = "xx86"; then
       if test "x$COMPILER_CPU_TEST" != "x80x86" -a "x$COMPILER_CPU_TEST" != 
"xx86"; then
diff --git a/make/autoconf/toolchain_microsoft.m4 
b/make/autoconf/toolchain_microsoft.m4
index fd8dfc3641d..2e297dc8be1 100644
--- a/make/autoconf/toolchain_microsoft.m4
+++ b/make/autoconf/toolchain_microsoft.m4
@@ -309,8 +309,8 @@ AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO],
     eval VS_SUPPORTED="\${VS_SUPPORTED_${VS_VERSION}}"
     eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"

-    VS_INCLUDE=${DEVKIT_VS_INCLUDE//;/:}
-    VS_LIB=${DEVKIT_VS_LIB//;/:}
+    VS_INCLUDE="${DEVKIT_VS_INCLUDE//;/:}"
+    VS_LIB="${DEVKIT_VS_LIB//;/:}"

     AC_MSG_NOTICE([Found devkit $VS_DESCRIPTION])

@@ -426,21 +426,6 @@ AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV],

       # Turn VS_PATH into TOOLCHAIN_PATH
       TOOLCHAIN_PATH="$TOOLCHAIN_PATH:$VS_PATH"
-
-      # Convert VS_INCLUDE into SYSROOT_CFLAGS
-      OLDIFS="$IFS"
-      IFS=":"
-
-      for ipath in $VS_INCLUDE; do
-        SYSROOT_CFLAGS="$SYSROOT_CFLAGS -I$ipath"
-      done
-
-      # Convert VS_LIB into SYSROOT_LDFLAGS
-      for libpath in $VS_LIB; do
-        SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS -libpath:$libpath"
-      done
-
-      IFS="$OLDIFS"
     fi
   else
     AC_MSG_RESULT([not found])
@@ -488,22 +473,20 @@ AC_DEFUN([TOOLCHAIN_SETUP_MSVC_DLL],
   DLL_NAME="$1"
   MSVC_DLL=

+  if test "x$OPENJDK_TARGET_CPU" = xx86; then
+    vs_target_cpu=x86
+  elif test "x$OPENJDK_TARGET_CPU" = xx86_64; then
+    vs_target_cpu=x64
+  fi
+
   if test "x$MSVC_DLL" = x; then
     if test "x$VCINSTALLDIR" != x; then
       if test "$VS_VERSION" -lt 2017; then
         # Probe: Using well-known location from Visual Studio 12.0 and older
-        if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
-          
POSSIBLE_MSVC_DLL="$VCINSTALLDIR/redist/x64/microsoft.vc${VS_VERSION_INTERNAL}.crt/$DLL_NAME"
-        else
-          
POSSIBLE_MSVC_DLL="$VCINSTALLDIR/redist/x86/microsoft.vc${VS_VERSION_INTERNAL}.crt/$DLL_NAME"
-        fi
+        
POSSIBLE_MSVC_DLL="$VCINSTALLDIR/redist/$vs_target_cpu/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME"
       else
         # Probe: Using well-known location from VS 2017 and VS 2019
-        if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
-          POSSIBLE_MSVC_DLL="`ls 
$VCToolsRedistDir/x64/microsoft.vc${VS_VERSION_INTERNAL}.crt/$DLL_NAME`"
-        else
-          POSSIBLE_MSVC_DLL="`ls 
$VCToolsRedistDir/x86/microsoft.vc${VS_VERSION_INTERNAL}.crt/$DLL_NAME`"
-        fi
+        POSSIBLE_MSVC_DLL="`ls 
$VCToolsRedistDir/$vs_target_cpu/microsoft.vc${VS_VERSION_INTERNAL}.crt/$DLL_NAME`"
       fi
       # In case any of the above finds more than one file, loop over them.
       for possible_msvc_dll in $POSSIBLE_MSVC_DLL; do
@@ -537,13 +520,8 @@ AC_DEFUN([TOOLCHAIN_SETUP_MSVC_DLL],
       WIN_VS_TOOLS_DIR="$VS100COMNTOOLS/.."
       UTIL_FIXUP_PATH(WIN_VS_TOOLS_DIR, NOFAIL)
       if test "x$WIN_VS_TOOLS_DIR" != x; then
-        if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
-          POSSIBLE_MSVC_DLL=`$FIND "$WIN_VS_TOOLS_DIR" -name $DLL_NAME \
-          | $GREP -i /x64/ | $HEAD --lines 1`
-        else
-          POSSIBLE_MSVC_DLL=`$FIND "$WIN_VS_TOOLS_DIR" -name $DLL_NAME \
-          | $GREP -i /x86/ | $HEAD --lines 1`
-        fi
+        POSSIBLE_MSVC_DLL=`$FIND "$WIN_VS_TOOLS_DIR" -name $DLL_NAME \
+          | $GREP -i /$vs_target_cpu/ | $HEAD --lines 1`
         TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL([$DLL_NAME], [$POSSIBLE_MSVC_DLL],
             [search of VS100COMNTOOLS])
       fi
@@ -554,17 +532,17 @@ AC_DEFUN([TOOLCHAIN_SETUP_MSVC_DLL],
     # Probe: Search wildly in the VCINSTALLDIR. We've probably lost by now.
     # (This was the original behaviour; kept since it might turn something up)
     if test "x$VCINSTALLDIR" != x; then
-      if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
-        POSSIBLE_MSVC_DLL=`$FIND "$VCINSTALLDIR" -name $DLL_NAME \
-        | $GREP x64 | $HEAD --lines 1`
-      else
+      if test "x$vs_target_cpu" = xx86; then
         POSSIBLE_MSVC_DLL=`$FIND "$VCINSTALLDIR" -name $DLL_NAME \
-        | $GREP x86 | $GREP -v ia64 | $GREP -v x64 | $HEAD --lines 1`
+          | $GREP x86 | $GREP -v ia64 | $GREP -v x64 | $GREP -v arm64 | $HEAD 
--lines 1`
         if test "x$POSSIBLE_MSVC_DLL" = x; then
           # We're grasping at straws now...
           POSSIBLE_MSVC_DLL=`$FIND "$VCINSTALLDIR" -name $DLL_NAME \
-          | $HEAD --lines 1`
+            | $HEAD --lines 1`
         fi
+      else
+        POSSIBLE_MSVC_DLL=`$FIND "$VCINSTALLDIR" -name $DLL_NAME \
+          | $GREP $vs_target_cpu | $HEAD --lines 1`
       fi

       TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL([$DLL_NAME], [$POSSIBLE_MSVC_DLL],
@@ -628,9 +606,9 @@ AC_DEFUN([TOOLCHAIN_SETUP_VS_RUNTIME_DLLS],
   fi

   AC_ARG_WITH(vcruntime-1-dll, [AS_HELP_STRING([--with-vcruntime-1-dll],
-      [path to microsoft C++ runtime dll (vcruntime*_1.dll) (Windows x64 only) 
@<:@probed@:>@])])
+      [path to microsoft C++ runtime dll (vcruntime*_1.dll) (Windows 64-bits 
only) @<:@probed@:>@])])

-  if test "x$VCRUNTIME_1_NAME" != "x" && test "x$OPENJDK_TARGET_BITS" = x64; 
then
+  if test "x$VCRUNTIME_1_NAME" != "x" && test "x$OPENJDK_TARGET_CPU_BITS" = 
x64; then
     if test "x$with_vcruntime_1_dll" != x; then
       # If given explicitly by user, do not probe. If not present, fail 
directly.
       TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($VCRUNTIME_1_NAME, 
[$with_vcruntime_1_dll],
@@ -695,3 +673,25 @@ AC_DEFUN([TOOLCHAIN_SETUP_VS_RUNTIME_DLLS],
   fi
   AC_SUBST(UCRT_DLL_DIR)
 ])
+
+# Setup the sysroot flags and add them to global CFLAGS and LDFLAGS so
+# that configure can use them while detecting compilers.
+# TOOLCHAIN_TYPE is available here.
+# Param 1 - Optional prefix to all variables. (e.g BUILD_)
+AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_SYSROOT_FLAGS],
+[
+  OLDIFS="$IFS"
+  IFS=":"
+
+  # Convert $1VS_INCLUDE into $1SYSROOT_CFLAGS
+  for ipath in [$]$1VS_INCLUDE; do
+    $1SYSROOT_CFLAGS="[$]$1SYSROOT_CFLAGS -I$ipath"
+  done
+
+  # Convert $1VS_LIB into $1SYSROOT_LDFLAGS
+  for libpath in [$]$1VS_LIB; do
+    $1SYSROOT_LDFLAGS="[$]$1SYSROOT_LDFLAGS -libpath:$libpath"
+  done
+
+  IFS="$OLDIFS"
+])
diff --git a/make/hotspot/gensrc/GensrcAdlc.gmk 
b/make/hotspot/gensrc/GensrcAdlc.gmk
index 0947133c16e..bcdea62590d 100644
--- a/make/hotspot/gensrc/GensrcAdlc.gmk
+++ b/make/hotspot/gensrc/GensrcAdlc.gmk
@@ -88,6 +88,10 @@ ifeq ($(call check-jvm-feature, compiler2), true)
     ADLCFLAGS += -DAIX=1
   else ifeq ($(call isTargetOs, macosx), true)
     ADLCFLAGS += -D_ALLBSD_SOURCE=1 -D_GNU_SOURCE=1
+  else ifeq ($(call isTargetOs, windows), true)
+    ifeq ($(call isTargetCpuBits, 64), true)
+      ADLCFLAGS += -D_WIN64=1
+    endif
   endif

   ifeq ($(call isTargetOs, windows), false)
diff --git a/make/modules/java.base/gensrc/GensrcMisc.gmk 
b/make/modules/java.base/gensrc/GensrcMisc.gmk
index cd12f2ab318..5390fcabe85 100644
--- a/make/modules/java.base/gensrc/GensrcMisc.gmk
+++ b/make/modules/java.base/gensrc/GensrcMisc.gmk
@@ -60,6 +60,10 @@ ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang), )
   CPP_FLAGS += -x c
 else ifeq ($(TOOLCHAIN_TYPE), microsoft)
   CPP_FLAGS += -nologo
+
+  # cl.exe does only recognize few file extensions as valid (ex: .c, .h, 
.cpp), so
+  # make sure *.java.template files are recognized as valid input files
+  CPP_FILEPREFIX = -Tc
 endif

 # Generate a java source file from a template through the C preprocessor for 
the
@@ -73,7 +77,7 @@ define generate-preproc-src
        $(call MakeDir, $(@D))
        $(call ExecuteWithLog, $(SUPPORT_OUTPUTDIR)/gensrc/java.base/_$(@F), \
            ( $(NAWK) '/@@END_COPYRIGHT@@/{exit}1' $< && \
-             $(CPP) $(CPP_FLAGS) $(SYSROOT_CFLAGS) $(CFLAGS_JDKLIB) $< \
+             $(CPP) $(CPP_FLAGS) $(SYSROOT_CFLAGS) $(CFLAGS_JDKLIB) 
$(CPP_FILEPREFIX) $< \
                  2> >($(GREP) -v '^$(<F)$$' >&2) \
                  | $(NAWK) '/@@START_HERE@@/,0' \
                  |  $(SED) -e 's/@@START_HERE@@/\/\/ AUTOMATICALLY GENERATED 
FILE - DO NOT EDIT/' \

Thank you,

--
Ludovic


________________________________________
From: build-dev <build-dev-r...@openjdk.java.net> on behalf of Yasumasa Suenaga 
<suen...@oss.nttdata.com>
Sent: Sunday, July 5, 2020 19:19
To: Magnus Ihse Bursie; build-dev
Subject: Re: Preliminary review for new WINENV support

Hi Magnus,

It's awesome work! I tested your patch, but I saw some errors (configure 
--enable-debug --with-boot-jdk=/path/to/jdk14):


1) script error
checking for gdiff... 
/mnt/d/test/jdk-master/build/.configure-support/generated-configure.sh: line 
9989: test: /mnt/c/Program: binary operator expected
/mnt/d/test/jdk-master/build/.configure-support/generated-configure.sh: line 
9993: test: /mnt/c/Program: binary operator expected
/mnt/d/test/jdk-master/build/.configure-support/generated-configure.sh: line 
9989: test: too many arguments

2) warning in awk
configure: Found potential Boot JDK using configure arguments
gawk: cmd. line:1: warning: regexp escape sequence `\"' is not a known regexp 
operator
checking for Boot JDK... /mnt/c/java/jdk-14.0.1

3) command not found at fixpath.sh (it happens on `make images`)
/mnt/d/test/jdk-master/make/scripts/fixpath.sh: line 402: 
/mnt/d/test/jdk-master/build/windows-x86_64-server-fastdebug/jdk/bin/java: No 
such file or directory


I fixed them with following patch, and it works fine on my WSL 1.

```
diff --git a/make/autoconf/boot-jdk.m4 b/make/autoconf/boot-jdk.m4
index 7059558b2..db73eba15 100644
--- a/make/autoconf/boot-jdk.m4
+++ b/make/autoconf/boot-jdk.m4
@@ -77,7 +77,7 @@ AC_DEFUN([BOOTJDK_DO_CHECK],
            # Additional [] needed to keep m4 from mangling shell constructs.
            java_to_test="$BOOT_JDK/bin/java"
            UTIL_FIXUP_EXECUTABLE(java_to_test)
-          [ BOOT_JDK_VERSION=`$java_to_test $USER_BOOT_JDK_OPTIONS -version 
2>&1 | $AWK '/version \"[0-9a-zA-Z\._\-]+\"/{print $ 0; exit;}'` ]
+          [ BOOT_JDK_VERSION=`$java_to_test $USER_BOOT_JDK_OPTIONS -version 
2>&1 | $AWK '/version "[0-9a-zA-Z\._\-]+"/{print $ 0; exit;}'` ]
            if [ [[ "$BOOT_JDK_VERSION" =~ "Picked up" ]] ]; then
              AC_MSG_NOTICE([You have _JAVA_OPTIONS or JAVA_TOOL_OPTIONS set. 
This can mess up the build. Please use --with-boot-jdk-jvmargs instead.])
              AC_MSG_NOTICE([Java reports: "$BOOT_JDK_VERSION".])
diff --git a/make/autoconf/util_paths.m4 b/make/autoconf/util_paths.m4
index 8dec82fdc..3d20d1700 100644
--- a/make/autoconf/util_paths.m4
+++ b/make/autoconf/util_paths.m4
@@ -377,11 +377,11 @@ AC_DEFUN([UTIL_LOOKUP_PROGS],
              continue
            fi
            full_path="$elem/$name"
-          if test ! -e $full_path && test "x$OPENJDK_BUILD_OS" = "xwindows"; 
then
+          if test ! -e "$full_path" && test "x$OPENJDK_BUILD_OS" = "xwindows"; 
then
              # Try again with .exe
              full_path="$elem/$name.exe"
            fi
-          if test -e $full_path; then
+          if test -e "$full_path"; then
              $1="$full_path"
              UTIL_FIXUP_EXECUTABLE($1, $3)
              result="[$]$1"
diff --git a/make/scripts/fixpath.sh b/make/scripts/fixpath.sh
index 14eacbec6..f8293a798 100644
--- a/make/scripts/fixpath.sh
+++ b/make/scripts/fixpath.sh
@@ -393,6 +393,10 @@ function exec_command_line() {
      fi
    done

+  if [ ! -e "$command" ]; then
+    command="$command".exe
+  fi
+
    # Now execute it
    if [[ -v DEBUG_FIXPATH ]]; then
      echo fixpath: debug: "$command" "${collected_args[@]}" >&2
```

I tried to build on WSL 2, but I couldn't because the process seemed to hangup.
configure script could work normally, but I saw following message on my console 
in the end.
I guess it is not an issue in your patch because I haven't seen it on WSL 1.

```
cat: standard output: No such file or directory
```

Also I saw LNK1158 error as following, but it might be caused by my environment 
- my Windows box has been installed both Visual Studio 2019 and Windows SDK.
(My PC is set locale to Japanese, sorry :)

* For target hotspot_variant-server_libjvm_objs_BUILD_LIBJVM_link:
    ????? 
d:\test\jdk-master\build\windows-x86_64-server-fastdebug\hotspot\variant-server\libjvm\objs\jvm.lib
 ??????? 
d:\test\jdk-master\build\windows-x86_64-server-fastdebug\hotspot\variant-server\libjvm\objs\jvm.exp
 ????
LINK : fatal error LNK1158: 'rc.exe' ?????????

I could solve the problem in the way the following URL indicate.

https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F35215971%2Flnk1158-cannot-run-rc-exe-x64-visual-studio&amp;data=02%7C01%7Cluhenry%40microsoft.com%7C0af6353951e7444afe0f08d8215372b6%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637295989593225573&amp;sdata=NAyBUTKSQF8PrSgfa5nQADyYvzWdo4Ipi4csjjLiENc%3D&amp;reserved=0


Thanks,

Yasumasa


On 2020/07/05 9:08, Magnus Ihse Bursie wrote:
> I've been working for some time on a complete rewrite of how we handle the 
> pecularities of the Windows build environment. This new solution supports 
> Cygwin, Msys2, WSL1 and WSL2 (after a fashion, see below), what I have termed 
> different "winenvs".
>
> One of the main design goals has been to minimize the difference for the 
> configure script and make files for the different winenvs, and leverage as 
> much shared code between them as possible. Another has been to try to collect 
> all the "trickiness" needed in as few places as possible, ideally just one, 
> instead of having it spread out all over the configure script. A third design 
> goal has been to prepare for cross-compilation for Windows from Linux, using 
> Wine.
>
> It pretty soon turned out that I needed to get a better grip on how we detect 
> tools in configure, so a complete overhaul of this is included in the change. 
> Now we have more or less fully parted with the original autoconf functions, 
> which has long been too limited for us, and now finally has reached their end 
> of usefulness.
>
> At this point, I have a prototype / preview that basically works, but has 
> some limitations.
>
> I'd like to ask anyone interested in building OpenJDK on Windows to take the 
> patch for a spin. Especially if you have an esoteric or exotic setup!
>
> Webrev: 
> https://nam06.safelinks.protection.outlook.com/?url=http:%2F%2Fcr.openjdk.java.net%2F~ihse%2Fwinenv-preview-1%2Fwebrev.01%2F&amp;data=02%7C01%7Cluhenry%40microsoft.com%7C0af6353951e7444afe0f08d8215372b6%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637295989593225573&amp;sdata=x2l2BWhjrvdlMRN3NdZFEU0Vq3mv7SSLiSG9nk7bYE4%3D&amp;reserved=0
>
> (If you prefer, you can check out the branch "ihse-winenv-branch" on 
> https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fhg.openjdk.java.net%2Fjdk%2Fsandbox%2F&amp;data=02%7C01%7Cluhenry%40microsoft.com%7C0af6353951e7444afe0f08d8215372b6%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637295989593235570&amp;sdata=jUbEnTaogeVOgP%2BjSe2JyFH1wyx2eX6rBw%2F3ydXlnkI%3D&amp;reserved=0
>  instead of downloading the patch from the webrev.)
>
> I am leaving on vacation next week, so I won't be doing any more work on this 
> for a while, but I promise to read all emails when I get back and try to 
> rectify all issues that are reported. This means you have some time to try it 
> out, too.
>
> Here are some technical notes of what is changing, compared to the current 
> Windows build.
>
> The native "fixpath.exe" tool is gone. This means that we do not need to 
> compile it during configure, which was always tricky to get right (mostly 
> since we did not have fixpath in place to help us...).
>
> Instead, there is a new fixpath.sh shell script, that does the same job, and 
> more. The script is written in highly optimized shell code (yeah, I see the 
> oxymoron) so only bash internal functionality is used, to avoid calling 
> external tools, which is expensive on Windows. This makes the performance 
> practically roughly at par with the native fixpath.exe.
>
> Fixpath also has a "print" and "import" mode, apart from the 
> traditional"exec" mode. This makes it possible to use the same tool for 
> converting individual paths at runtime to Windows style ("print"), and it 
> takes the logic needed to "import" paths given by the user to configure, into 
> a format usable internally by the build system, and moves it into a 
> centralized location in the fixpath script.
>
> A "winenv" is defined by a quartet of variables: PATHTOOL, DRIVEPREFIX, 
> ENVROOT and WINTEMP. For instance, for "cygwin", these are:
>   PATHTOOL=cygpath
>   DRIVEPREFIX=/cygdrive (typically)
>   ENVROOT=C:\Cygwin64 (typically)
>   WINTEMP=/tmp
>
> These are needed for fixpath to do it's magic. Fixpath can auto-detect those, 
> but to save on execution time they are normally detected by configure and 
> sent as arguments to fixpath.
>
> Detection of the Visual Studio environment has been massively simplified. 
> Using fixpath, conversion between Windows and unix paths is not so complex 
> anymore. The bridge Windows batch file that is needed to extract the 
> environment variables is no longer created on the fly, but is instead stored 
> in make/scripts/extract-vs-env.cmd. This is called with fixpath, so all 
> arguments to it can be unix paths.
>
> Furthermore, TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV is now clearly designed to 
> have a single responsibility, to set SYSROOT flags (and TOOLCHAIN_PATH) for 
> the microsoft toolchain. As a result of this, it is now called from 
> FLAGS_SETUP_SYSROOT_FLAGS. Also, the file toolchain_windows.m4 is now more 
> correctly named toolchain_microsoft.m4. A price we had to pay for this was 
> that the old idea that you should be able to start a "Visual Studio console" 
> and then run configure from it to extract the variables do not work anymore. 
> (It had not been tested for ages, and might have been broken anyway.)
>
> Fixpath also knows about the difference between unix path lists 
> (/foo/bar:/my/dir) and windows path lists (c:\dir;d:\data) and can convert 
> freely and automatically between them. This furthermore means that PATH_SEP 
> is removed, and we only use unix style (colon separated) path lists 
> internally.
>
> The logic automatically detects if and when .exe is needed, so EXE_SUFFIX is 
> removed too. There are some limitations; when code needs to explicitly test 
> for the presence of a file, the suffix needs to be correct. Also when make 
> files check for e.g. the generated bin/java.exe, the suffix needs to be 
> present. For this, I have introduced an EXECUTABLE_SUFFIX, that has the same 
> value as EXE_SUFFIX -- but not the same semantics! The old code added 
> EXE_SUFFIX here and there, not caring about if we meant "microsoft" as a 
> toolchain or if we were running on Windows as a build platform. Clearly not 
> well adapted for future cross-compilation.
>
> The old ways of locating programs in configure were messy, complicated and 
> not always correct. We used a mixture of the original autoconf macros, and 
> our own UTIL_PATH_PROGS and UTIL_CHECK_TOOLS. These did not have very well 
> defined semantics, and were frequently mixed up. Also, UTIL_CHECK_TOOLS 
> required UTIL_FIXUP_EXECUTABLE tobe called afterwards, to "rewrite" the 
> result in a second step. This was not needed after UTIL_PATH_PROGS but was 
> frequently done anyway to "be on the safe side".
>
> I have now replaced:
>    AC_(PATH|CHECK)_(PROG|PROGS) with UTIL_LOOKUP_PROGS
>    AC_(PATH|CHECK)_(TOOL|TOOLS) with UTIL_LOOKUP_TOOLCHAIN_PROGS
>
> This is actually almost the same semantic, but unless you're an autoconf 
> aficionado, you ar not likely to understand the difference     between "PROG" 
> and "TOOL". The only difference is that UTIL_LOOKUP_TOOLCHAIN_PROGS will try 
> to look for "host-prefixed" tools first, when cross-compiling, and should 
> therefore be used for all toolchain lookups.
>
> There is also a fail-fast version of both, UTIL_REQUIRE_PROGS and 
> UTIL_REQUIRE_TOOLCHAIN_PROGS.
>
> UTIL_LOOKUP_PROGS is the core function, with the rest being thin wrappers 
> around it. This function is created from scratch, to do exactly what we want, 
> on Unix platforms and Windows. So there is no need anymore to call 
> UTIL_FIXUP_EXECUTABLE, unless you have input from elsewhere (e.g. user flag) 
> that you need to verify. I have also collected all this logic in a single 
> file, util_paths.m4, moving parts from util.m4, and just removing 
> util_windows.m4.
>
> UTIL_LOOKUP_PROGS will use the new and nifty function 
> UTIL_CHECK_WINENV_EXEC_TYPE, which will automatically determine if an 
> executable needs to be prefixed by fixpath! That means that you can match and 
> mix Windows-style and Unix-style programs however you like, with very few 
> limitations. For instance, you can have a Linux version of the BootJDK on 
> WSL. For this to work, the $FIXPATH prefix is now stored in the variables 
> themselves (e.g. in $CC), rather than added as @FIXPATH@ in spec.gmk.in. This 
> has generally worked out OK, but caused some headaches when the code thought 
> that $CC (etc) was not a way to launch a program, but was a file that could 
> be tested for existence, etc.
>
> I reintroduced support for msys2. This was mostly free, since msys2 is so 
> close to cygwin (which msys never where). To underline the difference, I 
> renamed the winenv windows.msys2 (instead of windows.msys). Msys (version 1) 
> will never be supported in modern OpenJDK due to critical packages being far 
> too old, and not updated. I also clearly separate between WSL1 (which is 
> using a kernel emulation layer, somewhat like Wine) and WSL2 (which is using 
> a Hyper-V VM to run an actual Linux kernel), as windows.wsl1 and windows.wsl2.
>
> I have also done a ton of small fixes, to make things more convenient and 
> smooth when working in these winenvs. I have adjusted the output from 
> configure to be less verbose and more streamlined. Overall, a lot of odd code 
> in configure has been removed. A few changes that are strictly unneeded for 
> this patch has also been included; mostly removal of dead code I came across, 
> and a few fixes for additional debuggability that I needed when developing 
> this patch, like ExecuteithLog.
>
> I have also temporarily disabled the javac server, and building without 
> absolute paths. I believe a better way forward is to address these with 
> improved functionality in separate patches, instead of trying to work around 
> the issues introduced by them in this patch.
>
> I have done substantial testing of the core functionality (building 
> jdk-images) on Cygwin, Msys2 and WSL2, both on my personal machine and on 
> Oracle's CI system. The performance on Cygwin (which we use for our CI 
> builds) is roughly on par with the old Cygwin performance, but the WSL1 
> performance is roughly 20% faster, so I think we should investigate if it is 
> possible for us to switch to WSL1. Everything seems stable so far, but more 
> testing is definitely needed. I have also not even started testing autxillary 
>     functionality, such as the compare script, IDE project file generation 
> etc.
>
> However, the big disappointment in all of this is WSL2. That was the main 
> driver that got me started on this rewrite. But it turned out that WSL2 is 
> still very immature. :-( There are lot of issues, like stdout and stderr 
> getting messed up, time synchronization issues causing make to complain about 
> "Clock skew detected", extreme slowness when accessing disks cross the OS 
> boundary. But worst of all has been that WSL2 is *extremly* unstable. After a 
> few calls of Window executables, I get the impression that a conversion 
> daemon dies. All further calls to Window binaries just stalls, and the WSL2 
> instance is unusable until I terminate it using "wsl -t Ubuntu-2004" from a 
> cmd shell. :-(
>
> So the WSL2 functionality is not very well tested, since I have not been able 
> to build it completely a single time. I do believe that everything is 
> correct, in "theory". So in case this is something broken with my WSL2 
> installation, I'd encourage anyone with a WSL2 installation to try it out.
>
> /Magnus
>

Reply via email to