Add Go frontend, libgo library, and Go testsuite.
[gcc.git] / libgo / runtime / go-main.c
1 /* go-main.c -- the main function for a Go program.
2
3 Copyright 2009 The Go Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file. */
6
7 #include "config.h"
8
9 #include <stdlib.h>
10 #include <time.h>
11
12 #ifdef HAVE_FPU_CONTROL_H
13 #include <fpu_control.h>
14 #endif
15
16 #include "go-alloc.h"
17 #include "array.h"
18 #include "go-signal.h"
19 #include "go-string.h"
20
21 #include "runtime.h"
22 #include "malloc.h"
23
24 #undef int
25 #undef char
26 #undef unsigned
27
28 /* The main function for a Go program. This records the command line
29 parameters, calls the real main function, and returns a zero status
30 if the real main function returns. */
31
32 extern char **environ;
33
34 extern struct __go_open_array Args asm ("libgo_os.os.Args");
35
36 extern struct __go_open_array Envs asm ("libgo_os.os.Envs");
37
38 /* These functions are created for the main package. */
39 extern void __go_init_main (void);
40 extern void real_main (void) asm ("main.main");
41
42 /* The main function. */
43
44 int
45 main (int argc, char **argv)
46 {
47 int i;
48 struct __go_string *values;
49
50 runtime_mallocinit ();
51 __go_gc_goroutine_init (&argc);
52
53 Args.__count = argc;
54 Args.__capacity = argc;
55 values = __go_alloc (argc * sizeof (struct __go_string));
56 for (i = 0; i < argc; ++i)
57 {
58 values[i].__data = (unsigned char *) argv[i];
59 values[i].__length = __builtin_strlen (argv[i]);
60 }
61 Args.__values = values;
62
63 for (i = 0; environ[i] != NULL; ++i)
64 ;
65 Envs.__count = i;
66 Envs.__capacity = i;
67 values = __go_alloc (i * sizeof (struct __go_string));
68 for (i = 0; environ[i] != NULL; ++i)
69 {
70 values[i].__data = (unsigned char *) environ[i];
71 values[i].__length = __builtin_strlen (environ[i]);
72 }
73 Envs.__values = values;
74
75 __initsig ();
76
77 #if defined(HAVE_SRANDOM)
78 srandom ((unsigned int) time (NULL));
79 #else
80 srand ((unsigned int) time (NULL));
81 #endif
82 __go_init_main ();
83
84 __go_enable_gc ();
85
86 real_main ();
87
88 return 0;
89 }