diff options
| author | grischka <grischka> | 2016-10-01 20:49:38 +0200 |
|---|---|---|
| committer | grischka <grischka> | 2016-10-01 20:49:38 +0200 |
| commit | 2f1174550e9b2356b7cebe9346858b1f1155520e (patch) | |
| tree | 4bc30e1ddd0570c2c0dc523bbd35d52496b1f4be /libtcc.c | |
| parent | 2d6aa65067b6d1127abb62bd11d2ddaf6b4cf492 (diff) | |
| download | tinycc-2f1174550e9b2356b7cebe9346858b1f1155520e.tar.gz tinycc-2f1174550e9b2356b7cebe9346858b1f1155520e.tar.bz2 | |
libtcc: -Wl,... incremental parsing
parse -Wl linker options immediately
Diffstat (limited to 'libtcc.c')
| -rw-r--r-- | libtcc.c | 61 |
1 files changed, 27 insertions, 34 deletions
@@ -1809,14 +1809,13 @@ static int link_option(const char *str, const char *val, const char **ptr) /* '=' near eos means ',' or '=' is ok */ if (*q == '=') { + if (*p == 0) + *ptr = p; if (*p != ',' && *p != '=') return 0; p++; - q++; } - - if (ptr) - *ptr = p; + *ptr = p; return 1; } @@ -1838,9 +1837,9 @@ static char *copy_linker_arg(const char *p) /* set linker options */ static int tcc_set_linker(TCCState *s, const char *option) { - while (option && *option) { + while (*option) { - const char *p = option; + const char *p = NULL; char *end = NULL; int ignoring = 0; @@ -1916,20 +1915,19 @@ static int tcc_set_linker(TCCState *s, const char *option) } else goto err; #endif - } else - goto err; - - if (ignoring && s->warn_unsupported) err: { - char buf[100], *e; - pstrcpy(buf, sizeof buf, e = copy_linker_arg(option)), tcc_free(e); - if (ignoring) - tcc_warning("unsupported linker option '%s'", buf); - else - tcc_error("unsupported linker option '%s'", buf); + } else if (p) { + return 0; + } else { + err: + tcc_error("unsupported linker option '%s'", option); } + + if (ignoring && s->warn_unsupported) + tcc_warning("unsupported linker option '%s'", option); + option = skip_linker_arg(&p); } - return 0; + return 1; } typedef struct TCCOption { @@ -2089,9 +2087,10 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) int optind = 0; int run = 0; int x; + CString linker_arg; /* collect -Wl options */ char buf[1024]; - ++s->args_ref; + cstr_new(&linker_arg); while (optind < argc) { @@ -2124,6 +2123,7 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) if (popt->flags & TCC_OPTION_HAS_ARG) { if (*r1 == '\0' && !(popt->flags & TCC_OPTION_NOSEP)) { if (optind >= argc) + arg_err: tcc_error("argument to '%s' is missing", r); optarg = argv[optind++]; } @@ -2157,7 +2157,7 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) break; case TCC_OPTION_pthread: parse_option_D(s, "_REENTRANT"); - s->args_pthread = 1; + s->option_pthread = 1; break; case TCC_OPTION_bench: s->do_bench = 1; @@ -2273,9 +2273,11 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) s->rdynamic = 1; break; case TCC_OPTION_Wl: - if (s->linker_arg.size) - --s->linker_arg.size, cstr_ccat(&s->linker_arg, ','); - cstr_cat(&s->linker_arg, optarg, 0); + if (linker_arg.size) + --linker_arg.size, cstr_ccat(&linker_arg, ','); + cstr_cat(&linker_arg, optarg, 0); + if (tcc_set_linker(s, linker_arg.data)) + cstr_free(&linker_arg); break; case TCC_OPTION_E: x = TCC_OUTPUT_PREPROCESS; @@ -2323,19 +2325,10 @@ unsupported_option: } } - if (1 == s->args_ref) { - /* top instance */ - if (s->output_type != TCC_OUTPUT_OBJ) { - tcc_set_linker(s, (const char *)s->linker_arg.data); - if (s->args_pthread) { - args_parser_add_file(s, optarg, 'l'); - s->nb_libraries++; - } - } - cstr_free(&s->linker_arg); - s->args_pthread = 0; + if (linker_arg.size) { + r = linker_arg.data; + goto arg_err; } - --s->args_ref; return optind; } |
