Skip to content

Commit 3775a35

Browse files
committed
ModulePassContext: add some utility functions
* `specialize(function:)` * `deserializeCallees(of:)` * `createWitnessTable()` * `createSpecializedVTable` * `Function.set(isSerialized:)`
1 parent 2950e45 commit 3775a35

File tree

6 files changed

+120
-0
lines changed

6 files changed

+120
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/PassManager/ModulePassContext.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,44 @@ struct ModulePassContext : Context, CustomStringConvertible {
129129
return function.isDefinition
130130
}
131131

132+
func specialize(function: Function, for substitutions: SubstitutionMap) -> Function? {
133+
return _bridged.specializeFunction(function.bridged, substitutions.bridged).function
134+
}
135+
136+
enum DeserializationMode {
137+
case allFunctions
138+
case onlySharedFunctions
139+
}
140+
141+
func deserializeAllCallees(of function: Function, mode: DeserializationMode) {
142+
_bridged.deserializeAllCallees(function.bridged, mode == .allFunctions ? true : false)
143+
}
144+
145+
@discardableResult
146+
func createWitnessTable(entries: [WitnessTable.Entry],
147+
conformance: ProtocolConformance,
148+
linkage: Linkage,
149+
serialized: Bool) -> WitnessTable
150+
{
151+
let bridgedEntries = entries.map { $0.bridged }
152+
let bridgedWitnessTable = bridgedEntries.withBridgedArrayRef {
153+
_bridged.createWitnessTable(linkage.bridged, serialized, conformance.bridged, $0)
154+
}
155+
return WitnessTable(bridged: bridgedWitnessTable)
156+
}
157+
158+
@discardableResult
159+
func createSpecializedVTable(entries: [VTable.Entry],
160+
for classType: Type,
161+
isSerialized: Bool) -> VTable
162+
{
163+
let bridgedEntries = entries.map { $0.bridged }
164+
let bridgedVTable = bridgedEntries.withBridgedArrayRef {
165+
_bridged.createSpecializedVTable(isSerialized, classType.bridged, $0)
166+
}
167+
return VTable(bridged: bridgedVTable)
168+
}
169+
132170
func createEmptyFunction(
133171
name: String,
134172
parameters: [ParameterInfo],
@@ -174,4 +212,8 @@ extension Function {
174212
func set(linkage: Linkage, _ context: ModulePassContext) {
175213
bridged.setLinkage(linkage.bridged)
176214
}
215+
216+
func set(isSerialized: Bool, _ context: ModulePassContext) {
217+
bridged.setIsSerialized(isSerialized)
218+
}
177219
}

include/swift/SIL/SILBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ struct BridgedFunction {
568568
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedType getLoweredType(BridgedType type) const;
569569
BRIDGED_INLINE BridgedLinkage getLinkage() const;
570570
BRIDGED_INLINE void setLinkage(BridgedLinkage linkage) const;
571+
BRIDGED_INLINE void setIsSerialized(bool isSerialized) const;
571572
bool isTrapNoReturn() const;
572573
bool isAutodiffVJP() const;
573574
SwiftInt specializationLevel() const;

include/swift/SIL/SILBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,10 @@ void BridgedFunction::setLinkage(BridgedLinkage linkage) const {
927927
getFunction()->setLinkage((swift::SILLinkage)linkage);
928928
}
929929

930+
void BridgedFunction::setIsSerialized(bool isSerialized) const {
931+
getFunction()->setSerializedKind(isSerialized ? swift::IsSerialized : swift::IsNotSerialized);
932+
}
933+
930934
bool BridgedFunction::isResilientNominalDecl(BridgedNominalTypeDecl decl) const {
931935
return decl.unbridged()->isResilient(getFunction()->getModule().getSwiftModule(),
932936
getFunction()->getResilienceExpansion());

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ struct BridgedPassContext {
254254
SWIFT_IMPORT_UNSAFE OptionalBridgedValue constantFoldBuiltin(BridgedInstruction builtin) const;
255255
SWIFT_IMPORT_UNSAFE swift::SILVTable * _Nullable specializeVTableForType(BridgedType type,
256256
BridgedFunction function) const;
257+
SWIFT_IMPORT_UNSAFE OptionalBridgedFunction specializeFunction(BridgedFunction function,
258+
BridgedSubstitutionMap substitutions) const;
259+
void deserializeAllCallees(BridgedFunction function, bool deserializeAll) const;
257260
bool specializeClassMethodInst(BridgedInstruction cm) const;
258261
bool specializeAppliesInFunction(BridgedFunction function, bool isMandatory) const;
259262
BridgedOwnedString mangleOutlinedVariable(BridgedFunction function) const;
@@ -332,6 +335,13 @@ struct BridgedPassContext {
332335
OptionalBridgedVTable lookupSpecializedVTable(BridgedType classType) const;
333336
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE
334337
OptionalBridgedWitnessTable lookupWitnessTable(BridgedProtocolConformance conformance) const;
338+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedWitnessTable createWitnessTable(BridgedLinkage linkage,
339+
bool serialized,
340+
BridgedProtocolConformance conformance,
341+
BridgedArrayRef bridgedEntries) const;
342+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedVTable createSpecializedVTable(bool serialized,
343+
BridgedType classType,
344+
BridgedArrayRef bridgedEntries) const;
335345
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE void loadFunction(BridgedFunction function, bool loadCalleesRecursively) const;
336346
SWIFT_IMPORT_UNSAFE OptionalBridgedFunction lookupStdlibFunction(BridgedStringRef name) const;
337347
SWIFT_IMPORT_UNSAFE OptionalBridgedFunction lookUpNominalDeinitFunction(BridgedNominalTypeDecl nominal) const;

include/swift/SILOptimizer/OptimizerBridgingImpl.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,36 @@ OptionalBridgedWitnessTable BridgedPassContext::lookupWitnessTable(BridgedProtoc
426426
return {mod->lookUpWitnessTable(ref.getConcrete())};
427427
}
428428

429+
BridgedWitnessTable BridgedPassContext::createWitnessTable(BridgedLinkage linkage,
430+
bool serialized,
431+
BridgedProtocolConformance conformance,
432+
BridgedArrayRef bridgedEntries) const {
433+
swift::SILModule *mod = invocation->getPassManager()->getModule();
434+
llvm::SmallVector<swift::SILWitnessTable::Entry, 8> entries;
435+
for (const BridgedWitnessTableEntry &e : bridgedEntries.unbridged<BridgedWitnessTableEntry>()) {
436+
entries.push_back(e.unbridged());
437+
}
438+
return {swift::SILWitnessTable::create(*mod, (swift::SILLinkage)linkage,
439+
serialized ? swift::IsSerialized : swift::IsNotSerialized,
440+
conformance.unbridged().getConcrete(),
441+
entries, {})};
442+
}
443+
444+
BridgedVTable BridgedPassContext::createSpecializedVTable(bool serialized,
445+
BridgedType classType,
446+
BridgedArrayRef bridgedEntries) const {
447+
swift::SILModule *mod = invocation->getPassManager()->getModule();
448+
llvm::SmallVector<swift::SILVTableEntry, 8> entries;
449+
for (const BridgedVTableEntry &e : bridgedEntries.unbridged<BridgedVTableEntry>()) {
450+
entries.push_back(e.unbridged());
451+
}
452+
swift::SILType classTy = classType.unbridged();
453+
return {swift::SILVTable::create(*mod,
454+
classTy.getClassOrBoundGenericClass(), classTy,
455+
serialized ? swift::IsSerialized : swift::IsNotSerialized,
456+
entries)};
457+
}
458+
429459
void BridgedPassContext::loadFunction(BridgedFunction function, bool loadCalleesRecursively) const {
430460
swift::SILModule *mod = invocation->getPassManager()->getModule();
431461
mod->loadFunction(function.getFunction(),

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
3535
#include "swift/SILOptimizer/Utils/ConstantFolding.h"
3636
#include "swift/SILOptimizer/Utils/Devirtualize.h"
37+
#include "swift/SILOptimizer/Utils/Generics.h"
3738
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
3839
#include "swift/SILOptimizer/Utils/OptimizerStatsUtils.h"
3940
#include "swift/SILOptimizer/Utils/SILInliner.h"
@@ -1740,6 +1741,38 @@ swift::SILVTable * BridgedPassContext::specializeVTableForType(BridgedType type,
17401741
invocation->getTransform());
17411742
}
17421743

1744+
OptionalBridgedFunction BridgedPassContext::specializeFunction(BridgedFunction function,
1745+
BridgedSubstitutionMap substitutions) const {
1746+
swift::SILModule *mod = invocation->getPassManager()->getModule();
1747+
SILFunction *origFunc = function.getFunction();
1748+
SubstitutionMap subs = substitutions.unbridged();
1749+
ReabstractionInfo ReInfo(mod->getSwiftModule(), mod->isWholeModule(),
1750+
ApplySite(), origFunc, subs, IsNotSerialized,
1751+
/*ConvertIndirectToDirect=*/true,
1752+
/*dropMetatypeArgs=*/false);
1753+
1754+
if (!ReInfo.canBeSpecialized()) {
1755+
return {nullptr};
1756+
}
1757+
1758+
SILOptFunctionBuilder FunctionBuilder(*invocation->getTransform());
1759+
1760+
GenericFuncSpecializer FuncSpecializer(FunctionBuilder, origFunc, subs,
1761+
ReInfo, /*isMandatory=*/true);
1762+
SILFunction *SpecializedF = FuncSpecializer.lookupSpecialization();
1763+
if (!SpecializedF) SpecializedF = FuncSpecializer.tryCreateSpecialization();
1764+
if (!SpecializedF || SpecializedF->getLoweredFunctionType()->hasError()) {
1765+
return {nullptr};
1766+
}
1767+
return {SpecializedF};
1768+
}
1769+
1770+
void BridgedPassContext::deserializeAllCallees(BridgedFunction function, bool deserializeAll) const {
1771+
swift::SILModule *mod = invocation->getPassManager()->getModule();
1772+
mod->linkFunction(function.getFunction(), deserializeAll ? SILModule::LinkingMode::LinkAll :
1773+
SILModule::LinkingMode::LinkNormal);
1774+
}
1775+
17431776
bool BridgedPassContext::specializeClassMethodInst(BridgedInstruction cm) const {
17441777
return ::specializeClassMethodInst(cm.getAs<ClassMethodInst>());
17451778
}

0 commit comments

Comments
 (0)