-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+)
This commit is contained in:
seyko 2016-05-04 17:17:51 +03:00
parent 78e4ee55b7
commit 2bfedb1867
3 changed files with 9 additions and 5 deletions

View File

@ -1764,6 +1764,7 @@ static const FlagDef flag_defs[] = {
{ offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" }, { offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" },
{ offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" }, { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" },
{ offsetof(TCCState, normalize_inc_dirs), 0, "normalize-inc-dirs" }, { offsetof(TCCState, normalize_inc_dirs), 0, "normalize-inc-dirs" },
{ offsetof(TCCState, no_type_redef_check), FD_INVERT, "type-redefinition-check" },
}; };
/* set/reset a flag */ /* set/reset a flag */

1
tcc.h
View File

@ -707,6 +707,7 @@ struct TCCState {
Liuux 2.4.26 can't find initrd when compiled with a new algorithm */ Liuux 2.4.26 can't find initrd when compiled with a new algorithm */
int dollars_in_identifiers; /* allows '$' char in indentifiers */ int dollars_in_identifiers; /* allows '$' char in indentifiers */
int normalize_inc_dirs; /* remove non-existent or duplicate directories from include paths */ 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 */ /* warning switches */
int warn_write_strings; int warn_write_strings;

View File

@ -166,11 +166,13 @@ ST_INLN void sym_free(Sym *sym)
ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c) ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c)
{ {
Sym *s; Sym *s;
if (ps == &local_stack) { if (!tcc_state->no_type_redef_check) {
for (s = *ps; s && s != scope_stack_bottom; s = s->prev) if (ps == &local_stack) {
if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v) for (s = *ps; s && s != scope_stack_bottom; s = s->prev)
tcc_error("incompatible types for redefinition of '%s'", if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v)
get_tok_str(v, NULL)); tcc_error("incompatible types for redefinition of '%s'",
get_tok_str(v, NULL));
}
} }
s = sym_malloc(); s = sym_malloc();
s->asm_label = 0; s->asm_label = 0;