X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=2790e01115a237738bef98ec747fd7d58176c284;hb=d8d27b747100f1ca0e6250bc6f3f8191f42d349f;hp=70c5ba08aac0a51b76d3c0cb5512d467d9c5873a;hpb=6ff85b6a89c74076dc516e3a38bc26bd80c37fa5;p=cparser diff --git a/main.c b/main.c index 70c5ba0..2790e01 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 @@ -19,40 +46,63 @@ #include "lexer.h" #include "token_t.h" +#include "types.h" #include "type_hash.h" #include "parser.h" #include "ast2firm.h" +#include "diagnostic.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. */ +unsigned int c_mode = _C89|_C99|_GNUC; + +/** The 'machine size', 16, 32 or 64 bit, 32bit is the default. */ +unsigned int machine_size = 32; -/** The current c mode/dialect */ -unsigned int c_mode = _C99|_GNUC; +/** true if the char type is signed. */ +bool char_is_signed = true; + +/** true for strict language checking. */ +bool strict_mode = false; 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 +111,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 +253,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 +307,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 +327,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 +367,12 @@ 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, "--strict") == 0) { + strict_mode = true; } else if(strcmp(arg, "--no-ms") == 0) { c_mode &= ~_MS; } else if(strcmp(arg, "--lextest") == 0) { @@ -351,6 +381,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 (%u.%u", 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 +405,10 @@ 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(strncmp(arg, "-U", 2) == 0) { + const char *opt; + GET_ARG_AFTER(opt, "-U"); + obstack_printf(&cppflags_obst, " -U%s", opt); } else if(strcmp(arg, "--dump-function") == 0) { ++i; if(i >= argc) { @@ -375,16 +421,26 @@ int main(int argc, char **argv) mode = CompileDump; } else if(strcmp(arg, "-v") == 0) { verbose = 1; + } else if(strcmp(arg, "-w") == 0) { + inhibit_all_warnings = true; } 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 +453,31 @@ int main(int argc, char **argv) } else if (res == -1) { help_displayed = true; } + } else if(arg[0] == '-' && arg[1] == 'W') { + const char *opt; + GET_ARG_AFTER(opt, "-W"); + if (strcmp(opt, "error") == 0) { + warnings_are_errors = true; + } else if (strcmp(opt, "fatal-errors") == 0) { + fatal_errors = true; + } else { + fprintf(stderr, "warning: ignoring gcc option -W%s\n", opt); + } + } 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,8 +489,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) { fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg); @@ -427,6 +506,9 @@ int main(int argc, char **argv) } } + /* we do the lowering in ast2firm */ + firm_opt.lower_bitfields = FALSE; + if(help_displayed) { return !argument_errors; } @@ -435,7 +517,18 @@ int main(int argc, char **argv) return 1; } - FILE *out; + gen_firm_init(); + init_symbol_table(); + init_tokens(); + init_types(); + init_typehash(); + init_basic_types(); + init_lexer(); + init_ast(); + init_parser(); + init_ast2firm(); + + FILE *out = NULL; char outnamebuf[4096]; if(outname == NULL) { switch(mode) { @@ -503,8 +596,14 @@ int main(int argc, char **argv) FILE *preprocessed_in = preprocess(in, input); translation_unit_t *const unit = do_parsing(preprocessed_in, input); pclose(preprocessed_in); - if(unit == NULL) - return 1; + if(unit == NULL) { + /* parsing failed because of errors */ + fprintf(stderr, "%u error(s), %u warning(s)\n", error_count, warning_count); + return EXIT_FAILURE; + } + if (warning_count > 0) { + fprintf(stderr, "%u warning(s)\n", warning_count); + } if(mode == PrintAst) { type_set_output(out); @@ -518,8 +617,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;