Skip to content

Commit bebe119

Browse files
authored
Merge pull request #40573 from Catfish-Man/unicodectomy
2 parents 803d56b + a10d98e commit bebe119

File tree

15 files changed

+123
-2
lines changed

15 files changed

+123
-2
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ option(SWIFT_BUILD_STATIC_STDLIB
9797
option(SWIFT_STDLIB_STATIC_PRINT
9898
"Build compile-time evaluated vprintf()"
9999
FALSE)
100+
101+
option(SWIFT_STDLIB_ENABLE_UNICODE_DATA
102+
"Include Unicode data files in the standard library.
103+
NOTE: Disabling this will cause many String methods to crash."
104+
TRUE)
100105

101106
option(SWIFT_BUILD_DYNAMIC_SDK_OVERLAY
102107
"Build dynamic variants of the Swift SDK overlay"
@@ -1020,6 +1025,7 @@ if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_SDK_OVERLAY)
10201025
message(STATUS "Concurrency Support: ${SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY}")
10211026
message(STATUS "Distributed Support: ${SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED}")
10221027
message(STATUS "String Processing Support: ${SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING}")
1028+
message(STATUS "Unicode Support: ${SWIFT_STDLIB_ENABLE_UNICODE_DATA}")
10231029
message(STATUS "")
10241030
else()
10251031
message(STATUS "Not building Swift standard library, SDK overlays, and runtime")

include/swift/Runtime/Debug.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ void swift_abortDynamicReplacementEnabling();
142142
SWIFT_RUNTIME_ATTRIBUTE_NORETURN SWIFT_RUNTIME_ATTRIBUTE_NOINLINE
143143
void swift_abortDynamicReplacementDisabling();
144144

145+
// Halt due to trying to use unicode data on platforms that don't have it.
146+
SWIFT_RUNTIME_ATTRIBUTE_NORETURN SWIFT_RUNTIME_ATTRIBUTE_NOINLINE
147+
void swift_abortDisabledUnicodeSupport();
148+
145149
/// This function dumps one line of a stack trace. It is assumed that \p framePC
146150
/// is the address of the stack frame at index \p index. If \p shortOutput is
147151
/// true, this functions prints only the name of the symbol and offset, ignores

stdlib/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ option(SWIFT_BUILD_TEST_SUPPORT_MODULES
7979
option(SWIFT_STDLIB_ENABLE_PRESPECIALIZATION
8080
"Should stdlib be built with generic metadata prespecialization enabled. Defaults to On on Darwin and on Linux."
8181
"${SWIFT_STDLIB_ENABLE_PRESPECIALIZATION_default}")
82+
83+
option(SWIFT_STDLIB_ENABLE_UNICODE_DATA
84+
"Should stdlib be built with full unicode support"
85+
TRUE)
8286

8387
# New options should be added to stdlib/cmake/modules/StdlibOptions.cmake,
8488
# so that they are considered in configurations using StandaloneOverlay.cmake

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ function(_add_target_variant_c_compile_flags)
371371
if(SWIFT_STDLIB_SUPPORTS_BACKTRACE_REPORTING)
372372
list(APPEND result "-DSWIFT_STDLIB_SUPPORTS_BACKTRACE_REPORTING")
373373
endif()
374+
375+
if(SWIFT_STDLIB_ENABLE_UNICODE_DATA)
376+
list(APPEND result "-D" "SWIFT_STDLIB_ENABLE_UNICODE_DATA")
377+
endif()
374378

375379
list(APPEND result ${SWIFT_STDLIB_EXTRA_C_COMPILE_FLAGS})
376380

stdlib/cmake/modules/SwiftSource.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ function(_add_target_variant_swift_compile_flags
296296
if(SWIFT_STDLIB_STATIC_PRINT)
297297
list(APPEND result "-D" "SWIFT_STDLIB_STATIC_PRINT")
298298
endif()
299+
300+
if(SWIFT_STDLIB_ENABLE_UNICODE_DATA)
301+
list(APPEND result "-D" "SWIFT_STDLIB_ENABLE_UNICODE_DATA")
302+
endif()
299303

300304
if(SWIFT_STDLIB_HAS_COMMANDLINE)
301305
list(APPEND result "-D" "SWIFT_STDLIB_HAS_COMMANDLINE")

stdlib/public/runtime/Errors.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,3 +455,10 @@ void swift::swift_abortDynamicReplacementDisabling() {
455455
"Fatal error: trying to disable a dynamic replacement "
456456
"that is already disabled");
457457
}
458+
459+
/// Halt due to trying to use unicode data on platforms that don't have it.
460+
void swift::swift_abortDisabledUnicodeSupport() {
461+
swift::fatalError(FatalErrorFlags::ReportBacktrace,
462+
"Unicode normalization data is disabled on this platform");
463+
464+
}

stdlib/public/stubs/Unicode/UnicodeGrapheme.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#if SWIFT_STDLIB_ENABLE_UNICODE_DATA
1314
#include "Common/GraphemeData.h"
15+
#else
16+
#include "swift/Runtime/Debug.h"
17+
#endif
1418
#include "../SwiftShims/UnicodeData.h"
1519

1620
SWIFT_RUNTIME_STDLIB_INTERNAL
1721
__swift_uint8_t _swift_stdlib_getGraphemeBreakProperty(__swift_uint32_t scalar) {
22+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
23+
swift::swift_abortDisabledUnicodeSupport();
24+
#else
1825
auto low = 0;
1926
auto high = GRAPHEME_BREAK_DATA_COUNT - 1;
2027

@@ -56,4 +63,5 @@ __swift_uint8_t _swift_stdlib_getGraphemeBreakProperty(__swift_uint32_t scalar)
5663
// array (this occurs when a scalar doesn't map to any grapheme break
5764
// property). Return the max value here to indicate .any.
5865
return 0xFF;
66+
#endif
5967
}

stdlib/public/stubs/Unicode/UnicodeNormalization.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#if SWIFT_STDLIB_ENABLE_UNICODE_DATA
14+
1315
#if defined(__APPLE__)
1416
#include "Apple/NormalizationData.h"
1517
#else
1618
#include "Common/NormalizationData.h"
1719
#endif
1820

21+
#else
22+
#include "swift/Runtime/Debug.h"
23+
#endif
24+
1925
#include "../SwiftShims/UnicodeData.h"
2026
#include <limits>
2127

@@ -26,7 +32,10 @@ __swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar) {
2632
if (scalar < 0xC0) {
2733
return 0;
2834
}
29-
35+
36+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
37+
swift::swift_abortDisabledUnicodeSupport();
38+
#else
3039
auto dataIdx = _swift_stdlib_getScalarBitArrayIdx(scalar,
3140
_swift_stdlib_normData,
3241
_swift_stdlib_normData_ranks);
@@ -39,25 +48,38 @@ __swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar) {
3948

4049
auto scalarDataIdx = _swift_stdlib_normData_data_indices[dataIdx];
4150
return _swift_stdlib_normData_data[scalarDataIdx];
51+
#endif
4252
}
4353

54+
#if SWIFT_STDLIB_ENABLE_UNICODE_DATA
4455
SWIFT_RUNTIME_STDLIB_INTERNAL
4556
const __swift_uint8_t * const _swift_stdlib_nfd_decompositions = _swift_stdlib_nfd_decomp;
57+
#else
58+
SWIFT_RUNTIME_STDLIB_INTERNAL
59+
const __swift_uint8_t * const _swift_stdlib_nfd_decompositions = nullptr;
60+
#endif
4661

4762
SWIFT_RUNTIME_STDLIB_INTERNAL
4863
__swift_uint32_t _swift_stdlib_getDecompositionEntry(__swift_uint32_t scalar) {
64+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
65+
swift::swift_abortDisabledUnicodeSupport();
66+
#else
4967
auto levelCount = NFD_DECOMP_LEVEL_COUNT;
5068
__swift_intptr_t decompIdx = _swift_stdlib_getMphIdx(scalar, levelCount,
5169
_swift_stdlib_nfd_decomp_keys,
5270
_swift_stdlib_nfd_decomp_ranks,
5371
_swift_stdlib_nfd_decomp_sizes);
5472

5573
return _swift_stdlib_nfd_decomp_indices[decompIdx];
74+
#endif
5675
}
5776

5877
SWIFT_RUNTIME_STDLIB_INTERNAL
5978
__swift_uint32_t _swift_stdlib_getComposition(__swift_uint32_t x,
6079
__swift_uint32_t y) {
80+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
81+
swift::swift_abortDisabledUnicodeSupport();
82+
#else
6183
auto levelCount = NFC_COMP_LEVEL_COUNT;
6284
__swift_intptr_t compIdx = _swift_stdlib_getMphIdx(y, levelCount,
6385
_swift_stdlib_nfc_comp_keys,
@@ -113,4 +135,5 @@ __swift_uint32_t _swift_stdlib_getComposition(__swift_uint32_t x,
113135
// array.
114136
// Return the max here to indicate that we couldn't find one.
115137
return std::numeric_limits<__swift_uint32_t>::max();
138+
#endif
116139
}

stdlib/public/stubs/Unicode/UnicodeScalarProps.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,26 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#if SWIFT_STDLIB_ENABLE_UNICODE_DATA
14+
1315
#if defined(__APPLE__)
1416
#include "Apple/ScalarPropsData.h"
1517
#else
1618
#include "Common/ScalarPropsData.h"
1719
#endif
1820

21+
#else
22+
#include "swift/Runtime/Debug.h"
23+
#endif
24+
1925
#include "../SwiftShims/UnicodeData.h"
2026
#include <limits>
2127

2228
SWIFT_RUNTIME_STDLIB_INTERNAL
2329
__swift_uint64_t _swift_stdlib_getBinaryProperties(__swift_uint32_t scalar) {
24-
30+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
31+
swift::swift_abortDisabledUnicodeSupport();
32+
#else
2533
auto lowerBoundIndex = 0;
2634
auto endIndex = BIN_PROPS_COUNT;
2735
auto upperBoundIndex = endIndex - 1;
@@ -72,10 +80,14 @@ __swift_uint64_t _swift_stdlib_getBinaryProperties(__swift_uint32_t scalar) {
7280
// scalars from 0x0 to 0x10FFFF, but if somehow this branch gets reached,
7381
// return 0 to indicate no properties.
7482
return 0;
83+
#endif
7584
}
7685

7786
SWIFT_RUNTIME_STDLIB_INTERNAL
7887
__swift_uint8_t _swift_stdlib_getNumericType(__swift_uint32_t scalar) {
88+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
89+
swift::swift_abortDisabledUnicodeSupport();
90+
#else
7991
auto lowerBoundIndex = 0;
8092
auto endIndex = NUMERIC_TYPE_COUNT;
8193
auto upperBoundIndex = endIndex - 1;
@@ -110,10 +122,14 @@ __swift_uint8_t _swift_stdlib_getNumericType(__swift_uint32_t scalar) {
110122
// array.
111123
// Return the max here to indicate that we couldn't find one.
112124
return std::numeric_limits<__swift_uint8_t>::max();
125+
#endif
113126
}
114127

115128
SWIFT_RUNTIME_STDLIB_INTERNAL
116129
double _swift_stdlib_getNumericValue(__swift_uint32_t scalar) {
130+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
131+
swift::swift_abortDisabledUnicodeSupport();
132+
#else
117133
auto levelCount = NUMERIC_VALUES_LEVEL_COUNT;
118134
__swift_intptr_t scalarIdx = _swift_stdlib_getMphIdx(scalar, levelCount,
119135
_swift_stdlib_numeric_values_keys,
@@ -122,10 +138,14 @@ double _swift_stdlib_getNumericValue(__swift_uint32_t scalar) {
122138

123139
auto valueIdx = _swift_stdlib_numeric_values_indices[scalarIdx];
124140
return _swift_stdlib_numeric_values[valueIdx];
141+
#endif
125142
}
126143

127144
SWIFT_RUNTIME_STDLIB_INTERNAL
128145
const char *_swift_stdlib_getNameAlias(__swift_uint32_t scalar) {
146+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
147+
swift::swift_abortDisabledUnicodeSupport();
148+
#else
129149
auto dataIdx = _swift_stdlib_getScalarBitArrayIdx(scalar,
130150
_swift_stdlib_nameAlias,
131151
_swift_stdlib_nameAlias_ranks);
@@ -135,11 +155,15 @@ const char *_swift_stdlib_getNameAlias(__swift_uint32_t scalar) {
135155
}
136156

137157
return _swift_stdlib_nameAlias_data[dataIdx];
158+
#endif
138159
}
139160

140161
SWIFT_RUNTIME_STDLIB_INTERNAL
141162
__swift_int32_t _swift_stdlib_getMapping(__swift_uint32_t scalar,
142163
__swift_uint8_t mapping) {
164+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
165+
swift::swift_abortDisabledUnicodeSupport();
166+
#else
143167
auto dataIdx = _swift_stdlib_getScalarBitArrayIdx(scalar,
144168
_swift_stdlib_mappings,
145169
_swift_stdlib_mappings_ranks);
@@ -178,12 +202,16 @@ __swift_int32_t _swift_stdlib_getMapping(__swift_uint32_t scalar,
178202
}
179203

180204
return _swift_stdlib_mappings_data[mappingIdx];
205+
#endif
181206
}
182207

183208
SWIFT_RUNTIME_STDLIB_INTERNAL
184209
const __swift_uint8_t *_swift_stdlib_getSpecialMapping(__swift_uint32_t scalar,
185210
__swift_uint8_t mapping,
186211
__swift_intptr_t *length) {
212+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
213+
swift::swift_abortDisabledUnicodeSupport();
214+
#else
187215
auto dataIdx = _swift_stdlib_getScalarBitArrayIdx(scalar,
188216
_swift_stdlib_special_mappings,
189217
_swift_stdlib_special_mappings_ranks);
@@ -218,12 +246,16 @@ const __swift_uint8_t *_swift_stdlib_getSpecialMapping(__swift_uint32_t scalar,
218246
default:
219247
return nullptr;
220248
}
249+
#endif
221250
}
222251

223252
SWIFT_RUNTIME_STDLIB_INTERNAL
224253
__swift_intptr_t _swift_stdlib_getScalarName(__swift_uint32_t scalar,
225254
__swift_uint8_t *buffer,
226255
__swift_intptr_t capacity) {
256+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
257+
swift::swift_abortDisabledUnicodeSupport();
258+
#else
227259
auto setOffset = _swift_stdlib_names_scalar_sets[scalar >> 7];
228260

229261
if (setOffset == std::numeric_limits<__swift_uint16_t>::max()) {
@@ -309,10 +341,14 @@ __swift_intptr_t _swift_stdlib_getScalarName(__swift_uint32_t scalar,
309341

310342
// The return value is the number of initialized bytes.
311343
return c;
344+
#endif
312345
}
313346

314347
SWIFT_RUNTIME_STDLIB_INTERNAL
315348
__swift_uint16_t _swift_stdlib_getAge(__swift_uint32_t scalar) {
349+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
350+
swift::swift_abortDisabledUnicodeSupport();
351+
#else
316352
auto lowerBoundIndex = 0;
317353
auto endIndex = AGE_COUNT;
318354
auto upperBoundIndex = endIndex - 1;
@@ -347,10 +383,14 @@ __swift_uint16_t _swift_stdlib_getAge(__swift_uint32_t scalar) {
347383
// array.
348384
// Return the max here to indicate that we couldn't find one.
349385
return std::numeric_limits<__swift_uint16_t>::max();
386+
#endif
350387
}
351388

352389
SWIFT_RUNTIME_STDLIB_INTERNAL
353390
__swift_uint8_t _swift_stdlib_getGeneralCategory(__swift_uint32_t scalar) {
391+
#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA
392+
swift::swift_abortDisabledUnicodeSupport();
393+
#else
354394
auto lowerBoundIndex = 0;
355395
auto endIndex = GENERAL_CATEGORY_COUNT;
356396
auto upperBoundIndex = endIndex - 1;
@@ -385,4 +425,5 @@ __swift_uint8_t _swift_stdlib_getGeneralCategory(__swift_uint32_t scalar) {
385425
// array.
386426
// Return the max here to indicate that we couldn't find one.
387427
return std::numeric_limits<__swift_uint8_t>::max();
428+
#endif
388429
}

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ normalize_boolean_spelling(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS)
205205
normalize_boolean_spelling(SWIFT_HAVE_LIBXML2)
206206
normalize_boolean_spelling(SWIFT_INCLUDE_TOOLS)
207207
normalize_boolean_spelling(SWIFT_STDLIB_STATIC_PRINT)
208+
normalize_boolean_spelling(SWIFT_STDLIB_ENABLE_UNICODE_DATA)
208209
normalize_boolean_spelling(SWIFT_ENABLE_DISPATCH)
209210
normalize_boolean_spelling(SWIFT_STDLIB_ENABLE_OBJC_INTEROP)
210211
is_build_type_optimized("${SWIFT_STDLIB_BUILD_TYPE}" SWIFT_OPTIMIZED)

test/lit.site.cfg.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ if "@SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED@" == "TRUE":
139139
config.available_features.add('distributed')
140140
if "@SWIFT_STDLIB_STATIC_PRINT@" == "TRUE":
141141
config.available_features.add('stdlib_static_print')
142+
if "@SWIFT_STDLIB_ENABLE_UNICODE_DATA" == "TRUE":
143+
config.available_features.add('stdlib_unicode_data')
142144
if "@SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING@" == "TRUE":
143145
config.available_features.add('string_processing')
144146

utils/build_swift/build_swift/driver_arguments.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,11 @@ def create_argument_parser():
986986
option('--build-swift-stdlib-static-print', toggle_true,
987987
help='Build constant_vprintf support')
988988

989+
option('--build-swift-stdlib-unicode-data', toggle_true,
990+
default=True,
991+
help='Include Unicode data in the standard library.'
992+
'Note: required for full String functionality')
993+
989994
option(['-S', '--skip-build'], store_true,
990995
help='generate build directory only without building')
991996

utils/build_swift/tests/expected_options.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
'build_swift_static_stdlib': False,
8585
'build_swift_stdlib_unittest_extra': False,
8686
'build_swift_stdlib_static_print': False,
87+
'build_swift_stdlib_unicode_data': True,
8788
'build_swiftpm': False,
8889
'build_swift_driver': False,
8990
'build_early_swift_driver': True,
@@ -536,6 +537,7 @@ class BuildScriptImplOption(_BaseOption):
536537
EnableOption('--build-swift-stdlib-unittest-extra'),
537538
EnableOption('--build-swift-stdlib-static-print'),
538539
EnableOption('--build-swift-private-stdlib'),
540+
EnableOption('--build-swift-stdlib-unicode-data'),
539541
EnableOption('--distcc'),
540542
EnableOption('--sccache'),
541543
EnableOption('--enable-asan'),

0 commit comments

Comments
 (0)