From d4a27091c638acf4f67f8a4f1faf3aac911c7fce Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Sun, 31 Aug 2008 21:25:31 +0000 Subject: [PATCH] - add -f[no-]short-wchar - generic code for -f[no-]option - ignore -fjump-tables for now [r21599] --- lang_features.h | 3 +++ main.c | 34 ++++++++++++++++++++-------------- parser.c | 10 +++++++++- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lang_features.h b/lang_features.h index ca876a7..e387178 100644 --- a/lang_features.h +++ b/lang_features.h @@ -41,4 +41,7 @@ extern bool char_is_signed; /* true for strict language checking. */ extern bool strict_mode; +/* true if wchar_t is equal to unsigned short. */ +extern bool opt_short_wchar_t; + #endif diff --git a/main.c b/main.c index 82baf22..c643979 100644 --- a/main.c +++ b/main.c @@ -613,23 +613,27 @@ int main(int argc, char **argv) add_flag(&cppflags_obst, "%s", opt); } else if(strcmp(option, "pipe") == 0) { /* here for gcc compatibility */ - } else if(option[0] == 'f') { + } else if (option[0] == 'f') { + bool truth_value = true; const char *opt; GET_ARG_AFTER(opt, "-f"); + if (opt[0] == 'n' && opt[1] == 'o' && opt[2] == '-') { + truth_value = false; + opt += 3; + } if (strcmp(opt, "dollars-in-identifiers") == 0) { - allow_dollar_in_symbol = true; - } else if (strcmp(opt, "no-dollars-in-identifiers") == 0) { - allow_dollar_in_symbol = false; + allow_dollar_in_symbol = truth_value; + } else if (strcmp(opt, "short-wchar") == 0) { + opt_short_wchar_t = truth_value; } else if (strcmp(opt, "syntax-only") == 0) { mode = ParseOnly; } else if(strcmp(opt, "omit-frame-pointer") == 0) { - set_be_option("omitfp"); - } else if(strcmp(opt, "no-omit-frame-pointer") == 0) { - set_be_option("omitfp=no"); + set_be_option(truth_value ? "omitfp" : "omitfp=no"); } else if(strcmp(opt, "strength-reduce") == 0) { firm_option("strength-red"); - } else if(strcmp(opt, "fast-math") == 0 + } else if (strcmp(opt, "fast-math") == 0 + || strcmp(opt, "jump-tables") == 0 || strcmp(opt, "unroll-loops") == 0 || strcmp(opt, "expensive-optimizations") == 0 || strcmp(opt, "no-common") == 0 @@ -637,8 +641,10 @@ int main(int argc, char **argv) || strncmp(opt, "align-loops=", sizeof("align-loops=")-1) == 0 || strncmp(opt, "align-jumps=", sizeof("align-jumps=")-1) == 0 || strncmp(opt, "align-functions=", sizeof("align-functions=")-1) == 0) { - fprintf(stderr, "ignoring gcc option '-f %s'\n", opt); + fprintf(stderr, "ignoring gcc option '-f %s'\n", truth_value ? opt : opt - 3); } else { + if (! truth_value) + opt -= 3; int res = firm_option(opt); if (res == 0) { fprintf(stderr, "error: unknown Firm option '-f %s'\n", @@ -649,7 +655,7 @@ int main(int argc, char **argv) help_displayed = true; } } - } else if(option[0] == 'b') { + } else if (option[0] == 'b') { const char *opt; GET_ARG_AFTER(opt, "-b"); int res = firm_be_option(opt); @@ -663,8 +669,8 @@ int main(int argc, char **argv) if (strncmp(opt, "isa=", 4) == 0) strncpy(cpu_arch, opt, sizeof(cpu_arch)); } - } else if(option[0] == 'W') { - if(strncmp(option + 1, "l,", 2) == 0) // a gcc-style linker option + } else if (option[0] == 'W') { + if (strncmp(option + 1, "l,", 2) == 0) // a gcc-style linker option { const char *opt; GET_ARG_AFTER(opt, "-Wl,"); @@ -677,7 +683,7 @@ int main(int argc, char **argv) char arch_opt[64]; GET_ARG_AFTER(opt, "-m"); - if(strncmp(opt, "arch=", 5) == 0) { + if (strncmp(opt, "arch=", 5) == 0) { GET_ARG_AFTER(opt, "-march="); snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt); int res = firm_be_option(arch_opt); @@ -820,7 +826,7 @@ int main(int argc, char **argv) if (type == FILETYPE_AUTODETECT) { size_t len = strlen(arg); if (len < 2 && arg[0] == '-') { - /* - implicitely means C source file */ + /* - implicitly means C source file */ type = FILETYPE_C; filename = NULL; } else if (len > 2 && arg[len-2] == '.') { diff --git a/parser.c b/parser.c index 0fdf5e6..baa943a 100644 --- a/parser.c +++ b/parser.c @@ -39,6 +39,14 @@ #include "adt/error.h" #include "adt/array.h" +/** if wchar_t is equal to unsigned short. */ +bool opt_short_wchar_t = +#ifdef _WIN32 + true; +#else + false; +#endif + //#define PRINT_TOKENS #define MAX_LOOKAHEAD 2 @@ -9166,7 +9174,7 @@ static void initialize_builtin_types(void) type_ptrdiff_t = make_global_typedef("__PTRDIFF_TYPE__", type_long); type_uintmax_t = make_global_typedef("__uintmax_t__", type_unsigned_long_long); type_uptrdiff_t = make_global_typedef("__UPTRDIFF_TYPE__", type_unsigned_long); - type_wchar_t = make_global_typedef("__WCHAR_TYPE__", type_int); + type_wchar_t = make_global_typedef("__WCHAR_TYPE__", opt_short_wchar_t ? type_unsigned_short : type_int); type_wint_t = make_global_typedef("__WINT_TYPE__", type_int); type_intmax_t_ptr = make_pointer_type(type_intmax_t, TYPE_QUALIFIER_NONE); -- 2.20.1