mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
I also removed the -verify-sil-ownership flag in favor of a disable flag -disable-sil-ownership-verifier. I used this on only two tests that still need work to get them to pass with ownership, but whose problems are well understood, small corner cases. I am going to fix them in follow on commits. I detail them below: 1. SILOptimizer/definite_init_inout_super_init.swift. This is a test case where DI is supposed to error. The only problem is that we crash before we error since the code emitting by SILGen to trigger this error does not pass ownership invariants. I have spoken with JoeG about this and he suggested that I fix this earlier in the compiler. Since we do not run the ownership verifier without asserts enabled, this should not affect compiler users. Given that it has triggered DI errors previously I think it is safe to disable ownership here. 2. PrintAsObjC/extensions.swift. In this case, the signature generated by type lowering for one of the thunks here uses an unsafe +0 return value instead of doing an autorelease return. The ownership checker rightly flags this leak. This is going to require either an AST level change or a change to TypeLowering. I think it is safe to turn this off since it is such a corner case that it was found by a test that has nothing to do with it. rdar://43398898
686 lines
24 KiB
CMake
686 lines
24 KiB
CMake
|
|
include(CMakeParseArguments)
|
|
include(SwiftBenchmarkUtils)
|
|
|
|
macro(configure_build)
|
|
add_definitions(-DSWIFT_EXEC -DSWIFT_LIBRARY_PATH -DONLY_PLATFORMS
|
|
-DSWIFT_OPTIMIZATION_LEVELS -DSWIFT_BENCHMARK_EMIT_SIB)
|
|
|
|
if(NOT ONLY_PLATFORMS)
|
|
set(ONLY_PLATFORMS "macosx" "iphoneos" "appletvos" "watchos" "linux")
|
|
endif()
|
|
|
|
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
|
|
if(NOT SWIFT_EXEC)
|
|
runcmd(COMMAND "xcrun" "-f" "swiftc"
|
|
VARIABLE SWIFT_EXEC
|
|
ERROR "Unable to find Swift driver")
|
|
endif()
|
|
|
|
# If the CMAKE_C_COMPILER is already clang, don't find it again,
|
|
# thus allowing the --host-cc build-script argument to work here.
|
|
get_filename_component(c_compiler ${CMAKE_C_COMPILER} NAME)
|
|
|
|
if(${c_compiler} STREQUAL "clang")
|
|
set(CLANG_EXEC ${CMAKE_C_COMPILER})
|
|
else()
|
|
runcmd(COMMAND "xcrun" "-toolchain" "${SWIFT_DARWIN_XCRUN_TOOLCHAIN}" "-f" "clang"
|
|
VARIABLE CLANG_EXEC
|
|
ERROR "Unable to find Clang driver")
|
|
endif()
|
|
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
|
# We always require SWIFT_EXEC and CLANG_EXEC to be specified explicitly
|
|
# when compiling for Linux.
|
|
#
|
|
# TODO: Investigate if we can eliminate CLANG_EXEC/SWIFT_EXEC and use more
|
|
# normal like cmake patterns.
|
|
precondition(SWIFT_EXEC)
|
|
precondition(CLANG_EXEC)
|
|
else()
|
|
message(FATAL_ERROR "Unsupported platform?!")
|
|
endif()
|
|
|
|
set(PAGE_ALIGNMENT_OPTION "-Xllvm" "-align-module-to-page-size")
|
|
if(EXISTS "${SWIFT_EXEC}")
|
|
# If we are using a pre-built compiler, check if it supports the
|
|
# -align-module-to-page-size option.
|
|
execute_process(
|
|
COMMAND "touch" "empty.swift"
|
|
RESULT_VARIABLE result
|
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
execute_process(
|
|
COMMAND "${SWIFT_EXEC}" ${PAGE_ALIGNMENT_OPTION} "empty.swift"
|
|
RESULT_VARIABLE result
|
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if(NOT "${result}" MATCHES "0")
|
|
set(PAGE_ALIGNMENT_OPTION "")
|
|
endif()
|
|
endif()
|
|
|
|
# We always infer the SWIFT_LIBRARY_PATH from SWIFT_EXEC unless
|
|
# SWIFT_LIBRARY_PATH is specified explicitly.
|
|
if(NOT SWIFT_LIBRARY_PATH)
|
|
get_filename_component(tmp_dir "${SWIFT_EXEC}" DIRECTORY)
|
|
get_filename_component(tmp_dir "${tmp_dir}" DIRECTORY)
|
|
set(SWIFT_LIBRARY_PATH "${tmp_dir}/lib/swift")
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(configure_sdks_darwin)
|
|
set(macosx_arch "x86_64")
|
|
set(iphoneos_arch "arm64" "armv7")
|
|
set(appletvos_arch "arm64")
|
|
set(watchos_arch "armv7k")
|
|
|
|
set(macosx_ver "10.9")
|
|
set(iphoneos_ver "8.0")
|
|
set(appletvos_ver "9.1")
|
|
set(watchos_ver "2.0")
|
|
|
|
set(macosx_vendor "apple")
|
|
set(iphoneos_vendor "apple")
|
|
set(appletvos_vendor "apple")
|
|
set(watchos_vendor "apple")
|
|
|
|
set(macosx_triple_platform "macosx")
|
|
set(iphoneos_triple_platform "ios")
|
|
set(appletvos_triple_platform "tvos")
|
|
set(watchos_triple_platform "watchos")
|
|
|
|
set(sdks)
|
|
set(platforms)
|
|
foreach(platform ${ONLY_PLATFORMS})
|
|
set(${platform}_is_darwin TRUE)
|
|
execute_process(
|
|
COMMAND "xcrun" "--sdk" "${platform}" "--show-sdk-path"
|
|
OUTPUT_VARIABLE ${platform}_sdk
|
|
RESULT_VARIABLE result
|
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if("${result}" MATCHES "0")
|
|
list(APPEND sdks "${${platform}_sdk}")
|
|
list(APPEND platforms ${platform})
|
|
endif()
|
|
endforeach()
|
|
endmacro()
|
|
|
|
macro(configure_sdks_linux)
|
|
# TODO: Get the correct triple.
|
|
set(linux_arch "x86_64")
|
|
set(linux_ver "") # Linux doesn't use the ver field
|
|
set(linux_vendor "unknown")
|
|
set(linux_triple_platform "linux")
|
|
set(linux_sdk "") # Linux doesn't use sdks.
|
|
set(linux_is_darwin FALSE)
|
|
|
|
# This is not applicable on linux since on linux we do not use
|
|
# SDKs/frameworks when building our benchmarks.
|
|
set(sdks "N/A")
|
|
set(platforms "linux")
|
|
endmacro()
|
|
|
|
macro(configure_sdks)
|
|
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
|
|
configure_sdks_darwin()
|
|
elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
|
configure_sdks_linux()
|
|
else()
|
|
message(FATAL_ERROR "Unsupported system: ${CMAKE_SYSTEM_NAME}?!")
|
|
endif()
|
|
endmacro()
|
|
|
|
function (add_swift_benchmark_library objfile_out sibfile_out)
|
|
cmake_parse_arguments(BENCHLIB "" "MODULE_PATH;SOURCE_DIR;OBJECT_DIR" "SOURCES;LIBRARY_FLAGS;DEPENDS" ${ARGN})
|
|
|
|
precondition(BENCHLIB_MODULE_PATH)
|
|
precondition(BENCHLIB_SOURCE_DIR)
|
|
precondition(BENCHLIB_OBJECT_DIR)
|
|
precondition(BENCHLIB_SOURCES)
|
|
|
|
set(module_name_path "${BENCHLIB_MODULE_PATH}")
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
set(srcdir "${BENCHLIB_SOURCE_DIR}")
|
|
set(objdir "${BENCHLIB_OBJECT_DIR}")
|
|
set(sources "${BENCHLIB_SOURCES}")
|
|
|
|
set(objfile "${objdir}/${module_name}.o")
|
|
set(swiftmodule "${objdir}/${module_name}.swiftmodule")
|
|
|
|
precondition(objfile_out)
|
|
add_custom_command(
|
|
OUTPUT "${objfile}"
|
|
DEPENDS ${stdlib_dependencies} ${sources} ${BENCHLIB_DEPENDS}
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${BENCHLIB_LIBRARY_FLAGS}
|
|
"-force-single-frontend-invocation"
|
|
"-parse-as-library"
|
|
"-module-name" "${module_name}"
|
|
"-emit-module" "-emit-module-path" "${swiftmodule}"
|
|
"-I" "${objdir}"
|
|
"-o" "${objfile}"
|
|
${sources})
|
|
set(${objfile_out} "${objfile}" PARENT_SCOPE)
|
|
|
|
if(SWIFT_BENCHMARK_EMIT_SIB)
|
|
precondition(sibfile_out)
|
|
set(sibfile "${objdir}/${module_name}.sib")
|
|
|
|
add_custom_command(
|
|
OUTPUT "${sibfile}"
|
|
DEPENDS
|
|
${stdlib_dependencies} ${sources} ${BENCHLIB_DEPENDS}
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${BENCHLIB_LIBRARY_FLAGS}
|
|
"-force-single-frontend-invocation"
|
|
"-parse-as-library"
|
|
"-module-name" "${module_name}"
|
|
"-emit-sib"
|
|
"-I" "${objdir}"
|
|
"-o" "${sibfile}"
|
|
${sources})
|
|
set(sibfile_out "${sibfile}" PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(_construct_sources_for_multibench sources_out objfile_out)
|
|
cmake_parse_arguments(SOURCEJSONLIST "" "" "SOURCES" ${ARGN})
|
|
|
|
set(sources)
|
|
set(objfiles)
|
|
|
|
foreach(source ${SOURCEJSONLIST_SOURCES})
|
|
list(APPEND sources "${srcdir}/${source}")
|
|
|
|
get_filename_component(basename "${source}" NAME_WE)
|
|
set(objfile "${objdir}/${module_name}/${basename}.o")
|
|
|
|
string(CONCAT json "${json}"
|
|
" \"${srcdir}/${source}\": { \"object\": \"${objfile}\" },\n")
|
|
|
|
list(APPEND objfiles "${objfile}")
|
|
endforeach()
|
|
string(CONCAT json "${json}" "}")
|
|
file(WRITE "${objdir}/${module_name}/outputmap.json" ${json})
|
|
set(${sources_out} ${sources} PARENT_SCOPE)
|
|
set(${objfile_out} ${objfiles} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(add_opt_view opt_view_main_dir, module_name, opt_view_dir_out)
|
|
set(opt_view_dir "${opt_view_main_dir}/${module_name}")
|
|
set(opt_record "${objdir}/${module_name}.opt.yaml")
|
|
add_custom_command(
|
|
OUTPUT ${opt_view_dir}
|
|
DEPENDS "${objfile}"
|
|
COMMAND ${SWIFT_BENCHMARK_OPT_VIEWER} ${opt_record} "-o" ${opt_view_dir})
|
|
set(${opt_view_dir_out} ${opt_view_dir} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Regular whole-module-compilation: only a single object file is
|
|
# generated.
|
|
function (add_swift_multisource_wmo_benchmark_library objfile_out)
|
|
cmake_parse_arguments(BENCHLIB "" "MODULE_PATH;SOURCE_DIR;OBJECT_DIR" "SOURCES;LIBRARY_FLAGS;DEPENDS" ${ARGN})
|
|
|
|
precondition(BENCHLIB_MODULE_PATH)
|
|
precondition(BENCHLIB_SOURCE_DIR)
|
|
precondition(BENCHLIB_OBJECT_DIR)
|
|
precondition(BENCHLIB_SOURCES)
|
|
|
|
set(module_name_path "${BENCHLIB_MODULE_PATH}")
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
set(srcdir "${BENCHLIB_SOURCE_DIR}")
|
|
set(objdir "${BENCHLIB_OBJECT_DIR}")
|
|
|
|
set(objfile "${objdir}/${module_name}.o")
|
|
|
|
set(sources)
|
|
foreach(source ${BENCHLIB_SOURCES})
|
|
list(APPEND sources "${srcdir}/${source}")
|
|
endforeach()
|
|
|
|
add_custom_command(
|
|
OUTPUT "${objfile}"
|
|
DEPENDS
|
|
${sources} ${BENCHLIB_DEPENDS}
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${BENCHLIB_LIBRARY_FLAGS}
|
|
"-parse-as-library"
|
|
"-emit-module" "-module-name" "${module_name}"
|
|
"-I" "${objdir}"
|
|
"-o" "${objfile}"
|
|
${sources})
|
|
|
|
set(${objfile_out} "${objfile}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(add_swift_multisource_nonwmo_benchmark_library objfiles_out)
|
|
cmake_parse_arguments(BENCHLIB "" "MODULE_PATH;SOURCE_DIR;OBJECT_DIR" "SOURCES;LIBRARY_FLAGS;DEPENDS" ${ARGN})
|
|
|
|
precondition(BENCHLIB_MODULE_PATH)
|
|
precondition(BENCHLIB_SOURCE_DIR)
|
|
precondition(BENCHLIB_OBJECT_DIR)
|
|
precondition(BENCHLIB_SOURCES)
|
|
|
|
set(module_name_path "${BENCHLIB_MODULE_PATH}")
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
set(srcdir "${BENCHLIB_SOURCE_DIR}")
|
|
set(objdir "${BENCHLIB_OBJECT_DIR}")
|
|
|
|
set(objfile "${objdir}/${module_name}.o")
|
|
|
|
# No whole-module-compilation or multi-threaded compilation.
|
|
# There is an output object file for each input file. We have to write
|
|
# an output-map-file to specify the output object file names.
|
|
set(sources)
|
|
set(objfiles)
|
|
_construct_sources_for_multibench(sources objfiles
|
|
SOURCES ${BENCHLIB_SOURCES})
|
|
|
|
add_custom_command(
|
|
OUTPUT ${objfiles}
|
|
DEPENDS ${sources} ${BENCHLIB_DEPENDS}
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${BENCHLIB_LIBRARY_FLAGS}
|
|
"-parse-as-library"
|
|
"-emit-module-path" "${objdir}/${module_name}.swiftmodule"
|
|
"-module-name" "${module_name}"
|
|
"-I" "${objdir}"
|
|
"-output-file-map" "${objdir}/${module_name}/outputmap.json"
|
|
${sources})
|
|
|
|
set(${objfiles_out} ${objfiles} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function (swift_benchmark_compile_archopts)
|
|
cmake_parse_arguments(BENCH_COMPILE_ARCHOPTS "" "PLATFORM;ARCH;OPT" "" ${ARGN})
|
|
set(is_darwin ${${BENCH_COMPILE_ARCHOPTS_PLATFORM}_is_darwin})
|
|
set(sdk ${${BENCH_COMPILE_ARCHOPTS_PLATFORM}_sdk})
|
|
set(vendor ${${BENCH_COMPILE_ARCHOPTS_PLATFORM}_vendor})
|
|
set(ver ${${BENCH_COMPILE_ARCHOPTS_PLATFORM}_ver})
|
|
set(triple_platform ${${BENCH_COMPILE_ARCHOPTS_PLATFORM}_triple_platform})
|
|
|
|
set(target "${BENCH_COMPILE_ARCHOPTS_ARCH}-${vendor}-${triple_platform}${ver}")
|
|
|
|
set(objdir "${CMAKE_CURRENT_BINARY_DIR}/${BENCH_COMPILE_ARCHOPTS_OPT}-${target}")
|
|
file(MAKE_DIRECTORY "${objdir}")
|
|
|
|
string(REGEX REPLACE "_.*" "" optflag "${BENCH_COMPILE_ARCHOPTS_OPT}")
|
|
string(REGEX REPLACE "^[^_]+" "" opt_suffix "${BENCH_COMPILE_ARCHOPTS_OPT}")
|
|
|
|
set(benchvar "BENCHOPTS${opt_suffix}")
|
|
if (NOT DEFINED ${benchvar})
|
|
message(FATAL_ERROR "Invalid benchmark configuration ${BENCH_COMPILE_ARCHOPTS_OPT}")
|
|
endif()
|
|
|
|
set(bench_flags "${${benchvar}}")
|
|
|
|
set(common_options
|
|
"-c"
|
|
"-target" "${target}"
|
|
"-${BENCH_COMPILE_ARCHOPTS_OPT}" ${PAGE_ALIGNMENT_OPTION})
|
|
|
|
if (is_darwin)
|
|
list(APPEND common_options
|
|
"-I" "${srcdir}/utils/ObjectiveCTests"
|
|
"-I" "${srcdir}/utils/LibProc"
|
|
"-F" "${sdk}/../../../Developer/Library/Frameworks"
|
|
"-sdk" "${sdk}"
|
|
"-no-link-objc-runtime")
|
|
endif()
|
|
|
|
set(opt_view_main_dir)
|
|
if(SWIFT_BENCHMARK_GENERATE_OPT_VIEW AND LLVM_HAVE_OPT_VIEWER_MODULES)
|
|
if(NOT ${optflag} STREQUAL "Onone" AND "${bench_flags}" MATCHES "-whole-module.*")
|
|
list(APPEND common_options "-save-optimization-record")
|
|
set(opt_view_main_dir "${objdir}/opt-view")
|
|
endif()
|
|
endif()
|
|
|
|
set(common_swift4_options ${common_options} "-swift-version" "4")
|
|
|
|
# Always optimize the driver modules.
|
|
# Note that we compile the driver for Osize also with -Osize
|
|
# (and not with -O), because of <rdar://problem/19614516>.
|
|
string(REPLACE "Onone" "O" driver_opt "${optflag}")
|
|
|
|
set(common_options_driver
|
|
"-c"
|
|
"-target" "${target}"
|
|
"-${driver_opt}")
|
|
|
|
if (is_darwin)
|
|
list(APPEND common_options_driver
|
|
"-sdk" "${sdk}"
|
|
"-F" "${sdk}/../../../Developer/Library/Frameworks"
|
|
"-I" "${srcdir}/utils/LibProc"
|
|
"-no-link-objc-runtime")
|
|
endif()
|
|
set(bench_library_objects)
|
|
set(bench_library_sibfiles)
|
|
set(opt_view_dirs)
|
|
# Build libraries used by the driver and benchmarks.
|
|
foreach(module_name_path ${BENCH_LIBRARY_MODULES})
|
|
set(sources "${srcdir}/${module_name_path}.swift")
|
|
|
|
add_swift_benchmark_library(objfile_out sibfile_out
|
|
MODULE_PATH "${module_name_path}"
|
|
SOURCE_DIR "${srcdir}"
|
|
OBJECT_DIR "${objdir}"
|
|
SOURCES ${sources}
|
|
LIBRARY_FLAGS ${common_swift4_options})
|
|
precondition(objfile_out)
|
|
list(APPEND bench_library_objects "${objfile_out}")
|
|
if (SWIFT_BENCHMARK_EMIT_SIB)
|
|
precondition(sibfile_out)
|
|
list(APPEND bench_library_sibfiles "${sibfile_out}")
|
|
endif()
|
|
endforeach()
|
|
precondition(bench_library_objects)
|
|
|
|
set(bench_driver_objects)
|
|
set(bench_driver_sibfiles)
|
|
foreach(module_name_path ${BENCH_DRIVER_LIBRARY_MODULES})
|
|
set(sources "${srcdir}/${module_name_path}.swift")
|
|
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
if("${module_name}" STREQUAL "DriverUtils")
|
|
list(APPEND sources "${srcdir}/utils/ArgParse.swift")
|
|
endif()
|
|
|
|
set(objfile_out)
|
|
set(sibfile_out)
|
|
add_swift_benchmark_library(objfile_out sibfile_out
|
|
MODULE_PATH "${module_name_path}"
|
|
SOURCE_DIR "${srcdir}"
|
|
OBJECT_DIR "${objdir}"
|
|
SOURCES ${sources}
|
|
LIBRARY_FLAGS ${common_options_driver} ${BENCH_DRIVER_LIBRARY_FLAGS}
|
|
DEPENDS ${bench_library_objects})
|
|
precondition(objfile_out)
|
|
list(APPEND bench_driver_objects "${objfile_out}")
|
|
if (SWIFT_BENCHMARK_EMIT_SIB)
|
|
precondition(sibfile_out)
|
|
list(APPEND bench_driver_sibfiles "${sibfile_out}")
|
|
endif()
|
|
endforeach()
|
|
|
|
set(SWIFT_BENCH_OBJFILES)
|
|
set(SWIFT_BENCH_SIBFILES)
|
|
foreach(module_name_path ${SWIFT_BENCH_MODULES})
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
|
|
if(module_name)
|
|
set(extra_options "")
|
|
# For this file we disable automatic bridging between Foundation and swift.
|
|
if("${module_name}" STREQUAL "ObjectiveCNoBridgingStubs")
|
|
set(extra_options "-Xfrontend"
|
|
"-disable-swift-bridge-attr")
|
|
endif()
|
|
set(objfile "${objdir}/${module_name}.o")
|
|
set(swiftmodule "${objdir}/${module_name}.swiftmodule")
|
|
set(source "${srcdir}/${module_name_path}.swift")
|
|
list(APPEND SWIFT_BENCH_OBJFILES "${objfile}")
|
|
|
|
if ("${bench_flags}" MATCHES "-whole-module.*")
|
|
set(output_option "-o" "${objfile}")
|
|
else()
|
|
set(json "{\n \"${source}\": { \"object\": \"${objfile}\" },\n}")
|
|
file(WRITE "${objdir}/${module_name}-outputmap.json" ${json})
|
|
set(output_option "-output-file-map"
|
|
"${objdir}/${module_name}-outputmap.json")
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT "${objfile}"
|
|
DEPENDS
|
|
${stdlib_dependencies} ${bench_library_objects}
|
|
"${srcdir}/${module_name_path}.swift"
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${common_swift4_options}
|
|
${extra_options}
|
|
"-parse-as-library"
|
|
${bench_flags}
|
|
${SWIFT_BENCHMARK_EXTRA_FLAGS}
|
|
"-module-name" "${module_name}"
|
|
"-emit-module-path" "${swiftmodule}"
|
|
"-I" "${objdir}"
|
|
${output_option}
|
|
"${source}")
|
|
if (SWIFT_BENCHMARK_EMIT_SIB)
|
|
set(sibfile "${objdir}/${module_name}.sib")
|
|
list(APPEND SWIFT_BENCH_SIBFILES "${sibfile}")
|
|
add_custom_command(
|
|
OUTPUT "${sibfile}"
|
|
DEPENDS
|
|
${stdlib_dependencies} ${bench_library_sibfiles}
|
|
"${srcdir}/${module_name_path}.swift"
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${common_swift4_options}
|
|
"-parse-as-library"
|
|
${bench_flags}
|
|
${SWIFT_BENCHMARK_EXTRA_FLAGS}
|
|
"-module-name" "${module_name}"
|
|
"-I" "${objdir}"
|
|
"-emit-sib"
|
|
"-o" "${sibfile}"
|
|
"${source}")
|
|
endif()
|
|
|
|
if(opt_view_main_dir)
|
|
set(opt_view_dir)
|
|
add_opt_view(${opt_view_main_dir}, ${module_name}, opt_view_dir)
|
|
precondition(opt_view_dir)
|
|
list(APPEND opt_view_dirs ${opt_view_dir})
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
|
|
foreach(module_name_path ${SWIFT_MULTISOURCE_SWIFT_BENCHES})
|
|
get_filename_component(module_name "${module_name_path}" NAME)
|
|
|
|
if ("${bench_flags}" MATCHES "-whole-module.*" AND
|
|
NOT "${bench_flags}" MATCHES "-num-threads.*")
|
|
set(objfile_out)
|
|
add_swift_multisource_wmo_benchmark_library(objfile_out
|
|
MODULE_PATH "${module_name_path}"
|
|
SOURCE_DIR "${srcdir}"
|
|
OBJECT_DIR "${objdir}"
|
|
SOURCES ${${module_name}_sources}
|
|
LIBRARY_FLAGS ${common_swift4_options} ${bench_flags} ${SWIFT_BENCHMARK_EXTRA_FLAGS}
|
|
DEPENDS ${bench_library_objects} ${stdlib_dependencies})
|
|
precondition(objfile_out)
|
|
list(APPEND SWIFT_BENCH_OBJFILES "${objfile_out}")
|
|
|
|
if(opt_view_main_dir)
|
|
set(opt_view_dir)
|
|
add_opt_view(${opt_view_main_dir}, ${module_name}, opt_view_dir)
|
|
precondition(opt_view_dir)
|
|
list(APPEND opt_view_dirs ${opt_view_dir})
|
|
endif()
|
|
else()
|
|
set(objfiles_out)
|
|
add_swift_multisource_nonwmo_benchmark_library(objfiles_out
|
|
MODULE_PATH "${module_name_path}"
|
|
SOURCE_DIR "${srcdir}"
|
|
OBJECT_DIR "${objdir}"
|
|
SOURCES ${${module_name}_sources}
|
|
LIBRARY_FLAGS ${common_swift4_options} ${bench_flags} ${SWIFT_BENCHMARK_EXTRA_FLAGS}
|
|
DEPENDS ${bench_library_objects} ${stdlib_dependencies})
|
|
precondition(objfiles_out)
|
|
list(APPEND SWIFT_BENCH_OBJFILES ${objfiles_out})
|
|
endif()
|
|
endforeach()
|
|
|
|
set(module_name "main")
|
|
set(source "${srcdir}/utils/${module_name}.swift")
|
|
add_custom_command(
|
|
OUTPUT "${objdir}/${module_name}.o"
|
|
DEPENDS
|
|
${stdlib_dependencies}
|
|
${bench_library_objects} ${bench_driver_objects} ${SWIFT_BENCH_OBJFILES}
|
|
${bench_library_sibfiles} ${bench_driver_sibfiles}
|
|
${SWIFT_BENCH_SIBFILES} "${source}"
|
|
COMMAND "${SWIFT_EXEC}"
|
|
${common_swift4_options}
|
|
"-force-single-frontend-invocation"
|
|
"-emit-module" "-module-name" "${module_name}"
|
|
"-I" "${objdir}"
|
|
"-o" "${objdir}/${module_name}.o"
|
|
"${source}")
|
|
list(APPEND SWIFT_BENCH_OBJFILES "${objdir}/${module_name}.o")
|
|
|
|
set(objcfile)
|
|
if (is_darwin)
|
|
set(objcfile "${objdir}/ObjectiveCTests.o")
|
|
add_custom_command(
|
|
OUTPUT "${objcfile}"
|
|
DEPENDS "${srcdir}/utils/ObjectiveCTests/ObjectiveCTests.m"
|
|
"${srcdir}/utils/ObjectiveCTests/ObjectiveCTests.h"
|
|
COMMAND
|
|
"${CLANG_EXEC}"
|
|
"-fno-stack-protector"
|
|
"-fPIC"
|
|
"-Werror=date-time"
|
|
"-fcolor-diagnostics"
|
|
"-O3"
|
|
"-target" "${target}"
|
|
"-isysroot" "${sdk}"
|
|
"-fobjc-arc"
|
|
"-arch" "${BENCH_COMPILE_ARCHOPTS_ARCH}"
|
|
"-F" "${sdk}/../../../Developer/Library/Frameworks"
|
|
"-m${triple_platform}-version-min=${ver}"
|
|
"-I" "${srcdir}/utils/ObjectiveCTests"
|
|
"${srcdir}/utils/ObjectiveCTests/ObjectiveCTests.m"
|
|
"-c"
|
|
"-o" "${objcfile}")
|
|
endif()
|
|
|
|
if(is_darwin)
|
|
# If host == target.
|
|
if("${BENCH_COMPILE_ARCHOPTS_PLATFORM}" STREQUAL "macosx")
|
|
set(OUTPUT_EXEC "${benchmark-bin-dir}/Benchmark_${BENCH_COMPILE_ARCHOPTS_OPT}")
|
|
else()
|
|
set(OUTPUT_EXEC "${benchmark-bin-dir}/Benchmark_${BENCH_COMPILE_ARCHOPTS_OPT}-${target}")
|
|
endif()
|
|
else()
|
|
# If we are on Linux, we do not support cross compiling.
|
|
set(OUTPUT_EXEC "${benchmark-bin-dir}/Benchmark_${BENCH_COMPILE_ARCHOPTS_OPT}")
|
|
endif()
|
|
|
|
# TODO: Unify the linux and darwin builds here.
|
|
#
|
|
# We are avoiding this for now until it is investigated if swiftc and clang
|
|
# both do exactly the same thing with both sets of arguments. It also lets us
|
|
# avoid issues around code-signing.
|
|
if (is_darwin)
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_EXEC}"
|
|
DEPENDS
|
|
${bench_library_objects} ${bench_driver_objects} ${SWIFT_BENCH_OBJFILES}
|
|
"${objcfile}" ${opt_view_dirs}
|
|
COMMAND
|
|
"${CLANG_EXEC}"
|
|
"-fno-stack-protector"
|
|
"-fPIC"
|
|
"-Werror=date-time"
|
|
"-fcolor-diagnostics"
|
|
"-O3"
|
|
"-Wl,-search_paths_first"
|
|
"-Wl,-headerpad_max_install_names"
|
|
"-target" "${target}"
|
|
"-isysroot" "${sdk}"
|
|
"-arch" "${BENCH_COMPILE_ARCHOPTS_ARCH}"
|
|
"-F" "${sdk}/../../../Developer/Library/Frameworks"
|
|
"-m${triple_platform}-version-min=${ver}"
|
|
"-lobjc"
|
|
"-L${SWIFT_LIBRARY_PATH}/${BENCH_COMPILE_ARCHOPTS_PLATFORM}"
|
|
"-Xlinker" "-rpath"
|
|
"-Xlinker" "@executable_path/../lib/swift/${BENCH_COMPILE_ARCHOPTS_PLATFORM}"
|
|
${bench_library_objects}
|
|
${bench_driver_objects}
|
|
${SWIFT_BENCH_OBJFILES}
|
|
${objcfile}
|
|
"-o" "${OUTPUT_EXEC}"
|
|
COMMAND
|
|
"codesign" "-f" "-s" "-" "${OUTPUT_EXEC}")
|
|
else()
|
|
# TODO: rpath.
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_EXEC}"
|
|
DEPENDS
|
|
${bench_library_objects} ${bench_driver_objects} ${SWIFT_BENCH_OBJFILES}
|
|
"${objcfile}" ${opt_view_dirs}
|
|
COMMAND
|
|
"${SWIFT_EXEC}"
|
|
"-O"
|
|
"-target" "${target}"
|
|
"-L${SWIFT_LIBRARY_PATH}/${BENCH_COMPILE_ARCHOPTS_PLATFORM}"
|
|
${bench_library_objects}
|
|
${bench_driver_objects}
|
|
${SWIFT_BENCH_OBJFILES}
|
|
"-o" "${OUTPUT_EXEC}")
|
|
endif()
|
|
set(new_output_exec "${OUTPUT_EXEC}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(swift_benchmark_compile)
|
|
cmake_parse_arguments(SWIFT_BENCHMARK_COMPILE "" "PLATFORM" "" ${ARGN})
|
|
|
|
if(NOT SWIFT_BENCHMARK_BUILT_STANDALONE)
|
|
set(stdlib_dependencies "swift")
|
|
foreach(stdlib_dependency ${UNIVERSAL_LIBRARY_NAMES_${SWIFT_BENCHMARK_COMPILE_PLATFORM}})
|
|
string(FIND "${stdlib_dependency}" "Unittest" find_output)
|
|
if("${find_output}" STREQUAL "-1")
|
|
list(APPEND stdlib_dependencies "${stdlib_dependency}")
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
set(platform_executables)
|
|
foreach(arch ${${SWIFT_BENCHMARK_COMPILE_PLATFORM}_arch})
|
|
set(platform_executables)
|
|
foreach(optset ${SWIFT_OPTIMIZATION_LEVELS})
|
|
swift_benchmark_compile_archopts(
|
|
PLATFORM "${platform}"
|
|
ARCH "${arch}"
|
|
OPT "${optset}")
|
|
list(APPEND platform_executables ${new_output_exec})
|
|
endforeach()
|
|
|
|
# If we are building standalone as part of a subcmake build, we add the
|
|
# -external suffix to all of our cmake target names. This enables the main
|
|
# swift build to simple create -external targets and forward them via
|
|
# AddExternalProject to the standalone benchmark project. The reason why
|
|
# this is necessary is that we want to be able to support in-tree and
|
|
# out-of-tree benchmark builds at the same time implying that we need some
|
|
# sort of way to distinguish the in-tree (which don't have the suffix) from
|
|
# the out of tree target (which do).
|
|
translate_flag(SWIFT_BENCHMARK_SUBCMAKE_BUILD "-external" external)
|
|
set(executable_target "swift-benchmark-${SWIFT_BENCHMARK_COMPILE_PLATFORM}-${arch}${external}")
|
|
|
|
add_custom_target("${executable_target}"
|
|
DEPENDS ${platform_executables})
|
|
|
|
if(NOT SWIFT_BENCHMARK_BUILT_STANDALONE AND "${SWIFT_BENCHMARK_COMPILE_PLATFORM}" STREQUAL "macosx")
|
|
add_custom_command(
|
|
TARGET "${executable_target}"
|
|
POST_BUILD
|
|
COMMAND
|
|
"mv" ${platform_executables} "${swift-bin-dir}")
|
|
|
|
add_custom_target("check-${executable_target}"
|
|
COMMAND "${swift-bin-dir}/Benchmark_Driver" "run"
|
|
"-o" "O" "--output-dir" "${CMAKE_CURRENT_BINARY_DIR}/logs"
|
|
"--swift-repo" "${SWIFT_SOURCE_DIR}"
|
|
"--independent-samples" "${SWIFT_BENCHMARK_NUM_O_ITERATIONS}"
|
|
COMMAND "${swift-bin-dir}/Benchmark_Driver" "run"
|
|
"-o" "Onone" "--output-dir" "${CMAKE_CURRENT_BINARY_DIR}/logs"
|
|
"--swift-repo" "${SWIFT_SOURCE_DIR}"
|
|
"--independent-samples" "${SWIFT_BENCHMARK_NUM_ONONE_ITERATIONS}"
|
|
COMMAND "${swift-bin-dir}/Benchmark_Driver" "compare"
|
|
"--log-dir" "${CMAKE_CURRENT_BINARY_DIR}/logs"
|
|
"--swift-repo" "${SWIFT_SOURCE_DIR}"
|
|
"--compare-script"
|
|
"${SWIFT_SOURCE_DIR}/benchmark/scripts/compare_perf_tests.py")
|
|
endif()
|
|
endforeach()
|
|
endfunction()
|