diff options
| author | seyko <seyko2@gmail.com> | 2015-04-10 23:44:10 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2015-04-10 23:44:10 +0300 |
| commit | 5c9dde7255b2ecc38df8b31dc0bef16ea71f0757 (patch) | |
| tree | 1430499c1ce2a69d6d265bada231cc6dbefb5396 | |
| parent | 92efee6e52e6ae1a8cad8fa89da2db11b796295f (diff) | |
| download | tinycc-5c9dde7255b2ecc38df8b31dc0bef16ea71f0757.tar.gz tinycc-5c9dde7255b2ecc38df8b31dc0bef16ea71f0757.tar.bz2 | |
option to use an old algorithm of the array in struct initialization
This is for a case when no '{' is used in the initialization code.
An option name is -fold-struct-init-code. A linux 2.4.26 can't
find initrd when compiled with a new algorithm.
| -rw-r--r-- | libtcc.c | 1 | ||||
| -rw-r--r-- | tcc.h | 2 | ||||
| -rw-r--r-- | tccgen.c | 35 |
3 files changed, 34 insertions, 4 deletions
@@ -1478,6 +1478,7 @@ static const FlagDef flag_defs[] = { { offsetof(TCCState, nocommon), FD_INVERT, "common" }, { offsetof(TCCState, leading_underscore), 0, "leading-underscore" }, { offsetof(TCCState, ms_extensions), 0, "ms-extensions" }, + { offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" }, }; /* set/reset a flag */ @@ -603,6 +603,8 @@ struct TCCState { int char_is_unsigned; int leading_underscore; int ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */ + int old_struct_init_code; /* use old algorithm to init array in struct when there is no '{' used. + Liuux 2.4.26 can't find initrd when compiled with a new algorithm */ /* warning switches */ int warn_write_strings; @@ -5575,22 +5575,45 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, struct/union init */ /* XXX: union needs only one init */ + int par_count = 0; if (tok == '(') { AttributeDef ad1; CType type1; next(); - if (tok != '(') { + if (tcc_state->old_struct_init_code) { + /* an old version of struct initialization. + It have a problems. But with a new version + linux 2.4.26 can't load ramdisk. + */ + while (tok == '(') { + par_count++; + next(); + } + if (!parse_btype(&type1, &ad1)) + expect("cast"); + type_decl(&type1, &ad1, &n, TYPE_ABSTRACT); + #if 0 + if (!is_assignable_types(type, &type1)) + tcc_error("invalid type for cast"); + #endif + skip(')'); + } + else + { + if (tok != '(') { if (!parse_btype(&type1, &ad1)) expect("cast"); type_decl(&type1, &ad1, &n, TYPE_ABSTRACT); -#if 0 + #if 0 if (!is_assignable_types(type, &type1)) tcc_error("invalid type for cast"); -#endif + #endif skip(')'); - } else + } else unget_tok(tok); + } } + no_oblock = 1; if (first || tok == '{') { skip('{'); @@ -5663,6 +5686,10 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, } if (!no_oblock) skip('}'); + while (par_count) { + skip(')'); + par_count--; + } } else if (tok == '{') { next(); decl_initializer(type, sec, c, first, size_only); |
