Skip to content

Commit d16f758

Browse files
committed
---
yaml --- r: 345902 b: refs/heads/master c: 5d7cb67 h: refs/heads/master
1 parent 6eb1121 commit d16f758

26 files changed

+123
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: bb6987783801bfe05fa233b30ae094870f75a274
2+
refs/heads/master: 5d7cb677f125bb6b96dc675e9d9c6696462ec48d
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/include/swift/Basic/Sanitizers.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ namespace swift {
1919
enum class SanitizerKind : unsigned {
2020
Address = 1 << 1,
2121
Thread = 1 << 2,
22-
Fuzzer = 1 << 3
22+
Fuzzer = 1 << 3,
23+
Undefined = 1 << 4
2324
};
2425

2526
} // end namespace swift

trunk/lib/Driver/DarwinToolChains.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ toolchains::Darwin::constructInvocation(const LinkJobAction &job,
360360
if (context.OI.SelectedSanitizers & SanitizerKind::Thread)
361361
addLinkSanitizerLibArgsForDarwin(context.Args, Arguments, "tsan", *this);
362362

363+
if (context.OI.SelectedSanitizers & SanitizerKind::Undefined)
364+
addLinkSanitizerLibArgsForDarwin(context.Args, Arguments, "ubsan", *this);
365+
363366
// Only link in libFuzzer for executables.
364367
if (job.getKind() == LinkKind::Executable &&
365368
(context.OI.SelectedSanitizers & SanitizerKind::Fuzzer))

trunk/lib/Driver/UnixToolChains.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,13 @@ toolchains::GenericUnix::constructInvocation(const LinkJobAction &job,
301301
if (context.OI.SelectedSanitizers & SanitizerKind::Thread)
302302
addLinkSanitizerLibArgsForLinux(context.Args, Arguments, "tsan", *this);
303303

304+
if (context.OI.SelectedSanitizers & SanitizerKind::Undefined)
305+
addLinkSanitizerLibArgsForLinux(context.Args, Arguments, "ubsan", *this);
306+
304307
if (context.OI.SelectedSanitizers & SanitizerKind::Fuzzer)
305308
addLinkRuntimeLib(context.Args, Arguments,
306309
sanitizerRuntimeLibName("fuzzer"));
310+
307311
}
308312
}
309313

trunk/lib/Driver/WindowsToolChains.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ toolchains::Windows::constructInvocation(const LinkJobAction &job,
147147
if (context.OI.SelectedSanitizers & SanitizerKind::Address)
148148
addLinkRuntimeLib(context.Args, Arguments,
149149
sanitizerRuntimeLibName("asan"));
150+
151+
if (context.OI.SelectedSanitizers & SanitizerKind::Undefined)
152+
addLinkRuntimeLib(context.Args, Arguments,
153+
sanitizerRuntimeLibName("ubsan"));
150154
}
151155

152156
if (context.Args.hasArg(options::OPT_profile_generate)) {

trunk/lib/Option/SanitizerOptions.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ static StringRef toStringRef(const SanitizerKind kind) {
3737
return "thread";
3838
case SanitizerKind::Fuzzer:
3939
return "fuzzer";
40+
case SanitizerKind::Undefined:
41+
return "undefined";
4042
}
4143
llvm_unreachable("Unsupported sanitizer");
4244
}
@@ -49,6 +51,8 @@ static const char* toFileName(const SanitizerKind kind) {
4951
return "tsan";
5052
case SanitizerKind::Fuzzer:
5153
return "fuzzer";
54+
case SanitizerKind::Undefined:
55+
return "ubsan";
5256
}
5357
llvm_unreachable("Unsupported sanitizer");
5458
}
@@ -134,6 +138,7 @@ OptionSet<SanitizerKind> swift::parseSanitizerArgValues(
134138
.Case("address", SanitizerKind::Address)
135139
.Case("thread", SanitizerKind::Thread)
136140
.Case("fuzzer", SanitizerKind::Fuzzer)
141+
.Case("undefined", SanitizerKind::Undefined)
137142
.Default(None);
138143
bool isShared = kind && *kind != SanitizerKind::Fuzzer;
139144
if (!kind) {

trunk/lib/SIL/MemAccessUtils.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,15 +287,31 @@ AccessedStorage swift::findAccessedStorage(SILValue sourceAddr) {
287287
return AccessedStorage(address, AccessedStorage::Unidentified);
288288
return AccessedStorage();
289289

290-
// A block argument may be a box value projected out of
291-
// switch_enum. Address-type block arguments are not allowed.
292-
case ValueKind::SILPhiArgument:
290+
case ValueKind::SILPhiArgument: {
291+
auto *phiArg = cast<SILPhiArgument>(address);
292+
bool allValsMatch = true;
293+
SmallVector<SILValue, 8> incomingPhis;
294+
phiArg->getIncomingPhiValues(incomingPhis);
295+
if (!incomingPhis.empty()) {
296+
auto firstVal = incomingPhis.front();
297+
for (auto val : incomingPhis) {
298+
if (val != firstVal) {
299+
allValsMatch = false;
300+
break;
301+
}
302+
}
303+
if (allValsMatch) {
304+
return findAccessedStorage(firstVal);
305+
}
306+
}
307+
// A block argument may be a box value projected out of
308+
// switch_enum. Address-type block arguments are not allowed.
293309
if (address->getType().isAddress())
294310
return AccessedStorage();
295311

296312
checkSwitchEnumBlockArg(cast<SILPhiArgument>(address));
297313
return AccessedStorage(address, AccessedStorage::Unidentified);
298-
314+
}
299315
// Load a box from an indirect payload of an opaque enum.
300316
// We must have peeked past the project_box earlier in this loop.
301317
// (the indirectness makes it a box, the load is for address-only).

trunk/lib/SILOptimizer/Transforms/AccessEnforcementOpts.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ class AccessConflictAndMergeAnalysis {
241241
/// Map each begin access to its AccessInfo with index, data, and flags.
242242
/// Iterating over this map is nondeterministic. If it is necessary to order
243243
/// the accesses, then AccessInfo::getAccessIndex() can be used.
244+
/// This maps contains every dynamic begin_access instruction,
245+
/// even those with invalid storage:
246+
/// We would like to keep track of unrecognized or invalid storage locations
247+
/// Because they affect our decisions for recognized locations,
248+
/// be it nested conflict or merging out of scope accesses.
249+
/// The access map is just a “cache” of accesses.
250+
/// Keeping those invalid ones just makes the lookup faster
244251
AccessMap accessMap;
245252

246253
/// Instruction pairs we can merge the scope of
@@ -536,8 +543,6 @@ void AccessConflictAndMergeAnalysis::identifyBeginAccesses() {
536543
// here as an invalid `storage` value.
537544
const AccessedStorage &storage =
538545
findAccessedStorageNonNested(beginAccess->getSource());
539-
if (!storage)
540-
continue;
541546

542547
auto iterAndSuccess = result.accessMap.try_emplace(
543548
beginAccess, static_cast<const AccessInfo &>(storage));

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_ios.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_ios_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_iossim.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_iossim_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_osx.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvos.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvos_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvossim.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvossim_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchos.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchos_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchossim.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchossim_dynamic.dylib

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/linux/libclang_rt.ubsan-x86_64.a

Whitespace-only changes.

trunk/test/Driver/Inputs/fake-resource-dir/lib/swift/clang/lib/windows/clang_rt.ubsan-x86_64.lib

Whitespace-only changes.

trunk/test/Driver/sanitizers.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/*
2+
* Address Sanitizer Tests (asan)
3+
*/
14
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address -target x86_64-apple-macosx10.9 %s | %FileCheck -check-prefix=ASAN -check-prefix=ASAN_OSX %s
25
// RUN: not %swiftc_driver -driver-print-jobs -sanitize=fuzzer -target x86_64-apple-macosx10.9 -resource-dir %S/Inputs/nonexistent-resource-dir %s 2>&1 | %FileCheck -check-prefix=FUZZER_NONEXISTENT %s
36
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address -target x86_64-apple-ios7.1 %s | %FileCheck -check-prefix=ASAN -check-prefix=ASAN_IOSSIM %s
@@ -9,6 +12,9 @@
912
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address -target x86_64-unknown-linux-gnu %s 2>&1 | %FileCheck -check-prefix=ASAN_LINUX %s
1013
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address -target x86_64-unknown-windows-msvc %s 2>&1 | %FileCheck -check-prefix=ASAN_WINDOWS %s
1114

15+
/*
16+
* Thread Sanitizer Tests (tsan)
17+
*/
1218
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=thread -target x86_64-apple-macosx10.9 %s | %FileCheck -check-prefix=TSAN -check-prefix=TSAN_OSX %s
1319
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=thread -target x86-apple-macosx10.9 %s 2>&1 | %FileCheck -check-prefix=TSAN_OSX_32 %s
1420
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=thread -target x86_64-apple-ios7.1 %s 2>&1 | %FileCheck -check-prefix=TSAN_IOSSIM %s
@@ -20,6 +26,23 @@
2026
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=thread -target x86_64-unknown-windows-msvc %s 2>&1 | %FileCheck -check-prefix=TSAN_WINDOWS %s
2127
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=thread -target x86_64-unknown-linux-gnu %s 2>&1 | %FileCheck -check-prefix=TSAN_LINUX %s
2228

29+
/*
30+
* Undefined Behavior Sanitizer Tests (ubsan)
31+
*/
32+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target x86_64-apple-macosx10.9 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_OSX %s
33+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target x86_64-apple-ios7.1 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_IOSSIM %s
34+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target arm64-apple-ios7.1 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_IOS %s
35+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target x86_64-apple-tvos9.0 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_tvOS_SIM %s
36+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target arm64-apple-tvos9.0 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_tvOS %s
37+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target i386-apple-watchos2.0 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_watchOS_SIM %s
38+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target armv7k-apple-watchos2.0 %s | %FileCheck -check-prefix=UBSAN -check-prefix=UBSAN_watchOS %s
39+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target x86_64-unknown-linux-gnu %s 2>&1 | %FileCheck -check-prefix=UBSAN_LINUX %s
40+
// RUN: %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=undefined -target x86_64-unknown-windows-msvc %s 2>&1 | %FileCheck -check-prefix=UBSAN_WINDOWS %s
41+
42+
43+
/*
44+
* Bad Argument Tests
45+
*/
2346
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address,unknown %s 2>&1 | %FileCheck -check-prefix=BADARG %s
2447
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address -sanitize=unknown %s 2>&1 | %FileCheck -check-prefix=BADARG %s
2548
// RUN: not %swiftc_driver -resource-dir %S/Inputs/fake-resource-dir/lib/swift/ -driver-print-jobs -sanitize=address,thread %s 2>&1 | %FileCheck -check-prefix=INCOMPATIBLESANITIZERS %s
@@ -64,5 +87,20 @@
6487

6588
// TSAN: -rpath @executable_path
6689

90+
// UBSAN: swift
91+
// UBSAN: -sanitize=undefined
92+
93+
// UBSAN_OSX: lib/swift/clang/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib
94+
// UBSAN_IOSSIM: lib/swift/clang/lib/darwin/libclang_rt.ubsan_iossim_dynamic.dylib
95+
// UBSAN_IOS: lib/swift/clang/lib/darwin/libclang_rt.ubsan_ios_dynamic.dylib
96+
// UBSAN_tvOS_SIM: lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvossim_dynamic.dylib
97+
// UBSAN_tvOS: lib/swift/clang/lib/darwin/libclang_rt.ubsan_tvos_dynamic.dylib
98+
// UBSAN_watchOS_SIM: lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchossim_dynamic.dylib
99+
// UBSAN_watchOS: lib/swift/clang/lib/darwin/libclang_rt.ubsan_watchos_dynamic.dylib
100+
// UBSAN_LINUX: lib/swift/clang/lib/linux/libclang_rt.ubsan-x86_64.a
101+
// UBSAN_WINDOWS: lib/swift/clang/lib/windows/clang_rt.ubsan-x86_64.lib
102+
103+
// UBSAN: -rpath @executable_path
104+
67105
// BADARG: unsupported argument 'unknown' to option '-sanitize='
68106
// INCOMPATIBLESANITIZERS: argument '-sanitize=address' is not allowed with '-sanitize=thread'

trunk/test/SILOptimizer/access_enforcement_opts.sil

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,4 +1515,43 @@ bb0:
15151515
return %10 : $()
15161516
}
15171517

1518+
// public func testPhiArgs() {
1519+
// Check that we can merge scopes with Phi args - avoiding a crash we've seen in the past
1520+
//
1521+
// CHECK-LABEL: sil @testPhiArgs : $@convention(thin) () -> () {
1522+
// CHECK: [[GLOBAL:%.*]] = global_addr @globalX : $*X
1523+
// CHECK: cond_br {{.*}}, bb1, bb2
1524+
// CHECK: bb1
1525+
// CHECK: br bb3([[GLOBAL]] : $*X)
1526+
// CHECK: bb2
1527+
// CHECK: br bb3([[GLOBAL]] : $*X)
1528+
// CHECK: bb3([[GLOBALPHI:%.*]] : $*X):
1529+
// CHECK: [[BEGIN:%.*]] = begin_access [read] [dynamic] [[GLOBALPHI]] : $*X
1530+
// CHECK-NEXT: load
1531+
// CHECK-NEXT: load
1532+
// CHECK-NEXT: end_access [[BEGIN]] : $*X
1533+
// CHECK-NOT: begin_access
1534+
// CHECK-LABEL: } // end sil function 'testPhiArgs'
1535+
sil @testPhiArgs : $@convention(thin) () -> () {
1536+
bb0:
1537+
%0 = global_addr @globalX: $*X
1538+
%cond = integer_literal $Builtin.Int1, 1
1539+
cond_br %cond, bb1, bb2
1540+
1541+
bb1:
1542+
br bb3(%0 : $*X)
1543+
1544+
bb2:
1545+
br bb3(%0 : $*X)
1546+
1547+
bb3(%1 : $*X):
1548+
%2 = begin_access [read] [dynamic] %1 : $*X
1549+
%3 = load %2 : $*X
1550+
end_access %2 : $*X
1551+
%4 = begin_access [read] [dynamic] %0 : $*X
1552+
%5 = load %4 : $*X
1553+
end_access %4 : $*X
1554+
%10 = tuple ()
1555+
return %10 : $()
1556+
}
15181557

0 commit comments

Comments
 (0)