Resolve some warnings.
[cparser] / main.c
diff --git a/main.c b/main.c
index 339a1cf..a103a60 100644 (file)
--- a/main.c
+++ b/main.c
 #include "warning.h"
 
 #ifndef PREPROCESSOR
-#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=__SIZE_TYPE__ -m32 -U__STRICT_ANSI__"
+#ifdef __APPLE__
+#define PREPROCESSOR "gcc -E -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=unsigned\\ long -m32 -U__STRICT_ANSI__"
+#else
+#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=unsigned\\ long -m32 -U__STRICT_ANSI__"
+#endif
 #endif
 
 #ifndef LINKER
 #endif
 
 #ifndef ASSEMBLER
+#ifdef __APPLE__
+#define ASSEMBLER "gcc -c -xassembler"
+#else
 #define ASSEMBLER "as --32"
 #endif
+#endif
 
 /** The current c mode/dialect. */
 unsigned int c_mode = _C89|_C99|_GNUC;
@@ -106,6 +114,9 @@ bool strict_mode = false;
 /** use builtins for some libc functions */
 bool use_builtins = false;
 
+/** we have extern function with const attribute. */
+bool have_const_functions = false;
+
 /* to switch on printing of implicit casts */
 extern bool print_implicit_casts;
 
@@ -115,6 +126,7 @@ extern bool print_parenthesis;
 static int             verbose;
 static struct obstack  cppflags_obst, ldflags_obst;
 static char            dep_target[1024];
+static const char     *outname;
 
 typedef struct file_list_entry_t file_list_entry_t;
 
@@ -259,12 +271,17 @@ static FILE *preprocess(const char *fname)
 
        obstack_printf(&cppflags_obst, "%s", PREPROCESSOR);
        if (dep_target[0] != '\0') {
-               obstack_printf(&cppflags_obst, " -MF %s", dep_target);
+               add_flag(&cppflags_obst, "-MF");
+               add_flag(&cppflags_obst, "%s", dep_target);
+               if (outname != NULL) {
+                               add_flag(&cppflags_obst, "-MQ");
+                               add_flag(&cppflags_obst, "%s", outname);
+               }
        }
        if (flags[0] != '\0') {
                obstack_printf(&cppflags_obst, " %s", flags);
        }
-       obstack_printf(&cppflags_obst, " %s", fname);
+       add_flag(&cppflags_obst, "%s", fname);
 
        obstack_1grow(&cppflags_obst, '\0');
        const char *buf = obstack_finish(&cppflags_obst);
@@ -497,7 +514,6 @@ int main(int argc, char **argv)
 {
        initialize_firm();
 
-       const char        *outname              = NULL;
        const char        *dumpfunction         = NULL;
        compile_mode_t     mode                 = CompileAssembleLink;
        int                opt_level            = 1;
@@ -554,11 +570,11 @@ int main(int argc, char **argv)
        default:
        case 4:
                set_option("strict-aliasing");
+               /* use_builtins = true; */
                /* fallthrough */
        case 3:
                set_option("cond-eval");
                set_option("if-conv");
-               use_builtins = true;
                /* fallthrough */
        case 2:
                set_option("inline");
@@ -567,6 +583,11 @@ int main(int argc, char **argv)
                break;
        }
 
+#ifdef __APPLE__
+       /* Darwin expects the stack to be aligned to 16byte boundary */
+       firm_be_option("ia32-stackalign=4");
+#endif
+
        /* parse rest of options */
        filetype_t  forced_filetype = FILETYPE_AUTODETECT;
        bool        help_displayed  = false;
@@ -659,6 +680,8 @@ int main(int argc, char **argv)
 
                                        if (streq(opt, "dollars-in-identifiers")) {
                                                allow_dollar_in_symbol = truth_value;
+                                       } if (streq(opt, "builtins")) {
+                                               use_builtins = truth_value;
                                        } else if (streq(opt, "short-wchar")) {
                                                opt_short_wchar_t = truth_value;
                                        } else if (streq(opt, "syntax-only")) {
@@ -1045,12 +1068,6 @@ int main(int argc, char **argv)
                /* preprocess and compile */
                if (filetype == FILETYPE_PREPROCESSED_C) {
                        translation_unit_t *const unit = do_parsing(in, filename);
-                       if (in == preprocessed_in) {
-                               int pp_result = pclose(preprocessed_in);
-                               if (pp_result != EXIT_SUCCESS) {
-                                       exit(EXIT_FAILURE);
-                               }
-                       }
 
                        /* prints the AST even if errors occurred */
                        if (mode == PrintAst) {
@@ -1069,6 +1086,13 @@ int main(int argc, char **argv)
                                fprintf(stderr, "%u warning(s)\n", warning_count);
                        }
 
+                       if (in == preprocessed_in) {
+                               int pp_result = pclose(preprocessed_in);
+                               if (pp_result != EXIT_SUCCESS) {
+                                       exit(EXIT_FAILURE);
+                               }
+                       }
+
                        if(mode == BenchmarkParser) {
                                return result;
                        } else if(mode == PrintFluffy) {
@@ -1111,7 +1135,7 @@ int main(int argc, char **argv)
                        }
 
                        gen_firm_finish(asm_out, filename, /*c_mode=*/1,
-                                       /*firm_const_exists=*/0);
+                                       have_const_functions);
                        if (asm_out != out) {
                                fclose(asm_out);
                        }