ObjFW  Diff

Differences From Artifact [ae09f773a9]:

To Artifact [66e90d878f]:


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







+
+





-
-
+
+


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



-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
+
+

-
-
+
+








-
-
+
+


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

-
+


-
-
+
+


-
-
+
+

-
-
+
+


-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
-
+
+

-
+


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

-
-
+
+

-
+


-
-
-
+
+
+

-
-
+
+








-
+







 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

.intel_syntax noprefix

.globl OFForward
.globl OFForward_stret

.section .text
OFForward:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0x90, %rsp	/* 16-byte alignment */
	movq	%rax, -0x28(%rbp)
	movq	%rcx, -0x30(%rbp)
	movq	%rdx, -0x38(%rbp)
	movq	%r8, -0x40(%rbp)
	movq	%r9, -0x48(%rbp)
	movaps	%xmm0, -0x60(%rbp)
	movaps	%xmm1, -0x70(%rbp)
	movaps	%xmm2, -0x80(%rbp)
	movaps	%xmm3, -0x90(%rbp)
	sub	rsp, 0x90	/* 16-byte alignment */
	mov	[rbp - 0x28], rax
	mov	[rbp - 0x30], rcx
	mov	[rbp - 0x38], rdx
	mov	[rbp - 0x40], r8
	mov	[rbp - 0x48], r9
	movaps	[rbp - 0x60], xmm0
	movaps	[rbp - 0x70], xmm1
	movaps	[rbp - 0x80], xmm2
	movaps	[rbp - 0x90], xmm3

	call	object_getClass

	movq	%rax, %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	mov	rcx, rax
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	call	class_respondsToSelector

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

	movq	-0x30(%rbp), %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	call	objc_msg_lookup

	movq	-0x30(%rbp), %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	movq	-0x38(%rbp), %r8
	call	*%rax
	mov	rcx, [rbp - 0x30]
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x38]
	call	rax

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

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

	movq	%rax, %rcx
	movq	-0x38(%rbp), %rdx
	mov	rcx, rax
	mov	rdx, [rbp - 0x38]
	call	objc_msg_lookup
	movq	%rax, %r11
	mov	r11, rax

	/* Restore all arguments */
	movaps	-0x90(%rbp), %xmm3
	movaps	-0x80(%rbp), %xmm2
	movaps	-0x70(%rbp), %xmm1
	movaps	-0x60(%rbp), %xmm0
	movq	-0x48(%rbp), %r9
	movq	-0x40(%rbp), %r8
	movq	-0x38(%rbp), %rdx
	movq	-0x30(%rbp), %rcx
	movq	-0x28(%rbp), %rax
	movaps	xmm3, [rbp - 0x90]
	movaps	xmm2, [rbp - 0x80]
	movaps	xmm1, [rbp - 0x70]
	movaps	xmm0, [rbp - 0x60]
	mov	r9, [rbp - 0x48]
	mov	r8, [rbp - 0x40]
	mov	rdx, [rbp - 0x38]
	mov	rcx, [rbp - 0x30]
	mov	rax, [rbp - 0x28]

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

	jmpq	*%r11
	jmp	r11

0:
	movq	-0x30(%rbp), %rcx
	movq	-0x38(%rbp), %rdx
	mov	rcx, [rbp - 0x30]
	mov	rdx, [rbp - 0x38]

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

	jmp	OFMethodNotFound
.def OFForward
.scl 2
.type 32
.endef

OFForward_stret:
	pushq	%rbp
	movq	%rsp, %rbp
	push	rbp
	mov	rbp, rsp

	/* Save all arguments */
	subq	$0x90, %rsp	/* 16-byte alignment */
	movq	%rax, -0x28(%rbp)
	movq	%rcx, -0x30(%rbp)
	movq	%rdx, -0x38(%rbp)
	movq	%r8, -0x40(%rbp)
	movq	%r9, -0x48(%rbp)
	movaps	%xmm0, -0x60(%rbp)
	movaps	%xmm1, -0x70(%rbp)
	movaps	%xmm2, -0x80(%rbp)
	movaps	%xmm3, -0x90(%rbp)
	sub	rsp, 0x90	/* 16-byte alignment */
	mov	[rbp - 0x28], rax
	mov	[rbp - 0x30], rcx
	mov	[rbp - 0x38], rdx
	mov	[rbp - 0x40], r8
	mov	[rbp - 0x48], r9
	movaps	[rbp - 0x60], xmm0
	movaps	[rbp - 0x70], xmm1
	movaps	[rbp - 0x80], xmm2
	movaps	[rbp - 0x90], xmm3

	movq	%rdx, %rcx
	mov	rcx, rdx
	call	object_getClass

	movq	%rax, %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	mov	rcx, rax
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	call	class_respondsToSelector

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

	movq	-0x38(%rbp), %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	call	objc_msg_lookup

	movq	-0x38(%rbp), %rcx
	leaq	sel_forwardingTargetForSelector_(%rip), %rdx
	movq	-0x40(%rbp), %r8
	call	*%rax
	mov	rcx, [rbp - 0x38]
	lea	rdx, [rip + sel_forwardingTargetForSelector_]
	mov	r8, [rbp - 0x40]
	call	rax

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

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

	movq	%rax, %rcx
	movq	-0x40(%rbp), %rdx
	mov	rcx, rax
	mov	rdx, [rbp - 0x40]
	call	objc_msg_lookup_stret
	movq	%rax, %r11
	mov	r11, rax

	/* Restore all arguments */
	movaps	-0x90(%rbp), %xmm3
	movaps	-0x80(%rbp), %xmm2
	movaps	-0x70(%rbp), %xmm1
	movaps	-0x60(%rbp), %xmm0
	movq	-0x48(%rbp), %r9
	movq	-0x40(%rbp), %r8
	movq	-0x38(%rbp), %rdx
	movq	-0x30(%rbp), %rcx
	movq	-0x28(%rbp), %rax
	movaps	xmm3, [rbp - 0x90]
	movaps	xmm2, [rbp - 0x80]
	movaps	xmm1, [rbp - 0x70]
	movaps	xmm0, [rbp - 0x60]
	mov	r9, [rbp - 0x48]
	mov	r8, [rbp - 0x40]
	mov	rdx, [rbp - 0x38]
	mov	rcx, [rbp - 0x30]
	mov	rax, [rbp - 0x28]

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

	jmpq	*%r11
	jmp	r11

0:
	movq	-0x30(%rbp), %rcx
	movq	-0x38(%rbp), %rdx
	movq	-0x40(%rbp), %r8
	mov	rcx, [rbp - 0x30]
	mov	rdx, [rbp - 0x38]
	mov	r8, [rbp - 0x40]

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

	jmp	OFMethodNotFound_stret
.def OFForward_stret
.scl 2
.type 32
.endef

init:
	leaq	module(%rip), %rcx
	lea	rcx, [rip + module]
	jmp	__objc_exec_class

.section .ctors, "aw"
	.quad init

.section .rodata
str_forwardingTargetForSelector_: