X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=ce8c6ff21cde67abfbb57c148d984c47c5fdb156;hb=2f4d5b48891698c9c271382559f5e0380f5431b4;hp=70c5ba08aac0a51b76d3c0cb5512d467d9c5873a;hpb=6ff85b6a89c74076dc516e3a38bc26bd80c37fa5;p=cparser diff --git a/main.c b/main.c index 70c5ba0..ce8c6ff 100644 --- a/main.c +++ b/main.c @@ -7,9 +7,36 @@ #include #include #include -#include #include +#ifdef _WIN32 + +#include +#include + +/* no eXecute on Win32 */ +#define X_OK 0 +#define W_OK 2 +#define R_OK 4 + +#define O_RDWR _O_RDWR +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL +#define O_BINARY _O_BINARY + +/* remap some names, we are not in the POSIX world */ +#define access(fname, mode) _access(fname, mode) +#define mktemp(tmpl) _mktemp(tmpl) +#define open(fname, oflag, mode) _open(fname, oflag, mode) +#define fdopen(fd, mode) _fdopen(fd, mode) +#define popen(cmd, mode) _popen(cmd, mode) +#define pclose(file) _pclose(file) + +#else +#include +#define HAVE_MKSTEMP +#endif + #ifndef WITH_LIBCORE #define WITH_LIBCORE #endif @@ -23,36 +50,54 @@ #include "parser.h" #include "ast2firm.h" #include "lang_features.h" +#include "driver/firm_opt.h" #include "driver/firm_cmdline.h" #include "adt/error.h" #include "write_fluffy.h" -#include "driver/firm_opt.h" +#include "revision.h" #ifndef PREPROCESSOR #define PREPROCESSOR "cpp -std=c99 -U__WCHAR_TYPE__ -D__WCHAR_TYPE__=int" #endif #ifndef LINKER -#define LINKER "gcc -m32" +#define LINKER "gcc -m32" #endif #ifndef ASSEMBLER #define ASSEMBLER "as --32" #endif -#ifdef _WIN32 -/* remap some names */ -#define popen(cmd, mode) _popen(cmd, mode) -#define pclose(file) _pclose(file) -#endif /* _WIN32 */ - -/** The current c mode/dialect */ +/** The current c mode/dialect. */ unsigned int c_mode = _C99|_GNUC; +/** The 'machine size', 16, 32 or 64 bit, 32bit is the default. */ +unsigned int machine_size = 32; + +/** true if the char type is signed. */ +bool char_is_signed = true; + static int verbose; -static bool do_dump; static struct obstack cppflags_obst; +#if defined(_DEBUG) || defined(FIRM_DEBUG) +/** + * Debug printf implementation. + * + * @param fmt printf style format parameter + */ +void dbg_printf(const char *fmt, ...) +{ + va_list list; + + if (firm_dump.debug_print) { + va_start(list, fmt); + vprintf(fmt, list); + va_end(list); + } /* if */ +} +#endif /* defined(_DEBUG) || defined(FIRM_DEBUG) */ + static void initialize_firm(void) { firm_early_init(); @@ -61,13 +106,6 @@ static void initialize_firm(void) dump_keepalive_edges(1); } -static void dump(ir_graph *irg, const char *suffix) -{ - if(do_dump) { - dump_ir_block_graph(irg, suffix); - } -} - static void get_output_name(char *buf, size_t buflen, const char *inputname, const char *newext) { @@ -210,6 +248,15 @@ static const char *get_tempdir(void) return tmpdir; } +#ifndef HAVE_MKSTEMP +/* cheap and nasty mkstemp replacement */ +static int mkstemp(char *templ) +{ + mktemp(templ); + return open(templ, O_RDWR|O_CREAT|O_EXCL|O_BINARY, 0600); +} +#endif + /** * an own version of tmpnam, which: writes in a buffer, appends a user specified * suffix, emits no warnings during linking (like glibc/gnu ld do for tmpnam)... @@ -255,25 +302,6 @@ void lower_compound_params(void) lower_calls_with_compounds(¶ms); } -static void create_firm_prog(translation_unit_t *unit) -{ - translation_unit_to_firm(unit); - - int n_irgs = get_irp_n_irgs(); - for(int i = 0; i < n_irgs; ++i) { - ir_graph *const irg = get_irp_irg(i); - dump(irg, "-start"); - } - - lower_compound_params(); - lower_highlevel(); - - for(int i = 0; i < n_irgs; ++i) { - ir_graph *const irg = get_irp_irg(i); - dump(irg, "-lower"); - } -} - typedef enum compile_mode_t { ParseOnly, Compile, @@ -294,15 +322,6 @@ int main(int argc, char **argv) { initialize_firm(); - init_symbol_table(); - init_tokens(); - init_types(); - init_typehash(); - init_lexer(); - init_ast(); - init_parser(); - init_ast2firm(); - const char *input = NULL; const char *outname = NULL; const char *dumpfunction = NULL; @@ -343,6 +362,10 @@ int main(int argc, char **argv) c_mode &= ~_GNUC; } else if(strcmp(arg, "--ms") == 0) { c_mode |= _MS; + } else if(strcmp(arg, "--signed-chars") == 0) { + char_is_signed = true; + } else if(strcmp(arg, "--unsigned-chars") == 0) { + char_is_signed = false; } else if(strcmp(arg, "--no-ms") == 0) { c_mode &= ~_MS; } else if(strcmp(arg, "--lextest") == 0) { @@ -351,6 +374,20 @@ int main(int argc, char **argv) mode = PrintAst; } else if(strcmp(arg, "--print-fluffy") == 0) { mode = PrintFluffy; + } else if(strcmp(arg, "--version") == 0) { + firm_version_t ver; + firm_get_version(&ver); + printf("cparser (%d.%d %s) using libFirm (%d.%d", 0, 1, cparser_REVISION, ver.major, ver.minor); + if(ver.revision[0] != 0) { + putchar(' '); + fputs(ver.revision, stdout); + } + if(ver.build[0] != 0) { + putchar(' '); + fputs(ver.build, stdout); + } + puts(")\n"); + exit(EXIT_SUCCESS); } else if(strcmp(arg, "-fsyntax-only") == 0) { mode = ParseOnly; } else if(strncmp(arg, "-I", 2) == 0) { @@ -361,8 +398,6 @@ int main(int argc, char **argv) const char *opt; GET_ARG_AFTER(opt, "-D"); obstack_printf(&cppflags_obst, " -D%s", opt); - } else if(strcmp(arg, "--dump") == 0) { - do_dump = true; } else if(strcmp(arg, "--dump-function") == 0) { ++i; if(i >= argc) { @@ -378,13 +413,21 @@ int main(int argc, char **argv) } else if(arg[0] == '-' && arg[1] == 'f') { const char *opt; GET_ARG_AFTER(opt, "-f"); - int res = firm_option(opt); - if (res == 0) { - fprintf(stderr, "error: unknown Firm option '-f %s'\n", opt); - argument_errors = true; - continue; - } else if (res == -1) { - help_displayed = true; + + if(strcmp(opt, "omit-frame-pointer") == 0) { + firm_be_option("omitfp"); + } else if(strcmp(opt, "no-omit-frame-pointer") == 0) { + firm_be_option("omitfp=no"); + } else { + int res = firm_option(opt); + if (res == 0) { + fprintf(stderr, "error: unknown Firm option '-f %s'\n", + opt); + argument_errors = true; + continue; + } else if (res == -1) { + help_displayed = true; + } } } else if(arg[0] == '-' && arg[1] == 'b') { const char *opt; @@ -397,6 +440,21 @@ int main(int argc, char **argv) } else if (res == -1) { help_displayed = true; } + } else if(arg[0] == '-' && arg[1] == 'm') { + const char *opt; + 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; + } else { + machine_size = (unsigned int)value; + } } else if(arg[0] == '-') { if (arg[1] == '\0') { if(input != NULL) { @@ -408,7 +466,6 @@ int main(int argc, char **argv) } else if(strcmp(arg, "-pedantic") == 0) { fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); } else if(arg[1] == 'O' || - arg[1] == 'f' || arg[1] == 'W' || arg[1] == 'g' || strncmp(arg + 1, "std=", 4) == 0) { @@ -435,6 +492,16 @@ int main(int argc, char **argv) return 1; } + gen_firm_init(); + init_symbol_table(); + init_tokens(); + init_types(); + init_typehash(); + init_lexer(); + init_ast(); + init_parser(); + init_ast2firm(); + FILE *out; char outnamebuf[4096]; if(outname == NULL) { @@ -518,8 +585,7 @@ int main(int argc, char **argv) write_fluffy_decls(out, unit); } - gen_firm_init(); - create_firm_prog(unit); + translation_unit_to_firm(unit); if(mode == ParseOnly) { return 0;