components/llvm/Makefile
changeset 7771 46912a8a1f29
parent 7687 1093e2a9adbd
child 7829 2de4f4ace09c
--- a/components/llvm/Makefile	Fri Jan 27 16:34:13 2017 -0800
+++ b/components/llvm/Makefile	Wed Mar 08 22:04:29 2017 -0800
@@ -28,8 +28,16 @@
 
 include ../../make-rules/shared-macros.mk
 
-# We use GCC version 4.9.3, and not another version for now.
-GCC_ROOT=/usr/gcc/4.9
+# This and intel-openmp must use the same version of gcc.  In addition, LLVM's
+# gcc toolchain logic we currently have for Solaris is effectively hard-coded
+# for a specific version of gcc (5.4.0 currently):
+#
+# 25682681 llvm's gcc toolchain usage should be multilib friendly and
+#          version-agnostic
+#
+# Changing to a different version of gcc currently requires an update to
+# patches/012-solaris-clang-libclangDriver.patch.
+GCC_ROOT=/usr/gcc/5
 
 COMPONENT_NAME=		llvm
 COMPONENT_VERSION=	3.8.1
@@ -72,9 +80,12 @@
 endif
 
 BUILD_STYLE = cmake
+# Building with debug info results in ~7GB of package data, so while preferred,
+# is not practical.
+CMAKE_BUILD_TYPE = Release
 CLONEY = echo
-GNUCP = /usr/gnu/bin/cp
-
+TEST_TARGET=
+SYSTEM_TEST_TARGET=
 include $(WS_MAKE_RULES)/common.mk
 
 PATCH_LEVEL := 0
@@ -84,7 +95,6 @@
 export PATH=/usr/gnu/bin:/usr/bin:/usr/perl5/$(PERL_VERSION)/bin
 
 # We're building with CMake
-CMAKE=/usr/bin/cmake
 CMAKE_VERSION := $(shell $(CMAKE) --version 2>&1 | head -n1 \
   | $(GSED) 's/cmake version \{1,\}//g')
 CMAKE_MAJOR_VERSION := $(shell echo $(CMAKE_VERSION) | cut -f1 -d'.')
@@ -99,23 +109,6 @@
   CMAKE_NEEDS_SOLARIS_HOST = 1
 endif
 
-# All of these shoujld probably be in shared-macros.mk
-CMAKE_INSTALL_BINDIR.32 = bin
-CMAKE_INSTALL_BINDIR.64 = bin/$(MACH64)
-CMAKE_INSTALL_BINDIR = $(CMAKE_INSTALL_BINDIR.$(BITS))
-
-CMAKE_INSTALL_LIBDIR.32 = lib
-CMAKE_INSTALL_LIBDIR.64 = lib/$(MACH64)
-CMAKE_INSTALL_LIBDIR = $(CMAKE_INSTALL_LIBDIR.$(BITS))
-
-CMAKE_INSTALL_LIBEXECDIR.32 = libexec
-CMAKE_INSTALL_LIBEXECDIR.64 = libexec/$(MACH64)
-CMAKE_INSTALL_LIBEXECDIR = $(CMAKE_INSTALL_LIBEXECDIR.$(BITS))
-
-CMAKE_INSTALL_INCLUDEDIR = include
-CMAKE_INSTALL_DATADIR = share
-CMAKE_INSTALL_DATAROOTDIR = share
-
 # We need the specific C++ runtime that clang/llvm was built and
 # linked with, and not some random and incompatible stuff from
 # /usr/lib.
@@ -123,23 +116,17 @@
 LLVM_RUNPATH_64 = $(GCC_ROOT)/lib/$(MACH64)
 LLVM_RUNPATH = $(LLVM_RUNPATH_$(BITS))
 
-# -O0. GCC on SPARC dies with an out-memory error in cc1plus when
-# building with either -O1 or -O2 (32-bit). If it manages to get
-# through with -O1 or -O2 (64-bit), the resulting bits are unusable.
-OFLAG="-O0"
-GFLAG=""
-
 ifeq ($(DEBUG_BUILD), 1)
-  OFLAG="-O0"
-  GFLAG="-g3"
+  CMAKE_BUILD_TYPE = Debug
+  GFLAG=-g3
+else
+  GFLAG=
 endif
 
 # Because LLVM's install target doesn't install everything that
 # needs to be installed.
 EXTRA_INSTALL_BITS=llvm-lto arcmt-test c-arcmt-test c-index-test diagtool
-LLVM_INSTALL_BINDIR.32=$(PROTOUSRBINDIR)
-LLVM_INSTALL_BINDIR.64=$(PROTOUSRBINDIR64)
-LLVM_INSTALL_BINDIR=$(LLVM_INSTALL_BINDIR.$(BITS))
+LLVM_INSTALL_BINDIR=$(PROTOUSRBINDIR)
 LLVM_BINDIR=$(BUILD_DIR_$(BITS))/bin
 
 INSTALL_CXA_FINALIZE := 0
@@ -192,10 +179,6 @@
 	done ;
 
 COMPONENT_POST_INSTALL_ACTION += \
-	cd $(COMPONENT_DIR) ; \
-	$(GNUCP) -rpd $(PROTOUSRLIBDIR64)/clang $(PROTOUSRLIBDIR)/ ;
-
-COMPONENT_POST_INSTALL_ACTION += \
 	cd $(PROTOUSRLIBDIR) ; \
 	$(PYTHON) -m compileall . ;
 
@@ -239,35 +222,6 @@
     '-e "/Built target/d"' \
     '-e "/Nothing to be done/d"'
 
-# GCC options used:
-# -ftree-vectorize | -fno-tree-vectorize:
-# Enable/disable loop vectorization in optimizations. For details:
-# https://gcc.gnu.org/projects/tree-ssa/vectorization.html
-# Disabled in debug builds, will be enabled in production/optimized
-# builds at some point in the future..
-#
-# -ftree-slp-vectorize | -fno-tree-slp-vectorize:
-# Enable/disable Basic Block tree vectorization.
-# Less aggressive vectorization than -ftree-vectorize, but useful
-# in case -ftree-slp-vectorize misses some vectorization opportunities.
-# Documentation at the same URL as above.
-# Disabled in debug builds, will be enabled in production/optimized
-# builds at some point in the future.
-#
-# -freorder-blocks | -fno-reorder-blocks
-# Enable/disable BasicBlock reordering as an optimization.
-# Disabled in debug builds, will be enabled in production/optimized
-# builds at some point in the future.
-# Documented here:
-# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
-#
-# -ftoplevel-reorder | -fno-toplevel-reorder
-# Another BasiBlock depentent optimization option.
-# Disabled in debug builds, will be enabled in production/optimized
-# builds at some point in the future.
-# Documented here:
-# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
-#
 # -fstack-protector-all:
 # Enable stack smashing (stack corruption) protection and detection.
 # This flag should always be used in conjunction with -Wstack-protector.
@@ -298,9 +252,6 @@
 # ops are always done in software. But quad-floating-point ops in a
 # compiler are virtually non-existent.
 #
-# -mptr32 | -mptr64:
-#  Tell GCC the size of a pointer on SPARC.
-#
 # -mimpure-text:
 # When used in addition to -shared on SPARC, this tells GCC to not pass
 # -z text to the linker when linking a shared object.
@@ -316,30 +267,36 @@
 # Building for Opteron - which implies SSE2 - is adequate for
 # performance purposes.
 
-CFLAGS = -m$(BITS) $(GFLAG) $(OFLAG) -pthread -std=c99 -fno-strict-aliasing
-CFLAGS += -fno-tree-slp-vectorize -fno-tree-vectorize
-CFLAGS += -fno-reorder-blocks -fno-toplevel-reorder
+CFLAGS += $(GFLAG) -pthread -std=c99 -fno-strict-aliasing
 CFLAGS += -Wall -Wcast-align -Wno-long-long -Woverflow
 CFLAGS += -Wstack-protector -fdata-sections -fstack-protector-all
 CFLAGS += -fkeep-static-consts -ffunction-sections
+# Never omit frame pointer; not worth the very minor performance gains for the
+# loss of debugging capability.  Additionally, on sparc, omitting the frame
+# pointer also currently causes bad code generation by gcc (4.x, 5.x):
+#
+#	Many sparc testcases FAIL at -O0 with -fomit-frame-pointer
+#	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79749
+#
+CFLAGS += -fno-omit-frame-pointer
 CFLAGS += -Wl,-z -Wl,relax=common
 CFLAGS += -Wl,-z -Wl,relax=secadj
 CFLAGS += -Wl,-z -Wl,relax=transtls
 CFLAGS += -Wl,-z -Wl,relax=symbound
 CFLAGS += -Wl,-R -Wl,$(LLVM_RUNPATH)
-CFLAGS.i386 += -mtune=opteron -mno-sse3 -mno-ssse3 -fno-common
-ifeq ($(DEBUG_BUILD),1)
-  CFLAGS.i386 += -fno-omit-frame-pointer
-endif
-CFLAGS.sparc += -mtune=ultrasparc -mcpu=ultrasparc -mvis -mhard-float
-CFLAGS.sparc += -mptr$(BITS) -fdata-sections -falign-functions=8
-CFLAGS.sparc += -mno-unaligned-doubles -mimpure-text
-CFLAGS += $(CFLAGS.$(MACH))
+CFLAGS.gcc.i386 += -mtune=opteron -mno-sse3 -mno-ssse3 -fno-common 
 
-CXXFLAGS = -m$(BITS) $(GFLAG) $(OFLAG) -pthread -fno-strict-aliasing
+# At optimization levels above O0, gcc can either crash or generates unusable
+# code on SPARC.  Disabling delay-slot instruction scheduling avoids this
+# problem.
+CFLAGS.gcc.sparc += -fno-delayed-branch
+CFLAGS.gcc.sparc += -mtune=ultrasparc -mcpu=ultrasparc -mvis -mhard-float
+CFLAGS.gcc.sparc += -fdata-sections -falign-functions=8
+CFLAGS.gcc.sparc += -mno-unaligned-doubles -mimpure-text
+
+CXXFLAGS += $(CFLAGS.$(COMPILER).$(MACH))
+CXXFLAGS += $(GFLAG) -pthread -fno-strict-aliasing
 CXXFLAGS += -fexceptions -frtti -fstack-protector-all
-CXXFLAGS += -fno-tree-vectorize -fno-tree-slp-vectorize
-CXXFLAGS += -fno-reorder-blocks -fno-toplevel-reorder
 CXXFLAGS += -Wall -Wcast-align -Wno-long-long -Woverflow
 CXXFLAGS += -Wstack-protector -fkeep-static-consts
 CXXFLAGS += -std=c++11 -fdata-sections -ffunction-sections
@@ -349,10 +306,8 @@
 CXXFLAGS += -Wl,-z -Wl,relax=symbound
 CXXFLAGS += -Wl,-z -Wl,relax=comdat
 CXXFLAGS += -Wl,-R -Wl,$(LLVM_RUNPATH)
-CXXFLAGS.sparc += -mptr$(BITS)
-CXXFLAGS += $(CFLAGS.$(MACH))
 
-CPPFLAGS = -D_GNU_SOURCE -DLLVM_SOLARIS -I/usr/gnu/include
+CPPFLAGS += -D_GNU_SOURCE -DLLVM_SOLARIS -I/usr/gnu/include
 
 ifeq ($(DEBUG_BUILD),1)
   CPPFLAGS += -D_DEBUG
@@ -367,10 +322,6 @@
 CPPFLAGS.sparc = -DLLVM_SPARC
 CPPFLAGS += $(CPPFLAGS.$(MACH))
 
-LLVM_LIBEXECDIR_32 = /usr/libexec
-LLVM_LIBEXECDIR_64 = /usr/libexec/$(MACH64)
-LLVM_LIBEXECDIR = $(LLVM_LIBEXECDIR_$(BITS))
-
 LIBFFI_INCDIR_32 = $(shell pkg-config --cflags-only-I libffi | sed -e s,-I,,)
 LIBFFI_INCDIR_64 = $(shell env PKG_CONFIG_PATH=$(PKG_CONFIG_PATH.64) pkg-config --cflags-only-I libffi | sed -e s,-I,,)
 LIBFFI_INCDIR = $(LIBFFI_INCDIR_$(BITS))
@@ -385,29 +336,20 @@
 LD_OPTIONS += -M /usr/lib/ld/map.pagealign
 LD_OPTIONS_SO = $(LD_Z_DEFS) $(LD_DEF_LIBS)
 
-CMAKE_OPTIONS = -DCMAKE_C_COMPILER:FILEPATH=$(CC)
-CMAKE_OPTIONS += -DCMAKE_CXX_COMPILER:FILEPATH=$(CXX)
-CMAKE_OPTIONS += -DCMAKE_C_CFLAGS:STRING="$(CPPFLAGS) $(CFLAGS)"
-CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS:STRING="$(CPPFLAGS) $(CXXFLAGS)"
-CMAKE_OPTIONS += -DCMAKE_EXE_LINKER_FLAGS:STRING="$(LDFLAGS)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_PREFIX:FILEPATH=$(CMAKE_PREFIX)
-CMAKE_OPTIONS += -DCMAKE_AR:FILEPATH=/usr/bin/ar
-
-CMAKE_OPTIONS += -DCMAKE_INSTALL_BINDIR:STRING="$(CMAKE_INSTALL_BINDIR)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_LIBDIR:STRING="$(CMAKE_INSTALL_LIBDIR)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_LIBEXECDIR:STRING="$(CMAKE_INSTALL_LIBEXECDIR)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_INCLUDEDIR:STRING="$(CMAKE_INSTALL_INCLUDEDIR)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_DATADIR:STRING="$(CMAKE_INSTALL_DATADIR)"
-CMAKE_OPTIONS += -DCMAKE_INSTALL_DATAROOTDIR:STRING="$(CMAKE_INSTALL_DATAROOTDIR)"
-
+# The default target triple must be set so that the OS release is included by
+# default as LLVM will use this to find the installed gcc internal libraries
+# and headers (e.g.  /usr/gcc/5/lib/gcc/sparcv9-sun-solaris2.11/5.4.0/).  This
+# also means that when specifying a --target to clang, developers must also
+# include the OS release (e.g. --target=sparcv9-sun-solaris2.11).
 ifeq ($(MACH),sparc)
   CMAKE_OPTIONS += -DLLVM_TARGETS_TO_BUILD:STRING="Sparc"
+  CMAKE_OPTIONS += -DLLVM_DEFAULT_TARGET_TRIPLE:STRING="sparcv9-sun-solaris$(SOLARIS_VERSION)"
 endif
 ifeq ($(MACH),i386)
   CMAKE_OPTIONS += -DLLVM_TARGETS_TO_BUILD:STRING="X86"
+  CMAKE_OPTIONS += -DLLVM_DEFAULT_TARGET_TRIPLE:STRING="x86_64-pc-solaris$(SOLARIS_VERSION)"
 endif
 
-CMAKE_OPTIONS += -DCMAKE_MAKE_PROGRAM:STRING="/usr/bin/gmake"
 CMAKE_OPTIONS += -DCMAKE_ASM_COMPILER:STRING="/usr/gnu/bin/as"
 CMAKE_OPTIONS += -DCMAKE_INSTALL_RPATH:STRING="$(LLVM_RUNPATH)"
 CMAKE_OPTIONS += -DLLVM_BUILD_TOOLS:BOOL=ON
@@ -419,31 +361,19 @@
 
 # CMake tries really hard to be too smart for its own good.
 ifeq ($(DEBUG_BUILD),1)
-  CMAKE_OPTIONS += -DCMAKE_BUILD_TYPE:STRING=Debug
-  CMAKE_OPTIONS += -DCMAKE_C_FLAGS_DEBUG:STRING="$(OFLAG) $(GFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS_DEBUG:STRING="$(OFLAG) $(GFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_ASM_FLAGS_DEBUG:STRING="$(OFLAG) $(GFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_ASM_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG) $(GFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG) $(GFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG) $(GFLAG)"
   CMAKE_OPTIONS += -DLLVM_BUILD_EXAMPLES:BOOL=ON
   CMAKE_OPTIONS += -DLLVM_INCLUDE_EXAMPLES:BOOL=ON
   CMAKE_OPTIONS += -DLLVM_ENABLE_ASSERTIONS:BOOL=ON
   CMAKE_OPTIONS += -DLLVM_ENABLE_EXPENSIVE_CHECKS:BOOL=ON
 else
-  CMAKE_OPTIONS += -DCMAKE_BUILD_TYPE:STRING=Release
-  CMAKE_OPTIONS += -DCMAKE_C_FLAGS_DEBUG:STRING="$(OFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS_DEBUG:STRING="$(OFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_ASM_FLAGS_DEBUG:STRING="$(OFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_ASM_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_C_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG)"
-  CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING="$(OFLAG)"
   CMAKE_OPTIONS += -DLLVM_BUILD_EXAMPLES:BOOL=OFF
   CMAKE_OPTIONS += -DLLVM_INCLUDE_EXAMPLES:BOOL=OFF
   CMAKE_OPTIONS += -DLLVM_ENABLE_ASSERTIONS:BOOL=OFF
   CMAKE_OPTIONS += -DLLVM_ENABLE_EXPENSIVE_CHECKS:BOOL=OFF
 endif
 
+CMAKE_OPTIONS += -DCMAKE_ASM_FLAGS:STRING="$(gcc_OPT) $(GFLAG)"
+
 CMAKE_OPTIONS += -DLLVM_ENABLE_EH:BOOL=ON
 CMAKE_OPTIONS += -DLLVM_ENABLE_PIC:BOOL=ON
 CMAKE_OPTIONS += -DLLVM_ENABLE_RTTI:BOOL=ON
@@ -487,20 +417,12 @@
 COMPONENT_BUILD_ENV += LD_EXEC_OPTIONS="-zaslr=disable"
 
 # Put this here for now until the gpatch problems are resolved.
-COMPONENT_BUILD_ARGS += -j4
+COMPONENT_BUILD_ARGS += -j8
 
 # use bash(1) to run the install recipes otherwise clang header installation
 # fails
 COMPONENT_INSTALL_ARGS += SHELL=/bin/bash
 
-COMPONENT_PRE_BUILD_ACTION += cd $(@D) ;
-COMPONENT_PRE_BUILD_ACTION += echo BITS: $(BITS) ;
-COMPONENT_PRE_BUILD_ACTION += echo Running cmake with $(CMAKE_OPTIONS) ;
-COMPONENT_PRE_BUILD_ACTION += /usr/bin/env - $(COMPONENT_BUILD_ENV) \
-			      $(CMAKE) $(CMAKE_OPTIONS) \
-			      $(COMPONENT_DIR)/$(COMPONENT_SRC) ;
-
-
 # There are no master test results just yet. But there will be
 # very soon.
 test:
@@ -508,7 +430,11 @@
 
 system-test:    $(SYSTEM_TESTS_NOT_IMPLEMENTED)
 
-REQUIRED_PACKAGES += developer/gcc-4/gcc-common-49
+REQUIRED_PACKAGES += developer/build/cmake
+REQUIRED_PACKAGES += developer/build/pkg-config
+REQUIRED_PACKAGES += developer/gcc/gcc-c++-5
+REQUIRED_PACKAGES += developer/gcc/gcc-c-5
+REQUIRED_PACKAGES += developer/gcc/gcc-common-5
 REQUIRED_PACKAGES += developer/gnu-binutils
 REQUIRED_PACKAGES += library/libedit
 REQUIRED_PACKAGES += library/libffi
@@ -525,10 +451,8 @@
 REQUIRED_PACKAGES += runtime/python-27
 REQUIRED_PACKAGES += system/core-os
 REQUIRED_PACKAGES += system/header
-REQUIRED_PACKAGES += system/library/gcc/gcc-runtime-49
-REQUIRED_PACKAGES += system/library/gcc/gcc-c++-runtime-49
-REQUIRED_PACKAGES += system/library/gcc/gcc-c-runtime-49
-REQUIRED_PACKAGES += system/library/gcc/gcc-gobjc-runtime-49
+REQUIRED_PACKAGES += system/library/gcc/gcc-runtime-5
+REQUIRED_PACKAGES += system/library/gcc/gcc-c++-runtime-5
+REQUIRED_PACKAGES += system/library/gcc/gcc-c-runtime-5
+REQUIRED_PACKAGES += system/library/gcc/gcc-gobjc-runtime-5
 REQUIRED_PACKAGES += system/library/math
-REQUIRED_PACKAGES += system/linker
-