FunctionPassContext: support setting arbitrary function type representations when creating specialized functions

This commit is contained in:
Erik Eckstein
2025-11-25 14:16:45 +01:00
parent 4920ace11e
commit ab2345a2ed
5 changed files with 9 additions and 10 deletions

View File

@@ -410,7 +410,7 @@ private struct SpecializationInfo {
// The specialized function is always a thin function. This is important because we add additional // The specialized function is always a thin function. This is important because we add additional
// parameters after the Self parameter of witness methods. In this case the new function is not a // parameters after the Self parameter of witness methods. In this case the new function is not a
// method anymore. // method anymore.
makeThin: true, makeBare: true) withRepresentation: .thin, makeBare: true)
context.buildSpecializedFunction( context.buildSpecializedFunction(
specializedFunction: specializedFunction, specializedFunction: specializedFunction,

View File

@@ -553,7 +553,7 @@ private struct PackExplodedFunction {
withParams: newParameters, withParams: newParameters,
withResults: newResults, withResults: newResults,
// If a method has a dynamic self parameter, it cannot be converted into a thin function (non-method). // If a method has a dynamic self parameter, it cannot be converted into a thin function (non-method).
makeThin: !original.mayBindDynamicSelf) withRepresentation: original.mayBindDynamicSelf ? nil : .thin)
self.buildSpecializedFunction(context) self.buildSpecializedFunction(context)
} }

View File

@@ -168,12 +168,13 @@ struct FunctionPassContext : MutatingContext {
from original: Function, withName specializedFunctionName: String, from original: Function, withName specializedFunctionName: String,
withParams specializedParameters: [ParameterInfo], withParams specializedParameters: [ParameterInfo],
withResults specializedResults: [ResultInfo]? = nil, withResults specializedResults: [ResultInfo]? = nil,
makeThin: Bool = false, withRepresentation: FunctionTypeRepresentation? = nil,
makeBare: Bool = false, makeBare: Bool = false,
preserveGenericSignature: Bool = true preserveGenericSignature: Bool = true
) -> Function { ) -> Function {
return specializedFunctionName._withBridgedStringRef { nameRef in return specializedFunctionName._withBridgedStringRef { nameRef in
let bridgedParamInfos = specializedParameters.map { $0._bridged } let bridgedParamInfos = specializedParameters.map { $0._bridged }
let repr = withRepresentation ?? original.loweredFunctionType.functionTypeRepresentation
return bridgedParamInfos.withUnsafeBufferPointer { paramBuf in return bridgedParamInfos.withUnsafeBufferPointer { paramBuf in
@@ -183,7 +184,7 @@ struct FunctionPassContext : MutatingContext {
return bridgedPassContext.createSpecializedFunctionDeclaration( return bridgedPassContext.createSpecializedFunctionDeclaration(
nameRef, paramBuf.baseAddress, paramBuf.count, nameRef, paramBuf.baseAddress, paramBuf.count,
resultBuf.baseAddress, resultBuf.count, resultBuf.baseAddress, resultBuf.count,
original.bridged, makeThin, makeBare, original.bridged, repr.bridged, makeBare,
preserveGenericSignature preserveGenericSignature
).function ).function
} }
@@ -191,7 +192,7 @@ struct FunctionPassContext : MutatingContext {
return bridgedPassContext.createSpecializedFunctionDeclaration( return bridgedPassContext.createSpecializedFunctionDeclaration(
nameRef, paramBuf.baseAddress, paramBuf.count, nameRef, paramBuf.baseAddress, paramBuf.count,
nil, 0, nil, 0,
original.bridged, makeThin, makeBare, original.bridged, repr.bridged, makeBare,
preserveGenericSignature preserveGenericSignature
).function ).function
} }

View File

@@ -274,7 +274,7 @@ struct BridgedPassContext {
const BridgedResultInfo *_Nullable specializedBridgedResults, const BridgedResultInfo *_Nullable specializedBridgedResults,
SwiftInt resultCount, SwiftInt resultCount,
BridgedFunction bridgedOriginal, BridgedFunction bridgedOriginal,
bool makeThin, BridgedASTType::FunctionTypeRepresentation representation,
bool makeBare, bool makeBare,
bool preserveGenericSignature) const; bool preserveGenericSignature) const;

View File

@@ -393,7 +393,7 @@ createSpecializedFunctionDeclaration(BridgedStringRef specializedName,
const BridgedResultInfo * _Nullable specializedBridgedResults, const BridgedResultInfo * _Nullable specializedBridgedResults,
SwiftInt resultCount, SwiftInt resultCount,
BridgedFunction bridgedOriginal, BridgedFunction bridgedOriginal,
bool makeThin, BridgedASTType::FunctionTypeRepresentation representation,
bool makeBare, bool makeBare,
bool preserveGenericSignature) const { bool preserveGenericSignature) const {
auto *original = bridgedOriginal.getFunction(); auto *original = bridgedOriginal.getFunction();
@@ -415,9 +415,7 @@ createSpecializedFunctionDeclaration(BridgedStringRef specializedName,
// The specialized function is always a thin function. This is important // The specialized function is always a thin function. This is important
// because we may add additional parameters after the Self parameter of // because we may add additional parameters after the Self parameter of
// witness methods. In this case the new function is not a method anymore. // witness methods. In this case the new function is not a method anymore.
auto extInfo = originalType->getExtInfo(); auto extInfo = originalType->getExtInfo().withRepresentation((SILFunctionTypeRepresentation)representation);
if (makeThin)
extInfo = extInfo.withRepresentation(SILFunctionTypeRepresentation::Thin);
auto ClonedTy = SILFunctionType::get( auto ClonedTy = SILFunctionType::get(
preserveGenericSignature ? originalType->getInvocationGenericSignature() : GenericSignature(), preserveGenericSignature ? originalType->getInvocationGenericSignature() : GenericSignature(),