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:
seyko
2016-04-13 06:17:02 +03:00
parent b0296139a8
commit b5b3e89f9e
2 changed files with 6 additions and 3 deletions

View File

@ -1471,8 +1471,11 @@ static void pragma_parse(TCCState *s1)
tcc_warning("unbalanced #pragma pop_macro");
} 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) {
/* tcc -E: keep pragmas below unchanged */
unget_tok(' ');
@ -1670,7 +1673,7 @@ ST_FUNC void preprocess(int is_bof)
pstrcat(buf1, sizeof(buf1), buf);
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'
is defined */
#ifdef INC_DEBUG