본문 바로가기

프로그래밍/SWIFT

SIL ( Swift Intermediate Language ) 스위프트 중간 언어

반응형

스위프트 컴파일러가 .swift 소스파일을 컴파일하는 과정은 스위프트 언어를 스위프트 중간언어(swift intermediate language)로 우선 만들고, 이것을 다시 llvm IR ( intermediate representation ) 으로 바꾸고, 마지막으로 기계어를 생성하는 단계를 거친다.

.swift 소스에서 변환된 SIL 을 보려면 swiftc 를 이용하여 -emit-sil 옵션으로 컴파일 하면 된다.

  swiftc -emit-sil <filename>.swift

아주 간단한 Point 스트럭쳐를 선언하여, 이를 sil 로 변환하면 다음과 같다.

struct Point {
    let x:Int
    let y:Int
}

 

struct Point {
  @_hasStorage let x: Int { get }
  @_hasStorage let y: Int { get }
  init(x: Int, y: Int)
}

// Point.x.getter
sil hidden [transparent] @$s5point5PointV1xSivg : $@convention(method) (Point) -> Int {
// %0 "self"                                      // users: %2, %1
bb0(%0 : $Point):
  debug_value %0 : $Point, let, name "self", argno 1, implicit // id: %1
  %2 = struct_extract %0 : $Point, #Point.x       // user: %3
  return %2 : $Int                                // id: %3
} // end sil function '$s5point5PointV1xSivg'

// Point.y.getter
sil hidden [transparent] @$s5point5PointV1ySivg : $@convention(method) (Point) -> Int {
// %0 "self"                                      // users: %2, %1
bb0(%0 : $Point):
  debug_value %0 : $Point, let, name "self", argno 1, implicit // id: %1
  %2 = struct_extract %0 : $Point, #Point.y       // user: %3
  return %2 : $Int                                // id: %3
} // end sil function '$s5point5PointV1ySivg'

// Point.init(x:y:)
sil hidden @$s5point5PointV1x1yACSi_SitcfC : $@convention(method) (Int, Int, @thin Point.Type) -> Point {
// %0 "$implicit_value"                           // user: %3
// %1 "$implicit_value"                           // user: %3
// %2 "$metatype"
bb0(%0 : $Int, %1 : $Int, %2 : $@thin Point.Type):
  %3 = struct $Point (%0 : $Int, %1 : $Int)       // user: %4
  return %3 : $Point                              // id: %4
} // end sil function '$s5point5PointV1x1yACSi_SitcfC'
728x90