| # External: Integer Set Library |
| if (POLLY_BUNDLED_ISL) |
| set(ISL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/isl") |
| set(ISL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/isl") |
| |
| # Determine version of isl |
| if (EXISTS "${ISL_SOURCE_DIR}/GIT_HEAD_ID") |
| # The source comes from a 'make dist' archive |
| file(READ "${ISL_SOURCE_DIR}/GIT_HEAD_ID" ISL_GIT_HEAD_ID) |
| string(STRIP "${ISL_GIT_HEAD_ID}" ISL_GIT_HEAD_ID) |
| elseif (EXISTS "${ISL_SOURCE_DIR}/gitversion.h") |
| # The source directory is preconfigured |
| file(READ "${ISL_SOURCE_DIR}/gitversion.h" GITVERSION_H) |
| string(REGEX REPLACE ".*\\\"([^\\\"]*)\\\".*" "\\1" ISL_GIT_HEAD_ID "${GITVERSION_H}") |
| elseif () |
| # Unknown revision |
| # TODO: We could look for a .git and get the revision from HEAD |
| set(ISL_GIT_HEAD_ID "UNKNOWN") |
| endif () |
| |
| message(STATUS "ISL version: ${ISL_GIT_HEAD_ID}") |
| |
| # Enable small integer optimization and imath |
| set(USE_GMP_FOR_MP OFF) |
| set(USE_IMATH_FOR_MP ON) |
| set(USE_SMALL_INT_OPT ON) |
| |
| # Determine compiler characteristics |
| include(CheckCSourceCompiles) |
| |
| # Like check_c_source_compiles, but sets the result to either |
| # 0 (error while compiling) or 1 (compiled successfully) |
| # Required for compatibility with autotool's AC_CHECK_DECLS |
| function (check_c_source_compiles_numeric _prog _var) |
| check_c_source_compiles("${_prog}" "${_var}") |
| if ("${${_var}}") |
| set("${_var}" 1 PARENT_SCOPE) |
| else () |
| set("${_var}" 0 PARENT_SCOPE) |
| endif () |
| endfunction () |
| |
| # Check for the existance of a type |
| function (check_c_type_exists _type _files _variable) |
| set(_includes "") |
| foreach (file_name ${_files}) |
| set(_includes "${_includes}#include<${file_name}>\n") |
| endforeach() |
| check_c_source_compiles(" |
| ${_includes} |
| ${_type} typeVar; |
| int main() { |
| return 0; |
| } |
| " ${_variable}) |
| endfunction () |
| |
| |
| check_c_source_compiles(" |
| int func(void) __attribute__((__warn_unused_result__)); |
| int main() { return 0; } |
| " HAS_ATTRIBUTE_WARN_UNUSED_RESULT) |
| set(GCC_WARN_UNUSED_RESULT) |
| if (HAS_ATTRIBUTE_WARN_UNUSED_RESULT) |
| set(GCC_WARN_UNUSED_RESULT "__attribute__((__warn_unused_result__))") |
| endif () |
| |
| check_c_source_compiles(" |
| __attribute__ ((unused)) static void foo(void); |
| int main() { return 0; } |
| " HAVE___ATTRIBUTE__) |
| |
| |
| check_c_source_compiles_numeric(" |
| #include <strings.h> |
| int main() { (void)ffs(0); return 0; } |
| " HAVE_DECL_FFS) |
| |
| check_c_source_compiles_numeric(" |
| int main() { (void)__builtin_ffs(0); return 0; } |
| " HAVE_DECL___BUILTIN_FFS) |
| |
| check_c_source_compiles_numeric(" |
| #include <intrin.h> |
| int main() { (void)_BitScanForward(NULL, 0); return 0; } |
| " HAVE_DECL__BITSCANFORWARD) |
| |
| if (NOT HAVE_DECL_FFS AND |
| NOT HAVE_DECL___BUILTIN_FFS AND |
| NOT HAVE_DECL__BITSCANFORWARD) |
| message(FATAL_ERROR "No ffs implementation found") |
| endif () |
| |
| |
| check_c_source_compiles_numeric(" |
| #include <strings.h> |
| int main() { (void)strcasecmp(\"\", \"\"); return 0; } |
| " HAVE_DECL_STRCASECMP) |
| |
| check_c_source_compiles_numeric(" |
| #include <string.h> |
| int main() { (void)_stricmp(\"\", \"\"); return 0; } |
| " HAVE_DECL__STRICMP) |
| |
| if (NOT HAVE_DECL_STRCASECMP AND NOT HAVE_DECL__STRICMP) |
| message(FATAL_ERROR "No strcasecmp implementation found") |
| endif () |
| |
| |
| check_c_source_compiles_numeric(" |
| #include <strings.h> |
| int main() { (void)strncasecmp(\"\", \"\", 0); return 0; } |
| " HAVE_DECL_STRNCASECMP) |
| |
| check_c_source_compiles_numeric(" |
| #include <string.h> |
| int main() { (void)_strnicmp(\"\", \"\", 0); return 0; } |
| " HAVE_DECL__STRNICMP) |
| |
| if (NOT HAVE_DECL_STRNCASECMP AND NOT HAVE_DECL__STRNICMP) |
| message(FATAL_ERROR "No strncasecmp implementation found") |
| endif () |
| |
| |
| check_c_source_compiles_numeric(" |
| #include <stdio.h> |
| int main() { snprintf((void*)0, 0, \" \"); return 0; } |
| " HAVE_DECL_SNPRINTF) |
| |
| check_c_source_compiles_numeric(" |
| #include <stdio.h> |
| int main() { _snprintf((void*)0, 0, \" \"); return 0; } |
| " HAVE_DECL__SNPRINTF) |
| |
| if (NOT HAVE_DECL_SNPRINTF AND NOT HAVE_DECL__SNPRINTF) |
| message(FATAL_ERROR "No snprintf implementation found") |
| endif () |
| |
| |
| check_c_type_exists(uint8_t "" HAVE_UINT8T) |
| check_c_type_exists(uint8_t "stdint.h" HAVE_STDINT_H) |
| check_c_type_exists(uint8_t "inttypes.h" HAVE_INTTYPES_H) |
| check_c_type_exists(uint8_t "sys/types.h" HAVE_SYS_INTTYPES_H) |
| if (HAVE_UINT8T) |
| set(INCLUDE_STDINT_H "") |
| elseif (HAVE_STDINT_H) |
| set(INCLUDE_STDINT_H "#include <stdint.h>") |
| elseif (HAVE_INTTYPES_H) |
| set(INCLUDE_STDINT_H "#include <inttypes.h>") |
| elseif (HAVE_SYS_INTTYPES_H) |
| set(INCLUDE_STDINT_H "#include <sys/inttypes.h>") |
| else () |
| message(FATAL_ERROR "No stdint.h or compatible found") |
| endif () |
| |
| # Write configure result |
| # configure_file(... COPYONLY) avoids that the time stamp changes if the file is identical |
| file(WRITE "${ISL_BINARY_DIR}/gitversion.h.tmp" |
| "#define GIT_HEAD_ID \"${ISL_GIT_HEAD_ID}\"") |
| configure_file("${ISL_BINARY_DIR}/gitversion.h.tmp" |
| "${ISL_BINARY_DIR}/gitversion.h" COPYONLY) |
| |
| file(WRITE "${ISL_BINARY_DIR}/include/isl/stdint.h.tmp" |
| "${INCLUDE_STDINT_H}\n") |
| configure_file("${ISL_BINARY_DIR}/include/isl/stdint.h.tmp" |
| "${ISL_BINARY_DIR}/include/isl/stdint.h" COPYONLY) |
| |
| configure_file("isl_config.h.cmake" "${ISL_BINARY_DIR}/isl_config.h") |
| configure_file("isl_srcdir.c.cmake" "${ISL_BINARY_DIR}/isl_srcdir.c") |
| |
| include_directories(BEFORE |
| ${ISL_BINARY_DIR} |
| ${ISL_SOURCE_DIR}/imath |
| ${ISL_SOURCE_DIR}/include |
| ${ISL_SOURCE_DIR} |
| ) |
| |
| # ISL files to compile |
| set (ISL_FILES |
| isl/basis_reduction_tab.c |
| isl/isl_aff.c |
| isl/isl_aff_map.c |
| isl/isl_affine_hull.c |
| isl/isl_arg.c |
| isl/isl_ast_build.c |
| isl/isl_ast_build_expr.c |
| isl/isl_ast.c |
| isl/isl_ast_codegen.c |
| isl/isl_ast_graft.c |
| isl/isl_bernstein.c |
| isl/isl_blk.c |
| isl/isl_bound.c |
| isl/isl_box.c |
| isl/isl_coalesce.c |
| isl/isl_constraint.c |
| isl/isl_convex_hull.c |
| isl/isl_ctx.c |
| isl/isl_deprecated.c |
| isl/isl_dim_map.c |
| isl/isl_equalities.c |
| isl/isl_factorization.c |
| isl/isl_farkas.c |
| isl/isl_ffs.c |
| isl/isl_flow.c |
| isl/isl_fold.c |
| isl/isl_hash.c |
| isl/isl_id.c |
| isl/isl_id_to_ast_expr.c |
| isl/isl_id_to_id.c |
| isl/isl_id_to_pw_aff.c |
| isl/isl_ilp.c |
| isl/isl_imath.c |
| isl/isl_input.c |
| isl/isl_int_sioimath.c |
| isl/isl_local.c |
| isl/isl_local_space.c |
| isl/isl_lp.c |
| isl/isl_map.c |
| isl/isl_map_list.c |
| isl/isl_map_simplify.c |
| isl/isl_map_subtract.c |
| isl/isl_map_to_basic_set.c |
| isl/isl_mat.c |
| isl/isl_morph.c |
| isl/isl_obj.c |
| isl/isl_options.c |
| isl/isl_output.c |
| isl/isl_point.c |
| isl/isl_polynomial.c |
| isl/isl_printer.c |
| isl/isl_range.c |
| isl/isl_reordering.c |
| isl/isl_sample.c |
| isl/isl_scan.c |
| isl/isl_schedule.c |
| isl/isl_schedule_band.c |
| isl/isl_schedule_constraints.c |
| isl/isl_schedule_node.c |
| isl/isl_schedule_read.c |
| isl/isl_schedule_tree.c |
| isl/isl_scheduler.c |
| isl/isl_seq.c |
| isl/isl_set_list.c |
| isl/isl_sort.c |
| isl/isl_space.c |
| isl/isl_stride.c |
| isl/isl_stream.c |
| isl/isl_tab.c |
| isl/isl_tab_pip.c |
| isl/isl_tarjan.c |
| isl/isl_transitive_closure.c |
| isl/isl_union_map.c |
| isl/isl_val.c |
| isl/isl_val_sioimath.c |
| isl/isl_vec.c |
| isl/isl_version.c |
| isl/isl_vertices.c |
| isl/print.c |
| isl/set_to_map.c |
| isl/set_from_map.c |
| isl/uset_to_umap.c |
| isl/uset_from_umap.c |
| isl/imath/gmp_compat.c |
| isl/imath/imath.c |
| isl/imath/imrat.c |
| ) |
| |
| add_polly_library(PollyISL |
| ${ISL_FILES} |
| ) |
| |
| |
| if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
| install(DIRECTORY |
| ${ISL_SOURCE_DIR}/include/ |
| ${ISL_BINARY_DIR}/include/ |
| DESTINATION include/polly |
| FILES_MATCHING |
| PATTERN "*.h" |
| PATTERN "CMakeFiles" EXCLUDE |
| PATTERN ".svn" EXCLUDE |
| ) |
| endif() |
| |
| add_executable(polly-isl-test |
| isl/isl_test.c |
| ) |
| set_target_properties(polly-isl-test PROPERTIES FOLDER "Polly") |
| |
| target_link_libraries(polly-isl-test PRIVATE |
| PollyISL |
| ) |
| |
| # ISL requires at least C99 to compile. gcc < 5.0 use -std=gnu89 as default. |
| target_enable_c99(PollyISL) |
| target_enable_c99(polly-isl-test) |
| endif (POLLY_BUNDLED_ISL) |
| |
| set(PET_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/pet") |
| set(PPCG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ppcg") |
| set(PPCG_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppcg") |
| |
| # Determine version of ppcg |
| if (EXISTS "${PPCG_SOURCE_DIR}/GIT_HEAD_ID") |
| # The source comes from a 'make dist' archive |
| file(READ "${PPCG_SOURCE_DIR}/GIT_HEAD_ID" PPCG_GIT_HEAD_ID) |
| string(STRIP "${PPCG_GIT_HEAD_ID}" PPCG_GIT_HEAD_ID) |
| elseif (EXISTS "${PPCG_SOURCE_DIR}/gitversion.h") |
| # The source directory is preconfigured |
| file(READ "${PPCG_SOURCE_DIR}/gitversion.h" GITVERSION_H) |
| string(REGEX REPLACE ".*\\\"([^\\\"]*)\\\".*" "\\1" PPCG_GIT_HEAD_ID "${GITVERSION_H}") |
| elseif () |
| # Unknown revision |
| # TODO: We could look for a .git and get the revision from HEAD |
| set(PPCG_GIT_HEAD_ID "UNKNOWN") |
| endif () |
| |
| message(STATUS "PPCG version: ${PPCG_GIT_HEAD_ID}") |
| |
| set (PPCG_FILES |
| ppcg/cuda.c |
| ppcg/cuda_common.c |
| ppcg/external.c |
| ppcg/gpu_array_tile.c |
| ppcg/gpu.c |
| ppcg/gpu_array_tile.c |
| ppcg/gpu_group.c |
| ppcg/gpu_hybrid.c |
| ppcg/gpu_print.c |
| ppcg/gpu_tree.c |
| ppcg/grouping.c |
| ppcg/hybrid.c |
| ppcg/ppcg.c |
| ppcg/ppcg_options.c |
| ppcg/print.c |
| ppcg/schedule.c |
| ppcg/util.c |
| ) |
| |
| include_directories(BEFORE |
| ${PPCG_BINARY_DIR} |
| ${PPCG_SOURCE_DIR}/imath |
| ${PPCG_SOURCE_DIR}/include |
| ${PET_SOURCE_DIR}/include |
| ) |
| |
| add_polly_library(PollyPPCG |
| ${PPCG_FILES} |
| ) |
| |
| target_link_libraries(PollyPPCG PUBLIC ${ISL_TARGET}) |
| |
| # Disable warnings for upstream projects. |
| if (MSVC) |
| set(DISABLE_WARNING_FLAGS |
| -wd4018 # 'expression' : signed/unsigned mismatch |
| -wd4090 # 'operation' : different 'modifier' qualifiers |
| -wd4200 # nonstandard extension used: zero-sized array in struct/union |
| -wd4201 # nonstandard extension used: nameless struct/union |
| -wd4334 # 'operator': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) |
| -wd4221 # nonstandard extension used : 'identifier' : cannot be initialized using address of automatic variable |
| ) |
| if (POLLY_BUNDLED_ISL) |
| target_compile_options(PollyISL PRIVATE ${DISABLE_WARNING_FLAGS}) |
| target_compile_options(polly-isl-test PRIVATE ${DISABLE_WARNING_FLAGS}) |
| endif (POLLY_BUNDLED_ISL) |
| target_compile_options(PollyPPCG PRIVATE ${DISABLE_WARNING_FLAGS}) |
| else () |
| if (POLLY_BUNDLED_ISL) |
| set_target_properties(PollyISL polly-isl-test PROPERTIES COMPILE_FLAGS "-w") |
| endif (POLLY_BUNDLED_ISL) |
| set_target_properties(PollyPPCG PROPERTIES COMPILE_FLAGS "-w") |
| endif () |
| |
| if(MSVC) |
| # In the Windows API (with some exceptions), the maximum length for a path is |
| # MAX_PATH, which is defined as 260 characters. |
| target_compile_definitions(PollyPPCG PRIVATE "-DPATH_MAX=260") |
| endif () |