1# 2#//===----------------------------------------------------------------------===// 3#// 4#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5#// See https://llvm.org/LICENSE.txt for license information. 6#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7#// 8#//===----------------------------------------------------------------------===// 9# 10 11# The following micro-tests are small tests to perform on the library just created. 12# There are currently five micro-tests: 13# (1) test-touch 14# - Compile and run a small program using newly created libomp library 15# - Fails if test-touch.c does not compile or if test-touch.c does not run after compilation 16# - Program dependencies: gcc or g++, grep, bourne shell 17# - Available for all Unix,Mac,Windows builds. Not available on Intel(R) MIC Architecture builds. 18# (2) test-relo 19# - Tests dynamic libraries for position-dependent code (can not have any position dependent code) 20# - Fails if TEXTREL is in output of readelf -d libomp.so command 21# - Program dependencies: readelf, grep, bourne shell 22# - Available for Unix, Intel(R) MIC Architecture dynamic library builds. Not available otherwise. 23# (3) test-execstack 24# - Tests if stack is executable 25# - Fails if stack is executable. Should only be readable and writable. Not executable. 26# - Program dependencies: perl, readelf 27# - Available for Unix dynamic library builds. Not available otherwise. 28# (4) test-instr (Intel(R) MIC Architecture only) 29# - Tests Intel(R) MIC Architecture libraries for valid instruction set 30# - Fails if finds invalid instruction for Intel(R) MIC Architecture (wasn't compiled with correct flags) 31# - Program dependencies: perl, objdump 32# - Available for Intel(R) MIC Architecture and i386 builds. Not available otherwise. 33# (5) test-deps 34# - Tests newly created libomp for library dependencies 35# - Fails if sees a dependence not listed in td_exp variable below 36# - Program dependencies: perl, (unix)readelf, (mac)otool[64], (windows)link.exe 37# - Available for Unix,Mac,Windows, Intel(R) MIC Architecture dynamic builds and Windows 38# static builds. Not available otherwise. 39 40# get library location 41if(WIN32) 42 get_target_property(LIBOMP_OUTPUT_DIRECTORY omp RUNTIME_OUTPUT_DIRECTORY) 43 get_target_property(LIBOMPIMP_OUTPUT_DIRECTORY ${LIBOMP_IMP_LIB_TARGET} ARCHIVE_OUTPUT_DIRECTORY) 44 if(NOT LIBOMPIMP_OUTPUT_DIRECTORY) 45 set(LIBOMPIMP_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 46 endif() 47else() 48 get_target_property(LIBOMP_OUTPUT_DIRECTORY omp LIBRARY_OUTPUT_DIRECTORY) 49endif() 50if(NOT LIBOMP_OUTPUT_DIRECTORY) 51 set(LIBOMP_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 52endif() 53 54# test-touch 55find_program(LIBOMP_SHELL sh) 56if(WIN32) 57 if(LIBOMP_SHELL) 58 set(libomp_test_touch_targets test-touch-md/.success test-touch-mt/.success) 59 endif() 60 # pick test-touch compiler 61 set(libomp_test_touch_compiler ${CMAKE_C_COMPILER}) 62 # test-touch compilation flags 63 libomp_append(libomp_test_touch_cflags /nologo) 64 libomp_append(libomp_test_touch_libs ${LIBOMPIMP_OUTPUT_DIRECTORY}/${LIBOMP_IMP_LIB_FILE}) 65 if(${IA32}) 66 libomp_append(libomp_test_touch_ldflags /safeseh) 67 endif() 68else() # (Unix based systems, Intel(R) MIC Architecture, and Mac) 69 if(LIBOMP_SHELL) 70 set(libomp_test_touch_targets test-touch-rt/.success) 71 endif() 72 # pick test-touch compiler 73 if(${LIBOMP_USE_STDCPPLIB}) 74 set(libomp_test_touch_compiler ${CMAKE_CXX_COMPILER}) 75 else() 76 set(libomp_test_touch_compiler ${CMAKE_C_COMPILER}) 77 endif() 78 # test-touch compilation flags 79 libomp_append(libomp_test_touch_libs "${CMAKE_THREAD_LIBS_INIT}") 80 if(${IA32}) 81 libomp_append(libomp_test_touch_cflags -m32 LIBOMP_HAVE_M32_FLAG) 82 endif() 83 libomp_append(libomp_test_touch_libs ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE}) 84 libomp_append(libomp_test_touch_libs "${LIBOMP_HWLOC_LIBRARY}" LIBOMP_USE_HWLOC) 85 if(APPLE) 86 set(libomp_test_touch_env "DYLD_LIBRARY_PATH=.:${LIBOMP_OUTPUT_DIRECTORY}:$ENV{DYLD_LIBRARY_PATH}") 87 libomp_append(libomp_test_touch_ldflags "-Wl,-rpath,${LIBOMP_HWLOC_LIBRARY_DIR}" LIBOMP_USE_HWLOC) 88 else() 89 set(libomp_test_touch_env "LD_LIBRARY_PATH=.:${LIBOMP_OUTPUT_DIRECTORY}:$ENV{LD_LIBRARY_PATH}") 90 libomp_append(libomp_test_touch_ldflags "-Wl,-rpath=${LIBOMP_HWLOC_LIBRARY_DIR}" LIBOMP_USE_HWLOC) 91 endif() 92endif() 93macro(libomp_test_touch_recipe test_touch_dir) 94 set(libomp_test_touch_dependencies ${LIBOMP_SRC_DIR}/test-touch.c omp) 95 set(libomp_test_touch_exe ${test_touch_dir}/test-touch${CMAKE_EXECUTABLE_SUFFIX}) 96 set(libomp_test_touch_obj ${test_touch_dir}/test-touch${CMAKE_C_OUTPUT_EXTENSION}) 97 if(WIN32) 98 if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD}) 99 if(${test_touch_dir} MATCHES "test-touch-mt") 100 libomp_append(libomp_test_touch_cflags /MT) 101 else() 102 libomp_append(libomp_test_touch_cflags /MD) 103 endif() 104 else() 105 if(${test_touch_dir} MATCHES "test-touch-mt") 106 libomp_append(libomp_test_touch_cflags /MTd) 107 else() 108 libomp_append(libomp_test_touch_cflags /MDd) 109 endif() 110 endif() 111 set(libomp_test_touch_out_flags -Fe${libomp_test_touch_exe} -Fo${libomp_test_touch_obj}) 112 list(APPEND libomp_test_touch_dependencies ompimp) 113 else() 114 set(libomp_test_touch_out_flags -o ${libomp_test_touch_exe}) 115 endif() 116 add_custom_command( 117 OUTPUT ${test_touch_dir}/.success ${libomp_test_touch_exe} ${libomp_test_touch_obj} 118 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${test_touch_dir} 119 COMMAND ${CMAKE_COMMAND} -E remove -f ${test_touch_dir}/* 120 COMMAND ${libomp_test_touch_compiler} ${libomp_test_touch_out_flags} ${libomp_test_touch_cflags} 121 ${LIBOMP_SRC_DIR}/test-touch.c ${libomp_test_touch_ldflags} ${libomp_test_touch_libs} 122 COMMAND ${LIBOMP_SHELL} -c \"${libomp_test_touch_env} ${libomp_test_touch_exe}\" 123 COMMAND ${CMAKE_COMMAND} -E touch ${test_touch_dir}/.success 124 DEPENDS ${libomp_test_touch_dependencies} 125 ) 126endmacro() 127libomp_append(libomp_test_touch_env "KMP_VERSION=1") 128add_custom_target(libomp-test-touch DEPENDS ${libomp_test_touch_targets}) 129if(WIN32) 130 libomp_test_touch_recipe(test-touch-mt) 131 libomp_test_touch_recipe(test-touch-md) 132else() 133 libomp_test_touch_recipe(test-touch-rt) 134endif() 135 136# test-relo 137add_custom_target(libomp-test-relo DEPENDS test-relo/.success) 138add_custom_command( 139 OUTPUT test-relo/.success test-relo/readelf.log 140 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-relo 141 COMMAND readelf -d ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE} > test-relo/readelf.log 142 COMMAND grep -e TEXTREL test-relo/readelf.log \; test $$? -eq 1 143 COMMAND ${CMAKE_COMMAND} -E touch test-relo/.success 144 DEPENDS omp 145) 146 147# test-execstack 148add_custom_target(libomp-test-execstack DEPENDS test-execstack/.success) 149add_custom_command( 150 OUTPUT test-execstack/.success 151 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-execstack 152 COMMAND ${PERL_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/check-execstack.pl 153 --arch=${LIBOMP_PERL_SCRIPT_ARCH} ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE} 154 COMMAND ${CMAKE_COMMAND} -E touch test-execstack/.success 155 DEPENDS omp 156) 157 158# test-instr 159add_custom_target(libomp-test-instr DEPENDS test-instr/.success) 160add_custom_command( 161 OUTPUT test-instr/.success 162 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-instr 163 COMMAND ${PERL_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/check-instruction-set.pl --os=${LIBOMP_PERL_SCRIPT_OS} 164 --arch=${LIBOMP_PERL_SCRIPT_ARCH} --show --mic-arch=${LIBOMP_MIC_ARCH} ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE} 165 COMMAND ${CMAKE_COMMAND} -E touch test-instr/.success 166 DEPENDS omp ${LIBOMP_TOOLS_DIR}/check-instruction-set.pl 167) 168 169# test-deps 170add_custom_target(libomp-test-deps DEPENDS test-deps/.success) 171set(libomp_expected_library_deps) 172if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") 173 set(libomp_expected_library_deps libc.so.7 libthr.so.3 libm.so.5) 174 libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC) 175elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD") 176 set(libomp_expected_library_deps libc.so.12 libpthread.so.1 libm.so.0) 177 libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC) 178elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly") 179 set(libomp_expected_library_deps libc.so.8 libpthread.so.0 libm.so.4) 180 libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC) 181elseif(APPLE) 182 set(libomp_expected_library_deps /usr/lib/libSystem.B.dylib) 183elseif(WIN32) 184 set(libomp_expected_library_deps kernel32.dll) 185 libomp_append(libomp_expected_library_deps psapi.dll LIBOMP_OMPT_SUPPORT) 186else() 187 if(${MIC}) 188 set(libomp_expected_library_deps libc.so.6 libpthread.so.0 libdl.so.2) 189 if("${LIBOMP_MIC_ARCH}" STREQUAL "knf") 190 libomp_append(libomp_expected_library_deps ld-linux-l1om.so.2) 191 libomp_append(libomp_expected_library_deps libgcc_s.so.1) 192 elseif("${LIBOMP_MIC_ARCH}" STREQUAL "knc") 193 libomp_append(libomp_expected_library_deps ld-linux-k1om.so.2) 194 endif() 195 else() 196 set(libomp_expected_library_deps libdl.so.2 libgcc_s.so.1) 197 if(${IA32}) 198 libomp_append(libomp_expected_library_deps libc.so.6) 199 libomp_append(libomp_expected_library_deps ld-linux.so.2) 200 elseif(${INTEL64}) 201 libomp_append(libomp_expected_library_deps libc.so.6) 202 libomp_append(libomp_expected_library_deps ld-linux-x86-64.so.2) 203 elseif(${ARM}) 204 libomp_append(libomp_expected_library_deps libc.so.6) 205 libomp_append(libomp_expected_library_deps libffi.so.6) 206 libomp_append(libomp_expected_library_deps libffi.so.5) 207 libomp_append(libomp_expected_library_deps ld-linux-armhf.so.3) 208 elseif(${PPC64}) 209 libomp_append(libomp_expected_library_deps libc.so.6) 210 libomp_append(libomp_expected_library_deps ld64.so.1) 211 elseif(${MIPS} OR ${MIPS64}) 212 libomp_append(libomp_expected_library_deps libc.so.6) 213 libomp_append(libomp_expected_library_deps ld.so.1) 214 elseif(${RISCV64}) 215 libomp_append(libomp_expected_library_deps libc.so.6) 216 libomp_append(libomp_expected_library_deps ld.so.1) 217 endif() 218 libomp_append(libomp_expected_library_deps libpthread.so.0 IF_FALSE STUBS_LIBRARY) 219 libomp_append(libomp_expected_library_deps libhwloc.so.5 LIBOMP_USE_HWLOC) 220 endif() 221 libomp_append(libomp_expected_library_deps libstdc++.so.6 LIBOMP_USE_STDCPPLIB) 222 libomp_append(libomp_expected_library_deps libm.so.6 LIBOMP_STATS) 223endif() 224# Perl script expects comma separated list 225string(REPLACE ";" "," libomp_expected_library_deps "${libomp_expected_library_deps}") 226add_custom_command( 227 OUTPUT test-deps/.success 228 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/test-deps 229 COMMAND ${PERL_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/check-depends.pl --os=${LIBOMP_PERL_SCRIPT_OS} 230 --arch=${LIBOMP_PERL_SCRIPT_ARCH} --expected="${libomp_expected_library_deps}" ${LIBOMP_OUTPUT_DIRECTORY}/${LIBOMP_LIB_FILE} 231 COMMAND ${CMAKE_COMMAND} -E touch test-deps/.success 232 DEPENDS omp ${LIBOMP_TOOLS_DIR}/check-depends.pl 233) 234