X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=e45a3dee3aa251d4d09a96d711e82b52f7ad2dc6;hb=f972547895d0931b7d80a5e5f78d16b79230833b;hp=fefaa38e26c5d46f88e544b4920ac19c3e8b3f54;hpb=20bc850757a10ab289370e9e46d11f25f43fb5d7;p=cparser diff --git a/main.c b/main.c index fefaa38..e45a3de 100644 --- a/main.c +++ b/main.c @@ -72,14 +72,15 @@ #include "driver/firm_opt.h" #include "driver/firm_cmdline.h" #include "adt/error.h" -#include "write_fluffy.h" -#include "write_caml.h" +#include "wrappergen/write_fluffy.h" +#include "wrappergen/write_caml.h" +#include "wrappergen/write_jna.h" #include "revision.h" #include "warning.h" #include "mangle.h" #ifndef PREPROCESSOR -#ifdef __APPLE__ +#ifndef __WIN32__ #define PREPROCESSOR "gcc -E -std=c99 -m32 -U__STRICT_ANSI__" #else #define PREPROCESSOR "cpp -std=c99 -m32 -U__STRICT_ANSI__" @@ -256,17 +257,22 @@ static void add_flag(struct obstack *obst, const char *format, ...) /* escape stuff... */ for (char *c = buf; *c != '\0'; ++c) { switch(*c) { - case '"': - case '\'': - case '`': case ' ': - case '\t': - case '\n': - case '\r': - case '\\': + case '"': case '$': + case '&': case '(': case ')': + case ';': + case '<': + case '>': + case '\'': + case '\\': + case '\n': + case '\r': + case '\t': + case '`': + case '|': obstack_1grow(obst, '\\'); /* FALLTHROUGH */ default: @@ -296,6 +302,18 @@ static FILE *preprocess(const char *fname) add_flag(&cppflags_obst, "-U__SIZE_TYPE__"); add_flag(&cppflags_obst, "-D__SIZE_TYPE__=%s", type_to_string(type_size_t)); + /* TODO hack... */ + add_flag(&cppflags_obst, "-D__builtin_abort=abort"); + add_flag(&cppflags_obst, "-D__builtin_abs=abs"); + add_flag(&cppflags_obst, "-D__builtin_exit=exit"); + add_flag(&cppflags_obst, "-D__builtin_malloc=malloc"); + add_flag(&cppflags_obst, "-D__builtin_memcmp=memcmp"); + add_flag(&cppflags_obst, "-D__builtin_memcpy=memcpy"); + add_flag(&cppflags_obst, "-D__builtin_memset=memset"); + add_flag(&cppflags_obst, "-D__builtin_strlen=strlen"); + add_flag(&cppflags_obst, "-D__builtin_strcmp=strcmp"); + add_flag(&cppflags_obst, "-D__builtin_strcpy=strcpy"); + /* handle dependency generation */ if (dep_target[0] != '\0') { add_flag(&cppflags_obst, "-MF"); @@ -341,6 +359,30 @@ static void assemble(const char *out, const char *in) } } +static void print_file_name(const char *file) +{ + add_flag(&ldflags_obst, "-print-file-name=%s", file); + + obstack_1grow(&ldflags_obst, '\0'); + const char *flags = obstack_finish(&ldflags_obst); + + /* construct commandline */ + obstack_printf(&ldflags_obst, "%s ", LINKER); + obstack_printf(&ldflags_obst, "%s", flags); + obstack_1grow(&ldflags_obst, '\0'); + + char *commandline = obstack_finish(&ldflags_obst); + + if (verbose) { + puts(commandline); + } + int err = system(commandline); + if (err != EXIT_SUCCESS) { + fprintf(stderr, "linker reported an error\n"); + exit(1); + } +} + static const char *try_dir(const char *dir) { if (dir == NULL) @@ -467,7 +509,8 @@ typedef enum compile_mode_t { LexTest, PrintAst, PrintFluffy, - PrintCaml + PrintCaml, + PrintJna } compile_mode_t; static void usage(const char *argv0) @@ -476,18 +519,20 @@ static void usage(const char *argv0) } static void print_cparser_version(void) { - firm_version_t ver; - firm_get_version(&ver); - printf("cparser (%s) using libFirm (%u.%u", - cparser_REVISION, ver.major, ver.minor); - if (ver.revision[0] != 0) { + cparser_REVISION, ir_get_version_major(), + ir_get_version_minor()); + + const char *revision = ir_get_version_revision(); + if (revision[0] != 0) { putchar(' '); - fputs(ver.revision, stdout); + fputs(revision, stdout); } - if (ver.build[0] != 0) { + + const char *build = ir_get_version_build(); + if (build[0] != 0) { putchar(' '); - fputs(ver.build, stdout); + fputs(build, stdout); } puts(")\n"); } @@ -600,6 +645,7 @@ int main(int argc, char **argv) initialize_firm(); const char *dumpfunction = NULL; + const char *print_file_name_file = NULL; compile_mode_t mode = CompileAssembleLink; int opt_level = 1; int result = EXIT_SUCCESS; @@ -761,6 +807,20 @@ int main(int argc, char **argv) GET_ARG_AFTER(opt, "-MT"); add_flag(&cppflags_obst, "-%s", option); add_flag(&cppflags_obst, "%s", opt); + } else if (streq(option, "include")) { + const char *opt; + GET_ARG_AFTER(opt, "-include"); + add_flag(&cppflags_obst, "-include"); + add_flag(&cppflags_obst, "%s", opt); + } else if (streq(option, "isystem")) { + const char *opt; + GET_ARG_AFTER(opt, "-isystem"); + add_flag(&cppflags_obst, "-isystem"); + add_flag(&cppflags_obst, "%s", opt); + } else if (streq(option, "nostdinc") + || streq(option, "trigraphs")) { + /* pass these through to the preprocessor */ + add_flag(&cppflags_obst, "%s", arg); } else if (streq(option, "pipe")) { /* here for gcc compatibility */ } else if (option[0] == 'f') { @@ -771,6 +831,11 @@ int main(int argc, char **argv) strstart(orig_opt, "align-jumps=") || strstart(orig_opt, "align-functions=")) { fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt); + } else if (strstart(orig_opt, "input-charset=")) { + char const* const encoding = strchr(orig_opt, '=') + 1; + select_input_encoding(encoding); + } else if (streq(orig_opt, "verbose-asm")) { + /* ignore: we always print verbose assembler */ } else { char const *opt = orig_opt; bool truth_value = true; @@ -828,16 +893,19 @@ int main(int argc, char **argv) strncpy(cpu_arch, opt, sizeof(cpu_arch)); } } else if (option[0] == 'W') { - if (option[1] == 'p') { + if (strstart(option + 1, "p,")) { // pass options directly to the preprocessor const char *opt; GET_ARG_AFTER(opt, "-Wp,"); add_flag(&cppflags_obst, "-Wp,%s", opt); } else if (strstart(option + 1, "l,")) { - // pass options directly to the linker + // pass options directly to the linker const char *opt; GET_ARG_AFTER(opt, "-Wl,"); add_flag(&ldflags_obst, "-Wl,%s", opt); + } else if (streq(option + 1, "no-trigraphs") + || streq(option + 1, "undef")) { + add_flag(&cppflags_obst, "%s", arg); } else { set_warning_opt(&option[1]); } @@ -938,6 +1006,8 @@ int main(int argc, char **argv) (fprintf(stderr, "warning: ignoring gcc option '%s'\n", arg), standard); } else if (streq(option, "version")) { print_cparser_version(); + } else if (strstart(option, "print-file-name=")) { + GET_ARG_AFTER(print_file_name_file, "-print-file-name="); } else if (option[0] == '-') { /* double dash option */ ++option; @@ -973,6 +1043,8 @@ int main(int argc, char **argv) mode = PrintFluffy; } else if (streq(option, "print-caml")) { mode = PrintCaml; + } else if (streq(option, "print-jna")) { + mode = PrintJna; } else if (streq(option, "version")) { print_cparser_version(); exit(EXIT_SUCCESS); @@ -1041,6 +1113,11 @@ int main(int argc, char **argv) } } + if (print_file_name_file != NULL) { + print_file_name(print_file_name_file); + return 0; + } + if (files == NULL) { fprintf(stderr, "error: no input files specified\n"); argument_errors = true; @@ -1087,6 +1164,7 @@ int main(int argc, char **argv) case PrintAst: case PrintFluffy: case PrintCaml: + case PrintJna: case LexTest: case PreprocessOnly: case ParseOnly: @@ -1149,9 +1227,17 @@ int main(int argc, char **argv) FILE *preprocessed_in = NULL; switch (filetype) { - case FILETYPE_C: filetype = FILETYPE_PREPROCESSED_C; goto preprocess; - case FILETYPE_CXX: filetype = FILETYPE_PREPROCESSED_CXX; goto preprocess; - case FILETYPE_ASSEMBLER: filetype = FILETYPE_PREPROCESSED_ASSEMBLER; goto preprocess; + case FILETYPE_C: + filetype = FILETYPE_PREPROCESSED_C; + goto preprocess; + case FILETYPE_CXX: + filetype = FILETYPE_PREPROCESSED_CXX; + goto preprocess; + case FILETYPE_ASSEMBLER: + filetype = FILETYPE_PREPROCESSED_ASSEMBLER; + add_flag(&cppflags_obst, "-x"); + add_flag(&cppflags_obst, "assembler-with-cpp"); + goto preprocess; preprocess: /* no support for input on FILE* yet */ if (in != NULL) @@ -1162,6 +1248,10 @@ preprocess: copy_file(out, preprocessed_in); int result = pclose(preprocessed_in); fclose(out); + /* remove output file in case of error */ + if (out != stdout && result != EXIT_SUCCESS) { + unlink(outname); + } return result; } @@ -1251,6 +1341,9 @@ do_parsing: if (in == preprocessed_in) { int pp_result = pclose(preprocessed_in); if (pp_result != EXIT_SUCCESS) { + /* remove output file */ + if (out != stdout) + unlink(outname); exit(EXIT_FAILURE); } } @@ -1263,6 +1356,9 @@ do_parsing: } else if (mode == PrintCaml) { write_caml_decls(out, unit); continue; + } else if (mode == PrintJna) { + write_jna_decls(out, unit); + continue; } translation_unit_to_firm(unit); @@ -1306,6 +1402,9 @@ do_parsing: if (in == preprocessed_in) { int pp_result = pclose(preprocessed_in); if (pp_result != EXIT_SUCCESS) { + /* remove output in error case */ + if (out != stdout) + unlink(outname); return pp_result; } } @@ -1346,8 +1445,11 @@ do_parsing: file->type = filetype; } - if (result != EXIT_SUCCESS) + if (result != EXIT_SUCCESS) { + if (out != stdout) + unlink(outname); return result; + } /* link program file */ if (mode == CompileAssembleLink) {