X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=main.c;h=e45a3dee3aa251d4d09a96d711e82b52f7ad2dc6;hb=f972547895d0931b7d80a5e5f78d16b79230833b;hp=5c83317ad7423d8ee05456f4ea30bdb21a2e807f;hpb=5762d09c8c4f6f273a8de56e0b0f5cbafb490edc;p=cparser diff --git a/main.c b/main.c index 5c83317..e45a3de 100644 --- a/main.c +++ b/main.c @@ -72,8 +72,9 @@ #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" @@ -271,6 +272,7 @@ static void add_flag(struct obstack *obst, const char *format, ...) case '\r': case '\t': case '`': + case '|': obstack_1grow(obst, '\\'); /* FALLTHROUGH */ default: @@ -300,8 +302,17 @@ 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)); - /* hack... */ + /* 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') { @@ -498,7 +509,8 @@ typedef enum compile_mode_t { LexTest, PrintAst, PrintFluffy, - PrintCaml + PrintCaml, + PrintJna } compile_mode_t; static void usage(const char *argv0) @@ -507,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"); } @@ -817,6 +831,9 @@ 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 { @@ -1026,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); @@ -1145,6 +1164,7 @@ int main(int argc, char **argv) case PrintAst: case PrintFluffy: case PrintCaml: + case PrintJna: case LexTest: case PreprocessOnly: case ParseOnly: @@ -1207,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) @@ -1220,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; } @@ -1309,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); } } @@ -1321,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); @@ -1364,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; } } @@ -1404,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) {