memcpy(buf+last_dot, newext, extlen);
}
-static translation_unit_t *do_parsing(FILE *const in, const char *const input)
+static translation_unit_t *do_parsing(FILE *const in, const char *const input_name)
{
- lexer_open_stream(in, input);
+ lexer_open_stream(in, input_name);
translation_unit_t *unit = parse();
return unit;
}
} while(lexer_token.type != T_EOF);
}
-static FILE* preprocess(FILE* in, const char *fname)
+static FILE *preprocess(FILE *in, const char *fname)
{
char buf[4096];
obstack_1grow(&cppflags_obst, '\0');
if(verbose) {
puts(buf);
}
- FILE* f = popen(buf, "r");
- if (f == NULL) {
+ FILE *f = popen(buf, "r");
+ if(f == NULL) {
fprintf(stderr, "invoking preprocessor failed\n");
exit(1);
}
const char *dumpfunction = NULL;
compile_mode_t mode = CompileAssembleLink;
int opt_level = 1;
- int result = EXIT_SUCCESS;
+ int result = EXIT_SUCCESS;
+ char cpu_arch[16] = "ia32";
obstack_init(&cppflags_obst);
obstack_init(&ldflags_obst);
argument_errors = true;
} else if (res == -1) {
help_displayed = true;
+ } else {
+ if (strncmp(opt, "isa=", 4) == 0)
+ strncpy(cpu_arch, opt, sizeof(cpu_arch));
}
} else if(option[0] == 'W') {
set_warning_opt(&option[1]);
} else if(option[0] == 'm') {
const char *opt;
+ char arch_opt[64];
+
GET_ARG_AFTER(opt, "-m");
- char *endptr;
- long int value = strtol(opt, &endptr, 10);
- if (*endptr != '\0') {
- fprintf(stderr, "error: wrong option '-m %s'\n", opt);
- argument_errors = true;
- }
- if (value != 16 && value != 32 && value != 64) {
- fprintf(stderr, "error: option -m supports only 16, 32 or 64\n");
- argument_errors = true;
+ 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);
+ if (res == 0)
+ argument_errors = true;
+ else {
+ snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt);
+ int res = firm_be_option(arch_opt);
+ if (res == 0)
+ argument_errors = true;
+ }
+ } else if(strncmp(opt, "tune=", 5) == 0) {
+ GET_ARG_AFTER(opt, "-mtune=");
+ snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt);
+ int res = firm_be_option(arch_opt);
+ if (res == 0)
+ argument_errors = true;
+ } else if(strncmp(opt, "cpu=", 4) == 0) {
+ GET_ARG_AFTER(opt, "-mcpu=");
+ snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt);
+ int res = firm_be_option(arch_opt);
+ if (res == 0)
+ argument_errors = true;
+ } else if(strncmp(opt, "fpu=", 4) == 0) {
+ GET_ARG_AFTER(opt, "-mfpu=");
+ snprintf(arch_opt, sizeof(arch_opt), "%s-fpunit=%s", cpu_arch, opt);
+ int res = firm_be_option(arch_opt);
+ if (res == 0)
+ argument_errors = true;
} else {
- machine_size = (unsigned int)value;
+ char *endptr;
+ long int value = strtol(opt, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr, "error: wrong option '-m %s'\n", opt);
+ argument_errors = true;
+ }
+ 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;
+ }
}
} else if (option[0] == '\0') {
if(input != NULL) {
} else {
input = arg;
}
+ } else if(strcmp(option, "pg") == 0) {
+ firm_be_option("-b gprof");
+ obstack_printf(&ldflags_obst, " -pg");
} else if(strcmp(option, "pedantic") == 0) {
fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg);
} else if(strncmp(option, "std=", 4) == 0) {
outname = outnamebuf;
break;
case CompileAssembleLink:
+#ifdef _WIN32
+ /* Windows compiler typically derive the output name from
+ the first source file */
+ get_output_name(outnamebuf, sizeof(outnamebuf), input, ".exe");
+ outname = outnamebuf;
+#else
outname = "a.out";
+#endif
break;
}
}