improved "builtin"-strcmp
[cparser] / ast2firm.c
index 2ddbcab..035b793 100644 (file)
@@ -4176,7 +4176,7 @@ static void if_statement_to_firm(if_statement_t *statement)
        }
 
        mature_immBlock(true_block);
-       if (false_block != fallthrough_block) {
+       if (false_block != fallthrough_block && false_block != NULL) {
                mature_immBlock(false_block);
        }
        if (fallthrough_block != NULL) {
@@ -4431,8 +4431,8 @@ static void switch_statement_to_firm(switch_statement_t *statement)
                        /* default case */
                        continue;
                }
-               for (long cns = l->first_case; cns <= l->last_case; ++cns)
-                       ++num_cases;
+               if (l->last_case >= l->first_case)
+                       num_cases += l->last_case - l->first_case;
                if (l->last_case > def_nr)
                        def_nr = l->last_case;
        }
@@ -4515,14 +4515,14 @@ static void case_label_to_firm(const case_label_statement_t *statement)
 
        set_cur_block(old_block);
        if (statement->expression != NULL) {
-               long start_pn = statement->first_case;
-               long end_pn   = statement->last_case;
-               assert(start_pn <= end_pn);
+               long pn     = statement->first_case;
+               long end_pn = statement->last_case;
+               assert(pn <= end_pn);
                /* create jumps for all cases in the given range */
-               for (long pn = start_pn; pn <= end_pn; ++pn) {
+               do {
                        proj = new_d_Proj(dbgi, current_switch_cond, mode_X, pn);
                        add_immBlock_pred(block, proj);
-               }
+               } while(pn++ < end_pn);
        } else {
                saw_default_label = true;
                proj = new_d_defaultProj(dbgi, current_switch_cond,
@@ -5420,6 +5420,12 @@ static void scope_to_firm(scope_t *scope)
        }
 }
 
+static void set_be_option(const char *option)
+{
+       int res = firm_be_option(option);
+       assert(res);
+}
+
 void init_ast2firm(void)
 {
        obstack_init(&asm_obst);
@@ -5429,24 +5435,22 @@ void init_ast2firm(void)
        id_imp        = new_id_from_chars("__imp_", 6);
 
        /* OS option must be set to the backend */
-       const char *s = "ia32-gasmode=linux";
        switch (firm_opt.os_support) {
        case OS_SUPPORT_MINGW:
                create_ld_ident = create_ld_ident_win32;
-               s = "ia32-gasmode=mingw";
+               set_be_option("ia32-gasmode=mingw");
                break;
        case OS_SUPPORT_LINUX:
                create_ld_ident = create_ld_ident_linux_elf;
-               s = "ia32-gasmode=elf";
+               set_be_option("ia32-gasmode=elf");
                break;
        case OS_SUPPORT_MACHO:
                create_ld_ident = create_ld_ident_macho;
-               s = "ia32-gasmode=macho";
+               set_be_option("ia32-gasmode=macho");
+               set_be_option("ia32-stackalign=4");
+               set_be_option("pic");
                break;
        }
-       int res = firm_be_option(s);
-       (void) res;
-       assert(res);
 
        /* create idents for all known runtime functions */
        for (size_t i = 0; i < sizeof(rts_data) / sizeof(rts_data[0]); ++i) {