Skip to content

Commit c1612c7

Browse files
committed
Merge branch 'master' of https://github.com/apple/swift
2 parents 78e968f + 9fa91e9 commit c1612c7

File tree

791 files changed

+20635
-9554
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

791 files changed

+20635
-9554
lines changed

CMakeLists.txt

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -898,14 +898,20 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
898898
if(CMAKE_C_COMPILER_ID STREQUAL Clang AND
899899
CMAKE_C_COMPILER_VERSION VERSION_GREATER 3.8
900900
OR LLVM_USE_SANITIZER)
901-
set(SWIFT_LIBDISPATCH_C_COMPILER ${CMAKE_C_COMPILER})
902-
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${CMAKE_CXX_COMPILER})
903-
elseif(${CMAKE_SYSTEM_NAME} STREQUAL ${CMAKE_HOST_SYSTEM_NAME})
904-
set(SWIFT_LIBDISPATCH_C_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang)
905-
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang++)
906-
else()
907-
message(SEND_ERROR "libdispatch requires a newer clang compiler (${CMAKE_C_COMPILER_VERSION} < 3.9)")
908-
endif()
901+
set(SWIFT_LIBDISPATCH_C_COMPILER ${CMAKE_C_COMPILER})
902+
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${CMAKE_CXX_COMPILER})
903+
elseif(${CMAKE_SYSTEM_NAME} STREQUAL ${CMAKE_HOST_SYSTEM_NAME})
904+
set(SWIFT_LIBDISPATCH_C_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang)
905+
set(SWIFT_LIBDISPATCH_CXX_COMPILER ${PATH_TO_CLANG_BUILD}/bin/clang++)
906+
else()
907+
message(SEND_ERROR "libdispatch requires a newer clang compiler (${CMAKE_C_COMPILER_VERSION} < 3.9)")
908+
endif()
909+
910+
if(SWIFT_HOST_VARIANT_SDK STREQUAL WINDOWS)
911+
set(SOURCEKIT_LIBDISPATCH_RUNTIME_DIR bin)
912+
else()
913+
set(SOURCEKIT_LIBDISPATCH_RUNTIME_DIR lib)
914+
endif()
909915

910916
include(ExternalProject)
911917
ExternalProject_Add(libdispatch
@@ -923,6 +929,7 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
923929
-DCMAKE_LINKER=${CMAKE_LINKER}
924930
-DCMAKE_RANLIB=${CMAKE_RANLIB}
925931
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
932+
-DBUILD_SHARED_LIBS=YES
926933
-DENABLE_SWIFT=NO
927934
-DENABLE_TESTING=NO
928935
INSTALL_COMMAND
@@ -933,9 +940,9 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
933940
STEP_TARGETS
934941
install
935942
BUILD_BYPRODUCTS
936-
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
943+
<INSTALL_DIR>/${SOURCEKIT_LIBDISPATCH_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
937944
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
938-
<INSTALL_DIR>/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
945+
<INSTALL_DIR>/${SOURCEKIT_LIBDISPATCH_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
939946
<INSTALL_DIR>/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
940947
BUILD_ALWAYS
941948
1)
@@ -951,7 +958,7 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
951958
set_target_properties(dispatch
952959
PROPERTIES
953960
IMPORTED_LOCATION
954-
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
961+
${install_dir}/${SOURCEKIT_LIBDISPATCH_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
955962
IMPORTED_IMPLIB
956963
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}dispatch${CMAKE_IMPORT_LIBRARY_SUFFIX}
957964
INTERFACE_INCLUDE_DIRECTORIES
@@ -961,7 +968,7 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
961968
set_target_properties(BlocksRuntime
962969
PROPERTIES
963970
IMPORTED_LOCATION
964-
${install_dir}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
971+
${install_dir}/${SOURCEKIT_LIBDISPATCH_RUNTIME_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}BlocksRuntime${CMAKE_SHARED_LIBRARY_SUFFIX}
965972
IMPORTED_IMPLIB
966973
${install_dir}/lib/${CMAKE_IMPORT_LIBRARY_PREFIX}BlocksRuntime${CMAKE_IMPORT_LIBRARY_SUFFIX}
967974
INTERFACE_INCLUDE_DIRECTORIES
@@ -984,23 +991,14 @@ if(SWIFT_NEED_EXPLICIT_LIBDISPATCH)
984991
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE})
985992
endif()
986993

987-
#
988-
# Set up global CMake variables for API notes.
989-
#
990-
set(SWIFT_API_NOTES_PATH "${SWIFT_SOURCE_DIR}/apinotes")
991-
include("${SWIFT_API_NOTES_PATH}/CMakeLists.txt")
992-
if(NOT DEFINED SWIFT_API_NOTES_INPUTS)
993-
message(FATAL_ERROR "API notes are not available in ${SWIFT_API_NOTES_PATH}")
994-
endif()
995-
996994
# Add all of the subdirectories, where we actually do work.
997995

998996
###############
999997
# PLEASE READ #
1000998
###############
1001999
#
10021000
# We have to include stdlib/ before tools/.
1003-
# Do not move add_subdirectory(stdlib) after add_subdirectory(tools)!
1001+
# Do not move add_subdirectory(stdlib) after add_subdirectory(tools)!
10041002
#
10051003
# We must include stdlib/ before tools/ because stdlib/CMakeLists.txt
10061004
# declares the swift-stdlib-* set of targets. These targets will then
@@ -1016,6 +1014,14 @@ endif()
10161014
# https://bugs.swift.org/browse/SR-5975
10171015
add_subdirectory(stdlib)
10181016

1017+
if(SWIFT_BUILD_SDK_OVERLAY)
1018+
list_intersect("${SWIFT_APPLE_PLATFORMS}" "${SWIFT_SDKS}"
1019+
building_darwin_sdks)
1020+
if(building_darwin_sdks)
1021+
add_subdirectory(apinotes)
1022+
endif()
1023+
endif()
1024+
10191025
add_subdirectory(include)
10201026

10211027
if(SWIFT_INCLUDE_TOOLS)

apinotes/CMakeLists.txt

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
1-
set(SWIFT_API_NOTES_INPUTS
2-
Accelerate
3-
Dispatch
4-
ScriptingBridge
5-
os
1+
set(sources
2+
Accelerate.apinotes
3+
Dispatch.apinotes
4+
ScriptingBridge.apinotes
5+
os.apinotes
66
)
77

8-
if(NOT DEFINED SWIFT_API_NOTES_PATH)
9-
message(FATAL_ERROR "Define SWIFT_API_NOTES_PATH before including this file")
10-
endif()
8+
set(output_dir "${SWIFTLIB_DIR}/apinotes")
119

12-
foreach(module ${SWIFT_API_NOTES_INPUTS})
13-
if(NOT EXISTS "${SWIFT_API_NOTES_PATH}/${module}.apinotes")
14-
message(SEND_ERROR "Missing apinotes for ${module}")
15-
endif()
10+
set(inputs)
11+
set(outputs)
12+
foreach(input ${sources})
13+
list(APPEND inputs "${CMAKE_CURRENT_SOURCE_DIR}/${input}")
14+
list(APPEND outputs "${output_dir}/${input}")
1615
endforeach()
1716

18-
file(GLOB SWIFT_API_NOTES_INPUT_FILES "${SWIFT_API_NOTES_PATH}/*.apinotes")
19-
foreach(file ${SWIFT_API_NOTES_INPUT_FILES})
20-
get_filename_component(name "${file}" NAME_WE)
21-
if(NOT "${name}" IN_LIST SWIFT_API_NOTES_INPUTS)
22-
message(SEND_ERROR "Found apinotes for ${name}; please add to CMakeLists.txt")
23-
endif()
24-
endforeach()
17+
add_custom_command(
18+
OUTPUT "${output_dir}"
19+
COMMAND ${CMAKE_COMMAND} "-E" "make_directory" "${output_dir}")
20+
add_custom_command(
21+
OUTPUT ${outputs}
22+
DEPENDS ${inputs} "${output_dir}"
23+
COMMAND
24+
"${CMAKE_COMMAND}" "-E" "copy_if_different" ${inputs} "${output_dir}/")
25+
26+
add_custom_target("copy_apinotes"
27+
DEPENDS "${outputs}" "${output_dir}"
28+
COMMENT "Copying API notes to ${output_dir}"
29+
SOURCES "${sources}")
30+
31+
swift_install_in_component(sdk-overlay
32+
FILES ${sources}
33+
DESTINATION "lib/swift/apinotes")

benchmark/scripts/Benchmark_Driver

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class BenchmarkDriver(object):
5555
self.args = args
5656
self._subprocess = _subprocess or subprocess
5757
self.all_tests = []
58+
self.test_number = {}
5859
self.tests = tests or self._get_tests()
5960
self.parser = parser or LogParser()
6061
self.results = {}
@@ -106,16 +107,17 @@ class BenchmarkDriver(object):
106107

107108
def _get_tests(self):
108109
"""Return a list of performance tests to run."""
109-
index_name_pairs = [
110+
number_name_pairs = [
110111
line.split('\t')[:2] for line in
111112
self._invoke(self._cmd_list_benchmarks).split('\n')[1:-1]
112113
]
113114
# unzip list of pairs into 2 lists
114-
indices, self.all_tests = map(list, zip(*index_name_pairs))
115+
test_numbers, self.all_tests = map(list, zip(*number_name_pairs))
116+
self.test_number = dict(zip(self.all_tests, test_numbers))
115117
if self.args.filters:
116118
return self._tests_matching_patterns()
117119
if self.args.benchmarks:
118-
return self._tests_by_name_or_index(indices)
120+
return self._tests_by_name_or_number(test_numbers)
119121
return self.all_tests
120122

121123
def _tests_matching_patterns(self):
@@ -124,33 +126,44 @@ class BenchmarkDriver(object):
124126
for name in self.all_tests
125127
if pattern.match(name)])))
126128

127-
def _tests_by_name_or_index(self, indices):
129+
def _tests_by_name_or_number(self, test_numbers):
128130
benchmarks = set(self.args.benchmarks)
129-
index_to_name = dict(zip(indices, self.all_tests))
130-
indexed_names = [index_to_name[i]
131-
for i in benchmarks.intersection(set(indices))]
132-
return sorted(list(
133-
benchmarks.intersection(set(self.all_tests)).union(indexed_names)))
134-
135-
def run(self, test, num_samples=None, num_iters=None,
136-
verbose=None, measure_memory=False, quantile=None):
131+
number_to_name = dict(zip(test_numbers, self.all_tests))
132+
tests_by_number = [number_to_name[i]
133+
for i in benchmarks.intersection(set(test_numbers))]
134+
return sorted(list(benchmarks
135+
.intersection(set(self.all_tests))
136+
.union(tests_by_number)))
137+
138+
def run(self, test=None, num_samples=None, num_iters=None,
139+
sample_time=None, verbose=None, measure_memory=False,
140+
quantile=None):
137141
"""Execute benchmark and gather results."""
138142
num_samples = num_samples or 0
139143
num_iters = num_iters or 0 # automatically determine N to run for 1s
144+
sample_time = sample_time or 0 # default is 1s
140145

141146
cmd = self._cmd_run(
142-
test, num_samples, num_iters, verbose, measure_memory, quantile)
147+
test, num_samples, num_iters, sample_time,
148+
verbose, measure_memory, quantile)
143149
output = self._invoke(cmd)
144-
result = self.parser.results_from_string(output).items()[0][1]
145-
return result
146-
147-
def _cmd_run(self, test, num_samples, num_iters, verbose, measure_memory,
148-
quantile):
149-
cmd = [self.test_harness, test]
150+
results = self.parser.results_from_string(output)
151+
return results.items()[0][1] if test else results
152+
153+
def _cmd_run(self, test, num_samples, num_iters, sample_time,
154+
verbose, measure_memory, quantile):
155+
cmd = [self.test_harness]
156+
if test:
157+
cmd.append(test)
158+
else:
159+
cmd.extend([self.test_number.get(name, name)
160+
for name in self.tests])
150161
if num_samples > 0:
151162
cmd.append('--num-samples={0}'.format(num_samples))
152163
if num_iters > 0:
153164
cmd.append('--num-iters={0}'.format(num_iters))
165+
if sample_time > 0:
166+
cmd.append('--sample-time={0}'.format(sample_time))
154167
if verbose:
155168
cmd.append('--verbose')
156169
if measure_memory:
@@ -198,7 +211,6 @@ class BenchmarkDriver(object):
198211
from this method. When `csv_console` is False, the console output
199212
format is justified columns.
200213
"""
201-
202214
format = (
203215
(lambda values: ','.join(values)) if csv_console else
204216
(lambda values: self.RESULT.format(*values))) # justified columns
@@ -330,11 +342,15 @@ class BenchmarkDoctor(object):
330342
super(BenchmarkDoctor, self).__init__()
331343
self.driver = driver or BenchmarkDriver(args)
332344
self.results = {}
333-
self.console_handler = logging.StreamHandler(sys.stdout)
334-
self.console_handler.setLevel(logging.DEBUG if args.verbose else
335-
logging.INFO)
336-
self.console_handler.setFormatter(
337-
LoggingReportFormatter(use_color=sys.stdout.isatty()))
345+
346+
if hasattr(args, 'markdown') and args.markdown:
347+
self.console_handler = MarkdownReportHandler(sys.stdout)
348+
else:
349+
self.console_handler = logging.StreamHandler(sys.stdout)
350+
self.console_handler.setFormatter(
351+
LoggingReportFormatter(use_color=sys.stdout.isatty()))
352+
self.console_handler.setLevel(logging.DEBUG if args.verbose else
353+
logging.INFO)
338354
self.log.addHandler(self.console_handler)
339355
self.log.debug('Checking tests: %s', ', '.join(self.driver.tests))
340356
self.requirements = [
@@ -350,6 +366,7 @@ class BenchmarkDoctor(object):
350366
"""Close log handlers on exit."""
351367
for handler in list(self.log.handlers):
352368
handler.close()
369+
self.log.removeHandler(self.console_handler)
353370

354371
benchmark_naming_convention_re = re.compile(r'[A-Z][a-zA-Z0-9\-.!?]+')
355372
camel_humps_re = re.compile(r'[a-z][A-Z]')
@@ -418,14 +435,28 @@ class BenchmarkDoctor(object):
418435
"Decrease the workload of '%s' by a factor of %d (%d), to be "
419436
"less than %d μs.", name, factor(2), factor(10), threshold)
420437

438+
threshold = 20
439+
if runtime < threshold:
440+
log = (BenchmarkDoctor.log_runtime.error if runtime == 0 else
441+
BenchmarkDoctor.log_runtime.warning)
442+
log("'%s' execution took %d μs.", name, runtime)
443+
444+
BenchmarkDoctor.log_runtime.info(
445+
"Ensure the workload of '%s' has a properly measurable size"
446+
" (runtime > %d μs) and is not eliminated by the compiler (use"
447+
" `blackHole` function if necessary)." if runtime == 0 else
448+
"Increase the workload of '%s' to be more than %d μs.",
449+
name, threshold)
450+
421451
@staticmethod
422452
def _setup_overhead(measurements):
423453
select = BenchmarkDoctor._select
424454
ti1, ti2 = [float(min(mins)) for mins in
425455
[[result.samples.min for result in i_series]
426456
for i_series in
427457
[select(measurements, num_iters=i) for i in [1, 2]]]]
428-
setup = int(round(2.0 * (ti1 - ti2)))
458+
setup = (int(round(2.0 * (ti1 - ti2))) if ti2 > 20 # limit of accuracy
459+
else 0)
429460
ratio = (setup / ti1) if ti1 > 0 else 0
430461
return (setup, ratio)
431462

@@ -703,9 +734,13 @@ def parse_args(args):
703734
'check',
704735
help='',
705736
parents=[shared_benchmarks_parser])
706-
check_parser.add_argument(
737+
check_group = check_parser.add_mutually_exclusive_group()
738+
check_group.add_argument(
707739
'-v', '--verbose', action='store_true',
708-
help='show more details during benchmark analysis',)
740+
help='show more details during benchmark analysis')
741+
check_group.add_argument(
742+
'-md', '--markdown', action='store_true',
743+
help='format report as Markdown table')
709744
check_parser.set_defaults(func=BenchmarkDoctor.run_check)
710745

711746
compare_parser = subparsers.add_parser(

0 commit comments

Comments
 (0)