|
43 | 43 | #include <cstdio>
|
44 | 44 | using namespace swift;
|
45 | 45 |
|
| 46 | +namespace cl = llvm::cl; |
| 47 | + |
46 | 48 | namespace {
|
47 | 49 |
|
48 | 50 | enum class OptGroup { Unknown, Diagnostics, Performance, Lowering };
|
@@ -81,6 +83,28 @@ static llvm::cl::opt<bool>
|
81 | 83 | EnableSILOpaqueValues("enable-sil-opaque-values",
|
82 | 84 | llvm::cl::desc("Compile the module with sil-opaque-values enabled."));
|
83 | 85 |
|
| 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 | + |
84 | 108 | static llvm::cl::opt<std::string>
|
85 | 109 | ResourceDir("resource-dir",
|
86 | 110 | llvm::cl::desc("The directory that holds the compiler resource files"));
|
@@ -178,10 +202,6 @@ AssumeUnqualifiedOwnershipWhenParsing(
|
178 | 202 | "assume-parsing-unqualified-ownership-sil", llvm::cl::Hidden, llvm::cl::init(false),
|
179 | 203 | llvm::cl::desc("Assume all parsed functions have unqualified ownership"));
|
180 | 204 |
|
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 |
| - |
185 | 205 | static void runCommandLineSelectedPasses(SILModule *Module,
|
186 | 206 | irgen::IRGenModule *IRGenMod) {
|
187 | 207 | SILPassManager PM(Module, IRGenMod);
|
@@ -268,7 +288,30 @@ int main(int argc, char **argv) {
|
268 | 288 | SILOpts.EnableSILOwnership = EnableSILOwnershipOpt;
|
269 | 289 | SILOpts.AssumeUnqualifiedOwnershipWhenParsing =
|
270 | 290 | 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 | + } |
272 | 315 |
|
273 | 316 | // Load the input file.
|
274 | 317 | llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =
|
|
0 commit comments