@@ -66,46 +66,50 @@ void SILFunctionBuilder::addFunctionAttributes(
6666 M.getOptions ().EnableGlobalAssemblyVision )
6767 F->addSemanticsAttr (semantics::FORCE_EMIT_OPT_REMARK_PREFIX);
6868
69- // Propagate @_specialize.
70- for (auto *A : Attrs.getAttributes <AbstractSpecializeAttr>()) {
71- auto *SA = cast<AbstractSpecializeAttr>(A);
72- auto kind =
73- SA->getSpecializationKind () == SpecializeAttr::SpecializationKind::Full
74- ? SILSpecializeAttr::SpecializationKind::Full
75- : SILSpecializeAttr::SpecializationKind::Partial;
76- assert (!constant.isNull ());
77- SILFunction *targetFunction = nullptr ;
78- auto *attributedFuncDecl = constant.getAbstractFunctionDecl ();
79- auto *targetFunctionDecl = SA->getTargetFunctionDecl (attributedFuncDecl);
80- // Filter out _spi.
81- auto spiGroups = SA->getSPIGroups ();
82- bool hasSPI = !spiGroups.empty ();
83- if (hasSPI) {
84- if (attributedFuncDecl->getModuleContext () != M.getSwiftModule () &&
85- !M.getSwiftModule ()->isImportedAsSPI (SA, attributedFuncDecl)) {
86- continue ;
69+ if (F->getRepresentation () != SILFunctionTypeRepresentation::ObjCMethod) {
70+ // Propagate @_specialize.
71+ for (auto *A : Attrs.getAttributes <AbstractSpecializeAttr>()) {
72+ auto *SA = cast<AbstractSpecializeAttr>(A);
73+ auto kind = SA->getSpecializationKind () ==
74+ SpecializeAttr::SpecializationKind::Full
75+ ? SILSpecializeAttr::SpecializationKind::Full
76+ : SILSpecializeAttr::SpecializationKind::Partial;
77+ assert (!constant.isNull ());
78+ SILFunction *targetFunction = nullptr ;
79+ auto *attributedFuncDecl = constant.getAbstractFunctionDecl ();
80+ auto *targetFunctionDecl = SA->getTargetFunctionDecl (attributedFuncDecl);
81+ // Filter out _spi.
82+ auto spiGroups = SA->getSPIGroups ();
83+ bool hasSPI = !spiGroups.empty ();
84+ if (hasSPI) {
85+ if (attributedFuncDecl->getModuleContext () != M.getSwiftModule () &&
86+ !M.getSwiftModule ()->isImportedAsSPI (SA, attributedFuncDecl)) {
87+ continue ;
88+ }
89+ }
90+ assert (spiGroups.size () <= 1 &&
91+ " SIL does not support multiple SPI groups" );
92+ Identifier spiGroupIdent;
93+ if (hasSPI) {
94+ spiGroupIdent = spiGroups[0 ];
95+ }
96+ auto availability = AvailabilityInference::annotatedAvailableRangeForAttr (
97+ attributedFuncDecl, SA, M.getSwiftModule ()->getASTContext ());
98+ auto specializedSignature =
99+ SA->getSpecializedSignature (attributedFuncDecl);
100+ if (targetFunctionDecl) {
101+ SILDeclRef declRef (targetFunctionDecl, constant.kind , false );
102+ targetFunction = getOrCreateDeclaration (targetFunctionDecl, declRef);
103+ F->addSpecializeAttr (SILSpecializeAttr::create (
104+ M, specializedSignature, SA->getTypeErasedParams (),
105+ SA->isExported (), kind, targetFunction, spiGroupIdent,
106+ attributedFuncDecl->getModuleContext (), availability));
107+ } else {
108+ F->addSpecializeAttr (SILSpecializeAttr::create (
109+ M, specializedSignature, SA->getTypeErasedParams (),
110+ SA->isExported (), kind, nullptr , spiGroupIdent,
111+ attributedFuncDecl->getModuleContext (), availability));
87112 }
88- }
89- assert (spiGroups.size () <= 1 && " SIL does not support multiple SPI groups" );
90- Identifier spiGroupIdent;
91- if (hasSPI) {
92- spiGroupIdent = spiGroups[0 ];
93- }
94- auto availability = AvailabilityInference::annotatedAvailableRangeForAttr (
95- attributedFuncDecl, SA, M.getSwiftModule ()->getASTContext ());
96- auto specializedSignature = SA->getSpecializedSignature (attributedFuncDecl);
97- if (targetFunctionDecl) {
98- SILDeclRef declRef (targetFunctionDecl, constant.kind , false );
99- targetFunction = getOrCreateDeclaration (targetFunctionDecl, declRef);
100- F->addSpecializeAttr (SILSpecializeAttr::create (
101- M, specializedSignature, SA->getTypeErasedParams (),
102- SA->isExported (), kind, targetFunction, spiGroupIdent,
103- attributedFuncDecl->getModuleContext (), availability));
104- } else {
105- F->addSpecializeAttr (SILSpecializeAttr::create (
106- M, specializedSignature, SA->getTypeErasedParams (),
107- SA->isExported (), kind, nullptr , spiGroupIdent,
108- attributedFuncDecl->getModuleContext (), availability));
109113 }
110114 }
111115
0 commit comments