#include "warning.h"
#ifndef PREPROCESSOR
-#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=__SIZE_TYPE__ -m32 -U__STRICT_ANSI__"
+#ifdef __APPLE__
+#define PREPROCESSOR "gcc -E -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=unsigned\\ long -m32 -U__STRICT_ANSI__"
+#else
+#define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int -U__SIZE_TYPE__ -D__SIZE_TYPE__=unsigned\\ long -m32 -U__STRICT_ANSI__"
+#endif
#endif
#ifndef LINKER
#endif
#ifndef ASSEMBLER
+#ifdef __APPLE__
+#define ASSEMBLER "gcc -c -xassembler"
+#else
#define ASSEMBLER "as --32"
#endif
+#endif
/** The current c mode/dialect. */
unsigned int c_mode = _C89|_C99|_GNUC;
/** use builtins for some libc functions */
bool use_builtins = false;
+/** we have extern function with const attribute. */
+bool have_const_functions = false;
+
/* to switch on printing of implicit casts */
extern bool print_implicit_casts;
static int verbose;
static struct obstack cppflags_obst, ldflags_obst;
static char dep_target[1024];
+static const char *outname;
typedef struct file_list_entry_t file_list_entry_t;
obstack_printf(&cppflags_obst, "%s", PREPROCESSOR);
if (dep_target[0] != '\0') {
- obstack_printf(&cppflags_obst, " -MF %s", dep_target);
+ add_flag(&cppflags_obst, "-MF");
+ add_flag(&cppflags_obst, "%s", dep_target);
+ if (outname != NULL) {
+ add_flag(&cppflags_obst, "-MQ");
+ add_flag(&cppflags_obst, "%s", outname);
+ }
}
if (flags[0] != '\0') {
obstack_printf(&cppflags_obst, " %s", flags);
}
- obstack_printf(&cppflags_obst, " %s", fname);
+ add_flag(&cppflags_obst, "%s", fname);
obstack_1grow(&cppflags_obst, '\0');
const char *buf = obstack_finish(&cppflags_obst);
{
initialize_firm();
- const char *outname = NULL;
const char *dumpfunction = NULL;
compile_mode_t mode = CompileAssembleLink;
int opt_level = 1;
default:
case 4:
set_option("strict-aliasing");
+ /* use_builtins = true; */
/* fallthrough */
case 3:
set_option("cond-eval");
set_option("if-conv");
- use_builtins = true;
/* fallthrough */
case 2:
set_option("inline");
break;
}
+#ifdef __APPLE__
+ /* Darwin expects the stack to be aligned to 16byte boundary */
+ firm_be_option("ia32-stackalign=4");
+#endif
+
/* parse rest of options */
filetype_t forced_filetype = FILETYPE_AUTODETECT;
bool help_displayed = false;
if (streq(opt, "dollars-in-identifiers")) {
allow_dollar_in_symbol = truth_value;
+ } if (streq(opt, "builtins")) {
+ use_builtins = truth_value;
} else if (streq(opt, "short-wchar")) {
opt_short_wchar_t = truth_value;
} else if (streq(opt, "syntax-only")) {
/* preprocess and compile */
if (filetype == FILETYPE_PREPROCESSED_C) {
translation_unit_t *const unit = do_parsing(in, filename);
- if (in == preprocessed_in) {
- int pp_result = pclose(preprocessed_in);
- if (pp_result != EXIT_SUCCESS) {
- exit(EXIT_FAILURE);
- }
- }
/* prints the AST even if errors occurred */
if (mode == PrintAst) {
fprintf(stderr, "%u warning(s)\n", warning_count);
}
+ if (in == preprocessed_in) {
+ int pp_result = pclose(preprocessed_in);
+ if (pp_result != EXIT_SUCCESS) {
+ exit(EXIT_FAILURE);
+ }
+ }
+
if(mode == BenchmarkParser) {
return result;
} else if(mode == PrintFluffy) {
}
gen_firm_finish(asm_out, filename, /*c_mode=*/1,
- /*firm_const_exists=*/0);
+ have_const_functions);
if (asm_out != out) {
fclose(asm_out);
}