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"
 | 
			
		||||
}
 | 
			
		||||
vars.ackcflags = {
 | 
			
		||||
	"-O"
 | 
			
		||||
	"-O6"
 | 
			
		||||
}
 | 
			
		||||
vars.plats = {
 | 
			
		||||
	"cpm",
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ installable {
 | 
			
		|||
		"util/ack+pkg",
 | 
			
		||||
		"util/amisc+pkg",
 | 
			
		||||
		"util/arch+pkg",
 | 
			
		||||
		"util/ego+pkg",
 | 
			
		||||
		"util/led+pkg",
 | 
			
		||||
		"util/misc+pkg",
 | 
			
		||||
		"util/opt+pkg",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										15
									
								
								lib/descr/fe
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								lib/descr/fe
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -206,19 +206,6 @@ name ego
 | 
			
		|||
	to .gk
 | 
			
		||||
	program {EM}/lib/ack/em_ego
 | 
			
		||||
	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 -T* EGO_F={EGO_F?} -T*
 | 
			
		||||
	mapflag -S* EGO_F={EGO_F?} -S*
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +214,7 @@ name ego
 | 
			
		|||
	mapflag -O* EGO_F={EGO_F?} -O*
 | 
			
		||||
	args \
 | 
			
		||||
		{EGO_F?} -P {EM}/lib/ack/ego \
 | 
			
		||||
		-M{EM}/share/ack/ego/{ARCH}.descr <
 | 
			
		||||
		{EGO_PLAT_FLAGS?} <
 | 
			
		||||
	optimizer 2
 | 
			
		||||
	stdout
 | 
			
		||||
	combiner
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ definerule("ackfile",
 | 
			
		|||
				"lang/pc/comp+pkg",
 | 
			
		||||
				"plat/"..plat.."+tools",
 | 
			
		||||
				"util/ack+pkg",
 | 
			
		||||
				"util/ego+pkg",
 | 
			
		||||
				"util/misc+pkg",
 | 
			
		||||
				e.deps
 | 
			
		||||
			},
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +68,6 @@ definerule("ackprogram",
 | 
			
		|||
				"plat/"..e.vars.plat.."+pkg",
 | 
			
		||||
				"util/ack+pkg",
 | 
			
		||||
				"util/led+pkg",
 | 
			
		||||
				"util/amisc+pkg",
 | 
			
		||||
				e.deps
 | 
			
		||||
			},
 | 
			
		||||
			_clibrary = acklibrary,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ var C_LIB={PLATFORMDIR}/libc-ansi.a
 | 
			
		|||
var CC_ALIGN=-Vr
 | 
			
		||||
var OLD_C_LIB={C_LIB}
 | 
			
		||||
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
 | 
			
		||||
# the platform-specific headers.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ var C_LIB={PLATFORMDIR}/libc-ansi.a
 | 
			
		|||
var CC_ALIGN=-Vr
 | 
			
		||||
var OLD_C_LIB={C_LIB}
 | 
			
		||||
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
 | 
			
		||||
# the platform-specific headers.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ var PLATFORMDIR={EM}/share/ack/{PLATFORM}
 | 
			
		|||
var CPP_F=-D__unix
 | 
			
		||||
var ALIGN=-a0:1 -a1:1 -a2:1 -a3:1
 | 
			
		||||
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
 | 
			
		||||
# 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[];
 | 
			
		||||
{
 | 
			
		||||
	/* 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.
 | 
			
		||||
	 */
 | 
			
		||||
	struct files* files = findfiles(argc, argv);
 | 
			
		||||
 | 
			
		||||
	FILE* f, *f2; /* The EM input and output. */
 | 
			
		||||
	FILE* df, *pf; /* The dump files */
 | 
			
		||||
	line_p lnp;
 | 
			
		||||
 | 
			
		||||
	fproc = getptable(pname); /* proc table */
 | 
			
		||||
	fdblock = getdtable(dname); /* data block table */
 | 
			
		||||
	/* 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];
 | 
			
		||||
 | 
			
		||||
	fproc = getptable(pname_in); /* proc table */
 | 
			
		||||
	fdblock = getdtable(dname_in); /* data block table */
 | 
			
		||||
	dlength = makedmap(fdblock); /* allocate dmap table */
 | 
			
		||||
	df = openfile(dname2, "r");
 | 
			
		||||
	df = openfile(dname_out, "r");
 | 
			
		||||
	getdnames(df);
 | 
			
		||||
	fclose(df);
 | 
			
		||||
	pf = openfile(pname2, "r");
 | 
			
		||||
	pf = openfile(pname_out, "r");
 | 
			
		||||
	getpnames(pf);
 | 
			
		||||
	fclose(pf);
 | 
			
		||||
	uniq_names();
 | 
			
		||||
	f = openfile(lname, "r");
 | 
			
		||||
	f = openfile(lname_in, "r");
 | 
			
		||||
	f2 = stdout;
 | 
			
		||||
	cputmagic(f2); /* write magic number */
 | 
			
		||||
	while ((lnp = get_ca_lines(f, &curproc)) != (line_p)0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -530,22 +530,46 @@ char* argv[];
 | 
			
		|||
	short n, kind;
 | 
			
		||||
	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;
 | 
			
		||||
	fproc = getptable(pname); /* proc table */
 | 
			
		||||
	fdblock = getdtable(dname); /* data block table */
 | 
			
		||||
	fproc = getptable(pname_in); /* proc table */
 | 
			
		||||
	fdblock = getdtable(dname_in); /* data block table */
 | 
			
		||||
	lpi_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))
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -581,14 +605,14 @@ char* argv[];
 | 
			
		|||
	/* Compute transitive closure of used/changed
 | 
			
		||||
	 * 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);
 | 
			
		||||
	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);
 | 
			
		||||
	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 ...
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <em_path.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <unistd.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
 | 
			
		||||
#define CF 2
 | 
			
		||||
#define IL 3
 | 
			
		||||
#define CS 4
 | 
			
		||||
#define SR 5
 | 
			
		||||
#define UD 6
 | 
			
		||||
#define LV 7
 | 
			
		||||
#define RA 8
 | 
			
		||||
#define SP 9
 | 
			
		||||
#define BO 10
 | 
			
		||||
#define CJ 11
 | 
			
		||||
#define CA 12
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
	NONE = 0,
 | 
			
		||||
	IC,
 | 
			
		||||
	CF,
 | 
			
		||||
	IL,
 | 
			
		||||
	CS,
 | 
			
		||||
	SR,
 | 
			
		||||
	UD,
 | 
			
		||||
	LV,
 | 
			
		||||
	RA,
 | 
			
		||||
	SP,
 | 
			
		||||
	BO,
 | 
			
		||||
	CJ,
 | 
			
		||||
	CA
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static char* phnames[] = {
 | 
			
		||||
	0,
 | 
			
		||||
	"ic",
 | 
			
		||||
	"cf",
 | 
			
		||||
	"il",
 | 
			
		||||
	"cs",
 | 
			
		||||
	"sr",
 | 
			
		||||
	"ud",
 | 
			
		||||
	"lv",
 | 
			
		||||
	"ra",
 | 
			
		||||
	"sp",
 | 
			
		||||
	"bo",
 | 
			
		||||
	"cj",
 | 
			
		||||
	"ca",
 | 
			
		||||
	0
 | 
			
		||||
static const struct
 | 
			
		||||
{
 | 
			
		||||
	const char* name;
 | 
			
		||||
	bool needsdescr;
 | 
			
		||||
 | 
			
		||||
} phase_data[] = {
 | 
			
		||||
	{},
 | 
			
		||||
	{ "ic" },
 | 
			
		||||
	{ "cf" },
 | 
			
		||||
	{ "il" },
 | 
			
		||||
	{ "cs", true },
 | 
			
		||||
	{ "sr" },
 | 
			
		||||
	{ "ud", true },
 | 
			
		||||
	{ "lv" },
 | 
			
		||||
	{ "ra" },
 | 
			
		||||
	{ "sp" },
 | 
			
		||||
	{ "bo" },
 | 
			
		||||
	{ "cj" },
 | 
			
		||||
	{ "ca" },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MAXUPHASES 64 /* max # of phases to be run */
 | 
			
		||||
| 
						 | 
				
			
			@ -77,8 +93,9 @@ static int keeptemps = 0;
 | 
			
		|||
static char** phase_args;
 | 
			
		||||
static int nphase_args;
 | 
			
		||||
 | 
			
		||||
static char* opt_dir;
 | 
			
		||||
static char* prog_name;
 | 
			
		||||
static const char* descr_file;
 | 
			
		||||
static const char* opt_dir;
 | 
			
		||||
static const char* prog_name;
 | 
			
		||||
 | 
			
		||||
static int v_flag;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +110,7 @@ cleanup()
 | 
			
		|||
 | 
			
		||||
		for (i = NTEMPS * 2; i > 0; i--)
 | 
			
		||||
		{
 | 
			
		||||
			register char* f = phargs[i];
 | 
			
		||||
			const char* f = phargs[i];
 | 
			
		||||
			if (f != 0 && *f != '\0' && *f != '-')
 | 
			
		||||
				(void)unlink(f);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -167,8 +184,8 @@ get_infiles()
 | 
			
		|||
	/*	Make output temps from previous phase input temps of next phase. */
 | 
			
		||||
 | 
			
		||||
	register int i;
 | 
			
		||||
	register char** dst = &phargs[1];
 | 
			
		||||
	register char** src = &phargs[NTEMPS + 1];
 | 
			
		||||
	char** dst = &phargs[1];
 | 
			
		||||
	char** src = &phargs[NTEMPS + 1];
 | 
			
		||||
 | 
			
		||||
	for (i = 1; i <= NTEMPS; i++)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +201,7 @@ new_outfiles()
 | 
			
		|||
	static char dig1 = '1';
 | 
			
		||||
	static char dig2 = '0';
 | 
			
		||||
	register int i;
 | 
			
		||||
	register char** dst = &phargs[NTEMPS + 1];
 | 
			
		||||
	char** dst = &phargs[NTEMPS + 1];
 | 
			
		||||
 | 
			
		||||
	if (!Bindex)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -219,14 +236,21 @@ static void
 | 
			
		|||
	char buf[256];
 | 
			
		||||
	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;
 | 
			
		||||
	(void)strcpy(buf, opt_dir);
 | 
			
		||||
	(void)strcat(buf, "/");
 | 
			
		||||
	(void)strcat(buf, phnames[phase]);
 | 
			
		||||
	(void)strcat(buf, phase_data[phase].name);
 | 
			
		||||
 | 
			
		||||
	switch (phase)
 | 
			
		||||
	{
 | 
			
		||||
		case IC:
 | 
			
		||||
			/* always first */
 | 
			
		||||
			phargs[1] = pdump;
 | 
			
		||||
			phargs[2] = ddump;
 | 
			
		||||
			for (i = 3; i <= NTEMPS; i++)
 | 
			
		||||
| 
						 | 
				
			
			@ -237,6 +261,7 @@ static void
 | 
			
		|||
			break;
 | 
			
		||||
 | 
			
		||||
		case CA:
 | 
			
		||||
			/* always last */
 | 
			
		||||
			old_infiles();
 | 
			
		||||
			get_infiles();
 | 
			
		||||
			phargs[NTEMPS + 1] = pdump;
 | 
			
		||||
| 
						 | 
				
			
			@ -248,20 +273,24 @@ static void
 | 
			
		|||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
		{
 | 
			
		||||
			old_infiles();
 | 
			
		||||
			get_infiles();
 | 
			
		||||
			new_outfiles();
 | 
			
		||||
			if (!flags_added)
 | 
			
		||||
 | 
			
		||||
			argc = 2 * NTEMPS + 1;
 | 
			
		||||
			if (descr_file)
 | 
			
		||||
			{
 | 
			
		||||
				flags_added = 1;
 | 
			
		||||
				argc = 2 * NTEMPS + 1;
 | 
			
		||||
				while (--nphase_args >= 0)
 | 
			
		||||
				{
 | 
			
		||||
					phargs[argc++] = *phase_args++;
 | 
			
		||||
				}
 | 
			
		||||
				phargs[argc] = 0;
 | 
			
		||||
				phargs[argc++] = "-M";
 | 
			
		||||
				phargs[argc++] = descr_file;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			for (i=0; i<nphase_args; i++)
 | 
			
		||||
				phargs[argc++] = phase_args[i];
 | 
			
		||||
 | 
			
		||||
			phargs[argc] = NULL;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if ((pid = fork()) < 0)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -300,10 +329,10 @@ static void
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main(argc, argv) int argc;
 | 
			
		||||
char* argv[];
 | 
			
		||||
int main(int argc, char* argv[])
 | 
			
		||||
{
 | 
			
		||||
	register int i = 0;
 | 
			
		||||
	int opt;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	if (signal(SIGHUP, catch) == SIG_IGN)
 | 
			
		||||
		(void)signal(SIGHUP, SIG_IGN);
 | 
			
		||||
| 
						 | 
				
			
			@ -312,113 +341,58 @@ char* argv[];
 | 
			
		|||
	if (signal(SIGINT, catch) == SIG_IGN)
 | 
			
		||||
		(void)signal(SIGINT, SIG_IGN);
 | 
			
		||||
	prog_name = argv[0];
 | 
			
		||||
 | 
			
		||||
	nphase_args = 0;
 | 
			
		||||
	phase_args = &argv[1];
 | 
			
		||||
	while (--argc > 0)
 | 
			
		||||
 | 
			
		||||
	opterr = 0;
 | 
			
		||||
	for (;;)
 | 
			
		||||
	{
 | 
			
		||||
		argv++;
 | 
			
		||||
		if (argv[0][0] == '-')
 | 
			
		||||
		int opt = getopt(argc, argv, "-M:P:O:vt");
 | 
			
		||||
		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':
 | 
			
		||||
					if (argv[0][2] == '\0')
 | 
			
		||||
					{
 | 
			
		||||
						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;
 | 
			
		||||
					}
 | 
			
		||||
				int o = atoi(optarg);
 | 
			
		||||
				if (o <= 2)
 | 
			
		||||
					break;
 | 
			
		||||
				if (o <= 3)
 | 
			
		||||
					Ophase = &O3phases[0];
 | 
			
		||||
				Ophase = &O4phases[0];
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			phase_args[i++] = argv[0];
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			add_file(argv[0]);
 | 
			
		||||
 | 
			
		||||
			case 1:
 | 
			
		||||
				add_file(optarg);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			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)
 | 
			
		||||
		Ophase = uphases;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,13 +72,26 @@ char* argv[];
 | 
			
		|||
	 *  - 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);
 | 
			
		||||
	while (next_file(argc, argv) != NULL)
 | 
			
		||||
	while (next_file(argc-8, argv+8) != NULL)
 | 
			
		||||
	{
 | 
			
		||||
		/* Read all EM input files, process the code
 | 
			
		||||
		 * and concatenate all output.
 | 
			
		||||
| 
						 | 
				
			
			@ -104,9 +117,9 @@ char* argv[];
 | 
			
		|||
	cleanprocs(prochash, NPROCHASH, 0);
 | 
			
		||||
	cleandblocks(symhash, NSYMHASH, 0);
 | 
			
		||||
	/* Now write the datablock table and the proctable */
 | 
			
		||||
	dfile = openfile(dname2, "w");
 | 
			
		||||
	dfile = openfile(dname_out, "w");
 | 
			
		||||
	putdtable(fdblock, dfile);
 | 
			
		||||
	pfile = openfile(pname2, "w");
 | 
			
		||||
	pfile = openfile(pname_out, "w");
 | 
			
		||||
	putptable(fproc, pfile, FALSE);
 | 
			
		||||
	exit(0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,7 +224,7 @@ STATIC bool read_hdr()
 | 
			
		|||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
STATIC int argcnt = ARGSTART - 1;
 | 
			
		||||
STATIC int argcnt = 0;
 | 
			
		||||
STATIC short arstate = NO_ARCHIVE;
 | 
			
		||||
 | 
			
		||||
FILE* next_file(argc, argv) int argc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -325,6 +325,7 @@ il_flags(p) char* p;
 | 
			
		|||
main(argc, argv) int argc;
 | 
			
		||||
char* argv[];
 | 
			
		||||
{
 | 
			
		||||
	struct files* files = findfiles(argc, argv);
 | 
			
		||||
	FILE* f;
 | 
			
		||||
 | 
			
		||||
	go(argc, argv, no_action, no_action, no_action, il_flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -337,14 +338,14 @@ char* argv[];
 | 
			
		|||
	mktemp(ccname);
 | 
			
		||||
	mktemp(sname);
 | 
			
		||||
	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;
 | 
			
		||||
	pass2(cname, space); /* select calls to be expanded */
 | 
			
		||||
	pass3(lname, lname2); /* do substitutions */
 | 
			
		||||
	f = openfile(dname2, "w");
 | 
			
		||||
	pass3(files->lname_in, files->lname_out); /* do substitutions */
 | 
			
		||||
	f = openfile(files->dname_out, "w");
 | 
			
		||||
	il_cleanptab(fproc); /* remove extended data structures */
 | 
			
		||||
	putdtable(fdblock, f);
 | 
			
		||||
	f = openfile(pname2, "w");
 | 
			
		||||
	f = openfile(files->pname_out, "w");
 | 
			
		||||
	putptable(fproc, f, FALSE);
 | 
			
		||||
	report("inline substitutions", Ssubst);
 | 
			
		||||
#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 "files.h"
 | 
			
		||||
 | 
			
		||||
FILE *openfile(name,mode)
 | 
			
		||||
	char *name,*mode;
 | 
			
		||||
struct files* findfiles(int argc, const char** argv)
 | 
			
		||||
{
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,21 +15,29 @@
 | 
			
		|||
 *  b: basic block file (Control Flow Graph file)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* The input file names */
 | 
			
		||||
struct files
 | 
			
		||||
{
 | 
			
		||||
	/* Input files */
 | 
			
		||||
 | 
			
		||||
#define pname argv[1]
 | 
			
		||||
#define dname argv[2]
 | 
			
		||||
#define lname argv[3]
 | 
			
		||||
#define bname argv[4]
 | 
			
		||||
	const char* pname_in;
 | 
			
		||||
	const char* dname_in;
 | 
			
		||||
	const char* lname_in;
 | 
			
		||||
	const char* bname_in;
 | 
			
		||||
 | 
			
		||||
/* The output file names */
 | 
			
		||||
	/* Output files */
 | 
			
		||||
 | 
			
		||||
#define pname2 argv[5]
 | 
			
		||||
#define dname2 argv[6]
 | 
			
		||||
#define lname2 argv[7]
 | 
			
		||||
#define bname2 argv[8]
 | 
			
		||||
	const char* pname_out;
 | 
			
		||||
	const char* dname_out;
 | 
			
		||||
	const char* lname_out;
 | 
			
		||||
	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)
 | 
			
		||||
				 * Open a file with the given name
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,24 +10,24 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include "types.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "global.h"
 | 
			
		||||
#include "files.h"
 | 
			
		||||
#include "get.h"
 | 
			
		||||
#include "put.h"
 | 
			
		||||
#include "lset.h"
 | 
			
		||||
#include "map.h"
 | 
			
		||||
#include "alloc.h"
 | 
			
		||||
#include "go.h"
 | 
			
		||||
#include "files.h"
 | 
			
		||||
 | 
			
		||||
STATIC bool report_flag = FALSE; /* report #optimizations found? */
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
STATIC bool core_flag = FALSE; /* report core usage? */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
STATIC mach_init(machfile, phase_machinit) char* machfile;
 | 
			
		||||
int (*phase_machinit)();
 | 
			
		||||
static mach_init(char* machfile, int (*phase_machinit)())
 | 
			
		||||
{
 | 
			
		||||
	/* Read target machine dependent information */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,13 +42,10 @@ int (*phase_machinit)();
 | 
			
		|||
	fclose(f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
go(argc, argv, initialize, optimize, phase_machinit, proc_flag) int argc;
 | 
			
		||||
char* argv[];
 | 
			
		||||
int (*initialize)();
 | 
			
		||||
int (*optimize)();
 | 
			
		||||
int (*phase_machinit)();
 | 
			
		||||
int (*proc_flag)();
 | 
			
		||||
void go(int argc, const char** argv,
 | 
			
		||||
	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
 | 
			
		||||
				 * the basic block graphs input and output
 | 
			
		||||
				 */
 | 
			
		||||
| 
						 | 
				
			
			@ -60,49 +57,56 @@ int (*proc_flag)();
 | 
			
		|||
	bool time_opt = TRUE;
 | 
			
		||||
 | 
			
		||||
	linecount = 0;
 | 
			
		||||
	for (i = ARGSTART; i < argc; i++)
 | 
			
		||||
	opterr = 0;
 | 
			
		||||
	for (;;)
 | 
			
		||||
	{
 | 
			
		||||
		p = argv[i];
 | 
			
		||||
		if (*p++ != '-')
 | 
			
		||||
			error("illegal argument");
 | 
			
		||||
		switch (*p)
 | 
			
		||||
		int opt = getopt(files->argc, files->argv, "STM:CQV");
 | 
			
		||||
		if (opt == -1)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		switch (opt)
 | 
			
		||||
		{
 | 
			
		||||
			case 'S':
 | 
			
		||||
				time_opt = FALSE;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'T':
 | 
			
		||||
				time_opt = TRUE;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'M':
 | 
			
		||||
				p++;
 | 
			
		||||
				mach_init(p, phase_machinit);
 | 
			
		||||
				mach_init(optarg, phase_machinit);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'C':
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
				core_flag = TRUE;
 | 
			
		||||
#endif
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'Q':
 | 
			
		||||
				report_flag = TRUE;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'V':
 | 
			
		||||
				verbose_flag = TRUE;
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				(*proc_flag)(p);
 | 
			
		||||
 | 
			
		||||
			case '?':
 | 
			
		||||
				proc_flag(argv[optind - 1]);
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	time_space_ratio = (time_opt ? 100 : 0);
 | 
			
		||||
	fproc = getptable(pname); /* proc table */
 | 
			
		||||
	fdblock = getdtable(dname); /* data block table */
 | 
			
		||||
	fproc = getptable(files->pname_in); /* proc table */
 | 
			
		||||
	fdblock = getdtable(files->dname_in); /* data block table */
 | 
			
		||||
	(*initialize)();
 | 
			
		||||
	if (optimize == no_action)
 | 
			
		||||
		return;
 | 
			
		||||
	f = openfile(lname, "r");
 | 
			
		||||
	gf = openfile(bname, "r");
 | 
			
		||||
	f2 = openfile(lname2, "w");
 | 
			
		||||
	gf2 = openfile(bname2, "w");
 | 
			
		||||
	f = openfile(files->lname_in, "r");
 | 
			
		||||
	gf = openfile(files->bname_in, "r");
 | 
			
		||||
	f2 = openfile(files->lname_out, "w");
 | 
			
		||||
	gf2 = openfile(files->bname_out, "w");
 | 
			
		||||
	mesregs = Lempty_set();
 | 
			
		||||
	while (getunit(gf, f, &kind, &g, &l, &curproc, TRUE))
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -130,18 +134,18 @@ int (*proc_flag)();
 | 
			
		|||
	fclose(f2);
 | 
			
		||||
	fclose(gf);
 | 
			
		||||
	fclose(gf2);
 | 
			
		||||
	f = openfile(dname2, "w");
 | 
			
		||||
	f = openfile(files->dname_out, "w");
 | 
			
		||||
	putdtable(fdblock, f);
 | 
			
		||||
	/* fclose(f); done by putdtable */
 | 
			
		||||
	f = openfile(pname2, "w");
 | 
			
		||||
	f = openfile(files->pname_out, "w");
 | 
			
		||||
	putptable(fproc, f, TRUE);
 | 
			
		||||
	/* fclose(f); done by putptable */
 | 
			
		||||
	core_usage();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
no_action() {}
 | 
			
		||||
int no_action() {}
 | 
			
		||||
 | 
			
		||||
core_usage()
 | 
			
		||||
void core_usage(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if (core_flag)
 | 
			
		||||
| 
						 | 
				
			
			@ -151,8 +155,7 @@ core_usage()
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
report(s, n) char* s;
 | 
			
		||||
int n;
 | 
			
		||||
void report(char* s, int n)
 | 
			
		||||
{
 | 
			
		||||
	/* Report number of optimizations found, if report_flag is set */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,30 +9,33 @@
 | 
			
		|||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern go(); /* ( int argc; char *argv[];
 | 
			
		||||
			 *   int (*initialize)(); int (*optimize)(); 
 | 
			
		||||
			 *   int (*phase_machinit)(); int (*proc_flag)()  )
 | 
			
		||||
			 * This is the main driving routine of the optimizer.
 | 
			
		||||
			 * It first processes the flags given as argument;
 | 
			
		||||
			 * for every flag it does not recognize itself, it
 | 
			
		||||
			 * calls 'proc_flag'; as soon as the -M flag is seen,
 | 
			
		||||
			 * it opens the machine descriptor file and
 | 
			
		||||
			 * reads phase-independend information (notably the
 | 
			
		||||
			 * wordsize and pointersize of the target machine);
 | 
			
		||||
			 * next it calls 'phase_machinit' with this file as
 | 
			
		||||
			 * parameter. Subsequently it calls 'initialize'.
 | 
			
		||||
			 * Finally, all procedures are read, one at a time,
 | 
			
		||||
			 * and 'optimize' is called with the current procedure
 | 
			
		||||
			 * as parameter.
 | 
			
		||||
			 */
 | 
			
		||||
extern no_action(); /* ()
 | 
			
		||||
			 * 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 report(); /* ( char *s; int n)
 | 
			
		||||
			 * Report number of optimizations found, if 
 | 
			
		||||
			 * report_flag is set
 | 
			
		||||
			 */
 | 
			
		||||
/* This is the main driving routine of the optimizer.
 | 
			
		||||
 * It first processes the flags given as argument;
 | 
			
		||||
 * for every flag it does not recognize itself, it
 | 
			
		||||
 * calls 'proc_flag'; as soon as the -M flag is seen,
 | 
			
		||||
 * it opens the machine descriptor file and
 | 
			
		||||
 * reads phase-independend information (notably the
 | 
			
		||||
 * wordsize and pointersize of the target machine);
 | 
			
		||||
 * next it calls 'phase_machinit' with this file as
 | 
			
		||||
 * parameter. Subsequently it calls 'initialize'.
 | 
			
		||||
 * Finally, all procedures are read, one at a time,
 | 
			
		||||
 * and 'optimize' is called with the current procedure
 | 
			
		||||
 * as parameter.
 | 
			
		||||
 */
 | 
			
		||||
extern void go(int argc, const char** argv,
 | 
			
		||||
    int (*initialize)(), int (*optimize)(),
 | 
			
		||||
    int (*phase_machinit)(), int (*proc_flag)());
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Parameter to be supplied for e.g. 'initialize' if
 | 
			
		||||
 * no action is required.
 | 
			
		||||
 */
 | 
			
		||||
extern int no_action();
 | 
			
		||||
 | 
			
		||||
/* Report core usage, if core_flag is set. */
 | 
			
		||||
extern void core_usage(void);
 | 
			
		||||
 | 
			
		||||
/* 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