PSARC 2016/236 Intel OpenMP Runtime
authorStefan Teleman <stefan.teleman@oracle.com>
Wed, 17 Aug 2016 16:04:09 -0700
changeset 6624 c6cfc48dd184
parent 6623 e84ad67b5fb3
child 6629 5cb24dd4b073
PSARC 2016/236 Intel OpenMP Runtime 22778656 integrate the Intel OpenMP library in Solaris
components/intel-openmp/Makefile
components/intel-openmp/libiomp.license
components/intel-openmp/libiomp5.p5m
components/intel-openmp/patches/000-libiomp-solaris-build-files.patch
components/intel-openmp/patches/001-libiomp-solaris-src.patch
components/intel-openmp/patches/002-libiomp-solaris-linker-mapfile.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/Makefile	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,163 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+#
+
+export PARFAIT_BUILD=no
+
+BUILD_BITS = 64_and_32
+COMPILER = gcc
+
+include ../../make-rules/shared-macros.mk
+
+COMPONENT_NAME        = libomp
+COMPONENT_VERSION     = 20151009
+COMPONENT_SRC         = $(COMPONENT_NAME)_$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE     = $(COMPONENT_SRC)_oss.tgz
+COMPONENT_ARCHIVE_HASH= \
+         sha256:d4254420d0081c6844eb05237bab5e731e669a429a9c1c87e2e0221ccf0de6ac
+COMPONENT_ARCHIVE_URL = http://www.openmprtl.org/sites/default/files/$(COMPONENT_ARCHIVE)
+COMPONENT_PROJECT_URL = http://www.openmprtl.org/
+COMPONENT_BUGDB       = library/intel-openmp
+
+TPNO = 27154
+
+BUILD_STYLE = justmake
+
+include $(WS_MAKE_RULES)/common.mk
+
+# We are using GCC 4.9 with LLVM, use it here too for the time being.
+# Switch to GCC 5.3 if/when LLVM can.
+CC = /usr/gcc/4.9/bin/gcc
+CXX = /usr/gcc/4.9/bin/g++
+
+export PATH=/usr/gnu/bin:/usr/gcc/$(GCC_V)/bin:/usr/bin:/usr/perl5/5.22/bin
+
+PATCH_LEVEL := 0
+DEBUG_BUILD := 0
+
+# This component uses cmake to generate Makefiles and thus does not
+# run any configure script
+CMAKE = /usr/bin/cmake
+CMAKE_PREFIX = /usr
+
+CMAKE_BINDIR.32     = bin/$(MACH32)
+CMAKE_BINDIR.64     = bin
+CMAKE_LIBDIR.32     = lib
+CMAKE_LIBDIR.64     = lib/$(MACH64)
+
+ISA_CFLAGS.i386	= -fno-omit-frame-pointer -march=opteron -mtune=opteron
+ISA_CFLAGS.sparc = -mptr$(BITS) -mtune=ultrasparc3 -mcpu=ultrasparc3
+ISA_CFLAGS.sparc += -mvis2 -mhard-float -mno-unaligned-doubles
+ISA_CFLAGS.sparc += -mimpure-text
+ISA_CFLAGS = $(ISA_CFLAGS.$(MACH))
+
+OMP_STATS = off
+OFLAG = -O2
+GFLAG =
+DFLAG = -DNDEBUG
+
+ifeq ($(DEBUG_BUILD),1)
+  OMP_STATS = on
+  OFLAG = -O0
+  GFLAG = -g3
+  DFLAG =
+endif
+
+# Because of the weird way in which libiomp wants to build itself,
+# we can't pass a -std=<N> on compile line. This is done internally
+# by the cmake configuration files.
+# The Userland default flags for GCC are broken.
+CFLAGS = -m$(BITS) $(OFLAG) $(GFLAG) $(ISA_CFLAGS) -Wall
+CFLAGS += -fkeep-static-consts -fno-strict-aliasing
+
+CXXFLAGS = -m$(BITS) $(OFLAG) $(GFLAG) $(ISA_CFLAGS) -Wall
+CXXFLAGS += -fkeep-static-consts -fno-strict-aliasing
+CXXFLAGS += -Wl,-z -Wl,relax=comdat
+
+CPPFLAGS = -D__EXTENSIONS__=1 -DKMP_GOMP_COMPAT=1
+CPPFLAGS += -DKMP_TDATA_GTID=1
+LDFLAGS += -z ignore -z relax=comdat
+
+LIBIOMP_RUNPATH_32	= /usr/gcc/4.9/lib
+LIBIOMP_RUNPATH_64	= /usr/gcc/4.9/lib/$(MACH64)
+LIBIOMP_RUNPATH	= $(LIBIOMP_RUNPATH_$(BITS))
+
+CFLAGS		+= -Wl,-R -Wl,$(LIBIOMP_RUNPATH)
+CXXFLAGS	+= -Wl,-R -Wl,$(LIBIOMP_RUNPATH)
+LDFLAGS		+= -R$(LIBIOMP_RUNPATH)
+LD_OPTIONS	= -z ignore -z relax=comdat
+
+CMAKE_OPTIONS = -DCMAKE_C_COMPILER=$(CC)
+CMAKE_OPTIONS += -DCMAKE_CXX_COMPILER=$(CXX)
+CMAKE_OPTIONS += -DCFLAGS="$(CPPFLAGS) $(CFLAGS)"
+CMAKE_OPTIONS += -DCXXFLAGS="$(CPPFLAGS) $(CXXFLAGS)"
+CMAKE_OPTIONS += -DLDFLAGS="$(LDFLAGS)"
+CMAKE_OPTIONS += -DCMAKE_INSTALL_PREFIX=$(CMAKE_PREFIX)
+CMAKE_OPTIONS += -DINSTALL_LIBDIR:PATH=$(CMAKE_LIBDIR)
+CMAKE_OPTIONS += -DCMAKE_INSTALL_LIBDIR:PATH=$(CMAKE_LIBDIR)
+CMAKE_OPTIONS += -DCMAKE_MAKE_PROGRAM=$(GMAKE)
+CMAKE_OPTIONS += -DCMAKE_SHARED_LIBRARY_SUFFIX=".so.5"
+
+CMAKE_OPTIONS += -DCMAKE_C_FLAGS_RELEASE:STRING="$(OFLAG) $(GFLAG) $(DFLAG)"
+CMAKE_OPTIONS += -DCMAKE_CXX_FLAGS_RELEASE:STRING="$(OFLAG) $(GFLAG) $(DFLAG)"
+
+CMAKE_OPTIONS += -DCMAKE_VERBOSE_MAKEFILE=1
+CMAKE_OPTIONS += -DCOMPILER_SUPPORTS_QUAD_PRECISION=true
+CMAKE_OPTIONS += -DDEBUG_BUILD=false
+CMAKE_OPTIONS += -DLIBOMP_OMPT_SUPPORT=on
+
+CMAKE_OPTIONS += -DLIBOMP_USE_ADAPTIVE_LOCKS=true
+CMAKE_OPTIONS += -DLIBOMP_STATS=$(OMP_STATS)
+CMAKE_OPTIONS += -DLIBOMP_FORTRAN_MODULES=true
+CMAKE_OPTIONS += -DLIBOMP_VERSION=5
+CMAKE_OPTIONS += -DLIBOMP_OMP_VERSION=41
+CMAKE_OPTIONS += -DCMAKE_BUILD_TYPE=release
+
+COMPONENT_BUILD_ENV += LD_OPTIONS="$(LD_OPTIONS)"
+
+# THe tarball extracts to 'libomp_oss' which doesn't match
+# the name constructed in $(COMPONENT_SRC). We fix that here.
+COMPONENT_POST_UNPACK_ACTION = \
+      $(MV) libomp_oss $(COMPONENT_SRC)
+
+COMPONENT_PRE_BUILD_ACTION += cd $(@D);
+COMPONENT_PRE_BUILD_ACTION += echo Running cmake with $(CMAKE_OPTIONS) ;
+COMPONENT_PRE_BUILD_ACTION += /usr/bin/env - $(COMPONENT_BUILD_ENV) \
+			      $(CMAKE) $(CMAKE_OPTIONS) . ;
+
+build: $(BUILD_32_and_64)
+
+install: $(INSTALL_32_and_64)
+
+# There are no tests for this version of the Intel OpenMP Library
+# OpenMP tests will be integrated in ${WS_TOP}/components/bots.
+test: $(NO_TESTS)
+
+system-test:    $(NO_TESTS)
+
+REQUIRED_PACKAGES += developer/build/cmake
+REQUIRED_PACKAGES += developer/gcc-4/gcc-common-49
+REQUIRED_PACKAGES += system/core-os
+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/math
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/libiomp.license	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,62 @@
+/* <copyright>
+    Copyright (c) 1997-2015 Intel Corporation.  All Rights Reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+
+      * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+      * Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+      * Neither the name of Intel Corporation nor the names of its
+        contributors may be used to endorse or promote products derived
+        from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+</copyright> */
+
+/* <copyright>
+    Copyright (c) 2016 Oracle and/or its affiliates.  All Rights Reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+
+      * Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+      * Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+      * Neither the name of Oracle Corporation nor the names of its
+        contributors may be used to endorse or promote products derived
+        from this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+</copyright> */
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/libiomp5.p5m	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,52 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+#
+
+set name=pkg.fmri \
+    value=pkg:/library/libiomp5@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value="Intel OpenMP Runtime Library"
+set name=com.oracle.info.description \
+    value="The Intel OpenMP Runtime Library and header files"
+set name=com.oracle.info.tpno value=$(TPNO)
+set name=info.classification value=org.opensolaris.category.2008:Development/C \
+    value=org.opensolaris.category.2008:Development/C++ \
+    value=org.opensolaris.category.2008:Development/GNU
+set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2016/236
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+#
+file usr/include/omp.h path=usr/include/iomp5/omp.h
+file usr/include/omp_lib.h path=usr/include/iomp5/omp_lib.h
+file usr/include/omp_lib.mod path=usr/include/iomp5/omp_lib.mod
+file usr/include/omp_lib_kinds.mod path=usr/include/iomp5/omp_lib_kinds.mod
+file usr/include/ompt.h path=usr/include/iomp5/ompt.h
+link path=usr/lib/$(MACH64)/libiomp5.so target=libiomp5.so.5
+#
+file path=usr/lib/$(MACH64)/libiomp5.so.5
+link path=usr/lib/libiomp5.so target=libiomp5.so.5
+file path=usr/lib/libiomp5.so.5
+#
+license libiomp.license license=BSD
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/patches/000-libiomp-solaris-build-files.patch	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,665 @@
+# Build system part of the Solaris port of libiomp5.
+# Internal patch.
+# We should definitely submit this upstream.
+--- cmake/GNU/CFlags.cmake	2015-10-09 11:06:04.000000000 -0700
++++ cmake/GNU/CFlags.cmake	2016-02-23 08:06:00.403360340 -0800
+@@ -41,8 +41,8 @@
+ function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags)
+     set(local_c_flags)
+     set(local_cxx_flags)
+-    append_c_and_cxx_flags("-std=c++0x") # Enables support for many C++11 (formerly known as C++0x) features. The following are the most recently added features:
+-    append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled.
++    append_c_and_cxx_flags("-std=c++11") # Enables support for many C++11 (formerly known as C++0x) features. The following are the most recently added features:
++    # append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled.
+     append_c_and_cxx_flags("-x c++") # Compile C files as C++ files
+     if(${IA32})
+         append_c_and_cxx_flags("-m32") # Generate 32 bit IA-32 architecture code
+@@ -62,6 +62,7 @@
+     if(${WINDOWS})
+     elseif(${MAC})
+     elseif(${MIC})
++    elseif(${SOLARIS})
+     else()
+         append_linker_flags("-static-libgcc") # Causes libgcc to be linked in statically
+     endif()
+###
+--- cmake/Definitions.cmake	2015-10-09 11:06:04.000000000 -0700
++++ cmake/Definitions.cmake	2016-08-17 10:22:35.811889455 -0700
+@@ -38,14 +38,29 @@
+     set(local_cpp_flags)
+ 
+     append_definitions("-D USE_ITT_BUILD")
++
+     append_definitions("-D KMP_ARCH_STR=\"\\\\\"${legal_arch}\\\\\"\"")
++    if (${PPC32})
+     append_definitions("-D BUILD_I8")
++    elseif(${PPC64})
++      append_definitions("-DBUILD_I8")
++    elseif(${SPARC32})
++      append_definitions("-DBUILD_I8")
++    elseif(${SPARC64})
++      append_definitions("-DBUILD_I8")
++    elseif(${INTEL64})
++      append_definitions("-DBUILD_I8")
++    elseif(${INTEL64} OR ${AARCH64})
++      append_definitions("-DBUILD_I8")
++    else()
++    endif()
++
+     append_definitions("-D KMP_LIBRARY_FILE=\\\\\"${lib_file}\\\\\"") # yes... you need 5 backslashes...
+     append_definitions("-D KMP_VERSION_MAJOR=${LIBOMP_VERSION}")
+     append_definitions("-D KMP_NESTED_HOT_TEAMS")
+     
+     # customize to 128 bytes for ppc64
+-    if(${PPC64})
++    if(${PPC64} OR ${SPARC64})
+     	append_definitions("-D CACHE_LINE=128")
+     else()
+     	append_definitions("-D CACHE_LINE=64")
+@@ -96,7 +111,7 @@
+ 
+     ##################
+     # Unix definitions
+-    if(${LINUX})
++    if(${LINUX} OR ${SOLARIS})
+         append_definitions("-D KMP_TDATA_GTID")
+     endif()
+ 
+@@ -165,7 +180,7 @@
+     append_definitions("-D OMP_30_ENABLED=${have_omp_30}")
+ 
+     # Architectural definitions
+-    if(${INTEL64} OR ${IA32})
++    if(${INTEL64} OR ${IA32} OR ${SPARC32} OR ${SPARC64})
+         if(${LIBOMP_USE_ADAPTIVE_LOCKS})
+             append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=1")
+         else()
+###
+--- cmake/GetArchitecture.cmake	2015-10-09 11:06:04.000000000 -0700
++++ cmake/GetArchitecture.cmake	2016-02-18 13:18:06.902215860 -0800
+@@ -61,6 +61,14 @@
+         #error ARCHITECTURE=ppc64le
+     #elif defined(__powerpc64__)
+         #error ARCHITECTURE=ppc64
++    #elif defined(__sparc64__)
++        #error ARCHITECTURE=sparcv9
++    #elif defined(__sparcv9)
++        #error ARCHITECTURE=sparcv9
++    #elif defined(__sparc__)
++        #error ARCHITECTURE=sparc
++    #elif defined(__sparc)
++        #error ARCHITECTURE=sparc
+     #else
+         #error ARCHITECTURE=UnknownArchitecture
+     #endif
+--- cmake/CommonFlags.cmake	2015-10-09 11:06:04.000000000 -0700
++++ cmake/CommonFlags.cmake	2016-02-23 08:09:45.497002428 -0800
+@@ -130,15 +130,16 @@
+         # Unix based linker flags
+         else()
+             # For now, always include --version-script flag on Unix systems.
+-            append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
+-            append_linker_flags("-Wl,-z,noexecstack") #  Marks the object as not requiring executable stack.
+-            append_linker_flags("-Wl,--as-needed")    #  Only adds library dependencies as they are needed. (if libomp actually uses a function from the library, then add it)
++            append_linker_flags("-Wl,-M -Wl,${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
++            # Solaris linker can't do nxstack on shared libraries.
++            # append_linker_flags("-Wl,-z -Wl,nxstack=enable") #  Marks the object as not requiring executable stack.
++            append_linker_flags("-Wl,-z -Wl,ignore")    #  Only adds library dependencies as they are needed. (if libomp actually uses a function from the library, then add it)
+             if(NOT ${STUBS_LIBRARY})
+-                append_linker_flags("-Wl,--warn-shared-textrel") #  Warn if the linker adds a DT_TEXTREL to a shared object.
+-                append_linker_flags("-Wl,-fini=__kmp_internal_end_fini") # When creating an ELF executable or shared object, call NAME when the 
++              append_linker_flags("-Wl,-z -Wl,text") #  Warn if the linker adds a DT_TEXTREL to a shared object.
++              append_linker_flags("-Wl,-z -Wl,finiarray=__kmp_internal_end_fini") # When creating an ELF executable or shared object, call NAME when the 
+                                                                          # executable or shared object is unloaded, by setting DT_FINI to the 
+                                                                          # address of the function.  By default, the linker uses "_fini" as the function to call.
+-                append_linker_flags_library("-pthread") # link pthread library
++              append_linker_flags("-lgcc_s -lstdc++ -lc -lm -ldl") #  Warn if the linker adds a DT_TEXTREL to a shared object.
+             endif()
+         endif() # if(${OPERATING_SYSTEM}) ...
+ 
+--- cmake/HelperFunctions.cmake	2015-10-09 11:06:05.000000000 -0700
++++ cmake/HelperFunctions.cmake	2016-02-21 20:15:51.010837360 -0800
+@@ -78,6 +78,10 @@
+ function(set_legal_arch return_arch_string)
+     if(${IA32}) 
+         set(${return_arch_string} "IA-32" PARENT_SCOPE)
++    elseif(${SPARC64})
++      set(${return_arch_string} "SPARC64" PARENT_SCOPE)
++    elseif(${SPARC32})
++      set(${return_arch_string} "SPARC32" PARENT_SCOPE)
+     elseif(${INTEL64})
+         set(${return_arch_string} "Intel(R) 64" PARENT_SCOPE)
+     elseif(${MIC})
+@@ -119,6 +123,10 @@
+ function(_export_lib_dir pltfrm return_value)
+     if(${MAC})
+         set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib.thin" PARENT_SCOPE)
++    elseif(${SPARC64})
++        set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib/sparcv9" PARENT_SCOPE)
++    elseif(${INTEL64})
++        set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib/amd64" PARENT_SCOPE)
+     else()
+         set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib" PARENT_SCOPE)
+     endif()
+###
+--- src/CMakeLists.txt	2015-10-09 11:05:54.000000000 -0700
++++ src/CMakeLists.txt	2016-08-04 13:22:54.748628463 -0700
+@@ -37,6 +37,7 @@
+ 
+ #############################
+ # --- Create Common Files ---
++message(INFO ": export_cmn_files: ${export_cmn_files}")
+ add_custom_target(libomp-common ALL DEPENDS ${export_cmn_files})
+ add_custom_target(libomp-clean-common COMMAND ${CMAKE_COMMAND} -E remove -f ${export_cmn_files})
+ 
+@@ -45,6 +46,7 @@
+     add_custom_command(TARGET libomp-common POST_BUILD 
+         COMMAND ${CMAKE_COMMAND} -E make_directory ${export_cmn_dir}
+         COMMAND ${CMAKE_COMMAND} -E copy omp.h ${export_cmn_dir}
++        COMMAND ${CMAKE_COMMAND} -E copy ompt.h ${export_cmn_dir}
+         COMMAND ${CMAKE_COMMAND} -E copy omp_lib.h ${export_cmn_dir}
+         COMMAND ${CMAKE_COMMAND} -E copy omp_lib.f ${export_cmn_dir}
+         COMMAND ${CMAKE_COMMAND} -E copy omp_lib.f90 ${export_cmn_dir}
+@@ -74,7 +76,11 @@
+ 
+ # objects depend on : .inc files and omp.h
+ # This way the *.inc and omp.h are generated before any compilations take place
+-add_custom_target(libomp-needed-headers DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc omp.h)
++if (${LIBOMP_OMPT_SUPPORT})
++  add_custom_target(libomp-needed-headers DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc omp.h ompt.h)
++else()
++  add_custom_target(libomp-needed-headers DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc omp.h)
++endif()
+ 
+ # For Windows, there is a definitions file (.def) and resource file (.res) created using generate-def.pl and rc.exe respectively.
+ if(${WINDOWS})
+@@ -85,8 +91,8 @@
+ # Remove any cmake-automatic linking of libraries by linker, This is so linux 
+ # and mac don't include libstdc++ just because we compile c++ files.
+ if(${LIBOMP_USE_PREDEFINED_LINKER_FLAGS})
+-    set(CMAKE_C_IMPLICIT_LINK_LIBRARIES   "")
+-    set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
++    set(CMAKE_C_IMPLICIT_LINK_LIBRARIES   "-lc -lm -lrt -ldl")
++    set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "-lgcc_s -lstdc++")
+     set(CMAKE_ASM_IMPLICIT_LINK_LIBRARIES "")
+ endif()
+ 
+@@ -319,6 +325,23 @@
+ # Install rules
+ # We want to install libomp in DESTDIR/CMAKE_INSTALL_PREFIX/lib
+ # We want to install headers in DESTDIR/CMAKE_INSTALL_PREFIX/include
++if (${SOLARIS})
++  if (${SPARC64})
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/sparcv9")
++    set(INSTALL_LIBDIR "/usr/lib/sparcv9")
++    set(LIBOMP_LIBDIR_SUFFIX "/sparcv9")
++  elseif(${INTEL64})
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/amd64")
++    set(INSTALL_LIBDIR "/usr/lib/amd64")
++    set(LIBOMP_LIBDIR_SUFFIX "/amd64")
++  elseif("${LIBOMP_ARCH}" STREQUAL "32e")
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/amd64")
++    set(INSTALL_LIBDIR "/usr/lib/amd64")
++    set(LIBOMP_LIBDIR_SUFFIX "/amd64")
++  else()
++  endif()
++endif()
++
+ if(${LIBOMP_STANDALONE_BUILD})
+     set(LIBOMP_HEADERS_INSTALL_PATH include)
+ else()
+###
+--- tools/check-tools.pl	2015-10-09 11:06:08.000000000 -0700
++++ tools/check-tools.pl	2016-02-18 11:50:28.050153095 -0800
+@@ -146,7 +146,7 @@
+ 
+ sub get_gnu_make_version() {
+     my ( $rc, $stdout, $stderr, $version );
+-    my $tool = "make";
++    my $tool = "gmake";
+     my ( @ret ) = ( $tool );
+     my ( $path );
+     $rc = run( [ $tool, "--version" ], $stdout, $stderr, $path );
+@@ -413,10 +413,13 @@
+     "mac" => { c => "icc", cpp => "icpc", f => "ifort" },
+     "win" => { c => "icl", cpp => undef,  f => "ifort" },
+ };
++
+ my $gnu_compilers = {
+     "lin" => { c => "gcc", cpp =>  "g++", f => "gfortran" },
+     "mac" => { c => "gcc", cpp =>  "g++", f => "gfortran" },
++    "sol" => { c => "gcc", cpp =>  "g++", f => "gfortran" },
+ };
++
+ my $clang_compilers = {
+     "lin" => { c => "clang", cpp =>  "clang++" },
+     "mac" => { c => "clang", cpp =>  "clang++" },
+@@ -448,7 +451,7 @@
+         }; # if
+     };
+ }; # if
+-if ( $target_os eq "lin" or $target_os eq "mac" ) {
++if ( $target_os eq "lin" or $target_os eq "mac" or $target_os eq "sol" ) {
+     # check for clang/gnu tools because touch-test.c is compiled with them.
+     if ( $clang or $target_os eq "mac" ) { # OS X* >= 10.9 discarded GNU compilers.
+         push( @versions, [ "Clang C Compiler",     get_clang_compiler_version( $clang_compilers->{ $target_os }->{ c   } ) ] );
+--- tools/common.inc	2015-10-09 11:06:07.000000000 -0700
++++ tools/common.inc	2016-02-18 11:53:12.986639375 -0800
+@@ -51,6 +51,9 @@
+   ifeq ($(OS), Darwin)
+     export omp_os=macos
+   endif
++  ifeq ($(OS), SunOS)
++    export omp_os=solaris
++  endif
+ 
+ endif # !omp_os
+ 
+--- tools/src/common-defs.mk	2015-10-09 11:06:11.000000000 -0700
++++ tools/src/common-defs.mk	2016-02-18 11:42:31.074082905 -0800
+@@ -64,7 +64,7 @@
+ # Description:
+ #     The function return printable name of specified architecture, IA-32 architecture or Intel(R) 64.
+ #
+-legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(if $(filter ppc64,$(1)),PPC64,$(if $(filter ppc64le,$(1)),PPC64LE,$(if $(filter aarch64,$(1)),AArch64,$(if $(filter mic,$(1)),Intel(R) Many Integrated Core Architecture,$(error Bad architecture specified: $(1))))))))))
++legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(if $(filter ppc64,$(1)),PPC64,$(if $(filter ppc64le,$(1)),PPC64LE,$(if $(filter aarch64,$(1)),AArch64,$(if $(filter mic,$(1)),Intel(R) Many Integrated Core Architecture,$(if $(filter sparc, $(1)),SPARC,$(if $(filter sparcv9,$(1)),SPARCV9,$(error Bad architecture specified: $(1))))))))))))
+ 
+ # Synopsis:
+ #     var_name = $(call check_variable,var,list)
+@@ -146,14 +146,14 @@
+ # Mandatory variables passed from build.pl.
+ # --------------------------------------------------------------------------------------------------
+ 
+-os       := $(call check_variable,os,lin mac win)
+-arch     := $(call check_variable,arch,32 32e 64 arm ppc64 ppc64le aarch64 mic)
++os       := $(call check_variable,os,lin mac sol win)
++arch     := $(call check_variable,arch,32 32e 64 arm ppc64 ppc64le aarch64 sparc sparcv9 mic)
+ ifeq "$(arch)" "mic" # We want the flavor of mic (knf, knc, knl, etc.)
+     platform := $(os)_$(MIC_ARCH)
+ else
+     platform := $(os)_$(arch)
+ endif
+-platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lin_knc lin_knf mac_32 mac_32e win_32 win_32e win_64 lin_ppc64 lin_ppc64le lin_aarch64)
++platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lin_knc lin_knf mac_32 mac_32e win_32 win_32e win_64 lin_ppc64 lin_ppc64le lin_aarch64 sol_sparc sol_sparcv9 sol_i386 sol_x86_64)
+ # oa-opts means "os and arch options". They are passed to almost all perl scripts.
+ oa-opts  := --os=$(os) --arch=$(arch)
+ 
+--- tools/solaris.inc	2016-02-18 09:11:59.349587625 -0800
++++ tools/solaris.inc	2016-02-18 09:54:26.955461235 -0800
+@@ -0,0 +1,67 @@
++# <copyright>
++#    Copyright (c) 2016 Oracle and/or its affiliates.  All Rights Reserved.
++#
++#    Redistribution and use in source and binary forms, with or without
++#    modification, are permitted provided that the following conditions
++#    are met:
++#
++#      * Redistributions of source code must retain the above copyright
++#        notice, this list of conditions and the following disclaimer.
++#      * Redistributions in binary form must reproduce the above copyright
++#        notice, this list of conditions and the following disclaimer in the
++#        documentation and/or other materials provided with the distribution.
++#      * Neither the name of Oracle Corporation nor the names of its
++#        contributors may be used to endorse or promote products derived
++#        from this software without specific prior written permission.
++#
++#    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++#    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++#    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++#    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++#    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++#    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++#    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++#    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++#    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++#    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++#    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++# </copyright>
++
++####### Detections and Commands ###############################################
++
++# Solaris needs this additional file because uname -p is useless
++include tools/arch.inc
++
++ifndef arch
++        uname_p:=$(shell uname -p)
++        ifeq ($(uname_p),i386)
++          ifeq ($(solaris_arch),32)
++                export arch := i386
++          endif
++          ifeq ($(solaris_arch),64)
++                export arch := x86_64
++          endif
++        endif
++        ifeq ($(uname_p),sparc)
++          ifeq ($(solaris_arch),32)
++                export arch := sparc
++          endif
++          ifeq ($(solaris_arch),64)
++                export arch := sparcv9
++          endif
++        endif
++endif
++
++# Change this to 'release' for production buids.
++mode=debug
++
++CMD=sh -c
++CWD=$(shell pwd)
++CP=cp
++RM?=rm -f
++RMR?=rm -rf
++RD?=rmdir
++MD?=mkdir -p
++NUL= /dev/null
++SLASH=/
+--- tools/message-converter.pl	2015-10-09 11:06:08.000000000 -0700
++++ tools/message-converter.pl	2016-02-18 13:56:45.212141095 -0800
+@@ -504,7 +504,7 @@
+ 
+ 
+ my $generate_message;
+-if ( $target_os =~ m{\A(?:lin|mac)\z} ) {
++if ( $target_os =~ m{\A(?:lin|sol|mac)\z} ) {
+     $generate_message = \&generate_message_unix;
+ } elsif ( $target_os eq "win" ) {
+     $generate_message = \&generate_message_windows;
+--- tools/lib/Platform.pm	2015-10-09 11:06:11.000000000 -0700
++++ tools/lib/Platform.pm	2016-02-18 10:11:53.026836855 -0800
+@@ -77,6 +77,10 @@
+             $arch = "aarch64";
+         } elsif ( $arch =~ m{\Amic} ) {
+             $arch = "mic";
++        } elsif ( $arch =~ m{\Asparc} ) {
++            $arch = "sparc";
++        } elsif ( $arch =~ m{\Asparcv9} ) {
++            $arch = "sparcv9";
+         } else {
+             $arch = undef;
+         }; # if
+@@ -146,6 +150,8 @@
+     if ( defined( $os ) ) {
+         if ( $os =~ m{\A\s*(?:Linux|lin|l)\s*\z}i ) {
+             $os = "lin";
++        } elsif ( $os =~ m{\A\s*(?:SunOS|sol|Sun|Sol|s)\s*\z}i ) {
++            $os = "sol";
+         } elsif ( $os =~ m{\A\s*(?:Mac(?:\s*OS(?:\s*X)?)?|mac|m|Darwin)\s*\z}i ) {
+             $os = "mac";
+         } elsif ( $os =~ m{\A\s*(?:Win(?:dows)?(?:(?:_|\s*)?(?:NT|XP|95|98|2003))?|w)\s*\z}i ) {
+@@ -228,6 +234,10 @@
+         $_host_arch = "ppc64";
+     } elsif ( $hardware_platform eq "aarch64" ) {
+         $_host_arch = "aarch64";
++    } elsif ( $hardware_platform eq "sparc" ) {
++        $_host_arch = "sparc";
++    } elsif ( $hardware_platform eq "sparcv9" ) {
++        $_host_arch = "sparcv9";
+     } else {
+         die "Unsupported host hardware platform: \"$hardware_platform\"; stopped";
+     }; # if
+@@ -242,6 +252,9 @@
+     } elsif ( $operating_system eq "FreeBSD" ) {
+         # Host OS resembles Linux.
+         $_host_os = "lin";
++    } elsif ( $operating_system eq "SunOS" ) {
++        # Solaris resembles Linux.
++        $_host_os = "sol";
+     } elsif ( $operating_system eq "Darwin" ) {
+         $_host_os = "mac";
+     } elsif ( $operating_system eq "MS Windows" ) {
+--- tools/lib/Uname.pm	2015-10-09 11:06:11.000000000 -0700
++++ tools/lib/Uname.pm	2016-02-22 17:51:57.685796845 -0800
+@@ -54,7 +54,7 @@
+ # The workaround for Perl 5.6:
+ #
+ BEGIN {
+-    if ( $^O eq "darwin" or $^O eq "linux" ) {
++    if ( $^O eq "darwin" or $^O eq "linux" or $^O eq "solaris" ) {
+ 	require tools;
+         import tools;
+     }; # if
+@@ -67,10 +67,10 @@
+ 
+ my @posix = qw{ kernel_name fqdn kernel_release kernel_version machine };
+     # Properties supported by POSIX::uname().
+-my @linux =
++my @solaris =
+     qw{ processor hardware_platform operating_system };
+     # Properties reported by uname in Linux* OS.
+-my @base = ( @posix, @linux );
++my @base = ( @posix, @solaris );
+     # Base properties.
+ my @aux =
+     (
+@@ -158,7 +158,7 @@
+ 
+ # hardware_platform.
+ if ( 0 ) {
+-} elsif ( $^O eq "linux" or $^O eq "freebsd" ) {
++} elsif ( $^O eq "linux" or $^O eq "freebsd" or $^O eq "solaris" ) {
+     if ( 0 ) {
+     } elsif ( $values{ machine } =~ m{\Ai[3456]86\z} ) {
+         $values{ hardware_platform } = "i386";
+@@ -172,6 +172,10 @@
+         $values{ hardware_platform } = "ppc64";
+     } elsif ( $values{ machine } =~ m{\Aaarch64\z} ) {
+         $values{ hardware_platform } = "aarch64";
++    } elsif ( $values{ machine } =~ m{\Asun4v\z} ) {
++        $values{ hardware_platform } = "sparc";
++    } elsif ( $values{ machine } =~ m{\Ai86pc\z} ) {
++        $values{ hardware_platform } = "i386";
+     } else {
+         die "Unsupported machine (\"$values{ machine }\") returned by POSIX::uname(); stopped";
+     }; # if
+@@ -397,6 +401,8 @@
+     $values{ operating_system } = "MS Windows";
+ } elsif ( $values{ kernel_name } =~ m{\AFreeBSD} ) {
+     $values{ operating_system } = "FreeBSD";
++} elsif ( $values{ kernel_name } =~ m{\ASunOS} ) {
++    $values{ operating_system } = "SunOS";
+ } else {
+     die "Unsupported kernel_name (\"$values{ kernel_name }\") returned by POSIX::uname(); stopped";
+ }; # if
+###
+--- CMakeLists.txt	2015-10-09 11:06:06.000000000 -0700
++++ CMakeLists.txt	2016-08-15 11:12:39.936070302 -0700
+@@ -72,8 +72,8 @@
+ # If you want to change the compiler, then empty the build directory and rerun cmake.
+ 
+ # Build Configuration
+-set(os_possible_values lin mac win)
+-set(arch_possible_values 32e 32 arm ppc64 ppc64le aarch64 mic)
++set(os_possible_values lin sol mac win)
++set(arch_possible_values 32e 32 arm ppc64 ppc64le aarch64 sparc sparcv9 mic)
+ set(build_type_possible_values release debug relwithdebinfo)
+ set(omp_version_possible_values 41 40 30)
+ set(lib_type_possible_values normal profile stubs)
+@@ -89,7 +89,7 @@
+ if(${APPLE})
+     set(temp_os mac)
+ elseif(${UNIX})
+-    set(temp_os lin)
++    set(temp_os sol)
+ elseif(${WIN32})       
+     set(temp_os win)
+ else()
+@@ -100,9 +100,9 @@
+ get_architecture(detected_arch)
+ 
+ set(LIBOMP_OS ${temp_os} CACHE STRING
+-    "The operating system to build for (lin/mac/win)")
++    "The operating system to build for (lin/sol/mac/win)")
+ set(LIBOMP_ARCH ${detected_arch} CACHE STRING
+-    "The architecture to build for (32e/32/arm/ppc64/ppc64le/aarch64/mic).  32e is Intel(R) 64 architecture, 32 is IA-32 architecture")
++    "The architecture to build for (32e/32/arm/ppc64/ppc64le/aarch64/sparc/sparcv9/mic).  32e is Intel(R) 64 architecture, 32 is IA-32 architecture")
+ set(LIBOMP_LIB_TYPE normal CACHE STRING
+     "Performance,Profiling,Stubs library (normal/profile/stubs)")
+ set(LIBOMP_VERSION 5 CACHE STRING 
+@@ -148,12 +148,14 @@
+     "Enable debugger interface code?")
+ 
+ # OMPT-support
+-set(LIBOMP_OMPT_SUPPORT false CACHE BOOL
+-    "OMPT-support?")
+-set(LIBOMP_OMPT_BLAME true CACHE BOOL
+-    "OMPT-blame?")
+-set(LIBOMP_OMPT_TRACE true CACHE BOOL
+-    "OMPT-trace?")
++if (${SOLARIS})
++  set(LIBOMP_OMPT_SUPPORT true CACHE BOOL "OMPT-support")
++else()
++  set(LIBOMP_OMPT_SUPPORT false CACHE BOOL "OMPT-support?")
++endif()
++
++set(LIBOMP_OMPT_BLAME true CACHE BOOL "OMPT-blame?")
++set(LIBOMP_OMPT_TRACE true CACHE BOOL "OMPT-trace?")
+ 
+ # User specified flags.  These are appended to the predetermined flags found 
+ # in CommonFlags.cmake and ${CMAKE_C_COMPILER_ID}/*Flags.cmake (e.g., GNU/CFlags.cmake)
+@@ -231,6 +233,7 @@
+ # Set some useful flags variables for other parts of cmake to use
+ # Operating System
+ set(LINUX FALSE)
++set(SOLARIS FALSE)
+ set(MAC FALSE)
+ set(WINDOWS FALSE)
+ set(MIC FALSE)
+@@ -241,6 +244,9 @@
+ elseif("${LIBOMP_OS}" STREQUAL "mac")
+     set(MAC TRUE)
+     set(real_os mac)
++elseif("${LIBOMP_OS}" STREQUAL "sol")
++  set(SOLARIS TRUE)
++    set(real_os sol)
+ elseif("${LIBOMP_OS}" STREQUAL "win")
+     set(WINDOWS TRUE)
+     set(real_os win)
+@@ -257,6 +263,9 @@
+ set(PPC64BE FALSE)
+ set(PPC64LE FALSE)
+ set(PPC64 FALSE)
++set(SPARC FALSE)
++set(SPARC32 FALSE)
++set(SPARC64 FALSE)
+ if("${LIBOMP_ARCH}" STREQUAL "32")      # IA-32 architecture
+     set(IA32 TRUE)
+ elseif("${LIBOMP_ARCH}" STREQUAL "32e") # Intel(R) 64 architecture
+@@ -269,6 +278,12 @@
+ elseif("${LIBOMP_ARCH}" STREQUAL "ppc64le") # PPC64LE architecture
+     set(PPC64LE TRUE)
+     set(PPC64 TRUE)
++  elseif("${LIBOMP_ARCH}" STREQUAL "sparc") # SPARC architecture
++    set(SPARC TRUE)
++    set(SPARC32 TRUE)
++  elseif("${LIBOMP_ARCH}" STREQUAL "sparcv9") # SPARC architecture
++    set(SPARC TRUE)
++    set(SPARC64 TRUE)
+ elseif("${LIBOMP_ARCH}" STREQUAL "aarch64") # AARCH64 architecture
+     set(AARCH64 TRUE)
+ elseif("${LIBOMP_ARCH}" STREQUAL "mic") # Intel(R) Many Integrated Core Architecture
+@@ -303,6 +318,25 @@
+     set(STUBS_LIBRARY TRUE)
+ endif()
+ 
++# Re-set the libdir path now that we have a platform/arch.
++if (${SOLARIS})
++  if (${SPARC64})
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/sparcv9")
++    set(INSTALL_LIBDIR "/usr/lib/sparcv9")
++    set(LIBOMP_LIBDIR_SUFFIX "/sparcv9")
++  elseif(${INTEL64})
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/amd64")
++    set(INSTALL_LIBDIR "/usr/lib/amd64")
++    set(LIBOMP_LIBDIR_SUFFIX "/amd64")
++  elseif("${LIBOMP_ARCH}" STREQUAL "32e")
++    set(CMAKE_INSTALL_LIBDIR "/usr/lib/amd64")
++    set(INSTALL_LIBDIR "/usr/lib/amd64")
++    set(LIBOMP_LIBDIR_SUFFIX "/amd64")
++  else()
++  endif()
++endif()
++
++
+ ###############################################
+ # Features for compilation and build in general
+ 
+@@ -312,7 +346,7 @@
+ # - If COMPILER_SUPPORTS_QUAD_PRECISION is true, then a corresponding COMPILER_QUAD_TYPE must be given
+ #   This is the compiler's quad-precision data type.
+ # ** TODO: This isn't complete yet. Finish it. Requires changing macros in kmp_os.h **
+-set(LIBOMP_COMPILER_SUPPORTS_QUAD_PRECISION false CACHE BOOL
++set(LIBOMP_COMPILER_SUPPORTS_QUAD_PRECISION true CACHE BOOL
+     "*INCOMPLETE* Does the compiler support a 128-bit floating point type?")
+ set(LIBOMP_COMPILER_QUAD_TYPE "" CACHE STRING
+     "*INCOMPLETE* The quad precision data type (e.g., for gcc, __float128)")
+@@ -340,7 +374,7 @@
+ endif()
+ 
+ # - TSX based locks have __asm code which can be troublesome for some compilers.  This feature is also x86 specific.
+-if((${IA32} OR ${INTEL64} OR ${MIC}) AND NOT MSVC)
++if((${IA32} OR ${INTEL64} OR ${MIC} OR ${SPARC32} OR ${SPARC64}) AND NOT MSVC)
+     set(LIBOMP_USE_ADAPTIVE_LOCKS true CACHE BOOL
+         "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp).  These are x86 specific.")
+ else()
+@@ -350,13 +384,13 @@
+ ##################################
+ # Error checking the configuration 
+ if(${LIBOMP_STATS} AND (${WINDOWS} OR ${MAC}))
+-    error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture")
++  error_say("Stats-gathering functionality is only supported on x86-Linux, Solaris and Intel(R) MIC Architecture")
+ endif()
+-if(${LIBOMP_STATS} AND NOT (${IA32} OR ${INTEL64} OR ${MIC}))
+-    error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture")
++if(${LIBOMP_STATS} AND NOT (${IA32} OR ${INTEL64} OR ${MIC} OR ${SOLARIS}))
++  error_say("Stats-gathering functionality is only supported on x86-Linux, Solaris and Intel(R) MIC Architecture")
+ endif()
+-if(${LIBOMP_USE_ADAPTIVE_LOCKS} AND NOT(${IA32} OR ${INTEL64} OR ${MIC}))
+-    error_say("Adaptive locks (TSX) functionality is only supported on x86 Architecture")
++if(${LIBOMP_USE_ADAPTIVE_LOCKS} AND NOT(${IA32} OR ${INTEL64} OR ${MIC} OR ${SPARC}))
++  error_say("Adaptive locks (TSX) functionality is only supported on x86 or SPARC Architecture")
+ endif()
+ if(${LIBOMP_OMPT_SUPPORT} AND ${WINDOWS})
+     error_say("OpenMP Tools Interface is not supported on Windows")
+@@ -390,6 +424,10 @@
+ 
+ ####################################
+ # Setting file extensions / suffixes
++if (${SOLARIS})
++  set(CMAKE_SHARED_LIBRARY_SUFFIX ".so.5")
++else()
++endif()
+ set(obj ${CMAKE_C_OUTPUT_EXTENSION})
+ set(lib ${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(dll ${CMAKE_SHARED_LIBRARY_SUFFIX})
+@@ -461,9 +499,11 @@
+ set(export_lib_files "${lib_file}" "${imp_file}" "${pdb_file}") 
+ set(export_mod_files "omp_lib.mod" "omp_lib_kinds.mod")
+ set(export_cmn_files "omp.h" "omp_lib.h" "omp_lib.f" "omp_lib.f90")
++set(export_ompt_files "ompt.h")
+ 
+ if(${LIBOMP_OMPT_SUPPORT})
+-    set(export_cmn_files ${export_cmn_files} "ompt.h")
++    set(export_cmn_files "${export_cmn_files}" "${export_ompt_files}")
++    message(INFO ": export_cmn_files: ${export_cmn_files}")
+ endif()
+ 
+ if("${export_lib_fat_dir}")
+###
+--- cmake/SourceFiles.cmake	2015-10-09 11:06:06.000000000 -0700
++++ cmake/SourceFiles.cmake	2016-07-30 19:11:45.593975135 -0700
+@@ -126,6 +126,14 @@
+     if(NOT ${STUBS_LIBRARY})
+         if(${WINDOWS})
+             append_asm_source_file("z_Windows_NT-586_asm.asm")
++        elseif(${SOLARIS})
++          set(UNAME "")
++          execute_process(COMMAND uname -p OUTPUT_VARIABLE UNAME)
++          if("${UNAME}" MATCHES "sparc")
++            append_asm_source_file("z_Solaris_asm_sparc.S")
++          else()
++            append_asm_source_file("z_Linux_asm.s")
++          endif()
+         else()
+             append_asm_source_file("z_Linux_asm.s")
+         endif()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/patches/001-libiomp-solaris-src.patch	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,973 @@
+# Source code part of the Solaris port of libiomp5.
+# Internal patch.
+# We should definitely submit this upstream.
+###
+--- src/kmp_global.c	2015-10-09 11:05:47.000000000 -0700
++++ src/kmp_global.c	2016-08-13 19:18:17.515623810 -0700
+@@ -167,7 +167,7 @@
+ #endif
+ int                 __kmp_chunk = 0;
+ int           __kmp_abort_delay = 0;
+-#if KMP_OS_LINUX && defined(KMP_TDATA_GTID)
++#if ((KMP_OS_LINUX || KMP_OS_SOLARIS) && defined(KMP_TDATA_GTID))
+ int             __kmp_gtid_mode = 3; /* use __declspec(thread) TLS to store gtid */
+ int      __kmp_adjust_gtid_mode = FALSE;
+ #elif KMP_OS_WINDOWS
+@@ -176,7 +176,7 @@
+ #else
+ int             __kmp_gtid_mode = 0; /* select method to get gtid based on #threads */
+ int      __kmp_adjust_gtid_mode = TRUE;
+-#endif /* KMP_OS_LINUX && defined(KMP_TDATA_GTID) */
++#endif /* KMP_OS_LINUX || KMP_OS_SOLARIS && defined(KMP_TDATA_GTID) */
+ #ifdef KMP_TDATA_GTID
+ #if KMP_OS_WINDOWS
+ __declspec(thread) int __kmp_gtid = KMP_GTID_DNE;
+@@ -254,7 +254,6 @@
+ int __kmp_affinity_gran_levels  = -1;
+ int __kmp_affinity_dups = TRUE;
+ enum affinity_top_method __kmp_affinity_top_method = affinity_top_method_default;
+-int      __kmp_affinity_compact      = 0;
+ int      __kmp_affinity_offset       = 0;
+ int      __kmp_affinity_verbose      = FALSE;
+ int      __kmp_affinity_warnings     = TRUE;
+@@ -267,6 +266,8 @@
+ 
+ #endif /* KMP_AFFINITY_SUPPORTED */
+ 
++int      __kmp_affinity_compact      = 0;
++
+ #if OMP_40_ENABLED
+ kmp_nested_proc_bind_t __kmp_nested_proc_bind = { NULL, 0, 0 };
+ int __kmp_affinity_num_places = 0;
+###
+--- src/kmp_csupport.c	2015-10-09 11:05:45.000000000 -0700
++++ src/kmp_csupport.c	2016-08-17 11:28:36.004655805 -0700
+@@ -695,6 +695,9 @@
+           // when running >2 threads per core (on the NAS LU benchmark).
+             __kmp_yield(TRUE);
+         #endif
++    #elif (KMP_ARCH_SPARC || KMP_ARCH_SPARC32 || KMP_ARCH_SPARC64)
++            // This is in GCC
++            __sync_synchronize();
+     #else
+         #error Unknown or unsupported architecture
+     #endif
+@@ -2139,7 +2142,9 @@
+     } else
+ # endif
+     {
+-        __kmp_direct_set[tag]((kmp_dyna_lock_t *)user_lock, gtid);
++      if (__kmp_direct_set[tag] == NULL)
++        __kmp_direct_set[tag] = __kmp_direct_set[0];
++      __kmp_direct_set[tag]((kmp_dyna_lock_t *)user_lock, gtid);
+     }
+ # if USE_ITT_BUILD
+     __kmp_itt_lock_acquired((kmp_user_lock_p)user_lock);
+@@ -2222,7 +2227,6 @@
+ __kmpc_unset_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
+ {
+ #if KMP_USE_DYNAMIC_LOCK
+-
+     int tag = KMP_EXTRACT_D_TAG(user_lock);
+ # if USE_ITT_BUILD
+     __kmp_itt_lock_releasing((kmp_user_lock_p)user_lock);
+@@ -2237,7 +2241,9 @@
+     } else
+ # endif
+     {
+-        __kmp_direct_unset[tag]((kmp_dyna_lock_t *)user_lock, gtid);
++      if (__kmp_direct_unset[tag] == NULL)
++        __kmp_direct_unset[tag] = __kmp_direct_unset[0];
++      __kmp_direct_unset[tag]((kmp_dyna_lock_t *)user_lock, gtid);
+     }
+ 
+ #else // KMP_USE_DYNAMIC_LOCK
+###
+--- src/kmp_runtime.c	2015-10-09 11:05:48.000000000 -0700
++++ src/kmp_runtime.c	2016-02-23 10:10:17.709606906 -0800
+@@ -7574,7 +7574,7 @@
+ 
+         #if KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64
+ 
+-            #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
++            #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_SOLARIS || KMP_OS_WINDOWS || KMP_OS_DARWIN
+ 
+ 	    int teamsize_cutoff = 4;
+ 
+@@ -7583,6 +7583,10 @@
+                     teamsize_cutoff = 8;
+                 }
+ #endif
++
++#if KMP_ARCH_X86_64 && KMP_OS_SOLARIS
++                teamsize_cutoff = 8;
++#endif
+                 if( tree_available ) {
+                     if( team_size <= teamsize_cutoff ) {
+                         if ( atomic_available ) {
+@@ -7596,11 +7600,11 @@
+                 }
+             #else
+                 #error "Unknown or unsupported OS"
+-            #endif // KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
++            #endif // KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_SOLARIS || KMP_OS_WINDOWS || KMP_OS_DARWIN
+ 
+-        #elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH
++#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_SPARC
+ 
+-            #if KMP_OS_LINUX || KMP_OS_WINDOWS
++            #if KMP_OS_LINUX || KMP_OS_SOLARIS || KMP_OS_WINDOWS
+ 
+                 // basic tuning
+ 
+--- src/kmp_environment.c	2015-10-09 11:05:46.000000000 -0700
++++ src/kmp_environment.c	2016-02-21 08:02:17.231202308 -0800
+@@ -83,7 +83,7 @@
+ #if KMP_OS_UNIX
+     #include <stdlib.h>    // getenv, setenv, unsetenv.
+     #include <string.h>    // strlen, strcpy.
+-    #if KMP_OS_LINUX || KMP_OS_FREEBSD
++    #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_SOLARIS
+         extern char * * environ;
+     #elif KMP_OS_DARWIN
+         #include <crt_externs.h>
+###
+--- src/kmp_lock.cpp	2015-10-09 11:05:48.000000000 -0700
++++ src/kmp_lock.cpp	2016-08-12 17:20:30.072310090 -0700
+@@ -106,6 +106,9 @@
+ __forceinline static void
+ __kmp_acquire_tas_lock_timed_template( kmp_tas_lock_t *lck, kmp_int32 gtid )
+ {
++    kmp_uint32 nspins = 0U;
++    kmp_uint32 max_spins = __kmp_yield_next * 2U;
++
+     KMP_MB();
+ 
+ #ifdef USE_LOCK_PROFILE
+@@ -142,6 +145,9 @@
+             KMP_YIELD( TRUE );
+         }
+         else {
++            if (++nspins >= max_spins)
++              break;
++
+             KMP_YIELD_SPIN( spins );
+         }
+     }
+@@ -3022,13 +3028,18 @@
+ #if KMP_USE_TSX
+ 
+ // HLE lock functions - imported from the testbed runtime.
++#if (KMP_ARCH_SPARC32 || KMP_ARCH_SPARC64)
++#define HLE_ACQUIRE ".word 0xf2;"
++#define HLE_RELEASE ".word 0xf3;"
++#else
+ #define HLE_ACQUIRE ".byte 0xf2;"
+ #define HLE_RELEASE ".byte 0xf3;"
++#endif
+ 
+ static inline kmp_uint32
+ swap4(kmp_uint32 volatile *p, kmp_uint32 v)
+ {
+-    __asm__ volatile(HLE_ACQUIRE "xchg %1,%0"
++    __asm__ __volatile__(HLE_ACQUIRE "xchg %1,%0"
+                     : "+r"(v), "+m"(*p)
+                     :
+                     : "memory");
+@@ -3066,7 +3077,7 @@
+ static int
+ __kmp_release_hle_lock(kmp_dyna_lock_t *lck, kmp_int32 gtid)
+ {
+-    __asm__ volatile(HLE_RELEASE "movl %1,%0"
++    __asm__ __volatile__(HLE_RELEASE "movl %1,%0"
+                     : "=m"(*lck)
+                     : "r"(KMP_LOCK_FREE(hle))
+                     : "memory");
+###
+--- src/kmp_lock.h	2015-10-09 11:05:48.000000000 -0700
++++ src/kmp_lock.h	2016-08-17 10:02:56.297567620 -0700
+@@ -1195,7 +1195,9 @@
+ #define KMP_INIT_D_LOCK(l, seq) __kmp_direct_init[KMP_GET_D_TAG(seq)]((kmp_dyna_lock_t *)l, seq)
+ 
+ // Initializes an indirect lock with the given lock pointer and lock sequence.
+-#define KMP_INIT_I_LOCK(l, seq) __kmp_direct_init[0]((kmp_dyna_lock_t *)(l), seq)
++#define KMP_INIT_I_LOCK(l, seq) \
++  __kmp_direct_init[0]((kmp_dyna_lock_t *)(l), seq); \
++  __kmp_direct_init[1] = __kmp_direct_init[0];
+ 
+ // Returns "free" lock value for the given lock type.
+ #define KMP_LOCK_FREE(type)      (locktag_##type)
+###
+--- src/kmp_platform.h	2015-10-09 11:05:48.000000000 -0700
++++ src/kmp_platform.h	2016-08-04 19:37:07.247582315 -0700
+@@ -39,6 +39,7 @@
+ 
+ #define KMP_OS_LINUX    0
+ #define KMP_OS_FREEBSD  0
++#define KMP_OS_SOLARIS  0
+ #define KMP_OS_DARWIN   0
+ #define KMP_OS_WINDOWS  0
+ #define KMP_OS_CNK      0
+@@ -70,16 +71,21 @@
+ # define KMP_OS_FREEBSD 1
+ #endif
+ 
++#if defined(__sun) || defined(__sun__)
++# undef KMP_OS_SOLARIS
++# define KMP_OS_SOLARIS 1
++#endif
++
+ #if ( defined __bgq__ )
+ # undef KMP_OS_CNK
+ # define KMP_OS_CNK 1
+ #endif
+ 
+-#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS)
++#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_SOLARIS + KMP_OS_DARWIN + KMP_OS_WINDOWS)
+ # error Unknown OS
+ #endif
+ 
+-#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN
++#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_SOLARIS || KMP_OS_DARWIN
+ # undef KMP_OS_UNIX
+ # define KMP_OS_UNIX 1
+ #endif
+@@ -91,6 +97,7 @@
+ #define KMP_ARCH_AARCH64    0
+ #define KMP_ARCH_PPC64_BE   0
+ #define KMP_ARCH_PPC64_LE   0
++#define KMP_ARCH_SPARC      0
+ #define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_LE || KMP_ARCH_PPC64_BE)
+ 
+ #if KMP_OS_WINDOWS
+@@ -121,6 +128,9 @@
+ # elif defined __aarch64__
+ #  undef KMP_ARCH_AARCH64
+ #  define KMP_ARCH_AARCH64 1
++# elif defined(__sparc) || defined(__sparc__)
++#  undef KMP_ARCH_SPARC
++#  define KMP_ARCH_SPARC 1
+ # endif
+ #endif
+ 
+@@ -160,6 +170,17 @@
+ # define KMP_ARCH_ARM 1
+ #endif
+ 
++#if defined(KMP_ARCH_SPARC)
++# undef KMP_ARCH_SPARC32
++# undef KMP_ARCH_SPARC64
++# if defined(__sparcv9) || defined(__sparc64__)
++#  define KMP_ARCH_SPARC64 1
++# endif
++# if defined(__sparc) && !defined(__sparcv9) && !defined(__sparc64__)
++#  define KMP_ARCH_SPARC32 1
++# endif
++#endif
++
+ // Intel(R) Many Integrated Core Architecture detection
+ #if defined(__MIC__) || defined(__MIC2__)
+ # define KMP_MIC  1
+@@ -178,7 +199,7 @@
+ #endif
+ 
+ // TODO: Fixme - This is clever, but really fugly
+-#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + KMP_ARCH_AARCH64)
++#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + KMP_ARCH_AARCH64 + KMP_ARCH_SPARC)
+ # error Unknown or unsupported architecture
+ #endif
+ 
+###
+--- src/z_Linux_util.c	2015-10-09 11:05:53.000000000 -0700
++++ src/z_Linux_util.c	2016-02-21 20:35:31.672538690 -0800
+@@ -72,9 +72,20 @@
+ #elif KMP_OS_FREEBSD
+ # include <sys/sysctl.h>
+ # include <pthread_np.h>
++#elif KMP_OS_SOLARIS
++# include <stdlib.h>
++# include <errno.h>
++# include <unistd.h>
++# include <limits.h>
++# include <stdbool.h>
++# include <strings.h>
++# include <sys/types.h>
++# include <sys/stat.h>
++# include <fcntl.h>
++# include <sys/procfs.h>
++# include <sys/loadavg.h>
+ #endif
+ 
+-
+ #include <dirent.h>
+ #include <ctype.h>
+ #include <fcntl.h>
+@@ -2101,7 +2112,7 @@
+ 
+     int r = 0;
+ 
+-    #if KMP_OS_LINUX
++    #if (KMP_OS_LINUX || KMP_OS_SOLARIS)
+ 
+         r = sysconf( _SC_NPROCESSORS_ONLN );
+ 
+@@ -2376,6 +2387,39 @@
+         // FIXME(FreeBSD*): Implement this
+         found = 1;
+ 
++    #elif KMP_OS_SOLARIS
++        const char* mpath = __kmp_str_format( "/proc/%d/map", (int) getpid());
++        if (mpath == NULL) return found;
++
++        int fd = open(mpath, O_RDONLY);
++        if (fd < 0) return found;
++
++        ssize_t nread = 0;
++        size_t mapsize = (1 << 20);
++
++        struct prmap* prmapbuf = (struct prmap*) malloc(mapsize);
++        if (prmapbuf == NULL) return found;
++
++        (void) memset(prmapbuf, 0, mapsize);
++        while ((nread += pread(fd, prmapbuf, mapsize, 0)) >= (ssize_t) mapsize)
++        {
++          mapsize *= 2U;
++          prmapbuf = (struct prmap*) realloc(prmapbuf, mapsize);
++        }
++
++        uintptr_t vaddr = (uintptr_t) addr;
++
++        for (const struct prmap* cur = prmapbuf; nread > 0;
++             nread -= sizeof(*cur), ++cur)
++        {
++          if ((vaddr >= cur->pr_vaddr) &&
++              (vaddr <= (cur->pr_vaddr + cur->pr_size)))
++            found = 1;
++        }
++
++        free(prmapbuf);
++        close(fd);
++
+     #else
+ 
+         #error "Unknown or unsupported OS"
+@@ -2388,8 +2432,20 @@
+ 
+ #ifdef USE_LOAD_BALANCE
+ 
++# if (KMP_OS_DARWIN || KMP_OS_SOLARIS)
+ 
+-# if KMP_OS_DARWIN
++// Hi, Apple.
++# ifndef LOADAVG_1MIN
++# define LOADAVG_1MIN 0
++# endif
++
++# ifndef LOADAVG_5MIN
++# define LOADAVG_5MIN 1
++# endif
++
++# ifndef LOADAVG_15MIN
++# define LOADAVG_15MIN 2
++# endif
+ 
+ // The function returns the rounded value of the system load average
+ // during given time interval which depends on the value of
+@@ -2408,12 +2464,12 @@
+     // getloadavg() may return the number of samples less than requested that is
+     // less than 3.
+     if ( __kmp_load_balance_interval < 180 && ( res >= 1 ) ) {
+-        ret_avg = averages[0];// 1 min
++        ret_avg = averages[LOADAVG_1MIN];// 1 min
+     } else if ( ( __kmp_load_balance_interval >= 180
+                   && __kmp_load_balance_interval < 600 ) && ( res >= 2 ) ) {
+-        ret_avg = averages[1];// 5 min
++        ret_avg = averages[LOADAVG_5MIN];// 5 min
+     } else if ( ( __kmp_load_balance_interval >= 600 ) && ( res == 3 ) ) {
+-        ret_avg = averages[2];// 15 min
++        ret_avg = averages[LOADAVG_15MIN];// 15 min
+     } else {// Error occurred
+         return -1;
+     }
+--- src/thirdparty/ittnotify/ittnotify_config.h	2015-10-09 11:05:58.000000000 -0700
++++ src/thirdparty/ittnotify/ittnotify_config.h	2016-02-21 09:36:01.959301778 -0800
+@@ -43,11 +43,17 @@
+ #  define ITT_OS_MAC   3
+ #endif /* ITT_OS_MAC */
+ 
++#ifndef ITT_OS_SOLARIS
++#  define ITT_OS_SOLARIS  4
++#endif /* ITT_OS_SOLARIS */
++
+ #ifndef ITT_OS
+ #  if defined WIN32 || defined _WIN32
+ #    define ITT_OS ITT_OS_WIN
+ #  elif defined( __APPLE__ ) && defined( __MACH__ )
+ #    define ITT_OS ITT_OS_MAC
++#  elif defined(__sun) || defined(__sun__)
++#    define ITT_OS ITT_OS_SOLARIS
+ #  else
+ #    define ITT_OS ITT_OS_LINUX
+ #  endif
+@@ -75,11 +81,18 @@
+ #  endif
+ #endif /* ITT_PLATFORM */
+ 
++#if (ITT_OS == ITT_OS_SOLARIS)
++# if !defined(_UNICODE)
++#   define _UNICODE
++# endif
++#endif
++
+ #if defined(_UNICODE) && !defined(UNICODE)
+ #define UNICODE
+ #endif
+ 
+ #include <stddef.h>
++
+ #if ITT_PLATFORM==ITT_PLATFORM_WIN
+ #include <tchar.h>
+ #else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */
+@@ -161,6 +174,13 @@
+ #  define ITT_ARCH_PPC64  5
+ #endif /* ITT_ARCH_PPC64 */
+ 
++#ifndef ITT_ARCH_SPARC32
++#  define ITT_ARCH_SPARC32 6
++#endif /* ITT_ARCH_SPARC32 */
++
++#ifndef ITT_ARCH_SPARC64
++#  define ITT_ARCH_SPARC64 7
++#endif /* ITT_ARCH_SPARC32 */
+ 
+ #ifndef ITT_ARCH
+ #  if defined _M_IX86 || defined __i386__
+@@ -175,6 +195,10 @@
+ #    define ITT_ARCH ITT_ARCH_PPC64
+ #  elif defined __aarch64__
+ #    define ITT_ARCH ITT_ARCH_AARCH64
++#  elif defined __sparcv9
++#    define ITT_ARCH ITT_ARCH_SPARC64
++#  elif defined __sparc
++#    define ITT_ARCH ITT_ARCH_SPARC32
+ #  endif
+ #endif
+ 
+@@ -195,6 +219,7 @@
+     static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \
+     __itt_build_check_##suffix[0] = 0; \
+ } while(0)
++
+ #define _ITT_BUILD_ASSERT(expr, suffix)  __ITT_BUILD_ASSERT((expr), suffix)
+ #define ITT_BUILD_ASSERT(expr)           _ITT_BUILD_ASSERT((expr), __LINE__)
+ 
+@@ -226,6 +251,13 @@
+ #ifndef _GNU_SOURCE
+ #define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
+ #endif /* _GNU_SOURCE */
++
++#if (ITT_OS == ITT_OS_SOLARIS)
++# if !defined(__EXTENSIONS__)
++#   define __EXTENSIONS__ 1
++# endif /* __EXTENSIONS__ */
++#endif /* ITT_OS_SOLARIS */
++
+ #ifndef __USE_UNIX98
+ #define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */
+ #endif /*__USE_UNIX98*/
+@@ -312,7 +344,7 @@
+                           : "memory");
+     return result;
+ }
+-#elif ITT_ARCH==ITT_ARCH_ARM || ITT_ARCH==ITT_ARCH_PPC64 || ITT_ARCH==ITT_ARCH_AARCH64
++#elif ITT_ARCH==ITT_ARCH_ARM || ITT_ARCH==ITT_ARCH_PPC64 || ITT_ARCH==ITT_ARCH_AARCH64 || ITT_ARCH==ITT_ARCH_SPARC32 || ITT_ARCH==ITT_ARCH_SPARC64
+ #define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
+ #endif /* ITT_ARCH==ITT_ARCH_IA64 */
+ #ifndef ITT_SIMPLE_INIT
+--- src/thirdparty/ittnotify/ittnotify_static.c	2015-10-09 11:05:58.000000000 -0700
++++ src/thirdparty/ittnotify/ittnotify_static.c	2016-02-21 09:33:19.660164335 -0800
+@@ -56,6 +56,8 @@
+ static const char* ittnotify_lib_name = "libittnotify.dll";
+ #elif ITT_OS==ITT_OS_LINUX
+ static const char* ittnotify_lib_name = "libittnotify.so";
++#elif ITT_OS==ITT_OS_SOLARIS
++static const char* ittnotify_lib_name = "libittnotify.so";
+ #elif ITT_OS==ITT_OS_MAC
+ static const char* ittnotify_lib_name = "libittnotify.dylib";
+ #else
+###
+--- src/kmp_os.h	2015-10-09 11:05:48.000000000 -0700
++++ src/kmp_os.h	2016-08-17 10:24:55.845519915 -0700
+@@ -71,7 +71,7 @@
+ #elif defined( __clang__ )
+ # undef KMP_COMPILER_CLANG
+ # define KMP_COMPILER_CLANG 1
+-#elif defined( __GNUC__ )
++#elif defined( __GNUC__ ) || defined(__GNUG__)
+ # undef KMP_COMPILER_GCC
+ # define KMP_COMPILER_GCC 1
+ #elif defined( _MSC_VER )
+@@ -83,7 +83,8 @@
+ 
+ #include "kmp_platform.h"
+ 
+-#if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64
++#if (KMP_OS_LINUX || KMP_OS_WINDOWS) && \
++  !KMP_OS_CNK && !KMP_ARCH_PPC64
+ # define KMP_AFFINITY_SUPPORTED 1
+ # if KMP_OS_WINDOWS && KMP_ARCH_X86_64
+ #  define KMP_GROUP_AFFINITY    1
+@@ -95,9 +96,32 @@
+ # define KMP_GROUP_AFFINITY     0
+ #endif
+ 
++#if (KMP_OS_SOLARIS)
++# undef KMP_OS_UNIX
++# define KMP_OS_UNIX 1
++# undef _REENTRANT
++# define _REENTRANT 1
++# undef __EXTENSIONS__
++# define __EXTENSIONS__ 1
++# undef KMP_GOMP_COMPAT
++# define KMP_GOMP_COMPAT 1
++# undef KMP_ASM_INTRINS
++# define KMP_ASM_INTRINS 1
++# undef KMP_GOMP_COMPAT
++# define KMP_GOMP_COMPAT 1
++# undef KMP_TDATA_GTID
++# define KMP_TDATA_GTID 1
++# undef KMP_USE_ADAPTIVE_LOCKS
++# define KMP_USE_ADAPTIVE_LOCKS 1
++# undef KMP_AFFINITY_SUPPORTED
++# define KMP_AFFINITY_SUPPORTED 0
++# undef KMP_GROUP_AFFINITY
++# define KMP_GROUP_AFFINITY 0
++#endif
++
+ /* Check for quad-precision extension. */
+ #define KMP_HAVE_QUAD 0
+-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
++#if (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_SPARC32 || KMP_ARCH_SPARC64)
+ # if KMP_COMPILER_ICC
+    /* _Quad is already defined for icc */
+ #  undef  KMP_HAVE_QUAD
+@@ -106,8 +130,12 @@
+    /* Clang doesn't support a software-implemented
+       128-bit extended precision type yet */
+    typedef long double _Quad;
+-# elif KMP_COMPILER_GCC
+-   typedef __float128 _Quad;
++# elif (KMP_COMPILER_GCC || KMP_COMPILER_CLANG)
++#   if KMP_OS_SOLARIS
++      typedef long double _Quad;
++#   else
++      typedef __float128 _Quad;
++#   endif
+ #  undef  KMP_HAVE_QUAD
+ #  define KMP_HAVE_QUAD 1
+ # elif KMP_COMPILER_MSVC
+@@ -168,15 +196,15 @@
+ # define KMP_UINT64_SPEC     "llu"
+ #endif /* KMP_OS_UNIX */
+ 
+-#if KMP_ARCH_X86 || KMP_ARCH_ARM
++#if (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_SPARC32)
+ # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
+-#elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64
++#elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 | KMP_ARCH_SPARC64
+ # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
+ #else
+ # error "Can't determine size_t printf format specifier."
+ #endif
+ 
+-#if KMP_ARCH_X86
++#if (KMP_ARCH_X86 || KMP_ARCH_SPARC32)
+ # define KMP_SIZE_T_MAX (0xFFFFFFFF)
+ #else
+ # define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF)
+@@ -194,6 +222,12 @@
+ # define KMP_UINTPTR_SPEC  "lu"
+ #endif
+ 
++#if (KMP_ARCH_X86_64 || KMP_ARCH_SPARC || KMP_ARCH_PPC || KMP_ARCH_AARCH64)
++# define BUILD_I8 1
++#else
++# undef BUILD_I8
++#endif
++
+ #ifdef BUILD_I8
+   typedef kmp_int64      kmp_int;
+   typedef kmp_uint64     kmp_uint;
+@@ -571,7 +605,8 @@
+ # endif
+ #endif /* KMP_OS_WINDOWS */
+ 
+-#if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64
++#if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64 || \
++  KMP_ARCH_SPARC32 || KMP_ARCH_SPARC64
+ # define KMP_MB()       __sync_synchronize()
+ #endif
+ 
+@@ -626,7 +661,7 @@
+ #define TCW_SYNC_8(a,b)     (a) = (b)
+ #define TCX_SYNC_8(a,b,c)   KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), (kmp_int64)(b), (kmp_int64)(c))
+ 
+-#if KMP_ARCH_X86
++#if (KMP_ARCH_X86 || KMP_ARCH_SPARC32)
+ // What about ARM?
+     #define TCR_PTR(a)          ((void *)TCR_4(a))
+     #define TCW_PTR(a,b)        TCW_4((a),(b))
+###
+--- /dev/null	2016-08-10 15:44:22.000000000 -0700
++++ src/kmp_solaris.h	2016-08-10 15:48:54.851814025 -0700
+@@ -0,0 +1,72 @@
++/* <copyright>
++    Copyright (c) 2016 Oracle and/or its affiliates.  All Rights Reserved.
++
++    Redistribution and use in source and binary forms, with or without
++    modification, are permitted provided that the following conditions
++    are met:
++
++      * Redistributions of source code must retain the above copyright
++        notice, this list of conditions and the following disclaimer.
++      * Redistributions in binary form must reproduce the above copyright
++        notice, this list of conditions and the following disclaimer in the
++        documentation and/or other materials provided with the distribution.
++      * Neither the name of Oracle Corporation nor the names of its
++        contributors may be used to endorse or promote products derived
++        from this software without specific prior written permission.
++
++    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++</copyright> */
++
++/*
++ * Implementation of __rdtsc() on Solaris Intel and SPARC.
++ * On Intel, we use the rdtsc instruction.
++ * On SPARC, we read the %tick register. This _must_ be compiled as
++ * SPARCV9.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#if defined(__i386__) || defined(__x86_64__)
++__attribute__((used, visibility("hidden")))
++static inline unsigned long long __rdtsc()
++{
++  unsigned int H = 0U;
++  unsigned int L = 0U;
++  __asm__ __volatile__ ("rdtsc" : "=a"(L), "=d"(H));
++  return ((unsigned long long) L) | ((unsigned long long) H) << 32ULL;
++}
++#endif
++
++#if defined(__sparc__)
++__attribute__((used, visibility("hidden")))
++static inline unsigned long long __rdtsc()
++{
++  unsigned long long T;
++#if defined(__sparcv9)
++  __asm__ __volatile__("rd  %%tick, %0\n\t" : "=r" (T));
++#else
++  __asm__ __volatile__("rd %%tick, %L0\n\t"
++                       "srlx %L0, 32, %H0" : "=r" (T));
++#endif
++  return T;
++}
++
++#endif /* (__sparc__) */
++
++#ifdef __cplusplus
++}
++#endif
++
+###
+--- src/kmp_stats_timing.h	2015-10-09 11:05:49.000000000 -0700
++++ src/kmp_stats_timing.h	2016-02-23 06:51:41.006922759 -0800
+@@ -36,11 +36,16 @@
+ </copyright> */
+ 
+ 
+-#include <stdint.h>
++#include <cstdint>
+ #include <string>
+ #include <limits>
++
+ #include "kmp_os.h"
+ 
++#if KMP_OS_SOLARIS
++# include "kmp_solaris.h"
++#endif
++
+ class tsc_tick_count {
+   private:
+     int64_t my_count;
+--- src/kmp_ftn_entry.h	2015-10-09 11:05:46.000000000 -0700
++++ src/kmp_ftn_entry.h	2016-02-21 07:57:59.742196067 -0800
+@@ -435,7 +435,7 @@
+                 return 0;
+             }
+             --gtid; // We keep (gtid+1) in TLS
+-        #elif KMP_OS_LINUX
++        #elif (KMP_OS_LINUX || KMP_OS_SOLARIS)
+             #ifdef KMP_TDATA_GTID
+             if ( __kmp_gtid_mode >= 3 ) {
+                 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
+###
+--- src/kmp.h	2015-10-09 11:05:47.000000000 -0700
++++ src/kmp.h	2016-08-04 10:20:19.628625370 -0700
+@@ -126,6 +126,16 @@
+ # if !defined NSIG && defined _NSIG
+ #  define NSIG _NSIG
+ # endif
++# if KMP_OS_SOLARIS
++#  define TIMEVAL_TO_TIMESPEC(tv, ts) {       \
++      (ts)->tv_sec = (tv)->tv_sec;            \
++      (ts)->tv_nsec = (tv)->tv_usec * 1000;   \
++}
++# define TIMESPEC_TO_TIMEVAL(tv, ts) {        \
++      (tv)->tv_sec = (ts)->tv_sec;            \
++      (tv)->tv_usec = (ts)->tv_nsec / 1000;   \
++}
++# endif
+ #endif
+ 
+ #if KMP_OS_LINUX
+@@ -586,7 +596,7 @@
+ #  define KMP_CPU_SET_ITERATE(i,mask) \
+     for(i = 0; (size_t)i < KMP_CPU_SETSIZE; ++i)
+ 
+-# if KMP_OS_LINUX
++# if (KMP_OS_LINUX || KMP_OS_SOLARIS)
+ //
+ // On Linux* OS, the mask is actually a vector of length __kmp_affin_mask_size
+ // (in bytes).  It should be allocated on a word boundary.
+@@ -1084,6 +1094,9 @@
+ #elif KMP_OS_LINUX
+ #  define KMP_INIT_WAIT  1024U          /* initial number of spin-tests   */
+ #  define KMP_NEXT_WAIT   512U          /* susequent number of spin-tests */
++#elif KMP_OS_SOLARIS
++#  define KMP_INIT_WAIT    16U          /* initial number of spin-tests   */
++#  define KMP_NEXT_WAIT     8U          /* susequent number of spin-tests */
+ #elif KMP_OS_DARWIN
+ /* TODO: tune for KMP_OS_DARWIN */
+ #  define KMP_INIT_WAIT  1024U          /* initial number of spin-tests   */
+@@ -1115,6 +1128,14 @@
+ # define KMP_PPC64_PRI_MED() __asm__ volatile ("or 2, 2, 2")
+ # define KMP_PPC64_PRI_LOC_MB() __asm__ volatile ("" : : : "memory")
+ # define KMP_CPU_PAUSE() do { KMP_PPC64_PRI_LOW(); KMP_PPC64_PRI_MED(); KMP_PPC64_PRI_LOC_MB(); } while (0)
++#elif KMP_ARCH_SPARC || KMP_ARCH_SPARC32 || KMP_ARCH_SPARC64
++#define KMP_CPU_PAUSE() \
++  do { \
++    __asm__ __volatile__("rd %ccr, %g0"); \
++    __asm__ __volatile__("rd %ccr, %g0"); \
++    __asm__ __volatile__("rd %ccr, %g0"); \
++    __asm__ __volatile__("rd %ccr, %g0"); \
++  } while (0)
+ #else
+ # define KMP_CPU_PAUSE()        /* nothing to do */
+ #endif
+@@ -3015,9 +3036,16 @@
+ extern kmp_uint32 __kmp_le_4(  kmp_uint32 value, kmp_uint32 checker );
+ extern kmp_uint32 __kmp_wait_yield_4( kmp_uint32 volatile * spinner, kmp_uint32 checker, kmp_uint32 (*pred) (kmp_uint32, kmp_uint32), void * obj );
+ 
++#ifdef __cplusplus
+ class kmp_flag_32;
+ class kmp_flag_64;
+ class kmp_flag_oncore;
++#else
++  struct kmp_flag_32;
++  struct kmp_flag_64;
++  struct kmp_flag_oncore;
++#endif
++
+ extern void __kmp_wait_32(kmp_info_t *this_thr, kmp_flag_32 *flag, int final_spin
+ #if USE_ITT_BUILD
+                    , void * itt_sync_obj
+###
+--- /dev/null	2016-08-04 13:40:37.000000000 -0700
++++ src/z_Solaris_asm_i386.S	2016-08-04 13:40:19.933031646 -0700
+@@ -0,0 +1,87 @@
++/*
++ * z_Solaris_asm.s: - microtasking routines specifically
++ *                    written for Intel and SPARC platforms
++ *                    running Solaris OS
++ *
++ * <copyright>
++ *    Copyright (c) 1997-2015 Intel Corporation.  All Rights Reserved.
++ *    Copyright (c) 2016 Oracle Corporation.  All Rights Reserved.
++ *
++ *    Redistribution and use in source and binary forms, with or without
++ *    modification, are permitted provided that the following conditions
++ *    are met:
++ *
++ *      - Redistributions of source code must retain the above copyright
++ *        notice, this list of conditions and the following disclaimer.
++ *      - Redistributions in binary form must reproduce the above copyright
++ *        notice, this list of conditions and the following disclaimer in the
++ *        documentation and/or other materials provided with the distribution.
++ *      - Neither the name of Intel Corporation nor the names of its
++ *        contributors may be used to endorse or promote products derived
++ *        from this software without specific prior written permission.
++ *
++ *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ *    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ *    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++ *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ * </copyright>
++ */
++
++#include "kmp_platform.h"
++
++/*
++ * -----------------------------------------------------------------------
++ * data
++ * -----------------------------------------------------------------------
++ */
++
++#ifdef KMP_GOMP_COMPAT
++
++/*
++ * Support for unnamed common blocks.
++ *
++ * Because the symbol ".gomp_critical_user_" contains a ".", we have to
++ * put this stuff in assembly.
++ */
++
++#if KMP_ARCH_X86
++	.align 4
++        .data
++        .comm .gomp_critical_user_, 32, 8
++        .data
++        .global __kmp_unnamed_critical_addr
++
++__kmp_unnamed_critical_addr:
++	.align 4
++        .4byte .gomp_critical_user_
++        .type __kmp_unnamed_critical_addr,@object
++        .size __kmp_unnamed_critical_addr, 4
++#endif /* KMP_ARCH_X86 */
++
++#if KMP_ARCH_X86_64
++	.align 8
++        .data
++        .comm .gomp_critical_user_, 64, 8
++        .data
++        .global __kmp_unnamed_critical_addr
++
++__kmp_unnamed_critical_addr:
++	.align 8
++        .8byte .gomp_critical_user_
++        .type __kmp_unnamed_critical_addr,@object
++        .size __kmp_unnamed_critical_addr, 8
++#endif /* KMP_ARCH_X86_64 */
++
++#endif /* KMP_GOMP_COMPAT */
++
++        .section .note.GNU-stack,"",@progbits
++        .file "z_Solaris_asm_i386.s"
++
+###
+--- /dev/null	2016-08-04 19:37:00.000000000 -0700
++++ src/z_Solaris_asm_sparc.S	2016-08-04 19:29:32.273919730 -0700
+@@ -0,0 +1,80 @@
++/*
++ * z_Solaris_asm.s: - microtasking routines specifically
++ *                    written for Intel and SPARC platforms
++ *                    running Solaris OS
++ *
++ * <copyright>
++ *    Copyright (c) 1997-2015 Intel Corporation.  All Rights Reserved.
++ *    Copyright (c) 2016 Oracle Corporation.  All Rights Reserved.
++ *
++ *    Redistribution and use in source and binary forms, with or without
++ *    modification, are permitted provided that the following conditions
++ *    are met:
++ *
++ *      - Redistributions of source code must retain the above copyright
++ *        notice, this list of conditions and the following disclaimer.
++ *      - Redistributions in binary form must reproduce the above copyright
++ *        notice, this list of conditions and the following disclaimer in the
++ *        documentation and/or other materials provided with the distribution.
++ *      - Neither the name of Intel Corporation nor the names of its
++ *        contributors may be used to endorse or promote products derived
++ *        from this software without specific prior written permission.
++ *
++ *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ *    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ *    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ *    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++ *    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ *    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ *    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ *    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ * </copyright>
++ */
++
++/*
++ * -----------------------------------------------------------------------
++ * macros
++ * -----------------------------------------------------------------------
++ */
++
++#include "kmp_platform.h"
++
++#ifdef KMP_GOMP_COMPAT
++
++/*
++ * Support for unnamed common blocks.
++ * Because the symbol ".gomp_critical_user_" contains a ".", we have to
++ * put this stuff in assembly.
++ */
++
++    .data
++    .align 8
++    .global .gomp_critical_user_
++    .comm .gomp_critical_user_, 64, 8
++    .type .gomp_critical_user_,@object
++    .size .gomp_critical_user_, 64
++
++    .data
++    .align 8
++    .global __kmp_unnamed_critical_addr
++    .type __kmp_unnamed_critical_addr,@object
++    .size __kmp_unnamed_critical_addr, .-__kmp_unnamed_critical_addr
++
++__kmp_unnamed_critical_addr:
++    .align 8
++#if KMP_ARCH_SPARC64
++    .xword .gomp_critical_user_
++#endif
++#if KMP_ARCH_SPARC32
++    .word .gomp_critical_user_
++#endif
++
++#endif /* KMP_GOMP_COMPAT */
++
++    .section .note.GNU-stack, "", @progbits
++    .file "z_Solaris_asm_sparc.S"
++
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/intel-openmp/patches/002-libiomp-solaris-linker-mapfile.patch	Wed Aug 17 16:04:09 2016 -0700
@@ -0,0 +1,911 @@
+# Linker mapfile for the Intel OpenMP Library and the Solaris
+# linker. The original mapfile is written for the GNU Linker.
+# This patch is probably not going to be accepted upstream,
+# because the Intel XE Compilers do not support Solaris in any way.
+--- src/exports_so.txt	2015-10-09 11:05:44.000000000 -0700
++++ src/exports_so.txt	2016-08-04 13:52:18.786942786 -0700
+@@ -1,7 +1,7 @@
+ # exports_so.txt #
+ 
+ # <copyright>
+-#    Copyright (c) 2013-2015 Intel Corporation.  All Rights Reserved.
++#    Copyright (C) 2016 Oracle and/or its affiliates.  All Rights Reserved.
+ #
+ #    Redistribution and use in source and binary forms, with or without
+ #    modification, are permitted provided that the following conditions
+@@ -30,119 +30,796 @@
+ #
+ # </copyright>
+ 
+-# This is version script for OMP RTL shared library (libiomp5*.so)
++# Solaris linker mapfile for the Solaris OpenMP RTL shared library
++# (libiomp5*.so).
+ 
+-VERSION {
++$mapfile_version 2
+ 
+-    global: # Exported symbols.
+-
+-        #
+-        # "Normal" symbols.
+-        #
+-        omp_*;     # Standard OpenMP functions.
+-        ompt_initialize;     # OMPT initialization interface
+-        ompt_control;        # OMPT control interface
+-        
+-        #
+-        # OMPT state placeholders
+-        #
+-        ompt_idle;
+-        ompt_overhead;
+-        ompt_barrier_wait;
+-        ompt_task_wait;
+-        ompt_mutex_wait;
+-
+-        ompc_*;    # omp.h renames some standard functions to ompc_*.
+-        kmp_*;     # Intel extensions.
+-        kmpc_*;    # Intel extensions.
+-        __kmpc_*;  # Functions called by compiler-generated code.
+-        GOMP_*;    # GNU C compatibility functions.
+-
+-        _You_must_link_with_*;     # Mutual detection/MS compatibility symbols.
+-
+-
+-        #
+-        # Debugger support.
+-        #
+-#if USE_DEBUGGER
+-        __kmp_debugging;
+-        __kmp_omp_debug_struct_info;
+-#endif /* USE_DEBUGGER */
+-
+-        #
+-        # Internal functions exported for testing purposes.
+-        #
+-        __kmp_get_reduce_method;
+-        ___kmp_allocate;
+-        ___kmp_free;
+-        __kmp_thread_pool;
+-        __kmp_thread_pool_nth;
+-
+-	__kmp_reset_stats;
+-
+-#if USE_ITT_BUILD
+-        #
+-        # ITT support.
+-        #
+-        # The following entry points are added so that the backtraces from
+-        # the tools contain meaningful names for all the functions that might
+-        # appear in a backtrace of a thread which is blocked in the RTL.
+-        __kmp_acquire_drdpa_lock;
+-        __kmp_acquire_nested_drdpa_lock;
+-        __kmp_acquire_nested_queuing_lock;
+-        __kmp_acquire_nested_tas_lock;
+-        __kmp_acquire_nested_ticket_lock;
+-        __kmp_acquire_queuing_lock;
+-        __kmp_acquire_tas_lock;
+-        __kmp_acquire_ticket_lock;
++SYMBOL_SCOPE {
++  global:
++    GOMP_atomic_end;
++    GOMP_atomic_start;
++    GOMP_barrier;
++    GOMP_barrier_cancel;
++    GOMP_cancel;
++    GOMP_cancellation_point;
++    GOMP_critical_end;
++    GOMP_critical_name_end;
++    GOMP_critical_name_start;
++    GOMP_critical_start;
++    GOMP_loop_dynamic_next;
++    GOMP_loop_dynamic_start;
++    GOMP_loop_end;
++    GOMP_loop_end_cancel;
++    GOMP_loop_end_nowait;
++    GOMP_loop_guided_next;
++    GOMP_loop_guided_start;
++    GOMP_loop_ordered_dynamic_next;
++    GOMP_loop_ordered_dynamic_start;
++    GOMP_loop_ordered_guided_next;
++    GOMP_loop_ordered_guided_start;
++    GOMP_loop_ordered_runtime_next;
++    GOMP_loop_ordered_runtime_start;
++    GOMP_loop_ordered_static_next;
++    GOMP_loop_ordered_static_start;
++    GOMP_loop_runtime_next;
++    GOMP_loop_runtime_start;
++    GOMP_loop_static_next;
++    GOMP_loop_static_start;
++    GOMP_loop_ull_dynamic_next;
++    GOMP_loop_ull_dynamic_start;
++    GOMP_loop_ull_guided_next;
++    GOMP_loop_ull_guided_start;
++    GOMP_loop_ull_ordered_dynamic_next;
++    GOMP_loop_ull_ordered_dynamic_start;
++    GOMP_loop_ull_ordered_guided_next;
++    GOMP_loop_ull_ordered_guided_start;
++    GOMP_loop_ull_ordered_runtime_next;
++    GOMP_loop_ull_ordered_runtime_start;
++    GOMP_loop_ull_ordered_static_next;
++    GOMP_loop_ull_ordered_static_start;
++    GOMP_loop_ull_runtime_next;
++    GOMP_loop_ull_runtime_start;
++    GOMP_loop_ull_static_next;
++    GOMP_loop_ull_static_start;
++    GOMP_ordered_end;
++    GOMP_ordered_start;
++    GOMP_parallel;
++    GOMP_parallel_end;
++    GOMP_parallel_loop_dynamic;
++    GOMP_parallel_loop_dynamic_start;
++    GOMP_parallel_loop_guided;
++    GOMP_parallel_loop_guided_start;
++    GOMP_parallel_loop_runtime;
++    GOMP_parallel_loop_runtime_start;
++    GOMP_parallel_loop_static;
++    GOMP_parallel_loop_static_start;
++    GOMP_parallel_sections;
++    GOMP_parallel_sections_start;
++    GOMP_parallel_start;
++    GOMP_sections_end;
++    GOMP_sections_end_cancel;
++    GOMP_sections_end_nowait;
++    GOMP_sections_next;
++    GOMP_sections_start;
++    GOMP_single_copy_end;
++    GOMP_single_copy_start;
++    GOMP_single_start;
++    GOMP_target;
++    GOMP_target_data;
++    GOMP_target_end_data;
++    GOMP_target_update;
++    GOMP_task;
++    GOMP_taskgroup_end;
++    GOMP_taskgroup_start;
++    GOMP_taskwait;
++    GOMP_taskyield;
++    GOMP_teams;
++    _Z14kmpc_poolprintv;
++    _Z15__kmp_env_printv;
++    $if _sparc
++      _Z17__kmpc_atomic_endv;
++    $else
++      __kmpc_atomic_end;
++    $endif
++    _Z17kmpc_get_poolmodev;
++    _Z17kmpc_get_poolsizev;
++    $if _ELF64
++      _Z17kmpc_get_poolstatPmS_;
++    $else
++      _Z17kmpc_get_poolstatPjS_;
++    $endif
++    _Z17kmpc_set_poolmodei;
++    $if _ELF64
++      _Z17kmpc_set_poolsizem;
++    $else
++      _Z17kmpc_set_poolsizej;
++    $endif
++    _Z17__kmp_env_print_2v;
++    _Z18__kmp_fork_barrierii;
++    _Z18__kmp_join_barrieri;
++    $if _sparc
++      _Z19__kmpc_atomic_startv;
++    $else
++      __kmpc_atomic_start;
++    $endif
++    _Z20__kmp_change_libraryi;
++    _Z20__kmp_env_initializePKc;
++    _Z20__kmp_resume_monitorv;
++    _Z20__kmp_setup_icv_copyP8kmp_teamiP20kmp_internal_controlP5ident;
++    $if _ELF64
++      _Z21__ompt_team_assign_idP8kmp_teamm;
++    $else
++      _Z21__ompt_team_assign_idP8kmp_teamy;
++    $endif
++    $if _ELF64
++      _Z23__ompt_lw_taskteam_initP18ompt_lw_taskteam_sP8kmp_infoiPvm;
++    $else
++      _Z23__ompt_lw_taskteam_initP18ompt_lw_taskteam_sP8kmp_infoiPvy;
++    $endif
++    _Z23__ompt_lw_taskteam_linkP18ompt_lw_taskteam_sP8kmp_info;
++    _Z25__kmp_default_tp_capacityiii;
++    _Z25__ompt_lw_taskteam_unlinkP8kmp_info;
++    _Z29__kmp_convert_to_millisecondsPKc;
++    _Z30__kmp_initial_threads_capacityi;
++    _Z30__kmp_register_library_startupv;
++    _Z36__kmp_unregister_root_current_threadi;
++    __kmp_abort_process;
++    __kmp_abort_thread;
++    __kmp_acquire_drdpa_lock;
++    __kmp_acquire_nested_drdpa_lock;
++    __kmp_acquire_nested_queuing_lock;
++    __kmp_acquire_nested_tas_lock;
++    __kmp_acquire_nested_ticket_lock;
++    __kmp_acquire_queuing_lock;
++    __kmp_acquire_tas_lock;
++    __kmp_acquire_ticket_lock;
++    ___kmp_allocate;
++    __kmp_allocate_cons_stack;
++    __kmp_allocate_indirect_lock;
++    __kmp_allocate_team;
++    __kmp_allocate_thread;
++    __kmp_aux_dispatch_fini_chunk_4;
++    __kmp_aux_dispatch_fini_chunk_4u;
++    __kmp_aux_dispatch_fini_chunk_8;
++    __kmp_aux_dispatch_fini_chunk_8u;
++    __kmp_aux_dispatch_init_4;
++    __kmp_aux_dispatch_init_4u;
++    __kmp_aux_dispatch_init_8;
++    __kmp_aux_dispatch_init_8u;
++    __kmp_aux_set_blocktime;
++    __kmp_aux_set_defaults;
++    __kmp_aux_set_library;
++    __kmp_aux_set_stacksize;
++    __kmp_barrier;
++    kmp_calloc;
++    __kmpc_atomic_1;
++    __kmpc_atomic_10;
++    __kmpc_atomic_16;
++    __kmpc_atomic_2;
++    __kmpc_atomic_20;
++    __kmpc_atomic_32;
++    __kmpc_atomic_4;
++    __kmpc_atomic_8;
++    __kmpc_atomic_cmplx10_add;
++    __kmpc_atomic_cmplx10_div;
++    __kmpc_atomic_cmplx10_mul;
++    __kmpc_atomic_cmplx10_sub;
++    __kmpc_atomic_cmplx16_add;
++    __kmpc_atomic_cmplx16_div;
++    __kmpc_atomic_cmplx16_mul;
++    __kmpc_atomic_cmplx16_sub;
++    __kmpc_atomic_cmplx4_add;
++    __kmpc_atomic_cmplx4_add_cmplx8;
++    __kmpc_atomic_cmplx4_div;
++    __kmpc_atomic_cmplx4_div_cmplx8;
++    __kmpc_atomic_cmplx4_mul;
++    __kmpc_atomic_cmplx4_mul_cmplx8;
++    __kmpc_atomic_cmplx4_sub;
++    __kmpc_atomic_cmplx4_sub_cmplx8;
++    __kmpc_atomic_cmplx8_add;
++    __kmpc_atomic_cmplx8_div;
++    __kmpc_atomic_cmplx8_mul;
++    __kmpc_atomic_cmplx8_sub;
++    __kmpc_atomic_fixed1_add;
++    __kmpc_atomic_fixed1_add_fp;
++    __kmpc_atomic_fixed1_andb;
++    __kmpc_atomic_fixed1_andl;
++    __kmpc_atomic_fixed1_div;
++    __kmpc_atomic_fixed1_div_float8;
++    __kmpc_atomic_fixed1_div_fp;
++    __kmpc_atomic_fixed1_eqv;
++    __kmpc_atomic_fixed1_max;
++    __kmpc_atomic_fixed1_min;
++    __kmpc_atomic_fixed1_mul;
++    __kmpc_atomic_fixed1_mul_float8;
++    __kmpc_atomic_fixed1_mul_fp;
++    __kmpc_atomic_fixed1_neqv;
++    __kmpc_atomic_fixed1_orb;
++    __kmpc_atomic_fixed1_orl;
++    __kmpc_atomic_fixed1_shl;
++    __kmpc_atomic_fixed1_shr;
++    __kmpc_atomic_fixed1_sub;
++    __kmpc_atomic_fixed1_sub_fp;
++    __kmpc_atomic_fixed1u_div;
++    __kmpc_atomic_fixed1u_div_fp;
++    __kmpc_atomic_fixed1u_shr;
++    __kmpc_atomic_fixed1_xor;
++    __kmpc_atomic_fixed2_add;
++    __kmpc_atomic_fixed2_add_fp;
++    __kmpc_atomic_fixed2_andb;
++    __kmpc_atomic_fixed2_andl;
++    __kmpc_atomic_fixed2_div;
++    __kmpc_atomic_fixed2_div_float8;
++    __kmpc_atomic_fixed2_div_fp;
++    __kmpc_atomic_fixed2_eqv;
++    __kmpc_atomic_fixed2_max;
++    __kmpc_atomic_fixed2_min;
++    __kmpc_atomic_fixed2_mul;
++    __kmpc_atomic_fixed2_mul_float8;
++    __kmpc_atomic_fixed2_mul_fp;
++    __kmpc_atomic_fixed2_neqv;
++    __kmpc_atomic_fixed2_orb;
++    __kmpc_atomic_fixed2_orl;
++    __kmpc_atomic_fixed2_shl;
++    __kmpc_atomic_fixed2_shr;
++    __kmpc_atomic_fixed2_sub;
++    __kmpc_atomic_fixed2_sub_fp;
++    __kmpc_atomic_fixed2u_div;
++    __kmpc_atomic_fixed2u_div_fp;
++    __kmpc_atomic_fixed2u_shr;
++    __kmpc_atomic_fixed2_xor;
++    __kmpc_atomic_fixed4_add;
++    __kmpc_atomic_fixed4_add_fp;
++    __kmpc_atomic_fixed4_andb;
++    __kmpc_atomic_fixed4_andl;
++    __kmpc_atomic_fixed4_div;
++    __kmpc_atomic_fixed4_div_float8;
++    __kmpc_atomic_fixed4_div_fp;
++    __kmpc_atomic_fixed4_eqv;
++    __kmpc_atomic_fixed4_max;
++    __kmpc_atomic_fixed4_min;
++    __kmpc_atomic_fixed4_mul;
++    __kmpc_atomic_fixed4_mul_float8;
++    __kmpc_atomic_fixed4_mul_fp;
++    __kmpc_atomic_fixed4_neqv;
++    __kmpc_atomic_fixed4_orb;
++    __kmpc_atomic_fixed4_orl;
++    __kmpc_atomic_fixed4_shl;
++    __kmpc_atomic_fixed4_shr;
++    __kmpc_atomic_fixed4_sub;
++    __kmpc_atomic_fixed4_sub_fp;
++    __kmpc_atomic_fixed4u_div;
++    __kmpc_atomic_fixed4u_div_fp;
++    __kmpc_atomic_fixed4u_shr;
++    __kmpc_atomic_fixed4_xor;
++    __kmpc_atomic_fixed8_add;
++    __kmpc_atomic_fixed8_add_fp;
++    __kmpc_atomic_fixed8_andb;
++    __kmpc_atomic_fixed8_andl;
++    __kmpc_atomic_fixed8_div;
++    __kmpc_atomic_fixed8_div_float8;
++    __kmpc_atomic_fixed8_div_fp;
++    __kmpc_atomic_fixed8_eqv;
++    __kmpc_atomic_fixed8_max;
++    __kmpc_atomic_fixed8_min;
++    __kmpc_atomic_fixed8_mul;
++    __kmpc_atomic_fixed8_mul_float8;
++    __kmpc_atomic_fixed8_mul_fp;
++    __kmpc_atomic_fixed8_neqv;
++    __kmpc_atomic_fixed8_orb;
++    __kmpc_atomic_fixed8_orl;
++    __kmpc_atomic_fixed8_shl;
++    __kmpc_atomic_fixed8_shr;
++    __kmpc_atomic_fixed8_sub;
++    __kmpc_atomic_fixed8_sub_fp;
++    __kmpc_atomic_fixed8u_div;
++    __kmpc_atomic_fixed8u_div_fp;
++    __kmpc_atomic_fixed8u_shr;
++    __kmpc_atomic_fixed8_xor;
++    __kmpc_atomic_float10_add;
++    __kmpc_atomic_float10_add_fp;
++    __kmpc_atomic_float10_div;
++    __kmpc_atomic_float10_div_fp;
++    __kmpc_atomic_float10_mul;
++    __kmpc_atomic_float10_mul_fp;
++    __kmpc_atomic_float10_sub;
++    __kmpc_atomic_float10_sub_fp;
++    __kmpc_atomic_float16_add;
++    __kmpc_atomic_float16_div;
++    __kmpc_atomic_float16_max;
++    __kmpc_atomic_float16_min;
++    __kmpc_atomic_float16_mul;
++    __kmpc_atomic_float16_sub;
++    __kmpc_atomic_float4_add;
++    __kmpc_atomic_float4_add_float8;
++    __kmpc_atomic_float4_add_fp;
++    __kmpc_atomic_float4_div;
++    __kmpc_atomic_float4_div_float8;
++    __kmpc_atomic_float4_div_fp;
++    __kmpc_atomic_float4_max;
++    __kmpc_atomic_float4_min;
++    __kmpc_atomic_float4_mul;
++    __kmpc_atomic_float4_mul_float8;
++    __kmpc_atomic_float4_mul_fp;
++    __kmpc_atomic_float4_sub;
++    __kmpc_atomic_float4_sub_float8;
++    __kmpc_atomic_float4_sub_fp;
++    __kmpc_atomic_float8_add;
++    __kmpc_atomic_float8_add_fp;
++    __kmpc_atomic_float8_div;
++    __kmpc_atomic_float8_div_fp;
++    __kmpc_atomic_float8_max;
++    __kmpc_atomic_float8_min;
++    __kmpc_atomic_float8_mul;
++    __kmpc_atomic_float8_mul_fp;
++    __kmpc_atomic_float8_sub;
++    __kmpc_atomic_float8_sub_fp;
++    __kmpc_barrier;
++    __kmpc_barrier_master;
++    __kmpc_barrier_master_nowait;
++    __kmpc_begin;
++    __kmpc_bound_num_threads;
++    __kmpc_bound_thread_num;
++    kmpc_calloc;
++    __kmpc_cancel;
++    __kmpc_cancel_barrier;
++    __kmpc_cancellationpoint;
++    __kmpc_copyprivate;
++    __kmpc_critical;
++    __kmpc_critical_with_hint;
++    __kmpc_destroy_lock;
++    __kmpc_destroy_nest_lock;
++    __kmpc_dispatch_fini_4;
++    __kmpc_dispatch_fini_4u;
++    __kmpc_dispatch_fini_8;
++    __kmpc_dispatch_fini_8u;
++    __kmpc_dispatch_init_4;
++    __kmpc_dispatch_init_4u;
++    __kmpc_dispatch_init_8;
++    __kmpc_dispatch_init_8u;
++    __kmpc_dispatch_next_4;
++    __kmpc_dispatch_next_4u;
++    __kmpc_dispatch_next_8;
++    __kmpc_dispatch_next_8u;
++    __kmpc_dist_dispatch_init_4;
++    __kmpc_dist_dispatch_init_4u;
++    __kmpc_dist_dispatch_init_8;
++    __kmpc_dist_dispatch_init_8u;
++    __kmpc_dist_for_static_init_4;
++    __kmpc_dist_for_static_init_4u;
++    __kmpc_dist_for_static_init_8;
++    __kmpc_dist_for_static_init_8u;
++    __kmpc_end;
++    __kmpc_end_barrier_master;
++    __kmpc_end_critical;
++    __kmpc_end_master;
++    __kmpc_end_ordered;
++    __kmpc_end_reduce;
++    __kmpc_end_reduce_nowait;
++    __kmpc_end_serialized_parallel;
++    __kmpc_end_single;
++    __kmpc_end_taskgroup;
++    __kmpc_end_taskq;
++    __kmpc_end_taskq_task;
++    __kmpc_flush;
++    __kmpc_fork_call;
++    __kmpc_fork_teams;
++    __kmpc_for_static_fini;
++    __kmpc_for_static_init_4;
++    __kmpc_for_static_init_4u;
++    __kmpc_for_static_init_8;
++    __kmpc_for_static_init_8u;
++    kmpc_free;
++    __kmpc_get_parent_taskid;
++    __kmpc_get_taskid;
++    __kmpc_global_num_threads;
++    __kmpc_global_thread_num;
++    __kmp_check_barrier;
++    __kmp_check_stack_overlap;
++    __kmp_check_sync;
++    __kmp_check_workshare;
++    __kmpc_init_lock;
++    __kmpc_init_lock_with_hint;
++    __kmpc_init_nest_lock;
++    __kmpc_init_nest_lock_with_hint;
++    __kmpc_in_parallel;
++    __kmpc_invoke_task_func;
++    __kmp_cleanup;
++    __kmp_cleanup_hierarchy;
++    __kmp_cleanup_indirect_user_locks;
++    __kmp_clear_system_time;
++    kmpc_malloc;
++    __kmpc_master;
++    __kmpc_ok_to_fork;
++    __kmp_common_destroy;
++    __kmp_common_destroy_gtid;
++    __kmp_common_initialize;
++    __kmpc_omp_task;
++    __kmpc_omp_task_alloc;
++    __kmpc_omp_task_begin_if0;
++    __kmpc_omp_task_complete_if0;
++    __kmpc_omp_task_parts;
++    __kmpc_omp_taskwait;
++    __kmpc_omp_task_with_deps;
++    __kmpc_omp_taskyield;
++    __kmpc_omp_wait_deps;
++    __kmpc_ordered;
++    __kmpc_place_threads;
++    __kmpc_pop_num_threads;
++    __kmpc_proxy_task_completed;
++    __kmpc_proxy_task_completed_ooo;
++    __kmpc_push_num_teams;
++    __kmpc_push_num_threads;
++    __kmpc_push_proc_bind;
++    kmpc_realloc;
++    __kmp_create_monitor;
++    __kmp_create_worker;
++    __kmpc_reduce;
++    __kmpc_reduce_nowait;
++    __kmpc_serialized_parallel;
++    kmpc_set_blocktime;
++    kmpc_set_defaults;
++    kmpc_set_library;
++    __kmpc_set_lock;
++    __kmpc_set_nest_lock;
++    kmpc_set_stacksize;
++    kmpc_set_stacksize_s;
++    __kmpc_single;
++    __kmpc_task;
++    __kmpc_task_buffer;
++    __kmpc_taskgroup;
++    __kmpc_taskq;
++    __kmpc_taskq_task;
++    __kmpc_team_static_init_4;
++    __kmpc_team_static_init_4u;
++    __kmpc_team_static_init_8;
++    __kmpc_team_static_init_8u;
++    __kmpc_test_lock;
++    __kmpc_test_nest_lock;
++    __kmpc_threadprivate;
++    __kmpc_threadprivate_cached;
++    __kmpc_threadprivate_register;
++    __kmpc_threadprivate_register_vec;
++    __kmpc_unset_lock;
++    __kmpc_unset_nest_lock;
++    __kmp_debug_assert;
++    __kmp_debug_printf;
++    __kmp_destroy_drdpa_lock;
++    __kmp_destroy_nested_drdpa_lock;
++    __kmp_destroy_nested_queuing_lock;
++    __kmp_destroy_nested_tas_lock;
++    __kmp_destroy_nested_ticket_lock;
++    __kmp_destroy_queuing_lock;
++    __kmp_destroy_tas_lock;
++    __kmp_destroy_ticket_lock;
++    __kmp_determine_reduction_method;
++    __kmp_disable;
++    __kmp_dump_debug_buffer;
++    __kmp_elapsed;
++    __kmp_elapsed_tick;
++    __kmp_enable;
++    __kmp_end_split_barrier;
++    __kmp_enter_single;
++    __kmp_env_blk_free;
++    __kmp_env_blk_init;
++    __kmp_env_blk_sort;
++    __kmp_env_blk_var;
++    __kmp_env_exists;
++    __kmp_env_free;
++    __kmp_env_get;
++    __kmp_env_set;
++    __kmp_env_unset;
++    __kmp_eq_4;
++    __kmp_error_construct;
++    __kmp_error_construct2;
++    __kmp_execute_tasks_32;
++    __kmp_execute_tasks_64;
++    __kmp_execute_tasks_oncore;
++    __kmp_exit_single;
++    __kmp_exit_thread;
++    __kmp_expand_file_name;
++    __kmp_expand_host_name;
++    ___kmp_fast_allocate;
++    ___kmp_fast_free;
++    __kmp_finalize_bget;
+         __kmp_fork_call;
++    kmp_free_;
++    __kmp_free_cons_stack;
++    __kmp_free_fast_memory;
++    __kmp_free_task_team;
++    __kmp_free_team;
++    __kmp_free_thread;
++    __kmp_ge_4;
++    __kmp_get_ancestor_thread_num;
++    kmp_get_blocktime_;
++    kmp_get_cancellation_status_;
++    __kmp_get_global_thread_id;
++    __kmp_get_global_thread_id_reg;
++    __kmp_get_hierarchy;
++    kmp_get_library_;
++    __kmp_get_load_balance;
++    __kmp_get_max_active_levels;
++    kmp_get_num_known_threads_;
++    __kmp_get_random;
+         __kmp_get_reduce_method;
+-        __kmp_invoke_microtask;
+-        __kmp_itt_fini_ittlib;
+-        __kmp_itt_init_ittlib;
+-        __kmp_launch_monitor;
+-        __kmp_launch_worker;
++    __kmp_get_schedule;
++    __kmp_get_schedule_global;
++    kmp_get_stacksize_;
++    kmp_get_stacksize_s_;
++    __kmp_get_team_size;
++    __kmp_get_user_lock_owner;
++    __kmp_gtid_get_specific;
++    __kmp_gtid_set_specific;
++    __kmp_i18n_catclose;
++    __kmp_i18n_catgets;
++    __kmp_i18n_catopen;
++    __kmp_ignore_mppbeg;
++    __kmp_ignore_mppend;
++    __kmp_infinite_loop;
++    __kmp_init_drdpa_lock;
++    __kmp_init_dynamic_user_locks;
++    __kmp_initialize_bget;
++    __kmp_initialize_fast_memory;
++    __kmp_init_implicit_task;
++    __kmp_init_nested_drdpa_lock;
++    __kmp_init_nested_queuing_lock;
++    __kmp_init_nested_tas_lock;
++    __kmp_init_nested_ticket_lock;
++    __kmp_init_queuing_lock;
++    __kmp_init_random;
++    __kmp_init_tas_lock;
++    __kmp_init_ticket_lock;
++    __kmp_internal_begin;
++    __kmp_internal_end_atexit;
++    __kmp_internal_end_dest;
++    __kmp_internal_end_dtor;
++    __kmp_internal_end_fini;
++    __kmp_internal_end_library;
++    __kmp_internal_end_thread;
++    __kmp_internal_fork;
++    __kmp_internal_join;
++    $if _sparc
++      __kmp_invoke_microtask;
++    $endif
++    __kmp_invoke_task_func;
++    __kmp_invoke_teams_master;
++    __kmp_is_address_mapped;
++    __kmp_join_call;
++    __kmp_launch_thread;
++    __kmp_le_4;
++    __kmp_lt_4;
++    kmp_malloc_;
++    __kmp_middle_initialize;
++    __kmp_msg;
++    __kmp_msg_error_code;
++    __kmp_msg_error_mesg;
++    __kmp_msg_format;
++    __kmp_neq_4;
++    __kmp_omp_num_threads;
++    __kmp_omp_task;
++    ___kmp_page_allocate;
++    __kmp_parallel_deo;
++    __kmp_parallel_dxo;
++    __kmp_parallel_initialize;
++    __kmp_pop_current_task_from_thread;
++    __kmp_pop_parallel;
++    __kmp_pop_sync;
++    __kmp_pop_workshare;
++    __kmp_printf;
++    __kmp_printf_no_lock;
++    __kmp_print_storage_map_gtid;
++    __kmp_print_version_1;
++    __kmp_print_version_2;
++    __kmp_push_current_task_to_thread;
++    __kmp_push_num_teams;
++    __kmp_push_num_threads;
++    __kmp_push_parallel;
++    __kmp_push_proc_bind;
++    __kmp_push_sync;
++    __kmp_push_workshare;
++    __kmp_read_cpu_time;
++    __kmp_read_from_file;
++    __kmp_read_system_info;
++    __kmp_read_system_time;
++    kmp_realloc;
+         __kmp_reap_monitor;
++    __kmp_reap_task_teams;
++    __kmp_reap_team;
+         __kmp_reap_worker;
++    __kmp_register_atfork;
++    __kmp_register_root;
+         __kmp_release_32;
+         __kmp_release_64;
++    __kmp_release_deps;
++    __kmp_release_drdpa_lock;
++    __kmp_release_nested_drdpa_lock;
++    __kmp_release_nested_queuing_lock;
++    __kmp_release_nested_tas_lock;
++    __kmp_release_nested_ticket_lock;
+         __kmp_release_oncore;
++    __kmp_release_queuing_lock;
++    __kmp_release_tas_lock;
++    __kmp_release_ticket_lock;
++    __kmp_resume_32;
++    __kmp_resume_64;
++    __kmp_resume_oncore;
++    __kmp_run_after_invoked_task;
++    __kmp_run_before_invoked_task;
++    __kmp_runtime_destroy;
++    __kmp_runtime_initialize;
++    __kmp_save_internal_controls;
++    __kmp_serial_initialize;
++    __kmp_serialized_parallel;
++    kmp_set_blocktime;
++    kmp_set_defaults;
++    kmp_set_library_;
++    kmp_set_library_serial_;
++    kmp_set_library_throughput;
++    kmp_set_library_turnaround;
++    __kmp_set_max_active_levels;
++    __kmp_set_num_threads;
++    __kmp_set_schedule;
++    kmp_set_stacksize;
++    kmp_set_stacksize_s;
++    kmp_set_warnings_off_;
++    kmp_set_warnings_on;
++    __kmp_str_buf_cat;
++    __kmp_str_buf_clear;
++    __kmp_str_buf_detach;
++    __kmp_str_buf_free;
++    __kmp_str_buf_print;
++    __kmp_str_buf_print_size;
++    __kmp_str_buf_reserve;
++    __kmp_str_buf_vprint;
++    __kmp_str_eqf;
++    __kmp_str_fname_free;
++    __kmp_str_fname_init;
++    __kmp_str_fname_match;
++    __kmp_str_format;
++    __kmp_str_free;
++    __kmp_str_loc_free;
++    __kmp_str_loc_init;
++    __kmp_str_match;
++    __kmp_str_match_false;
++    __kmp_str_match_true;
++    __kmp_str_replace;
++    __kmp_str_split;
++    __kmp_str_to_int;
++    __kmp_str_token;
++    __kmp_str_to_size;
++    __kmp_str_to_uint;
++    __kmp_suspend_32;
++    __kmp_suspend_64;
++    __kmp_suspend_initialize;
++    __kmp_suspend_oncore;
++    __kmp_suspend_uninitialize_thread;
++    __kmp_task_alloc;
++    __kmp_tasking_barrier;
++    __kmp_task_init_ompt;
++    __kmp_task_team_setup;
++    __kmp_task_team_sync;
++    __kmp_task_team_wait;
++    __kmp_teams_master;
++    __kmp_terminate_thread;
++    __kmp_test_drdpa_lock;
++    __kmp_test_nested_drdpa_lock;
++    __kmp_test_nested_queuing_lock;
++    __kmp_test_nested_tas_lock;
++    __kmp_test_nested_ticket_lock;
++    __kmp_test_queuing_lock;
++    __kmp_test_tas_lock;
++    __kmp_test_ticket_lock;
++    ___kmp_thread_calloc;
++    ___kmp_thread_free;
++    ___kmp_thread_malloc;
++    kmp_threadprivate_insert;
++    kmp_threadprivate_insert_private_data;
++    ___kmp_thread_realloc;
++    __kmp_thread_sleep;
++    __kmp_tv_threadprivate_store;
++    __kmp_user_set_library;
++    __kmp_validate_locks;
++    __kmp_vprintf;
+         __kmp_wait_32;
+         __kmp_wait_64;
+         __kmp_wait_oncore;
++    __kmp_wait_to_unref_task_teams;
+         __kmp_wait_yield_4;
+-
+-        # ittnotify symbols to be used by debugger
++    __kmp_warn;
++    __kmp_yield;
++    _Z17__kmp_itt_destroyv;
++    _Z20__kmp_itt_initializev;
++    __kmp_itt_error_handler;
+         __kmp_itt_fini_ittlib;
+         __kmp_itt_init_ittlib;
+-#endif /* USE_ITT_BUILD */
+-
+-    local: # Non-exported symbols.
+-
+-        *;         # All other symbols are not exported.
+-
+-}; # VERSION
+-
+-# sets up GCC OMP_ version dependency chain
+-OMP_1.0 {
+-};
+-OMP_2.0 {
+-} OMP_1.0;
+-OMP_3.0 {
+-} OMP_2.0;
+-OMP_3.1 {
+-} OMP_3.0;
+-OMP_4.0 {
+-} OMP_3.1;
+-
+-# sets up GCC GOMP_ version dependency chain
+-GOMP_1.0 {
++    __kmp_itt_set_error_handler;
++    ompc_get_ancestor_thread_num;
++    ompc_get_team_size;
++    ompc_set_dynamic;
++    ompc_set_max_active_levels;
++    ompc_set_nested;
++    ompc_set_num_threads;
++    ompc_set_schedule;
++    omp_destroy_lock;
++    omp_destroy_lock_;
++    omp_destroy_nest_lock;
++    omp_destroy_nest_lock_;
++    omp_get_active_level;
++    omp_get_active_level_;
++    omp_get_ancestor_thread_num;
++    omp_get_ancestor_thread_num_;
++    omp_get_cancellation;
++    omp_get_cancellation_;
++    omp_get_dynamic;
++    omp_get_dynamic_;
++    omp_get_level;
++    omp_get_level_;
++    omp_get_max_active_levels;
++    omp_get_max_active_levels_;
++    omp_get_max_threads;
++    omp_get_max_threads_;
++    omp_get_nested;
++    omp_get_nested_;
++    omp_get_num_procs;
++    omp_get_num_procs_;
++    omp_get_num_teams;
++    omp_get_num_teams_;
++    omp_get_num_threads;
++    omp_get_num_threads_;
++    omp_get_proc_bind;
++    omp_get_proc_bind_;
++    omp_get_schedule;
++    omp_get_schedule_;
++    omp_get_team_num;
++    omp_get_team_num_;
++    omp_get_team_size;
++    omp_get_team_size_;
++    omp_get_thread_limit;
++    omp_get_thread_limit_;
++    omp_get_thread_num;
++    omp_get_thread_num_;
++    omp_get_wtick;
++    omp_get_wtick_;
++    omp_get_wtime;
++    omp_get_wtime_;
++    omp_in_final;
++    omp_in_final_;
++    omp_in_parallel;
++    omp_in_parallel_;
++    omp_init_lock;
++    omp_init_lock_;
++    omp_init_lock_with_hint;
++    omp_init_lock_with_hint_;
++    omp_init_nest_lock;
++    omp_init_nest_lock_;
++    omp_init_nest_lock_with_hint;
++    omp_init_nest_lock_with_hint_;
++    omp_is_initial_device;
++    omp_is_initial_device_;
++    omp_set_dynamic;
++    omp_set_dynamic_;
++    omp_set_lock;
++    omp_set_lock_;
++    omp_set_max_active_levels;
++    omp_set_max_active_levels_;
++    omp_set_nest_lock;
++    omp_set_nest_lock_;
++    omp_set_nested;
++    omp_set_nested_;
++    omp_set_num_threads;
++    omp_set_num_threads_;
++    omp_set_schedule;
++    omp_set_schedule_;
++    omp_test_lock;
++    omp_test_lock_;
++    omp_test_nest_lock;
++    omp_test_nest_lock_;
++    omp_unset_lock;
++    omp_unset_lock_;
++    omp_unset_nest_lock;
++    omp_unset_nest_lock_;
++  local:
++    *;
+ };
+-GOMP_2.0 {
+-} GOMP_1.0;
+-GOMP_3.0 {
+-} GOMP_2.0;
+-GOMP_4.0 {
+-} GOMP_3.0;
+ 
+-# end of file #