--- a/hotspot/make/bsd/makefiles/adlc.make Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/make/bsd/makefiles/adlc.make Thu Jun 06 11:02:25 2013 -0700
@@ -69,7 +69,7 @@
# CFLAGS_WARN holds compiler options to suppress/enable warnings.
# Compiler warnings are treated as errors
ifneq ($(COMPILER_WARNINGS_FATAL),false)
- CFLAGS_WARN = -Werror
+ CFLAGS_WARN = $(WARNINGS_ARE_ERRORS)
endif
CFLAGS += $(CFLAGS_WARN)
--- a/hotspot/make/bsd/makefiles/gcc.make Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/make/bsd/makefiles/gcc.make Thu Jun 06 11:02:25 2013 -0700
@@ -71,6 +71,11 @@
CC = $(CC32)
endif
+ ifeq ($(USE_CLANG), true)
+ CXX = clang++
+ CC = clang
+ endif
+
HOSTCXX = $(CXX)
HOSTCC = $(CC)
endif
@@ -79,21 +84,79 @@
endif
-# -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
-# prints the numbers (e.g. "2.95", "3.2.1")
-CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
-CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
-
-# check for precompiled headers support
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
-# Allow the user to turn off precompiled headers from the command line.
-ifneq ($(USE_PRECOMPILED_HEADER),0)
-PRECOMPILED_HEADER_DIR=.
-PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
-PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
-endif
+ifeq ($(USE_CLANG), true)
+ CC_VER_MAJOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f1)
+ CC_VER_MINOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f2)
+else
+ # -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
+ # prints the numbers (e.g. "2.95", "3.2.1")
+ CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
+ CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
endif
+ifeq ($(USE_CLANG), true)
+ # clang has precompiled headers support by default, but the user can switch
+ # it off by using 'USE_PRECOMPILED_HEADER=0'.
+ ifdef LP64
+ ifeq ($(USE_PRECOMPILED_HEADER),)
+ USE_PRECOMPILED_HEADER=1
+ endif
+ else
+ # We don't support precompiled headers on 32-bit builds because there some files are
+ # compiled with -fPIC while others are compiled without (see 'NONPIC_OBJ_FILES' rules.make)
+ # Clang produces an error if the PCH file was compiled with other options than the actual compilation unit.
+ USE_PRECOMPILED_HEADER=0
+ endif
+
+ ifeq ($(USE_PRECOMPILED_HEADER),1)
+
+ ifndef LP64
+ $(error " Precompiled Headers only supported on 64-bit platforms!")
+ endif
+
+ PRECOMPILED_HEADER_DIR=.
+ PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
+ PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch
+
+ PCH_FLAG = -include precompiled.hpp
+ PCH_FLAG/DEFAULT = $(PCH_FLAG)
+ PCH_FLAG/NO_PCH = -DNO_PCH
+ PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@))
+
+ VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE)
+ VM_PCH_FLAG/AOUT =
+ VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO))
+
+ # We only use precompiled headers for the JVM build
+ CFLAGS += $(VM_PCH_FLAG)
+
+ # There are some files which don't like precompiled headers
+ # The following files are build with 'OPT_CFLAGS/NOOPT' (-O0) in the opt build.
+ # But Clang doesn't support a precompiled header which was compiled with -O3
+ # to be used in a compilation unit which uses '-O0'. We could also prepare an
+ # extra '-O0' PCH file for the opt build and use it here, but it's probably
+ # not worth the effort as long as only two files need this special handling.
+ PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
+ PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
+ PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
+
+ endif
+else # ($(USE_CLANG), true)
+ # check for precompiled headers support
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
+ # Allow the user to turn off precompiled headers from the command line.
+ ifneq ($(USE_PRECOMPILED_HEADER),0)
+ PRECOMPILED_HEADER_DIR=.
+ PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
+ PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
+ endif
+ endif
+endif
+
+# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
+ifeq ($(USE_PRECOMPILED_HEADER),0)
+ CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
+endif
#------------------------------------------------------------------------
# Compiler flags
@@ -115,17 +178,31 @@
CFLAGS += $(VM_PICFLAG)
CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions
-CFLAGS += -pthread
-CFLAGS += -fcheck-new
-# version 4 and above support fvisibility=hidden (matches jni_x86.h file)
-# except 4.1.2 gives pointless warnings that can't be disabled (afaik)
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
-CFLAGS += -fvisibility=hidden
+ifeq ($(USE_CLANG),)
+ CFLAGS += -pthread
+ CFLAGS += -fcheck-new
+ # version 4 and above support fvisibility=hidden (matches jni_x86.h file)
+ # except 4.1.2 gives pointless warnings that can't be disabled (afaik)
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ CFLAGS += -fvisibility=hidden
+ endif
+else
+ CFLAGS += -fvisibility=hidden
+endif
+
+ifeq ($(USE_CLANG), true)
+ # Before Clang 3.1, we had to pass the stack alignment specification directly to llvm with the help of '-mllvm'
+ # Starting with version 3.1, Clang understands the '-mstack-alignment' (and rejects '-mllvm -stack-alignment')
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 1 \) \))" "0"
+ STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mstack-alignment=16
+ else
+ STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mllvm -stack-alignment=16
+ endif
endif
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486 = -m32 -march=i586
-ARCHFLAG/amd64 = -m64
+ARCHFLAG/amd64 = -m64 $(STACK_ALIGNMENT_OPT)
ARCHFLAG/ia64 =
ARCHFLAG/sparc = -m32 -mcpu=v9
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
@@ -163,14 +240,25 @@
WARNINGS_ARE_ERRORS = -Werror
endif
-# Except for a few acceptable ones
-# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
-# conversions which might affect the values. To avoid that, we need to turn
-# it off explicitly.
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ifeq ($(USE_CLANG), true)
+ # However we need to clean the code up before we can unrestrictedly enable this option with Clang
+ WARNINGS_ARE_ERRORS += -Wno-unused-value -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
+ WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-compare
+# Not yet supported by clang in Xcode 4.6.2
+# WARNINGS_ARE_ERRORS += -Wno-tautological-constant-out-of-range-compare
+ WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
+ WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
+endif
+
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
-else
-WARNING_FLAGS = -Wpointer-arith -Wconversion -Wsign-compare -Wundef
+
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ # Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
+ # conversions which might affect the values. Only enable it in earlier versions.
+ WARNING_FLAGS = -Wunused-function
+ ifeq ($(USE_CLANG),)
+ WARNINGS_FLAGS += -Wconversion
+ endif
endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
@@ -214,14 +302,24 @@
OPT_CFLAGS/NOOPT=-O0
-# 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
-ifneq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) = 3 \) \))" "0"
-OPT_CFLAGS/mulnode.o += -O0
+# Work around some compiler bugs.
+ifeq ($(USE_CLANG), true)
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ endif
+else
+ # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1)
+ OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT)
+ endif
endif
# Flags for generating make dependency flags.
-ifneq ("${CC_VER_MAJOR}", "2")
-DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
+DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
+ifeq ($(USE_CLANG),)
+ ifneq ($(CC_VER_MAJOR), 2)
+ DEPFLAGS += -fpch-deps
+ endif
endif
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
@@ -249,13 +347,15 @@
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
-# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
-ifneq ("${CC_VER_MAJOR}", "2")
-STATIC_LIBGCC += -static-libgcc
-endif
+ifeq ($(USE_CLANG),)
+ # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
+ ifneq ("${CC_VER_MAJOR}", "2")
+ STATIC_LIBGCC += -static-libgcc
+ endif
-ifeq ($(BUILDARCH), ia64)
-LFLAGS += -Wl,-relax
+ ifeq ($(BUILDARCH), ia64)
+ LFLAGS += -Wl,-relax
+ endif
endif
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
@@ -296,25 +396,31 @@
#------------------------------------------------------------------------
# Debug flags
-# Use the stabs format for debugging information (this is the default
-# on gcc-2.91). It's good enough, has all the information about line
-# numbers and local variables, and libjvm.so is only about 16M.
-# Change this back to "-g" if you want the most expressive format.
-# (warning: that could easily inflate libjvm.so to 150M!)
-# Note: The Itanium gcc compiler crashes when using -gstabs.
-DEBUG_CFLAGS/ia64 = -g
-DEBUG_CFLAGS/amd64 = -g
-DEBUG_CFLAGS/arm = -g
-DEBUG_CFLAGS/ppc = -g
-DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
-ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
-DEBUG_CFLAGS += -gstabs
+ifeq ($(USE_CLANG), true)
+ # Restrict the debug information created by Clang to avoid
+ # too big object files and speed the build up a little bit
+ # (see http://llvm.org/bugs/show_bug.cgi?id=7554)
+ CFLAGS += -flimit-debug-info
endif
-# DEBUG_BINARIES overrides everything, use full -g debug information
+# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
- DEBUG_CFLAGS = -g
- CFLAGS += $(DEBUG_CFLAGS)
+ CFLAGS += -g
+else
+ # Use the stabs format for debugging information (this is the default
+ # on gcc-2.91). It's good enough, has all the information about line
+ # numbers and local variables, and libjvm.so is only about 16M.
+ # Change this back to "-g" if you want the most expressive format.
+ # (warning: that could easily inflate libjvm.so to 150M!)
+ # Note: The Itanium gcc compiler crashes when using -gstabs.
+ DEBUG_CFLAGS/ia64 = -g
+ DEBUG_CFLAGS/amd64 = -g
+ DEBUG_CFLAGS/arm = -g
+ DEBUG_CFLAGS/ppc = -g
+ DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
+ ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
+ DEBUG_CFLAGS += -gstabs
+ endif
endif
# If we are building HEADLESS, pass on to VM
--- a/hotspot/make/bsd/makefiles/vm.make Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/make/bsd/makefiles/vm.make Thu Jun 06 11:02:25 2013 -0700
@@ -126,7 +126,11 @@
LFLAGS += -Xlinker -z -Xlinker noexecstack
endif
-LIBS += -lm -pthread
+LIBS += -lm
+
+ifeq ($(USE_CLANG),)
+ LIBS += -pthread
+endif
# By default, link the *.o into the library, not the executable.
LINK_INTO$(LINK_INTO) = LIBJVM
--- a/hotspot/make/linux/makefiles/adlc.make Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/make/linux/makefiles/adlc.make Thu Jun 06 11:02:25 2013 -0700
@@ -68,7 +68,7 @@
# CFLAGS_WARN holds compiler options to suppress/enable warnings.
# Compiler warnings are treated as errors
-CFLAGS_WARN = -Werror
+CFLAGS_WARN = $(WARNINGS_ARE_ERRORS)
CFLAGS += $(CFLAGS_WARN)
OBJECTNAMES = \
--- a/hotspot/make/linux/makefiles/gcc.make Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/make/linux/makefiles/gcc.make Thu Jun 06 11:02:25 2013 -0700
@@ -36,8 +36,14 @@
HOSTCC = gcc
STRIP = $(ALT_COMPILER_PATH)/strip
else
- CXX = g++
- CC = gcc
+ ifeq ($(USE_CLANG), true)
+ CXX = clang++
+ CC = clang
+ else
+ CXX = g++
+ CC = gcc
+ endif
+
HOSTCXX = $(CXX)
HOSTCC = $(CC)
STRIP = strip
@@ -46,19 +52,79 @@
endif
-# -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
-# prints the numbers (e.g. "2.95", "3.2.1")
-CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
-CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
+ifeq ($(USE_CLANG), true)
+ CC_VER_MAJOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f1)
+ CC_VER_MINOR := $(shell $(CC) -v 2>&1 | grep version | sed "s/.*version \([0-9]*\.[0-9]*\).*/\1/" | cut -d'.' -f2)
+else
+ # -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
+ # prints the numbers (e.g. "2.95", "3.2.1")
+ CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
+ CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
+endif
+
+
+ifeq ($(USE_CLANG), true)
+ # Clang has precompiled headers support by default, but the user can switch
+ # it off by using 'USE_PRECOMPILED_HEADER=0'.
+ ifdef LP64
+ ifeq ($(USE_PRECOMPILED_HEADER),)
+ USE_PRECOMPILED_HEADER=1
+ endif
+ else
+ # We don't support precompiled headers on 32-bit builds because there some files are
+ # compiled with -fPIC while others are compiled without (see 'NONPIC_OBJ_FILES' rules.make)
+ # Clang produces an error if the PCH file was compiled with other options than the actual compilation unit.
+ USE_PRECOMPILED_HEADER=0
+ endif
+
+ ifeq ($(USE_PRECOMPILED_HEADER),1)
+
+ ifndef LP64
+ $(error " Precompiled Headers only supported on 64-bit platforms!")
+ endif
+
+ PRECOMPILED_HEADER_DIR=.
+ PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
+ PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch
-# check for precompiled headers support
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
-# Allow the user to turn off precompiled headers from the command line.
-ifneq ($(USE_PRECOMPILED_HEADER),0)
-PRECOMPILED_HEADER_DIR=.
-PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
-PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
+ PCH_FLAG = -include precompiled.hpp
+ PCH_FLAG/DEFAULT = $(PCH_FLAG)
+ PCH_FLAG/NO_PCH = -DNO_PCH
+ PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@))
+
+ VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE)
+ VM_PCH_FLAG/AOUT =
+ VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO))
+
+ # We only use precompiled headers for the JVM build
+ CFLAGS += $(VM_PCH_FLAG)
+
+ # There are some files which don't like precompiled headers
+ # The following files are build with 'OPT_CFLAGS/NOOPT' (-O0) in the opt build.
+ # But Clang doesn't support a precompiled header which was compiled with -O3
+ # to be used in a compilation unit which uses '-O0'. We could also prepare an
+ # extra '-O0' PCH file for the opt build and use it here, but it's probably
+ # not worth the effoert as long as only two files need this special handling.
+ PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH)
+ PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH)
+ PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH)
+
+ endif
+else # ($(USE_CLANG), true)
+ # check for precompiled headers support
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
+ # Allow the user to turn off precompiled headers from the command line.
+ ifneq ($(USE_PRECOMPILED_HEADER),0)
+ PRECOMPILED_HEADER_DIR=.
+ PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp
+ PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
+ endif
+ endif
endif
+
+# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
+ifeq ($(USE_PRECOMPILED_HEADER),0)
+ CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
endif
@@ -83,16 +149,30 @@
CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions
CFLAGS += -D_REENTRANT
-CFLAGS += -fcheck-new
-# version 4 and above support fvisibility=hidden (matches jni_x86.h file)
-# except 4.1.2 gives pointless warnings that can't be disabled (afaik)
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
-CFLAGS += -fvisibility=hidden
+ifeq ($(USE_CLANG),)
+ CFLAGS += -fcheck-new
+ # version 4 and above support fvisibility=hidden (matches jni_x86.h file)
+ # except 4.1.2 gives pointless warnings that can't be disabled (afaik)
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ CFLAGS += -fvisibility=hidden
+ endif
+else
+ CFLAGS += -fvisibility=hidden
+endif
+
+ifeq ($(USE_CLANG), true)
+ # Before Clang 3.1, we had to pass the stack alignment specification directly to llvm with the help of '-mllvm'
+ # Starting with version 3.1, Clang understands the '-mstack-alignment' (and rejects '-mllvm -stack-alignment')
+ ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 1 \) \))" "0"
+ STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mstack-alignment=16
+ else
+ STACK_ALIGNMENT_OPT = -mno-omit-leaf-frame-pointer -mllvm -stack-alignment=16
+ endif
endif
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
ARCHFLAG/i486 = -m32 -march=i586
-ARCHFLAG/amd64 = -m64
+ARCHFLAG/amd64 = -m64 $(STACK_ALIGNMENT_OPT)
ARCHFLAG/ia64 =
ARCHFLAG/sparc = -m32 -mcpu=v9
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
@@ -126,12 +206,22 @@
# Compiler warnings are treated as errors
WARNINGS_ARE_ERRORS = -Werror
+ifeq ($(USE_CLANG), true)
+ # However we need to clean the code up before we can unrestrictedly enable this option with Clang
+ WARNINGS_ARE_ERRORS += -Wno-unused-value -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
+ WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-constant-out-of-range-compare -Wno-tautological-compare
+ WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
+ WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
+endif
+
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function
-# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
-# conversions which might affect the values. Only enable it in earlier versions.
-ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
-WARNING_FLAGS += -Wconversion
+ifeq ($(USE_CLANG),)
+ # Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
+ # conversions which might affect the values. Only enable it in earlier versions.
+ ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ WARNING_FLAGS += -Wconversion
+ endif
endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
@@ -165,19 +255,24 @@
OPT_CFLAGS/NOOPT=-O0
-# 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
-ifneq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) = 3 \) \))" "0"
-OPT_CFLAGS/mulnode.o += -O0
+# Work around some compiler bugs.
+ifeq ($(USE_CLANG), true)
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ endif
+else
+ # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
+ ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1)
+ OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT)
+ endif
endif
# Flags for generating make dependency flags.
-ifneq ("${CC_VER_MAJOR}", "2")
-DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
-endif
-
-# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
-ifeq ($(USE_PRECOMPILED_HEADER),0)
-CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
+DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
+ifeq ($(USE_CLANG),)
+ ifneq ("${CC_VER_MAJOR}", "2")
+ DEPFLAGS += -fpch-deps
+ endif
endif
#------------------------------------------------------------------------
@@ -186,24 +281,33 @@
# statically link libstdc++.so, work with gcc but ignored by g++
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
-# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
-ifneq ("${CC_VER_MAJOR}", "2")
-STATIC_LIBGCC += -static-libgcc
-endif
+ifeq ($(USE_CLANG),)
+ # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
+ ifneq ("${CC_VER_MAJOR}", "2")
+ STATIC_LIBGCC += -static-libgcc
+ endif
-ifeq ($(BUILDARCH), ia64)
-LFLAGS += -Wl,-relax
+ ifeq ($(BUILDARCH), ia64)
+ LFLAGS += -Wl,-relax
+ endif
endif
# Enable linker optimization
LFLAGS += -Xlinker -O1
-# If this is a --hash-style=gnu system, use --hash-style=both
-# The gnu .hash section won't work on some Linux systems like SuSE 10.
-_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
-ifneq ($(_HAS_HASH_STYLE_GNU),)
+ifeq ($(USE_CLANG),)
+ # If this is a --hash-style=gnu system, use --hash-style=both
+ # The gnu .hash section won't work on some Linux systems like SuSE 10.
+ _HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
+ ifneq ($(_HAS_HASH_STYLE_GNU),)
+ LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
+ endif
+else
+ # Don't know how to find out the 'hash style' of a system as '-dumpspecs'
+ # doesn't work for Clang. So for now we'll alwys use --hash-style=both
LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
endif
+
LFLAGS += $(LDFLAGS_HASH_STYLE)
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
@@ -221,6 +325,13 @@
#------------------------------------------------------------------------
# Debug flags
+ifeq ($(USE_CLANG), true)
+ # Restrict the debug information created by Clang to avoid
+ # too big object files and speed the build up a little bit
+ # (see http://llvm.org/bugs/show_bug.cgi?id=7554)
+ CFLAGS += -flimit-debug-info
+endif
+
# DEBUG_BINARIES uses full -g debug information for all configs
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
@@ -237,7 +348,12 @@
DEBUG_CFLAGS/ppc = -g
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
- DEBUG_CFLAGS += -gstabs
+ ifeq ($(USE_CLANG), true)
+ # Clang doesn't understand -gstabs
+ OPT_CFLAGS += -g
+ else
+ OPT_CFLAGS += -gstabs
+ endif
endif
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
@@ -247,7 +363,12 @@
FASTDEBUG_CFLAGS/ppc = -g
FASTDEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(FASTDEBUG_CFLAGS/$(BUILDARCH)),)
- FASTDEBUG_CFLAGS += -gstabs
+ ifeq ($(USE_CLANG), true)
+ # Clang doesn't understand -gstabs
+ OPT_CFLAGS += -g
+ else
+ OPT_CFLAGS += -gstabs
+ endif
endif
OPT_CFLAGS/ia64 = -g
@@ -256,7 +377,12 @@
OPT_CFLAGS/ppc = -g
OPT_CFLAGS += $(OPT_CFLAGS/$(BUILDARCH))
ifeq ($(OPT_CFLAGS/$(BUILDARCH)),)
- OPT_CFLAGS += -gstabs
+ ifeq ($(USE_CLANG), true)
+ # Clang doesn't understand -gstabs
+ OPT_CFLAGS += -g
+ else
+ OPT_CFLAGS += -gstabs
+ endif
endif
endif
endif
--- a/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1065,7 +1065,7 @@
const int slop_factor = 2*wordSize;
const int fixed_size = ((sizeof(BytecodeInterpreter) + slop_factor) >> LogBytesPerWord) + // what is the slop factor?
- //6815692//Method::extra_stack_words() + // extra push slots for MH adapters
+ Method::extra_stack_entries() + // extra stack for jsr 292
frame::memory_parameter_word_sp_offset + // register save area + param window
(native ? frame::interpreter_frame_extra_outgoing_argument_words : 0); // JNI, class
@@ -1221,9 +1221,7 @@
// Full size expression stack
__ ld_ptr(constMethod, O3);
__ lduh(O3, in_bytes(ConstMethod::max_stack_offset()), O3);
- guarantee(!EnableInvokeDynamic, "no support yet for java.lang.invoke.MethodHandle"); //6815692
- //6815692//if (EnableInvokeDynamic)
- //6815692// __ inc(O3, Method::extra_stack_entries());
+ __ inc(O3, Method::extra_stack_entries());
__ sll(O3, LogBytesPerWord, O3);
__ sub(O2, O3, O3);
// __ sub(O3, wordSize, O3); // so prepush doesn't look out of bounds
@@ -2084,9 +2082,7 @@
const int fixed_size = sizeof(BytecodeInterpreter)/wordSize + // interpreter state object
frame::memory_parameter_word_sp_offset; // register save area + param window
- const int extra_stack = 0; //6815692//Method::extra_stack_entries();
return (round_to(max_stack +
- extra_stack +
slop_factor +
fixed_size +
monitor_size +
@@ -2173,8 +2169,7 @@
// Need +1 here because stack_base points to the word just above the first expr stack entry
// and stack_limit is supposed to point to the word just below the last expr stack entry.
// See generate_compute_interpreter_state.
- int extra_stack = 0; //6815692//Method::extra_stack_entries();
- to_fill->_stack_limit = stack_base - (method->max_stack() + 1 + extra_stack);
+ to_fill->_stack_limit = stack_base - (method->max_stack() + 1);
to_fill->_monitor_base = (BasicObjectLock*) monitor_base;
// sparc specific
--- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -521,7 +521,7 @@
// Compute max expression stack+register save area
ld_ptr(Lmethod, in_bytes(Method::const_offset()), Gframe_size);
lduh(Gframe_size, in_bytes(ConstMethod::max_stack_offset()), Gframe_size); // Load max stack.
- add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size );
+ add(Gframe_size, frame::memory_parameter_word_sp_offset+Method::extra_stack_entries(), Gframe_size );
//
// now set up a stack frame with the size computed above
--- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -507,7 +507,7 @@
const int extra_space =
rounded_vm_local_words + // frame local scratch space
- //6815692//Method::extra_stack_words() + // extra push slots for MH adapters
+ Method::extra_stack_entries() + // extra stack for jsr 292
frame::memory_parameter_word_sp_offset + // register save area
(native_call ? frame::interpreter_frame_extra_outgoing_argument_words : 0);
@@ -1558,7 +1558,6 @@
round_to(callee_extra_locals * Interpreter::stackElementWords, WordsPerLong);
const int max_stack_words = max_stack * Interpreter::stackElementWords;
return (round_to((max_stack_words
- //6815692//+ Method::extra_stack_words()
+ rounded_vm_local_words
+ frame::memory_parameter_word_sp_offset), WordsPerLong)
// already rounded
--- a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -539,12 +539,11 @@
// compute full expression stack limit
- const int extra_stack = 0; //6815692//Method::extra_stack_words();
__ movptr(rdx, Address(rbx, Method::const_offset()));
__ load_unsigned_short(rdx, Address(rdx, ConstMethod::max_stack_offset())); // get size of expression stack in words
__ negptr(rdx); // so we can subtract in next step
// Allocate expression stack
- __ lea(rsp, Address(rsp, rdx, Address::times_ptr, -extra_stack));
+ __ lea(rsp, Address(rsp, rdx, Address::times_ptr, -Method::extra_stack_words()));
__ movptr(STATE(_stack_limit), rsp);
}
@@ -692,10 +691,9 @@
// Always give one monitor to allow us to start interp if sync method.
// Any additional monitors need a check when moving the expression stack
const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize;
- const int extra_stack = 0; //6815692//Method::extra_stack_entries();
__ movptr(rax, Address(rbx, Method::const_offset()));
__ load_unsigned_short(rax, Address(rax, ConstMethod::max_stack_offset())); // get size of expression stack in words
- __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), extra_stack + one_monitor));
+ __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), one_monitor+Method::extra_stack_words()));
__ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size));
#ifdef ASSERT
@@ -2265,8 +2263,7 @@
const int overhead_size = sizeof(BytecodeInterpreter)/wordSize +
( frame::sender_sp_offset - frame::link_offset) + 2;
- const int extra_stack = 0; //6815692//Method::extra_stack_entries();
- const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
+ const int method_stack = (method->max_locals() + method->max_stack()) *
Interpreter::stackElementWords;
return overhead_size + method_stack + stub_code;
}
@@ -2331,8 +2328,7 @@
// Need +1 here because stack_base points to the word just above the first expr stack entry
// and stack_limit is supposed to point to the word just below the last expr stack entry.
// See generate_compute_interpreter_state.
- int extra_stack = 0; //6815692//Method::extra_stack_entries();
- to_fill->_stack_limit = stack_base - (method->max_stack() + extra_stack + 1);
+ to_fill->_stack_limit = stack_base - (method->max_stack() + 1);
to_fill->_monitor_base = (BasicObjectLock*) monitor_base;
to_fill->_self_link = to_fill;
@@ -2380,8 +2376,7 @@
monitor_size);
// Now with full size expression stack
- int extra_stack = 0; //6815692//Method::extra_stack_entries();
- int full_frame_size = short_frame_size + (method->max_stack() + extra_stack) * BytesPerWord;
+ int full_frame_size = short_frame_size + method->max_stack() * BytesPerWord;
// and now with only live portion of the expression stack
short_frame_size = short_frame_size + tempcount * BytesPerWord;
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1565,8 +1565,7 @@
// be sure to change this if you add/subtract anything to/from the overhead area
const int overhead_size = -frame::interpreter_frame_initial_sp_offset;
- const int extra_stack = Method::extra_stack_entries();
- const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
+ const int method_stack = (method->max_locals() + method->max_stack()) *
Interpreter::stackElementWords;
return overhead_size + method_stack + stub_code;
}
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1574,8 +1574,7 @@
-(frame::interpreter_frame_initial_sp_offset) + entry_size;
const int stub_code = frame::entry_frame_after_call_words;
- const int extra_stack = Method::extra_stack_entries();
- const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
+ const int method_stack = (method->max_locals() + method->max_stack()) *
Interpreter::stackElementWords;
return (overhead_size + method_stack + stub_code);
}
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -626,8 +626,6 @@
//////////////////////////////////////////////////////////////////////////////
// create new thread
-static address highest_vm_reserved_address();
-
// check if it's safe to start a new thread
static bool _thread_safety_check(Thread* thread) {
return true;
@@ -2112,10 +2110,6 @@
return anon_munmap(addr, size);
}
-static address highest_vm_reserved_address() {
- return _highest_vm_reserved_address;
-}
-
static bool bsd_mprotect(char* addr, size_t size, int prot) {
// Bsd wants the mprotect address argument to be page aligned.
char* bottom = (char*)align_size_down((intptr_t)addr, os::Bsd::page_size());
@@ -2159,43 +2153,6 @@
return false;
}
-/*
-* Set the coredump_filter bits to include largepages in core dump (bit 6)
-*
-* From the coredump_filter documentation:
-*
-* - (bit 0) anonymous private memory
-* - (bit 1) anonymous shared memory
-* - (bit 2) file-backed private memory
-* - (bit 3) file-backed shared memory
-* - (bit 4) ELF header pages in file-backed private memory areas (it is
-* effective only if the bit 2 is cleared)
-* - (bit 5) hugetlb private memory
-* - (bit 6) hugetlb shared memory
-*/
-static void set_coredump_filter(void) {
- FILE *f;
- long cdm;
-
- if ((f = fopen("/proc/self/coredump_filter", "r+")) == NULL) {
- return;
- }
-
- if (fscanf(f, "%lx", &cdm) != 1) {
- fclose(f);
- return;
- }
-
- rewind(f);
-
- if ((cdm & LARGEPAGES_BIT) == 0) {
- cdm |= LARGEPAGES_BIT;
- fprintf(f, "%#lx", cdm);
- }
-
- fclose(f);
-}
-
// Large page support
static size_t _large_page_size = 0;
--- a/hotspot/src/os_cpu/linux_x86/vm/linux_x86_32.s Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/os_cpu/linux_x86/vm/linux_x86_32.s Thu Jun 06 11:02:25 2013 -0700
@@ -241,7 +241,7 @@
jbe 2f # <= 32 dwords
rep; smovl
jmp 4f
- .=.+8
+ .space 8
2: subl %esi,%edi
.p2align 4,,15
3: movl (%esi),%edx
@@ -378,7 +378,7 @@
rep; smovl
jmp 4f
# copy aligned dwords
- .=.+5
+ .space 5
2: subl %esi,%edi
.p2align 4,,15
3: movl (%esi),%edx
@@ -454,7 +454,7 @@
popl %edi
popl %esi
ret
- .=.+10
+ .space 10
2: subl %esi,%edi
jmp 4f
.p2align 4,,15
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -93,6 +93,10 @@
register void *esp;
__asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
return (address) ((char*)esp + sizeof(long)*2);
+#elif defined(__clang__)
+ intptr_t* esp;
+ __asm__ __volatile__ ("mov %%"SPELL_REG_SP", %0":"=r"(esp):);
+ return (address) esp;
#else
register void *esp __asm__ (SPELL_REG_SP);
return (address) esp;
@@ -175,6 +179,9 @@
#ifdef SPARC_WORKS
register intptr_t **ebp;
__asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
+#elif defined(__clang__)
+ intptr_t **ebp;
+ __asm__ __volatile__ ("mov %%"SPELL_REG_FP", %0":"=r"(ebp):);
#else
register intptr_t **ebp __asm__ (SPELL_REG_FP);
#endif
--- a/hotspot/src/share/vm/adlc/archDesc.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/adlc/archDesc.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -29,8 +29,8 @@
static FILE *errfile = stderr;
//--------------------------- utility functions -----------------------------
-inline char toUpper(char lower) {
- return (('a' <= lower && lower <= 'z') ? (lower + ('A'-'a')) : lower);
+inline char toUpper(char lower) {
+ return (('a' <= lower && lower <= 'z') ? ((char) (lower + ('A'-'a'))) : lower);
}
char *toUpper(const char *str) {
char *upper = new char[strlen(str)+1];
--- a/hotspot/src/share/vm/adlc/dict2.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/adlc/dict2.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -64,18 +64,18 @@
int i;
// Precompute table of null character hashes
- if( !initflag ) { // Not initializated yet?
- xsum[0] = (1<<shft[0])+1; // Initialize
+ if (!initflag) { // Not initializated yet?
+ xsum[0] = (short) ((1 << shft[0]) + 1); // Initialize
for( i = 1; i < MAXID; i++) {
- xsum[i] = (1<<shft[i])+1+xsum[i-1];
+ xsum[i] = (short) ((1 << shft[i]) + 1 + xsum[i-1]);
}
initflag = 1; // Never again
}
_size = 16; // Size is a power of 2
_cnt = 0; // Dictionary is empty
- _bin = (bucket*)_arena->Amalloc_4(sizeof(bucket)*_size);
- memset(_bin,0,sizeof(bucket)*_size);
+ _bin = (bucket*)_arena->Amalloc_4(sizeof(bucket) * _size);
+ memset(_bin, 0, sizeof(bucket) * _size);
}
//------------------------------~Dict------------------------------------------
@@ -287,11 +287,11 @@
register int sum = 0;
register const char *s = (const char *)t;
- while( ((c = s[k]) != '\0') && (k < MAXID-1) ) { // Get characters till nul
- c = (c<<1)+1; // Characters are always odd!
- sum += c + (c<<shft[k++]); // Universal hash function
+ while (((c = s[k]) != '\0') && (k < MAXID-1)) { // Get characters till nul
+ c = (char) ((c << 1) + 1); // Characters are always odd!
+ sum += c + (c << shft[k++]); // Universal hash function
}
- assert( k < (MAXID), "Exceeded maximum name length");
+ assert(k < (MAXID), "Exceeded maximum name length");
return (int)((sum+xsum[k]) >> 1); // Hash key, un-modulo'd table size
}
--- a/hotspot/src/share/vm/adlc/formssel.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -796,11 +796,11 @@
return num_opnds;
}
-const char *InstructForm::opnd_ident(int idx) {
+const char* InstructForm::opnd_ident(int idx) {
return _components.at(idx)->_name;
}
-const char *InstructForm::unique_opnd_ident(int idx) {
+const char* InstructForm::unique_opnd_ident(uint idx) {
uint i;
for (i = 1; i < num_opnds(); ++i) {
if (unique_opnds_idx(i) == idx) {
@@ -1315,36 +1315,36 @@
// Seach through operands to determine parameters unique positions.
void InstructForm::set_unique_opnds() {
uint* uniq_idx = NULL;
- int nopnds = num_opnds();
+ uint nopnds = num_opnds();
uint num_uniq = nopnds;
- int i;
+ uint i;
_uniq_idx_length = 0;
- if ( nopnds > 0 ) {
+ if (nopnds > 0) {
// Allocate index array. Worst case we're mapping from each
// component back to an index and any DEF always goes at 0 so the
// length of the array has to be the number of components + 1.
_uniq_idx_length = _components.count() + 1;
- uniq_idx = (uint*) malloc(sizeof(uint)*(_uniq_idx_length));
- for( i = 0; i < _uniq_idx_length; i++ ) {
+ uniq_idx = (uint*) malloc(sizeof(uint) * _uniq_idx_length);
+ for (i = 0; i < _uniq_idx_length; i++) {
uniq_idx[i] = i;
}
}
// Do it only if there is a match rule and no expand rule. With an
// expand rule it is done by creating new mach node in Expand()
// method.
- if ( nopnds > 0 && _matrule != NULL && _exprule == NULL ) {
+ if (nopnds > 0 && _matrule != NULL && _exprule == NULL) {
const char *name;
uint count;
bool has_dupl_use = false;
_parameters.reset();
- while( (name = _parameters.iter()) != NULL ) {
+ while ((name = _parameters.iter()) != NULL) {
count = 0;
- int position = 0;
- int uniq_position = 0;
+ uint position = 0;
+ uint uniq_position = 0;
_components.reset();
Component *comp = NULL;
- if( sets_result() ) {
+ if (sets_result()) {
comp = _components.iter();
position++;
}
@@ -1352,11 +1352,11 @@
for (; (comp = _components.iter()) != NULL; ++position) {
// When the first component is not a DEF,
// leave space for the result operand!
- if ( position==0 && (! comp->isa(Component::DEF)) ) {
+ if (position==0 && (!comp->isa(Component::DEF))) {
++position;
}
- if( strcmp(name, comp->_name)==0 ) {
- if( ++count > 1 ) {
+ if (strcmp(name, comp->_name) == 0) {
+ if (++count > 1) {
assert(position < _uniq_idx_length, "out of bounds");
uniq_idx[position] = uniq_position;
has_dupl_use = true;
@@ -1364,22 +1364,25 @@
uniq_position = position;
}
}
- if( comp->isa(Component::DEF)
- && comp->isa(Component::USE) ) {
+ if (comp->isa(Component::DEF) && comp->isa(Component::USE)) {
++position;
- if( position != 1 )
+ if (position != 1)
--position; // only use two slots for the 1st USE_DEF
}
}
}
- if( has_dupl_use ) {
- for( i = 1; i < nopnds; i++ )
- if( i != uniq_idx[i] )
+ if (has_dupl_use) {
+ for (i = 1; i < nopnds; i++) {
+ if (i != uniq_idx[i]) {
break;
- int j = i;
- for( ; i < nopnds; i++ )
- if( i == uniq_idx[i] )
+ }
+ }
+ uint j = i;
+ for (; i < nopnds; i++) {
+ if (i == uniq_idx[i]) {
uniq_idx[i] = j++;
+ }
+ }
num_uniq = j;
}
}
@@ -2216,21 +2219,27 @@
bool OperandForm::is_bound_register() const {
- RegClass *reg_class = get_RegClass();
- if (reg_class == NULL) return false;
-
- const char * name = ideal_type(globalAD->globalNames());
- if (name == NULL) return false;
-
- int size = 0;
- if (strcmp(name,"RegFlags")==0) size = 1;
- if (strcmp(name,"RegI")==0) size = 1;
- if (strcmp(name,"RegF")==0) size = 1;
- if (strcmp(name,"RegD")==0) size = 2;
- if (strcmp(name,"RegL")==0) size = 2;
- if (strcmp(name,"RegN")==0) size = 1;
- if (strcmp(name,"RegP")==0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1;
- if (size == 0) return false;
+ RegClass* reg_class = get_RegClass();
+ if (reg_class == NULL) {
+ return false;
+ }
+
+ const char* name = ideal_type(globalAD->globalNames());
+ if (name == NULL) {
+ return false;
+ }
+
+ uint size = 0;
+ if (strcmp(name, "RegFlags") == 0) size = 1;
+ if (strcmp(name, "RegI") == 0) size = 1;
+ if (strcmp(name, "RegF") == 0) size = 1;
+ if (strcmp(name, "RegD") == 0) size = 2;
+ if (strcmp(name, "RegL") == 0) size = 2;
+ if (strcmp(name, "RegN") == 0) size = 1;
+ if (strcmp(name, "RegP") == 0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1;
+ if (size == 0) {
+ return false;
+ }
return size == reg_class->size();
}
--- a/hotspot/src/share/vm/adlc/formssel.hpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/adlc/formssel.hpp Thu Jun 06 11:02:25 2013 -0700
@@ -106,7 +106,7 @@
const char *_ins_pipe; // Instruction Scheduling description class
uint *_uniq_idx; // Indexes of unique operands
- int _uniq_idx_length; // Length of _uniq_idx array
+ uint _uniq_idx_length; // Length of _uniq_idx array
uint _num_uniq; // Number of unique operands
ComponentList _components; // List of Components matches MachNode's
// operand structure
@@ -272,14 +272,14 @@
void set_unique_opnds();
uint num_unique_opnds() { return _num_uniq; }
uint unique_opnds_idx(int idx) {
- if( _uniq_idx != NULL && idx > 0 ) {
- assert(idx < _uniq_idx_length, "out of bounds");
- return _uniq_idx[idx];
- } else {
- return idx;
- }
+ if (_uniq_idx != NULL && idx > 0) {
+ assert((uint)idx < _uniq_idx_length, "out of bounds");
+ return _uniq_idx[idx];
+ } else {
+ return idx;
+ }
}
- const char *unique_opnd_ident(int idx); // Name of operand at unique idx.
+ const char *unique_opnd_ident(uint idx); // Name of operand at unique idx.
// Operands which are only KILLs aren't part of the input array and
// require special handling in some cases. Their position in this
--- a/hotspot/src/share/vm/adlc/output_c.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/adlc/output_c.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -463,8 +463,9 @@
uint resources_used_exclusively = 0;
for (pipeclass->_resUsage.reset();
- (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; )
+ (piperesource = (const PipeClassResourceForm*)pipeclass->_resUsage.iter()) != NULL; ) {
element_count++;
+ }
// Pre-compute the string length
int templen;
@@ -482,8 +483,8 @@
for (i = rescount; i > 0; i /= 10)
maskdigit++;
- static const char * pipeline_use_cycle_mask = "Pipeline_Use_Cycle_Mask";
- static const char * pipeline_use_element = "Pipeline_Use_Element";
+ static const char* pipeline_use_cycle_mask = "Pipeline_Use_Cycle_Mask";
+ static const char* pipeline_use_element = "Pipeline_Use_Element";
templen = 1 +
(int)(strlen(pipeline_use_cycle_mask) + (int)strlen(pipeline_use_element) +
@@ -496,11 +497,12 @@
templen = 0;
for (pipeclass->_resUsage.reset();
- (piperesource = (const PipeClassResourceForm *)pipeclass->_resUsage.iter()) != NULL; ) {
+ (piperesource = (const PipeClassResourceForm*)pipeclass->_resUsage.iter()) != NULL; ) {
int used_mask = pipeline->_resdict[piperesource->_resource]->is_resource()->mask();
- if (!used_mask)
+ if (!used_mask) {
fprintf(stderr, "*** used_mask is 0 ***\n");
+ }
resources_used |= used_mask;
@@ -509,8 +511,9 @@
for (lb = 0; (used_mask & (1 << lb)) == 0; lb++);
for (ub = 31; (used_mask & (1 << ub)) == 0; ub--);
- if (lb == ub)
+ if (lb == ub) {
resources_used_exclusively |= used_mask;
+ }
int formatlen =
sprintf(&resource_mask[templen], " %s(0x%0*x, %*d, %*d, %s %s(",
@@ -526,7 +529,7 @@
int cycles = piperesource->_cycles;
uint stage = pipeline->_stages.index(piperesource->_stage);
- if (NameList::Not_in_list == stage) {
+ if ((uint)NameList::Not_in_list == stage) {
fprintf(stderr,
"pipeline_res_mask_initializer: "
"semantic error: "
@@ -534,8 +537,8 @@
piperesource->_stage);
exit(1);
}
- uint upper_limit = stage+cycles-1;
- uint lower_limit = stage-1;
+ uint upper_limit = stage + cycles - 1;
+ uint lower_limit = stage - 1;
uint upper_idx = upper_limit >> 5;
uint lower_idx = lower_limit >> 5;
uint upper_position = upper_limit & 0x1f;
@@ -543,7 +546,7 @@
uint mask = (((uint)1) << upper_position) - 1;
- while ( upper_idx > lower_idx ) {
+ while (upper_idx > lower_idx) {
res_mask[upper_idx--] |= mask;
mask = (uint)-1;
}
@@ -565,8 +568,9 @@
}
resource_mask[templen] = 0;
- if (last_comma)
+ if (last_comma) {
last_comma[0] = ' ';
+ }
// See if the same string is in the table
int ndx = pipeline_res_mask.index(resource_mask);
@@ -580,7 +584,7 @@
fprintf(fp_cpp, "static const Pipeline_Use_Element pipeline_res_mask_%03d[%d] = {\n%s};\n\n",
ndx+1, element_count, resource_mask);
- char * args = new char [9 + 2*masklen + maskdigit];
+ char* args = new char [9 + 2*masklen + maskdigit];
sprintf(args, "0x%0*x, 0x%0*x, %*d",
masklen, resources_used,
@@ -589,8 +593,9 @@
pipeline_res_args.addName(args);
}
- else
+ else {
delete [] resource_mask;
+ }
delete [] res_mask;
//delete [] res_masks;
@@ -1787,7 +1792,7 @@
// Skip first unique operands.
for( i = 1; i < cur_num_opnds; i++ ) {
comp = node->_components.iter();
- if( (int)i != node->unique_opnds_idx(i) ) {
+ if (i != node->unique_opnds_idx(i)) {
break;
}
new_num_opnds++;
@@ -1795,7 +1800,7 @@
// Replace not unique operands with next unique operands.
for( ; i < cur_num_opnds; i++ ) {
comp = node->_components.iter();
- int j = node->unique_opnds_idx(i);
+ uint j = node->unique_opnds_idx(i);
// unique_opnds_idx(i) is unique if unique_opnds_idx(j) is not unique.
if( j != node->unique_opnds_idx(j) ) {
fprintf(fp," set_opnd_array(%d, opnd_array(%d)->clone(C)); // %s\n",
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -2232,6 +2232,7 @@
// We still need to continue with the checks.
if (src.is_constant()) {
ciObject* src_con = src.get_jobject_constant();
+ guarantee(src_con != NULL, "no source constant");
if (src_con->is_null_object()) {
// The constant src object is null - We can skip
--- a/hotspot/src/share/vm/code/nmethod.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/code/nmethod.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1976,11 +1976,10 @@
if (!method()->is_native()) {
SimpleScopeDesc ssd(this, fr.pc());
Bytecode_invoke call(ssd.method(), ssd.bci());
- // compiled invokedynamic call sites have an implicit receiver at
- // resolution time, so make sure it gets GC'ed.
- bool has_receiver = !call.is_invokestatic();
+ bool has_receiver = call.has_receiver();
+ bool has_appendix = call.has_appendix();
Symbol* signature = call.signature();
- fr.oops_compiled_arguments_do(signature, has_receiver, reg_map, f);
+ fr.oops_compiled_arguments_do(signature, has_receiver, has_appendix, reg_map, f);
}
#endif // !SHARK
}
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1642,42 +1642,37 @@
// Set up state required by +LogCompilation.
void CompileBroker::init_compiler_thread_log() {
CompilerThread* thread = CompilerThread::current();
- char fileBuf[4*K];
+ char file_name[4*K];
FILE* fp = NULL;
- char* file = NULL;
intx thread_id = os::current_thread_id();
for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) {
const char* dir = (try_temp_dir ? os::get_temp_directory() : NULL);
if (dir == NULL) {
- jio_snprintf(fileBuf, sizeof(fileBuf), "hs_c" UINTX_FORMAT "_pid%u.log",
+ jio_snprintf(file_name, sizeof(file_name), "hs_c" UINTX_FORMAT "_pid%u.log",
thread_id, os::current_process_id());
} else {
- jio_snprintf(fileBuf, sizeof(fileBuf),
+ jio_snprintf(file_name, sizeof(file_name),
"%s%shs_c" UINTX_FORMAT "_pid%u.log", dir,
os::file_separator(), thread_id, os::current_process_id());
}
- fp = fopen(fileBuf, "at");
+
+ fp = fopen(file_name, "at");
if (fp != NULL) {
- file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1, mtCompiler);
- strcpy(file, fileBuf);
- break;
+ if (LogCompilation && Verbose) {
+ tty->print_cr("Opening compilation log %s", file_name);
+ }
+ CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file_name, fp, thread_id);
+ thread->init_log(log);
+
+ if (xtty != NULL) {
+ ttyLocker ttyl;
+ // Record any per thread log files
+ xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file_name);
+ }
+ return;
}
}
- if (fp == NULL) {
- warning("Cannot open log file: %s", fileBuf);
- } else {
- if (LogCompilation && Verbose)
- tty->print_cr("Opening compilation log %s", file);
- CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file, fp, thread_id);
- thread->init_log(log);
-
- if (xtty != NULL) {
- ttyLocker ttyl;
-
- // Record any per thread log files
- xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file);
- }
- }
+ warning("Cannot open log file: %s", file_name);
}
// ------------------------------------------------------------------
--- a/hotspot/src/share/vm/compiler/compileLog.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compileLog.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -34,17 +34,18 @@
// ------------------------------------------------------------------
// CompileLog::CompileLog
-CompileLog::CompileLog(const char* file, FILE* fp, intx thread_id)
+CompileLog::CompileLog(const char* file_name, FILE* fp, intx thread_id)
: _context(_context_buffer, sizeof(_context_buffer))
{
- initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp));
- _file = file;
+ initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp, true));
_file_end = 0;
_thread_id = thread_id;
_identities_limit = 0;
_identities_capacity = 400;
_identities = NEW_C_HEAP_ARRAY(char, _identities_capacity, mtCompiler);
+ _file = NEW_C_HEAP_ARRAY(char, strlen(file_name)+1, mtCompiler);
+ strcpy((char*)_file, file_name);
// link into the global list
{ MutexLocker locker(CompileTaskAlloc_lock);
@@ -57,6 +58,7 @@
delete _out;
_out = NULL;
FREE_C_HEAP_ARRAY(char, _identities, mtCompiler);
+ FREE_C_HEAP_ARRAY(char, _file, mtCompiler);
}
@@ -188,7 +190,8 @@
if (called_exit) return;
called_exit = true;
- for (CompileLog* log = _first; log != NULL; log = log->_next) {
+ CompileLog* log = _first;
+ while (log != NULL) {
log->flush();
const char* partial_file = log->file();
int partial_fd = open(partial_file, O_RDONLY);
@@ -267,7 +270,11 @@
close(partial_fd);
unlink(partial_file);
}
+ CompileLog* next_log = log->_next;
+ delete log;
+ log = next_log;
}
+ _first = NULL;
}
// ------------------------------------------------------------------
--- a/hotspot/src/share/vm/compiler/compileLog.hpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compileLog.hpp Thu Jun 06 11:02:25 2013 -0700
@@ -57,7 +57,7 @@
void va_tag(bool push, const char* format, va_list ap);
public:
- CompileLog(const char* file, FILE* fp, intx thread_id);
+ CompileLog(const char* file_name, FILE* fp, intx thread_id);
~CompileLog();
intx thread_id() { return _thread_id; }
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -468,7 +468,25 @@
#ifdef ASSERT
if (istate->_msg != initialize) {
- assert(abs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + 1), "bad stack limit");
+ // We have a problem here if we are running with a pre-hsx24 JDK (for example during bootstrap)
+ // because in that case, EnableInvokeDynamic is true by default but will be later switched off
+ // if java_lang_invoke_MethodHandle::compute_offsets() detects that the JDK only has the classes
+ // for the old JSR292 implementation.
+ // This leads to a situation where 'istate->_stack_limit' always accounts for
+ // methodOopDesc::extra_stack_entries() because it is computed in
+ // CppInterpreterGenerator::generate_compute_interpreter_state() which was generated while
+ // EnableInvokeDynamic was still true. On the other hand, istate->_method->max_stack() doesn't
+ // account for extra_stack_entries() anymore because at the time when it is called
+ // EnableInvokeDynamic was already set to false.
+ // So we have a second version of the assertion which handles the case where EnableInvokeDynamic was
+ // switched off because of the wrong classes.
+ if (EnableInvokeDynamic || FLAG_IS_CMDLINE(EnableInvokeDynamic)) {
+ assert(abs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + 1), "bad stack limit");
+ } else {
+ const int extra_stack_entries = Method::extra_stack_entries_for_indy;
+ assert(labs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + extra_stack_entries
+ + 1), "bad stack limit");
+ }
#ifndef SHARK
IA32_ONLY(assert(istate->_stack_limit == istate->_thread->last_Java_sp() + 1, "wrong"));
#endif // !SHARK
--- a/hotspot/src/share/vm/oops/method.hpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/oops/method.hpp Thu Jun 06 11:02:25 2013 -0700
@@ -671,13 +671,15 @@
Symbol* signature, //anything at all
TRAPS);
static Klass* check_non_bcp_klass(Klass* klass);
- // these operate only on invoke methods:
+
+ // How many extra stack entries for invokedynamic when it's enabled
+ static const int extra_stack_entries_for_jsr292 = 1;
+
+ // this operates only on invoke methods:
// presize interpreter frames for extra interpreter stack entries, if needed
- // method handles want to be able to push a few extra values (e.g., a bound receiver), and
- // invokedynamic sometimes needs to push a bootstrap method, call site, and arglist,
- // all without checking for a stack overflow
- static int extra_stack_entries() { return EnableInvokeDynamic ? 2 : 0; }
- static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize()
+ // Account for the extra appendix argument for invokehandle/invokedynamic
+ static int extra_stack_entries() { return EnableInvokeDynamic ? extra_stack_entries_for_jsr292 : 0; }
+ static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize
// RedefineClasses() support:
bool is_old() const { return access_flags().is_old(); }
--- a/hotspot/src/share/vm/opto/escape.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/opto/escape.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -2202,7 +2202,7 @@
int opcode = uncast_base->Opcode();
assert(opcode == Op_ConP || opcode == Op_ThreadLocal ||
opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() ||
- (uncast_base->is_Mem() && uncast_base->bottom_type() == TypeRawPtr::NOTNULL) ||
+ (uncast_base->is_Mem() && (uncast_base->bottom_type()->isa_rawptr() != NULL)) ||
(uncast_base->is_Proj() && uncast_base->in(0)->is_Allocate()), "sanity");
}
return base;
--- a/hotspot/src/share/vm/opto/matcher.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1282,16 +1282,6 @@
mcall->_argsize = out_arg_limit_per_call - begin_out_arg_area;
}
- if (is_method_handle_invoke) {
- // Kill some extra stack space in case method handles want to do
- // a little in-place argument insertion.
- // FIXME: Is this still necessary?
- int regs_per_word = NOT_LP64(1) LP64_ONLY(2); // %%% make a global const!
- out_arg_limit_per_call += Method::extra_stack_entries() * regs_per_word;
- // Do not update mcall->_argsize because (a) the extra space is not
- // pushed as arguments and (b) _argsize is dead (not used anywhere).
- }
-
// Compute the max stack slot killed by any call. These will not be
// available for debug info, and will be used to adjust FIRST_STACK_mask
// after all call sites have been visited.
--- a/hotspot/src/share/vm/opto/reg_split.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/opto/reg_split.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -51,6 +51,15 @@
static const char out_of_nodes[] = "out of nodes during split";
+static bool contains_no_live_range_input(const Node* def) {
+ for (uint i = 1; i < def->req(); ++i) {
+ if (def->in(i) != NULL && def->in_RegMask(i).is_NotEmpty()) {
+ return false;
+ }
+ }
+ return true;
+}
+
//------------------------------get_spillcopy_wide-----------------------------
// Get a SpillCopy node with wide-enough masks. Use the 'wide-mask', the
// wide ideal-register spill-mask if possible. If the 'wide-mask' does
@@ -1312,7 +1321,7 @@
Node *def = Reaches[pidx][slidx];
assert( def, "must have reaching def" );
// If input up/down sense and reg-pressure DISagree
- if( def->rematerialize() ) {
+ if (def->rematerialize() && contains_no_live_range_input(def)) {
// Place the rematerialized node above any MSCs created during
// phi node splitting. end_idx points at the insertion point
// so look at the node before it.
--- a/hotspot/src/share/vm/prims/unsafe.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -115,8 +115,6 @@
inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
jlong byte_offset = field_offset_to_byte_offset(field_offset);
- // Don't allow unsafe to be used to read or write the header word of oops
- assert(p == NULL || field_offset >= oopDesc::header_size(), "offset must be outside of header");
#ifdef ASSERT
if (p != NULL) {
assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -2217,6 +2217,13 @@
status = false;
}
+ if (ReservedCodeCacheSize < InitialCodeCacheSize) {
+ jio_fprintf(defaultStream::error_stream(),
+ "Invalid ReservedCodeCacheSize: %dK. Should be greater than InitialCodeCacheSize=%dK\n",
+ ReservedCodeCacheSize/K, InitialCodeCacheSize/K);
+ status = false;
+ }
+
return status;
}
@@ -2619,13 +2626,10 @@
} else if (match_option(option, "-Xmaxjitcodesize", &tail) ||
match_option(option, "-XX:ReservedCodeCacheSize=", &tail)) {
julong long_ReservedCodeCacheSize = 0;
- ArgsRange errcode = parse_memory_size(tail, &long_ReservedCodeCacheSize,
- (size_t)InitialCodeCacheSize);
+ ArgsRange errcode = parse_memory_size(tail, &long_ReservedCodeCacheSize, 1);
if (errcode != arg_in_range) {
jio_fprintf(defaultStream::error_stream(),
- "Invalid maximum code cache size: %s. Should be greater than InitialCodeCacheSize=%dK\n",
- option->optionString, InitialCodeCacheSize/K);
- describe_range_error(errcode);
+ "Invalid maximum code cache size: %s.\n", option->optionString);
return JNI_EINVAL;
}
FLAG_SET_CMDLINE(uintx, ReservedCodeCacheSize, (uintx)long_ReservedCodeCacheSize);
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -635,18 +635,22 @@
// at an uncommon trap for an invoke (where the compiler
// generates debug info before the invoke has executed)
Bytecodes::Code cur_code = str.next();
- if (cur_code == Bytecodes::_invokevirtual ||
- cur_code == Bytecodes::_invokespecial ||
- cur_code == Bytecodes::_invokestatic ||
- cur_code == Bytecodes::_invokeinterface) {
+ if (cur_code == Bytecodes::_invokevirtual ||
+ cur_code == Bytecodes::_invokespecial ||
+ cur_code == Bytecodes::_invokestatic ||
+ cur_code == Bytecodes::_invokeinterface ||
+ cur_code == Bytecodes::_invokedynamic) {
Bytecode_invoke invoke(mh, iframe->interpreter_frame_bci());
Symbol* signature = invoke.signature();
ArgumentSizeComputer asc(signature);
cur_invoke_parameter_size = asc.size();
- if (cur_code != Bytecodes::_invokestatic) {
+ if (invoke.has_receiver()) {
// Add in receiver
++cur_invoke_parameter_size;
}
+ if (i != 0 && !invoke.is_invokedynamic() && MethodHandles::has_member_arg(invoke.klass(), invoke.name())) {
+ callee_size_of_parameters++;
+ }
}
if (str.bci() < max_bci) {
Bytecodes::Code bc = str.next();
@@ -661,6 +665,7 @@
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
case Bytecodes::_invokeinterface:
+ case Bytecodes::_invokedynamic:
case Bytecodes::_athrow:
break;
default: {
--- a/hotspot/src/share/vm/runtime/frame.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/frame.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -1008,6 +1008,7 @@
OopClosure* _f;
int _offset; // the current offset, incremented with each argument
bool _has_receiver; // true if the callee has a receiver
+ bool _has_appendix; // true if the call has an appendix
frame _fr;
RegisterMap* _reg_map;
int _arg_size;
@@ -1027,19 +1028,20 @@
}
public:
- CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, OopClosure* f, frame fr, const RegisterMap* reg_map)
+ CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, bool has_appendix, OopClosure* f, frame fr, const RegisterMap* reg_map)
: SignatureInfo(signature) {
// initialize CompiledArgumentOopFinder
_f = f;
_offset = 0;
_has_receiver = has_receiver;
+ _has_appendix = has_appendix;
_fr = fr;
_reg_map = (RegisterMap*)reg_map;
- _arg_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0);
+ _arg_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0) + (has_appendix ? 1 : 0);
int arg_size;
- _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, &arg_size);
+ _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, has_appendix, &arg_size);
assert(arg_size == _arg_size, "wrong arg size");
}
@@ -1049,12 +1051,16 @@
_offset++;
}
iterate_parameters();
+ if (_has_appendix) {
+ handle_oop_offset();
+ _offset++;
+ }
}
};
-void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, const RegisterMap* reg_map, OopClosure* f) {
+void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, const RegisterMap* reg_map, OopClosure* f) {
ResourceMark rm;
- CompiledArgumentOopFinder finder(signature, has_receiver, f, *this, reg_map);
+ CompiledArgumentOopFinder finder(signature, has_receiver, has_appendix, f, *this, reg_map);
finder.oops_do();
}
--- a/hotspot/src/share/vm/runtime/frame.hpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/frame.hpp Thu Jun 06 11:02:25 2013 -0700
@@ -411,7 +411,7 @@
oop* oopmapreg_to_location(VMReg reg, const RegisterMap* regmap) const;
// Oops-do's
- void oops_compiled_arguments_do(Symbol* signature, bool has_receiver, const RegisterMap* reg_map, OopClosure* f);
+ void oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, const RegisterMap* reg_map, OopClosure* f);
void oops_interpreted_do(OopClosure* f, CLDToOopClosure* cld_f, const RegisterMap* map, bool query_oop_map_cache = true);
private:
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Jun 06 11:02:25 2013 -0700
@@ -2726,7 +2726,7 @@
return regs.first();
}
-VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver, int* arg_size) {
+VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver, bool has_appendix, int* arg_size) {
// This method is returning a data structure allocating as a
// ResourceObject, so do not put any ResourceMarks in here.
char *s = sig->as_C_string();
@@ -2770,6 +2770,11 @@
default : ShouldNotReachHere();
}
}
+
+ if (has_appendix) {
+ sig_bt[cnt++] = T_OBJECT;
+ }
+
assert( cnt < 256, "grow table size" );
int comp_args_on_stack;
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp Thu Jun 06 05:56:33 2013 -0700
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp Thu Jun 06 11:02:25 2013 -0700
@@ -410,7 +410,7 @@
// Convert a sig into a calling convention register layout
// and find interesting things about it.
- static VMRegPair* find_callee_arguments(Symbol* sig, bool has_receiver, int *arg_size);
+ static VMRegPair* find_callee_arguments(Symbol* sig, bool has_receiver, bool has_appendix, int *arg_size);
static VMReg name_for_receiver();
// "Top of Stack" slots that may be unused by the calling convention but must
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/8011771/Test8011771.java Thu Jun 06 11:02:25 2013 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2013, 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.
+ */
+
+/*
+ * @test
+ * @bug 8011771
+ * @summary Array bound check elimination's in block motion doesn't always reset its data structures from one step to the other.
+ * @run main/othervm -XX:-BackgroundCompilation Test8011771
+ *
+ */
+
+public class Test8011771 {
+
+ static void m(int[] a, int[] b, int j) {
+ // Array bound check elimination inserts a predicate before
+ // the loop. We'll have the predicate fail, so the method is
+ // recompiled without optimistic optimizations
+ for (int i = 0; i < 10; i++) {
+ a[i] = i;
+ }
+
+ // The test itself
+ a[j] = 0;
+ a[j+5] = 0;
+ b[j+4] = 0; // this range check shouldn't be eliminated
+ }
+
+ static public void main(String[] args) {
+ int[] arr1 = new int[10], arr2 = new int[10];
+ // force compilation:
+ for (int i = 0; i < 5000; i++) {
+ m(arr1, arr2, 0);
+ }
+
+ try {
+ m(new int[1], null, 0); // force predicate failure
+ } catch(ArrayIndexOutOfBoundsException e) {}
+
+ // force compilation again (no optimistic opts):
+ for (int i = 0; i < 5000; i++) {
+ m(arr1, arr2, 0);
+ }
+
+ // Check that the range check on the second array wasn't optimized out
+ boolean success = false;
+ try {
+ m(arr1, new int[1], 0);
+ } catch(ArrayIndexOutOfBoundsException e) {
+ success = true;
+ }
+ if (success) {
+ System.out.println("TEST PASSED");
+ } else {
+ throw new RuntimeException("TEST FAILED: erroneous bound check elimination");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/8013496/Test8013496.sh Thu Jun 06 11:02:25 2013 -0700
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Copyright (c) 2013, 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.
+#
+#
+# @test
+# @bug 8013496
+# @summary Test checks that the order in which ReversedCodeCacheSize and
+# InitialCodeCacheSize are passed to the VM is irrelevant.
+# @run shell Test8013496.sh
+#
+#
+## some tests require path to find test source dir
+if [ "${TESTSRC}" = "" ]
+then
+ TESTSRC=${PWD}
+ echo "TESTSRC not set. Using "${TESTSRC}" as default"
+fi
+echo "TESTSRC=${TESTSRC}"
+## Adding common setup Variables for running shell tests.
+. ${TESTSRC}/../../test_env.sh
+set -x
+
+${TESTJAVA}/bin/java ${TESTVMOPTS} -XX:ReservedCodeCacheSize=2m -XX:InitialCodeCacheSize=500K -version > 1.out 2>&1
+${TESTJAVA}/bin/java ${TESTVMOPTS} -XX:InitialCodeCacheSize=500K -XX:ReservedCodeCacheSize=2m -version > 2.out 2>&1
+
+diff 1.out 2.out
+
+result=$?
+if [ $result -eq 0 ] ; then
+ echo "Test Passed"
+ exit 0
+else
+ echo "Test Failed"
+ exit 1
+fi