Mercurial > hg > tinycc
annotate options.c @ 554:8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
(This means i386-tinycc can once again rebuild itself without segfaulting.)
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 06 Mar 2008 20:53:55 -0600 |
parents | 11d95002dfe1 |
children | 646f1f0972b6 |
rev | line source |
---|---|
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * options.c - Option parsing logic for tinycc |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright (c) 2001-2004 Fabrice Bellard |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * Copyright (c) 2006-2007 Rob Landley |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 * Licensed under GPLv2, see file LICENSE in this tarball |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
10 #include "tinycc.h" |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 int do_bounds_check = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 int do_debug = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 int next_tok_flags; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 // Benchmark info |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 int do_bench = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 int total_lines; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 int total_bytes; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 int tok_ident; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 // inlines |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 int is_space(int ch); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 #define WD_ALL 0x0001 /* warning is activated when using -Wall */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 #define FD_INVERT 0x0002 /* invert value before storing */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 typedef struct FlagDef { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
30 //uint16_t offset; |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
31 int *var; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 uint16_t flags; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 char *name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 } FlagDef; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
36 // was { offsetof(TCCState, warn_unsupported), 0, "unsupported" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
37 |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 static FlagDef warning_defs[] = { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
39 { &tccg_warn_unsupported, 0, "unsupported" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
40 { &tccg_warn_write_strings, 0, "write-strings" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
41 { &tccg_warn_error, 0, "error" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
42 { &tccg_warn_implicit_function_declaration, WD_ALL, |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 "implicit-function-declaration" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 static int set_flag(TCCState *s, FlagDef *flags, int nb_flags, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 char *name, int value) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 FlagDef *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 char *r; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 r = name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 if (r[0] == 'n' && r[1] == 'o' && r[2] == '-') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 r += 3; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 value = !value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 for(i = 0, p = flags; i < nb_flags; i++, p++) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 if (!strcmp(r, p->name)) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 goto found; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 return -1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 found: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 if (p->flags & FD_INVERT) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 value = !value; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
66 //*(int *)((uint8_t *)s + p->offset) = value; |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
67 *p->var = value; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 /* set/reset a warning */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 int tcc_set_warning(TCCState *s, char *warning_name, int value) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 FlagDef *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 if (!strcmp(warning_name, "all")) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 for(i = 0, p = warning_defs; i < countof(warning_defs); i++, p++) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 if (p->flags & WD_ALL) |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
80 // *(int *)((uint8_t *)s + p->offset) = 1; |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
81 *p->var = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 return set_flag(s, warning_defs, countof(warning_defs), |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 warning_name, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 static FlagDef flag_defs[] = { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
91 { &tccg_char_is_unsigned, 0, "unsigned-char" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
92 { &tccg_char_is_unsigned, FD_INVERT, "signed-char" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
93 { &tccg_nocommon, FD_INVERT, "common" }, |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
94 { &tccg_leading_underscore, 0, "leading-underscore" }, |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 /* set/reset a flag */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 int tcc_set_flag(TCCState *s, char *flag_name, int value) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 return set_flag(s, flag_defs, countof(flag_defs), |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 flag_name, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 /* extract the basename of a file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 static char *tcc_basename(char *name) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 char *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 p = strrchr(name, '/'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 if (!p) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 p = strrchr(name, '\\'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 if (!p) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 p = name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 p++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 return p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 #if !defined(LIBTCC) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 static int64_t getclock_us(void) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 struct _timeb tb; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 _ftime(&tb); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 return (tb.time * 1000LL + tb.millitm) * 1000LL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 #else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 struct timeval tv; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 gettimeofday(&tv, NULL); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 return tv.tv_sec * 1000000LL + tv.tv_usec; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 void show_version(void) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 printf("tinycc version " TINYCC_VERSION "\n"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 void help(TCCState *s) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 show_version(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 printf("Tiny C Compiler - Copyright (C) 2001-2006 Fabrice Bellard, 2007 Rob Landley\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 "usage: tcc [-v] [-c] [-o outfile] [-Bdir] [-bench] [-Idir] [-Dsym[=val]] [-Usym]\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 " [-Wwarn] [-g] [-b] [-bt N] [-Ldir] [-llib] [-shared] [-static]\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 " [infile1 infile2...] [-run infile args...]\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 "\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 "General options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 " -v Verbose compile, repeat for more verbosity\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 " -c compile only - generate an object file\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 " -o outfile set output filename\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 " -Bdir set tcc internal library path\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 " -bench output compilation statistics\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 " -run run compiled source\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 " -fflag set or reset (with 'no-' prefix) 'flag' (see man page)\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 " -Wwarning set or reset (with 'no-' prefix) 'warning' (see man page)\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 " -w disable all warnings\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 "Preprocessor options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 " -Idir add include path 'dir'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 " -Dsym[=val] define 'sym' with value 'val'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 " -Usym undefine 'sym'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 " -E preprocess only\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 "Linker options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 " -Ldir add library path 'dir'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 " -llib link with dynamic or static library 'lib'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 " -shared generate a shared library\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 " -static static linking\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 " -rdynamic export all global symbols to dynamic linker\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 " -r output relocatable .o file\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 "Debugger options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 " -g generate runtime debug info\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 " -b compile with built-in memory and bounds checker (implies -g)\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 ); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 #define TCC_OPTION_HAS_ARG 0x0001 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 #define TCC_OPTION_NOSEP 0x0002 /* cannot have space before option and arg */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 typedef struct TCCOption { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 char *name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 uint16_t index; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 uint16_t flags; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 } TCCOption; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 enum { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 TCC_OPTION_HELP, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 TCC_OPTION_I, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 TCC_OPTION_D, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 TCC_OPTION_E, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 TCC_OPTION_U, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 TCC_OPTION_L, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 TCC_OPTION_B, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 TCC_OPTION_l, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 TCC_OPTION_bench, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 TCC_OPTION_b, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 TCC_OPTION_g, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 TCC_OPTION_c, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 TCC_OPTION_static, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 TCC_OPTION_shared, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 TCC_OPTION_o, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 TCC_OPTION_r, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 TCC_OPTION_Wl, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 TCC_OPTION_W, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 TCC_OPTION_O, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 TCC_OPTION_m, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 TCC_OPTION_f, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 TCC_OPTION_nostdinc, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 TCC_OPTION_nostdlib, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 TCC_OPTION_print_search_dirs, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 TCC_OPTION_rdynamic, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 TCC_OPTION_run, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 TCC_OPTION_v, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 TCC_OPTION_w, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 TCC_OPTION_pipe, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 static TCCOption tcc_options[] = { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 { "h", TCC_OPTION_HELP, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 { "?", TCC_OPTION_HELP, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 { "I", TCC_OPTION_I, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 { "D", TCC_OPTION_D, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 { "E", TCC_OPTION_E, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 { "U", TCC_OPTION_U, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 { "L", TCC_OPTION_L, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 { "B", TCC_OPTION_B, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 { "l", TCC_OPTION_l, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 { "bench", TCC_OPTION_bench, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 { "b", TCC_OPTION_b, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 { "g", TCC_OPTION_g, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 { "c", TCC_OPTION_c, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 { "static", TCC_OPTION_static, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 { "shared", TCC_OPTION_shared, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 { "o", TCC_OPTION_o, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 { "run", TCC_OPTION_run, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 { "rdynamic", TCC_OPTION_rdynamic, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 { "r", TCC_OPTION_r, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 { "Wl,", TCC_OPTION_Wl, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 { "W", TCC_OPTION_W, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 { "O", TCC_OPTION_O, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 { "m", TCC_OPTION_m, TCC_OPTION_HAS_ARG }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 { "f", TCC_OPTION_f, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 { "nostdinc", TCC_OPTION_nostdinc, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 { "nostdlib", TCC_OPTION_nostdlib, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 { "print-search-dirs", TCC_OPTION_print_search_dirs, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 { "v", TCC_OPTION_v, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 { "w", TCC_OPTION_w, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 { "pipe", TCC_OPTION_pipe, 0}, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 { NULL }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 /* convert 'str' into an array of space separated strings */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 static int expand_args(char ***pargv, char *str) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 char *s1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 char **argv, *arg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 int argc, len; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 argc = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 argv = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 for(;;) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 while (is_space(*str)) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 str++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 if (*str == '\0') |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 s1 = str; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 while (*str != '\0' && !is_space(*str)) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 str++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 len = str - s1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 arg = xmalloc(len + 1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 memcpy(arg, s1, len); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 arg[len] = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 dynarray_add((void ***)&argv, &argc, arg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 *pargv = argv; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 return argc; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 static char **files; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 static int nb_files, nb_libraries; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 static int multiple_files; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 static int print_search_dirs; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 static int reloc_output; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 static char *outfile; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 int parse_args(TCCState *s, int argc, char **argv) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 int optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 TCCOption *popt; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 char *optarg, *p1, *r1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 char *r; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 optind = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 while (1) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 if (optind >= argc) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 if (nb_files == 0 && !print_search_dirs) { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
300 if (!tccg_verbose) help(s); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 } else break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 r = argv[optind++]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 if (r[0] != '-') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 /* add a new file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 dynarray_add((void ***)&files, &nb_files, r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 if (!multiple_files) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 optind--; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 /* argv[0] will be this file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 /* find option in table (match only the first chars */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 popt = tcc_options; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 for(;;) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 p1 = popt->name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 if (p1 == NULL) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 error("invalid option -- '%s'", r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 r1 = r + 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 for(;;) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 if (*p1 == '\0') |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 goto option_found; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 if (*r1 != *p1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 p1++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 r1++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 popt++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 option_found: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 if (popt->flags & TCC_OPTION_HAS_ARG) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 if (*r1 != '\0' || (popt->flags & TCC_OPTION_NOSEP)) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 optarg = r1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 if (optind >= argc) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 error("argument to '%s' is missing", r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 optarg = argv[optind++]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 if (*r1 != '\0') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 help(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 optarg = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 switch(popt->index) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 case TCC_OPTION_HELP: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 help(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 case TCC_OPTION_I: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
353 add_dynarray_path(s, optarg, &tccg_include_paths); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 case TCC_OPTION_D: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 char *sym, *value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 sym = (char *)optarg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 value = strchr(sym, '='); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 if (value) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 *value = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 value++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 tcc_define_symbol(s, sym, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 case TCC_OPTION_E: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
368 tccg_output_type = TCC_OUTPUT_PREPROCESS; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 case TCC_OPTION_U: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 tcc_undefine_symbol(s, optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 case TCC_OPTION_L: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
374 add_dynarray_path(s, optarg, &tccg_library_paths); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 case TCC_OPTION_B: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 /* set tcc utilities path (mainly for tcc development) */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 tinycc_path = optarg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 case TCC_OPTION_l: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 dynarray_add((void ***)&files, &nb_files, r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 nb_libraries++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 case TCC_OPTION_bench: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 do_bench = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 case TCC_OPTION_b: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 do_bounds_check = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 do_debug = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 case TCC_OPTION_g: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 do_debug = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 case TCC_OPTION_c: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 multiple_files = 1; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
398 tccg_output_type = TCC_OUTPUT_OBJ; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 case TCC_OPTION_static: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
401 tccg_static_link = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 case TCC_OPTION_shared: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
404 tccg_output_type = TCC_OUTPUT_DLL; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 case TCC_OPTION_o: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 multiple_files = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 outfile = optarg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 case TCC_OPTION_r: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 /* generate a .o merging several output files */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 reloc_output = 1; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
413 tccg_output_type = TCC_OUTPUT_OBJ; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 case TCC_OPTION_nostdinc: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
416 tccg_nostdinc = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 case TCC_OPTION_nostdlib: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
419 tccg_nostdlib = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 case TCC_OPTION_print_search_dirs: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 print_search_dirs = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 case TCC_OPTION_run: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 int argc1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 char **argv1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 argc1 = expand_args(&argv1, optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 if (argc1 > 0) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 parse_args(s, argc1, argv1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 multiple_files = 0; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
433 tccg_output_type = TCC_OUTPUT_MEMORY; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 case TCC_OPTION_v: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
437 if (!tccg_verbose++) show_version(); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 case TCC_OPTION_f: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
440 if (tcc_set_flag(s, optarg, 1) < 0 && tccg_warn_unsupported) |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 goto unsupported_option; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 case TCC_OPTION_W: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
444 if (tcc_set_warning(s, optarg, 1) < 0 && tccg_warn_unsupported) |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 goto unsupported_option; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 case TCC_OPTION_w: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
448 tccg_warn_none = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 case TCC_OPTION_rdynamic: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
451 tccg_rdynamic = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
453 case TCC_OPTION_Wl: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 char *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 if (strstart(optarg, "-Ttext,", &p)) { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
457 tccg_text_addr = strtoul(p, NULL, 16); |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
458 tccg_has_text_addr = 1; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 } else if (strstart(optarg, "--oformat,", &p)) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 if (strstart(p, "elf32-", NULL)) { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
461 tccg_output_format = TCC_OUTPUT_FORMAT_ELF; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 } else if (!strcmp(p, "binary")) { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
463 tccg_output_format = TCC_OUTPUT_FORMAT_BINARY; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 #ifdef TCC_TARGET_COFF |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 if (!strcmp(p, "coff")) { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
467 tccg_output_format = TCC_OUTPUT_FORMAT_COFF; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
468 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 error("target %s not found", p); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 error("unsupported linker option '%s'", optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
475 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 default: |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
479 if (tccg_warn_unsupported) { |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
480 unsupported_option: |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 warning("unsupported option '%s'", r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 return optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
488 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
489 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 int main(int argc, char **argv) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
491 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
492 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 TCCState *s; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 int nb_objfiles, ret, optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 char objfilename[1024]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 int64_t start_time = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
497 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
498 s = tcc_new(); |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
499 tccg_output_type = TCC_OUTPUT_EXE; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 outfile = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
501 multiple_files = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
502 files = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
503 nb_files = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
504 nb_libraries = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
505 reloc_output = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
506 print_search_dirs = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
509 /* on win32, we suppose the lib and includes are at the location |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
510 of 'tcc.exe' */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
511 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
512 static char path[1024]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
513 char *p, *d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
514 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
515 GetModuleFileNameA(NULL, path, sizeof path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
516 p = d = strlwr(path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 while (*d) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
519 if (*d == '\\') *d = '/', p = d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
520 ++d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
521 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 *p = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 tinycc_path = path; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
524 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
525 #else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 tinycc_path = TINYCC_INSTALLDIR; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
529 optind = parse_args(s, argc - 1, argv + 1) + 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
530 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
531 /* Just enough for the Linux kernel, which is hardwired to use a directory |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 named "include" beneath this output value for the compiler headers.*/ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 if (print_search_dirs) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 printf("install: %s/\n", tinycc_path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
536 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
538 nb_objfiles = nb_files - nb_libraries; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
539 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
540 // if outfile provided without other options, we output an executable |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
541 if (outfile && tccg_output_type == TCC_OUTPUT_MEMORY) |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
542 tccg_output_type = TCC_OUTPUT_EXE; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
543 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
544 // check -c consistency : only single file handled. XXX: checks file type |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
545 if (tccg_output_type == TCC_OUTPUT_OBJ && !reloc_output) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
546 /* accepts only a single input file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
547 if (nb_objfiles != 1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 error("cannot specify multiple files with -c"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 if (nb_libraries != 0) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
550 error("cannot specify libraries with -c"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
551 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
552 |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
553 if (tccg_output_type == TCC_OUTPUT_PREPROCESS) { |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
554 if (!outfile) tccg_outfile = stdout; |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
555 else { |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
556 tccg_outfile = fopen(outfile, "wb"); |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
557 if (!tccg_outfile) error("could not open '%s'", outfile); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 } |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
559 } else if (tccg_output_type != TCC_OUTPUT_MEMORY) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
560 if (!outfile) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 /* compute default outfile name */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
562 pstrcpy(objfilename, sizeof(objfilename) - 1, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
563 /* strip path */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
564 tcc_basename(files[0])); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
565 #ifdef TCC_TARGET_PE |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
566 pe_guess_outfile(objfilename, tccg_output_type); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
567 #else |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
568 if (tccg_output_type == TCC_OUTPUT_OBJ && !reloc_output) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
569 char *ext = strrchr(objfilename, '.'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
570 if (!ext) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
571 goto default_outfile; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
572 /* add .o extension */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
573 strcpy(ext + 1, "o"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
574 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
575 default_outfile: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
576 pstrcpy(objfilename, sizeof(objfilename), "a.out"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
577 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
578 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
579 outfile = objfilename; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
580 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
581 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
582 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
583 if (do_bench) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
584 start_time = getclock_us(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
585 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
586 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
587 init_output_type(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
588 |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
589 /* compile or add each file or library */ |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
590 for(i = 0; i < nb_files; i++) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
591 char *filename; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
592 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
593 next_tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF | TOK_FLAG_BOW; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
594 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
595 filename = files[i]; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
596 if (tccg_output_type == TCC_OUTPUT_PREPROCESS) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
597 tcc_add_file_internal(s, filename, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
598 AFF_PRINT_ERROR | AFF_PREPROCESS); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
599 } else if (filename[0] == '-') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
600 if (tcc_add_library(s, filename + 2) < 0) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
601 error("cannot find %s", filename); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
602 } else if (tcc_add_file(s, filename) < 0) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
603 ret = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
604 goto the_end; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
605 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
606 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
607 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
608 /* free all files */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
609 free(files); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
610 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
611 if (do_bench) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
612 double total_time; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
613 total_time = (double)(getclock_us() - start_time) / 1000000.0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
614 if (total_time < 0.001) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
615 total_time = 0.001; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
616 if (total_bytes < 1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
617 total_bytes = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
618 printf("%d idents, %d lines, %d bytes, %0.3f s, %d lines/s, %0.1f MB/s\n", |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
619 tok_ident - TOK_IDENT, total_lines, total_bytes, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
620 total_time, (int)(total_lines / total_time), |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
621 total_bytes / total_time / 1000000.0); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
622 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
623 |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
624 if (tccg_output_type == TCC_OUTPUT_PREPROCESS) { |
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
625 if (outfile) fclose(tccg_outfile); |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
626 ret = 0; |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
627 } else if (tccg_output_type == TCC_OUTPUT_MEMORY) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
628 ret = tcc_run(s, argc - optind, argv + optind); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
629 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
630 #ifdef TCC_TARGET_PE |
554
8c020de0af57
Fix earlier options.c break-up by migrating some stuff from tcc.h to tinycc.h.
Rob Landley <rob@landley.net>
parents:
545
diff
changeset
|
631 if (tccg_output_type != TCC_OUTPUT_OBJ) { |
545
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
632 ret = tcc_output_pe(s, outfile); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
633 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
634 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
635 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
636 ret = tcc_output_file(s, outfile) ? 1 : 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
637 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
638 the_end: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
639 /* XXX: cannot do it with bound checking because of the malloc hooks */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
640 if (!do_bounds_check) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
641 tcc_delete(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
642 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
643 return ret; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
644 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
645 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
646 #endif |