SIL程序员手册

介绍

本文用来向开发者提供关于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函数的.

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,797评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 01 「请教」 为理解而阅读,很容易遇到读不懂的情况。这时你可能会选择「请教」。但凭借外力帮助的阅读,都不算是「真...
    何阿予阅读 3,382评论 0 1
  • 今天儿子放学回家跟我说:“妈妈,老师让我们写我心中的太阳,我喜欢大海,蓝蓝的,我希望太阳也是蓝蓝的,那么清澈...
    骞译阅读 2,854评论 0 2
  • 今天上午,我在家里做了一个实验——鸡蛋变大。 ...
    陆俞坤阅读 3,576评论 0 2