mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8370438: Offer link time optimization support on library level
Reviewed-by: erikj, serb, azvegint
This commit is contained in:
parent
1226873ab9
commit
5ef2c9aa09
@ -282,10 +282,17 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
|
|||||||
C_O_FLAG_DEBUG_JVM="-O0"
|
C_O_FLAG_DEBUG_JVM="-O0"
|
||||||
C_O_FLAG_NONE="-O0"
|
C_O_FLAG_NONE="-O0"
|
||||||
|
|
||||||
|
if test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||||
|
C_O_FLAG_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing -fno-fat-lto-objects"
|
||||||
|
else
|
||||||
|
C_O_FLAG_LTO="-flto -fno-strict-aliasing"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$TOOLCHAIN_TYPE" = xclang && test "x$OPENJDK_TARGET_OS" = xaix; then
|
if test "x$TOOLCHAIN_TYPE" = xclang && test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||||
C_O_FLAG_HIGHEST_JVM="${C_O_FLAG_HIGHEST_JVM} -finline-functions"
|
C_O_FLAG_HIGHEST_JVM="${C_O_FLAG_HIGHEST_JVM} -finline-functions"
|
||||||
C_O_FLAG_HIGHEST="${C_O_FLAG_HIGHEST} -finline-functions"
|
C_O_FLAG_HIGHEST="${C_O_FLAG_HIGHEST} -finline-functions"
|
||||||
C_O_FLAG_HI="${C_O_FLAG_HI} -finline-functions"
|
C_O_FLAG_HI="${C_O_FLAG_HI} -finline-functions"
|
||||||
|
C_O_FLAG_LTO="${C_O_FLAG_LTO} -ffat-lto-objects"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# -D_FORTIFY_SOURCE=2 hardening option needs optimization (at least -O1) enabled
|
# -D_FORTIFY_SOURCE=2 hardening option needs optimization (at least -O1) enabled
|
||||||
@ -317,6 +324,7 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
|
|||||||
C_O_FLAG_DEBUG_JVM=""
|
C_O_FLAG_DEBUG_JVM=""
|
||||||
C_O_FLAG_NONE="-Od"
|
C_O_FLAG_NONE="-Od"
|
||||||
C_O_FLAG_SIZE="-O1"
|
C_O_FLAG_SIZE="-O1"
|
||||||
|
C_O_FLAG_LTO="-GL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Now copy to C++ flags
|
# Now copy to C++ flags
|
||||||
@ -328,6 +336,7 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
|
|||||||
CXX_O_FLAG_DEBUG_JVM="$C_O_FLAG_DEBUG_JVM"
|
CXX_O_FLAG_DEBUG_JVM="$C_O_FLAG_DEBUG_JVM"
|
||||||
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
|
CXX_O_FLAG_NONE="$C_O_FLAG_NONE"
|
||||||
CXX_O_FLAG_SIZE="$C_O_FLAG_SIZE"
|
CXX_O_FLAG_SIZE="$C_O_FLAG_SIZE"
|
||||||
|
CXX_O_FLAG_LTO="$C_O_FLAG_LTO"
|
||||||
|
|
||||||
# Adjust optimization flags according to debug level.
|
# Adjust optimization flags according to debug level.
|
||||||
case $DEBUG_LEVEL in
|
case $DEBUG_LEVEL in
|
||||||
@ -360,12 +369,15 @@ AC_DEFUN([FLAGS_SETUP_OPTIMIZATION],
|
|||||||
AC_SUBST(C_O_FLAG_NORM)
|
AC_SUBST(C_O_FLAG_NORM)
|
||||||
AC_SUBST(C_O_FLAG_NONE)
|
AC_SUBST(C_O_FLAG_NONE)
|
||||||
AC_SUBST(C_O_FLAG_SIZE)
|
AC_SUBST(C_O_FLAG_SIZE)
|
||||||
|
AC_SUBST(C_O_FLAG_LTO)
|
||||||
|
|
||||||
AC_SUBST(CXX_O_FLAG_HIGHEST_JVM)
|
AC_SUBST(CXX_O_FLAG_HIGHEST_JVM)
|
||||||
AC_SUBST(CXX_O_FLAG_HIGHEST)
|
AC_SUBST(CXX_O_FLAG_HIGHEST)
|
||||||
AC_SUBST(CXX_O_FLAG_HI)
|
AC_SUBST(CXX_O_FLAG_HI)
|
||||||
AC_SUBST(CXX_O_FLAG_NORM)
|
AC_SUBST(CXX_O_FLAG_NORM)
|
||||||
AC_SUBST(CXX_O_FLAG_NONE)
|
AC_SUBST(CXX_O_FLAG_NONE)
|
||||||
AC_SUBST(CXX_O_FLAG_SIZE)
|
AC_SUBST(CXX_O_FLAG_SIZE)
|
||||||
|
AC_SUBST(CXX_O_FLAG_LTO)
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([FLAGS_SETUP_CFLAGS],
|
AC_DEFUN([FLAGS_SETUP_CFLAGS],
|
||||||
|
|||||||
@ -61,6 +61,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
BASIC_LDFLAGS_JVM_ONLY=""
|
BASIC_LDFLAGS_JVM_ONLY=""
|
||||||
|
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing"
|
||||||
|
|
||||||
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \
|
BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \
|
||||||
-fPIC"
|
-fPIC"
|
||||||
|
|
||||||
|
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing"
|
||||||
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
||||||
|
|
||||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||||
@ -87,6 +89,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
BASIC_LDFLAGS="-opt:ref"
|
BASIC_LDFLAGS="-opt:ref"
|
||||||
BASIC_LDFLAGS_JDK_ONLY="-incremental:no"
|
BASIC_LDFLAGS_JDK_ONLY="-incremental:no"
|
||||||
BASIC_LDFLAGS_JVM_ONLY="-opt:icf,8 -subsystem:windows"
|
BASIC_LDFLAGS_JVM_ONLY="-opt:icf,8 -subsystem:windows"
|
||||||
|
LDFLAGS_LTO="-LTCG:INCREMENTAL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if (test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang) \
|
if (test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang) \
|
||||||
@ -148,6 +151,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
|
|
||||||
# Export some intermediate variables for compatibility
|
# Export some intermediate variables for compatibility
|
||||||
LDFLAGS_CXX_JDK="$DEBUGLEVEL_LDFLAGS_JDK_ONLY"
|
LDFLAGS_CXX_JDK="$DEBUGLEVEL_LDFLAGS_JDK_ONLY"
|
||||||
|
AC_SUBST(LDFLAGS_LTO)
|
||||||
AC_SUBST(LDFLAGS_CXX_JDK)
|
AC_SUBST(LDFLAGS_CXX_JDK)
|
||||||
AC_SUBST(LDFLAGS_CXX_PARTIAL_LINKING)
|
AC_SUBST(LDFLAGS_CXX_PARTIAL_LINKING)
|
||||||
])
|
])
|
||||||
|
|||||||
@ -513,12 +513,14 @@ C_O_FLAG_HI := @C_O_FLAG_HI@
|
|||||||
C_O_FLAG_NORM := @C_O_FLAG_NORM@
|
C_O_FLAG_NORM := @C_O_FLAG_NORM@
|
||||||
C_O_FLAG_NONE := @C_O_FLAG_NONE@
|
C_O_FLAG_NONE := @C_O_FLAG_NONE@
|
||||||
C_O_FLAG_SIZE := @C_O_FLAG_SIZE@
|
C_O_FLAG_SIZE := @C_O_FLAG_SIZE@
|
||||||
|
C_O_FLAG_LTO := @C_O_FLAG_LTO@
|
||||||
CXX_O_FLAG_HIGHEST_JVM := @CXX_O_FLAG_HIGHEST_JVM@
|
CXX_O_FLAG_HIGHEST_JVM := @CXX_O_FLAG_HIGHEST_JVM@
|
||||||
CXX_O_FLAG_HIGHEST := @CXX_O_FLAG_HIGHEST@
|
CXX_O_FLAG_HIGHEST := @CXX_O_FLAG_HIGHEST@
|
||||||
CXX_O_FLAG_HI := @CXX_O_FLAG_HI@
|
CXX_O_FLAG_HI := @CXX_O_FLAG_HI@
|
||||||
CXX_O_FLAG_NORM := @CXX_O_FLAG_NORM@
|
CXX_O_FLAG_NORM := @CXX_O_FLAG_NORM@
|
||||||
CXX_O_FLAG_NONE := @CXX_O_FLAG_NONE@
|
CXX_O_FLAG_NONE := @CXX_O_FLAG_NONE@
|
||||||
CXX_O_FLAG_SIZE := @CXX_O_FLAG_SIZE@
|
CXX_O_FLAG_SIZE := @CXX_O_FLAG_SIZE@
|
||||||
|
CXX_O_FLAG_LTO := @CXX_O_FLAG_LTO@
|
||||||
|
|
||||||
GENDEPS_FLAGS := @GENDEPS_FLAGS@
|
GENDEPS_FLAGS := @GENDEPS_FLAGS@
|
||||||
|
|
||||||
@ -587,6 +589,9 @@ LDFLAGS_CXX_JDK := @LDFLAGS_CXX_JDK@
|
|||||||
# LDFLAGS specific to partial linking.
|
# LDFLAGS specific to partial linking.
|
||||||
LDFLAGS_CXX_PARTIAL_LINKING := @LDFLAGS_CXX_PARTIAL_LINKING@
|
LDFLAGS_CXX_PARTIAL_LINKING := @LDFLAGS_CXX_PARTIAL_LINKING@
|
||||||
|
|
||||||
|
# LDFLAGS specific to link time optimization
|
||||||
|
LDFLAGS_LTO := @LDFLAGS_LTO@
|
||||||
|
|
||||||
# Sometimes a different linker is needed for c++ libs
|
# Sometimes a different linker is needed for c++ libs
|
||||||
LDCXX := @LDCXX@
|
LDCXX := @LDCXX@
|
||||||
# The flags for linking libstdc++ linker.
|
# The flags for linking libstdc++ linker.
|
||||||
|
|||||||
@ -98,6 +98,7 @@ include native/Paths.gmk
|
|||||||
# SYSROOT_CFLAGS the compiler flags for using the specific sysroot
|
# SYSROOT_CFLAGS the compiler flags for using the specific sysroot
|
||||||
# SYSROOT_LDFLAGS the linker flags for using the specific sysroot
|
# SYSROOT_LDFLAGS the linker flags for using the specific sysroot
|
||||||
# OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST, HIGHEST_JVM, SIZE
|
# OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST, HIGHEST_JVM, SIZE
|
||||||
|
# LINK_TIME_OPTIMIZATION if set to true, enables link time optimization
|
||||||
# DISABLED_WARNINGS_<toolchain> Disable the given warnings for the specified toolchain
|
# DISABLED_WARNINGS_<toolchain> Disable the given warnings for the specified toolchain
|
||||||
# DISABLED_WARNINGS_<toolchain>_<OS> Disable the given warnings for the specified
|
# DISABLED_WARNINGS_<toolchain>_<OS> Disable the given warnings for the specified
|
||||||
# toolchain and target OS
|
# toolchain and target OS
|
||||||
|
|||||||
@ -194,6 +194,11 @@ define SetupCompilerFlags
|
|||||||
$1_EXTRA_CXXFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
|
$1_EXTRA_CXXFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq (true, $$($1_LINK_TIME_OPTIMIZATION))
|
||||||
|
$1_EXTRA_CFLAGS += $(C_O_FLAG_LTO)
|
||||||
|
$1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_LTO)
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq (NONE, $$($1_OPTIMIZATION))
|
ifeq (NONE, $$($1_OPTIMIZATION))
|
||||||
$1_OPT_CFLAGS := $(C_O_FLAG_NONE)
|
$1_OPT_CFLAGS := $(C_O_FLAG_NONE)
|
||||||
$1_OPT_CXXFLAGS := $(CXX_O_FLAG_NONE)
|
$1_OPT_CXXFLAGS := $(CXX_O_FLAG_NONE)
|
||||||
@ -222,6 +227,10 @@ define SetupLinkerFlags
|
|||||||
# Pickup extra OPENJDK_TARGET_OS_TYPE, OPENJDK_TARGET_OS and TOOLCHAIN_TYPE
|
# Pickup extra OPENJDK_TARGET_OS_TYPE, OPENJDK_TARGET_OS and TOOLCHAIN_TYPE
|
||||||
# dependent variables for LDFLAGS and LIBS, and additionally the pair dependent
|
# dependent variables for LDFLAGS and LIBS, and additionally the pair dependent
|
||||||
# TOOLCHAIN_TYPE plus OPENJDK_TARGET_OS
|
# TOOLCHAIN_TYPE plus OPENJDK_TARGET_OS
|
||||||
|
ifeq ($$($1_LINK_TIME_OPTIMIZATION), true)
|
||||||
|
$1_EXTRA_LDFLAGS += $(LDFLAGS_LTO)
|
||||||
|
endif
|
||||||
|
|
||||||
$1_EXTRA_LDFLAGS += $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) \
|
$1_EXTRA_LDFLAGS += $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) \
|
||||||
$$($1_LDFLAGS_$(TOOLCHAIN_TYPE)) $$($1_LDFLAGS_$(TOOLCHAIN_TYPE)_$(OPENJDK_TARGET_OS))
|
$$($1_LDFLAGS_$(TOOLCHAIN_TYPE)) $$($1_LDFLAGS_$(TOOLCHAIN_TYPE)_$(OPENJDK_TARGET_OS))
|
||||||
$1_EXTRA_LIBS += $$($1_LIBS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LIBS_$(OPENJDK_TARGET_OS)) \
|
$1_EXTRA_LIBS += $$($1_LIBS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LIBS_$(OPENJDK_TARGET_OS)) \
|
||||||
|
|||||||
@ -234,6 +234,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJVM, \
|
|||||||
LDFLAGS := $(JVM_LDFLAGS), \
|
LDFLAGS := $(JVM_LDFLAGS), \
|
||||||
LIBS := $(JVM_LIBS), \
|
LIBS := $(JVM_LIBS), \
|
||||||
OPTIMIZATION := $(JVM_OPTIMIZATION), \
|
OPTIMIZATION := $(JVM_OPTIMIZATION), \
|
||||||
|
LINK_TIME_OPTIMIZATION := $(JVM_LTO), \
|
||||||
OBJECT_DIR := $(JVM_OUTPUTDIR)/objs, \
|
OBJECT_DIR := $(JVM_OUTPUTDIR)/objs, \
|
||||||
STRIPFLAGS := $(JVM_STRIPFLAGS), \
|
STRIPFLAGS := $(JVM_STRIPFLAGS), \
|
||||||
EMBED_MANIFEST := true, \
|
EMBED_MANIFEST := true, \
|
||||||
|
|||||||
@ -175,22 +175,12 @@ ifeq ($(call check-jvm-feature, link-time-opt), true)
|
|||||||
# Set JVM_OPTIMIZATION directly so other jvm-feature flags can override it
|
# Set JVM_OPTIMIZATION directly so other jvm-feature flags can override it
|
||||||
# later on if desired
|
# later on if desired
|
||||||
JVM_OPTIMIZATION := HIGHEST_JVM
|
JVM_OPTIMIZATION := HIGHEST_JVM
|
||||||
ifeq ($(call isCompiler, gcc), true)
|
JVM_LTO := true
|
||||||
JVM_CFLAGS_FEATURES += -flto=auto -fuse-linker-plugin -fno-strict-aliasing \
|
ifneq ($(call isCompiler, microsoft), true)
|
||||||
-fno-fat-lto-objects
|
JVM_LDFLAGS_FEATURES += $(CXX_O_FLAG_HIGHEST_JVM)
|
||||||
JVM_LDFLAGS_FEATURES += $(CXX_O_FLAG_HIGHEST_JVM) -flto=auto \
|
|
||||||
-fuse-linker-plugin -fno-strict-aliasing
|
|
||||||
else ifeq ($(call isCompiler, clang), true)
|
|
||||||
JVM_CFLAGS_FEATURES += -flto -fno-strict-aliasing
|
|
||||||
ifeq ($(call isBuildOs, aix), true)
|
|
||||||
JVM_CFLAGS_FEATURES += -ffat-lto-objects
|
|
||||||
endif
|
|
||||||
JVM_LDFLAGS_FEATURES += $(CXX_O_FLAG_HIGHEST_JVM) -flto -fno-strict-aliasing
|
|
||||||
else ifeq ($(call isCompiler, microsoft), true)
|
|
||||||
JVM_CFLAGS_FEATURES += -GL
|
|
||||||
JVM_LDFLAGS_FEATURES += -LTCG:INCREMENTAL
|
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
|
JVM_LTO := false
|
||||||
ifeq ($(call isCompiler, gcc), true)
|
ifeq ($(call isCompiler, gcc), true)
|
||||||
JVM_LDFLAGS_FEATURES += -O1
|
JVM_LDFLAGS_FEATURES += -O1
|
||||||
endif
|
endif
|
||||||
|
|||||||
@ -226,6 +226,7 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
EXCLUDE_FILES := imageioJPEG.c jpegdecoder.c pngtest.c, \
|
EXCLUDE_FILES := imageioJPEG.c jpegdecoder.c pngtest.c, \
|
||||||
EXCLUDES := $(LIBSPLASHSCREEN_EXCLUDES), \
|
EXCLUDES := $(LIBSPLASHSCREEN_EXCLUDES), \
|
||||||
OPTIMIZATION := SIZE, \
|
OPTIMIZATION := SIZE, \
|
||||||
|
LINK_TIME_OPTIMIZATION := true, \
|
||||||
CFLAGS := $(LIBSPLASHSCREEN_CFLAGS) \
|
CFLAGS := $(LIBSPLASHSCREEN_CFLAGS) \
|
||||||
$(GIFLIB_CFLAGS) $(LIBJPEG_CFLAGS) $(PNG_CFLAGS) $(LIBZ_CFLAGS) \
|
$(GIFLIB_CFLAGS) $(LIBJPEG_CFLAGS) $(PNG_CFLAGS) $(LIBZ_CFLAGS) \
|
||||||
$(ICONV_CFLAGS), \
|
$(ICONV_CFLAGS), \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user