embedded: don't re-abstract witness method calls for existentials

Don't convert indirect to direct arguments. This is needed to support general existentials in embedded swift.
This commit is contained in:
Erik Eckstein
2025-11-11 10:17:23 +01:00
committed by Arnold Schwaighofer
parent 920def9319
commit 60a28cd570
3 changed files with 8 additions and 4 deletions

View File

@@ -148,7 +148,7 @@ func specializeWitnessTable(for conformance: Conformance, _ context: ModulePassC
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
convertIndirectToDirect: true, isMandatory: true)
convertIndirectToDirect: false, isMandatory: true)
else {
return origEntry
}
@@ -215,7 +215,7 @@ private func specializeDefaultMethods(for conformance: Conformance,
guard !methodSubs.conformances.contains(where: {!$0.isValid}),
context.loadFunction(function: origMethod, loadCalleesRecursively: true),
let specializedMethod = context.specialize(function: origMethod, for: methodSubs,
convertIndirectToDirect: true, isMandatory: true)
convertIndirectToDirect: false, isMandatory: true)
else {
return origEntry
}

View File

@@ -216,7 +216,9 @@ public:
ReabstractionInfo(CanSILFunctionType substitutedType,
SILDeclRef methodDecl,
bool convertIndirectToDirect,
SILModule &M) :
ConvertIndirectToDirect(convertIndirectToDirect),
SubstitutedType(substitutedType),
methodDecl(methodDecl),
M(&M), isWholeModule(M.isWholeModule()) {}

View File

@@ -2413,7 +2413,8 @@ bool swift::specializeClassMethodInst(ClassMethodInst *cm) {
SILType substitutedType =
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(), m);
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), cm->getMember(),
/*convertIndirectToDirect=*/ true, m);
reInfo.createSubstitutedAndSpecializedTypes();
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);
@@ -2465,7 +2466,8 @@ bool swift::specializeWitnessMethodInst(WitnessMethodInst *wm) {
SILType substitutedType =
funcTy.substGenericArgs(m, subs, TypeExpansionContext::minimal());
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(), m);
ReabstractionInfo reInfo(substitutedType.getAs<SILFunctionType>(), wm->getMember(),
/*convertIndirectToDirect=*/ false, m);
reInfo.createSubstitutedAndSpecializedTypes();
CanSILFunctionType finalFuncTy = reInfo.getSpecializedType();
SILType finalSILTy = SILType::getPrimitiveObjectType(finalFuncTy);