ObjFW  Diff

Differences From Artifact [197daf8bf7]:

To Artifact [029772cbfe]:


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


205
206
207
208
209

210
211
212
213
214
215
216
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







-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-


-
-
+
+


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



-
-
+
+


-
+


-
-
+
+


-
-
-
+
+
+


-
+

-
+


-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
+
+

-
-
+
+




-
-
+
+


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

-
+


-
-
+
+


-
+


-
-
+
+


-
-
-
+
+
+


-
+

-
+


-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+




-
+







#include "config.h"

#include "platform.h"

.globl _OFForward
.globl _OFForward_stret

.intel_syntax noprefix

/* Work around assembler bugs. */
.macro call
	.att_syntax
	/* Use uppercase instruction to avoid recursion. */
	CALL	$0
	.intel_syntax noprefix
.endmacro
.macro jmp
	.att_syntax
	/* Use uppercase instruction to avoid recursion. */
	JMP	$0
	.intel_syntax noprefix
.endmacro

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

	/* Save all arguments */
	sub	rsp, 0xC0	/* 16-byte alignment */
	movq	[rbp - 0x08], rax
	movq	[rbp - 0x10], rdi
	movq	[rbp - 0x18], rsi
	movq	[rbp - 0x20], rdx
	movq	[rbp - 0x28], rcx
	movq	[rbp - 0x30], r8
	movq	[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
	movaps	[rbp - 0xC0], xmm7
	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)

	call	_object_getClass

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

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

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

	movq	rdi, [rbp - 0x10]
	leaq	rsi, [rip + Lsel_forwardingTargetForSelector_]
	movq	rdx, [rbp - 0x18]
	movq	-0x10(%rbp), %rdi
	leaq	Lsel_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	_OFMethodNotFound

_OFForward_stret:
	push	rbp
	mov	rbp, rsp
	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
	movaps	[rbp - 0xC0], xmm7
	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)

	mov	rdi, rsi
	movq	%rsi, %rdi
	call	_object_getClass

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

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

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

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

	test	rax, rax
	testq	%rax, %rax
	jz	0f
	cmp	rax, [rbp - 0x18]
	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]
	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]
	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	_OFMethodNotFound_stret

Linit:
	lea	rdi, [rip + Lmodule]
	leaq	Lmodule(%rip), %rdi
	jmp	___objc_exec_class

.section __DATA, __mod_init_func, mod_init_funcs
	.quad Linit

.section __TEXT, __cstring, cstring_literals
Lstr_forwardingTargetForSelector_: