components/llvm/patches/031-solaris-build-system.patch
author Stefan Teleman <stefan.teleman@oracle.com>
Thu, 18 Aug 2016 12:56:39 -0700
changeset 6637 22d5f6c97e6f
parent 6512 92717ce71105
child 7771 46912a8a1f29
permissions -rw-r--r--
24378340 clang -fopenmp must include the path to the omp.h header file 24378393 clang -fopenmp must define _OPENMP to 201307

# 24314621 LLVM should build using the new CMake based build system
# 24378393 clang -fopenmp must define _OPENMP to 201307
# CMake parts for upstream, Solaris-specific parts no.
--- Makefile.config.in	2015-08-07 12:44:47.000000000 -0400
+++ Makefile.config.in	2016-05-08 23:19:20.538430899 -0400
@@ -12,6 +12,12 @@
 #
 #===------------------------------------------------------------------------===#
 
+MACH = $(shell uname -p)
+MACH64=sparcv9
+ifeq ($(MACH),i386)
+  MACH64=amd64
+endif
+
 # Define LLVM specific info and directories based on the autoconf variables
 LLVMPackageName   := @PACKAGE_TARNAME@
 LLVMVersion       := @PACKAGE_VERSION@
@@ -185,6 +191,11 @@
 # Path to the nm program
 NM_PATH = @NM@
 
+# Solaris-specific filesystem locations
+ifeq ($(findstring m32,$(CXXFLAGS)),)
+  PROJ_libdir = $(PROJ_prefix)/lib/$(MACH64)
+endif
+
 # The pathnames of the programs we require to build
 CMP        := @CMP@
 CP         := @CP@
@@ -225,6 +236,12 @@
 
 LIBS       := @LIBS@
 
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+  ifeq ($(MACH),sparc)
+    LIBS += -lkstat
+  endif
+endif
+
 # Targets that are possible to build
 ALL_TARGETS := @ALL_TARGETS@
 
@@ -347,14 +364,14 @@
 ENABLE_EMBED_STDCXX := @ENABLE_EMBED_STDCXX@
 
 # Use -fvisibility-inlines-hidden?
-ENABLE_VISIBILITY_INLINES_HIDDEN := @ENABLE_VISIBILITY_INLINES_HIDDEN@
+ENABLE_VISIBILITY_INLINES_HIDDEN := 0
 
 # Do we want to allow timestamping information into builds?
 ENABLE_TIMESTAMPS := @ENABLE_TIMESTAMPS@
 
 # This option tells the Makefiles to produce verbose output.
 # It essentially prints the commands that make is executing
-#VERBOSE = 1
+VERBOSE := 1
 
 # Enable JIT for this platform
 TARGET_HAS_JIT = @TARGET_HAS_JIT@
###
--- Makefile.rules	2015-11-09 08:10:00.000000000 -0800
+++ Makefile.rules	2016-05-28 17:08:22.413887137 -0700
@@ -291,8 +291,8 @@
   LD.Flags  += $(OPTIMIZE_OPTION)
   ifdef DEBUG_SYMBOLS
     BuildMode := $(BuildMode)+Debug
-    CXX.Flags += -g
-    C.Flags   += -g
+    CXX.Flags += -g3
+    C.Flags   += -g3
     KEEP_SYMBOLS := 1
   endif
 else
@@ -307,8 +307,8 @@
     CXX.Flags += -gsplit-dwarf
     C.Flags   += -gsplit-dwarf
     else
-    CXX.Flags += -g
-    C.Flags   += -g
+    CXX.Flags += -g3
+    C.Flags   += -g3
     endif
     KEEP_SYMBOLS := 1
   endif
@@ -331,6 +331,13 @@
  endif
 endif
 
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+  REQUIRES_EH := 1
+  REQUIRES_FRAME_POINTER := 1
+else
+  REQUIRES_EH := 0
+endif
+
 ifeq ($(ENABLE_WERROR),1)
   CXX.Flags += -Werror
   C.Flags += -Werror
@@ -355,14 +362,16 @@
 endif
 
 # IF REQUIRES_EH=1 is specified then don't disable exceptions
-ifndef REQUIRES_EH
+ifneq ($(REQUIRES_EH), 1)
   CXX.Flags += -fno-exceptions
+  REQUIRES_RTTI := 0
 else
   # If the library requires EH, it also requires RTTI.
+  CXX.Flags += -fexceptions
   REQUIRES_RTTI := 1
 endif
 
-ifdef REQUIRES_FRAME_POINTER
+ifeq ($(REQUIRES_FRAME_POINTER), 1)
   CXX.Flags := $(filter-out -fomit-frame-pointer,$(CXX.Flags))
   C.Flags   := $(filter-out -fomit-frame-pointer,$(C.Flags))
   LD.Flags  := $(filter-out -fomit-frame-pointer,$(LD.Flags))
@@ -371,6 +380,8 @@
 # If REQUIRES_RTTI=1 is specified then don't disable run-time type id.
 ifneq ($(REQUIRES_RTTI), 1)
   CXX.Flags += -fno-rtti
+else
+  CXX.Flags += -frtti
 endif
 
 ifeq ($(ENABLE_COVERAGE),1)
@@ -596,7 +607,7 @@
 endif
 
 ifdef SHARED_LIBRARY
-ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
+ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW SunOS))
 ifneq ($(HOST_OS),Darwin)
   LD.Flags += $(RPATH) -Wl,'$$ORIGIN'
 else
@@ -646,9 +657,13 @@
     ifeq ($(HOST_OS),SunOS)
       LD.Flags += -Wl,-z -Wl,discard-unused=sections
     else
-      ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
+      ifneq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW SunOS))
         LD.Flags += -Wl,--gc-sections
       endif
+      ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+	LD.Flags += -Wl,-z -Wl,discard-unused=sections
+	LD.Flags += -Wl,-M -Wl,$(PROJ_SRC_ROOT)/mapfiles/map.gnu-sections
+      endif
     endif
   endif
 endif
@@ -660,8 +675,14 @@
   endif
   ifneq ($(HOST_OS), Darwin)
     ifdef TOOLNAME
+      ifneq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
       LD.Flags += $(RPATH) -Wl,'$$ORIGIN/../lib'
     endif
+      ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+	LD.Flags += -Wl,-z -Wl,discard-unused=sections
+	LD.Flags += -Wl,-M -Wl,$(PROJ_SRC_ROOT)/mapfiles/map.gnu-sections
+      endif
+    endif
   else
     ifneq ($(DARWIN_MAJVERS),4)
       LD.Flags += $(RPATH) -Wl,@executable_path/../lib
@@ -1105,6 +1126,18 @@
 clean-local::
 	-$(Verb) $(RM) -f $(NativeExportsFile)
 else
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+# Solaris ld requires a version script rather than a plain list.
+NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE)).map
+$(NativeExportsFile): $(EXPORTED_SYMBOL_FILE) $(ObjDir)/.dir
+    $(Verb) echo "{" > $@
+    $(Verb) ggrep -q '[[:alnum:]_]' $< && echo "  global:" >> $@ || :
+    $(Verb) gsed -e 's/$$/;/' -e 's/^/    /' < $< >> $@
+    $(Verb) echo "  local: *;" >> $@
+    $(Verb) echo "};" >> $@
+clean-local::
+    -$(Verb) $(RM) -f $(NativeExportsFile)
+else
 ifeq ($(HAVE_LINK_VERSION_SCRIPT),1)
 # Gold and BFD ld require a version script rather than a plain list.
 NativeExportsFile := $(ObjDir)/$(notdir $(EXPORTED_SYMBOL_FILE)).map
@@ -1134,6 +1167,7 @@
 endif
 endif
 endif
+endif
 
 # Now add the linker command-line options to use the native export file.
 
@@ -1153,6 +1187,11 @@
 SharedLinkOptions += $(NativeExportsFile)
 endif
 
+# Solaris
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+LLVMLibsOptions += -Wl,-M -Wl,$(NativeExportsFile)
+endif
+
 endif
 
 ###############################################################################
###
--- lib/Support/CMakeLists.txt	2015-12-14 16:59:19.000000000 -0800
+++ lib/Support/CMakeLists.txt	2016-07-11 13:59:48.145404115 -0700
@@ -28,6 +28,16 @@
   endif( MINGW )
 endif( NOT MSVC )
 
+# On Solaris, -lkstat is only needed on SPARC.
+if(CMAKE_HOST_SOLARIS)
+  set(UNAME "")
+  execute_process(COMMAND uname -p OUTPUT_VARIABLE UNAME)
+  if("${UNAME}" MATCHES "sparc")
+    message(INFO "Adding -lkstat to link line.")
+    set(system_libs ${system_libs} kstat)
+  endif()
+endif()
+
 add_llvm_library(LLVMSupport
   APFloat.cpp
   APInt.cpp
###
--- tools/clang/include/clang/Basic/Makefile	2014-03-31 09:14:44.000000000 -0400
+++ tools/clang/include/clang/Basic/Makefile	2016-05-08 23:19:20.552431239 -0400
@@ -16,8 +16,17 @@
 
 INPUT_TDS = $(wildcard $(PROJ_SRC_DIR)/Diagnostic*.td)
 
+SVN_OR_RC :=
+
 # Compute the Clang version from the LLVM version, unless specified explicitly.
 ifndef CLANG_VERSION
+ifeq ($(LLVMVersion), $(findstring svn, $(LLVMVersion)), svn)
+  SVN_OR_RC := "svn"
+endif
+
+ifeq ($(LLVMVersion), $(findstring rc, $(LLVMVersion)), rc)
+  SVN_OR_RC := "rc"
+endif
 CLANG_VERSION := $(subst svn,,$(LLVMVersion))
 CLANG_VERSION := $(subst rc,,$(CLANG_VERSION))
 endif
@@ -26,6 +35,14 @@
 CLANG_VERSION_MAJOR := $(word 1,$(CLANG_VERSION_COMPONENTS))
 CLANG_VERSION_MINOR := $(word 2,$(CLANG_VERSION_COMPONENTS))
 CLANG_VERSION_PATCHLEVEL := $(word 3,$(CLANG_VERSION_COMPONENTS))
+CLANG_VERSION_TAGGED_STRING :=
+
+ifeq ($(SVN_OR_RC),)
+  CLANG_VERSION_TAGGED_STRING := "\"\(tags/RELEASE_$(CLANG_VERSION_MAJOR)$(CLANG_VERSION_MINOR)$(CLANG_VERSION_PATCHLEVEL)/final\)\""
+else
+  CLANG_VERSION_TAGGED_STRING := "\"\(tags/RELEASE_$(CLANG_VERSION_MAJOR)$(CLANG_VERSION_MINOR)$(CLANG_VERSION_PATCHLEVEL)/$(SVN_OR_RC)\)\""
+endif
+
 ifeq ($(CLANG_VERSION_PATCHLEVEL),)
 CLANG_HAS_VERSION_PATCHLEVEL := 0
 else
@@ -67,4 +84,5 @@
 	           -e "s#@CLANG_VERSION_MINOR@#$(CLANG_VERSION_MINOR)#g" \
 	           -e "s#@CLANG_VERSION_PATCHLEVEL@#$(CLANG_VERSION_PATCHLEVEL)#g" \
 	           -e "s#@CLANG_HAS_VERSION_PATCHLEVEL@#$(CLANG_HAS_VERSION_PATCHLEVEL)#g" \
+		   -e "s#@CLANG_VERSION_TAGGED_STRING@#$(CLANG_VERSION_TAGGED_STRING:' '='')#g" \
 	           $< > $@
###
--- tools/clang/tools/libclang/Makefile	2015-07-07 21:00:30.000000000 -0400
+++ tools/clang/tools/libclang/Makefile	2016-05-08 23:19:20.577431847 -0400
@@ -35,10 +35,16 @@
 include $(CLANG_LEVEL)/Makefile
 
 # Add soname to the library.
-ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux FreeBSD GNU GNU/kFreeBSD))
+ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux FreeBSD GNU GNU/kFreeBSD SunOS))
         LLVMLibsOptions += -Wl,-soname,lib$(LIBRARYNAME)$(SHLIBEXT)
 endif
 
+# Extract everything necessary from Solaris *.a archives
+ifeq ($(HOST_OS), $(filter $(HOST_OS), SunOS))
+  SharedLinkOptions += -Wl,-z -Wl,rescan-now -Wl,-z -Wl,allextract
+  LLVMLibsOptions += -Wl,-z -Wl,defaultextract
+endif
+
 ifeq ($(ENABLE_CLANG_ARCMT),1)
   CXX.Flags += -DCLANG_ENABLE_ARCMT
 endif
###
--- tools/llvm-shlib/Makefile	2014-08-01 02:16:03.000000000 -0400
+++ tools/llvm-shlib/Makefile	2016-05-08 23:19:20.579431896 -0400
@@ -71,7 +71,10 @@
 
 ifeq ($(HOST_OS),SunOS)
     # add -z allextract ahead of other libraries on Solaris
-    LLVMLibsOptions := -Wl,-z -Wl,allextract $(LLVMLibsOptions)
+    LLVMLibsOptions := -Wl,-z -Wl,rescan -Wl,-z -Wl,allextract $(LLVMLibsOptions)
+    LLVMLibsOptions += -Wl,-h -Wl,lib$(LIBRARYNAME)$(SHLIBEXT)
+    LLVMLibsOptions += -Wl,-z -Wl,defaultextract -Wl,-z -Wl,defs
+    LLVMLibsOptions += -lkstat
 endif
 
 ifeq ($(HOST_OS), $(filter $(HOST_OS), Cygwin MingW))
###
--- tools/clang/tools/libclang/CMakeLists.txt	2015-11-11 16:46:57.000000000 -0800
+++ tools/clang/tools/libclang/CMakeLists.txt	2016-05-15 17:35:29.587888133 -0700
@@ -92,6 +92,7 @@
 
   LINK_COMPONENTS
   ${LLVM_TARGETS_TO_BUILD}
+
   Core
   Support
   )
@@ -108,6 +109,9 @@
 
     set_property(TARGET libclang APPEND_STRING PROPERTY
                  LINK_FLAGS ${LIBCLANG_LINK_FLAGS})
+  elseif(CMAKE_HOST_SOLARIS)
+    set(LIBCLANG_LINK_FLAGS " -Wl,-z -Wl,allextract -Wl,-z -Wl,defs -Bsymbolic-functions ")
+    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LIBCLANG_LINK_FLAGS}")
   else()
     set_target_properties(libclang
       PROPERTIES
###
--- tools/llvm-shlib/CMakeLists.txt	2015-11-04 14:11:12.000000000 -0900
+++ tools/llvm-shlib/CMakeLists.txt	2016-07-05 22:08:15.168330085 -0800
@@ -40,12 +40,18 @@
 
 add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB SONAME ${SOURCES})
 
-list(REMOVE_DUPLICATES LIB_NAMES)
+if (LIB_NAMES)
+  list(REMOVE_DUPLICATES "LIB_NAMES")
+endif()
+
 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
   # GNU ld doesn't resolve symbols in the version script.
   set(LIB_NAMES -Wl,--whole-archive ${LIB_NAMES} -Wl,--no-whole-archive)
 elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
   set(LIB_NAMES -Wl,-all_load ${LIB_NAMES})
+elseif(CMAKE_HOST_SOLARIS)
+  set(LIB_NAMES -Wl,-z -Wl,defs -Wl,-Bsymbolic-functions -Wl,-z -Wl,allextract ${LIB_NAMES} -Wl,-z -Wl,defaultextract)
+  # message(STATUS "LIB_NAMES: ${LIB_NAMES}")
 endif()
 
 target_link_libraries(LLVM PRIVATE ${LIB_NAMES})
###
--- cmake/modules/HandleLLVMOptions.cmake	2016-01-06 11:05:19.000000000 -0800
+++ cmake/modules/HandleLLVMOptions.cmake	2016-05-18 19:22:28.803960478 -0700
@@ -132,6 +132,7 @@
 # Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise a DSO
 # build might work on ELF but fail on MachO/COFF.
 if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR
+        CMAKE_HOST_SOLARIS OR
         ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR
         ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND
    NOT LLVM_USE_SANITIZER)
@@ -185,13 +186,13 @@
   endif()
 endif()
 
-if(NOT WIN32 AND NOT CYGWIN)
+if(NOT WIN32 AND NOT CYGWIN AND NOT CMAKE_HOST_SOLARIS)
   # MinGW warns if -fvisibility-inlines-hidden is used.
   check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
   append_if(SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG "-fvisibility-inlines-hidden" CMAKE_CXX_FLAGS)
 endif()
 
-if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
+if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 AND NOT CMAKE_HOST_SOLARIS )
   # TODO: support other platforms and toolchains.
   if( LLVM_BUILD_32_BITS )
     message(STATUS "Building 32 bits executables and libraries.")
@@ -200,10 +201,12 @@
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
     set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -m32")
   endif( LLVM_BUILD_32_BITS )
-endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
+endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 AND NOT CMAKE_HOST_SOLARIS )
 
 if (LLVM_BUILD_STATIC)
+  if (NOT CMAKE_HOST_SOLARIS)
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
+  endif(CMAKE_HOST_SOLARIS)
 endif()
 
 if( XCODE )
###
--- lib/Transforms/Hello/CMakeLists.txt	2015-06-15 17:44:12.000000000 -0700
+++ lib/Transforms/Hello/CMakeLists.txt	2016-05-17 18:08:53.730103135 -0700
@@ -1,14 +1,18 @@
 # If we don't need RTTI or EH, there's no reason to export anything
 # from the hello plugin.
-if( NOT LLVM_REQUIRES_RTTI )
-  if( NOT LLVM_REQUIRES_EH )
-    set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Hello.exports)
-  endif()
-endif()
+# It doesn't export anything anyway, regardless of RTTI or no RTTI.
+# Why does it need an empty linker mapfile?
+IF (NOT CMAKE_HOST_SOLARIS)
+  IF (NOT LLVM_REQUIRES_RTTI)
+    IF (NOT LLVM_REQUIRES_EH)
+      SET (LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Hello.exports)
+    ENDIF()
+  ENDIF()
+ENDIF()
 
-if(WIN32 OR CYGWIN)
-  set(LLVM_LINK_COMPONENTS Core Support)
-endif()
+if(WIN32 OR CYGWIN OR CMAKE_HOST_SOLARIS)
+  SET (LLVM_LINK_COMPONENTS Core Support)
+ENDIF()
 
 add_llvm_loadable_module( LLVMHello
   Hello.cpp
###
--- tools/clang/tools/driver/CMakeLists.txt	2015-11-10 04:51:25.000000000 -0800
+++ tools/clang/tools/driver/CMakeLists.txt	2016-05-21 07:44:27.981263031 -0700
@@ -1,3 +1,7 @@
+IF(CMAKE_HOST_SOLARIS)
+  include (GNUInstallDirs)
+ENDIF(CMAKE_HOST_SOLARIS)
+
 set( LLVM_LINK_COMPONENTS
   ${LLVM_TARGETS_TO_BUILD}
   Analysis
@@ -51,9 +55,15 @@
 
 add_dependencies(clang clang-headers)
 
+IF(CMAKE_HOST_SOLARIS)
+  install(TARGETS clang
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+    COMPONENT clang)
+ELSE()
 install(TARGETS clang
   RUNTIME DESTINATION bin
   COMPONENT clang)
+ENDIF()
 
 if(NOT CMAKE_CONFIGURATION_TYPES)
   add_custom_target(install-clang
--- tools/clang/tools/scan-view/CMakeLists.txt	2015-11-13 12:34:15.000000000 -0800
+++ tools/clang/tools/scan-view/CMakeLists.txt	2016-05-21 08:48:55.352488404 -0700
@@ -1,3 +1,7 @@
+IF(CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+ENDIF(CMAKE_HOST_SOLARIS)
+
 option(CLANG_INSTALL_SCANVIEW "Install the scan-view tool" ON)
 
 set(BinFiles
@@ -21,7 +25,11 @@
                          ${CMAKE_BINARY_DIR}/bin/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile})
     list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile})
+    IF(CMAKE_HOST_SOLARIS)
+      install(PROGRAMS bin/${BinFile} DESTINATION ${CMAKE_INSTALL_BINDIR})
+    ELSE()
     install(PROGRAMS bin/${BinFile} DESTINATION bin)
+    ENDIF()
   endforeach()
 
   foreach(ShareFile ${ShareFiles})
@@ -33,7 +41,12 @@
                          ${CMAKE_BINARY_DIR}/share/scan-view/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile})
     list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile})
+    IF(CMAKE_HOST_SOLARIS)
+      install(FILES share/${ShareFile} DESTINATION
+        ${CMAKE_INSTALL_DATAROOTDIR}//scan-view)
+    ELSE()
     install(FILES share/${ShareFile} DESTINATION share/scan-view)
+    ENDIF()
   endforeach()
 
   add_custom_target(scan-view ALL DEPENDS ${Depends})
--- tools/clang/tools/clang-check/CMakeLists.txt	2015-07-16 18:19:54.000000000 -0700
+++ tools/clang/tools/clang-check/CMakeLists.txt	2016-05-21 08:52:13.223643264 -0700
@@ -1,3 +1,7 @@
+IF (CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+ENDIF(CMAKE_HOST_SOLARIS)
+
 set( LLVM_LINK_COMPONENTS
   ${LLVM_TARGETS_TO_BUILD}
   Option
@@ -18,5 +22,9 @@
   clangTooling
   )
 
-install(TARGETS clang-check
-  RUNTIME DESTINATION bin)
+IF(CMAKE_HOST_SOLARIS)
+  install(TARGETS clang-check RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+ELSE()
+  install(TARGETS clang-check RUNTIME DESTINATION bin)
+ENDIF()
+
###
--- tools/clang/tools/diagtool/CMakeLists.txt	2014-02-20 23:59:59.000000000 -0800
+++ tools/clang/tools/diagtool/CMakeLists.txt	2016-05-23 06:25:56.330339818 -0700
@@ -1,6 +1,6 @@
-set(LLVM_LINK_COMPONENTS
-  Support
-  )
+include(GNUInstallDirs)
+
+set(LLVM_LINK_COMPONENTS Support)
 
 add_clang_executable(diagtool
   diagtool_main.cpp
@@ -13,11 +13,15 @@
 
 target_link_libraries(diagtool
   clangBasic
-  clangFrontend
-  )
+  clangFrontend)
 
 if(UNIX)
   set(CLANGXX_LINK_OR_COPY create_symlink)
 else()
   set(CLANGXX_LINK_OR_COPY copy)
 endif()
+
+install(TARGETS diagtool
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+        COMPONENT diagtool)
+
--- tools/clang/tools/c-arcmt-test/CMakeLists.txt	2014-11-05 06:04:25.000000000 -0800
+++ tools/clang/tools/c-arcmt-test/CMakeLists.txt	2016-05-23 06:30:27.431481181 -0700
@@ -1,17 +1,16 @@
-add_clang_executable(c-arcmt-test
-  c-arcmt-test.c
-  )
+include(GNUInstallDirs)
+
+add_clang_executable(c-arcmt-test c-arcmt-test.c)
 
 if (LLVM_BUILD_STATIC)
-  target_link_libraries(c-arcmt-test
-    libclang_static
-    )
+  target_link_libraries(c-arcmt-test libclang_static)
 else()
-  target_link_libraries(c-arcmt-test
-    libclang
-    )
+  target_link_libraries(c-arcmt-test libclang)
 endif()
 
-set_target_properties(c-arcmt-test
-  PROPERTIES
-  LINKER_LANGUAGE CXX)
+set_target_properties(c-arcmt-test PROPERTIES LINKER_LANGUAGE CXX)
+
+install(TARGETS c-arcmt-test
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+        COMPONENT c-arcmt-test)
+
--- tools/clang/tools/arcmt-test/CMakeLists.txt	2014-01-31 10:09:49.000000000 -0800
+++ tools/clang/tools/arcmt-test/CMakeLists.txt	2016-05-23 06:29:00.860135211 -0700
@@ -1,14 +1,16 @@
-set(LLVM_LINK_COMPONENTS
-  support
-  )
+include(GNUInstallDirs)
 
-add_clang_executable(arcmt-test
-  arcmt-test.cpp
-  )
+set(LLVM_LINK_COMPONENTS Support)
+
+add_clang_executable(arcmt-test arcmt-test.cpp)
 
 target_link_libraries(arcmt-test
   clangARCMigrate
   clangBasic
   clangFrontend
-  clangLex
-  )
+  clangLex)
+
+install(TARGETS arcmt-test
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+        COMPONENT arcmt-test)
+
###
--- tools/clang/tools/c-index-test/CMakeLists.txt	2015-11-13 14:41:14.000000000 -0800
+++ tools/clang/tools/c-index-test/CMakeLists.txt	2016-05-23 07:56:42.716288730 -0700
@@ -1,27 +1,18 @@
-add_clang_executable(c-index-test
-  c-index-test.c
-  )
+include(GNUInstallDirs)
+
+add_clang_executable(c-index-test c-index-test.c)
 
 if(NOT MSVC)
-  set_property(
-    SOURCE c-index-test.c
-    PROPERTY COMPILE_FLAGS "-std=gnu89"
-    )
+  set_property( SOURCE c-index-test.c PROPERTY COMPILE_FLAGS "-std=gnu89")
 endif()
 
 if (LLVM_BUILD_STATIC)
-  target_link_libraries(c-index-test
-    libclang_static
-  )
+  target_link_libraries(c-index-test libclang_static)
 else()
-  target_link_libraries(c-index-test
-    libclang
-  )
+  target_link_libraries(c-index-test libclang)
 endif()
 
-set_target_properties(c-index-test
-  PROPERTIES
-  LINKER_LANGUAGE CXX)
+set_target_properties(c-index-test PROPERTIES LINKER_LANGUAGE CXX)
 
 # If libxml2 is available, make it available for c-index-test.
 if (CLANG_HAVE_LIBXML)
@@ -31,9 +22,18 @@
 
 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
   if(INTERNAL_INSTALL_PREFIX)
-    set(INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/bin")
+    if(CMAKE_HOST_SOLARIS)
+      set(INSTALL_DESTINATION
+          "${INTERNAL_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
+    else()
+      set(INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/bin")
+    endif()
   else()
-    set(INSTALL_DESTINATION bin)
+    if (CMAKE_HOST_SOLARIS)
+      set(INSTALL_DESTINATION ${CMAKE_INSTALL_BINDIR})
+    else()
+      set(INSTALL_DESTINATION bin)
+    endif()
   endif()
 
   install(TARGETS c-index-test
@@ -48,3 +48,4 @@
               -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
   endif()
 endif()
+
###
--- tools/llvm-lto/CMakeLists.txt	2015-10-19 08:21:46.000000000 -0700
+++ tools/llvm-lto/CMakeLists.txt	2016-05-23 06:23:43.366481218 -0700
@@ -1,3 +1,5 @@
+include(GNUInstallDirs)
+
 set(LLVM_LINK_COMPONENTS
   ${LLVM_TARGETS_TO_BUILD}
   BitWriter
@@ -6,10 +8,11 @@
   MC
   Object
   Support
-  Target
-  )
+  Target)
+
+add_llvm_tool(llvm-lto llvm-lto.cpp)
 
-add_llvm_tool(llvm-lto
-  llvm-lto.cpp
-  )
+install(TARGETS llvm-lto
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+        COMPONENT llvm-lto)
 
###
--- tools/clang/tools/scan-build/CMakeLists.txt	2015-11-20 10:49:02.000000000 -0800
+++ tools/clang/tools/scan-build/CMakeLists.txt	2016-05-21 09:18:25.745824278 -0700
@@ -38,7 +38,11 @@
                          ${CMAKE_BINARY_DIR}/bin/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/${BinFile})
     list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile})
+    if (CMAKE_HOST_SOLARIS)
+      install(PROGRAMS bin/${BinFile} DESTINATION ${CMAKE_INSTALL_BINDIR})
+    else()
     install(PROGRAMS bin/${BinFile} DESTINATION bin)
+    endif()
   endforeach()
 
   foreach(LibexecFile ${LibexecFiles})
@@ -50,7 +54,12 @@
                          ${CMAKE_BINARY_DIR}/libexec/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libexec/${LibexecFile})
     list(APPEND Depends ${CMAKE_BINARY_DIR}/libexec/${LibexecFile})
+    if (CMAKE_HOST_SOLARIS)
+      install(PROGRAMS libexec/${LibexecFile} DESTINATION
+              ${CMAKE_INSTALL_LIBEXECDIR})
+    ELSE()
     install(PROGRAMS libexec/${LibexecFile} DESTINATION libexec)
+    ENDIF()
   endforeach()
 
   foreach(ManPage ${ManPages})
@@ -74,9 +83,15 @@
                          ${CMAKE_BINARY_DIR}/share/scan-build/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/scan-build/${ShareFile})
     list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile})
+    IF (CMAKE_HOST_SOLARIS)
+      install(FILES share/scan-build/${ShareFile} DESTINATION
+        ${CMAKE_INSTALL_DATAROOTDIR}/scan-build)
+    ELSE()
     install(FILES share/scan-build/${ShareFile} DESTINATION share/scan-build)
+    ENDIF()
   endforeach()
 
   add_custom_target(scan-build ALL DEPENDS ${Depends})
   set_target_properties(scan-build PROPERTIES FOLDER "Misc")
 endif()
+
--- tools/clang/tools/clang-format/CMakeLists.txt	2015-09-30 12:28:47.000000000 -0700
+++ tools/clang/tools/clang-format/CMakeLists.txt	2016-05-21 09:33:31.300900932 -0700
@@ -1,5 +1,9 @@
 set(LLVM_LINK_COMPONENTS support)
 
+if(CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+endif()
+
 add_clang_executable(clang-format
   ClangFormat.cpp
   )
@@ -19,6 +23,21 @@
   add_subdirectory(fuzzer)
 endif()
 
+if(CMAKE_HOST_SOLARIS)
+  install(TARGETS clang-format RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+  install(PROGRAMS clang-format-bbedit.applescript
+          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clang)
+  install(PROGRAMS clang-format-diff.py
+          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clang)
+  install(PROGRAMS clang-format-sublime.py
+          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clang)
+  install(PROGRAMS clang-format.el
+          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clang)
+  install(PROGRAMS clang-format.py
+          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clang)
+  install(PROGRAMS git-clang-format
+          DESTINATION ${CMAKE_INSTALL_BINDIR})
+else()
 install(TARGETS clang-format RUNTIME DESTINATION bin)
 install(PROGRAMS clang-format-bbedit.applescript DESTINATION share/clang)
 install(PROGRAMS clang-format-diff.py DESTINATION share/clang)
@@ -26,3 +45,5 @@
 install(PROGRAMS clang-format.el DESTINATION share/clang)
 install(PROGRAMS clang-format.py DESTINATION share/clang)
 install(PROGRAMS git-clang-format DESTINATION bin)
+endif()
+
###
--- tools/clang/CMakeLists.txt	2016-01-05 15:51:42.000000000 -0800
+++ tools/clang/CMakeLists.txt	2016-05-23 14:00:47.358240529 -0700
@@ -1,5 +1,7 @@
 cmake_minimum_required(VERSION 2.8.8)
 
+include(GNUInstallDirs)
+
 # FIXME: It may be removed when we use 2.8.12.
 if(CMAKE_VERSION VERSION_LESS 2.8.12)
   # Invalidate a couple of keywords.
@@ -84,6 +86,7 @@
   # They are used as destination of target generators.
   set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
   set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
+
   if(WIN32 OR CYGWIN)
     # DLL platform -- put DLLs into bin.
     set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
@@ -196,11 +199,21 @@
 set(DEFAULT_SYSROOT "" CACHE PATH
   "Default <path> to all compiler invocations for --sysroot=<path>." )
 
+if(CMAKE_HOST_SOLARIS)
+  set(CLANG_DEFAULT_OPENMP_RUNTIME "libiomp5" CACHE STRING
+      "Default OpenMP runtime used by -fopenmp.")
+else()
 set(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING
   "Default OpenMP runtime used by -fopenmp.")
+endif()
 
+if(CMAKE_HOST_SOLARIS)
+  set(CLANG_VENDOR "Oracle Solaris" CACHE STRING
+      "Vendor-specific text for showing with version information.")
+else()
 set(CLANG_VENDOR "" CACHE STRING
   "Vendor-specific text for showing with version information.")
+endif()
 
 if( CLANG_VENDOR )
   add_definitions( -DCLANG_VENDOR="${CLANG_VENDOR} " )
@@ -399,12 +412,21 @@
     target_link_libraries(${name} ${cmake_2_8_12_INTERFACE} ${LLVM_COMMON_LIBS})
 
     if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libclang")
+      if(CMAKE_HOST_SOLARIS)
       install(TARGETS ${name}
         COMPONENT ${name}
         EXPORT ClangTargets
-        LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
-        ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
+          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+      else()
+        install(TARGETS ${name}
+          COMPONENT ${name}
+          EXPORT ClangTargets
+          LIBRARY DESTINATION lib
+          ARCHIVE DESTINATION lib
         RUNTIME DESTINATION bin)
+      endif()
 
       if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES)
         add_custom_target(install-${name}
@@ -443,6 +465,26 @@
   ${CMAKE_CURRENT_SOURCE_DIR}/include
   )
 
+if (CMAKE_HOST_SOLARIS)
+  if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+    install(DIRECTORY include/clang include/clang-c
+      DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+      FILES_MATCHING
+      PATTERN "*.def"
+      PATTERN "*.h"
+      PATTERN "config.h" EXCLUDE
+      PATTERN ".svn" EXCLUDE
+      )
+
+    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
+      DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+      FILES_MATCHING
+      PATTERN "CMakeFiles" EXCLUDE
+      PATTERN "*.inc"
+      PATTERN "*.h"
+      )
+  endif()
+else()
 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
   install(DIRECTORY include/clang include/clang-c
     DESTINATION include
@@ -461,12 +503,17 @@
     PATTERN "*.h"
     )
 endif()
+endif()
 
 if(INTERNAL_INSTALL_PREFIX)
   set(LIBCLANG_HEADERS_INSTALL_DESTINATION "${INTERNAL_INSTALL_PREFIX}/include")
 else()
+  if (CMAKE_HOST_SOLARIS)
+    set(LIBCLANG_HEADERS_INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+  else()
   set(LIBCLANG_HEADERS_INSTALL_DESTINATION include)
 endif()
+endif()
 
 install(DIRECTORY include/clang-c
   COMPONENT libclang-headers
###
--- tools/clang/lib/Headers/CMakeLists.txt	2015-12-31 06:14:07.000000000 -0800
+++ tools/clang/lib/Headers/CMakeLists.txt	2016-05-21 09:37:34.349722741 -0700
@@ -1,3 +1,5 @@
+include(GNUInstallDirs)
+
 set(files
   adxintrin.h
   altivec.h
@@ -101,11 +103,18 @@
 add_custom_target(clang-headers ALL DEPENDS ${out_files})
 set_target_properties(clang-headers PROPERTIES FOLDER "Misc")
 
-install(
-  FILES ${files} ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h
+if(CMAKE_HOST_SOLARIS)
+  install(FILES ${files} ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h
+    COMPONENT clang-headers
+    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
+    DESTINATION
+    ${CMAKE_INSTALL_LIBDIR}/clang/${CLANG_VERSION}/include)
+else()
+  install(FILES ${files} ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h
   COMPONENT clang-headers
   PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
   DESTINATION lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
+endif()
 
 if (NOT CMAKE_CONFIGURATION_TYPES) # don't add this for IDE's.
   add_custom_target(install-clang-headers
@@ -114,3 +123,4 @@
             -DCMAKE_INSTALL_COMPONENT=clang-headers
             -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
 endif()
+
--- bindings/ocaml/llvm/CMakeLists.txt	2014-12-29 19:24:07.000000000 -0800
+++ bindings/ocaml/llvm/CMakeLists.txt	2016-05-21 10:59:56.318803888 -0700
@@ -1,3 +1,7 @@
+if (CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+endif()
+
 add_ocaml_library(llvm
   OCAML llvm
   C     llvm_ocaml
@@ -7,5 +11,10 @@
   "${CMAKE_CURRENT_SOURCE_DIR}/META.llvm.in"
   "${LLVM_LIBRARY_DIR}/ocaml/META.llvm")
 
+if (CMAKE_HOST_SOLARIS)
 install(FILES "${LLVM_LIBRARY_DIR}/ocaml/META.llvm"
-        DESTINATION lib/ocaml)
+          DESTINATION ${CMAKE_INSTALL_LIBDIR}/ocaml)
+else()
+  install(FILES "${LLVM_LIBRARY_DIR}/ocaml/META.llvm" DESTINATION lib/ocaml)
+endif()
+
--- bindings/ocaml/backends/CMakeLists.txt	2014-12-29 19:24:07.000000000 -0800
+++ bindings/ocaml/backends/CMakeLists.txt	2016-05-21 11:02:23.891171801 -0700
@@ -1,3 +1,7 @@
+if (CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+endif()
+
 foreach(TARGET ${LLVM_TARGETS_TO_BUILD})
   set(OCAML_LLVM_TARGET ${TARGET})
 
@@ -22,6 +26,12 @@
     "${CMAKE_CURRENT_SOURCE_DIR}/META.llvm_backend.in"
     "${LLVM_LIBRARY_DIR}/ocaml/META.llvm_${TARGET}")
 
+  if (CMAKE_HOST_SOLARIS)
+    install(FILES "${LLVM_LIBRARY_DIR}/ocaml/META.llvm_${TARGET}"
+      DESTINATION ${CMAKE_INSTALL_LIBDIR}/ocaml)
+  else()
   install(FILES "${LLVM_LIBRARY_DIR}/ocaml/META.llvm_${TARGET}"
           DESTINATION lib/ocaml)
+  endif()
 endforeach()
+
###
--- CMakeLists.txt	2016-01-13 11:03:44.000000000 -0800
+++ CMakeLists.txt	2016-07-08 05:07:23.987736754 -0700
@@ -2,6 +2,8 @@
 
 cmake_minimum_required(VERSION 2.8.12.2)
 
+include(GNUInstallDirs)
+
 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
   message(STATUS "No build type selected, default to Debug")
   set(CMAKE_BUILD_TYPE "Debug")
@@ -79,6 +81,16 @@
   endif()
 endif()
 
+if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+  if (NOT (${CMAKE_MAJOR_VERSION} GREATER 3))
+    if (NOT (${CMAKE_MINOR_VERSION} GREATER 6))
+      if (NOT ${CMAKE_HOST_SOLARIS} EQUAL 1)
+        message(ERROR "You must provide -DCMAKE_HOST_SOLARIS:BOOL=TRUE for CMake < 3.6.0")
+      endif()
+    endif()
+  endif()
+endif()
+
 # Add path for custom modules
 set(CMAKE_MODULE_PATH
   ${CMAKE_MODULE_PATH}
@@ -334,6 +346,12 @@
 # Define the default arguments to use with 'lit', and an option for the user to
 # override.
 set(LIT_ARGS_DEFAULT "-sv")
+if (CMAKE_HOST_SOLARIS)
+  set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --threads=1")
+  set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --succinct")
+  set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
+endif()
+
 if (MSVC_IDE OR XCODE)
   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
 endif()
@@ -554,20 +572,33 @@
   ${LLVM_INCLUDE_DIR}/llvm/Support/DataTypes.h)
 
 # They are not referenced. See set_output_directory().
+if(CMAKE_HOST_SOLARIS)
+  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINIR})
+  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
+  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
+else()
 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
+endif()
 
 set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
+
 if (APPLE)
   set(CMAKE_INSTALL_NAME_DIR "@rpath")
   set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
 else(UNIX)
   if(NOT DEFINED CMAKE_INSTALL_RPATH)
+    if (NOT CMAKE_HOST_SOLARIS)
     set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}")
     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin")
-      set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
+        set(CMAKE_SHARED_LINKER_FLAGS
+          "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin")
+      endif()
     endif()
   endif(NOT DEFINED CMAKE_INSTALL_RPATH)
 endif()
@@ -639,6 +670,12 @@
   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
 endif()
 
+if(CMAKE_HOST_SOLARIS)
+  llvm_replace_compiler_option(CMAKE_C_FLAGS_RELEASE "-O3" "-O0")
+  llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O0")
+  llvm_replace_compiler_option(CMAKE_ASM_FLAGS_RELEASE "-O3" "-O0")
+endif()
+
 # Put this before tblgen. Else we have a circular dependence.
 add_subdirectory(lib/Support)
 add_subdirectory(lib/TableGen)
###
--- cmake/modules/AddLLVM.cmake	2016-02-12 09:52:29.000000000 -0800
+++ cmake/modules/AddLLVM.cmake	2016-05-21 11:50:17.129351767 -0700
@@ -2,6 +2,17 @@
 include(LLVM-Config)
 include(DetermineGCCCompatible)
 
+if (CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+endif()
+
+if (CMAKE_HOST_SOLARIS)
+  SET (LLVM_REQUIRES_EH ON)
+  SET (LLVM_ENABLE_EH ON)
+  SET (LLVM_REQUIRES_RTTI ON)
+  SET (LLVM_ENABLE_RTTI ON)
+endif(CMAKE_HOST_SOLARIS)
+
 function(llvm_update_compile_flags name)
   get_property(sources TARGET ${name} PROPERTY SOURCES)
   if("${sources}" MATCHES "\\.c(;|$)")
@@ -69,7 +80,26 @@
       COMMENT "Creating export file for ${target_name}")
     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
                  LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
-  elseif(LLVM_HAVE_LINK_VERSION_SCRIPT)
+  elseif(CMAKE_HOST_SOLARIS)
+    # Gold and BFD ld require a version script rather than a plain list.
+    set(native_export_file "${target_name}.exports")
+    add_custom_command(OUTPUT ${native_export_file}
+      COMMAND /usr/gnu/bin/echo "$mapfile_version 2" > ${native_export_file}
+      COMMAND /usr/gnu/bin/echo "" >> ${native_export_file}
+      COMMAND /usr/gnu/bin/echo "SYMBOL_SCOPE {" >> ${native_export_file}
+      COMMAND /usr/gnu/bin/grep -q "[[:alnum:]]" ${export_file} && /usr/gnu/bin/echo "  global:" >> ${native_export_file} || :
+      COMMAND /usr/gnu/bin/sed -e "s/$/;/" -e "s/^/    /" < ${export_file} >> ${native_export_file}
+      # COMMAND echo "  local: *;" >> ${native_export_file}
+      COMMAND /usr/gnu/bin/echo "};" >> ${native_export_file}
+      COMMAND /usr/gnu/bin/touch -am ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}
+      DEPENDS ${export_file}
+      VERBATIM
+      COMMENT "Creating export file for ${target_name}")
+      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
+                   LINK_FLAGS "  -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
+    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
+      LINK_FLAGS "  -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
+  elseif(LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT CMAKE_HOST_SOLARIS)
     # Gold and BFD ld require a version script rather than a plain list.
     set(native_export_file "${target_name}.exports")
     # FIXME: Don't write the "local:" line on OpenBSD.
@@ -82,13 +112,8 @@
       DEPENDS ${export_file}
       VERBATIM
       COMMENT "Creating export file for ${target_name}")
-    if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
-      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
-                   LINK_FLAGS "  -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
-    else()
       set_property(TARGET ${target_name} APPEND_STRING PROPERTY
                    LINK_FLAGS "  -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
-    endif()
   else()
     set(native_export_file "${target_name}.def")
 
@@ -529,11 +554,13 @@
     ""
     ""
     ${ARGN})
+
   if( BUILD_SHARED_LIBS )
     llvm_add_library(${name} SHARED ${ARGN})
   else()
     llvm_add_library(${name} ${ARGN})
   endif()
+
   # The gtest libraries should not be installed or exported as a target
   if ("${name}" STREQUAL gtest OR "${name}" STREQUAL gtest_main)
     set(_is_gtest TRUE)
@@ -546,16 +573,37 @@
     set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
   elseif(NOT _is_gtest)
     if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO")
-      set(install_dir lib${LLVM_LIBDIR_SUFFIX})
+      if (CMAKE_HOST_SOLARIS)
+        set(install_dir ${CMAKE_INSTALL_LIBDIR})
+      else()
+        set(install_dir lib)
+      endif()
+
       if(ARG_SHARED OR BUILD_SHARED_LIBS)
         if(WIN32 OR CYGWIN OR MINGW)
           set(install_type RUNTIME)
           set(install_dir bin)
         else()
           set(install_type LIBRARY)
+          if (CMAKE_HOST_SOLARIS)
+            set(install_dir ${CMAKE_INSTALL_LIBDIR})
         endif()
+        endif()
+      elseif(LLVM_BUILD_LVLM_DYLIB)
+        if (CMAKE_HOST_SOLARIS)
+          set(install_type RUNTIME)
+          set(install_dir ${CMAKE_INSTALL_BINDIR})
+        else()
+          set(install_type RUNTIME)
+          set(install_dir bin)
+        endif()
       else()
         set(install_type ARCHIVE)
+        if (CMAKE_HOST_SOLARIS)
+          set(install_dir ${CMAKE_INSTALL_LIBDIR})
+        else()
+          set(install_dir lib)
+        endif()
       endif()
 
       install(TARGETS ${name}
@@ -590,13 +638,26 @@
           # DLL platform
           set(dlldir "bin")
         else()
+          if (CMAKE_HOST_SOLARIS)
+            set(dlldir ${CMAKE_INSTALL_LIBDIR})
+          else()
           set(dlldir "lib${LLVM_LIBDIR_SUFFIX}")
         endif()
+        endif()
+
+        if (CMAKE_HOST_SOLARIS)
+          install(TARGETS ${name}
+            EXPORT LLVMExports
+            LIBRARY DESTINATION ${dlldir}
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+        else()
         install(TARGETS ${name}
           EXPORT LLVMExports
           LIBRARY DESTINATION ${dlldir}
           ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
       endif()
+      endif()
+
       set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
     endif()
   endif()
@@ -700,10 +761,17 @@
   list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL)
   if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
     if( LLVM_BUILD_TOOLS )
+      if (CMAKE_HOST_SOLARIS)
       install(TARGETS ${name}
               EXPORT LLVMExports
-              RUNTIME DESTINATION bin
+          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+              COMPONENT ${name})
+      else()
+        install(TARGETS ${name}
+          EXPORT LLVMExports
+          RUNTIME DESTINATION bin/${LLVM_BINDIR_SUFFIX}
               COMPONENT ${name})
+      endif()
 
       if (NOT CMAKE_CONFIGURATION_TYPES)
         add_custom_target(install-${name}
@@ -737,9 +805,16 @@
   add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
   set_target_properties(${name} PROPERTIES FOLDER "Utils")
   if( LLVM_INSTALL_UTILS )
+    if (CMAKE_HOST_SOLARIS)
+    install (TARGETS ${name}
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+      COMPONENT ${name})
+    else()
     install (TARGETS ${name}
       RUNTIME DESTINATION bin
       COMPONENT ${name})
+    endif()
+
     if (NOT CMAKE_CONFIGURATION_TYPES)
       add_custom_target(install-${name}
                         DEPENDS ${name}
###
--- cmake/modules/TableGen.cmake	2015-10-23 12:48:17.000000000 -0700
+++ cmake/modules/TableGen.cmake	2016-05-21 10:57:12.766140197 -0700
@@ -2,6 +2,10 @@
 # Extra parameters for `tblgen' may come after `ofn' parameter.
 # Adds the name of the generated file to TABLEGEN_OUTPUT.
 
+if (CMAKE_HOST_SOLARIS)
+  include(GNUInstallDirs)
+endif()
+
 function(tablegen project ofn)
   # Validate calling context.
   foreach(v
@@ -138,10 +142,18 @@
       set_target_properties(${target} PROPERTIES LINK_FLAGS -Wl,--stack,16777216)
     endif(CMAKE_SIZEOF_VOID_P MATCHES "8")
   endif( MINGW )
+
   if (${project} STREQUAL LLVM AND NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+    if (CMAKE_HOST_SOLARIS)
+      install(TARGETS ${target}
+        EXPORT LLVMExports
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    else()
     install(TARGETS ${target}
             EXPORT LLVMExports
             RUNTIME DESTINATION bin)
   endif()
+  endif()
   set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${target})
 endmacro()
+
###