Skip to content

Commit 8d971ed

Browse files
Merge pull request #67374 from nate-chandler/nfc/20230718/1/disable-resilience-checks-option
NFC: Add hidden option to bypass resilience checks.
2 parents 6829f08 + 851434c commit 8d971ed

File tree

7 files changed

+28
-4
lines changed

7 files changed

+28
-4
lines changed

include/swift/Basic/LangOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,10 @@ namespace swift {
576576
/// All block list configuration files to be honored in this compilation.
577577
std::vector<std::string> BlocklistConfigFilePaths;
578578

579+
/// Whether to ignore checks that a module is resilient during
580+
/// type-checking, SIL verification, and IR emission,
581+
bool BypassResilienceChecks = false;
582+
579583
bool isConcurrencyModelTaskToThread() const {
580584
return ActiveConcurrencyModel == ConcurrencyModel::TaskToThread;
581585
}

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,10 @@ def disable_swift3_objc_inference :
638638
def enable_implicit_dynamic : Flag<["-"], "enable-implicit-dynamic">,
639639
Flags<[FrontendOption, NoInteractiveOption, HelpHidden]>,
640640
HelpText<"Add 'dynamic' to all declarations">;
641+
642+
def bypass_resilience : Flag<["-"], "bypass-resilience-checks">,
643+
Flags<[FrontendOption, NoInteractiveOption, HelpHidden]>,
644+
HelpText<"Ignore all checks for module resilience.">;
641645

642646
def enable_experimental_opaque_type_erasure : Flag<["-"], "enable-experimental-opaque-type-erasure">,
643647
Flags<[FrontendOption, NoInteractiveOption, HelpHidden]>,

lib/DriverTool/sil_opt_main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,10 @@ struct SILOptOptions {
491491
"enable-copy-propagation",
492492
llvm::cl::desc("Whether to run the copy propagation pass: "
493493
"'true', 'false', or 'requested-passes-only'."));
494+
495+
llvm::cl::opt<bool> BypassResilienceChecks = llvm::cl::opt<bool>(
496+
"bypass-resilience-checks",
497+
llvm::cl::desc("Ignore all checks for module resilience."));
494498
};
495499

496500
/// Regular expression corresponding to the value given in one of the
@@ -603,6 +607,8 @@ int sil_opt_main(ArrayRef<const char *> argv, void *MainAddr) {
603607
Invocation.getLangOptions().Features.insert(
604608
Feature::OldOwnershipOperatorSpellings);
605609
}
610+
Invocation.getLangOptions().BypassResilienceChecks =
611+
options.BypassResilienceChecks;
606612
for (auto &featureName : options.ExperimentalFeatures) {
607613
if (auto feature = getExperimentalFeature(featureName)) {
608614
Invocation.getLangOptions().Features.insert(*feature);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,7 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
13021302
.Case("task-to-thread", ConcurrencyModel::TaskToThread)
13031303
.Default(ConcurrencyModel::Standard);
13041304
}
1305+
Opts.BypassResilienceChecks |= Args.hasArg(OPT_bypass_resilience);
13051306

13061307
return HadError || UnsupportedOS || UnsupportedArch;
13071308
}

lib/Frontend/Frontend.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,8 @@ ModuleDecl *CompilerInstance::getMainModule() const {
12901290
MainModule->setPrivateImportsEnabled();
12911291
if (Invocation.getFrontendOptions().EnableImplicitDynamic)
12921292
MainModule->setImplicitDynamicEnabled();
1293+
if (Invocation.getLangOptions().BypassResilienceChecks)
1294+
MainModule->setBypassResilience();
12931295
if (!Invocation.getFrontendOptions().ModuleABIName.empty()) {
12941296
MainModule->setABIName(getASTContext().getIdentifier(
12951297
Invocation.getFrontendOptions().ModuleABIName));

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ bool checkResilience(DeclType *D, ModuleDecl *M,
125125
D->isResilient(M, expansion);
126126
}
127127

128+
bool checkTypeABIAccessible(SILFunction const &F, SILType ty) {
129+
return F.getASTContext().LangOpts.BypassResilienceChecks ||
130+
F.isTypeABIAccessible(ty);
131+
}
132+
128133
/// Metaprogramming-friendly base class.
129134
template <class Impl>
130135
class SILVerifierBase : public SILInstructionVisitor<Impl> {
@@ -2907,7 +2912,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29072912
"Dest address should be lvalue");
29082913
requireSameType(cai->getDest()->getType(), cai->getSrc()->getType(),
29092914
"Store operand type and dest type mismatch");
2910-
require(F.isTypeABIAccessible(cai->getDest()->getType()),
2915+
require(checkTypeABIAccessible(F, cai->getDest()->getType()),
29112916
"cannot directly copy type with inaccessible ABI");
29122917
require(cai->getModule().getStage() == SILStage::Raw ||
29132918
(cai->isTakeOfSrc() || !cai->getSrc()->getType().isMoveOnly()),
@@ -2922,7 +2927,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29222927
"Dest address should be lvalue");
29232928
requireSameType(ecai->getDest()->getType(), ecai->getSrc()->getType(),
29242929
"Store operand type and dest type mismatch");
2925-
require(F.isTypeABIAccessible(ecai->getDest()->getType()),
2930+
require(checkTypeABIAccessible(F, ecai->getDest()->getType()),
29262931
"cannot directly copy type with inaccessible ABI");
29272932
}
29282933

@@ -2934,7 +2939,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29342939
"Dest address should be lvalue");
29352940
requireSameType(SI->getDest()->getType(), SI->getSrc()->getType(),
29362941
"Store operand type and dest type mismatch");
2937-
require(F.isTypeABIAccessible(SI->getDest()->getType()),
2942+
require(checkTypeABIAccessible(F, SI->getDest()->getType()),
29382943
"cannot directly copy type with inaccessible ABI");
29392944
}
29402945

@@ -3356,7 +3361,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33563361
void checkDestroyAddrInst(DestroyAddrInst *DI) {
33573362
require(DI->getOperand()->getType().isAddress(),
33583363
"Operand of destroy_addr must be address");
3359-
require(F.isTypeABIAccessible(DI->getOperand()->getType()),
3364+
require(checkTypeABIAccessible(F, DI->getOperand()->getType()),
33603365
"cannot directly destroy type with inaccessible ABI");
33613366
}
33623367

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,8 @@ LoadedFile *SerializedModuleLoaderBase::loadAST(
849849
for (auto name: loadedModuleFile->getAllowableClientNames()) {
850850
M.addAllowableClientName(Ctx.getIdentifier(name));
851851
}
852+
if (Ctx.LangOpts.BypassResilienceChecks)
853+
M.setBypassResilience();
852854
auto diagLocOrInvalid = diagLoc.value_or(SourceLoc());
853855
loadInfo.status = loadedModuleFile->associateWithFileContext(
854856
fileUnit, diagLocOrInvalid, Ctx.LangOpts.AllowModuleWithCompilerErrors);

0 commit comments

Comments
 (0)