# # Copyright (c) 2013, 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. 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 support files that will setup compiler flags due to the selected # jvm feature set, and specific file overrides. include lib/JvmFeatures.gmk include lib/JvmOverrideFiles.gmk $(eval $(call IncludeCustomExtension, hotspot/lib/CompileJvm.gmk)) ################################################################################ # Setup compilation of the main Hotspot native library (libjvm). JVM_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm JVM_MAPFILE := $(JVM_OUTPUTDIR)/mapfile ################################################################################ # Platform independent setup # This variable may be added to by a custom extension JVM_SRC_ROOTS += $(TOPDIR)/src/hotspot JVM_SRC_DIRS += $(call uniq, $(wildcard $(foreach d, $(JVM_SRC_ROOTS), \ $d/share \ $d/os/$(HOTSPOT_TARGET_OS) \ $d/os/$(HOTSPOT_TARGET_OS_TYPE) \ $d/cpu/$(HOTSPOT_TARGET_CPU_ARCH) \ $d/os_cpu/$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH) \ ))) \ $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles \ $(JVM_VARIANT_OUTPUTDIR)/gensrc/tracefiles \ # JVM_CFLAGS_INCLUDES += \ $(patsubst %,-I%,$(filter-out $(JVM_VARIANT_OUTPUTDIR)/gensrc/%, $(JVM_SRC_DIRS))) \ -I$(JVM_VARIANT_OUTPUTDIR)/gensrc \ -I$(TOPDIR)/src/hotspot/share/precompiled \ -I$(TOPDIR)/src/hotspot/share/prims \ # # INCLUDE_SUFFIX_* is only meant for including the proper # platform files. Don't use it to guard code. Use the value of # HOTSPOT_TARGET_CPU_DEFINE etc. instead. # Remaining TARGET_ARCH_* is needed to select the cpu specific # sources for 64-bit ARM ports (arm versus aarch64). JVM_CFLAGS_TARGET_DEFINES += \ -DTARGET_ARCH_$(HOTSPOT_TARGET_CPU_ARCH) \ -DINCLUDE_SUFFIX_OS=_$(HOTSPOT_TARGET_OS) \ -DINCLUDE_SUFFIX_CPU=_$(HOTSPOT_TARGET_CPU_ARCH) \ -DINCLUDE_SUFFIX_COMPILER=_$(HOTSPOT_TOOLCHAIN_TYPE) \ -DTARGET_COMPILER_$(HOTSPOT_TOOLCHAIN_TYPE) \ -D$(HOTSPOT_TARGET_CPU_DEFINE) \ -DHOTSPOT_LIB_ARCH='"$(OPENJDK_TARGET_CPU_LEGACY_LIB)"' \ # ifeq ($(DEBUG_LEVEL), release) # For hotspot, release builds differ internally between "optimized" and "product" # in that "optimize" does not define PRODUCT. ifneq ($(HOTSPOT_DEBUG_LEVEL), optimized) JVM_CFLAGS_DEBUGLEVEL := -DPRODUCT endif else ifeq ($(DEBUG_LEVEL), fastdebug) JVM_CFLAGS_DEBUGLEVEL := -DASSERT ifeq ($(filter $(OPENJDK_TARGET_OS), windows aix), ) # NOTE: Old build did not define CHECK_UNHANDLED_OOPS on Windows and AIX. JVM_CFLAGS_DEBUGLEVEL += -DCHECK_UNHANDLED_OOPS endif else ifeq ($(DEBUG_LEVEL), slowdebug) # _NMT_NOINLINE_ informs NMT that no inlining is done by the compiler JVM_CFLAGS_DEBUGLEVEL := -DASSERT -D_NMT_NOINLINE_ endif JVM_CFLAGS += \ $(JVM_CFLAGS_DEBUGLEVEL) \ $(JVM_CFLAGS_TARGET_DEFINES) \ $(JVM_CFLAGS_FEATURES) \ $(JVM_CFLAGS_INCLUDES) \ $(EXTRA_CFLAGS) \ # JVM_LDFLAGS += \ $(SHARED_LIBRARY_FLAGS) \ $(JVM_LDFLAGS_FEATURES) \ $(EXTRA_LDFLAGS) \ # JVM_LIBS += \ $(JVM_LIBS_FEATURES) \ # # These files and directories are always excluded JVM_EXCLUDE_FILES += jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp args.cc JVM_EXCLUDES += adlc # Needed by vm_version.cpp ifeq ($(OPENJDK_TARGET_CPU), x86_64) OPENJDK_TARGET_CPU_VM_VERSION := amd64 else ifeq ($(OPENJDK_TARGET_CPU), sparcv9) OPENJDK_TARGET_CPU_VM_VERSION := sparc else ifeq ($(HOTSPOT_TARGET_CPU_ARCH), arm) ifeq ($(OPENJDK_TARGET_CPU), aarch64) # This sets the Oracle Aarch64 port to use arm64 # while the original Aarch64 port uses aarch64 OPENJDK_TARGET_CPU_VM_VERSION := arm64 endif else OPENJDK_TARGET_CPU_VM_VERSION := $(OPENJDK_TARGET_CPU) endif CFLAGS_VM_VERSION := \ $(VERSION_CFLAGS) \ -DHOTSPOT_VERSION_STRING='"$(VERSION_STRING)"' \ -DDEBUG_LEVEL='"$(DEBUG_LEVEL)"' \ -DHOTSPOT_BUILD_USER='"$(USERNAME)"' \ -DHOTSPOT_VM_DISTRO='"$(HOTSPOT_VM_DISTRO)"' \ -DCPU='"$(OPENJDK_TARGET_CPU_VM_VERSION)"' \ # # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. ifeq ($(USE_PRECOMPILED_HEADER), false) JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER endif ################################################################################ # Platform specific setup # ARM source selection ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), linux-arm) JVM_EXCLUDE_PATTERNS += arm_64 else ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), linux-aarch64) # For 64-bit arm builds, we use the 64 bit hotspot/src/cpu/arm # hotspot sources if HOTSPOT_TARGET_CPU_ARCH is set to arm. # Exclude the aarch64 and 32 bit arm files for this build. ifeq ($(HOTSPOT_TARGET_CPU_ARCH), arm) JVM_EXCLUDE_PATTERNS += arm_32 aarch64 endif endif ifneq ($(filter $(OPENJDK_TARGET_OS), linux macosx windows), ) JVM_PRECOMPILED_HEADER := $(TOPDIR)/src/hotspot/share/precompiled/precompiled.hpp endif ifeq ($(OPENJDK_TARGET_CPU), x86) JVM_EXCLUDE_PATTERNS += x86_64 else ifeq ($(OPENJDK_TARGET_CPU), x86_64) JVM_EXCLUDE_PATTERNS += x86_32 endif # Inline assembly for solaris ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_CPU), x86_64) JVM_CFLAGS += $(TOPDIR)/src/hotspot/os_cpu/solaris_x86/solaris_x86_64.il else ifeq ($(OPENJDK_TARGET_CPU), sparcv9) JVM_CFLAGS += $(TOPDIR)/src/hotspot/os_cpu/solaris_sparc/solaris_sparc.il endif endif ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), solaris-sparcv9) ifeq ($(COMPILE_WITH_DEBUG_SYMBOLS), false) # NOTE: In the old build, we weirdly enough set -g/-g0 always, regardless # of if debug symbols were needed. Without it, compilation fails on # sparc! :-( JVM_CFLAGS += -g0 endif endif ifeq ($(OPENJDK_TARGET_OS), windows) ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) RC_DESC := 64-Bit$(SPACE) endif JVM_RCFLAGS += -D"HS_FILEDESC=$(HOTSPOT_VM_DISTRO) $(RC_DESC)$(JVM_VARIANT) VM" endif JVM_OPTIMIZATION ?= HIGHEST_JVM # Need to set JVM_STRIPFLAGS to the default value from SPEC since the STRIPFLAGS # parameter to SetupNativeCompilation allows an empty value to override the # default. JVM_STRIPFLAGS ?= $(STRIPFLAGS) ################################################################################ # Now set up the actual compilation of the main hotspot native library $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \ TOOLCHAIN := TOOLCHAIN_LINK_CXX, \ LIBRARY := jvm, \ OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \ SRC := $(JVM_SRC_DIRS), \ EXCLUDES := $(JVM_EXCLUDES), \ EXCLUDE_FILES := $(JVM_EXCLUDE_FILES), \ EXCLUDE_PATTERNS := $(JVM_EXCLUDE_PATTERNS), \ EXTRA_OBJECT_FILES := $(DTRACE_EXTRA_OBJECT_FILES), \ CFLAGS := $(JVM_CFLAGS), \ CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ vm_version.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \ DISABLED_WARNINGS_clang := tautological-compare, \ DISABLED_WARNINGS_xlc := 1540-0216 1540-0198 1540-1090 1540-1639 \ 1540-1088 1500-010, \ ASFLAGS := $(JVM_ASFLAGS), \ LDFLAGS := $(JVM_LDFLAGS), \ LIBS := $(JVM_LIBS), \ OPTIMIZATION := $(JVM_OPTIMIZATION), \ OBJECT_DIR := $(JVM_OUTPUTDIR)/objs, \ MAPFILE := $(JVM_MAPFILE), \ USE_MAPFILE_FOR_SYMBOLS := true, \ STRIPFLAGS := $(JVM_STRIPFLAGS), \ EMBED_MANIFEST := true, \ RC_FLAGS := $(JVM_RCFLAGS), \ VERSIONINFO_RESOURCE := $(TOPDIR)/src/hotspot/os/windows/version.rc, \ PRECOMPILED_HEADER := $(JVM_PRECOMPILED_HEADER), \ PRECOMPILED_HEADER_EXCLUDE := $(JVM_PRECOMPILED_HEADER_EXCLUDE), \ )) ifeq ($(OPENJDK_TARGET_OS), windows) # It doesn't matter which jvm.lib file gets exported, but we need # to pick just one. ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS))) $(eval $(call SetupCopyFiles, COPY_JVM_LIB, \ DEST := $(LIB_OUTPUTDIR), \ FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib, \ )) TARGETS += $(COPY_JVM_LIB) endif endif # AIX warning explanation: # 1500-010 : (W) WARNING in ...: Infinite loop. Program may not stop. # There are several infinite loops in the vm, so better suppress. # 1540-0198 : (W) The omitted keyword "private" is assumed for base class "...". # 1540-0216 : (W) An expression of type .. cannot be converted to type .. # In hotspot this fires for functionpointer to pointer conversions # 1540-1088 : (W) The exception specification is being ignored. # In hotspot this is caused by throw() in declaration of new() in nmethod.hpp. # 1540-1090 : (I) The destructor of "..." might not be called. # 1540-1639 : (I) The behavior of long type bit fields has changed ... # Include mapfile generation. It relies on BUILD_LIBJVM_ALL_OBJS which is only # defined after the above call to BUILD_LIBJVM. Mapfile will be generated # after all object files are built, but before the jvm library is linked. include lib/JvmMapfile.gmk TARGETS += $(BUILD_LIBJVM)