Mercurial > hg > qcc
annotate options.c @ 545:11d95002dfe1
Split option parsing logic into a separate source file.
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 27 Dec 2007 20:53:10 -0600 |
parents | |
children | 8c020de0af57 |
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 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 #include "tcc.h" |
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 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 void *xmalloc(unsigned long size); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 void dynarray_add(void ***ptab, int *nb_ptr, void *data); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 void add_dynarray_path(TCCState *s, char *pathname, struct dynarray *dd); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 int strstart(char *str, char *val, char **ptr); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 void warning(char *fmt, ...); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 int init_output_type(TCCState *s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 extern char *tinycc_path; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 int do_bounds_check = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 int do_debug = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 int next_tok_flags; |
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 // Benchmark info |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 int do_bench = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 int total_lines; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 int total_bytes; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 int tok_ident; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // inlines |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 int is_space(int ch); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 #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
|
36 #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
|
37 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 typedef struct FlagDef { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 uint16_t offset; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 uint16_t flags; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 char *name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 } FlagDef; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 static FlagDef warning_defs[] = { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 { offsetof(TCCState, warn_unsupported), 0, "unsupported" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 { offsetof(TCCState, warn_write_strings), 0, "write-strings" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 { offsetof(TCCState, warn_error), 0, "error" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 { offsetof(TCCState, warn_implicit_function_declaration), WD_ALL, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 "implicit-function-declaration" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 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
|
53 char *name, int value) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 FlagDef *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 char *r; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 r = name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 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
|
61 r += 3; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 value = !value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 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
|
65 if (!strcmp(r, p->name)) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 goto found; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 return -1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 found: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 if (p->flags & FD_INVERT) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 value = !value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 *(int *)((uint8_t *)s + p->offset) = value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 |
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 /* set/reset a warning */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 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
|
79 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 FlagDef *p; |
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 if (!strcmp(warning_name, "all")) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 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
|
85 if (p->flags & WD_ALL) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 *(int *)((uint8_t *)s + p->offset) = 1; |
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 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 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
|
91 warning_name, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 static FlagDef flag_defs[] = { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 { offsetof(TCCState, char_is_unsigned), 0, "unsigned-char" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 { offsetof(TCCState, char_is_unsigned), FD_INVERT, "signed-char" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 { offsetof(TCCState, nocommon), FD_INVERT, "common" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 { offsetof(TCCState, leading_underscore), 0, "leading-underscore" }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 /* set/reset a flag */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 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
|
104 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 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
|
106 flag_name, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 /* extract the basename of a file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 static char *tcc_basename(char *name) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 char *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 p = strrchr(name, '/'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 if (!p) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 p = strrchr(name, '\\'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 if (!p) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 p = name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 p++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 return p; |
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 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 #if !defined(LIBTCC) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 static int64_t getclock_us(void) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 struct _timeb tb; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 _ftime(&tb); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 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
|
133 #else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 struct timeval tv; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 gettimeofday(&tv, NULL); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 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
|
137 #endif |
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 show_version(void) |
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 printf("tinycc version " TINYCC_VERSION "\n"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 void help(TCCState *s) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 show_version(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 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
|
149 "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
|
150 " [-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
|
151 " [infile1 infile2...] [-run infile args...]\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 "\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 "General options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 " -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
|
155 " -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
|
156 " -o outfile set output filename\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 " -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
|
158 " -bench output compilation statistics\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 " -run run compiled source\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 " -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
|
161 " -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
|
162 " -w disable all warnings\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 "Preprocessor options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 " -Idir add include path 'dir'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 " -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
|
166 " -Usym undefine 'sym'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 " -E preprocess only\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 "Linker options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 " -Ldir add library path 'dir'\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 " -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
|
171 " -shared generate a shared library\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 " -static static linking\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 " -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
|
174 " -r output relocatable .o file\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 "Debugger options:\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 " -g generate runtime debug info\n" |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 " -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
|
179 #endif |
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 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 #define TCC_OPTION_HAS_ARG 0x0001 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 #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
|
185 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 typedef struct TCCOption { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 char *name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 uint16_t index; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 uint16_t flags; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 } TCCOption; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 enum { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 TCC_OPTION_HELP, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 TCC_OPTION_I, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 TCC_OPTION_D, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 TCC_OPTION_E, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 TCC_OPTION_U, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 TCC_OPTION_L, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 TCC_OPTION_B, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 TCC_OPTION_l, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 TCC_OPTION_bench, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 TCC_OPTION_b, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 TCC_OPTION_g, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 TCC_OPTION_c, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 TCC_OPTION_static, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 TCC_OPTION_shared, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 TCC_OPTION_o, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 TCC_OPTION_r, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 TCC_OPTION_Wl, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 TCC_OPTION_W, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 TCC_OPTION_O, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 TCC_OPTION_m, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 TCC_OPTION_f, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 TCC_OPTION_nostdinc, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 TCC_OPTION_nostdlib, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 TCC_OPTION_print_search_dirs, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 TCC_OPTION_rdynamic, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 TCC_OPTION_run, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 TCC_OPTION_v, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 TCC_OPTION_w, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 TCC_OPTION_pipe, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 static TCCOption tcc_options[] = { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 { "h", TCC_OPTION_HELP, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 { "?", TCC_OPTION_HELP, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 { "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
|
228 { "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
|
229 { "E", TCC_OPTION_E, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 { "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
|
231 { "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
|
232 { "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
|
233 { "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
|
234 { "bench", TCC_OPTION_bench, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 { "b", TCC_OPTION_b, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 { "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
|
239 { "c", TCC_OPTION_c, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 { "static", TCC_OPTION_static, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 { "shared", TCC_OPTION_shared, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 { "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
|
243 { "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
|
244 { "rdynamic", TCC_OPTION_rdynamic, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 { "r", TCC_OPTION_r, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 { "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
|
247 { "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
|
248 { "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
|
249 { "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
|
250 { "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
|
251 { "nostdinc", TCC_OPTION_nostdinc, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 { "nostdlib", TCC_OPTION_nostdlib, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 { "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
|
254 { "v", TCC_OPTION_v, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 { "w", TCC_OPTION_w, 0 }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 { "pipe", TCC_OPTION_pipe, 0}, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 { NULL }, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 }; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 /* 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
|
261 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
|
262 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 char *s1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 char **argv, *arg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 int argc, len; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 argc = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 argv = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 for(;;) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 while (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 if (*str == '\0') |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 s1 = str; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 while (*str != '\0' && !is_space(*str)) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 str++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 len = str - s1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 arg = xmalloc(len + 1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 memcpy(arg, s1, len); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 arg[len] = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 dynarray_add((void ***)&argv, &argc, arg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 *pargv = argv; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 return argc; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 static char **files; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 static int nb_files, nb_libraries; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 static int multiple_files; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 static int print_search_dirs; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 static int reloc_output; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 static char *outfile; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 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
|
295 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 int optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 TCCOption *popt; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 char *optarg, *p1, *r1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 char *r; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 optind = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 while (1) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 if (optind >= argc) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 if (nb_files == 0 && !print_search_dirs) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 if (!s->verbose) help(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 } else break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 r = argv[optind++]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 if (r[0] != '-') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 /* add a new file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 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
|
313 if (!multiple_files) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 optind--; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 /* argv[0] will be this file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 /* 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
|
320 popt = tcc_options; |
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 p1 = popt->name; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 if (p1 == NULL) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 error("invalid option -- '%s'", r); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 r1 = r + 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 for(;;) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 if (*p1 == '\0') |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 goto option_found; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 if (*r1 != *p1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 p1++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 r1++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 popt++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 option_found: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 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
|
338 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
|
339 optarg = r1; |
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 (optind >= argc) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 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
|
343 optarg = argv[optind++]; |
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 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 if (*r1 != '\0') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 help(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 optarg = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 switch(popt->index) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 case TCC_OPTION_HELP: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 help(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 exit(1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 case TCC_OPTION_I: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 add_dynarray_path(s, optarg, &(s->include_paths)); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 case TCC_OPTION_D: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 char *sym, *value; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 sym = (char *)optarg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 value = strchr(sym, '='); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 if (value) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 *value = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 value++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 tcc_define_symbol(s, sym, value); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 case TCC_OPTION_E: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 s->output_type = TCC_OUTPUT_PREPROCESS; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 case TCC_OPTION_U: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 tcc_undefine_symbol(s, optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 case TCC_OPTION_L: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 add_dynarray_path(s, optarg, &(s->library_paths)); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 case TCC_OPTION_B: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 /* 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
|
383 tinycc_path = optarg; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 case TCC_OPTION_l: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 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
|
387 nb_libraries++; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 case TCC_OPTION_bench: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 do_bench = 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 #ifdef CONFIG_TCC_BCHECK |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 case TCC_OPTION_b: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 do_bounds_check = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 do_debug = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 case TCC_OPTION_g: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 do_debug = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 case TCC_OPTION_c: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 multiple_files = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 s->output_type = TCC_OUTPUT_OBJ; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 case TCC_OPTION_static: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 s->static_link = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 case TCC_OPTION_shared: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 s->output_type = TCC_OUTPUT_DLL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 case TCC_OPTION_o: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 multiple_files = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 outfile = optarg; |
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_r: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 /* 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
|
417 reloc_output = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 s->output_type = TCC_OUTPUT_OBJ; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 case TCC_OPTION_nostdinc: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 s->nostdinc = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 case TCC_OPTION_nostdlib: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 s->nostdlib = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 case TCC_OPTION_print_search_dirs: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 print_search_dirs = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 case TCC_OPTION_run: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 int argc1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 char **argv1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 argc1 = expand_args(&argv1, optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 if (argc1 > 0) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 parse_args(s, argc1, argv1); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 multiple_files = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 s->output_type = TCC_OUTPUT_MEMORY; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 case TCC_OPTION_v: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 if (!s->verbose++) show_version(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 case TCC_OPTION_f: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 if (tcc_set_flag(s, optarg, 1) < 0 && s->warn_unsupported) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 goto unsupported_option; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 case TCC_OPTION_W: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 if (tcc_set_warning(s, optarg, 1) < 0 && |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 s->warn_unsupported) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 goto unsupported_option; |
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_w: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 s->warn_none = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 case TCC_OPTION_rdynamic: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 s->rdynamic = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
458 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 case TCC_OPTION_Wl: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 char *p; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 if (strstart(optarg, "-Ttext,", &p)) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
463 s->text_addr = strtoul(p, NULL, 16); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 s->has_text_addr = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 } else if (strstart(optarg, "--oformat,", &p)) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 if (strstart(p, "elf32-", NULL)) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 s->output_format = TCC_OUTPUT_FORMAT_ELF; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
468 } else if (!strcmp(p, "binary")) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 s->output_format = TCC_OUTPUT_FORMAT_BINARY; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 #ifdef TCC_TARGET_COFF |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 if (!strcmp(p, "coff")) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 s->output_format = TCC_OUTPUT_FORMAT_COFF; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
475 #endif |
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 error("target %s not found", p); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
480 error("unsupported linker option '%s'", optarg); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 } |
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 default: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 if (s->warn_unsupported) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 unsupported_option: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 warning("unsupported option '%s'", r); |
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 break; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 } |
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 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 return optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 int main(int argc, char **argv) |
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 int i; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
499 TCCState *s; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
500 int nb_objfiles, ret, optind; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
501 char objfilename[1024]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
502 int64_t start_time = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
503 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
504 s = tcc_new(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
505 s->output_type = TCC_OUTPUT_EXE; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
506 outfile = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
507 multiple_files = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
508 files = NULL; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
509 nb_files = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
510 nb_libraries = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
511 reloc_output = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
512 print_search_dirs = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
513 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
514 #ifdef WIN32 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
515 /* 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
|
516 of 'tcc.exe' */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
517 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
518 static char path[1024]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
519 char *p, *d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
520 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
521 GetModuleFileNameA(NULL, path, sizeof path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
522 p = d = strlwr(path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
523 while (*d) |
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 if (*d == '\\') *d = '/', p = d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
526 ++d; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
527 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
528 *p = '\0'; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
529 tinycc_path = path; |
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 #else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
532 tinycc_path = TINYCC_INSTALLDIR; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
533 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
534 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
535 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
|
536 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
537 /* 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
|
538 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
|
539 if (print_search_dirs) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
540 printf("install: %s/\n", tinycc_path); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
541 return 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
542 } |
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 nb_objfiles = nb_files - nb_libraries; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
545 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
546 // if outfile provided without other options, we output an executable |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
547 if (outfile && s->output_type == TCC_OUTPUT_MEMORY) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
548 s->output_type = TCC_OUTPUT_EXE; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
549 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
550 // check -c consistency : only single file handled. XXX: checks file type |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
551 if (s->output_type == TCC_OUTPUT_OBJ && !reloc_output) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
552 /* accepts only a single input file */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
553 if (nb_objfiles != 1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
554 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
|
555 if (nb_libraries != 0) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
556 error("cannot specify libraries with -c"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
557 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
558 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
559 if (s->output_type == TCC_OUTPUT_PREPROCESS) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
560 if (!outfile) s->outfile = stdout; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
561 else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
562 s->outfile = fopen(outfile, "wb"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
563 if (!s->outfile) error("could not open '%s'", outfile); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
564 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
565 } else if (s->output_type != TCC_OUTPUT_MEMORY) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
566 if (!outfile) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
567 /* compute default outfile name */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
568 pstrcpy(objfilename, sizeof(objfilename) - 1, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
569 /* strip path */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
570 tcc_basename(files[0])); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
571 #ifdef TCC_TARGET_PE |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
572 pe_guess_outfile(objfilename, s->output_type); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
573 #else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
574 if (s->output_type == TCC_OUTPUT_OBJ && !reloc_output) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
575 char *ext = strrchr(objfilename, '.'); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
576 if (!ext) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
577 goto default_outfile; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
578 /* add .o extension */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
579 strcpy(ext + 1, "o"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
580 } else { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
581 default_outfile: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
582 pstrcpy(objfilename, sizeof(objfilename), "a.out"); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
583 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
584 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
585 outfile = objfilename; |
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 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
588 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
589 if (do_bench) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
590 start_time = getclock_us(); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
591 } |
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 init_output_type(s); |
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 /* compile or add each files or library */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
596 for(i = 0;i < nb_files; i++) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
597 char *filename; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
598 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
599 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
|
600 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
601 filename = files[i]; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
602 if (s->output_type == TCC_OUTPUT_PREPROCESS) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
603 tcc_add_file_internal(s, filename, |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
604 AFF_PRINT_ERROR | AFF_PREPROCESS); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
605 } else if (filename[0] == '-') { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
606 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
|
607 error("cannot find %s", filename); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
608 } 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
|
609 ret = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
610 goto the_end; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
611 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
612 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
613 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
614 /* free all files */ |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
615 free(files); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
616 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
617 if (do_bench) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
618 double total_time; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
619 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
|
620 if (total_time < 0.001) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
621 total_time = 0.001; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
622 if (total_bytes < 1) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
623 total_bytes = 1; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
624 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
|
625 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
|
626 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
|
627 total_bytes / total_time / 1000000.0); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
628 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
629 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
630 if (s->output_type == TCC_OUTPUT_PREPROCESS) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
631 if (outfile) fclose(s->outfile); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
632 ret = 0; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
633 } else if (s->output_type == TCC_OUTPUT_MEMORY) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
634 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
|
635 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
636 #ifdef TCC_TARGET_PE |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
637 if (s->output_type != TCC_OUTPUT_OBJ) { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
638 ret = tcc_output_pe(s, outfile); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
639 } else |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
640 #endif |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
641 { |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
642 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
|
643 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
644 the_end: |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
645 /* 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
|
646 if (!do_bounds_check) |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
647 tcc_delete(s); |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
648 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
649 return ret; |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
650 } |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
651 |
11d95002dfe1
Split option parsing logic into a separate source file.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
652 #endif |