Skip to content

Commit ecfff06

Browse files
committed
Add -enforce-exclusivity option to sil-opt.
1 parent 44110e3 commit ecfff06

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

test/SILOptimizer/exclusivity_static_diagnostics.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-sil-opt -enable-sil-verify-all %s -enforce-exclusivity-static=true -diagnose-static-exclusivity -verify | %FileCheck %s
1+
// RUN: %target-sil-opt -enable-sil-verify-all %s -enforce-exclusivity=unchecked -diagnose-static-exclusivity -verify | %FileCheck %s
22

33
sil_stage raw
44

tools/sil-opt/SILOpt.cpp

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#include <cstdio>
4444
using namespace swift;
4545

46+
namespace cl = llvm::cl;
47+
4648
namespace {
4749

4850
enum class OptGroup { Unknown, Diagnostics, Performance, Lowering };
@@ -81,6 +83,28 @@ static llvm::cl::opt<bool>
8183
EnableSILOpaqueValues("enable-sil-opaque-values",
8284
llvm::cl::desc("Compile the module with sil-opaque-values enabled."));
8385

86+
namespace {
87+
enum EnforceExclusivityMode {
88+
Unchecked, // static only
89+
Checked, // static and dynamic
90+
DynamicOnly,
91+
None
92+
};
93+
}
94+
95+
static cl::opt<EnforceExclusivityMode> EnforceExclusivity(
96+
"enforce-exclusivity", cl::desc("Enforce law of exclusivity "
97+
"(and support memory access markers)."),
98+
cl::init(EnforceExclusivityMode::None),
99+
cl::values(clEnumValN(EnforceExclusivityMode::Unchecked, "unchecked",
100+
"Static checking only."),
101+
clEnumValN(EnforceExclusivityMode::Checked, "checked",
102+
"Static and dynamic checking."),
103+
clEnumValN(EnforceExclusivityMode::DynamicOnly, "dynamic-only",
104+
"Dynamic checking only."),
105+
clEnumValN(EnforceExclusivityMode::None, "none",
106+
"No exclusivity checking.")));
107+
84108
static llvm::cl::opt<std::string>
85109
ResourceDir("resource-dir",
86110
llvm::cl::desc("The directory that holds the compiler resource files"));
@@ -178,10 +202,6 @@ AssumeUnqualifiedOwnershipWhenParsing(
178202
"assume-parsing-unqualified-ownership-sil", llvm::cl::Hidden, llvm::cl::init(false),
179203
llvm::cl::desc("Assume all parsed functions have unqualified ownership"));
180204

181-
static llvm::cl::opt<bool> EnforceExclusivityStatic(
182-
"enforce-exclusivity-static", llvm::cl::Hidden, llvm::cl::init(false),
183-
llvm::cl::desc("Diagnose static violations of law of exclusivity."));
184-
185205
static void runCommandLineSelectedPasses(SILModule *Module,
186206
irgen::IRGenModule *IRGenMod) {
187207
SILPassManager PM(Module, IRGenMod);
@@ -268,7 +288,30 @@ int main(int argc, char **argv) {
268288
SILOpts.EnableSILOwnership = EnableSILOwnershipOpt;
269289
SILOpts.AssumeUnqualifiedOwnershipWhenParsing =
270290
AssumeUnqualifiedOwnershipWhenParsing;
271-
SILOpts.EnforceExclusivityStatic = EnforceExclusivityStatic;
291+
292+
switch (EnforceExclusivity) {
293+
case EnforceExclusivityMode::Unchecked:
294+
// This option is analogous to the -Ounchecked optimization setting.
295+
// It will disable dynamic checking but still diagnose statically.
296+
SILOpts.EnforceExclusivityStatic = true;
297+
SILOpts.EnforceExclusivityDynamic = false;
298+
break;
299+
case EnforceExclusivityMode::Checked:
300+
SILOpts.EnforceExclusivityStatic = true;
301+
SILOpts.EnforceExclusivityDynamic = true;
302+
break;
303+
case EnforceExclusivityMode::DynamicOnly:
304+
// This option is intended for staging purposes. The intent is that
305+
// it will eventually be removed.
306+
SILOpts.EnforceExclusivityStatic = false;
307+
SILOpts.EnforceExclusivityDynamic = true;
308+
break;
309+
case EnforceExclusivityMode::None:
310+
// This option is for staging purposes.
311+
SILOpts.EnforceExclusivityStatic = false;
312+
SILOpts.EnforceExclusivityDynamic = false;
313+
break;
314+
}
272315

273316
// Load the input file.
274317
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =

0 commit comments

Comments
 (0)