From 14745bdeb735d565b7589ba6032abd755267c850 Mon Sep 17 00:00:00 2001 From: grischka Date: Fri, 1 Aug 2014 10:59:38 +0200 Subject: [PATCH] tccgen: nocode_wanted: do not output constants This for example suppresses string constants such as with int main() { return sizeof "foo"; } Actually, setting nocode_wanted = 1; in libtcc.c for the initial global level seemed wrong, since obviously "nocode_wanted" means code as any side effects, also such as string constants. This reverts a part of 2de1b2d14cc920e2c698ff0086f5558c2da7f569 (documented as "Some in-between fixes" in Changelog) --- libtcc.c | 1 - tccgen.c | 33 ++++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/libtcc.c b/libtcc.c index 7caa7c1e..b0ac2c7c 100644 --- a/libtcc.c +++ b/libtcc.c @@ -778,7 +778,6 @@ static int tcc_compile(TCCState *s1) #endif define_start = define_stack; - nocode_wanted = 1; if (setjmp(s1->error_jmp_buf) == 0) { s1->nb_errors = 0; diff --git a/tccgen.c b/tccgen.c index 1a89d4a4..5fd127fa 100644 --- a/tccgen.c +++ b/tccgen.c @@ -5528,9 +5528,7 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, literals). It also simplifies local initializers handling */ tok_str_new(&init_str); - if (size < 0 || (flexible_array && has_init)) { - if (!has_init) - tcc_error("unknown type size"); + if ((size < 0 || flexible_array) && has_init) { /* get all init string */ if (has_init == 2) { /* only get strings */ @@ -5569,11 +5567,19 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, macro_ptr = init_str.str; next(); - /* if still unknown size, error */ size = type_size(type, &align); - if (size < 0) - tcc_error("unknown type size"); } + + /* if still unknown size, error */ + if (size < 0) + tcc_error("unknown type size"); + + if (nocode_wanted) { + //tcc_warning("nocode_wanted set for decl_initializer_alloc"); + vset(type, r, 0); + goto no_alloc; + } + if (flexible_array) size += flexible_array->type.ref->c * pointed_size(&flexible_array->type); /* take into account specified alignment if bigger */ @@ -5720,17 +5726,17 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, } if (has_init || (type->t & VT_VLA)) { decl_initializer(type, sec, addr, 1, 0); - /* restore parse state if needed */ - if (init_str.str) { - tok_str_free(init_str.str); - restore_parse_state(&saved_parse_state); - } /* patch flexible array member size back to -1, */ /* for possible subsequent similar declarations */ if (flexible_array) flexible_array->type.ref->c = -1; } - no_alloc: ; +no_alloc: + /* restore parse state if needed */ + if (init_str.str) { + tok_str_free(init_str.str); + restore_parse_state(&saved_parse_state); + } } static void put_func_debug(Sym *sym) @@ -5802,8 +5808,6 @@ static void func_decl_list(Sym *func_sym) 'cur_text_section' */ static void gen_function(Sym *sym) { - int saved_nocode_wanted = nocode_wanted; - nocode_wanted = 0; ind = cur_text_section->data_offset; /* NOTE: we patch the symbol size later */ put_extern_sym(sym, cur_text_section, ind, 0); @@ -5859,7 +5863,6 @@ static void gen_function(Sym *sym) func_vt.t = VT_VOID; /* for safety */ func_var = 0; /* for safety */ ind = 0; /* for safety */ - nocode_wanted = saved_nocode_wanted; } ST_FUNC void gen_inline_functions(void) -- 2.11.4.GIT