ego now builds and is used.
This needed lots of refactoring to ego --- not all platforms have ego descr files, and ego will just crash if you invoke it without one. I think originally it was never intended that these platforms would be used at -O2 or above. Plats now only specify the ego descr file if they have one.
This commit is contained in:
		
							parent
							
								
									08823a172c
								
							
						
					
					
						commit
						5bae29a00c
					
				
					 19 changed files with 461 additions and 262 deletions
				
			
		|  | @ -2,7 +2,7 @@ vars.cflags = { | ||||||
| 	"-g", "-O" | 	"-g", "-O" | ||||||
| } | } | ||||||
| vars.ackcflags = { | vars.ackcflags = { | ||||||
| 	"-O" | 	"-O6" | ||||||
| } | } | ||||||
| vars.plats = { | vars.plats = { | ||||||
| 	"cpm", | 	"cpm", | ||||||
|  | @ -27,6 +27,7 @@ installable { | ||||||
| 		"util/ack+pkg", | 		"util/ack+pkg", | ||||||
| 		"util/amisc+pkg", | 		"util/amisc+pkg", | ||||||
| 		"util/arch+pkg", | 		"util/arch+pkg", | ||||||
|  | 		"util/ego+pkg", | ||||||
| 		"util/led+pkg", | 		"util/led+pkg", | ||||||
| 		"util/misc+pkg", | 		"util/misc+pkg", | ||||||
| 		"util/opt+pkg", | 		"util/opt+pkg", | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								lib/descr/fe
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								lib/descr/fe
									
										
									
									
									
								
							|  | @ -206,19 +206,6 @@ name ego | ||||||
| 	to .gk | 	to .gk | ||||||
| 	program {EM}/lib/ack/em_ego | 	program {EM}/lib/ack/em_ego | ||||||
| 	mapflag -EGO-* EGO_F={EGO_F?} -* | 	mapflag -EGO-* EGO_F={EGO_F?} -* | ||||||
| # The following lines are obsolete, but here for backwards compatibility. |  | ||||||
| # They should be removed some day. |  | ||||||
| 	mapflag -IL* EGO_F={EGO_F?} -IL* |  | ||||||
| 	mapflag -CS* EGO_F={EGO_F?} -CS* |  | ||||||
| 	mapflag -SR* EGO_F={EGO_F?} -SR* |  | ||||||
| 	mapflag -UD* EGO_F={EGO_F?} -UD* |  | ||||||
| 	mapflag -LV* EGO_F={EGO_F?} -LV* |  | ||||||
| 	mapflag -SA* EGO_F={EGO_F?} -RA* |  | ||||||
| 	mapflag -SP* EGO_F={EGO_F?} -SP* |  | ||||||
| 	mapflag -BO* EGO_F={EGO_F?} -BO* |  | ||||||
| 	mapflag -CJ* EGO_F={EGO_F?} -CJ* |  | ||||||
| 	mapflag -EV EGO_F={EGO_F?} -V |  | ||||||
| # End of obsolete lines |  | ||||||
| 	mapflag -Q* EGO_F={EGO_F?} -Q* | 	mapflag -Q* EGO_F={EGO_F?} -Q* | ||||||
| 	mapflag -T* EGO_F={EGO_F?} -T* | 	mapflag -T* EGO_F={EGO_F?} -T* | ||||||
| 	mapflag -S* EGO_F={EGO_F?} -S* | 	mapflag -S* EGO_F={EGO_F?} -S* | ||||||
|  | @ -227,7 +214,7 @@ name ego | ||||||
| 	mapflag -O* EGO_F={EGO_F?} -O* | 	mapflag -O* EGO_F={EGO_F?} -O* | ||||||
| 	args \ | 	args \ | ||||||
| 		{EGO_F?} -P {EM}/lib/ack/ego \ | 		{EGO_F?} -P {EM}/lib/ack/ego \ | ||||||
| 		-M{EM}/share/ack/ego/{ARCH}.descr < | 		{EGO_PLAT_FLAGS?} < | ||||||
| 	optimizer 2 | 	optimizer 2 | ||||||
| 	stdout | 	stdout | ||||||
| 	combiner | 	combiner | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ definerule("ackfile", | ||||||
| 				"lang/pc/comp+pkg", | 				"lang/pc/comp+pkg", | ||||||
| 				"plat/"..plat.."+tools", | 				"plat/"..plat.."+tools", | ||||||
| 				"util/ack+pkg", | 				"util/ack+pkg", | ||||||
|  | 				"util/ego+pkg", | ||||||
| 				"util/misc+pkg", | 				"util/misc+pkg", | ||||||
| 				e.deps | 				e.deps | ||||||
| 			}, | 			}, | ||||||
|  | @ -67,7 +68,6 @@ definerule("ackprogram", | ||||||
| 				"plat/"..e.vars.plat.."+pkg", | 				"plat/"..e.vars.plat.."+pkg", | ||||||
| 				"util/ack+pkg", | 				"util/ack+pkg", | ||||||
| 				"util/led+pkg", | 				"util/led+pkg", | ||||||
| 				"util/amisc+pkg", |  | ||||||
| 				e.deps | 				e.deps | ||||||
| 			}, | 			}, | ||||||
| 			_clibrary = acklibrary, | 			_clibrary = acklibrary, | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ var C_LIB={PLATFORMDIR}/libc-ansi.a | ||||||
| var CC_ALIGN=-Vr | var CC_ALIGN=-Vr | ||||||
| var OLD_C_LIB={C_LIB} | var OLD_C_LIB={C_LIB} | ||||||
| var MACHOPT_F=-m10 | var MACHOPT_F=-m10 | ||||||
|  | var EGO_PLAT_FLAGS=-M{EM}/share/ack/ego/{ARCH}.descr | ||||||
| 
 | 
 | ||||||
| # Override the setting in fe so that files compiled for linux386 can see | # Override the setting in fe so that files compiled for linux386 can see | ||||||
| # the platform-specific headers. | # the platform-specific headers. | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ var C_LIB={PLATFORMDIR}/libc-ansi.a | ||||||
| var CC_ALIGN=-Vr | var CC_ALIGN=-Vr | ||||||
| var OLD_C_LIB={C_LIB} | var OLD_C_LIB={C_LIB} | ||||||
| var MACHOPT_F=-ml10 | var MACHOPT_F=-ml10 | ||||||
|  | var EGO_PLAT_FLAGS=-M{EM}/share/ack/ego/{ARCH}.descr | ||||||
| 
 | 
 | ||||||
| # Override the setting in fe so that files compiled for linux68k can see | # Override the setting in fe so that files compiled for linux68k can see | ||||||
| # the platform-specific headers. | # the platform-specific headers. | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ var PLATFORMDIR={EM}/share/ack/{PLATFORM} | ||||||
| var CPP_F=-D__unix | var CPP_F=-D__unix | ||||||
| var ALIGN=-a0:1 -a1:1 -a2:1 -a3:1 | var ALIGN=-a0:1 -a1:1 -a2:1 -a3:1 | ||||||
| var MACHOPT_F=-m8 | var MACHOPT_F=-m8 | ||||||
|  | var EGO_PLAT_FLAGS=-M{EM}/share/ack/ego/{ARCH}.descr | ||||||
| 
 | 
 | ||||||
| # Override the setting in fe so that files compiled for this platform can see | # Override the setting in fe so that files compiled for this platform can see | ||||||
| # the platform-specific headers. | # the platform-specific headers. | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								util/ego/build.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								util/ego/build.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | ||||||
|  | local function build_ego(name) | ||||||
|  | 	cprogram { | ||||||
|  | 		name = name, | ||||||
|  | 		srcs = { "./"..name.."/*.c" }, | ||||||
|  | 		deps = { | ||||||
|  | 			"util/ego/share+lib", | ||||||
|  | 			"modules/src/em_data+lib", | ||||||
|  | 			"h+emheaders", | ||||||
|  | 		}, | ||||||
|  | 		vars = { | ||||||
|  | 			["+cflags"] = {"-DVERBOSE", "-DNOTCOMPACT"} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | build_ego("bo") | ||||||
|  | build_ego("ca") | ||||||
|  | build_ego("cf") | ||||||
|  | build_ego("cj") | ||||||
|  | build_ego("cs") | ||||||
|  | build_ego("ic") | ||||||
|  | build_ego("il") | ||||||
|  | build_ego("lv") | ||||||
|  | build_ego("sp") | ||||||
|  | build_ego("sr") | ||||||
|  | build_ego("ud") | ||||||
|  | 
 | ||||||
|  | cprogram { | ||||||
|  | 	name = "em_ego", | ||||||
|  | 	srcs = { "./em_ego/em_ego.c" }, | ||||||
|  | 	deps = { | ||||||
|  | 		"modules/src/print+lib", | ||||||
|  | 		"modules/src/string+lib", | ||||||
|  | 		"modules/src/system+lib", | ||||||
|  | 		"modules+headers", | ||||||
|  | 		"h+emheaders", | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | installable { | ||||||
|  | 	name = "pkg", | ||||||
|  | 	map = { | ||||||
|  | 		["$(PLATDEP)/em_ego"] = "+em_ego", | ||||||
|  | 		["$(PLATDEP)/ego/bo"] = "+bo", | ||||||
|  | 		["$(PLATDEP)/ego/ca"] = "+ca", | ||||||
|  | 		["$(PLATDEP)/ego/cf"] = "+cf", | ||||||
|  | 		["$(PLATDEP)/ego/cj"] = "+cj", | ||||||
|  | 		["$(PLATDEP)/ego/cs"] = "+cs", | ||||||
|  | 		["$(PLATDEP)/ego/ic"] = "+ic", | ||||||
|  | 		["$(PLATDEP)/ego/il"] = "+il", | ||||||
|  | 		["$(PLATDEP)/ego/lv"] = "+lv", | ||||||
|  | 		["$(PLATDEP)/ego/ra"] = "./ra+ra", | ||||||
|  | 		["$(PLATDEP)/ego/sp"] = "+sp", | ||||||
|  | 		["$(PLATDEP)/ego/sr"] = "+sr", | ||||||
|  | 		["$(PLATDEP)/ego/ud"] = "+ud", | ||||||
|  | 		"./descr+pkg", | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -220,24 +220,50 @@ main(argc, argv) int argc; | ||||||
| char* argv[]; | char* argv[]; | ||||||
| { | { | ||||||
| 	/* CA does not output proctable etc. files. Instead, its
 | 	/* CA does not output proctable etc. files. Instead, its
 | ||||||
| 	 * pname2 and dname2 arguments contain the names of the | 	 * pname_out and dname_out arguments contain the names of the | ||||||
| 	 * dump files created by IC. | 	 * dump files created by IC. | ||||||
| 	 */ | 	 */ | ||||||
|  | 	struct files* files = findfiles(argc, argv); | ||||||
|  | 
 | ||||||
| 	FILE* f, *f2; /* The EM input and output. */ | 	FILE* f, *f2; /* The EM input and output. */ | ||||||
| 	FILE* df, *pf; /* The dump files */ | 	FILE* df, *pf; /* The dump files */ | ||||||
| 	line_p lnp; | 	line_p lnp; | ||||||
| 
 | 
 | ||||||
| 	fproc = getptable(pname); /* proc table */ | 	/* The names of the input files of every phase are passed as
 | ||||||
| 	fdblock = getdtable(dname); /* data block table */ | 	 * arguments to the phase. First come the input file names, | ||||||
|  | 	 * then the output file names. We use a one-letter convention | ||||||
|  | 	 * to denote the type of file: | ||||||
|  | 	 *  p: procedure table file | ||||||
|  | 	 *  d: data table file | ||||||
|  | 	 *  l: EM text file (lines of EM instructions) | ||||||
|  | 	 *  b: basic block file (Control Flow Graph file) | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	/* The input file names */ | ||||||
|  | 
 | ||||||
|  | 	char* pname_in = argv[1]; | ||||||
|  | 	char* dname_in = argv[2]; | ||||||
|  | 	char* lname_in = argv[3]; | ||||||
|  | 	char* bname_in = argv[4]; | ||||||
|  | 
 | ||||||
|  | 	/* The output file names */ | ||||||
|  | 
 | ||||||
|  | 	char* pname_out = argv[5]; | ||||||
|  | 	char* dname_out = argv[6]; | ||||||
|  | 	char* lname_out = argv[7]; | ||||||
|  | 	char* bname_out = argv[8]; | ||||||
|  | 
 | ||||||
|  | 	fproc = getptable(pname_in); /* proc table */ | ||||||
|  | 	fdblock = getdtable(dname_in); /* data block table */ | ||||||
| 	dlength = makedmap(fdblock); /* allocate dmap table */ | 	dlength = makedmap(fdblock); /* allocate dmap table */ | ||||||
| 	df = openfile(dname2, "r"); | 	df = openfile(dname_out, "r"); | ||||||
| 	getdnames(df); | 	getdnames(df); | ||||||
| 	fclose(df); | 	fclose(df); | ||||||
| 	pf = openfile(pname2, "r"); | 	pf = openfile(pname_out, "r"); | ||||||
| 	getpnames(pf); | 	getpnames(pf); | ||||||
| 	fclose(pf); | 	fclose(pf); | ||||||
| 	uniq_names(); | 	uniq_names(); | ||||||
| 	f = openfile(lname, "r"); | 	f = openfile(lname_in, "r"); | ||||||
| 	f2 = stdout; | 	f2 = stdout; | ||||||
| 	cputmagic(f2); /* write magic number */ | 	cputmagic(f2); /* write magic number */ | ||||||
| 	while ((lnp = get_ca_lines(f, &curproc)) != (line_p)0) | 	while ((lnp = get_ca_lines(f, &curproc)) != (line_p)0) | ||||||
|  |  | ||||||
|  | @ -530,22 +530,46 @@ char* argv[]; | ||||||
| 	short n, kind; | 	short n, kind; | ||||||
| 	line_p l; | 	line_p l; | ||||||
| 
 | 
 | ||||||
|  | 	/* The names of the input files of every phase are passed as
 | ||||||
|  | 	 * arguments to the phase. First come the input file names, | ||||||
|  | 	 * then the output file names. We use a one-letter convention | ||||||
|  | 	 * to denote the type of file: | ||||||
|  | 	 *  p: procedure table file | ||||||
|  | 	 *  d: data table file | ||||||
|  | 	 *  l: EM text file (lines of EM instructions) | ||||||
|  | 	 *  b: basic block file (Control Flow Graph file) | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	/* The input file names */ | ||||||
|  | 
 | ||||||
|  | 	char* pname_in = argv[1]; | ||||||
|  | 	char* dname_in = argv[2]; | ||||||
|  | 	char* lname_in = argv[3]; | ||||||
|  | 	char* bname_in = argv[4]; | ||||||
|  | 
 | ||||||
|  | 	/* The output file names */ | ||||||
|  | 
 | ||||||
|  | 	char* pname_out = argv[5]; | ||||||
|  | 	char* dname_out = argv[6]; | ||||||
|  | 	char* lname_out = argv[7]; | ||||||
|  | 	char* bname_out = argv[8]; | ||||||
|  | 
 | ||||||
| 	linecount = 0; | 	linecount = 0; | ||||||
| 	fproc = getptable(pname); /* proc table */ | 	fproc = getptable(pname_in); /* proc table */ | ||||||
| 	fdblock = getdtable(dname); /* data block table */ | 	fdblock = getdtable(dname_in); /* data block table */ | ||||||
| 	lpi_set = Cempty_set(plength); | 	lpi_set = Cempty_set(plength); | ||||||
| 	cai_set = Cempty_set(plength); | 	cai_set = Cempty_set(plength); | ||||||
| 	if ((f = fopen(lname, "r")) == NULL) | 	if ((f = fopen(lname_in, "r")) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		error("cannot open %s", lname); | 		error("cannot open %s", lname_in); | ||||||
| 	} | 	} | ||||||
| 	if ((f2 = fopen(lname2, "w")) == NULL) | 	if ((f2 = fopen(lname_out, "w")) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		error("cannot open %s", lname2); | 		error("cannot open %s", lname_out); | ||||||
| 	} | 	} | ||||||
| 	if ((gf2 = fopen(bname2, "w")) == NULL) | 	if ((gf2 = fopen(bname_out, "w")) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		error("cannot open %s", bname2); | 		error("cannot open %s", bname_out); | ||||||
| 	} | 	} | ||||||
| 	while (getbblocks(f, &kind, &n, &g, &l)) | 	while (getbblocks(f, &kind, &n, &g, &l)) | ||||||
| 	{ | 	{ | ||||||
|  | @ -581,14 +605,14 @@ char* argv[]; | ||||||
| 	/* Compute transitive closure of used/changed
 | 	/* Compute transitive closure of used/changed
 | ||||||
| 	 * variables information for every procedure. | 	 * variables information for every procedure. | ||||||
| 	 */ | 	 */ | ||||||
| 	if ((f = fopen(dname2, "w")) == NULL) | 	if ((f = fopen(dname_out, "w")) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		error("cannot open %s", dname2); | 		error("cannot open %s", dname_out); | ||||||
| 	} | 	} | ||||||
| 	putdtable(fdblock, f); | 	putdtable(fdblock, f); | ||||||
| 	if ((f = fopen(pname2, "w")) == NULL) | 	if ((f = fopen(pname_out, "w")) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		error("cannot open %s", pname2); | 		error("cannot open %s", pname_out); | ||||||
| 	} | 	} | ||||||
| 	putptable(fproc, f, TRUE); | 	putptable(fproc, f, TRUE); | ||||||
| 	exit(0); | 	exit(0); | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								util/ego/descr/build.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								util/ego/descr/build.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | local installmap = {} | ||||||
|  | 
 | ||||||
|  | local function build_descr(name) | ||||||
|  | 	local descr = normalrule { | ||||||
|  | 		name = name, | ||||||
|  | 		ins = { | ||||||
|  | 			"lang/cem/cpp.ansi+cpp", | ||||||
|  | 			"./"..name..".descr", | ||||||
|  | 			"./descr.sed", | ||||||
|  | 			matching(filenamesof("modules/src/em_data+lib"), "em_mnem%.h$"), | ||||||
|  | 		}, | ||||||
|  | 		outleaves = { name..".descr" }, | ||||||
|  | 		commands = { | ||||||
|  | 			"%{ins[1]} -P -I%{dirname(ins[4])} %{ins[2]} > %{dir}/temp", | ||||||
|  | 			"sed -f %{ins[3]} < %{dir}/temp > %{outs}" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	installmap["$(PLATIND)/ego/"..name..".descr"] = descr | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | build_descr("i386") | ||||||
|  | build_descr("i86") | ||||||
|  | build_descr("m68020") | ||||||
|  | 
 | ||||||
|  | installable { | ||||||
|  | 	name = "pkg", | ||||||
|  | 	map = installmap | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @ -4,38 +4,54 @@ | ||||||
|    optimizer itself one day ... |    optimizer itself one day ... | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| #include <em_path.h> | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <unistd.h> | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
| #include <system.h> | #include <sys/types.h> | ||||||
|  | #include <sys/wait.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include "em_path.h" | ||||||
|  | #include "system.h" | ||||||
|  | #include "print.h" | ||||||
| 
 | 
 | ||||||
| #define IC 1 | enum | ||||||
| #define CF 2 | { | ||||||
| #define IL 3 | 	NONE = 0, | ||||||
| #define CS 4 | 	IC, | ||||||
| #define SR 5 | 	CF, | ||||||
| #define UD 6 | 	IL, | ||||||
| #define LV 7 | 	CS, | ||||||
| #define RA 8 | 	SR, | ||||||
| #define SP 9 | 	UD, | ||||||
| #define BO 10 | 	LV, | ||||||
| #define CJ 11 | 	RA, | ||||||
| #define CA 12 | 	SP, | ||||||
|  | 	BO, | ||||||
|  | 	CJ, | ||||||
|  | 	CA | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| static char* phnames[] = { | static const struct | ||||||
| 	0, | { | ||||||
| 	"ic", | 	const char* name; | ||||||
| 	"cf", | 	bool needsdescr; | ||||||
| 	"il", | 
 | ||||||
| 	"cs", | } phase_data[] = { | ||||||
| 	"sr", | 	{}, | ||||||
| 	"ud", | 	{ "ic" }, | ||||||
| 	"lv", | 	{ "cf" }, | ||||||
| 	"ra", | 	{ "il" }, | ||||||
| 	"sp", | 	{ "cs", true }, | ||||||
| 	"bo", | 	{ "sr" }, | ||||||
| 	"cj", | 	{ "ud", true }, | ||||||
| 	"ca", | 	{ "lv" }, | ||||||
| 	0 | 	{ "ra" }, | ||||||
|  | 	{ "sp" }, | ||||||
|  | 	{ "bo" }, | ||||||
|  | 	{ "cj" }, | ||||||
|  | 	{ "ca" }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define MAXUPHASES 64 /* max # of phases to be run */ | #define MAXUPHASES 64 /* max # of phases to be run */ | ||||||
|  | @ -77,8 +93,9 @@ static int keeptemps = 0; | ||||||
| static char** phase_args; | static char** phase_args; | ||||||
| static int nphase_args; | static int nphase_args; | ||||||
| 
 | 
 | ||||||
| static char* opt_dir; | static const char* descr_file; | ||||||
| static char* prog_name; | static const char* opt_dir; | ||||||
|  | static const char* prog_name; | ||||||
| 
 | 
 | ||||||
| static int v_flag; | static int v_flag; | ||||||
| 
 | 
 | ||||||
|  | @ -93,7 +110,7 @@ cleanup() | ||||||
| 
 | 
 | ||||||
| 		for (i = NTEMPS * 2; i > 0; i--) | 		for (i = NTEMPS * 2; i > 0; i--) | ||||||
| 		{ | 		{ | ||||||
| 			register char* f = phargs[i]; | 			const char* f = phargs[i]; | ||||||
| 			if (f != 0 && *f != '\0' && *f != '-') | 			if (f != 0 && *f != '\0' && *f != '-') | ||||||
| 				(void)unlink(f); | 				(void)unlink(f); | ||||||
| 		} | 		} | ||||||
|  | @ -167,8 +184,8 @@ get_infiles() | ||||||
| 	/*	Make output temps from previous phase input temps of next phase. */ | 	/*	Make output temps from previous phase input temps of next phase. */ | ||||||
| 
 | 
 | ||||||
| 	register int i; | 	register int i; | ||||||
| 	register char** dst = &phargs[1]; | 	char** dst = &phargs[1]; | ||||||
| 	register char** src = &phargs[NTEMPS + 1]; | 	char** src = &phargs[NTEMPS + 1]; | ||||||
| 
 | 
 | ||||||
| 	for (i = 1; i <= NTEMPS; i++) | 	for (i = 1; i <= NTEMPS; i++) | ||||||
| 	{ | 	{ | ||||||
|  | @ -184,7 +201,7 @@ new_outfiles() | ||||||
| 	static char dig1 = '1'; | 	static char dig1 = '1'; | ||||||
| 	static char dig2 = '0'; | 	static char dig2 = '0'; | ||||||
| 	register int i; | 	register int i; | ||||||
| 	register char** dst = &phargs[NTEMPS + 1]; | 	char** dst = &phargs[NTEMPS + 1]; | ||||||
| 
 | 
 | ||||||
| 	if (!Bindex) | 	if (!Bindex) | ||||||
| 	{ | 	{ | ||||||
|  | @ -219,14 +236,21 @@ static void | ||||||
| 	char buf[256]; | 	char buf[256]; | ||||||
| 	int pid, status; | 	int pid, status; | ||||||
| 
 | 
 | ||||||
|  | 	/* Skip this phase if it requires a descr file and one hasn't been
 | ||||||
|  | 	 * provided. */ | ||||||
|  | 
 | ||||||
|  | 	if (phase_data[phase].needsdescr && !descr_file) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	phargs[0] = buf; | 	phargs[0] = buf; | ||||||
| 	(void)strcpy(buf, opt_dir); | 	(void)strcpy(buf, opt_dir); | ||||||
| 	(void)strcat(buf, "/"); | 	(void)strcat(buf, "/"); | ||||||
| 	(void)strcat(buf, phnames[phase]); | 	(void)strcat(buf, phase_data[phase].name); | ||||||
| 
 | 
 | ||||||
| 	switch (phase) | 	switch (phase) | ||||||
| 	{ | 	{ | ||||||
| 		case IC: | 		case IC: | ||||||
|  | 			/* always first */ | ||||||
| 			phargs[1] = pdump; | 			phargs[1] = pdump; | ||||||
| 			phargs[2] = ddump; | 			phargs[2] = ddump; | ||||||
| 			for (i = 3; i <= NTEMPS; i++) | 			for (i = 3; i <= NTEMPS; i++) | ||||||
|  | @ -237,6 +261,7 @@ static void | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case CA: | 		case CA: | ||||||
|  | 			/* always last */ | ||||||
| 			old_infiles(); | 			old_infiles(); | ||||||
| 			get_infiles(); | 			get_infiles(); | ||||||
| 			phargs[NTEMPS + 1] = pdump; | 			phargs[NTEMPS + 1] = pdump; | ||||||
|  | @ -248,20 +273,24 @@ static void | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
|  | 		{ | ||||||
| 			old_infiles(); | 			old_infiles(); | ||||||
| 			get_infiles(); | 			get_infiles(); | ||||||
| 			new_outfiles(); | 			new_outfiles(); | ||||||
| 			if (!flags_added) | 
 | ||||||
|  | 			argc = 2 * NTEMPS + 1; | ||||||
|  | 			if (descr_file) | ||||||
| 			{ | 			{ | ||||||
| 				flags_added = 1; | 				phargs[argc++] = "-M"; | ||||||
| 				argc = 2 * NTEMPS + 1; | 				phargs[argc++] = descr_file; | ||||||
| 				while (--nphase_args >= 0) |  | ||||||
| 				{ |  | ||||||
| 					phargs[argc++] = *phase_args++; |  | ||||||
| 				} |  | ||||||
| 				phargs[argc] = 0; |  | ||||||
| 			} | 			} | ||||||
|  | 			 | ||||||
|  | 			for (i=0; i<nphase_args; i++) | ||||||
|  | 				phargs[argc++] = phase_args[i]; | ||||||
|  | 
 | ||||||
|  | 			phargs[argc] = NULL; | ||||||
| 			break; | 			break; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if ((pid = fork()) < 0) | 	if ((pid = fork()) < 0) | ||||||
| 	{ | 	{ | ||||||
|  | @ -300,10 +329,10 @@ static void | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| main(argc, argv) int argc; | int main(int argc, char* argv[]) | ||||||
| char* argv[]; |  | ||||||
| { | { | ||||||
| 	register int i = 0; | 	int opt; | ||||||
|  | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (signal(SIGHUP, catch) == SIG_IGN) | 	if (signal(SIGHUP, catch) == SIG_IGN) | ||||||
| 		(void)signal(SIGHUP, SIG_IGN); | 		(void)signal(SIGHUP, SIG_IGN); | ||||||
|  | @ -312,113 +341,58 @@ char* argv[]; | ||||||
| 	if (signal(SIGINT, catch) == SIG_IGN) | 	if (signal(SIGINT, catch) == SIG_IGN) | ||||||
| 		(void)signal(SIGINT, SIG_IGN); | 		(void)signal(SIGINT, SIG_IGN); | ||||||
| 	prog_name = argv[0]; | 	prog_name = argv[0]; | ||||||
|  | 
 | ||||||
|  | 	nphase_args = 0; | ||||||
| 	phase_args = &argv[1]; | 	phase_args = &argv[1]; | ||||||
| 	while (--argc > 0) | 
 | ||||||
|  | 	opterr = 0; | ||||||
|  | 	for (;;) | ||||||
| 	{ | 	{ | ||||||
| 		argv++; | 		int opt = getopt(argc, argv, "-M:P:O:vt"); | ||||||
| 		if (argv[0][0] == '-') | 		if (opt == -1) | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 		switch (opt) | ||||||
| 		{ | 		{ | ||||||
| 			switch (argv[0][1]) | 			case 'M': | ||||||
|  | 				descr_file = optarg; | ||||||
|  | 				break; | ||||||
|  | 
 | ||||||
|  | 			case 'P': | ||||||
|  | 				opt_dir = optarg; | ||||||
|  | 				break; | ||||||
|  | 
 | ||||||
|  | 			case 'O': | ||||||
| 			{ | 			{ | ||||||
| 				case 'P': | 				int o = atoi(optarg); | ||||||
| 					if (argv[0][2] == '\0') | 				if (o <= 2) | ||||||
| 					{ |  | ||||||
| 						opt_dir = argv[1]; |  | ||||||
| 						argc--; |  | ||||||
| 						argv++; |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 't': |  | ||||||
| 					if (argv[0][2] == '\0') |  | ||||||
| 					{ |  | ||||||
| 						keeptemps = 1; |  | ||||||
| 						/* no continue; IL also needs this */ |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'v': |  | ||||||
| 					v_flag = 1; |  | ||||||
| 					break; |  | ||||||
| 				case 'O': |  | ||||||
| 					if (argv[0][2] == '2' || argv[0][2] == '\0') |  | ||||||
| 						continue; |  | ||||||
| 					if (argv[0][2] == '3') |  | ||||||
| 					{ |  | ||||||
| 						Ophase = &O3phases[0]; |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					Ophase = &O4phases[0]; |  | ||||||
| 					continue; |  | ||||||
| 				case 'I': |  | ||||||
| 					if (!strcmp(&argv[0][1], "IL")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(IL); |  | ||||||
| 						add_uphase(CF); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'B': |  | ||||||
| 					if (!strcmp(&argv[0][1], "BO")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(BO); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'R': |  | ||||||
| 					if (!strcmp(&argv[0][1], "RA")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(RA); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'U': |  | ||||||
| 					if (!strcmp(&argv[0][1], "UD")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(UD); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'L': |  | ||||||
| 					if (!strcmp(&argv[0][1], "LV")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(LV); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'C': |  | ||||||
| 					if (!strcmp(&argv[0][1], "CS")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(CS); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					if (!strcmp(&argv[0][1], "CJ")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(CJ); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'S': |  | ||||||
| 					if (!strcmp(&argv[0][1], "SR")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(SR); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					if (!strcmp(&argv[0][1], "SP")) |  | ||||||
| 					{ |  | ||||||
| 						add_uphase(SP); |  | ||||||
| 						continue; |  | ||||||
| 					} |  | ||||||
| 					break; | 					break; | ||||||
|  | 				if (o <= 3) | ||||||
|  | 					Ophase = &O3phases[0]; | ||||||
|  | 				Ophase = &O4phases[0]; | ||||||
|  | 				break; | ||||||
| 			} | 			} | ||||||
| 			phase_args[i++] = argv[0]; | 
 | ||||||
| 		} | 			case 1: | ||||||
| 		else | 				add_file(optarg); | ||||||
| 		{ | 				break; | ||||||
| 			add_file(argv[0]); | 
 | ||||||
|  | 			case 't': | ||||||
|  | 				keeptemps = 1; | ||||||
|  | 				goto addopt; | ||||||
|  | 
 | ||||||
|  | 			case 'v': | ||||||
|  | 				v_flag = 1; | ||||||
|  | 				goto addopt; | ||||||
|  | 
 | ||||||
|  | 			case '?': | ||||||
|  | 			addopt: | ||||||
|  | 				phase_args[nphase_args++] = argv[optind - 1]; | ||||||
|  | 				break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	phase_args[i] = 0; | 
 | ||||||
| 	nphase_args = i; | 	phase_args[nphase_args] = 0; | ||||||
| 	if (nuphases) | 	if (nuphases) | ||||||
| 		Ophase = uphases; | 		Ophase = uphases; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -72,13 +72,26 @@ char* argv[]; | ||||||
| 	 *  - ddump: the names of all data blocks | 	 *  - ddump: the names of all data blocks | ||||||
| 	 */ | 	 */ | ||||||
| 
 | 
 | ||||||
| 	FILE* lfile, *dfile, *pfile, *pdump, *ddump; | 	/* The input file names */ | ||||||
|  | 
 | ||||||
|  | 	const char* pdump_out = argv[1]; | ||||||
|  | 	const char* ddump_out = argv[2]; | ||||||
|  | 
 | ||||||
|  | 	/* The output file names */ | ||||||
|  | 
 | ||||||
|  | 	const char* pname_out = argv[5]; | ||||||
|  | 	const char* dname_out = argv[6]; | ||||||
|  | 	const char* lname_out = argv[7]; | ||||||
|  | 
 | ||||||
|  | 	FILE* lfile = openfile(lname_out, "w"); | ||||||
|  | 	FILE* pdump = openfile(pdump_out, "w"); | ||||||
|  | 	FILE* ddump = openfile(ddump_out, "w"); | ||||||
|  | 
 | ||||||
|  | 	FILE* dfile; | ||||||
|  | 	FILE* pfile; | ||||||
| 
 | 
 | ||||||
| 	lfile = openfile(lname2, "w"); |  | ||||||
| 	pdump = openfile(argv[1], "w"); |  | ||||||
| 	ddump = openfile(argv[2], "w"); |  | ||||||
| 	hol0_db = block_of_lab((char*)0); | 	hol0_db = block_of_lab((char*)0); | ||||||
| 	while (next_file(argc, argv) != NULL) | 	while (next_file(argc-8, argv+8) != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		/* Read all EM input files, process the code
 | 		/* Read all EM input files, process the code
 | ||||||
| 		 * and concatenate all output. | 		 * and concatenate all output. | ||||||
|  | @ -104,9 +117,9 @@ char* argv[]; | ||||||
| 	cleanprocs(prochash, NPROCHASH, 0); | 	cleanprocs(prochash, NPROCHASH, 0); | ||||||
| 	cleandblocks(symhash, NSYMHASH, 0); | 	cleandblocks(symhash, NSYMHASH, 0); | ||||||
| 	/* Now write the datablock table and the proctable */ | 	/* Now write the datablock table and the proctable */ | ||||||
| 	dfile = openfile(dname2, "w"); | 	dfile = openfile(dname_out, "w"); | ||||||
| 	putdtable(fdblock, dfile); | 	putdtable(fdblock, dfile); | ||||||
| 	pfile = openfile(pname2, "w"); | 	pfile = openfile(pname_out, "w"); | ||||||
| 	putptable(fproc, pfile, FALSE); | 	putptable(fproc, pfile, FALSE); | ||||||
| 	exit(0); | 	exit(0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -224,7 +224,7 @@ STATIC bool read_hdr() | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| STATIC int argcnt = ARGSTART - 1; | STATIC int argcnt = 0; | ||||||
| STATIC short arstate = NO_ARCHIVE; | STATIC short arstate = NO_ARCHIVE; | ||||||
| 
 | 
 | ||||||
| FILE* next_file(argc, argv) int argc; | FILE* next_file(argc, argv) int argc; | ||||||
|  |  | ||||||
|  | @ -325,6 +325,7 @@ il_flags(p) char* p; | ||||||
| main(argc, argv) int argc; | main(argc, argv) int argc; | ||||||
| char* argv[]; | char* argv[]; | ||||||
| { | { | ||||||
|  | 	struct files* files = findfiles(argc, argv); | ||||||
| 	FILE* f; | 	FILE* f; | ||||||
| 
 | 
 | ||||||
| 	go(argc, argv, no_action, no_action, no_action, il_flags); | 	go(argc, argv, no_action, no_action, no_action, il_flags); | ||||||
|  | @ -337,14 +338,14 @@ char* argv[]; | ||||||
| 	mktemp(ccname); | 	mktemp(ccname); | ||||||
| 	mktemp(sname); | 	mktemp(sname); | ||||||
| 	mktemp(cname2); | 	mktemp(cname2); | ||||||
| 	pass1(lname, bname, cname); /* grep calls, analyse procedures */ | 	pass1(files->lname_in, files->bname_in, cname); /* grep calls, analyse procedures */ | ||||||
| 	space = total_size * space / 100; | 	space = total_size * space / 100; | ||||||
| 	pass2(cname, space); /* select calls to be expanded */ | 	pass2(cname, space); /* select calls to be expanded */ | ||||||
| 	pass3(lname, lname2); /* do substitutions */ | 	pass3(files->lname_in, files->lname_out); /* do substitutions */ | ||||||
| 	f = openfile(dname2, "w"); | 	f = openfile(files->dname_out, "w"); | ||||||
| 	il_cleanptab(fproc); /* remove extended data structures */ | 	il_cleanptab(fproc); /* remove extended data structures */ | ||||||
| 	putdtable(fdblock, f); | 	putdtable(fdblock, f); | ||||||
| 	f = openfile(pname2, "w"); | 	f = openfile(files->pname_out, "w"); | ||||||
| 	putptable(fproc, f, FALSE); | 	putptable(fproc, f, FALSE); | ||||||
| 	report("inline substitutions", Ssubst); | 	report("inline substitutions", Ssubst); | ||||||
| #ifdef VERBOSE | #ifdef VERBOSE | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								util/ego/ra/build.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								util/ego/ra/build.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | cprogram { | ||||||
|  | 	name = "makeitems", | ||||||
|  | 	srcs = { "./makeitems.c" } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | normalrule { | ||||||
|  | 	name = "itemtab_h", | ||||||
|  | 	ins = { | ||||||
|  | 		"+makeitems", | ||||||
|  | 		matching(filenamesof("modules/src/em_data+lib"), "em_mnem%.h$"), | ||||||
|  | 		"./itemtab.src" | ||||||
|  | 	}, | ||||||
|  | 	outleaves = { "itemtab.h" }, | ||||||
|  | 	commands = { | ||||||
|  | 		"%{ins} > %{outs}" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | cprogram { | ||||||
|  | 	name = "ra", | ||||||
|  | 	srcs = { "./ra*.c" }, | ||||||
|  | 	deps = { | ||||||
|  | 		"util/ego/share+lib", | ||||||
|  | 		"modules/src/em_data+lib", | ||||||
|  | 		"h+emheaders", | ||||||
|  | 		"+itemtab_h", | ||||||
|  | 	}, | ||||||
|  | 	vars = { | ||||||
|  | 		["+cflags"] = {"-DVERBOSE", "-DNOTCOMPACT"} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @ -9,9 +9,45 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include "files.h" | ||||||
| 
 | 
 | ||||||
| FILE *openfile(name,mode) | struct files* findfiles(int argc, const char** argv) | ||||||
| 	char *name,*mode; | { | ||||||
|  | 	static struct files files; | ||||||
|  | 
 | ||||||
|  | 	/* The names of the input files of every phase are passed as
 | ||||||
|  | 	 * arguments to the phase. First come the input file names, | ||||||
|  | 	 * then the output file names. We use a one-letter convention | ||||||
|  | 	 * to denote the type of file: | ||||||
|  | 	 *  p: procedure table file | ||||||
|  | 	 *  d: data table file | ||||||
|  | 	 *  l: EM text file (lines of EM instructions) | ||||||
|  | 	 *  b: basic block file (Control Flow Graph file) | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	/* The input file names */ | ||||||
|  | 
 | ||||||
|  | 	files.pname_in = argv[1]; | ||||||
|  | 	files.dname_in = argv[2]; | ||||||
|  | 	files.lname_in = argv[3]; | ||||||
|  | 	files.bname_in = argv[4]; | ||||||
|  | 
 | ||||||
|  | 	/* The output file names */ | ||||||
|  | 
 | ||||||
|  | 	files.pname_out = argv[5]; | ||||||
|  | 	files.dname_out = argv[6]; | ||||||
|  | 	files.lname_out = argv[7]; | ||||||
|  | 	files.bname_out = argv[8]; | ||||||
|  | 
 | ||||||
|  | 	/* The rest of the arguments. */ | ||||||
|  | 
 | ||||||
|  | 	files.argv = argv + 8; | ||||||
|  | 	files.argc = argc - 8; | ||||||
|  | 
 | ||||||
|  | 	return &files; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | FILE *openfile(char* name, char* mode) | ||||||
| { | { | ||||||
| 	FILE *f; | 	FILE *f; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,21 +15,29 @@ | ||||||
|  *  b: basic block file (Control Flow Graph file) |  *  b: basic block file (Control Flow Graph file) | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /* The input file names */ | struct files | ||||||
|  | { | ||||||
|  | 	/* Input files */ | ||||||
| 
 | 
 | ||||||
| #define pname argv[1] | 	const char* pname_in; | ||||||
| #define dname argv[2] | 	const char* dname_in; | ||||||
| #define lname argv[3] | 	const char* lname_in; | ||||||
| #define bname argv[4] | 	const char* bname_in; | ||||||
| 
 | 
 | ||||||
| /* The output file names */ | 	/* Output files */ | ||||||
| 
 | 
 | ||||||
| #define pname2 argv[5] | 	const char* pname_out; | ||||||
| #define dname2 argv[6] | 	const char* dname_out; | ||||||
| #define lname2 argv[7] | 	const char* lname_out; | ||||||
| #define bname2 argv[8] | 	const char* bname_out; | ||||||
| 
 | 
 | ||||||
| #define ARGSTART 9 | 	/* The rest of the arguments. */ | ||||||
|  | 
 | ||||||
|  | 	const char** argv; | ||||||
|  | 	int argc; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | extern struct files* findfiles(int argc, const char** argv); | ||||||
| 
 | 
 | ||||||
| extern FILE *openfile();	/* (char *name, *mode)
 | extern FILE *openfile();	/* (char *name, *mode)
 | ||||||
| 				 * Open a file with the given name | 				 * Open a file with the given name | ||||||
|  |  | ||||||
|  | @ -10,24 +10,24 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <unistd.h> | ||||||
| #include "types.h" | #include "types.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
| #include "global.h" | #include "global.h" | ||||||
| #include "files.h" |  | ||||||
| #include "get.h" | #include "get.h" | ||||||
| #include "put.h" | #include "put.h" | ||||||
| #include "lset.h" | #include "lset.h" | ||||||
| #include "map.h" | #include "map.h" | ||||||
| #include "alloc.h" | #include "alloc.h" | ||||||
| #include "go.h" | #include "go.h" | ||||||
|  | #include "files.h" | ||||||
| 
 | 
 | ||||||
| STATIC bool report_flag = FALSE; /* report #optimizations found? */ | STATIC bool report_flag = FALSE; /* report #optimizations found? */ | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| STATIC bool core_flag = FALSE; /* report core usage? */ | STATIC bool core_flag = FALSE; /* report core usage? */ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| STATIC mach_init(machfile, phase_machinit) char* machfile; | static mach_init(char* machfile, int (*phase_machinit)()) | ||||||
| int (*phase_machinit)(); |  | ||||||
| { | { | ||||||
| 	/* Read target machine dependent information */ | 	/* Read target machine dependent information */ | ||||||
| 
 | 
 | ||||||
|  | @ -42,13 +42,10 @@ int (*phase_machinit)(); | ||||||
| 	fclose(f); | 	fclose(f); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| go(argc, argv, initialize, optimize, phase_machinit, proc_flag) int argc; | void go(int argc, const char** argv, | ||||||
| char* argv[]; | 	int (*initialize)(), int (*optimize)(), int (*phase_machinit)(), int (*proc_flag)()) | ||||||
| int (*initialize)(); |  | ||||||
| int (*optimize)(); |  | ||||||
| int (*phase_machinit)(); |  | ||||||
| int (*proc_flag)(); |  | ||||||
| { | { | ||||||
|  | 	struct files* files = findfiles(argc, argv); | ||||||
| 	FILE* f, *gf, *f2, *gf2; /* The EM input and output and
 | 	FILE* f, *gf, *f2, *gf2; /* The EM input and output and
 | ||||||
| 				 * the basic block graphs input and output | 				 * the basic block graphs input and output | ||||||
| 				 */ | 				 */ | ||||||
|  | @ -60,49 +57,56 @@ int (*proc_flag)(); | ||||||
| 	bool time_opt = TRUE; | 	bool time_opt = TRUE; | ||||||
| 
 | 
 | ||||||
| 	linecount = 0; | 	linecount = 0; | ||||||
| 	for (i = ARGSTART; i < argc; i++) | 	opterr = 0; | ||||||
|  | 	for (;;) | ||||||
| 	{ | 	{ | ||||||
| 		p = argv[i]; | 		int opt = getopt(files->argc, files->argv, "STM:CQV"); | ||||||
| 		if (*p++ != '-') | 		if (opt == -1) | ||||||
| 			error("illegal argument"); | 			break; | ||||||
| 		switch (*p) | 
 | ||||||
|  | 		switch (opt) | ||||||
| 		{ | 		{ | ||||||
| 			case 'S': | 			case 'S': | ||||||
| 				time_opt = FALSE; | 				time_opt = FALSE; | ||||||
| 				break; | 				break; | ||||||
|  | 
 | ||||||
| 			case 'T': | 			case 'T': | ||||||
| 				time_opt = TRUE; | 				time_opt = TRUE; | ||||||
| 				break; | 				break; | ||||||
|  | 
 | ||||||
| 			case 'M': | 			case 'M': | ||||||
| 				p++; | 				mach_init(optarg, phase_machinit); | ||||||
| 				mach_init(p, phase_machinit); |  | ||||||
| 				break; | 				break; | ||||||
|  | 
 | ||||||
| 			case 'C': | 			case 'C': | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| 				core_flag = TRUE; | 				core_flag = TRUE; | ||||||
| #endif | #endif | ||||||
| 				break; | 				break; | ||||||
|  | 
 | ||||||
| 			case 'Q': | 			case 'Q': | ||||||
| 				report_flag = TRUE; | 				report_flag = TRUE; | ||||||
| 				break; | 				break; | ||||||
|  | 
 | ||||||
| 			case 'V': | 			case 'V': | ||||||
| 				verbose_flag = TRUE; | 				verbose_flag = TRUE; | ||||||
| 				break; | 				break; | ||||||
| 			default: | 
 | ||||||
| 				(*proc_flag)(p); | 			case '?': | ||||||
|  | 				proc_flag(argv[optind - 1]); | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	time_space_ratio = (time_opt ? 100 : 0); | 	time_space_ratio = (time_opt ? 100 : 0); | ||||||
| 	fproc = getptable(pname); /* proc table */ | 	fproc = getptable(files->pname_in); /* proc table */ | ||||||
| 	fdblock = getdtable(dname); /* data block table */ | 	fdblock = getdtable(files->dname_in); /* data block table */ | ||||||
| 	(*initialize)(); | 	(*initialize)(); | ||||||
| 	if (optimize == no_action) | 	if (optimize == no_action) | ||||||
| 		return; | 		return; | ||||||
| 	f = openfile(lname, "r"); | 	f = openfile(files->lname_in, "r"); | ||||||
| 	gf = openfile(bname, "r"); | 	gf = openfile(files->bname_in, "r"); | ||||||
| 	f2 = openfile(lname2, "w"); | 	f2 = openfile(files->lname_out, "w"); | ||||||
| 	gf2 = openfile(bname2, "w"); | 	gf2 = openfile(files->bname_out, "w"); | ||||||
| 	mesregs = Lempty_set(); | 	mesregs = Lempty_set(); | ||||||
| 	while (getunit(gf, f, &kind, &g, &l, &curproc, TRUE)) | 	while (getunit(gf, f, &kind, &g, &l, &curproc, TRUE)) | ||||||
| 	{ | 	{ | ||||||
|  | @ -130,18 +134,18 @@ int (*proc_flag)(); | ||||||
| 	fclose(f2); | 	fclose(f2); | ||||||
| 	fclose(gf); | 	fclose(gf); | ||||||
| 	fclose(gf2); | 	fclose(gf2); | ||||||
| 	f = openfile(dname2, "w"); | 	f = openfile(files->dname_out, "w"); | ||||||
| 	putdtable(fdblock, f); | 	putdtable(fdblock, f); | ||||||
| 	/* fclose(f); done by putdtable */ | 	/* fclose(f); done by putdtable */ | ||||||
| 	f = openfile(pname2, "w"); | 	f = openfile(files->pname_out, "w"); | ||||||
| 	putptable(fproc, f, TRUE); | 	putptable(fproc, f, TRUE); | ||||||
| 	/* fclose(f); done by putptable */ | 	/* fclose(f); done by putptable */ | ||||||
| 	core_usage(); | 	core_usage(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| no_action() {} | int no_action() {} | ||||||
| 
 | 
 | ||||||
| core_usage() | void core_usage(void) | ||||||
| { | { | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| 	if (core_flag) | 	if (core_flag) | ||||||
|  | @ -151,8 +155,7 @@ core_usage() | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| report(s, n) char* s; | void report(char* s, int n) | ||||||
| int n; |  | ||||||
| { | { | ||||||
| 	/* Report number of optimizations found, if report_flag is set */ | 	/* Report number of optimizations found, if report_flag is set */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,30 +9,33 @@ | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| extern go(); /* ( int argc; char *argv[];
 | /* This is the main driving routine of the optimizer.
 | ||||||
| 			 *   int (*initialize)(); int (*optimize)();  |  * It first processes the flags given as argument; | ||||||
| 			 *   int (*phase_machinit)(); int (*proc_flag)()  ) |  * for every flag it does not recognize itself, it | ||||||
| 			 * This is the main driving routine of the optimizer. |  * calls 'proc_flag'; as soon as the -M flag is seen, | ||||||
| 			 * It first processes the flags given as argument; |  * it opens the machine descriptor file and | ||||||
| 			 * for every flag it does not recognize itself, it |  * reads phase-independend information (notably the | ||||||
| 			 * calls 'proc_flag'; as soon as the -M flag is seen, |  * wordsize and pointersize of the target machine); | ||||||
| 			 * it opens the machine descriptor file and |  * next it calls 'phase_machinit' with this file as | ||||||
| 			 * reads phase-independend information (notably the |  * parameter. Subsequently it calls 'initialize'. | ||||||
| 			 * wordsize and pointersize of the target machine); |  * Finally, all procedures are read, one at a time, | ||||||
| 			 * next it calls 'phase_machinit' with this file as |  * and 'optimize' is called with the current procedure | ||||||
| 			 * parameter. Subsequently it calls 'initialize'. |  * as parameter. | ||||||
| 			 * Finally, all procedures are read, one at a time, |  */ | ||||||
| 			 * and 'optimize' is called with the current procedure | extern void go(int argc, const char** argv, | ||||||
| 			 * as parameter. |     int (*initialize)(), int (*optimize)(), | ||||||
| 			 */ |     int (*phase_machinit)(), int (*proc_flag)()); | ||||||
| extern no_action(); /* ()
 | 
 | ||||||
| 			 * Parameter to be supplied for e.g. 'initialize' if | /*
 | ||||||
| 			 * no action is required. |  * Parameter to be supplied for e.g. 'initialize' if | ||||||
| 			 */ |  * no action is required. | ||||||
| extern core_usage(); /* ()
 |  */ | ||||||
| 			 * Report core usage, if core_flag is set. | extern int no_action(); | ||||||
| 			 */ | 
 | ||||||
| extern report(); /* ( char *s; int n)
 | /* Report core usage, if core_flag is set. */ | ||||||
| 			 * Report number of optimizations found, if  | extern void core_usage(void); | ||||||
| 			 * report_flag is set | 
 | ||||||
| 			 */ | /* Report number of optimizations found, if 
 | ||||||
|  |  * report_flag is set | ||||||
|  |  */ | ||||||
|  | extern void report(char* s, int n); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue