ObjFW  Diff

Differences From Artifact [6c4a8f6d7c]:

To Artifact [65ed1dc5ee]:


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







+
+








-
-
-
+
+
+

-
-
+
+


-
+


-
-
+
+

-
-
-
-
+
+
+
+

-
-
+
+






-
-
-
+
+
+






-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+












-
+



-
+



-
+





 * file.
 */

#include "config.h"

#include "platform.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 not_found
\name:
	movl	4(%esp), %edx
	testl	%edx, %edx
	jz	ret_nil
	mov	edx, [esp+4]
	test	edx, edx
	jz	short ret_nil

	movl	(%edx), %edx
	movl	32(%edx), %edx
	mov	edx, [edx]
	mov	edx, [edx+32]

.Lmain_\name:
	movl	8(%esp), %eax
	mov	eax, [esp+8]

#ifdef OF_SELUID24
	movzbl	2(%eax), %ecx
	movl	(%edx,%ecx,4), %edx
	movzx	ecx, byte ptr [eax+2]
	mov	edx, [edx+ecx*4]
#endif
	movzbl	1(%eax), %ecx
	movl	(%edx,%ecx,4), %edx
	movzbl	(%eax), %ecx
	movl	(%edx,%ecx,4), %eax
	movzx	ecx, byte ptr [eax+1]
	mov	edx, [edx+ecx*4]
	movzx	ecx, byte ptr [eax]
	mov	eax, [edx+ecx*4]

	testl	%eax, %eax
	jz	0f
	test	eax, eax
	jz	short 0f

	ret

0:
	call	get_eip
1:
	addl	$_GLOBAL_OFFSET_TABLE_, %eax
	movl	\not_found@GOT(%eax), %eax
	jmp	*%eax
	add	eax, offset _GLOBAL_OFFSET_TABLE_
	mov	eax, [eax+\not_found@GOT]
	jmp	eax
.type \name, %function
.size \name, .-\name
.endm

.macro generate_lookup_super name lookup
\name:
	movl	4(%esp), %edx
	movl	(%edx), %eax
	cmpl	$0, %eax
	je	ret_nil
	mov	edx, [esp+4]
	mov	eax, [edx]
	test	eax, eax
	jz	short ret_nil

	movl	%eax, 4(%esp)
	movl	4(%edx), %edx
	movl	32(%edx), %edx
	jmp	.Lmain_\lookup
	mov	[esp+4], eax
	mov	edx, [edx+4]
	mov	edx, [edx+32]
	jmp	short .Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm

generate_lookup objc_msg_lookup objc_method_not_found
generate_lookup objc_msg_lookup_stret objc_method_not_found_stret
generate_lookup_super objc_msg_lookup_super objc_msg_lookup
generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret

ret_nil:
	call	get_eip
0:
	addl	$nil_method-0b, %eax
	add	eax, nil_method-0b
	ret

nil_method:
	xorl	%eax, %eax
	xor	eax, eax
	ret

get_eip:
	movl	(%esp), %eax
	mov	eax, [esp]
	ret

#ifdef OF_LINUX
.section .note.GNU-stack, "", %progbits
#endif