Skip to content

Commit e3a75de

Browse files
authored
Merge pull request swiftlang#19849 from atrick/remove-swift3-exclusivity
Remove exclusivity support for Swift 3 mode.
2 parents d098e8a + 823137b commit e3a75de

File tree

16 files changed

+232
-275
lines changed

16 files changed

+232
-275
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,8 +1010,6 @@ enum class ExclusivityFlags : uintptr_t {
10101010
// Read or Modify).
10111011
ActionMask = 0x1,
10121012

1013-
// Downgrade exclusivity failures to a warning.
1014-
WarningOnly = 0x10,
10151013
// The runtime should track this access to check against subsequent accesses.
10161014
Tracking = 0x20
10171015
};
@@ -1027,9 +1025,6 @@ static inline ExclusivityFlags getAccessAction(ExclusivityFlags flags) {
10271025
return ExclusivityFlags(uintptr_t(flags)
10281026
& uintptr_t(ExclusivityFlags::ActionMask));
10291027
}
1030-
static inline bool isWarningOnly(ExclusivityFlags flags) {
1031-
return uintptr_t(flags) & uintptr_t(ExclusivityFlags::WarningOnly);
1032-
}
10331028
static inline bool isTracking(ExclusivityFlags flags) {
10341029
return uintptr_t(flags) & uintptr_t(ExclusivityFlags::Tracking);
10351030
}

include/swift/AST/DiagnosticsSIL.def

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,6 @@ ERROR(unimplemented_generator_witnesses,none,
9393
"protocol conformance emission for generator coroutines is unimplemented",
9494
())
9595

96-
WARNING(exclusivity_access_required_warn,none,
97-
"overlapping accesses to %0, but "
98-
"%select{initialization|read|modification|deinitialization}1 requires "
99-
"exclusive access; "
100-
"%select{consider copying to a local variable|"
101-
"consider calling MutableCollection.swapAt(_:_:)}2",
102-
(StringRef, unsigned, bool))
103-
10496
ERROR(exclusivity_access_required,none,
10597
"overlapping accesses to %0, but "
10698
"%select{initialization|read|modification|deinitialization}1 requires "
@@ -114,11 +106,6 @@ ERROR(exclusivity_access_required_unknown_decl,none,
114106
"%select{initialization|read|modification|deinitialization}0 requires "
115107
"exclusive access; consider copying to a local variable", (unsigned))
116108

117-
WARNING(exclusivity_access_required_unknown_decl_warn,none,
118-
"overlapping accesses, but "
119-
"%select{initialization|read|modification|deinitialization}0 requires "
120-
"exclusive access; consider copying to a local variable", (unsigned))
121-
122109
NOTE(exclusivity_conflicting_access,none,
123110
"conflicting access is here", ())
124111

lib/IRGen/IRGenSIL.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4208,14 +4208,9 @@ static ExclusivityFlags getExclusivityAction(SILAccessKind kind) {
42084208

42094209
static ExclusivityFlags getExclusivityFlags(SILModule &M,
42104210
SILAccessKind kind,
4211-
bool noNestedConflict,
4212-
bool fromBuiltin) {
4211+
bool noNestedConflict) {
42134212
auto flags = getExclusivityAction(kind);
42144213

4215-
// In old Swift compatibility modes, downgrade this to a warning.
4216-
if (!fromBuiltin && M.getASTContext().LangOpts.isSwiftVersion3())
4217-
flags |= ExclusivityFlags::WarningOnly;
4218-
42194214
if (!noNestedConflict)
42204215
flags |= ExclusivityFlags::Tracking;
42214216

@@ -4245,7 +4240,7 @@ static SILAccessEnforcement getEffectiveEnforcement(IRGenFunction &IGF,
42454240
template <class BeginAccessInst>
42464241
static ExclusivityFlags getExclusivityFlags(BeginAccessInst *i) {
42474242
return getExclusivityFlags(i->getModule(), i->getAccessKind(),
4248-
i->hasNoNestedConflict(), i->isFromBuiltin());
4243+
i->hasNoNestedConflict());
42494244
}
42504245

42514246
void IRGenSILFunction::visitBeginAccessInst(BeginAccessInst *access) {

lib/SILOptimizer/Mandatory/DiagnoseStaticExclusivity.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -542,15 +542,8 @@ static void diagnoseExclusivityViolation(const ConflictingAccess &Violation,
542542
unsigned AccessKindForMain =
543543
static_cast<unsigned>(MainAccess.getAccessKind());
544544

545-
// For now, all exclusivity violations are warning in Swift 3 mode.
546-
// Also treat some violations as warnings to allow them to be staged in.
547-
bool DiagnoseAsWarning = Ctx.LangOpts.isSwiftVersion3();
548-
549545
if (const ValueDecl *VD = Storage.getDecl(F)) {
550546
// We have a declaration, so mention the identifier in the diagnostic.
551-
auto DiagnosticID = (DiagnoseAsWarning ?
552-
diag::exclusivity_access_required_warn :
553-
diag::exclusivity_access_required);
554547
SILType BaseType = FirstAccess.getInstruction()->getType().getAddressType();
555548
SILModule &M = FirstAccess.getInstruction()->getModule();
556549
std::string PathDescription = getPathDescription(
@@ -570,18 +563,16 @@ static void diagnoseExclusivityViolation(const ConflictingAccess &Violation,
570563
}
571564

572565
auto D =
573-
diagnose(Ctx, MainAccess.getAccessLoc().getSourceLoc(), DiagnosticID,
566+
diagnose(Ctx, MainAccess.getAccessLoc().getSourceLoc(),
567+
diag::exclusivity_access_required,
574568
PathDescription, AccessKindForMain, SuggestSwapAt);
575569
D.highlight(RangeForMain);
576570
if (SuggestSwapAt)
577571
addSwapAtFixit(D, CallToReplace, Base, SwapIndex1, SwapIndex2,
578572
Ctx.SourceMgr);
579573
} else {
580-
auto DiagnosticID = (DiagnoseAsWarning ?
581-
diag::exclusivity_access_required_unknown_decl_warn :
582-
diag::exclusivity_access_required_unknown_decl);
583-
diagnose(Ctx, MainAccess.getAccessLoc().getSourceLoc(), DiagnosticID,
584-
AccessKindForMain)
574+
diagnose(Ctx, MainAccess.getAccessLoc().getSourceLoc(),
575+
diag::exclusivity_access_required_unknown_decl, AccessKindForMain)
585576
.highlight(RangeForMain);
586577
}
587578
diagnose(Ctx, NoteAccess.getAccessLoc().getSourceLoc(),

stdlib/private/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ endif()
55
if(SWIFT_BUILD_SDK_OVERLAY)
66
# SwiftPrivatePthreadExtras makes use of Darwin/Glibc, which is part of the
77
# SDK overlay. It can't be built separately from the SDK overlay.
8+
add_subdirectory(RuntimeUnittest)
89
add_subdirectory(StdlibUnittest)
910
add_subdirectory(StdlibUnicodeUnittest)
1011
add_subdirectory(StdlibCollectionUnittest)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
set(swift_stdlib_unittest_compile_flags)
2+
3+
add_swift_library(swiftRuntimeUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB
4+
# This file should be listed the first. Module name is inferred from the
5+
# filename.
6+
RuntimeUnittest.swift
7+
8+
ExclusivityTests.cpp
9+
10+
SWIFT_MODULE_DEPENDS StdlibUnittest
11+
SWIFT_MODULE_DEPENDS_LINUX Glibc
12+
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
13+
SWIFT_MODULE_DEPENDS_CYGWIN Glibc
14+
SWIFT_MODULE_DEPENDS_HAIKU Glibc
15+
SWIFT_COMPILE_FLAGS ${swift_stdlib_unittest_compile_flags}
16+
TARGET_SDKS ALL_POSIX_PLATFORMS
17+
INSTALL_IN_COMPONENT stdlib-experimental)
18+

unittests/runtime/Exclusivity.cpp renamed to stdlib/private/RuntimeUnittest/ExclusivityTests.cpp

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,59 @@
1-
//===--- Exclusivity.cpp --------------------------------------------------===//
2-
//
3-
// This source file is part of the Swift.org open source project
4-
//
5-
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
6-
// Licensed under Apache License v2.0 with Runtime Library Exception
7-
//
8-
// See https://swift.org/LICENSE.txt for license information
9-
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10-
//
11-
//===----------------------------------------------------------------------===//
12-
131
#include "swift/Runtime/Exclusivity.h"
142
#include "swift/Runtime/Metadata.h"
15-
#include "gtest/gtest.h"
163

174
using namespace swift;
185

19-
TEST(TestExclusivity, testNullPC) {
6+
SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C"
7+
void testExclusivityNullPC() {
208
ValueBuffer scratch, scratch2;
219
long var;
2210
swift_beginAccess(&var, &scratch,
23-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Read,
11+
ExclusivityFlags::Read | ExclusivityFlags::Tracking,
2412
/*pc=*/0);
25-
swift_beginAccess(&var, &scratch2,
26-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify,
13+
swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify,
2714
/*pc=*/0);
2815
swift_endAccess(&scratch2);
2916
swift_endAccess(&scratch);
3017
}
3118

32-
TEST(TestExclusivity, testPCOne) {
19+
SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C"
20+
void testExclusivityPCOne() {
3321
ValueBuffer scratch, scratch2;
3422
long var;
3523
swift_beginAccess(&var, &scratch,
36-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Read,
24+
ExclusivityFlags::Read | ExclusivityFlags::Tracking,
3725
/*pc=*/(void *)1);
38-
swift_beginAccess(&var, &scratch2,
39-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify,
26+
swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify,
4027
/*pc=*/(void *)1);
4128
swift_endAccess(&scratch2);
4229
swift_endAccess(&scratch);
4330
}
4431

45-
TEST(TestExclusivity, testBogusPC) {
32+
SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C"
33+
void testExclusivityBogusPC() {
4634
ValueBuffer scratch, scratch2;
4735
long var;
4836
swift_beginAccess(&var, &scratch,
49-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Read,
37+
ExclusivityFlags::Read | ExclusivityFlags::Tracking,
5038
/*pc=*/(void *)0xdeadbeefdeadbeefULL);
51-
swift_beginAccess(&var, &scratch2,
52-
ExclusivityFlags::WarningOnly | ExclusivityFlags::Modify,
39+
swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify,
5340
/*pc=*/(void *)0xdeadbeefdeadbeefULL);
5441
swift_endAccess(&scratch2);
5542
swift_endAccess(&scratch);
5643
}
5744

45+
5846
// rdar://32866493
59-
TEST(TestExclusivity, testNonNested) {
47+
SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C"
48+
void testExclusivityNonNested() {
6049
const int N = 5;
6150
ValueBuffer scratches[N];
6251
long vars[N];
6352

6453
auto begin = [&](unsigned i) {
6554
assert(i < N);
66-
swift_beginAccess(&vars[i], &scratches[i], ExclusivityFlags::Modify, 0);
55+
swift_beginAccess(&vars[i], &scratches[i],
56+
ExclusivityFlags::Modify | ExclusivityFlags::Tracking, 0);
6757
};
6858
auto end = [&](unsigned i) {
6959
assert(i < N);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//===--- RuntimeUnittest.swift ---------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
// Make runtime unit tests available to the stdlib unit test harness.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
// namespace
16+
public enum SwiftRuntimeUnitTest {
17+
@_silgen_name("testExclusivityNullPC")
18+
private static func _testExclusivityNullPC()
19+
20+
public static func testExclusivityNullPC() {
21+
_testExclusivityNullPC()
22+
}
23+
24+
@_silgen_name("testExclusivityPCOne")
25+
private static func _testExclusivityPCOne()
26+
27+
public static func testExclusivityPCOne() {
28+
_testExclusivityPCOne()
29+
}
30+
31+
@_silgen_name("testExclusivityBogusPC")
32+
private static func _testExclusivityBogusPC()
33+
34+
public static func testExclusivityBogusPC() {
35+
_testExclusivityBogusPC()
36+
}
37+
38+
@_silgen_name("testExclusivityNonNested")
39+
private static func _testExclusivityNonNestedPC()
40+
41+
public static func testExclusivityNonNestedPC() {
42+
_testExclusivityNonNestedPC()
43+
}
44+
}

stdlib/public/runtime/Exclusivity.cpp

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,6 @@ LLVM_ATTRIBUTE_ALWAYS_INLINE
5050
static void reportExclusivityConflict(ExclusivityFlags oldAction, void *oldPC,
5151
ExclusivityFlags newFlags, void *newPC,
5252
void *pointer) {
53-
static std::atomic<long> reportedConflicts{0};
54-
constexpr long maxReportedConflicts = 100;
55-
// Don't report more that 100 conflicts. Hopefully, this will improve
56-
// performance in case there are conflicts inside a tight loop.
57-
if (reportedConflicts.fetch_add(1, std::memory_order_relaxed) >=
58-
maxReportedConflicts) {
59-
return;
60-
}
61-
6253
constexpr unsigned maxMessageLength = 100;
6354
constexpr unsigned maxAccessDescriptionLength = 50;
6455
char message[maxMessageLength];
@@ -87,8 +78,6 @@ static void reportExclusivityConflict(ExclusivityFlags oldAction, void *oldPC,
8778
constexpr unsigned framesToSkip = 1;
8879
printCurrentBacktrace(framesToSkip);
8980

90-
bool keepGoing = isWarningOnly(newFlags);
91-
9281
RuntimeErrorDetails::Thread secondaryThread = {
9382
.description = oldAccess,
9483
.numFrames = 1,
@@ -103,17 +92,7 @@ static void reportExclusivityConflict(ExclusivityFlags oldAction, void *oldPC,
10392
.numExtraThreads = 1,
10493
.threads = &secondaryThread
10594
};
106-
uintptr_t flags = RuntimeErrorFlagNone;
107-
if (!keepGoing)
108-
flags = RuntimeErrorFlagFatal;
109-
_swift_reportToDebugger(flags, message, &details);
110-
111-
if (keepGoing) {
112-
return;
113-
}
114-
115-
// 0 means no backtrace will be printed.
116-
fatalError(0, "Fatal access conflict detected.\n");
95+
_swift_reportToDebugger(RuntimeErrorFlagFatal, message, &details);
11796
}
11897

11998
namespace {
@@ -200,8 +179,8 @@ class AccessSet {
200179
reportExclusivityConflict(cur->getAccessAction(), cur->PC,
201180
flags, pc, pointer);
202181

203-
// If we're only warning, don't report multiple conflicts.
204-
break;
182+
// 0 means no backtrace will be printed.
183+
fatalError(0, "Fatal access conflict detected.\n");
205184
}
206185
if (!isTracking(flags))
207186
return false;

test/Interpreter/enforce_exclusive_access_backtrace.swift

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)