@@ -1205,8 +1205,9 @@ class IRGenSILFunction :
1205
1205
// SIL instruction lowering
1206
1206
// ===--------------------------------------------------------------------===//
1207
1207
1208
- void visitSILBasicBlock (SILBasicBlock *BB );
1208
+ bool shouldUseDispatchThunk (SILDeclRef method );
1209
1209
1210
+ void visitSILBasicBlock (SILBasicBlock *BB);
1210
1211
void emitErrorResultVar (CanSILFunctionType FnTy,
1211
1212
SILResultInfo ErrorInfo,
1212
1213
DebugValueInst *DbgValue);
@@ -8414,28 +8415,17 @@ void IRGenSILFunction::visitObjCSuperMethodInst(swift::ObjCSuperMethodInst *i) {
8414
8415
/* startAtSuper=*/ true );
8415
8416
}
8416
8417
8417
- void IRGenSILFunction::visitClassMethodInst (swift::ClassMethodInst *i) {
8418
- assert (!i->getMember ().isForeign );
8419
-
8420
- Explosion base = getLoweredExplosion (i->getOperand ());
8421
- llvm::Value *baseValue = base.claimNext ();
8422
-
8423
- SILDeclRef method = i->getMember ().getOverriddenVTableEntry ();
8424
- PrettyStackTraceSILDeclRef entry (" lowering class method call to" , method);
8425
-
8426
- auto methodType = i->getType ().castTo <SILFunctionType>();
8427
-
8418
+ bool IRGenSILFunction::shouldUseDispatchThunk (SILDeclRef method) {
8428
8419
AccessLevel methodAccess = method.getDecl ()->getEffectiveAccess ();
8429
8420
auto *classDecl = cast<ClassDecl>(method.getDecl ()->getDeclContext ());
8430
8421
bool shouldUseDispatchThunk = false ;
8431
8422
// Because typechecking for the debugger has more lax rules, check the access
8432
8423
// level of the getter to decide whether to use a dispatch thunk for the
8433
8424
// debugger.
8434
- bool shouldUseDispatchThunkIfInDebugger =
8435
- !classDecl->getASTContext ().LangOpts .DebuggerSupport ||
8436
- methodAccess == AccessLevel::Public;
8425
+ bool inDebugger = classDecl->getASTContext ().LangOpts .DebuggerSupport ;
8426
+ bool shouldUseDispatchThunkIfInDebugger = methodAccess >= AccessLevel::Public;
8437
8427
if (IGM.hasResilientMetadata (classDecl, ResilienceExpansion::Maximal) &&
8438
- shouldUseDispatchThunkIfInDebugger) {
8428
+ (!inDebugger || shouldUseDispatchThunkIfInDebugger) ) {
8439
8429
shouldUseDispatchThunk = true ;
8440
8430
} else if (IGM.getOptions ().VirtualFunctionElimination ) {
8441
8431
// For VFE, use a thunk if the target class is in another module. This
@@ -8452,9 +8442,22 @@ void IRGenSILFunction::visitClassMethodInst(swift::ClassMethodInst *i) {
8452
8442
shouldUseDispatchThunk =
8453
8443
classDecl->getModuleContext () != IGM.getSwiftModule ();
8454
8444
}
8445
+ return shouldUseDispatchThunk;
8446
+ }
8455
8447
8456
- if (shouldUseDispatchThunk) {
8457
- llvm::Constant *fnPtr = IGM.getAddrOfDispatchThunk (method, NotForDefinition);
8448
+ void IRGenSILFunction::visitClassMethodInst (swift::ClassMethodInst *i) {
8449
+ assert (!i->getMember ().isForeign );
8450
+
8451
+ Explosion base = getLoweredExplosion (i->getOperand ());
8452
+ llvm::Value *baseValue = base.claimNext ();
8453
+
8454
+ SILDeclRef method = i->getMember ().getOverriddenVTableEntry ();
8455
+ PrettyStackTraceSILDeclRef entry (" lowering class method call to" , method);
8456
+
8457
+ auto methodType = i->getType ().castTo <SILFunctionType>();
8458
+ if (shouldUseDispatchThunk (method)) {
8459
+ llvm::Constant *fnPtr =
8460
+ IGM.getAddrOfDispatchThunk (method, NotForDefinition);
8458
8461
8459
8462
if (methodType->isAsync ()) {
8460
8463
auto *fnPtrType = fnPtr->getType ();
0 commit comments