File: objc_super.swift

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 (126 lines) | stat: -rw-r--r-- 5,581 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
// 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 -DINT=i%target-ptrsize

// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
// REQUIRES: swift_stdlib_no_asserts,optimized_stdlib

import gizmo

// CHECK: [[CLASS:%objc_class]] = type
// CHECK: [[TYPE:%swift.type]] = type
// CHECK: [[SUPER:%objc_super]] = type
// CHECK: [[NSRECT:%TSo6NSRectV]] = type

class Hoozit : Gizmo {
  // CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC4frobyyF"(ptr swiftself %0) {{.*}} {
  override func frob() {
    // CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super6HoozitCMa"([[INT]] 0)
    // CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
    // CHECK: store ptr [[T0]], ptr {{.*}}, align 8
    // CHECK: load ptr, ptr @"\01L_selector(frob)"
    // CHECK: call void @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
    super.frob()
  }
  // CHECK: }

  // CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC5runceyyFZ"(ptr swiftself %0) {{.*}} {
  override class func runce() {
    // CHECK: store ptr @"OBJC_METACLASS_$__TtC10objc_super6Hoozit", ptr {{.*}}, align 8
    // CHECK: load ptr, ptr @"\01L_selector(runce)"
    // CHECK: call void @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
    super.runce()
  }
  // CHECK: }

  // CHECK: define hidden swiftcc { double, double, double, double } @"$s10objc_super6HoozitC5frameSo6NSRectVyF"(ptr swiftself %0) {{.*}} {
  override func frame() -> NSRect {
    // CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super6HoozitCMa"([[INT]] 0)
    // CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
    // CHECK: store ptr [[T0]], ptr {{.*}}, align 8
    // CHECK: load ptr, ptr @"\01L_selector(frame)"
    // CHECK: call void @objc_msgSendSuper2_stret(ptr noalias nocapture sret({{.*}}) {{.*}}, ptr {{.*}}, ptr {{.*}})
    return NSInsetRect(super.frame(), 2.0, 2.0)
  }
  // CHECK: }

  // CHECK: define hidden swiftcc ptr @"$s10objc_super6HoozitC1xACSi_tcfc"(i64 %0, ptr swiftself %1) {{.*}} {
  init(x:Int) {
    // CHECK: load ptr, ptr @"\01L_selector(init)"
    // CHECK: call ptr @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
    // CHECK-NOT: @swift_dynamicCastClassUnconditional
    // CHECK: ret
    super.init()
  }
  // CHECK: }

  // CHECK: define hidden swiftcc ptr @"$s10objc_super6HoozitC1yACSi_tcfc"(i64 %0, ptr swiftself %1) {{.*}} {
  init(y:Int) {
    // CHECK: load ptr, ptr @"\01L_selector(initWithBellsOn:)"
    // CHECK: call ptr @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}}, i64 {{.*}})
    // CHECK-NOT: swift_dynamicCastClassUnconditional
    // CHECK: ret
    super.init(bellsOn:y)
  }
  // CHECK: }
}

func acceptFn(_ fn: () -> Void) { }

class PartialApply : Gizmo {
  // CHECK: define hidden swiftcc void @"$s10objc_super12PartialApplyC4frobyyF"(ptr swiftself %0) {{.*}} {
  override func frob() {
    // CHECK: call swiftcc void @"$s10objc_super8acceptFnyyyyXEF"(ptr [[PARTIAL_FORWARDING_THUNK:@"\$[A-Za-z0-9_]+"]], ptr %{{[0-9]+}})
    acceptFn(super.frob)
  }
  // CHECK: }
}

// CHECK: define internal swiftcc void @"$s10objc_super12PartialApplyC4frobyyFyycfu_"(ptr %0)
// CHECK: call swiftcc %swift.metadata_response @"$s10objc_super12PartialApplyCMa"([[INT]] 0)
// CHECK: @"\01L_selector(frob)"
// CHECK: @objc_msgSendSuper2
// CHECK: }

// CHECK: define internal swiftcc void [[PARTIAL_FORWARDING_THUNK]](ptr swiftself %0) {{.*}} {
// CHECK: s10objc_super12PartialApplyC4frobyyFyycfu_
// CHECK: }

class GenericRuncer<T> : Gizmo {
  var x: Gizmo? = nil
  var y: T?

// Use a constant indirect field access instead of a non-constant direct
// access because the layout dependents on the alignment of y.

// CHECK: define hidden swiftcc i64 @"$s10objc_super13GenericRuncerC1xSo5GizmoCSgvg"(ptr swiftself %0)
// CHECK:    inttoptr
// CHECK:   [[ISA:%.*]] = load i64, ptr %0
// CHECK:   [[ISAMASK:%.*]] = load i64, ptr @swift_isaMask
// CHECK:   [[CLASS:%.*]] = and i64 [[ISA]], [[ISAMASK]]
// CHECK:   [[TY:%.*]] = inttoptr i64 [[CLASS]] to ptr
// CHECK:   [[OFFSETADDR:%.*]] = getelementptr inbounds i64, ptr [[TY]], i64 11
// CHECK:   [[FIELDOFFSET:%.*]] = load i64, ptr [[OFFSETADDR]]
// CHECK:   [[FIELDADDR:%.*]] = getelementptr inbounds i8, ptr %0, i64 [[FIELDOFFSET]]
// CHECK:   [[OPTIONAL:%.*]] = load i64, ptr [[FIELDADDR]]
// CHECK:   [[OBJ:%.*]] = inttoptr i64 [[OPTIONAL]] to ptr
// CHECK:   call ptr @llvm.objc.retain(ptr [[OBJ]])
// CHECK:   ret i64 [[OPTIONAL]]

  // CHECK: define hidden swiftcc void @"$s10objc_super13GenericRuncerC5runceyyFZ"(ptr swiftself %0) {{.*}} {
  override class func runce() {
    // CHECK:      [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super13GenericRuncerCMa"([[INT]] 0, ptr %T)
    // CHECK-NEXT: [[CLASS:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
    // CHECK-NEXT: [[ISA:%.*]] = load i64, ptr [[CLASS]], align 8
    // CHECK-NEXT: [[ISA_MASK:%.*]] = load i64, ptr @swift_isaMask, align 8
    // CHECK-NEXT: [[ISA_MASKED:%.*]] = and i64 [[ISA]], [[ISA_MASK]]
    // CHECK-NEXT: [[ISA_PTR:%.*]] = inttoptr i64 [[ISA_MASKED]] to ptr
    // CHECK:      [[METACLASS_ADDR:%.*]] = getelementptr inbounds %objc_super, ptr %objc_super, i32 0, i32 1
    // CHECK-NEXT: store ptr [[ISA_PTR]], ptr [[METACLASS_ADDR]], align 8
    // CHECK-NEXT: [[SELECTOR:%.*]] = load ptr, ptr @"\01L_selector(runce)", align 8
    // CHECK-NEXT: call void @objc_msgSendSuper2(ptr %objc_super, ptr [[SELECTOR]])
    // CHECK-NEXT: ret void
    super.runce()
  }
}