From 2bfedb18675228c3837c23fa523231f55e102c12 Mon Sep 17 00:00:00 2001 From: seyko Date: Wed, 4 May 2016 17:17:51 +0300 Subject: [PATCH] -fno-type-redefinition-check don't catch redefinition for local vars. With this option on tcc accepts the following code: int main() { int a = 0; long a = 0; } But if you shure there is no problem with your local variables, then a compilation speed can be improved if you have a lots of the local variables (50000+) --- libtcc.c | 1 + tcc.h | 1 + tccgen.c | 12 +++++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libtcc.c b/libtcc.c index 75a37c3d..6db2236b 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1764,6 +1764,7 @@ static const FlagDef flag_defs[] = { { offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" }, { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" }, { offsetof(TCCState, normalize_inc_dirs), 0, "normalize-inc-dirs" }, + { offsetof(TCCState, no_type_redef_check), FD_INVERT, "type-redefinition-check" }, }; /* set/reset a flag */ diff --git a/tcc.h b/tcc.h index 1698fb3b..aec80b89 100644 --- a/tcc.h +++ b/tcc.h @@ -707,6 +707,7 @@ struct TCCState { Liuux 2.4.26 can't find initrd when compiled with a new algorithm */ int dollars_in_identifiers; /* allows '$' char in indentifiers */ int normalize_inc_dirs; /* remove non-existent or duplicate directories from include paths */ + int no_type_redef_check; /* no local vars redefinition check */ /* warning switches */ int warn_write_strings; diff --git a/tccgen.c b/tccgen.c index b9681dfe..898856c0 100644 --- a/tccgen.c +++ b/tccgen.c @@ -166,11 +166,13 @@ ST_INLN void sym_free(Sym *sym) ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c) { Sym *s; - if (ps == &local_stack) { - for (s = *ps; s && s != scope_stack_bottom; s = s->prev) - if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v) - tcc_error("incompatible types for redefinition of '%s'", - get_tok_str(v, NULL)); + if (!tcc_state->no_type_redef_check) { + if (ps == &local_stack) { + for (s = *ps; s && s != scope_stack_bottom; s = s->prev) + if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v) + tcc_error("incompatible types for redefinition of '%s'", + get_tok_str(v, NULL)); + } } s = sym_malloc(); s->asm_label = 0;