ObjFW  Diff

Differences From Artifact [d39aa9c238]:

To Artifact [96ab2eb2d0]:


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
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
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
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







-
-
-
-
+
+


-
-
-
+
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-



-
-
+
+


-
+


-
-
+
+


-
-
-
-
+
+
+
+

-
+

-
+


-
+

-
-
+
+

-
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+

-
+


-
-
+
+

-
-
+
+

-
+

-
-
-
+
+
+


-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+


-
-
+
+


-
+


-
-
+
+


-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+

-
-
+
+

-
+


-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+

-
+


-
+







 * file.
 */

#include "config.h"

#include "platform.h"

.intel_syntax noprefix

.globl _of_forward
.globl _of_forward_stret
.globl _OFForward
.globl _OFForward_stret

.section __TEXT, __text, regular, pure_instructions
_of_forward:
	push	rbp
	mov	rbp, rsp
_OFForward:
	pushq	%rbp
	movq	%rsp, %rbp

	/* Save all arguments */
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	%xmm7, -0xC0(%rbp)
	movaps	[rbp-0xC0], xmm7

	call	_object_getClass

	mov	rdi, rax
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	movq	%rax, %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	call	_class_respondsToSelector

	test	rax, rax
	testq	%rax, %rax
	jz	0f

	mov	rdi, [rbp-0x10]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	movq	-0x10(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	call	_objc_msg_lookup

	mov	rdi, [rbp-0x10]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x18]
	call	rax
	movq	-0x10(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x18(%rbp), %rdx
	call	*%rax

	test	rax, rax
	testq	%rax, %rax
	jz	0f
	cmp	rax, [rbp-0x10]
	cmpq	-0x10(%rbp), %rax
	je	0f

	mov	[rbp-0x10], rax
	movq	%rax, -0x10(%rbp)

	mov	rdi, rax
	mov	rsi, [rbp-0x18]
	movq	%rax, %rdi
	movq	-0x18(%rbp), %rsi
	call	_objc_msg_lookup
	mov	r11, rax
	movq	%rax, %r11

	/* Restore all arguments */
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	mov	rdx,  [rbp-0x20]
	mov	rsi,  [rbp-0x18]
	mov	rdi,  [rbp-0x10]
	mov	rax,  [rbp-0x08]
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	movq	-0x20(%rbp), %rdx
	movq	-0x18(%rbp), %rsi
	movq	-0x10(%rbp), %rdi
	movq	-0x8(%rbp), %rax

	mov	rsp, rbp
	pop	rbp
	movq	%rbp, %rsp
	popq	%rbp

	jmp	r11
	jmpq	*%r11

0:
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi

	mov	rsp, rbp
	pop	rbp
	movq	%rbp, %rsp
	popq	%rbp

	jmp	_of_method_not_found
	jmp	_OFMethodNotFound

_of_forward_stret:
	push	rbp
	mov	rbp, rsp
_OFForward_stret:
	pushq	%rbp
	movq	%rsp, %rbp

	/* Save all arguments */
	sub	rsp, 0xC0	/* 16-byte alignment */
	mov	[rbp-0x08], rax
	mov	[rbp-0x10], rdi
	mov	[rbp-0x18], rsi
	mov	[rbp-0x20], rdx
	mov	[rbp-0x28], rcx
	mov	[rbp-0x30], r8
	mov	[rbp-0x38], r9
	movaps	[rbp-0x50], xmm0
	movaps	[rbp-0x60], xmm1
	movaps	[rbp-0x70], xmm2
	movaps	[rbp-0x80], xmm3
	movaps	[rbp-0x90], xmm4
	movaps	[rbp-0xA0], xmm5
	movaps	[rbp-0xB0], xmm6
	subq	$0xC0, %rsp	/* 16-byte alignment */
	movq	%rax, -0x8(%rbp)
	movq	%rdi, -0x10(%rbp)
	movq	%rsi, -0x18(%rbp)
	movq	%rdx, -0x20(%rbp)
	movq	%rcx, -0x28(%rbp)
	movq	%r8, -0x30(%rbp)
	movq	%r9, -0x38(%rbp)
	movaps	%xmm0, -0x50(%rbp)
	movaps	%xmm1, -0x60(%rbp)
	movaps	%xmm2, -0x70(%rbp)
	movaps	%xmm3, -0x80(%rbp)
	movaps	%xmm4, -0x90(%rbp)
	movaps	%xmm5, -0xA0(%rbp)
	movaps	%xmm6, -0xB0(%rbp)
	movaps	[rbp-0xC0], xmm7

	mov	rdi, rsi
	movaps	%xmm7, -0xC0(%rbp)

	movq	%rsi, %rdi
	call	_object_getClass

	mov	rdi, rax
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	movq	%rax, %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	call	_class_respondsToSelector

	test	rax, rax
	testq	%rax, %rax
	jz	0f

	mov	rdi, [rbp-0x18]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	movq	-0x18(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	call	_objc_msg_lookup

	mov	rdi, [rbp-0x18]
	lea	rsi, [rip+sel_forwardingTargetForSelector_]
	mov	rdx, [rbp-0x20]
	call	rax
	movq	-0x18(%rbp), %rdi
	leaq	sel_forwardingTargetForSelector_(%rip), %rsi
	movq	-0x20(%rbp), %rdx
	call	*%rax

	test	rax, rax
	testq	%rax, %rax
	jz	0f
	cmp	rax, [rbp-0x18]
	je	0f
	cmpq	-0x18(%rbp), %rax
	je	0f

	mov	[rbp-0x18], rax
	movq	%rax, -0x18(%rbp)

	mov	rdi, rax
	mov	rsi, [rbp-0x20]
	movq	%rax, %rdi
	movq	-0x20(%rbp), %rsi
	call	_objc_msg_lookup_stret
	mov	r11, rax
	movq	%rax, %r11

	/* Restore all arguments */
	movaps	xmm7, [rbp-0xC0]
	movaps	xmm6, [rbp-0xB0]
	movaps	xmm5, [rbp-0xA0]
	movaps	xmm4, [rbp-0x90]
	movaps	xmm3, [rbp-0x80]
	movaps	xmm2, [rbp-0x70]
	movaps	xmm1, [rbp-0x60]
	movaps	xmm0, [rbp-0x50]
	mov	r9,   [rbp-0x38]
	mov	r8,   [rbp-0x30]
	mov	rcx,  [rbp-0x28]
	movaps	-0xC0(%rbp), %xmm7
	movaps	-0xB0(%rbp), %xmm6
	movaps	-0xA0(%rbp), %xmm5
	movaps	-0x90(%rbp), %xmm4
	movaps	-0x80(%rbp), %xmm3
	movaps	-0x70(%rbp), %xmm2
	movaps	-0x60(%rbp), %xmm1
	movaps	-0x50(%rbp), %xmm0
	movq	-0x38(%rbp), %r9
	movq	-0x30(%rbp), %r8
	movq	-0x28(%rbp), %rcx
	mov	rdx,  [rbp-0x20]
	mov	rsi,  [rbp-0x18]
	mov	rdi,  [rbp-0x10]
	mov	rax,  [rbp-0x08]
	movq	-0x20(%rbp), %rdx
	movq	-0x18(%rbp), %rsi
	movq	-0x10(%rbp), %rdi
	movq	-0x8(%rbp), %rax

	mov	rsp, rbp
	pop	rbp
	movq	%rbp, %rsp
	popq	%rbp

	jmp	r11
	jmpq	*%r11

0:
	mov	rdi, [rbp-0x10]
	mov	rsi, [rbp-0x18]
	mov	rdx, [rbp-0x20]
	movq	-0x10(%rbp), %rdi
	movq	-0x18(%rbp), %rsi
	movq	-0x20(%rbp), %rdx

	mov	rsp, rbp
	pop	rbp
	movq	%rbp, %rsp
	popq	%rbp

	jmp	_of_method_not_found_stret
	jmp	_OFMethodNotFound_stret

init:
	lea	rdi, [rip+module]
	leaq	module(%rip), %rdi
	jmp	___objc_exec_class

.section __DATA, __mod_init_func, mod_init_funcs
	.quad init

.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_: