File: objc_dealloc.sil

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (127 lines) | stat: -rw-r--r-- 5,657 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s

// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop

sil_stage raw

import Builtin
import Swift
import gizmo

class X { }
sil_vtable X {}
sil @$s12objc_dealloc1XCfD : $@convention(method) (X) -> ()

func onDestruct() { }

class SwiftGizmo : Gizmo {
  var x : X
  override init()
  deinit
}
sil_vtable SwiftGizmo {}
sil @$s12objc_dealloc10SwiftGizmoCfD : $@convention(method) (SwiftGizmo) -> ()

sil @$s12objc_dealloc10onDestructyyF : $@convention(thin) () -> () {
bb0:
  %0 = tuple ()
  %1 = tuple ()                                   // user: %2
  return %1 : $()                                 // id: %2
}

sil [ossa] @$s12objc_dealloc10SwiftGizmoCfd : $@convention(thin) (@owned SwiftGizmo) -> @owned Builtin.NativeObject {
bb0(%0 : @owned $SwiftGizmo):
  // function_ref objc_dealloc.onDestruct () -> ()
  %1 = function_ref @$s12objc_dealloc10onDestructyyF : $@convention(thin) () -> () // user: %2
  %2 = apply %1() : $@convention(thin) () -> ()
  %3 = begin_borrow %0 : $SwiftGizmo
  %4 = ref_element_addr %3 : $SwiftGizmo, #SwiftGizmo.x      // user: %4
  destroy_addr %4 : $*X                           // id: %4
  end_borrow %3 : $SwiftGizmo
  %5 = unchecked_ref_cast %0 : $SwiftGizmo to $Builtin.NativeObject // user: %6
  return %5 : $Builtin.NativeObject              // id: %6
}

sil private [ossa] @$s12objc_dealloc10SwiftGizmoC1xAA1XCfgTo : $@convention(objc_method) (SwiftGizmo) -> @autoreleased X {
bb0(%0 : @unowned $SwiftGizmo):
  %1 = unchecked_ownership_conversion %0 : $SwiftGizmo, @unowned to @guaranteed
  %2 = ref_element_addr %1 : $SwiftGizmo, #SwiftGizmo.x      // user: %2
  %3 = load [copy] %2 : $*X                              // users: %4, %3
  end_borrow %1 : $SwiftGizmo
  return %3 : $X                                  // id: %4
}

sil private [ossa] @$s12objc_dealloc10SwiftGizmoC1xAA1XCfsTo : $@convention(objc_method) (X, SwiftGizmo) -> () {
bb0(%0 : @unowned $X, %1 : @unowned $SwiftGizmo):
  %2 = copy_value %0 : $X
  %3 = copy_value %1 : $SwiftGizmo
  %4 = begin_borrow %3 : $SwiftGizmo
  %5 = ref_element_addr %4 : $SwiftGizmo, #SwiftGizmo.x      // user: %5
  assign %2 to %5 : $*X                           // id: %5
  end_borrow %4 : $SwiftGizmo
  destroy_value %3 : $SwiftGizmo                 // id: %6
  %7 = tuple ()                                   // user: %8
  return %7 : $()                                 // id: %8
}

// CHECK: define internal void @"$s12objc_dealloc10SwiftGizmoCfDTo"(ptr %0, ptr %1) {{[#0-9]*}} {
sil private [ossa] @$s12objc_dealloc10SwiftGizmoCfDTo : $@convention(objc_method) (SwiftGizmo) -> () {
bb0(%0 : @unowned $SwiftGizmo):
  // CHECK-NEXT: entry
  // CHECK-NEXT: [[OBJC_SUPER:%[a-zA-Z0-9_]+]] = alloca %objc_super, align 8

  // Call to onDestruct()
  // CHECK: call swiftcc void @"$s12objc_dealloc10onDestructyyF"()

  // function_ref objc_dealloc.onDestruct () -> ()
  %1 = function_ref @$s12objc_dealloc10onDestructyyF : $@convention(thin) () -> () // user: %2
  %2 = apply %1() : $@convention(thin) () -> ()

  // Destroy instance variables
  // FIXME: This should move to .cxx_destruct
  // CHECK: [[XOFFSET:%[a-zA-Z0-9]+]] = load i64, ptr @"$s12objc_dealloc10SwiftGizmoC1xAA1XCvpWvd", align 8
  // CHECK-NEXT: [[IVAR_ADDR:%[a-zA-Z0-9]+]] = getelementptr inbounds i8, ptr {{.*}}, i64 [[XOFFSET]]
  // CHECK-NEXT: [[X:%[a-zA-Z0-9]+]] = load ptr, ptr [[IVAR_ADDR]], align 8
  // CHECK-NEXT: call void @swift_release(ptr [[X]])
  %3 = unchecked_ownership_conversion %0 : $SwiftGizmo, @unowned to @guaranteed
  %4 = ref_element_addr %3 : $SwiftGizmo, #SwiftGizmo.x      // user: %4
  destroy_addr %4 : $*X                           // id: %4
  end_borrow %3 : $SwiftGizmo

  // Call super -dealloc.
  // CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s12objc_dealloc10SwiftGizmoCMa"(i64 0)
  // CHECK-NEXT: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
  // CHECK-NEXT: [[OBJC_SUPER_RECEIVER:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, ptr [[OBJC_SUPER]], i32 0, i32 0
  // CHECK-NEXT: store ptr %0, ptr [[OBJC_SUPER_RECEIVER]], align 8
  // CHECK-NEXT: [[OBJC_SUPER_CLASS:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, ptr [[OBJC_SUPER]], i32 0, i32 1
  // CHECK-NEXT: store ptr [[T0]], ptr [[OBJC_SUPER_CLASS]], align 8
  // CHECK-NEXT: [[DEALLOC_SEL:%[a-zA-Z0-9]+]] = load ptr, ptr @"\01L_selector(dealloc)", align 8
  // CHECK-NEXT: call void @objc_msgSendSuper2(ptr [[OBJC_SUPER]], ptr [[DEALLOC_SEL]])
  %5 = objc_super_method %0 : $SwiftGizmo, #Gizmo.deinit!deallocator.foreign : (Gizmo) -> () -> (), $@convention(objc_method) (Gizmo) -> () // user: %7
  %6 = upcast %0 : $SwiftGizmo to $Gizmo          // user: %7
  %7 = apply %5(%6) : $@convention(objc_method) (Gizmo) -> ()

  // CHECK-NEXT: ret void
  %8 = tuple ()                                   // user: %9
  return %8 : $()                                 // id: %9
}

// @objc ObjectiveC.SwiftGizmo.__ivar_destroyer
sil [ossa] @$s12objc_dealloc10SwiftGizmoCfETo : $@convention(objc_method) (SwiftGizmo) -> () {
bb0(%0 : @unowned $SwiftGizmo):
  %3 = tuple ()
  return %3 : $()                                 // id: %4
}

sil [ossa] @$s12objc_dealloc10SwiftGizmoCACycfcTo : $@convention(objc_method) (@owned SwiftGizmo) -> @owned SwiftGizmo {
bb0(%0 : @owned $SwiftGizmo):
  return %0 : $SwiftGizmo
}

sil [ossa] @$s12objc_dealloc10SwiftGizmoC7bellsOnACSgSi_tcfcTo : $@convention(objc_method) (Int, @owned SwiftGizmo) -> @owned SwiftGizmo? {
bb0(%0 : $Int, %1 : @owned $SwiftGizmo):
  unreachable
}