介紹
本文用來向開發(fā)者提供關(guān)于SIL
實(shí)現(xiàn)的信息.關(guān)于SIL
正式在官方聲明可以查看SIL詳解.本文為關(guān)于內(nèi)部實(shí)行的指導(dǎo).資源注解一般會(huì)盡可能的提供此類信息,但是有的實(shí)現(xiàn)的展開會(huì)涉及基數(shù)據(jù)源.本文旨在分析基數(shù)據(jù)源的注解.
SIL類型
TBD:定義了類型的不同級(jí)別.通過示例解釋類型降級(jí).
SIL說明結(jié)果
TBD:解釋多種類型是如何通過指針被以下資源引用的: SILValue
,SILInstruction
,SingleValueInstruction
,MultipleValueInstructionResult
.以及設(shè)計(jì)這些的原因.
SILFunction
和apple
參數(shù)
在整個(gè)編譯器中,在以下上下文中都是通過整數(shù)索引去標(biāo)識(shí)參數(shù)位置.
-
SILFunctionType
擁有元組參數(shù) -
SIL
函數(shù)定義擁有一個(gè)SILFunctionArgument
列表.這是被調(diào)用方的參數(shù)列表.包含了非直接結(jié)果. -
apply
,try_apply
和begin_apply
擁有"應(yīng)用參數(shù)":被調(diào)用方SILFunctionArgument
列表的說明操作顯示的子集. -
partial_apply
局部應(yīng)用也有"應(yīng)用參數(shù)":閉包說明操作顯示的子集.closure captures
返回列表關(guān)于被調(diào)用方SILFunctinoArgument
列表的子集 - 在以上三種上下文中,
SILFunctionArgument
,apply
和partial_apply
,這些參數(shù)索引依賴于SIL
的階段: 正式SIL
或生的SIL
.
考慮以下參數(shù)
func example<T>(i: Int, t: T) -> (Int, T) {
let foo = { return ($0, t) }
return foo(i)
}
閉包foo
在不同上下文中具有以下參數(shù)索引.
閉包的SILFunctionType
在(#0
,#1
)位置有兩個(gè)直接的正式參數(shù)和一個(gè)元組類型的直接正式結(jié)果:
SILFunctionType(foo):(#0: Int, #1: T) -> @out(Int, T)
有不透明值的正式SIL
對(duì)應(yīng)SILFunctionType
.foo
的定義在(#0
,#1
)有兩個(gè)直接的SILFunctionArgument
:
SILFunctionArguments:(#0: Int, #1: T) -> (Int, T)
低級(jí)別的SIL
中,foo
的定義在#0位有一個(gè)非直接的結(jié)果參數(shù).函數(shù)參數(shù)索引則在(#1
,#2
)位置:
SILFunctionArgument: (#0: *T, #1: Int, #2: T) -> Int
閉包的創(chuàng)造在#0
有一個(gè)應(yīng)用參數(shù).注意第一個(gè)應(yīng)用參數(shù)其實(shí)是第二個(gè)操作(第一個(gè)是被調(diào)用者).在低級(jí)別的SIL
中,其實(shí)是SILFunctionArgument
中的第三個(gè)(在非直接結(jié)果和第一個(gè)參數(shù)之后)
%closure = partial_apply foo(#0: t)
在閉包應(yīng)用的不透明值有一個(gè)應(yīng)用參數(shù)
%resultTuple = apply %closure(#0: i)
低級(jí)別的閉包應(yīng)用有兩個(gè)應(yīng)用參數(shù)
%directResult = apply %closure(#0: %indirectResult: *T, #1: i)
依賴于SIL
階段的SILFunctionType
和SILFunctionArgument
的映射表是通過SILFunctionConventions來控制的.以下API說明了整數(shù)索引的命名慣例
-
Parameters
指參數(shù)的函數(shù)簽名元組 -
SILArguments
指被調(diào)用者入口塊的SILFunctionArgument
集合,集合包含目前的SIL
階段所需要的非直接結(jié)果.
這些參數(shù)索引和他們相關(guān)位移是不會(huì)被硬編碼的,所以理論上不需要使用上述的"第一位索引"法去轉(zhuǎn)換索引.慣例方法的命名慣例應(yīng)該可以清晰的通過方式索引去查找.例如,SILArgument
參數(shù)類型的信息應(yīng)該通過索引:getParamInfoForSILArg(index)
,getSILArgumentConvention(index)
和getSILArgumentType(index0
去獲得.
另一個(gè)概念,ApplySite
,是私有apply
類型的抽象,包括try_apply
,begin_apply
和partial_apply
.
ApplySite::getSubstCalleeConv()
常用于索引被調(diào)用方的SILFunctionConventions
,內(nèi)部包含了方法類型和以上包含的定義等信息.應(yīng)用信息的參數(shù)可以直接通過ApplySite
API來獲得.
例如,ApplySite::getAppliedArgumentConvention(index)
通過應(yīng)用參數(shù)索引來查找,前提是SILFunctionArguments::getSILArgumentConvention(index)
索引是對(duì)應(yīng)SILFunctionArgument
索引時(shí).他們都返回一樣的信息,只是展示方式不同.
一個(gè)常見的誤解是直接將調(diào)用方的ApplySite的參數(shù),映射到被調(diào)用方的FunctionArgument
.只有在相同partial_apply
代碼被曝光時(shí)才可以使用.否則,使用ApplySite
應(yīng)該使用應(yīng)用參數(shù)的索引,或者使用ApplySite::getCalleeArgIndexOfFirstAppliedArg()
來講應(yīng)用參數(shù)轉(zhuǎn)換為函數(shù)的管理參數(shù).
SILAnalysis和PassManager
描述檢測(cè)合格的機(jī)制和更新PassManager以及它可用分析
高級(jí)別的SIL
優(yōu)化
HighLevelSILOptomizations.rst
描述了是如何通過高級(jí)語(yǔ)義將優(yōu)化全覆蓋特定的SIL
類型和SIL
函數(shù)的.