介绍
本文用来向开发者提供关于SIL
实现的信息.关于SIL
正式在官方声明可以查看SIL详解.本文为关于内部实行的指导.资源注解一般会尽可能的提供此类信息,但是有的实现的展开会涉及基数据源.本文旨在分析基数据源的注解.
SIL类型
TBD:定义了类型的不同级别.通过示例解释类型降级.
SIL说明结果
TBD:解释多种类型是如何通过指针被以下资源引用的: SILValue
,SILInstruction
,SingleValueInstruction
,MultipleValueInstructionResult
.以及设计这些的原因.
SILFunction
和apple
参数
在整个编译器中,在以下上下文中都是通过整数索引去标识参数位置.
-
SILFunctionType
拥有元组参数 -
SIL
函数定义拥有一个SILFunctionArgument
列表.这是被调用方的参数列表.包含了非直接结果. -
apply
,try_apply
和begin_apply
拥有"应用参数":被调用方SILFunctionArgument
列表的说明操作显示的子集. -
partial_apply
局部应用也有"应用参数":闭包说明操作显示的子集.closure captures
返回列表关于被调用方SILFunctinoArgument
列表的子集 - 在以上三种上下文中,
SILFunctionArgument
,apply
和partial_apply
,这些参数索引依赖于SIL
的阶段: 正式SIL
或生的SIL
.
考虑以下参数
func example<T>(i: Int, t: T) -> (Int, T) {
let foo = { return ($0, t) }
return foo(i)
}
闭包foo
在不同上下文中具有以下参数索引.
闭包的SILFunctionType
在(#0
,#1
)位置有两个直接的正式参数和一个元组类型的直接正式结果:
SILFunctionType(foo):(#0: Int, #1: T) -> @out(Int, T)
有不透明值的正式SIL
对应SILFunctionType
.foo
的定义在(#0
,#1
)有两个直接的SILFunctionArgument
:
SILFunctionArguments:(#0: Int, #1: T) -> (Int, T)
低级别的SIL
中,foo
的定义在#0位有一个非直接的结果参数.函数参数索引则在(#1
,#2
)位置:
SILFunctionArgument: (#0: *T, #1: Int, #2: T) -> Int
闭包的创造在#0
有一个应用参数.注意第一个应用参数其实是第二个操作(第一个是被调用者).在低级别的SIL
中,其实是SILFunctionArgument
中的第三个(在非直接结果和第一个参数之后)
%closure = partial_apply foo(#0: t)
在闭包应用的不透明值有一个应用参数
%resultTuple = apply %closure(#0: i)
低级别的闭包应用有两个应用参数
%directResult = apply %closure(#0: %indirectResult: *T, #1: i)
依赖于SIL
阶段的SILFunctionType
和SILFunctionArgument
的映射表是通过SILFunctionConventions来控制的.以下API说明了整数索引的命名惯例
-
Parameters
指参数的函数签名元组 -
SILArguments
指被调用者入口块的SILFunctionArgument
集合,集合包含目前的SIL
阶段所需要的非直接结果.
这些参数索引和他们相关位移是不会被硬编码的,所以理论上不需要使用上述的"第一位索引"法去转换索引.惯例方法的命名惯例应该可以清晰的通过方式索引去查找.例如,SILArgument
参数类型的信息应该通过索引:getParamInfoForSILArg(index)
,getSILArgumentConvention(index)
和getSILArgumentType(index0
去获得.
另一个概念,ApplySite
,是私有apply
类型的抽象,包括try_apply
,begin_apply
和partial_apply
.
ApplySite::getSubstCalleeConv()
常用于索引被调用方的SILFunctionConventions
,内部包含了方法类型和以上包含的定义等信息.应用信息的参数可以直接通过ApplySite
API来获得.
例如,ApplySite::getAppliedArgumentConvention(index)
通过应用参数索引来查找,前提是SILFunctionArguments::getSILArgumentConvention(index)
索引是对应SILFunctionArgument
索引时.他们都返回一样的信息,只是展示方式不同.
一个常见的误解是直接将调用方的ApplySite的参数,映射到被调用方的FunctionArgument
.只有在相同partial_apply
代码被曝光时才可以使用.否则,使用ApplySite
应该使用应用参数的索引,或者使用ApplySite::getCalleeArgIndexOfFirstAppliedArg()
来讲应用参数转换为函数的管理参数.
SILAnalysis和PassManager
描述检测合格的机制和更新PassManager以及它可用分析
高级别的SIL
优化
HighLevelSILOptomizations.rst
描述了是如何通过高级语义将优化全覆盖特定的SIL
类型和SIL
函数的.
网友评论