adapt to simplified opt_funccall interface
[cparser] / main.c
diff --git a/main.c b/main.c
index ec09657..7f3a087 100644 (file)
--- a/main.c
+++ b/main.c
@@ -74,7 +74,6 @@
 #include "driver/firm_timing.h"
 #include "adt/error.h"
 #include "wrappergen/write_fluffy.h"
-#include "wrappergen/write_caml.h"
 #include "wrappergen/write_jna.h"
 #include "revision.h"
 #include "warning.h"
 
 #ifndef PREPROCESSOR
 #ifndef __WIN32__
-#define PREPROCESSOR "gcc -E -m32 -U__STRICT_ANSI__"
+#define PREPROCESSOR "gcc -E -U__STRICT_ANSI__"
 #else
-#define PREPROCESSOR "cpp -m32 -U__STRICT_ANSI__"
+#define PREPROCESSOR "cpp -U__STRICT_ANSI__"
 #endif
 #endif
 
 #ifndef LINKER
-#define LINKER    "gcc -m32"
+#define LINKER    "gcc"
 #endif
 
 #ifndef ASSEMBLER
 #ifdef __APPLE__
-#define ASSEMBLER "gcc -m32 -c -xassembler"
+#define ASSEMBLER "gcc -c -xassembler"
 #else
-#define ASSEMBLER "as --32"
+#define ASSEMBLER "as"
 #endif
 #endif
 
@@ -107,7 +106,6 @@ bool               byte_order_big_endian     = false;
 bool               char_is_signed            = true;
 bool               strict_mode               = false;
 bool               use_builtins              = false;
-bool               have_const_functions      = false;
 atomic_type_kind_t wchar_atomic_kind         = ATOMIC_TYPE_INT;
 unsigned           force_long_double_size    = 0;
 bool               enable_main_collect2_hack = false;
@@ -121,7 +119,9 @@ extern bool print_parenthesis;
 
 static const char     *target_triple;
 static int             verbose;
-static struct obstack  cppflags_obst, ldflags_obst;
+static struct obstack  cppflags_obst;
+static struct obstack  ldflags_obst;
+static struct obstack  asflags_obst;
 static char            dep_target[1024];
 static const char     *outname;
 
@@ -335,56 +335,52 @@ static FILE *preprocess(const char *fname, filetype_t filetype)
                }
        }
        add_flag(&cppflags_obst, fname);
-
        obstack_1grow(&cppflags_obst, '\0');
-       char *buf = obstack_finish(&cppflags_obst);
+
+       char *commandline = obstack_finish(&cppflags_obst);
        if (verbose) {
-               puts(buf);
+               puts(commandline);
        }
-
-       FILE *f = popen(buf, "r");
+       FILE *f = popen(commandline, "r");
        if (f == NULL) {
                fprintf(stderr, "invoking preprocessor failed\n");
                exit(EXIT_FAILURE);
        }
-
        /* we don't really need that anymore */
-       obstack_free(&cppflags_obst, buf);
+       obstack_free(&cppflags_obst, commandline);
 
        return f;
 }
 
 static void assemble(const char *out, const char *in)
 {
-       struct obstack asflags_obst;
-       char *buf;
-
-       obstack_init(&asflags_obst);
+       obstack_1grow(&asflags_obst, '\0');
+       const char *flags = obstack_finish(&asflags_obst);
 
        const char *assembler = getenv("CPARSER_AS");
        if (assembler != NULL) {
-               obstack_printf(&asflags_obst, "%s ", assembler);
+               obstack_printf(&asflags_obst, "%s", assembler);
        } else {
                if (target_triple != NULL)
                        obstack_printf(&asflags_obst, "%s-", target_triple);
-               obstack_printf(&asflags_obst, "%s ", ASSEMBLER);
+               obstack_printf(&asflags_obst, "%s", ASSEMBLER);
        }
+       if (flags[0] != '\0')
+               obstack_printf(&asflags_obst, " %s", flags);
 
-       obstack_printf(&asflags_obst, "%s -o %s", in, out);
+       obstack_printf(&asflags_obst, " %s -o %s", in, out);
        obstack_1grow(&asflags_obst, '\0');
-       buf = obstack_finish(&asflags_obst);
 
+       char *commandline = obstack_finish(&asflags_obst);
        if (verbose) {
-               puts(buf);
+               puts(commandline);
        }
-
-       int err = system(buf);
-       if (err != 0) {
+       int err = system(commandline);
+       if (err != EXIT_SUCCESS) {
                fprintf(stderr, "assembler reported an error\n");
                exit(EXIT_FAILURE);
        }
-
-       obstack_free(&asflags_obst, NULL);
+       obstack_free(&asflags_obst, commandline);
 }
 
 static void print_file_name(const char *file)
@@ -408,7 +404,6 @@ static void print_file_name(const char *file)
        obstack_1grow(&ldflags_obst, '\0');
 
        char *commandline = obstack_finish(&ldflags_obst);
-
        if (verbose) {
                puts(commandline);
        }
@@ -417,6 +412,7 @@ static void print_file_name(const char *file)
                fprintf(stderr, "linker reported an error\n");
                exit(EXIT_FAILURE);
        }
+       obstack_free(&ldflags_obst, commandline);
 }
 
 static const char *try_dir(const char *dir)
@@ -519,21 +515,6 @@ static void free_temp_files(void)
        temp_files = NULL;
 }
 
-/**
- * Do the necessary lowering for compound parameters.
- */
-void lower_compound_params(void)
-{
-       lower_params_t params;
-
-       params.def_ptr_alignment    = 4;
-       params.flags                = LF_COMPOUND_RETURN | LF_RETURN_HIDDEN;
-       params.hidden_params        = ADD_HIDDEN_ALWAYS_IN_FRONT;
-       params.find_pointer_type    = NULL;
-       params.ret_compound_in_regs = NULL;
-       lower_calls_with_compounds(&params);
-}
-
 typedef enum compile_mode_t {
        BenchmarkParser,
        PreprocessOnly,
@@ -546,7 +527,6 @@ typedef enum compile_mode_t {
        LexTest,
        PrintAst,
        PrintFluffy,
-       PrintCaml,
        PrintJna
 } compile_mode_t;
 
@@ -779,6 +759,7 @@ int main(int argc, char **argv)
 
        obstack_init(&cppflags_obst);
        obstack_init(&ldflags_obst);
+       obstack_init(&asflags_obst);
        obstack_init(&file_obst);
 
 #define GET_ARG_AFTER(def, args)                                             \
@@ -947,6 +928,10 @@ int main(int argc, char **argv)
                                add_flag(&cppflags_obst, "%s", arg);
                        } else if (streq(option, "pipe")) {
                                /* here for gcc compatibility */
+                       } else if (streq(option, "static")) {
+                               add_flag(&ldflags_obst, "-static");
+                       } else if (streq(option, "shared")) {
+                               add_flag(&ldflags_obst, "-shared");
                        } else if (option[0] == 'f') {
                                char const *orig_opt;
                                GET_ARG_AFTER(orig_opt, "-f");
@@ -1123,17 +1108,17 @@ int main(int argc, char **argv)
                                        fprintf(stderr, "error: software floatingpoint not supported yet\n");
                                        argument_errors = true;
                                } else {
-                                       char *endptr;
-                                       long int value = strtol(opt, &endptr, 10);
-                                       if (*endptr != '\0') {
+                                       long int value = strtol(opt, NULL, 10);
+                                       if (value == 0) {
                                                fprintf(stderr, "error: wrong option '-m %s'\n",  opt);
                                                argument_errors = true;
-                                       }
-                                       if (value != 16 && value != 32 && value != 64) {
+                                       } else if (value != 16 && value != 32 && value != 64) {
                                                fprintf(stderr, "error: option -m supports only 16, 32 or 64\n");
                                                argument_errors = true;
                                        } else {
                                                machine_size = (unsigned int)value;
+                                               add_flag(&asflags_obst, "--%u", machine_size);
+                                               add_flag(&ldflags_obst, "-m%u", machine_size);
                                        }
                                }
                        } else if (streq(option, "pg")) {
@@ -1194,8 +1179,6 @@ int main(int argc, char **argv)
                                        print_parenthesis = true;
                                } else if (streq(option, "print-fluffy")) {
                                        mode = PrintFluffy;
-                               } else if (streq(option, "print-caml")) {
-                                       mode = PrintCaml;
                                } else if (streq(option, "print-jna")) {
                                        mode = PrintJna;
                                } else if (streq(option, "jna-limit")) {
@@ -1310,9 +1293,6 @@ int main(int argc, char **argv)
                return EXIT_FAILURE;
        }
 
-       /* we do the lowering in ast2firm */
-       firm_opt.lower_bitfields = FALSE;
-
        /* set the c_mode here, types depends on it */
        c_mode |= features_on;
        c_mode &= ~features_off;
@@ -1350,7 +1330,6 @@ int main(int argc, char **argv)
                case BenchmarkParser:
                case PrintAst:
                case PrintFluffy:
-               case PrintCaml:
                case PrintJna:
                case LexTest:
                case PreprocessOnly:
@@ -1550,9 +1529,6 @@ do_parsing:
                        } else if (mode == PrintFluffy) {
                                write_fluffy_decls(out, unit);
                                continue;
-                       } else if (mode == PrintCaml) {
-                               write_caml_decls(out, unit);
-                               continue;
                        } else if (mode == PrintJna) {
                                write_jna_decls(out, unit);
                                continue;
@@ -1605,7 +1581,7 @@ graph_built:
                                return EXIT_SUCCESS;
                        }
 
-                       gen_firm_finish(asm_out, filename, have_const_functions);
+                       gen_firm_finish(asm_out, filename);
                        if (asm_out != out) {
                                fclose(asm_out);
                        }
@@ -1712,6 +1688,7 @@ graph_built:
 
        obstack_free(&cppflags_obst, NULL);
        obstack_free(&ldflags_obst, NULL);
+       obstack_free(&asflags_obst, NULL);
        obstack_free(&file_obst, NULL);
 
        exit_mangle();