Fix pragma once guard
From: Vlad Vissoultchev Date: Mon, 11 Apr 2016 01:26:32 +0300 Subject: Fix pragma once guard when compiling multiple source files When compiling multiple source files directly to executable cached include files guard was incorrectly checked for TOK_once in ifndef_macro member. If two source files included the same header guarded by pragma once, then the second one erroneously skipped it as `cached_includes` is not cleared on second `tcc_compile`
This commit is contained in:
parent
b0296139a8
commit
b5b3e89f9e
2 changed files with 6 additions and 3 deletions
2
tcc.c
2
tcc.c
|
@ -344,7 +344,7 @@ int main(int argc, char **argv)
|
||||||
tcc_parse_args(s, argc - 1, argv + 1);
|
tcc_parse_args(s, argc - 1, argv + 1);
|
||||||
tcc_set_environment(s);
|
tcc_set_environment(s);
|
||||||
if (s->output_type != TCC_OUTPUT_OBJ)
|
if (s->output_type != TCC_OUTPUT_OBJ)
|
||||||
tcc_error("interlnal error");
|
tcc_error("internal error");
|
||||||
tcc_set_output_type(s, s->output_type);
|
tcc_set_output_type(s, s->output_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
7
tccpp.c
7
tccpp.c
|
@ -1471,8 +1471,11 @@ static void pragma_parse(TCCState *s1)
|
||||||
tcc_warning("unbalanced #pragma pop_macro");
|
tcc_warning("unbalanced #pragma pop_macro");
|
||||||
|
|
||||||
} else if (tok == TOK_once) {
|
} else if (tok == TOK_once) {
|
||||||
add_cached_include(s1, file->filename, TOK_once);
|
char buf1[sizeof file->filename];
|
||||||
|
|
||||||
|
pstrcpy(buf1, sizeof(buf1), "#once#");
|
||||||
|
pstrcat(buf1, sizeof(buf1), file->filename);
|
||||||
|
add_cached_include(s1, file->filename, tok_alloc(buf1, strlen(buf1))->tok);
|
||||||
} else if (s1->ppfp) {
|
} else if (s1->ppfp) {
|
||||||
/* tcc -E: keep pragmas below unchanged */
|
/* tcc -E: keep pragmas below unchanged */
|
||||||
unget_tok(' ');
|
unget_tok(' ');
|
||||||
|
@ -1670,7 +1673,7 @@ ST_FUNC void preprocess(int is_bof)
|
||||||
|
|
||||||
pstrcat(buf1, sizeof(buf1), buf);
|
pstrcat(buf1, sizeof(buf1), buf);
|
||||||
e = search_cached_include(s1, buf1);
|
e = search_cached_include(s1, buf1);
|
||||||
if (e && (define_find(e->ifndef_macro) || e->ifndef_macro == TOK_once)) {
|
if (e && define_find(e->ifndef_macro)) {
|
||||||
/* no need to parse the include because the 'ifndef macro'
|
/* no need to parse the include because the 'ifndef macro'
|
||||||
is defined */
|
is defined */
|
||||||
#ifdef INC_DEBUG
|
#ifdef INC_DEBUG
|
||||||
|
|
Loading…
Reference in a new issue