Skip to content

Commit 6d8426d

Browse files
Initial Support for using gcc to compile a Windows JDK
1 parent 2d09284 commit 6d8426d

251 files changed

Lines changed: 209984 additions & 1165 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

make/Hsdis.gmk

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ HSDIS_OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/hsdis
3535
REAL_HSDIS_NAME := hsdis-$(OPENJDK_TARGET_CPU_LEGACY_LIB)$(SHARED_LIBRARY_SUFFIX)
3636
BUILT_HSDIS_LIB := $(HSDIS_OUTPUT_DIR)/$(REAL_HSDIS_NAME)
3737

38-
HSDIS_LINK_TYPE := C
38+
HSDIS_LANG := C
3939

4040
ifeq ($(HSDIS_BACKEND), capstone)
4141
ifeq ($(call isTargetCpuArch, x86), true)
@@ -54,7 +54,7 @@ endif
5454

5555
ifeq ($(HSDIS_BACKEND), llvm)
5656
# Use C++ instead of C
57-
HSDIS_LINK_TYPE := C++
57+
HSDIS_LANG := C++
5858

5959
ifeq ($(call isTargetOs, linux), true)
6060
LLVM_OS := pc-linux-gnu
@@ -71,62 +71,64 @@ endif
7171

7272
ifeq ($(HSDIS_BACKEND), binutils)
7373
ifeq ($(call isTargetOs, windows), true)
74-
# On windows, we need to "fake" a completely different toolchain using gcc
75-
# instead of the normal microsoft toolchain. This is quite hacky...
74+
ifeq ($(TOOLCHAIN_TYPE), microsoft)
75+
# On windows, we need to "fake" a completely different toolchain using gcc
76+
# instead of the normal microsoft toolchain. This is quite hacky...
7677

77-
MINGW_BASE := x86_64-w64-mingw32
78+
MINGW_BASE := x86_64-w64-mingw32
7879

79-
MINGW_SYSROOT = $(shell $(MINGW_BASE)-gcc -print-sysroot)
80-
ifeq ($(wildcard $(MINGW_SYSROOT)), )
81-
# Use fallback path
82-
MINGW_SYSROOT := /usr/$(MINGW_BASE)
80+
MINGW_SYSROOT = $(shell $(MINGW_BASE)-gcc -print-sysroot)
8381
ifeq ($(wildcard $(MINGW_SYSROOT)), )
84-
$(error mingw sysroot not found)
82+
# Use fallback path
83+
MINGW_SYSROOT := /usr/$(MINGW_BASE)
84+
ifeq ($(wildcard $(MINGW_SYSROOT)), )
85+
$(error mingw sysroot not found)
86+
endif
8587
endif
86-
endif
8788

88-
BUILD_HSDIS_CC := $(MINGW_BASE)-gcc
89-
BUILD_HSDIS_LD := $(MINGW_BASE)-ld
90-
BUILD_HSDIS_OBJCOPY := $(MINGW_BASE)-objcopy
91-
BUILD_HSDIS_SYSROOT_CFLAGS := --sysroot=$(MINGW_SYSROOT)
92-
BUILD_HSDIS_SYSROOT_LDFLAGS := --sysroot=$(MINGW_SYSROOT)
89+
BUILD_HSDIS_CC := $(MINGW_BASE)-gcc
90+
BUILD_HSDIS_LD := $(MINGW_BASE)-ld
91+
BUILD_HSDIS_OBJCOPY := $(MINGW_BASE)-objcopy
92+
BUILD_HSDIS_SYSROOT_CFLAGS := --sysroot=$(MINGW_SYSROOT)
93+
BUILD_HSDIS_SYSROOT_LDFLAGS := --sysroot=$(MINGW_SYSROOT)
9394

94-
MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/mingw/lib
95-
ifeq ($(wildcard $(MINGW_SYSROOT_LIB_PATH)), )
96-
# Try without mingw
97-
MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/lib
95+
MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/mingw/lib
9896
ifeq ($(wildcard $(MINGW_SYSROOT_LIB_PATH)), )
99-
$(error mingw sysroot lib path not found)
97+
# Try without mingw
98+
MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/lib
99+
ifeq ($(wildcard $(MINGW_SYSROOT_LIB_PATH)), )
100+
$(error mingw sysroot lib path not found)
101+
endif
100102
endif
101-
endif
102103

103-
MINGW_VERSION = $(shell $(MINGW_BASE)-gcc -v 2>&1 | $(GREP) "gcc version" | $(CUT) -d " " -f 3)
104-
MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION)
105-
ifeq ($(wildcard $(MINGW_GCC_LIB_PATH)), )
106-
# Try using only major version number
107-
MINGW_VERSION_MAJOR := $(firstword $(subst ., , $(MINGW_VERSION)))
108-
MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION_MAJOR)
104+
MINGW_VERSION = $(shell $(MINGW_BASE)-gcc -v 2>&1 | $(GREP) "gcc version" | $(CUT) -d " " -f 3)
105+
MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION)
109106
ifeq ($(wildcard $(MINGW_GCC_LIB_PATH)), )
110-
$(error mingw gcc lib path not found)
107+
# Try using only major version number
108+
MINGW_VERSION_MAJOR := $(firstword $(subst ., , $(MINGW_VERSION)))
109+
MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION_MAJOR)
110+
ifeq ($(wildcard $(MINGW_GCC_LIB_PATH)), )
111+
$(error mingw gcc lib path not found)
112+
endif
111113
endif
112-
endif
113114

114-
TOOLCHAIN_TYPE := gcc
115-
OPENJDK_TARGET_OS := linux
116-
OPENJDK_TARGET_OS_TYPE := unix
117-
GENDEPS_FLAGS := -MMD -MF
118-
CFLAGS_DEBUG_SYMBOLS := -g
119-
DISABLED_WARNINGS :=
120-
DISABLE_WARNING_PREFIX := -Wno-
121-
CFLAGS_WARNINGS_ARE_ERRORS := -Werror
122-
SHARED_LIBRARY_FLAGS := -shared
123-
124-
HSDIS_TOOLCHAIN_DEFAULT_CFLAGS := false
125-
HSDIS_TOOLCHAIN_DEFAULT_LDFLAGS := false
126-
HSDIS_LDFLAGS += -L$(MINGW_GCC_LIB_PATH) -L$(MINGW_SYSROOT_LIB_PATH)
127-
MINGW_DLLCRT := $(MINGW_SYSROOT_LIB_PATH)/dllcrt2.o
128-
HSDIS_TOOLCHAIN_LIBS := $(MINGW_DLLCRT) -lmingw32 -lgcc -lgcc_eh -lmoldname \
129-
-lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32
115+
TOOLCHAIN_TYPE := gcc
116+
OPENJDK_TARGET_OS := linux
117+
OPENJDK_TARGET_OS_TYPE := unix
118+
GENDEPS_FLAGS := -MMD -MF
119+
CFLAGS_DEBUG_SYMBOLS := -g
120+
DISABLED_WARNINGS :=
121+
DISABLE_WARNING_PREFIX := -Wno-
122+
CFLAGS_WARNINGS_ARE_ERRORS := -Werror
123+
SHARED_LIBRARY_FLAGS := -shared
124+
125+
HSDIS_TOOLCHAIN_DEFAULT_CFLAGS := false
126+
HSDIS_TOOLCHAIN_DEFAULT_LDFLAGS := false
127+
HSDIS_LDFLAGS += -L$(MINGW_GCC_LIB_PATH) -L$(MINGW_SYSROOT_LIB_PATH)
128+
MINGW_DLLCRT := $(MINGW_SYSROOT_LIB_PATH)/dllcrt2.o
129+
HSDIS_TOOLCHAIN_LIBS := $(MINGW_DLLCRT) -lmingw32 -lgcc -lgcc_eh -lmoldname \
130+
-lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32
131+
endif
130132
else
131133
HSDIS_TOOLCHAIN_LIBS := -ldl
132134
endif
@@ -138,7 +140,7 @@ endif
138140

139141
$(eval $(call SetupJdkLibrary, BUILD_HSDIS, \
140142
NAME := hsdis, \
141-
LINK_TYPE := $(HSDIS_LINK_TYPE), \
143+
LANG := $(HSDIS_LANG), \
142144
SRC := $(TOPDIR)/src/utils/hsdis/$(HSDIS_BACKEND), \
143145
EXTRA_HEADER_DIRS := \
144146
java.base:include \

make/StaticLibs.gmk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ $(eval $(call SetupBuildLauncher, java, \
137137
CFLAGS := -DSTATIC_BUILD, \
138138
LDFLAGS := $(LDFLAGS_STATIC_JDK), \
139139
LIBS := $(STATIC_LIBS) $(EXTERNAL_LIBS), \
140-
LINK_TYPE := C++, \
140+
LANG := C++, \
141141
OUTPUT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \
142142
OBJECT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \
143143
))

make/autoconf/build-performance.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ AC_DEFUN([BPERF_SETUP_CCACHE],
162162
# Check if ccache is available
163163
CCACHE_AVAILABLE=true
164164
165-
UTIL_LOOKUP_TOOLCHAIN_PROGS(CCACHE, ccache)
165+
UTIL_LOOKUP_TOOLCHAIN_PROGS(CCACHE, ccache, NOFIXPATH)
166166
167167
AC_MSG_CHECKING([if ccache is available])
168168
if test "x$TOOLCHAIN_TYPE" != "xgcc" && test "x$TOOLCHAIN_TYPE" != "xclang"; then

make/autoconf/flags-cflags.m4

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,11 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
9393
)
9494
fi
9595
96-
CFLAGS_DEBUG_SYMBOLS="-g -gdwarf-4"
96+
GDWARF_FLAGS="-gcodeview"
97+
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${GDWARF_FLAGS}],
98+
IF_FALSE: [GDWARF_FLAGS="-gdwarf-4"])
99+
100+
CFLAGS_DEBUG_SYMBOLS="-g ${GDWARF_FLAGS}"
97101
ASFLAGS_DEBUG_SYMBOLS="-g"
98102
elif test "x$TOOLCHAIN_TYPE" = xclang; then
99103
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then
@@ -282,17 +286,10 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
282286
C_O_FLAG_DEBUG_JVM="-O0"
283287
C_O_FLAG_NONE="-O0"
284288
285-
if test "x$TOOLCHAIN_TYPE" = xgcc; then
286-
C_O_FLAG_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing -fno-fat-lto-objects"
287-
else
288-
C_O_FLAG_LTO="-flto -fno-strict-aliasing"
289-
fi
290-
291289
if test "x$TOOLCHAIN_TYPE" = xclang && test "x$OPENJDK_TARGET_OS" = xaix; then
292290
C_O_FLAG_HIGHEST_JVM="${C_O_FLAG_HIGHEST_JVM} -finline-functions"
293291
C_O_FLAG_HIGHEST="${C_O_FLAG_HIGHEST} -finline-functions"
294292
C_O_FLAG_HI="${C_O_FLAG_HI} -finline-functions"
295-
C_O_FLAG_LTO="${C_O_FLAG_LTO} -ffat-lto-objects"
296293
fi
297294
298295
# -D_FORTIFY_SOURCE=2 hardening option needs optimization (at least -O1) enabled
@@ -324,7 +321,6 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
324321
C_O_FLAG_DEBUG_JVM=""
325322
C_O_FLAG_NONE="-Od"
326323
C_O_FLAG_SIZE="-O1"
327-
C_O_FLAG_LTO="-GL"
328324
fi
329325
330326
# Now copy to C++ flags
@@ -336,7 +332,6 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
336332
CXX_O_FLAG_DEBUG_JVM="$C_O_FLAG_DEBUG_JVM"
337333
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
338334
CXX_O_FLAG_SIZE="$C_O_FLAG_SIZE"
339-
CXX_O_FLAG_LTO="$C_O_FLAG_LTO"
340335
341336
# Adjust optimization flags according to debug level.
342337
case $DEBUG_LEVEL in
@@ -369,15 +364,12 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
369364
AC_SUBST(C_O_FLAG_NORM)
370365
AC_SUBST(C_O_FLAG_NONE)
371366
AC_SUBST(C_O_FLAG_SIZE)
372-
AC_SUBST(C_O_FLAG_LTO)
373-
374367
AC_SUBST(CXX_O_FLAG_HIGHEST_JVM)
375368
AC_SUBST(CXX_O_FLAG_HIGHEST)
376369
AC_SUBST(CXX_O_FLAG_HI)
377370
AC_SUBST(CXX_O_FLAG_NORM)
378371
AC_SUBST(CXX_O_FLAG_NONE)
379372
AC_SUBST(CXX_O_FLAG_SIZE)
380-
AC_SUBST(CXX_O_FLAG_LTO)
381373
])
382374

383375
AC_DEFUN([FLAGS_SETUP_CFLAGS],
@@ -431,7 +423,7 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
431423
[
432424
#### OS DEFINES, these should be independent on toolchain
433425
if test "x$OPENJDK_TARGET_OS" = xlinux; then
434-
CFLAGS_OS_DEF_JVM="-DLINUX -D_FILE_OFFSET_BITS=64"
426+
CFLAGS_OS_DEF_JVM="-DLINUX -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_REENTRANT"
435427
CFLAGS_OS_DEF_JDK="-D_GNU_SOURCE -D_REENTRANT -D_FILE_OFFSET_BITS=64"
436428
elif test "x$OPENJDK_TARGET_OS" = xmacosx; then
437429
CFLAGS_OS_DEF_JVM="-D_ALLBSD_SOURCE -D_DARWIN_C_SOURCE -D_XOPEN_SOURCE"
@@ -442,7 +434,12 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
442434
elif test "x$OPENJDK_TARGET_OS" = xbsd; then
443435
CFLAGS_OS_DEF_JDK="-D_ALLBSD_SOURCE"
444436
elif test "x$OPENJDK_TARGET_OS" = xwindows; then
445-
CFLAGS_OS_DEF_JVM="-D_WINDOWS -DWIN32 -D_JNI_IMPLEMENTATION_"
437+
CFLAGS_OS_DEF_JVM="-D_WINDOWS -DWIN32 -D_JNI_IMPLEMENTATION_ \
438+
-DNOMINMAX -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602"
439+
# _WIN32_WINNT=0x0602 means access APIs for Windows 8 and above. See
440+
# https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170
441+
CFLAGS_OS_DEF_JDK="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \
442+
-DWIN32 -DIAL"
446443
fi
447444
448445
CFLAGS_OS_DEF_JDK="$CFLAGS_OS_DEF_JDK -D$OPENJDK_TARGET_OS_UPPERCASE"
@@ -485,33 +482,37 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
485482
486483
#### TOOLCHAIN DEFINES
487484
488-
if test "x$TOOLCHAIN_TYPE" = xgcc; then
489-
ALWAYS_DEFINES_JVM="-D_GNU_SOURCE -D_REENTRANT"
490-
elif test "x$TOOLCHAIN_TYPE" = xclang; then
485+
if test "x$TOOLCHAIN_TYPE" = xclang; then
491486
ALWAYS_DEFINES_JVM="-D_GNU_SOURCE"
492487
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
493-
# _WIN32_WINNT=0x0602 means access APIs for Windows 8 and above. See
494-
# https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170
495-
ALWAYS_DEFINES="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \
496-
-D_CRT_DECLARE_NONSTDC_NAMES -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS"
497-
ALWAYS_DEFINES_JDK="$ALWAYS_DEFINES -DWIN32 -DIAL"
498-
ALWAYS_DEFINES_JVM="$ALWAYS_DEFINES -DNOMINMAX"
488+
ALWAYS_DEFINES_JDK="-D_CRT_DECLARE_NONSTDC_NAMES -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS"
489+
ALWAYS_DEFINES_JVM="-D_CRT_DECLARE_NONSTDC_NAMES -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS"
499490
fi
500491
501492
##############################################################################
502493
#
503494
#
504495
# CFLAGS BASIC
505496
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
506-
# COMMON to gcc and clang
507-
TOOLCHAIN_CFLAGS_JVM="-pipe -fno-rtti -fno-exceptions \
508-
-fvisibility=hidden -fno-strict-aliasing -fno-omit-frame-pointer"
497+
if test "x$OPENJDK_TARGET_OS" = xwindows; then
498+
TOOLCHAIN_CFLAGS_JVM="-pipe -fno-rtti -fno-exceptions \
499+
-fno-strict-aliasing -fno-omit-frame-pointer"
500+
else
501+
# COMMON to gcc and clang
502+
TOOLCHAIN_CFLAGS_JVM="-pipe -fno-rtti -fno-exceptions \
503+
-fvisibility=hidden -fno-strict-aliasing -fno-omit-frame-pointer"
504+
fi
509505
fi
510506
511507
if test "x$TOOLCHAIN_TYPE" = xgcc; then
512-
TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -fstack-protector"
513-
TOOLCHAIN_CFLAGS_JDK="-fvisibility=hidden -pipe -fstack-protector"
514-
# reduce lib size on linux in link step, this needs also special compile flags
508+
if test "x$OPENJDK_TARGET_OS" = xwindows; then
509+
TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -fno-stack-protector"
510+
TOOLCHAIN_CFLAGS_JDK="-pipe -fno-stack-protector"
511+
else
512+
TOOLCHAIN_CFLAGS_JVM="$TOOLCHAIN_CFLAGS_JVM -fstack-protector"
513+
TOOLCHAIN_CFLAGS_JDK="-fvisibility=hidden -pipe -fstack-protector"
514+
fi
515+
# reduce lib size for gcc in link step, this needs also special compile flags
515516
# do this on s390x also for libjvm (where serviceability agent is not supported)
516517
if test "x$ENABLE_LINKTIME_GC" = xtrue; then
517518
TOOLCHAIN_CFLAGS_JDK="$TOOLCHAIN_CFLAGS_JDK -ffunction-sections -fdata-sections"
@@ -554,8 +555,8 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
554555
TOOLCHAIN_CFLAGS_JDK="$TOOLCHAIN_CFLAGS_JDK -fvisibility=hidden -fstack-protector"
555556
556557
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
557-
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:inline -Zc:throwingNew -permissive- -MP"
558-
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:inline -Zc:throwingNew -permissive- -Zc:wchar_t-"
558+
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:inline -Zc:throwingNew -permissive- -volatile:iso -MP"
559+
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:inline -Zc:throwingNew -permissive- -volatile:iso -Zc:wchar_t-"
559560
fi
560561
561562
# Set character encoding in source
@@ -623,8 +624,13 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
623624
624625
# Where does this really belong??
625626
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
626-
PICFLAG="-fPIC"
627-
PIEFLAG="-fPIE"
627+
if test "x$OPENJDK_TARGET_OS" = xwindows; then
628+
PICFLAG=""
629+
PIEFLAG=""
630+
else
631+
PICFLAG="-fPIC"
632+
PIEFLAG="-fPIE"
633+
fi
628634
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
629635
PICFLAG=""
630636
fi

0 commit comments

Comments
 (0)