diff options
| author | rajdakin <rajdakin@gmail.com> | 2024-09-21 12:29:28 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-21 12:29:28 +0200 |
| commit | 09d4cb7b380493a481f256e72667cbc9b8e66c64 (patch) | |
| tree | 41e4196df51aa323379772e174f5b70a2cce2a3e /wrapperhelper/src | |
| parent | fb4f5809224913b342c5cfae9c91787faa61eed4 (diff) | |
| download | box64-09d4cb7b380493a481f256e72667cbc9b8e66c64.tar.gz box64-09d4cb7b380493a481f256e72667cbc9b8e66c64.zip | |
[WRAPPERHELPER] Fixed wrapperhelper (#1850)
Diffstat (limited to 'wrapperhelper/src')
| -rw-r--r-- | wrapperhelper/src/main.c | 153 |
1 files changed, 128 insertions, 25 deletions
diff --git a/wrapperhelper/src/main.c b/wrapperhelper/src/main.c index 84073c48..efa410ab 100644 --- a/wrapperhelper/src/main.c +++ b/wrapperhelper/src/main.c @@ -12,17 +12,25 @@ static void help(char *arg0) { printf("Usage: %s --help\n" - " %s {-I/path/to/include}* [--prepare|--preproc|--proc] <filename_in>\n" - " %s {-I/path/to/include}* <filename_in> <filename_reqs> <filename_out>\n" + " %s {-I/path/to/include}* [--prepare|--preproc|--proc] [--arch <arch>] <filename_in>\n" + " %s {-I/path/to/include}* [--emu <arch>] [--target <arch>] <filename_in> <filename_reqs> <filename_out>\n" "\n" " --prepare Dump all preprocessor tokens (prepare phase)\n" " --preproc Dump all processor tokens (preprocessor phase)\n" - " --proc Dump all typedefs, declarations and constants (processor phase)\n" + " --proc Dump all typedefs, declarations and constants (processor phase, default)\n" " -I Add a path to the list of system includes\n" "\n" + "Filenames may be preceded by '-f' or '--filename'.\n" " <filename_in> Parsing file\n" " <filename_reqs> Reference file (example: wrappedlibc_private.h)\n" - " <filename_out> Output file\n", + " <filename_out> Output file\n" + "\n" + "You can also specify the target architecture:" + " --arch <arch> Use the architecture <arch>\n" + " --emu <arch> Use the architecture <arch> as emulated architecture\n" + " --target <arch> Use the architecture <arch> as target/running architecture\n" + "\n" + " <arch> is one of 'x86_64', 'aarch64'\n", arg0, arg0, arg0); } @@ -43,8 +51,11 @@ int main(int argc, char **argv) { enum main_state ms = MAIN_RUN; const char *in_file = NULL, *ref_file = NULL, *out_file = NULL; VECTOR(charp) *paths = vector_new(charp); + const char *archname = NULL, *emuname = NULL, *targetname = NULL; for (int i = 1; i < argc; ++i) { + int isfile = 0; + if (!strcmp(argv[i], "--help")) { help(argv[0]); return 0; @@ -67,36 +78,93 @@ int main(int argc, char **argv) { printf("Error: failed to add path to buffer\n"); return 2; } - } else if (!in_file) { - in_file = argv[i]; - } else if (!ref_file) { - ref_file = argv[i]; - } else if (!out_file) { - out_file = argv[i]; + } else if (!strcmp(argv[i], "--arch")) { + ++i; + if (i < argc) { + archname = argv[i]; + } else { + printf("Error: invalid '--arch' option in last position\n"); + help(argv[0]); + return 0; + } + } else if (!strcmp(argv[i], "--emu")) { + ++i; + if (i < argc) { + emuname = argv[i]; + } else { + printf("Error: invalid '--emu' option in last position\n"); + help(argv[0]); + return 0; + } + } else if (!strcmp(argv[i], "--target")) { + ++i; + if (i < argc) { + targetname = argv[i]; + } else { + printf("Error: invalid '--target' option in last position\n"); + help(argv[0]); + return 0; + } + } else if (!strcmp(argv[i], "-f") || !strcmp(argv[i], "--filename")) { + ++i; + if (i < argc) { + isfile = 1; + } else { + printf("Error: invalid '--filename' option in last position\n"); + help(argv[0]); + return 0; + } } else { - printf("Error: too many unknown options considered as file\n"); - help(argv[0]); - return 2; + isfile = 1; + } + if (isfile) { + if (!in_file) { + in_file = argv[i]; + } else if (!ref_file) { + ref_file = argv[i]; + } else if (!out_file) { + out_file = argv[i]; + } else { + printf("Error: too many unknown options considered as file\n"); + help(argv[0]); + return 2; + } } } switch (ms) { case MAIN_PREPARE: case MAIN_PREPROC: case MAIN_PROC: + check_proc: if (!in_file || ref_file || out_file) { printf("Error: too many unknown options/not enough arguments\n"); help(argv[0]); return 2; } + if (emuname || targetname) { + printf("Error: invalid option '--emu' or '--target' in prepare/preprocessor/processor mode\n"); + help(argv[0]); + return 2; + } + if (!archname) archname = "x86_64"; break; case MAIN_RUN: if (in_file && !ref_file && !out_file) { ms = MAIN_PROC; - } else if (!in_file || !ref_file || !out_file) { + goto check_proc; + } + if (!in_file || !ref_file || !out_file) { printf("Error: too many unknown options/not enough arguments\n"); help(argv[0]); return 2; } + if (archname) { + printf("Error: invalid option '--arch' in run mode\n"); + help(argv[0]); + return 2; + } + if (!emuname) emuname = "x86_64"; + if (!targetname) targetname = "aarch64"; break; } @@ -116,9 +184,32 @@ int main(int argc, char **argv) { } switch (ms) { case MAIN_RUN: { - file_t *content = parse_file(&machine_x86_64, in_file, f); // Takes ownership of f - if (!content) { + machine_t *emu = convert_machine_name(emuname); + if (!emu) { + printf("Error: invalid emulation architecture '%s'\n", emuname); + } + machine_t *target = convert_machine_name(targetname); + if (!target) { + printf("Error: invalid target architecture '%s'\n", targetname); + } + + file_t *emu_content = parse_file(emu, in_file, f); // Takes ownership of f + if (!emu_content) { + printf("Error: failed to parse the file\n"); + del_machines(); + del_str2kw(); + return 0; + } + + f = fopen(in_file, "r"); + if (!f) { + err(2, "Error: failed to re-open %s", in_file); + return 2; + } + file_t *target_content = parse_file(target, in_file, f); // Takes ownership of f + if (!target_content) { printf("Error: failed to parse the file\n"); + file_del(emu_content); del_machines(); del_str2kw(); return 0; @@ -133,13 +224,14 @@ int main(int argc, char **argv) { } VECTOR(references) *refs = references_from_file(ref_file, ref); if (!refs) { - file_del(content); + file_del(emu_content); + file_del(target_content); del_machines(); del_str2kw(); return 2; } // vector_for(references, req, refs) request_print(req); - if (!solve_references(refs, content->decl_map, content->relaxed_type_conversion)) { + if (!solve_references(refs, emu_content->decl_map, target_content->decl_map, emu_content->relaxed_type_conversion)) { printf("Warning: failed to solve all default requests\n"); } // vector_for(references, req, refs) request_print(req); @@ -147,7 +239,8 @@ int main(int argc, char **argv) { FILE *out = fopen(out_file, "w"); if (!out) { err(2, "Error: failed to open %s", ref_file); - file_del(content); + file_del(emu_content); + file_del(target_content); vector_del(references, refs); del_machines(); del_str2kw(); @@ -156,12 +249,17 @@ int main(int argc, char **argv) { output_from_references(out, refs); fclose(out); vector_del(references, refs); - file_del(content); + file_del(emu_content); + file_del(target_content); del_machines(); del_str2kw(); return 0; } case MAIN_PROC: { - file_t *content = parse_file(&machine_x86_64, in_file, f); // Takes ownership of f + machine_t *arch = convert_machine_name(archname); + if (!arch) { + printf("Error: invalid architecture '%s'\n", archname); + } + file_t *content = parse_file(arch, in_file, f); // Takes ownership of f if (!content) { printf("Error: failed to parse the file\n"); del_machines(); @@ -227,18 +325,23 @@ int main(int argc, char **argv) { return 0; } case MAIN_PREPARE: + // Ignored --arch, since this phase does not depend on the architecture dump_prepare(in_file, f); // Takes ownership of f del_machines(); del_str2kw(); return 0; - case MAIN_PREPROC: - dump_preproc(&machine_x86_64, in_file, f); // Takes ownership of f + case MAIN_PREPROC: { + machine_t *arch = convert_machine_name(archname); + if (!arch) { + printf("Error: invalid architecture '%s'\n", archname); + } + dump_preproc(arch, in_file, f); // Takes ownership of f del_machines(); del_str2kw(); - return 0; + return 0; } } - printf("<internal error> Failed to run mode %u\n", ms); + printf("Internal error: failed to run mode %u\n", ms); return 2; } |