#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
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;
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;
}
}
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)
obstack_1grow(&ldflags_obst, '\0');
char *commandline = obstack_finish(&ldflags_obst);
-
if (verbose) {
puts(commandline);
}
fprintf(stderr, "linker reported an error\n");
exit(EXIT_FAILURE);
}
+ obstack_free(&ldflags_obst, commandline);
}
static const char *try_dir(const char *dir)
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(¶ms);
-}
-
typedef enum compile_mode_t {
BenchmarkParser,
PreprocessOnly,
LexTest,
PrintAst,
PrintFluffy,
- PrintCaml,
PrintJna
} compile_mode_t;
obstack_init(&cppflags_obst);
obstack_init(&ldflags_obst);
+ obstack_init(&asflags_obst);
obstack_init(&file_obst);
#define GET_ARG_AFTER(def, args) \
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");
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")) {
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")) {
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;
case BenchmarkParser:
case PrintAst:
case PrintFluffy:
- case PrintCaml:
case PrintJna:
case LexTest:
case PreprocessOnly:
} 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;
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);
}
obstack_free(&cppflags_obst, NULL);
obstack_free(&ldflags_obst, NULL);
+ obstack_free(&asflags_obst, NULL);
obstack_free(&file_obst, NULL);
exit_mangle();