PSARC 2016/236 Intel OpenMP Runtime
22778656 integrate the Intel OpenMP library in Solaris
--- /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 #