From 5b1b12fa3b179e1af796355ead379473696a9247 Mon Sep 17 00:00:00 2001 From: Loic Mottet Date: Fri, 30 Jun 2017 17:00:32 +0200 Subject: [PATCH] Ajout de la lib intel dans le fork --- src/libomp_oss/Build_With_CMake.txt | 278 + src/libomp_oss/CMakeLists.txt | 634 ++ src/libomp_oss/LICENSE.txt | 27 + src/libomp_oss/Makefile | 68 + src/libomp_oss/README.txt | 155 + src/libomp_oss/cmake/BuildPLRules.cmake | 131 + src/libomp_oss/cmake/Clang/AsmFlags.cmake | 46 + src/libomp_oss/cmake/Clang/CFlags.cmake | 69 + src/libomp_oss/cmake/CommonFlags.cmake | 166 + src/libomp_oss/cmake/Definitions.cmake | 193 + src/libomp_oss/cmake/GNU/AsmFlags.cmake | 46 + src/libomp_oss/cmake/GNU/CFlags.cmake | 75 + src/libomp_oss/cmake/GNU/FortranFlags.cmake | 44 + src/libomp_oss/cmake/GetArchitecture.cmake | 86 + src/libomp_oss/cmake/HelperFunctions.cmake | 279 + src/libomp_oss/cmake/Intel/AsmFlags.cmake | 61 + src/libomp_oss/cmake/Intel/CFlags.cmake | 179 + src/libomp_oss/cmake/Intel/FortranFlags.cmake | 67 + src/libomp_oss/cmake/MSVC/AsmFlags.cmake | 56 + src/libomp_oss/cmake/MSVC/CFlags.cmake | 94 + src/libomp_oss/cmake/MicroTests.cmake | 250 + src/libomp_oss/cmake/PerlFlags.cmake | 117 + src/libomp_oss/cmake/SourceFiles.cmake | 143 + src/libomp_oss/doc/Reference.pdf | Bin 0 -> 516023 bytes src/libomp_oss/doc/doxygen/config | 1822 ++++ src/libomp_oss/doc/doxygen/header.tex | 92 + src/libomp_oss/doc/doxygen/libomp_interface.h | 367 + .../exports/common.deb/include/.dir | 0 .../exports/common.deb/include/omp.h | 220 + .../exports/common.deb/include/omp_lib.f | 873 ++ .../exports/common.deb/include/omp_lib.f90 | 551 ++ .../exports/common.deb/include/omp_lib.h | 673 ++ .../exports/common.deb/include_compat/.dir | 0 .../exports/common.deb/include_compat/iomp.h | 128 + src/libomp_oss/exports/common/include/.dir | 0 src/libomp_oss/exports/common/include/omp.h | 220 + .../exports/common/include/omp_lib.f | 873 ++ .../exports/common/include/omp_lib.f90 | 551 ++ .../exports/common/include/omp_lib.h | 673 ++ .../exports/common/include_compat/.dir | 0 .../exports/common/include_compat/iomp.h | 128 + .../exports/lin_32e.deb/include_compat/.dir | 0 .../lin_32e.deb/include_compat/iomp_lib.h | 102 + src/libomp_oss/exports/lin_32e.deb/lib/.dir | 0 .../exports/lin_32e.deb/lib/libiomp5.so | Bin 0 -> 2695320 bytes .../exports/lin_32e/include_compat/.dir | 0 .../exports/lin_32e/include_compat/iomp_lib.h | 102 + src/libomp_oss/exports/lin_32e/lib/.dir | 0 .../exports/lin_32e/lib/libiomp5.dbg | Bin 0 -> 1573699 bytes .../exports/lin_32e/lib/libiomp5.so | Bin 0 -> 763257 bytes src/libomp_oss/src/CMakeLists.txt | 355 + src/libomp_oss/src/dllexports | 1030 +++ src/libomp_oss/src/exports_so.txt | 148 + src/libomp_oss/src/extractExternal.cpp | 516 ++ src/libomp_oss/src/i18n/en_US.txt | 496 ++ src/libomp_oss/src/include/30/iomp.h.var | 117 + src/libomp_oss/src/include/30/iomp_lib.h.var | 102 + src/libomp_oss/src/include/30/omp.h.var | 185 + src/libomp_oss/src/include/30/omp_lib.f.var | 677 ++ src/libomp_oss/src/include/30/omp_lib.f90.var | 390 + src/libomp_oss/src/include/30/omp_lib.h.var | 682 ++ src/libomp_oss/src/include/30/ompt.h.var | 519 ++ src/libomp_oss/src/include/40/iomp.h.var | 127 + src/libomp_oss/src/include/40/iomp_lib.h.var | 102 + src/libomp_oss/src/include/40/omp.h.var | 182 + src/libomp_oss/src/include/40/omp_lib.f.var | 802 ++ src/libomp_oss/src/include/40/omp_lib.f90.var | 483 ++ src/libomp_oss/src/include/40/omp_lib.h.var | 596 ++ src/libomp_oss/src/include/40/ompt.h.var | 546 ++ src/libomp_oss/src/include/45/iomp.h.var | 128 + src/libomp_oss/src/include/45/iomp_lib.h.var | 102 + src/libomp_oss/src/include/45/omp.h.var | 220 + src/libomp_oss/src/include/45/omp_lib.f.var | 873 ++ src/libomp_oss/src/include/45/omp_lib.f90.var | 551 ++ src/libomp_oss/src/include/45/omp_lib.h.var | 673 ++ src/libomp_oss/src/include/45/ompt.h.var | 546 ++ src/libomp_oss/src/kmp.h | 3702 ++++++++ src/libomp_oss/src/kmp_affinity.cpp | 4838 +++++++++++ src/libomp_oss/src/kmp_affinity.h | 339 + src/libomp_oss/src/kmp_alloc.c | 2102 +++++ src/libomp_oss/src/kmp_atomic.c | 2926 +++++++ src/libomp_oss/src/kmp_atomic.h | 1064 +++ src/libomp_oss/src/kmp_barrier.cpp | 1783 ++++ src/libomp_oss/src/kmp_cancel.cpp | 301 + src/libomp_oss/src/kmp_csupport.c | 3348 +++++++ src/libomp_oss/src/kmp_debug.c | 161 + src/libomp_oss/src/kmp_debug.h | 146 + src/libomp_oss/src/kmp_debugger.c | 334 + src/libomp_oss/src/kmp_debugger.h | 70 + src/libomp_oss/src/kmp_dispatch.cpp | 3023 +++++++ src/libomp_oss/src/kmp_dispatch.cpp~ | 2960 +++++++ src/libomp_oss/src/kmp_environment.c | 615 ++ src/libomp_oss/src/kmp_environment.h | 100 + src/libomp_oss/src/kmp_error.c | 542 ++ src/libomp_oss/src/kmp_error.h | 76 + src/libomp_oss/src/kmp_ftn_cdecl.c | 54 + src/libomp_oss/src/kmp_ftn_entry.h | 1510 ++++ src/libomp_oss/src/kmp_ftn_extra.c | 52 + src/libomp_oss/src/kmp_ftn_os.h | 648 ++ src/libomp_oss/src/kmp_ftn_stdcall.c | 54 + src/libomp_oss/src/kmp_global.c | 497 ++ src/libomp_oss/src/kmp_gsupport.c | 1629 ++++ src/libomp_oss/src/kmp_i18n.c | 993 +++ src/libomp_oss/src/kmp_i18n.h | 212 + src/libomp_oss/src/kmp_import.c | 61 + src/libomp_oss/src/kmp_io.c | 267 + src/libomp_oss/src/kmp_io.h | 63 + src/libomp_oss/src/kmp_itt.c | 164 + src/libomp_oss/src/kmp_itt.h | 331 + src/libomp_oss/src/kmp_itt.inl | 1167 +++ src/libomp_oss/src/kmp_lock.cpp | 4266 +++++++++ src/libomp_oss/src/kmp_lock.h | 1306 +++ src/libomp_oss/src/kmp_omp.h | 253 + src/libomp_oss/src/kmp_os.h | 731 ++ src/libomp_oss/src/kmp_platform.h | 194 + src/libomp_oss/src/kmp_runtime.c | 7677 +++++++++++++++++ src/libomp_oss/src/kmp_safe_c_api.h | 88 + src/libomp_oss/src/kmp_sched.cpp | 993 +++ src/libomp_oss/src/kmp_settings.c | 5649 ++++++++++++ src/libomp_oss/src/kmp_settings.h | 69 + src/libomp_oss/src/kmp_stats.cpp | 732 ++ src/libomp_oss/src/kmp_stats.h | 922 ++ src/libomp_oss/src/kmp_stats_timing.cpp | 163 + src/libomp_oss/src/kmp_stats_timing.h | 122 + src/libomp_oss/src/kmp_str.c | 902 ++ src/libomp_oss/src/kmp_str.h | 138 + src/libomp_oss/src/kmp_stub.c | 289 + src/libomp_oss/src/kmp_stub.h | 80 + src/libomp_oss/src/kmp_taskdeps.cpp | 606 ++ src/libomp_oss/src/kmp_tasking.c | 3117 +++++++ src/libomp_oss/src/kmp_taskq.c | 2051 +++++ src/libomp_oss/src/kmp_threadprivate.c | 752 ++ src/libomp_oss/src/kmp_utility.c | 448 + src/libomp_oss/src/kmp_version.c | 227 + src/libomp_oss/src/kmp_version.h | 87 + src/libomp_oss/src/kmp_wait_release.cpp | 45 + src/libomp_oss/src/kmp_wait_release.h | 614 ++ src/libomp_oss/src/kmp_wrapper_getpid.h | 75 + src/libomp_oss/src/kmp_wrapper_malloc.h | 224 + src/libomp_oss/src/libiomp.rc.var | 88 + src/libomp_oss/src/makefile.mk | 1713 ++++ src/libomp_oss/src/ompt-event-specific.h | 186 + src/libomp_oss/src/ompt-general.c | 569 ++ src/libomp_oss/src/ompt-internal.h | 126 + src/libomp_oss/src/ompt-specific.c | 363 + src/libomp_oss/src/ompt-specific.h | 124 + src/libomp_oss/src/rules.mk | 110 + src/libomp_oss/src/test-touch.c | 50 + .../thirdparty/ittnotify/disable_warnings.h | 48 + .../src/thirdparty/ittnotify/ittnotify.h | 3823 ++++++++ .../thirdparty/ittnotify/ittnotify_config.h | 497 ++ .../thirdparty/ittnotify/ittnotify_static.c | 1069 +++ .../thirdparty/ittnotify/ittnotify_static.h | 335 + .../thirdparty/ittnotify/ittnotify_types.h | 86 + .../thirdparty/ittnotify/legacy/ittnotify.h | 991 +++ .../thirdparty/safeclib/ignore_handler_s.c | 72 + .../thirdparty/safeclib/mem_primitives_lib.c | 853 ++ .../thirdparty/safeclib/mem_primitives_lib.h | 81 + .../src/thirdparty/safeclib/memcpy_s.c | 157 + .../src/thirdparty/safeclib/safe_lib.h | 69 + .../src/thirdparty/safeclib/safe_lib_errno.h | 108 + .../thirdparty/safeclib/safe_mem_constraint.c | 142 + .../thirdparty/safeclib/safe_mem_constraint.h | 54 + .../src/thirdparty/safeclib/safe_mem_lib.h | 124 + .../thirdparty/safeclib/safe_str_constraint.c | 146 + .../thirdparty/safeclib/safe_str_constraint.h | 86 + .../src/thirdparty/safeclib/safe_str_lib.h | 270 + .../src/thirdparty/safeclib/safe_types.h | 67 + .../thirdparty/safeclib/safeclib_private.h | 101 + .../src/thirdparty/safeclib/snprintf_s.h | 61 + .../thirdparty/safeclib/snprintf_support.c | 346 + .../src/thirdparty/safeclib/strcpy_s.c | 198 + .../src/thirdparty/safeclib/strncpy_s.c | 238 + .../src/thirdparty/safeclib/strnlen_s.c | 112 + src/libomp_oss/src/z_Linux_asm.s | 1464 ++++ src/libomp_oss/src/z_Linux_util.c | 2677 ++++++ src/libomp_oss/src/z_Windows_NT-586_asm.asm | 1421 +++ src/libomp_oss/src/z_Windows_NT-586_util.c | 182 + src/libomp_oss/src/z_Windows_NT_util.c | 1990 +++++ .../.rebuild | 0 .../build.cfg | 1 + .../build.log | 2660 ++++++ .../ignore_handler_s.d | 35 + .../iomp.h | 128 + .../iomp_lib.h | 102 + .../ittnotify_static.d | 52 + .../kmp_affinity.d | 75 + .../kmp_alloc.d | 74 + .../kmp_atomic.d | 74 + .../kmp_barrier.d | 76 + .../kmp_cancel.d | 74 + .../kmp_csupport.d | 81 + .../kmp_debug.d | 74 + .../kmp_debugger.d | 74 + .../kmp_dispatch.d | 77 + .../kmp_environment.d | 75 + .../kmp_error.d | 74 + .../kmp_ftn_cdecl.d | 75 + .../kmp_ftn_extra.d | 75 + .../kmp_global.d | 74 + .../kmp_gsupport.d | 75 + .../kmp_i18n.d | 76 + .../kmp_i18n_default.inc | 416 + .../kmp_i18n_id.inc | 383 + .../kmp_io.d | 74 + .../kmp_itt.d | 77 + .../kmp_lock.d | 80 + .../kmp_runtime.d | 79 + .../kmp_sched.d | 77 + .../kmp_settings.d | 79 + .../kmp_str.d | 74 + .../kmp_taskdeps.d | 77 + .../kmp_tasking.d | 77 + .../kmp_taskq.d | 75 + .../kmp_threadprivate.d | 76 + .../kmp_utility.d | 76 + .../kmp_version.d | 74 + .../kmp_wait_release.d | 77 + .../libiomp5.so | Bin 0 -> 2695320 bytes .../mem_primitives_lib.d | 36 + .../memcpy_s.d | 37 + .../omp.h | 220 + .../omp_lib.f | 873 ++ .../omp_lib.f90 | 551 ++ .../omp_lib.h | 673 ++ .../safe_mem_constraint.d | 37 + .../safe_str_constraint.d | 37 + .../snprintf_support.d | 38 + .../strcpy_s.d | 36 + .../strncpy_s.d | 36 + .../strnlen_s.d | 36 + .../test-deps/.dir | 0 .../test-deps/.test | 0 .../test-execstack/.dir | 0 .../test-execstack/.test | 0 .../test-relo/.dir | 0 .../test-relo/.test | 0 .../test-relo/readelf.log | 32 + .../test-touch-rt/.dir | 0 .../test-touch-rt/.test | 0 .../test-touch-rt/build.log | 303 + .../test-touch-rt/libirc.log | 0 .../test-touch-rt/test-touch | Bin 0 -> 8536 bytes .../tools.cfg | 1 + .../unstripped/.dir | 0 .../unstripped/libiomp5.so | Bin 0 -> 2695320 bytes .../unstripped/libiomp5.so.lst | 1 + .../z_Linux_util.d | 113 + src/libomp_oss/tools/build.pl | 780 ++ src/libomp_oss/tools/check-depends.pl | 523 ++ src/libomp_oss/tools/check-execstack.pl | 165 + src/libomp_oss/tools/check-instruction-set.pl | 335 + src/libomp_oss/tools/check-tools.pl | 624 ++ src/libomp_oss/tools/common.inc | 128 + src/libomp_oss/tools/expand-vars.pl | 325 + src/libomp_oss/tools/extract-objects.pl | 281 + src/libomp_oss/tools/freebsd.inc | 31 + src/libomp_oss/tools/generate-def.pl | 340 + src/libomp_oss/tools/lib/Build.pm | 283 + src/libomp_oss/tools/lib/LibOMP.pm | 104 + src/libomp_oss/tools/lib/Platform.pm | 492 ++ src/libomp_oss/tools/lib/Uname.pm | 654 ++ src/libomp_oss/tools/lib/tools.pm | 2000 +++++ src/libomp_oss/tools/linux.inc | 54 + src/libomp_oss/tools/macos.inc | 56 + src/libomp_oss/tools/make-fat-binaries.pl | 253 + src/libomp_oss/tools/message-converter.pl | 794 ++ src/libomp_oss/tools/objcopy.cpp | 539 ++ src/libomp_oss/tools/required-objects.pl | 661 ++ src/libomp_oss/tools/src/common-checks.mk | 114 + src/libomp_oss/tools/src/common-defs.mk | 251 + src/libomp_oss/tools/src/common-rules.mk | 219 + src/libomp_oss/tools/src/common-tools.mk | 501 ++ src/libomp_oss/tools/windows.inc | 46 + src/libomp_oss/tools/wipe-string.pl | 202 + 275 files changed, 131803 insertions(+) create mode 100644 src/libomp_oss/Build_With_CMake.txt create mode 100644 src/libomp_oss/CMakeLists.txt create mode 100644 src/libomp_oss/LICENSE.txt create mode 100644 src/libomp_oss/Makefile create mode 100644 src/libomp_oss/README.txt create mode 100644 src/libomp_oss/cmake/BuildPLRules.cmake create mode 100644 src/libomp_oss/cmake/Clang/AsmFlags.cmake create mode 100644 src/libomp_oss/cmake/Clang/CFlags.cmake create mode 100644 src/libomp_oss/cmake/CommonFlags.cmake create mode 100644 src/libomp_oss/cmake/Definitions.cmake create mode 100644 src/libomp_oss/cmake/GNU/AsmFlags.cmake create mode 100644 src/libomp_oss/cmake/GNU/CFlags.cmake create mode 100644 src/libomp_oss/cmake/GNU/FortranFlags.cmake create mode 100644 src/libomp_oss/cmake/GetArchitecture.cmake create mode 100644 src/libomp_oss/cmake/HelperFunctions.cmake create mode 100644 src/libomp_oss/cmake/Intel/AsmFlags.cmake create mode 100644 src/libomp_oss/cmake/Intel/CFlags.cmake create mode 100644 src/libomp_oss/cmake/Intel/FortranFlags.cmake create mode 100644 src/libomp_oss/cmake/MSVC/AsmFlags.cmake create mode 100644 src/libomp_oss/cmake/MSVC/CFlags.cmake create mode 100644 src/libomp_oss/cmake/MicroTests.cmake create mode 100644 src/libomp_oss/cmake/PerlFlags.cmake create mode 100644 src/libomp_oss/cmake/SourceFiles.cmake create mode 100644 src/libomp_oss/doc/Reference.pdf create mode 100644 src/libomp_oss/doc/doxygen/config create mode 100644 src/libomp_oss/doc/doxygen/header.tex create mode 100644 src/libomp_oss/doc/doxygen/libomp_interface.h create mode 100644 src/libomp_oss/exports/common.deb/include/.dir create mode 100644 src/libomp_oss/exports/common.deb/include/omp.h create mode 100644 src/libomp_oss/exports/common.deb/include/omp_lib.f create mode 100644 src/libomp_oss/exports/common.deb/include/omp_lib.f90 create mode 100644 src/libomp_oss/exports/common.deb/include/omp_lib.h create mode 100644 src/libomp_oss/exports/common.deb/include_compat/.dir create mode 100644 src/libomp_oss/exports/common.deb/include_compat/iomp.h create mode 100644 src/libomp_oss/exports/common/include/.dir create mode 100644 src/libomp_oss/exports/common/include/omp.h create mode 100644 src/libomp_oss/exports/common/include/omp_lib.f create mode 100644 src/libomp_oss/exports/common/include/omp_lib.f90 create mode 100644 src/libomp_oss/exports/common/include/omp_lib.h create mode 100644 src/libomp_oss/exports/common/include_compat/.dir create mode 100644 src/libomp_oss/exports/common/include_compat/iomp.h create mode 100644 src/libomp_oss/exports/lin_32e.deb/include_compat/.dir create mode 100644 src/libomp_oss/exports/lin_32e.deb/include_compat/iomp_lib.h create mode 100644 src/libomp_oss/exports/lin_32e.deb/lib/.dir create mode 100755 src/libomp_oss/exports/lin_32e.deb/lib/libiomp5.so create mode 100644 src/libomp_oss/exports/lin_32e/include_compat/.dir create mode 100644 src/libomp_oss/exports/lin_32e/include_compat/iomp_lib.h create mode 100644 src/libomp_oss/exports/lin_32e/lib/.dir create mode 100755 src/libomp_oss/exports/lin_32e/lib/libiomp5.dbg create mode 100755 src/libomp_oss/exports/lin_32e/lib/libiomp5.so create mode 100644 src/libomp_oss/src/CMakeLists.txt create mode 100644 src/libomp_oss/src/dllexports create mode 100644 src/libomp_oss/src/exports_so.txt create mode 100644 src/libomp_oss/src/extractExternal.cpp create mode 100644 src/libomp_oss/src/i18n/en_US.txt create mode 100644 src/libomp_oss/src/include/30/iomp.h.var create mode 100644 src/libomp_oss/src/include/30/iomp_lib.h.var create mode 100644 src/libomp_oss/src/include/30/omp.h.var create mode 100644 src/libomp_oss/src/include/30/omp_lib.f.var create mode 100644 src/libomp_oss/src/include/30/omp_lib.f90.var create mode 100644 src/libomp_oss/src/include/30/omp_lib.h.var create mode 100644 src/libomp_oss/src/include/30/ompt.h.var create mode 100644 src/libomp_oss/src/include/40/iomp.h.var create mode 100644 src/libomp_oss/src/include/40/iomp_lib.h.var create mode 100644 src/libomp_oss/src/include/40/omp.h.var create mode 100644 src/libomp_oss/src/include/40/omp_lib.f.var create mode 100644 src/libomp_oss/src/include/40/omp_lib.f90.var create mode 100644 src/libomp_oss/src/include/40/omp_lib.h.var create mode 100644 src/libomp_oss/src/include/40/ompt.h.var create mode 100644 src/libomp_oss/src/include/45/iomp.h.var create mode 100644 src/libomp_oss/src/include/45/iomp_lib.h.var create mode 100644 src/libomp_oss/src/include/45/omp.h.var create mode 100644 src/libomp_oss/src/include/45/omp_lib.f.var create mode 100644 src/libomp_oss/src/include/45/omp_lib.f90.var create mode 100644 src/libomp_oss/src/include/45/omp_lib.h.var create mode 100644 src/libomp_oss/src/include/45/ompt.h.var create mode 100644 src/libomp_oss/src/kmp.h create mode 100644 src/libomp_oss/src/kmp_affinity.cpp create mode 100644 src/libomp_oss/src/kmp_affinity.h create mode 100644 src/libomp_oss/src/kmp_alloc.c create mode 100644 src/libomp_oss/src/kmp_atomic.c create mode 100644 src/libomp_oss/src/kmp_atomic.h create mode 100644 src/libomp_oss/src/kmp_barrier.cpp create mode 100644 src/libomp_oss/src/kmp_cancel.cpp create mode 100644 src/libomp_oss/src/kmp_csupport.c create mode 100644 src/libomp_oss/src/kmp_debug.c create mode 100644 src/libomp_oss/src/kmp_debug.h create mode 100644 src/libomp_oss/src/kmp_debugger.c create mode 100644 src/libomp_oss/src/kmp_debugger.h create mode 100644 src/libomp_oss/src/kmp_dispatch.cpp create mode 100644 src/libomp_oss/src/kmp_dispatch.cpp~ create mode 100644 src/libomp_oss/src/kmp_environment.c create mode 100644 src/libomp_oss/src/kmp_environment.h create mode 100644 src/libomp_oss/src/kmp_error.c create mode 100644 src/libomp_oss/src/kmp_error.h create mode 100644 src/libomp_oss/src/kmp_ftn_cdecl.c create mode 100644 src/libomp_oss/src/kmp_ftn_entry.h create mode 100644 src/libomp_oss/src/kmp_ftn_extra.c create mode 100644 src/libomp_oss/src/kmp_ftn_os.h create mode 100644 src/libomp_oss/src/kmp_ftn_stdcall.c create mode 100644 src/libomp_oss/src/kmp_global.c create mode 100644 src/libomp_oss/src/kmp_gsupport.c create mode 100644 src/libomp_oss/src/kmp_i18n.c create mode 100644 src/libomp_oss/src/kmp_i18n.h create mode 100644 src/libomp_oss/src/kmp_import.c create mode 100644 src/libomp_oss/src/kmp_io.c create mode 100644 src/libomp_oss/src/kmp_io.h create mode 100644 src/libomp_oss/src/kmp_itt.c create mode 100644 src/libomp_oss/src/kmp_itt.h create mode 100644 src/libomp_oss/src/kmp_itt.inl create mode 100644 src/libomp_oss/src/kmp_lock.cpp create mode 100644 src/libomp_oss/src/kmp_lock.h create mode 100644 src/libomp_oss/src/kmp_omp.h create mode 100644 src/libomp_oss/src/kmp_os.h create mode 100644 src/libomp_oss/src/kmp_platform.h create mode 100644 src/libomp_oss/src/kmp_runtime.c create mode 100644 src/libomp_oss/src/kmp_safe_c_api.h create mode 100644 src/libomp_oss/src/kmp_sched.cpp create mode 100644 src/libomp_oss/src/kmp_settings.c create mode 100644 src/libomp_oss/src/kmp_settings.h create mode 100644 src/libomp_oss/src/kmp_stats.cpp create mode 100644 src/libomp_oss/src/kmp_stats.h create mode 100644 src/libomp_oss/src/kmp_stats_timing.cpp create mode 100644 src/libomp_oss/src/kmp_stats_timing.h create mode 100644 src/libomp_oss/src/kmp_str.c create mode 100644 src/libomp_oss/src/kmp_str.h create mode 100644 src/libomp_oss/src/kmp_stub.c create mode 100644 src/libomp_oss/src/kmp_stub.h create mode 100644 src/libomp_oss/src/kmp_taskdeps.cpp create mode 100644 src/libomp_oss/src/kmp_tasking.c create mode 100644 src/libomp_oss/src/kmp_taskq.c create mode 100644 src/libomp_oss/src/kmp_threadprivate.c create mode 100644 src/libomp_oss/src/kmp_utility.c create mode 100644 src/libomp_oss/src/kmp_version.c create mode 100644 src/libomp_oss/src/kmp_version.h create mode 100644 src/libomp_oss/src/kmp_wait_release.cpp create mode 100644 src/libomp_oss/src/kmp_wait_release.h create mode 100644 src/libomp_oss/src/kmp_wrapper_getpid.h create mode 100644 src/libomp_oss/src/kmp_wrapper_malloc.h create mode 100644 src/libomp_oss/src/libiomp.rc.var create mode 100644 src/libomp_oss/src/makefile.mk create mode 100644 src/libomp_oss/src/ompt-event-specific.h create mode 100644 src/libomp_oss/src/ompt-general.c create mode 100644 src/libomp_oss/src/ompt-internal.h create mode 100644 src/libomp_oss/src/ompt-specific.c create mode 100644 src/libomp_oss/src/ompt-specific.h create mode 100644 src/libomp_oss/src/rules.mk create mode 100644 src/libomp_oss/src/test-touch.c create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/disable_warnings.h create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/ittnotify.h create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/ittnotify_config.h create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/ittnotify_static.c create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/ittnotify_static.h create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/ittnotify_types.h create mode 100644 src/libomp_oss/src/thirdparty/ittnotify/legacy/ittnotify.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/ignore_handler_s.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/mem_primitives_lib.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/mem_primitives_lib.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/memcpy_s.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_lib.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_lib_errno.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_mem_constraint.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_mem_constraint.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_mem_lib.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_str_constraint.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_str_constraint.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_str_lib.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safe_types.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/safeclib_private.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/snprintf_s.h create mode 100644 src/libomp_oss/src/thirdparty/safeclib/snprintf_support.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/strcpy_s.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/strncpy_s.c create mode 100644 src/libomp_oss/src/thirdparty/safeclib/strnlen_s.c create mode 100644 src/libomp_oss/src/z_Linux_asm.s create mode 100644 src/libomp_oss/src/z_Linux_util.c create mode 100644 src/libomp_oss/src/z_Windows_NT-586_asm.asm create mode 100644 src/libomp_oss/src/z_Windows_NT-586_util.c create mode 100644 src/libomp_oss/src/z_Windows_NT_util.c create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/.rebuild create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/build.cfg create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/build.log create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/ignore_handler_s.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/iomp.h create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/iomp_lib.h create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/ittnotify_static.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_affinity.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_alloc.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_atomic.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_barrier.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_cancel.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_csupport.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_debug.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_debugger.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_dispatch.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_environment.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_error.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_ftn_cdecl.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_ftn_extra.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_global.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_gsupport.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_i18n.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_i18n_default.inc create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_i18n_id.inc create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_io.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_itt.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_lock.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_runtime.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_sched.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_settings.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_str.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_taskdeps.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_tasking.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_taskq.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_threadprivate.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_utility.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_version.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/kmp_wait_release.d create mode 100755 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/libiomp5.so create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/mem_primitives_lib.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/memcpy_s.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/omp.h create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/omp_lib.f create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/omp_lib.f90 create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/omp_lib.h create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/safe_mem_constraint.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/safe_str_constraint.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/snprintf_support.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/strcpy_s.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/strncpy_s.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/strnlen_s.d create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-deps/.dir create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-deps/.test create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-execstack/.dir create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-execstack/.test create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-relo/.dir create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-relo/.test create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-relo/readelf.log create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-touch-rt/.dir create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-touch-rt/.test create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-touch-rt/build.log create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-touch-rt/libirc.log create mode 100755 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/test-touch-rt/test-touch create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/tools.cfg create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/unstripped/.dir create mode 100755 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/unstripped/libiomp5.so create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/unstripped/libiomp5.so.lst create mode 100644 src/libomp_oss/tmp/lin_32e-rtl_5_nor_dyn.deb.45.c0.s0....h0-bastia-Latitude-E6420/z_Linux_util.d create mode 100755 src/libomp_oss/tools/build.pl create mode 100755 src/libomp_oss/tools/check-depends.pl create mode 100755 src/libomp_oss/tools/check-execstack.pl create mode 100755 src/libomp_oss/tools/check-instruction-set.pl create mode 100755 src/libomp_oss/tools/check-tools.pl create mode 100644 src/libomp_oss/tools/common.inc create mode 100755 src/libomp_oss/tools/expand-vars.pl create mode 100755 src/libomp_oss/tools/extract-objects.pl create mode 100644 src/libomp_oss/tools/freebsd.inc create mode 100755 src/libomp_oss/tools/generate-def.pl create mode 100644 src/libomp_oss/tools/lib/Build.pm create mode 100644 src/libomp_oss/tools/lib/LibOMP.pm create mode 100644 src/libomp_oss/tools/lib/Platform.pm create mode 100644 src/libomp_oss/tools/lib/Uname.pm create mode 100644 src/libomp_oss/tools/lib/tools.pm create mode 100644 src/libomp_oss/tools/linux.inc create mode 100644 src/libomp_oss/tools/macos.inc create mode 100755 src/libomp_oss/tools/make-fat-binaries.pl create mode 100755 src/libomp_oss/tools/message-converter.pl create mode 100644 src/libomp_oss/tools/objcopy.cpp create mode 100755 src/libomp_oss/tools/required-objects.pl create mode 100644 src/libomp_oss/tools/src/common-checks.mk create mode 100644 src/libomp_oss/tools/src/common-defs.mk create mode 100644 src/libomp_oss/tools/src/common-rules.mk create mode 100644 src/libomp_oss/tools/src/common-tools.mk create mode 100644 src/libomp_oss/tools/windows.inc create mode 100755 src/libomp_oss/tools/wipe-string.pl diff --git a/src/libomp_oss/Build_With_CMake.txt b/src/libomp_oss/Build_With_CMake.txt new file mode 100644 index 0000000..a5fd552 --- /dev/null +++ b/src/libomp_oss/Build_With_CMake.txt @@ -0,0 +1,278 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + + Building libiomp5 using CMake + ============================= + + ---- Version of CMake required: v2.8.0 or above ---- + +============================================ +How to call cmake initially, then repeatedly +============================================ +- When calling cmake for the first time, all needed compiler options + must be specified on the command line. After this initial call to + cmake, the compiler definitions must not be included for further calls + to cmake. Other options can be specified on the command line multiple + times including all definitions in the Build options section below. +- Example of configuring, building, reconfiguring, rebuilding: + $ mkdir build + $ cd build + $ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_ARCH=32 .. # Initial configuration + $ make all common + ... + $ make clean + $ cmake -DLIBOMP_ARCH=32e -DCMAKE_BUILD_TYPE=Debug .. # Second configuration + $ make all common + ... + $ rm -rf * + $ cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_ARCH=32e .. # Third configuration + $ make all common +- Notice in the example how the compiler definitions are only specified + for an empty build directory, but other Build options are used at any time. +- The file CMakeCache.txt which is created after the first call to cmake + is a configuration file which holds all the values for the Build options. + These configuration values can be changed using a text editor to modify + CMakeCache.txt as opposed to using definitions on the command line. +- To have cmake create a particular type of build generator file simply + inlude the -G option: + $ cmake -G "Unix Makefiles" ... + You can see a list of generators cmake supports by executing cmake with + no arguments and a list will be printed. + +===================== +Instructions to Build +===================== + $ cd libomp_top_level/ [ directory with src/ , exports/ , tools/ , etc. ] + $ mkdir build + $ cd build + + [ Linux* , Mac* Libraries ] + $ cmake -DCMAKE_C_COMPILER= -DCMAKE_CXX_COMPILER= .. + + [ Intel(R) Many Integrated Core Library (Intel(R) MIC Library) ] + $ cmake -DCMAKE_C_COMPILER= -DCMAKE_CXX_COMPILER= -DLIBOMP_ARCH=mic .. + + [ Windows Libraries ] + $ cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER= -DCMAKE_CXX_COMPILER= -DCMAKE_ASM_MASM_COMPILER=[ml | ml64] -DCMAKE_BUILD_TYPE=Release .. + + $ make all common + +================= +Mac* Fat Libraries +================= +On OS X* machines, it is possible to build universal (or fat) libraries which +include both IA-32 architecture and Intel(R) 64 architecture objects in a +single archive; just build the 32 and 32e libraries separately: + $ cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBOMP_ARCH=32 .. + $ make + $ cmake -DLIBOMP_ARCH=32e .. + $ make +then invoke make again with a special argument as follows: + $ make fat +- The fat target is only available for the LIBOMP_ARCH=32e configuration. +- The fat libraries will be put in exports/mac_32e/lib while the "thin" libraries + will be in exports/mac_32e/lib.thin and exports/mac_32/lib.thin + +================ +Compiler options +================ +-DCMAKE_C_COMPILER= +-DCMAKE_CXX_COMPILER= + +-DCMAKE_Fortran_COMPILER= +Unix* systems (Optional as compiler is default): +This option is only needed when -DLIBOMP_FORTRAN_MODULES is true + +-DCMAKE_ASM_MASM_COMPILER=[ml | ml64 ] +This option is Windows* Only + +============= +Build options +============= + +========================== +==== Operating System ==== +========================== +-DLIBOMP_OS=lin|mac|win +* Operating system can be lin (Linux*), mac (Mac*), or win (Windows*). + If not specified, cmake will try to determine your current operating system. + +====================== +==== Architecture ==== +====================== +-DLIBOMP_ARCH=32|32e|arm|ppc64|ppc64le|aarch64|mic +* Architecture can be 32 (IA-32 architecture), 32e (Intel(R) 64 architecture), + arm (ARM architecture), aarch64 (ARMv8 architecture), ppc64 (PPC64 architecture), + or ppc64le (little endian PPC64 architecture). +* This option, by default is chosen based on the probing the compiler for + architecture macros (e.g., is __x86_64__ predefined by compiler?). + +---- First values listed are the default value ---- +-DLIBOMP_LIB_TYPE=normal|profile|stubs +Library type can be normal, profile, or stubs. + +-DCMAKE_BUILD_TYPE=Release|Debug|RelWithDebInfo +Build type can be Release, Debug, or RelWithDebInfo. + +-DLIBOMP_VERSION=5|4 +libomp version can be 5 or 4. + +-DLIBOMP_OMP_VERSION=40|30 +OpenMP version can be either 40 or 30. + +-DLIBOMP_MIC_ARCH=knc|knf +Intel(R) MIC Architecture, can be knf or knc. +This value is ignored if LIBOMP_ARCH != mic + +-DLIBOMP_FORTRAN_MODULES=off|on +Should the Fortran modules be created (requires Fortran compiler) + +-DLIBOMP_STATS=off|on +Should include stats-gathering code? + +-DLIBOMP_OMPT_SUPPORT=off|on +Should OMPT support be turned on? (Not supported on Windows) +If LIBOMP_OMPT_SUPPORT is off, then both ompt_blame and ompt_trace are ignored. + +-DLIBOMP_OMPT_BLAME=on|off +Should OMPT blame functionality be turned on? + +-DLIBOMP_OMPT_TRACE=on|off +Should OMPT trace functionality be turned on? + +===================== +==== Micro tests ==== +===================== +After the library has been built, there are five optional microtests that +can be performed. Some will be skipped based upon the platform. +These tests can be turned on (default) or off with the following options: +-DLIBOMP_TEST_TOUCH=on|off -- Should the touch test be done? +-DLIBOMP_TEST_RELO=on|off -- Should the position independent code test be done? +-DLIBOMP_TEST_EXECSTACK=on|off -- Should the stack be checked for executability? +-DLIBOMP_TEST_INSTR=on|off -- Should the Intel(R) MIC Libraries be checked + for correct instruction set? +-DLIBOMP_TEST_DEPS=on|off -- Should libomp's dependencies be checked? +-DLIBOMP_MICRO_TESTS=off|on -- Should any of the above tests be done? +If -DLIBOMP_MICRO_TESTS=on is specified, the user can then call: +$ make libomp-micro-tests +which runs the tests. + +============================================ +==== How to append flags to compilation ==== +============================================ +- These flags are *appended*. They do not + overwrite any of the preset flags. +-DLIBOMP_CPPFLAGS= -- Additional C Preprocessor flags + (typically additional -Ddef=val flags) +-DLIBOMP_CFLAGS= -- Additional C compiler flags +-DLIBOMP_CXXFLAGS= -- Additional C++ compiler flags +-DLIBOMP_ASMFLAGS= -- Additional assembly flags +-DLIBOMP_LDFLAGS= -- Additional linker flags +-DLIBOMP_LIBFLAGS= -- Additional libraries to link + to during link phase +-DLIBOMP_FFLAGS= -- Additional Fortran compiler flags + +=================================== +==== Feature Based Compilation ==== +=================================== +-DLIBOMP_USE_BUILDPL_RULES=false|true +Should the build imitate build.pl's build process. +When this is true, the Unix* Release builds will build libomp +with -O2 and -g flags activated (same as RelWithDebInfo). Then, +the debug info is stripped out of the library and put into libomp.dbg +This is done for interaction with Intel(R) Parallel Amplifier. + +-DLIBOMP_USE_ADAPTIVE_LOCKS=true|false +Should adaptive (TSX-based) locks be included? +These are x86 specific. This feature is turned on by default +for IA-32 architecture and Intel(R) 64 architecture. +Otherwise, it is turned off. + +-DLIBOMP_USE_INTERNODE_ALIGNMENT=false|true +Should 4096-byte alignment be used for certain data structures? +This option is useful on multinode systems where a small CACHE_LINE +setting leads to false sharing. This option is off by default. + +-DLIBOMP_USE_VERSION_SYMBOLS=true|false +Should versioned symbols be used for building the library? +This option only makes sense for ELF based libraries where version +symbols are supported (Linux, some BSD* variants). It is off +by default for Windows and Mac, but on for other Unix based operating +systems. + +-DLIBOMP_USE_PREDEFINED_LINKER_FLAGS=true|false +Should the predefined linker flags in CommonFlags.cmake be included +in the link command? This is true by default and should work for +Linux*, Mac*, and Windows*. The --version-script flag on Unix* based +operating systems will be included regardless. + +-DLIBOMP_USE_HWLOC=off|on +Should the Hwloc library be used for affinity? +This option is not supported on Windows. +http://www.open-mpi.org/projects/hwloc + +-DLIBOMP_HWLOC_INSTALL_DIR=/path/to/hwloc/install/dir +Default: /usr/local +This option is only used if LIBOMP_USE_HWLOC is on. +Specifies install location of Hwloc. The configuration system will look for +hwloc.h in ${LIBOMP_HWLOC_INSTALL_DIR}/include and the library in +${LIBOMP_HWLOC_INSTALL_DIR}/lib. + +======================== +Examples usages of CMake +======================== +---- Typical usage ---- +cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc .. +cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. +cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. + +---- With Various Options ---- +- Build the 32 bit Linux library using GCC* +cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_OS=lin -DLIBOMP_ARCH=32 .. + +- Build the 32 bit debug Mac library using Clang* +cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBOMP_OS=mac -DLIBOMP_ARCH=32 -DCMAKE_BUILD_TYPE=Debug .. + +- Build the library (architecture determined by probing compiler) using the + Intel(R) C Compiler and the Intel(R) C++ Compiler. Also, create the fortran modules using + the Intel(R) Fortran Compiler, enabling the libomp-micro-tests target and using similar rules that build.pl + would use to build the library. +cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort -DLIBOMP_MICRO_TESTS=on -DLIBOMP_FORTRAN_MODULES=on -DLIBOMP_USE_BUILDPL_RULES=on .. + +- Have CMake Find the C/C++ compiler, and specify additional flags for the C compiler, preprocessor, and C++ compiler. +cmake -DLIBOMP_CFLAGS='Werror' -DLIBOMP_CPPFLAGS='-DNEW_FEATURE=1 -DOLD_FEATURE=0' -DLIBOMP_CXXFLAGS='-Werror -Wsign-compare' .. + +---- Build the stubs library ---- +cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLIBOMP_LIB_TYPE=stubs .. + +========= +Footnotes +========= +[*] Other names and brands may be claimed as the property of others. diff --git a/src/libomp_oss/CMakeLists.txt b/src/libomp_oss/CMakeLists.txt new file mode 100644 index 0000000..cc95a19 --- /dev/null +++ b/src/libomp_oss/CMakeLists.txt @@ -0,0 +1,634 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +################ +# CMAKE libomp +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) + +######### +# 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}) + +####################################################################### +# Standalone build or part of LLVM? +set(LIBOMP_STANDALONE_BUILD FALSE) +if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}" OR + "${CMAKE_SOURCE_DIR}/runtime" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") + project(libomp C CXX) + set(LIBOMP_STANDALONE_BUILD TRUE) +endif() + +# 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 +include(GetArchitecture) # get_architecture() + +#################################################################### +# 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) +set(arch_possible_values 32e 32 arm ppc64 ppc64le aarch64 mic) +set(build_type_possible_values release debug relwithdebinfo) +set(omp_version_possible_values 45 40 30) +set(lib_type_possible_values normal profile stubs) +set(mic_arch_possible_values knf knc) + +# Below, cmake will try and determine the operating system and architecture for you. +# 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" +# Apple goes first because CMake considers Mac to be a Unix based +# operating system, while libomp considers it a special case +if(${APPLE}) + set(temp_os mac) +elseif(${UNIX}) + set(temp_os lin) +elseif(${WIN32}) + set(temp_os win) +else() + set(temp_os lin) +endif() + +# If adding a new architecture, take a look at cmake/GetArchitecture.cmake +get_architecture(detected_arch) + +set(LIBOMP_OS ${temp_os} CACHE STRING + "The operating system to build for (lin/mac/win)") +set(LIBOMP_ARCH ${detected_arch} CACHE STRING + "The architecture to build for (32e/32/arm/ppc64/ppc64le/aarch64/mic). 32e is Intel(R) 64 architecture, 32 is IA-32 architecture") +set(LIBOMP_LIB_TYPE normal CACHE STRING + "Performance,Profiling,Stubs library (normal/profile/stubs)") +set(LIBOMP_VERSION 5 CACHE STRING + "Produce libguide (version 4) or libomp (version 5)") +set(LIBOMP_OMP_VERSION 45 CACHE STRING + "The OpenMP version (45/40/30)") +set(LIBOMP_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(LIBOMP_FORTRAN_MODULES false CACHE BOOL + "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 -DLIBOMP_MICRO_TESTS=OFF to cmake +set(LIBOMP_TEST_TOUCH true CACHE BOOL + "Perform a small touch test?") +set(LIBOMP_TEST_RELO true CACHE BOOL + "Perform a relocation test for dynamic libraries?") +set(LIBOMP_TEST_EXECSTACK true CACHE BOOL + "Perform a execstack test for linux dynamic libraries?") +set(LIBOMP_TEST_INSTR true CACHE BOOL + "Perform an instruction test for Intel(R) MIC Architecture libraries?") +set(LIBOMP_TEST_DEPS true CACHE BOOL + "Perform a library dependency test?") +set(LIBOMP_MICRO_TESTS true 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(LIBOMP_STATS false CACHE BOOL + "Stats-Gathering functionality?") + +# - Support for universal fat binary builds on Mac +# - Having this extra variable allows people to build this library as a universal library +# without forcing a universal build of the llvm/clang compiler. +set(LIBOMP_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}" CACHE STRING + "For Mac builds, semicolon separated list of architectures to build for universal fat binary.") +set(CMAKE_OSX_ARCHITECTURES ${LIBOMP_OSX_ARCHITECTURES}) + +# - Code that allows the OpenMP library to conveniently interface with debuggers +set(LIBOMP_USE_DEBUGGER true CACHE BOOL + "Enable debugger interface code?") + +# OMPT-support +set(LIBOMP_OMPT_SUPPORT false CACHE BOOL + "OMPT-support?") +set(LIBOMP_OMPT_BLAME true CACHE BOOL + "OMPT-blame?") +set(LIBOMP_OMPT_TRACE true CACHE BOOL + "OMPT-trace?") + +# User specified flags. These are appended to the predetermined flags found +# in CommonFlags.cmake and ${CMAKE_C_COMPILER_ID}/*Flags.cmake (e.g., GNU/CFlags.cmake) +set(LIBOMP_CFLAGS "" CACHE STRING + "Appended user specified C compiler flags.") +set(LIBOMP_CXXFLAGS "" CACHE STRING + "Appended user specified C++ compiler flags.") +set(LIBOMP_CPPFLAGS "" CACHE STRING + "Appended user specified C preprocessor flags.") +set(LIBOMP_ASMFLAGS "" CACHE STRING + "Appended user specified assembler flags.") +set(LIBOMP_LDFLAGS "" CACHE STRING + "Appended user specified linker flags.") +set(LIBOMP_LIBFLAGS "" CACHE STRING + "Appended user specified linked libs flags. (e.g., -lm)") +set(LIBOMP_FFLAGS "" CACHE STRING + "Appended user specified Fortran compiler flags. These are only used if LIBOMP_FORTRAN_MODULES==true.") + +# Should the libomp library and generated headers be copied into the original source exports/ directory +# Turning this to false aids parallel builds to not interfere with each other. +set(LIBOMP_COPY_EXPORTS true CACHE STRING + "Should exports be copied into source exports/ directory?") + +# HWLOC-support +set(LIBOMP_USE_HWLOC FALSE CACHE BOOL + "Use Hwloc (http://www.open-mpi.org/projects/hwloc/) library for affinity?") +set(LIBOMP_HWLOC_INSTALL_DIR /usr/local CACHE PATH + "Install path for hwloc library") + +# - 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() + +if(${LIBOMP_STANDALONE_BUILD}) + # Allow user to choose a suffix for the installation directory, or if part of + # LLVM build then just use LLVM_LIBDIR_SUFFIX + set(LIBOMP_LIBDIR_SUFFIX "" CACHE STRING + "suffix of lib installation directory e.g., 64 => lib64") + # Should assertions be enabled? They are on by default, or it part of + # LLVM build then just use LLVM_ENABLE_ASSERTIONS + set(LIBOMP_ENABLE_ASSERTIONS TRUE CACHE BOOL + "enable assertions?") +else() + set(LIBOMP_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX}) + set(LIBOMP_ENABLE_ASSERTIONS ${LLVM_ENABLE_ASSERTIONS}) +endif() + +# Check valid values +check_variable(LIBOMP_OS "${os_possible_values}") +check_variable(LIBOMP_ARCH "${arch_possible_values}") +check_variable(LIBOMP_OMP_VERSION "${omp_version_possible_values}") +check_variable(LIBOMP_LIB_TYPE "${lib_type_possible_values}") +if("${LIBOMP_ARCH}" STREQUAL "mic") + check_variable(LIBOMP_MIC_ARCH "${mic_arch_possible_values}") +endif() +# Get the build number from kmp_version.c +get_build_number("${CMAKE_CURRENT_SOURCE_DIR}" build_number) +math(EXPR LIBOMP_VERSION_BUILD_YEAR "${build_number}/10000") +math(EXPR LIBOMP_VERSION_BUILD_MONTH_DAY "${build_number}%10000") + +# 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) +if("${LIBOMP_OS}" STREQUAL "lin") + set(LINUX TRUE) + set(real_os lin) +elseif("${LIBOMP_OS}" STREQUAL "mac") + set(MAC TRUE) + set(real_os mac) +elseif("${LIBOMP_OS}" STREQUAL "win") + set(WINDOWS TRUE) + set(real_os win) +endif() + +# Architecture +set(IA32 FALSE) +set(INTEL64 FALSE) +set(ARM FALSE) +set(AARCH64 FALSE) +set(PPC64BE FALSE) +set(PPC64LE FALSE) +set(PPC64 FALSE) +if("${LIBOMP_ARCH}" STREQUAL "32") # IA-32 architecture + set(IA32 TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "32e") # Intel(R) 64 architecture + set(INTEL64 TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "arm") # ARM architecture + set(ARM TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "ppc64") # PPC64BE architecture + set(PPC64BE TRUE) + set(PPC64 TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "ppc64le") # PPC64LE architecture + set(PPC64LE TRUE) + set(PPC64 TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "aarch64") # AARCH64 architecture + set(AARCH64 TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "mic") # Intel(R) Many Integrated Core Architecture + set(MIC 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() + +# Include itt notify interface? Right now, always. +set(LIBOMP_USE_ITT_NOTIFY TRUE) + +# normal, profile, stubs library. +set(NORMAL_LIBRARY FALSE) +set(STUBS_LIBRARY FALSE) +set(PROFILE_LIBRARY FALSE) +if("${LIBOMP_LIB_TYPE}" STREQUAL "normal") + set(NORMAL_LIBRARY TRUE) +elseif("${LIBOMP_LIB_TYPE}" STREQUAL "profile") + set(PROFILE_LIBRARY TRUE) +elseif("${LIBOMP_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(LIBOMP_COMPILER_SUPPORTS_QUAD_PRECISION false CACHE BOOL + "*INCOMPLETE* Does the compiler support a 128-bit floating point type?") +set(LIBOMP_COMPILER_QUAD_TYPE "" CACHE STRING + "*INCOMPLETE* The quad precision data type (e.g., for gcc, __float128)") + +# - 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 libomp.dbg. +set(LIBOMP_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(LIBOMP_USE_PREDEFINED_LINKER_FLAGS true CACHE BOOL + "Should the build use the predefined linker flags in CommonFlags.cmake?") + +# - On multinode systems, larger alignment is desired to avoid false sharing +set(LIBOMP_USE_INTERNODE_ALIGNMENT false CACHE BOOL + "Should larger alignment (4096 bytes) be used for some locks and data structures?") + +# - libgomp drop-in compatibility +if(${LINUX} AND NOT ${PPC64}) + set(LIBOMP_USE_VERSION_SYMBOLS true CACHE BOOL + "Should version symbols be used? These provide binary compatibility with libgomp.") +else() + set(LIBOMP_USE_VERSION_SYMBOLS false) +endif() + +# - TSX based locks have __asm code which can be troublesome for some compilers. This feature is also x86 specific. +if((${IA32} OR ${INTEL64} OR ${MIC}) AND NOT MSVC) + set(LIBOMP_USE_ADAPTIVE_LOCKS true CACHE BOOL + "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp). These are x86 specific.") +else() + set(LIBOMP_USE_ADAPTIVE_LOCKS false) +endif() + +################################## +# Error checking the configuration +if(${LIBOMP_STATS} AND (${WINDOWS} OR ${MAC})) + error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture") +endif() +if(${LIBOMP_STATS} AND NOT (${IA32} OR ${INTEL64} OR ${MIC})) + error_say("Stats-gathering functionality is only supported on x86-Linux and Intel(R) MIC Architecture") +endif() +if(${LIBOMP_USE_ADAPTIVE_LOCKS} AND NOT(${IA32} OR ${INTEL64} OR ${MIC})) + error_say("Adaptive locks (TSX) functionality is only supported on x86 Architecture") +endif() +if(${LIBOMP_OMPT_SUPPORT} AND ${WINDOWS}) + error_say("OpenMP Tools Interface is not supported on Windows") +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 "${LIBOMP_OMP_VERSION}" STREQUAL "45") + set(suffix "${suffix}.${LIBOMP_OMP_VERSION}") +endif() +if(${LIBOMP_STATS}) + set(suffix "${suffix}.s1") +endif() +if(${LIBOMP_OMPT_SUPPORT}) + set(suffix "${suffix}.ompt") + if(NOT ${LIBOMP_OMPT_BLAME}) + set(suffix "${suffix}.no-ompt-blame") + endif() + if(NOT ${LIBOMP_OMPT_TRACE}) + set(suffix "${suffix}.no-ompt-trace") + 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 +if(${MIC}) + set(platform "${real_os}_${LIBOMP_MIC_ARCH}") # e.g., lin_knf, lin_knc +else() + set(platform "${real_os}_${LIBOMP_ARCH}") # e.g., lin_32e, mac_32 +endif() +# build directory (Where CMakeCache.txt is created, build files generated) +set(build_dir "${CMAKE_CURRENT_BINARY_DIR}") +set(src_dir "${CMAKE_CURRENT_SOURCE_DIR}/src") +set(tools_dir "${CMAKE_CURRENT_SOURCE_DIR}/tools") +set(export_dir "${CMAKE_CURRENT_SOURCE_DIR}/exports") +set(export_ptf_dir "${export_dir}/${platform}${suffix}") +set(export_cmn_dir "${export_dir}/common${suffix}/include") +set(export_inc_dir "${export_ptf_dir}/include") +set(export_mod_dir "${export_ptf_dir}/include_compat") +_export_lib_dir(${platform} export_lib_dir) # set exports directory (relative to build_dir) e.g., ../exports/lin_32e/lib/ + # or ../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 "${src_dir}/include/${LIBOMP_OMP_VERSION}") + +############################ +# Setting final library name +set(lib_item "libiomp5") +if(${PROFILE_LIBRARY}) + set(lib_item "${lib_item}prof") +endif() +if(${STUBS_LIBRARY}) + set(lib_item "${lib_item}stubs") +endif() +if(${WINDOWS}) + set(lib_item "${lib_item}md") +endif() +set(LIBOMP_LIB_NAME "${lib_item}" CACHE STRING "OMP library name") +set(lib_ext "${dll}") +# ${lib_file} is real library name: +# libomp.so for Linux +# libomp.dylib for Mac +# libompmd.dll for Windows +set(lib_file "${LIBOMP_LIB_NAME}${lib_ext}") + +######################################## +# Setting export file names +if(${WINDOWS}) + set(imp_file "${lib_item}${lib}") # this is exported (libomp.lib) + set(def_file "${lib_item}.def") # this is not exported + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR + "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo" OR + ${LIBOMP_USE_BUILDPL_RULES}) + set(pdb_file "${lib_file}.pdb") # this is exported if it exists (libompmd.dll.pdb) + endif() +endif() +set(export_lib_files "${lib_file}" "${imp_file}" "${pdb_file}") +set(export_mod_files "omp_lib.mod" "omp_lib_kinds.mod") +set(export_cmn_files "omp.h" "omp_lib.h" "omp_lib.f" "omp_lib.f90") + +if(${LIBOMP_OMPT_SUPPORT}) + set(export_cmn_files ${export_cmn_files} "ompt.h") +endif() + +if("${export_lib_fat_dir}") + set(export_lib_fat_files "${lib_file}" "${imp_file}") +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 LIBOMP_*FLAGS are added. +# * Cannot use CMAKE_*_FLAGS directly because -x c++ is put in the linker command and mangles the linking phase. + +# 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 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. + 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 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) +# Windows specific for creating import library +list_to_string("${AR_FLAGS}" AR_FLAGS) +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) +# Windows specific for creating import library +string(STRIP "${AR_FLAGS}" AR_FLAGS) + +# 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=${LIBOMP_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 +set(lib_src_files "${lib_c_items}" "${lib_cxx_items}" "${lib_asm_items}") +set(imp_src_files "${imp_c_items}") + +##################################################################### +# 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(date) +debug_say_var(LIBOMP_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) + +#################################################################### +# Print configuration after all variables are set. +if(${LIBOMP_STANDALONE_BUILD}) + say("LIBOMP: Operating System -- ${LIBOMP_OS}") + say("LIBOMP: Target Architecture -- ${LIBOMP_ARCH}") + if(${MIC}) + say("LIBOMP: Intel(R) MIC Architecture -- ${LIBOMP_MIC_ARCH}") + endif() + say("LIBOMP: Build Type -- ${CMAKE_BUILD_TYPE}") + say("LIBOMP: OpenMP Version -- ${LIBOMP_OMP_VERSION}") + say("LIBOMP: Lib Type -- ${LIBOMP_LIB_TYPE}") + say("LIBOMP: Fortran Modules -- ${LIBOMP_FORTRAN_MODULES}") + # will say development if all zeros + if("${build_number}" STREQUAL "00000000") + set(build "development") + else() + set(build "${build_number}") + endif() + say("LIBOMP: Build -- ${build}") + say("LIBOMP: Stats-Gathering -- ${LIBOMP_STATS}") + say("LIBOMP: Debugger-support -- ${LIBOMP_USE_DEBUGGER}") + say("LIBOMP: OMPT-support -- ${LIBOMP_OMPT_SUPPORT}") + if(${LIBOMP_OMPT_SUPPORT}) + say("LIBOMP: OMPT-blame -- ${LIBOMP_OMPT_BLAME}") + say("LIBOMP: OMPT-trace -- ${LIBOMP_OMPT_TRACE}") + endif() + say("LIBOMP: Use build.pl rules -- ${LIBOMP_USE_BUILDPL_RULES}") + say("LIBOMP: Adaptive locks -- ${LIBOMP_USE_ADAPTIVE_LOCKS}") + say("LIBOMP: Use predefined linker flags -- ${LIBOMP_USE_PREDEFINED_LINKER_FLAGS}") + say("LIBOMP: Compiler supports quad precision -- ${LIBOMP_COMPILER_SUPPORTS_QUAD_PRECISION}") + say("LIBOMP: Use Hwloc library -- ${LIBOMP_USE_HWLOC}") +endif() + +add_subdirectory(src) + diff --git a/src/libomp_oss/LICENSE.txt b/src/libomp_oss/LICENSE.txt new file mode 100644 index 0000000..18fca0d --- /dev/null +++ b/src/libomp_oss/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2013-2016, Intel Corporation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/libomp_oss/Makefile b/src/libomp_oss/Makefile new file mode 100644 index 0000000..311d58b --- /dev/null +++ b/src/libomp_oss/Makefile @@ -0,0 +1,68 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +omp_root?=. +include $(omp_root)/tools/common.inc +.PHONY: default all omp + +default: omp + +all: omp stubs + +omp: info mkdir + @echo $(omp_root)/tools/build.pl $(build_args) --arch=$(arch) --mode=$(mode) lib inc common -- -j$(jobs) + $(omp_root)/tools/build.pl $(build_args) --arch=$(arch) --mode=$(mode) lib inc common -- -j$(jobs) + +stubs: mkdir + @echo $(omp_root)/tools/build.pl $(build_args) --arch=$(arch) --mode=$(mode) --stubs lib inc common -- -j$(jobs) + $(omp_root)/tools/build.pl $(build_args) --arch=$(arch) --mode=$(mode) --stubs lib inc common -- -j$(jobs) + +.PHONY: clean info + +clean: + $(shell $(RM) -rf $(omp_root)$(SLASH)tmp) + @echo clean done + +mkdir: + $(shell $(MD) $(omp_root)$(SLASH)tmp >$(NUL) 2>$(NUL)) + @echo Created $(omp_root)$(SLASH)tmp directory + +info: + @echo omp_root=$(omp_root) + @echo omp_os=$(omp_os) + @echo arch=$(arch) +ifeq "$(arch)" "mic" + @echo mic_arch=$(mic_arch) +endif + @echo compiler=$(compiler) + @echo mic=$(mic) + @echo mode=$(mode) + @echo jobs=$(jobs) + diff --git a/src/libomp_oss/README.txt b/src/libomp_oss/README.txt new file mode 100644 index 0000000..7cc23bf --- /dev/null +++ b/src/libomp_oss/README.txt @@ -0,0 +1,155 @@ + + README for Intel(R) OpenMP* Runtime Library + =========================================== + +How to Build Documentation +========================== + +The main documentation is in Doxygen* format, and this distribution +should come with pre-built PDF documentation in doc/Reference.pdf. +However, an HTML version can be built by executing: + +% doxygen doc/doxygen/config + +in this directory. + +That will produce HTML documentation in the doc/doxygen/generated +directory, which can be accessed by pointing a web browser at the +index.html file there. + +If you don't have Doxygen installed, you can download it from +www.doxygen.org. + + +How to Build the Intel(R) OpenMP* Runtime Library +================================================= + +The library can be built either using Cmake, or using a makefile that +in turn invokes various Perl scripts. For porting, non X86 +architectures, and for those already familiar with Cmake that may be +an easier route to take than the one described here. + +Building with CMake +=================== +The runtime/Build_With_CMake.txt file has a description of how to +build with Cmake. + +Building with the Makefile +========================== +The Makefile at the top-level will attempt to detect what it needs to +build the Intel(R) OpenMP* Runtime Library. To see the default settings, +type: + +make info + +You can change the Makefile's behavior with the following options: + +omp_root: The path to the top-level directory containing the top-level + Makefile. By default, this will take on the value of the + current working directory. + +omp_os: Operating system. By default, the build will attempt to + detect this. Currently supports "linux", "macos", and + "windows". + +arch: Architecture. By default, the build will attempt to + detect this if not specified by the user. Currently + supported values are + "32" for IA-32 architecture + "32e" for Intel(R) 64 architecture + "mic" for Intel(R) Many Integrated Core Architecture + "arm" for ARM* architecture + "aarch64" for Aarch64 (64-bit ARM) architecture + "ppc64" for IBM(R) Power architecture (big endian) + "ppc64le" for IBM(R) Power architecture (little endian) + + If "mic" is specified then "icc" will be used as the + compiler, and appropriate k1om binutils will be used. The + necessary packages must be installed on the build machine + for this to be possible (but an Intel(R) Xeon Phi(TM) + coprocessor card is not required to build the library). + +compiler: Which compiler to use for the build. Defaults to "icc" + or "icl" depending on the value of omp_os. Also supports + some versions of "gcc"* when omp_os is "linux". The selected + compiler should be installed and in the user's path. The + corresponding Fortran compiler should also be in the path. + See "Supported RTL Build Configurations" below for more + information on compiler versions. + +mode: Library mode: default is "release". Also supports "debug". + +jobs: The number of parallel jobs for the underlying call to make. + This value is sent as the parameter to the -j flag for make. + This value defaults to "1", but can be set to any positive integer. + +To use any of the options above, simple add =. For +example, if you want to build with gcc instead of icc, type: + +make compiler=gcc + +On OS X* machines, it is possible to build universal (or fat) libraries which +include both IA-32 architecture and Intel(R) 64 architecture objects in a +single archive; just build the 32 and 32e libraries separately, then invoke +make again with a special argument as follows: + +make compiler=clang build_args=fat + +Supported RTL Build Configurations +================================== + +Supported Architectures: IA-32 architecture, Intel(R) 64, and +Intel(R) Many Integrated Core Architecture + + ---------------------------------------------- + | icc/icl | gcc | clang | +--------------|---------------|----------------------------| +| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) | +| FreeBSD* | No | No | Yes(4,6,7,8) | +| OS X* | Yes(1,3,4) | No | Yes(4,6,7) | +| Windows* OS | Yes(1,4) | No | No | +------------------------------------------------------------ + +(1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are + supported (12.1 is recommended). +(2) GCC* version 4.7 is supported. +(3) For icc on OS X*, OS X* version 10.5.8 is supported. +(4) Intel(R) Many Integrated Core Architecture not supported. +(5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0 + or later are required. +(6) Clang* version 3.3 is supported. +(7) Clang* currently does not offer a software-implemented 128 bit extended + precision type. Thus, all entry points reliant on this type are removed + from the library and cannot be called in the user program. The following + functions are not available: + __kmpc_atomic_cmplx16_* + __kmpc_atomic_float16_* + __kmpc_atomic_*_fp +(8) Community contribution provided AS IS, not tested by Intel. + +Supported Architectures: IBM(R) Power 7 and Power 8 + + ----------------------------- + | gcc | clang | +--------------|------------|--------------| +| Linux* OS | Yes(1,2) | Yes(3,4) | +------------------------------------------- + +(1) On Power 7, gcc version 4.8.2 is supported. +(2) On Power 8, gcc version 4.8.2 is supported. +(3) On Power 7, clang version 3.7 is supported. +(4) On Power 8, clang version 3.7 is supported. + + +Front-end Compilers that work with this RTL +=========================================== + +The following compilers are known to do compatible code generation for +this RTL: icc/icl, gcc. See the documentation for more detail. + +----------------------------------------------------------------------- + +Notices +======= + +*Other names and brands may be claimed as the property of others. diff --git a/src/libomp_oss/cmake/BuildPLRules.cmake b/src/libomp_oss/cmake/BuildPLRules.cmake new file mode 100644 index 0000000..1b4288f --- /dev/null +++ b/src/libomp_oss/cmake/BuildPLRules.cmake @@ -0,0 +1,131 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +############################################################################### +# This file contains additional build rules that correspond to build.pl's rules. +# Building libomp.dbg is linux only, Windows will build libompmd.dll.pdb +# This file is only active if ${LIBOMP_USE_BUILDPL_RULES} is true. +# +# ######### BUILD DEPENDENCIES ########## +# +# exports/.../libomp.so exports/.../libomp.dbg +# [copy] | | [copy] +# | | +# ./libomp.so ./libomp.dbg +# [copy] / OR \____________ [copy] | [copy] +# / \ | +# ./unstripped/libomp.so ./stripped/libomp.so ./unstripped/libomp.dbg +# / \ / +# / [linking] \[strip] /[strip and store] +# / \ / +# ${objs} (maybe compiled with -g) ./unstripped/libomp.so (library with debug info in it) +# | +# | [linking] +# | +# ${objs} (always compiled with -g) +# +# For icc Linux builds, we always include debugging information via -g and create libomp.dbg +# so that Intel(R) Parallel Amplifier can use the .dbg file. +# For icc Windows builds, we always include debugging information via -Zi and create libomp.pdb +# in a fashion similar to libomp.dbg +# For icc Mac builds, we don't bother with the debug info. + +# We build library in unstripped directory +file(MAKE_DIRECTORY ${build_dir}/unstripped) + +# Only build the .dbg file for Release builds +# Debug and RelWithDebInfo builds should not create a .dbg file. +# The debug info should remain in the library file. +if(${LINUX} AND ${RELEASE_BUILD}) + set(dbg_file ${lib_item}.dbg) +endif() + +################################ +# --- Create $(lib_file).dbg --- +if(NOT "${dbg_file}" STREQUAL "") + # if a ${dbg_file} file is going to be created, then + file(MAKE_DIRECTORY ${build_dir}/stripped) + + # ./${lib_file} : stripped/${lib_file} + # copy stripped/${lib_file} ./${lib_file} + simple_copy_recipe("${lib_file}" "${build_dir}/stripped" "${build_dir}") + + # stripped/${lib_file} : unstripped/${lib_file} ./${dbg_file} + # objcopy --strip-debug unstripped/${lib_file} stripped/${lib_file}.tmp + # objcopy --add-gnu-debuglink=${dbg_file} stripped/${lib_file}.tmp stripped/${lib_file} + add_custom_command( + OUTPUT ${build_dir}/stripped/${lib_file} + COMMAND ${CMAKE_OBJCOPY} --strip-debug ${build_dir}/unstripped/${lib_file} ${build_dir}/stripped/${lib_file}.tmp + COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=${dbg_file} ${build_dir}/stripped/${lib_file}.tmp ${build_dir}/stripped/${lib_file} + DEPENDS "${build_dir}/${dbg_file}" + ) + + # ./${dbg_file} : unstripped/${dbg_file} + # copy unstripped/${dbg_file} ./${dbg_file} + simple_copy_recipe("${dbg_file}" "${build_dir}/unstripped" "${build_dir}") + + # unstripped/${dbg_file} : unstripped/${lib_file} + # objcopy --only-keep-debug unstripped/${lib_file} unstripped/${dbg_file} + add_custom_command( + OUTPUT ${build_dir}/unstripped/${dbg_file} + COMMAND ${CMAKE_OBJCOPY} --only-keep-debug ${build_dir}/unstripped/${lib_file} ${build_dir}/unstripped/${dbg_file} + DEPENDS omp + ) + +else() + + # ./${lib_file} : unstripped/${lib_file} + # copy unstripped/${lib_file} ./${lib_file} + simple_copy_recipe("${lib_file}" "${build_dir}/unstripped" "${build_dir}") +endif() + +# Windows specific command to move around debug info files post-build +if(NOT "${pdb_file}" STREQUAL "" AND ${RELEASE_BUILD}) + add_custom_command(TARGET omp POST_BUILD + COMMAND ${CMAKE_COMMAND} -E rename ${pdb_file} ${pdb_file}.nonstripped + COMMAND ${CMAKE_COMMAND} -E rename ${pdb_file}.stripped ${pdb_file} + ) +endif() + +# Have icc build libomp in unstripped directory +set_target_properties(omp PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${build_dir}/unstripped" + RUNTIME_OUTPUT_DIRECTORY "${build_dir}/unstripped" + ARCHIVE_OUTPUT_DIRECTORY "${build_dir}" +) + +# Always use RelWithDebInfo flags for Release builds when using the build.pl's build rules (use -g -O2 instead of just -O3) +# The debug info is then stripped out at the end of the build and put into libomp.dbg for Linux +if(${RELEASE_BUILD} AND NOT ${MAC}) + set(CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELWITHDEBINFO} ) + set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}) + set(CMAKE_ASM_FLAGS_RELEASE ${CMAKE_ASM_FLAGS_RELWITHDEBINFO}) +endif() + diff --git a/src/libomp_oss/cmake/Clang/AsmFlags.cmake b/src/libomp_oss/cmake/Clang/AsmFlags.cmake new file mode 100644 index 0000000..08e684f --- /dev/null +++ b/src/libomp_oss/cmake/Clang/AsmFlags.cmake @@ -0,0 +1,46 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Clang (clang/clang++) specific compiler dependent flags +# The flag types are: +# 1) Assembly flags + +######################################################### +# Assembly flags +function(append_assembler_specific_asm_flags input_asm_flags) + set(local_asm_flags) + append_asm_flags("-x assembler-with-cpp") # Assembly file that needs to be preprocessed + if(${IA32}) + append_asm_flags("-m32") # Generate 32 bit IA-32 architecture code + append_asm_flags("-msse2") # Allow use of Streaming SIMD Instructions + endif() + set(${input_asm_flags} ${${input_asm_flags}} "${local_asm_flags}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/Clang/CFlags.cmake b/src/libomp_oss/cmake/Clang/CFlags.cmake new file mode 100644 index 0000000..8860207 --- /dev/null +++ b/src/libomp_oss/cmake/Clang/CFlags.cmake @@ -0,0 +1,69 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Clang (clang/clang++) specific compiler dependent flags +# The flag types are: +# 1) C/C++ Compiler flags +# 2) Linker flags + +######################################################### +# C/C++ Compiler flags +function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags) + set(local_c_flags) + set(local_cxx_flags) + append_c_and_cxx_flags("-std=c++0x") # Enables support for many C++11 (formerly known as C++0x) features. The following are the most recently added features: + append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled. + append_c_and_cxx_flags("-x c++") # Compile C files as C++ files + if(${IA32}) + append_c_and_cxx_flags("-m32") # Generate 32 bit IA-32 architecture code + append_c_and_cxx_flags("-msse2") # Allow use of Streaming SIMD Instructions + elseif(${ARM}) + append_c_and_cxx_flags("-marm") # Target the ARM architecture + endif() + append_c_and_cxx_flags("-Wno-unused-value") # Don't warn about unused values + append_c_and_cxx_flags("-Wno-switch") # Don't warn about switch statements that don't cover entire range of values + append_c_and_cxx_flags("-Wno-deprecated-register") # Don't warn about using register keyword + set(${input_c_flags} ${${input_c_flags}} "${local_c_flags}" PARENT_SCOPE) + set(${input_cxx_flags} ${${input_cxx_flags}} "${local_cxx_flags}" PARENT_SCOPE) +endfunction() + +######################################################### +# Linker flags +function(append_compiler_specific_linker_flags input_ld_flags input_ld_flags_libs) + set(local_ld_flags) + set(local_ld_flags_libs) + if(${IA32}) + append_linker_flags("-m32") + append_linker_flags("-msse2") + endif() + set(${input_ld_flags} ${${input_ld_flags}} "${local_ld_flags}" PARENT_SCOPE) + set(${input_ld_flags_libs} ${${input_ld_flags_libs}} "${local_ld_flags_libs}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/CommonFlags.cmake b/src/libomp_oss/cmake/CommonFlags.cmake new file mode 100644 index 0000000..5ddc313 --- /dev/null +++ b/src/libomp_oss/cmake/CommonFlags.cmake @@ -0,0 +1,166 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds the common flags independent of compiler +# The flag types are: +# 1) Assembly flags (append_asm_flags_common) +# 2) C/C++ Compiler flags (append_c_and_cxx_flags_common) +# 3) Fortran Compiler flags (append_fort_flags_common) +# 4) Linker flags (append_linker_flags_common) +# 5) Archiver flags (append_archiver_flags_common) + +# These append_* macros all append to the corresponding list variable holding the flags. +macro(append_c_flags new_flag) + list(APPEND local_c_flags "${new_flag}") +endmacro() + +macro(append_cxx_flags new_flag) + list(APPEND local_cxx_flags "${new_flag}") +endmacro() + +macro(append_c_and_cxx_flags new_flag) + append_c_flags("${new_flag}") + append_cxx_flags("${new_flag}") +endmacro() + +macro(append_asm_flags new_flag) + list(APPEND local_asm_flags "${new_flag}") +endmacro() + +macro(append_fort_flags new_flag) + list(APPEND local_fort_flags "${new_flag}") +endmacro() + +# The difference between linker_flags and linker_flags_libs is linker_flags_libs +# is put at the end of the linker command where linking libraries should be done. +macro(append_linker_flags new_flag) + list(APPEND local_ld_flags "${new_flag}") +endmacro() + +macro(append_linker_flags_library new_flag) + list(APPEND local_ld_flags_libs "${new_flag}") +endmacro() + +macro(append_archiver_flags new_flag) + list(APPEND local_ar_flags "${new_flag}") +endmacro() + +######################################################### +# Global Assembly flags +function(append_asm_flags_common input_asm_flags) + set(local_asm_flags) + set(${input_asm_flags} "${${input_asm_flags}}" "${local_asm_flags}" "${LIBOMP_ASMFLAGS}" PARENT_SCOPE) +endfunction() + +######################################################### +# Global C/C++ Compiler flags +function(append_c_and_cxx_flags_common input_c_flags input_cxx_flags) + set(local_c_flags) + set(local_cxx_flags) + set(${input_c_flags} "${${input_c_flags}}" "${local_c_flags}" "${LIBOMP_CFLAGS}" PARENT_SCOPE) + set(${input_cxx_flags} "${${input_cxx_flags}}" "${local_cxx_flags}" "${LIBOMP_CXXFLAGS}" PARENT_SCOPE) +endfunction() + +######################################################### +# Global Fortran Compiler flags (for creating .mod files) +function(append_fort_flags_common input_fort_flags) + set(local_fort_flags) + set(${input_fort_flags} "${${input_fort_flags}}" "${local_fort_flags}" "${LIBOMP_FFLAGS}" PARENT_SCOPE) +endfunction() + +######################################################### +# Linker flags +function(append_linker_flags_common input_ld_flags input_ld_flags_libs) + set(local_ld_flags) + set(local_ld_flags_libs) + + if(${LIBOMP_USE_PREDEFINED_LINKER_FLAGS}) + + ################################# + # Windows linker flags + if(${WINDOWS}) + + ################## + # MAC linker flags + elseif(${MAC}) + append_linker_flags("-single_module") + append_linker_flags("-current_version ${LIBOMP_VERSION}.0") + append_linker_flags("-compatibility_version ${LIBOMP_VERSION}.0") + ##################################################################################### + # Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) linker flags + elseif(${MIC}) + append_linker_flags("-Wl,-x") + append_linker_flags("-Wl,--warn-shared-textrel") # Warn if the linker adds a DT_TEXTREL to a shared object. + append_linker_flags("-Wl,--as-needed") + append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries + if(NOT ${STUBS_LIBRARY}) + append_linker_flags_library("-pthread") # link in pthread library + endif() + if(${LIBOMP_STATS}) + append_linker_flags_library("-Wl,-lstdc++") # link in standard c++ library (stats-gathering needs it) + endif() + if(${LIBOMP_USE_HWLOC}) + append_linker_flags_library("${LIBOMP_HWLOC_LIBRARY}") + endif() + ######################### + # Unix based linker flags + else() + IF(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + append_linker_flags_library("-lm") + ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + # For now, always include --version-script flag on Unix systems. + append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries + append_linker_flags("-Wl,-z,noexecstack") # Marks the object as not requiring executable stack. + append_linker_flags("-Wl,--as-needed") # Only adds library dependencies as they are needed. (if libomp actually uses a function from the library, then add it) + if(NOT ${STUBS_LIBRARY}) + append_linker_flags("-Wl,--warn-shared-textrel") # Warn if the linker adds a DT_TEXTREL to a shared object. + append_linker_flags("-Wl,-fini=__kmp_internal_end_fini") # When creating an ELF executable or shared object, call NAME when the + # executable or shared object is unloaded, by setting DT_FINI to the + # address of the function. By default, the linker uses "_fini" as the function to call. + append_linker_flags_library("-pthread") # link pthread library + if(${LIBOMP_USE_HWLOC}) + append_linker_flags_library("${LIBOMP_HWLOC_LIBRARY}") + endif() + endif() + endif() # if(${OPERATING_SYSTEM}) ... + + endif() # LIBOMP_USE_PREDEFINED_LINKER_FLAGS + + set(${input_ld_flags} "${${input_ld_flags}}" "${local_ld_flags}" "${LIBOMP_LDFLAGS}" PARENT_SCOPE) + set(${input_ld_flags_libs} "${${input_ld_flags_libs}}" "${local_ld_flags_libs}" "${LIBOMP_LIBFLAGS}" PARENT_SCOPE) +endfunction() + +######################################################### +# Archiver Flags +function(append_archiver_flags_common input_ar_flags) + set(local_ar_flags) + set(${input_ar_flags} "${${input_ar_flags}}" "${local_ar_flags}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/Definitions.cmake b/src/libomp_oss/cmake/Definitions.cmake new file mode 100644 index 0000000..13a9249 --- /dev/null +++ b/src/libomp_oss/cmake/Definitions.cmake @@ -0,0 +1,193 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# void append_definitions(string new_flag); +# - appends new_flag to cpp_flags list +macro(append_definitions new_flag) + list(APPEND local_cpp_flags "${new_flag}") +endmacro() + +function(append_cpp_flags input_cpp_flags) + set(local_cpp_flags) + + append_definitions("-D USE_ITT_BUILD") + append_definitions("-D KMP_ARCH_STR=\"\\\\\"${legal_arch}\\\\\"\"") + if((NOT ${ARM}) AND (NOT ${IA32})) + append_definitions("-D BUILD_I8") + endif() + append_definitions("-D KMP_LIBRARY_FILE=\\\\\"${lib_file}\\\\\"") # yes... you need 5 backslashes... + append_definitions("-D KMP_VERSION_MAJOR=${LIBOMP_VERSION}") + append_definitions("-D KMP_NESTED_HOT_TEAMS") + + # customize to 128 bytes for ppc64 + if(${PPC64}) + append_definitions("-D CACHE_LINE=128") + else() + append_definitions("-D CACHE_LINE=64") + endif() + + append_definitions("-D KMP_ADJUST_BLOCKTIME=1") + append_definitions("-D BUILD_PARALLEL_ORDERED") + append_definitions("-D KMP_ASM_INTRINS") + if(${LIBOMP_USE_ITT_NOTIFY}) + append_definitions("-D USE_ITT_NOTIFY=1") + else() + append_definitions("-D USE_ITT_NOTIFY=0") + append_definitions("-D INTEL_NO_ITTNOTIFY_API") + endif() + append_definitions("-D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_") + + if(${LIBOMP_USE_VERSION_SYMBOLS}) + append_definitions("-D KMP_USE_VERSION_SYMBOLS") + endif() + + ##################### + # Windows definitions + if(${WINDOWS}) + append_definitions("-D _CRT_SECURE_NO_WARNINGS") + append_definitions("-D _CRT_SECURE_NO_DEPRECATE") + append_definitions("-D _WINDOWS") + append_definitions("-D _WINNT") + append_definitions("-D _WIN32_WINNT=0x0501") + append_definitions("-D KMP_WIN_CDECL") + append_definitions("-D _USRDLL") + if(${DEBUG_BUILD}) + append_definitions("-D _ITERATOR_DEBUG_LEVEL=0") + endif() + else() # Other than windows... (Unix based systems, Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture), and Mac) + append_definitions("-D _GNU_SOURCE") + append_definitions("-D _REENTRANT") + append_definitions("-D BUILD_TV") + append_definitions("-D USE_CBLKDATA") + if(NOT "${LIBOMP_VERSION}" STREQUAL "4") + append_definitions("-D KMP_GOMP_COMPAT") + endif() + endif() + + # Any architecture other than Intel(R) MIC Architecture + if(NOT ${MIC}) + append_definitions("-D USE_LOAD_BALANCE") + endif() + + ################## + # Unix definitions + if(${LINUX}) + append_definitions("-D KMP_TDATA_GTID") + endif() + + ################################## + # Other conditional definitions + if(${LIBOMP_ENABLE_ASSERTIONS}) + append_definitions("-D KMP_USE_ASSERT") + endif() + append_definitions("-D KMP_DYNAMIC_LIB") + if(${STUBS_LIBRARY}) + append_definitions("-D KMP_STUB") + endif() + if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) + append_definitions("-D KMP_DEBUG") + endif() + if(${DEBUG_BUILD}) + append_definitions("-D _DEBUG") + append_definitions("-D BUILD_DEBUG") + endif() + if(${LIBOMP_STATS}) + append_definitions("-D KMP_STATS_ENABLED=1") + else() + append_definitions("-D KMP_STATS_ENABLED=0") + endif() + if(${LIBOMP_USE_DEBUGGER}) + append_definitions("-D USE_DEBUGGER=1") + else() + append_definitions("-D USE_DEBUGGER=0") + endif() + if(${LIBOMP_OMPT_SUPPORT}) + append_definitions("-D OMPT_SUPPORT=1") + else() + append_definitions("-D OMPT_SUPPORT=0") + endif() + if(${LIBOMP_OMPT_BLAME}) + append_definitions("-D OMPT_BLAME=1") + else() + append_definitions("-D OMPT_BLAME=0") + endif() + if(${LIBOMP_OMPT_TRACE}) + append_definitions("-D OMPT_TRACE=1") + else() + append_definitions("-D OMPT_TRACE=0") + endif() + if(${LIBOMP_USE_HWLOC}) + append_definitions("-D KMP_USE_HWLOC=1") + else() + append_definitions("-D KMP_USE_HWLOC=0") + endif() + + # OpenMP version flags + set(have_omp_50 0) + set(have_omp_45 0) + set(have_omp_40 0) + set(have_omp_30 0) + if(${LIBOMP_OMP_VERSION} EQUAL 50 OR ${LIBOMP_OMP_VERSION} GREATER 50) + set(have_omp_50 1) + endif() + if(${LIBOMP_OMP_VERSION} EQUAL 45 OR ${LIBOMP_OMP_VERSION} GREATER 45) + set(have_omp_45 1) + endif() + if(${LIBOMP_OMP_VERSION} EQUAL 40 OR ${LIBOMP_OMP_VERSION} GREATER 40) + set(have_omp_40 1) + endif() + if(${LIBOMP_OMP_VERSION} EQUAL 30 OR ${LIBOMP_OMP_VERSION} GREATER 30) + set(have_omp_30 1) + endif() + append_definitions("-D OMP_50_ENABLED=${have_omp_50}") + append_definitions("-D OMP_45_ENABLED=${have_omp_45}") + append_definitions("-D OMP_40_ENABLED=${have_omp_40}") + append_definitions("-D OMP_30_ENABLED=${have_omp_30}") + + # Architectural definitions + if(${INTEL64} OR ${IA32}) + if(${LIBOMP_USE_ADAPTIVE_LOCKS}) + append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=1") + else() + append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=0") + endif() + append_definitions("-D KMP_DEBUG_ADAPTIVE_LOCKS=0") + else() + append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=0") + append_definitions("-D KMP_DEBUG_ADAPTIVE_LOCKS=0") + endif() + if(${LIBOMP_USE_INTERNODE_ALIGNMENT}) + append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=1") + else() + append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=0") + endif() + set(${input_cpp_flags} "${${input_cpp_flags}}" "${local_cpp_flags}" "${LIBOMP_CPPFLAGS}" "$ENV{CPPFLAGS}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/GNU/AsmFlags.cmake b/src/libomp_oss/cmake/GNU/AsmFlags.cmake new file mode 100644 index 0000000..6b659aa --- /dev/null +++ b/src/libomp_oss/cmake/GNU/AsmFlags.cmake @@ -0,0 +1,46 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds GNU (gcc/g++) specific compiler dependent flags +# The flag types are: +# 1) Assembly flags + +######################################################### +# Assembly flags +function(append_assembler_specific_asm_flags input_asm_flags) + set(local_asm_flags) + append_asm_flags("-x assembler-with-cpp") # Assembly file that needs to be preprocessed + if(${IA32}) + append_asm_flags("-m32") # Generate 32 bit IA-32 architecture code + append_asm_flags("-msse2") # Allow use of Streaming SIMD Instructions + endif() + set(${input_asm_flags} ${${input_asm_flags}} "${local_asm_flags}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/GNU/CFlags.cmake b/src/libomp_oss/cmake/GNU/CFlags.cmake new file mode 100644 index 0000000..7c74afc --- /dev/null +++ b/src/libomp_oss/cmake/GNU/CFlags.cmake @@ -0,0 +1,75 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds GNU (gcc/g++) specific compiler dependent flags +# The flag types are: +# 2) C/C++ Compiler flags +# 4) Linker flags +unset(COMPILER_SUPPORTS_QUAD_PRECISION CACHE) +set(COMPILER_SUPPORTS_QUAD_PRECISION true CACHE BOOL "Does the compiler support a 128-bit floating point type?") +set(COMPILER_QUAD_TYPE __float128) + +######################################################### +# C/C++ Compiler flags +function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags) + set(local_c_flags) + set(local_cxx_flags) + append_c_and_cxx_flags("-std=c++0x") # Enables support for many C++11 (formerly known as C++0x) features. The following are the most recently added features: + append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled. + append_c_and_cxx_flags("-x c++") # Compile C files as C++ files + if(${IA32}) + append_c_and_cxx_flags("-m32") # Generate 32 bit IA-32 architecture code + append_c_and_cxx_flags("-msse2") # Allow use of Streaming SIMD Instructions + elseif(${ARM}) + append_c_and_cxx_flags("-marm") # Target the ARM architecture + endif() + set(${input_c_flags} ${${input_c_flags}} "${local_c_flags}" PARENT_SCOPE) + set(${input_cxx_flags} ${${input_cxx_flags}} "${local_cxx_flags}" PARENT_SCOPE) +endfunction() + +######################################################### +# Linker flags +function(append_compiler_specific_linker_flags input_ld_flags input_ld_flags_libs) + set(local_ld_flags) + set(local_ld_flags_libs) + if(${WINDOWS}) + elseif(${MAC}) + elseif(${MIC}) + else() + append_linker_flags("-static-libgcc") # Causes libgcc to be linked in statically + endif() + if(${IA32}) + append_linker_flags("-m32") + append_linker_flags("-msse2") + endif() + set(${input_ld_flags} ${${input_ld_flags}} "${local_ld_flags}" PARENT_SCOPE) + set(${input_ld_flags_libs} ${${input_ld_flags_libs}} "${local_ld_flags_libs}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/GNU/FortranFlags.cmake b/src/libomp_oss/cmake/GNU/FortranFlags.cmake new file mode 100644 index 0000000..1b379c7 --- /dev/null +++ b/src/libomp_oss/cmake/GNU/FortranFlags.cmake @@ -0,0 +1,44 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds GNU (gcc/g++) specific compiler dependent flags +# The flag types are: +# 1) Fortran Compiler flags + +######################################################### +# Fortran Compiler flags (for creating .mod files) +function(append_fortran_compiler_specific_fort_flags input_fort_flags) + set(local_fort_flags) + if(${IA32}) + append_fort_flags("-m32") + append_fort_flags("-msse2") + endif() + set(${input_fort_flags} ${${input_fort_flags}} "${local_fort_flags}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/cmake/GetArchitecture.cmake b/src/libomp_oss/cmake/GetArchitecture.cmake new file mode 100644 index 0000000..e36bdcd --- /dev/null +++ b/src/libomp_oss/cmake/GetArchitecture.cmake @@ -0,0 +1,86 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# Determine the architecture from predefined compiler macros +# The architecture name can only contain alphanumeric characters and underscores (i.e., C identifier) + +# void get_architecture(string* return_arch) +# - Returns the architecture in return_arch +function(get_architecture return_arch) + set(detect_arch_src_txt " + #if defined(__KNC__) + #error ARCHITECTURE=mic + #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) + #error ARCHITECTURE=32e + #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) + #error ARCHITECTURE=32 + #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) + #error ARCHITECTURE=arm + #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6ZK__) + #error ARCHITECTURE=arm + #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) + #error ARCHITECTURE=arm + #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) + #error ARCHITECTURE=arm + #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) + #error ARCHITECTURE=arm + #elif defined(__ARM_ARCH_2__) + #error ARCHITECTURE=arm + #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM) + #error ARCHITECTURE=arm + #elif defined(__aarch64__) + #error ARCHITECTURE=aarch64 + #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) + #error ARCHITECTURE=ppc64le + #elif defined(__powerpc64__) + #error ARCHITECTURE=ppc64 + #else + #error ARCHITECTURE=UnknownArchitecture + #endif + " + ) + # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/detect_arch.c" ${detect_arch_src_txt}) + + # Try to compile using the C Compiler. It will always error out with an #error directive, so store error output to ${local_architecture} + try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture) + + # Match the important architecture line and store only that matching string in ${local_architecture} + string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}") + + # Get rid of the ARCHITECTURE= part of the string + string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}") + + # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.) + set(${return_arch} "${local_architecture}" PARENT_SCOPE) + + # Remove ${detect_arch_src_txt} from cmake/ subdirectory + file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/detect_arch.c") +endfunction() diff --git a/src/libomp_oss/cmake/HelperFunctions.cmake b/src/libomp_oss/cmake/HelperFunctions.cmake new file mode 100644 index 0000000..f897730 --- /dev/null +++ b/src/libomp_oss/cmake/HelperFunctions.cmake @@ -0,0 +1,279 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +####################################### FUNCTIONS/MACROS ########################################### +# It should be noted that in cmake, functions can only be used on a single line with the return value +# stored in a parameter you send to the function. There isn't a true return value. So technically, +# all functions would have a C/C++ prototype of: +# void function_name(parameter1, parameter2, ...); +# +# If you want a return value, you have to use a parameter so the function prototype would be: +# void function_name(input_parameter1, input_parameter2, ..., return_value) +# ################## + +# void say(string message_to_user); +# - prints out message_to_user +macro(say message_to_user) + message(STATUS "${message_to_user}") +endmacro() + +# void warning_say(string message_to_user); +# - prints out message_to_user with a warning +macro(warning_say message_to_user) + message(WARNING "${message_to_user}") +endmacro() + +# void error_say(string message_to_user); +# - prints out message_to_user with an error and exits cmake +macro(error_say message_to_user) + message(FATAL_ERROR "${message_to_user}") +endmacro() + +# void debug_say(string message_to_developer); +# - prints out message when GLOBAL_DEBUG == 1 (for debugging cmake build) +macro(debug_say message_to_developer) + if(${GLOBAL_DEBUG} STREQUAL "1") + say("DEBUG: ${message_to_developer}") + endif() +endmacro() + +# void debug_say_var(variable var); +# - prints the variable name and its value (for debugging cmake build) +macro(debug_say_var var) + if(${GLOBAL_DEBUG} STREQUAL "1") + say("DEBUG: Variable: ${var} = ${${var}} ") + endif() +endmacro() + +# void set_legal_arch(string* return_arch_string); +# - returns (through return_arch_string) the formal architecture +# string or warns user of unknown architecture +function(set_legal_arch return_arch_string) + if(${IA32}) + set(${return_arch_string} "IA-32" PARENT_SCOPE) + elseif(${INTEL64}) + set(${return_arch_string} "Intel(R) 64" PARENT_SCOPE) + elseif(${MIC}) + set(${return_arch_string} "Intel(R) Many Integrated Core Architecture" PARENT_SCOPE) + elseif(${LIBOMP_ARCH} STREQUAL "l1") + set(${return_arch_string} "L1OM" PARENT_SCOPE) + elseif(${ARM}) + set(${return_arch_string} "ARM" PARENT_SCOPE) + elseif(${PPC64BE}) + set(${return_arch_string} "PPC64BE" PARENT_SCOPE) + elseif(${PPC64LE}) + set(${return_arch_string} "PPC64LE" PARENT_SCOPE) + elseif(${AARCH64}) + set(${return_arch_string} "AARCH64" PARENT_SCOPE) + else() + warning_say("set_legal_arch(): Warning: Unknown architecture...") + endif() +endfunction() + +# void check_variable(string var, string var_name, listvalues_list); +# - runs through values_list checking if ${var} == values_list[i] for any i. +# - if the var is found, then just print it out +# - if the var is not found, then warn user +function(check_variable var values_list) + set(valid_flag 0) + foreach(value IN LISTS values_list) + if("${${var}}" STREQUAL "${value}") + set(valid_flag 1) + set(the_value "${value}") + endif() + endforeach() + if(${valid_flag} EQUAL 0) + error_say("check_variable(): ${var} = ${${var}} is unknown") + endif() +endfunction() + +# void _export_lib_dir(string export_dir, string platform, string suffix, string* return_value); +# - basically a special case for mac platforms where it adds '.thin' to the output lib directory +function(_export_lib_dir pltfrm return_value) + if(${MAC}) + set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib.thin" PARENT_SCOPE) + else() + set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib" PARENT_SCOPE) + endif() +endfunction() + +# void _export_lib_fat_dir(string export_dir, string platform, string suffix, string* return_value); +# - another mac specialty case for fat libraries. +# - this sets export_lib_fat_dir in the MAIN part of CMakeLists.txt +function(_export_lib_fat_dir pltfrm return_value) + set(${return_value} "${export_dir}/${pltfrm}${suffix}/lib" PARENT_SCOPE) +endfunction() + +# void get_build_number(string src_dir, string* return_build_number); +# - grab the eight digit build number (or 00000000) from kmp_version.c +function(get_build_number src_dir return_build_number) + # sets file_lines_list to a list of all lines in kmp_version.c + file(STRINGS "${src_dir}/src/kmp_version.c" file_lines_list) + + # runs through each line in kmp_version.c + foreach(line IN LISTS file_lines_list) + # if the line begins with "#define KMP_VERSION_BUILD" then we take not of the build number + string(REGEX MATCH "^[ \t]*#define[ \t]+KMP_VERSION_BUILD" valid "${line}") + if(NOT "${valid}" STREQUAL "") # if we matched "#define KMP_VERSION_BUILD", then grab the build number + string(REGEX REPLACE "^[ \t]*#define[ \t]+KMP_VERSION_BUILD[ \t]+([0-9]+)" "\\1" + build_number "${line}" + ) + endif() + endforeach() + set(${return_build_number} "${build_number}" PARENT_SCOPE) # return build number +endfunction() + +# void set_legal_type(string* return_legal_type); +# - set the legal type name Performance/Profiling/Stub +function(set_legal_type return_legal_type) + if(${NORMAL_LIBRARY}) + set(${return_legal_type} "Performance" PARENT_SCOPE) + elseif(${PROFILE_LIBRARY}) + set(${return_legal_type} "Profiling" PARENT_SCOPE) + elseif(${STUBS_LIBRARY}) + set(${return_legal_type} "Stub" PARENT_SCOPE) + endif() +endfunction() + +# void set_mac_os_new(bool* return_mac_os_new); +# - sets the return_mac_os_new variable to true or false based on macosx version +# - no real "cmakey" way to do this. Have to call execute_process() +function(set_mac_os_new return_mac_os_new) + execute_process(COMMAND "sw_vers" "-productVersion" OUTPUT_VARIABLE mac_osx_version) + if("${mac_osx_version}" VERSION_GREATER "10.6") + set(${return_mac_os_new} TRUE PARENT_SCOPE) + else() + set(${return_mac_os_new} FALSE PARENT_SCOPE) + endif() +endfunction() + +# void add_prefix(string prefix, list* list_of_items); +# - returns list_of_items with prefix prepended to all items +# - original list is modified +function(add_prefix prefix list_of_items) + set(local_list "") + foreach(item IN LISTS "${list_of_items}") + if(NOT "${item}" STREQUAL "") + list(APPEND local_list "${prefix}${item}") + endif() + endforeach() + set(${list_of_items} "${local_list}" PARENT_SCOPE) +endfunction() + +# void add_suffix(string suffix, list* list_of_items); +# - returns list_of_items with suffix appended to all items +# - original list is modified +function(add_suffix suffix list_of_items) + set(local_list "") + foreach(item IN LISTS "${list_of_items}") + if(NOT "${item}" STREQUAL "") + list(APPEND local_list "${item}${suffix}") + endif() + endforeach() + set(${list_of_items} "${local_list}" PARENT_SCOPE) +endfunction() + +# void strip_suffix(list list_of_items, list* return_list); +# - returns a new list with suffix stripped (i.e., foo.c => foo) +# - list_of_items is not modified, return_list is modified +function(strip_suffix list_of_items return_list) + set(local_list "") + foreach(item IN LISTS "${list_of_items}") + if(NOT "${item}" STREQUAL "") + get_filename_component(filename "${item}" NAME_WE) + list(APPEND local_list "${filename}") + endif() + endforeach() + set(${return_list} "${local_list}" PARENT_SCOPE) +endfunction() + +# void list_to_string(list list_of_things, string* return_string); +# - converts a list to a space separated string +function(list_to_string list_of_things return_string) + string(REPLACE ";" " " output_variable "${list_of_things}") + set(${return_string} "${output_variable}" PARENT_SCOPE) +endfunction() + +# void string_to_list(string str, list* return_list); +# - converts a string to a semicolon separated list +# - what it really does is just string_replace all running whitespace to a semicolon +# - in cmake, a list is strings separated by semicolons: i.e., list of four items, list = "item1;item2;item3;item4" +function(string_to_list str return_list) + set(outstr) + string(REGEX REPLACE "[ \t]+" ";" outstr "${str}") + set(${return_list} "${outstr}" PARENT_SCOPE) +endfunction() + +# void get_date(string* return_date); +# - returns the current date "yyyy-mm-dd hh:mm:ss UTC" +# - this function alone causes the need for CMake v2.8.11 (TIMESTAMP) +#function(get_date return_date) +# string(TIMESTAMP local_date "%Y-%m-%d %H:%M:%S UTC" UTC) +# set(${return_date} ${local_date} PARENT_SCOPE) +#endfunction() + +# void find_a_program(string program_name, list extra_paths, bool fail_on_not_found, string return_variable_name); +# - returns the full path of a program_name +# - first looks in the list of extra_paths +# - if not found in extra_paths, then look through system path +# - errors out if fail_on_not_found == true and cmake could not find program_name. +function(find_a_program program_name extra_paths fail_on_not_found return_variable_name) + # first try to find the program in the extra_paths + find_program(${return_variable_name} "${program_name}" PATHS "${extra_paths}" DOC "Path to ${program_name}" NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH) + if("${${return_variable_name}}" MATCHES NOTFOUND) + # if no extra_paths, or couldn't find it, then look in system $PATH + find_program(${return_variable_name} "${program_name}" DOC "Path to ${program_name}") + if("${${return_variable_name}}" MATCHES NOTFOUND AND ${fail_on_not_found}) + error_say("Error: Could not find program: ${program_name}") + endif() + endif() + + if(NOT "${${return_variable_name}}" MATCHES NOTFOUND) + say("-- Found ${program_name}: ${${return_variable_name}}") + endif() + + set(${return_variable_name} ${${return_variable_name}} PARENT_SCOPE) +endfunction() + +# WINDOWS SPECIFIC +# void replace_md_with_mt(string flags_var) +# - This macro replaces the /MD compiler flags (Windows specific) with /MT compiler flags +# - This does nothing if no /MD flags were replaced. +macro(replace_md_with_mt flags_var) + set(flags_var_name ${flags_var}) # i.e., CMAKE_C_FLAGS_RELEASE + set(flags_var_value ${${flags_var}}) # i.e., "/MD /O2 ..." + string(REPLACE /MD /MT temp_out "${flags_var_value}") + string(COMPARE NOTEQUAL "${temp_out}" "${flags_var_value}" something_was_replaced) + if("${something_was_replaced}") + unset(${flags_var_name} CACHE) + set(${flags_var_name} ${temp_out} CACHE STRING "Replaced /MD with /MT compiler flags") + endif() +endmacro() + diff --git a/src/libomp_oss/cmake/Intel/AsmFlags.cmake b/src/libomp_oss/cmake/Intel/AsmFlags.cmake new file mode 100644 index 0000000..042228d --- /dev/null +++ b/src/libomp_oss/cmake/Intel/AsmFlags.cmake @@ -0,0 +1,61 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags +# The flag types are: +# 1) Assembly flags + +######################################################### +# Assembly flags +function(append_assembler_specific_asm_flags input_asm_flags) + set(local_asm_flags) + append_asm_flags("-x assembler-with-cpp") # Assembly file that needs to be preprocessed + if(${MIC}) + append_asm_flags("-mmic") # Build Intel(R) MIC Architecture native code + endif() + if(${WINDOWS}) + if(${IA32}) + append_asm_flags("-safeseh") # Registers exception handlers for safe exception handling. + append_asm_flags("-coff") # Generates common object file format (COFF) type of object module. + # Generally required for Win32 assembly language development. + append_asm_flags("-D _M_IA32") + elseif(${INTEL64}) + append_asm_flags("-D _M_AMD64") + endif() + # CMake prefers the /MD flags when compiling Windows sources, but libomp needs to use /MT instead + # So we replace these /MD instances with /MT within the CMAKE_*_FLAGS variables and put that out to the CACHE. + # replace_md_with_mt() is in HelperFunctions.cmake + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_DEBUG) + endif() + set(${input_asm_flags} ${${input_asm_flags}} "${local_asm_flags}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/cmake/Intel/CFlags.cmake b/src/libomp_oss/cmake/Intel/CFlags.cmake new file mode 100644 index 0000000..0283be6 --- /dev/null +++ b/src/libomp_oss/cmake/Intel/CFlags.cmake @@ -0,0 +1,179 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags +# The flag types are: +# 2) C/C++ Compiler flags +# 4) Linker flags + +# icc has a 128-bit floating point type called _Quad. Always compile with 128-bit floating point if it exists. +unset(COMPILER_SUPPORTS_QUAD_PRECISION CACHE) +set(COMPILER_SUPPORTS_QUAD_PRECISION true CACHE BOOL "Does the compiler support a 128-bit floating point type?") +set(COMPILER_QUAD_TYPE _Quad) + +######################################################### +# icc C/C++ Compiler flags +function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags) + set(local_c_flags) + set(local_cxx_flags) + if(${WINDOWS}) + + append_c_flags("-TP") # Tells the compiler to process a file as a C++ source file. + append_cxx_flags("-EHsc") # Enable C++ exception handling. + append_c_and_cxx_flags("-nologo") # Turn off tool banner. + append_c_and_cxx_flags("-W3") # Enables diagnostics for remarks, warnings, and errors. + # Additional warnings are also enabled above level 2 warnings. + append_c_and_cxx_flags("-WX") # Change all Warnings to Errors + append_c_and_cxx_flags("-GS") # Lets you control the threshold at which the stack checking routine is called or not called. + append_c_and_cxx_flags("-Qoption,cpp,--extended_float_types") # Enabled _Quad type. + if(${IA32}) + append_c_and_cxx_flags("-arch:ia32") # Tells the compiler which features it may target (ia32) + append_c_and_cxx_flags("-Oy-") # equivalent to -fno-omit-frame-pointer + endif() + append_c_and_cxx_flags("-Qlong_double") # enable long double + append_c_and_cxx_flags("-Qdiag-disable:177") # Disable warning: "... declared but never referenced" + if(${IA32}) + append_c_and_cxx_flags("-Qsafeseh") # Registers exception handlers for safe exception handling. + endif() + if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD}) + append_c_and_cxx_flags("-Qinline-min-size=1") # Specifies the upper limit for the size of what the inliner considers to be a small routine. + else() + append_c_and_cxx_flags("-Od") # Disables all optimizations. + append_c_and_cxx_flags("-RTC1") # Enables run-time checks of the stack frame, and enables run-time checks for unintialized variables. + append_c_and_cxx_flags("-MTd") # Tells the linker to search for unresolved references in a multithreaded, static run-time library. + endif() + else() + append_c_and_cxx_flags("-Wsign-compare") # warn on sign comparisons + append_c_and_cxx_flags("-Qoption,cpp,--extended_float_types") # Enabled _Quad type. + append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled. + append_c_and_cxx_flags("-x c++") # Compile C files as C++ files + if(${LINUX}) + if(NOT ${MIC}) + append_c_and_cxx_flags("-Werror") # Changes all warnings to errors. + endif() + append_c_and_cxx_flags("-sox") # Tells the compiler to save the compilation options and version number + # in the executable file. It also lets you choose whether to include + # lists of certain functions. + if(${MIC}) + append_c_and_cxx_flags("-mmic") # Build Intel(R) MIC Architecture native code + append_c_and_cxx_flags("-ftls-model=initial-exec") # Changes the thread local storage (TLS) model. Generates a restrictive, optimized TLS code. + # To use this setting, the thread-local variables accessed must be defined in one of the + # modules available to the program. + append_c_and_cxx_flags("-opt-streaming-stores never") # Disables generation of streaming stores for optimization. + elseif(${IA32}) + append_c_and_cxx_flags("-falign-stack=maintain-16-byte") # Tells the compiler the stack alignment to use on entry to routines. + append_c_and_cxx_flags("-mia32") # Tells the compiler which features it may target (ia32) + endif() + endif() + endif() + # CMake prefers the /MD flags when compiling Windows sources, but libomp needs to use /MT instead + # So we replace these /MD instances with /MT within the CMAKE_*_FLAGS variables and put that out to the CACHE. + # replace_md_with_mt() is in HelperFunctions.cmake + if(${WINDOWS}) + replace_md_with_mt(CMAKE_C_FLAGS) + replace_md_with_mt(CMAKE_C_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_C_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_C_FLAGS_DEBUG) + replace_md_with_mt(CMAKE_CXX_FLAGS) + replace_md_with_mt(CMAKE_CXX_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_CXX_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_CXX_FLAGS_DEBUG) + endif() + set(${input_c_flags} ${${input_c_flags}} "${local_c_flags}" PARENT_SCOPE) + set(${input_cxx_flags} ${${input_cxx_flags}} "${local_cxx_flags}" PARENT_SCOPE) +endfunction() + +######################################################### +# icc Linker flags +function(append_compiler_specific_linker_flags input_ld_flags input_ld_flags_libs) + set(local_ld_flags) + set(local_ld_flags_libs) + if(${WINDOWS}) + # Have icc use link.exe directly when Windows + set(CMAKE_C_CREATE_SHARED_LIBRARY "link.exe /out: " PARENT_SCOPE) + set(CMAKE_SHARED_LINKER_FLAGS "$ENV{LDFLAGS}" CACHE STRING "Linker Flags" FORCE) + append_linker_flags("-nologo") # Turn off tool banner. + append_linker_flags("-dll") + append_linker_flags("-WX:NO") + append_linker_flags("-incremental:no") + append_linker_flags("-version:${LIBOMP_VERSION}.0") + append_linker_flags("-NXCompat") + append_linker_flags("-DynamicBase") # This option modifies the header of an executable to indicate + # whether the application should be randomly rebased at load time. + if(${IA32}) + append_linker_flags("-machine:i386") + append_linker_flags("-safeseh") + elseif(${INTEL64}) + append_linker_flags("-machine:amd64") + endif() + if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) + if(NOT "${pdb_file}" STREQUAL "") + append_linker_flags("-debug") + append_linker_flags("-pdb:${pdb_file}") + endif() + else() + if(NOT "${pdb_file}" STREQUAL "") + append_linker_flags("-debug") + append_linker_flags("-pdb:${pdb_file}") + append_linker_flags("-pdbstripped:${pdb_file}.stripped") + endif() + endif() + if(NOT "${imp_file}" STREQUAL "") + append_linker_flags("-implib:${lib_file}${lib}") + endif() + if(NOT "${def_file}" STREQUAL "") + append_linker_flags("-def:${def_file}") + endif() + elseif(${MAC}) + append_linker_flags("-no-intel-extensions") + if(NOT ${STUBS_LIBRARY}) + append_linker_flags_library("-pthread") # link in pthread library + append_linker_flags_library("-ldl") # link in libdl (dynamic loader library) + endif() + if(${LIBOMP_STATS}) + append_linker_flags_library("-Wl,-lstdc++") # link in standard c++ library (stats-gathering needs it) + endif() + else() + if(${MIC}) + append_linker_flags("-mmic") # enable MIC linking + append_linker_flags("-no-intel-extensions") # Enables or disables all Intel C and Intel C++ language extensions. + elseif(${IA32}) + append_linker_flags_library("-lirc_pic") # link in libirc_pic + endif() + append_linker_flags("-static-intel") # Causes Intel-provided libraries to be linked in statically. + if(NOT ${MIC}) + append_linker_flags("-Werror") # Warnings become errors + endif() + endif() + + set(${input_ld_flags} ${${input_ld_flags}} "${local_ld_flags}" PARENT_SCOPE) + set(${input_ld_flags_libs} ${${input_ld_flags_libs}} "${local_ld_flags_libs}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/Intel/FortranFlags.cmake b/src/libomp_oss/cmake/Intel/FortranFlags.cmake new file mode 100644 index 0000000..3eddc3c --- /dev/null +++ b/src/libomp_oss/cmake/Intel/FortranFlags.cmake @@ -0,0 +1,67 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags +# The flag types are: +# 1) Fortran Compiler flags + +######################################################### +# icc Fortran Compiler flags (for creating .mod files) +function(append_fortran_compiler_specific_fort_flags input_fort_flags) + set(local_fort_flags) + #set(CMAKE_Fortran_FLAGS "$ENV{FFLAGS}" CACHE STRING "Fortran flags" FORCE) + #set(CMAKE_Fortran_FLAGS_RELEASE "" CACHE STRING "Fortran flags" FORCE) + #set(CMAKE_Fortran_FLAGS_DEBUG "" CACHE STRING "Fortran flags" FORCE) + #set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "" CACHE STRING "Fortran flags" FORCE) + if(${WINDOWS}) + append_fort_flags("-Qdiag-disable:177,5082") + append_fort_flags("-Qsox") + append_fort_flags("-nologo") + append_fort_flags("-GS") + append_fort_flags("-DynamicBase") + append_fort_flags("-Zi") + # On Linux and Windows Intel(R) 64 architecture we need offload attribute + # for all Fortran entries in order to support OpenMP function calls inside device contructs + if(${INTEL64}) + append_fort_flags("/Qoffload-attribute-target:mic") + endif() + else() + if(${MIC}) + append_fort_flags("-mmic") + endif() + if(NOT ${MAC}) + append_fort_flags("-sox") + if(${INTEL64} AND ${LINUX}) + append_fort_flags("-offload-attribute-target=mic") + endif() + endif() + endif() + set(${input_fort_flags} ${${input_fort_flags}} "${local_fort_flags}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/cmake/MSVC/AsmFlags.cmake b/src/libomp_oss/cmake/MSVC/AsmFlags.cmake new file mode 100644 index 0000000..7f86d42 --- /dev/null +++ b/src/libomp_oss/cmake/MSVC/AsmFlags.cmake @@ -0,0 +1,56 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Microsoft Visual Studio dependent flags +# The flag types are: +# 1) Assembly flags + +######################################################### +# Assembly flags +function(append_assembler_specific_asm_flags input_asm_flags) + set(local_asm_flags) + append_asm_flags("-nologo") # Turn off tool banner. + if(${IA32}) + append_asm_flags("-safeseh") # Registers exception handlers for safe exception handling. + append_asm_flags("-coff") # Generates common object file format (COFF) type of object module. + # Generally required for Win32 assembly language development. + append_asm_flags("-D _M_IA32") + elseif(${INTEL64}) + append_asm_flags("-D _M_AMD64") + endif() + # CMake prefers the /MD flags when compiling Windows sources, but libomp needs to use /MT instead + # So we replace these /MD instances with /MT within the CMAKE_*_FLAGS variables and put that out to the CACHE. + # replace_md_with_mt() is in HelperFunctions.cmake + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_DEBUG) + set(${input_asm_flags} ${${input_asm_flags}} "${local_asm_flags}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/cmake/MSVC/CFlags.cmake b/src/libomp_oss/cmake/MSVC/CFlags.cmake new file mode 100644 index 0000000..167ee58 --- /dev/null +++ b/src/libomp_oss/cmake/MSVC/CFlags.cmake @@ -0,0 +1,94 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# This file holds Microsoft Visual Studio dependent flags +# The flag types are: +# 1) C/C++ Compiler flags +# 2) Fortran Compiler flags + +######################################################### +# Visual Studio C/C++ Compiler flags +function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags) + set(local_c_flags) + set(local_cxx_flags) + append_c_flags("-TP") # Tells the compiler to process a file as a C++ source file. + append_cxx_flags("-EHsc") # Enable C++ exception handling. + append_c_and_cxx_flags("-W3") # Enables diagnostics for remarks, warnings, and errors. + # Additional warnings are also enabled above level 2 warnings. + append_c_and_cxx_flags("-GS") # Lets you control the threshold at which the stack checking routine is called or not called. + if(${IA32}) + append_c_and_cxx_flags("-arch:ia32") # Tells the compiler which features it may target (ia32) + append_c_and_cxx_flags("-Oy-") # equivalent to -fno-omit-frame-pointer + endif() + # CMake prefers the /MD flags when compiling Windows sources, but libomp needs to use /MT instead + # So we replace these /MD instances with /MT within the CMAKE_*_FLAGS variables and put that out to the CACHE. + # replace_md_with_mt() is in HelperFunctions.cmake + replace_md_with_mt(CMAKE_C_FLAGS) + replace_md_with_mt(CMAKE_C_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_C_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_C_FLAGS_DEBUG) + replace_md_with_mt(CMAKE_CXX_FLAGS) + replace_md_with_mt(CMAKE_CXX_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_CXX_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_CXX_FLAGS_DEBUG) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELEASE) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_RELWITHDEBINFO) + replace_md_with_mt(CMAKE_ASM_MASM_FLAGS_DEBUG) + set(${input_c_flags} ${${input_c_flags}} "${local_c_flags}" PARENT_SCOPE) + set(${input_cxx_flags} ${${input_cxx_flags}} "${local_cxx_flags}" PARENT_SCOPE) +endfunction() + +######################################################### +# Visual Studio Linker flags +function(append_compiler_specific_linker_flags input_ld_flags input_ld_flags_libs) + set(local_ld_flags) + set(local_ld_flags_libs) + append_linker_flags("-WX:NO") + append_linker_flags("-version:${LIBOMP_VERSION}.0") + append_linker_flags("-NXCompat") + append_linker_flags("-DynamicBase") # This option modifies the header of an executable to indicate + # whether the application should be randomly rebased at load time. + if(${IA32}) + append_linker_flags("-machine:i386") + append_linker_flags("-safeseh") + elseif(${INTEL64}) + append_linker_flags("-machine:amd64") + endif() + if(NOT "${def_file}" STREQUAL "") + append_linker_flags("-def:${def_file}") + endif() + # Have Visual Studio use link.exe directly + #set(CMAKE_C_CREATE_SHARED_LIBRARY "link.exe /out: " PARENT_SCOPE) + #set(CMAKE_SHARED_LINKER_FLAGS "$ENV{LDLFAGS}" CACHE STRING "Linker Flags" FORCE) + set(${input_ld_flags} ${${input_ld_flags}} "${local_ld_flags}" PARENT_SCOPE) + set(${input_ld_flags_libs} ${${input_ld_flags_libs}} "${local_ld_flags_libs}" PARENT_SCOPE) +endfunction() + diff --git a/src/libomp_oss/cmake/MicroTests.cmake b/src/libomp_oss/cmake/MicroTests.cmake new file mode 100644 index 0000000..1ad286a --- /dev/null +++ b/src/libomp_oss/cmake/MicroTests.cmake @@ -0,0 +1,250 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +###################################################### +# MICRO TESTS +# The following micro-tests are small tests to perform on +# the library just created in ${CMAKE_CURRENT_BINARY_DIR}/, there are currently +# five micro-tests: +# (1) test-touch +# - Compile and run a small program using newly created libomp library +# - Fails if test-touch.c does not compile or if test-touch.c does not run after compilation +# - Program dependencies: gcc or g++, grep, bourne shell +# - Available for all Linux,Mac,Windows builds. Not available on Intel(R) MIC Architecture builds. +# (2) test-relo +# - Tests dynamic libraries for position-dependent code (can not have any position dependent code) +# - Fails if TEXTREL is in output of readelf -d libomp.so command +# - Program dependencies: readelf, grep, bourne shell +# - Available for Linux, Intel(R) MIC Architecture dynamic library builds. Not available otherwise. +# (3) test-execstack +# - Tests if stack is executable +# - Fails if stack is executable. Should only be readable and writable. Not exectuable. +# - Program dependencies: perl, readelf +# - Available for Linux dynamic library builds. Not available otherwise. +# (4) test-instr (Intel(R) MIC Architecutre only) +# - Tests Intel(R) MIC Architecture libraries for valid instruction set +# - Fails if finds invalid instruction for Intel(R) MIC Architecture (wasn't compiled with correct flags) +# - Program dependencies: perl, objdump +# - Available for Intel(R) MIC Architecture builds. Not available otherwise. +# (5) test-deps +# - Tests newly created libomp for library dependencies +# - Fails if sees a dependence not listed in td_exp variable below +# - Program dependencies: perl, (linux)readelf, (mac)otool[64], (windows)link.exe +# - Available for Linux,Mac,Windows, Intel(R) MIC Architecture dynamic builds and Windows static builds. Not available otherwise. +# +# All tests can be turned off by including -Dtests=off when calling cmake +# An individual test can be turned off by issuing something like -Dtest_touch=off when calling cmake + +# test-touch +if(${WINDOWS}) + set(do_test_touch_mt TRUE) + if(${do_test_touch_mt}) + set(test_touch_items ${test_touch_items} test-touch-md test-touch-mt) + else() + set(test_touch_items ${test_touch_items} test-touch-md) + endif() +else() + set(test_touch_items ${test_touch_items} test-touch-rt) +endif() +set(regular_test_touch_items "${test_touch_items}") +add_suffix("/.success" regular_test_touch_items) +# test-touch : ${test_touch_items}/.success +set(ldeps "${regular_test_touch_items}") +add_custom_target(libomp-test-touch DEPENDS ${ldeps}) + +if(${WINDOWS}) + # pick test-touch compiler + set(tt-c cl) + # test-touch compilation flags + list(APPEND tt-c-flags -nologo) + if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD}) + list(APPEND tt-c-flags-mt -MT) + list(APPEND tt-c-flags-md -MD) + else() + list(APPEND tt-c-flags-mt -MTd) + list(APPEND tt-c-flags-md -MDd) + endif() + list(APPEND tt-libs ${CMAKE_CURRENT_BINARY_DIR}/${imp_file}) + list(APPEND tt-ld-flags -link -nodefaultlib:oldnames) + if(${IA32}) + list(APPEND tt-ld-flags -safeseh) + endif() + list(APPEND tt-ld-flags-v -verbose) +else() # (Unix based systems, Intel(R) MIC Architecture, and Mac) + # pick test-touch compiler + if(${STD_CPP_LIB}) + set(tt-c ${CMAKE_CXX_COMPILER}) + else() + set(tt-c ${CMAKE_C_COMPILER}) + endif() + # test-touch compilation flags + if(${LINUX}) + list(APPEND tt-c-flags -pthread) + endif() + if(${IA32}) + list(APPEND tt-c-flags -m32) + elseif(${INTEL64}) + list(APPEND tt-c-flags -m64) + endif() + list(APPEND tt-libs ${CMAKE_CURRENT_BINARY_DIR}/${lib_file}) + if(${LIBOMP_USE_HWLOC}) + list(APPEND tt-libs "${LIBOMP_HWLOC_LIBRARY}") + list(APPEND tt-ld-flags "-Wl,-rpath,${LIBOMP_HWLOC_LIBRARY_DIR}") + endif() + list(APPEND tt-libs ${CMAKE_CURRENT_BINARY_DIR}/${lib_file}) + if(${MAC}) + list(APPEND tt-ld-flags-v -Wl,-t) + set(tt-env "DYLD_LIBRARY_PATH=.:$ENV{DYLD_LIBRARY_PATH}") + else() + list(APPEND tt-ld-flags-v -Wl,--verbose) + set(tt-env LD_LIBRARY_PATH=".:${CMAKE_CURRENT_BINARY_DIR}:$ENV{LD_LIBRARY_PATH}") + endif() +endif() +list(APPEND tt-c-flags "${tt-c-flags-rt}") +list(APPEND tt-env "KMP_VERSION=1") + +macro(test_touch_recipe test_touch_dir) + set(ldeps ${src_dir}/test-touch.c omp) + set(tt-exe-file ${test_touch_dir}/test-touch${exe}) + if(${WINDOWS}) + # ****** list(APPEND tt-c-flags -Fo$(dir $@)test-touch${obj} -Fe$(dir $@)test-touch${exe}) ******* + set(tt-c-flags-out -Fo${test_touch_dir}/test-touch${obj} -Fe${test_touch_dir}/test-touch${exe}) + list(APPEND ldeps ${CMAKE_CURRENT_BINARY_DIR}/${imp_file}) + else() + # ****** list(APPEND tt-c-flags -o $(dir $@)test-touch${exe}) ******** + set(tt-c-flags-out -o ${test_touch_dir}/test-touch${exe}) + endif() + add_custom_command( + OUTPUT ${test_touch_dir}/.success + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_touch_dir} + COMMAND ${CMAKE_COMMAND} -E remove -f ${test_touch_dir}/* + COMMAND ${tt-c} ${tt-c-flags-out} ${tt-c-flags} ${src_dir}/test-touch.c ${tt-libs} ${tt-ld-flags} + COMMAND ${CMAKE_COMMAND} -E remove -f ${tt-exe-file} + COMMAND ${tt-c} ${tt-c-flags-out} ${tt-c-flags} ${src_dir}/test-touch.c ${tt-libs} ${tt-ld-flags} ${tt-ld-flags-v} > ${test_touch_dir}/build.log 2>&1 + COMMAND ${tt-env} ${tt-exe-file} + #COMMAND grep -i -e \"[^_]libirc\" ${test_touch_dir}/build.log > ${test_touch_dir}/libirc.log \; [ $$? -eq 1 ] + COMMAND ${CMAKE_COMMAND} -E touch ${test_touch_dir}/.success + DEPENDS ${ldeps} + ) +endmacro() +if(${WINDOWS}) + test_touch_recipe(test-touch-mt) + test_touch_recipe(test-touch-md) +else() + test_touch_recipe(test-touch-rt) +endif() + +# test-relo +add_custom_target(libomp-test-relo DEPENDS test-relo/.success) +add_custom_command( + OUTPUT test-relo/.success + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-relo + COMMAND readelf -d ${CMAKE_CURRENT_BINARY_DIR}/${lib_file} > test-relo/readelf.log + COMMAND grep -e TEXTREL test-relo/readelf.log \; test $$? -eq 1 + COMMAND ${CMAKE_COMMAND} -E touch test-relo/.success + DEPENDS omp +) + +# test-execstack +add_custom_target(libomp-test-execstack DEPENDS test-execstack/.success) +add_custom_command( + OUTPUT test-execstack/.success + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-execstack + COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-execstack.pl ${oa_opts} ${CMAKE_CURRENT_BINARY_DIR}/${lib_file} + COMMAND ${CMAKE_COMMAND} -E touch test-execstack/.success + DEPENDS omp +) + +# test-instr +add_custom_target(libomp-test-instr DEPENDS test-instr/.success) +add_custom_command( + OUTPUT test-instr/.success + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-instr + COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-instruction-set.pl ${oa_opts} --show --mic-arch=${LIBOMP_MIC_ARCH} ${CMAKE_CURRENT_BINARY_DIR}/${lib_file} + COMMAND ${CMAKE_COMMAND} -E touch test-instr/.success + DEPENDS omp ${tools_dir}/check-instruction-set.pl +) + +# test-deps +add_custom_target(libomp-test-deps DEPENDS test-deps/.success) +set(td_exp) +if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + set(td_exp libc.so.7 libthr.so.3 libunwind.so.5) +elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD") + set(libomp_expected_library_deps libc.so.12 libpthread.so.1 libm.so.0) +elseif(${MAC}) + set(td_exp /usr/lib/libSystem.B.dylib) +elseif(${WINDOWS}) + set(td_exp kernel32.dll) +elseif(${LINUX}) + if(${MIC}) + set(td_exp libc.so.6,libpthread.so.0,libdl.so.2) + if(${STD_CPP_LIB}) + set(td_exp ${td_exp},libstdc++.so.6) + endif() + if("${LIBOMP_MIC_ARCH}" STREQUAL "knf") + set(td_exp ${td_exp},ld-linux-l1om.so.2,libgcc_s.so.1) + elseif("${LIBOMP_MIC_ARCH}" STREQUAL "knc") + set(td_exp ${td_exp},ld-linux-k1om.so.2) + endif() + else() + set(td_exp libdl.so.2,libgcc_s.so.1) + if(${IA32}) + set(td_exp ${td_exp},libc.so.6,ld-linux.so.2) + elseif(${INTEL64}) + set(td_exp ${td_exp},libc.so.6,ld-linux-x86-64.so.2) + elseif(${ARM}) + set(td_exp ${td_exp},libffi.so.6,libffi.so.5,libc.so.6,ld-linux-armhf.so.3) + elseif(${PPC64}) + set(td_exp ${td_exp},libc.so.6,ld64.so.1) + endif() + if(${STD_CPP_LIB}) + set(td_exp ${td_exp},libstdc++.so.6) + endif() + if(${LIBOMP_STATS}) + set(td_exp ${td_exp},libm.so.6) + endif() + if(${LIBOMP_USE_HWLOC}) + set(td_exp ${td_exp},libhwloc.so.5) + endif() + if(NOT ${STUBS_LIBRARY}) + set(td_exp ${td_exp},libpthread.so.0) + endif() + endif() +endif() +add_custom_command( + OUTPUT test-deps/.success + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-deps + COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-depends.pl ${oa_opts} --expected="${td_exp}" ${CMAKE_CURRENT_BINARY_DIR}/${lib_file} + COMMAND ${CMAKE_COMMAND} -E touch test-deps/.success + DEPENDS omp ${tools_dir}/check-depends.pl +) +# END OF TESTS +###################################################### diff --git a/src/libomp_oss/cmake/PerlFlags.cmake b/src/libomp_oss/cmake/PerlFlags.cmake new file mode 100644 index 0000000..87cab3d --- /dev/null +++ b/src/libomp_oss/cmake/PerlFlags.cmake @@ -0,0 +1,117 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# void append_ev_flags(string new_flag); +# - appends new_flag to ev_flags list +macro(append_ev_flags new_flag) + list(APPEND local_ev_flags "${new_flag}") +endmacro() + +# void append_gd_flags(string new_flag); +# - appends new_flag to gd_flags list +macro(append_gd_flags new_flag) + list(APPEND local_gd_flags "${new_flag}") +endmacro() + +include(HelperFunctions) # for set_legal_type(), set_legal_arch() + +# Perl expand-vars.pl flags +function(set_ev_flags input_ev_flags) + set(local_ev_flags) + set_legal_type("${LIBOMP_LIB_TYPE}" legal_type) + set_legal_arch("${LIBOMP_ARCH}" legal_arch) + # need -D Revision="\$Revision" to show up + append_ev_flags("-D Revision=\"\\\\$$Revision\"") + append_ev_flags("-D Date=\"\\\\$$Date\"") + append_ev_flags("-D KMP_TYPE=\"${legal_type}\"") + append_ev_flags("-D KMP_ARCH=\"${legal_arch}\"") + append_ev_flags("-D KMP_VERSION_MAJOR=${LIBOMP_VERSION}") + append_ev_flags("-D KMP_VERSION_MINOR=0") + append_ev_flags("-D KMP_VERSION_BUILD=${build_number}") + append_ev_flags("-D KMP_BUILD_DATE=\"${date}\"") + append_ev_flags("-D KMP_VERSION_BUILD_YEAR=${LIBOMP_VERSION_BUILD_YEAR}") + append_ev_flags("-D KMP_VERSION_BUILD_MONTH_DAY=${LIBOMP_VERSION_BUILD_MONTH_DAY}") + append_ev_flags("-D KMP_TARGET_COMPILER=12") + if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) + append_ev_flags("-D KMP_DIAG=1") + append_ev_flags("-D KMP_DEBUG_INFO=1") + else() + append_ev_flags("-D KMP_DIAG=0") + append_ev_flags("-D KMP_DEBUG_INFO=0") + endif() + if(${LIBOMP_VERSION} EQUAL 40) + append_ev_flags("-D OMP_VERSION=201307") + elseif(${LIBOMP_VERSION} EQUAL 30) + append_ev_flags("-D OMP_VERSION=201107") + else() + append_ev_flags("-D OMP_VERSION=200505") + endif() + set(${input_ev_flags} "${local_ev_flags}" PARENT_SCOPE) +endfunction() + +function(set_gd_flags input_gd_flags) + set(local_gd_flags) + if(${IA32}) + append_gd_flags("-D arch_32") + elseif(${INTEL64}) + append_gd_flags("-D arch_32e") + else() + append_gd_flags("-D arch_${LIBOMP_ARCH}") + endif() + if(${NORMAL_LIBRARY}) + append_gd_flags("-D norm") + elseif(${PROFILE_LIBRARY}) + append_gd_flags("-D prof") + elseif(${STUBS_LIBRARY}) + append_gd_flags("-D stub") + endif() + if(${LIBOMP_OMP_VERSION} GREATER 45 OR ${LIBOMP_OMP_VERSION} EQUAL 45) + append_gd_flags("-D OMP_45") + endif() + if(${LIBOMP_OMP_VERSION} GREATER 40 OR ${LIBOMP_OMP_VERSION} EQUAL 40) + append_gd_flags("-D OMP_40") + endif() + if(${LIBOMP_OMP_VERSION} GREATER 30 OR ${LIBOMP_OMP_VERSION} EQUAL 30) + append_gd_flags("-D OMP_30") + endif() + if(NOT "${LIBOMP_VERSION}" STREQUAL "4") + append_gd_flags("-D msvc_compat") + endif() + if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) + append_gd_flags("-D KMP_DEBUG") + endif() + if(${LIBOMP_COMPILER_SUPPORTS_QUAD_PRECISION}) + append_gd_flags("-D HAVE_QUAD") + endif() + if(${LIBOMP_USE_DEBUGGER}) + append_gd_flags("-D USE_DEBUGGER") + endif() + set(${input_gd_flags} "${local_gd_flags}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/cmake/SourceFiles.cmake b/src/libomp_oss/cmake/SourceFiles.cmake new file mode 100644 index 0000000..bc58b66 --- /dev/null +++ b/src/libomp_oss/cmake/SourceFiles.cmake @@ -0,0 +1,143 @@ +# +# Copyright (c) 2013-2016 Intel Corporation. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +macro(append_c_source_file new_c_file) + list(APPEND local_c_source_files "${new_c_file}") +endmacro() + +macro(append_cpp_source_file new_cpp_file) + list(APPEND local_cpp_source_files "${new_cpp_file}") +endmacro() + +macro(append_asm_source_file new_asm_file) + list(APPEND local_asm_source_files "${new_asm_file}") +endmacro() + +macro(append_imp_c_source_file new_import_c_file) + list(APPEND local_imp_c_files "${new_import_c_file}") +endmacro() + +# files are relative to the src directory + +function(set_c_files input_c_source_files) + set(local_c_source_files "") + append_c_source_file("kmp_ftn_cdecl.c") + append_c_source_file("kmp_ftn_extra.c") + append_c_source_file("kmp_version.c") + if(${STUBS_LIBRARY}) + append_c_source_file("kmp_stub.c") + else() + append_c_source_file("kmp_alloc.c") + append_c_source_file("kmp_atomic.c") + append_c_source_file("kmp_csupport.c") + append_c_source_file("kmp_debug.c") + append_c_source_file("kmp_debugger.c") + append_c_source_file("kmp_itt.c") + append_c_source_file("kmp_environment.c") + append_c_source_file("kmp_error.c") + append_c_source_file("kmp_global.c") + append_c_source_file("kmp_i18n.c") + append_c_source_file("kmp_io.c") + append_c_source_file("kmp_runtime.c") + append_c_source_file("kmp_settings.c") + append_c_source_file("kmp_str.c") + append_c_source_file("kmp_tasking.c") + append_c_source_file("kmp_taskq.c") + append_c_source_file("kmp_threadprivate.c") + append_c_source_file("kmp_utility.c") + if(${LIBOMP_OMPT_SUPPORT}) + append_c_source_file("ompt-general.c") + endif() + if(${LIBOMP_USE_ITT_NOTIFY}) + append_c_source_file("thirdparty/ittnotify/ittnotify_static.c") + endif() + if(${WINDOWS}) + append_c_source_file("z_Windows_NT_util.c") + append_c_source_file("z_Windows_NT-586_util.c") + else() + append_c_source_file("z_Linux_util.c") + append_c_source_file("kmp_gsupport.c") + append_c_source_file("thirdparty/safeclib/ignore_handler_s.c") + append_c_source_file("thirdparty/safeclib/mem_primitives_lib.c") + append_c_source_file("thirdparty/safeclib/memcpy_s.c") + append_c_source_file("thirdparty/safeclib/safe_mem_constraint.c") + append_c_source_file("thirdparty/safeclib/safe_str_constraint.c") + append_c_source_file("thirdparty/safeclib/strcpy_s.c") + append_c_source_file("thirdparty/safeclib/strncpy_s.c") + append_c_source_file("thirdparty/safeclib/strnlen_s.c") + append_c_source_file("thirdparty/safeclib/snprintf_support.c") + endif() + endif() + set(${input_c_source_files} "${local_c_source_files}" PARENT_SCOPE) +endfunction() + +function(set_cpp_files input_cpp_source_files) + set(local_cpp_source_files "") + if(NOT ${STUBS_LIBRARY}) + append_cpp_source_file("kmp_barrier.cpp") + append_cpp_source_file("kmp_wait_release.cpp") + append_cpp_source_file("kmp_affinity.cpp") + append_cpp_source_file("kmp_dispatch.cpp") + append_cpp_source_file("kmp_lock.cpp") + append_cpp_source_file("kmp_sched.cpp") + if(${LIBOMP_OMP_VERSION} GREATER 40 OR ${LIBOMP_OMP_VERSION} EQUAL 40) + append_cpp_source_file("kmp_taskdeps.cpp") + append_cpp_source_file("kmp_cancel.cpp") + endif() + if(${LIBOMP_STATS}) + append_cpp_source_file("kmp_stats.cpp") + append_cpp_source_file("kmp_stats_timing.cpp") + endif() + endif() + + set(${input_cpp_source_files} "${local_cpp_source_files}" PARENT_SCOPE) +endfunction() + + +function(set_asm_files input_asm_source_files) + set(local_asm_source_files "") + if(NOT ${STUBS_LIBRARY}) + if(${WINDOWS}) + append_asm_source_file("z_Windows_NT-586_asm.asm") + else() + append_asm_source_file("z_Linux_asm.s") + endif() + endif() + set(${input_asm_source_files} "${local_asm_source_files}" PARENT_SCOPE) +endfunction() + + +function(set_imp_c_files input_imp_c_files) + set(local_imp_c_files "") + if(${WINDOWS}) + append_imp_c_source_file("kmp_import.c") + endif() + set(${input_imp_c_files} "${local_imp_c_files}" PARENT_SCOPE) +endfunction() diff --git a/src/libomp_oss/doc/Reference.pdf b/src/libomp_oss/doc/Reference.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ad31cf19cda5ee0e6e08ea546efaaa4389f9734 GIT binary patch literal 516023 zcmc#+30zF?*Ow(^2}y~RY$4U`GqSZRE!q$XZD^-OC40%1>=DUY){rf02w75=gvc(t z?2?rCdCtu3&Yihsn(_O;J|Ac=o-tMs^W`{F$nj;^t8 zh?l?0fC0KjF1kiTLtI02jVyHay(fE43HJ>(Wc1b@G)Toa*ax4)7oDs>mc`?u|Gcrr z#>O`IB^bYi;}>825{O^MGC5p08ncbXkHhhsDfk7>g`e8vw~pdxIpa4G_=UW-AATEz zU*MNxMHjZipTKus_^(j>;#u=oH2#Y?m5x|Ae`3v#yzyVYy@@dkYGF{AuXng#NU$M; z$|43+1|Gp3L-2ik@C%F*ZVMcQk-)dXHB>NIeVbVR$<5DhW|FTfq(A}Mn)5Q1_b(G~v^goF6F zRt69!nB$)ad5`}BsQ~5xUtpr(wjf@TvxR>VRx^4g961S7@wadx(%iCYwHY+TQcND3)_Q>ckg`CM4OGcb zC;RW(%@vnaHm!Dpae^uQcb*F~m9#?aziSkaLMN?8S>lUE;TI4!(yGwO8(Su2;!#D7 zL#s@q@GWbxJ1+P;33aJOv;IPUjizvF(-a~aq6i#^Ry*u#NCve9fg`y@2%HT*3p4@F z0%43I>8Mo+L_r6W$~-Qu=+{jNDI(n3M41>h#YuB%1=$*p2e=PI0h>S?DN_026nG2Y z0%K(33HNV;%#z>A!7o%Gm< zN(nk?Wgd72H-}pSYk*GDEP)XsC??N`X$D4vLc@<>D3Y|3oUKh6NX}AhsDM@-!0eNB z!rhE8f1L3P427f}&I3x}3t|*7C-vvMpjK59=evac70~Jv$;bbm?}FMiP%OaX7%~kh z%x4(WYN91(GN_V-dXZLLa{loz2*$hOH?Zg?xleotEPBi({<5zJum@K9i^V&kcib%t@RIx2G097BrhWEj)xCoD=yDV8=NbQ~ou1;e;j zof8*X3HQjL2P*!TGRvqP)Swbh6W4sB6+pJZ-8b{WC#2fBxtPY1k;*NhU35B3h*Oy{FXQiOf6gi zt~COG2PasP3Q#-5A)$vXDbvHG)kB4b1SG;pVO+oz7^|}w#kHy|4aHRDWzs6IycC1d z3#r4L1#ZJ60L$SmF%$5K8$Jt$WG6P7x-?%>q$pu1gC4y2AB+YDNlLBQXk^4GkWod_ zM2RRFELsOF?`TL8%}8F$2uuj6qb&Uy^vHy~)Jgo#oFuV!OoA#4RJo={Cg^;Q50*h+ z`~oJFVp$b;>a`;kQmQHG%h

4zyLX(ks3gkq5k7)I@wMU5+`>JL3$0j3f-1hEeU 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%0A^Ay0=+i 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

DVIUcQ6=x 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