SIL程序员手册

作者: sea_biscute | 来源:发表于2018-10-03 23:46 被阅读60次

    介绍

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

    SIL类型

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

    SIL说明结果

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

    SILFunctionapple参数

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

    • SILFunctionType拥有元组参数
    • SIL函数定义拥有一个SILFunctionArgument列表.这是被调用方的参数列表.包含了非直接结果.
    • apply,try_applybegin_apply拥有"应用参数":被调用方SILFunctionArgument列表的说明操作显示的子集.
    • partial_apply局部应用也有"应用参数":闭包说明操作显示的子集.closure captures返回列表关于被调用方SILFunctinoArgument列表的子集
    • 在以上三种上下文中,SILFunctionArgument,applypartial_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阶段的SILFunctionTypeSILFunctionArgument的映射表是通过SILFunctionConventions来控制的.以下API说明了整数索引的命名惯例

    • Parameters指参数的函数签名元组
    • SILArguments指被调用者入口块的SILFunctionArgument集合,集合包含目前的SIL阶段所需要的非直接结果.

    这些参数索引和他们相关位移是不会被硬编码的,所以理论上不需要使用上述的"第一位索引"法去转换索引.惯例方法的命名惯例应该可以清晰的通过方式索引去查找.例如,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函数的.

    参考

    相关文章

      网友评论

        本文标题:SIL程序员手册

        本文链接:https://www.haomeiwen.com/subject/pskwoftx.html