别人的精品

SIL程序员手册

2018-10-03  本文已影响60人  sea_biscute

介绍

本文用来向开发者提供关于SIL实现的信息.关于SIL正式在官方声明可以查看SIL详解.本文为关于内部实行的指导.资源注解一般会尽可能的提供此类信息,但是有的实现的展开会涉及基数据源.本文旨在分析基数据源的注解.

SIL类型

TBD:定义了类型的不同级别.通过示例解释类型降级.

SIL说明结果

TBD:解释多种类型是如何通过指针被以下资源引用的: SILValue,SILInstruction,SingleValueInstruction,MultipleValueInstructionResult.以及设计这些的原因.

SILFunctionapple参数

在整个编译器中,在以下上下文中都是通过整数索引去标识参数位置.

考虑以下参数

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阶段的SILFunctionTypeSILFunctionArgument的映射表是通过SILFunctionConventions来控制的.以下API说明了整数索引的命名惯例

这些参数索引和他们相关位移是不会被硬编码的,所以理论上不需要使用上述的"第一位索引"法去转换索引.惯例方法的命名惯例应该可以清晰的通过方式索引去查找.例如,SILArgument参数类型的信息应该通过索引:getParamInfoForSILArg(index),getSILArgumentConvention(index)getSILArgumentType(index0去获得.

另一个概念,ApplySite,是私有apply类型的抽象,包括try_apply,begin_applypartial_apply.
ApplySite::getSubstCalleeConv()常用于索引被调用方的SILFunctionConventions,内部包含了方法类型和以上包含的定义等信息.应用信息的参数可以直接通过ApplySiteAPI来获得.
例如,ApplySite::getAppliedArgumentConvention(index)通过应用参数索引来查找,前提是SILFunctionArguments::getSILArgumentConvention(index) 索引是对应SILFunctionArgument索引时.他们都返回一样的信息,只是展示方式不同.

一个常见的误解是直接将调用方的ApplySite的参数,映射到被调用方的FunctionArgument.只有在相同partial_apply代码被曝光时才可以使用.否则,使用ApplySite应该使用应用参数的索引,或者使用ApplySite::getCalleeArgIndexOfFirstAppliedArg()来讲应用参数转换为函数的管理参数.

SILAnalysis和PassManager

描述检测合格的机制和更新PassManager以及它可用分析

高级别的SIL优化

HighLevelSILOptomizations.rst描述了是如何通过高级语义将优化全覆盖特定的SIL类型和SIL函数的.

参考

上一篇 下一篇

猜你喜欢

热点阅读