ObjFW  Diff

Differences From Artifact [13eae8467e]:

To Artifact [56a0df9bbf]:


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







+
+








-
-
+
+

-
-
+
+

-
-
+
+


-
-
+
+

-
-
-
+
+
+

-
+

-
+

-
-
+
+

-
-
+
+




-
-
-
+
+
+


-
-
-
+
+
+

-
-
-
+
+
+

-
+








-
-
-
-
+
+
+
+

-
-
-
+
+
+












-
+



-
+

 * 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 objc_msg_lookup
.globl objc_msg_lookup_stret
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret

.section .text
.macro GENERATE_LOOKUP name notFound
\name:
	testq	%rcx, %rcx
	jz	returnNilMethod
	test	rcx, rcx
	jz	short returnNilMethod

	testb	$1, %cl
	jnz	.LtaggedPointer_\name
	test	cl, 1
	jnz	short .LtaggedPointer_\name

	movq	(%rcx), %r8
	movq	56(%r8), %r8
	mov	r8, [rcx]
	mov	r8, [r8 + 56]

.Lmain_\name:
	movq	%rcx, %r10
	movq	%rdx, %r11
	mov	r10, rcx
	mov	r11, rdx

	movq	(%rdx), %rax
	movzbl	%ah, %ecx
	movzbl	%al, %edx
	mov	rax, [rdx]
	movzx	ecx, ah
	movzx	edx, al
#ifdef OF_SELUID24
	shrl	$16, %eax
	shr	eax, 16

	movq	(%r8,%rax,8), %r8
	mov	r8, [r8 + 8 * rax]
#endif
	movq	(%r8,%rcx,8), %r8
	movq	(%r8,%rdx,8), %rax
	mov	r8, [r8 + 8 * rcx]
	mov	rax, [r8 + 8 * rdx]

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

	ret

0:
	movq	%r10, %rcx
	movq	%r11, %rdx
	jmp	\notFound
	mov	rcx, r10
	mov	rdx, r11
	jmp	short \notFound

.LtaggedPointer_\name:
	xorq	objc_taggedPointerSecret(%rip), %rcx
	andb	$0xE, %cl
	movzbl	%cl, %r8d
	xor	rcx, [rip + objc_taggedPointerSecret]
	and	cl, 0xE
	movzx	r8d, cl

	leaq	objc_taggedPointerClasses(%rip), %rax
	movq	(%rax,%r8,4), %r8
	movq	56(%r8), %r8
	lea	rax, [rip + objc_taggedPointerClasses]
	mov	r8, [rax + 4 * r8]
	mov	r8, [r8 + 56]

	jmp	.Lmain_\name
	jmp	short .Lmain_\name
.def \name
.scl 2
.type 32
.endef
.endm

.macro GENERATE_LOOKUP_SUPER name lookup
\name:
	movq	%rcx, %r8
	movq	(%rcx), %rcx
	testq	%rcx, %rcx
	jz	returnNilMethod
	mov	r8, rcx
	mov	rcx, [rcx]
	test	rcx, rcx
	jz	short returnNilMethod

	movq	8(%r8), %r8
	movq	56(%r8), %r8
	jmp	.Lmain_\lookup
	mov	r8, [r8 + 8]
	mov	r8, [r8 + 56]
	jmp	short .Lmain_\lookup
.def \name
.scl 2
.type 32
.endef
.endm

GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret

returnNilMethod:
	leaq	nilMethod(%rip), %rax
	lea	rax, [rip + nilMethod]
	ret

nilMethod:
	xorq	%rax, %rax
	xor	rax, rax
	ret