summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/alpha/init-first.h
blob: a3f5d8f0c4e62e40268d35d1799e7bc6a0f8dc31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* The job of this fragment it to find argc and friends for INIT.
   This is done in one of two ways: either in the stack context
   of program start, or having dlopen pass them in.  */

#define SYSDEP_CALL_INIT(NAME, INIT) asm("\
	.weak _dl_starting_up
	.globl " #NAME "
	.ent " #NAME "
" #NAME ":
	ldgp	$29, 0($27)
	.prologue 1
	.set at
	/* Are we a dynamic libc being loaded into a static program?  */
	lda	$0, _dl_starting_up
	beq	$0, 1f
	ldl	$0, 0($0)
	cmpeq	$31, $0, $0
1:	stl	$0, __libc_multiple_libcs
	/* If so, argc et al are in a0-a2 already.  Otherwise, load them.  */
	bne	$0, 2f
	ldl	$16, 0($30)
	lda	$17, 8($30)
	s8addq	$16, $17, $18
	addq	$18, 8, $18
2:	br $31, " ASM_ALPHA_NG_SYMBOL_PREFIX #INIT "..ng
	.set noat
	.end " #NAME);