about summary refs log tree commit diff stats
path: root/wrapperhelper/src
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2024-09-21 12:29:28 +0200
committerGitHub <noreply@github.com>2024-09-21 12:29:28 +0200
commit09d4cb7b380493a481f256e72667cbc9b8e66c64 (patch)
tree41e4196df51aa323379772e174f5b70a2cce2a3e /wrapperhelper/src
parentfb4f5809224913b342c5cfae9c91787faa61eed4 (diff)
downloadbox64-09d4cb7b380493a481f256e72667cbc9b8e66c64.tar.gz
box64-09d4cb7b380493a481f256e72667cbc9b8e66c64.zip
[WRAPPERHELPER] Fixed wrapperhelper (#1850)
Diffstat (limited to 'wrapperhelper/src')
-rw-r--r--wrapperhelper/src/main.c153
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;
 }