add_flag(&cppflags_obst, "-MF");
add_flag(&cppflags_obst, dep_target);
if (outname != NULL) {
- add_flag(&cppflags_obst, "-MQ");
- add_flag(&cppflags_obst, outname);
+ add_flag(&cppflags_obst, "-MQ");
+ add_flag(&cppflags_obst, outname);
}
}
add_flag(&cppflags_obst, fname);
const char *revision = ir_get_version_revision();
if (revision[0] != 0) {
- putchar(' ');
+ putchar('-');
fputs(revision, stdout);
}
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
}
+static void print_cparser_version_short(void)
+{
+ puts(cparser_REVISION);
+}
+
static void print_help_basic(const char *argv0)
{
usage(argv0);
{
put_help("-l LIBRARY", "");
put_help("-L PATH", "");
+ put_help("-s", "Do not produce symbol table and relocation information");
put_help("-shared", "Produce a shared library");
put_help("-static", "Produce statically linked binary");
put_help("-Wl,OPTION", "Pass option directly to linker");
typedef enum {
HELP_NONE = 0,
- HELP_BASIC = 1u << 0,
- HELP_PREPROCESSOR = 1u << 1,
- HELP_PARSER = 1u << 2,
- HELP_WARNINGS = 1u << 3,
- HELP_OPTIMIZATION = 1u << 4,
- HELP_CODEGEN = 1u << 5,
- HELP_LINKER = 1u << 6,
- HELP_LANGUAGETOOLS = 1u << 7,
- HELP_DEBUG = 1u << 8,
- HELP_FIRM = 1u << 9,
-
- HELP_ALL = (unsigned)-1
+ HELP_BASIC = 1 << 0,
+ HELP_PREPROCESSOR = 1 << 1,
+ HELP_PARSER = 1 << 2,
+ HELP_WARNINGS = 1 << 3,
+ HELP_OPTIMIZATION = 1 << 4,
+ HELP_CODEGEN = 1 << 5,
+ HELP_LINKER = 1 << 6,
+ HELP_LANGUAGETOOLS = 1 << 7,
+ HELP_DEBUG = 1 << 8,
+ HELP_FIRM = 1 << 9,
+
+ HELP_ALL = -1
} help_sections_t;
static void print_help(const char *argv0, help_sections_t sections)
/* adjust types as requested by target architecture */
ir_type *type_long_double = be_params->type_long_double;
- if (type_long_double != NULL)
+ if (type_long_double != NULL) {
set_typeprops_type(&props[ATOMIC_TYPE_LONG_DOUBLE], type_long_double);
+ atomic_modes[ATOMIC_TYPE_LONG_DOUBLE] = get_type_mode(type_long_double);
+ }
ir_type *type_long_long = be_params->type_long_long;
if (type_long_long != NULL)
/* initialize firm pointer modes */
char name[64];
- ir_mode_sort sort = irms_reference;
unsigned bit_size = machine_size;
- bool is_signed = 0;
- ir_mode_arithmetic arithmetic = irma_twos_complement;
unsigned modulo_shift = decide_modulo_shift(bit_size);
snprintf(name, sizeof(name), "p%u", machine_size);
- ir_mode *ptr_mode = new_ir_mode(name, sort, bit_size, is_signed, arithmetic,
- modulo_shift);
+ ir_mode *ptr_mode = new_reference_mode(name, irma_twos_complement, bit_size, modulo_shift);
if (machine_size == 16) {
set_reference_mode_signed_eq(ptr_mode, mode_Hs);
int main(int argc, char **argv)
{
- firm_early_init();
-
const char *dumpfunction = NULL;
const char *print_file_name_file = NULL;
compile_mode_t mode = CompileAssembleLink;
#define SINGLE_OPTION(ch) (option[0] == (ch) && option[1] == '\0')
+ /* initialize this early because it has to parse options */
+ gen_firm_init();
+
/* early options parsing (find out optimization level and OS) */
for (int i = 1; i < argc; ++i) {
const char *arg = argv[i];
}
}
- const char *target = getenv("TARGET");
- if (target != NULL)
- parse_target_triple(target);
if (target_machine == NULL) {
target_machine = firm_get_host_machine();
}
mode = CompileAssemble;
} else if (SINGLE_OPTION('E')) {
mode = PreprocessOnly;
+ } else if (SINGLE_OPTION('s')) {
+ add_flag(&ldflags_obst, "-s");
} else if (SINGLE_OPTION('S')) {
mode = Compile;
} else if (option[0] == 'O') {
} else if (SINGLE_OPTION('v')) {
verbose = 1;
} else if (SINGLE_OPTION('w')) {
+ add_flag(&cppflags_obst, "-w");
disable_all_warnings();
} else if (option[0] == 'x') {
const char *opt;
streq(opt, "align-loops") ||
streq(opt, "align-jumps") ||
streq(opt, "align-functions") ||
+ streq(opt, "unroll-loops") ||
streq(opt, "PIC") ||
streq(opt, "stack-protector") ||
streq(opt, "stack-protector-all")) {
|| streq(option + 1, "endif-labels")) {
add_flag(&cppflags_obst, "%s", arg);
} else if (streq(option+1, "init-self")) {
- /* ignored (asme as gcc does) */
+ /* ignored (same as gcc does) */
} else if (streq(option+1, "format-y2k")
|| streq(option+1, "format-security")
|| streq(option+1, "old-style-declaration")
} else if (streq(option, "pg")) {
set_be_option("gprof");
add_flag(&ldflags_obst, "-pg");
- } else if (streq(option, "pedantic") ||
- streq(option, "ansi")) {
+ } else if (streq(option, "ansi")) {
+ add_flag(&cppflags_obst, "-ansi");
+ } else if (streq(option, "pedantic")) {
fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg);
} else if (strstart(option, "std=")) {
const char *const o = &option[4];
(fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg), standard);
} else if (streq(option, "version")) {
print_cparser_version();
+ return EXIT_SUCCESS;
+ } else if (streq(option, "dumpversion")) {
+ /* gcc compatibility option */
+ print_cparser_version_short();
+ return EXIT_SUCCESS;
} else if (strstart(option, "print-file-name=")) {
GET_ARG_AFTER(print_file_name_file, "-print-file-name=");
} else if (option[0] == '-') {
mode = CompileDump;
} else if (streq(option, "export-ir")) {
mode = CompileExportIR;
+ } else if (streq(option, "unroll-loops")) {
+ /* ignore (gcc compatibility) */
} else {
fprintf(stderr, "error: unknown argument '%s'\n", arg);
argument_errors = true;
set_be_option("profileuse");
}
- gen_firm_init();
init_symbol_table();
init_types_and_adjust();
init_typehash();
init_basic_types();
if (wchar_atomic_kind == ATOMIC_TYPE_INT)
init_wchar_types(type_int);
- else if (wchar_atomic_kind == ATOMIC_TYPE_SHORT)
+ else if (wchar_atomic_kind == ATOMIC_TYPE_USHORT)
init_wchar_types(type_short);
else
panic("unexpected wchar type");
}
if (mode == CompileExportIR) {
- fclose(out);
- ir_export(outname);
+ ir_export_file(out);
+ if (ferror(out) != 0) {
+ fprintf(stderr, "Error while writing to output\n");
+ return EXIT_FAILURE;
+ }
return EXIT_SUCCESS;
}
- gen_firm_finish(asm_out, filename);
+ generate_code(asm_out, filename);
if (asm_out != out) {
fclose(asm_out);
}
} else if (filetype == FILETYPE_IR) {
fclose(in);
- ir_import(filename);
+ int res = ir_import(filename);
+ if (res != 0) {
+ fprintf(stderr, "Firm-Program import failed\n");
+ return EXIT_FAILURE;
+ }
goto graph_built;
} else if (filetype == FILETYPE_PREPROCESSED_ASSEMBLER) {
copy_file(asm_out, in);
obstack_free(&asflags_obst, NULL);
obstack_free(&file_obst, NULL);
+ gen_firm_finish();
exit_mangle();
exit_ast2firm();
exit_parser();