[Openmp-commits] [openmp] r215098 - Update Branch3_5 to include new Cmake code and PowerPC64 buld fixes.

Jim Cownie james.h.cownie at intel.com
Thu Aug 7 04:17:00 PDT 2014


Author: jimcownie
Date: Thu Aug  7 06:16:59 2014
New Revision: 215098

URL: http://llvm.org/viewvc/llvm-project?rev=215098&view=rev
Log:
Update Branch3_5 to include new Cmake code and PowerPC64 buld fixes.
Branch_35 will then be the same as Rev 215093 on the trunk.

Added:
    openmp/branches/release_35/runtime/Build_With_CMake.txt
      - copied unchanged from r215096, openmp/trunk/runtime/Build_With_CMake.txt
    openmp/branches/release_35/runtime/CMakeLists.txt.old
      - copied unchanged from r215096, openmp/trunk/runtime/CMakeLists.txt.old
    openmp/branches/release_35/runtime/cmake/
      - copied from r215096, openmp/trunk/runtime/cmake/
    openmp/branches/release_35/runtime/cmake/BuildPLRules.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/BuildPLRules.cmake
    openmp/branches/release_35/runtime/cmake/Clang/
      - copied from r215096, openmp/trunk/runtime/cmake/Clang/
    openmp/branches/release_35/runtime/cmake/Clang/AsmFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Clang/AsmFlags.cmake
    openmp/branches/release_35/runtime/cmake/Clang/CFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Clang/CFlags.cmake
    openmp/branches/release_35/runtime/cmake/CommonFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/CommonFlags.cmake
    openmp/branches/release_35/runtime/cmake/Definitions.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Definitions.cmake
    openmp/branches/release_35/runtime/cmake/GNU/
      - copied from r215096, openmp/trunk/runtime/cmake/GNU/
    openmp/branches/release_35/runtime/cmake/GNU/AsmFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/GNU/AsmFlags.cmake
    openmp/branches/release_35/runtime/cmake/GNU/CFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/GNU/CFlags.cmake
    openmp/branches/release_35/runtime/cmake/GNU/FortranFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/GNU/FortranFlags.cmake
    openmp/branches/release_35/runtime/cmake/HelperFunctions.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/HelperFunctions.cmake
    openmp/branches/release_35/runtime/cmake/Intel/
      - copied from r215096, openmp/trunk/runtime/cmake/Intel/
    openmp/branches/release_35/runtime/cmake/Intel/AsmFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Intel/AsmFlags.cmake
    openmp/branches/release_35/runtime/cmake/Intel/CFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Intel/CFlags.cmake
    openmp/branches/release_35/runtime/cmake/Intel/FortranFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/Intel/FortranFlags.cmake
    openmp/branches/release_35/runtime/cmake/MSVC/
      - copied from r215096, openmp/trunk/runtime/cmake/MSVC/
    openmp/branches/release_35/runtime/cmake/MSVC/AsmFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/MSVC/AsmFlags.cmake
    openmp/branches/release_35/runtime/cmake/MSVC/CFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/MSVC/CFlags.cmake
    openmp/branches/release_35/runtime/cmake/MicroTests.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/MicroTests.cmake
    openmp/branches/release_35/runtime/cmake/PerlFlags.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/PerlFlags.cmake
    openmp/branches/release_35/runtime/cmake/SourceFiles.cmake
      - copied unchanged from r215096, openmp/trunk/runtime/cmake/SourceFiles.cmake
Modified:
    openmp/branches/release_35/   (props changed)
    openmp/branches/release_35/CREDITS.txt
    openmp/branches/release_35/runtime/CMakeLists.txt
    openmp/branches/release_35/runtime/src/CMakeLists.txt
    openmp/branches/release_35/runtime/src/dllexports
    openmp/branches/release_35/runtime/src/kmp.h
    openmp/branches/release_35/runtime/src/kmp_csupport.c
    openmp/branches/release_35/runtime/src/kmp_ftn_entry.h
    openmp/branches/release_35/runtime/src/kmp_ftn_os.h
    openmp/branches/release_35/runtime/src/kmp_global.c
    openmp/branches/release_35/runtime/src/kmp_gsupport.c
    openmp/branches/release_35/runtime/src/kmp_lock.h
    openmp/branches/release_35/runtime/src/kmp_os.h
    openmp/branches/release_35/runtime/src/kmp_runtime.c
    openmp/branches/release_35/runtime/src/kmp_settings.c
    openmp/branches/release_35/runtime/src/kmp_str.h
    openmp/branches/release_35/runtime/src/kmp_version.c
    openmp/branches/release_35/runtime/src/makefile.mk
    openmp/branches/release_35/runtime/src/thirdparty/ittnotify/ittnotify_config.h
    openmp/branches/release_35/runtime/src/z_Linux_asm.s
    openmp/branches/release_35/runtime/src/z_Linux_util.c
    openmp/branches/release_35/runtime/tools/lib/Platform.pm
    openmp/branches/release_35/runtime/tools/lib/Uname.pm
    openmp/branches/release_35/runtime/tools/src/common-defs.mk
    openmp/branches/release_35/www/content.css   (props changed)
    openmp/branches/release_35/www/menu.css   (props changed)

Propchange: openmp/branches/release_35/
------------------------------------------------------------------------------
    svn:mergeinfo = /openmp/trunk:213607-215096

Modified: openmp/branches/release_35/CREDITS.txt
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/CREDITS.txt?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/CREDITS.txt (original)
+++ openmp/branches/release_35/CREDITS.txt Thu Aug  7 06:16:59 2014
@@ -8,6 +8,9 @@ beautification by scripts.  The fields a
 (W), PGP key ID and fingerprint (P), description (D), and snail-mail address
 (S).
 
+N: Carlo Bertolli
+D: IBM contributor to PowerPC support in CMake files and elsewhere.
+
 N: Sunita Chandrasekaran
 D: Contributor to testsuite from OpenUH
 

Modified: openmp/branches/release_35/runtime/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/CMakeLists.txt?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/CMakeLists.txt (original)
+++ openmp/branches/release_35/runtime/CMakeLists.txt Thu Aug  7 06:16:59 2014
@@ -1,8 +1,833 @@
-project(openmp)
-cmake_minimum_required(VERSION 2.8)
+#
+#//===----------------------------------------------------------------------===//
+#//
+#//                     The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
 
-set(VERSION 5)
-set(OMP_VERSION "201107")
-set(OMP_VERSION_NUM "40")
+################
+# CMAKE libiomp5
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+project(libiomp C CXX)
+
+#########
+# GLOBALS 
+set(GLOBAL_DEBUG 0)
+
+# Add cmake directory to search for custom cmake functions
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
+
+# Set base libomp directory (directory with exports/ , src/ , tools/ , etc.)
+# The top-level CMakeLists.txt should define this variable.
+set(LIBOMP_WORK ${CMAKE_CURRENT_SOURCE_DIR})
+
+# These include files are in cmake/ subdirectory except for FindPerl which is a cmake standard module
+include(HelperFunctions)
+include(Definitions) # -D definitions when compiling 
+include(CommonFlags) # compiler, assembler, fortran, linker flags common for all compilers
+include(SourceFiles) # source files to compile 
+include(PerlFlags)   # Perl flags for generate-def.pl and expand-vars.pl
+include(FindPerl) # Standard cmake module to check for Perl
+
+####################################################################
+#                         CONFIGURATION
+#
+# * Any variable/value that is CACHE-ed can be changed after the initial run of cmake
+# through the file, CMakeCache.txt which is in the build directory.
+# * If you change any value in CMakeCache.txt, then just run cmake ..
+# and the changed will be picked up.  One can also use -DVARIABLE=VALUE
+# when calling cmake to changed configuration values.  
+# * CMAKE_C_COMPILER, CMAKE_CXX_COMPILER, CMAKE_ASM_MASM_COMPILER, CMAKE_ASM_COMPILER,
+# CMAKE_Fortran_COMPILER can only by specified on the initial run of cmake. 
+# This means you cannot specify -DCMAKE_C_COMPILER= on a subsequent run of cmake
+# in the same build directory until that build directory is emptied.
+# If you want to change the compiler, then empty the build directory and rerun cmake.
+
+# Build Configuration
+set(os_possible_values          lin mac win mic)
+set(arch_possible_values        32e 32 arm ppc64)
+set(build_type_possible_values  release debug relwithdebinfo)
+set(omp_version_possible_values 40 30)
+set(lib_type_possible_values    normal profile stubs)
+set(mic_arch_possible_values    knf knc)
+set(mic_os_possible_values      bsd lin)
+
+# Below, cmake will try and determine the operating system and architecture for you (it assumes Intel architecture)
+# These values are set in CMakeCache.txt when cmake is first run (-Dvar_name=... will take precedence)
+#  parameter  | default value             
+# ----------------------------
+# Right now, this build system considers os=lin to mean "Unix-like that is not MAC"
+if(${APPLE}) # Apple goes first because CMake considers Mac to be a Unix based operating system, while libiomp5 considers it a special case
+    set(os             mac         CACHE STRING "The operating system to build for (lin/mac/win/mic)")
+elseif(${UNIX})
+    set(os             lin         CACHE STRING "The operating system to build for (lin/mac/win/mic)")
+elseif(${WIN32})       
+    set(os             win         CACHE STRING "The operating system to build for (lin/mac/win/mic)")
+else()
+    set(os             lin         CACHE STRING "The operating system to build for (lin/mac/win/mic)")
+endif()
+
+# set to default architecture if the user did not specify an architecture explicitly
+if(NOT arch)	
+	if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
+    	set(arch           32          CACHE STRING "The architecture to build for (32e/32/arm/ppc64).  32e is Intel(R) 64 architecture, 32 is IA-32 architecture")
+	else()
+    	set(arch           32e         CACHE STRING "The architecture to build for (32e/32/arm/ppc64).  32e is Intel(R) 64 architecture, 32 is IA-32 architecture")
+	endif()
+endif()
+
+set(lib_type       normal        CACHE STRING "Performance,Profiling,Stubs library (normal/profile/stubs)")
+set(version        5             CACHE STRING "Produce libguide (version 4) or libiomp5 (version 5)")
+set(omp_version    40            CACHE STRING "The OpenMP version (40/30)")
+set(mic_arch       knc           CACHE STRING "Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) (knf/knc).   Ignored if not Intel(R) MIC Architecture build.")
+set(mic_os         lin           CACHE STRING "Intel(R) MIC Architecture operating system (bsd/lin).   Ignored if not Intel(R) MIC Architecture build.")
+set(create_fortran_modules false CACHE STRING "Create Fortran module files? (requires fortran compiler)")
+
+# - These tests are little tests performed after the library is formed.
+# - The library won't be copied to the exports directory until it has passed/skipped all below tests
+# - To skip these tests, just pass -Dtests=OFF to cmake or change tests value in CMakeCache.txt to OFF after running cmake
+set(test_touch      true         CACHE BOOL   "Perform a small touch test?"                            )
+set(test_relo       true         CACHE BOOL   "Perform a relocation test for dynamic libraries?"       )
+set(test_execstack  true         CACHE BOOL   "Perform a execstack test for linux dynamic libraries?"  )
+set(test_instr      true         CACHE BOOL   "Perform an instruction test for Intel(R) MIC Architecture libraries?" )
+set(test_deps       true         CACHE BOOL   "Perform a library dependency test?"                     )
+set(tests           false        CACHE BOOL   "Perform touch, relo, execstack, instr, and deps tests?" )
+
+# - stats-gathering enables OpenMP stats where things like the number of parallel regions, clock ticks spent in
+#   particular openmp regions are recorded.
+set(stats           false         CACHE BOOL   "Stats-Gathering functionality?"                         )
+
+# User specified flags.  These are appended to the predetermined flags found in CommonFlags.cmake and ${CMAKE_C_COMPILER_ID}/*Flags.cmake (i.e., GNU/CFlags.cmake)
+set(USER_C_FLAGS      "" CACHE STRING "Appended user specified C compiler flags."             )
+set(USER_CXX_FLAGS    "" CACHE STRING "Appended user specified C++ compiler flags."           )
+set(USER_CPP_FLAGS    "" CACHE STRING "Appended user specified C preprocessor flags."         )
+set(USER_ASM_FLAGS    "" CACHE STRING "Appended user specified assembler flags."              )
+set(USER_LD_FLAGS     "" CACHE STRING "Appended user specified linker flags."                 )
+set(USER_LD_LIB_FLAGS "" CACHE STRING "Appended user specified linked libs flags. (i.e., -lm)")
+set(USER_F_FLAGS      "" CACHE STRING "Appended user specified Fortran compiler flags.  These are only used if create_fortran_modules==true."       )
+
+# - Allow three build types: Release, Debug, RelWithDebInfo (these relate to build.pl's release, debug, and diag settings respectively)
+# - default is Release (when CMAKE_BUILD_TYPE is not defined)
+# - CMAKE_BUILD_TYPE affects the -O and -g flags (CMake magically includes correct version of them on per compiler basis)
+# - typical: Release = -O3 -DNDEBUG
+#            RelWithDebInfo = -O2 -g -DNDEBUG
+#            Debug = -g
+if(CMAKE_BUILD_TYPE)
+    # CMAKE_BUILD_TYPE was defined, check for validity 
+    string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lowercase)
+    check_variable(cmake_build_type_lowercase  "${build_type_possible_values}")
+else()
+    # CMAKE_BUILD_TYPE was not defined, set default to Release
+    unset(CMAKE_BUILD_TYPE CACHE)
+    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Release/Debug/RelWithDebInfo")
+    string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lowercase)
+    check_variable(cmake_build_type_lowercase  "${build_type_possible_values}")
+endif()
+
+# Check valid values
+check_variable(os          "${os_possible_values}"         )
+check_variable(arch        "${arch_possible_values}"       )
+check_variable(omp_version "${omp_version_possible_values}")
+check_variable(lib_type    "${lib_type_possible_values}"   )
+if("${os}" STREQUAL "mic")
+    check_variable(mic_arch "${mic_arch_possible_values}"  )
+    check_variable(mic_os   "${mic_os_possible_values}"    )
+endif()
+# Get the build number from kmp_version.c
+get_build_number("${LIBOMP_WORK}" build_number)
+
+# Getting time and date 
+# As of now, no timestamp will be created.
+set(date "No Timestamp")
+
+#################################################################
+# Set some useful flags variables for other parts of cmake to use
+# Operating System
+set(LINUX FALSE)
+set(MAC FALSE)
+set(WINDOWS FALSE)
+set(MIC FALSE)
+set(FREEBSD FALSE)
+if("${os}" STREQUAL "lin")
+    set(LINUX TRUE)
+    set(real_os lin)
+elseif("${os}" STREQUAL "mac")
+    set(MAC TRUE)
+    set(real_os mac)
+elseif("${os}" STREQUAL "win")
+    set(WINDOWS TRUE)
+    set(real_os win)
+elseif("${os}" STREQUAL "mic")
+    set(MIC TRUE)
+    set(real_os lrb)
+endif()
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
+    set(FREEBSD TRUE)
+endif()
+
+# Architecture
+set(IA32 FALSE)
+set(INTEL64 FALSE)
+set(ARM FALSE)
+set(PPC64 FALSE)
+if("${arch}" STREQUAL "32")      # IA-32 architecture
+    set(IA32 TRUE)
+elseif("${arch}" STREQUAL "32e") # Intel(R) 64 architecture
+    set(INTEL64 TRUE)
+elseif("${arch}" STREQUAL "arm") # ARM architecture
+    set(ARM TRUE)
+elseif("${arch}" STREQUAL "ppc64") # PPC64 architecture
+    set(PPC64 TRUE)
+endif()
+
+# Set some flags based on build_type
+# cmake_build_type_lowercase is based off of CMAKE_BUILD_TYPE, just put in lowercase.
+set(RELEASE_BUILD        FALSE)
+set(DEBUG_BUILD          FALSE)
+set(RELWITHDEBINFO_BUILD FALSE)
+if("${cmake_build_type_lowercase}" STREQUAL "release")
+    set(RELEASE_BUILD TRUE)
+elseif("${cmake_build_type_lowercase}" STREQUAL "debug")
+    set(DEBUG_BUILD TRUE)
+elseif("${cmake_build_type_lowercase}" STREQUAL "relwithdebinfo")
+    set(RELWITHDEBINFO_BUILD TRUE)
+endif()
+
+# Stats-gathering on or off?
+set(STATS_GATHERING FALSE)
+if("${stats}") # string "on" or "ON" is seen as boolean TRUE
+    set(STATS_GATHERING TRUE)
+endif()
+
+# Include itt notify interface? Right now, always.
+set(USE_ITT_NOTIFY TRUE)
+
+# normal, profile, stubs library.
+set(NORMAL_LIBRARY FALSE)
+set(STUBS_LIBRARY FALSE)
+set(PROFILE_LIBRARY FALSE)
+if("${lib_type}" STREQUAL "normal")
+    set(NORMAL_LIBRARY TRUE)
+elseif("${lib_type}" STREQUAL "profile")
+    set(PROFILE_LIBRARY TRUE)
+elseif("${lib_type}" STREQUAL "stubs")
+    set(STUBS_LIBRARY TRUE)
+endif()
+
+###############################################
+# Features for compilation and build in general
+
+# - Does the compiler support a 128-bit floating point data type? Default is false
+# - If a compiler does, then change it in the CMakeCache.txt file (or using the cmake GUI)
+#   or send to cmake -DCOMPILER_SUPPORTS_QUAD_PRECISION=true
+# - 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(COMPILER_SUPPORTS_QUAD_PRECISION false CACHE BOOL   "*INCOMPLETE* Does the compiler support a 128-bit floating point type?")
+set(COMPILER_QUAD_TYPE               ""    CACHE STRING "*INCOMPLETE* The quad precision data type (i.e., for gcc, __float128)")
+
+# - Should the orignal build rules for builds be used? (cmake/OriginalBuildRules.cmake).  This setting is off by default.
+# - This always compiles with -g.  And if it is a release build, the debug info is stripped out via objcopy and put into libiomp5.dbg.
+set(USE_BUILDPL_RULES false CACHE BOOL "Should the build follow build.pl rules/recipes?")
+
+# - Should the build use the predefined linker flags (OS-dependent) in CommonFlags.cmake?
+# - these predefined linker flags should work for Windows, Mac, and True Linux for the most popular compilers/linkers
+set(USE_PREDEFINED_LINKER_FLAGS true CACHE BOOL "Should the build use the predefined linker flags in CommonFlags.cmake?")
+
+# - TSX based locks have __asm code which can be troublesome for some compilers.  This feature is also x86 specific.
+if({${IA32} OR ${INTEL64})
+    set(USE_ADAPTIVE_LOCKS true CACHE BOOL "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp).  These are x86 specific.")
+else()
+    set(USE_ADAPTIVE_LOCKS false CACHE BOOL "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp).  These are x86 specific.")
+endif()
+
+##################################
+# Error checking the configuration 
+if(${STATS_GATHERING} AND (${WINDOWS} OR ${MAC}))
+    error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture")
+endif()
+if(${STATS_GATHERING} AND NOT (${IA32} OR ${INTEL64}))
+    error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture")
+endif()
+if(${USE_ADAPTIVE_LOCKS} AND NOT(${IA32} OR ${INTEL64}))
+    error_say("Adaptive locks (TSX) functionality is only supported on x86 Architecture")
+endif()
+
+###############################################
+# - Create the suffix for the export directory
+# - Only add to suffix when not a default value
+# - Example suffix: .deb.30.s1 
+#   final export directory: exports/lin_32e.deb.30.s1/lib
+# - These suffixes imply the build is a Debug, OpenMP 3.0, Stats-Gathering version of the library
+if(NOT "${cmake_build_type_lowercase}" STREQUAL "release")
+    string(SUBSTRING "${cmake_build_type_lowercase}" 0 3 build_type_suffix)
+    set(suffix "${suffix}.${build_type_suffix}")
+endif()
+if(NOT "${omp_version}" STREQUAL "40")
+    set(suffix "${suffix}.${omp_version}")
+endif()
+if(${STATS_GATHERING})
+    set(suffix "${suffix}.s1")
+endif()
+if(${MIC})
+    if(NOT "${mic_arch}" STREQUAL "knf")
+        set(suffix "${suffix}.${mic_arch}")
+    endif()
+    if(NOT "${mic_os}" STREQUAL "bsd")
+        set(suffix "${suffix}.${mic_os}")
+    endif()
+endif()
+
+####################################
+# Setting file extensions / suffixes
+set(obj ${CMAKE_C_OUTPUT_EXTENSION}   )
+set(lib ${CMAKE_STATIC_LIBRARY_SUFFIX})
+set(dll ${CMAKE_SHARED_LIBRARY_SUFFIX})
+set(exe ${CMAKE_EXECUTABLE_SUFFIX}    )
+
+######################
+# Find perl executable
+# Perl is used to create omp.h (and other headers) along with kmp_i18n_id.inc and kmp_i18n_default.inc (see below in Rules section)
+if(NOT "${PERL_FOUND}") # variable is defined in FindPerl Standard CMake Module
+    error_say("Error: Could not find valid perl")
+endif()
+
+#########################
+# Setting directory names
+set(platform       "${real_os}_${arch}"                ) # i.e., lin_32e, mac_32
+set(build_dir      "${CMAKE_CURRENT_BINARY_DIR}"       ) # build directory (Where CMakeCache.txt is created, build files generated)
+set(src_dir        "${LIBOMP_WORK}/src"                )
+set(tools_dir      "${LIBOMP_WORK}/tools"              ) 
+set(export_dir     "${LIBOMP_WORK}/exports"            ) 
+set(export_cmn_dir "${export_dir}/common${suffix}"     ) 
+set(export_ptf_dir "${export_dir}/${platform}${suffix}")
+_export_lib_dir(${platform} export_lib_dir)  # set exports directory (relative to build_dir) i.e., ../exports/lin_32e/lib/
+                                             # or i.e., ../exports/mac_32e/lib.thin/ for mac
+if(${MAC})
+    # macs use lib.thin/ subdirectory for non-fat libraries that only contain one architecture
+    # macs use lib/ subdirectory for fat libraries that contain both IA-32 architecture and Intel(R) 64 architecture code.
+    _export_lib_fat_dir(${platform} export_lib_fat_dir)
+endif()
+set(inc_dir        "${LIBOMP_WORK}/src/include/${omp_version}")
+
+############################
+# Setting final library name
+set(lib_item "libiomp")
+if(${PROFILE_LIBRARY})
+    set(lib_item "${lib_item}prof")
+endif()
+if(${STUBS_LIBRARY})
+    set(lib_item "${lib_item}stubs")
+endif()
+set(lib_item "${lib_item}${version}")
+if(${WINDOWS})
+    set(lib_item "${lib_item}md")
+endif()
+set(lib_ext "${dll}")
+# ${lib_file} is real library name:
+# libiomp5.so    for Linux
+# libiomp5.dylib for Mac
+# libiomp5md.dll for Windows
+set(lib_file "${lib_item}${lib_ext}")
+
+########################################
+# Setting export file names (full paths)
+if(${WINDOWS})
+    set(imp_file "${lib_item}${lib}") # this is exported (libiomp5md.lib)
+    set(def_file "${lib_item}.def") # this is not exported
+    set(rc_file  "${lib_item}.rc")  # this is not exported
+    if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo" OR ${USE_BUILDPL_RULES})
+        set(pdb_file "${lib_file}.pdb") # this is exported if it exists (libiomp5md.dll.pdb)
+    endif()
+endif()
+set(export_lib_files  "${lib_file}" "${imp_file}" "${pdb_file}") 
+set(export_inc_files  "iomp_lib.h")
+set(export_mod_files  "omp_lib.mod" "omp_lib_kinds.mod")
+set(export_cmn_files1 "omp.h" "omp_lib.h" "omp_lib.f" "omp_lib.f90")
+set(export_cmn_files2 "iomp.h")
+add_prefix("${export_lib_dir}/"                export_lib_files)
+add_prefix("${export_ptf_dir}/include_compat/" export_inc_files)
+add_prefix("${export_ptf_dir}/include/"        export_mod_files)
+add_prefix("${export_cmn_dir}/include/"        export_cmn_files1)
+add_prefix("${export_cmn_dir}/include_compat/" export_cmn_files2)
+set(export_cmn_files "${export_cmn_files1}" "${export_cmn_files2}")
+if("${export_lib_fat_dir}")
+    set(export_lib_fat_files "${lib_file}" "${imp_file}")
+    add_prefix("${export_lib_fat_dir}/" export_lib_fat_files)
+endif()
+
+#########################
+# Getting legal type/arch
+set_legal_type(legal_type)
+set_legal_arch(legal_arch)
+
+#################################################
+# Preprocessor Definitions (cmake/Definitions.cmake)
+# Preprocessor Includes 
+# Compiler (C/C++) Flags (cmake/CommonFlags.cmake)
+# Assembler Flags (cmake/CommonFlags.cmake)
+# Fortran   Flags (cmake/CommonFlags.cmake)
+# Linker    Flags (cmake/CommonFlags.cmake)
+# Archiver  Flags (cmake/CommonFlags.cmake)
+# Helper Perl Script Flags (cmake/PerlFlags.cmake)
+# * Inside the cmake/CommonFlags.cmake file, the USER_*_FLAGS are added.
+# * Cannot use CMAKE_*_FLAGS directly because -x c++ is put in the linker command and mangles the linking phase.
+
+# preprocessor flags (-D definitions and -I includes)
+# Grab environment variable CPPFLAGS and append those to definitions
+set(include_dirs ${CMAKE_CURRENT_BINARY_DIR} ${src_dir} ${src_dir}/i18n ${inc_dir} ${src_dir}/thirdparty/ittnotify)
+include_directories(${include_dirs})
+
+# Grab assembler-dependent flags
+# CMake will look for cmake/${CMAKE_ASM_COMPILER_ID}/AsmFlags.cmake to append additional assembler flags.
+if(${WINDOWS})
+    # Windows based systems use CMAKE_ASM_MASM_COMPILER
+    # The windows assembly files are in MASM format, and they require a tool that can handle MASM syntax (ml.exe or ml64.exe typically)
+    enable_language(ASM_MASM) 
+    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMAKE_ASM_MASM_COMPILER_ID} ${CMAKE_MODULE_PATH})
+    find_file(assembler_specific_include_file_found AsmFlags.cmake ${CMAKE_MODULE_PATH})
+    if(assembler_specific_include_file_found)
+        include(AsmFlags)
+        append_assembler_specific_asm_flags(ASM_FLAGS)
+    else()
+        warning_say("Could not find cmake/${CMAKE_ASM_MASM_COMPILER_ID}/AsmFlags.cmake: will only use default flags")
+    endif()
+else()
+    # Unix (including Mac) based systems use CMAKE_ASM_COMPILER
+    # Unix assembly files can be handled by compiler usually.
+    enable_language(ASM)
+    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMAKE_ASM_COMPILER_ID} ${CMAKE_MODULE_PATH})
+    find_file(assembler_specific_include_file_found AsmFlags.cmake ${CMAKE_MODULE_PATH})
+    if(assembler_specific_include_file_found)
+        include(AsmFlags)
+        append_assembler_specific_asm_flags(ASM_FLAGS)
+    else()
+        warning_say("Could not find cmake/${CMAKE_ASM_COMPILER_ID}/AsmFlags.cmake: will only use default flags")
+    endif()
+endif()
+# Grab compiler-dependent flags
+# Cmake will look for cmake/${CMAKE_C_COMPILER_ID}/CFlags.cmake to append additional c, cxx, and linker flags.
+set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMAKE_C_COMPILER_ID} ${CMAKE_MODULE_PATH})
+find_file(compiler_specific_include_file_found CFlags.cmake ${CMAKE_MODULE_PATH})
+if(compiler_specific_include_file_found)
+    include(CFlags) # COMPILER_SUPPORTS_QUAD_PRECISION changed in here
+    append_compiler_specific_c_and_cxx_flags(C_FLAGS CXX_FLAGS)
+    append_compiler_specific_linker_flags(LD_FLAGS LD_LIB_FLAGS)
+else()
+    warning_say("Could not find cmake/${CMAKE_C_COMPILER_ID}/CFlags.cmake: will only use default flags")
+endif()
+
+# Grab all the compiler-independent flags
+append_c_and_cxx_flags_common(C_FLAGS CXX_FLAGS) 
+append_asm_flags_common(ASM_FLAGS)
+append_fort_flags_common(F_FLAGS)
+append_linker_flags_common(LD_FLAGS LD_LIB_FLAGS)
+append_archiver_flags_common(AR_FLAGS)
+append_cpp_flags(DEFINITIONS_FLAGS)
+
+# Setup the flags correctly for cmake (covert to string)
+# Pretty them up (STRIP any beginning and trailing whitespace)
+list_to_string("${DEFINITIONS_FLAGS}" DEFINITIONS_FLAGS)
+list_to_string("${C_FLAGS}"           C_FLAGS          )
+list_to_string("${CXX_FLAGS}"         CXX_FLAGS        )
+list_to_string("${ASM_FLAGS}"         ASM_FLAGS        )
+list_to_string("${LD_FLAGS}"          LD_FLAGS         )
+list_to_string("${LD_LIB_FLAGS}"      LD_LIB_FLAGS     )
+list_to_string("${AR_FLAGS}"          AR_FLAGS         ) # Windows specific for creating import library
+string(STRIP   "${DEFINITIONS_FLAGS}" DEFINITIONS_FLAGS)
+string(STRIP   "${C_FLAGS}"           C_FLAGS          )
+string(STRIP   "${CXX_FLAGS}"         CXX_FLAGS        )
+string(STRIP   "${ASM_FLAGS}"         ASM_FLAGS        )
+string(STRIP   "${LD_FLAGS}"          LD_FLAGS         )
+string(STRIP   "${LD_LIB_FLAGS}"      LD_LIB_FLAGS     )
+string(STRIP   "${AR_FLAGS}"          AR_FLAGS         ) # Windows specific for creating import library
+
+# Grab the Perl flags
+set_ev_flags(ev_flags) # expand-vars.pl flags
+set_gd_flags(gd_flags) # generate-def.pl flags (Windows only)
+set(oa_opts "--os=${real_os}" "--arch=${arch}") # sent to the perl scripts
+
+#########################################################
+# Getting correct source files (cmake/SourceFiles.cmake)
+set_c_files(lib_c_items)
+set_cpp_files(lib_cxx_items)
+set_asm_files(lib_asm_items)
+set_imp_c_files(imp_c_items) # Windows-specific
+
+###################################
+# Setting all source file variables
+set(lib_src_files "${lib_c_items}" "${lib_cxx_items}" "${lib_asm_items}")
+set(imp_src_files "${imp_c_items}")
+add_prefix("${src_dir}/" lib_src_files)
+add_prefix("${src_dir}/" imp_src_files) # Windows-specific
+add_prefix("${src_dir}/" lib_c_items  )
+add_prefix("${src_dir}/" lib_cxx_items)
+add_prefix("${src_dir}/" lib_asm_items)
+add_prefix("${src_dir}/" imp_c_items  ) # Windows-specific
+
+#####################################################################
+# Debug print outs.  Will print "variable = ${variable}" if GLOBAL_DEBUG == 1
+if(GLOBAL_DEBUG)
+    include(CMakePrintSystemInformation)
+endif()
+debug_say_var(CMAKE_ASM_COMPILE_OBJECT)
+debug_say_var(CMAKE_RC_COMPILER)
+debug_say_var(CMAKE_C_COMPILER_ID)
+debug_say_var(LIBOMP_WORK)
+debug_say_var(date)
+debug_say_var(stats)
+debug_say_var(lib_file)
+debug_say_var(export_lib_files)
+debug_say_var(DEFINITIONS_FLAGS)
+debug_say_var(C_FLAGS)
+debug_say_var(CXX_FLAGS)
+debug_say_var(ASM_FLAGS)
+debug_say_var(F_FLAGS)
+debug_say_var(LD_FLAGS)
+debug_say_var(LD_LIB_FLAGS)
+debug_say_var(AR_FLAGS)
+debug_say_var(ev_flags)
+debug_say_var(gd_flags)
+debug_say_var(oa_opts)
+debug_say_var(lib_c_items)
+debug_say_var(lib_cxx_items)
+debug_say_var(lib_asm_items)
+debug_say_var(imp_c_items)
+debug_say_var(lib_src_files)
+debug_say_var(imp_src_files)
+
+####################################################################
+#                     ---------------------                        #
+#                     --- Rules/Recipes ---                        #
+#                     ---------------------                        #
+####################################################################
+# Below, ${ldeps} always stands for "local dependencies" for the 
+# next immediate target to be created via add_custom_target() or 
+# add_custom_command()
+
+####################
+# --- Create all ---
+add_custom_target(lib ALL DEPENDS ${export_lib_files})
+add_custom_target(inc ALL DEPENDS ${export_inc_files})
+if(${create_fortran_modules})
+add_custom_target(mod ALL DEPENDS ${export_mod_files})
+endif()
+# --- Enforce the tests to be completed/skipped before copying to exports directory ---
+if(${tests})
+    if(${WINDOWS})
+        set(test-dependencies test-touch-mt/.success test-touch-md/.success test-relo/.success test-execstack/.success test-instr/.success test-deps/.success)
+    else()
+        set(test-dependencies test-touch-rt/.success test-relo/.success test-execstack/.success test-instr/.success test-deps/.success)
+    endif()
+    set_source_files_properties(${export_lib_files} PROPERTIES OBJECT_DEPENDS "${test-dependencies}")
+endif()
+
+#############################
+# --- Create Common Files ---
+add_custom_target(common DEPENDS ${export_cmn_files})
+add_custom_target(clean-common COMMAND ${CMAKE_COMMAND} -E remove -f ${export_cmn_files})
+
+##########################################
+# --- Copy files to export directories ---
+# - just a simple copy recipe which acts as an install step
+# - copies out of the src_dir into the dest_dir
+#
+# dest_dir/target : src_dir/target
+#    cp src_dir/target dest_dir/target
+macro (simple_copy_recipe target src_dir dest_dir)
+    get_source_file_property(extra_depends ${dest_dir}/${target} OBJECT_DEPENDS)
+    if("${extra_depends}" MATCHES "NOTFOUND")
+        set(extra_depends)
+    endif()
+    set(ldeps ${src_dir}/${target} "${extra_depends}")
+    if(NOT "${target}" STREQUAL "")
+        file(MAKE_DIRECTORY ${dest_dir}) # make sure destination directory exists
+        add_custom_command(
+            OUTPUT   ${dest_dir}/${target}
+            COMMAND  ${CMAKE_COMMAND} -E copy ${src_dir}/${target} ${dest_dir}/${target}
+            DEPENDS  ${ldeps}
+        )
+    endif()
+endmacro()
+# copy from build directory to final resting places in exports directory
+simple_copy_recipe("omp.h"             "${build_dir}"  "${export_cmn_dir}/include")
+simple_copy_recipe("omp_lib.h"         "${build_dir}"  "${export_cmn_dir}/include")
+simple_copy_recipe("omp_lib.f"         "${build_dir}"  "${export_cmn_dir}/include")
+simple_copy_recipe("omp_lib.f90"       "${build_dir}"  "${export_cmn_dir}/include")
+simple_copy_recipe("iomp.h"            "${build_dir}"  "${export_cmn_dir}/include_compat")
+simple_copy_recipe("${lib_file}"       "${build_dir}"  "${export_lib_dir}")
+simple_copy_recipe("${imp_file}"       "${build_dir}"  "${export_lib_dir}")
+simple_copy_recipe("${pdb_file}"       "${build_dir}"  "${export_lib_dir}")
+simple_copy_recipe("${dbg_file}"       "${build_dir}"  "${export_lib_dir}")
+simple_copy_recipe("omp_lib.mod"       "${build_dir}"  "${export_ptf_dir}/include")
+simple_copy_recipe("omp_lib_kinds.mod" "${build_dir}"  "${export_ptf_dir}/include")
+simple_copy_recipe("iomp_lib.h"        "${build_dir}"  "${export_ptf_dir}/include_compat")
+
+######################################################
+# --- Build the main library ---
+# $(lib_file) <== Main library file to create
+
+# 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(needed-headers DEPENDS ${build_dir}/kmp_i18n_id.inc ${build_dir}/kmp_i18n_default.inc ${build_dir}/omp.h)
+
+# For Windows, there is a definitions file (.def) and resource file (.res) created using generate-def.pl and rc.exe respectively.
+if(${WINDOWS})
+    add_custom_target(needed-windows-files DEPENDS ${build_dir}/${def_file} ${build_dir}/${rc_file})
+    list(APPEND lib_src_files ${build_dir}/${rc_file})
+    # The windows assembly files are in MASM format, and they require a tool that can handle MASM syntax (ml.exe or ml64.exe typically)
+    enable_language(ASM_MASM) 
+else()
+    # Unix assembly files can be handled by compiler.
+    enable_language(ASM)
+endif()
+
+# 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(${USE_PREDEFINED_LINKER_FLAGS})
+    set(CMAKE_C_IMPLICIT_LINK_LIBRARIES   "")
+    set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
+    set(CMAKE_ASM_IMPLICIT_LINK_LIBRARIES "")
+endif()
+
+# --- ${lib_file} rule ---
+add_library(iomp5 SHARED ${lib_src_files})
+set_target_properties(iomp5 PROPERTIES 
+    PREFIX "" SUFFIX ""          # Take control 
+    OUTPUT_NAME "${lib_file}"    # of output name
+    LINK_FLAGS  "${LD_FLAGS}"     
+    LINKER_LANGUAGE C            # use C Compiler for linking step
+    SKIP_BUILD_RPATH true        # have Mac linker -install_name just be "-install_name libiomp5.dylib"
+)
+# Target lib (export files) depend on the library (iomp5) being built
+add_dependencies(lib iomp5)
+
+# Linking command will include libraries in LD_LIB_FLAGS
+target_link_libraries(iomp5 ${LD_LIB_FLAGS})
+
+# Create *.inc and omp.h before compiling any sources
+add_dependencies(iomp5 needed-headers)
+if(${WINDOWS})
+# Create .def and .rc file before compiling any sources
+    add_dependencies(iomp5 needed-windows-files)
+endif()
+
+# Set the compiler flags for each type of source
+set_source_files_properties(${lib_c_items} 
+                            ${imp_c_items}   PROPERTIES COMPILE_FLAGS "${C_FLAGS}"  )
+set_source_files_properties(${lib_cxx_items} PROPERTIES COMPILE_FLAGS "${CXX_FLAGS}")
+set_source_files_properties(${lib_asm_items} PROPERTIES COMPILE_FLAGS "${ASM_FLAGS}")
+# Set the -D definitions for all sources
+add_definitions(${DEFINITIONS_FLAGS})
+
+# If creating a build that imitates build.pl's rules then set USE_BUILDPL_RULES to true
+if(${USE_BUILDPL_RULES})
+    include(BuildPLRules)
+endif()
+
+######################################################
+# --- Source file specific flags ---
+# kmp_version.o : -D _KMP_BUILD_TIME="\"$(date)}\""
+set_source_files_properties(${src_dir}/kmp_version.c  PROPERTIES COMPILE_DEFINITIONS "_KMP_BUILD_TIME=\"\\\"${date}\\\"\"")
+
+# z_Linux_asm.o : -D KMP_ARCH_*
+if(${ARM})
+    set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_ARM")
+elseif(${INTEL64})
+    set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_X86_64")
+elseif(${IA32})
+    set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_X86")
+elseif(${PPC64})
+	set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_PPC64")
+endif()
+
+if(${WINDOWS})
+    set_source_files_properties(${src_dir}/thirdparty/ittnotify/ittnotify_static.c PROPERTIES COMPILE_DEFINITIONS "UNICODE")
+endif()
+
+######################################################
+# MAC specific build rules
+if(${MAC})
+    # fat library rules
+    if(${INTEL64})
+        _export_lib_fat_dir( "mac_32e" export_fat_mac_32e)
+        _export_lib_dir(     "mac_32"  export_mac_32     )
+        _export_lib_dir(     "mac_32e" export_mac_32e    )
+        file(MAKE_DIRECTORY ${export_fat_mac_32e})
+        add_custom_target(fat
+            COMMAND ${CMAKE_COMMAND} -E echo Building 32 and 32e fat libraries from ${export_mac_32}/${lib_file} and ${export_mac_32e}/${lib_file}
+            COMMAND ${CMAKE_COMMAND} -E echo Will put fat library in ${export_fat_mac_32e} directory
+            COMMAND lipo -create -output ${export_fat_mac_32e}/${lib_file} ${export_mac_32}/${lib_file} ${export_mac_32e}/${lib_file}
+        )
+    endif()
+endif()
+
+######################################################
+# Windows specific build rules
+if(${WINDOWS})
+
+    # --- Create $(imp_file) ---
+    # This file is first created in the unstripped/${lib_file} creation step.
+    # It is then "re-linked" to include kmp_import.c which prevents linking of both Visual Studio OpenMP and newly built OpenMP
+    if(NOT "${imp_file}" STREQUAL "")
+        set(generated_import_file ${lib_file}${lib})
+        add_library(iomp5imp STATIC ${generated_import_file} ${imp_src_files})
+        set_source_files_properties(${generated_import_file} PROPERTIES GENERATED TRUE EXTERNAL_OBJECT TRUE)
+        set_target_properties(iomp5imp PROPERTIES
+            PREFIX "" SUFFIX ""
+            OUTPUT_NAME "${imp_file}"
+            STATIC_LIBRARY_FLAGS "${AR_FLAGS}"
+            LINKER_LANGUAGE C
+            SKIP_BUILD_RPATH true
+        )
+        add_custom_command(TARGET iomp5imp PRE_BUILD COMMAND ${CMAKE_COMMAND} -E remove -f ${imp_file})
+        add_dependencies(iomp5imp iomp5)
+    endif()
+
+    # --- Create $(def_file) ---
+    if(NOT "${def_file}" STREQUAL "")
+        string_to_list("${gd_flags}" gd_flags)
+        add_custom_command(
+            OUTPUT  ${def_file}
+            COMMAND ${PERL_EXECUTABLE} ${tools_dir}/generate-def.pl ${gd_flags} -o ${def_file} ${src_dir}/dllexports
+            DEPENDS ${src_dir}/dllexports ${tools_dir}/generate-def.pl
+        )
+    endif()
+
+    # --- Create $(rc_file) ---
+    if(NOT "${rc_file}" STREQUAL "")
+        add_custom_command(
+            OUTPUT  ${rc_file}
+            COMMAND ${CMAKE_COMMAND} -E copy libiomp.rc ${rc_file}
+            DEPENDS libiomp.rc
+        )
+    endif()
+endif()
+
+######################################################
+# kmp_i18n_id.inc and kmp_i18n_default.inc
+set(perlcmd "${PERL_EXECUTABLE}" "${tools_dir}/message-converter.pl" "${oa_opts}" "--prefix=kmp_i18n" "--enum=kmp_i18n_id.inc" "${src_dir}/i18n/en_US.txt")
+add_custom_command(
+    OUTPUT  ${build_dir}/kmp_i18n_id.inc
+    COMMAND ${perlcmd}
+    DEPENDS ${src_dir}/i18n/en_US.txt ${tools_dir}/message-converter.pl
+)
+set(perlcmd "${PERL_EXECUTABLE}" "${tools_dir}/message-converter.pl" "${oa_opts}" "--prefix=kmp_i18n" "--default=kmp_i18n_default.inc" "${src_dir}/i18n/en_US.txt")
+add_custom_command(
+    OUTPUT  ${build_dir}/kmp_i18n_default.inc
+    COMMAND ${perlcmd}
+    DEPENDS ${src_dir}/i18n/en_US.txt ${tools_dir}/message-converter.pl
+)
+
+######################################################
+# Micro test rules for after library has been built (cmake/MicroTests.cmake)
+# - Only perform if ${tests} == true (specify when invoking: cmake -Dtests=on ...)
+if(${tests})
+    include(MicroTests)
+endif()
+
+######################################################
+# --- Create Fortran Files ---
+# omp_lib.mod
+if(${create_fortran_modules})
+    # Grab fortran-compiler-dependent flags
+    # Cmake will look for cmake/${CMAKE_Fortran_COMPILER_ID}/FortranFlags.cmake to append additional fortran flags.
+    enable_language(Fortran)
+    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CMAKE_Fortran_COMPILER_ID} ${CMAKE_MODULE_PATH})
+    find_file(fortran_specific_include_file_found FortranFlags.cmake ${CMAKE_MODULE_PATH})
+    if(fortran_specific_include_file_found)
+        include(FortranFlags)
+        append_fortran_compiler_specific_fort_flags(F_FLAGS)
+    else()
+        warning_say("Could not find cmake/${CMAKE_Fortran_COMPILER_ID}/FortranFlags.cmake: will only use default flags in CommonFlags.cmake")
+    endif()
+    set(omp_lib_f "omp_lib.f90" )
+    add_custom_command(
+        OUTPUT "omp_lib.mod"
+        COMMAND ${CMAKE_Fortran_COMPILER} -c ${F_FLAGS} ${omp_lib_f}
+        DEPENDS ${omp_lib_f}
+    )
+    add_custom_command(
+        OUTPUT "omp_lib_kinds.mod"
+        COMMAND ${CMAKE_Fortran_COMPILER} -c ${F_FLAGS} ${omp_lib_f}
+        DEPENDS ${omp_lib_f}
+    )
+    # clean omp_lib.o from build directory when "make clean" 
+    set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES omp_lib${obj})
+endif()
+
+###############################################################
+# --- Using expand-vars.pl to generate files ---
+# - 'file' is generated using expand-vars.pl and 'file'.var
+# - Any .h .f .f90 .rc files should be created with this recipe
+macro(expand_vars_recipe filename)
+    get_source_file_property(extra_ev_flags ${filename} COMPILE_DEFINITIONS)
+    if("${extra_ev_flags}" MATCHES "NOTFOUND")
+        set(extra_ev_flags)
+    else()
+        string_to_list("${extra_ev_flags}" extra_ev_flags)
+    endif()
+    find_file(${filename}_path ${filename}.var PATHS ${src_dir}/include/${omp_version} ${src_dir})
+    set(ldeps "${${filename}_path}" "${src_dir}/kmp_version.c" "${tools_dir}/expand-vars.pl")
+    set(expandvarscmd ${PERL_EXECUTABLE} ${tools_dir}/expand-vars.pl --strict ${ev_flags} ${extra_ev_flags} ${${filename}_path} ${filename})
+    if(NOT "${filename}" STREQUAL "")
+        add_custom_command(
+            OUTPUT  ${filename}
+            COMMAND ${expandvarscmd}
+            DEPENDS ${ldeps}
+        )
+    endif()
+endmacro()
+string_to_list("${ev_flags}" ev_flags)
+# omp_lib.h  : ev-flags += -D KMP_INT_PTR_KIND="int_ptr_kind()"
+set_source_files_properties(omp_lib.h PROPERTIES COMPILE_DEFINITIONS "-D KMP_INT_PTR_KIND=\"int_ptr_kind()\"") 
+# iomp_lib.h : ev-flags += -D KMP_INT_PTR_KIND=$(if $(filter 32,$(arch)),4,8)
+if(${IA32}) # 32 bit archs
+    set_source_files_properties(iomp_lib.h PROPERTIES COMPILE_DEFINITIONS "-D KMP_INT_PTR_KIND=4") 
+else()
+    set_source_files_properties(iomp_lib.h PROPERTIES COMPILE_DEFINITIONS "-D KMP_INT_PTR_KIND=8") 
+endif()
+# libiomp.rc : ev-flags += -D KMP_FILE=$(lib_file)
+set_source_files_properties(libiomp.rc PROPERTIES COMPILE_DEFINITIONS "-D KMP_FILE=${lib_file}") 
+expand_vars_recipe(omp.h)
+expand_vars_recipe(omp_lib.h)
+expand_vars_recipe(omp_lib.f)
+expand_vars_recipe(omp_lib.f90)
+expand_vars_recipe(iomp.h)
+expand_vars_recipe(iomp_lib.h)
+expand_vars_recipe(libiomp.rc)
+
+
+####################################################################
+# Print configuration after all variables are set.
+say("")
+say("----------------------- CONFIGURATION -----------------------")
+say("Operating System   : ${os}")
+say("Architecture       : ${arch}")
+say("Build Type         : ${CMAKE_BUILD_TYPE}")
+say("OpenMP Version     : ${omp_version}")
+say("Lib Type           : ${lib_type}")
+if(${MIC})
+    say("Intel(R) MIC Architecture    : ${mic_arch}")
+    say("Intel(R) MIC Architecture OS : ${mic_os}")
+endif()
+say("Fortran Modules    : ${create_fortran_modules}")
+# will say development if all zeros
+if("${build_number}" STREQUAL "00000000")
+    set(build "development")
+else()
+    set(build "${build_number}")
+endif()
+say("Build              : ${build}")
+say("Stats-Gathering    : ${stats}")
+say("Use build.pl rules : ${USE_BUILDPL_RULES}")
+say("Adaptive locks     : ${USE_ADAPTIVE_LOCKS}")
+say("Use predefined linker flags      : ${USE_PREDEFINED_LINKER_FLAGS}")
+say("Compiler supports quad precision : ${COMPILER_SUPPORTS_QUAD_PRECISION}")
+say("-------------------------------------------------------------")
+say("")
 
-add_subdirectory(src)

Modified: openmp/branches/release_35/runtime/src/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/CMakeLists.txt?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/CMakeLists.txt (original)
+++ openmp/branches/release_35/runtime/src/CMakeLists.txt Thu Aug  7 06:16:59 2014
@@ -22,11 +22,17 @@ else()
   message(FATAL_ERROR "Unsupported OS")
 endif()
 
-if("${ARCH}" STREQUAL "")
+if(arch)	
+	set(ARCH ${arch}) #acquire from command line
+else() #assume default
   set(ARCH "32e")
 endif()
 
-set(ARCH_STR "Intel(R) 64")
+if("${arch}" STREQUAL "32e")
+  set(ARCH_STR "Intel(R) 64")
+elseif("${arch}" STREQUAL "ppc64")
+  set(ARCH_STR "PPC64")
+endif()
 
 set(FEATURE_FLAGS "-D USE_ITT_BUILD")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D NDEBUG")
@@ -36,13 +42,22 @@ set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ASSERT")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_I8")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_TV")
+
 if(APPLE)
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -current_version 5.0")
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -compatibility_version 5.0")
 endif()
+
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_LIBRARY_FILE=\\\"libiomp5.${OMP_SHLIBEXT}\\\"")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_VERSION_MAJOR=${VERSION}")
-set(FEATURE_FLAGS "${FEATURE_FLAGS} -D CACHE_LINE=64")
+
+# customize cache line size for ppc64 to 128 bytes: 64 in all other cases
+if("${arch}" STREQUAL "ppc64")
+	set(FEATURE_FLAGS "${FEATURE_FLAGS} -D CACHE_LINE=128")
+else()
+	set(FEATURE_FLAGS "${FEATURE_FLAGS} -D CACHE_LINE=64")	
+endif()
+
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ADJUST_BLOCKTIME=1")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_PARALLEL_ORDERED")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ASM_INTRINS")
@@ -50,8 +65,13 @@ set(FEATURE_FLAGS "${FEATURE_FLAGS} -D U
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_CBLKDATA")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D GUIDEDLL_EXPORTS")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_GOMP_COMPAT")
-set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ADAPTIVE_LOCKS=1")
-set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_DEBUG_ADAPTIVE_LOCKS=0")
+
+#adaptive locks use x86 assembly - disable for ppc64
+if("${arch}" STREQUAL "32e" OR "${arch}" STREQUAL "32" OR "${arch}" STREQUAL "arm")
+	set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ADAPTIVE_LOCKS=1")
+	set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_DEBUG_ADAPTIVE_LOCKS=0")
+endif()
+
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_50_ENABLED=0")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_41_ENABLED=0")
 set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_40_ENABLED=1")
@@ -122,16 +142,38 @@ add_custom_command(
   OUTPUT omp.h
     COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/../tools/expand-vars.pl --strict -D Revision=\"\\$$Revision\" -D Date=\"\\$$Date\" -D KMP_TYPE=\"Performance\" -D KMP_ARCH=\"\\\"${ARCH_STR}\\\"\" -D KMP_VERSION_MAJOR=${VERSION} -D KMP_VERSION_MINOR=0 -D KMP_VERSION_BUILD=00000000 -D KMP_BUILD_DATE=\"${BUILD_TIME} UTC\" -D KMP_TARGET_COMPILER=12 -D KMP_DIAG=0 -D KMP_DEBUG_INFO=0 -D OMP_VERSION=${OMP_VERSION} ${CMAKE_CURRENT_SOURCE_DIR}/include/${OMP_VERSION_NUM}/omp.h.var omp.h
 )
-add_custom_command(
-  OUTPUT z_Linux_asm.o
-    COMMAND ${CMAKE_CXX_COMPILER} -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D KMP_ARCH_X86_64 -x assembler-with-cpp ${CMAKE_CURRENT_SOURCE_DIR}/${ASM_SOURCES}
-)
+
+if("${ARCH}" STREQUAL "ppc64")
+	add_custom_command(
+		OUTPUT z_Linux_asm.o
+    		       COMMAND ${CMAKE_CXX_COMPILER} -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D KMP_ARCH_PPC64 -x assembler-with-cpp ${CMAKE_CURRENT_SOURCE_DIR}/${ASM_SOURCES}
+		       )
+else()
+	add_custom_command(
+		OUTPUT z_Linux_asm.o
+    		       COMMAND ${CMAKE_CXX_COMPILER} -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D KMP_ARCH_X86_64 -x assembler-with-cpp ${CMAKE_CURRENT_SOURCE_DIR}/${ASM_SOURCES}
+		       )
+endif()
+
 
 add_custom_target(gen_kmp_i18n DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc omp.h z_Linux_asm.o)
 
 if(NOT APPLE)
-  set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports_so.txt")
+	if(${ARCH} STREQUAL "ppc64" AND ${OS_GEN} STREQUAL "lin")
+  		set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports_so.txt -ldl")
+ 	else()
+   		set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports_so.txt")
+	endif()
 endif()
 
 add_library(iomp5 SHARED ${SOURCES} z_Linux_asm.o)
+
+# This is a workaround to a known ppc64 issue about libpthread. For more
+# information see
+# http://ryanarn.blogspot.com/2011/07/curious-case-of-pthreadatfork-on.html
+if("${ARCH}" STREQUAL "ppc64")
+	      find_library(PTHREAD NAMES pthread)
+	      target_link_libraries(iomp5 ${PTHREAD})
+endif()
+
 add_dependencies(iomp5 gen_kmp_i18n)

Modified: openmp/branches/release_35/runtime/src/dllexports
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/dllexports?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/dllexports (original)
+++ openmp/branches/release_35/runtime/src/dllexports Thu Aug  7 06:16:59 2014
@@ -471,7 +471,9 @@ kmp_set_warnings_off
 
     # ATOMIC entries
 
+    %ifdef HAVE_QUAD
     __kmpc_atomic_cmplx16_div              2000
+    %endif
 
     __kmpc_atomic_fixed1_add               2001
     __kmpc_atomic_fixed1_andb              2002
@@ -577,6 +579,7 @@ kmp_set_warnings_off
     __kmpc_atomic_cmplx10_sub              2094
     __kmpc_atomic_cmplx10_mul              2095
     __kmpc_atomic_cmplx10_div              2096
+    %ifdef HAVE_QUAD
     __kmpc_atomic_cmplx16_add              2097
     __kmpc_atomic_cmplx16_sub              2098
     __kmpc_atomic_cmplx16_mul              2099
@@ -627,6 +630,7 @@ kmp_set_warnings_off
     __kmpc_atomic_float10_sub_fp           2136
     __kmpc_atomic_float10_mul_fp           2137
     __kmpc_atomic_float10_div_fp           2138
+    %endif
 
     __kmpc_atomic_fixed1_mul_float8        2169
     __kmpc_atomic_fixed1_div_float8        2170
@@ -661,6 +665,7 @@ kmp_set_warnings_off
 
     %ifdef arch_32
 
+        %ifdef HAVE_QUAD
         __kmpc_atomic_float16_add_a16      2255
         __kmpc_atomic_float16_sub_a16      2256
         __kmpc_atomic_float16_mul_a16      2257
@@ -672,6 +677,7 @@ kmp_set_warnings_off
         __kmpc_atomic_cmplx16_sub_a16      2262
         __kmpc_atomic_cmplx16_mul_a16      2263
         __kmpc_atomic_cmplx16_div_a16      2264
+        %endif
 
     %endif
 
@@ -686,14 +692,18 @@ kmp_set_warnings_off
         __kmpc_atomic_float4_rd                2269
         __kmpc_atomic_float8_rd                2270
         __kmpc_atomic_float10_rd               2271
+        %ifdef HAVE_QUAD
         __kmpc_atomic_float16_rd               2272
+        %endif
         __kmpc_atomic_cmplx4_rd                2273
         __kmpc_atomic_cmplx8_rd                2274
         __kmpc_atomic_cmplx10_rd               2275
+        %ifdef HAVE_QUAD
         __kmpc_atomic_cmplx16_rd               2276
-        %ifdef arch_32
-            __kmpc_atomic_float16_a16_rd       2277
-            __kmpc_atomic_cmplx16_a16_rd       2278
+            %ifdef arch_32
+                __kmpc_atomic_float16_a16_rd       2277
+                __kmpc_atomic_cmplx16_a16_rd       2278
+            %endif
         %endif
         __kmpc_atomic_fixed1_wr                2279
         __kmpc_atomic_fixed2_wr                2280
@@ -702,15 +712,19 @@ kmp_set_warnings_off
         __kmpc_atomic_float4_wr                2283
         __kmpc_atomic_float8_wr                2284
         __kmpc_atomic_float10_wr               2285
+        %ifdef HAVE_QUAD
         __kmpc_atomic_float16_wr               2286
+        %endif
         __kmpc_atomic_cmplx4_wr                2287
         __kmpc_atomic_cmplx8_wr                2288
         __kmpc_atomic_cmplx10_wr               2289
+        %ifdef HAVE_QUAD
         __kmpc_atomic_cmplx16_wr               2290
         %ifdef arch_32
             __kmpc_atomic_float16_a16_wr       2291
             __kmpc_atomic_cmplx16_a16_wr       2292
         %endif
+        %endif
         __kmpc_atomic_fixed1_add_cpt           2293
         __kmpc_atomic_fixed1_andb_cpt          2294
         __kmpc_atomic_fixed1_div_cpt           2295
@@ -783,8 +797,10 @@ kmp_set_warnings_off
         __kmpc_atomic_float4_min_cpt           2362
         __kmpc_atomic_float8_max_cpt           2363
         __kmpc_atomic_float8_min_cpt           2364
+        %ifdef HAVE_QUAD
         __kmpc_atomic_float16_max_cpt          2365
         __kmpc_atomic_float16_min_cpt          2366
+        %endif
         __kmpc_atomic_fixed1_neqv_cpt          2367
         __kmpc_atomic_fixed2_neqv_cpt          2368
         __kmpc_atomic_fixed4_neqv_cpt          2369
@@ -797,10 +813,12 @@ kmp_set_warnings_off
         __kmpc_atomic_float10_sub_cpt          2376
         __kmpc_atomic_float10_mul_cpt          2377
         __kmpc_atomic_float10_div_cpt          2378
+        %ifdef HAVE_QUAD
         __kmpc_atomic_float16_add_cpt          2379
         __kmpc_atomic_float16_sub_cpt          2380
         __kmpc_atomic_float16_mul_cpt          2381
         __kmpc_atomic_float16_div_cpt          2382
+        %endif
         __kmpc_atomic_cmplx4_add_cpt           2383
         __kmpc_atomic_cmplx4_sub_cpt           2384
         __kmpc_atomic_cmplx4_mul_cpt           2385
@@ -813,13 +831,16 @@ kmp_set_warnings_off
         __kmpc_atomic_cmplx10_sub_cpt          2392
         __kmpc_atomic_cmplx10_mul_cpt          2393
         __kmpc_atomic_cmplx10_div_cpt          2394
+        %ifdef HAVE_QUAD
         __kmpc_atomic_cmplx16_add_cpt          2395
         __kmpc_atomic_cmplx16_sub_cpt          2396
         __kmpc_atomic_cmplx16_mul_cpt          2397
         __kmpc_atomic_cmplx16_div_cpt          2398
+        %endif
        #__kmpc_atomic_cmplx4_add_cpt_tmp            2409
 
         %ifdef arch_32
+        %ifdef HAVE_QUAD
             __kmpc_atomic_float16_add_a16_cpt  2399
             __kmpc_atomic_float16_sub_a16_cpt  2400
             __kmpc_atomic_float16_mul_a16_cpt  2401
@@ -831,6 +852,7 @@ kmp_set_warnings_off
             __kmpc_atomic_cmplx16_mul_a16_cpt  2407
             __kmpc_atomic_cmplx16_div_a16_cpt  2408
         %endif
+        %endif
 
         __kmpc_atomic_start                    2410
         __kmpc_atomic_end                      2411
@@ -846,16 +868,20 @@ kmp_set_warnings_off
             __kmpc_atomic_float4_swp           2416
             __kmpc_atomic_float8_swp           2417
             __kmpc_atomic_float10_swp          2418
+            %ifdef HAVE_QUAD
               __kmpc_atomic_float16_swp        2419
+            %endif
             __kmpc_atomic_cmplx4_swp           2420
             __kmpc_atomic_cmplx8_swp           2421
             __kmpc_atomic_cmplx10_swp          2422
+            %ifdef HAVE_QUAD
             __kmpc_atomic_cmplx16_swp          2423
 
             %ifdef arch_32
                 __kmpc_atomic_float16_a16_swp  2424
                 __kmpc_atomic_cmplx16_a16_swp  2425
             %endif
+            %endif
 
             __kmpc_atomic_fixed1_sub_cpt_rev   2426
             __kmpc_atomic_fixed1_div_cpt_rev   2427
@@ -887,14 +913,17 @@ kmp_set_warnings_off
             __kmpc_atomic_float8_div_cpt_rev   2453
             __kmpc_atomic_float10_sub_cpt_rev  2454
             __kmpc_atomic_float10_div_cpt_rev  2455
+            %ifdef HAVE_QUAD
             __kmpc_atomic_float16_sub_cpt_rev  2456
             __kmpc_atomic_float16_div_cpt_rev  2457
+            %endif
             __kmpc_atomic_cmplx4_sub_cpt_rev   2458
             __kmpc_atomic_cmplx4_div_cpt_rev   2459
             __kmpc_atomic_cmplx8_sub_cpt_rev   2460
             __kmpc_atomic_cmplx8_div_cpt_rev   2461
             __kmpc_atomic_cmplx10_sub_cpt_rev  2462
             __kmpc_atomic_cmplx10_div_cpt_rev  2463
+            %ifdef HAVE_QUAD
             __kmpc_atomic_cmplx16_sub_cpt_rev  2464
             __kmpc_atomic_cmplx16_div_cpt_rev  2465
 
@@ -904,6 +933,7 @@ kmp_set_warnings_off
                 __kmpc_atomic_cmplx16_sub_a16_cpt_rev  2468
                 __kmpc_atomic_cmplx16_div_a16_cpt_rev  2469
             %endif
+            %endif
 
         %endif   # OMP_40
 

Modified: openmp/branches/release_35/runtime/src/kmp.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp.h (original)
+++ openmp/branches/release_35/runtime/src/kmp.h Thu Aug  7 06:16:59 2014
@@ -459,9 +459,9 @@ typedef int PACKED_REDUCTION_METHOD_T;
 /*
  * Only Linux* OS and Windows* OS support thread affinity.
  */
-#if KMP_OS_LINUX || KMP_OS_WINDOWS
+#if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64
 # define KMP_AFFINITY_SUPPORTED 1
-#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
+#elif KMP_OS_DARWIN || KMP_OS_FREEBSD || KMP_OS_CNK || KMP_ARCH_PPC64
 // affinity not supported
 # define KMP_AFFINITY_SUPPORTED 0
 #else
@@ -476,7 +476,7 @@ extern size_t __kmp_affin_mask_size;
 
 # if KMP_OS_LINUX
 //
-// On Linux* OS, the mask isactually a vector of length __kmp_affin_mask_size
+// 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.
 //
 // WARNING!!!  We have made the base type of the affinity mask unsigned char,
@@ -946,6 +946,9 @@ extern unsigned int __kmp_place_core_off
 #if KMP_OS_WINDOWS
 #  define KMP_INIT_WAIT    64U          /* initial number of spin-tests   */
 #  define KMP_NEXT_WAIT    32U          /* susequent number of spin-tests */
+#elif KMP_OS_CNK
+#  define KMP_INIT_WAIT    16U          /* initial number of spin-tests   */
+#  define KMP_NEXT_WAIT     8U          /* susequent number of spin-tests */
 #elif KMP_OS_LINUX
 #  define KMP_INIT_WAIT  1024U          /* initial number of spin-tests   */
 #  define KMP_NEXT_WAIT   512U          /* susequent number of spin-tests */
@@ -971,6 +974,11 @@ extern void __kmp_x86_cpuid( int mode, i
   extern void __kmp_x86_pause( void );
 # endif
 # define KMP_CPU_PAUSE()        __kmp_x86_pause()
+#elif KMP_ARCH_PPC64
+# define KMP_PPC64_PRI_LOW() __asm__ volatile ("or 1, 1, 1")
+# 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)
 #else
 # define KMP_CPU_PAUSE()        /* nothing to do */
 #endif

Modified: openmp/branches/release_35/runtime/src/kmp_csupport.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_csupport.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_csupport.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_csupport.c Thu Aug  7 06:16:59 2014
@@ -828,7 +828,7 @@ __kmpc_flush(ident_t *loc, ...)
                 if ( ! __kmp_cpuinfo.sse2 ) {
                     // CPU cannot execute SSE2 instructions.
                 } else {
-                    #if KMP_COMPILER_ICC
+                    #if KMP_COMPILER_ICC || KMP_COMPILER_MSVC
                     _mm_mfence();
                     #else
                     __sync_synchronize();
@@ -837,6 +837,19 @@ __kmpc_flush(ident_t *loc, ...)
             #endif // KMP_MIC
         #elif KMP_ARCH_ARM
             // Nothing yet
+	     #elif KMP_ARCH_PPC64
+            // Nothing needed here (we have a real MB above).
+            #if KMP_OS_CNK
+	     	 // The flushing thread needs to yield here; this prevents a
+		    // busy-waiting thread from saturating the pipeline. flush is
+		       // often used in loops like this:
+                // while (!flag) {
+                //   #pragma omp flush(flag)
+                // }
+		    // and adding the yield here is good for at least a 10x speedup
+		       // when running >2 threads per core (on the NAS LU benchmark).
+                __kmp_yield(TRUE);
+            #endif
         #else
             #error Unknown or unsupported architecture
         #endif

Modified: openmp/branches/release_35/runtime/src/kmp_ftn_entry.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_ftn_entry.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_ftn_entry.h (original)
+++ openmp/branches/release_35/runtime/src/kmp_ftn_entry.h Thu Aug  7 06:16:59 2014
@@ -263,7 +263,7 @@ FTN_GET_AFFINITY_MAX_PROC( void )
 
     #if KMP_OS_WINDOWS && KMP_ARCH_X86_64
         if ( __kmp_num_proc_groups <= 1 ) {
-            return KMP_CPU_SETSIZE;
+            return (int)KMP_CPU_SETSIZE;
         }
     #endif /* KMP_OS_WINDOWS && KMP_ARCH_X86_64 */
         return __kmp_xproc;
@@ -412,7 +412,7 @@ xexpand(FTN_GET_THREAD_NUM)( void )
             gtid = __kmp_entry_gtid();
         #elif KMP_OS_WINDOWS
             if (!__kmp_init_parallel ||
-                (gtid = ((kmp_intptr_t)TlsGetValue( __kmp_gtid_threadprivate_key ))) == 0) {
+                (gtid = (int)((kmp_intptr_t)TlsGetValue( __kmp_gtid_threadprivate_key ))) == 0) {
                 // Either library isn't initialized or thread is not registered
                 // 0 is the correct TID in this case
                 return 0;
@@ -463,7 +463,6 @@ xexpand(FTN_GET_NUM_PROCS)( void )
     #ifdef KMP_STUB
         return 1;
     #else
-        int gtid;
         if ( ! TCR_4(__kmp_init_middle) ) {
             __kmp_middle_initialize();
         }
@@ -1013,7 +1012,7 @@ FTN_SET_DEFAULTS( char const * str
 {
     #ifndef KMP_STUB
         #ifdef PASS_ARGS_BY_VALUE
-            int len = strlen( str );
+            int len = (int)strlen( str );
         #endif
         __kmp_aux_set_defaults( str, len );
     #endif

Modified: openmp/branches/release_35/runtime/src/kmp_ftn_os.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_ftn_os.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_ftn_os.h (original)
+++ openmp/branches/release_35/runtime/src/kmp_ftn_os.h Thu Aug  7 06:16:59 2014
@@ -478,7 +478,7 @@
 //#define KMP_API_NAME_GOMP_TARGET_UPDATE                GOMP_target_update
 #define KMP_API_NAME_GOMP_TEAMS                          GOMP_teams
 
-#if KMP_OS_LINUX
+#if KMP_OS_LINUX && !KMP_OS_CNK && !KMP_ARCH_PPC64
     #define xstr(x) str(x) 
     #define str(x) #x
 

Modified: openmp/branches/release_35/runtime/src/kmp_global.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_global.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_global.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_global.c Thu Aug  7 06:16:59 2014
@@ -321,7 +321,11 @@ int        __kmp_env_consistency_check
 kmp_uint32 __kmp_yield_init = KMP_INIT_WAIT;
 kmp_uint32 __kmp_yield_next = KMP_NEXT_WAIT;
 kmp_uint32 __kmp_yielding_on = 1;
+#if KMP_OS_CNK
+kmp_uint32 __kmp_yield_cycle = 0;
+#else
 kmp_uint32 __kmp_yield_cycle = 1;     /* Yield-cycle is on by default */
+#endif
 kmp_int32  __kmp_yield_on_count = 10; /* By default, yielding is on for 10 monitor periods. */
 kmp_int32  __kmp_yield_off_count = 1; /* By default, yielding is off for 1 monitor periods. */
 /* ----------------------------------------------------- */

Modified: openmp/branches/release_35/runtime/src/kmp_gsupport.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_gsupport.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_gsupport.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_gsupport.c Thu Aug  7 06:16:59 2014
@@ -15,7 +15,7 @@
 //===----------------------------------------------------------------------===//
 
 
-#if defined(__x86_64)
+#if defined(__x86_64) || defined (__powerpc64__)
 # define KMP_I8
 #endif
 #include "kmp.h"

Modified: openmp/branches/release_35/runtime/src/kmp_lock.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_lock.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_lock.h (original)
+++ openmp/branches/release_35/runtime/src/kmp_lock.h Thu Aug  7 06:16:59 2014
@@ -518,7 +518,7 @@ __kmp_destroy_bootstrap_lock( kmp_bootst
 // Internal RTL locks are also implemented as ticket locks, for now.
 //
 // FIXME - We should go through and figure out which lock kind works best for
-// each internal lock, and use the type deeclaration and function calls for
+// each internal lock, and use the type declaration and function calls for
 // that explicit lock kind (and get rid of this section).
 //
 

Modified: openmp/branches/release_35/runtime/src/kmp_os.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_os.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_os.h (original)
+++ openmp/branches/release_35/runtime/src/kmp_os.h Thu Aug  7 06:16:59 2014
@@ -46,6 +46,7 @@
 #define KMP_COMPILER_ICC 0
 #define KMP_COMPILER_GCC 0
 #define KMP_COMPILER_CLANG 0
+#define KMP_COMPILER_MSVC 0
 
 #if defined( __INTEL_COMPILER )
 # undef KMP_COMPILER_ICC
@@ -56,6 +57,9 @@
 #elif defined( __GNUC__ )
 # undef KMP_COMPILER_GCC
 # define KMP_COMPILER_GCC 1
+#elif defined( _MSC_VER )
+# undef KMP_COMPILER_MSVC
+# define KMP_COMPILER_MSVC 1
 #else
 # error Unknown compiler
 #endif
@@ -66,10 +70,12 @@
 #define KMP_OS_FREEBSD  0
 #define KMP_OS_DARWIN   0
 #define KMP_OS_WINDOWS    0
+#define KMP_OS_CNK      0
 #define KMP_OS_UNIX     0  /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
 
 #define KMP_ARCH_X86        0
 #define KMP_ARCH_X86_64	    0
+#define KMP_ARCH_PPC64      0
 
 #ifdef _WIN32
 # undef KMP_OS_WINDOWS
@@ -81,9 +87,14 @@
 # define KMP_OS_DARWIN 1
 #endif
 
+// in some ppc64 linux installations, only the second condition is met
 #if ( defined __linux )
 # undef KMP_OS_LINUX
 # define KMP_OS_LINUX 1
+#elif ( defined __linux__)
+# undef KMP_OS_LINUX
+# define KMP_OS_LINUX 1
+#else
 #endif
 
 #if ( defined __FreeBSD__ )
@@ -91,6 +102,11 @@
 # define KMP_OS_FREEBSD 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)
 # error Unknown OS
 #endif
@@ -117,6 +133,9 @@
 # elif defined __i386
 #  undef KMP_ARCH_X86
 #  define KMP_ARCH_X86 1
+# elif defined __powerpc64__
+#  undef KMP_ARCH_PPC64
+#  define KMP_ARCH_PPC64 1
 # endif
 #endif
 
@@ -156,7 +175,7 @@
 # define KMP_ARCH_ARM 1
 #endif
 
-#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM)
+#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64)
 # error Unknown or unsupported architecture
 #endif
 
@@ -175,6 +194,8 @@
    typedef __float128 _Quad;
 #  undef  KMP_HAVE_QUAD
 #  define KMP_HAVE_QUAD 1
+# elif KMP_COMPILER_MSVC
+   typedef long double _Quad;
 # endif
 #else
 # if __LDBL_MAX_EXP__ >= 16384 && KMP_COMPILER_GCC
@@ -232,7 +253,7 @@
 
 #if KMP_ARCH_X86 || KMP_ARCH_ARM
 # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
-#elif KMP_ARCH_X86_64
+#elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64
 # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
 #else
 # error "Can't determine size_t printf format specifier."
@@ -657,6 +678,10 @@ extern kmp_real64 __kmp_test_then_add_re
 # endif
 #endif /* KMP_OS_WINDOWS */
 
+#if KMP_ARCH_PPC64
+# define KMP_MB()       __sync_synchronize()
+#endif
+
 #ifndef KMP_MB
 # define KMP_MB()       /* nothing to do */
 #endif
@@ -763,7 +788,7 @@ typedef void    (*microtask_t)( int *gti
 #endif /* KMP_I8 */
 
 /* Workaround for Intel(R) 64 code gen bug when taking address of static array (Intel(R) 64 Tracker #138) */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
+#if (KMP_ARCH_X86_64 || KMP_ARCH_PPC64) && KMP_OS_LINUX
 # define STATIC_EFI2_WORKAROUND
 #else
 # define STATIC_EFI2_WORKAROUND static

Modified: openmp/branches/release_35/runtime/src/kmp_runtime.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_runtime.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_runtime.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_runtime.c Thu Aug  7 06:16:59 2014
@@ -8450,7 +8450,7 @@ __kmp_determine_reduction_method( ident_
         int atomic_available = FAST_REDUCTION_ATOMIC_METHOD_GENERATED;
         int tree_available   = FAST_REDUCTION_TREE_METHOD_GENERATED;
 
-        #if KMP_ARCH_X86_64
+        #if KMP_ARCH_X86_64 || KMP_ARCH_PPC64
 
             #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
                 #if KMP_MIC

Modified: openmp/branches/release_35/runtime/src/kmp_settings.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_settings.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_settings.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_settings.c Thu Aug  7 06:16:59 2014
@@ -536,6 +536,7 @@ __kmp_stg_parse_file(
 
 static char * par_range_to_print = NULL;
 
+#ifdef KMP_DEBUG
 static void
 __kmp_stg_parse_par_range(
     char const * name,
@@ -614,7 +615,7 @@ __kmp_stg_parse_par_range(
         break;
     }
 } // __kmp_stg_parse_par_range
-
+#endif
 
 int
 __kmp_initial_threads_capacity( int req_nproc )

Modified: openmp/branches/release_35/runtime/src/kmp_str.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_str.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_str.h (original)
+++ openmp/branches/release_35/runtime/src/kmp_str.h Thu Aug  7 06:16:59 2014
@@ -28,9 +28,8 @@
 #endif // __cplusplus
 
 #if KMP_OS_WINDOWS
-    #define strdup    _strdup
-    #define snprintf  _snprintf
-    #define vsnprintf _vsnprintf
+# define strdup    _strdup
+# define snprintf  _snprintf
 #endif
 
 /*  some macros to replace ctype.h functions  */

Modified: openmp/branches/release_35/runtime/src/kmp_version.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/kmp_version.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/kmp_version.c (original)
+++ openmp/branches/release_35/runtime/src/kmp_version.c Thu Aug  7 06:16:59 2014
@@ -53,6 +53,8 @@
     #define KMP_COMPILER "Clang " stringer( __clang_major__ ) "." stringer( __clang_minor__ )
 #elif KMP_COMPILER_GCC
     #define KMP_COMPILER "GCC " stringer( __GNUC__ ) "." stringer( __GNUC_MINOR__ )
+#elif KMP_COMPILER_MSVC
+    #define KMP_COMPILER "MSVC " stringer( __MSC_FULL_VER )
 #endif
 #ifndef KMP_COMPILER
     #warning "Unknown compiler"

Modified: openmp/branches/release_35/runtime/src/makefile.mk
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/makefile.mk?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/makefile.mk (original)
+++ openmp/branches/release_35/runtime/src/makefile.mk Thu Aug  7 06:16:59 2014
@@ -73,6 +73,8 @@ OPTIMIZATION := $(call check_variable,OP
 TARGET_COMPILER := $(call check_variable,TARGET_COMPILER,12 11)
 # Library version: 4 -- legacy, 5 -- compat.
 VERSION      := $(call check_variable,VERSION,5 4)
+# quad precision floating point
+HAVE_QUAD     = 1
 
 VPATH += $(src_dir)
 VPATH += $(src_dir)i18n/
@@ -171,6 +173,7 @@ ifeq "$(c)" "clang"
         ld-flags += -m32 -msse
         as-flags += -m32 -msse
     endif
+    HAVE_QUAD = 0
 endif
 
 ifeq "$(LINK_TYPE)" "dyna"
@@ -310,6 +313,9 @@ endif
 ifeq "$(CPLUSPLUS)" "on"
     ifeq "$(os)" "win"
         c-flags   += -TP
+    else ifeq "$(arch)" "ppc64"
+    # c++0x on ppc64 linux removes definition of preproc. macros, needed in .hs
+      c-flags   += -x c++ -std=gnu++0x
     else
         ifneq "$(filter gcc clang,$(c))" ""
             c-flags   += -x c++ -std=c++0x
@@ -370,7 +376,7 @@ ifeq "$(os)" "lin"
             ld-flags-extra += -lirc_pic
             endif
         endif
-        ifeq "$(filter 32 32e 64,$(arch))" ""
+        ifeq "$(filter 32 32e 64 ppc64,$(arch))" ""
             ld-flags-extra += $(shell pkg-config --libs libffi)
         endif
     else
@@ -466,7 +472,14 @@ ifneq "$(os)" "win"
 endif
 cpp-flags += -D KMP_LIBRARY_FILE=\"$(lib_file)\"
 cpp-flags += -D KMP_VERSION_MAJOR=$(VERSION)
-cpp-flags += -D CACHE_LINE=64
+
+# customize ppc64 cache line size to 128, 64 otherwise
+ifeq "$(arch)" "ppc64"
+	cpp-flags += -D CACHE_LINE=128
+else 
+	cpp-flags += -D CACHE_LINE=64
+endif
+
 cpp-flags += -D KMP_ADJUST_BLOCKTIME=1
 cpp-flags += -D BUILD_PARALLEL_ORDERED
 cpp-flags += -D KMP_ASM_INTRINS
@@ -581,9 +594,12 @@ ifneq "$(os)" "win"
     ifeq "$(arch)" "arm"
         z_Linux_asm$(obj) : \
 		    cpp-flags += -D KMP_ARCH_ARM
-    else
+    else ifeq "$(arch)" "ppc64" 
         z_Linux_asm$(obj) : \
-            cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
+			cpp-flags += -D KMP_ARCH_PPC64		    
+    else
+    	z_Linux_asm$(obj) : \
+       		cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)	
     endif
 endif
 
@@ -596,6 +612,9 @@ kmp_version$(obj) : cpp-flags += -D _KMP
 
 gd-flags += -D arch_$(arch)
 gd-flags += -D $(LIB_TYPE)
+ifeq "$(HAVE_QUAD)" "1"
+    gd-flags += -D HAVE_QUAD
+endif
 ifeq "$(OMP_VERSION)" "40"
     gd-flags += -D OMP_40 -D OMP_30
 else
@@ -729,7 +748,9 @@ endif
         else # 5
             lib_c_items += kmp_gsupport
         endif
+#        ifneq "$(arch)" "ppc64"
         lib_asm_items += z_Linux_asm
+#	     endif
     endif
 endif
 
@@ -1391,9 +1412,13 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LIN
             td_exp += libc.so.6
             td_exp += ld-linux-armhf.so.3
         endif
+        ifeq "$(arch)" "ppc64"
+            td_exp += libc.so.6
+            td_exp += ld64.so.1
+        endif
         td_exp += libdl.so.2
         td_exp += libgcc_s.so.1
-        ifeq "$(filter 32 32e 64,$(arch))" ""
+        ifeq "$(filter 32 32e 64 ppc64,$(arch))" ""
             td_exp += libffi.so.6
             td_exp += libffi.so.5
         endif

Modified: openmp/branches/release_35/runtime/src/thirdparty/ittnotify/ittnotify_config.h
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/thirdparty/ittnotify/ittnotify_config.h?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/thirdparty/ittnotify/ittnotify_config.h (original)
+++ openmp/branches/release_35/runtime/src/thirdparty/ittnotify/ittnotify_config.h Thu Aug  7 06:16:59 2014
@@ -132,6 +132,11 @@
 #  define ITT_ARCH_ARM  4
 #endif /* ITT_ARCH_ARM */
 
+#ifndef ITT_ARCH_PPC64
+#  define ITT_ARCH_PPC64  5
+#endif /* ITT_ARCH_PPC64 */
+
+
 #ifndef ITT_ARCH
 #  if defined _M_IX86 || defined __i386__
 #    define ITT_ARCH ITT_ARCH_IA32
@@ -141,6 +146,8 @@
 #    define ITT_ARCH ITT_ARCH_IA64
 #  elif defined _M_ARM || __arm__
 #    define ITT_ARCH ITT_ARCH_ARM
+#  elif defined __powerpc64__
+#    define ITT_ARCH ITT_ARCH_PPC64
 #  endif
 #endif
 
@@ -274,7 +281,7 @@ ITT_INLINE long __TBB_machine_fetchadd4(
                           : "memory");
     return result;
 }
-#elif ITT_ARCH==ITT_ARCH_ARM
+#elif ITT_ARCH==ITT_ARCH_ARM || ITT_ARCH==ITT_ARCH_PPC64
 #define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
 #endif /* ITT_ARCH==ITT_ARCH_IA64 */
 #ifndef ITT_SIMPLE_INIT

Modified: openmp/branches/release_35/runtime/src/z_Linux_asm.s
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/z_Linux_asm.s?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/z_Linux_asm.s (original)
+++ openmp/branches/release_35/runtime/src/z_Linux_asm.s Thu Aug  7 06:16:59 2014
@@ -138,7 +138,7 @@ __kmp_unnamed_critical_addr:
 #endif /* KMP_GOMP_COMPAT */
 
 
-#if KMP_ARCH_X86
+#if KMP_ARCH_X86 && !KMP_ARCH_PPC64
 
 // -----------------------------------------------------------------------
 // microtasking routines specifically written for IA-32 architecture
@@ -1585,6 +1585,16 @@ __kmp_unnamed_critical_addr:
     .size __kmp_unnamed_critical_addr,4
 #endif /* KMP_ARCH_ARM */
 
+#if KMP_ARCH_PPC64
+    .data
+    .comm .gomp_critical_user_,32,8
+    .data
+    .align 8
+    .global __kmp_unnamed_critical_addr
+__kmp_unnamed_critical_addr:
+    .8byte .gomp_critical_user_
+    .size __kmp_unnamed_critical_addr,8
+#endif /* KMP_ARCH_PPC64 */
 
 #if defined(__linux__)
 .section .note.GNU-stack,"", at progbits

Modified: openmp/branches/release_35/runtime/src/z_Linux_util.c
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/src/z_Linux_util.c?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/src/z_Linux_util.c (original)
+++ openmp/branches/release_35/runtime/src/z_Linux_util.c Thu Aug  7 06:16:59 2014
@@ -32,7 +32,7 @@
 #include <sys/resource.h>
 #include <sys/syscall.h>
 
-#if KMP_OS_LINUX
+#if KMP_OS_LINUX && !KMP_OS_CNK
 # include <sys/sysinfo.h>
 # if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
 // We should really include <futex.h>, but that causes compatibility problems on different
@@ -61,7 +61,7 @@
 #include <fcntl.h>
 
 // For non-x86 architecture
-#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)
 # include <stdbool.h>
 # include <ffi.h>
 #endif
@@ -110,7 +110,7 @@ __kmp_print_cond( char *buffer, kmp_cond
 /* ------------------------------------------------------------------------ */
 /* ------------------------------------------------------------------------ */
 
-#if KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
+#if ( KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED)
 
 /*
  * Affinity support
@@ -147,6 +147,19 @@ __kmp_print_cond( char *buffer, kmp_cond
 #    error Wrong code for getaffinity system call.
 #   endif /* __NR_sched_getaffinity */
 
+#  elif KMP_ARCH_PPC64
+#   ifndef __NR_sched_setaffinity
+#    define __NR_sched_setaffinity  222
+#   elif __NR_sched_setaffinity != 222
+#    error Wrong code for setaffinity system call.
+#   endif /* __NR_sched_setaffinity */
+#   ifndef __NR_sched_getaffinity
+#    define __NR_sched_getaffinity  223
+#   elif __NR_sched_getaffinity != 223
+#    error Wrong code for getaffinity system call.
+#   endif /* __NR_sched_getaffinity */
+
+
 #  else
 #   error Unknown or unsupported architecture
 
@@ -445,7 +458,7 @@ __kmp_change_thread_affinity_mask( int g
 /* ------------------------------------------------------------------------ */
 /* ------------------------------------------------------------------------ */
 
-#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
+#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) && !KMP_OS_CNK
 
 int
 __kmp_futex_determine_capable()
@@ -462,7 +475,7 @@ __kmp_futex_determine_capable()
     return retval;
 }
 
-#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
+#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) && !KMP_OS_CNK
 
 /* ------------------------------------------------------------------------ */
 /* ------------------------------------------------------------------------ */
@@ -481,7 +494,7 @@ __kmp_test_then_or32( volatile kmp_int32
     old_value = TCR_4( *p );
     new_value = old_value | d;
 
-    while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
+    while ( ! KMP_COMPARE_AND_STORE_REL32 ( p, old_value, new_value ) )
     {
         KMP_CPU_PAUSE();
         old_value = TCR_4( *p );
@@ -498,7 +511,7 @@ __kmp_test_then_and32( volatile kmp_int3
     old_value = TCR_4( *p );
     new_value = old_value & d;
 
-    while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
+    while ( ! KMP_COMPARE_AND_STORE_REL32 ( p, old_value, new_value ) )
     {
         KMP_CPU_PAUSE();
         old_value = TCR_4( *p );
@@ -507,7 +520,7 @@ __kmp_test_then_and32( volatile kmp_int3
     return old_value;
 }
 
-# if KMP_ARCH_X86
+# if KMP_ARCH_X86 || KMP_ARCH_PPC64
 kmp_int64
 __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
 {
@@ -516,7 +529,7 @@ __kmp_test_then_add64( volatile kmp_int6
     old_value = TCR_8( *p );
     new_value = old_value + d;
 
-    while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
+    while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
     {
         KMP_CPU_PAUSE();
         old_value = TCR_8( *p );
@@ -533,7 +546,7 @@ __kmp_test_then_or64( volatile kmp_int64
 
     old_value = TCR_8( *p );
     new_value = old_value | d;
-    while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
+    while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
     {
         KMP_CPU_PAUSE();
         old_value = TCR_8( *p );
@@ -549,7 +562,7 @@ __kmp_test_then_and64( volatile kmp_int6
 
     old_value = TCR_8( *p );
     new_value = old_value & d;
-    while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
+    while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
     {
         KMP_CPU_PAUSE();
         old_value = TCR_8( *p );
@@ -2527,7 +2540,7 @@ __kmp_get_load_balance( int max )
 #endif // USE_LOAD_BALANCE
 
 
-#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)
 
 int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
         void *p_argv[] )
@@ -2561,7 +2574,89 @@ int __kmp_invoke_microtask( microtask_t
     return 1;
 }
 
-#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)
+
+#if KMP_ARCH_PPC64
+
+// we really only need the case with 1 argument, because CLANG always build
+// a struct of pointers to shared variables referenced in the outlined function
+int
+__kmp_invoke_microtask( microtask_t pkfn,
+                        int gtid, int tid,
+                        int argc, void *p_argv[] ) {
+  switch (argc) {
+  default:
+    fprintf(stderr, "Too many args to microtask: %d!\n", argc);
+    fflush(stderr);
+    exit(-1);
+  case 0:
+    (*pkfn)(&gtid, &tid);
+    break;
+  case 1:
+    (*pkfn)(&gtid, &tid, p_argv[0]);
+    break;
+  case 2:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1]);
+    break;
+  case 3:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2]);
+    break;
+  case 4:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3]);
+    break;
+  case 5:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4]);
+    break;
+  case 6:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5]);
+    break;
+  case 7:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6]);
+    break;
+  case 8:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7]);
+    break;
+  case 9:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8]);
+    break;
+  case 10:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9]);
+    break;
+  case 11:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10]);
+    break;
+  case 12:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
+            p_argv[11]);
+    break;
+  case 13:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
+            p_argv[11], p_argv[12]);
+    break;
+  case 14:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
+            p_argv[11], p_argv[12], p_argv[13]);
+    break;
+  case 15:
+    (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
+            p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
+            p_argv[11], p_argv[12], p_argv[13], p_argv[14]);
+    break;
+  }
+
+  return 1;
+}
+
+#endif
 
 // end of file //
 

Modified: openmp/branches/release_35/runtime/tools/lib/Platform.pm
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/tools/lib/Platform.pm?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/tools/lib/Platform.pm (original)
+++ openmp/branches/release_35/runtime/tools/lib/Platform.pm Thu Aug  7 06:16:59 2014
@@ -50,6 +50,8 @@ sub canon_arch($) {
             $arch = "32e";
         } elsif ( $arch =~ m{\Aarm(?:v7\D*)?\z} ) {
             $arch = "arm";
+        } elsif ( $arch =~ m{\Appc64} ) {
+        	$arch = "ppc64";            
         } else {
             $arch = undef;
         }; # if
@@ -159,6 +161,8 @@ sub target_options() {
         $_host_arch = "32e";
     } elsif ( $hardware_platform eq "arm" ) {
         $_host_arch = "arm";
+    } elsif ( $hardware_platform eq "ppc64" ) {
+        $_host_arch = "ppc64";
     } else {
         die "Unsupported host hardware platform: \"$hardware_platform\"; stopped";
     }; # if

Modified: openmp/branches/release_35/runtime/tools/lib/Uname.pm
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/tools/lib/Uname.pm?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/tools/lib/Uname.pm (original)
+++ openmp/branches/release_35/runtime/tools/lib/Uname.pm Thu Aug  7 06:16:59 2014
@@ -147,6 +147,8 @@ if ( 0 ) {
         $values{ hardware_platform } = "x86_64";
     } elsif ( $values{ machine } =~ m{\Aarmv7\D*\z} ) {
         $values{ hardware_platform } = "arm";
+    } elsif ( $values{ machine } =~ m{\Appc64\z} ) {
+        $values{ hardware_platform } = "ppc64";
     } else {
         die "Unsupported machine (\"$values{ machine }\") returned by POSIX::uname(); stopped";
     }; # if

Modified: openmp/branches/release_35/runtime/tools/src/common-defs.mk
URL: http://llvm.org/viewvc/llvm-project/openmp/branches/release_35/runtime/tools/src/common-defs.mk?rev=215098&r1=215097&r2=215098&view=diff
==============================================================================
--- openmp/branches/release_35/runtime/tools/src/common-defs.mk (original)
+++ openmp/branches/release_35/runtime/tools/src/common-defs.mk Thu Aug  7 06:16:59 2014
@@ -45,7 +45,7 @@ endif
 # 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,$(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,$(error Bad architecture specified: $(1)))))))
 
 # Synopsis:
 #     var_name = $(call check_variable,var,list)
@@ -128,9 +128,9 @@ endif
 # --------------------------------------------------------------------------------------------------
 
 os       := $(call check_variable,os,lin lrb mac win)
-arch     := $(call check_variable,arch,32 32e 64 arm)
+arch     := $(call check_variable,arch,32 32e 64 arm ppc64)
 platform := $(os)_$(arch)
-platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64)
+platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64 lin_ppc64)
 # oa-opts means "os and arch options". They are passed to almost all perl scripts.
 oa-opts  := --os=$(os) --arch=$(arch)
 

Propchange: openmp/branches/release_35/www/content.css
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug  7 06:16:59 2014
@@ -1 +1,2 @@
 /libcxx/branches/apple/www/content.css:136569-137939
+/openmp/trunk/www/content.css:213607-215096

Propchange: openmp/branches/release_35/www/menu.css
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Aug  7 06:16:59 2014
@@ -1 +1,2 @@
 /libcxx/branches/apple/www/menu.css:136569-137939
+/openmp/trunk/www/menu.css:213607-215096





More information about the Openmp-commits mailing list