#include "diagnostic.h"
#include "lang_features.h"
#include "driver/firm_opt.h"
-#include "driver/firm_cmdline.h"
#include "driver/firm_timing.h"
#include "driver/firm_machine.h"
#include "adt/error.h"
bool byte_order_big_endian = false;
bool char_is_signed = true;
bool strict_mode = false;
-bool use_builtins = false;
atomic_type_kind_t wchar_atomic_kind = ATOMIC_TYPE_INT;
-unsigned force_long_double_size = 0;
+unsigned long_double_size = 0;
bool enable_main_collect2_hack = false;
bool freestanding = false;
-/* to switch on printing of implicit casts */
-extern bool print_implicit_casts;
-
-/* to switch on printing of parenthesis to indicate operator precedence */
-extern bool print_parenthesis;
-
static machine_triple_t *target_machine;
static const char *target_triple;
static int verbose;
+static bool use_builtins;
static struct obstack cppflags_obst;
static struct obstack ldflags_obst;
static struct obstack asflags_obst;
put_help("--help-parser", "Display information about parser options");
put_help("--help-warnings", "Display information about warning options");
put_help("--help-codegen", "Display information about code-generation options");
+ put_help("--help-optimization", "Display information about optimization options");
put_help("--help-linker", "Display information about linker options");
put_help("--help-language-tools", "Display information about language tools options");
put_help("--help-debug", "Display information about compiler debugging options");
static void print_help_warnings(void)
{
- put_help("-w", "disable all warnings");
- put_help("-W", "ignored (gcc compatibility)");
- put_help("-Wno-trigraphs", "warn if input contains trigraphs");
- put_help("-Wundef", "Warn if an undefined macro is used in an #if");
+ put_help("-f[no-]diagnostics-show-option", "Show the switch, which controls a warning, after each warning");
+ put_help("-w", "disable all warnings");
+ put_help("-Wno-trigraphs", "warn if input contains trigraphs");
+ put_help("-Wundef", "Warn if an undefined macro is used in an #if");
print_warning_opt_help();
}
-static void print_help_optimisation(void)
+static void print_help_optimization(void)
{
- put_help("-O LEVEL", "select optimisation level (0-4)");
+ put_help("-O LEVEL", "select optimization level (0-4)");
+ firm_option_help(put_help);
put_help("-fexpensive-optimizations","ignored (gcc compatibility)");
}
put_help("-fhosted", "compile in hosted (not freestanding) mode");
put_help("-fprofile-generate", "Generate instrumented code to collect profile information");
put_help("-fprofile-use", "Use profile information generated by instrumented binaries");
+ put_help("-ffp-precise", "precise floating point model");
+ put_help("-ffp-fast", "imprecise floating point model");
+ put_help("-ffp-strict", "strict floating point model");
+ put_help("-ffp-precise", "precise floating point model");
put_help("-pthread", "Use pthread threading library");
- put_help("-fverbose-asm", "ignored (gcc compatibility)");
- put_help("-ffast-math", "ignored (gcc compatibility)");
- put_help("-fjump-tables", "ignored (gcc compatibility)");
- put_help("-fcommon", "ignored (gcc compatibility)");
- put_help("-foptimize-sibling-calls", "ignored (gcc compatibility)");
- put_help("-falign-loops", "ignored (gcc compatibility)");
- put_help("-falign-jumps", "ignored (gcc compatibility)");
- put_help("-falign-functions", "ignored (gcc compatibility)");
- put_help("-fPIC", "ignored (gcc compatibility)");
put_help("-mtarget=TARGET", "Specify target architecture as CPU-manufacturer-OS triple");
put_help("-mtriple=TARGET", "alias for -mtarget (clang compatibility)");
put_help("-march=ARCH", "");
put_help("-msoft-float", "not supported yet");
put_help("-m32", "generate 32bit code");
put_help("-m64", "generate 64bit code");
+ put_help("-fverbose-asm", "ignored (gcc compatibility)");
+ put_help("-fjump-tables", "ignored (gcc compatibility)");
+ put_help("-fcommon", "ignored (gcc compatibility)");
+ put_help("-foptimize-sibling-calls", "ignored (gcc compatibility)");
+ put_help("-falign-loops", "ignored (gcc compatibility)");
+ put_help("-falign-jumps", "ignored (gcc compatibility)");
+ put_help("-falign-functions", "ignored (gcc compatibility)");
+ put_help("-fPIC", "ignored (gcc compatibility)");
+ put_help("-ffast-math", "same as fp-fast (gcc compatibility)");
puts("");
puts("\tMost of these options can be used with a no- prefix to disable them");
- puts("\ti.e. -fno-signed-char");
+ puts("\te.g. -fno-signed-char");
}
static void print_help_linker(void)
HELP_PREPROCESSOR = 1u << 1,
HELP_PARSER = 1u << 2,
HELP_WARNINGS = 1u << 3,
- HELP_OPTIMISATION = 1u << 4,
+ HELP_OPTIMIZATION = 1u << 4,
HELP_CODEGEN = 1u << 5,
HELP_LINKER = 1u << 6,
HELP_LANGUAGETOOLS = 1u << 7,
if (sections & HELP_PREPROCESSOR) print_help_preprocessor();
if (sections & HELP_PARSER) print_help_parser();
if (sections & HELP_WARNINGS) print_help_warnings();
- if (sections & HELP_OPTIMISATION) print_help_optimisation();
+ if (sections & HELP_OPTIMIZATION) print_help_optimization();
if (sections & HELP_CODEGEN) print_help_codegeneration();
if (sections & HELP_LINKER) print_help_linker();
if (sections & HELP_LANGUAGETOOLS) print_help_language_tools();
{
const char *os = target_machine->operating_system;
wchar_atomic_kind = ATOMIC_TYPE_INT;
- force_long_double_size = 0;
enable_main_collect2_hack = false;
define_intmax_types = false;
|| streq(os, "solaris")) {
set_create_ld_ident(create_name_linux_elf);
} else if (streq(os, "darwin")) {
- force_long_double_size = 16;
+ long_double_size = 16;
set_create_ld_ident(create_name_macho);
define_intmax_types = true;
} else if (strstr(os, "mingw") != NULL || streq(os, "win32")) {
{
if (!setup_firm_for_machine(target_machine))
exit(1);
+
+ const backend_params *be_params = be_get_backend_param();
+ if (be_params->long_double_size % 8 != 0) {
+ fprintf(stderr, "firm-target long double size is not a multiple of 8, can't handle this\n");
+ exit(1);
+ }
+
+ byte_order_big_endian = be_params->byte_order_big_endian;
+ machine_size = be_params->machine_size;
+ long_double_size = be_params->long_double_size / 8;
+
init_os_support();
}
obstack_init(&file_obst);
#define GET_ARG_AFTER(def, args) \
+ do { \
def = &arg[sizeof(args)-1]; \
- if (def[0] == '\0') { \
+ if (def[0] == '\0') { \
++i; \
- if (i >= argc) { \
+ if (i >= argc) { \
fprintf(stderr, "error: expected argument after '" args "'\n"); \
argument_errors = true; \
break; \
} \
def = argv[i]; \
- if (def[0] == '-' && def[1] != '\0') { \
+ if (def[0] == '-' && def[1] != '\0') { \
fprintf(stderr, "error: expected argument after '" args "'\n"); \
argument_errors = true; \
continue; \
} \
- }
+ } \
+ } while (0)
#define SINGLE_OPTION(ch) (option[0] == (ch) && option[1] == '\0')
- /* early options parsing (find out optimisation level and OS) */
+ /* early options parsing (find out optimization level and OS) */
for (int i = 1; i < argc; ++i) {
const char *arg = argv[i];
if (arg[0] != '-')
} else if (SINGLE_OPTION('v')) {
verbose = 1;
} else if (SINGLE_OPTION('w')) {
- memset(&warning, 0, sizeof(warning));
+ disable_all_warnings();
} else if (option[0] == 'x') {
const char *opt;
GET_ARG_AFTER(opt, "-x");
select_input_encoding(encoding);
} else if (strstart(orig_opt, "align-loops=") ||
strstart(orig_opt, "align-jumps=") ||
- strstart(orig_opt, "visibility=") ||
strstart(orig_opt, "align-functions=")) {
fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt);
+ } else if (strstart(orig_opt, "visibility=")) {
+ const char *val = strchr(orig_opt, '=')+1;
+ elf_visibility_tag_t visibility
+ = get_elf_visibility_from_string(val);
+ if (visibility == ELF_VISIBILITY_ERROR) {
+ fprintf(stderr, "invalid visibility '%s' specified\n",
+ val);
+ argument_errors = true;
+ } else {
+ set_default_visibility(visibility);
+ }
} else if (strstart(orig_opt, "message-length=")) {
/* ignore: would only affect error message format */
} else {
if (streq(opt, "builtins")) {
use_builtins = truth_value;
+ } else if (streq(opt, "diagnostics-show-option")) {
+ diagnostics_show_option = truth_value;
} else if (streq(opt, "dollars-in-identifiers")) {
allow_dollar_in_symbol = truth_value;
} else if (streq(opt, "omit-frame-pointer")) {
} else if (streq(opt, "signed-char")) {
char_is_signed = truth_value;
} else if (streq(opt, "strength-reduce")) {
- firm_option(truth_value ? "strength-red" : "no-strength-red");
+ /* does nothing, for gcc compatibility (even gcc does
+ * nothing for this switch anymore) */
} else if (streq(opt, "syntax-only")) {
mode = truth_value ? ParseOnly : CompileAssembleLink;
} else if (streq(opt, "unsigned-char")) {
streq(opt, "asynchronous-unwind-tables")) {
/* nothing todo, a gcc feature which we don't support
* anyway was deactivated */
- } else if (streq(orig_opt, "verbose-asm")) {
+ } else if (streq(opt, "verbose-asm")) {
/* ignore: we always print verbose assembler */
- } else if (streq(opt, "fast-math") ||
- streq(opt, "jump-tables") ||
+ } else if (streq(opt, "fast-math") || streq(opt, "fp-fast")) {
+ firm_fp_model = fp_model_fast;
+ } else if (streq(opt, "fp-precise")) {
+ firm_fp_model = fp_model_precise;
+ } else if (streq(opt, "fp-strict")) {
+ firm_fp_model = fp_model_strict;
+ } else if (streq(opt, "jump-tables") ||
streq(opt, "expensive-optimizations") ||
streq(opt, "common") ||
streq(opt, "optimize-sibling-calls") ||
fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt);
} else if (streq(opt, "help")) {
fprintf(stderr, "warning: -fhelp is deprecated\n");
- help |= HELP_FIRM;
+ help |= HELP_OPTIMIZATION;
} else {
int res = firm_option(orig_opt);
if (res == 0) {
}
}
} else if (option[0] == 'W') {
- if (option[1] == '\0') {
- /* ignore -W, our defaults are already quite verbose */
- } else if (strstart(option + 1, "p,")) {
+ if (strstart(option + 1, "p,")) {
// pass options directly to the preprocessor
const char *opt;
GET_ARG_AFTER(opt, "-Wp,");
GET_ARG_AFTER(opt, "-march=");
snprintf(arch_opt, sizeof(arch_opt), "%s-arch=%s", cpu_arch, opt);
int res = be_parse_arg(arch_opt);
+ snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt);
+ res &= be_parse_arg(arch_opt);
+
if (res == 0) {
fprintf(stderr, "Unknown architecture '%s'\n", arch_opt);
argument_errors = true;
- } else {
- snprintf(arch_opt, sizeof(arch_opt), "%s-opt=%s", cpu_arch, opt);
- int res = be_parse_arg(arch_opt);
- if (res == 0)
- argument_errors = true;
}
} else if (strstart(opt, "tune=")) {
GET_ARG_AFTER(opt, "-mtune=");
else if (streq(opt, "sse"))
opt = "sse2";
else {
- fprintf(stderr, "error: option -mfpumath supports only 387 or sse\n");
+ fprintf(stderr, "error: option -mfpmath supports only 387 or sse\n");
argument_errors = true;
}
if (!argument_errors) {
fprintf(stderr, "error: option -m supports only 16, 32 or 64\n");
argument_errors = true;
} else {
- machine_size = (unsigned int)value;
+ add_flag(&cppflags_obst, "-m%u", machine_size);
add_flag(&asflags_obst, "-m%u", machine_size);
add_flag(&ldflags_obst, "-m%u", machine_size);
+ /* TODO: choose/change backend based on this */
}
}
} else if (streq(option, "pg")) {
help |= HELP_CODEGEN;
} else if (streq(option, "help-linker")) {
help |= HELP_LINKER;
+ } else if (streq(option, "help-optimization")) {
+ help |= HELP_OPTIMIZATION;
} else if (streq(option, "help-language-tools")) {
help |= HELP_LANGUAGETOOLS;
} else if (streq(option, "help-debug")) {
}
gen_firm_init();
- byte_order_big_endian = be_get_backend_param()->byte_order_big_endian;
init_symbol_table();
init_types();
init_typehash();
preprocessed_in = preprocess(filename, filetype);
if (mode == PreprocessOnly) {
copy_file(out, preprocessed_in);
- int result = pclose(preprocessed_in);
+ int pp_result = pclose(preprocessed_in);
fclose(out);
/* remove output file in case of error */
- if (out != stdout && result != EXIT_SUCCESS) {
+ if (out != stdout && pp_result != EXIT_SUCCESS) {
unlink(outname);
}
- return result;
+ return pp_result;
}
in = preprocessed_in;