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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
|
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
|
.long L_str_forwardingTargetForSelector
.section __OBJC, __image_info
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
_of_forward:
.set FS, 176
mflr r0
stw r0, 8(r1)
stwu r1, -FS(r1)
stwu r1, -192(r1)
/*
/* Save all arguments */
stw r3, FS+24(r1)
stw r4, FS+28(r1)
stw r5, FS+32(r1)
stw r6, FS+36(r1)
stw r7, FS+40(r1)
stw r8, FS+44(r1)
stw r9, FS+48(r1)
stw r10, FS+52(r1)
* Save all arguments and r13.
*
* We can dump two parameters in the parameter area as we know that
* space has been reserved for at least two parameters.
*/
stw r3, 216(r1)
stw r4, 220(r1)
stw r5, 56(r1)
stw r6, 60(r1)
stw r7, 64(r1)
stw r8, 68(r1)
stw r9, 72(r1)
stw r10, 76(r1)
stw r13, 80(r1)
/* Save all floating point arguments */
stfd f1, 56(r1)
stfd f2, 64(r1)
stfd f3, 72(r1)
stfd f4, 80(r1)
stfd f5, 88(r1)
stfd f6, 96(r1)
stfd f7, 104(r1)
stfd f8, 112(r1)
stfd f9, 120(r1)
stfd f10, 128(r1)
stfd f11, 136(r1)
stfd f12, 144(r1)
stfd f13, 152(r1)
stfd f1, 88(r1)
stfd f2, 96(r1)
stfd f3, 104(r1)
stfd f4, 112(r1)
stfd f5, 120(r1)
stfd f6, 128(r1)
stfd f7, 136(r1)
stfd f8, 144(r1)
stfd f9, 152(r1)
stfd f10, 160(r1)
stfd f11, 168(r1)
stfd f12, 176(r1)
stfd f13, 184(r1)
bl _object_getClass
bl L0
L0:
mflr r4
addis r4, r4, ha16(L_sel_forwardingTargetForSelector-L0)
lwz r4, lo16(L_sel_forwardingTargetForSelector-L0)(r4)
stw r4, 160(r1)
mflr r13
addis r13, r13, ha16(L_sel_forwardingTargetForSelector-L0)
lwz r13, lo16(L_sel_forwardingTargetForSelector-L0)(r13)
mr r4, r13
bl _class_respondsToSelector
cmpwi r3, 0
beq- fail
lwz r3, FS+24(r1)
lwz r4, 160(r1)
lwz r5, FS+28(r1)
lwz r3, 216(r1)
mr r4, r13
lwz r5, 220(r1)
bl _objc_msgSend
cmpwi r3, 0
beq- fail
lwz r0, FS+24(r1)
lwz r4, 216(r1)
cmpw r3, r4
beq- fail
mr r4, r3
/* Restore all arguments, except r3 */
lwz r4, FS+28(r1)
lwz r5, FS+32(r1)
lwz r6, FS+36(r1)
lwz r7, FS+40(r1)
lwz r8, FS+44(r1)
lwz r9, FS+48(r1)
lwz r10, FS+52(r1)
/* Restore all arguments and r13, except r3 */
lwz r4, 220(r1)
lwz r5, 56(r1)
lwz r6, 60(r1)
lwz r7, 64(r1)
lwz r8, 68(r1)
lwz r9, 72(r1)
lwz r10, 76(r1)
lwz r13, 80(r1)
/* Restore all floating point arguments */
lfd f1, 56(r1)
lfd f2, 64(r1)
lfd f3, 72(r1)
lfd f4, 80(r1)
lfd f5, 88(r1)
lfd f6, 96(r1)
lfd f7, 104(r1)
lfd f8, 112(r1)
lfd f9, 120(r1)
lfd f10, 128(r1)
lfd f11, 136(r1)
lfd f12, 144(r1)
lfd f13, 152(r1)
lfd f1, 88(r1)
lfd f2, 96(r1)
lfd f3, 104(r1)
lfd f4, 112(r1)
lfd f5, 120(r1)
lfd f6, 128(r1)
lfd f7, 136(r1)
lfd f8, 144(r1)
lfd f9, 152(r1)
lfd f10, 160(r1)
lfd f11, 168(r1)
lfd f12, 176(r1)
lfd f13, 184(r1)
addi r1, r1, FS
addi r1, r1, 192
lwz r0, 8(r1)
mtlr r0
b _objc_msgSend
fail:
lwz r3, FS+24(r1)
lwz r4, FS+28(r1)
lwz r3, 216(r1)
lwz r4, 220(r1)
addi r1, r1, FS
addi r1, r1, 192
lwz r0, 8(r1)
mtlr r0
b _of_method_not_found
_of_forward_stret:
.set FS, 176
mflr r0
stw r0, 8(r1)
stwu r1, -FS(r1)
stwu r1, -184(r1)
/*
/* Save all arguments */
stw r3, FS+24(r1)
stw r4, FS+28(r1)
stw r5, FS+32(r1)
stw r6, FS+36(r1)
stw r7, FS+40(r1)
stw r8, FS+44(r1)
stw r9, FS+48(r1)
stw r10, FS+52(r1)
* Save all arguments and r13.
*
* We can dump three parameters in the parameter area as we know that
* space has been reserved for at least three parameters.
*/
stw r3, 208(r1)
stw r4, 212(r1)
stw r5, 216(r1)
stw r6, 56(r1)
stw r7, 60(r1)
stw r8, 64(r1)
stw r9, 68(r1)
stw r10, 72(r1)
stw r13, 76(r1)
/* Save all floating point arguments */
stfd f1, 56(r1)
stfd f2, 64(r1)
stfd f3, 72(r1)
stfd f4, 80(r1)
stfd f5, 88(r1)
stfd f6, 96(r1)
stfd f7, 104(r1)
stfd f8, 112(r1)
stfd f9, 120(r1)
stfd f10, 128(r1)
stfd f11, 136(r1)
stfd f12, 144(r1)
stfd f13, 152(r1)
stfd f1, 80(r1)
stfd f2, 88(r1)
stfd f3, 96(r1)
stfd f4, 104(r1)
stfd f5, 112(r1)
stfd f6, 120(r1)
stfd f7, 128(r1)
stfd f8, 136(r1)
stfd f9, 144(r1)
stfd f10, 152(r1)
stfd f11, 160(r1)
stfd f12, 168(r1)
stfd f13, 176(r1)
mr r3, r4
bl _object_getClass
bl L1
L1:
mflr r4
addis r4, r4, ha16(L_sel_forwardingTargetForSelector-L1)
lwz r4, lo16(L_sel_forwardingTargetForSelector-L1)(r4)
stw r4, 160(r1)
mflr r13
addis r13, r13, ha16(L_sel_forwardingTargetForSelector-L1)
lwz r13, lo16(L_sel_forwardingTargetForSelector-L1)(r13)
mr r4, r13
bl _class_respondsToSelector
cmpwi r3, 0
beq- fail_stret
lwz r3, FS+28(r1)
lwz r4, 160(r1)
lwz r5, FS+32(r1)
lwz r3, 212(r1)
mr r4, r13
lwz r5, 216(r1)
bl _objc_msgSend
cmpwi r3, 0
beq- fail_stret
lwz r0, FS+28(r1)
lwz r4, 212(r1)
cmpw r3, r4
beq- fail_stret
mr r4, r3
/* Restore all arguments, except r4 */
lwz r3, FS+24(r1)
lwz r5, FS+32(r1)
lwz r6, FS+36(r1)
lwz r7, FS+40(r1)
lwz r8, FS+44(r1)
lwz r9, FS+48(r1)
lwz r10, FS+52(r1)
/* Restore all arguments and r13, except r4 */
lwz r3, 208(r1)
lwz r5, 216(r1)
lwz r6, 56(r1)
lwz r7, 60(r1)
lwz r8, 64(r1)
lwz r9, 68(r1)
lwz r10, 72(r1)
lwz r13, 76(r1)
/* Restore all floating point arguments */
lfd f1, 56(r1)
lfd f2, 64(r1)
lfd f3, 72(r1)
lfd f4, 80(r1)
lfd f5, 88(r1)
lfd f6, 96(r1)
lfd f7, 104(r1)
lfd f8, 112(r1)
lfd f9, 120(r1)
lfd f10, 128(r1)
lfd f11, 136(r1)
lfd f12, 144(r1)
lfd f13, 152(r1)
lfd f1, 80(r1)
lfd f2, 88(r1)
lfd f3, 96(r1)
lfd f4, 104(r1)
lfd f5, 112(r1)
lfd f6, 120(r1)
lfd f7, 128(r1)
lfd f8, 136(r1)
lfd f9, 144(r1)
lfd f10, 152(r1)
lfd f11, 160(r1)
lfd f12, 168(r1)
lfd f13, 176(r1)
addi r1, r1, FS
addi r1, r1, 184
lwz r0, 8(r1)
mtlr r0
b _objc_msgSend_stret
fail_stret:
lwz r3, FS+28(r1)
lwz r4, FS+32(r1)
lwz r3, 212(r1)
lwz r4, 216(r1)
addi r1, r1, FS
addi r1, r1, 184
lwz r0, 8(r1)
mtlr r0
b _of_method_not_found
|