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
|
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
128
129
130
131
132
133
134
135
136
|
-
+
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
+
+
-
+
+
+
-
+
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
+
+
-
+
+
+
|
#include "config.h"
.globl of_forward
.globl of_forward_stret
.section .text
of_forward:
stmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fstmfdd sp!, {d0-d7}
#endif
stmfd sp!, {r0-r4, lr}
ldr r4, sel_forwardingTargetForSelector_$indirect_.L0
.L0:
add r4, pc
bl object_getClass(PLT)
mov r1, r4
bl class_respondsToSelector(PLT)
cmp r0, #0
beq 0f
ldr r0, [sp, #64]
ldr r0, [sp, #0]
mov r1, r4
bl objc_msg_lookup(PLT)
mov r12, r0
ldr r0, [sp, #64]
ldr r0, [sp, #0]
mov r1, r4
ldr r2, [sp, #68]
ldr r2, [sp, #4]
blx r12
cmp r0, #0
beq 0f
ldr r1, [sp, #64]
ldr r1, [sp, #0]
cmp r0, r1
beq 0f
str r0, [sp, #64]
ldr r1, [sp, #68]
str r0, [sp, #0]
ldr r1, [sp, #4]
bl objc_msg_lookup(PLT)
mov r12, r0
fldmfdd sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fldmfdd sp!, {d0-d7}
#endif
bx r12
0:
fldmfdd sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fldmfdd sp!, {d0-d7}
#endif
b of_method_not_found(PLT)
.type of_forward, %function
.size of_forward, .-of_forward
of_forward_stret:
stmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fstmfdd sp!, {d0-d7}
#endif
stmfd sp!, {r0-r4, lr}
ldr r4, sel_forwardingTargetForSelector_$indirect_.L1
.L1:
add r4, pc
mov r0, r1
bl object_getClass(PLT)
mov r1, r4
bl class_respondsToSelector(PLT)
cmp r0, #0
beq 0f
ldr r0, [sp, #68]
ldr r0, [sp, #4]
mov r1, r4
bl objc_msg_lookup(PLT)
mov r12, r0
ldr r0, [sp, #68]
ldr r0, [sp, #4]
mov r1, r4
ldr r2, [sp, #72]
ldr r2, [sp, #8]
blx r12
cmp r0, #0
beq 0f
ldr r1, [sp, #68]
ldr r1, [sp, #4]
cmp r0, r1
beq 0f
str r0, [sp, #68]
ldr r1, [sp, #72]
str r0, [sp, #4]
ldr r1, [sp, #8]
bl objc_msg_lookup_stret(PLT)
mov r12, r0
fldmfdd sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fldmfdd sp!, {d0-d7}
#endif
bx r12
0:
fldmfdd sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
#ifdef HAVE_VFP2
fldmfdd sp!, {d0-d7}
#endif
b of_method_not_found_stret(PLT)
.type of_forward_stret, %function
.size of_forward_stret, .-of_forward_stret
init:
ldr r0, module$indirect_.L2
.L2:
|