* add p cc
[mascara-docs.git] / compilers / pcc / pcc-libs-1.0.0 / csu / darwin / powerpc / crt0.c
blobdd3a41ae12abdd85762bffc965c1649d4489d19a
1 /* $Id: crt0.c,v 1.5 2009/02/14 21:02:58 gmcgarry Exp $ */
2 /*-
3 * Copyright (c) 2008 Gregory McGarry <g.mcgarry@ieee.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include "common.h"
20 void _start(int, char **, char **);
22 char **environ;
23 char *__progname = "";
24 int NXArgc;
25 char **NXArgv;
27 asm(
28 #ifdef DYNAMIC
29 " .text\n"
30 " .symbol_stub\n"
31 " .picsymbol_stub\n"
32 #endif
33 " .text\n"
34 " .globl start\n"
35 " .globl _start\n"
36 " .p2align 2\n"
37 "start:\n"
38 "_start:\n"
39 " mr r26,r1\n"
40 " subi r1,r1,4\n"
41 " clrrwi r1,r1,5\n"
42 " li r0,0\n"
43 " stw r0,0(r1)\n"
44 " stwu r1,-64(r1)\n"
45 " lwz r3,0(r26)\n"
46 " addi r4,r26,4\n"
47 " addi r27,r3,1\n"
48 " slwi r27,r27,2\n"
49 " add r5,r4,r27\n"
50 " bl __start\n"
51 " trap\n"
55 void
56 _start(int argc, char *argv[], char *envp[])
58 char *namep;
60 environ = envp;
61 NXArgc = argc;
62 NXArgv = argv;
64 if ((namep = argv[0]) != NULL) {
65 if ((__progname = _strrchr(namep, '/')) == NULL)
66 __progname = namep;
67 else
68 __progname++;
72 * Initialise hooks inside libc
74 if (mach_init_routine)
75 (*mach_init_routine)();
76 if (_cthread_init_routine)
77 (*_cthread_init_routine)();
79 #ifdef PROFILE
80 atexit(_mcleanup);
81 moninit();
82 #endif
84 atexit(_fini);
85 _init();
87 exit(main(argc, argv, environ));
91 #ifdef DYNAMIC
94 * dylib constructors/destructors
96 asm(
97 " .constructor\n"
98 " .p2align 2\n"
99 " .long __dyld_init\n"
100 " .destructor\n"
101 " .p2align 2\n"
102 " .long __dyld_fini\n"
106 * void _dyld_func_lookup(const char *, void **);
108 * jump to the linker via the pointer in the __dyld section
110 asm(
111 " .text\n"
112 " .p2align 2\n"
113 " .private_extern __dyld_func_lookup\n"
114 "__dyld_func_lookup:\n"
115 " lis r11,ha16(Ldyld_func_lookup)\n"
116 " lwz r11,lo16(Ldyld_func_lookup)(r11)\n"
117 " mtctr r11\n"
118 " bctr\n"
122 * void dyld_stub_binding_helper(void)
124 asm(
125 " .text\n"
126 " .p2align 2\n"
127 " .private_extern dyld_stub_binding_helper\n"
128 "dyld_stub_binding_helper:\n"
129 " lis r12,ha16(Ldyld_lazy_binder)\n"
130 " lwz r12,lo16(Ldyld_lazy_binder)(r12)\n"
131 " mtctr r12\n"
132 " lis r12,ha16(__mh_execute_header)\n"
133 " addi r12,r12,lo16(__mh_execute_header)\n"
134 " bctr\n"
138 * __dyld section
140 asm(
141 " .dyld\n"
142 " .p2align 2\n"
143 "Ldyld_lazy_binder:\n"
144 " .long 0x8fe01000\n"
145 "Ldyld_func_lookup:\n"
146 " .long 0x8fe01008\n"
147 " .long __mh_execute_header\n"
148 " .long _NXArgc\n"
149 " .long _NXArgv\n"
150 " .long _environ\n"
151 " .long ___progname\n"
154 #endif
156 asm("\t.subsections_via_symbols\n");
158 #include "common.c"
160 IDENT("$Id: crt0.c,v 1.5 2009/02/14 21:02:58 gmcgarry Exp $");